From 5ed24b4f8e7b5a326d00ae074d2258eb5c4c32ad Mon Sep 17 00:00:00 2001 From: John Byabazaire Date: Thu, 24 Apr 2025 15:44:23 +0100 Subject: [PATCH 1/3] feat: Add MLConnector - Add MLConnector README file - MLConnector basic functionality - Add endpoint to save inference data back to side-api - Change xai to read data from s3 - Change application description and model update Signed-off-by: John Byabazaire --- .DS_Store | Bin 0 -> 6148 bytes mlconnector/.DS_Store | Bin 0 -> 14340 bytes mlconnector/README.md | 206 ++ mlconnector/api_full_documentation.md | 807 ++++++++ mlconnector/db/.DS_Store | Bin 0 -> 6148 bytes mlconnector/db/Dockerfile | 5 + mlconnector/db/configs/drift_metrics_mmd.csv | 78 + mlconnector/db/configs/init-my-db.sh | 8 + mlconnector/docker-compose.yaml | 122 ++ mlconnector/drift_app/.DS_Store | Bin 0 -> 6148 bytes mlconnector/drift_app/.env | 12 + mlconnector/drift_app/Dockerfile | 11 + mlconnector/drift_app/app.py | 284 +++ mlconnector/drift_app/manage_s3.py | 138 ++ mlconnector/drift_app/requirements.txt | 9 + mlconnector/drift_app/utilities.py | 128 ++ mlconnector/src/.DS_Store | Bin 0 -> 14340 bytes mlconnector/src/Dockerfile | 46 + mlconnector/src/alembic.ini | 116 ++ mlconnector/src/db/__init__.py | 0 mlconnector/src/db/db_setup.py | 47 + mlconnector/src/db/redis_setup.py | 32 + mlconnector/src/endpoints/.DS_Store | Bin 0 -> 6148 bytes mlconnector/src/endpoints/__init__.py | 0 mlconnector/src/endpoints/endpoint_tags.json | 14 + mlconnector/src/endpoints/mldeployment.py | 107 ++ mlconnector/src/endpoints/mlmodels.py | 118 ++ mlconnector/src/endpoints/mlresource.py | 76 + mlconnector/src/endpoints/mltraining.py | 26 + mlconnector/src/main.py | 46 + mlconnector/src/migrations/README | 1 + mlconnector/src/migrations/env.py | 93 + mlconnector/src/migrations/script.py.mako | 26 + mlconnector/src/models/__init__.py | 0 mlconnector/src/models/mldeployment.py | 36 + mlconnector/src/models/mlmodels.py | 53 + mlconnector/src/models/mlresources.py | 26 + mlconnector/src/models/mltraining.py | 21 + mlconnector/src/poetry.lock | 1707 +++++++++++++++++ mlconnector/src/pyproject.toml | 40 + mlconnector/src/schema/__init__.py | 0 mlconnector/src/schema/mldeployment.py | 51 + mlconnector/src/schema/mlmodels.py | 135 ++ mlconnector/src/schema/mloperations.py | 30 + mlconnector/src/schema/mlresource.py | 48 + mlconnector/src/schema/mltraining.py | 45 + mlconnector/src/startup.sh | 8 + mlconnector/src/utils/.DS_Store | Bin 0 -> 10244 bytes mlconnector/src/utils/__init__.py | 0 mlconnector/src/utils/api/.DS_Store | Bin 0 -> 10244 bytes .../api/__pycache__/main.cpython-311.pyc | Bin 0 -> 2570 bytes mlconnector/src/utils/api/endpoint_tags.json | 6 + .../src/utils/api/generate_dockerfile.py | 428 +++++ mlconnector/src/utils/api/requirements.txt | 8 + mlconnector/src/utils/generate_train.py | 250 +++ mlconnector/src/utils/get_model.py | 12 + mlconnector/src/utils/manage_s3.py | 138 ++ mlconnector/src/utils/mldeployments.py | 264 +++ mlconnector/src/utils/mlmodels.py | 282 +++ mlconnector/src/utils/mloperations.py | 45 + mlconnector/src/utils/mlresources.py | 63 + mlconnector/src/utils/mltrainings.py | 102 + mlconnector/src/utils/requirements.txt | 10 + mlconnector/src/utils/train/.DS_Store | Bin 0 -> 10244 bytes mlconnector/src/utils/train/.env | 1 + .../train/__pycache__/main.cpython-311.pyc | Bin 0 -> 2570 bytes mlconnector/src/utils/train/requirements.txt | 9 + mlconnector/xai-server-app/.DS_Store | Bin 0 -> 6148 bytes mlconnector/xai-server-app/Dockerfile | 13 + mlconnector/xai-server-app/ShapExplainer.py | 180 ++ mlconnector/xai-server-app/database.py | 121 ++ mlconnector/xai-server-app/manage_s3.py | 137 ++ mlconnector/xai-server-app/requirements.txt | Bin 0 -> 8512 bytes mlconnector/xai-server-app/server.py | 163 ++ mlconnector/xai-server-app/tmpData/.DS_Store | Bin 0 -> 6148 bytes 75 files changed, 6988 insertions(+) create mode 100644 .DS_Store create mode 100644 mlconnector/.DS_Store create mode 100644 mlconnector/README.md create mode 100644 mlconnector/api_full_documentation.md create mode 100644 mlconnector/db/.DS_Store create mode 100644 mlconnector/db/Dockerfile create mode 100644 mlconnector/db/configs/drift_metrics_mmd.csv create mode 100644 mlconnector/db/configs/init-my-db.sh create mode 100644 mlconnector/docker-compose.yaml create mode 100644 mlconnector/drift_app/.DS_Store create mode 100644 mlconnector/drift_app/.env create mode 100644 mlconnector/drift_app/Dockerfile create mode 100644 mlconnector/drift_app/app.py create mode 100644 mlconnector/drift_app/manage_s3.py create mode 100644 mlconnector/drift_app/requirements.txt create mode 100644 mlconnector/drift_app/utilities.py create mode 100644 mlconnector/src/.DS_Store create mode 100644 mlconnector/src/Dockerfile create mode 100644 mlconnector/src/alembic.ini create mode 100644 mlconnector/src/db/__init__.py create mode 100644 mlconnector/src/db/db_setup.py create mode 100644 mlconnector/src/db/redis_setup.py create mode 100644 mlconnector/src/endpoints/.DS_Store create mode 100644 mlconnector/src/endpoints/__init__.py create mode 100644 mlconnector/src/endpoints/endpoint_tags.json create mode 100644 mlconnector/src/endpoints/mldeployment.py create mode 100644 mlconnector/src/endpoints/mlmodels.py create mode 100644 mlconnector/src/endpoints/mlresource.py create mode 100644 mlconnector/src/endpoints/mltraining.py create mode 100644 mlconnector/src/main.py create mode 100644 mlconnector/src/migrations/README create mode 100644 mlconnector/src/migrations/env.py create mode 100644 mlconnector/src/migrations/script.py.mako create mode 100644 mlconnector/src/models/__init__.py create mode 100644 mlconnector/src/models/mldeployment.py create mode 100644 mlconnector/src/models/mlmodels.py create mode 100644 mlconnector/src/models/mlresources.py create mode 100644 mlconnector/src/models/mltraining.py create mode 100644 mlconnector/src/poetry.lock create mode 100644 mlconnector/src/pyproject.toml create mode 100644 mlconnector/src/schema/__init__.py create mode 100644 mlconnector/src/schema/mldeployment.py create mode 100644 mlconnector/src/schema/mlmodels.py create mode 100644 mlconnector/src/schema/mloperations.py create mode 100644 mlconnector/src/schema/mlresource.py create mode 100644 mlconnector/src/schema/mltraining.py create mode 100644 mlconnector/src/startup.sh create mode 100644 mlconnector/src/utils/.DS_Store create mode 100644 mlconnector/src/utils/__init__.py create mode 100644 mlconnector/src/utils/api/.DS_Store create mode 100644 mlconnector/src/utils/api/__pycache__/main.cpython-311.pyc create mode 100644 mlconnector/src/utils/api/endpoint_tags.json create mode 100644 mlconnector/src/utils/api/generate_dockerfile.py create mode 100644 mlconnector/src/utils/api/requirements.txt create mode 100644 mlconnector/src/utils/generate_train.py create mode 100644 mlconnector/src/utils/get_model.py create mode 100644 mlconnector/src/utils/manage_s3.py create mode 100644 mlconnector/src/utils/mldeployments.py create mode 100644 mlconnector/src/utils/mlmodels.py create mode 100644 mlconnector/src/utils/mloperations.py create mode 100644 mlconnector/src/utils/mlresources.py create mode 100644 mlconnector/src/utils/mltrainings.py create mode 100644 mlconnector/src/utils/requirements.txt create mode 100644 mlconnector/src/utils/train/.DS_Store create mode 100644 mlconnector/src/utils/train/.env create mode 100644 mlconnector/src/utils/train/__pycache__/main.cpython-311.pyc create mode 100644 mlconnector/src/utils/train/requirements.txt create mode 100644 mlconnector/xai-server-app/.DS_Store create mode 100644 mlconnector/xai-server-app/Dockerfile create mode 100644 mlconnector/xai-server-app/ShapExplainer.py create mode 100644 mlconnector/xai-server-app/database.py create mode 100644 mlconnector/xai-server-app/manage_s3.py create mode 100644 mlconnector/xai-server-app/requirements.txt create mode 100644 mlconnector/xai-server-app/server.py create mode 100644 mlconnector/xai-server-app/tmpData/.DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e142112733c3cfbf46e1c2df7344a5382352b00a GIT binary patch literal 6148 zcmeHK!A=4(5S;?b5@NzZ6XU6gSBxN_F<2;1Id_#eP9^69$ zdLfz}|B(UOyCU=<#$D66d*Ayv2*<E_6H#C;4 z?I((HtGv(DjkV zbA%*l(_4a2I`kc;7I6ec*i=NDD%=x8*mU$u7w0=nE!uPtW@h}3n_0LQiZHXIUz%_b zzC~`C0cK#HfvoM8sQ#ZVfB(-XagP~b23Cpzk!uC5CN9a<)`i7Ut(B;Es3a7ZTKq~u i!<1r-rBb|&Y6Sg~3`E~yY7spsd=W4-aKjAzDFdH_i%&8D literal 0 HcmV?d00001 diff --git a/mlconnector/.DS_Store b/mlconnector/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e30ece5afe59c71ab3707e6f390fe9ec46d729ed GIT binary patch literal 14340 zcmeHNdu$v>9iDIPG<)mVSr;eS-nH=&lcsg-#E(mC=h2?+OWGt&6LNOXanibXx0__i z`SyBycXn$cthN-XO^XDy2t-Q@v=XmKJPK*0stJEULHq*>p#cd*K?o=n4*>;Ksr+VV z?|eRQ(x{ZANITNJ=eN7_?Kd~``)(Oy7%J-BjCC=_WQsgjmr(KmV_}|G1>Vo&f>1{- zpctY^WtB0L9byGG!ICVuVD!QUiJG{5J;eaiS$>{1w85a7QLVTwGDy7{cgou3X$ z_z|A>^CP?ys7!u<(-wB~sGHA<+%Y8^$CPqm3fIMeFsJq~A5MAH&1Xd}%o&6^gL`MV z9txbhlU>*u&JY#3pZW;+2rNW^`}!WfcPXCFW~}UC>g5Zrj@jg$r&CjQE|sxT)be~P zmoe=^SJzocb@hv`SS&A=8|2&P`{=wjVp*9K`Rh(OnYzt1rY6*uVJllmnpq?77?`?2 zLk=d)tZq#WS;eewJLBV`Lk`G+2{kw~)7jlSFwhb1jchp95uO?7>FNkadN&?B7Lb>< zt>3(F;%H_vYaOSjqX74Zf;EbIC4HDm?tFARok`L2@jkaHb9lb!P}O6XhQ;KiH_DTL zxjgxR(x8ouDv2>OZDr%;J;sE()TY_*pz7YdQKDHV(pIK8nYAa>=5#WXE@qMiV=$B9 zgYB_`FEs#>&-eFlv)OGb=Flj)WGN_%nz)5_Yn8F`!XwrCfBetL~3 zmMjalwq4iR)3;@C`_5a>G&U_&o3B)qae^^hFb|nVess#z3rF@R?X;2A&FtYs$+XQ> z#u&*aCyi!|2Lg`O@)epkR!o_970trkYMU%Ot)Z(m<)BUvvfI-6)pYe)S&R=~t!W2% z&v4$LRCf*Dw^~z1Y?_vubO&DFt|%i%={>8qd#iQp6>T(=Oc@zf4~YBpMiebk60=ix zxsCk;iZ(`a&?HU8ZbpaOy!8f6yMy2PmZV+SlQXjPRHxnB4-ISDxP2s=g!OFXxyJ#x=`2`1c-I<8mw6sy%tL>B3AItPk%xuXd5sH8pT9n)t zZ5Q}E7zSEIrIPZE?JBm4Mc5X$m+dE+Yl^1f$_Gk7N_HQgk016t=f-v5TRalEI^q?0JY{d{_*oN)cgHa?fhW$w41ISd5UW1?P8r4A~U*NR}3Q_4-HU(%Msr90|Rk<<1m$1s5dT=Nh zlW8re^4q8A7una@Np_0;kSO{K_G|V#_Bt43G(p2kv=S-Xuo~;I9^FJuPRtt+#UO@p z3w9GZ_hKIo;2`e61d>G1qeM|o&}rO*863j{_y``vLwFdE;gk3jK8?>1WuL*9@fAV1 z3JrIb2`F;BFh|2lD;9HiCHY?;{6wI&@4JK5z4`@uYc=LMyP6%aiA|HLZL&_<2@To{ zOHSJ9DBZcszb{7m`enVg4L@3dDR9jDi{N$%0n z?VCF|*7kWE8y%aPBa(-(QU&v6l2CdE2N{lJvo>e{tk8#dh-+p+uoZ&z*+9%QK2aV$HO3uTy< zt)cVCFm0`&P_-lLN*Zgf3)RRl9i6o@Om~kGs*zzf_9>yVdt8xWHg8cv6&HF=hKUY_ zLN%^&MTXh7JrweiVRllxw+us&+)7iKC&OsVS2Tv=q0x(!VJfPaBfqSpe-UnG2gzs4 zvHM7Vd7M4LzRJGEPP6ZkXM2u(+h4I)$iMv~`zw0`^=QOWsAxtIYj8c?-i#eY+YwhO z97mdHdkBYNA`cq{l<*-^4DTh)kSm5C#mDe*Jc=hsIeZGAb1D1{e6xm:8090/redoc +``` + +Replace `` with your server’s hostname or `localhost` if running locally. + +--- + +## Usage Example + +### 1) Add ML Models + +```bash +curl -X 'POST' \ + 'http://localhost:8090/model/add' \ + -H 'accept: application/json' \ + -H 'Content-Type: application/json' \ + -d '{ + "modelname": "GradientBoostingRegressor", + "modelkind": "Regressor", + "hyperparameter": [ + { + "parameter": "string", + "value": 0 + } + ], + "modelperformance": [ + { + "metric": "string", + "order": 0, + "threshold": 0 + } + ], + "trainingresource": [ + { + "resource_name": "string", + "value": 0, + "deploy": "string" + } + ], + "runresource": [ + { + "resource_name": "string", + "value": 0, + "deploy": "string" + } + ], + "featurelist": [ + { + "feature_name": "size", + "type": "cont", + "kind": 0, + "units": 0 + }, + { + "feature_name": "time_of_day", + "type": "cat", + "kind": 0, + "units": 0 + }, + { + "feature_name": "minute", + "type": "cat", + "kind": 0, + "units": 0 + }, + { + "feature_name": "second", + "type": "cat", + "kind": 0, + "units": 0 + }, + { + "feature_name": "hour", + "type": "cat", + "kind": 0, + "units": 0 + }, + { + "feature_name": "day_of_week", + "type": "cat", + "kind": 0, + "units": 0 + }, + { + "feature_name": "download_time_ms", + "type": "cont", + "kind": 1, + "units": 0 + } + ], + "inference": [ + { + "type": "string", + "value": "string" + } + ], + "modeltags": [ + "regression", + "fast" + ] +}' +``` + +### 2) Add Model Files + +Upload model files (pickled model `.pkl`, training code `.py`, etc.) using the CC storage system: + +```bash +curl -X 'POST' \ + 'http://localhost:8090/model/b2078e0e-e2f3-4870-840c-7f9fbf2ab76d/upload' \ + -H 'accept: application/json' \ + -H 'Content-Type: multipart/form-data' \ + -F 'file=@model_backend_id_144.pkl' \ + -F 'file_kind=model' +``` + +> **Note:** The UUID `b2078e0e-e2f3-4870-840c-7f9fbf2ab76d` in the endpoint path is your `model_id`. + +--- + +## Troubleshooting + +- **Port Conflicts**: Ensure ports `8090` (API docs) and your database port are available. +- **Environment Variables**: Verify all required variables are set. Use `docker compose config` to inspect the interpolated configuration. +- **Docker Connectivity**: Ensure Docker Engine is running and your user has permissions to run Docker commands. +- **API Error Codes**: All status codes and error messages can be accessed via: `http://:8090/redoc` + +--- + +## License + +*** + +--- + diff --git a/mlconnector/api_full_documentation.md b/mlconnector/api_full_documentation.md new file mode 100644 index 0000000..65c4512 --- /dev/null +++ b/mlconnector/api_full_documentation.md @@ -0,0 +1,807 @@ +# API Integration Documentation + +**Base URL:** `BASE_URL` + +--- + +# Model Endpoints +## Model Registration +Model registration is a two step process. In the initial step, we add the model metadata using json description defined below. For example, model type, hyperparameter, modeltags and other features. The second step involve adding the model artifacts; .pkl file, training data, requirements file and python script that will be used to retrain the model (See example). +### POST /model/add +**Summary:** Add new ML model metadata. + +**Request Body (`MLModelCreate`):** +```json +{ + "modelname": "RandomForest", + "modelkind": "classification", + "drift_detection": [ + { "is_true": 0, "method": 0 } + ] + // other fields (see endpoint): hyperparameter, modelperformance, trainingresource, runresource, featurelist, inference, modeltags +} +``` + +**Responses:** +- **201**: Created `MLModel` object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X POST "BASE_URL/model/add" \ + -H "Content-Type: application/json" \ + -d '{ + "modelname": "MyModel", + "modelkind": "regression", + "drift_detection": [{"is_true": 1, "method": 2}] + }' +``` + +**Example Python:** +```python +import requests + +payload = { + "modelname": "MyModel", + "modelkind": "regression", + "drift_detection": [{"is_true": 1, "method": 2}] +} +resp = requests.post("BASE_URL/model/add", json=payload) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: POST /model/add + Note right of Agent: Body: MLModelCreate JSON + MLConnector-->>Agent: 201 Created +``` + +--- + +### POST /model/{model_id}/upload +**Summary:** Upload a file for a specific model. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|----------|------|--------|----------|----------------| +| model_id | path | string | yes | ID of the model | + +**Request Body (multipart/form-data):** +- `file` (binary) +- `file_kind`: `model` | `data` | `code` + +**Responses:** +- **201**: `FileSchema` object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X POST "BASE_URL/model/1234/upload" \ + -F "file=@/path/to/model.pkl" \ + -F "file_kind=model" +``` + +**Example Python:** +```python +import requests + +files = { + "file": open("model.pkl", "rb"), + "file_kind": (None, "model") +} +resp = requests.post("BASE_URL/model/1234/upload", files=files) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: POST /model/{model_id}/upload + Note right of Agent: multipart/form-data (file, file_kind) + MLConnector-->>Agent: 201 Created +``` + +--- + +### GET /model/all +**Summary:** Get all ML models. + +**Query Parameters:** + +| Name | In | Type | Default | Required | Description | +|-------|-------|---------|---------|----------|-----------------------------| +| skip | query | integer | 0 | no | Number of items to skip | +| limit | query | integer | 100 | no | Maximum number of items | + +**Responses:** +- **200**: Array of `MLModel` objects. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X GET "BASE_URL/model/all?skip=0&limit=50" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +resp = requests.get( + "BASE_URL/model/all", + params={"skip": 0, "limit": 50} +) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /model/all?skip={skip}&limit={limit} + MLConnector-->>Agent: 200 OK +``` + +--- + +### GET /model/getkind/{modelkind} +**Summary:** Get models by kind. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|-----------|------|--------|----------|------------------------------------| +| modelkind | path | string | yes | `classification`, `regression`, or `clustering` | + +**Responses:** +- **200**: Array of `MLModel` objects. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X GET "BASE_URL/model/getkind/regression" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +kind = "regression" +resp = requests.get(f"BASE_URL/model/getkind/{kind}") +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /model/getkind/{modelkind} + MLConnector-->>Agent: 200 OK +``` + +--- + +### GET /model/search +**Summary:** Get models by tags. + +**Query Parameters:** + +| Name | In | Type | Required | Description | +|------|-------|------------------|----------|---------------------------------| +| tags | query | array of strings | no | e.g. `?tags=fast&tags=tree-based` | + +**Responses:** +- **200**: Array of `MLModel` objects. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -G "BASE_URL/model/search" \ + --data-urlencode "tags=fast" \ + --data-urlencode "tags=accuracy-focused" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +params = [("tags", "fast"), ("tags", "accuracy-focused")] +resp = requests.get("BASE_URL/model/search", params=params) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /model/search?tags=tag1&tags=tag2 + MLConnector-->>Agent: 200 OK +``` + +--- + +### PATCH /model/{model_id} +**Summary:** Update metadata of an existing model. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|----------|------|--------|----------|----------------| +| model_id | path | string | yes | ID of the model | + +> _Note: Request body schema not defined in spec; typically a partial `MLModel` object._ + +**Responses:** +- **200**: (empty response) +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X PATCH "BASE_URL/model/1234" \ + -H "Content-Type: application/json" \ + -d '{ + "modeltags": ["updated-tag"], + "drift_detection": [{"is_true": 1, "method": 1}] + }' +``` + +**Example Python:** +```python +import requests + +update = { + "modeltags": ["updated-tag"], + "drift_detection": [{"is_true": 1, "method": 1}] +} +resp = requests.patch("BASE_URL/model/1234", json=update) +print(resp.status_code) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: PATCH /model/{model_id} + Note right of Agent: Body: partial MLModel JSON + MLConnector-->>Agent: 200 OK +``` + +--- + +### DELETE /model/{model_id} +**Summary:** Delete an existing model. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|----------|------|--------|----------|----------------| +| model_id | path | string | yes | ID of the model | + +**Responses:** +- **200**: (empty response) +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X DELETE "BASE_URL/model/1234" +``` + +**Example Python:** +```python +import requests + +resp = requests.delete("BASE_URL/model/1234") +print(resp.status_code) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: DELETE /model/{model_id} + MLConnector-->>Agent: 200 OK +``` + +--- + +## Training Endpoints + +### POST /mltraining/add +**Summary:** Initiate model training. + +**Request Body (`MLTrainCreate`):** +```json +{ + "modelid": "1234", + "placement": { + "clusterID": "*", + "node": "*", + "continuum": false + } +} +``` + +**Responses:** +- **201**: `MLTrain` object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X POST "BASE_URL/mltraining/add" \ + -H "Content-Type: application/json" \ + -d '{ + "modelid": "1234", + "placement": { "clusterID": "*", "node": "*", "continuum": false } + }' +``` + +**Example Python:** +```python +import requests + +payload = { + "modelid": "1234", + "placement": {"clusterID": "*", "node": "*", "continuum": False} +} +resp = requests.post("BASE_URL/mltraining/add", json=payload) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: POST /mltraining/add + Note right of Agent: Body: MLTrainCreate JSON + MLConnector-->>Agent: 201 Created +``` + +--- + +## Deployment Endpoints + +### GET /deployment/all +**Summary:** Get all deployments. + +**Query Parameters:** + +| Name | In | Type | Default | Required | Description | +|-------|-------|---------|---------|----------|-----------------------------| +| skip | query | integer | 0 | no | Number of items to skip | +| limit | query | integer | 100 | no | Maximum number of items | + +**Responses:** +- **200**: Array of deployment objects. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X GET "BASE_URL/deployment/all?skip=0&limit=50" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +resp = requests.get( + "BASE_URL/deployment/all", + params={"skip": 0, "limit": 50} +) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /deployment/all?skip={skip}&limit={limit} + MLConnector-->>Agent: 200 OK +``` + +--- + +### POST /deployment/add +**Summary:** Create a new deployment. + +**Request Body (`MLDeploymentCreate`):** +```json +{ + "modelid": "1234", + "ownerid": "agent-1", + "placement": { "clusterID": "*", "node": "*", "continuum": true }, + "deployment_id": "dep-5678", + "inference_data": 1 +} +``` + +**Responses:** +- **201**: `MLDeploymentReturn` object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X POST "BASE_URL/deployment/add" \ + -H "Content-Type: application/json" \ + -d '{ + "modelid": "1234", + "ownerid": "agent-1", + "placement": { "clusterID": "*", "node": "*", "continuum": true }, + "deployment_id": "dep-5678", + "inference_data": 1 + }' +``` + +**Example Python:** +```python +import requests + +payload = { + "modelid": "1234", + "ownerid": "agent-1", + "placement": {"clusterID": "*", "node": "*", "continuum": True}, + "deployment_id": "dep-5678", + "inference_data": 1 +} +resp = requests.post("BASE_URL/deployment/add", json=payload) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: POST /deployment/add + Note right of Agent: Body: MLDeploymentCreate JSON + MLConnector-->>Agent: 201 Created +``` + +--- + +### POST /deployment/add/operation +**Summary:** Record an inference operation. + +**Request Body (`MLDeploymentOposCreate`):** +```json +{ + "ownerid": "agent-1", + "deploymentid": "dep-5678", + "modelid": "1234", + "data": "{...}", + "result": "{...}" +} +``` + +**Responses:** +- **201**: `MLDeploymentOposReturn` object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X POST "BASE_URL/deployment/add/operation" \ + -H "Content-Type: application/json" \ + -d '{ + "ownerid": "agent-1", + "deploymentid": "dep-5678", + "modelid": "1234", + "data": "{...}", + "result": "{...}" + }' +``` + +**Example Python:** +```python +import requests + +payload = { + "ownerid": "agent-1", + "deploymentid": "dep-5678", + "modelid": "1234", + "data": "{...}", + "result": "{...}" +} +resp = requests.post("BASE_URL/deployment/add/operation", json=payload) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: POST /deployment/add/operation + Note right of Agent: Body: MLDeploymentOposCreate JSON + MLConnector-->>Agent: 201 Created +``` + +--- + +### GET /deployment/get/status/{deployment_id} +**Summary:** Retrieve deployment status. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|---------------|------|--------|----------|------------------------| +| deployment_id | path | string | yes | ID of the deployment | + +**Responses:** +- **200**: Status object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X GET "BASE_URL/deployment/get/status/dep-5678" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +resp = requests.get("BASE_URL/deployment/get/status/dep-5678") +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /deployment/get/status/{deployment_id} + MLConnector-->>Agent: 200 OK +``` + +--- + +### GET /deployment/get/opos/{ownerid} +**Summary:** List operations by owner. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|---------|------|--------|----------|------------------------| +| ownerid | path | string | yes | ID of the operation's owner | + +**Responses:** +- **200**: Array of `MLDeploymentOposReturn` objects. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X GET "BASE_URL/deployment/get/opos/agent-1" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +resp = requests.get("BASE_URL/deployment/get/opos/agent-1") +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /deployment/get/opos/{ownerid} + MLConnector-->>Agent: 200 OK +``` + +--- + +### DELETE /deployment/{deployment_id} +**Summary:** Delete a deployment. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|---------------|------|--------|----------|------------------------| +| deployment_id | path | string | yes | ID of the deployment | + +**Responses:** +- **200**: (empty response) +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X DELETE "BASE_URL/deployment/dep-5678" +``` + +**Example Python:** +```python +import requests + +resp = requests.delete("BASE_URL/deployment/dep-5678") +print(resp.status_code) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: DELETE /deployment/{deployment_id} + MLConnector-->>Agent: 200 OK +``` + + +--- + +# End-to-end example + +**Base URL:** `BASE_URL` + +## 1. Build and save model +Below, we build a simple regression model using scikit-learn and save it to local storage. + +```python +... +# Replace with your training pipleline +reg = Ridge(alpha=1.0, random_state=0) +reg.fit(X, y) +... + +# It is important that all models are saved with a .pkl extension +# Serialize with pickle to a .pkl file +output_path = "diabetes_ridge.pkl" +with open(output_path, "wb") as f: + pickle.dump(reg, f) + +``` +## 2. Register ML model with +### 2.1 Model metadata +To register the model above, first we add the model metadata and then the model artfacts. Using the model above, here is json description example (To see what each parameter means see api documentation). +```json +{ + "modelname": "Ridge", + "modelkind": "Regressor", + "hyperparameter": [ + { + "parameter": "string", + "value": 0 + } + ], + "modelperformance": [ + { + "metric": "Accuracy", + "order": 1, + "threshold": 0.89 + } + ], + "trainingresource": [ + { + "resource_name": "GPU", + "value": 16, + "deploy": "string" + } + ], + "runresource": [ + { + "resource_name": "GPU", + "value": 16, + "deploy": "string" + } + ], + "featurelist": [...], + "inference": [ + { + "type": "string", + "value": "string" + } + ], +"modeltags": [ + "regression", + "fast" + ], +"drift_detection": [ + { + "is_true": 1, + "method": 0 + } + ] +} +``` +Use the above description, we can then make a post request to register the model. + +```python +import requests +resp = requests.post("BASE_URL/model/add", json=payload) +print(resp.json()) +``` +### 2.2 Model artifacts +The above step should return a model_id that will be used in the next steps. Here, will upload the model artifacts. These include; +- Model file (pickled file saved in step one above) +- Training data. This will be used for explainability and drift detection. (Note, it has to be the exact same data used to train the model, otherwise you will get wrong results) +- Requirements file that defines the environment the model was trained in. + +Upload these one by one using the example bellow; +Note: file_kind can be `model`, `data`, `code`, and `env` +```python +import requests + +files = { + "file": open("model.pkl", "rb"), + "file_kind": (None, "model") +} +resp = requests.post("BASE_URL/model/1234/upload", files=files) +print(resp.json()) +``` +## 3. Deployment +After adding the model artifacts, the next step is to deploy the model. The ML model is deployed as standalone docker application and an endpoint is returned to which inference data can be passed. +```python +import requests + +payload = { + "modelid": "1234", + "ownerid": "agent-1", + "placement": {..}, + "deployment_id": "", + "inference_data": 1 +} +resp = requests.post("BASE_URL/deployment/add", json=payload) +print(resp.json()) +``` +`placement` can one of the following; +- Placement to a specific cluster, node and continuum +```json +{"clusterID": "UTH-Internal-testbed", "node": "mls-drone", "continuum": "Edge"} +``` +- Placement on a given cluster +```json + {"clusterID": "UTH-Internal-testbed", "node": "*", "continuum": "*"} +``` +- Placement anywhere +```json +{"clusterID": "*", "node": "*", "continuum": "*"} +``` +This returns a deployment_id used to query the status of the deployment and also the inference endpoint and explainability. + +### 3.1 Query Deployment Status + +- **List All**: `GET /deployment/all?skip={skip}&limit={limit}` +- **Get Status**: `GET /deployment/get/status/{deployment_id}` + +**Example:** +```bash +curl -X GET "BASE_URL/deployment/get/status/dep-iris-001" +``` +--- + +## 4. Inference Endpoint (including Explainability) + +### 4.1 Predict Call + +Assuming deployment created with `deployment_id = dep-iris-001`: + +```bash +curl -X POST "BASE_URL/deployment/dep-iris-001/predict" \ + -H "Content-Type: application/json" \ + -d '{ + "data": [[5.1, 3.5, 1.4, 0.2]], + "explain": true + }' +``` + +**Response:** +```json +{ + "prediction": [0], + "explanation": { + "feature_importance": [0.12, 0.08, 0.70, 0.10], + "method": "shap" + } +} +``` + +### 3.2 Explainability Details + +- When `explain=true`, response includes per-feature contributions (e.g., SHAP values). +- Interpretation: Positive values push toward the predicted class; negatives push away. + +--- diff --git a/mlconnector/db/.DS_Store b/mlconnector/db/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..d72c63718bac506cb801b6984a9bad4f14472085 GIT binary patch literal 6148 zcmeHKO-sW-5S^{nrif5M!Q+D0f~|@lc!{}Fq*-7ElzNL1;T|g!vkH<% zoV0EtFk47KfybNR1z3Uqq5!QA5}nYsm>See2NwDWfSARwHmvJk z8bnC}MAu?!5F=>9q#~MBVUHNXq+?uKo@+5RXwpIGk+B~;valx+bZr=yR6%qtrUo&B#yTN^ovF>F$&oW=1GMfu2?0;4La=gNWH^7ZOk4sMo9N1pDM=*pC)5H z>HS7uhSv}^;%vd+gw+dOiTSP>J5M?9GbiOQ{vijqfrI)EZ_3gh?7BUoF<=b*cLsQ7 zi`42K%^Cy7fHAOPK)w$VRWJ!ydelz`ja~tWRk~F;mb--HL;;h4rAMw%oKGeCR2Qxo z&ZpBKg}5YO>CvadX=m06on5%0IPFe|D)dJ(ASMAzkMvONkATu( K#u)fj20j3DI7;0B literal 0 HcmV?d00001 diff --git a/mlconnector/drift_app/.env b/mlconnector/drift_app/.env new file mode 100644 index 0000000..9c39348 --- /dev/null +++ b/mlconnector/drift_app/.env @@ -0,0 +1,12 @@ +POSTGRES_DB=mlmodel +POSTGRES_USER=postgres +POSTGRES_PASSWORD=54rCNF5rbZWd$ +PGADMIN_DEFAULT_EMAIL=info@mail.io +PGADMIN_DEFAULT_PASSWORD=54rCNF5rbZWd$ +DB_HOST_NAME=database +DB_PORT=5432 +DB_DRIVER=postgresql +AWS_ACCESS_URL=https://s3.sky-flok.com +AWS_ACCESS_KEY_ID=SKYW3IVWRKC7LN4L7QCNNTJDO7RQBSRD +AWS_SECRET_ACCESS_KEY=MDBpDso0hZymB4nVXU0nLAbzqdYfREqDo1gl2pWjbyub4UAi72LNhIDbLgIzHXhq +AWS_S3_BUCKET_DATA=mlsysops-data \ No newline at end of file diff --git a/mlconnector/drift_app/Dockerfile b/mlconnector/drift_app/Dockerfile new file mode 100644 index 0000000..66cc763 --- /dev/null +++ b/mlconnector/drift_app/Dockerfile @@ -0,0 +1,11 @@ +FROM python:3.10-slim + +WORKDIR /app + +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY . . + +EXPOSE 8050 +CMD ["python", "app.py"] diff --git a/mlconnector/drift_app/app.py b/mlconnector/drift_app/app.py new file mode 100644 index 0000000..46b036a --- /dev/null +++ b/mlconnector/drift_app/app.py @@ -0,0 +1,284 @@ +import requests +import pandas as pd +import plotly.express as px +from dash import Dash, dcc, html, Input, Output, dash_table +import os +from dotenv import load_dotenv +from sqlalchemy import create_engine +import logging +from datetime import datetime +from apscheduler.schedulers.background import BackgroundScheduler +import utilities as utl +import json + + +load_dotenv(override=True) + + +db_config = { + "DB_DRIVER": os.getenv("DB_DRIVER"), + "DB_USER": os.getenv("POSTGRES_USER"), + "DB_PASSWORD": os.getenv("POSTGRES_PASSWORD"), + "DB_HOST": os.getenv("DB_HOST_NAME"), + "DB_PORT": os.getenv("DB_PORT"), + "DB_NAME": os.getenv("POSTGRES_DB") +} + + +SQLALCHEMY_DATABASE_URL = ( + f"{db_config['DB_DRIVER']}://{db_config['DB_USER']}:" + f"{db_config['DB_PASSWORD']}@{db_config['DB_HOST']}:" + f"{db_config['DB_PORT']}/{db_config['DB_NAME']}" +) +engine = create_engine(SQLALCHEMY_DATABASE_URL) + + +MODEL_API_URL = "http://api:8090/model/all" + + +external_stylesheets = ["https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"] + + +app = Dash(__name__, external_stylesheets=external_stylesheets) +app.title = "Drift Monitoring Dashboard" + + +app.layout = html.Div(className="container-fluid", children=[ + html.H1("📈 Drift Monitoring Dashboard", className="text-center my-4"), + + + dcc.Interval(id="model-refresh", interval=60*1000, n_intervals=0), + + html.Div(className="row px-4", children=[ + + html.Div(className="col-md-6 mb-3", children=[ + html.Label("Select Model", className="form-label fw-bold"), + dcc.Dropdown( + id="model-dropdown", options=[], + placeholder="Loading models…", + disabled=True, className="form-select" + ) + ]), + + html.Div(className="col-md-6 mb-3", children=[ + html.Label("Select Feature", className="form-label fw-bold"), + dcc.Loading( + id="feature-loading", type="default", + children=dcc.Dropdown( + id="feature-dropdown", options=[], + placeholder="Select a model first…", + disabled=True, className="form-select" + ) + ) + ]), + ]), + + + html.Div(className="container", children=[ + dcc.Loading(dcc.Graph(id="drift-graph"), type="circle") + ]), + + + html.Div(id="drift-info", className="text-center fs-5 mb-3"), + + + html.Div(className="container", children=[ + dash_table.DataTable( + id="drift-table", + columns=[ + {"name": "Timestamp", "id": "timestamp"}, + {"name": "Feature", "id": "feature"}, + {"name": "Type", "id": "type"}, + {"name": "Statistic", "id": "statistic"}, + {"name": "P-Value", "id": "p_value"}, + {"name": "Drift Detected", "id": "drift_detected"}, + ], + data=[], + page_size=10, + style_table={"overflowX": "auto"}, + style_cell={"textAlign": "left"}, + style_header={"fontWeight": "bold"}, + ) + ], style={"marginBottom": "40px"}) +]) + + +@app.callback( + Output("model-dropdown", "options"), + Output("model-dropdown", "placeholder"), + Output("model-dropdown", "disabled"), + Input("model-refresh", "n_intervals") +) +def update_models(n_intervals): + try: + resp = requests.get(MODEL_API_URL, timeout=5) + resp.raise_for_status() + models = [m["modelid"] for m in resp.json()] + except Exception: + models = [] + + if not models: + return [], "⚠️ No models available", True + + opts = [{"label": m, "value": m} for m in models] + return opts, "Choose a model…", False + + +@app.callback( + Output("feature-dropdown", "options"), + Output("feature-dropdown", "value"), + Output("feature-dropdown", "placeholder"), + Output("feature-dropdown", "disabled"), + Input("model-dropdown", "value") +) +def update_features(selected_model): + if not selected_model: + return [], None, "Select a model first…", True + + try: + q = "SELECT DISTINCT feature FROM drift_metrics WHERE modelid = %s ORDER BY feature" + features = pd.read_sql(q, engine, params=(selected_model,))["feature"].tolist() + except Exception as e: + print("Error reading features:", e) + return [], None, "❌ Error loading features", True + + if not features: + return [], None, "⚠️ No features available", True + + opts = [{"label": f, "value": f} for f in features] + return opts, features[0], "Select a feature…", False + + +@app.callback( + Output("drift-graph", "figure"), + Output("drift-info", "children"), + Input("model-dropdown", "value"), + Input("feature-dropdown", "value") +) +def update_graph(selected_model, selected_feature): + if not selected_model: + return {}, html.Span("Please select a model.", className="text-warning fw-bold") + if not selected_feature: + return {}, html.Span("Please select a feature.", className="text-warning fw-bold") + + try: + q = """ + SELECT timestamp, feature, type, statistic, p_value, drift_detected + FROM drift_metrics + WHERE modelid = %s AND feature = %s + ORDER BY timestamp + """ + df = pd.read_sql(q, engine, params=(selected_model, selected_feature)) + except Exception as e: + print("Error loading drift data:", e) + return {}, html.Span("❌ Error loading data.", className="text-danger fw-bold") + + if df.empty: + return {}, html.Span("No data for selected feature.", className="text-warning fw-bold") + + df["timestamp"] = pd.to_datetime(df["timestamp"]) + fig = px.line( + df, x="timestamp", y="statistic", + color="type", markers=True, + title=f"Drift Metric for '{selected_feature}'" + ) + fig.update_layout( + xaxis_title="Timestamp", yaxis_title="Statistic Value", + legend_title="Feature Type", template="plotly_white" + ) + + + mask = df["drift_detected"].astype(str).str.lower() == "true" + count = mask.sum() + msg = (html.Span([html.Span("⚠️ Drift detected ", className="text-danger fw-bold"), + f"{count} occurrences"]) + if count else html.Span("✅ No drift detected", className="text-success fw-bold")) + + return fig, msg + + +@app.callback( + Output("drift-table", "data"), + Input("model-dropdown", "value") +) +def update_table(selected_model): + if not selected_model: + return [] + try: + q = """ + SELECT timestamp, feature, type, statistic, p_value, drift_detected + FROM drift_metrics + WHERE modelid = %s + ORDER BY timestamp + """ + df = pd.read_sql(q, engine, params=(selected_model,)) + + df["timestamp"] = df["timestamp"].astype(str) + return df.to_dict("records") + except Exception as e: + print("Error loading table data:", e) + return [] + +def drif_job(): + logging.info("drif detection job starting") + try: + logging.info(f"Find all models with drift detection") + filter = json.dumps([{"is_true": 1}]) + q = """ + SELECT * + FROM mlmodels + WHERE drift_detection @> %s::jsonb + """ + records = pd.read_sql(q, engine, params=(filter,)) + for record in records.to_dict("records"): + model_details = utl.model_data(engine, record['modelid']) + if model_details: + training_data = model_details[0] + inference_data = model_details[1]["data"].to_frame() + #logging.info(inference_data) + cont_features = [ + f['feature_name'] + for f in record["featurelist"] + if f['kind'] == 0 and f['type'] == 'cont' + ] + + cat_features = [ + f['feature_name'] + for f in record["featurelist"] + if f['kind'] == 0 and f['type'] == 'cat' + ] + #logging.info(cont_features) + #logging.info(cat_features) + logging.info(f"Run the drift detection based on selected method") + result = utl.calculate_drift( + training_data, + inference_data, + cont_features, + cat_features, + method = 'mean-shift' + ) + except Exception: + logging.exception("Error in drif_job") + finally: + #cur.close() + #conn.close() + logging.info("drif_job job finished") + +if __name__ == "__main__": + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s %(levelname)s %(message)s" + ) + + scheduler = BackgroundScheduler(timezone="UTC") + # first run immediately, then every 24 h + scheduler.add_job( + drif_job, + trigger='interval', + hours=24, + next_run_time=datetime.now() + ) + scheduler.start() + logging.info("Scheduler started: drif_job every 24 hours") + + app.run(host="0.0.0.0", port=8050, debug=False) diff --git a/mlconnector/drift_app/manage_s3.py b/mlconnector/drift_app/manage_s3.py new file mode 100644 index 0000000..2479314 --- /dev/null +++ b/mlconnector/drift_app/manage_s3.py @@ -0,0 +1,138 @@ +import boto3 +from botocore.exceptions import NoCredentialsError, ClientError +from botocore.config import Config +from boto3.exceptions import S3UploadFailedError +from dotenv import load_dotenv +import os +import logging + +load_dotenv(verbose=True, override=True) + +class S3Manager: + def __init__(self, bucket_name, aws_access_key_id, aws_secret_access_key, endpoint_url): + """ + Initialize the S3Manager with a bucket name and optional AWS credentials. + """ + self.bucket_name = bucket_name + self.s3_client = boto3.client( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + endpoint_url=endpoint_url, + config=Config(s3={'addressing_style': 'path', 'payload_signing_enabled': False}) + ) + self._ensure_bucket_exists() + + def _ensure_bucket_exists(self): + """ + Check if the bucket exists. If not, create it. + """ + try: + self.s3_client.head_bucket(Bucket=self.bucket_name) + print(f"Bucket '{self.bucket_name}' already exists.") + except ClientError as e: + # If a 404 error is thrown, then the bucket does not exist. + error_code = int(e.response['Error']['Code']) + if error_code == 404: + try: + self.s3_client.create_bucket(Bucket=self.bucket_name) + print(f"Bucket '{self.bucket_name}' created successfully.") + except ClientError as ce: + print("Error creating bucket:", ce) + else: + print("Error checking bucket:", e) + + def upload_file(self, file_name, object_name=None): + """Upload a file to an S3 bucket + + :param file_name: File to upload + :param bucket: Bucket to upload to + :param object_name: S3 object name. If not specified then file_name is used + :return: True if file was uploaded, else False + """ + + # If S3 object_name was not specified, use file_name + if object_name is None: + object_name = os.path.basename(file_name) + try: + with open(file_name, 'rb') as f: + data = f.read() + self.s3_client.put_object(Bucket=self.bucket_name, Key=object_name, Body=data, ContentLength=len(data)) + except ClientError as e: + logging.error(e) + return False + return True + + + def download_file(self, object_name, download_path): + """ + Download a file from the bucket. + + :param object_name: Name of the file in S3. + :param download_path: Local path where the file will be saved. + """ + try: + response = self.s3_client.get_object(Bucket=self.bucket_name, Key=object_name) + body = response['Body'].read() + with open(download_path, 'wb') as f: + f.write(body) + print(f"File '{object_name}' downloaded from bucket '{self.bucket_name}' to '{download_path}'.") + except ClientError as e: + print("Error downloading file:", e) + + def delete_file(self, object_name): + """ + Delete a file from the bucket. + + :param object_name: Name of the file in S3 to delete. + """ + try: + self.s3_client.delete_object(Bucket=self.bucket_name, Key=object_name) + print(f"File '{object_name}' deleted from bucket '{self.bucket_name}'.") + except ClientError as e: + print("Error deleting file:", e) + + def list_files(self): + """ + List all files in the bucket. + """ + try: + response = self.s3_client.list_objects_v2(Bucket=self.bucket_name) + if 'Contents' in response: + files = [obj['Key'] for obj in response['Contents']] + print("Files in bucket:") + for f in files: + print(" -", f) + return files + else: + print("No files found in bucket.") + return [] + except ClientError as e: + print("Error listing files:", e) + return [] + +# Example usage: +if __name__ == "__main__": + + manager = S3Manager( + os.getenv("AWS_S3_BUCKET_DATA"), + os.getenv("AWS_ACCESS_KEY_ID"), + os.getenv("AWS_SECRET_ACCESS_KEY"), + os.getenv("AWS_ACCESS_URL") + ) + # Upload a file + #manager.list_files() + manager.upload_file('model_backend_id_137.pkl') + + manager.list_files() + # Download the file + #manager.download_file('9ce175cf-5fa8-4c72-ac30-15467a75dd98.csv', '9ce175cf-5fa8-4c72-ac30-15467a75dd98.csv') + + # Delete the file + #manager.delete_file('c2377cdc-e8ba-4cf0-9392-80c0983f0b4d.pkl') + #manager.delete_file('c2377cdc-e8ba-4cf0-9392-80c0983f0b4d.py') + #manager.delete_file('c2377cdc-e8ba-4cf0-9392-80c0983f0b4d.csv') + + #manager.list_files() + # Download the file + #manager.download_file('sample_data.csv', 'downloaded_example.csv') diff --git a/mlconnector/drift_app/requirements.txt b/mlconnector/drift_app/requirements.txt new file mode 100644 index 0000000..238c780 --- /dev/null +++ b/mlconnector/drift_app/requirements.txt @@ -0,0 +1,9 @@ +dash +plotly +pandas +python-dotenv +sqlalchemy +psycopg2-binary +apscheduler +scikit-learn +boto3 ==1.16.47 \ No newline at end of file diff --git a/mlconnector/drift_app/utilities.py b/mlconnector/drift_app/utilities.py new file mode 100644 index 0000000..c34bd0a --- /dev/null +++ b/mlconnector/drift_app/utilities.py @@ -0,0 +1,128 @@ +import pandas as pd +import numpy as np +from scipy.stats import ttest_ind, ks_2samp, chi2_contingency +from sklearn.metrics.pairwise import rbf_kernel +from datetime import datetime, timedelta +import json +import logging +import os +import tempfile +from manage_s3 import S3Manager +from dotenv import load_dotenv +load_dotenv(override=True) + +manager = S3Manager( + os.getenv("AWS_S3_BUCKET_DATA"), + os.getenv("AWS_ACCESS_KEY_ID"), + os.getenv("AWS_SECRET_ACCESS_KEY"), + os.getenv("AWS_ACCESS_URL") + ) + +def extract_feature_names(feature_list): + type_mapping = { + 'cont': "float", + 'cat': "str" + } + + return { + feature['feature_name']: type_mapping.get(feature['type'], None) + for feature in feature_list + if feature.get('kind') == 0 + } + +def mean_shift(train, infer): + return ttest_ind(train, infer, equal_var=False) + +def ks_test(train, infer): + return ks_2samp(train, infer) + +def mmd(train, infer, gamma=1.0): + X = train.values.reshape(-1, 1) + Y = infer.values.reshape(-1, 1) + XX = rbf_kernel(X, X, gamma) + YY = rbf_kernel(Y, Y, gamma) + XY = rbf_kernel(X, Y, gamma) + return XX.mean() + YY.mean() - 2 * XY.mean() + +def chi_squared_test(train_series, infer_series): + train_counts = train_series.value_counts(normalize=True) + infer_counts = infer_series.value_counts(normalize=True) + all_categories = sorted(set(train_counts.index).union(infer_counts.index)) + train_freq = [train_counts.get(cat, 0) for cat in all_categories] + infer_freq = [infer_counts.get(cat, 0) for cat in all_categories] + contingency_table = np.array([train_freq, infer_freq]) + return chi2_contingency(contingency_table) + +def calculate_drift(train_df, infer_df, numerical_cols, categorical_cols, method = 'mean-shift'): + results = [] + + for col in numerical_cols: + train_series = train_df[col] + infer_series = infer_df[col] + + if method == 'mean-shift': + stat, p = mean_shift(train_series, infer_series) + elif method == 'ks': + stat, p = ks_test(train_series, infer_series) + elif method == 'mmd': + stat = mmd(train_series, infer_series) + p = np.nan + else: + raise ValueError("Invalid method") + + results.append({ + 'feature': col, + 'type': 'numerical', + 'statistic': stat, + 'p_value': p, + 'method':method, + 'drift_detected': (p < 0.05) if not np.isnan(p) else (stat > 0.1) + }) + + for col in categorical_cols: + chi2, p, _, _ = chi_squared_test(train_df[col], infer_df[col]) + results.append({ + 'feature': col, + 'type': 'categorical', + 'statistic': chi2, + 'p_value': p, + 'method':method, + 'drift_detected': p < 0.05 + }) + + results_df = pd.DataFrame(results) + return results_df + +def model_data(engine, model_id): + # check for inference data (atleast 10 data points) + q = """ + SELECT * + FROM mldeploymentsops + WHERE modelid = %s + """ + records = pd.read_sql(q, engine, params=(model_id,)) + if records.empty or len(records) < 10: + logging.warning(f"No inference data found for model {model_id}") + return False + # check for training data + file_name = f"{model_id}.csv" + tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".csv") + tmp_path = tmp.name + tmp.close() + + try: + manager.download_file(file_name, tmp_path) + try: + df = pd.read_csv(tmp_path) + except pd.errors.EmptyDataError: + return False + return df, records + + except (FileNotFoundError, IOError) as e: + logging.warning(f"Could not download `{file_name}`: {e}") + return False + + finally: + # cleanup: only once, and only if it still exists + if os.path.exists(tmp_path): + os.remove(tmp_path) \ No newline at end of file diff --git a/mlconnector/src/.DS_Store b/mlconnector/src/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a7721b748f03cd3059daec51e682308b4fc4935f GIT binary patch literal 14340 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.9 or backports.zoneinfo library. +# Any required deps can installed by adding `alembic[tz]` to the pip requirements +# string value is passed to ZoneInfo() +# leave blank for localtime +# timezone = + +# max length of characters to apply to the "slug" field +# truncate_slug_length = 40 + +# set to 'true' to run the environment during +# the 'revision' command, regardless of autogenerate +# revision_environment = false + +# set to 'true' to allow .pyc and .pyo files without +# a source .py file to be detected as revisions in the +# versions/ directory +# sourceless = false + +# version location specification; This defaults +# to migrations/versions. When using multiple version +# directories, initial revisions must be specified with --version-path. +# The path separator used here should be the separator specified by "version_path_separator" below. +# version_locations = %(here)s/bar:%(here)s/bat:migrations/versions + +# version path separator; As mentioned above, this is the character used to split +# version_locations. The default within new alembic.ini files is "os", which uses os.pathsep. +# If this key is omitted entirely, it falls back to the legacy behavior of splitting on spaces and/or commas. +# Valid values for version_path_separator are: +# +# version_path_separator = : +# version_path_separator = ; +# version_path_separator = space +version_path_separator = os # Use os.pathsep. Default configuration used for new projects. + +# set to 'true' to search source files recursively +# in each "version_locations" directory +# new in Alembic version 1.10 +# recursive_version_locations = false + +# the output encoding used when revision files +# are written from script.py.mako +# output_encoding = utf-8 + +sqlalchemy.url = postgresql+asyncpg://postgres:54rCNF5rbZWd$@database:5432/mlmodel + + +[post_write_hooks] +# post_write_hooks defines scripts or Python functions that are run +# on newly generated revision scripts. See the documentation for further +# detail and examples + +# format using "black" - use the console_scripts runner, against the "black" entrypoint +# hooks = black +# black.type = console_scripts +# black.entrypoint = black +# black.options = -l 79 REVISION_SCRIPT_FILENAME + +# lint with attempts to fix using "ruff" - use the exec runner, execute a binary +# hooks = ruff +# ruff.type = exec +# ruff.executable = %(here)s/.venv/bin/ruff +# ruff.options = --fix REVISION_SCRIPT_FILENAME + +# Logging configuration +[loggers] +keys = root,sqlalchemy,alembic + +[handlers] +keys = console + +[formatters] +keys = generic + +[logger_root] +level = WARN +handlers = console +qualname = + +[logger_sqlalchemy] +level = WARN +handlers = +qualname = sqlalchemy.engine + +[logger_alembic] +level = INFO +handlers = +qualname = alembic + +[handler_console] +class = StreamHandler +args = (sys.stderr,) +level = NOTSET +formatter = generic + +[formatter_generic] +format = %(levelname)-5.5s [%(name)s] %(message)s +datefmt = %H:%M:%S diff --git a/mlconnector/src/db/__init__.py b/mlconnector/src/db/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mlconnector/src/db/db_setup.py b/mlconnector/src/db/db_setup.py new file mode 100644 index 0000000..38f0465 --- /dev/null +++ b/mlconnector/src/db/db_setup.py @@ -0,0 +1,47 @@ +#!/usr/bin/python3 +# Author: John Byabazaire + +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker +from dotenv import load_dotenv +import os + + +load_dotenv(verbose=True, override=True) + +db_config = { + "DB_DRIVER": os.getenv("DB_DRIVER"), + "DB_USER": os.getenv("POSTGRES_USER"), + "DB_PASSWORD": os.getenv("POSTGRES_PASSWORD"), + "DB_HOST": os.getenv("DB_HOST_NAME"), + "DB_PORT": os.getenv("DB_PORT"), + "DB_NAME": os.getenv("POSTGRES_DB") +} + + +SQLALCHEMY_DATABASE_URL = ( + f"{db_config['DB_DRIVER']}://{db_config['DB_USER']}:" + f"{db_config['DB_PASSWORD']}@{db_config['DB_HOST']}:" + f"{db_config['DB_PORT']}/{db_config['DB_NAME']}" +) + +engine = create_async_engine( + SQLALCHEMY_DATABASE_URL, connect_args={}, future=True +) + +SessionLocal = sessionmaker( + engine, class_=AsyncSession, expire_on_commit=False, future=True +) + +Base = declarative_base() + +async def get_db(): + async with SessionLocal() as db: + try: + yield db + await db.commit() # Commit transaction + except Exception as e: + await db.rollback() # Rollback in case of error + print(f"Error in database transaction: {e}") + raise diff --git a/mlconnector/src/db/redis_setup.py b/mlconnector/src/db/redis_setup.py new file mode 100644 index 0000000..756848e --- /dev/null +++ b/mlconnector/src/db/redis_setup.py @@ -0,0 +1,32 @@ + +# !/usr/bin/python3 +# Author John Byabazaire + +from dotenv import load_dotenv +import os +import asyncio_redis +#import redis + + +load_dotenv(verbose=True, override=True) + +async def create_redis_connection(): + try: + # Initialize Redis connection using asyncio-redis + redis_client = await asyncio_redis.Connection.create( + host=os.getenv('REDIS_HOST'), + port=int(os.getenv('REDIS_PORT')), + password=os.getenv('REDIS_HOST_PASSWORD'), + db=int(os.getenv('REDIS_DB_NUMBER')) + ) + + # Ping the Redis server + #ping = await redis_client.ping() # Awaiting the ping + if await redis_client.ping(): + print(f"Successfully connected to Redis at {os.getenv('REDIS_HOST')}.") + return redis_client + else: + raise Exception("Could not connect to Redis.") + except Exception as e: + print(f"Redis connection error: {e}") + raise \ No newline at end of file diff --git a/mlconnector/src/endpoints/.DS_Store b/mlconnector/src/endpoints/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 None: + """Run migrations in 'offline' mode. + + This configures the context with just a URL + and not an Engine, though an Engine is acceptable + here as well. By skipping the Engine creation + we don't even need a DBAPI to be available. + + Calls to context.execute() here emit the given string to the + script output. + + """ + url = config.get_main_option("sqlalchemy.url") + # print(url) + + context.configure( + url=url, + target_metadata=target_metadata, + literal_binds=True, + dialect_opts={"paramstyle": "named"}, + ) + + with context.begin_transaction(): + context.run_migrations() + + +def do_run_migrations(connection: Connection) -> None: + context.configure(connection=connection, target_metadata=target_metadata) + + with context.begin_transaction(): + context.run_migrations() + + +async def run_async_migrations() -> None: + """In this scenario we need to create an Engine + and associate a connection with the context. + + """ + + connectable = async_engine_from_config( + config.get_section(config.config_ini_section, {}), + prefix="sqlalchemy.", + poolclass=pool.NullPool, + ) + + async with connectable.connect() as connection: + await connection.run_sync(do_run_migrations) + + await connectable.dispose() + + +def run_migrations_online() -> None: + """Run migrations in 'online' mode.""" + + asyncio.run(run_async_migrations()) + + +if context.is_offline_mode(): + run_migrations_offline() +else: + run_migrations_online() diff --git a/mlconnector/src/migrations/script.py.mako b/mlconnector/src/migrations/script.py.mako new file mode 100644 index 0000000..fbc4b07 --- /dev/null +++ b/mlconnector/src/migrations/script.py.mako @@ -0,0 +1,26 @@ +"""${message} + +Revision ID: ${up_revision} +Revises: ${down_revision | comma,n} +Create Date: ${create_date} + +""" +from typing import Sequence, Union + +from alembic import op +import sqlalchemy as sa +${imports if imports else ""} + +# revision identifiers, used by Alembic. +revision: str = ${repr(up_revision)} +down_revision: Union[str, None] = ${repr(down_revision)} +branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} +depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} + + +def upgrade() -> None: + ${upgrades if upgrades else "pass"} + + +def downgrade() -> None: + ${downgrades if downgrades else "pass"} diff --git a/mlconnector/src/models/__init__.py b/mlconnector/src/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mlconnector/src/models/mldeployment.py b/mlconnector/src/models/mldeployment.py new file mode 100644 index 0000000..c60e0dd --- /dev/null +++ b/mlconnector/src/models/mldeployment.py @@ -0,0 +1,36 @@ +# !/usr/bin/python3 +# Author John Byabazaire + +from sqlalchemy import Column, String, DateTime, ForeignKey +from sqlalchemy.dialects.postgresql import JSONB +from sqlalchemy.orm import relationship +from datetime import datetime +from datetime import datetime, timezone + +from db.db_setup import Base + + +class MLDeployment(Base): + __tablename__ = "mldeployments" + + deployment_id = Column(String, primary_key=True) + modelid = Column(String, nullable=False) + status = Column(String, nullable=False) + ownerid = Column(String, nullable=False) + placement = Column(JSONB, nullable=True) + + operations = relationship("MLDeploymentOps", back_populates="deployment") + + +class MLDeploymentOps(Base): + __tablename__ = "mldeploymentsops" + + operationid = Column(String, primary_key=True) + timestamp = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc)) + ownerid = Column(String, nullable=False) + modelid = Column(String, nullable=False) + data = Column(String, nullable=False) + result = Column(String, nullable=False) + deploymentid = Column(String, ForeignKey("mldeployments.deployment_id"), nullable=False) + + deployment = relationship("MLDeployment", back_populates="operations") diff --git a/mlconnector/src/models/mlmodels.py b/mlconnector/src/models/mlmodels.py new file mode 100644 index 0000000..25d093e --- /dev/null +++ b/mlconnector/src/models/mlmodels.py @@ -0,0 +1,53 @@ +# !/usr/bin/python3 +# Author John Byabazaire + +from datetime import datetime +from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Text, DateTime, Float +from sqlalchemy.dialects.postgresql import ARRAY +from sqlalchemy.orm import relationship +from sqlalchemy.dialects.postgresql import JSONB + +from db.db_setup import Base +#from models.mixins import Timestamp + + +class MLModels(Base): + __tablename__ = "mlmodels" + modelid = Column(Text, primary_key=True) + modelname = Column(String(100), nullable=False) + modelkind = Column(String(50), nullable=False) + #source_code = Column(Text, nullable=False) + #trained_model = Column(JSONB, nullable=True) + #training_data = Column(JSONB, nullable=False) + hyperparameter = Column(JSONB, nullable=True) + modelperformance = Column(JSONB, nullable=True) + trainingresource = Column(JSONB, nullable=True) + runresource = Column(JSONB, nullable=True) + featurelist = Column(JSONB, nullable=True) + inference = Column(JSONB, nullable=True) + modeltags = Column(ARRAY(String), nullable=True) + drift_detection = Column(JSONB, nullable=True) + #created_at = Column(DateTime, default=datetime.utcnow()) + #updated_at = Column(DateTime, onupdate=datetime.utcnow()) + + +class MLModelFiles(Base): + __tablename__ = "mlmodelfiles" + fileid = Column(Text, primary_key=True) + modelid = Column(Text, ForeignKey('mlmodels.modelid')) + filename = Column(String(50), nullable=False) + filekind = Column(Text, nullable=False) + contenttype = Column(Text, nullable=False) + + +class MLModelDrift(Base): + __tablename__ = "drift_metrics" + rowid = Column(Text, primary_key=True) + feature = Column(Text, nullable=False) + type = Column(String(50), nullable=False) + statistic = Column(Float, nullable=False) + p_value = Column(Float, nullable=False) + method = Column(String(50), nullable=False) + drift_detected = Column(Text, nullable=False) + timestamp = Column(DateTime, default=datetime.utcnow()) + modelid = Column(Text, ForeignKey('mlmodels.modelid')) \ No newline at end of file diff --git a/mlconnector/src/models/mlresources.py b/mlconnector/src/models/mlresources.py new file mode 100644 index 0000000..19811db --- /dev/null +++ b/mlconnector/src/models/mlresources.py @@ -0,0 +1,26 @@ +# !/usr/bin/python3 +# Author John Byabazaire + + +from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Enum, Text, ARRAY +from sqlalchemy.orm import relationship + +from db.db_setup import Base +#from models.mixins import Timestamp + + +class MLResources(Base): + __tablename__ = "mlresources" + resource_id = Column(String(32), primary_key=True) + explanation_flag = Column(Integer, nullable=False) + modelrecall = Column(Integer, nullable=False) + modelprecision = Column(Integer, nullable=False) + modelaccuracy = Column(Integer, nullable=False) + min_core = Column(Integer, nullable=False) + min_ram = Column(Integer, nullable=False) + min_disk = Column(Integer, nullable=False) + input_type = Column(String(20), nullable=False) + out_type = Column(String(20), nullable=False) + modelid = Column(String(32), ForeignKey('mlmodels.modelid')) + + diff --git a/mlconnector/src/models/mltraining.py b/mlconnector/src/models/mltraining.py new file mode 100644 index 0000000..f6943ba --- /dev/null +++ b/mlconnector/src/models/mltraining.py @@ -0,0 +1,21 @@ +# !/usr/bin/python3 +# Author John Byabazaire + + +from sqlalchemy import Boolean, Column, ForeignKey, Integer, String, Text +from sqlalchemy.orm import relationship +from sqlalchemy.dialects.postgresql import JSONB + +from db.db_setup import Base +#from models.mixins import Timestamp + + +class MLTraining(Base): + __tablename__ = "mltraining" + deployment_id = Column(String, primary_key=True) + modelid = Column(String, nullable=False) + status = Column(String, nullable=False) + placement = Column(JSONB, nullable=True) + + + diff --git a/mlconnector/src/poetry.lock b/mlconnector/src/poetry.lock new file mode 100644 index 0000000..48df36b --- /dev/null +++ b/mlconnector/src/poetry.lock @@ -0,0 +1,1707 @@ +# This file is automatically @generated by Poetry 2.1.2 and should not be changed by hand. + +[[package]] +name = "aioredis" +version = "2.0.1" +description = "asyncio (PEP 3156) Redis support" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "aioredis-2.0.1-py3-none-any.whl", hash = "sha256:9ac0d0b3b485d293b8ca1987e6de8658d7dafcca1cddfcd1d506cae8cdebfdd6"}, + {file = "aioredis-2.0.1.tar.gz", hash = "sha256:eaa51aaf993f2d71f54b70527c440437ba65340588afeb786cd87c55c89cd98e"}, +] + +[package.dependencies] +async-timeout = "*" +typing-extensions = "*" + +[package.extras] +hiredis = ["hiredis (>=1.0) ; implementation_name == \"cpython\""] + +[[package]] +name = "alembic" +version = "1.15.2" +description = "A database migration tool for SQLAlchemy." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "alembic-1.15.2-py3-none-any.whl", hash = "sha256:2e76bd916d547f6900ec4bb5a90aeac1485d2c92536923d0b138c02b126edc53"}, + {file = "alembic-1.15.2.tar.gz", hash = "sha256:1c72391bbdeffccfe317eefba686cb9a3c078005478885413b95c3b26c57a8a7"}, +] + +[package.dependencies] +Mako = "*" +SQLAlchemy = ">=1.4.0" +typing-extensions = ">=4.12" + +[package.extras] +tz = ["tzdata"] + +[[package]] +name = "annotated-types" +version = "0.7.0" +description = "Reusable constraint types to use with typing.Annotated" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, + {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, +] + +[[package]] +name = "anyio" +version = "4.9.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, + {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} + +[package.extras] +doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] +test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] +trio = ["trio (>=0.26.1)"] + +[[package]] +name = "async-timeout" +version = "5.0.1" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c"}, + {file = "async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3"}, +] + +[[package]] +name = "asyncio-redis" +version = "0.16.0" +description = "PEP 3156 implementation of the redis protocol." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "asyncio_redis-0.16.0-py2.py3-none-any.whl", hash = "sha256:4a134fde5ea3628ff0c7118e2424b0f26140a1bd21d5e4632058f1f662773686"}, + {file = "asyncio_redis-0.16.0.tar.gz", hash = "sha256:ff8ce4e7e22a08e2688ae6b397aeac355473e343ce3c68ae3b713494318d848b"}, +] + +[package.extras] +hiredis = ["hiredis"] + +[[package]] +name = "asyncpg" +version = "0.29.0" +description = "An asyncio PostgreSQL driver" +optional = false +python-versions = ">=3.8.0" +groups = ["main"] +files = [ + {file = "asyncpg-0.29.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72fd0ef9f00aeed37179c62282a3d14262dbbafb74ec0ba16e1b1864d8a12169"}, + {file = "asyncpg-0.29.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:52e8f8f9ff6e21f9b39ca9f8e3e33a5fcdceaf5667a8c5c32bee158e313be385"}, + {file = "asyncpg-0.29.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9e6823a7012be8b68301342ba33b4740e5a166f6bbda0aee32bc01638491a22"}, + {file = "asyncpg-0.29.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:746e80d83ad5d5464cfbf94315eb6744222ab00aa4e522b704322fb182b83610"}, + {file = "asyncpg-0.29.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ff8e8109cd6a46ff852a5e6bab8b0a047d7ea42fcb7ca5ae6eaae97d8eacf397"}, + {file = "asyncpg-0.29.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97eb024685b1d7e72b1972863de527c11ff87960837919dac6e34754768098eb"}, + {file = "asyncpg-0.29.0-cp310-cp310-win32.whl", hash = "sha256:5bbb7f2cafd8d1fa3e65431833de2642f4b2124be61a449fa064e1a08d27e449"}, + {file = "asyncpg-0.29.0-cp310-cp310-win_amd64.whl", hash = "sha256:76c3ac6530904838a4b650b2880f8e7af938ee049e769ec2fba7cd66469d7772"}, + {file = "asyncpg-0.29.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4900ee08e85af01adb207519bb4e14b1cae8fd21e0ccf80fac6aa60b6da37b4"}, + {file = "asyncpg-0.29.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a65c1dcd820d5aea7c7d82a3fdcb70e096f8f70d1a8bf93eb458e49bfad036ac"}, + {file = "asyncpg-0.29.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5b52e46f165585fd6af4863f268566668407c76b2c72d366bb8b522fa66f1870"}, + {file = "asyncpg-0.29.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc600ee8ef3dd38b8d67421359779f8ccec30b463e7aec7ed481c8346decf99f"}, + {file = "asyncpg-0.29.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:039a261af4f38f949095e1e780bae84a25ffe3e370175193174eb08d3cecab23"}, + {file = "asyncpg-0.29.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6feaf2d8f9138d190e5ec4390c1715c3e87b37715cd69b2c3dfca616134efd2b"}, + {file = "asyncpg-0.29.0-cp311-cp311-win32.whl", hash = "sha256:1e186427c88225ef730555f5fdda6c1812daa884064bfe6bc462fd3a71c4b675"}, + {file = "asyncpg-0.29.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfe73ffae35f518cfd6e4e5f5abb2618ceb5ef02a2365ce64f132601000587d3"}, + {file = "asyncpg-0.29.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6011b0dc29886ab424dc042bf9eeb507670a3b40aece3439944006aafe023178"}, + {file = "asyncpg-0.29.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b544ffc66b039d5ec5a7454667f855f7fec08e0dfaf5a5490dfafbb7abbd2cfb"}, + {file = "asyncpg-0.29.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d84156d5fb530b06c493f9e7635aa18f518fa1d1395ef240d211cb563c4e2364"}, + {file = "asyncpg-0.29.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54858bc25b49d1114178d65a88e48ad50cb2b6f3e475caa0f0c092d5f527c106"}, + {file = "asyncpg-0.29.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bde17a1861cf10d5afce80a36fca736a86769ab3579532c03e45f83ba8a09c59"}, + {file = "asyncpg-0.29.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:37a2ec1b9ff88d8773d3eb6d3784dc7e3fee7756a5317b67f923172a4748a175"}, + {file = "asyncpg-0.29.0-cp312-cp312-win32.whl", hash = "sha256:bb1292d9fad43112a85e98ecdc2e051602bce97c199920586be83254d9dafc02"}, + {file = "asyncpg-0.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:2245be8ec5047a605e0b454c894e54bf2ec787ac04b1cb7e0d3c67aa1e32f0fe"}, + {file = "asyncpg-0.29.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0009a300cae37b8c525e5b449233d59cd9868fd35431abc470a3e364d2b85cb9"}, + {file = "asyncpg-0.29.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cad1324dbb33f3ca0cd2074d5114354ed3be2b94d48ddfd88af75ebda7c43cc"}, + {file = "asyncpg-0.29.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:012d01df61e009015944ac7543d6ee30c2dc1eb2f6b10b62a3f598beb6531548"}, + {file = "asyncpg-0.29.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000c996c53c04770798053e1730d34e30cb645ad95a63265aec82da9093d88e7"}, + {file = "asyncpg-0.29.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e0bfe9c4d3429706cf70d3249089de14d6a01192d617e9093a8e941fea8ee775"}, + {file = "asyncpg-0.29.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:642a36eb41b6313ffa328e8a5c5c2b5bea6ee138546c9c3cf1bffaad8ee36dd9"}, + {file = "asyncpg-0.29.0-cp38-cp38-win32.whl", hash = "sha256:a921372bbd0aa3a5822dd0409da61b4cd50df89ae85150149f8c119f23e8c408"}, + {file = "asyncpg-0.29.0-cp38-cp38-win_amd64.whl", hash = "sha256:103aad2b92d1506700cbf51cd8bb5441e7e72e87a7b3a2ca4e32c840f051a6a3"}, + {file = "asyncpg-0.29.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5340dd515d7e52f4c11ada32171d87c05570479dc01dc66d03ee3e150fb695da"}, + {file = "asyncpg-0.29.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e17b52c6cf83e170d3d865571ba574577ab8e533e7361a2b8ce6157d02c665d3"}, + {file = "asyncpg-0.29.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f100d23f273555f4b19b74a96840aa27b85e99ba4b1f18d4ebff0734e78dc090"}, + {file = "asyncpg-0.29.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48e7c58b516057126b363cec8ca02b804644fd012ef8e6c7e23386b7d5e6ce83"}, + {file = "asyncpg-0.29.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f9ea3f24eb4c49a615573724d88a48bd1b7821c890c2effe04f05382ed9e8810"}, + {file = "asyncpg-0.29.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8d36c7f14a22ec9e928f15f92a48207546ffe68bc412f3be718eedccdf10dc5c"}, + {file = "asyncpg-0.29.0-cp39-cp39-win32.whl", hash = "sha256:797ab8123ebaed304a1fad4d7576d5376c3a006a4100380fb9d517f0b59c1ab2"}, + {file = "asyncpg-0.29.0-cp39-cp39-win_amd64.whl", hash = "sha256:cce08a178858b426ae1aa8409b5cc171def45d4293626e7aa6510696d46decd8"}, + {file = "asyncpg-0.29.0.tar.gz", hash = "sha256:d1c49e1f44fffafd9a55e1a9b101590859d881d639ea2922516f5d9c512d354e"}, +] + +[package.dependencies] +async-timeout = {version = ">=4.0.3", markers = "python_version < \"3.12.0\""} + +[package.extras] +docs = ["Sphinx (>=5.3.0,<5.4.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-asyncio (>=0.3.0,<0.4.0)"] +test = ["flake8 (>=6.1,<7.0)", "uvloop (>=0.15.3) ; platform_system != \"Windows\" and python_version < \"3.12.0\""] + +[[package]] +name = "boto3" +version = "1.16.47" +description = "The AWS SDK for Python" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "boto3-1.16.47-py2.py3-none-any.whl", hash = "sha256:50c2475cc6c38f7ff24c3e0ca8f7eaf787ce740499198043e05e6f13ac2e919f"}, + {file = "boto3-1.16.47.tar.gz", hash = "sha256:05796ba6c65f79214ea61becae5126d5c924eed8a11874bc5536d611deabbe47"}, +] + +[package.dependencies] +botocore = ">=1.19.47,<1.20.0" +jmespath = ">=0.7.1,<1.0.0" +s3transfer = ">=0.3.0,<0.4.0" + +[[package]] +name = "botocore" +version = "1.19.63" +description = "Low-level, data-driven core of boto 3." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "botocore-1.19.63-py2.py3-none-any.whl", hash = "sha256:ad4adfcc195b5401d84b0c65d3a89e507c1d54c201879c8761ff10ef5c361e21"}, + {file = "botocore-1.19.63.tar.gz", hash = "sha256:d3694f6ef918def8082513e5ef309cd6cd83b612e9984e3a66e8adc98c650a92"}, +] + +[package.dependencies] +jmespath = ">=0.7.1,<1.0.0" +python-dateutil = ">=2.1,<3.0.0" +urllib3 = {version = ">=1.25.4,<1.27", markers = "python_version != \"3.4\""} + +[[package]] +name = "certifi" +version = "2025.1.31" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "certifi-2025.1.31-py3-none-any.whl", hash = "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe"}, + {file = "certifi-2025.1.31.tar.gz", hash = "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651"}, +] + +[[package]] +name = "cffi" +version = "1.17.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "platform_python_implementation != \"PyPy\"" +files = [ + {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, + {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, + {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, + {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, + {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, + {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, + {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, + {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, + {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, + {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, + {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, + {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, + {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, + {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, + {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, + {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, + {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, + {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, + {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, + {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, + {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, + {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, + {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, + {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, + {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, + {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, + {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, + {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, + {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, + {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, + {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.4.1" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"}, + {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"}, + {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"}, + {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"}, + {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"}, + {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"}, + {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"}, + {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"}, + {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"}, + {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"}, +] + +[[package]] +name = "click" +version = "8.1.8" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, + {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main"] +markers = "platform_system == \"Windows\"" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cryptography" +version = "43.0.3" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "cryptography-43.0.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf7a1932ac4176486eab36a19ed4c0492da5d97123f1406cf15e41b05e787d2e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63efa177ff54aec6e1c0aefaa1a241232dcd37413835a9b674b6e3f0ae2bfd3e"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e1ce50266f4f70bf41a2c6dc4358afadae90e2a1e5342d3c08883df1675374f"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:443c4a81bb10daed9a8f334365fe52542771f25aedaf889fd323a853ce7377d6"}, + {file = "cryptography-43.0.3-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:74f57f24754fe349223792466a709f8e0c093205ff0dca557af51072ff47ab18"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9762ea51a8fc2a88b70cf2995e5675b38d93bf36bd67d91721c309df184f49bd"}, + {file = "cryptography-43.0.3-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:81ef806b1fef6b06dcebad789f988d3b37ccaee225695cf3e07648eee0fc6b73"}, + {file = "cryptography-43.0.3-cp37-abi3-win32.whl", hash = "sha256:cbeb489927bd7af4aa98d4b261af9a5bc025bd87f0e3547e11584be9e9427be2"}, + {file = "cryptography-43.0.3-cp37-abi3-win_amd64.whl", hash = "sha256:f46304d6f0c6ab8e52770addfa2fc41e6629495548862279641972b6215451cd"}, + {file = "cryptography-43.0.3-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8ac43ae87929a5982f5948ceda07001ee5e83227fd69cf55b109144938d96984"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:846da004a5804145a5f441b8530b4bf35afbf7da70f82409f151695b127213d5"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f996e7268af62598f2fc1204afa98a3b5712313a55c4c9d434aef49cadc91d4"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f7b178f11ed3664fd0e995a47ed2b5ff0a12d893e41dd0494f406d1cf555cab7"}, + {file = "cryptography-43.0.3-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c2e6fc39c4ab499049df3bdf567f768a723a5e8464816e8f009f121a5a9f4405"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:e1be4655c7ef6e1bbe6b5d0403526601323420bcf414598955968c9ef3eb7d16"}, + {file = "cryptography-43.0.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:df6b6c6d742395dd77a23ea3728ab62f98379eff8fb61be2744d4679ab678f73"}, + {file = "cryptography-43.0.3-cp39-abi3-win32.whl", hash = "sha256:d56e96520b1020449bbace2b78b603442e7e378a9b3bd68de65c782db1507995"}, + {file = "cryptography-43.0.3-cp39-abi3-win_amd64.whl", hash = "sha256:0c580952eef9bf68c4747774cde7ec1d85a6e61de97281f2dba83c7d2c806362"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d03b5621a135bffecad2c73e9f4deb1a0f977b9a8ffe6f8e002bf6c9d07b918c"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:a2a431ee15799d6db9fe80c82b055bae5a752bef645bba795e8e52687c69efe3"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:281c945d0e28c92ca5e5930664c1cefd85efe80e5c0d2bc58dd63383fda29f83"}, + {file = "cryptography-43.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f18c716be16bc1fea8e95def49edf46b82fccaa88587a45f8dc0ff6ab5d8e0a7"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4a02ded6cd4f0a5562a8887df8b3bd14e822a90f97ac5e544c162899bc467664"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53a583b6637ab4c4e3591a15bc9db855b8d9dee9a669b550f311480acab6eb08"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1ec0bcf7e17c0c5669d881b1cd38c4972fade441b27bda1051665faaa89bdcaa"}, + {file = "cryptography-43.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2ce6fae5bdad59577b44e4dfed356944fbf1d925269114c28be377692643b4ff"}, + {file = "cryptography-43.0.3.tar.gz", hash = "sha256:315b9001266a492a6ff443b61238f956b214dbec9910a081ba5b6646a055a805"}, +] + +[package.dependencies] +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} + +[package.extras] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] +nox = ["nox"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] +sdist = ["build"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["certifi", "cryptography-vectors (==43.0.3)", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test-randomorder = ["pytest-randomly"] + +[[package]] +name = "deprecated" +version = "1.2.18" +description = "Python @deprecated decorator to deprecate old python classes, functions or methods." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +groups = ["main"] +files = [ + {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, + {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, +] + +[package.dependencies] +wrapt = ">=1.10,<2" + +[package.extras] +dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools ; python_version >= \"3.12\"", "tox"] + +[[package]] +name = "docker" +version = "7.1.0" +description = "A Python library for the Docker Engine API." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "docker-7.1.0-py3-none-any.whl", hash = "sha256:c96b93b7f0a746f9e77d325bcfb87422a3d8bd4f03136ae8a85b37f1898d5fc0"}, + {file = "docker-7.1.0.tar.gz", hash = "sha256:ad8c70e6e3f8926cb8a92619b832b4ea5299e2831c14284663184e200546fa6c"}, +] + +[package.dependencies] +pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} +requests = ">=2.26.0" +urllib3 = ">=1.26.0" + +[package.extras] +dev = ["coverage (==7.2.7)", "pytest (==7.4.2)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.1.0)", "ruff (==0.1.8)"] +docs = ["myst-parser (==0.18.0)", "sphinx (==5.1.1)"] +ssh = ["paramiko (>=2.4.3)"] +websockets = ["websocket-client (>=1.3.0)"] + +[[package]] +name = "ecdsa" +version = "0.19.1" +description = "ECDSA cryptographic signature library (pure python)" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.6" +groups = ["main"] +files = [ + {file = "ecdsa-0.19.1-py2.py3-none-any.whl", hash = "sha256:30638e27cf77b7e15c4c4cc1973720149e1033827cfd00661ca5c8cc0cdb24c3"}, + {file = "ecdsa-0.19.1.tar.gz", hash = "sha256:478cba7b62555866fcb3bb3fe985e06decbdb68ef55713c4e5ab98c57d508e61"}, +] + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] + +[[package]] +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +groups = ["main"] +markers = "python_version < \"3.11\"" +files = [ + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fastapi" +version = "0.110.3" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "fastapi-0.110.3-py3-none-any.whl", hash = "sha256:fd7600612f755e4050beb74001310b5a7e1796d149c2ee363124abdfa0289d32"}, + {file = "fastapi-0.110.3.tar.gz", hash = "sha256:555700b0159379e94fdbfc6bb66a0f1c43f4cf7060f25239af3d84b63a656626"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0 || >2.0.0,<2.0.1 || >2.0.1,<2.1.0 || >2.1.0,<3.0.0" +starlette = ">=0.37.2,<0.38.0" +typing-extensions = ">=4.8.0" + +[package.extras] +all = ["email_validator (>=2.0.0)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "pydantic-extra-types (>=2.0.0)", "pydantic-settings (>=2.0.0)", "python-multipart (>=0.0.7)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "fastapi-csrf-protect" +version = "0.3.7" +description = "Stateless implementation of Cross-Site Request Forgery (XSRF) Protection by using Double Submit Cookie mitigation pattern" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "fastapi_csrf_protect-0.3.7-py3-none-any.whl", hash = "sha256:75f6f30ebeafd832b7f52f0d0bc347cb3aa42add6b986b4555f213b26c72bc9e"}, + {file = "fastapi_csrf_protect-0.3.7.tar.gz", hash = "sha256:ee1b4979ca20b7558668ee971d96431b8530483a21ca10dc476031f8f28c7930"}, +] + +[package.dependencies] +fastapi = ">=0" +itsdangerous = ">=2.0.1,<3.0.0" +pydantic = ">=2.0.0" +pydantic-settings = ">=2.0.0" + +[package.extras] +examples = ["jinja2 (>=3.0.1)", "pydantic[email] (>=1.7.2,<3.0.0)", "python-multipart (>=0.0.6)", "uvicorn (>=0.15.0)"] + +[[package]] +name = "fastapi-sessions" +version = "0.3.2" +description = "Ready-to-use session library for FastAPI" +optional = false +python-versions = ">=3.6.1,<4.0" +groups = ["main"] +files = [ + {file = "fastapi-sessions-0.3.2.tar.gz", hash = "sha256:5159023fd548f8a9c198a966cf1086a73a43038cf3b9b79175fe33129f15e64c"}, + {file = "fastapi_sessions-0.3.2-py3-none-any.whl", hash = "sha256:b7f5642224b8f03661428e9fb45c9d96c4e61a9cdf963c9ba36ce8428629b0bc"}, +] + +[package.dependencies] +fastapi = ">=0,<1" +itsdangerous = ">=2.0.1,<3.0.0" + +[package.extras] +dev = ["black (>=20.8b1,<21.0)", "flake8 (>=3.9.0,<4.0.0)", "flake8-docstrings (>=1.6.0,<2.0.0)", "isort (>=5.9.3,<6.0.0)", "pytest (>=6.2.3,<7.0.0)", "uvicorn (>=0.14.0,<0.15.0)"] +docs = ["markdown-include (>=0.6.0,<0.7.0)", "mkdocs-material (>=7.1.0,<8.0.0)"] + +[[package]] +name = "fastsession" +version = "0.3.0" +description = "A session middleware for Starlette and FastAPI" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "fastsession-0.3.0-py3-none-any.whl", hash = "sha256:2b288d9d23c8cd51bf8103c406bc1f137615f73ecf3b7e4975d4c1648d8362d8"}, + {file = "fastsession-0.3.0.tar.gz", hash = "sha256:ba3542d367e411875d187edfb82837729874382188824ce0c8bdad5adf8dfdde"}, +] + +[package.dependencies] +itsdangerous = "*" +starlette = "*" + +[[package]] +name = "greenlet" +version = "3.1.1" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "greenlet-3.1.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc"}, + {file = "greenlet-3.1.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7"}, + {file = "greenlet-3.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6"}, + {file = "greenlet-3.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80"}, + {file = "greenlet-3.1.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383"}, + {file = "greenlet-3.1.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511"}, + {file = "greenlet-3.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395"}, + {file = "greenlet-3.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39"}, + {file = "greenlet-3.1.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36"}, + {file = "greenlet-3.1.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0"}, + {file = "greenlet-3.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942"}, + {file = "greenlet-3.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01"}, + {file = "greenlet-3.1.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4"}, + {file = "greenlet-3.1.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1"}, + {file = "greenlet-3.1.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c"}, + {file = "greenlet-3.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b"}, + {file = "greenlet-3.1.1-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01"}, + {file = "greenlet-3.1.1-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc"}, + {file = "greenlet-3.1.1-cp37-cp37m-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa"}, + {file = "greenlet-3.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af"}, + {file = "greenlet-3.1.1-cp37-cp37m-win32.whl", hash = "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798"}, + {file = "greenlet-3.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef"}, + {file = "greenlet-3.1.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8"}, + {file = "greenlet-3.1.1-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd"}, + {file = "greenlet-3.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7"}, + {file = "greenlet-3.1.1-cp38-cp38-win32.whl", hash = "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef"}, + {file = "greenlet-3.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d"}, + {file = "greenlet-3.1.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145"}, + {file = "greenlet-3.1.1-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e"}, + {file = "greenlet-3.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e"}, + {file = "greenlet-3.1.1-cp39-cp39-win32.whl", hash = "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c"}, + {file = "greenlet-3.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22"}, + {file = "greenlet-3.1.1.tar.gz", hash = "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467"}, +] + +[package.extras] +docs = ["Sphinx", "furo"] +test = ["objgraph", "psutil"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "idna" +version = "3.10" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.6" +groups = ["main"] +files = [ + {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, + {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, +] + +[package.extras] +all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +description = "Safely pass data to untrusted environments and back." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"}, + {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"}, +] + +[[package]] +name = "jmespath" +version = "0.10.0" +description = "JSON Matching Expressions" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] +files = [ + {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, + {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, +] + +[[package]] +name = "mako" +version = "1.3.10" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59"}, + {file = "mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28"}, +] + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["Babel"] +lingua = ["lingua"] +testing = ["pytest"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + +[[package]] +name = "passlib" +version = "1.7.4" +description = "comprehensive password hashing framework supporting over 30 schemes" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, +] + +[package.extras] +argon2 = ["argon2-cffi (>=18.2.0)"] +bcrypt = ["bcrypt (>=3.1.0)"] +build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] +totp = ["cryptography"] + +[[package]] +name = "psycopg2-binary" +version = "2.9.10" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "psycopg2-binary-2.9.10.tar.gz", hash = "sha256:4b3df0e6990aa98acda57d983942eff13d824135fe2250e6522edaa782a06de2"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0ea8e3d0ae83564f2fc554955d327fa081d065c8ca5cc6d2abb643e2c9c1200f"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:3e9c76f0ac6f92ecfc79516a8034a544926430f7b080ec5a0537bca389ee0906"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2ad26b467a405c798aaa1458ba09d7e2b6e5f96b1ce0ac15d82fd9f95dc38a92"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:270934a475a0e4b6925b5f804e3809dd5f90f8613621d062848dd82f9cd62007"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:48b338f08d93e7be4ab2b5f1dbe69dc5e9ef07170fe1f86514422076d9c010d0"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4152f8f76d2023aac16285576a9ecd2b11a9895373a1f10fd9db54b3ff06b4"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32581b3020c72d7a421009ee1c6bf4a131ef5f0a968fab2e2de0c9d2bb4577f1"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2ce3e21dc3437b1d960521eca599d57408a695a0d3c26797ea0f72e834c7ffe5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e984839e75e0b60cfe75e351db53d6db750b00de45644c5d1f7ee5d1f34a1ce5"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3c4745a90b78e51d9ba06e2088a2fe0c693ae19cc8cb051ccda44e8df8a6eb53"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win32.whl", hash = "sha256:e5720a5d25e3b99cd0dc5c8a440570469ff82659bb09431c1439b92caf184d3b"}, + {file = "psycopg2_binary-2.9.10-cp310-cp310-win_amd64.whl", hash = "sha256:3c18f74eb4386bf35e92ab2354a12c17e5eb4d9798e4c0ad3a00783eae7cd9f1"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:04392983d0bb89a8717772a193cfaac58871321e3ec69514e1c4e0d4957b5aff"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:1a6784f0ce3fec4edc64e985865c17778514325074adf5ad8f80636cd029ef7c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f86c56eeb91dc3135b3fd8a95dc7ae14c538a2f3ad77a19645cf55bab1799c"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b3d2491d4d78b6b14f76881905c7a8a8abcf974aad4a8a0b065273a0ed7a2cb"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2286791ececda3a723d1910441c793be44625d86d1a4e79942751197f4d30341"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:512d29bb12608891e349af6a0cccedce51677725a921c07dba6342beaf576f9a"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5a507320c58903967ef7384355a4da7ff3f28132d679aeb23572753cbf2ec10b"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:6d4fa1079cab9018f4d0bd2db307beaa612b0d13ba73b5c6304b9fe2fb441ff7"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:851485a42dbb0bdc1edcdabdb8557c09c9655dfa2ca0460ff210522e073e319e"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:35958ec9e46432d9076286dda67942ed6d968b9c3a6a2fd62b48939d1d78bf68"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win32.whl", hash = "sha256:ecced182e935529727401b24d76634a357c71c9275b356efafd8a2a91ec07392"}, + {file = "psycopg2_binary-2.9.10-cp311-cp311-win_amd64.whl", hash = "sha256:ee0e8c683a7ff25d23b55b11161c2663d4b099770f6085ff0a20d4505778d6b4"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:880845dfe1f85d9d5f7c412efea7a08946a46894537e4e5d091732eb1d34d9a0"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9440fa522a79356aaa482aa4ba500b65f28e5d0e63b801abf6aa152a29bd842a"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e3923c1d9870c49a2d44f795df0c889a22380d36ef92440ff618ec315757e539"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b2c956c028ea5de47ff3a8d6b3cc3330ab45cf0b7c3da35a2d6ff8420896526"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f758ed67cab30b9a8d2833609513ce4d3bd027641673d4ebc9c067e4d208eec1"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cd9b4f2cfab88ed4a9106192de509464b75a906462fb846b936eabe45c2063e"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dc08420625b5a20b53551c50deae6e231e6371194fa0651dbe0fb206452ae1f"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d7cd730dfa7c36dbe8724426bf5612798734bff2d3c3857f36f2733f5bfc7c00"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:155e69561d54d02b3c3209545fb08938e27889ff5a10c19de8d23eb5a41be8a5"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3cc28a6fd5a4a26224007712e79b81dbaee2ffb90ff406256158ec4d7b52b47"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win32.whl", hash = "sha256:ec8a77f521a17506a24a5f626cb2aee7850f9b69a0afe704586f63a464f3cd64"}, + {file = "psycopg2_binary-2.9.10-cp312-cp312-win_amd64.whl", hash = "sha256:18c5ee682b9c6dd3696dad6e54cc7ff3a1a9020df6a5c0f861ef8bfd338c3ca0"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:26540d4a9a4e2b096f1ff9cce51253d0504dca5a85872c7f7be23be5a53eb18d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:e217ce4d37667df0bc1c397fdcd8de5e81018ef305aed9415c3b093faaeb10fb"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:245159e7ab20a71d989da00f280ca57da7641fa2cdcf71749c193cea540a74f7"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c4ded1a24b20021ebe677b7b08ad10bf09aac197d6943bfe6fec70ac4e4690d"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3abb691ff9e57d4a93355f60d4f4c1dd2d68326c968e7db17ea96df3c023ef73"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8608c078134f0b3cbd9f89b34bd60a943b23fd33cc5f065e8d5f840061bd0673"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:230eeae2d71594103cd5b93fd29d1ace6420d0b86f4778739cb1a5a32f607d1f"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:bb89f0a835bcfc1d42ccd5f41f04870c1b936d8507c6df12b7737febc40f0909"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f0c2d907a1e102526dd2986df638343388b94c33860ff3bbe1384130828714b1"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f8157bed2f51db683f31306aa497311b560f2265998122abe1dce6428bd86567"}, + {file = "psycopg2_binary-2.9.10-cp313-cp313-win_amd64.whl", hash = "sha256:27422aa5f11fbcd9b18da48373eb67081243662f9b46e6fd07c3eb46e4535142"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:eb09aa7f9cecb45027683bb55aebaaf45a0df8bf6de68801a6afdc7947bb09d4"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b73d6d7f0ccdad7bc43e6d34273f70d587ef62f824d7261c4ae9b8b1b6af90e8"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce5ab4bf46a211a8e924d307c1b1fcda82368586a19d0a24f8ae166f5c784864"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:056470c3dc57904bbf63d6f534988bafc4e970ffd50f6271fc4ee7daad9498a5"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73aa0e31fa4bb82578f3a6c74a73c273367727de397a7a0f07bd83cbea696baa"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8de718c0e1c4b982a54b41779667242bc630b2197948405b7bd8ce16bcecac92"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:5c370b1e4975df846b0277b4deba86419ca77dbc25047f535b0bb03d1a544d44"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:ffe8ed017e4ed70f68b7b371d84b7d4a790368db9203dfc2d222febd3a9c8863"}, + {file = "psycopg2_binary-2.9.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8aecc5e80c63f7459a1a2ab2c64df952051df196294d9f739933a9f6687e86b3"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:7a813c8bdbaaaab1f078014b9b0b13f5de757e2b5d9be6403639b298a04d218b"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d00924255d7fc916ef66e4bf22f354a940c67179ad3fd7067d7a0a9c84d2fbfc"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7559bce4b505762d737172556a4e6ea8a9998ecac1e39b5233465093e8cee697"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e8b58f0a96e7a1e341fc894f62c1177a7c83febebb5ff9123b579418fdc8a481"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6b269105e59ac96aba877c1707c600ae55711d9dcd3fc4b5012e4af68e30c648"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:79625966e176dc97ddabc142351e0409e28acf4660b88d1cf6adb876d20c490d"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:8aabf1c1a04584c168984ac678a668094d831f152859d06e055288fa515e4d30"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:19721ac03892001ee8fdd11507e6a2e01f4e37014def96379411ca99d78aeb2c"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7f5d859928e635fa3ce3477704acee0f667b3a3d3e4bb109f2b18d4005f38287"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win32.whl", hash = "sha256:3216ccf953b3f267691c90c6fe742e45d890d8272326b4a8b20850a03d05b7b8"}, + {file = "psycopg2_binary-2.9.10-cp39-cp39-win_amd64.whl", hash = "sha256:30e34c4e97964805f715206c7b789d54a78b70f3ff19fbe590104b71c45600e5"}, +] + +[[package]] +name = "pyasn1" +version = "0.4.8" +description = "ASN.1 types and codecs" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, + {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, +] + +[[package]] +name = "pycparser" +version = "2.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +markers = "platform_python_implementation != \"PyPy\"" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pydantic" +version = "2.11.3" +description = "Data validation using Python type hints" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic-2.11.3-py3-none-any.whl", hash = "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f"}, + {file = "pydantic-2.11.3.tar.gz", hash = "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3"}, +] + +[package.dependencies] +annotated-types = ">=0.6.0" +pydantic-core = "2.33.1" +typing-extensions = ">=4.12.2" +typing-inspection = ">=0.4.0" + +[package.extras] +email = ["email-validator (>=2.0.0)"] +timezone = ["tzdata ; python_version >= \"3.9\" and platform_system == \"Windows\""] + +[[package]] +name = "pydantic-core" +version = "2.33.1" +description = "Core functionality for Pydantic validation and serialization" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "pydantic_core-2.33.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26"}, + {file = "pydantic_core-2.33.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89"}, + {file = "pydantic_core-2.33.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde"}, + {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65"}, + {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc"}, + {file = "pydantic_core-2.33.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091"}, + {file = "pydantic_core-2.33.1-cp310-cp310-win32.whl", hash = "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383"}, + {file = "pydantic_core-2.33.1-cp310-cp310-win_amd64.whl", hash = "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504"}, + {file = "pydantic_core-2.33.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24"}, + {file = "pydantic_core-2.33.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f"}, + {file = "pydantic_core-2.33.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77"}, + {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961"}, + {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1"}, + {file = "pydantic_core-2.33.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c"}, + {file = "pydantic_core-2.33.1-cp311-cp311-win32.whl", hash = "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896"}, + {file = "pydantic_core-2.33.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83"}, + {file = "pydantic_core-2.33.1-cp311-cp311-win_arm64.whl", hash = "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89"}, + {file = "pydantic_core-2.33.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8"}, + {file = "pydantic_core-2.33.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d"}, + {file = "pydantic_core-2.33.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b"}, + {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39"}, + {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a"}, + {file = "pydantic_core-2.33.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db"}, + {file = "pydantic_core-2.33.1-cp312-cp312-win32.whl", hash = "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda"}, + {file = "pydantic_core-2.33.1-cp312-cp312-win_amd64.whl", hash = "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4"}, + {file = "pydantic_core-2.33.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea"}, + {file = "pydantic_core-2.33.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a"}, + {file = "pydantic_core-2.33.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d"}, + {file = "pydantic_core-2.33.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4"}, + {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde"}, + {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e"}, + {file = "pydantic_core-2.33.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd"}, + {file = "pydantic_core-2.33.1-cp313-cp313-win32.whl", hash = "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f"}, + {file = "pydantic_core-2.33.1-cp313-cp313-win_amd64.whl", hash = "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40"}, + {file = "pydantic_core-2.33.1-cp313-cp313-win_arm64.whl", hash = "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523"}, + {file = "pydantic_core-2.33.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d"}, + {file = "pydantic_core-2.33.1-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c"}, + {file = "pydantic_core-2.33.1-cp313-cp313t-win_amd64.whl", hash = "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18"}, + {file = "pydantic_core-2.33.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:5ab77f45d33d264de66e1884fca158bc920cb5e27fd0764a72f72f5756ae8bdb"}, + {file = "pydantic_core-2.33.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7aaba1b4b03aaea7bb59e1b5856d734be011d3e6d98f5bcaa98cb30f375f2ad"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fb66263e9ba8fea2aa85e1e5578980d127fb37d7f2e292773e7bc3a38fb0c7b"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3f2648b9262607a7fb41d782cc263b48032ff7a03a835581abbf7a3bec62bcf5"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:723c5630c4259400818b4ad096735a829074601805d07f8cafc366d95786d331"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d100e3ae783d2167782391e0c1c7a20a31f55f8015f3293647544df3f9c67824"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:177d50460bc976a0369920b6c744d927b0ecb8606fb56858ff542560251b19e5"}, + {file = "pydantic_core-2.33.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a3edde68d1a1f9af1273b2fe798997b33f90308fb6d44d8550c89fc6a3647cf6"}, + {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a62c3c3ef6a7e2c45f7853b10b5bc4ddefd6ee3cd31024754a1a5842da7d598d"}, + {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_armv7l.whl", hash = "sha256:c91dbb0ab683fa0cd64a6e81907c8ff41d6497c346890e26b23de7ee55353f96"}, + {file = "pydantic_core-2.33.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f466e8bf0a62dc43e068c12166281c2eca72121dd2adc1040f3aa1e21ef8599"}, + {file = "pydantic_core-2.33.1-cp39-cp39-win32.whl", hash = "sha256:ab0277cedb698749caada82e5d099dc9fed3f906a30d4c382d1a21725777a1e5"}, + {file = "pydantic_core-2.33.1-cp39-cp39-win_amd64.whl", hash = "sha256:5773da0ee2d17136b1f1c6fbde543398d452a6ad2a7b54ea1033e2daa739b8d2"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add"}, + {file = "pydantic_core-2.33.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544"}, + {file = "pydantic_core-2.33.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:7edbc454a29fc6aeae1e1eecba4f07b63b8d76e76a748532233c4c167b4cb9ea"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:ad05b683963f69a1d5d2c2bdab1274a31221ca737dbbceaa32bcb67359453cdd"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df6a94bf9452c6da9b5d76ed229a5683d0306ccb91cca8e1eea883189780d568"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7965c13b3967909a09ecc91f21d09cfc4576bf78140b988904e94f130f188396"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3f1fdb790440a34f6ecf7679e1863b825cb5ffde858a9197f851168ed08371e5"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:5277aec8d879f8d05168fdd17ae811dd313b8ff894aeeaf7cd34ad28b4d77e33"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:8ab581d3530611897d863d1a649fb0644b860286b4718db919bfd51ece41f10b"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:0483847fa9ad5e3412265c1bd72aad35235512d9ce9d27d81a56d935ef489672"}, + {file = "pydantic_core-2.33.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:de9e06abe3cc5ec6a2d5f75bc99b0bdca4f5c719a5b34026f8c57efbdecd2ee3"}, + {file = "pydantic_core-2.33.1.tar.gz", hash = "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df"}, +] + +[package.dependencies] +typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" + +[[package]] +name = "pydantic-settings" +version = "2.8.1" +description = "Settings management using Pydantic" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "pydantic_settings-2.8.1-py3-none-any.whl", hash = "sha256:81942d5ac3d905f7f3ee1a70df5dfb62d5569c12f51a5a647defc1c3d9ee2e9c"}, + {file = "pydantic_settings-2.8.1.tar.gz", hash = "sha256:d5c663dfbe9db9d5e1c646b2e161da12f0d734d422ee56f567d0ea2cee4e8585"}, +] + +[package.dependencies] +pydantic = ">=2.7.0" +python-dotenv = ">=0.21.0" + +[package.extras] +azure-key-vault = ["azure-identity (>=1.16.0)", "azure-keyvault-secrets (>=4.8.0)"] +toml = ["tomli (>=2.0.1)"] +yaml = ["pyyaml (>=6.0.1)"] + +[[package]] +name = "pyjwt" +version = "2.10.1" +description = "JSON Web Token implementation in Python" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "PyJWT-2.10.1-py3-none-any.whl", hash = "sha256:dcdd193e30abefd5debf142f9adfcdd2b58004e644f25406ffaebd50bd98dacb"}, + {file = "pyjwt-2.10.1.tar.gz", hash = "sha256:3cc5772eb20009233caf06e9d8a0577824723b44e6648ee0a2aedb6cf9381953"}, +] + +[package.dependencies] +cryptography = {version = ">=3.4.0", optional = true, markers = "extra == \"crypto\""} + +[package.extras] +crypto = ["cryptography (>=3.4.0)"] +dev = ["coverage[toml] (==5.0.4)", "cryptography (>=3.4.0)", "pre-commit", "pytest (>=6.0.0,<7.0.0)", "sphinx", "sphinx-rtd-theme", "zope.interface"] +docs = ["sphinx", "sphinx-rtd-theme", "zope.interface"] +tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.1.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "python_dotenv-1.1.0-py3-none-any.whl", hash = "sha256:d7c01d9e2293916c18baf562d95698754b0dbbb5e74d457c45d4f6561fb9d55d"}, + {file = "python_dotenv-1.1.0.tar.gz", hash = "sha256:41f90bc6f5f177fb41f53e87666db362025010eb28f60a01c9143bfa33a2b2d5"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-jose" +version = "3.4.0" +description = "JOSE implementation in Python" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "python-jose-3.4.0.tar.gz", hash = "sha256:9a9a40f418ced8ecaf7e3b28d69887ceaa76adad3bcaa6dae0d9e596fec1d680"}, + {file = "python_jose-3.4.0-py2.py3-none-any.whl", hash = "sha256:9c9f616819652d109bd889ecd1e15e9a162b9b94d682534c9c2146092945b78f"}, +] + +[package.dependencies] +ecdsa = "!=0.15" +pyasn1 = ">=0.4.1,<0.5.0" +rsa = ">=4.0,<4.1.1 || >4.1.1,<4.4 || >4.4,<5.0" + +[package.extras] +cryptography = ["cryptography (>=3.4.0)"] +pycrypto = ["pycrypto (>=2.6.0,<2.7.0)"] +pycryptodome = ["pycryptodome (>=3.3.1,<4.0.0)"] +test = ["pytest", "pytest-cov"] + +[[package]] +name = "python-multipart" +version = "0.0.9" +description = "A streaming multipart parser for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "python_multipart-0.0.9-py3-none-any.whl", hash = "sha256:97ca7b8ea7b05f977dc3849c3ba99d51689822fab725c3703af7c866a0c2b215"}, + {file = "python_multipart-0.0.9.tar.gz", hash = "sha256:03f54688c663f1b7977105f021043b0793151e4cb1c1a9d4a11fc13d622c4026"}, +] + +[package.extras] +dev = ["atomicwrites (==1.4.1)", "attrs (==23.2.0)", "coverage (==7.4.1)", "hatch", "invoke (==2.2.0)", "more-itertools (==10.2.0)", "pbr (==6.0.0)", "pluggy (==1.4.0)", "py (==1.11.0)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-timeout (==2.2.0)", "pyyaml (==6.0.1)", "ruff (==0.2.1)"] + +[[package]] +name = "pytz" +version = "2025.2" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00"}, + {file = "pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3"}, +] + +[[package]] +name = "pywin32" +version = "310" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +groups = ["main"] +markers = "sys_platform == \"win32\"" +files = [ + {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, + {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, + {file = "pywin32-310-cp310-cp310-win_arm64.whl", hash = "sha256:33babed0cf0c92a6f94cc6cc13546ab24ee13e3e800e61ed87609ab91e4c8213"}, + {file = "pywin32-310-cp311-cp311-win32.whl", hash = "sha256:1e765f9564e83011a63321bb9d27ec456a0ed90d3732c4b2e312b855365ed8bd"}, + {file = "pywin32-310-cp311-cp311-win_amd64.whl", hash = "sha256:126298077a9d7c95c53823934f000599f66ec9296b09167810eb24875f32689c"}, + {file = "pywin32-310-cp311-cp311-win_arm64.whl", hash = "sha256:19ec5fc9b1d51c4350be7bb00760ffce46e6c95eaf2f0b2f1150657b1a43c582"}, + {file = "pywin32-310-cp312-cp312-win32.whl", hash = "sha256:8a75a5cc3893e83a108c05d82198880704c44bbaee4d06e442e471d3c9ea4f3d"}, + {file = "pywin32-310-cp312-cp312-win_amd64.whl", hash = "sha256:bf5c397c9a9a19a6f62f3fb821fbf36cac08f03770056711f765ec1503972060"}, + {file = "pywin32-310-cp312-cp312-win_arm64.whl", hash = "sha256:2349cc906eae872d0663d4d6290d13b90621eaf78964bb1578632ff20e152966"}, + {file = "pywin32-310-cp313-cp313-win32.whl", hash = "sha256:5d241a659c496ada3253cd01cfaa779b048e90ce4b2b38cd44168ad555ce74ab"}, + {file = "pywin32-310-cp313-cp313-win_amd64.whl", hash = "sha256:667827eb3a90208ddbdcc9e860c81bde63a135710e21e4cb3348968e4bd5249e"}, + {file = "pywin32-310-cp313-cp313-win_arm64.whl", hash = "sha256:e308f831de771482b7cf692a1f308f8fca701b2d8f9dde6cc440c7da17e47b33"}, + {file = "pywin32-310-cp38-cp38-win32.whl", hash = "sha256:0867beb8addefa2e3979d4084352e4ac6e991ca45373390775f7084cc0209b9c"}, + {file = "pywin32-310-cp38-cp38-win_amd64.whl", hash = "sha256:30f0a9b3138fb5e07eb4973b7077e1883f558e40c578c6925acc7a94c34eaa36"}, + {file = "pywin32-310-cp39-cp39-win32.whl", hash = "sha256:851c8d927af0d879221e616ae1f66145253537bbdd321a77e8ef701b443a9a1a"}, + {file = "pywin32-310-cp39-cp39-win_amd64.whl", hash = "sha256:96867217335559ac619f00ad70e513c0fcf84b8a3af9fc2bba3b59b97da70475"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rsa" +version = "4.9" +description = "Pure-Python RSA implementation" +optional = false +python-versions = ">=3.6,<4" +groups = ["main"] +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] + +[package.dependencies] +pyasn1 = ">=0.1.3" + +[[package]] +name = "s3transfer" +version = "0.3.7" +description = "An Amazon S3 Transfer Manager" +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "s3transfer-0.3.7-py2.py3-none-any.whl", hash = "sha256:efa5bd92a897b6a8d5c1383828dca3d52d0790e0756d49740563a3fb6ed03246"}, + {file = "s3transfer-0.3.7.tar.gz", hash = "sha256:35627b86af8ff97e7ac27975fe0a98a312814b46c6333d8a6b889627bcd80994"}, +] + +[package.dependencies] +botocore = ">=1.12.36,<2.0a.0" + +[[package]] +name = "six" +version = "1.17.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] +files = [ + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.28" +description = "Database Abstraction Library" +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0b148ab0438f72ad21cb004ce3bdaafd28465c4276af66df3b9ecd2037bf252"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bbda76961eb8f27e6ad3c84d1dc56d5bc61ba8f02bd20fcf3450bd421c2fcc9c"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feea693c452d85ea0015ebe3bb9cd15b6f49acc1a31c28b3c50f4db0f8fb1e71"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5da98815f82dce0cb31fd1e873a0cb30934971d15b74e0d78cf21f9e1b05953f"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a5adf383c73f2d49ad15ff363a8748319ff84c371eed59ffd0127355d6ea1da"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56856b871146bfead25fbcaed098269d90b744eea5cb32a952df00d542cdd368"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-win32.whl", hash = "sha256:943aa74a11f5806ab68278284a4ddd282d3fb348a0e96db9b42cb81bf731acdc"}, + {file = "SQLAlchemy-2.0.28-cp310-cp310-win_amd64.whl", hash = "sha256:c6c4da4843e0dabde41b8f2e8147438330924114f541949e6318358a56d1875a"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46a3d4e7a472bfff2d28db838669fc437964e8af8df8ee1e4548e92710929adc"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3dd67b5d69794cfe82862c002512683b3db038b99002171f624712fa71aeaa"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c61e2e41656a673b777e2f0cbbe545323dbe0d32312f590b1bc09da1de6c2a02"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0315d9125a38026227f559488fe7f7cee1bd2fbc19f9fd637739dc50bb6380b2"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af8ce2d31679006e7b747d30a89cd3ac1ec304c3d4c20973f0f4ad58e2d1c4c9"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:81ba314a08c7ab701e621b7ad079c0c933c58cdef88593c59b90b996e8b58fa5"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-win32.whl", hash = "sha256:1ee8bd6d68578e517943f5ebff3afbd93fc65f7ef8f23becab9fa8fb315afb1d"}, + {file = "SQLAlchemy-2.0.28-cp311-cp311-win_amd64.whl", hash = "sha256:ad7acbe95bac70e4e687a4dc9ae3f7a2f467aa6597049eeb6d4a662ecd990bb6"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d3499008ddec83127ab286c6f6ec82a34f39c9817f020f75eca96155f9765097"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9b66fcd38659cab5d29e8de5409cdf91e9986817703e1078b2fdaad731ea66f5"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bea30da1e76cb1acc5b72e204a920a3a7678d9d52f688f087dc08e54e2754c67"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:124202b4e0edea7f08a4db8c81cc7859012f90a0d14ba2bf07c099aff6e96462"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e23b88c69497a6322b5796c0781400692eca1ae5532821b39ce81a48c395aae9"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b6303bfd78fb3221847723104d152e5972c22367ff66edf09120fcde5ddc2e2"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-win32.whl", hash = "sha256:a921002be69ac3ab2cf0c3017c4e6a3377f800f1fca7f254c13b5f1a2f10022c"}, + {file = "SQLAlchemy-2.0.28-cp312-cp312-win_amd64.whl", hash = "sha256:b4a2cf92995635b64876dc141af0ef089c6eea7e05898d8d8865e71a326c0385"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e91b5e341f8c7f1e5020db8e5602f3ed045a29f8e27f7f565e0bdee3338f2c7"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c7b78dfc7278329f27be02c44abc0d69fe235495bb8e16ec7ef1b1a17952db"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3eba73ef2c30695cb7eabcdb33bb3d0b878595737479e152468f3ba97a9c22a4"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5df5d1dafb8eee89384fb7a1f79128118bc0ba50ce0db27a40750f6f91aa99d5"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2858bbab1681ee5406650202950dc8f00e83b06a198741b7c656e63818633526"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-win32.whl", hash = "sha256:9461802f2e965de5cff80c5a13bc945abea7edaa1d29360b485c3d2b56cdb075"}, + {file = "SQLAlchemy-2.0.28-cp37-cp37m-win_amd64.whl", hash = "sha256:a6bec1c010a6d65b3ed88c863d56b9ea5eeefdf62b5e39cafd08c65f5ce5198b"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:843a882cadebecc655a68bd9a5b8aa39b3c52f4a9a5572a3036fb1bb2ccdc197"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dbb990612c36163c6072723523d2be7c3eb1517bbdd63fe50449f56afafd1133"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd7e4baf9161d076b9a7e432fce06217b9bd90cfb8f1d543d6e8c4595627edb9"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e0a5354cb4de9b64bccb6ea33162cb83e03dbefa0d892db88a672f5aad638a75"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fffcc8edc508801ed2e6a4e7b0d150a62196fd28b4e16ab9f65192e8186102b6"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aca7b6d99a4541b2ebab4494f6c8c2f947e0df4ac859ced575238e1d6ca5716b"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-win32.whl", hash = "sha256:8c7f10720fc34d14abad5b647bc8202202f4948498927d9f1b4df0fb1cf391b7"}, + {file = "SQLAlchemy-2.0.28-cp38-cp38-win_amd64.whl", hash = "sha256:243feb6882b06a2af68ecf4bec8813d99452a1b62ba2be917ce6283852cf701b"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc4974d3684f28b61b9a90fcb4c41fb340fd4b6a50c04365704a4da5a9603b05"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87724e7ed2a936fdda2c05dbd99d395c91ea3c96f029a033a4a20e008dd876bf"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68722e6a550f5de2e3cfe9da6afb9a7dd15ef7032afa5651b0f0c6b3adb8815d"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:328529f7c7f90adcd65aed06a161851f83f475c2f664a898af574893f55d9e53"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:df40c16a7e8be7413b885c9bf900d402918cc848be08a59b022478804ea076b8"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:426f2fa71331a64f5132369ede5171c52fd1df1bd9727ce621f38b5b24f48750"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-win32.whl", hash = "sha256:33157920b233bc542ce497a81a2e1452e685a11834c5763933b440fedd1d8e2d"}, + {file = "SQLAlchemy-2.0.28-cp39-cp39-win_amd64.whl", hash = "sha256:2f60843068e432311c886c5f03c4664acaef507cf716f6c60d5fde7265be9d7b"}, + {file = "SQLAlchemy-2.0.28-py3-none-any.whl", hash = "sha256:78bb7e8da0183a8301352d569900d9d3594c48ac21dc1c2ec6b3121ed8b6c986"}, + {file = "SQLAlchemy-2.0.28.tar.gz", hash = "sha256:dd53b6c4e6d960600fd6532b79ee28e2da489322fcf6648738134587faf767b6"}, +] + +[package.dependencies] +greenlet = {version = "!=0.4.17", markers = "platform_machine == \"aarch64\" or platform_machine == \"ppc64le\" or platform_machine == \"x86_64\" or platform_machine == \"amd64\" or platform_machine == \"AMD64\" or platform_machine == \"win32\" or platform_machine == \"WIN32\""} +typing-extensions = ">=4.6.0" + +[package.extras] +aiomysql = ["aiomysql (>=0.2.0)", "greenlet (!=0.4.17)"] +aioodbc = ["aioodbc", "greenlet (!=0.4.17)"] +aiosqlite = ["aiosqlite", "greenlet (!=0.4.17)", "typing_extensions (!=3.10.0.1)"] +asyncio = ["greenlet (!=0.4.17)"] +asyncmy = ["asyncmy (>=0.2.3,!=0.2.4,!=0.2.6)", "greenlet (!=0.4.17)"] +mariadb-connector = ["mariadb (>=1.0.1,!=1.1.2,!=1.1.5)"] +mssql = ["pyodbc"] +mssql-pymssql = ["pymssql"] +mssql-pyodbc = ["pyodbc"] +mypy = ["mypy (>=0.910)"] +mysql = ["mysqlclient (>=1.4.0)"] +mysql-connector = ["mysql-connector-python"] +oracle = ["cx_oracle (>=8)"] +oracle-oracledb = ["oracledb (>=1.0.1)"] +postgresql = ["psycopg2 (>=2.7)"] +postgresql-asyncpg = ["asyncpg", "greenlet (!=0.4.17)"] +postgresql-pg8000 = ["pg8000 (>=1.29.1)"] +postgresql-psycopg = ["psycopg (>=3.0.7)"] +postgresql-psycopg2binary = ["psycopg2-binary"] +postgresql-psycopg2cffi = ["psycopg2cffi"] +postgresql-psycopgbinary = ["psycopg[binary] (>=3.0.7)"] +pymysql = ["pymysql"] +sqlcipher = ["sqlcipher3_binary"] + +[[package]] +name = "starlette" +version = "0.37.2" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "starlette-0.37.2-py3-none-any.whl", hash = "sha256:6fe59f29268538e5d0d182f2791a479a0c64638e6935d1c6989e63fb2699c6ee"}, + {file = "starlette-0.37.2.tar.gz", hash = "sha256:9af890290133b79fc3db55474ade20f6220a364a0402e0b556e7cd5e1e093823"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart (>=0.0.7)", "pyyaml"] + +[[package]] +name = "typing-extensions" +version = "4.13.2" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "typing_extensions-4.13.2-py3-none-any.whl", hash = "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c"}, + {file = "typing_extensions-4.13.2.tar.gz", hash = "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef"}, +] + +[[package]] +name = "typing-inspection" +version = "0.4.0" +description = "Runtime typing introspection tools" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f"}, + {file = "typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122"}, +] + +[package.dependencies] +typing-extensions = ">=4.12.0" + +[[package]] +name = "urllib3" +version = "1.26.20" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["main"] +files = [ + {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, + {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, +] + +[package.extras] +brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\"", "brotli (>=1.0.9) ; python_version >= \"3\" and platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; (os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\"", "brotlipy (>=0.6.0) ; os_name == \"nt\" and python_version < \"3\""] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress ; python_version == \"2.7\"", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "uvicorn" +version = "0.28.1" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "uvicorn-0.28.1-py3-none-any.whl", hash = "sha256:5162f6d652f545be91b1feeaee8180774af143965ca9dc8a47ff1dc6bafa4ad5"}, + {file = "uvicorn-0.28.1.tar.gz", hash = "sha256:08103e79d546b6cf20f67c7e5e434d2cf500a6e29b28773e407250c54fc4fa3c"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" +typing-extensions = {version = ">=4.0", markers = "python_version < \"3.11\""} + +[package.extras] +standard = ["colorama (>=0.4) ; sys_platform == \"win32\"", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1) ; sys_platform != \"win32\" and sys_platform != \"cygwin\" and platform_python_implementation != \"PyPy\"", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "vonage" +version = "3.18.0" +description = "Vonage Server SDK for Python (Deprecated - use vonage>=4.0.0)" +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "vonage-3.18.0-py2.py3-none-any.whl", hash = "sha256:4f6968637b42b37a0b388462f794f5304ab8fffa2bf1a5da2c11dbb1e995ec95"}, + {file = "vonage-3.18.0.tar.gz", hash = "sha256:a826c3fe8769e33d6a79811bb4c27df54f68f934cedddd36579b5ff2bfd2e769"}, +] + +[package.dependencies] +Deprecated = "*" +pydantic = ">=2.5.2" +pytz = ">=2018.5" +requests = ">=2.32.2" +vonage-jwt = ">=1.1.4" + +[[package]] +name = "vonage-jwt" +version = "1.1.5" +description = "Tooling for working with JWTs for Vonage APIs in Python." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "vonage_jwt-1.1.5-py3-none-any.whl", hash = "sha256:d2dea812ff271a75d495b703a1a27dcb7e457233f6237c2ad92cb815650004a7"}, + {file = "vonage_jwt-1.1.5.tar.gz", hash = "sha256:92dee47aa18092efc8c158f89cbe01ffaf7a976eef717c57b23e01c5491c795d"}, +] + +[package.dependencies] +pyjwt = {version = ">=1.6.4", extras = ["crypto"]} +vonage-utils = ">=1.1.4" + +[[package]] +name = "vonage-utils" +version = "1.1.4" +description = "Utils package containing objects for use with Vonage APIs" +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "vonage_utils-1.1.4-py3-none-any.whl", hash = "sha256:438b0bc8da25e8026ec6789cd9a113b4f41636c70c4d84b2d9ab0e92ed23a665"}, + {file = "vonage_utils-1.1.4.tar.gz", hash = "sha256:950b802dc93f8440717fba6e183d2ae39f6e0316dc19a3f1f41ca81f9af24bf8"}, +] + +[package.dependencies] +pydantic = ">=2.9.2" + +[[package]] +name = "wrapt" +version = "1.17.2" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = ">=3.8" +groups = ["main"] +files = [ + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, + {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, + {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, + {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, + {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, + {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, + {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, + {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, + {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, + {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, + {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, + {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, + {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, + {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, + {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, + {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, + {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, + {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, + {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, + {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, + {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, + {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, + {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, + {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, + {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, + {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, + {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, + {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, + {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, + {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, + {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, + {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, + {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, + {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, + {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, + {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, + {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, + {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, +] + +[metadata] +lock-version = "2.1" +python-versions = "^3.9" +content-hash = "a6ece2e9b89496af8a3bbbab1dde1e47f3ef3e66e7309cb9a9eeba015b447abf" diff --git a/mlconnector/src/pyproject.toml b/mlconnector/src/pyproject.toml new file mode 100644 index 0000000..74c88e5 --- /dev/null +++ b/mlconnector/src/pyproject.toml @@ -0,0 +1,40 @@ +[tool.poetry] +name = "MLSysOps" +version = "0.1.0" +description = "MLSysOps ML Integration API" +authors = ["John Byabazaire "] +license = "Copy Right" +readme = "README.md" + +[tool.poetry.dependencies] +python = "^3.9" +fastapi = "^0.110.0" +uvicorn = "^0.28.0" +sqlalchemy = "2.0.28" +python-dotenv = "^1.0.1" +psycopg2-binary = "^2.9.9" +alembic = "^1.13.1" +asyncpg = "^0.29.0" +greenlet = "^3.0.3" +python-multipart = "^0.0.9" +python-jose = "^3.3.0" +passlib = "^1.7.4" +fastapi-csrf-protect = "^0.3.4" +itsdangerous = "^2.2.0" +fastsession = "^0.3.0" +fastapi-sessions = "^0.3.2" +vonage = "^3.17.1" +aioredis = "^2.0.1" +asyncio-redis = "^0.16.0" +pyyaml = "^6.0.2" +boto3 = "1.16.47" +docker = "7.1.0" +urllib3 = "^1.20" + +#[tool.poetry.overrides] +#urllib3 = { version = ">=1.26.0,<2.0.0" } + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/mlconnector/src/schema/__init__.py b/mlconnector/src/schema/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mlconnector/src/schema/mldeployment.py b/mlconnector/src/schema/mldeployment.py new file mode 100644 index 0000000..39dff92 --- /dev/null +++ b/mlconnector/src/schema/mldeployment.py @@ -0,0 +1,51 @@ +# !/usr/bin/python3 +# Author John Byabazaire + + +from pydantic import BaseModel, validator, HttpUrl, Field +from typing import List, Optional, Dict, Union, List + + +class Placement(BaseModel): + clusterID: Optional[str] = Field( + None, + example="UTH-Internal-testbed", + description="ID of the cluster, or "'*'" to deploy on any cluster" + ) + node: Optional[str] = Field( + None, + example="mls-drone", + description="Node ID, or '*' to deploy on any node" + ) + continuum: Optional[str] = Field( + None, + example="Edge", + description="continuum ID, or '*' to deploy on any where" + ) + #bool = Field(False, description="Set to True to deploy at continuum level") + + +class MLDeploymentBase(BaseModel): + """ + Used to create a ml model deployment + """ + modelid:str = Field(..., description="ID of the model to deploy") + ownerid:str = Field(..., description="ID of the agent deploying the model") + placement:Placement = Field(..., description="Define where to place the model. If both clusterID and node are set to '*' model is deployed anywhere.") + + +class MLDeploymentCreate(MLDeploymentBase): + deployment_id:Optional[str] + inference_data:int = Field(..., description="How the inference data will be passed eg. 0 for values, 1 for link to data. The link MUST return .csv file") + + +class MLDeploymentReturn(MLDeploymentBase): + """ + Used to return an ml model deployment + """ + deployment_id:str + status:str + + + class Config: + from_attributes = True diff --git a/mlconnector/src/schema/mlmodels.py b/mlconnector/src/schema/mlmodels.py new file mode 100644 index 0000000..3389d36 --- /dev/null +++ b/mlconnector/src/schema/mlmodels.py @@ -0,0 +1,135 @@ +# !/usr/bin/python3 +# Author John Byabazaire + + +from datetime import datetime +from typing import Optional, List + +from pydantic import BaseModel, validator, HttpUrl, Field +from fastapi import Query + +class Hyperparameter(BaseModel): + parameter: str = Field(None, description="Hyperparameters, eg 'max_depth'") + value: int = Field(None, description="Hyperparameter value, eg '5'") + +class DriftDetection(BaseModel): + is_true: int = Field(0, description="Set the value to 1 to turn on drift detection, otherwise 0") + method: int = Field(0, description="Method used to detect drift, eg '0', Mean-Shift, '1', FourierMMD and '2' for Kolmogorov-Smirnov test") + + +class FileSchema(BaseModel): + modelid: str + filekind: str + filename: str + contenttype: str + + model_config = { + "from_attributes": True + } + +class TrainedModel(BaseModel): + modelname: str = Field( + None, + example="logistic_regression_model.pkl", + description="Name of trained model" + ) + githublink: str = Field( + None, + example="https://mlsysops-gitlab.e-ce.uth.gr/toycase/ml/-/raw/main/logistic_regression_model.pkl", + description="Link to github with freezed traied model" + ) + +class ModelTags: + def __init__( + self, + tags: Optional[List[str]] = Query( + None, + description="List of model tags to filter models by (e.g., /model/search?tags=regression&tags=fast)" + ) + ): + self.tags = tags + +class Inference(BaseModel): + type: Optional[str] = Field(None, description="Defines how inference data is passed eg 'data' to pass list [16], or 'link' to pass reference to the data") + value: Optional[str] + +class TrainingData(BaseModel): + training_data: Optional[str] = Field(None, description="Model training data (.csv filename)") + training_code: Optional[str] = Field(None, description="Model training code (.py filename)") + + +class FeatureList(BaseModel): + feature_name: Optional[str] = Field(None, description="The name of the feature, eg time_ms") + type: Optional[str] = Field(None, description="The type of data, eg 'cont' for continous, or 'cat' for categorical") + kind: Optional[int] = Field(None, description="If the feature is dependant, or independent 0, 1") + units: Optional[int] = Field(None, description="Units") + +class ModelPerformance(BaseModel): + metric: Optional[str] = Field(None, description="The metric used to evaluate performance of the model, eg 'F1'") + order: Optional[int] = Field(None, description="If more than one are defined order of precedence eg 1") + threshold: Optional[int] = Field(None, description="Training threshold") + +class TrainingResource(BaseModel): + resource_name: Optional[str] = Field(None, description="The name of the resource, e.g., GPU or HDD") + value: Optional[int]= Field(None, description="The numeric value of the resource, e.g., 32 or 30") + deploy: Optional[str]= Field(None, description="Where the model will be trained, e.g., 'any', or '10.29.2.4'") + +class RunResource(BaseModel): + resource_name: Optional[str] = Field(None, description="The name of the resource, e.g., GPU or HDD") + value: Optional[int]= Field(None, description="The numeric value of the resource, e.g., 32 or 30") + deploy: Optional[str]= Field(None, description="Where the model will be run, e.g., 'any', or '10.29.2.4'") + + +class MLModelBase(BaseModel): + """ + Used to create a ml model + """ + #modelid:str + modelname:str = Field(..., description="Name of the ML model eg 'RandomForest'") + modelkind:str = Field(..., description="The type of model to be built. This can be classification, regression, or clustering") + #source_code: HttpUrl = Field(..., description="Link to github with source used to train the model") + #trained_model: List[TrainedModel] = Field(None, description="Details of trained model") + #training_data:List[TrainingData] = Field(..., description="Model training code (python file) and model training data (.csv file name.)") + hyperparameter: Optional[List[Hyperparameter]] = Field(None, description="Hyperparameters and corresponding values") + modelperformance: Optional[List[ModelPerformance]] = Field(None, description="List of metric used to evaluate the ML model") + trainingresource: List[TrainingResource] = Field(None, description="List of training resources") + runresource: Optional[List[RunResource]] = Field(None, description="List of running resources") + featurelist: Optional[List[FeatureList]] = Field(None, description="List of model feature") + inference:Optional[List[Inference]] = Field(None, description="How to pass the inference data") + modeltags: Optional[List[str]] = Field(None, description="List of key tags to search model") + #file_data:FileSchema = Field(..., description="model") + drift_detection:Optional[List[DriftDetection]] = Field(..., description="Set the value to 1 to turn on drift detection, otherwise 0") + +class MLModelDeploy(BaseModel): + modelid:str + +class MLModelDeployRes(MLModelDeploy): + modelid:str + deploymentid:str + + +class MLModelCreate(MLModelBase): + ... + + +class MLModel(MLModelBase): + """ + Used to return an ml model + """ + modelid:str + + class Config: + from_attributes = True + + +class MLModelJoin(MLModelBase): + """ + Used to return an ml model + """ + modelid:str + filekind: str + filename: str + contenttype: str + + class Config: + from_attributes = True \ No newline at end of file diff --git a/mlconnector/src/schema/mloperations.py b/mlconnector/src/schema/mloperations.py new file mode 100644 index 0000000..cddbc97 --- /dev/null +++ b/mlconnector/src/schema/mloperations.py @@ -0,0 +1,30 @@ +#!/usr/bin/python3 +# Author John Byabazaire + +from pydantic import BaseModel, Field, validator +from datetime import datetime, timezone + +class MLDeploymentOposBase(BaseModel): + ownerid: str = Field(..., description="ID of the agent deploying the model") + deploymentid: str = Field(..., description="ID of the agent deployment") + modelid: str = Field(..., description="ID of the ML model being used") + data: str = Field(..., description="JSON string of the inference data") + result: str = Field(..., description="JSON string of the inference result from the model") + timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc), description="Timestamp of the operation") + + @validator('timestamp', pre=True, always=True) + def ensure_utc(cls, v): + if isinstance(v, str): + v = datetime.fromisoformat(v.replace("Z", "+00:00")) + if v.tzinfo is None: + return v.replace(tzinfo=timezone.utc) + return v.astimezone(timezone.utc) + +class MLDeploymentOposCreate(MLDeploymentOposBase): + ... + +class MLDeploymentOposReturn(MLDeploymentOposBase): + operationid: str = Field(..., description="Unique operation id") + + class Config: + from_attributes = True diff --git a/mlconnector/src/schema/mlresource.py b/mlconnector/src/schema/mlresource.py new file mode 100644 index 0000000..8546adf --- /dev/null +++ b/mlconnector/src/schema/mlresource.py @@ -0,0 +1,48 @@ +# !/usr/bin/python3 +# Author John Byabazaire + + +from enum import Enum +from pydantic import BaseModel + + + +class MLResourceBase(BaseModel): + """ + Used to create a Resource type + """ + resource_id:str + explanation_flag:int + modelrecall:int + modelprecision:int + modelaccuracy:int + min_core:int + min_ram:int + min_disk:int + input_type:str + out_type:str + modelid:str + + + + +class MLResourceCreate(MLResourceBase): + ... + + +class MLResource(MLResourceBase): + resource_id:str + explanation_flag:int + modelrecall:int + modelprecision:int + modelaccuracy:int + min_core:int + min_ram:int + min_disk:int + input_type:str + out_type:str + modelid:str + + + class Config: + from_attributes = True diff --git a/mlconnector/src/schema/mltraining.py b/mlconnector/src/schema/mltraining.py new file mode 100644 index 0000000..e72bc78 --- /dev/null +++ b/mlconnector/src/schema/mltraining.py @@ -0,0 +1,45 @@ +# !/usr/bin/python3 +# Author John Byabazaire + + +from enum import Enum +from pydantic import BaseModel, validator, HttpUrl, Field +from typing import List, Optional, Dict, Union, List + + + +class Placement(BaseModel): + clusterID: Optional[str] = Field( + None, + example="UTH-Internal-testbed", + description="ID of the cluster, or '*' to deploy on any cluster" + ) + node: Optional[str] = Field( + None, + example="mls-drone", + description="Node ID, or '*' to deploy on any node" + ) + continuum: bool = Field(False, description="Set to True to deploy at continuum level") + + +class MLTrainBase(BaseModel): + """ + Used to create a Training instance + """ + modelid:str + placement:Placement = Field(..., description="Define where to place the model. If both clusterID and node are set to '*' model is deployed anywhere.") + + + + +class MLTrainCreate( MLTrainBase): + ... + + +class MLTrain( MLTrainBase): + deployment_id:str + status:str + + + class Config: + from_attributes = True diff --git a/mlconnector/src/startup.sh b/mlconnector/src/startup.sh new file mode 100644 index 0000000..c9d6ac4 --- /dev/null +++ b/mlconnector/src/startup.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# Run database migration +alembic revision --autogenerate -m "Initial load" +alembic upgrade head + +# start server +uvicorn main:app --host "0.0.0.0" --port "8090" \ No newline at end of file diff --git a/mlconnector/src/utils/.DS_Store b/mlconnector/src/utils/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..839ed3002d60d58a47f85884cde4f23b8763fc7c GIT binary patch literal 10244 zcmeHMU2GIp6uxKL(mO+u+tTtkS-P@du(tFUu>8pOhay^jx21o;GP^UbSXWa7F zyOtT^T#w^eslr%G9W{-7l2vv%wx^l4k?{>o-9VLNeWtBD`F1C3>#lE`5I3ky zHdfcz+}c_jZEo2zUK<^2ZEC2Ewlr@YAD3xWtbWIlYiXX*W?5X>?e~nc9v=<5PR8r-6_bo*UE_#>dS=e(L~S&!;4>W@ z^-RZhj~W>lX)N9#{E)AdRYlf6^hm>&?Yleo?LR!V?1AM>sZc8Wa;9shETcDX>fZ2x z=B5o>H|kLmc3`yHLnsQY)+YIP%}LtNgGF|Ze6Ws_PXGmZAR=(3oiPN|ofEBBnnH!Vz? zlorZ#x!2NCh9yMXlvc`~l>2hRb0OTRJVwi*R_;$bBO~aKE5vPT2W4N<6MXG%&GinB z8g}8Sy41%h`<4#6!&=5Tm`AV)n=ZARQvc1NoEz=YP0z{rAvsX3ssntoHeEM#^nCTo zRZLB&y_8)?8)n)$6XA_7M4+6;;x*#E_+gbR1vB0AqP2#sCoN`VlRzMZ3gc#I99c+f}&;gy$1$&_z zdf_Pa!vLIsQ!orq!)Z7J=V1)S;aRuyG#|hy?5kNSlpdAGC9z?t|8U%k$ADQb~#QBC3tE zcgiSM%JEC5xOR0^iLesHycUa$|>L?TSWR1@sx`iR1cFp*^6wz&pb2$*e; zDheycloI!L?n0LEEEjxRJI=%tg#LG+UM3%qkI5J0I|S-4-I^s1YnP~iVeJZQ*T2@Txj7ToFaM`tSikN?{h9^Ec{OZqu?x8{0*fDk zBC%wYpa1W<^Z);g|6t*YVFbbmELsGhxHHk&j>{EJ1m>^I&)TDSoy3bbt~Vj5Z-U*N xKLU{9$MKu+;<~}vmOqXMvI#+bbJX$8kuK7o0pb3?a8MQQ|L^+D`v1BA{|AJ2C^rBA literal 0 HcmV?d00001 diff --git a/mlconnector/src/utils/__init__.py b/mlconnector/src/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/mlconnector/src/utils/api/.DS_Store b/mlconnector/src/utils/api/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3320dcb5b8be191799fd98459770ab31edfcc02f GIT binary patch literal 10244 zcmeHMTWl0n7(V~>HnS9&mX_P5bfsXhwy@n6%2l`RQbfyjTY3Y^?#|c_%+73gW?P`t zG(Hd`5KL5Jyu>FpsNumx14I*rNPO@Gf&|6*q7Q0}z8HD&!T-#eZD+Sr9)tkuOfu&` zm;XO={_lMMIdf(RA<&wU8VCsxLU_EX6iYF2xoA7Rr(K*~vm7O$J&BJRsko}gv3y~g zwpZaH;3424;3424;34oJAb@)|z4%#7dZ~wihk%E`Bm#7O2;fa+*p?GaT1y8e))4?@ zAy!)#=0%!88L(y8mJ>{33tqrXQ8H7oj~Kwru|8nyg>5;(Br_*qA3nf-GT0{+u%3?n z2P}00VJ5xQL%>5|Is)|UUPxjjLrgN{Jio_Ns$!VI;C0{%3X6(M_!52=zc)Ihk4DXy znK4>p>3&-3)O9tU&Bx-q6?t?(tZ36UGp1;A+A>fi8CCXlE1IN_w(1#8GA!FDYv2W5 z7!VhYjny{}lP!RKttH;L$zOrWJ`dtGD)ug7MU`~L&5RlnNmm(A49*~up_%(0iKaDG z*9NgaI(UvqB>ta)-15c+S*zZOYUa;NDH~P0Z3@x+HWxH4n>-{1A`=bKOc9+Zm@|pt z!1dfcr}Bcav4%BGb%Dmvs@o9x1;)P_iF_Q}T|9Ha*iFkAX=6MtSd{huMmCfM-zR$Zb!N>+=%+P{qF`)Pe! zTE>)B`yVV{ut!Rn5M&y!f=xJ;FR^ zl^cAI^JP#c^xy)NM1Krc-QsWK#n1VD^w}LT!`z;dwd|#5NuNip@b1UUC8&Pl>#|dGp zIbRd5W%FXeDpat-WJ+Jp7Lp~TiEJP{NH50PC^?0z?E{dxjCH3 z)o@F>dM?B@vhj1-t)hR@A1lK}P`JmA{TZ7Zc8i^=_RYR6_ceCDDW%a;RzA0)a&gV_ z`q1k2;YmU<3T9d7WV1!!9NJq1wq`t^c`U4aRb9w%`Or+!C6-Vw^Vg_$b--687GVsq z;?iYUEJpsb;-j@yRU(IB$BHXfR{6vN3@X90ZLGy2*oEdbKA%{K;lVHfnnUKoJ=5JS?ckOU1z;V=^SC{p(rJP*g=1e}D^@G86pufrP_h2Mt{ z@+kRKE+yepcS<@p(4Uu-XY38sg}lxel-p~%Y_2Z-gd47U|2NsjAl+n} z?sSvQ@yYqdnA700@8+~Sr|9C1lB4z%<>^el>&&F%GA%iMOq&pcB*+j>NRq_v_ghb6 z15QY2&FVXR>nSDp8?+a-#h;!XaCRV|GxpaPH|}f literal 0 HcmV?d00001 diff --git a/mlconnector/src/utils/api/__pycache__/main.cpython-311.pyc b/mlconnector/src/utils/api/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e650335f6d9cb38e3224fcf58117a27824021102 GIT binary patch literal 2570 zcmb6aU2hXdaQE(f{>~Tq29lHzgpnGz4dtUnr2zzuAOWVHD43i`UE5N01-s6figIWF~w*s zmkc@S2fAbgk^uo}cmu?2dNNTmD4pewGuIz1r)_p zGn%5XkfLO=ByVs$qA0iWs?nfO{`kzdU}ROBbt;N#nps=5^{iwI-Oe%%6* z@%d$SUR_ajsx8JZWK;Q!X4+Q#`uPj-*(-B5=B{3wi>o=^of%a(Cv(fx59eLb0f==7 zfU~35qTR)b`=6JkK^PSm0zx~zL$7zvFpzgUr_CYJIh*Qc+H;9yYj^EL%twPn`kGMi_2k@1PgZ;`XXNP;DY|DazQEuJieXZg1n2a?r@8 zA!qcILbWv2EDN5DCx~WD=9Ua5(0LY8Z>JRtQXy}#Q0rkS_hKvzv6IhGZaEVT&16zG z2T;!GsU<^W5@Zu$LXNQD1=UtBQb-J&M$F{ zMYt%9G>l_GE<+(8lL=&jb(-28rDdCCaf8O1jq*@tof&mW+rdMR!7jJJ`U}7x&>i$V z6kSi>&sIVs)zHWzt90`Fvz5`Q>gZG@H07MH^&NK-&x6r*^C77O$E(5dI>NqK$^LEN z;J06tj#mbbRtJu*N9rQ%x+E98;7osW(As+)_VVS+*KOBj&O8;cFf6}>Hiwr&*e?&@WDB z7=Y%h^$tAre;29rPE>m*oY`8Wx0or150|CGZcXCFpBG_8S@FL!>303&QLdgzH?#1g zkaAgS$9kB50e(+Vwkf|d3*?rGYC>jEi7#b)IR}-r@t2Tus!3Fff)qp#asPtw#dR4$iq7 z6lXYR2j^^(WF+{$9{h4}{p|`Ktm47C5W%NQAJ!3kTHu9rkjAL{ LkTeYZZe08aFt list[str]: + """ + Scan a directory for *.txt files, merge all requirements, + dedupe, normalize, and return a sorted list. + """ + all_reqs: set[str] = set() + for fname in os.listdir(req_dir): + if not fname.endswith('.txt'): + continue + path = os.path.join(req_dir, fname) + with open(path, 'r') as f: + content = f.read() + all_reqs |= parse_requirements_content(content) + + return sorted(all_reqs, key=lambda r: r.lower()) + +def parse_requirements_content(content: str) -> set[str]: + """Parse a requirements.txt content string into a normalized set of requirements.""" + reqs = set() + for line in content.splitlines(): + line = line.strip() + if not line or line.startswith('#'): + continue + try: + req = Requirement.parse(line) + extras = f"[{','.join(req.extras)}]" if req.extras else "" + spec = ''.join(str(s) for s in req.specifier) + reqs.add(f"{req.name}{extras}{spec}") + except Exception: + # fallback if pkg_resources can't parse + reqs.add(line) + return reqs + +def generate_dockerfile(model_id): + # generate a combined requirements.txt file + model_reqs = prepare_model_artifact(s3_manager, f"{model_id}.txt") + + reqs_dir = "/code/utils/api" + merged = merge_requirements_from_dir(reqs_dir) + + req_path = "/code/utils/api/requirements.txt" + os.makedirs(os.path.dirname(req_path), exist_ok=True) + with open(req_path, "w") as f: + for line in merged: + f.write(line + "\n") + req_path = "/code/utils/api/requirements.txt" + os.makedirs(os.path.dirname(req_path), exist_ok=True) + with open(req_path, "w") as f: + for line in merged: + f.write(line + "\n") + + dockerfile_content = f"""\ + FROM python:3.11 + + WORKDIR /app + + COPY requirements.txt . + + RUN apt-get update && apt-get install -y build-essential + + RUN pip install --no-cache-dir -r requirements.txt + + RUN apt-get update && apt-get install -y curl + # RUN curl -L -o model_name model_url + COPY . . + + EXPOSE 8000 + + CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] + """ + with open("/code/utils/api/Dockerfile", "w") as file: + file.write(dockerfile_content) + print("Dockerfile generated successfully!") + + + +def build_and_push_image(model, registry_url, image_name, registry_username, registry_password, inference_data, datasource, model_id,model_owner, deploymentid): + params = { + #"model_filename": model_name, + "port": 8000, + "schema_code":inference_data, + "data_source":datasource, + "model_id":model_id, + "model":model, + "owner":model_owner, + "url":url, + "deploymentid":deploymentid + } + generated_code = template.format(**params) + + with open("/code/utils/api/main.py", "w") as f: + f.write(generated_code) + + print("Python file 'main.py' has been created with the provided parameters.") + + generate_dockerfile(model_id) + client = docker.from_env() + + try: + print("Building Docker image...") + image, build_logs = client.images.build(path="/code/utils/api/", tag=image_name) + for log in build_logs: + print(log.get("stream", "").strip()) + except docker.errors.BuildError as e: + print(f"Error building image: {e}") + return + + print("Pushing Docker image...") + #registry_url, image_tag = image_name.split("/", 1) + client.login(username=registry_username, password=registry_password, registry=registry_url) + + try: + push_logs = client.images.push(image_name, stream=True, decode=True) + for log in push_logs: + print(log) + except docker.errors.APIError as e: + print(f"Error pushing image: {e}") + + +"""def generate_json(deployment_id: str, image: str, placement, port: int = 8000): + app = { + "MLSysOpsApplication": { + "name": "ml-app-1", + "mlsysops-id": deployment_id + } + } + + # clusterPlacement if clusterID present + if placement.get("clusterID") != "": + app["MLSysOpsApplication"]["clusterPlacement"] = { + "clusterID": [placement["clusterID"]], + "instances": 1 + } + + # component definition + comp = { + "name": "ml-comp", + "uid": deployment_id, + "restartPolicy": "OnFailure", + "containers": [ + { + "image": image, + "imagePullPolicy": "IfNotPresent", + "ports": [{"containerPort": port}] + } + ] + } + + # nodePlacement / continuumLayer + node_placement = {} + if placement.get("continuum") is not False: + node_placement["continuumLayer"] = ["*"] + elif placement.get("node") != "": + node_placement["node"] = placement["node"] + + if node_placement: + comp["nodePlacement"] = node_placement + + # attach component + app["MLSysOpsApplication"]["components"] = [{"Component": comp}] + return app""" + +def generate_json( + deployment_id: str, + image: str, + placement: dict, + app_name: str = "ml-app-1", + port: int = 8000 +): + app = { + "MLSysOpsApplication": { + "name": app_name, + "mlsysops-id": deployment_id + } + } + + # Only add clusterPlacement if clusterID is not a wildcard + cluster_id = placement.get("clusterID", "") + if cluster_id and cluster_id != "*": + app["MLSysOpsApplication"]["clusterPlacement"] = { + "clusterID": [cluster_id], + "instances": 1 + } + + # Build the component block + component = { + "Component": { + "name": "ml-comp", + "uid": deployment_id + } + } + + # Always consider continuumLayer, but only add node if it's not "*" + node_conf = {} + node_name = placement.get("node", "") + if node_name and node_name != "*": + node_conf["node"] = node_name + + continuum = placement.get("continuum", "") + if continuum: + node_conf["continuumLayer"] = [continuum] + + if node_conf: + component["nodePlacement"] = node_conf + + # Add the remaining fields + component["restartPolicy"] = "OnFailure" + component["containers"] = [ + { + "image": image, + "imagePullPolicy": "IfNotPresent", + "ports": [ + {"containerPort": port} + ] + } + ] + + app["MLSysOpsApplication"]["components"] = [component] + return app + + +def generate_yaml( + deployment_id: str, + image: str, + clusterID: str = None, + node: str = None, + continuum: bool = False, + ): + yaml_content = { + "apiVersion": "fractus.gr/v1", + "kind": "MLSysOpsApp", + "metadata": { + "name": "ml-application" + }, + "components": [ + { + "Component": { + "name": "ml-comp", + "uid": deployment_id + }, + "placement": {}, + "restartPolicy": "OnFailure", + "containers": [ + { + "image": image, + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "containerPort": 8000 + } + ] + } + ] + } + ] + } + + placement = {} + if continuum: + placement["continuum"] = ["*"] + else: + if clusterID: + placement["clusterID"] = clusterID + if node: + placement["node"] = node + + if placement: + yaml_content["components"][0]["placement"] = placement + + return yaml_content diff --git a/mlconnector/src/utils/api/requirements.txt b/mlconnector/src/utils/api/requirements.txt new file mode 100644 index 0000000..31a2404 --- /dev/null +++ b/mlconnector/src/utils/api/requirements.txt @@ -0,0 +1,8 @@ +fastapi +uvicorn +prometheus_client +mlstelemetry +opentelemetry-exporter-otlp +opentelemetry-api +opentelemetry-sdk +cachetools \ No newline at end of file diff --git a/mlconnector/src/utils/generate_train.py b/mlconnector/src/utils/generate_train.py new file mode 100644 index 0000000..9e81843 --- /dev/null +++ b/mlconnector/src/utils/generate_train.py @@ -0,0 +1,250 @@ +import os +import docker +import yaml +import requests + + +def generate_entry_file(file_list): + script_template = f"""#!/bin/bash + set -e + echo "Running {file_list[1]} with {file_list[0]}" + python {file_list[1]} {file_list[0]} + echo "Saving model" + python save_model.py + """ + + with open("/code/utils/train/entrypoint.sh", "w") as f: + f.write(script_template) + + + os.chmod("/code/utils/train/entrypoint.sh", 0o755) + +template = """#!/usr/bin/python3 +# Author John Byabazaire + +import pandas as pd +import joblib +import os +import json +import requests +from io import BytesIO +import base64 +import urllib.parse +from dotenv import load_dotenv +from requests.exceptions import RequestException, HTTPError + +load_dotenv() + +import os +import requests +import mimetypes + +def upload_model_file(file_path: str,file_kind: str,model_id: str) -> dict: + BASE_URL = os.getenv('SIDE_API_ENDPOINT') + if not BASE_URL: + raise ValueError("SIDE_API_ENDPOINT is not set in the .env file") + url = f"{{BASE_URL}}/model/{{model_id}}/upload" + filename = os.path.basename(file_path) + + if not os.path.isfile(file_path): + raise FileNotFoundError(f"No such file: {{file_path}}") + + # get MIME type based on extension + mime_type, _ = mimetypes.guess_type(file_path) + if mime_type is None: + mime_type = "application/octet-stream" + + try: + with open(file_path, "rb") as f: + files = {{ + "file": (filename, f, mime_type), + }} + data = {{"file_kind": file_kind}} + headers = {{"Accept": "application/json"}} + + resp = requests.post(url, headers=headers, files=files, data=data) + resp.raise_for_status() + try: + return resp.json() + except ValueError: + return {{"status": "success", "response_text": resp.text}} + + except HTTPError as http_err: + # The server returned an HTTP error code + raise HTTPError( + f"HTTP error uploading {{filename}}: {{http_err}} - " + f"Response body: {{http_err.response.text}}" + ) from http_err + + except RequestException as req_err: + # Network-level errors (connection timeout, DNS failure, etc.) + raise RequestException(f"Network error during upload: {{req_err}}") from req_err + + +# Example usage: +if __name__ == "__main__": + result = upload_model_file( + file_path="{file_name}", + file_kind="model", + model_id="{model_id}" + ) + print("Upload response:", result) +""" + +def generate_dockerfile(): + dockerfile_content = f"""\ + FROM python:3.9-slim + + RUN apt-get update && apt-get install -y curl git jq && rm -rf /var/lib/apt/lists/* + + WORKDIR /app + + COPY requirements.txt . + + RUN apt-get update && apt-get install -y build-essential + + RUN pip install --no-cache-dir -r requirements.txt + + COPY . /app + + # Set the entrypoint. + ENTRYPOINT ["/app/entrypoint.sh"] + """ + with open("/code/utils/train/Dockerfile", "w") as file: + file.write(dockerfile_content) + print("Dockerfile generated successfully!") + + +def build_and_push_image(modelid, registry_url, image_name, registry_username, registry_password, training_data, training_code): + file_list=[training_data, training_code] + generate_entry_file(file_list) + params = { + "model_id": modelid, + "file_name": modelid+".pkl", + } + generated_code = template.format(**params) + + with open("/code/utils/train/save_model.py", "w") as f: + f.write(generated_code) + generate_dockerfile() + client = docker.from_env() + + try: + print("Building Docker image...") + image, build_logs = client.images.build(path="/code/utils/train/", tag=image_name) + for log in build_logs: + print(log.get("stream", "").strip()) + except docker.errors.BuildError as e: + print(f"Error building image: {e}") + return + + print("Pushing Docker image...") + #registry_url, image_tag = image_name.split("/", 1) + client.login(username=registry_username, password=registry_password, registry=registry_url) + + try: + push_logs = client.images.push(image_name, stream=True, decode=True) + for log in push_logs: + print(log) + except docker.errors.APIError as e: + print(f"Error pushing image: {e}") + + +def generate_yaml( + deployment_id: str, + image: str, + clusterID: str = None, + node: str = None, + continuum: bool = False, + ): + yaml_content = { + "apiVersion": "fractus.gr/v1", + "kind": "MLSysOpsApp", + "metadata": { + "name": "ml-application" + }, + "components": [ + { + "Component": { + "name": "ml-comp", + "uid": deployment_id + }, + "placement": {}, + "restartPolicy": "OnFailure", + "containers": [ + { + "image": image, + "imagePullPolicy": "IfNotPresent", + "ports": [ + { + "containerPort": 8000 + } + ] + } + ] + } + ] + } + + placement = {} + if continuum: + placement["continuum"] = ["*"] + else: + if clusterID: + placement["clusterID"] = clusterID + if node: + placement["node"] = node + + if placement: + yaml_content["components"][0]["placement"] = placement + + return yaml_content + +def generate_json( + deployment_id: str, + image: str, + placement: dict, + app_name: str = "ml-app-1", + port: int = 8000 +): + app = { + "MLSysOpsApplication": { + "name": app_name, + "mlsysops-id": deployment_id + } + } + cluster_id = placement.get("clusterID", "") + if cluster_id: + app["MLSysOpsApplication"]["clusterPlacement"] = { + "clusterID": [cluster_id], + "instances": 1 + } + component = { + "Component": { + "name": "ml-comp", + "uid": deployment_id + } + } + node_conf = {} + node_name = placement.get("node", "") + if node_name: + node_conf["node"] = node_name + elif placement.get("continuum", False): + node_conf["continuumLayer"] = ["*"] + + if node_conf: + component["nodePlacement"] = node_conf + + component["restartPolicy"] = "OnFailure" + component["containers"] = [ + { + "image": image, + "imagePullPolicy": "IfNotPresent", + "ports": [ + {"containerPort": port} + ] + } + ] + + app["MLSysOpsApplication"]["components"] = [component] + return app diff --git a/mlconnector/src/utils/get_model.py b/mlconnector/src/utils/get_model.py new file mode 100644 index 0000000..b9e744c --- /dev/null +++ b/mlconnector/src/utils/get_model.py @@ -0,0 +1,12 @@ +import requests + +url = "http:///model/get/" + +payload = {} +headers = { + 'accept': 'application/json' +} + +response = requests.request("GET", url, headers=headers, data=payload) + +print(response.text) diff --git a/mlconnector/src/utils/manage_s3.py b/mlconnector/src/utils/manage_s3.py new file mode 100644 index 0000000..2479314 --- /dev/null +++ b/mlconnector/src/utils/manage_s3.py @@ -0,0 +1,138 @@ +import boto3 +from botocore.exceptions import NoCredentialsError, ClientError +from botocore.config import Config +from boto3.exceptions import S3UploadFailedError +from dotenv import load_dotenv +import os +import logging + +load_dotenv(verbose=True, override=True) + +class S3Manager: + def __init__(self, bucket_name, aws_access_key_id, aws_secret_access_key, endpoint_url): + """ + Initialize the S3Manager with a bucket name and optional AWS credentials. + """ + self.bucket_name = bucket_name + self.s3_client = boto3.client( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + endpoint_url=endpoint_url, + config=Config(s3={'addressing_style': 'path', 'payload_signing_enabled': False}) + ) + self._ensure_bucket_exists() + + def _ensure_bucket_exists(self): + """ + Check if the bucket exists. If not, create it. + """ + try: + self.s3_client.head_bucket(Bucket=self.bucket_name) + print(f"Bucket '{self.bucket_name}' already exists.") + except ClientError as e: + # If a 404 error is thrown, then the bucket does not exist. + error_code = int(e.response['Error']['Code']) + if error_code == 404: + try: + self.s3_client.create_bucket(Bucket=self.bucket_name) + print(f"Bucket '{self.bucket_name}' created successfully.") + except ClientError as ce: + print("Error creating bucket:", ce) + else: + print("Error checking bucket:", e) + + def upload_file(self, file_name, object_name=None): + """Upload a file to an S3 bucket + + :param file_name: File to upload + :param bucket: Bucket to upload to + :param object_name: S3 object name. If not specified then file_name is used + :return: True if file was uploaded, else False + """ + + # If S3 object_name was not specified, use file_name + if object_name is None: + object_name = os.path.basename(file_name) + try: + with open(file_name, 'rb') as f: + data = f.read() + self.s3_client.put_object(Bucket=self.bucket_name, Key=object_name, Body=data, ContentLength=len(data)) + except ClientError as e: + logging.error(e) + return False + return True + + + def download_file(self, object_name, download_path): + """ + Download a file from the bucket. + + :param object_name: Name of the file in S3. + :param download_path: Local path where the file will be saved. + """ + try: + response = self.s3_client.get_object(Bucket=self.bucket_name, Key=object_name) + body = response['Body'].read() + with open(download_path, 'wb') as f: + f.write(body) + print(f"File '{object_name}' downloaded from bucket '{self.bucket_name}' to '{download_path}'.") + except ClientError as e: + print("Error downloading file:", e) + + def delete_file(self, object_name): + """ + Delete a file from the bucket. + + :param object_name: Name of the file in S3 to delete. + """ + try: + self.s3_client.delete_object(Bucket=self.bucket_name, Key=object_name) + print(f"File '{object_name}' deleted from bucket '{self.bucket_name}'.") + except ClientError as e: + print("Error deleting file:", e) + + def list_files(self): + """ + List all files in the bucket. + """ + try: + response = self.s3_client.list_objects_v2(Bucket=self.bucket_name) + if 'Contents' in response: + files = [obj['Key'] for obj in response['Contents']] + print("Files in bucket:") + for f in files: + print(" -", f) + return files + else: + print("No files found in bucket.") + return [] + except ClientError as e: + print("Error listing files:", e) + return [] + +# Example usage: +if __name__ == "__main__": + + manager = S3Manager( + os.getenv("AWS_S3_BUCKET_DATA"), + os.getenv("AWS_ACCESS_KEY_ID"), + os.getenv("AWS_SECRET_ACCESS_KEY"), + os.getenv("AWS_ACCESS_URL") + ) + # Upload a file + #manager.list_files() + manager.upload_file('model_backend_id_137.pkl') + + manager.list_files() + # Download the file + #manager.download_file('9ce175cf-5fa8-4c72-ac30-15467a75dd98.csv', '9ce175cf-5fa8-4c72-ac30-15467a75dd98.csv') + + # Delete the file + #manager.delete_file('c2377cdc-e8ba-4cf0-9392-80c0983f0b4d.pkl') + #manager.delete_file('c2377cdc-e8ba-4cf0-9392-80c0983f0b4d.py') + #manager.delete_file('c2377cdc-e8ba-4cf0-9392-80c0983f0b4d.csv') + + #manager.list_files() + # Download the file + #manager.download_file('sample_data.csv', 'downloaded_example.csv') diff --git a/mlconnector/src/utils/mldeployments.py b/mlconnector/src/utils/mldeployments.py new file mode 100644 index 0000000..138394b --- /dev/null +++ b/mlconnector/src/utils/mldeployments.py @@ -0,0 +1,264 @@ +# !/usr/bin/python3 +# Author John Byabazaire + + +from sqlalchemy.orm import Session +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select + +from fastapi import HTTPException +from models.mldeployment import MLDeployment +from schema.mldeployment import MLDeploymentCreate, MLDeploymentReturn +import json +from db.redis_setup import create_redis_connection +from utils.api.generate_dockerfile import build_and_push_image, generate_json +from dotenv import load_dotenv +from utils.mlmodels import get_model_by_id, get_model_files +from pydantic import create_model +import os +import uuid +import requests +import json +import ast +from textwrap import dedent +from utils.manage_s3 import S3Manager +from sqlalchemy import update +#myuuid = uuid.uuid4() + +load_dotenv(verbose=True, override=True) + + +s3_manager = S3Manager( + os.getenv("AWS_S3_BUCKET_DATA"), + os.getenv("AWS_ACCESS_KEY_ID"), + os.getenv("AWS_SECRET_ACCESS_KEY"), + os.getenv("AWS_ACCESS_URL") +) + +def extract_feature_names(feature_list): + type_mapping = { + 'cont': "float", + 'cat': "str" + } + + return { + feature['feature_name']: type_mapping.get(feature['type'], None) + for feature in feature_list + if feature.get('kind') == 0 + } +async def deploy_ml_application(endpoint, payload): + headers = { + "accept": "application/json", + "Content-Type": "application/json" + } + url = f"{endpoint}/ml/deploy_ml" + try: + response = requests.post(url, headers=headers, json=payload) + response.raise_for_status() + except requests.exceptions.RequestException as e: + print(f"Error deploying ML application: {e}") + return + + # On success + print(f"Status Code: {response.status_code}") + try: + print("Response JSON:", response.json()) + except ValueError: + print("Response Text:", response.text) + +def prepare_model_artifact(s3_manager: S3Manager, model_name: str, download_dir: str = "/code/utils/api"): + """ + Download the model from S3 into download_dir. + Returns the local path to the downloaded model. + """ + local_path = os.path.join(download_dir, model_name) + # ensure the directory exists + os.makedirs(download_dir, exist_ok=True) + + # download from S3 + s3_manager.download_file(object_name=model_name, download_path=local_path) + print(f"Model downloaded to {local_path}") + return local_path + + +def generate_schema_code(flag=0, feature_list_str=None): + if flag == 0: + schema_code = dedent(f""" + # Parse the feature list JSON string to a dict. + feature_dict = json.loads('{feature_list_str}') + # Map the type strings to actual Python types. + type_mapping = {{ + "int": float, + "str": str, + "float": float + }} + # Create a field definition for each feature. + # The ellipsis (...) marks the field as required. + fields = {{ + key: (type_mapping.get(val, str), ...) + for key, val in feature_dict.items() + }} + DataModel = create_model("DataModel", **fields) + DynamicSchema = create_model("DynamicSchema", data=(DataModel, ...), explanation=(bool, ...)) + """) + elif flag == 1: + schema_code = dedent(""" + DynamicSchema = create_model("DynamicSchema", data_link=(str, ...), explanation=(bool, ...)) + """) + + return schema_code + +async def get_deployment_by_id(db: AsyncSession, deployment_id: str): + query = select(MLDeployment).where(MLDeployment.deployment_id == deployment_id) + result = await db.execute(query) + return result.scalar_one_or_none() + + +async def get_deployment_status(db: AsyncSession, deployment_id: str): + BASE_URL = os.getenv('NOTHBOUND_API_ENDPOINT') + url = f"{BASE_URL}/ml/status/{deployment_id}" + #print(url) + headers = {"Accept": "application/json"} + + try: + resp = requests.get(url, headers=headers) + resp.raise_for_status() + except requests.exceptions.RequestException as e: + print(f"[ERROR] Status fetch failed: {e}") + return False + + try: + data_dict = ast.literal_eval(resp.json()["status"]) + #update MLDeployment model status + query = ( + update(MLDeployment) + .where(MLDeployment.deployment_id == deployment_id) + .values(status=data_dict["status"]) + ) + await db.execute(query) + await db.commit() + return resp.json() + except ValueError: + return resp.text + + +async def return_all_deployments(db: AsyncSession): + BASE_URL = os.getenv('NOTHBOUND_API_ENDPOINT') + url = f"{BASE_URL}/ml/list_all/" + #print(url) + headers = {"Accept": "application/json"} + + try: + resp = requests.get(url, headers=headers) + resp.raise_for_status() + except requests.exceptions.RequestException as e: + print(f"[ERROR] Status fetch failed: {e}") + return False + + try: + return resp.json() + except ValueError: + return resp.text + +#return_all_deployments + +async def update_deployment( + db: AsyncSession, + deployment_id:str, + deployment: MLDeploymentCreate + ): + existing_deployment = await get_deployment_by_id(db=db, deployment_id=deployment_id) + for field, value in deployment.model_dump(exclude_unset=True).items(): + setattr(existing_deployment, field, value) + #async with db.begin(): + # db.add(db_car_owner) + await db.commit() + await db.refresh(existing_deployment) + return existing_deployment + +async def create_deployment(db: AsyncSession, deployment: MLDeploymentCreate, create_new=False): + model = await get_model_by_id(db, model_id=deployment.modelid) + file_model = await get_model_files(db, modelid=deployment.modelid, filekind="model") + #file_require = await get_model_files(db, modelid=deployment.modelid, filekind="data") + if(deployment.deployment_id ==""): + deployment_id = str(uuid.uuid4()) + else: + deployment_id = deployment.deployment_id + #print(model.featurelist) + #print(file_model) + schema_code = "" + if(deployment.inference_data==0): + schema_code = generate_schema_code(flag=0, feature_list_str=json.dumps((extract_feature_names(model.featurelist)))) + else: + schema_code = generate_schema_code(flag=1) + + + if model is None: + raise HTTPException(status_code=404, detail="No model details found with that model_id") + else: + image_name = "registry.mlsysops.eu/usecases/augmenta-demo-testbed/"+deployment.modelid+":0.0.1" + + # download model file... + local_model_path = prepare_model_artifact(s3_manager, file_model[0].filename) + build_and_push_image( + #model.trained_model[0]['modelname'], + file_model[0].filename, + "registry.mlsysops.eu", + image_name, + os.getenv("DOCKER_USERNAME"), + os.getenv("DOCKER_PASSWORD"), + inference_data=schema_code, + datasource=deployment.inference_data, + model_id=deployment.modelid, + model_owner=deployment.ownerid, + deploymentid=deployment_id + ) + placement_as_dict = { + "clusterID": deployment.placement.clusterID, + "node": deployment.placement.node, + "continuum": deployment.placement.continuum + } + new_deployment = generate_json( + deployment_id=deployment_id, + image=image_name, + placement=placement_as_dict, + port=8000 + ) + + #deployment_json = json.dumps(new_deployment) + #print(str(new_deployment)) + + #con = await create_redis_connection() + #await con.rpush(os.getenv("DEPLOYMENT_QUEUE"), [str(deployment_json)]) + await deploy_ml_application(os.getenv("NOTHBOUND_API_ENDPOINT"), new_deployment) + #return deployment + res = MLDeploymentReturn ( + modelid = deployment.modelid, + inference_data = deployment.inference_data, + ownerid = deployment.ownerid, + placement = deployment.placement, + deployment_id = deployment_id, + status = "waiting" + ) + new_deployment = MLDeployment( + modelid = deployment.modelid, + ownerid = deployment.ownerid, + placement = placement_as_dict, + deployment_id = deployment_id, + status = "waiting" + ) + if create_new: + existing_deployment = await get_deployment_by_id(db=db, deployment_id=deployment_id) + if existing_deployment: + # Update the existing deployment + for key, value in deployment.model_dump(exclude_unset=True).items(): + setattr(existing_deployment, key, value) + db.add(existing_deployment) + await db.commit() + await db.refresh(existing_deployment) + else: + # Add new deployment + db.add(new_deployment) + await db.commit() + await db.refresh(new_deployment) + return res diff --git a/mlconnector/src/utils/mlmodels.py b/mlconnector/src/utils/mlmodels.py new file mode 100644 index 0000000..63b4c27 --- /dev/null +++ b/mlconnector/src/utils/mlmodels.py @@ -0,0 +1,282 @@ +# !/usr/bin/python3 +# Author John Byabazaire + + +from sqlalchemy.orm import Session, joinedload +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select +from sqlalchemy import inspect +from sqlalchemy import text +from typing import List, Optional +from fastapi import UploadFile + +from models.mlmodels import MLModels, MLModelFiles +from models.mldeployment import MLDeployment +from schema.mldeployment import MLDeploymentCreate +from schema.mlmodels import MLModelCreate, MLModelDeploy, MLModelDeployRes, FileSchema +import uuid +import os +import json +from utils.manage_s3 import S3Manager +import utils.mldeployments +#myuuid = uuid.uuid4() + + +s3_manager = S3Manager( + os.getenv("AWS_S3_BUCKET_DATA"), + os.getenv("AWS_ACCESS_KEY_ID"), + os.getenv("AWS_SECRET_ACCESS_KEY"), + os.getenv("AWS_ACCESS_URL") +) +def _serialize(obj): + """ + Turn a SQLAlchemy ORM object into a plain dict by inspecting its columns. + """ + return { + col.key: getattr(obj, col.key) + for col in inspect(obj).mapper.column_attrs + } + +async def update_deployments(db: AsyncSession, deployments: List[dict]): + count = 1 + for row in deployments: + print("Processing deployment: ", count, " of ", len(deployments)) + print("*"*20) + # Convert the dictionary to a Pydantic model + ml_deployment = MLDeploymentCreate( + modelid=row['modelid'], + ownerid=row['ownerid'], + placement=row['placement'], + deployment_id=row['deployment_id'], + inference_data=0, + ) + results = await utils.mldeployments.create_deployment(db=db, deployment=ml_deployment, create_new=True) + print("Deployment created: ", results) + count += 1 + + """# Check if the deployment is already in the database + existing_deployment = await db.execute( + select(MLDeployment).where(MLDeployment.deploymentid == row.deploymentid) + ) + existing_deployment = existing_deployment.scalar_one_or_none() + + if existing_deployment: + # Update the existing deployment + for key, value in row.__dict__.items(): + setattr(existing_deployment, key, value) + db.add(existing_deployment) + else: + # Add new deployment + db.add(row)""" + +async def get_model_by_id(db: AsyncSession, model_id: str): + query = select(MLModels).where(MLModels.modelid == model_id) + result = await db.execute(query) + return result.scalar_one_or_none() + + +async def get_model_join_by_id(db: AsyncSession, model_id: str): + sql = text(""" + SELECT + m.*, + f.* + FROM mlmodels AS m + JOIN mlmodelfiles AS f + ON m.modelid = f.modelid + WHERE m.modelid = :model_id + """) + result = await db.execute(sql, {"model_id": model_id}) + return result.fetchall() + +async def get_file_details(db: AsyncSession, file_id: str): + query = select(MLModelFiles).where(MLModelFiles.fileid == file_id) + result = await db.execute(query) + return result.scalar_one_or_none() + +async def get_model_files(db: AsyncSession, modelid: str, filekind:str): + query = ( + select(MLModelFiles) + .where( + MLModelFiles.modelid == modelid, + MLModelFiles.filekind == filekind + ) + ) + result = await db.execute(query) + return result.scalars().all() + +async def get_model_by_kind(db: AsyncSession, modelkind: str): + query = select(MLModels).where(MLModels.modelkind == modelkind) + result = await db.execute(query) + return result.scalars().all() + +async def get_model_file_by_id_type(db: AsyncSession, modelid: str, filetype: str): + query = select(MLModelFiles).where( + MLModelFiles.modelid == modelid, + MLModelFiles.filekind == filetype + ) + result = await db.execute(query) + return result.scalars().all() + +async def upload_models( + db: AsyncSession, + file: UploadFile, + file_data: FileSchema +) -> bool: + """ + Save or update a model file record, upload to S3, then— + only if S3 upload succeeded and it’s a `model` file— + update any pending deployments for that model. + """ + # 1) Prepare temp filename + _, ext = os.path.splitext(file_data.filename) + file_data.filename = f"{file_data.modelid}{ext or ''}" + temp_path = os.path.join("/tmp", file_data.filename) + + try: + # 2) Write upload to disk + content = await file.read() + with open(temp_path, "wb") as f: + f.write(content) + + # 3) Insert or update file record + existing = (await get_model_file_by_id_type(db, file_data.modelid, file_data.filekind)) or [] + is_new = not existing + if is_new: + await save_model_file(db, file_data) + else: + old = existing[0] + # preserve existing metadata but bump filename if needed + update_data = FileSchema( + modelid=old.modelid, + filekind=old.filekind, + filename=file_data.filename, + contenttype=old.contenttype, + ) + await update_model_file(db, old.fileid, update_data) + + # 4) Upload to S3 + uploaded = s3_manager.upload_file(temp_path) + if not uploaded: + return False + + # 5) Only for model‐kind updates, update deployments + if not is_new and file_data.filekind == "model": + stmt = ( + select(MLDeployment) + .where( + MLDeployment.modelid == file_data.modelid, + MLDeployment.status != "deployed" + ) + ) + result = await db.execute(stmt) + pending = result.scalars().all() + + # serialize and push to your update_deployments routine + payload = [_serialize(dep) for dep in pending] + await update_deployments(db, payload) + + return True + + except Exception as e: + print(f"[ERROR] upload_models failed: {e}") + return False + + finally: + # 6) Cleanup temp file + if os.path.exists(temp_path): + os.remove(temp_path) + + +async def get_models_by_tags(db: AsyncSession, tags: Optional[List[str]]): + query = select(MLModels) + if tags: + # Apply the filter using the overlap operator + query = query.filter(MLModels.modeltags.overlap(tags)) + result = await db.execute(query) + return result.scalars().all() + + +async def return_all_models(db: AsyncSession, skip: int = 0, limit: int = 100): + query = select(MLModels).offset(skip).limit(limit) + result = await db.execute(query) + return result.scalars().all() + +async def create_deployment(db: AsyncSession, mlmodel: MLModelDeploy): + return MLModelDeployRes ( + modelid = mlmodel.modelid, + deploymentid = str(uuid.uuid4()) + ) + + +async def create_model(db: AsyncSession, mlmodel: MLModels): + hyperparameter_as_dict = [hyperparameter.dict() for hyperparameter in mlmodel.hyperparameter] if mlmodel.hyperparameter else None + modelperformance_as_dict = [modelperformance.dict() for modelperformance in mlmodel.modelperformance] if mlmodel.modelperformance else None + trainingresource_as_dict = [trainingresource.dict() for trainingresource in mlmodel.trainingresource] if mlmodel.hyperparameter else None + runresource_as_dict = [runresource.dict() for runresource in mlmodel.runresource] if mlmodel.runresource else None + featurelist_as_dict = [featurelist.dict() for featurelist in mlmodel.featurelist] if mlmodel.featurelist else None + inference_as_dict = [inference.dict() for inference in mlmodel.inference] if mlmodel.inference else None + drift_detection_as_dict = [drift_detection.dict() for drift_detection in mlmodel.drift_detection] if mlmodel.drift_detection else None + #training_data_as_dict = [training_data.dict() for training_data in mlmodel.training_data] if mlmodel.training_data else None + new_model = MLModels( + modelid = str(uuid.uuid4()), + modelname = mlmodel.modelname, + modelkind = mlmodel.modelkind, + #source_code = str(mlmodel.source_code), + #trained_model = trained_model_as_dict, + #training_data = training_data_as_dict, + hyperparameter = hyperparameter_as_dict, + modelperformance = modelperformance_as_dict, + trainingresource = trainingresource_as_dict, + runresource = runresource_as_dict, + featurelist = featurelist_as_dict, + inference = inference_as_dict, + modeltags = mlmodel.modeltags, + drift_detection = drift_detection_as_dict + ) + #async with db.begin(): + db.add(new_model) + await db.commit() + await db.refresh(new_model) + return new_model + + +async def save_model_file(db: AsyncSession, file_data: FileSchema): + new_file = MLModelFiles( + fileid = str(uuid.uuid4()), + modelid = file_data.modelid, + filename = file_data.filename, + filekind = file_data.filekind, + contenttype = file_data.contenttype, + ) + #async with db.begin(): + db.add(new_file) + await db.commit() + await db.refresh(new_file) + return new_file + + +async def update_model( + db: AsyncSession, + model_id: str, + account: MLModelCreate + ): + existing_model = await get_model_by_id(db=db, model_id=model_id) + for field, value in account.model_dump(exclude_unset=True).items(): + setattr(existing_model, field, value) + #async with db.begin(): + await db.commit() + await db.refresh(existing_model) + return existing_model + +async def update_model_file( + db: AsyncSession, + file_id: str, + modelfile: FileSchema + ): + existing_file_details = await get_file_details(db=db, file_id=file_id) + for field, value in modelfile.model_dump(exclude_unset=True).items(): + setattr(existing_file_details, field, value) + #async with db.begin(): + await db.commit() + await db.refresh(existing_file_details) + return existing_file_details \ No newline at end of file diff --git a/mlconnector/src/utils/mloperations.py b/mlconnector/src/utils/mloperations.py new file mode 100644 index 0000000..67196a9 --- /dev/null +++ b/mlconnector/src/utils/mloperations.py @@ -0,0 +1,45 @@ +# !/usr/bin/python3 +# Author John Byabazaire + + +from sqlalchemy.orm import Session +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select + +from fastapi import HTTPException +from models.mldeployment import MLDeploymentOps +from schema.mloperations import MLDeploymentOposCreate, MLDeploymentOposReturn +import json +from dotenv import load_dotenv +from pydantic import create_model +import os +import uuid +#myuuid = uuid.uuid4() + +load_dotenv(verbose=True, override=True) + +async def get_deployment_ops_by_owner(db: AsyncSession, ownerid: str): + query = select(MLDeploymentOps).where(MLDeploymentOps.ownerid == ownerid) + result = await db.execute(query) + return result.scalars().all() + +async def get_deployment_ops_by_deployment(db: AsyncSession, deploymentid: str): + query = select(MLDeploymentOps).where(MLDeploymentOps.deploymentid == deploymentid) + result = await db.execute(query) + return result.scalars().all() + +async def save_opos(db: AsyncSession, mloperation: MLDeploymentOposCreate): + new_opos = MLDeploymentOps( + operationid = str(uuid.uuid4()), + timestamp = mloperation.timestamp, + ownerid = mloperation.ownerid, + modelid = mloperation.modelid, + data = mloperation.data, + result = mloperation.result, + deploymentid = mloperation.deploymentid, + ) + #async with db.begin(): + db.add(new_opos) + await db.commit() + await db.refresh(new_opos) + return new_opos \ No newline at end of file diff --git a/mlconnector/src/utils/mlresources.py b/mlconnector/src/utils/mlresources.py new file mode 100644 index 0000000..9b6775d --- /dev/null +++ b/mlconnector/src/utils/mlresources.py @@ -0,0 +1,63 @@ +# !/usr/bin/python3 +# Author John Byabazaire + + +from sqlalchemy.orm import Session +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select + +from models.mlresources import MLResources +from schema.mlresource import MLResourceCreate + + +async def get_feature_by_id(db: AsyncSession, resource_id: str): + query = select(MLResources).where(MLResources.resource_id == resource_id) + result = await db.execute(query) + return result.scalar_one_or_none() + + +async def get_feature_by_model_id(db: AsyncSession, model_id: str): + query = select(MLResources).where(MLResources.modelid == model_id) + result = await db.execute(query) + return result.scalars().all() + + +async def return_all_model_features(db: AsyncSession, skip: int = 0, limit: int = 100): + query = select(MLResources).offset(skip).limit(limit) + result = await db.execute(query) + return result.scalar_one_or_none() + + +async def create_fetaure(db: AsyncSession, mlresource: MLResourceCreate): + new_feature = MLResources( + resource_id = mlresource.resource_id, + explanation_flag = mlresource.explanation_flag, + modelrecall = mlresource.modelrecall, + modelprecision = mlresource.modelprecision, + modelaccuracy = mlresource.modelaccuracy, + min_core = mlresource.min_core, + min_ram = mlresource.min_ram, + min_disk = mlresource.min_disk, + input_type = mlresource.input_type, + out_type = mlresource.out_type, + modelid = mlresource.modelid, + ) + #async with db.begin(): + db.add(new_feature) + await db.commit() + await db.refresh(new_feature) + return new_feature + + +async def update_feature( + db: AsyncSession, + resource_id: str, + feature: MLResourceCreate + ): + existing_feature = await get_feature_by_id(db=db, resource_id=resource_id) + for field, value in feature.model_dump(exclude_unset=True).items(): + setattr(existing_feature, field, value) + #async with db.begin(): + await db.commit() + await db.refresh(existing_feature) + return existing_feature \ No newline at end of file diff --git a/mlconnector/src/utils/mltrainings.py b/mlconnector/src/utils/mltrainings.py new file mode 100644 index 0000000..570b39e --- /dev/null +++ b/mlconnector/src/utils/mltrainings.py @@ -0,0 +1,102 @@ +# !/usr/bin/python3 +# Author John Byabazaire + + +from sqlalchemy.orm import Session +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.future import select +from sqlalchemy import inspect +from fastapi import HTTPException +from utils import mlmodels + +from models.mltraining import MLTraining +from schema.mltraining import MLTrainCreate +from utils.generate_train import build_and_push_image, generate_json +import uuid +import os +import json +from utils.manage_s3 import S3Manager +from dotenv import load_dotenv + +load_dotenv(verbose=True, override=True) + + +s3_manager = S3Manager( + os.getenv("AWS_S3_BUCKET_DATA"), + os.getenv("AWS_ACCESS_KEY_ID"), + os.getenv("AWS_SECRET_ACCESS_KEY"), + os.getenv("AWS_ACCESS_URL") +) + +def prepare_file_artifact(s3_manager: S3Manager, file_name: str, download_dir: str = "/code/utils/train"): + """ + Download the file from S3 into download_dir. + Returns the local path to the downloaded file. + """ + local_path = os.path.join(download_dir, file_name) + # ensure the directory exists + os.makedirs(download_dir, exist_ok=True) + + # download from S3 + s3_manager.download_file(object_name=file_name, download_path=local_path) + print(f"File downloaded to {local_path}") + return local_path + +async def get_train_deplyment_id(db: AsyncSession, modelid: str): + #query = select(MLTraining).where(MLTraining.modelid == modelid) + query = select(MLTraining).where( + MLTraining.modelid == modelid, + MLTraining.status != "completed" + ) + result = await db.execute(query) + return result.scalar_one_or_none() + +async def create_training(db: AsyncSession, mltrain: MLTrainCreate): + # model = await mlmodels.get_model_by_id(db, model_id=mltrain.modelid) + model = await mlmodels.get_model_by_id(db, model_id=mltrain.modelid) + file_code = await mlmodels.get_model_files(db, modelid=mltrain.modelid, filekind="code") + file_data = await mlmodels.get_model_files(db, modelid=mltrain.modelid, filekind="data") + deployment_id = str(uuid.uuid4()) + if model is None: + raise HTTPException(status_code=404, detail="No model details found with that model_id") + else: + local_code_path = prepare_file_artifact(s3_manager, file_code[0].filename) + local_data_path = prepare_file_artifact(s3_manager, file_data[0].filename) + #print(model[0][1].filename) + image_name = "registry.mlsysops.eu/usecases/augmenta-demo-testbed/"+deployment_id+":0.0.1" + build_and_push_image( + mltrain.modelid, + "registry.mlsysops.eu", + image_name, + os.getenv("DOCKER_USERNAME"), + os.getenv("DOCKER_PASSWORD"), + file_data[0].filename, + file_code[0].filename + ) + placement_as_dict = { + "clusterID": mltrain.placement.clusterID, + "node": mltrain.placement.node, + "continuum": mltrain.placement.continuum + } + new_deployment = generate_json( + deployment_id=deployment_id, + image=image_name, + placement=placement_as_dict, + port=8000 + ) + deployment_json = json.dumps(new_deployment) + + print(str(deployment_json)) + + + new_train = MLTraining( + deployment_id = deployment_id, + modelid = mltrain.modelid, + status = "waiting", + placement = placement_as_dict + ) + #async with db.begin(): + db.add(new_train) + await db.commit() + await db.refresh(new_train) + return new_train diff --git a/mlconnector/src/utils/requirements.txt b/mlconnector/src/utils/requirements.txt new file mode 100644 index 0000000..b0f4e3f --- /dev/null +++ b/mlconnector/src/utils/requirements.txt @@ -0,0 +1,10 @@ +fastapi +uvicorn +pandas +scikit-learn==1.5.2 +prometheus_client +mlstelemetry +opentelemetry-exporter-otlp +opentelemetry-api +opentelemetry-sdk +cachetools \ No newline at end of file diff --git a/mlconnector/src/utils/train/.DS_Store b/mlconnector/src/utils/train/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3320dcb5b8be191799fd98459770ab31edfcc02f GIT binary patch literal 10244 zcmeHMTWl0n7(V~>HnS9&mX_P5bfsXhwy@n6%2l`RQbfyjTY3Y^?#|c_%+73gW?P`t zG(Hd`5KL5Jyu>FpsNumx14I*rNPO@Gf&|6*q7Q0}z8HD&!T-#eZD+Sr9)tkuOfu&` zm;XO={_lMMIdf(RA<&wU8VCsxLU_EX6iYF2xoA7Rr(K*~vm7O$J&BJRsko}gv3y~g zwpZaH;3424;3424;34oJAb@)|z4%#7dZ~wihk%E`Bm#7O2;fa+*p?GaT1y8e))4?@ zAy!)#=0%!88L(y8mJ>{33tqrXQ8H7oj~Kwru|8nyg>5;(Br_*qA3nf-GT0{+u%3?n z2P}00VJ5xQL%>5|Is)|UUPxjjLrgN{Jio_Ns$!VI;C0{%3X6(M_!52=zc)Ihk4DXy znK4>p>3&-3)O9tU&Bx-q6?t?(tZ36UGp1;A+A>fi8CCXlE1IN_w(1#8GA!FDYv2W5 z7!VhYjny{}lP!RKttH;L$zOrWJ`dtGD)ug7MU`~L&5RlnNmm(A49*~up_%(0iKaDG z*9NgaI(UvqB>ta)-15c+S*zZOYUa;NDH~P0Z3@x+HWxH4n>-{1A`=bKOc9+Zm@|pt z!1dfcr}Bcav4%BGb%Dmvs@o9x1;)P_iF_Q}T|9Ha*iFkAX=6MtSd{huMmCfM-zR$Zb!N>+=%+P{qF`)Pe! zTE>)B`yVV{ut!Rn5M&y!f=xJ;FR^ zl^cAI^JP#c^xy)NM1Krc-QsWK#n1VD^w}LT!`z;dwd|#5NuNip@b1UUC8&Pl>#|dGp zIbRd5W%FXeDpat-WJ+Jp7Lp~TiEJP{NH50PC^?0z?E{dxjCH3 z)o@F>dM?B@vhj1-t)hR@A1lK}P`JmA{TZ7Zc8i^=_RYR6_ceCDDW%a;RzA0)a&gV_ z`q1k2;YmU<3T9d7WV1!!9NJq1wq`t^c`U4aRb9w%`Or+!C6-Vw^Vg_$b--687GVsq z;?iYUEJpsb;-j@yRU(IB$BHXfR{6vN3@X90ZLGy2*oEdbKA%{K;lVHfnnUKoJ=5JS?ckOU1z;V=^SC{p(rJP*g=1e}D^@G86pufrP_h2Mt{ z@+kRKE+yepcS<@p(4Uu-XY38sg}lxel-p~%Y_2Z-gd47U|2NsjAl+n} z?sSvQ@yYqdnA700@8+~Sr|9C1lB4z%<>^el>&&F%GA%iMOq&pcB*+j>NRq_v_ghb6 z15QY2&FVXR>nSDp8?+a-#h;!XaCRV|GxpaPH|}f literal 0 HcmV?d00001 diff --git a/mlconnector/src/utils/train/.env b/mlconnector/src/utils/train/.env new file mode 100644 index 0000000..9a1b326 --- /dev/null +++ b/mlconnector/src/utils/train/.env @@ -0,0 +1 @@ +SIDE_API_ENDPOINT=http://daistwo.ucd.ie \ No newline at end of file diff --git a/mlconnector/src/utils/train/__pycache__/main.cpython-311.pyc b/mlconnector/src/utils/train/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e650335f6d9cb38e3224fcf58117a27824021102 GIT binary patch literal 2570 zcmb6aU2hXdaQE(f{>~Tq29lHzgpnGz4dtUnr2zzuAOWVHD43i`UE5N01-s6figIWF~w*s zmkc@S2fAbgk^uo}cmu?2dNNTmD4pewGuIz1r)_p zGn%5XkfLO=ByVs$qA0iWs?nfO{`kzdU}ROBbt;N#nps=5^{iwI-Oe%%6* z@%d$SUR_ajsx8JZWK;Q!X4+Q#`uPj-*(-B5=B{3wi>o=^of%a(Cv(fx59eLb0f==7 zfU~35qTR)b`=6JkK^PSm0zx~zL$7zvFpzgUr_CYJIh*Qc+H;9yYj^EL%twPn`kGMi_2k@1PgZ;`XXNP;DY|DazQEuJieXZg1n2a?r@8 zA!qcILbWv2EDN5DCx~WD=9Ua5(0LY8Z>JRtQXy}#Q0rkS_hKvzv6IhGZaEVT&16zG z2T;!GsU<^W5@Zu$LXNQD1=UtBQb-J&M$F{ zMYt%9G>l_GE<+(8lL=&jb(-28rDdCCaf8O1jq*@tof&mW+rdMR!7jJJ`U}7x&>i$V z6kSi>&sIVs)zHWzt90`Fvz5`Q>gZG@H07MH^&NK-&x6r*^C77O$E(5dI>NqK$^LEN z;J06tj#mbbRtJu*N9rQ%x+E98;7osW(As+)_VVS+*KOBj&O8;cFf6}>Hiwr&*e?&@WDB z7=Y%h^$tAre;29rPE>m*oY`8Wx0or150|CGZcXCFpBG_8S@FL!>303&QLdgzH?#1g zkaAgS$9kB50e(+Vwkf|d3*?rGYC>jEi7#b)IR}-r@t2Tus!3Fff)qp#asPtw#dR4$iq7 z6lXYR2j^^(WF+{$9{h4}{p|`Ktm47C5W%NQAJ!3kTHu9rkjAL{ LkTeYZZe08aFtS5Z-O8-BN@c6vWel*NSZ|O7RkEeE}nSP^k$i8cegLP0gVc@&NimK8Vlb z%dN0oW0pU$Q|e{zGp zOQqtV(EZ>l8fF7$`%ERNA0@+yPKd%Ggxp?7NvN`(nkC^>=X%B=YN9r9_U7}0R;zQ; zknL`B(U9|QyV;PPqvOS*CU*7@PcH^f@hDL*hD;8;YuU0`z$++U>U#DjNvx6w@Dy1^ zG$AoS3=jjvz&bHtPXSS1r=qD=Vt^R<5d*kCNN9+z#oVCYI^cuXXY^MPQ9#GH1fsO) zTFecC2ZWncK$FVt6N8&{uuB`~TFecabjJ0}FpizMc)V~uJJ_WTXWTVNUt)k5SZ1JX zx(=TI=kUv{eB>{uP>&cO2L2fXywdmjJt)eat>4PSvsOa8hlYZ2IVvEaFI@tlgZs#? eb{fA#9pYSzxj`HS?K&NhE&`em`Va%Zz`zHpvP`T1 literal 0 HcmV?d00001 diff --git a/mlconnector/xai-server-app/Dockerfile b/mlconnector/xai-server-app/Dockerfile new file mode 100644 index 0000000..cb792de --- /dev/null +++ b/mlconnector/xai-server-app/Dockerfile @@ -0,0 +1,13 @@ +FROM python:3.10 + +WORKDIR /appServer + +COPY . . +RUN pip install --upgrade pip +RUN pip install --no-cache-dir -r requirements.txt + +# Expose the port FastAPI will run on +EXPOSE 8091 + +# Start the FastAPI server +CMD ["uvicorn", "server:app", "--host", "0.0.0.0", "--port", "8091"] diff --git a/mlconnector/xai-server-app/ShapExplainer.py b/mlconnector/xai-server-app/ShapExplainer.py new file mode 100644 index 0000000..df366dd --- /dev/null +++ b/mlconnector/xai-server-app/ShapExplainer.py @@ -0,0 +1,180 @@ +import joblib +import shap +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import io +import base64 + + +class ShapExplainer: + + def __init__(self, model_path=None, test_data=None): + + self.shap_explainer = None + self.model_path = model_path + self.model = self.load_model() + self.test_data = test_data + print(self.model) + def load_model(self): + return joblib.load(self.model_path) + + def preprocess_data(self): + """Extracts the preprocessor and transforms the input data, while mapping original and transformed feature names.""" + preprocessor = self.model.named_steps['preprocessor'] + X_processed = preprocessor.transform(self.test_data) + + # Retrieve transformed feature names + transformed_feature_names = preprocessor.get_feature_names_out().tolist() + + # Extract mapping from transformed features back to original feature names + original_feature_names = list(self.test_data.columns) + feature_mapping = {orig: [] for orig in original_feature_names} + + for transformer_name, _, feature_list in preprocessor.transformers_: + for feature in feature_list: + if feature in feature_mapping: + for transformed_name in transformed_feature_names: + if transformed_name.startswith(transformer_name + "__" + feature): + feature_mapping[feature].append(transformed_name) + + # Convert sparse matrix to dense matrix if needed + X_dense = X_processed.toarray() if not isinstance(X_processed, np.ndarray) else X_processed + + return X_dense, transformed_feature_names, feature_mapping, preprocessor + + def explain_model(self, showImage=False): + """Explains the model using SHAP, ensuring final feature names match the original input.""" + + #global shap_explainer # Store explainer globally for reuse + + # Preprocess data and get transformed feature names and mapping + X_processed, transformed_feature_names, feature_mapping, _ = self.preprocess_data() + + # Initialize SHAP explainer using full dataset as reference + self.shap_explainer = shap.Explainer(self.model.named_steps['regressor'], X_processed) + + # Get SHAP values for the processed test set + shap_values = self.shap_explainer(X_processed) + + # Ensure SHAP values have feature names + shap_values.feature_names = transformed_feature_names + + # Aggregate SHAP values back to original feature names + aggregated_shap_values = [] + final_feature_names = [] + + for original_feature, indices in feature_mapping.items(): + if indices: # If the feature was transformed + transformed_indices = [transformed_feature_names.index(f) for f in indices] + aggregated_shap_values.append(np.sum(shap_values[:, transformed_indices].values, axis=1)) + else: # If the feature was not transformed + original_index = transformed_feature_names.index(original_feature) + aggregated_shap_values.append(shap_values[:, original_index].values) + + final_feature_names.append(original_feature) + + # Convert to array with correct shape + final_shap_values = np.column_stack(aggregated_shap_values) + + # Aggregate categorical features in input data + X_final = np.column_stack( + [np.mean(X_processed[:, [transformed_feature_names.index(f) for f in indices]], axis=1) if indices else X_processed[:, transformed_feature_names.index(original_feature)] + for original_feature, indices in feature_mapping.items()] + ) + + # Validate shape consistency + assert final_shap_values.shape == X_final.shape, f"Mismatch: SHAP values shape {final_shap_values.shape}, Data shape {X_final.shape}" + + # Create SHAP Explanation object + shap_explainer_values = shap.Explanation( + values=final_shap_values, + base_values=shap_values.base_values, + data=X_final, + feature_names=final_feature_names + ) + + if showImage: + # Plot SHAP summary + shap.initjs() + shap.plots.waterfall(shap_explainer_values[100]) + + def explain_single_instance(self, new_row, showImage=True): + """Explains a single new row using the trained model while maintaining the same SHAP background distribution.""" + + + if self.shap_explainer is None: + raise ValueError("SHAP explainer is not initialized. Run explain_model() first.") + + # Ensure new_row is in DataFrame format + if isinstance(new_row, dict): + new_row = pd.DataFrame([new_row]) # Convert dictionary to DataFrame + elif isinstance(new_row, pd.Series): + new_row = new_row.to_frame().T # Convert Series to DataFrame + + # Preprocess the single instance + _, transformed_feature_names, feature_mapping, preprocessor = self.preprocess_data() + new_row_processed = preprocessor.transform(new_row) + + # Convert sparse matrix to dense matrix if needed + new_row_dense = new_row_processed.toarray() if not isinstance(new_row_processed, np.ndarray) else new_row_processed + + # Use the stored SHAP explainer to explain the new row + shap_values = self.shap_explainer(new_row_dense) + + # Aggregate SHAP values back to original feature names + aggregated_shap_values = [] + final_feature_names = [] + + for original_feature, indices in feature_mapping.items(): + if indices: + transformed_indices = [transformed_feature_names.index(f) for f in indices] + aggregated_shap_values.append(np.sum(shap_values[:, transformed_indices].values, axis=1)) + else: + original_index = transformed_feature_names.index(original_feature) + aggregated_shap_values.append(shap_values[:, original_index].values) + + final_feature_names.append(original_feature) + + # Convert to array with correct shape + final_shap_values = np.column_stack(aggregated_shap_values) + + # Aggregate categorical features in input data + X_final = np.column_stack( + [np.mean(new_row_dense[:, [transformed_feature_names.index(f) for f in indices]], axis=1) if indices else new_row_dense[:, transformed_feature_names.index(original_feature)] + for original_feature, indices in feature_mapping.items()] + ) + + # Validate shape consistency + assert final_shap_values.shape == X_final.shape, f"Mismatch: SHAP values shape {final_shap_values.shape}, Data shape {X_final.shape}" + + # Create SHAP Explanation object + shap_explainer_single = shap.Explanation( + values=final_shap_values, + base_values=shap_values.base_values, + data=X_final, + feature_names=final_feature_names + ) + img_buf = io.BytesIO() + plt.figure() # Create a new figure + shap.plots.waterfall(shap_explainer_single[0], show=False) + plt.savefig(img_buf, bbox_inches="tight", dpi=300) + plt.close() + img_buf.seek(0) + + img_base64 = base64.b64encode(img_buf.getvalue()).decode("utf-8") + + if showImage: + img_buf = io.BytesIO() + plt.figure() # Create a new figure + shap.plots.waterfall(shap_explainer_single[0]) + return self.explainer_to_json_converter(shap_explainer_single[0]), img_base64 + + def explainer_to_json_converter(self, shap_values): + """ """ + shap_values_dict = {"values": shap_values.values.tolist(), # Convert NumPy array to list + "base_values": shap_values.base_values.tolist() if isinstance(shap_values.base_values, np.ndarray) else shap_values.base_values, + "feature_names": shap_values.feature_names if shap_values.feature_names is not None else None, + "data": shap_values.data.tolist() if hasattr(shap_values, "data") and shap_values.data is not None else None + } + return shap_values_dict diff --git a/mlconnector/xai-server-app/database.py b/mlconnector/xai-server-app/database.py new file mode 100644 index 0000000..dfd3d32 --- /dev/null +++ b/mlconnector/xai-server-app/database.py @@ -0,0 +1,121 @@ +import requests +import io +from urllib.parse import urlparse +import pandas as pd +import joblib +from io import BytesIO +import base64 +import urllib.parse +from manage_s3 import S3Manager +from dotenv import load_dotenv +import os + +load_dotenv(verbose=True, override=True,dotenv_path='/.env') +manager = S3Manager( + os.getenv("AWS_S3_BUCKET_DATA"), + os.getenv("AWS_ACCESS_KEY_ID"), + os.getenv("AWS_SECRET_ACCESS_KEY"), + os.getenv("AWS_ACCESS_URL") + ) +#BASE_LINK= "http://daistwo.ucd.ie" +BASE_LINK= "http://api" +headers = {"PRIVATE-TOKEN": os.getenv("GIT_TOKEN")} +parsed_url = None +gitlab_host = None +path_parts = None +repo_path = None +branch = None +file_path = None + +def proccessURL(url:str): + global parsed_url, gitlab_host, path_parts, repo_path, branch, file_path + parsed_url = urlparse(url) + print(parsed_url) + gitlab_host = f"{parsed_url.scheme}://{parsed_url.netloc}" + path_parts = parsed_url.path.strip("/").split("/") + repo_path = "/".join(path_parts[:2]) + branch = path_parts[4] + file_path = "/".join(path_parts[5:]) + +def getProjectID(): + global parsed_url, gitlab_host, path_parts, repo_path, branch, file_path + projects_url = f"{gitlab_host}/api/v4/projects" + response = requests.get(projects_url, headers=headers) + + if response.status_code == 200: + projects = response.json() + project_id = next((p["id"] for p in projects if p["path_with_namespace"] == repo_path), None) + if not project_id: + print(f"Project '{repo_path}' not found. Check the repository name.") + exit() + else: + print(f"Failed to fetch projects: {response.status_code} - {response.text}") + exit() + return project_id + +"""def downloadFile(url:str, isCSV=False): + global parsed_url, gitlab_host, path_parts, repo_path, branch, file_path + proccessURL(url) + project_id = getProjectID() + file_url = f"{gitlab_host}/api/v4/projects/{project_id}/repository/files/{file_path}/raw?ref={branch}" + response = requests.get(file_url, headers=headers) + if response.status_code == 200: + file_buffer = io.BytesIO(response.content) + file_buffer.seek(0) + if isCSV: + df = pd.read_csv(file_buffer) + return df + else: + return file_buffer + return None""" + +def downloadFile(filename:str, isCSV=False): + project_path = "side-api/ml_models" + ref = "main" + encoded_project = urllib.parse.quote_plus(project_path) + encoded_file = urllib.parse.quote_plus(filename) + + api_url = f"https://mlsysops-gitlab.e-ce.uth.gr/api/v4/projects/{encoded_project}/repository/files/{encoded_file}/raw?ref={ref}" + + headers = { + "PRIVATE-TOKEN": os.getenv("GIT_TOKEN") + } + response = requests.get(api_url, headers=headers) + if response.status_code == 200: + file_buffer = io.BytesIO(response.content) + file_buffer.seek(0) + if isCSV: + df = pd.read_csv(file_buffer) + return df + else: + return file_buffer + return None + + +def getModelDataById(modelId:str): + """Get Request based on the """ + modelData = requests.get(BASE_LINK+"/model/get/"+modelId) + csv_data = None + model_file = None + featurs_names = [] + if modelData.status_code == 200: + responseData = modelData.json() # Parse JSON response + for f in responseData["featurelist"]: + featurs_names.append(f["feature_name"]) + csv_data = pd.DataFrame(downloadFile(responseData["training_data"][0]["training_data"], True)) + model_file = downloadFile(responseData["trained_model"][0]["modelname"]) + return model_file, csv_data, featurs_names + else: + print(f"Error: {modelData.status_code}") + return None, None, None + +def getModelByManager(modelId:str): + model_csv_name = modelId + ".csv" + model_pkl_name = modelId + ".pkl" + output_csv_path = f"./tmpData/{model_csv_name}" + output_pkl_file = f"./tmpData/{model_pkl_name}" + manager.download_file(model_csv_name,output_csv_path) + manager.download_file(model_pkl_name,output_pkl_file) + return output_pkl_file, pd.read_csv(output_csv_path) + +#print(getModelDataById("d11356fc-48c0-43d1-bc27-2723395f1dfe")) \ No newline at end of file diff --git a/mlconnector/xai-server-app/manage_s3.py b/mlconnector/xai-server-app/manage_s3.py new file mode 100644 index 0000000..c6e2a33 --- /dev/null +++ b/mlconnector/xai-server-app/manage_s3.py @@ -0,0 +1,137 @@ +import boto3 +from botocore.exceptions import NoCredentialsError, ClientError +from botocore.config import Config +from boto3.exceptions import S3UploadFailedError +from dotenv import load_dotenv +import os +import logging + +load_dotenv(verbose=True, override=True,dotenv_path='./param.env') + +class S3Manager: + def __init__(self, bucket_name, aws_access_key_id, aws_secret_access_key, endpoint_url): + """ + Initialize the S3Manager with a bucket name and optional AWS credentials. + """ + self.bucket_name = bucket_name + self.s3_client = boto3.client( + 's3', + aws_access_key_id=aws_access_key_id, + aws_secret_access_key=aws_secret_access_key, + endpoint_url=endpoint_url, + config=Config(s3={'addressing_style': 'path', 'payload_signing_enabled': False}) + ) + self._ensure_bucket_exists() + + def _ensure_bucket_exists(self): + """ + Check if the bucket exists. If not, create it. + """ + try: + self.s3_client.head_bucket(Bucket=self.bucket_name) + print(f"Bucket '{self.bucket_name}' already exists.") + except ClientError as e: + # If a 404 error is thrown, then the bucket does not exist. + error_code = int(e.response['Error']['Code']) + if error_code == 404: + try: + self.s3_client.create_bucket(Bucket=self.bucket_name) + print(f"Bucket '{self.bucket_name}' created successfully.") + except ClientError as ce: + print("Error creating bucket:", ce) + else: + print("Error checking bucket:", e) + + def upload_file(self, file_name, object_name=None): + """Upload a file to an S3 bucket + + :param file_name: File to upload + :param bucket: Bucket to upload to + :param object_name: S3 object name. If not specified then file_name is used + :return: True if file was uploaded, else False + """ + + # If S3 object_name was not specified, use file_name + if object_name is None: + object_name = os.path.basename(file_name) + try: + with open(file_name, 'rb') as f: + data = f.read() + self.s3_client.put_object(Bucket=self.bucket_name, Key=object_name, Body=data, ContentLength=len(data)) + except ClientError as e: + logging.error(e) + return False + return True + + + def download_file(self, object_name, download_path): + """ + Download a file from the bucket. + + :param object_name: Name of the file in S3. + :param download_path: Local path where the file will be saved. + """ + try: + response = self.s3_client.get_object(Bucket=self.bucket_name, Key=object_name) + body = response['Body'].read() + with open(download_path, 'wb') as f: + f.write(body) + print(f"File '{object_name}' downloaded from bucket '{self.bucket_name}' to '{download_path}'.") + except ClientError as e: + print("Error downloading file:", e) + + def delete_file(self, object_name): + """ + Delete a file from the bucket. + + :param object_name: Name of the file in S3 to delete. + """ + try: + self.s3_client.delete_object(Bucket=self.bucket_name, Key=object_name) + print(f"File '{object_name}' deleted from bucket '{self.bucket_name}'.") + except ClientError as e: + print("Error deleting file:", e) + + def list_files(self): + """ + List all files in the bucket. + """ + try: + response = self.s3_client.list_objects_v2(Bucket=self.bucket_name) + if 'Contents' in response: + files = [obj['Key'] for obj in response['Contents']] + print("Files in bucket:") + for f in files: + print(" -", f) + return files + else: + print("No files found in bucket.") + return [] + except ClientError as e: + print("Error listing files:", e) + return [] + +# Example usage: +if __name__ == "__main__": + manager = S3Manager( + os.getenv("AWS_S3_BUCKET_DATA"), + os.getenv("AWS_ACCESS_KEY_ID"), + os.getenv("AWS_SECRET_ACCESS_KEY"), + os.getenv("AWS_ACCESS_URL") + ) + # Upload a file + #manager.list_files() + # manager.upload_file('model_backend_id_39.pkl') + + manager.list_files() + # Download the file + manager.download_file('9ce175cf-5fa8-4c72-ac30-15467a75dd98.csv', '9ce175cf-5fa8-4c72-ac30-15467a75dd98.csv') + + # Delete the file + #manager.delete_file('c2377cdc-e8ba-4cf0-9392-80c0983f0b4d.pkl') + #manager.delete_file('c2377cdc-e8ba-4cf0-9392-80c0983f0b4d.py') + #manager.delete_file('c2377cdc-e8ba-4cf0-9392-80c0983f0b4d.csv') + + #manager.list_files() + # Download the file + #manager.download_file('sample_data.csv', 'downloaded_example.csv') diff --git a/mlconnector/xai-server-app/requirements.txt b/mlconnector/xai-server-app/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..4b88900cb063890684ec1ef745c3b620461f94e9 GIT binary patch literal 8512 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 Date: Tue, 17 Jun 2025 12:08:33 +0100 Subject: [PATCH 2/3] docs: Add docs for the MLConnector Signed-off-by: John Byabazaire --- .DS_Store | Bin 6148 -> 10244 bytes docs/.nav.yml | 4 + docs/assets/img/MLConnector.png | Bin 0 -> 708942 bytes docs/mlconnector/Installation.md | 94 +++ docs/mlconnector/Overview.md | 10 + docs/mlconnector/Step-by-step guide.md | 807 +++++++++++++++++++++++++ mkdocs.yml | 14 + mlconnector/.DS_Store | Bin 14340 -> 0 bytes mlconnector/api_full_documentation.md | 2 +- mlconnector/db/.DS_Store | Bin 6148 -> 0 bytes 10 files changed, 930 insertions(+), 1 deletion(-) create mode 100644 docs/assets/img/MLConnector.png create mode 100644 docs/mlconnector/Installation.md create mode 100644 docs/mlconnector/Overview.md create mode 100644 docs/mlconnector/Step-by-step guide.md delete mode 100644 mlconnector/.DS_Store delete mode 100644 mlconnector/db/.DS_Store diff --git a/.DS_Store b/.DS_Store index e142112733c3cfbf46e1c2df7344a5382352b00a..8663f8809a1978f21bdef94a95728ebd0f2be0e6 100644 GIT binary patch literal 10244 zcmeHMU2GIp6h3EK=$$D)Qz$q<7dBKB%K}|mTCixgE#+5%&|eC=&hCuu$m~qnncad7 zu|`ca5n|$BG?5s89(<5Q4LtZ4Nqit`d@zj>6L~Sw2Yv7-Molny?%df@7xuvyLUe9( z@44sPduH~0_d9oc?*agJ6^tZ68~_+qF4Z~IT%+)DUau-rXi-Qa`9o&h8_U>khV=KY znjIM;1R?|?1R?|?1R?}(1O(_in-^9qWYk6oLZ`m%G9JoQC?|!a5h^HLNeWjCj~FQ2$sP~qr9wF=q;Lle4<8u58N(9_25+b5 z$AjsBDIudaLLfrmY6SS%y&BfR2w33HJilkgY|HbTo4-V6Kj(jTa$@+%ZB#jiTFe^+1{RrZ){5*KQ6OHjq5x1rw`jX$2}pUz;Gvkxn)tE zoEcKFH}BZ4GeR~#zorx_j6wl2|DAx#0xJu<8VqnD3!dR+?F_9LhiuwdHn|pZVAEt5 z9Qre<=TkpF1FN&wog9lNCYp&DZ2>VhZ=il_OIsN)9_K;PGFRfo6Es*MHrp$9i;FAi zQYp5tO2n6yTCJ~tKuN0$ip1`{W4`4&-hi3+NT${K9%aGKtn2K{n|ypQ>)M5!1(LdH5$u>50cBV*!O4cc;9J;M$e^!~eDgL@jmh}NL3 zWb7cfcjrxNg;`mp-72d(>+>iC@rWiRA*-I;cbM{BxUN@{Of}?wThExbFtsXeOx-OH z76p#NxLN67b(oNcvTiO%pW74WJGB&3&#`;?yYJFHfA5&-ls;9r*2C2EY}gys^XA@h z+H!6Z{lE!;APm{*1riuXqXn!pjm!3#ED~Casj# zh>tCmGGyoqvv^NRP*XWW!mC~B$h9&gwr%^48zVz5%;7mvw_suYqUAhM+B#CxbP@zC zac(A;1N#1h^Z|W?^)BZfWzLeN%am9@@!LFFo^hp2RBJes*%Y6>BCf>LS(E`ny?GU> zvx)sey{#!0Qzc3|p{`pWQ`9O-DLL?MX(AOvrG1m4sMVBQVr+sN0FAyKp!5;Q&$f z0FgC|CXV1JT9`*43jtvt4hZ`gp2Vl{X?zBs#Z&k)zJjmfYxp{zCi1>7XgE#FT|zIl z_(5e_mVI@VTp}4E5FrpD5FrpD5Ft1bY1YN;92|noK*c~Hzzrl^LAGry{LVa?U&RsR9FTo1AR1^l$UR`O&G9^Qm;uxl BAZ7pn diff --git a/docs/.nav.yml b/docs/.nav.yml index 5e7924c..1c97120 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -6,6 +6,10 @@ nav: - Installation: installation.md - Design: - design/*.md + - MLConnector: + - mlconnector/Overview.md + - mlconnector/Installation.md + - mlconnector/Step-by-step guide.md - Developer Guide: - developer-guide/*.md - Tutorials: diff --git a/docs/assets/img/MLConnector.png b/docs/assets/img/MLConnector.png new file mode 100644 index 0000000000000000000000000000000000000000..90c5c3453f79d23dd93785a5d8facbac2b5166ee GIT binary patch literal 708942 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�bAubQ9TiwR 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

VdE;l;`=ZX6Br zA&WYia&wm8c3U6_2ORchw79vq9NzJ*H>+wY6?GlroGhZa%-SK+568))7$&lrEAk|9|vuAJOpmoa?Vo%6va2MZwPrDEe@m< z`mb37fYVFjNF1XW^Bzo?_5+E!5Us=a-!nU{!2b$lyS3)9!s~$bkNplqE5SvSdyDRO zfcsL1FgPc9;ihw%XZd^<*iiR9bk~g1QU!<9aaY38*ZMW_cLZ~cP*q5{FlwWdYH@Gf z{Y?8I)9C)ks&}PtF5kPjepGR({Fxr@E7qjy!obM-eB`{cT#=vnt?4sozd}kM+)sK> z1RsPco^dMDu*Ujf6@?Yu`jJ-*7u+8B6U86wYk`kBH z`W%kcPY=_I(bdRyxVTa`DMDOpgzcW3ZD*te^nR+fKO_St-Q~v06Pz&@EW?$W5k3~< zin0OXGtQ?N<}>vMk>Q|$ryiM#?Do42JqDGp-Id`dYZIpJRvnoQLZt4MkL!#Jg-bUM z?YWZu@>?~!7>z5bl)74mA@rD;{Oq6i{A@M4gTxBF`TUou1}dY;=Az)Sz}{(3qF8XD zJ5S+1|Cu|**0xSSa8HozzGJ1q<}1{XIUp%PvclaK;tWd{9Xy>(x z;bmoKATKi71>&0K9YxuB9n*8!x(r+M+^&_or^%eGS!+@eaYJ#oZMmpc^a@B!m|qD6 zz1|;9BMPHG(A!lAnVzK2YlWt*Iv27^CxLmJ%!SQy1**6@nYA*kT1{46(UZ5PJHP`UopCL>Czd_ zGhH7kE)W$`y{~X^zT}A(*}21w{TZ5zJc2rj$kra7EvSt)RHvo-ViZNodA_;y|h7%Q`;O1&_#? zM~pE>&h&kEW&Zp7C~4$;l-&E`V5Z%^b;sU}Xa*_DeiU&nJPc)<(;|nTzx+g!kI_3Z%c!Bw5IWSt~n-+8OeKsH|l7Ft8^TdeQBpmoK^oyZTtLt zi8pD!=~6Q}`9Ee$Z2rA}aGPsk@GdW(at+w@9AeoTmcEu1+zK=H>ZAzYl!@nD3R~y) zYDY#U8?!j)9sxGSI*mtrR)S{gkIVfE5)nqOF3MlfuwEb73E(kMHr^nYL9hMIhU*Jt z)If(+-AOsEFg|9h`oijIsET@&R?JC{pZM$HfZNuY*GbkNxytmu(06y#!rQ1TcEsG@$9cmS8`)z&=KF_JR|n`5uY03oX*JZyzhohYLF9~bZR5_aF{-y zdG(>W;Ra98v!ZM3Z~e)uKj*=&v=ypJ?ESrc{hM*del-gn<1ZpUV4aoPpJIm%yfPyS6Ix%xH?9V+ zD_+w4B#TzW1*r=oRtMfwU%72juE#Y$TI8pCHpY5OoKko^tf{Hd!MORN57`%Qtg*2Z z%I!uu>m4;Ey%s~yKAzhnGjt^S4!*m+ttkHU_w!@nF=88kwnuLL??}Lv3%d}SbXR}Y z@7L^h;{c|P$vx#DhpzR}S`qrLImHnV8=ZRi>;O9Q{Rk(kDyL>nw16WF_-<+Qy15l& zJ+J0QWVxwq_g`~Zx|k(F6%=wwr>_3i{6{~9&Y{#4#Wm6TmF%vIQZ1StyJGvl(MRbqLXm+23R7y zGwlZ6<8Iktm|jtm`i&A(9$8-lWBYY87hPYndA0rEd+W6~w`L0D%-r=XWVO_}BygLASK*ECb*BPL+1kDr9t(!u}aP`zgVD zovIEKz1EGv>w$TF${@;UyTI9z3SgjksfV)OoN-hjs`#3L6iUGFL}h&3)SpEjeSK3S zT3ceJc3g-e*A|DF9E&Rk6E);moYgUbc#l8EdL0jtvwf6s7!I@p`M@pHN~%fF(t5x} zFjZnUop0ueKZawPSAucKobx14_?ReQme4Kumpj8-86&{~W2Wv4SH7V{$Z&kC^?kqv zEbJ`4YmB*5k0g*FFS8%&tn585tR28~t!f&j=%(Vg-0#+*NB#v5(d zTPbPLpnb$w{;b98K&dE$&jK9xWUZCBYcYjk);l{Yt14RVynE`BKSd6J0^kQ;TK9`> zZc;(L5$tWe)Qs(XX$-A%=Q*Mgk>Sw}_R&jw(L5y#>$>-J!Ep}zH}~YLHMUD>?nu;N zFYz*=&1-GDz4Rw^)hhErZd zD3|I`XK@EA;)NDIuLR13)q=EZyU@tx2M)bx!4(J+6d|ZE_nKZ+9l3wG+_^6i37d~{ z_G?Hn>$%P1la78w$v9=A6K~{ZaB)X3$bo^|j%%9CI=}JUmlKU^)n-JwvoBEb;t~l{ zzOhszL~&ZK{rUbDr}u9Hh9cz{=6LilYZ*wHRjrCq3fT7pVY!r+kIR+$+D7KbdZD+# zshLu4_G*dE4PRd7<p zD`WHya5G&U9)K)H-C5^-r#EUYt$%htmFG)O`*em2J{5OWk=3xDEm4`wCLESycb_hT z(qU74*PE%xT9{J>yX{tPVI%(gwH9$)pr*mD9tC0iBagdzx2Nu1ULYP^T+^?|yqis- zRdHKASwG$8HJaB&^iodxg&(Vdi#^Mhx7li zehep^aN_M!<2{J%Y5pI;=3}XTv4yoUa@d7i*EfWl}Oc%h+S{d zAlnfHGsC61a<{LjZ+NCaBhQ*c`T-oneQgEa8433m<+Ael_^m!D3i}d&`+z{34<(oN z2T2uFLlVm^nle{L_=Hh6y75Pxk-qr-)H^GOIni%~mt8ocE?1=H^6Cq^C-@6bL@>LX zYVRmsmHH}vWKRg|fr@VH9nCDV-aBpziTa~!v9{!9ZM6{D-39&s(Q|%u06TIE(u!h+ zieaM=coK#$O1WgnM*U-+l$f(`K=gFEXc*`eo2^|43RMEu8Q)f7v~f`ny_tgXh)YR8 z)t3o{!AjQ!PsNumRf3fYmuKVBL9~1NNn^V0PVUW`N(-tOti?bYNzquxeN+AI&b{l_ z*C)ObR&O=KusWC>t|EIzy*P%bC5~hJg6%u!70HDP)$py-E{jv*rd~0A<&(QMcF7De z&AZMg!%S;rG*8%;3#fEL)j)3UP#b2sZBZ0+=25thj?4t#HYkdOT^JoKlo+|7#Cc?B z^E3tJ?&8J!{%h9IID4SW=yQ$jF}j1B#>FfGTd!mylg|75wSGSY7nY;8XO?i`py#U^ zs!W|;4B=B$GV$4|&VetCU~8Q1OL6_t-v z7X)l}%(8f+lX#583b8?-ksaMiF|V&HnK>OajWzsFs?h?l0?I|6)~_!cR3@7pz*D;1 z8{{mm4dPtBPx!vPWB0?6Dk`IEoV~hdW-e=G3fRAqcZnE6a-s1KjYqYQ0`DErWH^s( z(AV(Ij3`kG_0=QQyQ?U%mlasHm4m(VvE-RmtCC42)wg!gu5sp!5rIgVySTJ}$5j6B zyy{-w!-&M4k{(nCN}G!!y|ray9cNNZp6?rHuuMCEa(f>|J>k~cZ7VcQ%gvzUaRY$w z;ctO+QqkM143*TLuz|2O+alN(NI&PVkJu*^fLUS|dz1}k&R$sdOe^WcK2;@e;1CZl z0C*D%H<&r+IJ6)n+5%a$d`_taZ!~$TGIts4BLiQN-Mr#!9_KZoYdeW*PJMQwCN4Bu zJ3h~9NhWW!MMIh(Qq=vO{K{XcuR=hreJl*mB{!2Ah<4=z_Kkbu@)ma%`WC&l{|vWr z0mc1{BNV03hhDNPBCv@j>I0%K`~QQ7GdpEusH=2V7#GFGZbpEhk2GSCc^mEGEST5l z7Ai|iP(K`9-i+W>*_&7Vl!xY%LkFcT8Y0dYBTK1DhFM#w9&+iP=EAR1+(tXDFBbRN z5tMTNTi?nko-NBrTmO}^W6qVx9>VbAH4SW+l*5>vlj2-u7pto9-F%IloJGVa?%+tb z7uVjtZJTn8Zt`trjH{lxQa{Z~z%wZxLqdHJiF|w!2_QtVXTOwCE)`ir0kAnPn?TD>G&zu&Qu=tl7y7&AiJZJT6w4wVVgEk$-vDnXbh0X5}~lhCw|| z&+1k98x?ZrMk54R!NMhM6{Po`5c~?U52xCr4`&}Tt%{Be$~VjH22-!0VYyqKNa%`ibX3?$X*ZcH$IP;Y7mfU%la`y9~juFJlg-AH=xp$^%3nQI4GUv?g z$p2`DrFQ`_zHxnud4>RbbJm;Gr^JZ)s7EsS8j}4pg($M~WjQL-v?6iCNaO&6Xyp8$ z7Eb+xam$R+PhLl;L4tae7+s1UA5|q?a43Xfp6HE_Qcpzt_*t|LW}LbKdg}&-1G!w$ z-BmGS5U2@n&wMa@n{hIbfDbQplTO@7I`LLX?z+D-4>cJ$+}?nCAOc7wmd37C@^Sn% zbl+xl(74g=$G6Y^kPtrfE%1iH>4CQGuR+spUl{+wsNnL)YmW^&_|2j@-s7xY)4%KU zPx-p%X1?<;ga4GPE3N?8&ZF}5b@CJ#mh>uYnP7d{-SR3uT#nSa1G|Ieb7>=e6)9_C03!&tN}lF(43eePS| zBB9$iCK3jF^lmiXQ3&BjAFm(e=~o{40`~=rzo={>KO1kvg9@OOF$vmvt}NmOZ|-l- zUWggSsh^!0XN5s@*RL(D_O)`{x~P_;emmo4MA5Sx>1W}eJOPrdY0Lt8><|1>tle&< z_B|l#K)N5iVdsf$IGJo(dDGLAxzUFp*a$kh4*{No{>U0HG$yr6uGE&>(G}%HGL7E< zWTxSee)e;)FeE%#1j|&`?wgLN7kA|&*OAq@amZfFAMagKD)UzWtZ6AOcqvvjW9(?W ziVK?M+YvA<<>ZZj#Xh2=X5DOv>0zzN9}i=;&PS zdTbTBB3b`XQv1KVB0=(J)e?>sQ(djvU$DclUKR5JEm_oMCdaioxU@=NMK$9GGv-ms z-xl?P-93m5y9h-tV;G9qu;xsATN0}a@43?-X*VLH1^m<37Ht9?g_pO*3O{1z;$w_L z31=5JK|j|>^DSF5ghhVD+ALnf7=`n(J6y&0lx@_(rzz0~pH`7Wfbd)hMz;E@SNht= zhp-LZ(ym9>l5I%&k8VRl#_8P}kJVyat;pE~LM7${K8I8QI^?cs?{Ka}X<$Zz7Zvrc z65ob5&R@DKcVFfeH?30r_T5+Pz)=7o38)2md3yR3`LB_`?6Rfh?UTdV{Owm4-}w%f zdALnS;kB+)8`iF7)tWRnat8d(Y-Z&tAN71;W#c;swo& zBWhNOKcVNX>98#8=dhlWa(FdvMf$AJdENvPdh#ynm{&xTRR<+tzogT<4XQEc&aF3%mP(O#cHhl&1R86o8h$KIVMkCTXx zlrwE~mA9b5%!xd9Q;v{n&rxim)%^EM8>*dFI8fJG#2Yto04197_~#Z}Z|>nUAPid8M>QoQ)ZulFaNS!e5VB z{zFZHjtM8OXFz>}yJ7$3I`plCT=2S@sME0ID+H%m`y$h7Nu>a4aaF%snwI>!Ev~19 zP_n&K@(PcD6Pk=)lOovyW3 z_@A+DN7qhmJ{R*H;60b-ycqo>QX^bLMZtn~IRZC7fI0;&#=_d-2QxGSWh`TljzN%0 z;+*!Y&v#wMpnBzK)>aFs{XGD;M=RU;h9V+(lHv6C%wD1pEw4rST6pTgAM($)=aNCK zPb|vB<8g^ghCdgcTn8 z&(2X`{-2z`=j^+vytUS!oVL&Z{b>tbHv}j{aP#)z$xyKM?i$g?LvRFOGqh%0cWTd!6t*RPX>Mx)m}o&0==BW zaKORYt6yv`KD|jTw#+c7>y+OyP-1mrOv5Vb+!KqFP2ecVi$7IpEC4U{i>EJOvV&>b zxj7W5Qi1$*`o{YsQI-RF*0QITAt_4}njG)JS8!f30XON{2<&39zN_bLdR~c3r5~VP zu5^n&KjgKlU-|}GJP)`&-IKm^Fi_y9pI8u9`A#u zdQt}0{O+>6%drk-vGkoF8m@4>>$=^acQOGa4N|gi^@xw2eIaLDVp)8EoXVi*-U%y7 zDk6T9Dr|P(vb?@qRl|Qbq;N>a!;hf>c%IACOrk>jmg%C{Nl4Hs{XCyP08BENEYlgZcWm`TVw=7#>SljAP5{2GKK4Sp5x zC|Y3VBIAth-!n|^#`gLg99FS_t39cq`)B2C_JIt9@>_8eq+Z8Byvy7Q9-u%NJ;&Yo z0V`Tw?uTjL+v~}09mt`Jd2*Za`A3hww$n}5PNV7)F6`9D{c*gpe&sk+!sVM!tC6|O3?5I2=5R1JodxB)Ii6VOAN1BV6LPTgs#eoV6u4!x(uQj z{ek7GIcdL@LnQ{KWF#kuW8_{SVvyN<5ATlJ=omo1aTnjHwscCZc{n*VxRVH(90!i( zMc+6`hLCkWezI`MBvZdXUoY!$`>o=LYt%)h#-ol~;KX`(*}$bt5u3O!XX{9m8jMj0 zykW8aN-W zr+|L$tRI6mn02E@tU_SMHFRvBJ-KgkyFQHdRd3pQX!V_C7Tf&wGVvRK@WEu^1O`Ee;3;s_l^soh+h(*rj@DLqzJe4FEZPE7jhMV@X9;vmj+-@qCch}Rz4EaSaeOW}k0zfhm`$p8HorlYF z1Wixfq(*|E0Kk0x zjSNtPQo|J0UTKvo+ym$VrU%$&3XT=d=V7u+fbEgkCjP^I86;N}L}mFcyC*PvAfdqE zL)g{!Z7C;EbVLKWh`X6-ZVnCRUPS|t;-}lHVZWj0a8KCrAF(FZzXtK(7wc7iZGC%( z3bKB^LI2CXHL5ogj-dM!u5EvJoF>1$`r7Kg0#VCViYzZC?@`DH%;49b*e1h^!47>c zk$4AF2+1d%@DW&NF1>$3I$YzCbp@2;XmZf>C^dnDGZu=7#oTk9UQ)~#w)`(e$D%Qh z@50;g?vo_^Ci-FT-{Y5B5PrzuE*-D5c#tiWhljELi_|xUcQ=f_`_a8AI1r-w40u~5 zG6hf7=q`USEnEafJb5`Q+KY2Ck<@tBajjGp)`Uo31*U_d+=JBB*gIdB#w;Ykxh|{m zeGcB2Xn<#N?Z@eLb@djCtH-0Evdy&_PX~GUk}t!+94A@)57g+Cw2y6y0e${iX?ga@zG@A1%^<_AGU$T{elK9ZEul0G>O`>`w{ zm3F89lS{>-*XBH+kC93*L{Lp&=Va*t;C66Wh#q9*AGI+OVpq0@5k0KGDN^_t zA8Eg(4w{w%nY}izu-uK%ebRu~u=QG`7S?ugxT5{SqA{ir+G_(q)AMVor7`t61ydVeGYCR@H&|nMu!?9xqQZ{2ioj1Ei3dPPpRM8lYQnF|R(3WXG z-+-b?WYiTtg=?7j4vc*~cQcHbn$R~~s8x9X_)Qorv-70~gcCvU@HZ1V4~8771b~Fk ztUTLEaCR3*A@J`Z_iUfEIt~}Dlr;y|Hm>0P z+YRa@1XwyrqG<-F4?m8@FuTxp3;B&AUBl}`E} zr{S9k!x@~kQxu|nc<8#4H}xP_azB-@+$n_|^dZeG!{}ScTCio-u2~^B`LSV0S^%@# zn&BXjM@|E2)WqMJWETAWjd4B`#bwlv;c#}1O(E?|s-zdLo}(IydMBJ^6mQoofco&q z+O6K8!wdGL%e*;~H#bmt&L|RV>(4X-K{(S8(vpk`#F-%>Qn(GTGtrlc0J$d|QUUb4 z(6k)WgWbwLd2gGP)^Km&0;F!-bJ}ot{pkCL1B+kmbL2+?8}gh1wtCHG+Lh_`wMJiS;$(tv?u*n-@D2n_5+)9qh9p(@w$7j*X?mzo* zZa2HA=563uV}5O2>q}Fr4&_?gnz9b+`K~*Pe*_lr9~Y2Bvjyva7Ji)1YJcC*8%7ru9H|d#Isjd;m8DX!vQ+Kpf0Fc`qJx6=tkIvhRWRVK*KUnI@n+CdZE{?{da8UN_1%k}9Y$Uw~RC$^(SVJb?EI%fK06RKztCv~#*pA4H4cngUO(ef*OsL>&GS z`SJG$y$IUS)ENQW3l1`csyt@_yVl|<$`902CXbuVk{H!&Zmcvc(3e#29}u=AF*a=u zqvy|t1m2KyOj15YYb)5Qchsl{e`nX7&rO|-j@j#0(Ea>9YoRXsyQ7MD$|rgLAs7YX z>mA3Qv8yVn-7M+p_1VjH#@5JslXJ8T8^ki zbKlC5#A?XnJUA1~lHZ+31C<&VsFNP$a8OU{E_N1?#pPJPJbwQSBVJg!_(L}1!9*%X z3@0TKr>W!wk)#u_8PPDFcD1sDsEmk=uGBjhCQc5gLYn*2L~|ELK^Wu|T$kSpA4MVM z|G9^|-1K}D2xKOiOAlR>YZ3@N+MPB44zM*Gj$l655b+Y0HwN5_v(FzKOD|vp(5v`3?2+0A6O5p96%Hxhu z*XE|(Axp2;b2{vum&ecTtLh1YX=oUSY^BM0nbJ;C(=B(Eo<}JQy?4BVYhe7SmJ&O( zwY4o7ergqlbo*~_N%GtenM(3FUS%QTpD!AU`70(IxYp*U+KV=hf&Zwn6WWx zwUDXHIRkN-H+^N{LQv^V{8=AnB7UidLkXBOsE-=5?Md1x2UtO5a~X35nM_3ETSr&W zhWk8MC@HpVG>5{<_<{yF)*_=5gXeT`IB(#&V5>85vEYUv#qW9gZ5~T9V*tw-4e2GE zhi=0SJ$xB5cUZ2hEtr`#U2A-|ExdgKA38y`l!rup=*R{XA^|#MO=z`vPNqu}Jl|NJ zP}GjNH4c@4`!iIT&+9c!#2**n-Ri>^s$LalSb<(J?;VdtB&o+;K2QTkcp)u{aw+4gYsrph~^$H3G<|N8$LRi07@q6@xoOe5BFk3gu_wMQ9}g zJ}DPb%`^b-4-;ld4JX6<`VWw@BfQcZ%NK*fv4pqTI0xV_R#x1Wex51`$|tcal+Xg= zP%;-CsLv2G0f$l5=4r~8)Sok}fQ;>ebMr#&`*EMujpx*p&;v~QvOo5~{xd25Yj_Vp zLU8vQ5oZ>p-KBJ6GdTFW*CJ7egI>YY;k+bO+U@$7Y-Q=9x;MG0H*HbTB{G7NWuq`-VPwW?}tV^D{(anZzG9 zqjA@Ph+yglqCRK)5;Tz?ZXtVn6RCz*p~sYkjK&*@AYwMX9Y`#bD%Rl7&=mf*)Fv=z zq6JR0Cx8&W5`4`4f3*ciU>c(sIr4Ep@C9YUNpbVP^hkStV44HkDnKNX!T0U-tcbNJL(m0yMW++H4B`AmCjBVqDtSkX>$HGB2XxVIE&1A&NEMgZ57op6mt2I0!USG$i zo1Txf)$J*U9;>cA-YnI6Z1>Z~?~o0oy4TNxI^pn$&KbZ(!ywh|O3I0EEav<|BClrO?arAA|x6KauZZ3!-3c!eg<4{#+Q= z4ozbVXlU&~k@+CZm^wAG3rKfYe#Qk>+}Om)XVE;xf*dMMaJG;=x}7EQ1lZ@Lm?jl( z@gq;KT1jxe5h&ZpA1zU{{pU2s^>S2K-_ zNqq=ELr0CrBu3t5PTotOu6M6#i+NdPiFt+nYihEyA8nkV*$5R)VLa%{p^j+kmLKl$Zu$#1ejks%>0 z9uENPcj4D=;9-~{bsOFLaDsql>J^+U{koR|jIgPOwC@))d=uNAT~x5s+AL?82N_5b zmj|^6ypcTn_U#kyyP&^M=n{1U)Bd-bmne)HfB~_tV+WXP0-;+qOVWedJ0~u3B>G)c z*y#lFG~zVYTh`^4`jt;tL@iHd2he8=4QO7^JTdx-=yC~BA)u_9;HKJ}5HTaRilGs; zL?Ul|GGKQ7MTHYE69)w80p@Pup-ZG1C$W??F)qGjGr65(RG=b6FxsU!z;7r~-apDv zguSvlKPZ$@sno;1p6J+}c;8~0@5gaRknlCW&>C3g%!eD)hAG*`9^p4G&F&?bg=6%( zb1F33G}xsssW{goLQD5mi=~65L8AEGkVs7Gc6*W)XuF%&ZAZzUG>^u9~b7oZK1aOyb&*FIYP`qCzK}IxsQ<1au4I#{`x$&v)#IECtGl_7Zc9? zb=&z5fvy_oGiVKQaQDR3IUD8rxexiVtWoXTYC zaHVXO72p>am8l=LZUC$_;z;RMDZbIoA;_j5y4j87S}zayFHW^Tg7;<|=G^}cPmdQDlhf5QWx)iX z`cm7sz7mdS-GU1Q;z4C&X4-STUMuCOHnLNk3paD@VEmRAG;q1xA%K2LDD~h$q4+*2 zP3VSVfpJX|n0)3fLBv1$Q}O9VLwC;#`PG&g%Jr#m<|U^Sa13<{`tBQq>1wwI#ro$v z*W7O4Ree1yUODiZPNY795NZ+FZ#O(!Wjsc^Zg!IjOBCDi<~o&swpFr7Lpbn%wo5U%?U( zK{c0V=B5V7nV*gH?^kx9&bu{{6xZ(GvRas+!W&H3q=D>09T>YS9NHj{R|6^LeHl}K zXDN`!_pK;J=!|#Iwxz#I=s&2FN^Lk=2ToHY??7@y-(46g+IKyPz%UwbKYnqC#Zb8P zo^PuoG=zbYcihgrp)bnhjR@0+9NPLd;-=B3t-Fq`<0TGlIJ}hC!JJxl$7J(wwlK9j z3ILQc!hS@5OGLV(Kv){Mw!_Fl(A6x-xG7AdPhW<>3P% zI0>CXf}|e*1p4!1bw>57&aZ*l=&*t#(_8sLSTeDtj(ufcyah<28GVQ8mz;TVfeh55qyM;%ymB5Jzd8km0i5@xI{|S6r@gA#iTE%2 zi7@}=%7aAVsZKO(oT?W@k9Yr{6NUR7LWnji*}Fr)dQ*cT+*cHk!jy%eRk=|#GB17N zF!{|kv;d5S+izI>6o9Tf2FKPOciCbUl-=?ZS!c<^bO}i4O$;gGYSS8Ki3hZ>va{l9 z3;=qpx$tjcO@AY3Ji86)Q)I8!@u=*Kr51DZ4{7l^AW7{sJT6RAl-hg#C?)4hK=Fv; z?sX?02p9lM1}1>a(%dfRe&!akr2@hJYU+TLetgoqv&OZg^y!B86!~kx%ApF@guFNO z^l?~!ME=LcNp8JpfAB68=K#QVd1bZEYtondjQWejz@ube)Gv#lv!W|XrJ-r=`Lksz>_zUi+ai$~IE$qTcQAN4s- zWjIHeodZZZL*yj1J@zzXp26lnnFa7zaZcs?Q8UmWQE7ySs1X zmNoQjvIRzk@w|M~&tg!~uL& zL@Nbxd%k}KIVgi#j>F|)khrz@wa-BFGU^EfqdYzMI;x(**`ifgKT-b$uxe(miVsSq zkB37d6F>}u3{kv;?<;BmvramCKDod!^sN;@IQ7E%8}Lo-;HWyeCBtnoAe&LgeoXm% z{-M{I%H#&m`olGkozAnS*QxKR{1;8{4v(Eo&`RZQAUw{eE!wu7e_j<1adzOLWFzazC+RVZc9L=G)r{AwVf|Va~0Ml(wgt`KsQpS6f zS)9ZkE-b{`SV9y*)sxl;Yolt{({Mv(BJZ^V=H7ilb?|@X+mL&YKnp(63*X=lD9q)O zK}e&Rdd{#P7S{hWpx8UC2SQ?g!W;LrUykr43?c8M{(gbrI%<|nwyclBV`xE5P|X#l zG$?5e=z)IPnwi@nBjiwi#YM+J_-&!p$-$83J6xgi@aCI4%s8?;Y%<5OV#pZ|+N6(d za+M5*-#%x4S1x`0W2Pr1Pw7UOlu9vhnC1fqj1((b)Ku|vs+T5_^8@nHa&5X{K*W_; z&=+C1UBE?BnBkD)kKF6$P36f4(y>HsAme2cp>F9c%B1Dp0<*u^#~z(PJL04%m^?de z07H*~3y_T0j~~knNWkAe4i3gfyMsK%Za~PQfwpcEc}>6vGSKK?REh)sk9UYkT_$lC zede-R8K;>&fRBZgYXAqNJh%vcSHd#20c;|WvzW9B=k@Q|mztH<$k`(jEYqdq0DQ9M8gf%)NQJ<(nEMf`aj})>p7_;Ch2Hj&+P0 z0gvT#I#@4rrg_E|XV7Mu59~KGFd|X-2?vixmCJCf?Kx;C;S#erdKTdy4UoYeGLRY0 z%~=>Q0NRUb&}=`9WA8nR-;j&e-HYE%KsE$!9ZSSqlRIve%m zF8kZhU?C$ivWFy$rDG~n%@D7u2KW4VPlDd$q%QE^9~i--_xQ)!Vxf|?A!%Fw@%@D9 z(ti57FQ2J{04%-A4QJyBhn~4OU!#L^DI#2r2in!8yys%4kfrP)P!;7MQ=RtC3!vxb zO*QK-86?~{!Z~^0yf0Jvc5E$Nm}~_im(0s!YR3NE7bYGPS-d45Vpo&CMDf}EC@r^I z#^tdv>)<&(;8v=xV6cPs-HCdBy!&Rs!Se9xNf*ebB=plRNxJ0(H><}%V3SI12-H#L zP7{aQ_oV&GL8+!VOtDhrOm(C~s}!%F6UN)eY;?syJ00X<@Zj#UN zzWnmf2OWfOF}^6Z^N#qF7?U#`*43cb*+16cX8_G|77LlvW3=GT;63RpwvgZn09?Zi zDcdHG<1FrmccLJMfy;(M?()I;(BaOvRdbp$88w$jiv{fu6}}_@ zn)wwV0S@Kt%L^C)NFWE0yv|j^0!wY^(+0dQh+kbPdUS%nH!;v6r zhxso@0vF0)_`fVemuC0L(erm0Mcv6Xnq4eQ;fG0(SG#S;&*1+8N?K=qV>Tjcb(1Bj zTgW`g@Kx~1Pt*Dmo~O=zYBk|5zYh)b(1TgbW4wx{@ZQCi|%#bxSYnOn2LA}a#3?FWmtHm_jbiHZm zEBt7haBiQUp}o2bZw;rhwnQ(I7K8i-1{y;uMS9`9^N4qTa9V0?f?70dJjJjFdRo4# z^OJ{6%^aVm|J~ejggbFja$;!vbMN5VC=|mAx~cEyP9##mDe$|+qS7Y3L}jo4kgTVX z@`4c@FFYNee^(tu#Q0SsF|jSXhA1(osq(b7p+GyO5LePiIFv$Y?xy)ItbV<1EpFSk z_m{1>;BDh&lW17`$>W$khKYUWpyOZ&wQv>V@}B}ixQ;#sER`S>J4<7QrFhSVqd)!V zikU<=9Jsl3gQ;Z3D&=8D_n&koZ>)ag0`1PrMQ20Fy}NY>G?+<~9l-n>Cq2tgA~n`&vT%0=P(52pyygzGcqiHWydN1FsTytkr|TXrfJIt@cS@I} z0H2GOb(E0jN&+U~*8pIzmL&>Z?kT6Yj~d4=q_0}-h=eXm<5#rPrH93i{{K|#W8_wG z#(E~|FL7e)qaX2zLuvQ;z0f1S7P@I?q3d}}{hvWIk^}pVU;+gTWn@NLiWUaZzId`H z5bgNrfYhu(tQ%6NuQRV<*1K0nfaaYB*^v)Xn%>t`Fuu={F@PTtjG#iG8Q*)X2@cvW zcxK*{`=1>J^E?a%K!K^pO5T&bYL2Gv|&!f*m4{#%Bb6GN!{lv9q$H!++ zf_w%?&1%%6RyqQ`Wh}o*ug5hwbB!WYrv(>onq^trs~lRMhh68`LGte{{8JT0ff14_ zp{k-9@RwxTM2%z9S|Dh^NHGaW0<&Vj`hv%L)tc8>`z7we`gm{WA=BaePZ8{deo@Q* zTHC>2YwIkks-#4ME6OnM0fB5~r#N(b{o5>(o=O{5g#x;yWaT7wn8qq_F3TIG54nP4 zJsgt@UAOaP`o>?YHkA$TtNf{;Fdd&118^^wgTW?G>NKQKO+l=A zSxT7e^@WRY0!^b{b{>BVs>h}Tfzi9vDsUZXmYsQe;U78Txn4sUN^P z1<&_-jcK5=aqRz8Hck_&7!_qcNQMHQPQcF(PcoPWjA_5lOSx~qIJ9&SY(`u?))P)< zLYa>-6CNa>3nz(uL#r*M*p^D3Rp#u-OH{|2nrY5)^5Jn@g#_m*A3H=yQsFLmfSP4`d?s*k$OXpd^3Y>xu z<7H%B0fN(W2=u``K$UmSf760iL}&eY@17^jp$YgZknK9X%nV+#FWi9mkNcOH@QIR6 zU|4`}m2F<>T-AD6-YW_6W}Q;fq$sHN8$&ILW4#WXRs?9fE&Y-BD>XFI>RGR zJb+KzE_;Oh@1aOS1S_dv!&tk=1ll)G`h$Ug@=_w@nqj$#!XpV_o!?XYlQRmEJX&96 zW_!U0nQtuS6b3v1B3m0j#W^3PD?W44ZByg`5r5MH=F9H}=hvh)b`6Hyh^sZd;TwYa zN0DGm5d#Xi7+^M}9@`n_kgi`Dzq)=})nhl)6k`h>DEQ3igFEBPoiZ&h4sL2*pLV!J zUK8C)WSbcEYcl)}(QJ!4Id9nG1`Hj`HR5nUu`!H!K-GZmUjsZX-jg7Sw*p1MbZ0U( zhW>UqCLbnTO}H#E?#mV^KcbJGH=q6rnqV~mKH>%sh&ywGhxk>aETki$V?t}t85X;a z8DE4Jn;!3T-#mTngJCJ~5OIgiA9gHVc(AS-{1~*7^KIfZMaz$BI+V8SOQmk9 zh~pEs-?bv*SFM101P5NPsA9(rcMnk4@`QjIuoG|`7MmY18ry;Hq|O$dP#~`Nq?3r0 z2SF?3Ai0^|I@^4MVCAJM`%_b1OcJA|FGu8by+{?xh4Og+1lch83tN>dOiwgDL1gJokJky ziHB~v?Si@r@H)|H_b`QME-};+Cz@6u=9=hLgMc0_*WS)gs%mJCA91e>ey_Op@K8?-V=1i3Um7pF)Fs;q}P%Pf9urh z(Kq1vV0oR)c&W^e`!Yr+^%w^nII$3?#ZSBqcd3TNc^mG&NpXM|!0%U$qtH$wokOGD z>DfhyU!cE;GImb&fIt&7(3DvX?neY(k<$^9zl2bjB5OQhw?xY{QjT2YiBmBdy1&nz-su3(9UtsZm*}~r(1PEpY@PJ$6 zEGltz3!!>w4a;-yVfeG=ydJRaiLq9h@eeR^SqeHa18wQ^t2V~}S{_Dtlf!P;x1|Om zN=)~&$g#h0IibW?aS8{85Y%1qu!_tM@5h5>)0Z9H>g^pr)x zs)UW`mj_JlNy_HjIh8|1QfW9Mk;id;aV{DNL$yS=e!6 zWqzqAlR8!qQtDWe$hY(NpYX!Ml&NogtVOeKy6EjhBbDE+!%;k3s;mfN?fX)K`vj* zU=s2!k=$4G8#Qv3mMHYJA>{JdI|#SWBGdd4<8;gi2N4 z%yI>FG9^`k&;F%012m1}cY&uVRm8r4mT@NYto_Y~pBvzF{K+QV`hwg2=eEqpxd|t1BtI|+;k`**_PNZ;PIY2`smd?>IvIS&tfHS$Kp1G_{=jO za%(#;-q)%~^>KN_J*i6ZY7qt$&!lRXz$ewq?+S*c8+3kgy>S<%P9ntoTH1Hu!2&w< zFBOBAt`7oL2K9e}uL-?UoxVHfyP@>w`M6$4&dIT;ez(<~rSbY)OQ%+*{L^fL-Fs$p ze?k}}9GA+m8^5iji&s6*-2j?pC((u9;QVNf9uSWA4-^8dCW0)F=ismbsFlof@EnNN zV!_8&Q_hR|4$d&t6xV&mEZ%b;5G7wf_N#txJkOL#&dO(6yGuCYCIC3?5|JPODA*%!{0ilL>2QSpI$|vE zUbSZUyUD3RK1lzZ@b|{PahlN85ccswW&V1pch9$hzo`}K#;uYTSv6{nU(3pwP!M(K zU?f&XM*f&8f41z=m8!5(> z5=BxAJpxR?Vc&B%^Hh(K7*i{P<`v(Sy@MfjH3SSq1sIifw58R6ovhbV7_OQ4Ex`E` zd(1cw<>TpbPn|z>xg22#{L$wde_oOyo_7xPh523v56kOmx94D+B8cA6~IUt#K$*h^3%cfvGr;bsZ&{xDBv zT<*DLZEr}?sbj>)e@>j{B2c)Qv6oiQP_Z62+(X4yBqgxTwtnFS^a@<2H!U|%lx^e> znxTBk15kQ~CM;7dMK|_ZND{lQ-nX9K^R$K);+IFqPdJ?X+Zcq235p z`K$j~%E)F~DBHgK|1?Xf)Fj6AbW;j1JD)}Po(KtuTff}A_wn84;4e+;Ir_DS1saSt z9*Fq9QqsJ-=(A#8s_^KUL3XS#?FTZv`S5wVq6He;>old%amC44E@%_BaJz#%56!Qh zWQKXqlKPWMS!D9f?6Z-@8`kl>kOX9Gd4ipO%;RO@>=5OW`wd9i!1-JSZER;Z$9WJM zb-3HB^o>AlVh)6;P(G8ES%Bz-fD!J`E@BfCZvQB0i~0d6OZ?9^=o;kH?Oc4}h7Oq~}QVWB1g1E^|4YZ0PZ z!8wmK{%v>JOAh3LX1)CKx~s`D3~Oq-6dEO`|FQkDPevzM!)11KA3?S!_x#G?jR@{k==i`fg zUA@;7O3mvo6o|RG9*#qH;uYYak_Ep&#zQ0kScf*QLI4SZVfv4$u!iH3Z9XBL#-;WB zfSdtp+XX83-JOX40vQU+*nT(}VxgDgpOm663eP^Ol}ppRa2T?ftIEOrImUq^LJ=E?NFOI57`x)tmsi+~`}y2fv3bC?K1lzmBu=3Gn*{N$vb^U5IG^q^4sDeu-HA zz5Zvi!oW9k$Xs%)V2DW-1=)Hr(1dckTmN)*vaAjezz&=fk9_78|AyH%ry|MPsKLh;03cZC#aW&@7TU-QCm0*)X5dNF08H< z@ZY_JckxDr$2+NvvaziA5m5K$K)yleybck+nhm^Bx^2O!Lof%ao_m}D&?Ctcaia~m zn9vSp$Er!Ix(n)1!m_0VtsY%Lp;5?xwDc7U4@s~87=s{CVzFc`WSMdOK46%7mL^s0 z`3+PWIdcAloiMkiMpLB$w4>lCR7>-(N(2d#{3RD}eA$RV59d57?cd}eFL+-bZ|-vc zzSHPXWBrFvCDINvCU7;63<29GjcEuE0g->p)w-_t&vV~=sQ8rkmPdPJwW^(o0%(TZ z9xEOr%LlYCQWJzuN3y;Fc{lxS`F#exk$u4r#>OXOBf< z0u**-Y5`dnTc+3J_`1j}V&)MTjWYCmYQ3B#FM*g7)rXOETR12*{IWo)WA4o=WDe25 zNX-ng(r3__YA28yLw_i?$T&=}37AdpLKD<2MW^1gnLCqYdDjk*S~plsVhrW~6^@HX zEwXv#5@=9fS%S;i-!8{FzX(hLzj&?z$hH$pQZ_0h2^fU~ofFCJDsww}9q7w-8#Q?N zleJBO^hAz}q)Kd!K0AR=X5aP?wkntY*y)coWT{tBSM_G|$gX=?P!^v71nb>C zIRf$+3fp%3md;tJwtX*-uqw6Sv?S8IcKo!6UdJL^7$$!&Q#G14-)yum{PFN9Ai4UB zHwF(vck0`j7&#Y{vaq_NVa8>({U5x54MTv&I|l!a^(Bq6Qy&IMRzDnA`&YmgT80+8;BsHgl*eqBP>d- z{lQB+;-e+82V+rMcj+r0Wy(X0j58mQ$Mc<_)pROwvpd)!jeJC&d-1gQ11MiR=gB_^ z(7L!$wf+1&;7##x4)ZCR?<+b|16~_69CSqwKm%6UVEo`zL25maB_h|iue44BQb$dv zaNx;NBgHt8P%U&+2cAO6YHOG!6vza42ZzI$Dn&8Rz$87y{Ao%{MTc4tvi$({wrIJS zgrB&KF3hVMQlwb`aSh;5YLc#?LeQ^p&~B}{##pq6k|m!s{}M&tktv(1W>7wmg|n;v zogH?O{vLGyQ$`AL#ZFBG<7o4380{qW9eO;2X0kr8xG=o2g}ZWJ?i&pp-Jn1J~Hef3}h`8lJcog zP-TJt&b%*AqU6dg$6d(k46ZPfFtI2vnmlKMe7`6UrH_g(V%miz(iWGQLxo z+G~q=tt6a>~Av^%Y09Hq~Vb~+on*<_A z#Cy(AlSUV6s6DX7@lS5d-jW~EGip>wkBsid_*<7MX>oyz+iUKravYx;M$&W2U2GBF z5fsiJBC>}tD|$a}zdYtvCyNMO@9tiD{COrLb;VS$dz_BB8J-NuzaH)kx)a0!)-ZLa zcT&am>t2OR6!daAvABsV%PqvYEW7s=QL~&O#~Cq+7m-Q>0-Vj?>%UK_62fzw2~+hd z>I5r-FV4P@N2b!(+Vv5e98o-Q7l;1O*|f*%rH@BWe4nE2CkyztK(YUboRk!lVLvh^ z+&C*xHMArg&p>YGiGNE}xHA{Wb}3g%UvZN+4&NMi?#sTF^^+}0m|_49LnsePc{1&_shwfsH_=?E=lI&!P`hZ)NcpXtw_E7ICm zwwts@;oau2sDAB3^N5kJt$wxFzJ|RjIJNn+;v%oLMBMqGkG45ExJ4YhBcr2*D|ES& z@|*~cq6=zX@wDTL`dB;mL#_9`=nKa2F^6}xil=Vyyg)s1%>2OD!6*DTL{+NzJ3 zl)OZ>!3J*HdB5?>*M3%=+jXlfhlISvuiLzuyU|Ef6u~ZaI4*3)h_YgpE6#3YvqU=& z$Y8pC-!C+hDa?1`x@;MS^AC$)meQo~TOnZkry4%i~l#;RS z`cdmX5wP}LB`Gudb!+M`tLCulWBQ^OZYW+8qKxB*iGl2fmr0+gf}LhBw?#bDU{Jl~Hbh zxzc{~714;Jcqe^SVAIloz{QJ8SIW=yvkjI@`|_CDcnZv&z@;>qWl24k{!ZSxLLsFs zL5_Ii!*YZ+K!wpW$Qtwdhtl{$(q|5I?)w(GUK|UGyUBiS$iqs->@-pd*blGZAQ=Uc zodl6Z2j2BQdQ8Vkkd{ysS*RKH)grqQGLzDBDPlWNc(|s42X#!}NCMQ(PSnnk9*6V^ zUhe%ucv*sQ9>q&&ics10f<))|($SX~{u=>wrT_{LgRjWe)qx%wUnJHR=J%QOY9cp| zqy)8~rRFf*?wCxtG~jz>01WbQ2gTo)21_6gFUu$^H?C;Xtx8RPa4r`vFZPv6M=wgU(y}33YuwT?EUfQzWe=R90H2AsW^+)n- zS85*e%R#`|p07)X`%f?zO5GK!&WroBo+gn7qwRlRMcVyf8ND$3g5%7V+(IH838n!= zdj@MfZ2h}wSUTPZF37mrO?!~F@VAhe6&{DHPJl9rf;$EzSs%GJ0@9-ay$7p3zbG@w z+U}qlz|>8dOQNia3LXGbh3>4daPBJ71sRq2eIB6V9F*OzEQMGHw=J{vAk{OvS!ViC zF~dXtJ7(wC2TZKuKoD|(K?uaYK$Jgqj;Wib(JLh+3B8B_deC*;e0s8E1@fi9V=Y@n zIl2tjH~1-tReH(5tnPLW++6LqbN+O9u!Ud2*7dj;DMyW#{C{ee*jPZk@rz}BB0_M& zp-iJQCez67BIN0Htk}K_sO!p-ES8{0LkLyQh)A7wX}75(6b!^d;S^@#Z8S_uvy={krHLY^McWn$_^Nd8Hg zud$13XXHx*VnaTy0Bd=;=PvRxOOXA4S?A*fO=z9tV4Z!KV4dCV3%Mg>>AiPC2-rj#yQ8EMz&rE69*rSp^Tm$lKKudW>FaW_k53_6 zA{)T(2dk40qZES4opF;lMlKo)Ez6izI>#*@)ti7kiT<^9p#ND0+P`8h z*kOA*lM0xI@&OrB64y;z!mn?11hL(U1RwIG@su?qZf7T&(Y zw9SDQd(a!E6muixpn&S7QM%$$9<7$n)9EgEFae~S9@FL0i9acM5}C*cJ6dzP##X;i zede0(A&`mnZaaAzYjke5iQ3tbsDZA?{AiJ2%Io>2{6t{`hv9Eug!>DCZdQH*q7-z; zoXv!-Jx%Cwe-Oz!(=-G4Re2a2DbvjfgFmbly?jUvz&)CPT0#`tj|R{y)s?FQ;BOBJ z7gZx?Y#cF>%4gvzB{z!!h^aVCws9XofR!h-C(oWa1&DE)H;xl-=8z*sf&lo}PM0r& z+NEym%#}#x^eZdsC=;k4{FCppjd9S0atNCC&kz2TWd`ZC1}XivcV&1JZN)M#ei~na zn5H?O0T_}5ENEI~2y56BJ(EGPF_C^lH~15lTiEWxW6=N$x5j}+|0i;qXgUX{xY4pq zz^)D0VjUn#5(E}@@DV%Q5S20CRCs2Wrm14~KZoLP1^}o4H9(N)t9O%Pkd9g4UyRu{ zr?qlvSPo;(mU2SYA5Nr3swCcw^TZ zk%;*OaUUTk%u~^DYq^JLMdfM85$hPLhS_pJsThcCg9BF94P_6TeV>D1Le%res?#F6 z7UlH^6v(sKbaB+x&U4nsCibxr?aUE>X%RnMV*|E*mN)S(a<%n4rEIFNJj z9B1o2L5RAYUAUCrq&y%97^J8mkgWK;` zsyBz<(96x$k@=x{bLpyg%31TgOqVw+cgnxJt*6GXeiTjgcKcQf$Z-K}d-i5vZLIBO z{6xRVX5(G$8OTBUZ$0P)DM0vYKh{67KPF&O^Z7I`zy|?7zAB&hVo$Z;(uaLzs*x_~ z!KokDZ;RHa4i>gIft9kG^+_lamtj8>Vy|?p7 ztbGG@5i)VGz7dNrd1RWwGMJLZs~(tJ{J;BP_enPa=81;;y=pJ;iCIiTwm=TJ6-avy z?&AeYs;N-g{heIP7Hwl9m^?rT`nV}@rUUBB4n)uY_Y>?QJp^0s{cAvd;B(jT{Ow|Q z6ls%(2e8OZ+6+Q@zWxMnp z?lSnSf48Gs`P?Gq$J`Z&-I!Eu;^P{B^?ZbW|L9=KdgoZ}m!w|ss{PlEFQ-782-dI% z*`J$tQ*|H#A`HQ`6uCv{XH!0+y%@Znr zSoRBZRQQcKnnq!0l6P(IsaqevjOJnvmPeZ_nts5P&?cYE)JhMCJ7IDOUdcXm3tZ(-hB!& z{r<-POxywf?YBoEn7AvZI128Se{zUK|B_y#@oA=wm!}L&XP&1;^(mL*y2jF^?iCF^ zRNa32bK`pM`H%E~Dt8*;dDrO$TniU}ZoO@qhC;sbrp0Qy!;M%#-N>J^$dfb{EHUSt zOcVe8QiZAk2R#Mq9ts=(aAOd3W3w%{-zG+G%9mHhiwo}hLA;dxDLMyU)Z@{rF|IfUOr+l4Se zXiM-Z`Dj7V5!V&z0%K9Jia^U?pXaZl2KXQ8R*A27-C1c?6k}m18nzB`Ng3!MF>xN-;*&6cLmBRAz=BCmje!fo|^Wdapg3Bom} zFHP}%cMZ$MsmP40+{=!T?x?7YvHn2^b-^(j+1&x4Q9Q)KD?^)^uzZDv6n;K8I-Frg3PAl|*@7Z*o_r-`92?hsqh)ycD$(WbjutXjiI-HlhRU-K1e>I zH0Zk*{&h(w4cymU7-Z_8(}$jz&)KrW|N0>5@U;$62dbS95=nwN!*QAZHH=PEK3xBc zwKsvrdTrarOB6yPB+^YJQ$nT;AxT7Kyb+lra|1$(N{VEb43#mFka>!z&>%`Og``qM zlT_6Ixa_8PKi_)Z|N7Rq*0c87tGyrFegA&fd7bBR9>ebsQsXoK&e_3v2ZRs*1Y`>R z$1F?jYxlc8q%stnq-aU+dB)UJ2grZWeA@*VfYI zI<-6QItl+xV}bnjFSpX%rzfl(uur`VhcWzWqt+$MHknIpoAYBuEpkxsMaM-}5Dy{5 zswJL1pT0u40QzrkDcfTKpfM0*a<@>pPsRe2qw>K!42^0i^a}cKYrnZ~U^#Dxdm?lW z-qXcLT2}pO0x0UFGktLUWpM}TOnv_Jb^pGtYup}P3F&-R)riu`Uy$(R8OglG_FlHspl zcl;SWDOomkuBwx0j|{GMVd*{$g7QFQFv`8MXG{UZs3fv@n3-Esw3z|2mYp_^#h?prymGND@vN~NRx z&*!j#rfKJKCKIb$VuwO>s#va?^ZmMm*`i6E+Uc!-?$0Z&O^Lv#JC%O(xzX?DRlCj( z-;uJ_9Pe==JbdKx{>DPdCXm?mxW-`L6%CG9V*EbyInRs$l5fpDOlTfZfIZxM(rN%5 z3rF=FPAE~HN7nd%*5Wv`M|^1`(8{#+oZj9tLD{K(IwpD4i($uI8v59rX|Sb^2mW(n zzhSx-v*A1Wc00RoZD@1|;QA}VwsB>Ulf%^_QG8JJe~xgDLR`52=?ye`Z;WEyENb8F zw>|itD|VR2+njIS&wk_o`m@>^7Z7Wx{WwRqVHW68h>NZBH?lKvrb8b-6#FU@uku%x z32!hZtB1!=JQV>^m_y+gFE~_%rme}!!8DI?I||gjKv1uleI}RfqGkDsT}rN!J>2D3 zas5d{{4HeIvaRA22s%c_T$_Yc_TOG!c*dcG)%MJuUy=FGt2#k^>Q$+b6joRDLq>Zd{gm7F&I$5M0BUEg$Z zRcc=i`eBzN2?EjDLRJPrar{yYRUec8;*dwGC6k*{cww{iU$tZrUbgr30-p3_de^Dp zgXwB<0jz&WB;A{^Z$M7(h+VC=&9Nju8CYkC$e`|y0-Y&|0TEotsn0%ddI^4ZArtQ} z?7neHkha5BMts|9O0q zdtz|K>^ZU7TyP_7tI4L-O1ZlLd|~+$mMKa&JlIDt8{SArvyPjvs56{{!*z2!>^|Nb zTW$sVU&mR5#(nqIy}JMLN#yb^M6N9B*skx?o~@f<+i}}6#dAF0%>iSU&1d}19S$~j zf~-Dx9d7nT@74Ibz%q~m8!Vxa{ntdW7=XBFuxHnPSCrFCD|w}0V+cnH7?t-;-rMyMRO>;S2ZuA=WO5|p~gPLU}kiwKdTA1WT7*p(f z@`gC)8c*H;#C``uRPXDMu_;24Ss}@C;@9=6DmdUcDOz^(@*Kp(Jay&8Up#kTeYbI- zBjSofeey^pdr^#D3rkdqSi+X17u#0nQtzGHRNumKAYLe_5qG%gyT{2ge?y|7#BJu8 zi;5!LQ+^?E6R2`xk|WnVcFlf1PWZ!`lNi+JAWj`{OX&wEm|(!-WiWbQCc1&aWa&G2 z$q!@jkY`ribZQCF{J5~&=7f^hcX6KUBY_~O1zXU?@ENR!aa6kWTG(ZoH!{8QxJ{8KYL-l`9}&LPy25@FIW81D-asCE;jYFLz9)PiJXM^IeO| zEx>041Y*W|(rfOXn+z%%v$0#H+jmQX>06dHM^vUwx*)4Oc_Z%`>=h8CPv%Sc#Rd2^ zo!~WPAj*^AHOkq)%-HZ}i-{)?&Gs&P0x)G-ZKw)14x*v62lSio8cN_;($ZMCNga)o z-HH0oCl3n{N z&3vSPUK?7jY5jRK=H~K&Te|`i-y7S%?!C(NE!&!-aM-3nkd=#kkekwb|5{?)A!4Swfg>Fsh{-)3v`b|Gp9{43)ncja4n!57m2_*sGcEd)kn0*>Y%Tlxt@ z)iQ6KGzB3)5k`}fweu7Xv;7RGy*8T*Lv8^M8vP>EO%{2K1*F2||EzG|XeY;eB+evU z-=!G!wx&OlYkdu8;Yq8Rmn%dLdN@|>{SsYtro-a1?j&zT?0Lh2Q%~L(*sz5zBWnP1_5rw5d%W|Jye&DHf^vYlwk)sGIfP8;88s!S>7_)oVizC4u(nna$4i3HrXj-Wpaf8t?C= zlRBvHINk5YF7(VLIXKrkp9rt@doqVx=^68|X6@5z)3^6iB-7ZJPnmE2V&C$uMb&ET zbA0i^5sqP8eFBxruF15vWT-s5OGE#!X=tKZ~5}lkK_VSp%Nfnd@mGYxd&cIon;b&h47ZAk3WNJGi`%Lbd59UP$lp zz*>;|;Q&{49oHv3a6~M&wu%hvWeK-~l|m6b;~Ts#?8+P8xJX5iTji@(xW<>$^itECKRhiXApg!VA=y zZ|L+HMyHhu{E}&eaObfshGP<9ttIxFOc7|BXN?u~rkq){J~WOm+sQt0)WxWMP8o&- z`uy=Jl_UfuC8^#XZ-R!l_oD}^)r@CfK~bs69i$)VoErYwo>ROSsQ0XfOQ;-Fe%zm< z#{XQRg?a=1xu%&|WIP{DG^}J7v3k8YvBJr%QMlqul5Bh0_w<&)_s=C)-;p0R3e>L` zeWu&UqD{#n^Y6&;(7>NT5U-RP20-?|ub!V|vM&8z+=-c1I&s#<;Et-V60v{U7KW@y zvdvpQ9)*zRSB~{J!oHHM9D=Ntxxx6!J_}#I5s~5;=IF?BhguKNN(qC?5b=^}hds_` z`?cNMBo>DEtwsw-tYi!191|n4*M)c?!M(4t>jmM4eF3kyn90IKLzeT=@qkQ5;~Km# z&Ctq~>}leC1UZ)(@Zz|Oy{qT7jl^tIT|6zHtfsZ1dg3!mM2~wGw#?GV+2}DiH5S1n zI%Qc9{NPdg=0$`^GUhyFPE(6k?V6>$GhLHzWR)kgmo!T;UE+((1gmy?F{L45>9mep zQXx{EHIa5Pd|TV|w;@HPBV~7iwJZW+M!-ea?t*`YbMz8h5Cz(?Vl+G{UcUIz0^!`f zNqfXeGD_nbV?233JF;#;30;%bzNfu1(iHYJYw&VipKOf`C$U6^A0i7M=bxUw<7RWn z#?>Ut+JSv(*v~#xjfQRQ9jjrkLeT=il+|4s|J=-WNp)X4b~W$Qa}gDmvTxLMel%SX zx{WQ(^yCen=D0gQn!o08oj>&HO0Vfh{=Qah*aA*Inaj|)4i!PFCV&?XhyRG(Xa9=L z2H)>i3V-8CDDR!yi!SoeMS3#wb7qcL) zpv-C`Ss1IjV@l>Vl^yZD5^%nwZ4UugsmcMeVb|G`VmWqU2ax>n@Dkgi^85(qzOpTHl7rA%k?bDWI{)o zXYo|t_ab~JVJ2khiGcwT3xV;i>1u_!bLT+;!Uqax#s-S}1Y@yO~9ScrLdwTz7 z0|I3soeHnyn(PUDOP9x4vvyFwQE<{dy_H8Wuv-@gnb7wDR57M z622%yEpnlJWZZ&8_qWv#ryRnx=}l1UA4!iM6~kRv1ecf5nDtZSx+=N?umjMe?ALv;bv;+pNfSXa*d{<^Pv`}P znji-t0Hg^G3JJu{ay!Rygtl_;u#VwV_k|`_clqmRxEU8PEoF^Q=5&I8*N$^bo0v@C zid5?|J^MZ5tA3VpBsK53DNYtAIazT(PgX+R&9Il5_7|&S*)IXO%-!1#o{U6*O8m*?QEFQ;c5uYpxus4{t=iVbb^GoiEZn*ECdn_H zAr>9*a_5j<6ly}qflp*`aW9MgHX7ZUwbAE#c{fAfZ4ZHFh+d@xwL&qlm~IEz z-^3>o@edu%u^um=6E4vl?x9*@)9{Y1LgBO|b@vT@>Y+(9b#MOM#5{O}2tds4b%@uA z)wUnI>#f6@an^_&6ib99ex^&Zaed3!Ndb0Fd;N4zi-PyIEJ3Q62*g%ug?swb%a<(h zasz(^WW?^%D=o|mv^kf~lc8?%mwhsu`-k#26{hAnDSAE3c&;CLyqkYN-qDemj8-v8 zQQ@`jEde=`zA2aVCi)NmhH59wsb6lqI>QN-7w|2^tGE)qD5o;n?;LfRc}BU8Lf>C9 z+3Q5_3c1XvmZ3S1Z|WE97n-qkA4VI-TxF>(t&sQWq;P5^#vOZ4lq%AykL6r*1 zMv{@t4CA{L6pcFXQ+kS>R}zD6cMjzkS^uo1m!|M5EPSdmVK`vM^;jaguKpH8265P! zNhUiMkIPXZP~7@0qUSV8@oIhj?nm47GSU`%Z(k?4Ny`>5N8Hjkcg_C1Icn<&EI8j` zat_4P2SNU^vX=Il;)L81&&`m+1S_nBFR^p{m`6R>=V0wXN(ehuXP(vEkR zHtc1+1DswM9IbZuv(JojaR)fd%W#QPt*KmQg&(P19C?vZOlEgHH8|Z%!LQXQ_2|z} ziLhUFV%FhrzDY5yn6_B?;E8t_`1^=7li+yXwr3Mv%l5t0AL9=;yChvHbj1|Sg?fmD zJ$J+R8+zV(B7*q{59Ia^lC3*u5qAVM;mL}ATCrYbh?J`b3t&U(HD=Q~Z;|qal=t4S zi5m-g2(V-8wMMh3zz2%Y+kk$E-3}UcTPmixJx{8(YD(p(tLg1CD>@&uE{Y7F>?8IM zlC_rt6B$x+X~nJ`(EEC@e0IVu-fDJsrM<<@^ZZ}(EXwYCE-lZZSX|tpsatUBIq%vH z)A^0Ey{kPB1xKEGvsJC2;nS9JpNp55W837ddgu33Yg`{x_e1y;N14iZHawb`^Z`A&6S|5Et|)47p)oj+D&op&-BrjLC<|+ z$(IusTx|bPU5&9`M81A*^8j=LB?lUq%`76*locj!e1Wnq zD){c#ajjxBiU#6Yd#QzNr}Z?W+fnWYP;YVQr`1Xc60cQ^`$ zYG~~}<8P|97~mE<%?{cn#siLTL17bb`k2Y69aPTXvH!-3=bJ*!w1P%GU+GE`+kAxE zvG4p5PSf><;`c18(u(qJh31;{f|XR89|Xi0I=UiMnRT;Qjhqm}CBeqx;6QqqAiW1~FP8kXjp^^rH#(chSjel5+r21ZEKgT> ziuN|jY$21bK6Vwywk0rai8N61+8KeMdnKmi=OMS1@3>SY*iy{rLTA87;@OUEc4^0cWu zyM=KIcC)gpFz4$WWKK-=?9+zf{m4hiUDEo(S?JU1IVkMU)PqGS&H~?}Q?(aFv34%b z6~1-x3Yu#A=Y<1xK3oFXJE$Ca1&8@v1bEJyk*+}Rw$E^c(%ZGJEN0I7-583O&K21!ae;&xd`#klG+${y7z*j~g$~ z@h5Yv#y@lHPwZ~M2M=btR)ZHexS9bC{L9v6fxNY+H6^)8z!9nA)QOc;{*~cY zlPj{@8QZfqhA>2AaMyl(<=$O9aw{Ns!wG6olA+^!jds7L0uq?qcYGRmGjaQnKLq#u zpaoRSOZVS@qB-Q+S1FsJESL?@U9{(9tTkOkQ>5K0N!t07XcSx$9Vvq&S58Ka27eMI z;&EQ7!}jYNeDmfXlhpQ$l>BH5w-|#OzXQ4V6xY0jT_^gD_KO=A^c|$cBtI>=?bHr) z|2Ap)oFc~MDt<;^W{y%1LY??ZjtEQZ=dDq)iEU;Xl8L^BQCpz{fA}{3xUx(=W2fBC zGgq2i9Xnm@-EMSW7BHB7riqdu^Hxgp=UaA zNr~s}KMmH;Q&l&P7UIjH;|i+Ss%Fqm!{=uwt5hv!2(mG~a{QEV{c8wx7Ax!Cyyh!8 zueC=Nnkj+_rrY3A9lN(z2rxowiYl z548Urbj(^fGLx>${3A_Qppj(sCL~&&ehz79cVaLhj@Ic)5(9IfNe^f8P?F!*FIe#^ zP!2XHImmjt;&ox|WB@Lz{cjF{4W2mI;=Or3$25hiE_bv#t0nl@Veq7?#+>ae0o-L; zcz||ODX@xh$Y#fv_rn`s^RJB736)va3!9nZaH=0M`r2|{wWg>t(YgZ+K#6_lQb0rV zOwp2)QrdxmN#c#Ur%|qn9!W=X6`g&)6M#wX5N)HtW&L0x=v#Q6newE@4Y@ zKi}T$&v!dPbnzbL*u-K9`)gf(ogm+zIi5{nmWpPZNU}a&$RSSMt~A)MhpuXkmZP+>N5g9$2juwOFpfKwo zy~%j>hX|6>lCj8se$I~ckebsg1@QkWp&ZrsgxidD9Jcm-wVv!8ANKA2a1H$GN@+Ux zOA$QsZ?nFKXROMW92pAfhiy>4lH|%Af^5OYAoUe9?ev~!ki2KbrJ`m0x_T(|2dXab zx?YRWk9%*|y2pAz_D4ua8LIY`@E1{X@7%L#13mmG89V8Au1G%CCVOY~ho|!W0qIF9 zOlE16S6$5MGwk`+!TU-{%~x<;oe?x8e={ob4Y z(CaF3m=9i)!e1IvYJM%i`pKO6jnOLr^?M5gG2%&~m@6>TtCAuV$g+HW#&Q~GSpw5y zA5dz(lbo7cr@RNOb!&WfhMC0Sq};ZbaQvY59%IQFu9wd-Mg>yc-? zbXeTw<_qxFGaAt8k20|IT1!>U&6Iyj1m%vk(rkH=hlmEIaw#STVeD7;7x(c$Q)|M% zn0H()ejQ$(Q1{4^(Gbyj+}&T`t3fN@@KJy*nB$nVvA00_!9hnWfCUG_rjaBYz2Wfp z$kuRLO7C?3_KU%mvGOe&^tFH&@E+CkE;(4c8+yx!1eL zEh0NC+-1w~J++NmG(7s>Z!qkw587&oB3P=znf^vyA(%tcph?ra0VaHp7RY%Ip~dRp z81(Fe(b|Qg3LrXd=jQQIFBP5P-xt?$!rjl)h`S!-z`jKBzifNjK<^g)dbbS%I4nEB zpqt&({$rH1i$4N-MvBN>c;B@0Qr1*(V5)z}a-^|7)5Km(xyn>!0SjMDl=bo5Rr=Bz z6|x?=W8uq{OpxSdouj})8EwxDi??jr5&$)#`5|7mJwg)!+s7YlOs_mCK!xY683?j& zbm_tlcPBZXuMODXS(l4}p#mdjaJacv(C0-HDRS&{Q^MyS@I32`Ni(*iuye)1=ZmxN zU9%#Txws?P(f{E9s2w9!g_SDDL(BqmI`2nVXSTdJmLyqj69WShhs~^>$Y*AMulQQP zf0Mx%5#IWidzPn|1QnP^u@&IIw~WDrU06RBjr?mC2OwT8;@chVZZDhx?ElDN>2%ul zs7Lm)LsZYr)FI&2BP{Il#Humto0%XE%T1tr@<=$QfLK!?dxGS}9hp0C|C>uiR%Xk& z9vgmAv&8{608ctsPf_&cf_m5ynv;ZFi+-uxn48TWWCP;<4tGzN>fpUS*Ms)HnkO8u zUeq4uNh`Ki454^^{3mtx+$f=rf3?k=7aD>+(F2K7OjefxxSV>yi*R=Sri^SZr0Xpn zb;*8*W%@|VJ`#80pz`N#2qobaZFVWe!vC$CYlBVh43e|QyDug?wv)tNhX)tb<2l72 z(}^i}nyCEP!Z^n)WI|sJ7oCKcl<2XB6}#`96GCLcwMU#!s|r3OCxhOSw^-tsZ0*Zb zenv+SaMv1mk?)LY1ezy~fahpfN3=ll z6!!sPGYB?WsZDp43u7;Y`R$t1RStr({1X0XCEd={pG-cck0Pv2>$UfC^p3~eae`UV zkt8~?={1Kt**Jbyl7-RMZDAv`58~F{q#>Sam}~&>?yyiev5PtG(UOSjqcOK4w``Myv;egq_BpXw zURn9vpHkWTGR3Fc@*K}F7J91@xw0r{#rnF zlE=yC{kqVRR1?E1HeNqAeePJh91mGyzsz7C(@gVBVYU5cCs^-Qp_X2Gic>1hA_ zz9{}>V&xf!Yv0tXsL+>;bv36Drdk}lB=;=l<%7EtTj zB`vb6c3STTpGZBUeBfbt)OS_v%U-o(xw7weY_8G+Dtes8c^FL2Z1`Rd)MibFAF*Ih zbnX3~%DqL8OVVop{)WzNFzqU~X?#y$MX<_7ICn6ZD9qjJF`gEM1~H^&e^XHgmx9@4 z;21V#9*>UT$v0{xKh8Ym`QZ{DctA$i=+3ep zw)gq7!vL9txKO`(&+-xSClDq6^@tm7&@<>9Pm^ZJCSy? z$XXVTCPBWoOB9Sa7c_1XML@vju|5Ww=Gnmn_>FD@gu>)0GV>~IpU<@PLeFNHDHgwM zC8(*3U7gGnP*Aa+2L4p^3|=LzYP*-@?X=L6`*@ff-Txsp`uEYrc%Z+Lq%LY7ZCZ7V zhin6wzPREp>2}^$@6~DP!%)>4dDKFUmUs!5?j^@G?b$7$a4>i*?WVb-F2@?khlrc9zD8UbJGm7Keh!N%)e zUTA4~6+)ZIwy4jkr#bbc{c`MW1T9N{Q(*?^=GJPzraM6FI6#v6doHfF;Qwwpy4-(~ zw~DrUNuJsmUIY`qtW&K~mJF?R_aK%Oqt{bd@*YQ`MdVq9sPrLj%b~kd)GyO-u3nD^ z*u%|v5B-k!oQybe>_PIjpK(ou8JF0iN+im@jBww4J#dDprw==SwYPhfKp@bI9ozBm zyHRxv0~9mb;J(68Bu}>)fEJzn+u(G7(Um#(`&jcR z^VIbd(KTyM7QzY~T3^e=T$VnKx~2#}vtXKzsDmERiM9haG#$R1(eNS0`qN#R)}~_& z?BeZJ6=!$R<~rTKhzVCZaC(Z>%6Fi|b5LV5@4PspP9Uf@HV(h|+~`e08S%9*h#yE|ZHqq_rg_ z;sl9n&&vi=@|6ECuNJ}rsFT1@+bhuQ{fvxapA5R;SHX7dC<@r|bzeU|+;#^RGag@k zv>9O%6AglGNbKzqU5s4}Up{-%i6vj?D0Vh9&7il}ZI5XVr_IGp^@`^3NM?fl)WqP9 zFIGA5V(`MZbzt56>+~jrckA=59oFsM%<5(oTqlK1DUa+Z*C+E?>o>}qNUk9E7sT?k z=M(0*42(`iVDS{3Fv&HMaCosE2qbE&v~uDD`eXk*21raRX|7rbTzNW&NE|4skyj|C=KCfFN z9Bhn+;yGl-ay%ho;B2+ub}}uvq1qBH6ei|kTediPs~jNLst(sUn4*4#saOX15v8|A zO>E++&?p=baJNI`jA{mtH;N zjZpx?ywaNVM@{$~xyS63*ENhc4Pc6YTy}o!PoJdroPJ_cdsCt8p2YuzW5-QG4|Dn7 zPF1VO*V{i{+i9Vqo=^+`w{zZ=nWi;4X;j~J0hbIF=z`jmz0M@^r92-$%tIi9)I4O-wss2NkhP7&Hb?yb^toe&n)lWOGV6d-i(rT z{eY%$vM&d(@7(2*X>X1j!tP`vNrO*zCH9SyH;1kRH@jARJ%!!`$SG&?ehywOv#a9F zx3oZj`dR?atJ5Z-yXu0+wlBRih_d|f=|s(gFk-BStt_u`wboF*8kimY9?(6l3KY8c zX!km8MibLmUt6;R4Y?cYN9P~E%S7+*x{ z|F4zloXqZs0mbWp)CaiB%^Ia1mG*DJaG*LBUl=+xTt`x zUG9#iu*jvKXxRENsM()Yzi+aej|(l@JDNtD&){r&?obr^GiOZ@HQ$-KYZfHGF4Kx9 zJ2-B~i$vnak5#(nr)UMidn!|ma_dz(u= z<9i`mxf-?kxd_P?zI+xL%M`eMJRFn3vVqtzG$Y>qiWHfaW;rD5iB<+uw@ToFz z>GPjI5hJukNEY@OI_N)kySNA4DBl6z;DNr%a`zm8cys_Y!3*5{y4vz?5Izsn(zTQf z1v;@@TC<2h1)zFm9oLo`8>rR)Ti1%Vnk9~yptB9&L`kTu43h=uAj)5UDGmR{;Lmi` zr%28NY2f>YzVNby%K}TZy7Kh!x0{10K&LDAQgBJfVhO(I#GzY$KmtB-eC(eBhu=d_ zLEz7$2{p#$Y;cY1R7@1mcj0!4|i3lmAHlmr9wNK$Ipp)l`k{}s*{O31XuU)@| z_|3YSfesP_(%XrTClcDDzE6YhT2ga+ZQ$LN3UGe!sBXIjd{PjdYw7JE#(`6x7$Z<0 znxXda__`bCAQZ<#>)BI)z=9yLM?8MGC=M=6p38~D*xS#g!1-wESDz!n?}_W2qumpl z+~W{;+0#I%@wEHe7BZUr!%B7{fyrcWi!NCqD5XrhBjtIh;fvr*Q>9ru-OBgKj8j@- z_CFwh^8F9Ou;jmg{~Z8A*Whh@NOu+#dqtnO$%MAF#4`_lUksoBsMK&ZNhle?bT?AH z(s)j*ffscMCqCA4C-}tf6~mmf4A_$Ok9(Fw?S>Ssz5<$5iTh`zHhMmA6vvUJTB#h4 zNP+yl^LYASm>rd1cATcC?IKna%&r>yz~WHDJkO156ySABhJh&1%oge&VvP7nW{f+! zSAaU!S7plQ_lmzy4v{UZuU5Z5m9Fv_tJ*~532IvcvMMqp5hC9j^qwG3di}D68L~C( zm)0M6E$C7E<%OP`K|%ZGQO$yLkS^~Z>ozV^&s$(mpB*%Q8x!0L0~L$~Buh(zeWzdp z4%5DkAqq7y{gLl53m*zTA*Vl&J3BH_L;)=R)#xSLWiLy#jDd7Xbi6Y}tqwFlJ+*WpUG5Zh^Zmb*kbum` ztuP6)o8Z9Xc|AZ98+9?5NBd`8f|Ih^g$AbHRbX2stXr~!cH!P(~JxJwHvDGV(j!E#OIwHwU zxsM9aI2Qe%$n63c)(6F=qg?w_dWu64ws_pNdZCeo|wG>P5 ze#sqonZZ@NE5W^B>mN|R7W%W6GTnxtgCxx1TmZ0N^G%Z}z(J^1-Jodbkdg2XNclz@ zi`V~x$Kr1ew0f>R&*d^Sv zBK5LpV8nLIVtxXDTN~8fJUI?;Mc!ECHF!686Z3H2{CqAV_{UiaQHk*6p@Ojf=!%7D zSGZaH6-}(s>l`r~-MHzN^If8>SHL&*JWyoa;T^9a5ZMbWyB5?w@lJ*{q2sKRvi4%5 zmbuT;hgg;yK?O2rS?*G@v}V@$^9bRTi{s-SWv}E#Y#{tZ8bFb9y@1Oa4!0oVl>BBGtshU?wEgP9Y z8nNQDkk4GZ0xl|9hDM~UKTvf18IewGaVy`koHw%6^K|{;qx1GI6igVX`@E==Rw+m| z@(Y2>TlUO8MIfp%22X2<;NwlTXp+rDR-IMd#ufA@P;ney@-!9w#6_Sg8ek@X3A4|C z$4dkxs8C;RI46E=_ii{bWO^55C%y_ARrKW~p~H8qPt%Isfy#}w)x)^;%{fFLmki`W6ukpvUcFUq)T`B+n9X)=g0a1SYid| zIlI#ds*N%$4~2Lh|Lo~r^U0*_oX;Z`I74%{^BK^E`cWJ~Se@C~b}OmyM#1>g?sjO^2vR5ELy4;L`osqKvI+|REK)XDnb zHjBT-w$tgO)1e%OPC@(0y=+=tHwZh$)j*bWlup@t`|plJU3$P76nbmKB zgje0q4ctYmfZ3x+$?PwMewywP$!M(vp9}K;{WZX`g;Sdjy1nJw-onZ)#O(6NWm@Nb zUx47KYB6)`oORq9%k`N~CTK?MWj0(L!mzwfxo#49ud(D_RNTsF5@n{22ci}Hc@D)a zks(5V^9&Rt&aDaWMi(#8&;o9@Dam*GGfd&Xcb=8`%hJk;@N^~GM}-|{2Ug>9)LJb$ z;q*M7pr=?aAAp>oY^2spl&bP=^cq3+`zHBK)wM*iqj~!hV(Wx>H-gl}Z%bPbZg_@H zoQ~oOd;S}z#f*u}|4#U^hu4FLPz=w#YD0Xh!y$SXP#{yt!jIo!HFd;ppD6X>Y!X3C zfKku_o+pPDMz(U4GxWn1u^~^(1jL!Zlj59f+498YY^u)cun-?wqDb%Jb6;o2{84(_ zMYhM2$O+}xx!VZ25-eS%Zb?O_n`4A^0bj&^%HEoomNF+h;R=&kGsRM)*wFGsFwd>P zx&vw)OY%N8Pi-lXuDWkGf2!uh2~XC2sHIo*7(0EH&mMd5ty%ay^(!A_zsF7<|8rs1 z8PWtqJ>r@EPfp3fGL7k~CrXo}ir!@B+?L9bYT1gQ7@`sEvAi9P#i74n>oiSFNQUjF z#Pe?3G;ZC}@n!V7@EQrW8h#SGJ&7kO+uo>~h>bI$d|dLCM6xWN_6= zMR!4B_c(v?e6UPb7oE-^lkSH9HtEXK=91|X+46dy7e1d?ZSBsfPe&r>_Pjs3gYs}Y z<{fmt%J0GQSt#8^$$gB~2U8|jjU2xgC7rpO7&#q~u|M#(*NnX?oJR7VDUub5RT{~7 zymbwsjSpQ{0n0LQ)VgS$xlI{6X8A5~@74^sFJWa_fsS?T;zkU0C8KrEZ9)4LFD>&nLHfpYlX#xu8yhb^l0xf#ZFoj;fIt##3c=?l$zj@;>y9L=i@ zIlpT4T;A%iROT_)w>biqFrs)4B&NutUzIdw(hrmOs8F^D>@z|xWXUAop^t4zr_k~W zzZ9-#TuH1b2pz59W69CblW!usO4P1OLDS88jrEskVh)3^4i2l|(ewWuy#NOJ^N#OR zSbKj>8N|^uNT+7MJH3hT z4&L^l9hWi~Yu1y&;rOUblg5zAI$Zx0G4*IE#%k++!W$AOm-+^b2s;3a-eu8`^*i$| znRmU)w$41Gga;&{L34R$MbS#d8?N&nT{hNbpMlS%yUC-H))}y&46qxjiIv>-wB(DB zn-gyAknA$Lmis`jQvKg5cHWwEF$+ecG+v}aT{rAH|NP^eActv*$eq6dELa6>VWF_mCG*cwht=_Nq z4BZWr%-Du0l;2ErKrO9UDml^t%%@qYgbFlJu{Kp$a%cHk>3N({@N#hJ_ek%5IOq+P z+0Nj+6;PjWeEucZC&%Upu@I`*6g}3+O#1!I{TmB3-r#gRmX^#(gQhf?=duYQPH3>} zKb2xn%L^Y$+@0Fye$I9jnRrrpX>57hN5H8x@BRd_p!vw-;=6#`R+lf{vwsMbQPo?( zxQhX`nZauNq|2L=a#3buM;EDj1}sY+$=b1maFc8VcsOo3#Gh`tpA20H1!+44J2N5D z$ZwKn-4-Rguz$01q%`{JADKtR?FOqx;6eJrSG^E_@N7 zUe9x%EiI?l7&=^e^Dz6&K#=rbc)jgOKu4b(Oa2$&D9oCJ5;{*0`Up3kO9=4`6;*h2 ze|31isjsOu+MrVIa?81`Api*TUA@t95r53p8?vp3Cr?dh*PzGL0h7qmV;Vd)PVEEm ztLCsTH!pQf%so`>(QifMcNN3&7CYVKA1tNI4Yk&Lr3F~~L0p#1=y?HOcQs5F3~vx@A^HO8fL3NPq{4yXLaf!rQyF z3pBVxcae7BjOy2>wzJzuu;)(za?z50Ms-g&YUm+N94aSn;d7X^^|JI+_Ed5@(ox3w z?FA1lcMOK{rxy<}_kAd!q z!`vnkOPD>vcldkGi>{{5By0ul9MpCdA&D_3(Vw^<$n9NyqCXv@aui_T5y#_sun3|w zm@CuK<@%cI-9P^8@Xx_mmLvZSpZwpf!BZq(wXChyt#b(th>tQ3tkA8>leZ9T!MT(M73tBe1 z_iT;1SP>){%S`hw(0Ud*s7*_ktG!)sR1S}4^6S3Iza9@s6m)O5x9}nXSbp3@IyiLu z%pwu%$zXp^y52?+M5?)OX3ZT9Wg}P{9HC#89_Nup?ublZ!jI_>XNZGZFw;_#dD2=S z3=jivm>qN{T~?>wxHHC@`SHfq0>(#VBfrYr4Ia?13j_fr5aFaV*hIrI#|Q}oD;CC) zc{@|8r_O||_35>Lys$XOT&9BxX}9;7y|A&SElZO$dv$5h_tP&fEL-`w5Yt`hW0?n> zv}u?ITQE7e9F#1#WVNFfSPM>f*8JiE1ohloR{9ykyNi6_JsKBTa3c?b)#0}L+6|uy z?BvhUCZIvTmLGe5sId%$vL~-sEIQ$72}7qJdSlN9nWVdNY7hHi5iImj$txewSP^J} zn?C>#jouISN5&eyNd9>-F?Gow`FgFF6PXG+%=r1t%a*o;1)e+l^m+cS>-j34N10@S zkZ;VGnt4)va9@2g8R_G0jx(r4aSE)`j}0TiLECbhD}LYqM`jQAivPYXv=*cqU)rt? z{@Zh>y^%7+kF|a10pxNxG#aJtAj7!d4-KAkbfne5OgNTs=4nAM@8bDBl;F7<9QV|I z8}-w=z)pd&u8wb7l9=Dgvj`Amh5*q{Y-Y(*RTjPq|gwCCT;T~YV=_DM}jpgN_V zISsDiTkg1X&{t2Nm-n!ekXiCP6T=$MQ)OgMl~a@$+`IW3^x@P^a7u$}U#}codRLZA zlyjfvn(#WxF!mk6hkHrP46tDcCNyJY2sZ2%P`<+#TavC+B{4X^*)!6w!lH(QUeS++ zd2$(_s@jE1$WmSPMt!Z_S@tQ&@jZGe^M?pY!zlO|ed*MFH6xN^P2j|8uZ2RM8~w0E zq8VJYfk)oGddEVSP}L8^cZlY=?XesT1zSuITPJ|cSleV1-pOLAtZnD5s^%N#QFkzM ziaXh8inHm`PJCVpN@INL+zkr5We(Ya>0$zy03)@0<-RV;GBoWZ!_wkjDsN;pZU~P)~EO+@Q zvt$9^>rJR4%!?M5FbUla_MPv%e?lO218Syu*TUzSBrftx1;MqiAE$K`LR^BujfiDarC!{9`)8FKaKY?bZ2_R+De6X{F6A8T z1K2dfH?KHkH2JpAh5jv&_`-k!8ypcd=rMp-L|>lSXiz9;r3F3Xb1)t%H`di(QJ}Q1 z2E%g|l3a{9rPzym&nmGb+^jG63z|2-9~iT4A2#r}j(tumIDdkP+xBaXmM*E7xXjIL zJxW-yVaTA~|4&!K$RphNeI1WY9lU`VF3wZ;KEuy-98{lmBEj(XTEzVgQFI4nEN(s* z{NeEcAjZK@3f{lxd=)avBpt%w@!zm=u3!$Q894aEFl5I@PdEs~!pguRn8zi!14Pyg z?B-i4fZ1#VdhOx-HflBP+*K&lEm`<-4ia?VrW1&V;<=@D#+;ZPkDO+V~sdMOD5@ zoAT2~@*f%}Wv)B}zO+q`^DTMWpF?OT3=fF?k2o-Zsdo+EN!a)r{hTGB*?~)z*G=GD z(it~c{%5kIl%n*Uy7K9n(@&)U#T>2Srm+1^8}J(ZVH=g8gCU^ou`&=E;jES>R9?7> z>h`2Sy(K~NYI0BR)ml+#vr027Hm5y+K>B&t?(@cSD&C{igP=7qRaqgWZg5{N+C?3V z00L40SMEVPxe;=kbk`Np7HHKaK4E>tw(1INsvw(RM_#?8WoV4c)Agb%FVSzZ9?N5__! z+Wd|6EuD87>i+`i?-JV~8Qq&fKdIGf|9BL>O<9bh}?&fGp{P3N_^e?^Vj<2Bg}JB>UdWK=o9pA&t@Q3xbw>X5^=@N;bS$rYGvu; zn`?3<8cV6JWnVFV5-$<>hmS=1p-1CTjtwuvm*64R^5w7Znb-;a2j$%TIR5Y-0)ixb z^P6AYlkYE{4i|V#D>k}Rxs~MX#wESP`w@+fprW(_<$jg0esUzJW;~@8P{LH8C5m$( zfWeo+6DzjfJ^)c?GxWMe$#LS;tdylorqI7;`o4SC!Uh3+G_GBX*ZAqV*!Z;gkJn@? zl>rgc2F*$0o>H<#lkF#HwBE=?0Y&-(@?L|pYQ~yb+M(3qi`F;Y{xU!MpKz^luegx# zFEF>3a^$*%(V~n<#kCxbuKp`Vih4JI^ zD%(NYDzpf%;&aVQE{j`LKN-9DElmaCn$-C$e{G-s!%Ig1c4pv^n(u+tgOlW=p_^Zw z999<=uN8mpLSwbiM9VB0m-R)J@d7s3azmi84du;Rp$74B3@n`s<)Nxsjmf5_Z7Wa* z2b36^HX&zTEWu&snGu_|eG;WSBrzwt)D#>bB81;Ng$+qzfYSxb`C8nuYdv^1&XOa1 z4;bVp>}L0{rC2S2lm>iLJLji^OU{8hgWbJG*-5Ag?*MiC>m76aH%TuFC^MH$QO*=` z)lz*Nb?sN#-mv({)FaTq8u;TREKGFb#YKP=MxZVJs8Fa=uxOFhT7y5%eE zZ>wBU$Pq;HBHOu2juT_zMf;6{6F<6?*qxGIfB$h{)tS$Um8o>O@Trdaj$inVrGUb|t&715 zL+css+FiV*IS&&s&5lML&@YZ3s+qX4khm!HNyNi8!Qa{nolTzg_R_BFhp(dx6@0!- zlgFq@lv;4Xn|Yjv1d&3D`sRKISgY{lj2|u`S0_=r_f1au$945riEs0^X!!85^$t;j z_jI@)D8PP{Q=CcxV%X8Q;k(IMlvZIUiO-30Zs#uOB#MGIv&w&Rv`{%dE`%^HZF!Vv zsaQoxl>X`v$zfefsD3Yx(njMBxViE-_nMV~hKTu5Xf$n|%&vd7CSoRetWBy~Qc$RlbY49##Il9wV)qihTRsRu?)yHKv>gZSrgrF-QKqhi z#yNSn$l?v>uJYb_pjG6R?ids=O9BfFxfLsO)wJtML^PQ!wBHm)?FSM#NJ} zc7j9TuErzxQ!G1F6Gobwq?6t$%3(!(SIOr$6;_QVioCyUMv9JGiSypWk)db5q=lWd z6VI7?oU{ZPml;PDZi_F>yMZTi4^}pCgY0mvw7qltQ}=f}_T z`(JHW#4L2>BzRoJLL-t4Vuz)YqkbVFls))?o0w&Ve{v{-&Jv1U)&84DtsMkSf|PSj z5Bhw!J>YniE*A^vX0T1;rYJMw7NvLDx`|SljO)%E8Fy(q@&Sf8KNf%f71~`ApkDe- zXv}keK}}7xVUab z5>9^(uRSLB;KMvi|0!iJ@HHpO*e?9_*fx{l=Z;?_o+=94`afT@*h(ozj->4s%{q-m zuq#4wYTeGLW4{)RdlDzdA?Q=A2u;?i;-$vxq?hf-RdFtIND$DDAe89Rqm1=TY$ghe zB&rZgJ7DAFdwm@v{ULO9g(Yzy0b;HaLklL~yZfqD4Xt!+QlWd_`W)PugOQh{gqv**?V8uh1c|Ds)zF8&u0*^34nXJc!F=F>m>wIkyU7+*GYui!a@ta1`{L~cOv zpDxdEZTo&FYUOQ-cXPMV=0Q?9`C~`|ukZiI+Lu66-L~((i87?5D5MCiqWYX(lEny12({hf7Xr*t(|KJV>-;SQtKH`z+qBCJ7*%xYzh_mcMW}mvb2$6azlH zV4Nhn@B8GcZ82?_Ow%NSvu2@(e}REY@VLgz&qLu#?ASH#f`5vtf2Xa8uCmBfr+P5= zD{~}c?pBK__mwxGT(!x4ClmzK%KPl&4{Qlbwse`i>o~UpZr0I;rklU5s>9sf;NAge zVxs8)ib2mB-LM()XC={gmzd4d%*qj<39;}0O8NB6Lac5e&k|$^>2|Gt*ONQ!1&x(c z?a<0FYG@0;(2{@H{?+X)^nV5$&*D+T3+JpRmH_pHRt4>zf>;JOC8Me6Digy^^`Fv)w>MI=Qjfbn>CuPHq z{TA@5U9FqrUyD{!jvAn-X}qF`a^c(e$Q|L!Fix62;)a>rndW;7%&QxhQO z(L2?X&SxmA%plBo7RN_9-p^E`VPbIQU9=t(AJGsRm&Kn!qHeA~Vh^gKsU#)Mr(^rM z<(uvu{4CeP#Y796ckJ2{r@5TAd&ju7TUM1vr6P#X_*qwz4xtc8iKe;0<7&WAr02L# zpk%_eeHP78#QL+t^OHhfTTyOvB(FJI8jL)0TqFhRnoWUloTuq6-O@hThLnxBy47d* zJRM2dmDsr+ZaE2!mWWYG_z)vF`3t7ldPojTbNcN@z7`>fUr$3C$0^|NAv- zOIir?Y5k^rVV@c{cT)JE$5UGgzJ>Ed`R~c{8l5Kw=45<;Wb}%eN!4_OBjwf?VpCar z%Q!~kQe#@FoLjbHE}%F{M}ldDMdxu;AUd1oqpPNlhcl@8V4XtE_z9U*HH;{2-n__` zHT*FeUKb^ue;&`?_n@29r(i`@*EeO08SlNHvR)FH`*zRm!trzbs1aI{2Ix20puR7# zURQm#zE7jF_Hg0~^hxUel1|LF)w<}(T#bsPNS;|pmyr<|#T?C~`-gvgI`umW9`2@y z`e|~$J1ake*bt3QfnNyEv#3qH4lfL)AT~E%d*x0M8qLI?;f71D!8lHWe_gmhxHk{J zDpIa*CHn8jS97P~FYi55kyQc}k-sR-XA8Ny-urIEiZtTI4z3-FMwKzye$9j)BXKPZ zI8wk*v26|e=prvTue@I`RxGZ|qYmCMBquQzBB?!2HZ%{!l!JBi8SZ9H%8#8ln*{}mC&g z!biRhGz++EC0~U=3yi)`3t32!N-oF zl}1{1xT2WtQ?XL)QojLbXyw{Iy|-^~fyDbm=!LdBE95@@(`AiAc z5FPbm9;s)@r~!Su4=F!W>x58~=+p#NEm8eV@oXvDqDk+%_PoGY|MV!8w`9lj=5~tk< z`(72=PG@r%gGOqV?tzb=22n&u0uj=ViMh8pJN1bnPQVax$@2O5}wz4}pfYs;9G^bOpzIN#;gfwm@jjh8Ec%0|m%0hEE zOAU%PDXT5{%o!br8g&C$Iff4V-&F-6!9E{&grj^()u*%&^!m7EkEN`cKe3Jw|7+*o zaO`-5wUV?u0G>(ap(W)Tw)+bkZ9d-VGyl#e{#`})cBk8oBa@6Hs{*6pu2T&#Y zIMDsl0VY}y&!))Z4jp2@5+DNj8u)4J6=6KIy5`mYJJYPDhdu`rdL7FKJE@-noek_7ny2Kr@AwhYr$ga%z zls8gG+6wszOa-w?e;7*~>!%|Q^SUz$HE0iJH{=^-vozizE~Gzyt@1qH9kIR5%+M^v zzuW|N4$8pj*MJ?6SEaD{33zDfmv7>MYJ)z)UO@!H^bK~sUS->H1F8Oi3N1FM8H#eeYcrp4Al+odCOL>u_WU8DqB<^OUVc@YY z;?VNLmCT-%s}80a-P%`}fd|c$YSE62CZg@6**RStix+iICrNK$mC*gShHH&w=&K#3 zLkOEAUZ+$$3p27bf~i4%WN+p^jMJ>xKtHUAx6VNF(u@s^#wiP8APgAXyJx)i!lvs9 zrY1mh#5VAv-!=qEXd$QMF2;-j1eG4lS0S^BQbM%&}@?iUkbJvgJf>ovcJ~t zD%S0TL~n>98Bf^D^lo%E+jtj-Z;fkBz&7;;{BHBN@Mc>2KO!@*@GO|)mRbFVV6|lx zf7!wfK%qTQtNL!e$May?_T55&c>q*4x=W@GVh>6CBim0T799RD=NjJW>PbnE{QvY+ zdn?#>1P2&1aFdHdCkvBsl-%iYT8T?`EN&kAxg4T2oyiU_X_~uP^Cc8yzwt>Xwr)4$ z|MN+zn6YECBSkVL{H`G=>7xqsgZoLx9(wNpL74u2oKn0 zH^5-Ij>{7R!n?>YXkzSmUKu1!(C7pfpP&=DG6e2T%xk7%kI%_t$MogxUOkJl$w-%L zfo;>~v%my#QPL{$?#&xTgkK%q=1G=~_bPAW5!& zwhj5jy(`P4Rw{*Qa>L!VKoD0~_asCp&y#Ye`2y8)RZ8ifks8I2uE57v8KS?xo%+2j zc3`nx6Glc*0jSBlxKfN|LSXP47@R(+bXy}sC)XP9NFJQ%O|YrLxg?XkhO ziwq}MWs_STFyfZ?K+3$d#fXK`=M=^+kjfC?wcSM7ibVd0B?@FLG-8C26C6Pkk#mlP*|T*qFIzt#y=dTr zA|C6IL{H#MSfVFk>2cyR7@R$zJhvf{d^sZd3>x$Q7fe?Z+R5O1H!86*cidTW#S$aI zNmEFh7|hr^?p*0~(EzQgbPv${2(_lYrvPX^c2Uhog}E`i6V@J>{VmFCUe&L|sxK3yHnJL`d_?95;qTYOe5#Qx2u zEKX;%+{RUeRBrlwvn*XE%o-vGhQ;muW}zesm_?#DDOfz&?|DgnoHbm*YQf1Q0(Xuzk8J@JYZ*_L!?* z=Qs91`YlG%@4M0xGuMjJ4^k&=EqbpvyU-eZ4R~hw+BETwL^@86`~a&6bi^8G;tT+tenXB5>XMz{gc;Mmw5KG2;! zWe)lX6DmYgI=gL^zL1JU9uX|yexeE$Od*$6;$)0Nw)9m4!9&R4QI~3^#_Q-7zd4FO zeNP5cN3TDLmyt-%yVk-jC|VQGb{+Z1s#oqomvKPE&^$Z3nbWTX=Grx2!18|G<)YHK z-e{a4AQ_vU(u*3s<^~d$vFR)Kc~rulH&>@t97+8{?43Z_LUoYXtsVl35*`(+@qSbFi&j1O(%*AjeLJjxN+Jd9~uS zxl{*Cy*`pxl;N84;WPRkn&6`9P6F-;FDI0;UEQgz%OJD5YMgneC)P3#$~WBueqzgS zWsS-bQw%ZlVxuB@#sjB*jGVcybs%W&Gw}1-+1Za3q@=F37BtQ~+)4ul>`K;y+f@w8 z?7mN!_SR>3XMH1W^jekUpMRhlYl&mL$sJw4lC)L{QdX)9_jgz@W*RjWpV;KSs3ENd zu0&2P`%?Mw>9v+Eo0)cHKxRfAOi^7E>}QFw3Cx$Kf;{J6L4Im}lxRoWU#%iFG9^!= zp$9ICBx6nvJv)0RFmA*;SLzNy&%~edK9Sjo#q_RMQQOJux|{KcC49ycm^C;hY@ZB^ z@k6~v3@!;JbNy-16&b6fMK{5DfJ@#zD<(Otm5?BiLfBF+L%0woEY-&t@d1JX-`X9v zZv!lm5{URDkXeqoeRukCb40>rx)$k7#v>`$B(Xpx>nm+xW1id`m+t;2So;D9_l@p_SeX| ztt4pNJmk1;Y7;NB>s&pXHET@aca`!BNV{dt$If}blSWYPK893~{&$%I_M0Xc4l`ERUEFETWpRg)v9=3nl&!MzVQ2)NCI|pF)13jw#7pYRWA#~BKtT_RF#vf+%I43_EXpLlv)I4RJA(~p?%7pYpxHeU^v_PpJNADsj8bK1YqYW|{h& zIrH8H8f+8PSQ8!$Y;M2wD}pH--UqXSwe^~z5s*@sR!ktt+Fr9h+%m+0ei8sTnO2od zt>g1PHqcb>`136@4V@Rs__>}J6+H8i6IVCXTVT@An$YFjVBbcpn2U9@_NQxe7}tST z*QcRXX>tHi%}^=Z1F|ce+EMgq~DehAHpRLfAU&8ZssC~DiRVR4PX#?}Q z&{8`daPK)xn|o0Ch+jqvy?zvSz&!b&bId~Q zFJ0Xq4J`2jj4oHbMuQx9G~$u8Y_tiON7(p$-%`EZ1HVfAz!8io|9ro3nm^{fi=zLMiWjFgqIjX$?yUBo{c-wek~#@-HYls8 z_&QmsHwGjM8N+9KhkD5JYi6rb^AhfzTlRKYCG#Ybj&ClDFSIMYge`f-$54v|(}hU_ zWgoYvo`kY69F;P*G^&+8ivo(V@(;8R&XNl_HtZkcF9060d^uAUVDMm!HgU3?t+a29 z$u?n~?*KUtG+esuZ9PA(8&F4ayZ$vYBc!&!GmzQhxX(uoFboTF1v3sKv$e*2soImI zIz@FQa@&L>o$zg#T-6O1tx@t{TS`mUn3}hddRhVKTJoeh9J-Xm8dw-@*^EQ!V&XzZ zL!A}D{J!rI8Fnt1RwJDHxX+(Mxe>;}!5B>%D(=-Tm`TX|rZyshvB!^&c9YpqXGOrJ zOb+zwz;pPtvx;E`yA&qR!PorKOHBq*Or2<2M$)I`ztSf!wAMJTdh}-gl|HfKm$vy* zszdBZ`Xqb8Y<4n_(my19q8XBADw1ug0|jo(Ibg4~9~7x)PbU&5j2P0-93ei18O2Nb zbSAcCk%WULslMS0h5p)4(839qzxV|3o7L!AI{W3IDHYI|7$UeDPPl+`dmysO&QsK& zr3}s0)Y|YRHD4$nu0`Tebtnc`qhXSlceCmtWM`2GOCQJl=}&)iq$(--K2O~B=!r)D z%S+F7)~Iq^$9WVj*}XVj--Pv(0Zna%j&DAj=M$o?OTPDN&`L?=rQ8lcFN;gnLlcoS zj}jlrEk~W6ZCXyB3@?lRF#8+9F(mojxsZEv&4Pa3*8m7vVCWX&u*&EyVVdbwCt2DA z*L-6I(xJG`jBh%}bSK!Ka8sVgO^tx9G#W&MYV9!Ak=mhWRq{&+*o z*?^!m>MPs(MG{BjuHK?$v+60fGbBI>_l>8AUh0K4j(txuZUh@+uC=DVjnLipU_Vnc z7qc%tH68_0{T^K4!Y7h;*C)@WR&Gw zh9b9l9#O*MK*1A2N3I}b#e`4Qb>@&Wxp5GW_qf1LK6N{2J?*2%9aYWIL_St0IL~R+ z=rg)tjNOvd3qf|cJEFks`Z#nAfJMM)O!Ip(60@%*FU=tr$k=YF`5&y;7!xu)Uo98a z>%}E`P#1ht52j`rPO$t$Kl<`NzxSX?_j|=r|CyA50gGp$|NFNy4Jrq>(K^LRof1y% zeKBr=f3JU)6ol3*W1g7gitv{<-3@(td$;i2IY+-u|CK2~Cl)(BCnT7)%OB6m{n6%c zvsE6OD4xdyt>h=KLEAdz0XN%d)`eoQ&>LS(MxHIr4>|ZZ#*0ea@ zCuFWj=+m(GIAgZmM%3t6(XqbBoKL8+)@>;Nku#wze!%CW0{nPr`6HERZY;j(+X(Es2g&LSa|`LlH1_#FiLpB#O0n~DDzPlOy0<48 zC7sz4hjevl-K}BIUHe|W@y_!~lqchE5H+>#Ta>yw1Abp_EEt7&Y0ci|ARr=I2w>6X z`t2W~k!s+5rV;MvH_zwgho5zaF57;(N&>(923udMH2Zs!!?<5HV4#$71?>$w@qc?7 zQdgt)#mETc&rtrzEj~{0!4bhftlEE=ro9wp^ek}_m~|*ci)ZQzA8%6Qg{Z;UUK52) zQriMbByi};JBGR#uEJ=f-e|zbOf<3|gGSC;O5*<0)X;d|zBN_o7R8&tI^{xAFmPf! zYAhKJ&G{N?`)w=XuG_xpOR7j56OGX90AKp$yNiKs&)QyMg8`S+r(;EQ8yt5&AjM$N4v$^tr#{}gc`S{Qn8*-*f~SI} zTmtheAciqr3xIq$uK$V#pvu>cMvI-fVO<@I#-&J!>Jv4|O}TI&P_Oy@8V*2z0j};u zo3-ra*WM)Kp4(oIl7IF#8w=ULDzSy?GYgEujg^FYfgNTxO9>#k`jFlX*8;!yFMH)t zukN$U==ifNqcJZ}X`4GDh~t=C5*Tag@4x(!4ra?pMZ4=rz02}}zaGGDEzpr%+>XM< z34A!+8W+X|DI0GD!y%QiYMsI6SwY#|O;fFX6_aT=H&(ULl?D?seAGs=i0=@PvuJefPVT%$jcf(%z5$7GGsb zST;wBzzJjnZk7h#h7V7O>XrC5yU7%^AbT<;-huN z8BP5T62s{|Ym(6QiN&=)ZnepbVFr32O}hU?g)}N&<7rIDDwxGD!xtXPm!1DK^}GpE zn0-Q)FJ_7>gONvVHMpCm%nY`0!8=c7IfePwy>#}l8&9PVbRz+ZT-v>Ys`RGNeI#+z z6y;hs$WOa0co6SNdNU{H`Fiz6XIiG&t)*g5=+huoplL;~T|D+3PS$*2;q45w5^R;m z#M3?H>rrkrn19Z;susi(+53rU?(%l}`I;ZWgL-|rmvpb7xNq;LJxE3u@x$G^3sl{E z-55afEH5HHslbPf+R=ZY&7mi%4u`uZ4z#L%K7bQ@uQFYa=R~i7PxhmK#FVjw2sJgj z>+1=a$QJ)JC}Nq|2nQ%zzaOVypY+?gien~|`FC~9PwCOJMt3O|a{sk=8OYw{*ESRQ zv(#1d$jU_sXNm`7RktnPa`UgNmh68M@9wTOC_^|IH>4^Fu^S0ybHfdKxXQYQG1VBb zcmid|o%n{-j@7soAM2Y+Q(u2w1Alk@rwgc^@ehFpO{oVk5hLC(wCp67Y{P!DP18#@ z-JQ$dI)9t!-7VHpdnJexLTi%70eBe%33~~2_!&aH<65Zv^z+CIcrIUN2jvTS}Ja^Z3qO* zoR~O5LaG>zWbVZ|3Lw|HA*TajgAKTG{I5gl(*PXRpaOJ#x&wk8QXN+t zb3L`8ZL1lwB@~WD^26Q^1u#?8fb{a%?Jh}Ro1#4~@vMQ8NSI#?mP1Zp2cMtO;>I69 zky0!ID7JctvER}2PJ;Pd{uvjF@mJ71h~P)=Di5`VeZJIjUX{{fqSWXI8E-T{#4VKo$=*+S?y$WL)m&GgY13Vh@(l&>v%@msuN!# z(2r4*vA`fZ8`MXc15BqA_C-Ye<1$@o40#dYgn$m;zT-mZ!AyWxWfs!}?orv)4`@x* zAG?ihnwoa4_F@zkNtBWx!U0(tH zhOF1;6)|R@Ty9%1y*Z~F>;kg->4CJjKNfHqc(0f(-@WPSbUMo(?d&<->>MNKm3@Ne z)}8`AZ@0RPKUyXv7i5CMrOh%lK9XFhaTm?bo%Z>M?AS|>fP<9iT-c~wG%oeVU3K1~ zm4`g75D_fkgTe*JKc`S~0l~Yo$>LNYFGiw3X7MzOy&h1eH54lRyZ!lg;@mkd_G>Rk z3SH}LCurQKX{E>M46gd4%W?%dqE*P5zH50r4YHK9sa@Ll@>Y~nDY_?IG;yaKsq3Ga z_}7B(11Ok|gJN*&-UmrH$WzH2%b_L&;0R>O7abmHWHE2gA-2NzST@w42-G!EEB1+S z+z+y2H;XW+8LAtkPhj*_E+=$NJU|EN8t!gI5ySJ zc?(yhn01j95#C^T%6>V@0Y6iDa2Y^&pF8JRzFOS2^(Y_OdGaz2va)5>i4QTl z9Q;pVHr357<0b%8q^Y`oAr*E*CO{@eFD?NLRQ2Uq-!yB$;gBXz7Z^ADz7+pLZb8@! z0iVswPnxG~zVS_VN@n1z-*Dh%N`&`0$_!3^X9p2_7B$qQB*O7;7n?I1VSKpD&tkGf zRP|u2XgKY_0}2wJ%);Zd7fKT-|CIdE2aSKFMOR6jbapM=@^8W=Cmgzyj_`96F8Y`d z+qT6VmtxnOQ_w?`+#QgxS``ka#$)!B@ZLHwL!bQRxu*wmzB*?pzI-( zPU5WzSNGd(wYZ+>IWB%l#LY%y^J|~S9;H=?xeR=(l{K6M2>A?l?fMHFlQfr9_F7Pp zaZQ<)mbmQ->$Rn>*Rd1~d;6V`24E|(aa-WmeeJ0g_ZI^1aIF@qF-8hjK2!*z1c}ra zo}HaH!e@N#`-;@(x9EJqE%_>z&3w}UQ@HY0^!NCqT07SKnouujYqMFWPyQ7CR#{Wj zp(aYpW`0=oZvE_|*hjjWO*Kn)&DOg>*hxSTvktNkA?gK#2Tvcpi}$8hrlM|dfV3{K z9?8$yf!2b$V_wYgao1VI#DmICjZ8HRv<&@_pp4Z?eW%oP0wUPewfd5UuYF_U)J_L$ zVqBZP)5LVHQ2c~UULco3!GS!(NI~n@#dmDEbX7oL3t^y)3sY z%auA!BY#(WWn&FA@#}%V?F^fLv=hUSR7x8^njE_rKH^P-Lsm7^IjqFj**@Yo{l%d~jT$2O>%ggJA0%ic` ze}#@xQf6F#0&5jFxwvCDWlFun?`>PLNtn-PH$5~>@M&?` zTA{K~i%!r|3lUdjb%!LQFAA7GhO49m;dL283zCFL$jmU? zT2LHwIdM)4#^bQ%K{K%{c9ZRsLgsrpWx^rm5nL3_nwQK|_SZM+ zH1xk*^y}xhJsB-+K!9Sb@FLnP(IVUZIz+7o$HfS)p9eh7VS_0zxC}veq~>&55bLpx zG`Tb)dJ2Q^0Y}7UOZgOX!@e&XK26SYrTp$Tu!T_j;Gg$zd~0-%Ug3YZ)Ji&=xmA%s zyWDi44jn&Prw@U`!@V^T_g#X)uZo4sq6znTER?ABeE(296Enhwa!FdeY9pgBb-E7M zqJ^{Z38=}HVx)5FE?}}dh@pkKAn|&{HvMR^oq8ENNu8%JV*-6CYLDPe7F`XEaLj;S zTe1QDK^*AoBvThpoo911H9Dq@J4g=jNkhzWBdbMR;%dkW(&IThPIZM!-LXHvVGrkk zDhI5pvXnjoHt>(>u|NDyIg3uN%`$~K_jQ&{_}(o^mKI_HUusjhq6rz)!b^ubB#>IVANPaQ&JB+yB>@c zrRqi82@Y#?@oRks5iUoG;&|uW_H~`MH(+JSTkV^I+}YAmuZmy`H$3n) zBVLdTx3uSjiFI?7TkSEi@GMw`J7xI4zf-DrER~3{c*HYvE72;KfYon%CoUig^k?<2r$xk@;7IU0Oo^IT~ zWQY8<$&1R3BHdfsj7wZI$Rs_t3qU9I_+B>$k;c_sV8u4)iJ3IG{dej{QoNFbtG2kl z51C*2k)$9WE&d(of~MY}<%^!*B%8ZkhB6d0N7lB>Ae#)mI`;z6KM2fbhY935zWdC7 zSt3W8@q^b~T@JI!Pa=_geu;Db3szzz_l5FPv2Q&W(88S(0v{-u8V z;kxUu=SW#&Q`V2VFHJ{Tt|)d$0}>1JdztS-`YOL9ot+#i*?}J8hn6>d#cd#9)Q+@W zdHgJ~j4fRe!)%GU)?4u@3!;ai6797J`(*DH4-(ZG2gPV3Z*@u~5NemS7=Aa*7xi|f)pN*^$Io%a-?zT6hi1}U?3c;cB2?`X&%0yvqL&Jw;okI!fsfOHll4e zwYER}HlJ~GD0XaxAX0hXgLbKFF$O`2et{GQ z>?BV*zXHXDzA@;luP?RmOLNDxY*KHUZ!tpJ{9f-BE>10NFIU%}o=oC)vb4s|Yi81- zIqXyXU*)=u-}Ya^(zez#`OvRek|jFDW5As;=zcee_o!6|_`U1Soe}=AY@O*#r^y7# zAAOjJrTkdrn<`y4Auy*~Q%3tkzzlG)Q07t%~aixXd|+dWlo!f2eOO0sM@DBy5auNWIAL-9cW7M&yk zeAt;-oW;Bby0}4lzN>%*eHuZQ!rjWeEg9--r-*^DdCqA4`EPQo+};m-BXa*%aw<)P z9=J}!o@{&Y-w$@(jT+iwI<>stWV(iCckXH^xvAC@PRIT%Z=f&&@jH>$wlpDpA+~p) z0K22Vw|ON6pl7kvgBEkPRG!U;TVB$nXe1W&S7ZT7@wO+iAVB>6{9rIpK#Vf?xQ-mj z)P;A$YV>LVigv>mA{uyToWqiIkR|O~)@RQdN9k))@Ds;B2>?iJbxGOV86oqDfLV?P(6KP;*}6Z_htl*UyM>fA_6^=FuBnTV7O>P0ViXycc z5=)%j9Zi?a(Gnkhf8ctNh_OKy^JM2yG6iKjmRsf?XN?|ukKe}zMbREL6pzPYg)hOq zC3hn@(+Oft8o&Ii0mdzR;M8LS{zh!enk~Lhc0!Tdu9%|d$1K~FcG=skvGAzXR8wX* z;GrHAuRwt@a`{;Z9$-Hg?Mo{B-G~!XSBd%nB&Zue9P$gZkA5Kly`u9ogvqH!)pT+$ za@;;7iKJZhj|KM6f}Mf?PrRZq13DO%UAcG?h=Vf2>7;rfWxE_q?J*2(RPz_!1V;D56~J%xcFoRsrkf*3higG_5J|b<`2CAr z5pi0Uf5+mH=NVP_!X;}J6FmVU6Kr4ox{KyNOmR(jjj0PIAnLU2DP>WBk1nhYnALdG ze6D)(sdeT)0`A`pKgQ=7PD$KLV$PAv@KJ=onMRQ#dG>Egi>~<@q#JJ{CI(>tbsQUj zc^~l>xBf9c5^z}R$Qv<)pVx=2s9E>^VLQWjlhoP)&WY^H756Cp5)Vdc$wgbL(t(+U z-OCrPl}6GtB+j=+7jw3qdTs*ciVF^y25&FD*S}qfKc>qiJZN8#*fRLDOLJ;yP^XLS z(r_KmuODqR*Hlf;SGxz#U8Gs2Ig$9%HhnAjPmOlL1?}`^K9~Q{vC(G=&mPnr* z$-2&u%Tbo|M_26=XX{0-@EbqW!Am z*OWB)j?;gkPeZdp1FFpE9rNk{Qji)tS?WF4Af0cNMNbg8O4=j}x5J+{{K2r_DI=?K zuz7Xn;5s#KJq5gmzyQgEgPWB&{7Fw?cOA0PJf74ei!^i#4Y;MuUZqm|!!9KYfKr2W zWFTV7PQHyXTZ_Z^HD*(-3;(3=bI-xwziLza(sakUA`a^nLCf?GHBe%||1`01@2bg- zCD||a^qOPo-}&G(x!2_6DX6Prlu;Cf8a=*zFO{@LKb~mQ$jVWFewmgc&Je^0&@618 zU$hz6nyOrL=U$IoPFeoe`O)ALepSNoAi6_pt1KFQZ)GjKMz-m$6la!$<71_Xx3$kf zNw)4Idpb}OF*Kg%8|&V|-D(fO7M@c^29?H^!VJEjsselpev*tiD&1DyQeMiUl1^W^1nC zz|%9UtWlmWPx&12SQ*ye$aJVVTpvtLH`84-{}1XsClo2dO8S{dOhR%2NpsH%Rx>TY zX7bS#l474r_5pBjCWp#V%|l!{i|sA3#|lG&R^|*7fwLv(VS<0KE}b6r^b>@${I`<04A*>JZAd_BV?>eZ7v{Fx(H{>-U(kQGk)Iuh``RB~uh#KEKx;bY5HK6nKa> z7I2sNvs=~ojWL)mzR%ujbqb@*^6zY=UUy%D13G7=ST=^tXg@(GjUSoftCi2agEMH) zRNhsLH>aTxihVy)Vwne$%p4XuA4&mR=6}yL2Wt4s?A&gWolHoSo6T0uN{5JiuXUp9 z<7~d7QLzJ$dqRZA?Ccb6WE*#3pfvx~y=iN9|3w4;TftD2W5i01cjvvRVJgQNeVYW! zN?*eg*TX$cuJocBs=%UC?Q8@@FDZQ$NM8rl2kqjSJC!ebwuf@xXg3?!j6!)$%F21J znscR;0eiKLJ~v*J%H32XV=C#6+EH@xqI;2zjJvW-(JYH)kxGQT*wmj9(6YA-cGUZj zcQ>|yi+VkEJt+DO6rJN7#Lwgs4yE00$5&nclpQHw*l&4X0I^Q%Mh2X6OFX?xQHWf% zzj`~}kH?pzdo!bCiuBT3-Uk9s_>}SZlv+Q%*ckcbbg-?f;<7d7drFyTOed8ZSg%SIA-S^+1A3yl>g>HBH`Ca~xcF(a^!O>W^x!z7qu1u}krjV$*QRrB>qgd< z^3v8f*}@#7>>yJ=w38IwN$`u{|EbSmhn$0WO`7*TNVOzwls@zt25WU}FL?k-Ak&v^ zpAHp<{e(TJiD!dXVLhoxFq*Jtqbohe$LZNME*aiaK-ZX{Utg=`Ct!T7K^;=zbRDZA zT{Nc2?6ug|Tz;l1Q7rt(#fj%9w!_G{N5kux26xK4)4}Ud`;Ut8TfodS#|iTxl0Y2@ zQ#{2rrxgaP0NA&~T%wz@D^QW`T{`ne^lg%4HR{L3y49_rRbOHX72sYEX(@V9oq(%u z{7=wY>lkgL@wCJ|ObQH7mh0(FzZ&vLs$YduQxl;Lx;j_KRIi+)P?-urobSiQ1o|QNlttM{ zx{1>M@R8#{yu}fp!%rg2#Xz?E2${!v(7BDm?6+avQo%ucjNIn%?WbDv9p|hPJ&JJ> zy0(N>6Z1Z-6}~cX&)Ma(fP-mE;nC07u~O})cUCettZ+!IiaRFfc-j`SskW7|T@gwN z1XM7Rz2Bmf#31@ZZ1}nAA`zQaKjh$-@+IrlDu>Dv_fOu7(2F=_o$>ikRIyT{ut+x$m@u)eah;Qa5@manGiyjbFePi|+ zg?rcG7e-A~3Riq0Fume@Gvyy_&zGbV=P9VwUn(W|a{Q`^-mIU^m=o4s@w5cB-J(92 z+^i)`fX??)Wd}8Yc{u2JffCRI4~Tkm8UhZPs4|LSnv9gAH_+=S37SOzuw~~rgKdvf zT9#4{E7uSjWZx@NDdPSRKl}{_Ioj7$`~_h_>C3zaUX?MRS6v*_K4iHq>pPnHH?U%4 zGG<@c*)oz(!aj`;=q%@tQ#HnrDmPH{l`JHJ;l`r@e37+P8l3D`U(_VK7gOsUyFS6m zJEi9fNLJAhciQ*bK~q*M5nrf3-~lmWtOq%d0^~eiaQS*gl$t7-;vT)(QDUoLpQ9BD zI@6dnRB)2Efu*=?XzAXsI926ipAs+m)S8VKfWaF-3cd9~YRs_54g6R>{SC+0esu=W z++AC9=DOj9sEQX?N8%PXh71INqG!x%`2zAFpwddD5AJszgKIh;X)9dMULyC_Z4SVZb5091 zJaNUkZdOc{zLh$@dCT;63M5I* zKB1kzEN+_DQ{u07{LuAH`;*1^d>|L$iT8i}p&-HrBudqnczi+z8?knitgGOhR^&0F zMw;G?r<;mh(p;nVG$?KJg|Jx*aapX+bD(JxafQ+FZ2NKMk~Mk>A}L11fUf5PHr*=; zu<+ZzCX6zu#e;g)pFe>`u|cy9b<6VhEo_PUF_mli#PjT4Jj~MlHq@Rcd^_!xGeUbt zP9;iB-3e0=PH*kS(8pq{w*g-e2Hm>OO}-*H?;6`aesD09K&$51p?-&PGc2G)E+riAh5;T=hE3I1 z`IOaub*IJ;<-^KTwV8riJ`y&_w=j`t%|kL&Dy$jAV|HO_r|!VcTz*Q^3Ta0rnGLVz zo6tL*!1geydf0(NNLjmhe|AWZw zJH+pObtfagdqq0w-UWISqHePyti`n`t~a8IE_jJ!O-~0f8vD$J!o_d+zxHKnD(*# z=Ih*qDEbn)+K9E<=?WCS$By`Jx48j@mzotHdj*g zOMIyfM-9r@uL^8>HW#*j85@q4(O!3+aUJ(q9z*5#@9Ib6zr}(~gc~eJm&Yxpq*38D z?r~2>A4)vUCr8$;wBUZ6p8O(9pSqmi6LqJE3ASkuEx;M)D?XRyrZ7XA}G(}f~E z8Moc}{?+5lCW|wSAJjfxaMWQo!1EDyMA9Lr4S!0=&UJ`uZ$^6u6anbep3!_8NvB-_ zq~z%$o-I0Q3&S@PfjnDKx;orJdq5Q9e~Lw3N5-(-{bZDN??rouM=x)WAv*NJC%1YFXTnGHea(*+cN%Yss-y*9|7b+ z)M8e;@o&tZCN$@AXz;P@<~VpgoA&Ijq7RbLZ@a1%FJbEZ>TlD) zcDJRVrA9^S6#uQSwctpNaZ1%4sHQYQf)VK>-sY$#udlE|po#?EH#pUWzrxp=FzQbk zzH=f_*L7}J;^+%ZGl(|F*%!g8u@r4Vj50y6&)ET;D3OHc$BrVkImmJM?)Q(PHd_TM z|0VA&5`PJoEwP>reO2n7ery3BnF)1@SR2R96@IsZ;z&%itnE?)B;g9O+hea4`wSTR zW`Ki30+-NU;ADn1bi{gWvP18PYo*D3e&hiwjzMZ!SJuYZ zGLF6J)4QnC4LkA2m1~yiJ3jU9MhjZ~WYLWK944WWC6C>@|Bs%_XLcKAq8-u0tiDi% zE|w9g*l=+=46e}hmb7j|kMI#dPY2l!Xw>NUXkG_5y#bAZ-5su&q1aKrN7ij9-AonX z&*pi8a&rF*`z(A6!i66dACD2)`993PQ27TEx?TBa!sm^EX>64L+RBLIF*sr1DV_Sl z**U`num(S+b^^X>#H}>DjPsbZ*Lc<)``3ESZXg30!cetGQrMRYwF>O!2@*Th7sqh(`_8zvIoWven` zwS(xfgCY{Re_eonYMIx2!$;@PN4l!?eg_(q<4caxvk#L=UW*dWGLo5!&a~;xH!O$W zJ6Wfn_39=&4mZVE=DovoX6H@+|J<>m81L-_Gy%3wq`IN9){(_vwHweb90!t-ghacb z7-4Yc3_Bh4Du+#RezTyfG)n!KxA*L6E{B$je; z6At3Guyxxxl^@h#&>$s^1Fu0N8vcF3gk$m}uA59WSNxosxTpMNOYg>cOjV?}^u{`j zjMtF)FEbCz_piOsUt&Jh-+zDMk2oW6C4Qsc>S^5U!fEh*zzZ`d+;6*j7_V|jz-m6b zqfSMbpI|Lu-?W7#NS?CP60n9$sT+h)(=va$nbLU!RpUiX zNW{_)?I~cT&j3ny#%u#p=n!s6t>!wg%#OZOBlzZ!Z20~fiZ(I*5x= z04V@EZ~ZE$CZs%Qi}(*i0-F*YF_6xBs_nE+>}CL5p!lCLYSJ1wdlcu}djI$E{6hYf z4ci*Lhc`oX)zgG+h9{$i{9i015BSq4h>=7SK;O@}D>HYq2v3C43Zh1suQ}#;c89{( zXr*pFZv1p4fav3e;(ENgSffPE))q6AZU!gE)IOn$@)!XrowbT4*trwmE!AA`-yTt~ z^dq=2eYI$W>^1vu5{uis|KZ9%_wUT()8J#m!;)tgWK*C6q?1nO_~xKm2xmyVrv{sm z7?$72UT?k^@P5(SI9D#8F?`a6SG|Kqxe-nFwu^yaL)7g!hE+($5;W>RMgHCPpAB*U<<;e&Oyw|I+{hC613KeT+xqwzdNX1HD-^!v%r#4!CCe{O*PTl7 z-$z2EW&B*R7{eLc&ak3(mXop7a>xLkr|o%BBZdj;`lZqT3~V5Z@oh{c}si>PiOM;^s~idqc=Wsu|J2Hn9@4S{+9#Nv ztZ-eU`18xo30VH6t=JC&QA^aX#b~j-?B=BcG*=(y(3`RY1ba)-ni1ixt+L~66WY$C z+t0sK4sLkQ@khG{3pzMMcpa4TvG{SWS9ade;uvxq*g@w*IH|)TW7el(1P_lPq_XY7@V=hri_+O{_~;(@-(*^T#r$OEmFX2Qh$BgrE~m(U z+TM8v6e|At*a%A-@kfJ&{bs0di0c38y<7Fq9IQ83=P@xiv)X~IwHdH7?kM<#)56H4 zu?}j>71lv@I)Kz6TN`w+eh?uIgJBMCFe?}zCH3D4=F+n?CzieY8OMZtln8k6 z;mh$HGO&b&J}v1eh}j-!Kq{Cl5&jC)QS``o>*A?4@{zj}$w?X!_bxqfqOm*1;alf@ zOjjUb*rtC-eHuSLO1u^0h2mRhUCgjJj4Kf2e6&TRW-K%iw6Bm2$aP$AU>Ek*kBeNH zqJi|d!m$0L(N3wwBUKG20x!Nv!H1xSSc5giKM3n!3L4#hGa*sHh)qh}M>0NL-?s}OMa*X(69B^ZOdk_RFce+G48ML_d*f;p;pU*nO0DD3g`uqVtL`4qsU$!Ls5Eoa2){MQLqX+_!(Qcy^)@F zV%IRpSFSvC8?0*n-}!d|`x5=QXBM|!-~6dS<4dhPh?v$=_s;@$#wm%uHRb^RXOb1z z{|D0{_nZ}e+g;^PZskqiMq>QB$Q8mH$*Zo3Y13H1h7x7(ZV1UD5&t$?pMh907P+Ba zhZKAE^KvL=v{W#BJW#Swb2kTil~LgG1YBln8~E9{Yma|O6ig4}ppoG1xQ(W~p`xgH z@g1d?%)enk^gB1?wuOqt;(+ITC`0rw&ck?{^kD7~DSgBKw79$7aXK>m0G8ow^ zdLKjfdf@7LAni#{!{NqE#DPheHDU;H5z!PQ3sj)Xb=F`X{&y$t%o+`l+ds3nriM0s zTX6Km-${U=B^hYAgYmCWH8argkMnBK96D&|+LpH8+9}+#@Mx4R&?aj%N@^+8l+hrSp(Lh2Ri8Mp6;37a z*!|7>dYU*-&Hn^?8-|NE)tlm>U)MaG3JhPr=oXg62_64%2Qb*#2G+$_{GzI`rv^wK zZZVR%V_wNDhWd1sIOi*eV__jzSUUpe3~CqN34lM=*`)MDmK6IS8`^;J@>;>4f^k(Ci{2ZW5lc`IQyx zrYo{Gl_zXihOj3+19`Ct!+Y_=BaStju2O%fGE1%)yV3e4Q z&%C3QzKR}1I7sfkeac!~kyFy`~XBwp2r#E9xk|LeL(4a8q82Cwh`<>?iLk|&p> z>gq2HsL?5tWbOmk`(M)+!jzlK=$c*}n*Rjg%vQ}r5hQB=FfAwe-jZ3aDl*&u^y=Q{ ztpp#|DTIiIF|J$$H^2X$m~>0S6{#7g-Dv>SQO3IiRmeH-C?2Pai%|2UP|>U+Syr=CjW@xeYIQ{SRIVZ<%Sx z4q{N5?ryQe`L~8qP4Z!|dobkUJo*^@VOyacA|n&~ejFG^kLv*S>Z{v(ZXeo%xdJxS z8&wZ&Ic{R&*#_esxc78l=K}6i-3x^<6Rl7Ypdqf>Vkfwc9VhK=a2k{Cl}{5f0sI6H z7hxn)jzTv@gLZuHt}K;pS>)0=b6>vmg5rte+V=hwI2pX&H;`khSlW4`9s6rm!cuC_ff_YMcoC8I+@dWN!V zjkNZiXXh{o7W`kly?0#CZ~H#3AtNP{h!P@gQfP`oJEBEPN>em6wT$c}O&Z#&msdk* zQFcockrHWWYf01hxEkKy`~CTSKabCSdw+g^+;6v0y`IsT9!QZNAHE@ z3W|TsPv1_@A~%a>>OW(%=jz(Y|MmN)i@A;2f_eHCc6)nknJO3UsFLHp;vHn<92Ywe zLR%3I{!8Kk^K`r5N@bh%h2aDAJ3XSc@x)$RGsn>~@lcSH5{jc+rSKv_zsI4$`M!!a zoJ5Xr%8OMvKnha=D99rUJ{HNWs*-4glZkE_=H*<8B~?ISO{mw$83&rg%_lAD1ZdlR=8iCE- zluKAUZg1}{T6&62D$A(+%tEoq6&QJYvu&lHUN{yxZb2Ga?ZZl<8m9R2T?v6Jd6?** z&ea`9U)#R^WX*7-w!8>zpOm?;o6>6Mcr(O_y$`%p2{Y70I!sd-rc+CezMGG0X%n51 z&w5t7ry9uAUW*&~dk0aYqlK81;!Lh^$s7cx%jVFIN0V&B)GZUISC_K0UeST&<&Rok z$%l6K;)v5jEEn=-(WDfHgwm}c@1EP=4j;cXFx)$6xwH1J$ww$~!l!+pb76e-j$30I&ly0fyDa%_ZjmS{N1Zh0)5dbf7GM; z&XpXKEAOL-S0}pPkXHL>ogUlN%lL>*{K0VbkMqBu#M?W67L9=IT=Fg_|4>dB-{on5 zX=LGCmb6Q%e2^5*JG3U^h+ zug(B`%^)dXc0RM?4Md4T@Rw5h=Fz1uj$26rje0U9S!p)KkW|`AG00Ica9c$ zDoNeIzxKch4l3y9;Yh2R&Af6OH!im8=r%GKmiIgXrLPD#jR?RfCNtUfJGhJSNn`X4 z%6z9j_|f^~d7b}(=Ougs>fs=gb_1cOiz*OV690ssNq06UT3jIlsd-g{y`)J4#WBhB@(ue2DP())LPTMzK<49BBPEd zO*%63gSI(s>-n@Py0^t$=lZC!BcQcy_3mFg`3hNNuz`l(H_zmtW^wH)lryhtDJTp<<#%B$jEXU>6bjWF-?b z2$J#~TWmI9qld7nZ(BXE+0@Le2xBh&9O-t;o0{Vm zLLG0C*20nX>%i@`RK8x0Jom>I`-QpKV7tI9u6dVsd1FkLRJ8>n;QxdnJ2eG*8gci8Etx*l^3$NP# zxbs5%M7&@7FtWspk+B#^q3*9-E|dkq3hu}SJc0Tj>aMZ&8 zyx~Plr{40Jn0g@q0ceBPjeFClb{6eXeD<(G^OKC^8FZICI6HmBmkZ%3V@t}vOg-g= zI84_T->?1mQxcZK;>CXJp1Ik~mB+12PS*jovfoiJlntx-F6yli?oYGB``#~}jv1zz z_$*h1x1ZlLxtF*D$V6UMz5kCFF=k*>78x|N+&&xT;RR}nOEAs^A7gE-yPlW!!@cp4Jts6BHhyqOj!h&EQ(sVNw8Z5X<-YDo` zfzQ^9GYqqTu1Q*c>VNC;KLvHdH7A(Ng*y3!%nBAWeWtjIgh*xZ>I}Bl!9f+XJ8VBc z`~T_VT=CZWq}TdFnV!fOFmbY;*zOs*2sOvnpT_}uqdrqsv}SL zqPLdehI_thlSf`05$Nx+_fLJNFK@GiMuV|dHSJmcguq@8zFO-AQ$ zHjZ~bf)|jz1z5)-Qk=(QM#{xw0S{T`?(-H2@V&77)d6}+V?pD-sn{l}NJ524{~v}5 z2N!y2#M)gQ_Gg!4P{M-5i^-G6Pw$`Ke+aDw`|;8;h3C+uSiHSa{d_6jb^2A!UV568 z19wDurvhjjveaUIrs3T8;W7f#H_9y9eWXx{x3XV46WI$WxMc24P;8^|E92#-!P7|r zcPt*q%yC#knl_Te{*w}Tx|GQ9^$+k|SC0i=;+?A-zcWZ;D&Q)5A%eD875@3X^d0vJ z+uf2K1^fpGo5a#_h%Iem4@l$pY{{h;r*gXylFRDIPY7=@FaLdo%LS5pBI#!M?3rtE zqX1TbvOVR{2K@RoCT-pHGZ$Lm!!9@QWRALBfc9BD?(2DvBkHV)`Wgb_J;ca@^uCdV zDM2;L12fPfweYXU4xv!GYtA@&D%#}S#t%>gtw%rR2INg|!|tNnWnZPld(Nrb5lK5| z0}4Dc(f5sFj~A|w2roD(+sy6zq7m)91>L&Fpx}nYK_qwf+zyWk4OqzWBWcQ8 zBCNkHNadi!R&p^f{pWX&*Fmlch)SuWvMr%UOnmokfhG(Nh=qfX8T8b*eL1WD>k-2` zqCh4Nkfd|nhlI8SvWf84OY9=TP;2_%(2&(DlO46mZck1jP+RnQeu#+Iplc8UU5r9Y zd6WoddE3k6GuWeFu^xzWI+>`9ZawQZ`UD>#nU9r6z$XHzwxs6%Zjk7}8k#6E=h%>h z+Kk$I-w;JY(O?5RoC?dfeZ4|Hk)>ljv}Psf^K&|Lx;;itxDNo!K!`K3B$U7)U8?KA zFxVZNlB6a8Np9N_6#g~qtKSVwW)M%x7N_6r+^rubc``X~xaC$rP*Ag^5jbd^iQp-# zAV)#VVAR^ zsC#;s!DB_Mgf)oBS@-y-4*7%0ld$>^Pr^i|RG#k@B=O&JdWb9?h7g_Z35>#7a%2#R zetDf^wHmCxf3E%Y$jQ?cHV38vl_Q_9KRhR<8vP`0g>BYq%a5Qk5~cMTAd0FM!c5C# z@TK;z#cQ4~h(xbc6?ju3sRUSn_udiYK9q0@SPy^N;o z_lzo&F$LK z%4L0t*FG zPTw|vnwOf}E!jGx1_y+Dj&vOQWMum;Db5#CVk`UM`c};8T(_tvg<4*N$)pp&^Go#1Bbp_m ze2Xx?vpcS46osq($*X;gy5nd=YbGDyOH?_4o?f`RoafqlI&C-nxS@RBlMgdINMoqZ z`R?(uMcM_RRvD@<6KwrHB2m=}H@kJ{oLuM-_JB!pjP>wIqf6#b(a9`=M!AtWYfEAy`|=nm??{kh#kS(WHQ*TmmxLPVwbiY;^S4RhaX(*jvQU1j`}kBg6jrT;18s}b z`Z{cv`f8z1PbO&E*IFjdzFF2YR085yK(|eZ11m(9*Kt>FIWgA;fTn$!MC;k5-;1+X zrTUrqd>1@*K_uWN-~7L0h^1N=@-M&sa8Gom7-U(8J9}U9dh_29MJWMzI?CIZ;@6C{ z4L0+puYJ*j$c=V~Z0}-@O7_;`UkxJ+2vrVT%zh4_w5du(aqp#_4efNRlXS9{uuL^Ct}w(GChL7}a>?9ptpO1MJn$o7>ND_?8qG&mU8V9hE7v z%sn{^{ znwu!~nke_mMoKnwYk_qek*5*e?Z9P^yAaV_U47Ky3SIQt>^J2r>M-U~A zCP>`*r?jEKN%S9l4c$sQ&bZVw{ zraSi-l1aTCk>dXS2%N1Wszdv6@9Y2a030RV^O7)lLHK>V1wP~{;dU>VXB_*urJ;2o zvMoZgC$FEUHH4OE=ZUzqe{&YPehsd~vJ2#;GVwiSA&ckfTK-fSO4^=}OVDwrF$cXq zOy=@1c@eIVW1&L|UK5OL{7s{E01MaD7&u3?Zsy2&!+Z)c;{Fn$g99Svq%lBd>$W<} zqoeClV~L3c)q|IPa+6;OTa2Eg1l&FL$E+&TP`;qLc_qE|hy(c(fg*qR~L>QY@IDzz)8y4SY#wL`Yw zvNL0KDYaHC7-M5dazPDyCV3$kOY}P+gLbneatBd(w{tf;MiSIKnvcobm5C|dlAGT= zw4%$EX<54gcve|G6TE6So5m<3S6z^wCs}_w@r)^(R&7sebnAut)QJh$wVvzwB(|+t z%WK@VGU^^Ewy!ABz7t{=*rsCT=7U4mKN&F4UIf6ctZ>zNs{Fa|7}b!2_woYx(7Ll zS9c%n#m9HrW{{VWk)dx??bZNWO={GK#c4U686{*S8`b>{buY)#WZcNof+zrljUa~q zaY{%2cx_mjH9gLEmKEwaO~@Cre%#@VCQ0RpI)!TQIa=lBJ{~@L>^p$*9}DzeeykJ} zp3CL;x5kn`7VPZ%ovuJgHe6Bt4WgQoe|9CGcGhp;HX11C{Hp;MW7Ytxmoy%_I5Igfr>v zqXXy+<|~dK8oAtX)qLSxmbXCHa!#swr0e?b&9xk9BjsKbYilbKN`aM<`Y_QAb zy)IJ0Ic#K}UJvhEtWXF;-ZbrS1mY=6&^R#kR_V{RWuQI=_WlJjVpRL_9^SK{UbVogo? zk=YbD5M4q*>4mm8adPa zpc_Ro-1w*SwVD>p?6RpW>*zpvK(V(L(2eE@=TAz@dNF$`V8!vg%E56s4izHJ?T~ob zz#a+LxXwa+e!W8efkm8ctVb9Jz_r#3{ALfs%k*u(*u{NVz2b~ux>%E-sW zVzJ5XTvIdD(;$L@o_6D^bTa?#E_<8(m3LUvL-&z}eM0}K?> z(cfC{xc}+;&E{o+D#F>%2gkv(FNEs4OTrmpl;9?jQ8g(#8VMRvktb?m6_|r`XavR^ zELigLmUF zvq|VUpvl(Qyb;yIx#+^_V4|Qw;`L3GR{ulzjOA#7a(29f zSa$D>3ia0d7N;7z(+A5lCi#(GBEackZ~K+lC+Cs6xvIzd+(NrT$=N1ME8iYJpzCP&yCtVVYWA>>3l&Pi>*d785rUVEIOKk+k zzK!n6eVNU~w9hKE>e$b5&v~)^x&WM-urD19+(DDo#6?+C4p){9$j7eejUqNld`X9E zlI{eixNdFfm-d$9$CCUP{8I6Me1*w{(xiYGdC7CpWuF-+-So7#=V34KNTXK;{a?%B zInu@}0m=sJr*WjDLZDwcd2H7%umT7|sv&yAL%D4h4=E@J_LgD3D{L*4KRch14P~cE z`DmLfv^TBPx*TgmfHIUF_VpPI7GjD=OhTD;u~f=#L)~3&0~pL!2%7cIBbBp)CQ7rf zq8=|oxud_me{?)XoKwQyRMR~Va2+vfbBuT^LN@Js)KR zzsE^mKo^u&o5tT|in!skfVBCj-+(>+M@3l`dZ=0l123v2=yIa~1>HyqYA{yW9ilV> z2AL4tK#3lD_FYXukkk80xm_Sc$3dku@3q5#3UY#~3N;XkSwE#*rAZ;yn559C**tvC zeev$OKV#awgBm>W$)haZZ>4O4wHmMYw=H8i2?TS8_J7o4wIoqlsQCH%{eu3*-ZKJ?c~RUS zyx*eKX*nB5P_?r|{^KS9A)7A=P+7Vb96()kwx#5<_gmsGj-91$;WZL)l}4b;G0uQe zw;PSU=5y?Zia+y;@+>5c-(re=xvd#W%eb-rs9&lrE?%xfBtkN2W;5jrn;<^;GIR2y zF{WyDt%#oD_yvmU60;D4;5S?uM(@&$z=quQ>mF*J=+Yvdxpxp8yJ@Ct?JT4qqRyBX z{+|^Yap#cJWNu)+rJ63sPp6Hs>*`iRMc`%GjW?*&zJ4We`$i#y_};3A$BnXq#(r(D z*j1oRhWBCU@J;Z!jGc2ib$O8sr z-yEc~-s5HGJW}R!h&rwSLz#GkW_h*@jW%E8jXdG$7qFcC_%7m&9(@Ob#dY_B^7B4| zI!>y^ILK+EUl%Eap;^H1U|n7`b(el;#eVPh#7g`RW8}ZK7!(=h9S49*C8(xd=9Dul~GtJN6TP$lRwa}{py zJg+*3BAoMW4YBL&NGFn`a=-l-xBWcFId0WDG-?I}sS1u33J)BbA~u5X6vps8v!mw7 zHJSB#dU{G-ZQnw~EyN+BmOOZF{mn2|^y*4;9IU1aN)ys_Ul*8DK2JBkEI4fH+2z2B zLz^f_>1_*Trd2Lyg?3Q)BloKAO}fHqunnq@d&^dSZiX z2?k-nsMu@MVNU1)UyGoQQ^egKb$_;JurN(Z=j$E_pMepyJ2JTAT9WUTf;caN8&^j2 z&ai7Bm*GRUybWia`j9LN_$^EP8)^9hesOB)6ju#V+w>;3s%px%)+w$RdYhV{jqsm* zP#T^<>&liUiF4YF7Ng4kbq}siNBJZboQ^oM>`>j)nzm3o@Yie)pFo3DhXNd>ynF zw&BGNa#L?~F?n+=hc<{TN}GS~y3%wvZ^wgirNg$+hM|nlQ6zJ};GI&{78rN< zI`-yEt!Kn(7XLd%w@^|~pNLvUT-I`&*E1w-t*{^6@nO5u?3C&nB817A&-xUB@pa=oHu}^F5 zeG_h$RJ=l$7cSFWkWvM2v9M{F~N)JtlyypB>VS?Ot*A;SA?KPK@x$WDL7_81Ea% zPZ6G=-EDx_GvRCd}PA8PS7jl|vMbKw52yh54wcc&{YYzs-}RaE_}_=i&42 zu2&6|z-bdrd>6iC67BSHK^F5OmaY39SbBq|TYkUW{iJzo)hw~~H+~90BjvkV*rwOy z9J|tdke&XUxC1yFCV6n^7}ww=!P;icrwl`HZ!sn%r5P@OR_9_%XMrx=YGBkK;I7rm z$gz7RTq#;x@t&(}RccQb9V72~gCn?!IgfRae!_5d6m=dBAV^F_J30`_ zF=xKeZis_01YwoKnX1>9$y_0+7c549so1+2B~v4#OpuuFuU|h|=mTjW~C3 zCqdW8x{iDGhaW|Lpb6Wdn(|`{blZ9u#yP)i@!LM}GcIdv=W)sOiSBJ(nbiRY&xCCL z2jU$)r7H7;&5CIhy^n;AM< z>mf;yJz_U+rie!yz?0w`>XJo+<0OXQNEvM3%!zgbwo<%wxeU<3N_FibKavWd$Ji*T z2Jn5?5K0Ky$+eLgAE?G1s8KTxE6dc!2|EPEuOvi^JxqsHiUhiNXH=hUp1Tr<`-RyI zyKgJrc}w?f6ovl}GR%M5m7}r7!5a>FDxw>Iyy{W$&6Mzrs|r}3y@X*50%MD4wXh;& z?<&QxagJzw+ng|kX6ly@SFbjXkMO9=5pRnYQ@sb1p59T>u$nL9IYMnxo~RM?5F9c< z@2qJXtS6#@KIonHlEEAT;BPy4456wca|5zHk4hRhJJ$@}a~o`jK2c?{Xpv_dG43MF zSg6kRTSugH@U$!8=8o|uS&s5-^_EopTCNRD){a2D+fU^~t(kZ&uW z^B&);J)3G&!2ikC5@qEioiI|Py!)+ICs-+g`_(00OjbwplnaGZh%hIY|b2-=9fnyP5-QczmEoWYM99-(~TQzY>kgl$sT01r$-MY(2U_i^O7mxSiN>9WRI58k4Fg^L2_k@Hfe<|+Hk4FzcOt8WRk@ve8>8p; zThpoVIx!Iuvwswc2gO@;q3*iHl&Z!`1T}&1zN-qGj8A?ppsC~zI&_|6_S@UfNO>a7 z>S)0p4Ls%jX8m}dn{am-b$aZIgfAW)KB@|U7hM44LICG3X2&0xL&+?ux%==_d-g&m zc|g@_06oxXdZY4e?~XGvJ7~2bL%NP5=KfA=Yb<9Hsaw$v{89H2+^lAzHN#t}t|7>5 zRoY?s2J^AUxA|?!I!O`%;Z!Ty;G-KjC{LYxZj7i=U}ujVw|n5lzooeJanFBO;ab zvzkK^G%0UBh;IJ9>y*fLO{xw59SRliB1FC!5q0MPrmFlbCVhr8UAWmtl}UFU2c=ke zL48VJ=OqrK4VP#Hc0~YPhwAo4wGQ1rj*0B%;6rh+4Tvm1R-f~>?P;7(IF`s&Hj!p& z*Uzt8GmrQ=mGyGeo=kxX)*jnH`3L(0YEC;p-`?8=Muti!3zW~8?09Nk8>XDgt9AFF z79jr(a0Pa}GB9+_iRO|yS{H4nc1W7Ed1iim3-eYoN66tpbaXPgS_Xcpx_tJTV~Wnk z3?;f{*r)OS-u8j1x+x6{YHmAC?Te*f^ zONYOMyBj_#3vUruj6^vFOX))og)7Rn1oz99OOscj?s$ACme&-sFr6KC<8A9s98_jZnHUltMmMl72a?0(-!ri zCOC4TD$jF6z?ds4yuQ}q^(~tMFrVEH){SfEfsHZ+OWlG^VjMI8HnZR=s9@wo37o*q|5gS2RI&?2%qzU z+ShyJjm*RCe60%#t#2ftAIwFjG(i<|u4OA^Kb2{Ok#ya<4E@^LdCF2gZS`s|D!R2> z!yVLbC-H)vg#uvy07W)1**mCg96F$)+3fl(8@{u;Jd@z+glPsz60&oWU0<6!6etf- z47yJ{@~ga2X@JTqLN!8CJWWs3y4O|=naHkt)bROJrIIOryG|hV=O`NL55KC-+$^(v zeqpyXZu#ATn|qchK?IdrE}~_SQWzL;X8Nz>=F`V;rOn^08$afls{CYK=BeThb0~om z=zKdf4V={?QC$(dQCf{5*efUlv7_65oZmQp1ul-sB-v-EedsoW11WKci4Yk-R1@0^ zp;$9KRiq3aoOWEs=r)VV3#>sEAi-m|QwxdsC5T^Z{z@xlGo(b1%u1G8qWY)kXN!Jc zep=QAUb2@NibHSF4P4pkzA=nV-I1%@j)u&Lhb6g)>2L!gHkFcX|+2$xA zH(h$u8eXkUfQXzW8D4BAveU}jWGEWlqobl&u~Voco1pSk%DNHc8%*ek^pkPK%^_9jP^gFiIh5wms-6wq zXvFC9cNMo|x@96y1W}K<&k?BqO0pr1DA_*Ph)4+vn@7TutcXzkKpKcHD=`fta8SQh z*~KYfY%XcaUeL6PTx}f0p>y;%Y9y+L2jjNY76-2pKom=(Xe0UChLI zPC_iy33Qo4@M>1pWTK2d`SbuXWZAw?@6(S&d{!#6Lkp*vc(B%teOTBblign?wd;&} zuOHsjrFZ=?mxV74z0H@-2QfAKi|-0kyoJa8F7<~}qt-@%<{Nw&8WB`d`m`eQR73#6nZlBvc2RPk9nl5BU7Ooo8~?%xv9# z-mZfu;ns3~!Xflcf{VmmQb?Q}elI*sO%nx56^$_yi+7N=0XZ``REOZ-{OuOayOXTHn{?QK_8A zwQ4D7MX29S!vR(wN>3Zg0tvO%_88jA^LCT@IF1HPUm@<_k73q7OetrB`QH z>8B0LvH^pGL&^17VlMA8%v2;$R`*+_Xj5XhpFtJG#*}C|By`uzKRTNK(SH2gKx{C2 z*K_79a|N-PH?l39mcH)8qLl{aqJJ29xg1>Nx|h1Y^<{G0cd^LvTG{UfXA&Xf`zY&D zN}jc-l4ePC+0B{kTbQM|EiIt+0gJy`D~&%_!7(-Cb4JGOnJ?i!kAF&~pI!#i zDrq$Q>+0b4|Ab|%%JuA=!Xxof(x9&iQhRGGqK$>hh*@BR4LkW`1lbfHLN7BXCDR5! zW1ufXX!>Uqy5K>Ud(ECT1yvM470AX;H~m%kQl9}LzWFqGWN7Bmyw&hiZIT(>G5g9p zh|SEHb^33NljL&fDXR1-87jMn_*FziKK>T){3{%+kHcoSX$CCD&r&>&57B0@-Ras) zh5sJvx#9$?GkPxOSkA+RTjYS8}l3nC6gl8UuoPE1F z(?7339t)-OpDvX5F`5*#p9?paORwcf6P5X9XqH1u`Tg`i87rRrrTMnSdS|iEEI(E# z?jdr80qUyUDL@iWXM_D`wqN}H<(dA-%sQydwwb33yh;P6hN9^FTo%{F`%hS6^IIZ+ z0s_JpFJ}Hd0jmDd%>e8z*ouUObxlf%rr2My5hXO4g_zcIh@Anu++HRl8#Xm6qgSVobA?nx77FQZ)v^+`C;q+p&tf3TUXri+uq7w znI097{>1>|^Dpv)SpS(HgfgOS36iCKXnG6YU5c&k>rG82WC^MHtCw}ka$l!{fZUjK7VrW2?D`K;WN*VRX*N92pqft;zMaUHg=f#~oXi#>Y!Y0I-60rUKeZ2pR7r~58L7W_SskavBW4q|I7t910 z?i<*`%?5)|k4A_KOl=W=brPME4tD;o-mwMi$XRCl>ntBe5Sp(N;JRil?nlx1ChqCK z@~8FLNT%&Lg6Qc~;kqu)s(3?>lr z*dG3M0RD>?#!L**4)c)&Q`fn;4O|*kQt>2NdWXTo2>9hal?Q||_?;|=~Hc*-NB9YUO0^f2CRzDDrRH??*< z<^S53vuJX$F+Uira+-1LM zC}fO={YN=EZS*UAFstvW*yVe&29s=qsYT!x!nY6OWBt2)%4Z7V}@UQ2(we(e#DIJ)3q5I4RexMJ;x*r!3KzoDMMDr?I6= zmjwM?YVz;e-^|dP`B)Usdu#njSDQWgIG2Avjw*Sa)BoV(v@J<1mi088^S|+PmJjVf zNwx69V~^Y=8}`Z#a1sA*V&~#%T`Cd_B8rlW~w*WC%Hg@x!~!N2kM=E>6@X zADIN+znemIv6*=N6~X5IBthHv{~5Ha`nd_?qFi=VmH3Sf1I;mmbge9(LJ_QSCS=gW zaQjQ}LpeaqSkU&O2EveYWN$djRODj!ab(stTg5AKTH7(b@ztE^cs523Q1&Xk_kYop zW<1*2xo{@r$=&4G>oCIwm_N2_&>xA4OyWuU zy)sD^m{+~2cn3f*S$gdIGitx(o-`QzDL+0nyz@}`v6w@)*}KRH%o=g(;}NSim^9uV z9Q*(YfpEpW9jo{a^Rfsnb~tf|%y?q-BM7YMBi0;?%q1pbXkUD<>j^WDM<|Cb;~BSH>*H^Uzu_&v-(6c)FAxR)qskRvwm%yO?KAS}=WLgM7* zIp%{+t^dt^f#_lMdC3qbdw_c?AQzm@YaA{`BdO(VIV2%0)oD8Xm}WQ0F{Y}_NOR>% ztbdYWO+JxoKUOoXfa#$UQHUf#)Rs}b+{-BUDfF+KT4cA_y#IW5d>L*wS=xQ`bawQs*F&y9d|dU7M`5=H`|$UHt1vXyNu4(mE@ZM_?yE9T{60Ct z(znTH4wpZe5Il|$y3b1=Z;nT&pcphp0q|&4Jw@d=6ANLmL{>QrLJCrZmZpj9D_}py z*W{MaX@AH`ntQPFMR8D_7f!Fj(KME#5BToVS*~{-#y$K7WFF zWE@(Uo1*SF(=ctbVyE6d0$#zqIjm=>PaG;)Tp+QI$9AHgUrvTvuiUngW6u4tC1JqW zgm>tYsHf+d^nq(C?PowtST4uD=^!hz1sXJ|E_6p=_rdRe`~0Avux=Xn zv7CO#o=*m_$YlLyGqM-(C1Huq9g|*ol!_Z&$|_0;EXH2bGYFFzU%NA=5sS%kK7r%E zkCXp>Yz%rF|E8M-;69_{ET$chRcZ)lH!V*5hz&M;ssT))DAr|_BD&^gW-s((5e56u zuDe8Kb$mWw7ad=rZwIm?r7(}B^V6e`^ZbAf?jpif7h$F$i}w`Z)jpq!0=l!qHNZCoP0>Yw24) zNC7%GxUFZPWHjHHM^2aDXo>Lj>Doo^ZRI~YU2egI5Tp6X?If?<5^IZx;e^i(4gp(7 zrG8XT?R}L zgtKIq|B5jT9iL)9H*@;}{#@FN^vEL2UX7bg<2&z3cB;A#*W|yt*|?v3ziOt&MJ_#o zh09v~*M0skWu%OX>ocaU7ks_Pe0}$~l!mQESXUnLul4yB?of7d`L_}H=f;8eC>@M|5m|!`A}GoEJQO9t9$D0plhR$nT^fY5G=%b$AB(6u>;i~?$nbiE3X`VzIR^-KDwp~A#)t@F-$8i5{3`l)m1 zKJ(r-5*4s2s;EEMk&l!m4nL(Q&SpIc>>`GONEmI4nYXxnH+BUhK)Mwaom6Qc^qXq7 zE(fRQMSJ7`MmJ7cN%XG-MQ8DgQ^qiKiSgmd@15bQJ5cl7K4Tifq);3;xqiqgc*ulP z5225phxTu_th{+hUb6NGRUUh?c2U|TgE{%P+44I~Mti5>#4rfbidBRDi(A~kbJ!j! z>rKl=Wwzd}cf?`3StU>6rMm2}X}S2cZt80G95Bw&3>$V*Xb05+<>i{GH#UF3+sS?e z+^eo(iqlc_-y(i`@QGCHTrC3^n>Chi?p*J%Au0pVUdSNMrl?UDV*$trm>MleCHWAP>}4+xI*fvbSqNHM zP-Fc>!vN_{!Y^Rkj{C@JiqTUg108SRp4s+`oLvaKBQ5-^pI68{g1Zbf-TLNU#2{$G z()ccMKzy~4DK_HdJ3aWh%`q=8VrJTX7ya!Tv5{uN=*v-0b=HCm0K?n+h_w&(gF*2C zb4Nb>e-!auh;^|#`#tWjct%Ih^Q&aUj89Iokg3rMUCTlp;DGyj-q5C}r1z6=Rz_C7 zacdLPRQVFKo@}>Wf3)2^lnH}{IOMlye*v6z0P>|JoO+SbKw;n;4Sp?S-s?NnjT%4IPm$e%G z@}~W{Ce2Ec*8EZI-NPr&vk&#sS_92GC&GImjs3nRx!S>I7!rik=Q`(7v2^7Zol?H9 zAacph4QR?HTHSGVz$_cCV_)ZO?!JjvyIkdEOZCiiTn z`g{flzlpxvzCpeVS9NC-eTfpTEcu3HCwXEt9U*-1;uR>9ilBY{;^o6yGFN>z3625KT?jM&A-Xnt5HrLQeNHZXxi6gU$`E2^c7Ddl>M`w_}LnPKGE%?Lr z#H5^cgqG8K^o-M?jJ8a&Xo^zkUdt$*cA{Tv%+`IEm|YNGlgJwg4IyNN+6nfn4qKR- zEH=J6wt!Re09>4YhFl}V6p+6T>BnRGT+Gmh(oGmVy*Fo>+&fzz=*J?u%bE@`>6$k`75(hkNp{0o20m)J{OQPvwT5Z0=W}4HmLg7YI zanJv=@@HQ$nQ{!mf%H}>!q$XyZuQrVzq~^5>C&2hk3&WLJiqpp=ZPw)! zki!gdkCTVYCuVItVhP($6-Oh92AtE#Z{<#~4xm+QV^6Dc9iX0LqgF9tHskKhd%C!T z9lEZ0Yuyf5?s~yHXpz&>=^lvB1wi|v`}h7)4RuZPlUv7KBvR$>woVWuX(ECTY%BfM z5Z~tg7Iwz*Fn5YP3U7)K4BLJ#w$7OC#s=z~0bwYRs{11d9R_aB>^0$sWhtD=gqtEs zP$y#bLycm>{1LIZCUJnIGL|?uRfjxq-z!MfHaB13HI8Snx?WrfnasZP+&<#@Aiey! z1Ap%MEl3|U*F}!y(NhApnljAbNF)`NLNxx*U5eZGDKlx{=BRSG=QY;5=k`V)wM6md zX(Lbs#6u4oxw3Y)ISN{zEbv84=8ySLsPiAVWNlRo!ppl4{{NW$V_6SG{a@F27!)ID2syt36gu)48TDjOreUb zQy&q3z{}RFcF<|3=e#r%af2J0B7wn>?FSQZ3!Z=NoySoT68n?oQcgCdxgjxVX$P&T2&`pB{*OUmkW0m`Y4~ZrGGcAT*&rv*!o9lq>Qp_o!u)}-}MA^tR3d5 z_f49lm^U5w8og!nKJCd3o5trC?Quaetij&8z(+kVHkRPS^Dz3$Ql^;DWwjCQPZ>o9 z^hcnK4nq0h>S+kQ3olQTI5A-yxffYj;ZK};Oi?sNrdp?2fzhtMArV;vwcJv-A5~E> zW(6>O+U@WC784#KzK0mOs0q=Lb;l#XRB2@2!wuSOi$4Yq$`6I36sj zN80Nq7b`?%dl^9rm3YiQCD6aiHB9NKc7fIH^h=*PqFFI0Vvx6esmGGii&T z-tG*Kj6y8kx8bKS)F<;1p71XCQUrLsp<5I8njZ+W@0{atX-gS|=j{el%e1>LdtTQM z@Y@!5U258r*jfnsf0O$A3u%jyn?h08zluY1N@OE5ZbI2>K?ZTIF+ zZ=ru+&_vL9{20im2v_R8b$1v};f6AwTr=&BJL%?LBrLN+lwpmY2D!7qK@+A9p&)(1 z_U+3aE>{JH17h$)crg6F9!f*CnVS6G%olcdbMT)qC3MYPf1Wup3Y~uDF z(9kYOlvghNd2ahaHmXH+jCosH6aHbLHSeab4J}(uW>YX~!>b6JwNv5+K1w`}^SrL( zaDP`nVS_+O?YV{-I{*v5N;qR!gKTVlULz;WA_qDZwE?kKe%7PFkUdv%g z)zL>T1PGxOaZjGH5vkeC5h;meHG)~)ka#cDznoa*?o8`+B;uFdn3P_Cn`z17#d^v& ziZ#cSf|cjT3I_R`W$G4dR_<1ej=7+$^g*8goMJqW3CoLt_X&$G?fhV%H&HWG8s5^o zZ7AETHGDMOU81MqWcE$#$cFJlh7F_A{bDjvk2!p+nT@Z%BzQVT#~bULGj10<@ma1? z-Shfxqyc362X}m&O~K92LmU|OTdQxI;|lv~&$wNofM3|{)v7hd&D;1Grx^@#MB-qd z2os1pJM(G2K^_^7@@RgqL%REq&flie^o0B1pIl@x-Eo{nL_Co!f{ zRVeM6;C+xL{SCu1n;v|$?Vs3{5m6yPlR^lj#A1aQN|yKopSIbz>e4$Q6IO z&^iJU5gA5Z(j|840IrMJuV@V|+*fW$bf+lSD-V8As?0I5+@>hM^Wp-gRl6DOb~Ebk zVw`Kq&U@D^?@Q|Uh|ZibGNTdG7Fe$r2v5#8F4594VB2bhD?ljM+H&YFE@*-FT42Ws zfRbso{p>TAO&{I3q*?ij?do6V>1KZ|qfSA7F2r%(ovpFeWT^AQZ{p-!V$9F2btCt8 zTd$ieVNF!M4DlpBv#ZF7Cs*zzO2v2#==qed_<+@Iov{`o^xmN;WLwY86!9J&+*wGr zDUnW;NRTEV+WnIG=`Su-O7d8qzf)RT8d`>2{TPXk&6`uS?*@>e6c%bsZQ&k2J_I|! z-(v%+xy=Vltg49D9vSGQzxH5(vXn}aQCww$+KS4J5v=m^d$kQ7h{X}C^uk94MqM^O zO$Dd!y0D7gm~#yejyG_%ce5P>+2le)`uTaf61$6bPNSXvFKNftBuTyCHE#Bk%AMLQ zpHJe(?AE#vb-DhYx%o_z$E^rd>+}J&?wJ*7tjRV#CjE4?M-&e)%=!P6c-ly;~y@+`}KL;*H_m{2vv%tTv>Iv zKMAjU(=lRvKnjrN&2W!NLkaW7;x(BhLFU8QQCVrCzdx-!y|a>58yz#k#NH#_K=|J{ z@VkdHZ#fc)78Y}{T`gucbK?^5`+47jCWW-AQ0kjLJozTIftcfhO@G0GSSh1~ygDKc zv#+0=?xEg6M*;&KBZOTD=AS&!i2fD;xU+c5BE7s`tr5ax zDBK%iX$WmEXA1=Pw)~24LCRE&@3U6+9mdj>7_0u6LtMI%j$X?0a|&{U9Lq%JpngA4 zDE``$8>&vkr0f+u-(C@YhS*FmT2(nj%#N>_Wp8gagfm<4J4s6nFtSG{;5~J`baQzj z%m6s-J^>1DiayVkVerg!XXa2Hzwv$O6)?^vw7IWc2cvy%bRBD@9K2s_?>Dl5OL|*l zP3&ySfJe=c>~*Z^BAFg(m4afa`=5EHcgtrZ8qe!*A^@-2zlt!JVyt`zH&0-Q|9Sa~ z?hp5Vi`iIsu!K93*E|3ARILLN*-YJ@>rMzKb1pCbqKHc@5H21H(l%Hav$`z1FE2+! zX1D+oS&G5?5n2tr#s@QupU}R-3JWkjg%2v>*^)=PJ5omE}kN5t!3`r!3z zJeno6=(}=3GLE1LTc}-zz>SC^Ag9700X)1F9GLnL!lw1Ap~ksRFd0=ibKp9$;T8r3 zfUMAI-%>G~$*l+jrMS&slr;Xvb$!1e9=trT#f2N)q>&!#UJ~zJ91^i zr&!@M^kb_hPa*F=a0=I~OhQ=+h$`U1`MZ0gPn#Y+nlQG8W2GeA3Z8p7w3PB;vi3!{ z1UO-f!Ux7wcweeh;mn<@LOkN|ifzU8ElC8$2OB^npBGf09YoHR5uWlS5e4$HyKFsi7Qf_dF{H98)o6Qc{3A4umbz4`!02i> zP(In%Q69-86muCay^RVX7e`%h4DD@@Nh$aYYDqj+&aNkF@ClJhlgV2bto3G7fXed1 z$nD13QQnLTPQ6vOhSzsz4ynoOag-^W;;K_9mnw(DvAWQY{Rf)w3`DgR4zeHO}keDpK>Ca+ItC|$d0#Rlz>9;)3(-mkcO1$|= z6QcPI3Jzt!$*RGZto@vtB{7dnDC%lF<280#ZK5xe2FW~li0BvzCDBgrMPCI_$6dM4 zvL#5hKH|A+1@1jEcT3;lwYZ=Dj$BjAhZMzU{Kn#>7KQ^YSr&q^D@eWGh1U1t>uOQv zFbdMRo6R@996TCW4z#oQO6ZgcE&Q0Mv1+-fsbaBkKd9a+h?_z~ z)h7ac17n!B(rG(I$Dy}f^0W8rRq1?KQ)a`)Q?RuRlq1{h=B2Us8^Z=bH7N!JU_5-s zX=|0RMootp*JmS;-6PuS!M(mEz_qRJUIpE^AQ{1;1Y{(O3yT| z?-soOP^uLp1lDOt_bNQM)JACW+|B5MDRl-;A0_)vGMz#*P_*$NJ!R!;=CL(U9T}Mj zPZ@U4qUB@3-L~I*OgP}nr z%9NBLQ^-73LRO`OGA0qFiI5DDOnHxUv6j8}z3=D!@VxK0=ga=trM0f>9RB0+KaNmv z4KCIH1MddX6^8OWFq)!p`w;i2GLERIz&s1CtdlkdpO&(EK6geI^TOvf`Y*pdSrX*G zQeFs@9FM*?<_ZK@EO&jAHa*Ns;1bKSCHCoTYm`;MTC-eoCuD`cf*JDigX`LqGNCgM zz`CEfZP(8EcG*lAvsypmzJO8ZPx`8@v@-S})tVeZ!1uqkCYPTD?!{{Q%lCYF*qN4Xs90oN zwz(0JPAhrDA*CfzN< zitgQ(!<=jGo;czD7M4q|gd}!f>#ho6A#u$9qgKamf2`~19qxP3@0j=Q)VCSr&Ne5b z-pVulBi?ieGwTv07h)2@h*C@Z7p8hW^ugS8#1%34$2D+>e!p{Jn#++FvCAbGF}>tB z!7i?nBo=OPYx{}No{zQ!rFQhANy;7y|5B$fOK8DQ8cEIk-4XOj^O@2x@g)37{-T3q zB&f5zgYL5)Vj@c|RLyY@EvDodf^Q2v_Hw=)x`kh(&XKZH%twDKGjzJCR5b(pz-@6! z9HJ}T3%hr)#4TR0N$Kl_OE;MH^HXze8nZqEAb{mp zv4z&B?Q1mRuSuLRTte^7#)iTl6`|5}&#(j|#tRHln1;4zqj%+z!Hq0ZQk&w>F<4%p7krH0D;14YLxr1hQH2YM_0s9nmY`OL9zuG4^vaU@Xy^i({XZ5*h2v8Lc zoSgQ3)<5XQk1qQdJ-_Ogwu}-C^%KCrLPONhoLz_j;b*e}5{u0F7z3`e6(t6S*k1 zB4tV$+aHSXb_#zFZ|k|q6LXCbk+s;&7i{-%I;JvRORP<4>I!)dzWUI*$r%dF@Q_&z zp^(-{`f=++qQd*(2KO1#bUrw&4B`y1~*zntr}9vt@9hlE$X z09lyw$V2W7E_t^CAbmD}(iasGF-Or!d9X^=nSnFn=T-MnMf8G?6x?YpCT#%TP{Y;8 zPqM-vPR5wc``q1{{pRZ+@4shTp9^1l(D+QR(&y7_MKW<-Vxr?zo+kNg2E4I*lM+?{ zYSrsI4?Z{^Ed~Vqr+NapDX+AEbu|a8seO>u?eD1Acn_b+@u(wIDH{!PGR_!J->t*_ zKx08_bOl(54BV~{oDQv%&jEG%-SGE_zA;9YM;jxPSOc3T^?7M0KiX}J&1f8CxQ0KZ zDV5Jk2P~ZEchLwDWxRTP-lUur5UXd%LT^1hI|_}9KK;i#NQN(hCPU)v`uQ@bfQN`y zNIVT-CIk5~+x(DD>@=#(IUOSO$r+`NJ}b)=$!r_N7Pg1s(b0+xGtD!`_?-nfw){_U z)Mkqxd*760c6G(-$W5A<$>QRw`C(kGoRyzt(L91>TX6AB%5wrfYYf=HNen^_$S=y{ z0oxM>-Gx{V`z>elY_4ACW-0qm7r>jLPWtHweUmi2dnd|`|x7LSrlilea3^V8| zUs<{ec}Zr(GTSF0SW%MJQes}v{u2)u1Z%Xk`>QkM2&e%ZYIkkbkJOc4hH8+=qdhsd zm0bexMqbO=+l8D*f7^44SzSxbon;3W>mz5}B5vIEs6)N^3p($CKI1aMNif}v1}Ndn>JQ@dN<2k(z82hzNa$kUhSjxEoqIXQr> zzgq5h$&{cyZgFJOZ=(veLe&kruc<T5f&mVSfw(k8h`N)jJ4cNJ(oIDY8!h}Hd-EDnN@Q0Nc^TyNKUb8Te$pL3tG=PK&q z0`E{qIl4o6=<(J=#@*UIUt)Mv}CKvdTkU^W` zIkc@}D1uk+Q;&z7JTU-Q8hib|KkPDZ?jaq;Ce)H*R47TvefUB^;HNLgbJ6`~w+Lr#cm z;ekxki-yM^&wO6FR>U4<^XSS;byYmRvkU?yL1w&)q^?adh!Tj11rBTHm$(JiCbl4M zAQDUEvabz4yu$a_|Gw)C4rG<0@g1G#5>~wePp>)}O}2xws2Irfy;wsEX^D=cvkUO5 z?Q2Qn1$wDQ`8uHI@AE!c)xBnT08p)}H&^EPkV(LoR}<(fNs4Q(3+VCS4Az!5)Aux& zj-cEU3oQBh1wU;Usbgj?%&aengDOhD;H*(YQO~K`9`{cC=v&RS2cIr$dMJ(Kwn}D! zwypuPE2ASH#;>EdK*{pm6E^_ix0Sk=1mWhLjhqN5pxVSB#ccFEkUPR#xj8tAq{@r|sY}dU#@vQ%d$SlsrNKcJq2-GyJIi=5Ry(NkINA zoUcaxatfmIIBwq-4QekXqk|tlNdI`CD0Vz#fMb*R?>sboG;ga&-%dSPB-bGY=H=_S zSdH(WbutJz2>>AQRkr`M3tFU#4D}EJ^7X3BxmO*TsdVTG;U99@KwDnVV&dNIUQA9c zk`Vq62Nrz1{@OBn_1_o+d|xl}AE%=pc$VTr&h6c4_mR}UXKyyr>p+Q{=%5oyKf||1 zJMvqbTt55RcXc7kBrJ(&3Ll6Z1J*edx_X<_@|ywg*z7dzvP}@v0_*h_NS+g(#1ckNLSS4@ww|)kF@c3nS@-ne`kCDqLie*ABfJjtpE{}_d&T+ z{Z@&N`ZBAMcKkTJFr#K5SNaXwA{IFzvo4VmGODPTmZNWy^Ete|$|I8NMu8%ZV|zsG z*z`daLWaMHrFwHX37*4wCueRw6o%*a_{Oy#IBiF_u{=HU3~oZLwzR}>2J3M`T)=)g zWoq*BHd);T6K8Qez4*`ANIdGceQypNi~lad<@OtB)GuWM=~qtg!Fl6qd~s{*vDZIs zde%X3XY+@>QMLXmTng%SiDU{RW4m-iu{3hJT)Soi@+B zKpExo$)OvOwa4{yj$iTm257xm-W_MT+O~*!Mn^)$S)^IGrNllxy2BuF)&+wI(et%S zxrPhdQJLKG!>#p_M~Jm$R>lSffwm7qj5-y!vQ|%KarCXHUb1#{efYVPDtnr+8tDQh^$SmzRdBMI=szeS4qMagmb%V_#((Z*g7(_?(R>z@XJBkB>qxmsBn~( z!mA^MzYhJfW6O#!_m9Fte}O#<0(5-s7xTW1S>MsDSO<^4Im}M7Bo%miqnb1g)LBTh zv?dw{<2V2)8}sEX%*|f_u*D13mR>>bpQ7+@fv|_t9gZK|Mp8%7+w~hhTL^+TLe+j_ zu=02%n#IP92Aq3%DPAi}a`H9Tc!~y(@UG?Ls1wVeEr9 zBJ)ApJ(&_Nd2t|1U=hJ{7g4_MuPgM?QjVB*_;m{jvm zvn0_=)?xJ(?JbVJp8Z}##4MZ z41C0nN59~j`YnD1%H_dno=1ss8B!xmJB#Mp$DH4Vl207Ky3w0<0D8wgz1Ckz=P@tK zJRE@X%)*o<`&Jen$O*8bsMX6M*htLw_d1MRKB%WKEwA;a=KU-bT(kkZ4emMhaVEqm z)-T&~^!QO(BNauH#d3M3#-?p^P7Adv8&A_GOa>iLHQoI9SOQJ)`_HK>*qPN41_k=Jz?P` z(BNHsY>JJ*gB^<-u4z7rBqqN!QNK~xLN2ZwFJZkt2T-yh+~TpDb{pK5;^R0%M1)RV9H;{CRc>PN{LY95Ob|hs zqbJKbSL|zP&`$pqvixYS8GpO#_GTbGKpAguj{bGRSu*z5hr%DW~&KmF(Z#Bz1hf@&TQ4=u7>f#wkugm-f_Huwp}aGN1xAFL8? z?QY2CTa+OIu8lrVWKgx`V^YOhSa@C5UsZ_s*= ze|>s5>%GLBoSQP&5@c{@j?$YcA4T|u3T88z!@WHdpjsx@T_%7V@5?ZG?5zbn4G)s2 z>8zd#$SdZaaLrr(uP$JM$Lh!y`p7*a;UK8``qhEFR0v1s;!kI258&YrgEEw$6E3ENCEGXS)fW7XLf{NSujUGaz9#JtJnswH z!KR?93it7m52P>1R{s|KPMDD9i5_rW%0RlfeWxx;{B=Z%_W6j6NE~!k%3h6j*Qi~k z0^?N`6Ql?@H@^v|xBHQ2s#>HQu2glD&>E~&Z6O*z=6+i8-a!aox^H$%6sclL-&hM99MOP?Lp5ilQ443== z>uK}2N)|X#Z#kWZqz8oN0t+}U#nShTT7t|zXW#UNq^XZKOOvBnx(K)A8i4v5zq&uH zw7*5jcM&J9MbPuS)-qyV_LVu7Xoc9nZ8|OYk-uG|zL<k zF27hz`$*agQjJZI2lnEXF-lW$I%$wxW^3)v)G z`-sC(B12_6u4kUvvSy7UDqX9|uyNV2;AIb8oNU)zk#Od}eIw1rxs$@0ZlT0R+Qn(n z#>X3{&TFGvt5Gn9l(~z4E>&DZ*eMSM{D;W|0bb+=99xKT`iB=1zpMV}hzvlkhN9zue zA(@-mKuAPX0w`p_iBtdyFp*r1!8DK$2aswf0EcTJxqIa__lg~qN-W!`p=`xeCW3vU zf7?lXn`^?7a2hWMYfm=5O}#XIM^#pHAGu;Sk` z?o}3=3fTX;ummz-D9kXMzSE3wuKcVPUl!8Wp2V=OG4qx`Q73D#pQVC^5Hlv(WbWnT zEB^J!jBdb@iE{e2mrSnue>}w0QNT|R z2(WQr;qfWGl>c}~7m~E{l~Gm|5NbU2x)vH?&;Kp-|1Gq~|DEXnZ%hZ0lWdu%Ncmca zha{%1sE0f*`cUld@P#xZ+H;;*>-|2WcZj5oT3*Av$-kjC+$?8)en2x4Q=jsWpXiYv zjjN887E4A9634EZ=rA*%Nx&h z)0S@g|NBR8$LG4RP5ojxagxDnJ7QDWz!c7wN{^aoJq-bB@{~BSdOWJC=^S?hI?dv0m%XA#blcu@+mK2;AOIiJm)9?n2nmf{H zPAd)G-Qi-yF1p+OZy)ZNgKQ$?UVPgp+QNB!#%C?(v)EQdGN98lCFLi-?ExW~*y#G} zUtRy-Y7I47ShrJeA`Z}Bz7%m&$UN;g{e*S*VCYqvlBDp_AOH>yvoyE6O?u^T8eNs@zXz;R>;@}jEHD5!iX!rZF1PHRgy{Bc{xbc;s ziB)1H6pRv8F2zosnCU7*nfxo*t?yY<2ldR&-&Ux7Z=|DI6lTOZ<){H*l509F>?EER4WVIqZ95o+DnhRp%u&1!p4pg?qi8v?B>gPkBZMi-Yfo+X3ytgI_+Y0letFC*n!+57CAZZlhIOCb}Zb| zj;eqISTlTPm3@B>wwy00Z2C*3qR@v@?b7^sBBdD^7G^DdbG<`b?%nNJXRf{LlnR|ty-*sAicmEC`4HtiLrG4Mu zt_F3n_mPI|K^1@F@N-UHuhkboM*5Q#_xgwP){9A+%Q;*0DFgJ!2 zbpkE@$n8W%)>a2o5PI<~I$sEdJCpj*cl3<+pQ|y0+{aCwWvTQ{--;d0i>`=_B;R*1 zQtzSeMcr86kV2a`oTwrGG^L6kDP-Wv4dp)qk4L8^SB3$QEo21E`7zqW2GB>bl@^xS zHh2u!&+0Q>FSQF?>|^tcZ|$Iz*(~-Mmmvd+fbTwc_9V)k5Fxa|uY;6z^J4b@Zk2k7 z%JE+SyweyTkqLv5g$@h}c$fy?=Z%H@1*<`nVhcemy|4qD*@=bV`Ayv{jPLy#5M|NZ z6)B^S9*0@J2^4$Qii*}c8)H+GYm*>ixt@hf%=-w@Mgrl(l~l)+fefQ-bI83X=|^fY zfrSu2O;E*PdGR5BrZ7ZJ7x(W}L`qNwXzUW@__>=PWMIQ2v{Ct_&%ZD+CR4Q~)=%J3t|V6=?EWN*_aE zrUp|uumVemxvPhV)!+lqltGZLoj$dC4%2jPC{ zue&(0)afVZ73?o(1}@GpC_I%*7_)xykg_-Y*}DoelC#s!#6N$c;o2Bz%S(s8Srfi| zkr1usOUP+C@ag96*(n7sB_|}c zvVflZR3iJ|FYf<5DAv&*Bhi4ZlQK$)DH_G4`Tfds4fU`*Agy}wQ#-c+D#T=F#RfJG z{e?gQRI2YG8fy71lT&VM2=PPcZ%O9={_2q=YD;oBzLb7H>v2fW7|G3#numQ(NS12G zBTNVV>IW0xuzsJ&rrt-7gXBKuI*d!+uV>T&SUeCLHUt(ZbHY3ZM^g%4OGb10+c0Pw zh(9UA+^#SRb3KdPz->Uf8bBkLV-EEz83G52ZFFeo`L$e;d&e=8bm5NyL`pPmD`bAY zywE|0h#qOJKzGVR5F-tLhAQ35;42l~bNtCr4{#tG^s~N14b*aVtQ1}D+EhZht-`M{ftruoa^oP$6`h!nrNw1E?u>k7#9 znu-yyPJBge{+`hqPWJxOHh}9~34ODv2?KSjhlR`ZFs|6^_|b>U5ZO#2X=0~k+amnN-?*ls^UN`iwnp6BN#>;~wVMX@*A^8@nz zRf;v3H`oBQN3ZC%2+Uk2hI}>tr)ik58P|?r$C8#<%G36e8tI%naKLU!0wPeYkAZc# zCd@`DtBVpbJUTkJ9Y?pnQ?rb6gAN%qeR0+aG1|VWMZze}LNGx{de>PwFuxOULhSz)b{BJkrv%Js< z6HyXljWu!&U)snGI+NYeCV|e%BHZ{k0QC5|Br=!5lrlN(@)Z+viI3jA^*Pak89w@! zg@qZ_!F`|$I<~d$cPB35f{UqQ%i|u)CPy1(2C@~0L9Gl?%dZ^U-10zYldNTvO}2(z zzQ3KiM&myUjwNd;D(>O>Z3D7TL-qF%z7>I-@jFYvdkL&!?#%ZqT)zZVMfT2P(I7cO zj6aw6u6o>LBZ11of47JfYpn5Z->gY8NmN)L;Ud)B|JBrll3U%lNg%O?)HU{=k@9=V zMXIZ(5LW)75!>UUCh@D1QFrH>x$b+gP2F8yE}^Qb>!myT%4G3_K!;VdqeA!8R6}tb z^~ezQo}+XP%^9SoJ!5(i0#owB6j4`AMAkQgX?nZiAQ$seuXHRz!Y z0+qlwdHf6i;8E8AYwG&?A!~+I2p{H|r#k@Cy<7Ex+8%9?uj^x9thqm(W6h{JUI&Y{ zxZ`!m-RKYFkeTNtvv!R&VkRLe-O0n_b1>?_p=`-gv-ThJkbk%1Tk%GDNtN$uhCzWa zAJ0sVYEp%fspof|bC&PpNO zHJA%RNE1K$thvC|F_As6j>p95?iFp&IGn66T^$Od?0a_2{Q8P~ZVU9lg>{nfL`s$} zsx|QC5WWu8(06j5G2A#g@fO{se_qVx#+$+0AUb<;-B^Qoqc?Ay$V5KYSPGkNIF{y7wUovYa?~6?B>>Eb~!q4RJqcse~!VwWMM?N0XOWWjSOlL zeJ$q~7|89UbnNF!_Nbe_K!yiN{FR1-ow^7phQJGDfnXzAKGPo^*IOrmL9nD5cmgW z*<`@`PEjz@r3MxU+p+T^SU64oQrW+sSla4QY{|mudW_NRt!E3#M0Rh?^HC&vO{dT- zw&-bjJm32Hy?I6{f7%d*+&g)xfx7>Xk&J!q9tJT%yu1x)d1PN3B_Vu3)yG*M7DVvi zBSU!q6{1;2tUT2ob)`XkO4GUYOMvHz2k7RWW!-IG=ZaD}G73~0u%^U%yb$G`$$3@r zccL8^5VjFv_&9*10wMpW71@AJHql;uz2PW;m&%>F$3753h+~rVz6{A=GPykK=|WB} zl@T<%%#2MzUt0rC@Y+ZL?YqJD5^B?BjurHJ5eU9R>r2-%1CksN9n~6OtUhNKVmQ7A z6op!?oox#83-mAjuvyr0bBpcGCIBfDx}u<`7 zY~%^hUS8Yx5&FAtMw{n&STt+Nn{nOr-SUY=&zk#G|F=~nZx3F-cl-S160F0I?z;Dn zc&PeiMcRPoi*Rr0y*MKq>JgG&UhXRZn1dBTP;MwnoNq*d8?m;1W8!e$SH&f zEB|`$9PzARX+~CI@T&_r*%zK{#QpWR-oTOxUe}(SqV6h_17JGwdjp7Kz{_yS+I!Ob z1iR}eNf_>p-14HJJQd*$#W0red3s@POP*MgINJha6#Ei2SCx-YAwVkOsBfq4bvftu zoKVR`Eb%CRr~obn3@yF@ZqO?4N74A$F@kv4SS7&H8FoR%Pq@3+2g_y5<4*^U{5`dM zL{{b2K6_32RrpEP_u%UJH;xcS{5(VwhL#WY#&(_qLz(>0ck1V~Sm3@Gr}>XH05!U6 z;(A)2t^(3o0Y~KsDls4723+Sz^+{crQg3!()`6uBXU|x6iu=&>aV07L~2E#UCYMq$ogv) z3v5H_g<4chW5Mq#g4w+w5GdfZP)U9kU!s> ztYQYNe9TAA{OIQEIX`c;C+cO!Sk-UMw@27thWPd9)?EcFGH`@~thTNTI#hFre?*Ea zi(l)`75kIxyS8irn6UhFF(R9jDo>rbZi;fE{2Pin^P3tWjkM8p~5uYFH-}Gb~(TH=6KCS)W%85+yZP&y%M zVo`6wpAWJ(@b7?pgzY!x(BjaPzwTHI(Q&v1b>w45iQ@e_Bqo^=3G6un*PZV)LKCcO z^u%1fuvyVrv4nL9=0{Dv9DH4zPScVmb;7LGSGHcLC^eEJuSCq1SMIk)ZSii=9<= zn#9_NgG^RgPM^Zd(6S#io@>^{s+L?`8A^~zZlEfx)(rVG1VuOt41OqAUgC>~?9FvM z1^wRs?AuX3<}6)eu;p7CFmRUWMzj=PqVL%M;h6|R+nWG2k*e~yMoh8CK~naEm0g@F zndU-efKyf;F(NW#%i=sB*I6#KTZ$XB#eZM+ZM=j`32;ROAe*`Ys{TR|4LZcRM*ZVz>PeYT`e)OspYb-$)sw|EEM}J|H|)|P0?Di* zbp`I!t{Wr6BZU3{oTz-A_35FQQPe^7v+#pyL*(336s+AYaELAb?5}hvlE^yKkZy*yyxJc9hHV7CvVoJf8{5G6I6A1Rj1ypR{uaC24)LC)Vj zoAOlbni8eM9Yo8fXUlKUrTwOMm;BUD%6t*YmCbbbY>BX6va|FE11kg@LpWd!55}JO zVTurG+6RpX)MBEC8Jx=U*b^43kd+Z(69_gJpJ+pTe2GzT9SXNTHSVoe$89kSLom)I zPxc2mFL0oAAbnwDxnInsTwCekwqzk^;~`+RT?u3=43p6>8PfHB&EHPBJK4#JwGlQh z&^uC}W-GR}CXPUh!BA(@e+Ku#0yu59HoPj%!@>@YC7r1I>I>ck?p^PLNGrXMNV~?= zd|5$?G+Em^98c1HqdqQe#i=ZVX)|h|AX|rYKzD;tz8+h~T*_AViSB624VeCt^+x(H zQa$S6(&7QU-`tF9wQM~G0OL?a`^B#Gg-pU>komHg%D&C#Q0N6}5hJAvWG0f`3=CD~ zVBro#C~+gQT*?)4u+erJnX~dgHE%+iL$0=%hqVZyQyPB%TskLNpV+w-_3oafn0aBd zPqU`n#WweW<6v1=sMA8IG@D~j-9lXco?uU1W^c@0T>guO=3hGSH5*L6e#MJ&@K3zx z%lnIjsG(Pj2VQhGtC8UoyeKHjcATG|2@1wv26q^ev2PeeY&R{seO~n3(hMo*?>DS8 zJ3zeXr>d6EWnG^nR>d_j1;kXgP0cQV#6Gb#1F3a zSzM1q$3pMyPt@EdA}YEjvK;)?xZ|8B+sYoY;my*gGYG_9ofGtrTS@=l1K6^AJO0v` z+ysU-3#Ml|{cI`;9wF_*rg=tVC%)sjmUZ3tpGW{E@k-uff@o;GBExEAk~aeALG#!& z!|HR30=86-i5HuRd}q`_Kpspq8bB^19`tp21beYZ9bvjfpmDhrA}3Ut3N=s0nWm?N zWLyFJbNKAHwG3U>Pp9MpF2O=!tNiWjx3E<4)*RA^szm3Q%{8ZTHmuyLTVZW=kV*Jj{lRTV5$-I?Q%VJ|?@^w>TrXX1UkyVrzMHCHJU zXZX%3aqQJ6)P8r}*t88Q5ke#C%POqkcfP#3rMqr-xYfvxDn=b#q5_%UE$8nIR!Bty zp`YdORShL%bB#)ih$hgHy8`O_*-dWbJlxlHqP+w-pGE#*_#6O%gAm1h_?0Gg2+5oS zs)@^9`H8iI>pqxS=mF*15SRFo7ic)Fso*uS*zxT*Y772BSv>zaKe315mH#XMo9*PmV zhWFZh$OL7+Eb7)n?d6-JsR&HbYDjSSOQ4zNbNi={-0}+FrYQrKboi| zF0%b9URV+H#H>5%Giz3vd`-X=4c*ZE5Vojq;6B@Ys`YLmsOd}FvIh5*)OZ?bP-g~pJ|^W)f;z!as;_Nkw3q&+^G*%WYzHCE}ttnrezq9x)NHY zsSBQHBEb=TTN8(QwcM@U49T!yWzaM5n`eoV(fuX|-|8lnAi}Q%ShLtE{OvChx6$9; zj&t-l*`(xrJVHLl3DTR=e|Ia^zyR^@Vy?`kopsN(1RlW1uReT$ha12L;zwg^lHf-L z+}&4x?5CRQ3Ick0BU+b?#vI3j?bIA%9~#BgLOSad&npmC({N-P_iA@d7ufdAWT4Xh zkLYU#{x?D)i2Fc;CFWq^Yh7&QAhcL|DL~bLDF|_B9~COi6>R7ed1_KyTUwk zu%m$+DH)(NnYRv{M-YcC#Y@*w3DrFfGjXj_#a!2uwzTm|_0(P!o8w<6P*bH=-5Z4`Cg;cru-QpTf0eDUMKfe_rtz&B* z8-yym84t-Dyrn%f)g7G})>jx}jWhDFKz((r`(~D?d0RPt+ToECrv_=MJ|; z*0Hd%K978z;bXY6kPGHpySt4=oO~aER>;yX zk!y>C@@PWys$UOAo>J}hdAy=(Ox)0nNT0E7?jc+nP^OD2UFh(sc+O|dDl#=#Df9CR zbs0#SM)WmerM>v9+hP!_m%QFkYIh#<6&D}+Huz!w^TMw!oQy6MbD?MQ^Wg?Do zpX#1#?GL`i_?jbwx>uV&nfiw(Jid=GtTBx}@^)m$5h=OfEz_+VbCTNot1J^SNOk=u zY?YRj6x2dv!v*O$^MBYX5(4}AR?^8#7%q_zcwU*q9}cD?l(P08+FX&RAa=H$;Vx{- zPQd~$z3*JQ+kY9SYOXio}F$(>D?x_BtE2ay-qRV{$-Ed_(vb~1&M|CC< zDqRl=1&vjN#w9I`^47xvEa`Z2Sc5W@*3-WiQFyMk5)U>yvt^hTWP1>h$MRzHBon3?;wBcuz89Re=gm&;PnU|hnDB%l zx##BYS*hpVKfCM^(tPVhJ=HM~(cqAxA31$_Uj}HD$kGESy?QcVP1-7QJURw(5f?z%FDX3)ZXX`EHr> z3X9|%AEOKT>n*-Q@t{_{o|mfbCdkKlOKn9})A9PGD)B$O1F|YIf0qfh2}lLg^_>LETtmGuCk|3B z(vE1J3QRf+4Ev4}YzN3jzUEAqWXnLUo=Pb6D|D>;3bJ5TC=IR!L2H6cHZGN>_ZNh( zTa5)|s*f=w6Sj^x)gaSH2|)|YyN;4ET%vAQ-Pb6qeqN62R~gsBYLgJ>6-ZB`QjGH7 zSf!=}y*5X}a<4LMR?3NJG?Onq4EPFtpVyC3hc+V;Hr0c?BgaKd2GC_xMM7^jcaB$O z>?8CQ=bSx^k-g;|dP~%|rlbrGqyMYe=Dh_VpGOX=VOXFIDT0^(W9g{J$(js~v-nno z(ALj$En$0DC|EwM%j36K0nQ>>z2bUi%-MMHZ(4wSlUZTW%{r{AryJG}VEaI1TjF z7U|IRJn(KkVbkO}Mp8_c)774P60tK^mw1^`>#Ah4cP{^wHv3*WP zqfm78`>iSH#>^oUj6wJv%>|Psg?H0+CKAs*x7u>&qoXt#^4fL>r_9mOX&CJMP*g;M zz#nFDA||ue6EpP6{y_m<%kM}Knu zto)Sef4T;MRaoJEb5sWbebwUXPoyo8?D$q>Yr z+02g;v{eGhDoUykT$am9G9q0KJCS~QtKQ-_dyvzaccs)VFeTN+(xEfiR0(YldGg!Y zb|1BfPdzBekPIw>7vrYhEBj}pfTU{;N%+7}Q|wr*6kSuRPp=0$5Bc)~FisD08$WLmVh_s@P!Ic_z zb|1(Q9*#qfYAwRGh!ilUq>0{=iE}2D(&$~jFdvRWn)j^u>sxbh5N}pnGF4RU$s|V~ zuSqAB``fT2bv5J&SoJ5P!!8i!bA@C!!0^av?kA;srylmeGA-f&ondUhsf z(fYp-Bq)bEMNM}EB~(RjOVFBG6uDgIOk&b&cP7-@x%-M0Bolb`UlO zNRvD-k3g*^Cl9y1&392ojXsgWK@GheNrB(1>^

`5BIyD?~KsUytsdvjCzWSZEK*DtK>Tx!thS8P5lcEObET;^Q8S7D+%p-+4? zr|5k$IAoL^bA$YyIYnfngwVLwuQu6D2yz~W_uSZGYp{O*VUd&{Nk+jHQk{Z9yylag z&qPO*Nd(Xl&P6BdxV6cKkq4+Ee1R5M=2^Kgb~3>ziD7~@cJ|2ITp=VB2aH3O`?%X@ zGb@SR=l5_0mPwiB9YZHwNl|m18TyT+s-~GBSbGROxoP?&qcu{t83(cU+luU)w^tSO zMV;A4IFTRJGs(Y2@tl*0xfms9*^NTnPuAROYyauIQt7C(5unWCy4Xo3MHRi~WlAfX zJgN{5oOLJIkUj~jz{3E>n%&c`?xZFy#qr_4zh2BKc98D=W#J zGM7Upgdy4L^sLl>E0729GH%Rp>eK;};Jnpu)p4ueq)8Ykpes}zCGZp41ap^ITi()B zwDfsmt+G>EpM-%4hnx`Bi95QRsrAgC8pi7aT8ug6?j!05DuOT*(!g zk3rs79D8asy6*lWQnX&h$R^HLwY{}V%yshz_s7zX)^Gqj^LPG!xRX%3{>_as#qGzr z)+&2-m}ck{OklcZ-pethC!H#JsPO~`Wk=V~M4_;Zt3p)=rhn&FMjf5gv#F(!boYdo z30{IEtagZ+?XT@1=_KF@sK4^Q{#btZ^uE45kLUX^eQ(Os5?j6>BG;eOOnknF3RNE2 z)Q1Ayf|)P_Gz0-k`Xn z+10yl>Q|<^KOP^Z>wKhWWu4dlcrKqaqs+~Vhm;9o9-Ny@F_x{vU9i299@y|5VV(HGfP&m zvn-1@bwN(@C?Qg*JK}CWUu~#|wuqDdGHUpA3=VZvXLAJ&SLRH(?;=Iavvv+}P^@?N+r zFs_D=%R6R$$g0I5^A`8k_KX+Z|IjNL@#EveUwM@cgO3J(8k7&Gbe}Bh?tGM1;uO`a z-}b%UHJd)0#nXu+U{SdFB)v4h4VLyz%8mMAI&Z59R*9Sq6Ds6*qzuFS$Hl$iQ)WSeUtKyr;ha)b(cwi7*X z(pP-*)1HB`VM7mY1j!SZA0t>-b$}hS9VMHXJ&zLF&y6peXqF>uug8MG!)vzOpYnuE zsnb4iT>53DN7EDGxwao$7TEDXPmp#vSP9BBT5iRXP$vA~+yNg~ppmR4YvNSO8~Ot9 z6^%T`)cn?)HgWLLH96K=8#He#+;$Y@gy|tHo{+U;FG&J%5g#Vg7kt|C(o-Q3hxuZM zgdXhx&fuZUR-LY3K9{zD(>&uiT1Gy_$#366H)+&zi+qnESEkF3(&k4)TVcK?&N0FCrlLOK6%@ia0o8;XzDGT zd|PuhvPPG$`cB!_)vGCk&)6hY?$P#}X)P&9om=4Xj=sBWWOt*VnhQLJcg%96KM9J# zvgyd0%V0~tf)+$nR<48f#Xe7-39@sN#@R;@1n20`Ps{cdHuHZB`o*C!RCCYLbI{m9-@F}ZLWgHc7BVX-2aeP4$KRZS2+y47@Mp|V- z9fZ9Il6F_e?jx;e$h8UWH6*)2U=HR{)v~$Tt@HBn;Tch^or;t8>i|~ch=4MU zQx>;+5xM!76Urj#i}4+iWXM?S6m^LAU3^Mnq~OS9G6lxXP1~Fw6LlywOm=NJ+X)LG zgv|Hem1SE&;gCym0Wg+!7cAnrrp<^xUI;p2CHBK$Ptr$x*mk;;Kr(M^He25L{_LO; zSeLGMFURjj;O(=tZk?VyKMKxFFjn6+TPJ{8)J;4@uG(MUYDOUDjIZ#f^gS9DXFM%}n#G#}aH)71?7>yEg?|<;y>Q8wHLURkgh{u;d`B-W)o++Ho zJ5(v-@`*EeTKCUws((ZmM7qr4rHq`>3>?ib9od&rxsd(`1(iP^E&85)fiH5~oF2KA z!E3vJ76{KA5&Rf-GxG5dDVxJR2A`l4KWibdBmyl*=n_~pZ{_o3&`UZ47dvyp@GCQ-aHz4O#O28V91b&YB}yWy?n zoINt<7c&hWossh7tXv9B7KK%19Tuwegh7h<0kXiGkzM{2Nd+7@Nc9W2w|On$6Ch;T(xNy?xu{=Eq5 z#4~e^I$eo~kR(QU614z!_)5eup|MbRDl(;jXD_aLWLQvcns(6=6jH)Mc0O(*yj=y+ zzh{PhJa4Y&m9Q%K5ND*9rk8~a*LKe9AFY`z{(t$y>t&H%JLYV}hHAP^F<0(D4M{uB zKj_sAf{faYGI~U)wKzj^@vIbLJD`?xLN*OVT_iNnxLTXLTTudNwMaqWHXaSNE^7ea z>38?qC)?10%v>aFYzQU$4X7T4pqOSZRTUS_b~dV90(@($P_mV4A0G$fXBm)&LIOG| z*9c{i-1w*?PI*<46XCZ(Y6t z>?DdIuhA~4kRKlv)DKNlwarOxAevT4n;Z)FV959j>F?U4<*oZwL^$P|Y-$|sxlVbV zy53%b+~6w!yV4)W2Qh+O_PrsSyRE7X8FV9G!JSoWWG&wXd=ni3pPt#{{4245K01_b zNC@v4f0ORJ^}UNC!S|pw(_UnmR9S-#@>enlhT4nt!f@wCYce}}U`5F(mT&F#H{Y#C z`-^8#^`0t*2cq=&$G7tdFqXQ^8kz4&y>kOAg1^ZBY$3Oypz`k*x37C$xB6o_b^1;2 zldJsK+Z$XK`B?4nE8Kvr=OOxZ_r0Ga7?%?&B4uF#8)VU-BO%uuJ>D%Q@!SDo8Xvci zX(Tdk)NUWSe-I$>^2EKdrrTECie`u)5Y=5HEWo>GuSq%m!4e#aa=SM`KG;S;}=95W7HoLF7;zuU?2m*?pgaon!&-%TWK&q_yR zCiZDoXV|=K)H1!aO#Ntqje-M=o|?a-X-EScK-v6Tf4N{{=F!bDP0z{n7zPCk+wK1x zxQ`Nn-tEJ{fWE0eT%eFY&)P~wnz>{8kdO^P-U zGFgW{hiuZVz%CiCGwrBxT3W8ZB{_Tk^7UlA1Oh7!hR)klXBh%gyQK5PqT(ve;4}fV zwhj05K0v`r@1#&dH6)0j_4s>^upg)Bx?fEe&Q`kd7_=YS&3;`}6kbWVQ2FW#ZswV% zSkUXFdYwH>G*dqD2k+Zl56=Ci|Agil0ta1b-ayauc%?Fhzp3qM z2R%A6Cy}Z~!ZU+xLIA=oN_VC#dWA$<0amL1v%#Y?dHa)fUiC|uIiXq{f@YE>e@<|( zm#(pEyaqru(2lb$SW@Is2Ux4=<3t`W=f;{e`Gjx>HN#r#7dxJ=+jbST<`*a_e!(1J zZsaN8)b`~b(eCUV6?yd=WW~V$kad;g=GK@?~)0o$+6v9OgO5$jnq**JX z&h)7kCCMBdN4h1GpJH+EwDFxKp)I~Rlq;td@i6~lct+m&w~4A|;9pMRUu{Hb(X9y| z{T~OA=JNkyC54@%U{}b4rqi1uEz+@~CGz__SV|=ttJ|;R9rf^xR zaOw-;FNej$6f+~EygUg{zf2u0JwN(IK29QKm#dR?g{xV8J}_al_^4$oN5(J;&H(YR zQ=F~?EvsC@_?M#NQy+T4y^KfT8gAft*YW^i8hVSQRQfi(0B|;4<18Pvj z+ZKZ=I3*LY(*r7Skkm2LcGeMX*eyqIRPV*WvM$be%d!lNGTbvnfpQ_zBx6PmZfX$#}EV=m_dTbi<@ys@Wlxfn%|xxwLl_G_1%5U%evBJc7<_@aQYPWGXbnXRuekQJunD>w8$r$;j0xT$=UYc05vdU&H4rB$@_rQa!9k$) zt#jH%62h}v#CU?xqh#;E_zDlHog;58M+Z!HFuwBKLGSV{Cb_6rlF7O`gJ&U+NC=Jn zZT7xHA2h1x=B&AO?>6WyeIxpFuHKMrI_JUq^rvXKmI4*Q#$1_qv6Y}#8s`W_MswE` zNPXTFCc^7HD@h6{zmC%EWAxKUODnPT>q%1E*PgYN_Ln>(*bIv(@ssp=N(?D0bnw0W zlS2G<0FY7>ix2h9Sr^4xK8bI!ZCndw&q3KTq7e%I(51{Ou70FA4C~&?*&}(XKapsq zi2$cjnMc}1I2GBJe!D0gcW&7QLhq`W@u0C{K8LmL%Jkj48tbfa%Q2|5qB4&R*J7a5 zA$0?&dj*f9TNFAJ>FFH7C1UP1((-@h9HL-mE`(tr z@04L6Q?_S()=!=52`s6Seh0C9(l$s!jqlVUZrW-RZ)7bdBkIy)Qdyze7@?BS9R@FO z_yvR`S`F?p%t2a6urxHCCtb_;9B%;9!o+LsK8$!azk& zT$;9<6@~&r6ED?P&EE&jJ3YhQ1p1B{laXe*B{IyY$i5NPnuaK1RxCI%7hAv0h)$1i zzB~e;+-HOP2$GWy+)wM4;bhK{4mrS+O;E+iM+_=CR&UCKdHM5uEkn?w7X#8k3@ z=#cD8$v$(n7a0^8mnlc&%xxq7GP*fjqqR)J^WgFFbl(t+DL-A4UijPJ&%VeVUQ<|3lk*$8+89|Kk^-sYEKGR7xRCzJ&SvC*man}Plkr1KzPbG1VP;DU#}x16xjqd$jTX7N)sG4-YkFX<0jiZC}3TVD7WzUda? z3_Gzt{RCr@7QCTVjpK($yMS+$4-&5%`BmRbAk193zW`kz{44FmiUj%kz^$JKA*vvU z@Y#x4k9ojXf766}XvswLA_8-W)#RI+we}tB$wEo{T{+*0dXa4{9~BL|z6ifyOj;=O=NrMO_(w#vn^W2F}t_=TkQxkAgFYf;HdoGh%s5j@36yX{-DPeg^34(2FlLUm8#3+iX z6B1jo@AmWJZ4k8DF86@fJg%nisNxgWmbcQapw%UIh?}*L1cIVOEU#x(60xzB_uu*U zln7Vl#5Ju#4|X01`tCMyqCZN!xJL3=v5WmV)S~OFI|fg@;>Y{0Xt$36bhYV7kT_TF zUMNqMNxD~@{`lAx6mE$GYm*wzCfmX%fgkox4Xc<>zP5k{&56B&LL&|)^;@fI}BCW7wHGjcK7NHYhkLuSs;-|;}L4k** z^4q4U)leLHBB(x02|gCdUIu~qj*GcA7DJ1cMC5lseZvbae|Eygn~85TcCmykUZ`=c zgI{CO>}ZcvcXK5R6~ID^7Th~tW9Jyz2Dx)n^@zg?_^fw(8eq}9Va2I49_4%chGHOa8PRj!rjqMCPU+z`89>@XAL zqEs==tpBoCw0cUVoZpBI8tF2pOEQ;GI1wqQ36S3f47qap2#oQPV3j2 zCgy&#HEpgTav#3B_R*$+bb8<0OQ-w0(Fl^UOJQ;z;UB=IDD?5|{uffOx-Sj8jl>Ch zpsGI%w9%!=?LgWL_co|wR>X-k=yBdLhxP=Tm8tiY)!QjRu0i|65wUgo?O!oP@WQ8> zP}m6Kr5AiacUQx|q%zgPzrS@k_srVl&kOn6Pd_E7L^TGt%$=MCWYG10QtUD(xcCG$ z03ySO%r?5`1@Ui0^~2u1_R_$<8joFhOvYPkGt5JYdDmbHZUCWh_Kf+f7n}i}u{_)M zd_(x|>Q$JDK}fuP%%3g-D*=WmWOmVFbUHE) zJ*Esul3`?iy6C%MjtLIU+Y9IdVj&-N(}~{5rb95a{magr%N`~p=9m5EgUlK=e+LF_I6d>CI>e(RAaF<@&zkUUD!Y0h`f zKYj7}X2W|sR=1|zMCnZOyiQGI;`|-N!?0%Z^kZWH2R+gU7ipNR3dB{JpDdnL;b5aT)Fl;J z`W~ntf!x9h!HW=_P<=0AX4|N zT{v4(HqKLnF@_gxejX`LR8L`#NUVO|BCE85fe|#ancV~%*;cW;{UHLHM=kETt58)wvkl^c+G4QrfoF+6OYwTcx%7IUY6@Itn%~-M9W zTxzvo#~*%3N8Fy)pzO#+CicMzv z`MxoKn+oF8q7xhnSdU@}ga8YIQVoM|f?FQU(LI-E{=5YS$! z5NRs3L2L2gy7ak#D)aN@#R7H{e)%~FvEL!UA)?sIoKz13Gh$Tgr&ln&PO75dBiY65 zt^sCd8K@)O|*sSU^EE{$v$%0Nfdp1dvM(*pO<3jw9?woTEpy4gWGqwN+~(1Nt% zesu9^ruXy?#qwid^yPgDkN#8WWN7RXh(^2Ee6e!ap8G#xUy z9rHB36p6*HEC7LQ?XeJ2y<}HuLN|*A04%?7bOJeow7$uG#{oy(nO71Ezn+v7{pZxB zk9B{??mFfqZ1nO^K6!_`CbG5{(JmZ!oGZ5)lSw=93)vF=pxA+=AnIw%&FzI5L9uMg zve_BI-=a5AS}-iQ9r=ge&p`kc`?d(opDPVqFzfm%BFRDIqq7ffUUzVA^+xrR(wDSPxNP;|DsxJ9H48RTwR? zmHx!*_rY2^V8H)+G6|UzZaod@M+m5ERB**>l!?-V$Lg5op8ijnC>cY*F(X_qQxqVC zl=NrtagrrsVuJk!*5KoM5qs4{x0>ZiXf}*qOYfNbGhA-q)vaAN8@`l@Qp|#KPt}Qg zK3_t6mTDL+Q48-CT;3Er{0Z;S2lnSh_2m+)j^x}tD>=av>r!%=46@iU1o zRX~ZiV$xaiQ$dQ*@?dVP^(J%YB>=pVo%OQeb<+y#af>)d&``*L%{5MzYp_1wW=VO; zzI|?BYZjyNmBP&C^O^4Ic(n?9YyL%G)w7iFia~-mu3NBw=gtB6LlrXVmY1m3KQA^x z6n!leXEeef9rw^h_0>}E-ap~_Z$EK-ow!lB;*dnt2NL0xr6rx;#O3R~@1pn;O%IQL zLAB*g7IVXQB|th;f(DIWRl4!71&bj=dHnW@ttZo7B6q!|-_@vpOl~=K1agCXc+@Po z0T^+Bz}mQ8b#En38+}D8c$wUt*&5;M#kU`;+R(-|URKS@kE`|VtneuUus#`#>kxLs zfa^Bb?Qy?!(ur2_IGnE7^lC1Yf;44P?77KWmnxLF*B~bdIyMv4AowTgw2#lUYtwlN zrS*`U`l8{CQ%2TW0=W@s3ke{y{@QyJ8pp)p(T~O_!NN{nsyPwd{Bd**eXEH3Oqhe* zT7F03(I=O?Ykpzxv<10jVsy8VcKCW81il+KDh2^$na}ml}X@le|SgrsoGCV&5ujS>f+YK44`Gz6*?>Er*uwSv-luX z^GbA;2z~FXFm^vi5kxy!1Cv?vDSJCWO~uyB-*UVXWTJG^^fQ335! zXNdyT=EYDq-ipEEC~uXg9>Us@n1yra%wC3-hHb~mt1W&@S$A&vv3M(c{TIdQMNcX| z=C6#>lfb;;yMvo@pEb4GR@>IItN*2v`dvS8(Bk>R3)ZIs^UTjEV^zRCwPED0J1l;t zzK;0OhAJp|E91eHyD|=BLL}~q_{teEJX~u|0s{#X7hW0YL*9)Q-c7iGnND1JEba2N z;usen*`&jxjIY-A1cfohGO;I}DG$4K`sQnsv1?&zFRO4j*b=J}c5ZIEBi{p_#|C)X zTk%%)DPe?Rb?F0-K6Goi?0(c4E130b3IaafSr&T3Kmoi&Lx9h)7YmK#;&Js8v#=157zWox0xR| zEE10_(jur7BDJtC!`z_fDTcEu!=@ihpmm{#An_o&ojYa~Q_}6Ow<+8IAp^J`BWI>K zvh>q(Nse5}ho~45@E0p|N(`)PzF|=u4Rtea>k`p8u}v5jdY#ajJ6hif!zNGA;I$_B zaK%e^SAnIAx7Tg7Ic$YhLGexvpJ%_MY!b_bI7J~i_!yFMB2GIHMWi>&Km0s#O~Cor zB@+l+c6ZN)e;d8iORHF~c7aROB2EecGWHx4`rS24IS+KMED_L2Q)f_W7VHDDi7A38 zkA_|N@*<()$RlBeG%wXtZ$3Z2Vg#a*M@7dcAx|$TD3Evf3E(M$P4v@xK$o|(wr%H3 zu`1RXjyw9|(kT=DI`*XUNqg&j2mmU?UGdMm0S%Fc!S@ws1V)ZZ4}(mxe2>Pne;lcl zlk+t(RwoX(D5eF+3l95|G51@ty#YF5ukke(Vz8pOVNnV}=&hV5I0ww~B+?H-u1-IXFS4u2%1aywbgtZI zC`L?b5&~O<2*Vnq8!naZETAgeU~g>^U;rk$2YdPpNRH6n7Jpsl&82y0)Jipzm1j>kM-SfX3#a{Y+Z!k=k4O;cBJQZ#D?IwFdY5^tR~g+)7iqPZx>_#QD+J4-zJbs~T7jV!Hj+ zx3zw|)EDn1-bBJw34<_!lC-2-SM@9=3pR9uwuXrr!BHl(o$ne@(l2L^gYQ0{QR4fm})zc}$*<74? zU3g;4M^O7x(CqAYfXvEie&FH~}nuGA`?pO@KBO7AVbI zxDP5u1Vce+ZPJI7yofn3h*7Wu-T5siGYhlDB)oK5oK#BOHcWO@xF zVMN6Qeyhatr-+Je%=@{IKZ_%VSVN1Y=j{R3fk-ZAR%1TpKxC+5x9{$~L=p)?duTV& zJqaXw1__CeXyVcqV*rr5iI`9hPEdHvfG`>7(gmd5x!cfD9)5>Ju#pj9n2wS{yG1CR z`AplZN8CA2R5jShl>Th-5pLUC356)AWn2OESzo-WnUKP;~7bC$z+PS@0 zvOt0Ks|Q2yPj8x_$(Z&2;9wv=ZDk^IHjKm}PORt{y+*Y1DG~^67HNS=dU=srr~Qla z+`~2ZJ6x&+OT{;$5DP}3a{VqyT`iN>zM~c{hKOmKR^*WUBjFFbyuF2=6KDmRw&9#a zn@{EI%pB;wFfSN6pEn*+Hlgb{qS^`aQoAEIJ6o|EduaRtJI@XE>))Gp{2D$hpLNjW zqk@<{G%`x857WOVI%Cie=+zpkR5@aog&}=~#k+0kV|$r87pJZ9tr417d>cFH2J;f& zmZ5|aNBlp`f00=(fpn!+C=NBLU}>}}C<-3KzNx)ZvuMFYTkciJq-_<({j<6CPtyS_ zLFOo|2)nC^Hc-{MRFcC#b5dbt_baH(iVa?ZGcz;i9$RDFn|r9a{B@o7H-XUH>Lyrn zvs;Vrc3uIoF-3hEQX0@4h0#}QX>jxZQL7@N&kTj#;rh;bicZ)?T~ReLT_88gt#bs~ zh)}7~^=CTmK*l{#vS(Dgbo(rtpoMk-a@yHuWHf)f)YJ~$HdV1gEt30I=z}};)P$yJy==HEJdBo{M|==p|4;X0=GPchU3(U3gpYTw8;?^8y^dk>$A@W9 zjxEeTE)?XwAGd~s1Ahk9J^}haeL2$U`nkbI)jYL*w#g|K%MwJ%t5hc=q3#Kw;h#I__@0kqwQ3FQ#RR7&N z<`^|gUC~oy_iOx?)_HhEe-_dF!63VWE36e`Doz)ih{3FKX8`L9?Pr1XRX>)-rH@tU9eetzio0n3PzB$>%|Wkp*pJ zewXKAFF+T=D^4ZOely8x)N93BdZ&);$9J%~@t})}r>giipPEgiXJ%KDbz*rFX%w83 zyKnO(3|y`95UjT=G$fIQzF<9*Ee@V`+YeE&EdvPph*}4 ziu*ZyIQS@o+mIyZ8%>exxp&?aEmWFO9bvZuM5MoUkgw0(GM?K zx3}?huzfQ|PzQ!nX~_D#wIr~?K0g1~L~LcO`VmmEk2IU=A@maYd&82Va~oODROEuE zFKyG;*x4OITfbGYbQ{pc)78y34d+6ff7YGvXy3z^JFJ|aQk17yz@2jFUEyqOb3IEI zq`j?;{G`_IQM~Em^UBHd1k;6NrjiND$7JUc)gJ-dTn1`Umj=l^y?I?pgu-`>k6(+5 z5Jz=eT`%e>s+3=nH9zJX;)Bxn5nW(1H%I9!qvdnU@5}5?$aZsD7vQwC_p}vkx|%1u+Lx!PWp5nmsS{k8aoe~<1ORz0tcRJp zlMF?N^MGdG!Cg}--w5=^J&{niHD!{Yksl4(*-L>9Jk9&C3PY*dwuw5=yL%^!Y`Lc< zh88D`E8c%ai&6X7fQIO7%wrJ1A7xt-kL9W^eDw?q^ zFQX*VdN8kOy25(M8r(g{D|>{gV$(Lo>E??5cv%C9>B400TeOd_FJWO^yuI$Hq+stU zCj_*{aEZs&>%>h*1F;&>j8~bqzi$(th3!II!Vov)^o@EF?M?JIeR?9nS(87!qB3iE zyT5h+r>2g?FuQn7vDJVyI3}CvL>vevTRpJ{#Cc)|PsJ07MgrQG&UPQClyGb(cBc|; zP;5ZIWo)DG>)cM4Vt+B$w=>rnsi#)&ioqBGe)|v0yYKD)Sf3c?{}~u z?+^WCw>^g0r-SBHsLy8h#GhxBhZwKG|H3l* zSoHmezg(J3lu1QvJ>e83u_Z{`3x?lv1s4HM zW$=90c0nB%n=<9?^b*2nYmb(or7EZi4=h2ZUp4uq1F%x}UmG6r?LUBkS#|qb>u{pN zwG$o78b;>#B7@wSigZvpFy)$geF8|2ElB^*w9c$9eSc;i)e0caUM82wDYiT~Zgz{7 zh2<0?!~1}!IUwR}?D#Xrb8ThfpPEXfvqBBeR7)3Z_l>26PYjCgE2id!nQe@rip7Yd z2ukPk1ZxE0OyLenNaJb63YRK0#ng+{!?(p@)=yc4V)D?HT`ffy$LM&_WH(X&0-``| z_--Ga5b^tF;n)9*J#L94)SWn#=9I%Z^ocR;&08VI$i&{Zo(9V9K4*2}UexCn_bqfg zI0B$t8|2h((>_G$zinb~Sm1-5+NhEeBzKuGB^6&Z(5V5?j$=aIR}o7fjnlHzi|ySv zuc^N9*dLZU53$>!a3;D9V(koQ1CEBsXJY}@sg%QMPF6+7EDjQs_u z*I=#X#wJq!RQNVkEP{<9^u^gXu6q=MSW3hv-S~E(8LiU7i{d8zdA}ADWQb!N8v^cq z?J(Y&W~utI^bXy3tDdIpn$ac0%MR2)g*%-u2H_;cKBZ^Q9=nL}7wgWKupa=*w7Aa& zf`_F%by*r^c!8RC4_luC7HNn6I`BgaFg^)Kiu6d2L0KI)#PX8Jwr4W?{98VqeIyja z+SF(|F^rNQw$<8ffUHh|-j{Eoi<8&>8V?=HTM)(mIBHP=?6j2MmX8wl_9Y_i7fZ;y z*!--`A-a>LQ);4a>(s_Kx7cXng1meq6m7*XH=NIwu1`DTSJd)l&aC1uYFPr|zP0pD z_$k826ElXkr~M|mRXkbhb$i;CVm9kDhgTSGKe2LPV$>WXTu2$+;NLD`Wx7$HIcwvI zegEM(7(690gd&ku z&sf@lBJ&;!h>0L0HS~xZ^nI#IR}amVBGH7Ds;cPk$ck_$06++1l4u!^=I_@pa#tC| zt1W?>9TvtG=s8ajWb_j@Y}djz5$Jv1)Q{sLy=fIMvVI;-xC0XN-D}c+_`Gx7$Lv!{ zf>O(#gpTb&_ zj{=kc2sT1(^JAH0fjW5%=7Ei`t>*sdVibml>q3oN%t$Q}M2{Ema4q)^b5m?j&|s7* zX4hat2J~R*Uy1kbFd0=Hu;X=*ZYvt-BJMw@O&M*Et>}2pX*8%IZ_02txeY z2v@eF<{OzZOjtjIuvB+uIUk2Ugp&Ji+*rK)=FI|(Qpx?bXi|V%O&f-e3{x+QW+qfQ z2m*tb{y;yw3=@-VlS3SQngrKA1&x|8SD6mF&Vt8$pJA4}6&tqIzU*B>P$(W5Oxpb? z3H{qoMOR$_JU(Cc?A-AdvCeiqqD5E-B+jMjsZk4*C@rQHi{Putyx3?weg^~r#QHK0 z1c7}**bJdxkhi(O$VgtKNtj$v8e3T^c#BIvd>wy(V`gf14y2=2_8vA8ME2w%Zui}r z2$278og708m;|PJE7~nA9{wsLAew&eP#k?1?AVB>6*5M`^)%EECI78Z_?-XNG0v!5H<#KCR#m z7u5|V9Z;WI(JN)dsx1y0R-On|;4BuPmB2dzWxJRaOAf*oO!r*}$4{>(??i3clGh8Q zo6cnxsv)^T^3XNKt85t79ba%agF7C#o5{*GeJN^yu{uT_kW)NLDp1zj-^ zl5NF2iQdQv#h60#A%$P*(DSRvw`mbZLBNHb=!d?xgI{6n_`d{z&7^ZSnish2{6*LW zo^0ZfKZsI_^)V?XPk(%CD2~!V0QLo5$^>sg5>smRX8kHuGJco_t>wGTa5D9(dOiNG*&-xrZOvZW2wu0FVln=Nrs z_Ddl5cu^V&?~RN?6wi_mKLnda>z=zi{g-$p$l-YA^Qo}Z>;wcj6IdYm2ZSSWe~nqj z^QXf1pj8)mkFIm)QDcF$R6n}MXY;CoS<)oD%D2PG(EPx2uUolj`OSwe*Ol*JU7iyQ z21XIPZQ}{;BPY5Roff$ckP{&Xxz=k^usV)98M^*%$m`v%TvG3k72~E{j z;6Qf8EQ4VT`x~e6wpGOL5FfmQY*a9nUtLuiAff`X+HS2!MJ}o#B{JFSCaZY7o&>&5 zd-?Fg7;+_{!wL|!LkK~B7?R#bt;G1zxzsGXSGZ*xc3=n5Y8z1=9a*F))wrE-4_IcW zI+tC1($zJ7XT(eo3z89o`5fNyQ8l=zLbOkMntJI*Qo{^3m~Wcxk^bb4xu32c=a8q0 zCD()?IN|Y{wExb@f*1t$@Aw6+YafOM4`B_lBW1AwW${bkH)W0$x5=V$q`PKU*5)|! zVaq^$ZjDPVxsMu?h5yt{61&w)Xw?sG6%Lf9*bI=C;;R963tW~FY%a>}_Z+&M-lD^UR zfTLF=D{1nke>so_X5<;!;?^45tzK{u@%!tzB!@K)YIt8=swMHdwz&(3Rp&%0N|Kvq z30J0tR)FZaAO5OjoC@H#3`RXEXIQohZHG#dsG0CT;=?Evf#l(Z59usY){wC@QG*F> zIJo0a`1w__$}h;+6aA}bHAL=WpMr}WN%$pebeP}-6jIWG!M+!XJav8nsSQ#jv7c5K z@!CgD*U>yG= zeCIk>3{Hm*A0w&BFL0SEC5nC_#>Ra^C#+{<>OT~84EZi59EbXo&Qx)St|4vK%J+4c zI``xQ^M9PUn1-5GteP!Dn!7_*CxH^~>$XnflWjlCV);_RB9|&~DYyasPSrA90qa1~ zP~5ZC&ReEYelYIozIdZ^NDALpHK%lS&3ex`YSZetdl+Mj@kwAl7BXGp!>3bk?SMYj z8_l7pW_oE>Dv=@)=CE8$vma|e?y&hUQy2+8sU!$S$?74L_|tRgcQ3pk9U16C@UqxH zn5KXGZmwgr^7B>@s1#IpUs;EuIC={a5vggJScQ*WS=|X`x|LvQ4ic&|o2E2zZ@J{E6PA=$529Snx z^%x=Aq(Z$rbuSMHVZX*B3B2-Pca`D_;vHptuJ)x^=c-@~KQ*`n^7qZ>k$A$Sw`ug3^4BedR4nl*}O6uKvDBImYa-;)KdHy2!_)w8<8dX>OuK)}%> zi_RJys6Px5BK*xLntb{xN1x7ozvs8@`K>u(s3X>C({IoZzfQK0gz@sw z64oxn3(&6G*r=d*v*CVNDQmPrFxLmAMPtWhNLL)jG)BjiFjvWJ&>u%s(*gpY7pt%D zp&_&>Qe~GpJ$3N0Nxp524YMNgoeh;+2z68e`=eX-b8MiVI4?^Sx@=XTFfk6{ij#?O zL#`cajwG~n;7fzHakE-DBMTTJ2&DiJUhB-dsJy?QFRNn%dKsyn<_DtIU9Wyk*X^;| zLmUr?vR3lb&ivj9+>`N>`$o~a9!@^_x)tZk2Y=w+AI`=$r}@vI9pq97ZC;b@*gyVq znM4s*V^Y&i6-x~p($D(>^YHrH7VV4+JrYwv1efiDt4I3fb2;);qf^)pPNeG|=!2$* zxnoI$yq`t6slD?f2iEN#Sn?DRC7`#?u)11E=|7 zP^*`%7LJ$BdT^HYCD@aM(Qz!Y-Lh#5Q)|KUdWSU`*?}JPHIj&i)Y^BkOf^Wn?VVq2EUj60UwDj`ZF9m%xK0@Rqcjx*z;@!=%RB?< z9tRX+y}`EFqqALqr1_@zm!&HE*)iYtWFHZdg!$lcVk)$3d zGopd6EX$rPE7mhmQT5V=yRM0R!Y(AVI>_lKaPZ1mRwhJOszr!wE3LbiSe#D(hzNSy zM*Mvb@<|xM1qns1IRc96K}^I;d&(6v^00#<_N*chS#fV4S*#I=bzQROG%~oUc%=Fh zn{JE6moc-r`cRhPCWN(Oi`X`;SqN<*pFmD@Fx%rxx+r&Ag6VfS{V&cRBfx0+pY!3G zu(2H9Pa7cK7R?4+LXFWaUQdEeiXQDslr@PvD8YMf;yGr3g>f`-OQL{#1#ueC0e%*e zlmQ_r?8>Z3;3B?t|I(JpoTTb~L41W#lBBor0qV$sIzy~eXlid^te3aVyPTeschvV# zB6<;YqtHj@QiYuvt<_~8A)_;G(|JjAM_OtvR;cdNxq$2;)*OLMb6>#=)vRV}+C@bK zK-?bW&?no#rSHRhgvN4%XAUVXM|(8vRw5^*Tp^l`K5BugBpER`+g)HLZH;6GDz3lF zcGQxzwQKR$+xd6dyyoRkH*-XsTskupl3DJW6Z!3a#rM|3_nJ}^$gjFeE#%yw52Y(P zKWN~VJy7_q&4;3t^}{IPMIc(Zo!JHM2eu{rF;y6M7D8~D^5W`~6~xm0JZ`MDFB&tI zx-yUCt3Xk;L!^4Hng`T_EH`So7!Bhs=|tx5md(5OyUEPnq$(*R;czc$5!y!$R zCB(z!BezQCU*C~6QP~EE$o<(_#w2@etsJwp!<*s&xC;5=4Lat3(ev5!a0wlB^95eadz^RJ(z zxqnPjjMe1g82ObNyOJ6pTy)6b6y8zlbpe>3QZkjmJPc~U# z>&1|VHCJ9rFW|gaK>9jY&h#f=!m#lK)nlI@u6N1E2)0WHESx9hS^?vCBZLuaR0^eT=_o>aU0l&Wp%*Xag z$1u9q?U}8NrI}~3hlndTiw4x=?zOze>(>j2$cLR?Ji4`@?TJnjS_u1ZL><+J{Z1fk z>?D(;A?-TV&1ACrg_Ki=_1LXQ&-U7RrS>h-o-vq_thRTZ+N{Ow4>HF8a5)2xv2&Ua zl4lT{4#y9jN+;1Mghu}5+L`W#CPn^{KJo2loaBhF`DnHnL&v9DkFKllJRQ1^srS?4 z0}_A5omdO7Fc)jpdX-6m7vq$yy3>8sgHK(cnks?Q3P*9#&tIhO1rZF zm2Pq6yjQOmaJsrUIe!Gt`i;+--KSAn69ws-z|)^2FnI<6bW zJoM(TeNJBH7<6cO7KN>OAX^ZFBcI%-XhujPA+8goH8HeHW~GnKw6-m;u`Yq9vqOn7 zuFw$BcL|B+^&fujSF5Lz%g-NKgW~1tMRwN?f>!RUOG({Ldf(@i!c>Eu()}9sv1Rrp*N%UigTO=nensEL49`1bK>`5*4lUhymicQkT3o0S-nL`8YM3*T+t-0+ZhSbEe zy5$_P24I0mOFJWxCnUC@#;YRnY==oDnf@JAk2_BJt-@(M1_=Cd-=;7G3j^{tWLnpO z9*S2G;0=S;SAq&LHPm&UvW|Tk&K#Sq&UJ{M!SrG6xrea%(++pQiaV-`Rp=GT#&1k_ zHYQq5VEN;;KgUDTiX6PrvvryQ24Yp^qlTS|%70=7%FDF*HTR|gOIpAZZ>Zn!EG z;yxOJ@|PE0-*yJD`aEk*P4w*AaB9hiipUw@7%gCYKY8TAYi3dd84YeM9A3bA>@(TQ zfj*U$ur!fIPQVFV4B2Df@bPnPY}uVlz2q(`fcZpU>mE6azuo%Tc)pSYLJdL*k z^6ru^Xon|>CWS}>kvvQx;~Jr^d`Hl%t>UZrRO-(apCY=CKDEQO)1Y61ut@8nhN=(rl?4+A?fsNPo=Eo`qirUeA z&8eQk#MpuE@rZRkV#Sf0HOp@%;01LAZ4V>w5CB1vwOihi{^!0t2Pmqy-3_ zlMW$mWTySVAix_}j783l_OV&c;6cCL<{^XHiq{Ct5A&|<66h)r%?vnm7NXDm8rHlx z07bT+Rx??|V?~f)iKWakqSN%I24Wh78iGGlyl=#0tRz15;oc)aR7^Rnr&cqsuv||q zOXQq8?|RbHpnWb@^d`E4$E|ZHMW&lXDy4b;=ZQxuN5TM>_+rz%CRLC3Go+uGD>DUL zukqx2pA&Pk(8gSzQ%s)1@a2rABw~fRM796Q)AQpo z3(+B|*I^;9L5MTdh{nM$jw?S^UOLdx9(8#&TAzcw+TnUfU@wcZ$*cV;E6sf+eKaX# z6;~5(y5Q&K#eDpq{B2-&FK5;Q2f2ILEjC@uBjW~4yxF=(Chr4h!dlv<7NwIu+c}OY+2{~oRBGx0FRG^m!jaO2t>#iHWFtEo(O4#0p8*~$?7ugNCzvY)^evB z6nU;s&|$h#}wR35Z&6$NLE}sDma}D~6etgfGWjT6Zev*7c&a#Sbco zVh*v&4LZJ2zs>ghKj#BG)dotGyYS;Zm_TmjFRZ5q&KAlJzkEluw$ViwU;O2Ejc7cbE;xJ$zX{5UGT36rmP0{`#}qG68}egT z)#z;RIIaG~x#FP{bN$mZA0O|tc*Ab{>ar>-_nnJ`y4WIgzWuZf48WJXKh&rpMD0Wk zt&M>t&&gntfCKVP6zy|?bWL%bw5jRd`*Ywx=+eu;em%giiIgx&&5uaC1s-p2z3RJd z`XeN_kR97`L0(hudtoFju=?%fWj{&PFD?{9)9f9D-B$Ou!>D?hZ# z&TPFeM|}5O&m}?>JlRYv;=qA*MA6J7695z$(i9UGDbB!)F;V)bjTpCB00QvK;R6u8 z+wY2hzuC`Lzh~bSecb~Rt+8LW7HNIqkdX z(UVeTFtFVD1|R9olg7X@s7#w!IpHQB`sS7+jAkUCpx=xzl_L(eZ&FDY9tJLA^0LhC z8*eLYdtei9*lOAxoie#w)8vBQ(pDA7Zp(5y*B1G#^E>Jd(} zjG)tm}U1BRe7JE^SBP3RxQ&d)Z^da(w|>?5#pZV}C=D@ap0$#9^iT^Myf z*Rs81k6Ydm6tnIC{DX=rzoWb$3jZ=D_#Rswf1Z7`J8Ic17T^Gy`jm4J=>6#1bl~M7)}^J`_O{0hNi|^d_Qs!RKVihQ zx~LpOT+>XnnQZMAi#5(QWvLPi@}en0!CQ30haeZU`Q5cv_naXo8 z*x=VrNUX1(?N%0qMHB#gEhQH1M|knK>8O>h(W+E=88<7ftj%-GhREx-6UPIv*Q!Ln zG4zWp>%nT-U42^p1^`#&jQYn0KRc}SF+?lB~(O@|I z-V!-@M_(f|&GFq_uWG!lQ!-FujYn& zX`ZrBGOjag-2KJ~U2VPRD`yHFKCh(hE z8-yrFP>IN|5%k>e14&W;V;o|`Gr5V`{uW=HBW=zaD=;hwCYV7Zq^5(5-(hM2dB`_W z!tov0xe4^isDd7+`SgrW)lVfJfLfk18A(L*T^R0ABCF-oNn7q2;AmUan?z>v?VDy_ z&9Cp$(mio#7`bO%(f547kjh5wBfqRn(#pA*oCYqv=cMr|MtVC1=>M57qE_>}*QSMa z!eJa1&FFWHvJ`##TFSGjWmBFln&bD9^8fbP2zd{+ji7Grw-3|nU^HWGkU47pQ}5f8 zBJZ$UVOy>#3vjAP7b|&3Evb^ddGP*GMy0Ks*KXc7F^A=GtFjeeT^G`aT2s8)BJZG39tpry{;oc6l>UlIgFz&?5&6E!FkKUbPYwfq+3 zO!g6aQ!ZSGT+I@n1Ztb-kB<2xB_Aa9Z$V zND;<#yNd0~H6^FT#i4x0yAa*f=81Lb^`N6{gLguD zfEg&>#2C8;z`pTtqXN~~m0j&-X~g{#3>kM7P1-mjbA-&7rtO4(C+T~$lXElLac_6A z&x16;TjZJhOWqGZXSx7Ei>>D)+x)L^jWn~HhHsj>8;u=;+^|I27!8sCfqZ&(@^h#m z-aNnI;O|f8xu0q(+@-ILo%EL_=`6)G}5W zVU9w-SVwkWKPHp0O3UV%tnB~Xr4?}ssz<;)1^@u^p!@F3O;G=_s-Kf4?yHXh8$=_> zRyXCEpTq@fGrBn9)PO~+)#oL({AA2dDMRl{;##*sPV2UDR4)X361)V~&-|YkiBiI& z#s8bbpdxudiEM5nA5~mX!}f1a)0K5Ax%As^9M@mAAYZyk|L$IhlOa zYM(NGn=bxE?Sw|9ZFJ2^=b4w_;^Iu3W?zZrZqHk~W{3VgnP0B25!Y-ue}^&YdxLw@ zI*`;gAT>e+)Gd;9grdjPe)dNZEo8C+61k>R#f#$ywht7!I8%h|FvmVOEn=`L$sYTC zNU-VdNN|R{axtX480#C#p4&E>-*_J&QnB0jlgYge(r&@alPs=&x#x> zsKDFob~!mrnE+om)V!O^~Wujrv)HIY}^+J^vh~7Auvc#&^=u70^P3+rjESr zd~njlUw6Nv_~5Ivj+8x4MTC1>EeSOksI}DF;%SXATYYBGORa|P$a|vN#<*gfN_b*Mb3f6Cc%aL6=X++KIENg-DfXm! zGsVz?>-fCq`);}T?COjA4efPlMur)mx?a0(?y4@Kil-^Z20#-_Ol9Fl;8BU!f%mrK z!dr*t+W};{FK^Eej{;{}qRBd5lmE-;?GA$4gb9FGp*8LyZl@e?doW<}#}ak-G_-?@ z=#6Xn7Qjb01Av~_j<>%6^@gqDllAtj$kQMA^urC-0hFR77Ap+#-OS-~xzKF}KQCdd zO2!iJl8FpC6gtYk55Zl1cv6WqA#}ZqB$*js8`2d~rN(1378q=qd4jN~NH%GCPD^L6 z>JHRkx2fK}PN0d?er3r0`(^AWnO4g8t?r;2bLzMN3Sf~%Rqnmb@@(hjETkG z>1$#nBRzVm1_pi@1qOQqTXpd&5Fy1_BA;9zx}ACfjSN1z3*Vjih=UxeRIwYRZ_A*z zQ?cBlHk)Hol#M4s@l`F954&pQ3X0d*s{O7q3;M}L$bJIk;wy_m zbj}ykcc@Vy3=%~1Q)RGpJ|0ENQAysNoD&=Z=g5qQ!MQi)<26oR*-we!XE6dU>K zYzE}h{KT#=LFlS8`h6>|>3s&C+gre>SYvG(Aj^Lk7vaY!ChWYg_+Iw z#g-b<3HMM?NDn(0j1RTny=0dSH69P1M;FsArxSn;%eQ@5!f;^&zthi)gm7t8LuRD7 z>4EY-M}x_n4O!VlrHqNt7yOF|~wv zA6Yg4^qT^u{f5qwrDkBe%Y5V=n$C9`8#qC{LgTbEmFeJB0w2(4f$adld7^UN(WP{m zAxU}Ho^;i2l)kNE$5;!n_fI?qwAh(iKJF##5R$e;>I>4NS~Ktn;Um9k!Q|`-lR)YB zz2aQbY-hP3<}dhFe*5-s#f$B(SIu{FQ;m)0x-xkjIZ9c=P77(gEui8&9qfSMzAx0s zWuY8(Us2Eo+k1$UZL1+RL^&9@KM2N|JAQpByZ^A`Dcu67Wlx$4y+(c%sej~eDxH9N z_*)1(7^1BAC^X@UuN1QFYm~XLTWj%t;4Drein!T$8w8s^O@i>h`2BRPLs zoc;YMzVD4OUdj#yB}*O&os&E#ugn%Oe^KShbbZ*gJn4I3pz80WKLC?Co_@2N`Kug^ zON(cdyyQa+)2?+2i^ydyJS`N4vGeh@*#JqEsj?RZnmJ@N7~G=hLf|L^Uvy(C;5O+_g_4TI6x`i z!L`<0>j2kZW&F*(lXsr0Keltspo+vhlZI#Uy-uI(ySH@$j`YHz`pi*?@OnZhgh=hU z4LPEARyuIPZ+=%D6xFxkj>ukg_T&1Ps~E6*hccA($Ty0;sG6Xy`OK`Tt3!h(j%`QT zLaJs`4o@*BKR<>a4nN)9J=66_dg3k9c0Q}+nYo~2sxI5_+gl1El9?N;{yt|v3I8s8 z&DZ|dpXyQt<`NunEjy8=P;y_9T5C}Dr3z$-_}3nnsBlr`Zon36D**(x-DiDP7Nb;F zkEkZ~(x4*p$ldCyvCQik6YwL(wO*CYeVDBA!Oq?gA!H>_B+PK`cDSc@T|y-!g9aiT z*M7%`Raaen)^;Gi-@IBLuoEB6yW@(>G)cPC9NBNjOu3*-tC1s0BQxueH}N^N8g`f5V1Fd-i9Ms@TAFu&M~5qpFqFeJIRNI&8k7F}C4 zQ^H!teR(w*?e3KIdAj%*D2s0RY>JPOm$z29{TeRQ_DW5r+0v8H__pkNy?3U-E-0nG zbg%MJ!}|YOi+*ZiaNho-BliF^_;A-4E2e{g;#5n=oG>~^R`0M?+eBjnW*0#mwxUvZJJygAvpM3<>A&Kz zue*1&(z-^6i>y)ho6a{MAbOLy&b|P$yam>g6Dsy0qmOMhu#O_~u^Xn@>8WTglM7ip z`lind1t|BzD0vD%05RqXq*s~!V_P|9LdWMPBz)2Z|IhNw&i261+*&b*KRNlupD_VP z>}(fbLZ<@!JF2$mSbadZJg&y=q)~e;=~~pN)fo*9+rk0g*gG(LUBK~~2`_zb=7MKm z*5QX=nTu^^*}uPtj%2>ri9@qtPn;4g0{@G!2lER<<|w#YBH;+Ekw=ehgskO4xwjdl z)iXL8u{aNT_;d4mt{L2~Yb!q4;h=4TGg(w}V!?p4^7%gh|K?RJ2r9rgaC=mO@hWs4 z#GcHX0+^9lJhrfr)?vw7@!e0xS=>lJ>WLu=b0W1XFYen##@W#Ag36IccXp@A;hBN& zq0q=5#6odaUH$t?z94}%TkPBaBB)%JOrpudAeXp?m{$;+KCFcHJeh}!CEJ%fs@uXg zp-E74{=v^F|Jpi4fI)7CA{_VITyxM+4Me-I)-!WXfK3+25eXWq?CITYdAXP3-zhdh|@Za#@G_%Gu1K8}mjWO`2atTru}o7^MP7>awx z4c|Et2pd+sWE|Co0`FOmI^-hA(2Jb!iyA%TlPqw-UHVI#@wj|EeyFrhohw<%UoNTd zPSfuJn~RGC?bwFsU88_1|IgC@Uu)QZIYUQ2qb{WQ%3z{mm_1IK5Gd7g0NVSEj2!Q| z97CUGgf2D(&bNM|)@Le3tXzS!(ZaxvNqmb9xo<8dD6;D6y@?BM%885M&7 zaORYQm1$kit9$!C$PsEVS+@}-JlBHYOAOssg%yy>i82pH0KV7Pt22;gRRSQXxvv+~ zAC%+=m+=!f=OpJpaNf?!xv&$4SppM6@2m!WQYy&VqaPcd85^>vsY>p_R7O&;_bGWn z7q?eg>UVY$jko?_q09SmtJp-i#+Md(`Vw2nM(F%Kln;9)kVXQ%V-#lNlczE9US7JT z=`;5XAqokq4*r9nidFXH{6s-ilk+R7e-~a|ws2uKYsHJ8>^nlJ#=o;n-=xW+1dBKC zT0i5Hm@6c<5rF}A{+2{HnPi{NlL}m*tuF)GLNtFXNrS$OsCOd_kL?;znj6Z!M?QI{ zufgN(v zy9mMn>z|L*As!0haA*6*IX7YJ_+FqT^HfUzYFaDy$mi1 zfc3dF_qH%O0_)+a_^tXdNd%=ZkAMpXDZr0E(kw7h%2&QG zVqpO$TprdMdYe^%8Uizu3|}C@i;Ww=Y@2WBQWKOh;bG;iJ_+F4E#n!i?4VxnUi@S zLF1{*WW0XS>($4?0NC>kT2B5qUHtegv2wR|S3F@{lbvJ>onImCh4ABByobB?9i6np z07vwUK%tRW^;8H<7tfXfXoxH3m&t`$zNY550SGaQbXqx%RDIj`jF_S9IFM%M{PW%lte(tCuOVs5+uz9RO;$n-f4;ku(jOv15N!@dEmv3E%4CM*&`xhNa zBfp~Cg1$^}l>onf4P5}+x(}ek;|99BclQOP@QTNLd$DWolIssZgL1yDP&>uQZOG36 ziQtkB^zv=M3VpFUnuNw|JCc~5;{7KE$K6C@%w|u=|0tid()j6h5{xh)y+v)NVLm9c znFcMIctO4fvRlHHKbgBlz?{y*yXm{7rt$_eI|9IkzpiODI+t$&RKHd{k78)mkltbE zV4<#bPKZC;sPb@>zN?%uB24-;nOK8LQ#vf-Z zXLS(2I38Xs<(7w*MYzOo6YhfJDGo3DeuPBRz}wyia1a+(1`BeO%UjlOzAV3Jc@H*fZl zlZIB=`%J&9lJ$sk_BeQJp84rcL4YgJ4&2hz?<+G1{HE9wFZ-L4V;Qk@iWBZ9ALjw= z^p5*d-xvu;IeW90g&EOp&Mcfizj2PEG z^{sbFByHIPv@cbZ<9pXex1+C(#1*OLChgN>qM;`p3r|!{D9F`NPg?c{K@!De+e82& z@K_g=elL6{xCN!itS?(S0dO%4>$Lr*{B0z$Wgk-rwtrTGO++omfU}JcmFN` z2o{z)q*=1p>f(8%+holr#tbzRZJxrPaY2q~^EH^t`0!jOF+(2S*u`+gt$4vd++_0k z3heujx7@F%Fmy0IebN%fu<`8+T;6#8_8y&&;&W1v4M-Ff7KNXN&Qqif z9ekD!W*m}he~=75(lnx~vGpk+ELubh)RC4v`cef2fKHdoA=t#4Nhf+~@z=LP07`h# zqTV7F^M3eus~7iBM=Y_C{Zjh77z+6hR(Jv%@-L46B(@wpYTlZ%tt9K@XXgjL^T8yk z>3D8q4DoyV_%hkviQEFQ1)t90rMEXvc4ayyWFS>x!2*VW_D-HMZFVY$BnmpJnb(*0 zA-2EyrWU};>mfwhe*qMkr16_|*1nYje3lR2^R^5JQ=jfMr^CUeFLbGMER6;HJ3H?` zO}AAaA*_4YrVyKg5pIkUUUu8Ww8@<0PyzQY8QX{4NwDOx<*zf+?AU9y@SypvTe~Lw zpJo!T6s_MhjWkM?OvSc+H#stj?U7qZ)agwZy!q4U5@!B}7`p9{*e{QTQ-5Qay`O}Y zpnwFOkV~0GghCZu%OYRUJ={2l%+Tq;e>ut8-42(21^Vptq1tj87Ie&=Y|AukMUi2DeMNFJr z6m=)z)j`+i^Inl$Cgu&<)xFviPr9YRkM3!02nGwMC6czGzUyzbJ`-R+lJf~86;~3x zOphz+>DIc`TqOBwZs*(cP7mgyk`w6I`?}_F%hLy$7e8Z=(Cy@%p;a!md-%%`4n66Q z*!THfr4pj@IA|BsZZS#5u|YoWAcU*7r${P!3bt&C60-kW7v~dg&qg2$Zz=|lqwRU? z6LU+JqcX|!JkhyNo*6Sf*-4^;0xJ41u!rN?Z@>);&BjgdXGXs5OT_q3MG_;D!E7q> zJmud34?oPaAUR`NA*mMj#u;fWC-HlNibmy5cBa z(IDD1DwP=b+&!p4oU9Keq4-9U>@#~p@Kf;nm@X`0qVJ?#e}%2*HpWM9NFuJa1=xQ0 zq`Ibnn36FR+Uw|z4zh0ff)2c4rZ_XVz**8BN@!qa8|CHC2q_~|l+D9W#-%A!)Jr6F6?G>$sjqOb$`_L~ccZLmwJhSAD;jNX^fu>dI`zJumtf_D>V`6kT`_3o zBwZoeRiTM{P+AcHkh>z=0PXav{913-&siZWL>Qr8e!UqHMw;HYj57_8YGdP}P@Mtg zGrtJgF!Ir7Rs%6`(|O>?WwCiVrVrxfzm@1X6UVlv%$l`+a?+&O)z#G1OZ>qlLhMQ3 zR}wA2=z<>(Nuq&9+Fxjpnb^Z3vJhA+=&qrsF^S6iTN#e-D#FC}wZEl_>nfRifx}=J zBsjPlIf~m?7VsYl$$>=`15We5UU+q-Np>Y!VHCC`>k zSs)ma?r43ik}xj|asADcRNyO6qD;M1z2Z9*x0-uaXRltc}zcdP2vPrbvPA^9E`8 z1e$!+Xnnc8;$wT_XTwoY_;$C=u*S;NX}tM3$dLh)K~=J(|I`_z!kneGc8+E4ZGjE- zcEGewjm-H5t5nZK#CtwSN=8l2zrHIpDF?Ds8iqL<+Fwxq(knXIGLA}@2${0l45nv$ zurNsn$@a@0ydR${St<95?2uad`H3BBBraeRwd)N9k}qb8u*-oYC>Y&71CqM&zZ;|N zq;n$H<5bEfDsR>%=5&XLFuENr_fc0tHb8+Oq-Q+Itr5=z+2TCOIB8oStjFGa2k)mp zr#`%Z(pvq{(BYs|Eb13vFP2`yyti%hm!~Ikegg!c94Lqd74{`XIN4XvpI1o+koBg3 z8D-^4-e|u#aqETq^wCVbIx^m`@SP<@_7*0+(c5UNk5`Bylp_@iL(+c$Y>t!o@E-oK z)g%o)+F!5_th|7{pcq4Zh;-;opC2N@ngjHk**sFn9y}_w>J;hFy*W3J_;8N^h|MD zk)(^7%rG!B7HvENNfAU(6Sv!_t;D@HU;QrQ<<8IsdF`b_tmU6Hc@^}{)aj zU2(Bk6A2g#zt{y}%xy_r+})xFjY-K zUuLii^*=wbnDJb)IKj(7v#9@F(`&dj^PM{IK894jxE--Dv8rU6UPX{0Q5gn|TP+kY%?s`2#ftOI(TWhYGP`I9kR>eC@0zi}iN*>zEXCsyy z`)?_Wi259D$Lcpq0xd?9x~fTL;@o);uI;2Y$>d3J z_dOwvDY>`I4*p?-O^Kq)-Z;pp+i|MUE!0w`g~E~if)G?D>P2K3Qli(~OgIF$=zTg9 zhS|sSW^4}BD_j|%^D?KKN+{Sblw6mH$pB8G^o*KR$3hbV^ex2;_`aa@x<5P7WRp`y zz~Q9n$V>_IFGA4Tmx&RZcicjz896+cKziXo8Q6~u90r)|_zqoF-bYV&?l^UZjEEsX zc`@r4wgU8NY&ocW?iz`ij^4?Po^^C%AI85r70&IuTYo=O`gQ`EF;%3UdKc49UvbQ) zMh!zj?1hSH4|hjjtiRSf@vZSYw(_e!R>we^d%h{6L!^(D)RW>w6=g<0ZhLxS(zG?I z@I`Aaf>=c}P9+(vjiqzPvMr#vrp{i8$u0+HMUZu4f-ncIhGFe)nH&DGy7EM71xj5Q zpFARP`vO;nhx2SLYo4v$3;5o`yVTQ?Z`~h8-985WS|yg^Dw+@6$K(SpAN`qY*DgP0 zZyW{ut)RwtfB!pG;1H0pH^JAjHYMx&94k~R%_5ZquUh&=qcN@w&5_r7p3E1k*{efJ zD#(NIXPOs0B;9T3xK}3_#=w_kD)Ze7^`qA;)5lM|Of-_dxBfuj5BIRjF~VI09>Wja zzr^mzxQ%=*{izl*jawqu!iso}26j)m)Z+KvZ6jC$!jzp970;$H_Tx&9Wuy&|UL|iy z&n1kyLYUsOo~>n8^f{t1)}pEdIl~KSogYITv5}3~CN; z5?@J<>?~pE3LNenNF0`iahUhfS1g+)m!rs z#jmTbD?l_kFL}h&iga#a(vvzVRsdL*K09^GeaW$3N^nukkbUy`rVkoUrCji58+-wl zpaOpQGH;q1&)uVdh_?SCBcRBv0wBKnT~wlYBV69iAY+D?sYZLIfyBCMf18WUM}3WU z7&NKiD27WUVA2Mct;A5FvgTcobn?ObdZg{LJry4LWy%%hn1%~GkptidU?n50RYX4M zWaLN$ND4`32tjEQ-_ob;Ct^5Z^zY=hn~Z$kCe^x?SCe2e)>H~jq~c=$+Ms6U9+|Vm ziwLzarl1xs8zFAVL+BQ+LYcwGJ~RFtAQNr!*C?7bL zYW%zn%5oKk_hs0*K%8R`4SrS&dy$KjK{>qpYYr-*TlOO#Q6HktX({6d0bWS z`;$iEk|B&q6I~sBXm0Y=XwO`PpnE{0J3n7CS=&A18pMyUULYd}G~m2k&b!zoUL3tL82-}g zZoMFxLg<8>c~M!U)irZIB{S|w<2^K?+Se#7+Jj`18G519Eoo~J58B5x)*)WDi6`^^ zuAzOdQ6oz0PEu>=Qmy(ZTRzR-#-zv$47*Zf(u4u{)f1xezIr9H@Dv%O2Xb38nHOJ?*1Hj=rQNZ#x<9my@R z@{2$*S=yC0#=31s!q<~4$2zL8ulR1pp zJV{MWhpc^Cu0SOcuy#p@xKP}kG?x&=bqCJvr#nJ*JOXuZTH&u=a}!tE0oB0DhSABRncBqFR&0h(n!8=%QhGD(6XVL+6;k!&8D8I)`*`bM<9U za%kuy(ccB1&OzK*R4{)ttB{Ati69qut;=U@=M6Gops?ULb0^r6`C|QIRFYv={a4QD z64V(E-DK`#0DD<72O7d372Di26%_}0>gqwj-YPJYdU25Exm9}J&}>^@!gK__d}(zE z{WCr!&)u|zW6VOQ-J-Nar1;(Y)~E}2#A9Op5<(AzlovK&zKY=d#pza7QJbCmK!0$B zy&x(0Vu0hEf|&<{o;8jYZFJbqaeEBOrR39V0LHi+}e+Y^6ASPpg

Hwkf6z&WH~Ab@>;T8s+FbPT|wZfp}V_ag9#X-iS44rc&lig7w-R%-pQie^tbeS+8ek2(Y2G@KJr z;~HiUqBy-^WyVrzWR%qeBBk&F{E3}G2f=Dn^ZifEdauG-$gZY3XI_pP5surwPg#N z;JzQa6TodbJ~r&Yj5nf;622!V+|n=o_9R(e@pO@p&YPAJoh6>*Gb|$C06m-e72~#6 z#Guh+&tN(=stzTNkFV|-)xOLQ)}gjpq*m6YQ|duZon;nC7!c+qXSQcren4TeL^JDIIv~~OJ{};kbxFmvtjUqnVpX1t zWOfV>FZ5z_(NiTXQO3FbQ`ZU@kBj|(asede0mW^`yJ0~ z_CErsWl$^cTt=!#L9A-2fg7bG1 zy#BSX6{(ND_BL!3ST1>pB8#Yfe*fsRgsYfyTZApQ}3CzN#^dZ_>z#$vlNYJ2U z#H@k5-aIN6p`oO^x)@4|AVC{s2S;76&N{ne52;r=9_D7`(czcY?uJ}98c6(hg7D(* z0_7V`d)Ia-AURxC|@qd5bl*^){@;- zd4c>bExv|X>ymBJUUD>EGp}|43v-jECiC1rg`{85$bO=^i&F2Hxzm?oWnbGXa7e9!0ATEwg zrl9;1(xnUC1mog%C~yeHC1#;{1~Z|K8rVWHWos2j_1U2dwH6A+BqxchGu^2+(FL3m zl0Nmu@8A^v4mISJJylzFI8^ysCkqQO>T2I{L*-pQLi|^If;d@vU5Vf-EM13|HG?rx z>*8!SL3cH1d`||u$k^H*M^sYRR22TP;$?7){HzakGRi}&t?A|QJTRR&-XZR+7g4>}oV`tj8AQ*;OKQvdjh+ z>zF?Z$csnOtgC?(^YLbLCpPYa8&{?&5uIJJ&9Yc=;EDGU=bRO8UvI(~e#$lLP1Mfg z`k7Asc>-eru1srDQ5Ez^}J9sh1od-RnnH;-?D{(YM5p>>pKq`4M5Ovj53HzJH6jGYyX_83CBw zMxw?CTVG2|F5}(;a=iEDeiimhk}uQXZ^YO>PAR`RO&lX@LSs@QPS_`Zp;5Irv5exV?MU~8b#>%hAr8x+U`oO%9M^QW14wkib@#Tr)^b0~lD50mrJbWa z7pad@1j&YjDQFo?(#tB}5)u9by&a;zl#5bNoM*Y*PIM7^iO0 z$>jN{<%meVJ-^`H!7oVB`6E7fvZeLFArS|~`|Sh~+}+4Sq3tyNxQ;JF@KW$|Jrt`+$`1`!%AZG2j#70UU3;xxyJFG}m(;g)=-CqFzFA z5&J0l6%1#l7KL)HkrpZb-NjctD7*9FObZvlU(zBBhWwgO>&+34+*J40q76vAo?84) zPrN)5Ws!r(0+{s<5fX$cbGP2;%RphgJiYc6Bqs(*Fn_Am1wjrT;e&;*Uq5sFZ6a7! zquwaP9LNrw_N--#Z0@DG^yDE~Aph*xQ2;?|L6ZrkzVTxaG|7?*?rUy+0y^ku)F90* z?OO`uLMW~2GdrHM() zqT#x_GO0@-3`1A5Pj+Qmb(Vc7;?b>GgtyJ_vLZ!HA+EEqGXvh)PNrn7$>vc zUtSph(Y0c|L2jxUS1iWgs^DWkn+Hxli2Z%xpX!N`QG^>0(=5S z6ja)h(p!wc^@NXZ#~L%&-znc2)aA|HsnJuZb*=ZTjqS9+uXFB!*&^CgtGE{os5i)z zk8g^1py5+~-nE!YMTKW+*D26AzQ;5zQTHP`&oD5y0^Ifn4H3S3$cS%rqi=NT14g35 zT&**ER-~?0V8zyZ)3{+w9Ql=(jMkxCPUaR7Ec=JBE_C^J=AHc%epq(l6b+IgG^-Pu zh(pc;udVgrUf`4xx=p(V$kV+`zlhV83h|xVQ}i=k9~GXw8Q=Z{f}p|y(RuoTsTNK_ zc=uj+?Yuqxi9n>EL1vU!LJJt0qC7)QvoT9YTYTXmD+KXe9P?w-K}4ih?k8xT_a6R% zS(35IqQ;Y`W|FdPiPVtmQl4h?yzR=a&f=*CwM;B#QZ&dC7d968?h>g!xNdQ@je+Po zc7B(44wAk1O_8eDgCdQ;3sa3URIjoQz0YhaZGk>r(7JAvMiGSWp~eK`5l z`x04I2f__OxDrBtCFisfV(F#Z$)GVZ-KDINl6^Ak9SvW(*5mfIM)Brxjl$>szevLr zX>E&EOZNK!I`%tv$D&TWu%e6%#`W_QI`U-CeB^r7$w_t?Xz9PA_*AjTuWfG+t|mB> zb2mJ+9#vnNL5{x>@py-ZzB@S}IB}J*p3Sm*a(q{zEy9_O+jP>L_E`jVxYg=N5!WPc zi`(q-$@n8`B^qz(4cfh;SvbTMn4EYk-~DA-8>Y|H7zZV2-BsU#Zvj~F#Iz~-@s#K>;i$kNwrkZk{xVX0j#Lm~GNJ`y=Va>n(CU{d0>#7QcE2n0V zBnjzPm)hJ%Sk9-MKrPiD2|-PgTXf03X>)BFO+3;+%hC)6jC;u|3p4V0wN+_lA`kGA|m zF3S%uDHGh3Qtlr;Bi*rf=5dnUbnVZ3wz#&UdE4}X^~`ke=IRzPda=`+Hp5j?PLO7Kd#;B#eqQYsYL1o#(I+H7A*2p&k|DaB;FoDlkgab zDa!Nh_Jn2GgW;b-io)nTfJd;TJt^%(&a9c1I`V?nvFVn6E0WKeSn2NC5j6T?cmp~% zOqRWh*|Xpz<_=`I#of7s`X_C%Jeh~F>QD+A{du|w8bo-Cke;eC^`of`@sBCAVEBOcm#*q#y$8`qQZvav;iEq7g{D9-#Y7Ne+U?eJthCa~mTz2Q z9=Z~P{6y8#VEAexIO1&(nBMg0LICj2QK`=T)b8ZgSWgwrS>>)*PpM10K!22PI>k*^ zlD+I2qW(&^CLZQ^OC?s_G7lcAzn zN6qtAP~Tj-7)!Z#Fw7>@@U8`uF{ND(b^Y5I_R(a&0?6_Ji~9H^8*B_2IoX~I#DASm z{rZEa$7HWk*4Ij!TJc!qbth7N+#EsAPyw3sYi<$-u`2~7gIfk>^Q#7%e!bG!S5g#O zd1%PTG0D*48L$;6O!`cQt3a7RpcV#6n#+40*tSTM$q#mgh8OZIW>ulg+Uh=PQzL0S zbR_!u%^waNLRPO;r`*=n=WNv!GLJph4VNmmHI!?@dq^eTLl3-uLUL{PVqWUi(Iuk9 z8=j64PgFSr-+|4T!Rf61=;9yV!!rDi{d5Ij_ULk}0=W$~-11DJ*t0nG&|@J%d6W(I zfJv|4*#CQhMQm*4%8<%UdHX-EeHq5P<+vOar@2%w84E*(HGdgI#-$uSlXt{8^4j)~ zX7Dc?wT9)hCxO%`f;&Y3gN*a4P;ZbIJQEabSSl~*V0l4Ala})W#WbBVq0wqEeFI=) z{3B1#JmtF<7{pDq)`z`8YH@zniRht^G(|FPt^EK`tEkq&bk}(48uVj)EO{AKwIAB8 zBH|URav2)UaOv*e9W1E71OBy=y~fgKq6T_F2E&!S+T03Bx$7Ugu4E#Oc%?OG+On+f zP)hsN99^x#S4+46`5 zjAA95CCzp-1P~sXArb4I=MJ`nk#C7OfDk+WF%V*A=l!&!?6=k*FIi$VxsIW9`9Y)a!xlw4-p`k{rSA{aQhAHk73B zm!Ot`WYWY8&o9TY3*NoYd07=wyz)Q9S70X{p(T-~v*GQ)gKbHRq2zw<{WFzwTrR3nb0t`QQRfA^PuFIt{cIfHob^QgP#*` z>NT=0rqZu0UBqhUGN~3&u+iZX{w=<4RY)y+{aRKXEFoy$MH!G8oOb5>+uv%`jXJr{ z55NDa_MwZQ7mqdTGSZVo1rTuO##RCIz4Qdz3O4Hb@cHM6>R`58|FAy?H{ztQ^~?!3 zf(2wH%a4uWARF^G*1?qBnq7R^aTKKVh|uI603^xsBGRm0WIB!i;0oa1H{ZQ^%^Q}D znyQjx+hU5*blDYX``!;GR?FT&)LzRW_{)CulCdUaQuFI$D6-ol0Mr4`$J_z|J*VNg zVH>WQgoXLQUG;}tl;o>%^)-ln6-YMu7LsiyE5^IFkEgjEMIZJpn8me)ImpN9g`-&3 zzEy8eGDspzstItpW~NbGr$Vd*O}5-$Sa8HirSHwdbGL91&X0wv7!S)d5JW0+3+<*n zCJ~_ZRKVlOR(!4zsC;@q^-yF{8A8x!U&2=K9!`9X!0mk;mqQ-1_~mYzN9coo=!%nt zP|O}%u_#lhAmQV9Zq&Hbn)p6c({7+zv$S9lW>%4eRJ`WN+Up*E{JlbijwOa@-157- zvN+kO>W2K67;8;j2$HkVGnBl<2w{rTu%XWmILh-0vlH}99%3k=>Tb&2r&eqQ8#Mqa zSoQY80m)=>^cC{7r~C5n^AEAjFLP1`z{4My*`=d^L@6zI|9%ME?~H1ItlCb4nny}b zD;E@a`00B}CyT|fiBkCjC<921w%K(>U?d^BYKm)}5HeBfx7H0X;qpq=>bztM|U zhqzxDy(`3MkdoiS(fS@WzHGV`?M%~KxTQ<#`bJN+;Q+X8v!27cq+BsvL#}F8>m1Sf zE{ouF=oY60gQMYuDZq4lrjnX%A&78FB*4SFfdnbtBf9*r&LkxLsxV2`%PiNBwndte zjF4Iy|KfNVgfA9BVLHmT)^3^UG|+!UPm^Uu8!7vtZhrJ;R0~xT<)!1EV@wbT4+C{X zc0Sgm_(eK~qlm2^*1dmI5v$3px1S1^(9D=Idp5A`uUVEZ{^hEZBdd#HAnS|XaR z04B>n$hc`iGxnQSoRp~EFm-v~WLBwqV@;pb^6}Ru*L5kUXvh72Eqg-yI$Y>A%PKZbAFe?&mxIu$m$WZtR!b{>boDrlU2Ddc$D#Gr8h5o~(35 zXfg@xEOu@E|Uiq7y<1se00eh^cRF#4Be3rHY`@@s=q-)LMcNy z4Mf(~cc_(N;>)6siM1ZlmQd-s#+_MnRfV#dP_B~M@U6+bOJC(2Gx|u#c)~55qh)zk ziDiLasDYxh*QH%|tp$^Ta7!Otp%`3IbOQkj?ml~k@^(|$i~dkhr!6p)IqJ~UpCs^D zcP#HMGW&y5Mfo})gc@p9XIU#HX92Bz;hU9|P9bqg-oqssy~@Biydk7W?_0=^2C+>n zAI5{(cM#CP@Ebwk!bXj3T{gPA*v*rS_d=0JXo?z09Jt1KPo)PNK8->ScW2ShFBPW3 zHc|uNikGLp32Y>@SkZ##oEZ-vuma`J^dVu)!g~LJws((i$h6ZhQw#-hZoTtMNMa|+ zBX$b^zHlMQ7DwNXWuO5K0BUdP_6=yJA?Lb##EG}}?C(6A3C$20<<}55ktDQo^BP&( zZpl+sBO{u(B5a@FOw_2V>`!r|G-!E>X?0vRy9ezzKUwxjJtiuSDxDCdI+58UBm!U2 zQy>jD&!jhbTY^yn^H1)%M%UAyG@zEge8q^X zYX2aXV-8BWztp?r)Ujt%hdN(NPVS#YMv{@NhLl~D=S>Tlq7HxkRb1vO!u4FvKK&09 z%e~!yp?+0ra(x?jpU%zdK7n((svGUz$?x~IumRRAYR4KXcc1faG8ltUDBE4nX=+1Y z+<|IrT5l9rWafNdEg8(zB|O9>*M}-c8c0RT`$KNEL}>KUA}Frxc6jY;kzUR0jeaX# zP<-d2g}BNB27u7OOzXL-pe8_a)%I2esWJIjAZ4{JZ_m4AbH7?lwNjG~Dw@af_9==A zuDoIVjZ#@7q`Tx=g)PVjfLC2o;qTK!<;qKXWHe$c9vYPOAYA5Ls!CH+PE>j|d`nyzwjo7DUGqmO89>Zp-+|t}uQw#~PTh z)i!R_D}85I0yXA`jFC(ujX)|84xFgdmN7&`eKS#mv`f{AI{7^iHzgBv8>$XD4@jrl zwU>wi>~nXtv~kB2^aG?>@$l(^gSqd1<5VrjR?^K+#!x+Tr42l`2sFoJ$oY`Wum=i;qVgL%5+B& zMBN_-L{wF)Gr-!6$+6~jYY3+UAe&dtr$=S2RShmh*7R6IGU^XvuHUTNyU0ASGvlLe zHU1mjWf2#EtjDI(d}xqfomx+-Q}*`U6YdK^(hFp2S3G=2kHi&=1zNSAY@y5hJ;>^s z0gzMvZHXo(L(Jj@U;C4hf9o-`vtHv<`paNO5;LNP#wXh@^p(i_o z{Cj{K)x63r+-+e57^pwM!!Pz5^?hZc@OXy^$6*ZAbV-rkdPTwZ*I6*LWKgqhQ#{r_L zDy!KLrFEP(Ox3DOntVa;W)D&ZUO#8+YK4`b3MbC!@-si}Dom`*Bnl#5lF{I&9;h{; zCr_UGkOLrl`^&$USZNPc-Ww=OU>jrgl`?RZsI5$}dZZvpT5h}=&1k-d=hHW3F0xH) z=Ax1Fi*?YSnw;~Xmu~e`^fHbIJMl@?kNLR${-%gfaVk((1_fV?K(Vv)SJe2dbmFa- zT-}y-Aji(tfk!2M<}Qm91P&{6(4JX>QydFBA0@W0j*PoP(c7*cEd{&93%Qdmwc^3} z+~h6>C{CAd>GG|)<-?U zqn4-{UuEY?GxnL5M;N4P`21-Uu=AAWTG(LFG@0P|+KHAEwS7Baw8<684-)E<>DUMmf=gOIcZa?W(2jlL9@qPXop-OBYU^)pN zzm|5o|NN}j4$ZY@!0PWGqM09t*-0i)>LW&=DNNa1Wlz-U-EXzpFLkg;(8K72kJlQ`Kem{VFy%SsK96-PKGsETD*2cE(uN zC&1o#U3>?0!Ab&-c|WX`e~e#s*J{0*Qp=^Aj$F$;`l@QbGsi{%ZbWLecS(cAjGIIB zX`^_O1j_V^k27lnX^A>y7!HBjgXwm$XcMNqMN4GTzJG3yMZVr=q^WPuHZU&rTP)9! zwmcz_+<&{Am8I>t1)|W9zOJC(td0*LV{rZJtHdLE_tmCc;JIsWKTP2M$l+{BH0^vg ze7oG$B>6j3(9>hj&_qN+E&T9o$0wgxF`J%OSF%w7;=htZuPJaIXB(4jMdfS^&3t?B zO9?VNCgi@e!)~!x?E3h?Fxa1<+{*0CD2z*)9Y4G=4OUvg;cBsQy&i3*?1l$F z?K5qk$-X-7J1q=wD5a|l*T1unEszU}o)P6(`-w(o*CEa{Q=y^LXro4u71E}n-d-<% z0E)%QaV+SOW!m|m%tsoCnhwuYR%p_HSq(7VdbmAK;*}yogru_pnlt)jbMIFqxyw*C zZSTAd{>}%bx|#L|UUp_a3cXk){?o5A?yUfaw7-B>d5xI6E0BPy{6?hY_~+C$-$LTd z*m*B|q)MEbU}R%X>sDT%%P;yD1alO^o}(8$Xu*Bf>a!78b8F#T{P;J#w=uhoQA4r^ zq-E(MTKR4s$Gy8*O1LD!WJX@@{Tw7O$Ruu|_6nr9GfQYgyZis zpMy0M)ojz=esNQK$JC20nR>5L#tIb~$c?zDBEEXzvC`e=Oab<^GpN6-(#kWY&B6kN z5UdetUiSA3CD8hO^LQJCo*D?N;#+u!X>VSVna3zNI&M7zFf3+m1}q*$k9;4U*xezo zAr18;5LR+($1P*@w(SSo<%)z=epyo6;-_&Ag|{czcfRL4bq3jj2JtzjeEsLNAmC;RN zFiRH$2cIo>RU!He9Hw$Au4Rq7f}<9Jl?Uv~KR)5%uFEk13tSL0J+S4#6eooH$E9sz zBC1}Y8l)|to6v;TdVWG-d2$7y(Wgv96L>k+K6Ts}Al>79Q~djFC69dr%54SH0tj<- z#TyNwuDWhLo-g84v*t^UppP#W#y)$8YQc}OFX8h=jjgS4;A3Bg)U#yJlQhuH9PG2t z&czy=r6SkeGeeZlBE`qxvIsK+-NPROI{iGbeSVU|NPz#93F)W%uHLzxb<+vFSInej zcKczL>y&cL6nsYZgU=v8S=vc>h!LPh`@EFhpC;((#S${c>4W*G&Wk__Kv|fs(<>IK!vs2?ZYROjv z@RCkdieC*G5lwKaCQFX=_FNji{b^+&pBbd_&tbXT2W-QIUst7!lZZe+fm$9p#VF<8 zAQJ)->Z)|S{>0w~dl14M+8ohFXn?q8>0O!5o17|J=2iQ19W{IhjAS-{~bDtC`rDkQ^; z+AR zbrEOGH47&Bq;p93 z=5FdU@RBYRX8H%0$qf40I*t?A56)CXHBYDP_!sQb^zUE;@RQ8JH6#^p-B8I%_SPJpw~`1MEn~|urOuJjDzy=BUr+B4J95o z%;>Y6Hg~xYM(G%5%aUF{cuz_Qt!PT;q8ZN58y~E;^Rl3c61SWj8olmKqBHG@$-$Ru zrz14p5azVj<~e^?ERXkAFHDj?C6=gtq1`7e^ilsABO@jqMVa_lW-9w%==}aeqc9)I zs}$x@{;uAB*cxG&x_961p+w`hV?qVn0V|_7;3LOq{TP@=I@$i=AfF_2R}t2qbDx9dvJRI6)d$ z5STVxM7c|5ekQ2P=?6mYCtmPfj>&3P6yZ@kp5e^@#(&|^*e7KL)1`h2x3}azFy5G( zdU^7OP0_{+_uE~Gnm;w#LSBA~$c}em56`R?jf_0|;pmffGwo*GjbuM@WZ}Z8?-tCT zcUp9wu6%RUblcLO5#h%R17zH)K1#Q^CFWPhM_hXLMBi|TT79qoJ!e%weg@uc!4Bh_ z9v<~uF?H7nj5*UeOLgG_t2(2+nXB(NiH&^pA%MuM`%Il!yBq=fC#8n?((s%U)S|?P ziHEgq?{!m-^&A*|e$0In=17SwRry>OFDtPyN4urZ)|tBLzVi%DJ~@x#N=&7D{&U_W zISk1Zs3)&A36 z*+uEZ)ox9+hCW$Xsui(ITid(7J2e6k9^O-;&o53b)wwgW32`|;l2 z+K$3*>e3_ur}l4&g{K-R5*Tu9^7_yv-bX0&osM5a8mc~(YZs*_n>|;iFWwOi?ETs% zTN+~#CV5iW*^~4DOb(dJp43^uZ(QHuo8*Kg`f5a8`TCz;`M(y-j{Qap9wt6iYd+|w zxUVVY-N|a#gWq32lXZ$WJ2(U-<$S-#&}M@TcuTPo8y&FTn_k&3T}$5<_UV~x`Hbs% zlCKm9V1wGE*r+MthfhFoj5p)aYQO3h3wRf3(Ipy7GlMKm{2xo>*^KA5A5d=`37$>i zlCg8uYIIj~7$WfJg*iIHga{@gwPyEH)r{Fk=P`tl6T*09bJJ@2(ZX#6@I0D_vXugG zyUv0&#`UqjRJ58;uM8*WFnrb@=aBEk1~$m%*uvDk?Y3Im_fnSZhtUCqcPPDpg3O~71(`w`TE5B2f$eohNonHQ}I|bXi*-WKgHO#$l zm482zhjHnRGPrUE?WhdnsA5ea!}ZyzKVZUWB1Wb zIufrvo2YR#Whyx{klYM%Mb~XPCiK_GG1AAaZOVdkGVu3c@`BXvUQx;xJl2t&M1Vs6 zmH=e|Aaqvi>73?+^|mXXt1AB1WAE7}tKtAjBv_^#oQ{K(v%ffTkz(Uo zNYo2`vMb44f9#4}q!FIRa%8=+Ur9?MUDWxU@ug;&IyE=iObSP$v#XYjo46ozXCfgJ z_H*dRlpM}rC_k&cwOjAcgQy&f_0T%zljV)~j|?DJZ4~(9svdF==t8Rb$AZfB<4bwY zcN<3Hc#{OkjWV{0FJ<1yI1NT%6Lc=)-!E=s<27$}e)J|PKyYf(DTgE*fQBaDrz=9r z-%^Cn>jGBkNZf7i(|Z2(g%ImpAHq{qp;?OYZ#hl;Q*}>pyd?e}Oop<1o|Zii|MM&K zfq<(1-`b^m>ISpaL~^5{kuDq7mASC40((oC;=w-s02VDV%Cu4iNA-D*ez8@YPtkK& zl}K{#E%ny^oyD_AAJO=YI!&wKzE%3KlYqX{Z^rpMK=09JLadi6UWb9UUFV8d;R#N1 z0LeAm?Jp zwbU$jZnALa;K2{k^;IYoT&*KY1OL4ieDPt#9$JvA;C^CL*WMxK*5^P%^XoU%Gc7y2 zJvZ!Uo{W|9DxBnM5o5pi)AeqXB^JQ>(mHSD66m4zI5O^c#$yqKA)tz}KobrM)AW`1 zR7gPVUcwRBs-4JG=K1TPcb*p|pz)smmN%lY89s*lHOZQubZ4W+DAv3q&$V$kF8h2Q z@`Wr-`d^({M_z%Q8jr&<=Q`lmx?${AW)rnGY`q}ewSYdt9VJ5CazOb*KfiKIA!asr zgEMGE()*x~zV4@N#nYVHK=$kD-`KB|U7`_Q1)NDdO8NH%T7uG%a;86W2(FmX;9M|a zxK`q2FD6RKK-o&P$+A(^R+v4-V?_?rC0*#Rl76^IsqtP|e2X{WC1|quRaGb8K3w4D$<#u5t@ zTh~HUztF`_i^C55jg93Q%G+Y7MPaQc=Z9cC_ABYQgRB)O!b1M|w%hCqxyjq9N%MJk zRuD0kTZ5bIRq>uXKh-L<4(wD!`xMV6Zmebgzc>fACjf8_yYI)cB5qLb-I|hp7g!=n z!3rclsNV#Y8+;7Y!}F({LUUHUeseil$;-t^N<2dInYLaZ@H~$Zb;_js$^_)0spwK) zc9Td`d8}CQ-XPD$Uhj=KK{{OEJ5j;ij{M2mZN5#Dualx%wp~oN1czZY6XYavh zsfcI(#yu_Sy56CfaPi%SxeO7;=6Tv-P211^WO<=-k%?Gzt@Z6ka3ZaW>Ty1N?z5hr zZxPm+LuP-V0pPf?!qVSfn@sg}kSgqE_yX(#@Km+ptQ;dfw4y`TGBgG;ntNZB+eLV3 zgD9YA%MPmJHr5f6i=2hK8-BRO!`h7&Sl;g45eK9ch=QD@HZhJbauB{=2H9J^M1bFkAsOF<21j>3!bT`XI& zk=IjmpR3XL__<;G^8-EV9Zwl^v80`x;*r`tqa;qV3fCx3Of%t z7lpY}yIVwaR?>fG1YO{5ShZg_!^eDzc zdCr^c>wa^g)i%85Dfd>!;dR3T?0wacAK~RNM=$TGKuaEL%Qw1WlQLd8$goa%CIY&8 z|D=;LBpz#%hO&6(a-i4>L|2D=RX6X^45a(|k^4PSFUWU7Y6~NT2 zo(<&qgdJ>J&sZb5NE^IE_J!vN>DZ`0{BfqGidfdy(-OM+spTx4rze-FGS0^P4KKbe z+B3LFN%Ia%{Xkoh@UHfRg-Yx7VVOd+@h6~$A^LK^Ceuc+p7UwR>cv+1trUj#GNfy-1j{obYFwH2 zURwE^jxg;pJsdp}UG21od6ok&Vzy4)xZ-53l@9~XEiwbKfho? zky7vjl>+QvR?krq)WbY$k^6-ykL9@pGwx^3y59&Kr26sYO)HuEXRHS~q20<>Gbh$p zA4&Gk*ApH^9E6rDUf7tc%Z%wa-*_O`P2R6g?ZRYAUv4lXo8?GSSBAei{4m(+&5+Mc zEcqNm9;f@v^}ZWSL%dNKk7l_?KYkOD&tz1Q9jyPOeDVd5`_)_He$P(@19^=%{0coS zV94(@o?(?|s=@7{E zGF=>cdVZ}~9AAEyIW_5B;Wd_`sI(W|PHBMl9r@^3NCVx1?$IzU=hHYo1uV2&lX9Q&x(s#XEpIB)m@!NhXVTlq{a+ zKVG~ISUh8E#-R$II8=CrA!>xvuB{vgLReS;rh-(0j_}iHYt)6Vf1aa2;=PF+4LJ+~ zYRE%XRah|X(gccnCmV#2f`ucxPwEN zBpy(f6L?-Tk>UKi`*cLuSmMUPWek&P!4mitxH5RY44ImR-5%a%`JGuH34$st;>F7O z#IcOMG0BeFHR8{~-OSjYefn+aY^fzog-Z8p9Ym>+!|#t6hj0xrOeaC(g2ZX6)gDu+ElDUYrMS2jo%wLphb+T^jafdl~ z|LMA|H1?}%W!k1mp0ecJCWL%rSh4AxN>J>6FWb78kh3aD&MMnKKC5`=27RV?#`l6B zk1TtFc93;OEr};LqQ7kyIXQ9UgM0C~vv`ZA-%+eF#REP`$AWt~LM559Qhh;>MRFKaiBXgL zrw8xrx-0AztrELOM3j%_6Yn*wcBG#Oa^nIOu%CPI4mYX;tbdK5D%e66#y)Bg2Y9sxumT5@_D<^Nmz{Xf$Q z!S{;qo+*}2?AD#7bK*xy%ISSZu6{Fgo;J+y=6PQk24vZJFZ@$b{Qs`IqbF0q+GKRGC1k_L(YA5-Ty(JSJ$ibGYQ&2{gzv3; z7NwSFOUzVWor-2Pb@t?|4-#b!=jd>JlX-pA&&~Pd11;A^)UYXbyj=g=&$T2w#U7l8 zehITz-$<65w^LxJ!sBrC3|&I*-CTcs^#$*d-=0sV_+E~4Lph?#=zo9nZAsR+-gd^q z9O-0ihD8k;_~ zX6aAPfRmfmhE@J;JTgzeE9WkySRlpxKYK!c4ii;GxyUA5v!y?xo0ZCxg01POAXW9gR{f^nVT%B%@&|2AD1jW7OG%$*lPP_)#y4wwfM75W=xr1^_Q2;R|X0 zH}>K`zDWP{g}q_OAyP?&9aN4=l`f&mBgaZHyK22t@EflQ$Mm21i0`TxYzA2b5LL+M zZ6?@ZA`2-vb-b3>F5Ux|uG8$%a|2hYot^{BWeNv643U7)lPxD5*+oV3{-?+;cBV+o z0&V+$Wf!fm|K%>~BfHrDx9_4j!+B#y#)#7#t!?bV*-VRExwBP^%odM&-bvNV+X*ph z=Kj2^iV1FG*1dePu2&zj-689DBP;{zvs2*TL$BI`J&p^mPZL7N8Lvw3CFJ+Hgu#7z zJmI07g@nWJ2y(qaF(DcJ;Hj3&>(c_V0`mJgZp_66r`V7k@**=fe0@hMpuk&GX<>6u za1`29w&e2_a?e+D-Zc;C@uDSN_Bp~u;G}MKDK!70{-xRcm&$i*D%j z@6~jXnR6aZr&Me$cWBwy^>y0}oqRXXkYMxNy}nR!eQHvc6sq$E+d;k90bqt0*|xQy zx81L_*x%wl3>}|VeF)5I`jj|VSAl(hzerV)Q9l$<6?2Mf>YA~K5GoRkm<&NzrTr4a z8yugf@3?OJ@@x1Xd`s3yMTOGuK`m=M#Jdgj4r$Hbe&JLiHMLA1D&2gjx-b6xW3UMM zU!|zbYYrOKhBPVUCo37ev2G_;Y2{}1;omPmscgt=JRsgE|Mvcrs$~DZjt$n#1Ns22 ztL7mZ{gt}>7m;YgPk9aE1YC^43R@OACu4+O-{8#xWVzd3yMr$#GfGs0p|wU83Jglr zCr^-xoFJuVJo17dow=_q|4DnSd7iCnd;XoKSZ)>q)rou9I$+)$QDR#L32EDTa|o?R=@ynbC>yCRhf`LEYa-5Kq+n`=Whg{c7$U zLJP?$j81P)=AHx-%l6Po`6DDFfCwUg0L~~R(;9!azLg68bjpE{W>$!0>vT6tvniig z&hU{=^rxKtT&}s3Zc#nOW_ou9c^2=UN_szGz=z^WU$wN8ge`_B5lhLVJ$`&k+L`JB%3f*#(i)hP>vGHi17knr~sHIBe$g zd}L>S(qe&n7=1I;oV7IE09}}=75brQ`05qQiih%QUS^dYClm)`^At%9d^cLqXE%*g zI!D5(BVN>Ggy7c#{!ID&kZ?LtAI3_VSlT*u16B%CZn39kY{O)QK_i`m6l!3I@sq!6bmfJW zL1Z^AmXlpk8#^?#%?WYX#SDNAQh{>X%uS#!Y!Vf&b@|y#GSq3-vFJ6e`UPnVdrR+N~^#x*%SBzhW zh9&pq%i#ov*i|2RNp`5W`T*LiaKa58vXm+_8S885D(`C9D-h~GQ*S?wn6*C$wr}u= zfA!Q&Skd+3hrB3^(|b+aCSs@hME7-6bN&5t|3EO}?YPy980ynx>P z69%f~$-Y%XB$vg@lj}D^2vdFVlsHc)gnrA*sL$pV7aY+0fuTV@^edfu(iv3!i#%lLC zvO!VK^iu6KJ}lJT<=c! zC-;-TdJM*-Hto#BZ#Dud4E`Z20bQplIDv$pGVh-@VkNUaN}MY1Hff7dn*d8Whxn&Q zT}iXz^9D#dcblp{VYV#Smvc-q>GT>8&1?swovcE7=1)uTXk*rPVbF{gBIn*6*(HRKWgb9?+Ph3N*WtT zY*LtCq~EXLpUU}}UtaoqVgW-*fq|SKeR%eSQ}PRgNx1$+xV5C4tG9n_n(7~$<|5}z z^zvV6cG9h+`u{ z9;M{tBH7SoNxL&j=mO}m4t!MJ2UZc4ydci`P_FTA>Z!cMXv4-BeI^xi)khgh88#-S zGvpEdLtE7yO>SyIqp-D;5&y<>K6^Ox1fvD`ue_-7idl=MWI+FW&ehmO7AF%kn^Y;& z6t5c1FZoezsHXb-Rj^_71xF3F1a-J&EIBph+l8z7xtcgMXBiH_xJ zR0vq)*8h^YO^CRijrKIOO*`?@>e4%*D^sg2g^1 z_dEwWV1$F>+;6wwWm)-I=RyD7^o0ztb-T1lKSfiqKp@E zKKxm)2W3%6VO(nDzRf`q1jBg3U9*R~c85d!QG(ak*u2y7C60;HtbLMpn+jU~r!_g5 zapkMbd$3a6Cw-1kOFrfzFO%gw`F^g%o%=;V_i;|e!-}N3(NknOeB8nE>;03J6o9i> zeorYO8pOfb@2oEojn_X_KAu{}$aZjvDS(Oo?)J+>a3GS_H?g*Mh+4!?;fRuDhM&Jj zK=M>hT0z~@bFOxx?&`?{LLB-#ce#&9);&;i^dHdVm=R6WipLWaOY65NsSK;bmXNR1 z!W&K9kZQlwTCO)=Z0Rgqt2!Cc$f%n?c^|?_zVm+^h`$OJ9;=q?LwDP5<0S^+b#b04 zROPKnWWY#13|h!eE0NN&yha<-Va$}s@tJ%`+nA2ha#ALIpM-2jjB1L9(?Lfn@^r@P zfck>2M{+2m;L%tYR2Dn;6j$Oq4V}ibC5eSr7 zt3VAAWZgCTL_So51^l?yqVJI@W+z=$VrZcqBznM3+f_6MTXT3NcWxDRD?gb+gKKoi zx+abPOSY7z5h^Il@ddjNL30((5*a0H->P=ZW&dP!vbImwYRz(Voiib~d=Z$t*gs94 z(YB-h4!^Vt$W{L+=y*K+qVON?Lk|2~^2meZ7$;k91CKs0D*6Sfffc4?(QGdfdcXWV zi+=wNZ+TC5OAmKh`olFZj(q*-rs>tgP;gPNPuz=BNkF6BRDNFl-Xn$;t^_XQOvVxB zmAhM`6$!VTwf8IFt@5)J0}b%OUWYSad!`B}cA`{x=Ed^zDBQ#FfAYd;@-@6F?{?LII%hCL zyh)6czi2^qFyW^5_x$bZR5nyZXegfheBz*Aux;H29m&>2N2FZ60)qA~{H=!`MD;3; zw~sz$bR#>Yq}`s}=OIT{@%%6fU!PJ}?gdi?yQ?m-3?m-f#Xem%SM7AO+>7Z3N+^Be zoup$=l1Y?OWEMdSG;{nq<3N(OvYR)VXK;0Rik1_e>n+Pw{#1{w-1`l>{i`+IOY6wW z_y4)_Ky&`p&?8NV5U=fckrE6TO{>q@j?2B98$?P=qJD2{C-I~#vrKCqetVLU*~J*+ zD#qT?SoCF(SOmSJ~RlG_V14~w2I ziEcCn*@Id%dGrOpDtp6LD^pn|vxi;@^|>C)iPMx52f=1UR(9XM=L%-7^iNawmv|Ao z*4hT+2Z8$)!i_>I4qM#OtnwnI>g&n{O-rp-Ru-#UI&`yhJ*IaHGCbzwzoptg{VYNM zuY+|HLTjF8IIqhioY6Z|2PCt4b#i#PBQjFr2mP0 zdvC_U;o1tt@DKV)AR*&X`Yi|KvIX%_%Mz5uVMneg>epvU1XrHZ zix_}3;c|RHc>l8}^13Psrr6;}&lkBQ=W8YB>*@E&a)#xa_CcbjT9V&f81~ZO_tfP7 zf?%_tQHJK(O;ssdyD6>m#u)Y8Khk6vXNnOW3_b;Kg_jur0`l%&Lzjd1xg5qx9uSe| zvTT16(3>L4Eeh-V^?!fKZgrlD^ltqRC5!l>m+zlDtW>X5X%tlc=75*;nMY=>?G?H( z7){IAI9=wPPM*fa(rA4xT&9OJw+<{l09IY~pCZn=8!i7cA}=IdR}K3Qm6{nzoCzP!|GCc&uQ>jv%Spc`M4s>;D)>%t=~Ul3 zh6>5_=w)%afcFCLrVmrX)WOsb1PXZ0??IA=f@^HnT0hkYox_%BMJNMi3W?LBu%$E9kw-0t;BxqCMa&|LIy&1>;L2LXv|04(3{ zBrX)a{0|D|uWU7$XN;FhyqAdFR5nPmP>>WRP-ogHf@r8~{Go9%Y;)b8#KPaZ&Bt($ zqZ4)N0@E~X0c2IYhE{JR(1otI%i%E3Yi58)HUC5+{;jJnqDhaWvU>ji@A#Ku>_1NE z|2NiZtv$n-z*A`UGupard-~1`UBTHKXm`)jEY8%yt&vW2)2I;d@!jrfb3c2-WAFRy zLQ(AsO&FkI*u@D1@+SjTlJmYFLNOEVD3!jXqM@g_$-kG z-P~94TIk?Ol4<)~1bL)dIUk~>f_yU>5=Fj+lto7Br19bZ0*h)=XyE9xUH%e z48%Xk*Y`rWF{0hk2`3d#zcBA3?GyS?}(mC19E4#fwv02LXKyUZny? zvRnyXEAzTFSM6GBSNS)AA8>{cD^wq1S2;Qa2|!Fabugl=>7FU;$4K!)pq5Ktrd72B zh_Q(qRQx57Qj*G(o(CM02w7M8=i@{$Zsi|YdB_L-^2zPpq)1%VwQ9!iVUV$&QHz@p zvGW-Cb@`E9Y%%gfXja!s3BcLvWtLC$;F zf{XO^5?P%&NDs$Y_n(={Z#|Q8d)bq%Y;)SAa(8Qr0i7Vcem8&KW3tjmI6r-1Q^h3P zXszX(qNgNxe`*Uq9slq)x+_M5&0^~NU=goj*5~+uk;~8axe&m^w1gk|??4f>`9f-l z4G^Z}w<6nrcw@dIY;zMHfv|PyS)YSz)p^boGbP_UnrD6Nw4nAnhbWvTVlH;SewuBo z54Rf#Du{&^lh`Y77?fSIO26;R&qn>Y>(%`l(*1~N;ly=KZP@zf50SoAhjUinA+8K#2FVNjJx0z;AS1Mc= zo7xJV^9C!aYG3ahu;UO^GjpP0V=0KrJ=Cf^`TS0b#*Q}6w*qIr$8>apx{_T+ekCudr|sZA1G|%5qj?Rqk5xUcnggNmEZqiN^ecsQs;Nk^Jvb7D%yw8nwwof5PwI zOl9^3)3L<}Y8K^9_m=ubn%#!E*2pcM;z_q*k0I5$T&BwXbX%zEIT@T(uc1MwtwFa| zDIupZAzz-2`sg)-zB8JfQlAZ2Hs})}To}MwK8+4tXkvnT*=qIFp zv|fuL+^I)09Hv7lDl$Y{rCEy3Fsb%_WrbSV70S`_J)D-hs|>$z&R7 zL5?ixRipoiZTNwXr#|rC9#asN>?O`Ea0WIT%J3LUm%Cc3ko!}iN5^Ns-58P6DTTHl z+?E>8pQc-TIp^-3aU`bHhAul)4lCtdwXkysNo8kQ;rpDvLxL8ba~b4nY*tMF^vDNN z_2+Fd^;{xf2_X$9=7L%2KeQOX$G-4vwQ#fpk~)Zfmk9h4lsA=@Pv;HNuGnu?R_1nY zDUNH;I_wI2GSJOUEelhTeq?mo$uws@;x}OFC+a120>w8Ie5UdQ9Z#GEU8qUsS%<}m zNT2?gC+$k7_v5xf1ejcoX-k*s2AOFzaI#9Bs(iGDeP-_#&Aq`&kv9=I?eNWY z_C%p4lgXM<{-oM0-(x?}B>Fu$jQavi`7LV^a0mZIc>J$C0UVp3vSb&l1I8uagV4=H zC96$08U%EWx-9)lW|kIPrR~LdoW4(bl$!T=HV{hNv|#1pNuNO3HJh*Ck!$1^S`hv4 zV?E9Tm#m!s-#M!3<-Cz=H*NY;)Kv>VK_?B$4%HP6s=hXhZOcwK(jq~NM_SUhJ?0gk zcL(qNeAq9Q@A31t7DieG1q?mID{M7N9j110Qmc=h5Qz$evv#pmnH3LA?BC`HepSCj zskz+c<}BH;G)K#eZA4!%9BqE;fkV^*sVq{8UomhO@t&=zOpKya9zaM1H z29+h>9h1TlCzuRS$!P4Xru_62#SKi^`JM=`$yem)3r1`iokpikItr=va)xS_t?bAh zo~g{%Z4ckx9T%d*8u@F1K+!=a^?_zxefF%3I^Idd%^ngnDKD zH?0pGk!a`|c~QxsUv&tHQ16`^4R^F(_PgUR7y<=MwY(>ripyC|c5ZZi-|f~P`}ive z(nD7gI@u{Lx-WY8ZhsstC8J#r?q{mcwSh*q?brRK)>=Ax4XGN`HfOa`(q?6Cq3obm z?%=Utq;2Bq_oC|1tIe(X?4Akvw>^R7HTb&w9f7&evt|U*tOyCbE*0YuB~G)fFTbkZ z;NsvDKT`iXc?VP74ciHl{T5n&xE2J)ICJvjP=o#z5{Dm-Am*ElL2-BzJUK`T8qm7=x zYKSfMB73cVk{IF$(yI0`O{^4AUP)0*CLC$E_tvPy=hvPCbU}LJsUZy!><$%als%DO zwSRO7);$sA3AxcA+zBW7uJ&usA%h-}EfRIl#b9T10yQ{HCuGr*EwmVbs+;liQ(pQM zL~~qd^{q6%#UN(WXXnxU7^Hk0_C9p@L|gENrHRSD&ZbqM_Iq ziFq`k8E?DNyABw=l`Cp6tU!-#TnZ9XLB{qTQz9uoo~_= zFdV73r;vUouv|i8qs4UndyvVUB?T2DQlZs?#v8la5A&=tdJz6aiES8TNO3&CQ1Mdz zXe-Klj2G7dtV=^QJ}2UIM6g{3w`Z);ulyVyJPk;>cyDVk5i!dabI`_}rUB+-=#$)d zaSY{Ee)&g-P-M$A6XC#AUWwv$8Qk4j)v7WkBH-TnTG%2UxsWsJc4iQD+3tgiNx?aR zN$FLJ^?`GW+vocx)m2361z9vL%ccW84hgMA-!*5UcJPzrB2Y0Zkwgr7g+gy1gMeLU zjl0{3gCs11=8PMtoBg9O`HZO7D6fBGnM?@g73p?sV?wY`eXS+%v)Qd!m}20!-{1a z@?D16_0@bioSHDB0q;inS`X@^KK zX5PR%tdW2J<2BlamnfLI><07qgat-<8{hIgS`2bt4?^d(N)@#hdeT@a+05DxsuTq3 z5elq-^RF~eUkte=QMy*eN=Uc$^$?R!8vmHMw4DqzJI7;`G#`1Z>)}es_h_oCMtEl) zJ><>GLbHnWrvGvA`NbOcdz}Oit~{X&zZzFJ+)}~j%Y9n^!sC++#OICE?b>2!{P=)mzAyUrqoh}8}i69O2pxPEY08q<1yL7#h z;`8<9iUzlhOG6dAuY)^5$o5~f#dUx1oapaQ6|I@Z^#r$MhcK)0{6>RyslU7r zVqvO;BYU*HFJ>i6uuUI6j`g{YwXE2}Whnkb*1m~~4?i?F7oX}hemF!&Ed+-+PqFx| zKlsgaT6sU)RsxBDG&Y9`j*{)r{xCUabPpXw&B9+h&Z4$4%Eyhp_HW%52MFypgwTVf z^X=m-g^zOgNF@0ppC}voaz?!(W~q}%^EnHoC7iCwcYeI$mD~&hhHwj+NoI@@X3AIu z>nccX*>;!eMcG^hUZuMIw7hM^`$JAM=84FVyF?*c!RRVF(i`t^t+o#^B~DIHh$z+=Jk}G1+Fb zpVM(;m=|qY&)Io>dCX*Y#RL!`HT!&z`jl@uG8KIW#ufyUZG93Gy1cbnw!7I?|D)rs zWrn@lcs}B;(Q}nVbo`!J{lGd+D3rd=8iHn3eaQg{OhFoVXeD=9i2S zg+Q%qSE5SGG3?R1o$CZ&=8_i6Xm`HdZ7+>t)@~=;eghl)oTqyuHU+q1|3loMXPs${~#o865SC9{sR zw-$2*6Hyn8GrepF06BRMaV5q_4n=Al$I9;-JtVyLp=ADX!|Xg^g_Y~Ku2jHbJ$y@+sj8HwUtS z?Gb5jF}^9fz|Rip#T@6WRiZ^j63#JsRd;jKAS7|Kc*ci#Ac-GcwHQ19_PS<*aJHS2!MYoiy9 zC%O$XN*MDryL_%n+xN6qATdhqVh-nAa!UFU#1Y3NIDf!{MBBnEzw2e(6Yk;$ykk+W z6>oJTc;5#i_Zv-MVpG{mh}##E)bP#NVke+mzCT$Wb~ zdTHr}uE71VA{YekWYgmB;n_i6mjAFm1f^Z&)w1p-(h1j^?{2tciCo`h**-4W6>5jM z59k-{wZg(=J8(g{Lm2OG3pCnwWLK1J)s?+zxYt)|0i*4LcBW$erIejFyYhA0wvaUp zF-Sj5WY^^CaryYEoYOBlM$F5x4!Ob1M(eR-H*hD7t&3Db&js^mmIF9I2|ZF=Vb&-W zfWh{5hVCYIt)UevVDVeb=yv8jug&ZFC;Yp9qTTOBwSL}nkrD9XZ@F*UVy^uOfIA`c z`!zRnahxC&b?>(>ZfxQubX+&6(8%D6?x56R-39kT;I}=z>7n9eyVz8~y4fII@!EdC z;2Sh(^vSDs!?6P!9*`csx3I9m3}Ey%F6h`)F{vLNfFSnvZ3`IT=s83drPYYJKDCR3 z7Oj%#($x}^@ilLj!t+xFqY(k4`u8=>QkwY(=6zd|ymxnCxGGUq1i7$8AoF_JRR5tI zRh<&<9WgtTtBF|HK}|S27O{#4^km|!V{aafb#}afjy`maK~69Fme0X)nOK9D z$6`OlZFjO~R0@i(46y4qM0DFf6lzqqE-~o0U6Bct7=Re-@s7DuW0tqj+;78@&%%ica3A7M9f31-4~ zEISlQdtnt(crOK0;1563`PQS<| zoc>&Ag8q}ba4o{FT->uJ7CvBeI^XpCa+yW|``ZI`%*S5is&HmGgYn6U^eM06YP+R?``W+4*QZbw_1N?~YU_F1?&c>ux zgzbp<*=Ny_K^jiHUoK17p^5|h;lYDXxUGG4C91$@|8mFRt(lOYOBzK!g>#r?$33mt zlGT}ZWm{==#lx=&C@!5$&FxUuf^pXPFuTxJL!-5A^nOh|1*6xj3I1l) zNtKpo!c1TdER=xUsRX7)!FDuzXSX?ZKj5WSG(d|8&0AZ%&sJyaY=(WfuWku)?*u=1 zEnacjn_0$ueAt(t1)q}RyqP*a*3KHlx+~dh*}I)(JC-Oq6l7|!$U<+Y8Ei(m)cct?WISo%=lj!oa3tcC!r z$PG3Fl~?zjYZv}^JXuLj`3XB1WoEpF;E;C)EjAG6PaIKgO4pe$z+jZvaTz?uKe>b8 zUp9`mPtOz>B5btJ8McSMBE=4epT3HJb6E$t31M98fwx=Ek?kaxwts+s2rECHDTeAM zEnwqd$0(j{NA9jimQv>}7~)&dn15m8?7Wctkdx@)Rp{MT>y6oflP{5heCn?|#wlC` z_A4Acmv+OU=1BpjZ1!sz_B^X>>(2Ma(vwwXPkeTtYPRr9B*t9b3i`g+TomDIb73d+ z53h%bWR)|q3et6`t=lIFl<^F?p=z8wIelj9SW9v1So&BU7Utd5sFFi{9ToyE)r9S? z-YA+UI-}X1v!E0#A_id_siG)W%FtAi?Pw~o_>^{Q=e{bKLrnS}#<^b~YFE?{M20Yz zjQG*0AmPs82yZpz2pE^Do)Of!Us_=P`ZG26*P<{eu>yFB##@I{a#&Q@P$aJWjwfK; zs_nVhfaA5#b#2Duf+}Ei8Vw;o^Lk?n04T-pi^{{F&iJLe-D{~v?7$VpFlB?l@kQ3s zwbQq`x*sHod0okcnF)nSV!r5rE;dFZj-GQ0LwY>^yX?Pz$(En<>z1&Fz6YR{@CeKQGohs-`Vw|+T+A)-w zqA)cV)RvjC!5=ren8~j`W!KSp^qRF^S>ABZjn34J)ycq7C{2oMnZZO|k4js;7mv^Ih|M1J0L!SLBLg$yw!Dt574B_-3Lb&{6@s@9%Gw7dnlj)P3>SMuX zn`7@a%sxlUebAlOekxN)Za&xl`!nJZBh`5P9ojVm7dabs#B?p&0=)R zb|uBMJhR1%SMjaS`sn9HcRi=KiWR41a|l>*DAD~ganovNebf_3bU{PZhl6McG{$8m zv!2>cre;g64b$x^&AyW0orNVmBEg(_eWF`?jNZc}gm%uBH9^?c|FS%rtZe32@+O4M<*z64c7ye(8mS3+GBh!{P-H#V3XL`E(Mxa#0<=tV(nq*J;pX>BB4Ko`pAP*JRs?ZQb*BNsDbT zSx$e&Is0TkVWL~A9lLg30Y#g{L_=GsWy^><4C*;$Rg}V+bv25OxL~GmvP1dw@*+?| z0*1g-gX1lm+=Q6^Re_blp>lsIKE0=!U66gCMhHfaMk=}&SK8M~Z*w$XCrOnJ3|St3 zsyLcggPFPjPAsh)`(fzqk9}=o1dyU2-kac$ zLrZO|+ohATER(U6BHKWuVwf$_nnCTVUdPNKvG#4)Ibp_fJKWFn2D!@RdE`a~eL9HK zgGfx%>PF`PY7)D`i14$AYJmBe_4v#XS*$p@97f%#ZeGt>xt~bjWqvhKi$RpHlXJ(V zoi|$Nps}iuS&uhsDFvC5ri-!!$M?mq`ExUo9NHB09@^TTX*qZ93DOv45juT)CFVgQ zEx=}0`|Ri$MyPLwwO)(Ue_l$;tp?%baV{8D9#4^{-`s_D!RojK zC49Le0uDm#-mo_cuunnIlVtyq(0JZ4Nw;`oA|-(3ZbtFKEx}f*2=m?TRZn?^dvWQb z_g}I$q%o+HR=P9`SbepFf4GKk+`&FH8(B14S~SuI@h0c;s^-)}XNE>uh(WC6GtL*e zw<%$SG=56jd*zXyL$o%UJj-peB%>dTs`wRZ6g3>>7j^R@ytn2&h4B$05=XX9F57NK zO9~ez`eN_hv3)MZ;DHui=SbCn6S2H~L2a+C&KNOl6XAte1B?pc2<$Io{=WAn5-u83 zC5{wk{iwEV;hnAEOWXMDx!;T#s4YeEm!5uOovhkF^?vmV`elqi|49I*vDdjyH6gPM zj8ymzG2Eeap-At6ps)flJ9hD41O)N<&SA6wLLWtB&YWS&A>OZ+=`E2WhVS(8j&hF; zgbbCCpSZVfQ#c+kfgi}6+a`0$>Y3hyV!)vRGxFm1VKx`h>VUn;_n6d%+k&Gy;n51# z2@%#t-&k~P9zH)8c#~kku;60jXY$X4Sr6DIp+8KVfDB(Lu#&88`0K?m)ArO%5NWy> zO{P`9WhZLvowt-}735Bs1?E4JpplRTN%YWP!GGCsxsEx>T>FkOzznG^0l$;|EfTCW zqCS)X`A&i~TVSsX=GKP&7=-AYM?V@{K!X@?+P(%`1%7Hdud8n{r5(5G)~Rr&eh}?W zmR!s(DE3xgVKRJmeHZe0wp5sS8D|0MIx5k^M}ridv&C5;(;Q(7qpra=^TobQ$8h}T z5kUDByQ_2>r`mV>By*AGM$lqMuj!)c#%zXucS(f9QZ#D0dVF_iy{+{&RfNq>|0T1l zhp@3y0s}sa;`AWtr;BwXO*psC5bwu>1gJ^=d^MG9tTQ-b(0x(cat6L{1 z%^?R?&mEuux7h#~T{5TbNsZ1vNZfATLpr%m78=x7-QqcQ&{-Ro#VG7??S)eZpMMe1%o>)c>z)Nkj4os{03-(1gy1&JCfdc+bgux zbdAK#yxRHXB+Uz~42rQ3qxaqVY8eab2uuOK%%9JCtSMS6A>8WL_Lc{gF>a_~miW-9 z<9HT1`4((L4t($BdX#sL)c5(Knh>J@mT*2ivfy-o4un@KYGL`ZplsxGz(eb+yX4}7&12wn|G&hm!`5C z=^IMG(a2QN3(|d>n8~RkQ$Y|-C*R{FVZT$+sVt9H2c4ajbOPibmt4c|{dnn4TBHw> zcRqEnPv2+Fndt{whwi=76KxbHy{=T*Ro*s>PA!+(+JbR+M{4Mt9VQ|mo>UKpvG*jx z8V_FGxSA8G<#9q^%_OW5?0uvMl8S!bhz~IX!p$U2(%61`h2-yUZwU-oMmnyHx8Jjq z@;y~c5r3N!?5sV{?$#oEr*C+Q_Mw#6qx;Rs)orxuvvs!9lU4;;RO^q^L zWa|?+5XT+b@31Y8E-!g6;rQ(>w-5n%?0Y7G96|eBXyJ?14`JiH#-W8&)2;K50`EOc zvXEZ~(^3hqs51V=0>}$@w)-vD2HTf^V6jX3uiXekOYRDf1m8zej-hLx!XZfN5l`l} zU$Qcu`eX^Xn?Z;RLT=(&bs8}`M+<#iou#qnQ&#ii_0O(^*v!Vx16Xjw+J8_^D7pRZ z_^k7;eK3HZ%Xz+*erkR#q9%nyOC!E%VfKKkbgUA+)T*=a^}{)>T)m3K;=NQ0UWGK5Z=9TBsx5Z>4vtgks4ax;D#p`naT1WZkA@ z3nt%hS3)ztDy`gE2yrXx$9)PtO80#@D?YtCLn54>K&9AmFI%73ptRSxNJpL1D#SZH z=Cx>=y?o^OV3{-GSx7n)e{8Sarjx~@1LTp@ON%hNnFY|B)ONP&(}04!9qWe0o;Euw z1~I3}VJw)Elk>y(We9y3J{7#U2;j4V$CJYZMntd4*7Kk1VrSJ&{JqZ$Sy4)T|5dwTfo{qd~ZoG8A%5t9TvpT-R>Dfk}j1% z>_x1tCEksxcrC&5wqOb91ZtMjwV{u^NT{h~Hy+0x+4%T*e+4i|Z$lKB;A+u!xtYP5 z78C#1SL=;sJAF_$OiWXpLiEwVKsV?HmhtmRCg*!PL>TKspE1#DfCU|Jc;f+Rh zWhSwHhz7%QiaDq0YSQt{Ylsa@xLB_5Uz-(}SJ7gpxFF`P(OFIl&AUxrXX1`;jKS#+ zAR{f>4@_HBy5&NM1sD#bx`@N9z-9j-4~m=Pyy~#|sB&z)vkiV&iHIw_fE5kGPTBc2 zkJ{dYOx#qq^fRpr(VAek`!ddhRfMKQLTj2MEt##|U)USNco;m|c9s%^+XZ?+q(Od= zfbtCwt5vhaW`FadOICa8NSq{v7%)S47-;nyGXxmg_d=Za9)_j?okja8cMD9PLy-?) ztPhZvul$5)vGD2K#TWOFp1*T4rB$M&W&*(eTAjvD%cyA$Sl#3Ckxm!lQo}P$L=AX`yrQov|FqI+d%7q4sqPNrF50G#tX;T1_ zHg_r5w670sIj;6|hnZEMu*?YHGy~Rwi0w=8k6`%YDnC<`oEn2wyb7RcbKd)DH&#G0 z*2W_BBe@Tz!QkSn4O@jvFSUh}~JtjeEKr&e<6OIHb_Rpu?q7%@Mo>4A20r*8cY z(<_BbSFlo8E*2YLtZ@ipg>mF0-sb^FW8c|0{xkS=X+RRY#UX{5Y+DpAEd1%V>7Q&* zE%d07-=X9^<)VP63eTkl$7yo$eWtktKH+VM;R!O}K1;iw3sgEizfQqy2f-VqdQtPC z`!!Kryyx{0U6fX%;A+^{m>iUBiCUC)6w|??*VTK(6=#E3E+2czE)-N&pV0ks)&^8& z71ZWmUh$1S#bdz*+h7p$BF=^-Wm5X+A!J}Ku+M#W6hBQsjstIgTbycMS2weYtnNGI zJ*^VZ$k3blfx%{m#!G~ptA5cRDVV`Pf3JW9f}FWi49U>!t4FUnBAhnHkzj+X(1K@Y zZMYH$qVP3`sndA?vL2*6wum#hR}%84&P2}6GdRH|1XT187r;;%NheSYtP^$#wF=oD zcr9^6(3MILtrm(2&T(Mj=%bXgN&x2c6gf%lO>(e^fCV3IZ}Y*}j~fW(7;XHMs=4C? zKef>L>G0tk<&##bUZ?zk++_w$-0oqvM~uLYdEdz1S9lEkQY}SbM_aU$c(~?WHgxDn+_}&qh!LVi|$lCk!VqZ zaH#T(pTOlSm(HcIx0bu?uLOSjj{g~}%I9ikEuvF*0?C|G3T(vbA6RZ*n0R)G+Ej!G zOoYBM9lu;vx}x~~0C|PO2n4O?oCu$T*$fP3`U;=sA-!v^q@NTw(SQ15x-}BZC_zYn z4PW=6`{soDQW=RbEchh|S>lBhO!i$ca_Ks7apwz!HEJ`6Sn0AKwR26?pr!aQa6$NZ z%qWqO#raWN2-+qVXFp$VPtD`x5(diOqIU-m0jURolT=OJM`>c>sB)erSuF#b_a`1rk8U!7TYQ-&uJBGmQYlT~O=#9N$d$tOv z(w#_n>rycU=4f~(dlpHS{2x#w+SUs3w9Mhh2t_{he&tGmGI9ulSuKLqW*u_d-HgzxAt%RB#BT; zA}Tr}5mG4`cXd(`Y1l|+GA7BCp|mShLIa72QfQl!c~)ppq0Dp0ka-N5e%IQc{n^nu z_kBOl_kRBPJB3534^=mE0N=Qy`*qJ zMT<)?dYj62@05c^041;@v#`Y!lGx5v8~Msva2wk@7G>@|`Z0gI!Jd0o^=AsME%(24 zShsbwN^e_BTcUH`n?n z!A3Yaq4T*euiZQ{M14ZXf4h%#SJc_5!8bcy3qVqDO3p9;(H+lwCTF7kL$V&g{96Ec z7A!ttojv+0HnmY}_;kXtF90P6N%eyoVMadiM@ce!(b2?=Wv5$Gkqg4`KL(f}wI8IB z02toF<_2rL2oD$wROKYD*@9e+cqrw;^S#M!*5k~`72YX6`(7j}PeX}2)8plp#XE~MZ*;_g{CN)MbmYS}*!&WR2<`7P&2A5}e6{N2 z>D%dNSl*-j-@_rc;FoyrUAk+-SmLO|%kiAZMFC{X!snXdA$gyR*~esCuJOMDgF?IN zwo!;t_TASg)eoibWK?!Z@;oKUN2XGa1I=h&@7OENyc1W8~P4~Mk zL$GmtpN2=!Xjh(~1~Qfz|Bo5VJ61$Nc#MmF7r6h<7s9z3!O#snx>r72(R+!qSh{h1 zRqy+SC~$BdGD}tjAb+9SB06@3g3A}u;#ZJ35;T57>p&Y^%_So7S?5}|x%8!*T9ihs zn?@is?2ts^%0LznPED^sP#^2ihG_44kK9@(kj>wal>@q>CaL?BJ(t%5U6hFiY^>7Y z<}F#t2oUG#+KDcmH1){XE@|=HsdEC?I5ID{Nk%|Q`WCy+((pz(Ai@0;eJ7E z6M(N&k}Xa{T}~_hib%ype(f$qjo%01}7W=cHj4|4l6eHL&I?D zM{T6(dimI{s39c1>qw%s%&CTc$XsGVfCPJF!IwM`0PKQ6W{>YJp9aOav`l5EPS-`q zZFSXz-LosW^(I%n${H?yFkS;j6DLa7vyq|N1m3s+6i+Q5wX`R8 zQ61n14mr-8J_=W$oyW=Svb{YS4xjdMx>tV^6&*M}W;h$7DN?Yq!sXWzG0*GdyM$wY@)1bx~CDz=NY$+KYdM_R-bqYqdGbQX**Hc_B+5O%ra{?wB z|DW`#t>_I0gcxq!c@0Ws%~I*kFx{rMtL&4AH z2!O9Ir(6Fgt1;1WY2L)f!&uv@*&o2MBCiw(m-ud6D%rZhgU6Tdj< z#U^7Z;C;R-!RU=gziWq#eUZPl7Etqi?fBT%PhltcyLE23y!J6QZ+PG0=qv~>aCvy4 zn8k_E4*N)y=a}rJ6)R`BS2P?D0$fvsH znHo)EP786K47(NbS+(*eN2(y~L_RJwFegamfQ?z?xv&UdC)7TJw#A)j9Zq>~R)r!q-I z9x_Y}z<@ibGb`>kp{!|mU0{X6Y+cjLsur2MI}F((8eT8vbyZ{XZvbb-zm)j7SXiDyuOJpopPjwB2ku%WU+%eKPl!Ckw+*02p%8Pftt<= zj#CZ?ak(J|CzQTL3yZhdp<;tK{^jnB$LU{WD6m2niR9T*M!gQReC>5XufmCYc8m4esqU4!tsb|n;Rh2&nD6&5>P}MGi1egO`gqKgdFc?{FwvCi_!w6#80oalF}{>~C8OehLqy zN5q%s7oIUj5zw-wyqSVl;IlmI&IQZPAR^F2X=)19(@2yCY&ZO)KXi7=w5+&+>>dhQ zK*=|;a;z-QM|UhVfB6yo@Gz761|C5doesTC1g4MtH%t$4C!4`FR9W6B4I(^FB%K-e zBe_wm@_z9Z%BO`#HtGE29+lV-%lP4ZxrvVdhdt=>L|g)<_Aax9z#tF6+`5GD|kIyAygD*3|b)WSZr|F zi;MEF`-LiR@)X=^1q>n}%`Wy~KadW{ zO0N6U09|QGAr7}U1x=Ezz5wq%8k*c>J|cN33H{aXgRXu48oEpi8CW_if-Z!(qIwj7qxozCfjlDMzVk??UR#CWn;x9bfdRov6)2KaxhgizjgX;Uvzs^RxJR?zoQgTYKRWPX7O)ThAc z{(@}TegXNrrk9@V^t?d|*nNdTK>kIA`bl?#e2)t4KJdL`uSVTb>^UYt^)Tw3@FETqqtk>gFVh8GO=w^|i6#Sf01 z_Q~4Rgy#ZOUR%px6#4SW^32kGC0a(|-aC}0r)4b4qn>}gqiiB}!Xxih2j`OEjOxqUuo zys5w!03!L2?AxA3oWa$s8_k0qYRx&kwD@O?ZkfLfs7`2yORuDDh?^R*ZF^&j582FC zuik74LCVDxbsBOGkX+B~@3qnGCyHbZAaw{;86B2uK`L6;lg`Dq3B7cErHoZUNg18T zU|`G{i^1U>hp0(NJ3aDEbrgIB!F3WI_wGoW7515#D?GTss_6~*$cHWYEY~}(?=C*y z{$#dtWhN=)>?#2>}U0;dW74kUNrngmf)Uf!w)u%UsMXv%?xaP_=yNX+{ zxZqL)KxPlQzkBshfPES;zK$32tkydiDs!WBk$b#(tCujNinjF*BFfy!dmIJ>A*v-%;A4M~zjD)zE?KfjGf~U*yAzB`@K3!$ z1$PO2kY^m7wILP@S}F-|nc*Dk181VhjSDNg$3Gaxg=k(6t?g`5MJSgIwuXs?j?OXkj57`I{1cHL;6)P0JedPEl2uW4ZrX)ECaCFg9#i;fukD~q{mD)yi)$CrQDdn}a)1b6!xB&`5__am{AjOU+ih3~J*Zd2s3TB&%G>qymW|0^~$d~0QlnDN~e zNI!7>svp);yfC#rq$KfP$sh6U{sT9B@ctgi(j}#U+82&6rc*CWtMjMa3qKvOqIx*a z$yd1fL~QZLfame8H6b|dBn<34dk;eR6$tP(__V`RLnLu?Gxx9 zO{UKBABJw9AFTr@cmOaxg~2QYlwDhEe1j_?`iR!G@J3aM3R~W@c?%@3Y_3Qj^?2Me zr4V;l>Prl*J0-h*ua`$tQ-ZS^L3Dd@rls^Ll0G)>Gcq>qR`$ zU$hq{7M7Mlg5C<`nU%L0UIRyE9W!$Nx`NYGS=O0&BNGtiHX0xwg+4Y1@-qgY%$s;| ztWd26{B%oyqu>&wwCxNpUc44ftzWUDTK`JHCMZ(>3p&wWB-)lxay6Q~%#FbOj-Qf$ z2qCIHJ%H>Dh=TXidPv*|(rxOm9tR&nd@{@V?!4FCbRG;7F__p2aULgLqY2fAp-U>e_Gg{OsfF zf))|*{|5}Z&KL|4t@ts6bg8|J-O z7l53No7|G*_S!*NiPG(mOHQOa%6nnt2+BJZUR!549`$e#f+C(=>hHM+b+o|L?miKx zVf*6Z{?|*56WC8wUNcDMI<3qt5vC=wa#iSiEq?O`uID#*zaQKWf!F9g_ho%Rad6Ux zoByIX1aFPHXP-Z=6QiWQ<;~9tU4$@8a6@ivO8yr_m)QIQWPfFkYT5YG*)ijuEL&vc z925+E@~F))%@E~90`e9o&uXRJ`ly=eG&oC2A(YT8L^WgjVvWWP;eej)asw#Szj*Jc z4+8T~!wFq4!#&_2p!ed);{8~g@!|{%TVe4z zbAE>ImXbYiaP27fLdi4T#G8xm#_X}~{)XsDUoMHqpIPGr`8^&OhNuIY8dO(6ILTsA zSZwU%&GqnxV?A^WVGp>uyHG16s}c$;&qB+C4Uk=UJE_TCjyDbRLi2rO`ZULq4ac&M zsqQ*;dE!*`i3ZNCHgt%gX;VOdVdw*458V=!Iipu_d^kc2PQi3;lrn8t^v@RRP7;({ zNfi_eeB_qsISUz-?$sB_;;1Hr1(m?GtVp<91}Jz_KpW4+?@*)3m=Jxm76pNwIfN&N zLuc3A)3SK>VYpx#$)pTv1|p|4#GYRr+!*4Q)`u$ZnQ|+*DfbqdQ|MS~9aHdKTMB@B zW<<|&OaBTT(V6KXa5ftJvZK9T_o*frsa2*SF+Jnt3=tdQ-QkUPPskmYr=iOcxWxt_ z23WfS<%@%32Grs?dHPA`r9rYYw}zbP3=(PgDwPDioV&?IgEMxcK4(V`=vI`072mxXnnW~-EO^Y-SY%Y7 zx?ke-s{Fg&H^J4~j#3BKI}qR77C4UY%$-mfhoY#u?o)>$PlT<%qVqn4w49RVjlvyqfS<{Wa_!}m zIGY5FHcEC;s*D)ahNzuMiyv;AUy!!dTZbALyb9ZWWktX>opA1N<9?%V>?pASz??Ik zqqmLDwm=mAkgFJj7li5(f-Fs9j|?{l3%Wv!B>z8@xBax`pSrMHSd6#=>cIp+jOE8S z$bkHC=47ilTLX%|D49N0RGdn01lS}WfFa$)d@Z@|H)1LXKj(rpCAqR~9VqyX94D5+ z{?W;;U~w&PDLKtDSRn&owhy4}mWHcVan*E3C|c(-XwRK>?$C4;bJgs;`^)gKIf4TMMfn{wkix&lXl(LK46yw*nog1x<< zNx|ri4=XY`#+zoRn{Mpy30q}l81M`rj#zV2u5chQX7ip{fF!K5&%3$$- zo!B8op!!6NLKNlf4co&DodmFNCN@V|~D*vC;~+FEUG4SuzA zBxIo4aq!mWXiwnbezhLcQsH@ujg+_{wUXTGbY2gb<4 z!D8yV>nV?>mQNB!Gms0cR)-oks2x@4Gf-BdGIM_|dQ7Pkoi}V%snf8+ssAbu-lGQoqNYkg68`*0Bq5NF zn%`DHA5aIN*DC<%YXSqH`!VIA8{n&gFSYR2B&F`KR2@w_4b)s1($6}T$H-(4G4+r! z-84K24f%I%5Iz%*5c@|jB4p!PD5vyT3yB_=y+py$Y(^1cWGr;()MANN1a@#F6EAfr!Di`WVet*oWZ?`=`}WCZbqWnBP9>usYA=1?8PbJX&uCD-tL6Y3 zc%kujg3<0?9@H_fL-3(HQX#F{rxAbxnRiPO(i_8^iFJ!IgSIq8=37>HWUzAuJV9(z zk|m-#p<~I{PuXO0xEHY_XX6>X?I8M#6S4uHx&NaL*um(ElF=yXEnun82i%y=gj(TD zTd{6Iw0yPudEh$io$A}alNBPy!w%OZT>zl#Z?F;tGU_$=IN@2Ez>d0J_LTT`zQ{SAQ9qU4KB zi+^LFoP#jQf;0M|XV+J>f@iu4p17Hmlnh%t8Bo%UfYPuBi-Ld)x}JFvcjlhx!>2$X zE=WX-D;k^y6T|+&0h?rA19+DK96_u06TRGv2IWyl3?RC5dX_nZk{9Q9G|Uthu(+oH zEnt)0Zcn`NT@q?xcJkiGM;KDe__0fum|RgxsnXc8?U-z3(GhL zmqMnyuaaI%;4DNNJc09EF889?^79W{-zRl(eMh?_iLE@)Wms|d(cR1HaL30lXX4HI z!wv#-sa#IpOmRoeA_&{y_)B8Fh}%TWtf)5>Ii?v%^xp4c{-@iQ6rTqTd}ciWSJeW7uslkxX{_5O& z(W)Z;YA?#tHN(__?%R9UB&~Sf)e=x&frqbm0W8(VVzG;|&(hN*bujW8cXLLYXq5dx z%cjb8yKuz%M9zO=ef%>c`@$ZIsmoPazd?tq*T`0a3v$L0ke5U9RQ_f+BZBJi5>vPO zep!lI`%8JvQ{>4<{PmBQoVpfL4&z9K7qR3*?Itq;{fdB{1&Op(${|E(8Reg0-t<~E z+2o?fUPPX3J|87ae4_UgP67*Y91}!1XfO8rB52k_{JvxtZBjNtZ;^9dA-UsXFB>9P zH&2Tb&ITkhIM9w*Tl}QkglOOtbGrnK@PGnZLI5m4C>v2r;2(7$jatO8Pe83PQQK0b zJaWACwGRA9=*hqjjaWrWsUY1xIFZjF4g|%o8_@^~`fwEziGDC5{O=GWzTI1%1icK+ z(fZt*yG0g6%Qmvnsy-S2LP1DXc zM@!SepBUf7lCKqTEYFJ2u@sHTC2&)2EJa|!q~r7-n5eSiSF-~K^8*GOE|S7;8KQ{* zs&$Q!`jx@bmQ2{%*nD@OP87&E#@7!g!{NoE#iVK9G1*f|-4V$IiJ!d{L6m>_G-pd0>M+~LYg6{GGBR$@jJ9@gb_hmcQXhwzB2X@9AAKyWe(ZvSE%g}$ zDC1Rk^3w7}SC{eYX0>~L#0txAhW@rByax=0m8+Oweuad0RtGgO*Q z_p!&Y;#jgjVuHR4p$%vf4cfvjly2YnxDsnVvTKPSg59(-G}|=wmFL)3rT%m|2eb~= z{2Df};TY;@Y3b>u&JD3kB_w8Qj+R^PLkykSWSWZGqhC>5%E*XhiZ~$@)1B(pC1!)D z*u`0Uj>atXjCTGoHE7kbGrwLUE@$6ZO)t)|PLMj? z_RL%q+gvzdHQdhlNH3y~dkSqJFKk_BBg`i$^n=RDc{hhcW4)W0SaD-9e%k5|30=<` zZh|oLAEV91m=BqqTP0*UM(&cdPbf|#pV3j`wq!Jc*A!>teC z=CEjbM6h%JkzgD`d*L+|W*b2Mw_TtO0h#YJ2h-O+1zyeoUOs;QJw@+eEMF=~;pJ!l zftT5$;4*-kA&&_DyVtCtuSHh|y+-Z4^4!-DDX&TYPp|3Rq?Q7_T%vyX-x7^6=_C-% zABgs7{2s1A5Ya3tMEj3iR(dQf25gUq5+eU@H}Xr8jIh^q84b$KwfZzDf~IZNFWUbX zK||1YC2e&~=yIxj^6&1c2; zSNyQG$#i{}DzzJz2=o~mVWvpvxHK)?NfSEI>()OtY7`SX3+a06!L!iOiQyK?+W*t8 zVe3>PY3Xg~Rq|V<4IIAcZ3;$SDHE*11h_VA|iR7$%V8-Zt|9fr{V$HK^z@+`1lWSB-mT?qFt6sNE7 zg$AOk{&wp4pHTml!m2zbw7szRi-!7iIr5J|JZK46#d?qpdiZlxijwu~MhW9nb9fb= znL&sZzw^Qpf&)Zb?O4nzszqV3v?Y~4Y!jfLRB{3>12qI3!P;k9#kf%=gtSO{cdH!| zU!{xaob2Pt4ACvKJp0wplewRhhuT*seJ&(3>uPD>*_3E~hv|}Y4%9{#$^}DZXImSU ztM4E$(?$I6bXSGF^&S^BrQsm7glxntXGyY`RazHElZ|0cNX77>?5Ec{J{6L6MTh4e zwIb!H74NFopU5L~6n)3u*$XWliP|6k{z@^rK^fuqVzbj{o2Hiuu5%h|a9H}lYN*vA z-N%+@h~Wj`l!7WyO#yvG^Ot0@8O#)Oei$2RnDNtC$6nVUtk&)Iq@n9`j|;P=y7A>u?n0Z0X2ANtX(8lIxMrzG}Pr{+SkwT+2P2E-<70sQ#DK*$kImkEJNo> z;AGlfn@v`KPFAW8xI~n*H1=2Gj23ggt%C(RDQ8a7WiJ2mr+GZ*2tfzFYcCOqg-0_G zaFcdta;_o7cvHNz(@|4PG;kzjH8gk8czKbkqDaM%4boL#o3R=(tDkmQYD07vt2!}0 zWPcv{Ve;qu_6foh%$*pNgju621(6yl{ZI0JOAf(0H~+K6%b5NTkVTcj{TtvL^!EoOxo%x-unbvp&dUyRJvrkAEH`377=-2A_1W`&$mVy2Qmt??!+b z$5i7N_}Pz` z(8rJ`D<*lX>=J~(w7n3(6b$uy8{oZ85*YK55XjWh$c*}U;l>ghNd6K;+R6vmKBfP~ zKA+GfzdD#b;rrJKjngK1}v|H4JRrM8txkc300e+&{fP^sM zIv3v9dlp}1w$Z7_#@(65FGdJLVA7NAw;?Ga^o&re$F*aK_xg*tYM5UwH~UhBGx|=> zH6Pl{6WAb04Ao`6xSWYOZ&AnrSB(-p#QxlZjx2x+@$8jCfS%>Jnkwdz1NQC2>n{j= zkhNI!9)q8>gl?^L?t1UGp-9?UWTAS6?URPXoYAXtj8kx20ApI@t%x&V6hv-Y@2C>+c|jdKAv5PT~HNZ zZ42S}Ldre}b#Raz8q)L5?i$@bhxj76mf)u0a+%g}2XoA$)~m6uZJPi(rflA-Pn6Rr zk?A&U+fU7X!d^sw1EGjVn;I#67?y>kcLfmZr>RSSqf58qCSnk$P@Jr^qBiVX9(fQ8 zT@J;|D_h()TNDcI%_BRPoWF^JZ)D1D(J%T&RxvIe*BOV%hXwN5U4xDsX zUli}e7PY>#sE_!O1;oWB{WgDGVgDNT07%q7hR+A@#DKlR9UVuJHRdU)X`zdy#6O1< zNPVl!_KlI%>7&WSmH);&Q2P_Ux`HErZa5Z{(pmWJE9EbLV8rr6C*r?v?uj&rl=k!y zV`1&lLi!ci{fQ57gl-6Y%c7Iz&e&Hsz*hw}T{WVxFD@Afn}GUCM;JV@y*x#!C~+I$ z9W;NSQH}d&g7Ci8 zYq0pfA12X(UZ&PmE)A2R0DEusiODyhzF|T>Q1eEC_2 zhIXZf5-LCYz1mG-DFSNYdqcz%HJhB{IhXViPcdTD3F%KfiBl&CRY|ZADIoJ7q!noS zVT?XBAxrt;Dax5r*|Y|`Bz{UrA)TAI{7L#DfCVF{%O8`^l)#sN0xkbeGA5Al9!OX@ zCw>Gz(K**8u0yrvu`2s{&DMoHz$ z4D4{{nRoaegizzoXGP6hu+MC#@Xnrjyd!|DgHuZ}>ge<**5Ot}5NhChNC&HjC((f^ zu%sXrKN?JZQclxOz=n@v?5Qn5oL>YRqRBu~-wLxQE<_nB=f{oJSm7e$Bgh$xh`40z zQj%b0i(2Y}e%hcwL?vVdW!#Zs!_MCw5eEU?bBMz@k^+xkgk7wMV>K$Y$D^u?l;@+^ z<9DOSzpTR}Dj0c`kV-0gA%%IbLfYtPSIj$F7y7PV-3p(VWD5@H=-6?=;TUe!VvzIc z3)seQ!OC_Iq~K;CrXG%hRPcYXc`2r(mLM20j(*;~T1s-x&`7qW2({?G^PvrQsM{|^ zlvEe0!!+tjXhcB#BSRG58g`aRu%)M>-dC`@w+C5jtpK|Gq>Uq^@w8Jk`(=!A-c0t~ z!x={%I6Zk!%{uHsf55xwO0Do_mDF2{Dq^k7*W9G6XeH`%vIeF&{k&DudVIYy{2?o2 z$m&O6{Bo1&PTY=8LU)AtnSyUGpc6&sAd%KPU*eae#f$moV~c+Umv%`wjHI3;b6iP- zvoRIdG15!VUcka2usA|Ad|FGuikCwAQZ#~h)s;HD;UD#6k?GMjB((-(9IRaq@Mb4& z>DZ+aO8UL*&H?G6lj%~oM>-g+1-`-_^gzS98d-zR$4Wg0yX0?TI6(~2+ecGnC?qfog4dRriPDf7%7G%sx58tetugj;NNb8- z#TR*czO@wsCRoM63Oi29hk#KM;QfU^>M$E`y9&J4JZTjTo1yG{2NFX0k9T2F7itvp zSjt=(^9M;4W$-_-$Y7=(QW%!)!~ut9XCSqFTj=J4+j^&?{#a5jrl@`Z8zhH(#xQrEJB`b!kqYGkIK5^TK}Zfiy3 zsI4=8aDi~ci;lCJQqegeW!p9LxmY$Mn;Dwyk|O?y8I!dU2m^PocueIf*pC)EmaP`F zki0ayQ?1H9m(fQ`V_^vmT25p0xdB`vk$!5r9JPiFlPBma2>$NXQHaDXLqEjFhbqpl zqOAHB3Pt(czc*h{q=3-3m|T&8ov+yq_{=d)Q5>Uy<2VHm6%9|pqxfO1a3In-1!4z~ zAZP%oTM_H;XicRH_LKu~q(i#DN%@;w}=J#vh7gZ-LFu(0qTxS(&-|fj&0C<_ z+gNE4wfXU|JO2QtkYNetvSLF_1t&>Z(9c-tU&QNYOqGKa9u2FD2qH|Noq{Gj8Ae7P+P- z6!VOGuT(r$9u{#+>E@FosvK1j!TxLpU(@`9w;tLjoNcFn?rpb}0RIMwKV^hDPI|8P zlnD1*AP#RW^3y*d$S+r&pK6Vjb-R}5wXUnSX{!u|ASgs#f>p=oqr7> zX)e}AN{1sd*M$+u+xy5Apn_BnCeyjlTQf9nU>retYaTRaDMt_s6j4(?Krn#^1hW1m zGxr#OFZDN7fAi|^YlRD|ev;;GJQo0IgWrPdw~YO*x&ALwvY%DVzW3C~d6nFk;MXw{ z#^XJVb_kk2*7_NT!}u%#MT&V7jwKpzfd&Q@oemFiARAc_gu9>`Rl2_Gp3D>W&LmT; z20lmlmL2<0x>QJZ5!H?$p&SvVponbT?D!0J?9)*VD)@-ND6aWX-j;iiSm;x@b10uq zoxjWp%f3M|bN@40@|=;08hCb(8bV?ZmL<_}O%z~EnjvEj!fSXhcX;xaxe(s#6$AS| zCyXmz)XcLmmR^S0Nsr+UfA+5GXtDcFBZv}UNy6qq-|<-U0c5jP>e*9F;L`i>UZeSl zX`UvekV&sB_ILSzmH%$YLxc^a(!r?RB@UjkF6E7zSTR0C^THKi5QybjUsu9mIhSfQM|I7D38);(0l6nrHZ$9>oBI=2aeBE zp7@f&Z#_gDyYxe;2cNh1;wbVhG&?vpw~O+oFf?!X^?W>?lmH2OcAIl<^R9Z%9f&t3 zGlLJ>wT}K~>fcQLo2lmoU4BdI-;(;@NouyvFwj7YJtHvXS9%%##r#%I2}JdOqs1BR zP&oC<-ZE-%5|z3x`npa4^yq)14C$p&F!kjlb82Xk5Hy{%k>?r%QW?GoG6GfQ|m+Hf>ULyWCYWoslF_7Q-e)6n-w&I@%N{lFlBn}(VGd=;VXs(@uG7mosS}0I#A$=&n@z=mI9dYE1af%XETu8xU z_|zc!2fe^)5$RGZ`2Lxa!(){1L-J!V*na1NJTRb&;0+s)G}OYfKk+9@Q#x@hucfSz z%?$M!B{>I3PYw;@B5R z&~c5HcZR-l2EK3aaxnu>HTwz(kAK*CcN7zwyhcj~JZkAH4M3!#GE zTI;DO7=cnb=v&QzR;7Owct_BF=(`G*B1=6Q)Gi56C7icj_%}>wRc(8GSG$>jDiD zM^7O@m4N>kwE^S2^}<&=Av1)S+7XG>jlzdf(c>@irU(z@mJpp=iM4<(1jy1g z#b||{)pj(AkTH56eh&1ENeB;zR>IV?C$+#?+~7@MMOP~C33z-eU0-|gF>x5XkYQI@ zoY)uUtrx976~3P#r_g}!>KxF#$ei05!*M0yffc_dkai-nbnG`?%$%;M-q>n7?3Fm{xJJIP++L`#l~ZC80lP4G5eKTyi=OZ=WtvcvLf zRnAcSi_RnLb0o%b(1%XjaGKM1fzTo=f0m|vf^QoT_yfaZtlI`A0vSJ`aMZBy2(#wX zZwH8&nxq6H>o-18plVGJ6zk!!%>Vn31-Q~i11rk5LrtaLmz7~P85E%m!bhd(NiVI) z1c}e#*I1rE2^AI|tmgQsCqax8U<0JTyzA%4egcZQ?enc_r!8&?s;)D>m4cTHzJ)>w z;VbLSFpF+Gs?WPhmi(zW*!Z^OfUPp_5gr2^dLzh`@}xYJ52*5esuvfogfJd>Q^Wnc zV)$2e0FUf?GYnt70YIpEJrUcA4pPrUBO`ddBj1)yNUCl% zpTuLt+mUIQm9PXmwCg~W6%KP09jq5%1q;3-{5$6eZ%V-QQ)@C7c80?x?E&q!Wc3p( zijam&x)l~!q|c~@Nq!Y1`5#%R{5)cMsDcLq zve>$NuEmLhc4H|&O{V`bS&Ri}M>gk&`)Km*b*@AeTry}Oo6h~ja>_zW;iQO@?ZWsU z(HHemuYUu-`nfrM6q$rJN#XXyZ}A6T>^}>5b38@ z{Qt7iF4!pf%_m_RVSY+s!Xr3a_obC7a~NR0`H8bA^_j+CF#EsbOTy1n2$hdrT3?Ix zd-&Brhw&zd;Z$Th9%Jo8e_2=t_}3NLf#2{_y<5>hlDNB{I4NY{f;I^jhX}quZ2_<& z*TdsHewN1LXNOK9uK<`yrT(oI{ezkSM zx_$`jaw^`ZK|8TIKiI*2BD-uW!%MmOG=L=98^gsZ+t?BTa_Ro1b+~_y7EIU+k7NDW zv~}(&kgg+PlXklf&(fKnl`$_>h|21yB|;X@oE1@j55I|m`S0X)`=e>Uxe5q}D0WDc zP6X1Lb-338p9!1iFU})BTsNe#1h16hJRL?U2KF#xro8!Aj~c|LES$5AgDvzj^>?~#$75Y z>~)UD`*#YVCzQXd#V!M^;R3AT`$r zQpZo?tJ(m%Tj^39UQ{_>WP+HMna3Kki(GGSFG=sDAx>dBu!v9nPrIQnw{Nag>B4sAN*JOPDz zN#aL9d7{%2=;$|BCKEDY%c8bwL3L#Q?`(V-2Wwsf6is* z`zet8ruyIm=6$2LEm|_Jt^GyK>N<7Xw~!^cAma}H$ob*`#4z=9*q(=0LdM%%2}p8) zEuX16DM^((1mq4sRjtgy8MGHn#$@ZbKPf~q+XrmGVX_bZBYNo;D@g4M*%7#y_RA$J z2h!8>9@Va(5|)nyCqri^fNSLWmk)#| zzd!E^<|P4t+tnJc!{ifuPDm}UqlM1XLK)vSJ)8_vsXuN}Q+f?_>RVw-9bB282LLAl z_JR1F_FbGhIFT5WL}1IAjb!{6N@$DrFTUe<-b@e9_JS=3<&+2_@Uqw~B6z|hS{2Eh z8PWrj-pNw04?t#NASD(pt+49|3SGv%*cL&r&9#(C>hLlx19e(07P=i}tAM}F?>f=$ zWf%dZ1oIlQD86mfy+nYZfp?Hlivo6ebR`)xAwe*%r5(U;!AQH8|L+S%oP*J2n{WAn zvO5Wvp&=;X3@*SZZI@-&W>a{IBmsQ*I&b(VvP>fz_CqORvGA-_xD|BhCRjxUH)|E~ z$9aQ@l~j$v1oZ(h_55G!P*DpSAJcx&e-7W)=Xa#tBo^?!xleyxN|j`PkeXpV9=7K& zRow}$A+bX-!T|sCFN>S!?4iGHN5%9))CO9xBzA}kNgioUIe{KXwl zArWx~tX_Ld-3;81_zF++?=~L6g-qu|Sk9P9gb`&qTl`=zYKP9y1i;+8hsg2kWkoTz zxl;R2Sk7MqMU>T$B0wz!txA#qWrs9rwFO0QqRu_Ur3>4Aka$Itw7>snXOMOX=!e4y zm0C?BKo`h2^4?F}RA~)O%}`Vbd-!~9Li-Bshb8b`Vf||<_)_MhJ0NE%olUMJVa~yG zpn|_6H45=7#XvdDbM`=JiUN_&d{j=Qu8b56bUOFYr;+mdJTBmEqc2WBBVZUC(w_S( z2r8%uj*y|ERXF~*dFa6t@a|}JjI?L`{9%hGeEa!r8QRtvfQqa;&e4X6<(-A~sV zWZ+51U1@^86s)H?xE>RC(g;yVzio~~060PLP5)gHfYm5jWNAa)Yu;Z7Lnu$PqO{`@ zgpjAjod~OV8sX>v@HZ`$4o_>7UQIKT=K~xpNUpEE``}-4$gk!mim}f1I}U)~u{;ZF z!x?4{`;Ksr#ly4s4r!#ji9){Q;11f`+EMK>Hd6pyzw-ZBdp!4%dFZm}GEm9%2T2;Z zy-O_#cg`;n02UltM|t@_!6S3efkX%2UBdNP6kqCmL>YiM)EDY4pA~k-o6)@pnY)&G z_w{cA16|6K!=FW|B8JZt=oB0ozLT=_Egm3`xX!P`l_kCe8j=1c%|N;a-9J)?n;Ky@ z@VM94Ik5GZ!%jY@MgPmY@Ha!@e;Y=gx7WWZ0!6qC+-=EN>a&KJ#x{N*igZkef6=bUvo(0dk%D#ygeySK#O6C(w~#E^wM@g=Jj2 z;O_l2zmCxk1(3atmEoN+=R<;9AckL2eRb8pJYd?F22bm0AkAE+`*rX8;Im??Dkaq2%mSrNEYM)0JYp5Zia z{tcXg^o}jPn1y5jH1+U5hxZ@;cTXg6!e=w)VoGqQifGQ75vXl%6|?ypxqp_Fzf3_^ z`@(329E_bea6bzZ-43T6)vbfkaozd57q2~DQw|fkm!m<24_QkBw{1NA;+_q)OoYO>zbT zc8w-s*w0(AnuH%5F`MVC(n|{tz$9c<_vkZ_B}NKqf?1dbFh-I0d?-)tax{hT6%5ML zK5@DVFOOEh&)EZLQM z&TX%YDBm~$W6RuQ8#8p;E_;b(m}wdp2k)}&5;3I$B4H}PNIQ}% zaLWgirFZCI98mCcn9#$T{PaYki95_iGl_C(D9_3pdN0lkBlvRMm&lE!m#{9AAJ^AB zolxk!!=~E6)1CdWY{F2-71dmei>9ZD<1L)ITrJ3yNJ6JuKR@O;blfs|gdf{grRP06a~N>V&eDQ4F{UoJs4K995N zTINp&(7?{*Np@AK^=LNI-iGc7lSMER_2IysfUGAk-olJ@?l>4Dm&00c>^++LTjatJ za>-^xqx&|_1Tnf_2z=g{C3`Ft{S=1l2| zi?pCCflv0wWRs_3Pm<-+g3rpc?%*b14EMJ^Uk51Yx3KPtvhvL zD6IjEgpQ3F{^Wacd%^69gYn%kOnjNLSh{hWujj65^592~<6mkm<5>a7j;jB3CbM@{ zi@8C*w#km0cU&U)*$xv=TEyO}7{_w~o;?-jJ%J`$LCZavkhT{&WA}}Gm{<>sDCKoh#wz$oaw99t6~ z-LK!yN`lF4@-ZOd{12Z7NzyE$H&L`*{rzMmnxp7C-K`gYdI+Ah)G{_%y^*JM?OdVR z&OTntq2Xa9Z*%(TyL%6;S2a2goSjW%h@vs?UD2~uFc#}V)3NEA!KdOEu3xG!&Ryp~ zv9xqh`q&Tp(fMYV)shb&S+m+it(jmf=V(&V>oV_k7ss2;iC(kgUf$VK1jy0zOw%E3RFbR5?M|6ZCbY}+(IW_vGnr3>NoEfxN zx#oQk9B4B?|2{JGqI1cmCYv{FIpqgP%eL3=mU*uLgMkeKPu*kkl^r^8>LrZ2{c|(S z(CghEzGUvME!fgbzB|Hz$RB6hlz4K!c{ji1FBz5sC_5E#UbW$7NWY(o;S4;fyx-9MP!HNO~~Ss*pdkI46FnxGHWm z=xoo%=)n`=lYrJ|b34Y5BAA7vmZ;7PyyRd*lPX zz(wm}POX1;Kbj!R@Z4EvXZ_i|nx-N4+}}Pv&SydslnuNkE2FZUU^*!ar;gpHv&`wy zM@S%!L}JofZum=9!o=XSWhy%*wVGP!e=uc%GFg@j2QO^xH1Kk9r0NCX=8S{YmiFcHLp}BWS2N0;gD@z0S-*2trf}-HS4Yl2 z&%1}^(}!J>NN1KzmCQ~Zz82X))EP{Q1Y0Ba0Z(+N^o*SBwa24wNVp_p z`4y4nIMMo6xTc3XH2LTz&RIc`Z;x64@yl2ca`|aFIT??C-KcP)X4t7CgcC;GrmFVtPi$jE(^?JS zdGYn7@{>L6#nRm|hCAS_yFGZUvl7lJV{VY%v7PUF7Ws<7I_Q&a zVxm~)2Dq7tf(!F$sXz3JtE8qslz6;1)j2XTMVjp2s4w{5wR^G<-EQ~*22J#d?8rIz)}!uIK2 zpZ?=hI;XpwdlKHfI;t#6OrNq1ova@i$X~XTDE;0(+@;=jss!v?=~L{p(>L9ib>{Gj zow9y(YK~mJ+w4MrmC)(*ZTVh$Q;*MB9l$}m1$42@Q=vxkt7m#Mx?zlWXt+F#kNNS} zN-P@mkD0qdN5h(~3k-U-!z|PNXt-p=_eSx&;h?H4!6~5SnmQo{rWUtVSuFv*(R5P2 z3Nz;^1BX*{r+d%BkZ_Na*4dKvj!hR1E39*ItBBU+aHzL=!*<2kZMw=$?ws#o*};P2 zX$CJvJkrRQwIyy26^dW9>GJb~yCpZ(W2)eyNU-uJsxyHHW^%1LDK@oH`mg>Y@m$A$ zc;$|J6}_2lx1JH40uKL{X&0Y8dM;EoG$Hl;<;tp@@5#t<@B}fOIW*Y0+>~RMU9NHH zUh1L94{Bqt^FEHjnACyz*&p%EFoDPM3RkQzU6tjnDA(rek#DBk^k&-jlx*LXSZ&(V_MmC1z5Ii7 z$jG+%XI7~VJFX_%kzaIx)R3jTSimmX3iA5W%pm`?_NDKIn|+{Ks24P1a-_R?(|OCBW_p!>v6|P zxY@x!rmqd(aLcsL>`gK4*%p`iSxH1?dgIK}tREHe4})~#^^eC38b;Z_Z0aBHFF*s( zC*G2ycJ=pvv9Hpp+9tJDw52JU6*Ny*(=#b+JPiN|0w?Ak$zi$X%9CzdHD4p;ZS2PD zs^a{|80=^^-7W1em#!>ja-3-i@V^l3^kWm9`n!!!FtPfN7zpIK8xr_E_FtSC4%O%z z-4;4==$c+ysAKkUNIz0=M-B&Y-Q*rCzYR0px4}i$(~MGN$tqyCYY+Lc@`?lu3U-j1 z_Oa;HYl4KjDnjvSs{i98!~f24r& zUoPgAy<-rQ{*r;`c%{o&W|LgS;oRt|Z^q0ShfVh`lN}(8gWOt+l;k(r?<3g~#`aT# zZ>r8cF3Wm;Qr0`RYEnMx9kATiH8usyj~QGsh~wf8RQ>X_DhLfGAFqBRpHk}k;Qk4g zn+1FyCElzl+g85KtlyLO;<#T~)W(RyyLVb-PTCiiCAK^}F?eG^iW|(zVHzA0%$Y4q zZ|Og=J$6Z)ifM>+zqgwL%z&Rd`{P^WGM1!Ka^^e12Uo$K-&By-9Tr{Hl(@U(rRYnp4vTSxF|JYYLUo$Fj0xb|jQUmSiA zI@k)c#k&onV^hek8)i=0!sYVT-U*x;+#wq|G{NNzQ@tNVBs<7H63+;AY7dm#8+T|p*tQWhYIlKmg_pl@(; z5`3+9crP-?(N0EGXL_K+eWzREu=B0>1@Y}nmF=zf>5cx*S&fx4dWRd~+zx{e_XjFf zBPPS!4fWZ4lpj=0W?mtl=X(5NuEf^A>#t*U*^2fLz!#gVHD8V6wFiIz7U#}ukw~xc zF7bmSzQrM@TlubK){9=6nrY^mrLjd{w&uzuV{YXBI#0SD*RH;3?DcA`bsYxQ`}yO} zT|#8;&as`n9qe)1n;(K)uW8%Vl6Frlxmcgk&~co2bK=CM^$Rid)r>gbDsIO?o}TmuGh9);N~W?KZE#Lgt?4@(s{)j_IOtntFkC2c%;|cag!vg;Nr{wGQDP z_(S?9?-L`Lq+sj!i-^UMB~BaKL~|mvO3KXk08}+0!`SaaxlPaNqSr@>f*6zAR+pGc z6U4Zqi<8U(sVo@dQRRJB8)MXp3oYJECCWoA4h@Fv_V{u6L*}G#5?2m3+*AiB1YGzyL3CksV!qdUh zX(XJ8*VG0YSL2+|pSWMIO)T8jE<-~c)&ciEmg=6V?KyYDw>HQ;w@UCP==JqzK|}|T zGcEz%UfD{puHO5e*QaT|t-T1yojg!9E^>HW8kx#esn@;zI&UiQZlEiPO0Ec~$66f+ z+s@a0V8sBDXg)8{4}ij+vbwIij4cxGZq-t`^XyMa98Tpqh^+!4!kt!kJ4;<`Y8KIc zGmf0bt!D3=b>PV2D+;xPiwtVlR*DurD;ZCT7vF`cmX{3i90`%=x(p&>R)^K$k1+rjv36EWm0{&vcR zdig2s+iDKr8vI-6`=V7GaRyLCL(K&Evh}WJV?yjS?TMoLh{kavQA8HDhVrTqomA<; z&XD<)Xdu{6f(8atA1T$1WZ!Z1+WeI+EqQbN-dfadkRdQC3Fo>n)U{-N?@AX<2o1m&n zwwykOUq6{fPoHu1Gk+c{IRC5=Vtev|x*lso;3~g3l))2s#&3DPfKTgYu9C7GYnpn2>a499M zRLC0B?+*8>>s=Hab)53TH84)tFSx#@ea4M2e0cGkDLoN+xgDobVy zzHG55G)A6+Yi!lyxk#+;{v&lppxvV(B$22$#d)k=0!r0d<*b}D+csa$?d-I&g&JWV1L4_ zDwOT}m*}bYG(BB{_xikY#B-seqa78u1=R^@W_)LJN6^MNVeIHIQJG;72s3ph z)!V4Y^8WjZXEZ47TfYKEOc$o-zSk;Z?K;I+Pn3|W#lEbyEe#ZMuI>>(9$kQR&kWZC z1yvML-tUk@eo^zu8uAATLg{s#B-t^@fKKCXGp`Z;&uWAT!B?>B;HKg_JxA2Dm!~UaiGyluy z$S*jXexAP14L+66%G1%5WlNuj4D@Y+#CGT%_4dV_2HJFKb+?k}-T>Ci|E2qs2LP65 zTyKr8tp|CCGC56upcr91%K4(2-B^WxBQ!PUz5DW6Kj&er6Tm^t#J!n_qr(QSVgaps z`t&={u`*ai=~NW`j@Rtv0-DQ3Bs!spsa1K`*`_jQaE!73wfU^!+6A*4xA(VKUe?_G za%?Pt^H8~odbFVJ7Nfz9o1k4;Pw-&DULMJt@L@b_k97H~$(qWIe~@LSv>vbkU)p-B zZ0?ojA=P6v`l9jg-_fKM-uu*Dhpn-N8uv!JtTODxmX&xy+xQ;;{HB>6VuXt`z2Wy0 zzz>h2C2LfjzJHBW)w)Q*b(7kgd41Z?apPexf~XZw1xZwIn1IhrL&GdH)wy6tWY4Vs z&X*8}G)cG>L{vm9RF3Q zIiHXf=XVd?KSb>DG^6j+H$->Gy;ZApoMu8)5BRCqy+lW;E+RMZG7L=rOf0C+P(^*@KM3T`_U98+if<4G)RW`hRF_H{ ziFiNndzAT3Wv*Vo#i+EcU_78W_266HZqsNxwcE#S`fnR}-XN2n%rq()bv7T1o4i>v zY}eN6G6~u2*o`vJ`DZrX!+oae_URJbs0;U2A^o@`vAOym;S+GS5s?iEgNu4c_-Yrw z8a==iT+)?UwSW{vD5_RPR@3f-;DNZvNfW2hN~fX`W2SSea)Ntgw$q^#Nm37YE3j$-IYpwGqU66Rx-WMAhAEjzfb(E zTSK>b$#GF@Or)quy?P^5m8GG9R%?mDykX5il;u|SdGAA5V@QXA1cmOpSSe7T;@9=W zS4yYqIy??HTdSv5_4jqO*L)Lec1sKnIddx7ZdIt|6avl8r^Efl))8`Teax5MF{^xX z)nMOcVAc0%XY1~rn}-z_q%+oERxFHdflmsnny%5P%1C&FYNUh)9rzjjZcg9_4$|VG ziP#CDngh$3j>GkSmDkwpJu|yM<&cB)>>O zNQf*f&GG-y;5{WLfK)P1=DIUr@)mTM^a8J48T@X;0zKIRqJf)$!`C79Kf3Ne*}tK_ z&)m?&-AskQa!^@hXk(CDwX?vu>w7PR{v*SMCE@Q8hIMZx_9x;jj{x1ET)+SES&pgA z_ec}vHx#r$<%{B)=QYB@yK3&p}<-wNnRRH`Wb!K&&pySs_ zJTd97Y`k;mciyu!(VHy+Si!YkeJ|ZvX|^Ys{@?ejZrN4(!X~=R>(}C?&)!K{J@ZzK z!7{i$Pa;SRRgGT|8{4F(^{XvY`m{Krvn3tGH;g zN30Jgq(9g9*!@(Xe>Sx3e_Y4cuGSZg9q7)yBD4>4F6E63Epk5pl_@^v1qjMfI{;)a zPp==L$`5DS=w1U6kQKB_#o-6Uil~1Dn1t8umIVKdo`KsmK>Ng;VfS&Kq|0?7iVPWs$a8MQ0C z^01nzgLxNR@3Ls_B7VtMqGM`qm-%RHwz7R)IJW~ark4|5lDRxurL{5JVZE<-LL3s; z>HFxAUo81as{GS>9zK(HG%R0ETqWeX(tSd76xqO*?i%LR9X?9rFhFF1EP_>I2-G2e z6&?RcLyF!x4c$6U<>T!X*yKbx$_LJ6xm(;MMGKKANaQG^X3@c{&vK-lzSrFnA4$IbfmMu8L@1@lY z^{&;d`l`_Oi9KZ7B*9$*ld3RlOh49fSu5jF{5*d6G@6ou_X~dbCBc1Xp|?$)rK^Wu z-_m7tsBd9Mv5(L(|FT??vh?inlhl&O{`-T3E<)5eN-;usKv;4{o+i}_)UIp&Fi(S!wXaC~ z5O<-6n3|4D3L1(?;=AqL1`3RyBtM{3QLuCA zD<>6?z1}77QhaPI-s6xRj!CiANmkW(Sg!{m*}^Etip=b0tDoYgX|}MxBX&Z-;yHzH zoT$?iyYFA&XM#t77MO&^pC47wjOWt0IB$~_UYJPr_sYC;U7L`_v}_ny1Tv|&pw-#x zUjMh$VC6o`kZjW3`nZ1ntH&wrv@J_svuU0&fs@&#PCvKIJ43M8wyushFaEuW{?!DY z*>sS)o+6g6$8z}qHx@1*%29U9;E?uL#bmvkABKD^pZ=(@FKA1?&`$!>yeG%m9TBDVhPQ-NgtVo4 ze?y_mCP|AhpC0d8drFm46P>YoxIRcCR+w9jZ?#21+%eQ@2}J`*-O*7kvzzgkmgT)RsrH^dg3!aBu)vCjW;|jshZX{|(6Cv! z3^qW>LNAgrwn}ZvUc`lRWiTsvzG^o04j_0vaz0edE5`JCGaN&kDjpB!JF@hnR9S`6 zdDc?oLQkOm zM<;r!94*}TDm9DDl6qe#e&gD;nGmq9T=(I(8tyMYj@s%@RiLX8%9zMOEcQLk?asQ} zAx_91o4T%(&|79zwGCU`E^gHV0Jg%YIk?t#v=^za5Xu21(H(03a8*WcMM$7ztqJH% z(}#prArRW}@R;vKh9h*?lwN_J7W{k_d6S!(R&0t~3n$n7>@Sc-3ORX8uD?y2vO?m9%QF zxJa#CId9jyFITp-W!j3L9R%(yVmo&8VNP1*4w=33oIG&W>spM$HVND}7#`Y_NBCT! zo@yZ5-N zg9MHj>#mB>Z1ANqULGup^Ffdgwnqsl00Zfs%9LrZ1nQcJnb|lk?TaX*)zPYtLe{#5 z;XwaU4dd3csv6D|(M*ttM)0Csg{+24{l52_B*Utbe-zmNO0ne9KcYQb&jyNIf^46~ z#=Fa}R3>XKaYfPm`K9~N1lw-eY4CYB3i#8D+;0u%UL=6;ELRJ9-*WE91~{z@PO6Q& zcEFz_4}N;B03Izh`Zm=bdsm(RzOgwtdmk2aD%!h~#COL}G;uu96f>-Q{ZCw@{DQ;x zuMBb_*8{d8sI}zKSGTIRp42o}GbNs(stM0P!K=0jM&0>_41G;|Q$xSfVWu@Si5ovO_=#QB{~1;8L&%p> z;3Wi%SVEr{TMk`UO;@g(i|WZ#CDa}F8ofK_aa6TkVGEo}KQde;KjrBK5yfR7iiFZ~ zX*x1AuIt*0@KGK&YsU1AIxli%>eW=I3kV~kgl&`1RwIM`GSctL&uZC|7ZB@Zb!S|+ zeH~m!8QR4kk%F_h7DaYR;Kp+^ybhL-sbBl*gGQ@_z3>QQv9E10sadB2lI6N}d3qR^ z7Fi`XrG(g4r*z|D#mm)Onity??8!IWfh-ueyiG839-V`r<)gbhv`P?WGd19gxalkA z`BGHk#rs&$Sz$0NZxP_t-{=Z<{ymM*x*C7=SI-3}T5^fvjJs__rGQ7GZQ@H%^&Pz!LM7FFh2XPha2_`2cG+ z9YklAP~P2Y1*n5b!hN`Z%8$D`7#v64t$~Q!hOR6eTHRR^dz-UVW|o>_Z5LMLA!^cODHG>hc)y&t zl9wRmumBwM#c>ZQ z($1Ba{SV+WP|zRn4c!>tbPMn+Uufkt#`nnO7wN;if1gNdsF%|wUF#RQTnP42w&^)1 z1ZLMm{Hi`pZ?b{i&xY{oJXqHlX7#^!%rTOQf5D@-2K<_O&FJtoK}yTOmfNVh7RORQ zb~G6g{+;%<4YJfIN}6-GKP!3;f?FA3{76?9tLrcc{ zXqkYUm3c$jL$yMTnVhp#S{lth*rQX$!+EYb66WY6^`T-*)C5Ot|Kb7iUSqUXc}rI=?J(B@$%0B_dR z6A+`kIk+=X{6JjxucPGEPbcg!m)DbJn5!oCedgRpiFY1MS9VA>Sbn!xPYIF^Q5^H0 zL&zSpi1{e`J=z+#D^Y(gZ$mb$`ah@)68uQ|yVPNSwg9mZ?5l&KY-B}B*&iV#EmwF7 za`T2-MzAX=E`3U-^mXxcCEKKU+o?u|CPop542PBBJJ@3ICOWms{z4Q6QRoVOXmU2fx9DP|}(s8NF?71@TB?b*4=XjFx zZjqxW#b%o%XEW zCn@oy)@I4Vdst3>KstB79*`E@b8qjFLeg5I1dz5&sOA)wh-oEn1N@VU%+MQ;rO;R8 zZw!L^d|&UYkU;vQ)?eUqvC*I5DyUM0w^o~&JI+bs8)3&P!5H#D8t`UY`h9;+1Q zuE6fCHWPw~4p%zaceeHLd;tpYq)2=A(?ZwYcZw+4pi8_q6`zW}3jv>k95S6(#hl6xR zJ*$b~my^3m7Wz<}6tp+j(2d}&XkS;1&|gCKB71rjx>wC}b*ub!2)I@2gRgDZW~j91(`E8^{>X zQCoXlIyV62WBk1nBvVNHa)vISAd5V*Z2$+Xm4Jlpo6DWdzTzhJ_3e)`E_s^tw8k6i zki`=~794hz5S#ZzaWmurt z!SlM^h*E_{KTdw|lyek77tQO+F{awDw3?TJOut_B(AtbjVn0tYR%AOVXqY1j{w@=A z+r-QNnE3<1)B@nPQEwJBsrR`BwER`%m&^i<4cmBkJe=XS!E0L))TLBtN+nvd-J&V* zV$yLbEy6Zdk5wV;rfwRpN4EYVWP?ZGpaz?xGqfA2`i7k{Ob3MT_a_dcyDXs3R(T>jzaG$L+cr2+?m zRlp#$8qt=(CM<)5`glbR`Xhw$e~ysKcwt9PaPe|H`j%@Wy2Z|TXKB6UHq8G|TYch1 z_ckCH2SeQsd|D*W%D|s6Rzqy7Pu$6*e-!o01tee*7r$BjIndxIPjx_!bW=$dae#;V z!ZgT>MIP!G`t7Q=Jk+bqRm=Qn%W*Ka-64k4PH5Z3g7-s$irWOKH68vSvWz&V?+jD> zNcG$>4rtbEBTMDuOz8_^VB;6W<-?ZCmI~Uk7Z-<0a#v#%zrhaV>$M>ZyaJRirW&*0 z6)4}!UG|Q-`%-z-byH~`XhRxOP`aFX08MBFwlMPHx40OEtoUCX04q70=JiKC>gLFR zi+B4pTe4v&&7|ILseu@d7&vRbsMCfve=Jx)EyNv(xz=O>Uz*E$+TwnqLDG`+Dh1+k4BQ;?N(h$sI&xQ4*ZomE#}*77W0`U0CiG zdVoR%-v87?caG27=lA-6p100w^Ac5_1RYUA=|uNEnbmdg2+BQgT=Z)_Bj^(z+*1!cx<9#5VV}W~vMaXk!QGj~ zQE1Y!<4^|M$%oFIHkP@Te%Xuc?IkeA;n%mQmU&N8HpMOA3cgwYl z8Wg`G*rkmpdkRQ(xXd-xLTHUyXM$HQBp`DjOSf!UOf9|!_$t)|)6MVS5+NAdm|voh zNVv~MOuCBoQaX)2+Aa`F+Z=gkq+T^m@dJo5ep%egIT+3|27BE4BfDyvUt<>mrCny% zxGuoM@4oMdEsGVIyOa(ztEEXbC})P8n07XyZ$ZJlFX9OLkV;y+M+SLzKCTkRl%-je zg*XJC{(B$cs$%dSePP^7UCFY|ub_}&^qWWrowroXVW5_m-?9ar;0e&X3?)#VDT_Op z7ptROkSqKGMOY4xS~O75wCWR!SA*cy0JIV6(yCl=v^w?~nm`72lNj38HvRh}re-EN zICVBm#_t={N?}+-+vg0q5@Kh!Q~xg=v4ynHdiN2YlHTZz)9mt_j{*u|9&XB?eF>+3 z9AhtGS^!>~-Zo+W5FBdB%ZbD~y6Q;9BzzgGZLhR@eT}D}dbq~8jh0GG=91(1@iD*g z7Of1OJaJ80v~T z<{Ey(jR-|+Nwu~)(--b9B;M*W1tpWnA5V%E!4x=D)BM$tux}-Fl%EFbxQU8n`sx5% zyz3-mch3Sgm)p8(J1iY>%K5o6w0&!|?c)-6gD6)criHyf6PE>Z;}bwd?0h+|LN5`` z5C4d^7~qXC-XpnP9NcnvKwwqR(Y_bJywm_W8zW#Iwt8po!u1W2ATk`wQXQ_O<|JufM)3`TQ#K9Vm!|r3!K4%yX8JgH#Csk%LK|hwSc(Lri$SCTVM-+&= z2TuUmze?Ecl)!!Z)--4anj<8W62kwm{N<|Eem0P@`^cr@-F6~BaX>l7jm_R9gRB5! zE^e0TgsvwuUECe}2WSk2h{`xqNL8IOfRdbqi&G^mAahdyk!`&7i~Gc>=i=4@!=5Xv z@sZtrnp_J5C{-UH+cUfVCNWn<;-ClH(X*c!l@6r=w~87vHO0%ncc!8Oy1#Is#67O= zW15*t9p8GS9=9lQ>ce^DyM0Lz6$^KqFus-i{Bm*kU+pL=cBacd; zh1W5=wS?pf$>)Dq&O6`F??c#TstL>m?ITrMCh$kAlOEb1fT$GcC-OaM)Ev+6<-)tVLtv) znkg-fg|(Yv6VF>+{mI%4@UAF+IOf_l^X@EepwnjA-gG-x4J7`?ju?^?W3HP47j9|y zmsbP5Ng5(#WwAdDJ1`rob_=AjRgMu}&-Hxr&_p^Y@)3x$#>?S9br2W)Rck?d^()pIB{7F#aD z1Bx%_>MnhEm^i8V*c>pZ#ybc9m_?Fx`Z|GnEEIUrSKf;5Z1zMO5f-aMtpHcv02RT- zPH|yc?L&L6*W4fA0~+hObM*X18DI7CnuXQlhRclWO1sWIJr(lX z^*$Lc7n6LW>PcTez+7mwW}D4^g4i`65{Bw&J3RPxh<`kM*E zC3wuE_@@~s{yop8d;wKpXr_sp18H!+(Ga3o#hF`)ag6nm0Z|4;duL@zMnT0MflE>1 zV_-(hP>=dK&_WusJX&!1mP3NXUC}(0)ng|CDuOof z&4lyJf!q@>%*mGA*bTtGz}}e39P9nvby)I$s!M?M9q4t8nOIvm_e*Ulps-AXi49%= z!D{TtnP|8))ru_!CJ{q@?vP8jQ3{;&+bbgkz2mU}NZx_vcG-+l02oQnZ?BoB`i2L^ zVMGzFBm8}${w*s|s~h1~r4wWW)ov9gg_7-GGwq^bTbNaw8-rkkBE@lia$~vVd(CS` zao19Zg`O7S&`~6@-mVvdO7I>gOP&VI3Kd{enKDUnCIIHm9x;(@hjKQb;nF(B1AlBq z6AJWx_Glq%!IcScP(J}dWf0*3vf7@80wu&|OOy$lZX-G$MUp)VVwSL~)RmS414NOF z{eZ`8K-+nX&R!I0&Ul=x-PCy&xO!!|7K15l+^%o(|>seW&ol` zYJ(4`kFIN*^rc&u*r#Q0Dsh|a$rLYgN|g{DVk z8<0DeK{*C0Ugk~%Hz6Z+o=L{{!Uv*W+GLw`?E3|J$HTo@8E^CA7YjY?O^;srKoom( zV}NIOaT(0aooSt#>q@TfjABF+dKp`)VMjA<#?_v(v}!S?OTlH z@Y8YZY7OO-IbofahD-IiQiYc6uvqBH#3ad3OkGHHz3$Jz_W+FN{<8?x8l z9^$I13+M!?fK%(f^LGQoH?1MlJt-?W{H_59t6l z?=*;b3AHDhV>~l6;YDl*)n!HAr>J~km_h-Rj}h|GoM5qgwOKDm8OW>n>ww`2K`ioV0K^j47g8BQ_I)dcU)bDCIdqucD6Qk|v{HO1 z1K;yArebn*V&Db(#2(jj+|a!BSJA!9L86+b9BzAl$>Z!gsI+|^*RFF=Jb&_gn|S4s zpJCoBxT%+q5tiMt7?@se*hFof&m&*#;t~G2+!HhaZ0qVh_|xWz_>6@3XhzIld3v04 zYd(1sSU*;e!+n-mHNDSRNq>N-^fBh(!C4CW{yHjPf`x$vI#u)?fD*MW8CR`BDBLzn zEy>Ugj87#UkJldrMidI_#-EpB-(St9>~*~4k$1>@)omo0hI$7>6bR(@8d+fPF3TOc z%1Wr1MGIPf1XDr1<+N2o0@waEjRx32^l*2ovF#wUFO^0gy%Cl<&!kKO}}J(-v{1z?V!49kf6JTY;!2k`jgo3r&Iq^rt)SkQw$M)wvmjZN_D! z9Vu^@eM8+-(c+Qy76Lp^;B3D8fpexte$qN0N^uvgbA=L@at9BpGp%ENwv}o_>HNAJo|+6yHLbS@3Tlg?;&1B>J3#)`(tD08 zpwrO<{;d%ae5?=&J-{XnyOA(jJMx;FPYdpw^=8c&Gc<~yI?EJX_l81CnjOO72!i3)I{v1UTiPD8@a93;7GtiQ?pqI|5YJGF!7Z7e3RdIE(;5x^UU^La zv+(0JpxsN^bDByf0{gt+`8UXvC;np1L7;7 z%cToh$outD#AKJGxd#AW7dc~0c@lsj+L&L2Z~F57JZjS!wPpYzYCCJO10Z&6#H8m9 z*K}$swod=-8Fc_gYXfz;w2CiKN<>7dZgZAo>4Jk$2y?U3?40jTm+^ks7RJT*f{!$9 zrJ7)6e)OMO!q_R6TnuS`T56NH?MykAnfL>`75(s@BnZh;s%IyANg@$5U3f` zV5VvdjjYTu{gnkEQ)NT(7!%IIkLYwA?-5nF#a;YT9<&ckLlvG$+n(!^CZoD!!DIm7 z+{RpT5E)-(x_MhDr^$Yfp2xv<((y3;!E(f63ON3aESH?7&qeYY`yw1EZOm+%diXzS zR=YYirNT+2(oHsr2m}Dl_g+z*~Q~KG_g35(BFLt-RRO zo!-?bSnEc5tc1rXohAYp#E!+mNifQm52SoB=?4>0;VjuMA`TlhD`-+lB7Uj0xZ)Zxz0vTqr zwKJ2>F!YSsiUEo2g|_0)&<{}5fWR{P>D=Ehea!38X@CUYBsBy5_&%pxzh)lv{xEF* zfiQF$LIgQiSrKr2ats>Ntt=0+_#LUy{yp~Y#vPto#zC>l(Kf19SV?_E3=a0;ws)JYMme0`y#Z7N2r&F1R6NivBc4U~%vOjt>_G z5lxFZZ+#W-js_Cv?#}Ab62;_#Q$J9xK6jAW@BGyIMAi*S! zB^=Oht=X>eFtSDxI8YNl0C#T$FV=Oe3#;eBMTBGs$Mo57pSvJocd;3BSoWY^79z!4 z#9h5xm%pL+=)9gyK8y|H(%6I693&1|tf^_B^JBF8DNB}Oea;j(wFVA3YicHOuobdu5Ba-De2JIz3qu(% z3Jv*F)Bw-S2;*p9gxeir=lp{Xc>Vz-?_r}#j70;(ZHsrGxYhg41$oloXn($t?M=Ye z0;z&h|2B>#rGP?1e(1Q(>WDhDTN}SOr7tw*S_o3BY+y1d{G>#r@oUiN+cWKSt%^aDX%DrOJ^0A>e8;BjeFP1d0 z?s6BmWVVTxF<2GLsx%OJ;(b1(Xv19SyE_)#kcu4uG~aW$SE>ASY)0G z9ECW=t!!du0L7Eyy|p@~2P7Osm!on=5YeklxaTd3Vga^uVvjoz6>_lf1{CON6+7L8 zVvs{?bcY<;<43g}ALjwbsvYBm{-_C#vo_BD*(p>^@`SvWqZ}beBVQ^@J$FSoC$5+1 zeY%lQwz5)wr#-#p9Ozz4FEVD|A+`bLwdmjegIh;*l5)~L>4!RAFk0*LX*c8+0xjqJ^@p-Jl+IVeahd{yy z7HKjS1tb(1mdpDD7`{w|)xjbKG)LcLgWp90aE#QSR65$q3Tg3N-;*gm_GrW1nHHs0 z@*=x6iF?jGl~D-P1p((R(<%H&yY`9unim^;AOdFBfb5=@9P9InU(LiEg29YSXFf?~ zYT5%=0m1p76XYNhZ#l9%y4;+~etq{93Brw{*%&dEunl zfcn!D;5J*pFLAh7-**o=OB9(Ga-YRL`t_}2QBW;aQQ75DQ{%}L4Zmyw`~_aiLH?$EFwXUCOl-AJ>ak13O9S6;QkGvKS6_GirHk zcIdU(I4#J-p2AK6vmzO-?#-Ug%m3@aYUzJxv~E>M{(9sXw6fH~HrOI2uBbiDV2o(v}4alM`Vs);t8VBbm!G1p%Mx5b43YrX}zac*O`DfJxp;z0ZRrasYx z8jNY*+?$Ojyy8kro2Uf9*rlq$|A7Bt=Cf<6-M)^X4xKS`&81@&ckRbzZ(z`Nabzk* zH86Kf&GazPS-2m~s4a8BE!@cF_@2f~C|iQg^Q6cO%B_G;4Q9ao%OY+6UI6hX6 z+~ENHkE+R^YO=FOr1eH_iQh#md@`JoKuyjy+=6o{Ls9#bV`POjDdrw~GjvS^S&tXP zp!3D0VX~eBp*`6M^mDpmOmMV&jlggPViAVD&7UXiv|)sGclbk5LDZq2uG1qg<3%i) z-7Z!yz^@9wz{HE#c-=pCn)6Q>aqT7#;aeH6@!%QrBP*S_FdxbVCrFTIDBE?BpP>xu zXh2*HHnlZq{suyq0f2Qq2n9iXX3Qe~KF~lAC+~U(E{S?) z&dMYaHZcfAuJD6kTT%QAph(Deav!-wJ-pBFm@o^ch`Posi$sKSs<#VQ!f3h{t|)(l zTU+(!er)WO^!A|@v>Kj6M8^^44~Y3T?80-9DGRwGGs(&rlN%k)H&F8hlS>w!x~R#(zQ7|DK%y z9wn)uLgU|7FIgc2Q@mnh@4m#pQu<(ux5E*GM#8<|&WR<8e|7qaBRM19)i+iIY^IHa z08b17pulmS0|a|;P&VEo;Myr{vD&*mlenP7nP*zs8ZU2X*y#TO+zM7FTtx;$*S$l* zn;U7FHl7?T)Y&mb@8J0Xr)v2f}E}3%}htMr|Uf2XeT`Pzsxj~&PeU^ws z1bNcX3@-+1X+nBgQ8!@tsX&B2T3~MFBW!i6xZU%&K?8GAp~PxrAA$!r*oFUd{_7E> z7*=JUnr@bmiCuEFS^fJrE8O9U4t8 zAZKONlku2k!1_sW-lIgRY7XO;Xso=IW}hNmb%h)s4OUl-J~J2MImR?=1lW6^2bJp8zt@m|g5b`Ss+gH*GqD zo5|CX{=*mfY~V2Nw7>o8+l(6 zrQc2iT*ZIuu{X&gHa8rEj+%+rF!cz6WY?k#`>?sbESpxPV}4Jj;UUFqaW{PPW`_iK z;^`fS)zJ~5z?yr)s5$||#xu!&ssgN4K$9SS0uqK(MY>sftTi?u-m=jtO+~76M}~5% zy3ZzpE89pD?L+CZH8*j0N@6+em} z*qCVpw&%)u%FAz(GQE5-B>zbNM{Uit8(Tuy-0qb~MvF^xz_Lv%wc{xkAoFRxLHsFj za?Hs>TFPq(fZ(2_D=%Yt@S@!kLfe?@N>SG|6TkMH1z`rrNg%|8h9_pb#ep;yaS+0& zE$kasR&R?_x3YBmk{skAQoyYDfmZi64RATT#a3BeU*fmmWA4EC{N{;6hL&xayg#hG zYd8H)fPPkmwFHzf=d9hCjwAtklnL`vhk?iU6z;#P=6#rc`*4ZToDCr!*;77iHQ!ln zX++oXSJ;V#ra#{>-C+(W3eUav_hz;kRQIERy!6}jyIf3^m-?LYAb+=J$;)y880zDs zz}(afxMzk(H=D*2Tm=yFPCYV1r=qwLw>8@f@{bsYEbhq|_Q+nR**;o(%7WjRxFj4D@9xWobpLzl&WVP+)cy;)Vx%X7(cYA$EtJU(dO88I!xI;g_=v}$+K z&%MITGaZaqV2UlZ42w8W*P-PO@TS@9aPl{hQq`AQGfgQ0@MGKHx+}YFVV9lkT;EWi zo_(hk)6dEtji0#n4&(0t=D?!)t+QtzHC^nq`FyOflUCbdq~GK2Tp8MWOqbs@YfSZj zbcJihpMjYCL8s!SmeAhh_;EYKb%XZ-pI3fm7rjo>I_~UM7p$ui#=vkQp>p`?!Py$H z6ZRTpOnz9jFQpE<+~XWI6>jK3b36o@l*7G;-t>?gnD7BG z=wj;DRSgb8(vg5gf2TU?8i>;C4+4*Lx;1n$K2arBgcXcnZoNSPW6;30OV^tZTo_iu z{Uw=D09_$>sLHn+S*SUK||y*&%NqKM-(UfoFmU z$VXy&!5u%(cE@!$kNadKV4He*ikx@mJ%F{i!w<_4nZLuOiGB#c{uIQZ#|@kPwEHDD z@#4ylAOrA->#9s(a>qw79?=Hk0B*SO@E7313NOnuSM9rrgk0jS-?FM<$JNwQ#MJc*3R7(0WNP1>+SEi5Ef-|(6l>$bX9@|YfPawlm4bwn~ zACaAM7C+pb7n7q@GX@#Qi0J|9Se?J^f`ZO(4J6mrg1CzFrMnS9G7N;}|KLc|&n?LO`Pv9SfaQd~p{)`JU1!&sY_28hY`A{;@XU)@} z`qNlmk+i92f10?eSKO|FFV>ow3HKpXT_J(FhuHq7jOSkkJ>*6EtI+=yCFp=CAzy}* zu5#Wsny7p8;233+Y4GPhw82NR<6ERol+8xpqIz+9H+0FcbZeG03FxG^K2$M-#CpwL zxadcKC^v_3MRW5{Ipnf!=p@8x{v+>A_Cc_duQSh^ERz2Mo#LD9`{KzdRr6H@U`XyB zc9W|wq~UVOnzxR6smZxSN$?lDW+TfNJs?*wCPQEoxOSYQJP%J$>R=g-8dZS=W5lMv zMs^GI&|4Gy-fl0v)LKQRxF{k6=8u*^P<`{j6;s%CIaWL!-bFKxo1DY*-ThUjgE6Ec zh?VQiuDc&X6MGGVSWRgv?A-!|Q({P^zs^O%M89lNc$$BX4nK^M7%LT^sss=;Yg zY9#%+1Yf}A7|8xR6tF)M5Ygw=zVX>Fg?-b#(^m}w>0FR(iG~SvEnNF>cIp~RniFr@ za89-2=#T({vjgm#o&5s;{i|L>J;(g&TieF}tnV!nt(v_DnrPSIK~7L1d7llNmhD8D z=lwzU@6LOj;|>TjZd2D#*Q(LIINya*kgQ{z(H?b>$h#mA0WR%P0$c5QjK}WU1ehL3&p-vd|4+5PY)iUZC2ZRf z7W+HPy?$j4(`IP&{U$-;mKxY#sn+o(Q^t3*e+phiLfJ*K*k>Jlc;c-F<*gdgvOu^@mBR%^||4SwIQv-E_arQIEuVVOP2YXGER6dO2U48%4Um7tPcCB$gNO`$B z`qj}2kyja!*uA)ItU*nhmKD*#jl6~EnQj@m!U$5uoc#asw8$Qxk-CIwO z&sK1+{6F^II;zU9X&e>=Bn3e!B@~qgQE3n?L=;evlvb2bknT7Vill@nQU(UCNT;NL z0*Y`HkPhkY`ptC?A?SU-@AIs8t?!S|wOp>liEGcEJw3B$l+JyY*|vW36ZLJEkn@83 zyPM0;_lP)t%la^+8TEi*vL8Q(2v-@W)@ zHnZ^+OZpU9H+1E_4=IL^Ld!_?ImFfc8yaBb309(0s=%pJP2c!Vw|YDj^0=JJiGkN6 z`#Ul^Kl74>;^L2$)uyR(u6`llDIP(-kcM)ST}xKaTYZ_zb1a?&`X>rF*p98_ubH#p z%%ApG53G|CymFPrz?gdxZeFORn?#t6Lwel%Din%w99q3jDr5t3ItV0jUsR(BTCrs% z+etXzNIhIU31tO7&{UJEbQbgy7u<3-_?0lfA%yv@ zr*d8E+fu3K>BWf6J8GBd!{yoMp!NN18|nM8nMP3YlnSi_nHFQ0%BtQPPc!x}RXpJ4 z<|SjI4_t&=10oi;6+odQwen}P>&hDeMb7+(JLT{=G`LiP`VqsXZ&3IV<1{~YvC$IJ zUHWiYrF52`R{7~EuU|R+4Z`VfszZOQb2{50gAW%TV*(-;Qb=);N8U3cgqIf ztRaW_37*y-ffLP_Q%j+9l3{IyajkZUSf<6Dt1XZiE&RZ|a`tDCvu}E|b`F@3#x1JW z(+Yx5isy463x3$7NvNX~Y1zPjIqk+*0m$Sze}~km*%I9MI|rpF&(Z`AuH<7-#nd3+ zi;rnrV{e6k3@(0F0Odl@zq4@bqj|=oLVF`20LjAQx%~lH2W1`9YDd<%i2^s}TJ?Ry zT5XG_%9LCOnL%~_lWE$x%6p$(Wya!iA1`RgvF?v|*CPFh2({e-;PT3N)x8AS^A} zT=&kO9*!<>@NyNdD+iBUi|&knM6|Yd1lo}^K%|SG?=9!`*Czx)CW%h) z3-%7`rLO`|%I5-YDX;sCSHq=gdVw3Xsi}N?E2pk?hc$yKUnj>IP*rQb(F z!)?}7$U-g{v~4(_H!{7vVI9&PGoxiu&oBEok5xW7S@oO=x@<$}8y7mErqR4p(7ir44GS#w(thdaZ0(Y;${o# z)J|ZOQ({U}Ypp2uKPVXODC(-hsGodnF=Mv4Px1APKMs8R%jaVC1u(o z@%^+w0#gvR|55VBSOB4mFXYr}Er9O>6c!x9d;n);_mTBdIfQX2?gBUjPfPh%CG-|t zuY?;tiH%#Lp0Z{Y(0EG)~nSWFO4FPH3r^or`5F-~(@v%32 z*mNOTr+9`?^|Viz*9sK507cE?!}~TuL5!odpUh+5mGwg?&ISQeHc#}{c@527#5ogV zw2y?1(>NvjmHlPh?5#H7Lh|Y|YU^R0Rtls;1j`vu(q8?}ktYi6rR_WP;g;J)lY=X_ z+};7^PxO~>xWVHp`3leW{?SW;KCAiw7^51*?VjqFWot4D2hY=g&w-Sd@P1;mWhb)E z&(!3FhEyKZrHem@N?)u9r)% z;~k+1Hhh2~ILyaml>nG2k`Ne@Sj*NVIu2eSo>b1n+Z;XzKThd7j*ytkp>pjLqRIWt z>lp~jOFENb)A}RcMVdCDke;R!xTLHfiKqMLGM*XzTR6zVO zP#PiAYqMqD1*1HvGr`$$wbb~Crl8_;Y2Dtj2}N_+M2$qJUW@~Sq1&A(^z~0u6WN!b zOGszQ@x`vv-QH(>JzbT){(OYBuu-j$<-#}pK)3+|Yx~ALih>bLr#3VFORF@n1@(dC zeB@!-gXhBsL=YQ~N8Vp{SWLRoqV@`LN#$j7Y33kI>?U<>C6xu`Ti5$J_T1D{LhEzjtB@PwKUymaa-;Yt8BgyA6n=v|J z`kn8bRll_VkfzwA?cK_?2dw0O`QA!c4X+Vm*$5BvD zt`<4;<)rmcLzkfy|8U}7|8ygENEwWOjgnhES#UezwNjL!GKh=*?bw%w)SKMog2sI@ z#;4|?^n*<>XvHg62V6Xvyt?jw{s9*eh!9gdOt~h+pfydnxPx+Jf2|5)V%N6A)FK(X zfzQ+mul4Zd7kk&VdT|!gML_>coMKn5Qk*z9KU^jlyD=Q8kYJ=QzsT~#%T?)l$s=+s zWngbhA3V8c>96i(9V3#`NcmcD(ED|!)w`tgrIY=z+1SqNxH$Egx9@D9Khm)33W-d5 zvQ`p7VT^0a>!kAH{9_(4VE{GRw4!-|P zYCg5_vT3Foqruk;COL01w9%i}DoO~`3n2ZiKNW5_RyrVT4m~ZZYYklyrMn+Adt{QA z^%-y`kKuG<*JdUJYCYa+#{O?OQ9^KHN4I`~hS?JzV&uIfYED_bNAi``MyJNUBp-KT z*Z4`0pZILe0fYN%WQw5AFLZx;%$v_3+HE%j7ct8f85%0x$d8UW%Envn*V)C%`d$RP zYeGp_XbarUUnPolZNBzu2g1KQt{wb^e|14spk+xzON6Uc52p& zA!5~3L+RinQbsLf=B8Tmtv7qb?Y}0qaWrck7kOvO2~nug{w&qr^93Bra<{Fpt5LWD zy={zHA2U-cU6W= z&a3mR{d57mm6uVSgE7Muf$1&xp&E47;x&X`;r5y#x0Mlk3;^l}fa>MkC$Rvv-r0h~ zDUtm1-oN1o@fg=E6$IeBW~h+i1ZYUdTG^aCzo2E(PdF$P-7-IJS#;e0!SvSR5+RVUxa>! zs;lcRn_uITG$iLA37kBbFQSBGi3REsfw4+9 z{C5!{=v~$a*MdS6cUe&4El#XSxyQ~u$XS%T5SKTUm7|b$-VmChD6=bM+`4eZY|Tyf zL)1Z6kZ)8)S=5bSa)~)rNK7ZW3WhGvIevM5_R4Fe@gdi;yOShDswHzoZ;oMiz6Z|E z%wdhGen**PJQx-C>VkAN*FSr6FxjGq=MleyAD5kjVa+*+CB`*r#0Cdvy><`gx_Dw@ zS$@S1L3JUXJiB{C#u-=*)Q2U<0>^d;7n?LX)TV={|I(MKsrEJ=T z#402tC~&TP-@iya7r%l}BH9A3+i-m&xMcBMXn$BOg=d4A{z z3dquD9-WLaKO1|lb9sq3{+!+|ERHCZA+V6&IgpuR-aSDlJlVrO+c7QCSzI1uzA!^H z3wJ}1CVNO}6Byy!%d5AMSG;%2cdu)Q(S`Tb`G+4sQd7n+E|Iujqu%(SDsSP2u47UzK+BYpWjz$hNrE+%Hm)%|wkKo8dIRdwha?(Nm zp?Dtf8oZK9?ii+m2Y^?ZjAfKlNF$>C!H=-l1Xn5bt~L%XJY7+wElMGAII<0+}wXa-=IO z3e@S@E}8UmAr&Fd)$2F{56aTZqho^Q@ZuFJ&ZfvCI6}FDTnq^)t9Y>{~GgxM2sZ>ahau@ zR{A_8chgQ=65AQh_p`H{)Rz~9^S_DsFVE*MQ@Ln$_AKc2FDz)1_4FjE-k3!G5?j#p zmFVfIw)oy+RkMmR%;79i!}Yo|-xuo8Z}lsczt4RVe0y^~-5dmg?aJXXqwvhTKC;7w z&_Jkys_-rGKI^sH+j}XO@RJLO$EC++E6SD+$^BmQyY2A{ErH(QV{fe{N#x7K2|W$U zvkdAH!h|KNcolHZx_H*VlxMPotEJ+ymE*NkiXW}p7xbnK#JGLN$BTESL@Xdwz~|t@ zwJM^(QGSouf$X9-gMmLBpb>fAycXPjW0e?KJ`Q)ZLR&?zJ7ABuI9(EY3LcnFMaw{) z!2#{OoWSL|{umt;E+ojiXPQ+>6Cz!eNEryuVePsC;1}hkd!IL8heBEngKz)Cc$V#> zUzgIaA`Xa=PcD{S$KrJhlUX??OQQ>T1G?+DqWnlqRQLU*q?1E-!ex* zVqeX9ZuYvc?MU<<5lhwW%X4vH6J7#=eGmynwYV&6E(ux5$SvEcSA~nS^i)OA%=Ys# z?~rCgK}E#}(=z8HL+sFD#QgLNPD-Qv8xZt=$~xi#_H9h4);`E^-M54+iGFYGxl&R( zBsUoP@ljF$T>HCA5Sy4aCR1)!rxbXkr!EjGvwm_5d3*#@&tuQgMof4|`aJC4%Pw(X zotRf`PfBg(*(m6+qj37Dr4&hmr1^E1SXB?}13nx20IhS?8=hpit@hbPtoZB9ktS6M zag4&nLlPghC#6;bj7AV1cq&!Bnq>XOK!L~sjk1yqJ=^CvdwhKA){=wQIbPu1E!SUP z;g?tYGeD{1N$8{@N<9OvK($k250v?jCCQl8rQhJDNz}G!OOg$8>sq|Hr(_U8x1lI{ zRc=9e6C@cMYxyxm0u=yD;&+!Stq_7wCkr4GM9=KKjOC0k}&9XToPj%7wcoU{=qBVuY)8qDNSS zP$^zaQN-F3vx{&#{NKL_fS-bL{}AbyvI`{I|4^8idevO{1+})6 zw=lb?3lY00VqGY_c6e(*tehnbPEM9FWUX=r8Hf6{bFEc3K)>L_h%j04~fd&RfS##st(h@Zm09Qj$6GX!TKPKkWgfo|w*oizil$U-m3eESNHvMgV z3|42-!RQyzSNBk?PRgs4a9L5xxz)uPledT zd`N`mpufjytbyDr3!Pg8S?$-&-K*)S8D}g|~2D=9S2~8z-!xOQpi;o$vqc7jzzL|NjNc=Udu|FDM zhsKs^n1E*hOnOm`2~WB9^0!}(ED!u3sWGW_k{ID{E9U-eq$%SO{eiicH0HPm702g& zJXVGp_nx272xK;hrQJtKWY`gC&>j6m`sk?xJC4dxhO)h<*n8@8#&fyS13UI5F008e zoAwD0TQoXIR5w>c1^;!Ch|!@`w5gNxym(M<%VI=`U%`HBr7*Qz&G@C^W3Ay;!|pO` zla<$}Cq0Krh#@CJze>AqL6sB1c)Y6m5bPxTVq}zv+zs5->3XYkZY1}j&JM;NRdk03 ztK7DD()gu(eZI~5gRvtP0~O(&8a*7GIBG%k7v$6EMHpu@IQ(W8C9|X}cAPr)g(1;- zbCno6qHI-<0^x)flDf@bfK{ZA1KD`+yoLZRZV(kka#(l*Cl&H@lovAEFZ>(cW>8S~ z@ek(4eL253b6Bs$uJiI2ug%{;_O+9OBALUr>k_V&@iKS+oKB}R>EatgVX{~4rXy}`Z@w2`%VD2@CBO}JOVpj z_a+AhwTDaqJ7(TlkowsOT6DOiW;VyCOEg=R`3yoDFQ!`zWqWj4yQuMQ{-&#BGa%J& zx}^_}4mgz&i%}wEh;)-!3(vX$r=<80N`K9xGX^`nDR!k)|o zOd~S4fIpc{0mhtp(@6xvfDA-3kX<_V%OjEZYlu-?M{>t0Oozf(O(s_#Av@?RR3e7C_QfvJc*VZF2!Ll`bF^fUh4+x7~zn9b&w&1|`F5 zy_o}gb?;I%<6pFf$`Wln5DZcda>3|OU7b)?N!Nm4gy`(tg0Yin34nbvC6JwLpzBY> zM>FFTH0*e?Rrv?^BmiCphQq%9ffdiI175xqCd$K3dZ~e0hL&Dohn|rF?U=i5elT7b zm4UrV%%hNWCz?1zvovodi+tm22RE*c?BK#3*fT>#Hvm>JK@1?9nqHE^z~~8oksUB! z8^yQEk2?EsYbocvyp891lxve6>ORU|rHS)e5Xofw1J+*y^Mu_KV7m>!_5~d9OPNAf zPGnt8V5O`loWB8HL3myf0>v%$faXu%d6e~?FZ=BM9qs^6fScY)0hyS7@BpBlT@8Hz z^EG}#Le)Cg8^oIq(Y4?NZY}kkS68YPV5A|}s9PY}JH&<@J~?jHKuvj9Uao*x2SC>;V9SEKE0V~VI^8N;B5jx z)UWI=$!rEZRJ{8Y6kTlCC$lihaJ%a1k7)yX{DW22Z)Ap4RNim=%4Ql+=VsQa>zh*F zgPig^DkdzsGX1@WtjvXM+n+C-|@x1-wES_8~mK?!wZCE-eSX}oa&s&K&Tjf)elJy(<>funxul@G;hXjC7!=Jb5 z0nnOoSjl2)g{wl~3^}N>R=H$tzdHL-!C)yKe?6oZ5(cCpH8*KS`3Fwf50kh84TAOo z4IJWwMZ7*|9m0I=VUDY7U8nD--(ZpEo}dza(8r_9KB&b%{#ciWb6M&SAR8bYE;?th z3y{mk2@?{PtAsEpID`*aSFFK1u=z&`G}3%JyB-HN@F>3)X)KAIT*gyn{taZwgYff5 zM;i_U#5JG`D-w=lHcbiQNhZTi287@SWCT)312LN^HkNRd{D`||qL;0DV6;CTde3bj zP2@*g0hdk8@cxI(pks%ZE<<@M9^rl-Fh^{+hJXy*0L=MZ$qJmfyN@dXT+zl7qdu3A zU0||o_zrAQ=M~`b!ai1b8C?gUCzvFaAlgK-5mswx*6nB61aR0+X`tmnh3_RCT>$XV zMG(@njYcMa0Jshw5xYAJk(CO__A?!fknN)e;QhDx_**t(m}=+4Qw1CZk?l;q{bDab zM5hS>o~yDOG=4`0UMVk#AZJCD{Q#>B!YEef5-?xW*^7h2nGOTDHvUNGFmA{8#bTX0 zxOIYNw}yLI;@*+pZyHfrlm*niW9(?kH7XTeT0V~U&6f3T6rKYXRUbZVwOO;mLumoy z{7oO|;H5zdP|@RT$e;32;P*`xyb@Z66~Kg*P=j}F0<;ptdsSoEuF-A7Hn?LD^K*{Z%% z4&7Xv(1om8d+9;a7MXOA##;*ZFjiPbe9MztD`Y!22#`Jm4VSDb6UqZ>( zh7IcU;oZYCtiW?_zs)+jZSJX+d=ZcGGlK6GB4_%|@L{p9`>M=*z$O?{(Kx>GrfGXvt4vL2H8`BJ8pRavB5qQ;+oi;+D|+{M0l z*jpJxa#&`q)N6@IW16_pMU$-Gk8cY~1n=PNQkvh~CydamgAK;c(qShn(t~Ae6x`Ce z2}((CJWr2nr8{Q4G^`d-&cUfiGrjAgTWd4IpG`i;RfgUVhk9%y!FHJNcaQlEUNAAD z{if3s&b*U^J?;lXGvwBIFm@E^8gkcBK4?WySHhM2bxmfB?T0 zzt7nvjsdf*CWyM)I`TRUDo`ijFOQ7y^S^8n1H(`Dkp||f{aYo>#$GH*ws0CKP4g%x zIfe2Y_84f|fV}BepNY^UO=qxaGIO5aKyoXOdT5S%(cB^@>^%mb2KWLi3M8aKjT!Le zGx%e7wvp`SlZ?PUGOW@^xKM1xzqoAxvcRIZ*R^T2&prwfM%5xTtwQ~xc`+EY8WZSGNY zUH4;Ct;&Xutd5JJ7U6NdAm$d2UI8H_;#~9*dt4i~8=X_|E+?NmAD0D@+R^u5Z@a{= zU?jL?5nz{0uwY`-Mz^4Dx0-{E5!dI8l(mWpD zMYbgZPc*^9Y$G5UmihzH1jM*X)S%JUIB|3FpEg_62#933%`It9yz3E7ItI_{8uS4j z2v7F~yNa;gehLuEBsr?8>@@&9?tE4qN^BUTm1Wa(rPzZ$WMm&?v z47L87tL&}h6O*Z$1+mABkNiPH8o0Smr{Dbflplc?3^gS?Q4D%rB|89M-*ia`|89g5 zD0xXz`)=Hqa$Mz*8PY$vWC0QI%P02#oHIblv?PJwi)bXKb(w521f*!j*?e30>{Qj;^2NKvUPc^ zS;>u%0U}IH2r*y!OOC(d@-I35pOK@J-2WhXaFzea)icbjZQbk;irzrO9~27a!{-`! zbd;h}AN@w#;DSTAGnP#A9Rd6*7-9(=rq}mlo?xI+uub?MBu{hC&VT1>Ff0DZG34fd zicfIi=TyH=8pKteRC|oXE;sR@*^BxAQd3(6HQZdS1;8i>6c>JXRmASR@rdCGjd|!MP(*$C z#{HPe{nXq#{6tDS z%^@jj8)NwI`ptuzy(TcLZc>bhYyCsSW?R-Dk`b%5As{bM z19*=9p?~!4wq^Yx9?yIZ9{8{BXTh}XKLoxQf6|+xaDVezJpehxW=bMz1+kP-f66w$ zrGjn$F{t!UmMUI+pK-RUl2iS)Kg3yU2#}NcbNtXY+BgTFcmsxzGusKt0*+#(-m5rq zGL8g)NV9*CgKhuOi?@wF_lKnCTd2;6{Z|j!(I5TixK}GGag>^EbG)1Rf;9O36e=-6 z`0*U0bbpA%GK<2t_5T#&{3k0A9+;O#@|PGlL@@pmZN?4x+`l&Cn#lzY%#$d@fw`vnPubiVM&9fPml5A4 z3p|M?3XB^D^+e>Bf6h3ckeE!3u=>CB4d&Pp-=O{<)AqxoZ;dnY!EJ~>2Q@QfYc(^H zp=-4|>t4}ScIF91?M5~9|Dg}~7lmsC_20VDe^K}sg|2@Y8Dq%!lKgX=L)I%Ef_oR5;NGv?rG0e}>Wn{C8(^9H6)?BdtSt7n!ny|pHN5bxyK!SkDKwGhT7-4| z1uU6YRvG()`W$4i)Q}op?6pp);r(;g3c6Rs*%UpWI@ zm*9?gZ1?q}m|UH~rGl-R&lV1DzO=TQ5t@aJP=!0sT6kyu1v4j-ZmBczhD%8WTyP;v z5FhhIX;paQpQ_#?py)c68>+R@jW;%77~yjT8c2fmF>*RfDptu%fl48#9NIUops z(K+b1tQ0YPYgc=$BNS`vpP*UY>MsW!5Q4CeQF;j!U+O%7qW8zEMeqNR5t4(9Q1b)G z2=(6-z?|Uvc9FArO#)hLa(iqPyxw&41uDSU^2>iK7+*>K9fQ>0;U^@&fVTSJ4>CYI zYN?HS@Y6$x^DO&6IL}ZUsAO6R_2iQRyD|9Quy52?e8_g%Z>vM@ORwJi#;oN_3=H)9 z<(w^0-zrqxAm+9ACt>$>;A;)|E=O4}m z?=23B+se*(r&G=!lKR zTtEZNp?YaDx*l9El-hmstI|);-6pgqd9&TGd6rQPqns=76LY5;ZcThX z1LIMlR~0!Y3}p*Wl0``d}*E+cMC?qmYrbe&z}dE^rueIPk0U@_B*U3-lz)=#dA?-Q zg|?61dmJRM5#eHZmn2M$@rui*Lu@E;dpy;=$|qq+gv+n)2lNTKi&6 z_jZ#LwYRunXipoA!i@4%_=aD0KLkTX`BeJMJE-q2J6FNb=^p)QXaqSD!|P<&q=;$d z@pdQh>4Tf;hBhXtHTIh5^H3U0UeoMCdZ6oMIxcQj-B zd#c5!HB^mW$6WIj9{+fxXq&{$`xEHcj!xQzxy6>{MUfZuhJG#!WiF&lb2WFQM9^nH zk;K0#rEf!RV|=Le0SaDrbXP~Uq!$c3PiOCqtnI&>t>@IbmC3-_jDwc#7ChbEs$T77 zkMQ+yGby2;(QbrDO@9F`*b;&Sr$XWN##=xITO%CSHTnwC1^6LaFqiUIEr`;^J+sH` zl+ff?#ch#ObxF?r1Mh0(ig@_@dk|2HlvFh9CR?shw82CeVz(t5-8Qe%L#=>XG8p{b zMVoju@?6ucA~M||SpmB05)J*QxNe1ZF4HzHG{;80B|mWE1N-fNX{r#De9b;>VY zeVUqWYlR}=$zU#yh_z>ESzekhYHV4W>I=%ibiKf9>BuAkO%RX{z&0!{JXZF13e(TUs}JHF9Z+C|7#WSCH=JNYv~ZWSYde-Z{u5nRBj5V*NHys;CdZKr(a`wxm>Be=K3Uyw zRR|4H8SAxO7S$vgV9`Pt;d!|)EQo%m&Ch$f54Fyax|Ljb=qAaFl6M{p+B2CC zfV*JVP#Oj!9S9B~1yDrqSK8~mIthn_?P{`7%K5m#V0S#{AgMHp@5Dkj&?pC zDx}in(SIar_T&B+R-dQ|iy2~hK=i3`(oxG{1UihhZBlGyVVae`D_S7@;&LlsgXA1{ z>ZR&^Ea>GZ>F z`$Dh03%#Xx7wpyO1ycp*al$wEw_SEkAg{7 z?~CNo(%sVJeex@OrpwID0rRxjW2Q&d44utJ?bH4kK|~LYjK@u40Gf4=nxz*;!Zo#RbA` z+r7kHmO7Z0h2r7Fi7GoU&ON#wNw@vjOlzcfF6i9C%gtjC#F*oeD~SArGmJ?DSCJd! zI`=^DyvPui!FGx$!V|0cV?U7zq`a?@WP@4taL1~#bBVUIoHdHHk}KtWo7s`A1dGFi zup|%Hn_|kCB=JNP)BLxxLik40xH+PYifZL07__Fd(7whZXv6yjpu6a;VbpgdCq1=X zlYM_e5kFevh;h6FPsHx4!@1Mj&0fZO_F?(AM6|^4`0D%A>fH4DLjmBTXL5i#LN;> z>xn^;o5tLx=2E3lR@L>0L}#>l?k+s|_=ZC7TnDX~%}^6X6p1}U{1x4xu<=3dsJz_x1(qQnWFZg8?XtjvgljwK!rPDma5`hq{CA&(8^*CC`T*^Ub}4W`j!n=C<8 zJXo}SH`77lH(y)r8&d4Qd?kZ}AcFdso@*b-Ws+@sZb{0&f_cZhA0G=Q9o8dtnIJZc zfH7fhZcGb0UHvMV1<}#xa!eK)hu@SjUe>?YP+FS&3Gn(2WDuAZZJ*CDk-@;(R?|V4 zi#Lf-wr8F4W$qi9T@Q2-9`NQ)Q{|qNHNFXUA#Y)wiuR9D`_B7k3ag!`Qbs_#+=+Rh z9^0|ANGLA;t;{#;#+ya4afu?8eGJ34XEKJe`t6rY$cR~+!NSq~VTB$vZ0V2mPStdt z?bCYak;4DJtO{L0dJ21duJE~rfuoBt(#UK?3 zpL%L;w%UcU-O8S!jKM}j2$aaV*|L^KnB4w!_?xY1sZJ=gQ^(CD0;eP0?=sTgEDKJk zX$K-!B>yq}YmJFjX#6Ty>`26>zFpBx`6SSvStLVB&;+xy+oG0dql#F;K#05my2|<+ znAw~xQ;mC#G;k6*@RvsJNDSaf%rR&$&!JC}CY&FKo+>u(igLmSG=K~}Dtxj-87ym# zw{2ybkz|!V>UD+Q*gKoPB>D?JjYbU-x3B#`Dq5@UE{osH;3B2Xef!0J?G}rfWCzhI zh9q>q?VvbK(FwEAc;lp8>#v7JdrA)d0R6CAZ_5phGMI4QGCEgClUHL?mac12a-o*5 zY!8(+NV`JRi{og&T%qBdaS`;;u7eE9Dx~TWFqK%hKOvpby3f>w(ajDxNLPH%?Crho z=Xf&r4`lTxZoO0N;@>Xbj?lFU5?4v+s7K-|&~Sv)2HQpEKL}b#=HbHBfUB$;b;c@> zXyY?`Upy8O%_xrWnez~I1{cTDI_kCk0I-3$8&`i)zH8XiKE;0MluCCYND1?vJYP|DC2>7AcF&r26DK8qTCICdUfH2!qI!q;r(U6V z*gR1;j0y47Y)_Z)7d0&zKL2z)nq_MItD-!aMfXR#*#)m7&($RrB2;N};!>{P zOw00w{PNM9i7)52N__Pft>=Qaf*~gew94g zTw-8(W9%_nYB`_xC5g0>uYv)EDRT0SxXW6+se*1q%Mw z-!K|!VqliS!2%sve$oLwW1>N{JQOD{jutH&CuY9rDId)@O|4Uohyo#}*_L4HWL!Po zyfl@52Z=HivF>T}p=A_;*n&eOolTjVdHI1e85LLMyhJHVBJSEVWDjK-vkn}VEkhLX z6wuKVU7xr7DnuRULGCV1CW(s5m0b9m;YYiDAw^<7Nw~Qe2!s9HxPfQ7p?^Bl7S% zsQIoYCu1b4M2M?Agl*CJAH+*hIe6_n;-ei)Nf6Tzr(v|Y-=H6=={%pp>(qO$&2*{T z)IQQ-rtQw1YRB#)S8xzmuyG0Wz4y1l6tUnM-D=V+*B%COXzv}B~Cx!WW|mz8$rj?2uQlSw^D zyOMWE5PPN3qz*JL2@!>E-0=Q>uK#tcl$i;oqGfkrVX$TCrch6~g+0&Qc+|3^P^;_K zEN5z)cfyDWigW>KcjpJ_WG>e`jP?dXixagDTAT#h?Q)W`djy+puY9wtm7SN=^AVUtf)RadelXp}xrZ10&L?P5 z2tO2o!6H79lOd{@gVv*nZ`rZ++^GF%j>OzEiLhOle5OERFMpoR9Zs)Ae@yiUuVe%a z2y+9?QFjPnyrWvUw>Rh-1~(@8=*H&qCmexV3qqeyC8| zzVD{_i-r5VxxP&2&_)XPJ`b{QCQo9pEFu$xNdQHDhKV<8hKoOD=}8~7C(S~`e1f47 zw96ve$wh@)APWv!M6`TTbgJ25_!dL}$e#@^I7V326Y&M`57>0>Zkdrn?7wYVM}`jX zD!NtVm*g~PtP8fxfJ1|p!(iR_A3R#7!Jv}0vMrhmujrBIEp+jc=YpOSuOqrr>O3K; ztYz0F$87R#`;Ad`v*|ntsy-b~ZLh9|5OJi0|C3~}iDG)H^`b|~Ol?nAM=j2w^M~Bi zmb$c;^jqyErZcNOPHq>z`pOGw?HUjSCt}{0mWm`K(tydb|Ko%NGdYS%UW{*#!@wJH znt2E;W?UcX1K~Wl8~3hm1Z_CoME;L^A4+eb%OsXYBTu&T2ttrZ|9++KU=!F6S6YWo zf$cf;t-H_aNrX+aU44}VNz^n%i*2lRvmgpEU;h?9x5foWB=VwvM#_aIwfGjZk9=kB zw%TMOFEY~r^Dbnc^=n2alU#CB8qsWL7M#8rJoEJ&TH2L_NM;X^g(<`O9f^8~%TZ%^ z<-@@t5y9(K;ZJ%>sicV1N+LcY=1(5l0YVLhV4gMFL=+WXS>(xqqn#q-9E4%#5fOEs z3}$!UfO3u>Hso`swP{8|U7nh;O6KFNEA;3OYPqRGei<6!~jhH8dmJq$KW`OLcr@ZKt=yFT%wcmL2)DjOZU zAN^W_B<-cUO-cDAYx?g#38FnlherB;-I)>ms#OMfphDtRX0l2@MNI8$9~ZLtizyg< z6q1KoQ2ipJW27SOL#H8(bgM;C&z5`Wg7U=O<6#+YYWY80ktotFFlrB~HNt3?J<4kO zA$h4~5uxo>hGsUe_LYfGHyyD&Px?U&q^Gz`PrC*QH5Vagd~#ud;T0#oZ%5dk*A3$q zosdSvT#-QIjar+fnc>rq!4=c&fgeh(TgLd4~&R&O7=1TIW{eAEvR(rx0ycJeQmVII0fDMP9< zcxs1>OF(9qE&ns0Wsn*%Op1W3e^}h-+iwN5;)w>UL)_(wH?o<|O-}kx=tp5J_ac9vZC0Xsm z9~I7VE5#-r$9YX_E&}1=IW57Z$l{0>a~?s6Ot}T7tZ$A*oiQu?@@3)hV)O81cy`Nh z0TM;j+wul%@Z3gl&9a=2vb__qXy?fu_%bUvhDaH9Z8t=ixFN#i=UaXdCeitbFhTsq z|43s;=i<8Il9*kOrR`J&^KTw^0Q~W`LK5DA*>STwk#imb?VT-P02hfikNP$2hWU{y zp7}H0`LCRs9}#t!@Jq~n_9v)fa=UJJCrPUeNoBRCe2iu!zuW{$SoF|`@xHjEsodgs z_11%_Xitbgzcu|~#u`I=jLU&E+q69$w~W!@MoVRs<(IQti@Zmt?Lo2fUe?N3UYg%F z=r2$~=iR$_tV3$R8RP4`9M0 znZJfd8rTo9ouYITMQgh_sa|`ePr$PzYih4(3o6q-lFH_u8VI&hPc&}<1*>f z9R<=drE+VCSi>ohG}lFWrg=Lgq%yP6BhfOQZIIXSv!M!T9Zp%3FMgg-wND z?_xt`62jYzz(-O>@Uo-^pI!q1J8*A>mbzkQGK98xeDqUiR zR%(1So6A0xL=E$qkv2AV%Y7f}6E0VFmIsBLgu(7A?ZsX!6mk4FzFpu9@cEgeS3>++ zD>qA`D}|RRU<;8u8O||(8i8}4yaKln1-J%o!B=jg-7krY{G%wun?doo)A+{(!Dqky zb7#OIj>paJ+^LHHK=2F;4ka_@-(5RA7?QLX9FDik}#4B`>orx3QjU(_qP$Ns|*#+-3v+YDRp7jR7`#AQ)BYWU^UwNGJPbQw`F z$d`C0TlB|mZ%9t@qPE|?+WOF9upw2Fe6huLerhnK>A@wlk=ElV2S1*I2?!gFKL_8a zRrLjNNYKSYXyuo33~FgN9+~rKW?P5o7J1qgo}YeHY9he|lcDD4;x)6=xHPlA2FUbCqj`%mGhSMjs?wLuj;Y z-|vWVUYt7{b<8RFW|I>Ki@wGS`#4>W}Yw)enKE@pu7ApOT5yT7Y!DCprm(z;RO3FTp%0 zIg-xIkRs(vUmh-O@y`L`I>gK@kZIBqlSU+jOt{*o7BZBDI}=#-`pPVb?Y|q)z(y% zEK9?#fLC4L-dsuRniy`;wx1rl+2}`x#UJB=0*8#I9T+}t#$!t+9-izOK=AB}cOra? zM2*J`?pwzdmi?6;nNi963LJz{nkK;9m5-m@U&VYeDem>^$W%OutUJ?t6FHP(gFDI# zbBTGBW5LsB!rRWNRdRO+3*ON2Sld0@kG{GB%=RT&_vGNt>TqEeWVSRhDo*ScTIR7p zLcJ1kIWaZYPmY(b`8298U3_(6@Ao%X%2+~gXA0CF8&?P>P>IPf>)?3g%P6kSELnSc zdgzD#&zdI}c}_CVPPe$68~FA{Tn+6wJ4S@3AM3h><4UPdV%c#git}wPFdj5M6Qb|3o~+I zDP$N@D_GvqDz0IIkKl*U6zI}pdd^}BD;D?4xibAc;fSMl>`zoFsk);zH@tvH5MLS9 z_385pEd$P@3S!QMa*YPd9m2Wuik{y{D3a~eVRnV*HN-3?O&NQ=C=Zy2S10amN-p)? z{qlx@PQjMmy0}nH;_4)u-Y=)6{Pw*5NHSXFK|&+ORBKo$?l5J`5p6DF(rIm)H~Zq_ zL%xpt%X>biD#fc_tWVNT3Qr78yg@k`l*?7R;$42aU>Khkuypt&LGj zxt4fv7P$LtRk(17Q>zc&89Lsg{f?+tcP=mU#AK3FrhEe<@gd=lUBvBzYT#vjk z8p9P27ojm+zwoX9Ao{8i(RbbQnAP)w3f3C~r`AN@3p{#36Ruk#7fX_Li=G>!6BEln zMoDP*hktpk$T~YwE3et})hfegIP$=h>xJ{XK&w1Jq+`lx`2IN%>HBpH-5XxynOhxB z3le~WqsqaOeR7%84`{Qm3=x!T*SUX8j=M*ia@ zNrFl~45G>+mOm*1_^s3zKzHvy=}9X0xG^ooLM%nLfB+-IuHo5|3x1>yuf?EG8Yrv% z!HV2MQ5-BFx7?d!%N4PLzcsc)UN8?3j%dm0gofkB6^wNoV7VCne{!yMX>mSq-)Z6m zA$AyGcuZD~)%u?Fi%L=RPHDr>Pd(!J+9>hU*_0$_kh$VsyEq@jg)a##LCI3gg(oK( zj#3DQ@Mt!)=sFH952RFAz#MX?p<$&n@v>n@4H?hU#HY$eim9omn}hVD=sw*9 z=2)cT*x4@Qx1exwF9z_uIR9uL7%2)`c~0|b#ojd4-jv*<`%eYOJ_Na+M)3bwdk=7` z`}Yq#99iKYQN$rznPrnzwp2vftL%FO(|g?a>wdjn_x%ZLQcpPgMD{BFK`Jp8!B-f_4ro{Wx*r@$Q|#SLoKg%XaQp**9Cb9S$@#&|veFd_~ry>)WiV7OM{ z`d*Q%?`2fJ4TkM3m3;6zwt`}3m8!{f%;?|G_PqTC_JSn{{2x#(6I*@zvtWOJVSXxb z-G#7fYGZcpgSW zhD1Tr1W1}bA_>DBp!&vaEPu4GQn+nix!@sV>?7fO%H*C|K4rd!6q`m*s;u>BJudYD z5}M)!O-+*RLGtY@u{}R8feut4Js??pxr-i{(lca*cg-=Du8Cf$2$0hTLg*(E70}a@ekzBcVk<7VCZrpan#J9k@BNC6;{I zBW1|B#3gA466PdTSK^s=0-1ayHyl!7|8Pl#e-C`{<&4TZ3!3!r3ySr`F=-VxH(V#- zgjLG#z{OG;Xy^;57Br2csL=-d7id78;0D^S&6TF^z?K94>;e739o4(ECDXQOeRlO6QE zesV7WuQN+~XiByWmD)cB3>)3DUQE+sROeqKhTtCJZav=f8CwNffP;uvKR0R+JVrVVs)Y4Ai=L2vL$madvsd1&3?P@`S?*5E$9G}hGN%vO6>#9F=H zK7tY3b@#*y)aHDx0aM9WCK^L1aKOPl}2uPd%~uj z%eipO@g!+i_x+QCfFV{gW!82AWFZFfi+RxtJO{E=HgLC}cPZ?q2{ugx!FVkjNd2c} zlpp+sU?l$)!6eGVFR+^J&r=Y_!K238D&1#|-W0oiI+s^S%$`hls*j<-2brpuH0FvFGDMbJ}^bXSrIPn*EWgG^+j>=%q6K5(JRpx zm@n&ph0yUBcDUnmlIT=E`Rlu!8V4M&ky5freC4KMmcU@ibWgz>p9J#PZ-SP2Yh|h{ z$AOy70iJRjKY*$3yv=sqsM_nSp@4D<+H?0Zzkr03C>@N1$;Nw77LV0z<7IzcgfqVr@2`S+w`{%u*_perQwyhO=Iwg?_ie|$BG#!;b9DgzEw!wFm<`FgV;0Eb{77cWzQyn0 z6Cr|qX6W%vt=KOEJFhm1xA_IK-94$N?T<|J7v3u@N^hl1$o-`BwdusXXwHbgUN!&Zkzu#u898w3!rtDEB zhHG?TO2%a(3}Up2_c6GF`N0RMS!8ZQnQUWh2!ZahTh_8$A2sLoJ;aLpjRDu5q&?}s zHFM~_*dpY{$JU(*9Uj;o+-x*MZ?(5;vasb1k$CN+v@c4Nd+rJ>o?*@47UHxKX@)PZ4vuxz^-vNwwAN+n!OrTyk?Yf?rJ@{Ox9=E|^RicjU z85(c4_U)qXos#cYenO6N^q$2@)W6XU@`N-fOn;DcjJgiNLt+%QNr;-!*kheG#~Ln% zH1<;wZ2&k%#U5wQYY9j)&OrLSBVa65*Rln9U?N`MpLiiGxS9J*>Tz-#c%*zDJ=6EiYY2H0$ET-W=JYNbe+1uyc_04522#nn zXHLe}_xBwXX|SvGSmWZABLlk`T`3Jn|$+3vdh zzjHLziFAXUng1+I_K+!~CER9i1BOu{n*b9}?DLxpK6~w#MjQH`UO8i33l)II&+Q+w zOr2V3R_%9eLqyOH^5x4CmcMIxGPL9gr;)*F+MfF-uZC-A-Z~2w{*cVvVw3(c3R*VpRKM%`p71blJ)^p@IIiQxwT!j&~1G zjHE=+^G_XOa$$eQYd4U8Oe0a?4XplI$o^51*S^lM!B2NF{s7ndsJKWx|KU6Ci|>sw zkItQHjXrD*<#&fYS_LxAOLy5BGwyuFdp&ZSno!c1y)cDHda=qQub9&0h?gw4>g{^H zD3952_vUM-qXD?9L8TgR*_9%#e@M*1#*jqWQX;@@{4@uaufO$oJJ%BZ#bt|0$l?4^{``|ne#2&@Jk?d)AC$*L8JbcP&A2v zij*_`orbZaz(2QCH(X-EKSL^>yc+0ZDfZj+2&dzYwsZn2x0IfM?I21ME%IqR{g#}| z#NZl0RYMEjOx!o!EFA^@{0@j9KuoBN4rN3@Mr-Sc=Z_y4b=iA1hH0Q6N57yWl+~Xn zUFB9;N)TPcy>?r2BKbWTuI=aP11l`LEB9!WYd&c#VZc{AvAZ#NMs!SNdsrJ>i_#01w`1{ogy7CKk5_*wd5JI~c?Pp1Zh@*KObw+hUH~Iif;!SWu#$_OfA4;^+TDut@3 z#UPZjSKgq}S4e`ciUs{7nYIL#_(G zgwHVCG%rdKabz_0as&djUG8N=;MkArfs<LOGux?-UlJV4fIpT9U? z$WZ0>$s#-*(}Kj3kxF-s(ZVvo!bmj1%lQo@eE}0|9Mn>WhO0rMOVH`ukJd7$K6Sv< z!o;x5AqL>X#l|Dz)k5zpT&EpEPTS~1*{R`nIRa>7H7L9uDTmYkl#Daisz>sl=;4VW=>i7Ksv}Nqd+W=Y3b#*p&XK0^?@xOMByXk50(t)s z)HmE{9Z5>;b)nC2dGaexMVfPK2jA4K_5FrVc;rBm$RSS1m3yViW8R^4q|p32#E6En z!-w`CHPE5u);r}rJfps?9J5_O1(~BRm^G>f$&Jl(w4?JfXyrw zFe-oPa>A7sO3qT$Ee|IHZ5P>*z2m&)4GI#afaHf409D4oKG+X8bWu1t_R=7t2Vjmv z=L-yUK!x%dW7sW6b|ZUwgH{}m@j zkKm@d?%6+QKDoV-j<)AcsPTF{ zrQ`Pa{8~*8`ZIYR18f-i?k{sDRfaH>BY-F^Loero8XQ66$0FgOMx5X4TF~qYFTxkU zv0(s?WH{c1?QVzrpX*4%X7D_Mp4jPv39%Oxy_%5JuH170CabT?^Qv_fFw3eSjXJn0 zJMBpU$=v+RRAsY&rR0<1>UimZ_JUAheg6icHO-!6C}Jq`twtBP-P z7)>8AtSVBgGrdZi#F15Vy#v?Q=H7NNjhjRzL00nq{wXuhRGDArL13JK@ulJ`Jqvo* zri9V;iENHTC1=a(1@qzsO;fj+(Hpxoa7V(%s{GbCbCV&V_|^AuaPfI!$2IbRG4+wg zJpH2z?ZlaVY&!@}^%P`X)xTzi+}Jvzx3{AbYhAGP2;IILkKj3pvVpcSV{A#?189P<6~(jKv4lQ zFY1-Rt&)3kewCvqKA)NBx;NlLm19(~5@4GkU~HFn-8isdVY4}`*5DOFkTExGMM1O5 z8CXi*4T1M+@`WUs*==Jz6+4(RTlYz1QO>lFTKRHj^`AHIE=&NJ-+(3!xYk?`VssG!BlbkEfv*Gbz3keXt3 z)`*(K>6~RXii~#SuGr9K4N$$s*s(?%*6A?<5vw*czfZl7)ab&Q#GT|@sWKY~m-(Z| z>fxlPoGZtgPwFmPQ~Fm#j~&AumiDj-n4~r>)Jhh4K1`4twR<~%y=MzjToP80J1!xJ zFh}Rov3~X6xfxAII#L(#ftD^ynfX-2{uoyOjfO?r&-iP%H-KzONbmX>iBQqeC$h6Z z+dOJeIO?2mg_$W|6TRs++uxOWXt~DzV@uRyxGLws$b8>rMvBB45X;Pq$hkXe6X$%MKk)|cLwq}Y{Y2QQgd;@Sll)A8h5H0t8<_JW({G4;kP1msc zD~*0s9|k^FErR&{R*w>@_tM%$`@zD8pqg^4e}F>uC2hc`G+^k17R&H0Fra-B+k+yg7;T@oO2my+v^p-V9{24t4 zYJT-(yTfiULhBGd+`v(ZCqKLTL4f~4E@CNZ1Mc5gxQWt8rrHz;x%aY`>C+M)TMyJS`ZTeO$fs}b8$`;%mE|rK{-<-VfDp@3xxc1Pq zs|A`;wtXD4o#*%dBSPMm*Cl)i^iteF3~ZQ*Z2wMW`|GWpB^yos3G7CJvZ%+L0nTTC zQvl(Ha|eL-zV8HW5FhO56rtxqg=*GEIm`mr zlsu13YOb9FK%xe9Q%P|j=ZB|PZbgC?i*RXZnNtUp$2Z3i^|d)DOH^^slwJ|~=2+2i5j|syX&N!|*RPO!*{iPn3TP z^G<*aN`{cwP%V}F`&>Ja1`m-`Le9|$r8*ob9-ks0<-h9CpL?;t%UFCFT;^@J*_2p5 z1u>-nm~xKgGIQ)nk-p;7B!PZDdczGURU%>C!AR#%eVpE4HjDd0IVF2AlEMna4xjb> zmBhIqXO@S$bpD)J5Fk44Kzh|Wd$d;G`?nY1GS4wCd&-N1faqzqzGv|*dEObQLo*dW zFp${YNYp``PE{hE)rL``5-#4}YVL1fSV3ctMJTL%J6L$qUmFx#seJ>Ah2ui5fr4Q` z)`7j#S&;vlTvi%B3?NY%C@xZej0mW9x7;s5@rBYrBzl8)6|Su=?i!%9Lu{EVTIr+Q zhImP~EernZ3waqmXM2SSd=p7L^FZ4*+$2wX3>E^FRvrK8X31dp=kKZe5B*5xp!=1W zNdZmny!;Pn^5F`ONs>)BJZagKpf@<<1dckM~?jA+t$A4y?rUQOz~fNaDw zG-JQ~Ld82Vxe&AG8B;mmsb~mb6bqrU0^$z}1AEl|(pcpgX#%mVKXq|F5q{slk{vmO z=i7+~tPlYjuXagV?xbCiYB2j*I>McBI)L4*0be2|nhO6-lAm-Os_4g#2qo}!rZ?IJ zRUBg*MRbv*CCI=UV&T^6$y@cnOd3EwdGg{nIjC~v`P^}ux~$B**0)$>tzJG*5N4{k zOnL|5&GyH&2YfTNYm5him2MovLGJAY6Z|9mPq5oO0yJ*kd4q1(RD?6*LX)q%1SQ`e z9wPkFIqNiQ>9Y$G{#t>*IG2}fke+68>G=_{fWQ>wfk}SJwOtPv4ue6@QBURq3*_k*A zisS94S9&^tDl%Se6)XYZF{H;Tc7ZNSFDK!sX|0iWjFWk{C#7-#e6_xZ0T_`2MFDPb zt(PK6SMJ*c-Bl7RF?fHR1Y4Aa*H-N&OF^nr1H+TN%O7N@po$p;Mw3mXP91zeg1&P* zu=LNT|M6l8jTo~IBbg5~h15n<1;ST;`G(Nf$xvUEB)NK(COB~vdH}#V;0Of$^aJ?v zw!$?NSjXPw&yMdZ^$?yY>jx-lsA#3~QZ*W?GT7(_9w zQ?CFPZBiY~{=P^SbIb=0sRPt`hv6bz@}6KPh}1$}M7=c{D>-iWnx{c#K5bW0uDaasZtMpsE)j69LALOjITPI}hSK{-ZXrta zMP6`Tqp`i-l`A{iT9qdb` zyba$zzsWJ7I+#$AaP%TOpc}nzzxqIeKA^S=C&oJ;#ex~f4f|x*bC(!5XNiGLccP{x zr6RvM+GgLXk+iJWbgq*8EZTGUw2xbkbS>_Gs6yAf58oR z|Anb#_wAiCgV{?*+7jw=;MgS&V37vS1%Rw+1zQ9fiLXBYQ{eExr4&}w1AzDufU4+~ z3;9MD`}2*N9?yf{>k%N%XcuMABd-Za1oe~?rF-%WpK*XcQ@uf5`7i?an&HA!X0oQk zP@4u40Iujs<|0ABO^oT&i*F`0warHDX(_JhDV0wmw3$`cT|LS9T@Cu6ld6O%t=CZ$ z)JW_=W0Xt))-9YXQ5kSbM|eS^nRa zEa68>x{u)12U4`+W!NC05bXXxA$|bfyGiscS+D`g(&fL7JFuQC1itzr;K=0(neI$H z^SM8de}7--`@6*!f4-MCj0~loC~(YcJL=cjLc1bf5Z8eO(O(&Xl!&llO(*&Zi-f=r z(0CBb%zgdKK#mcb#|Qv<%ms9hXB?}=(Uhtta8@GXLG+5U{t*c^aIC1_^M@>tl&3Za zYY|WH{V)QV}nr8QZ#~4WHP+VAkz>1AjXY@8sXSl z0a}q!t?%3Kgu>3_&A0sOh7K@mQNrOtsL)5SO_xsBf~yHB0WP`t#O(Lk_`W*ZU%OhV zP4@+%A4Ujj$mhO5yNuz|DXD(CX_4ko7{^mmx_Iy!A@)%7x6#MLm^Fy?Mc1bqLd*gV zTeufeL8e~Xa<}=;#0KV|{!ND8w1z6iiwrefgCFI5-tnu5`t>(xAPdePNp655Gp&LK zrt0PQWvN%|SH?Obzi|CYy?=YLbOQqJd#u%g-JO7g9`xxU9;UOj&S;(h^l$qnJKhwJ zdD#II`@~vdX%MY4x@7|MZVhFU@Y8XT^^!0=9m#9(wvuQ`} ziaGK@0=|$TCh7YFoMp@M$fXGq^l5$I6xB7_0B;9B6nK48b zl5-VpxG&C-sSZ?uPoYbS|H$A&zf>9TT)zm}K+zX!4^9TRNiZ$nRem4lN6p5wM$=sc zc22`-ZMW@9M_XF$m!Qi%0eH4c)5^_Th15%)1l<(Xnc{Y@RhRrfUX_2~1{ra3R%iWL z6S&~4zzlF9W#;B3R{vu`Oxf0a^yKg`H$OdJvh zI&xZvenrSeh_teCMALTw74i(AEJ6W^Z2mA4td;PFM%B{UZ3va^IR&+!ZA`%ysxsbs ztH41T6b6k)D-xDl8_Rw9#?p>tX#e^YE-At~@^aT{ZEL%*2~5KIkoLEGgYuxGwQ1Ug z&A;*br|fzLN6_(#az?Pv4~jeCHIsxIXuCFOuhy(4KvYfQo|d8T|^o2a1O>0RXyZvW$wI2bh!LLw2iACmD@#%zG&y%Y9aK+;9_F(}fK_OS;aZN0_H zP`>t1JB3F_Pafz(EASD^rLb~MZI=(57kuno0sry$=6w!8<8z{U6vL)CG_R02>S zkV>!r1fBsq(0oYo!7LY0H5_34Ds>-f`oJ+byuDXB2~O7+amvje~^mxr|Tow-r znFWHzr6EZX`?L#+IpW4+rbO&_U@V0G+r#V}VdwCuW?3MU5emDC_VJ91k_15_L%E71 zrOXDkc_JUX#4&@ydKX{UBlvJUwUZ@QOg)Y#=2c%>%{ws293|+33fqr`qVXuH4x|w} zZtd3*M>L6)0$+l1uRl(!Cnxbn-fbEByUJ6!@v*wyT3B`|>}a4oGr0mA%B^hZs*u1xQZqz9xaE6JUH=tW|?jl|q zLhEa7npq^@nxbX;NTM%kn=tuPH>3Wb#4^Y?Cee;X4u3BSt1seNyu3P7cE{Dqsv)IvR+2v92$}6<9n*mPllj>98MOJ_r4P z1588Fp@B`2*;9Kd54BZ$e_@^ukG>%lL);=#q592`f;ni^Dg7o8mZ}dGL(+`IB!?d? z!^z+TenT$tii;a=rip|6CgWF7E)!hi3~9n*(*ic<#oJS5t70?m2%5^}9ihOtV>s@C z0+Mdz5e3w~6!Mj??PM6fuP+Kha`u0uNt)%hXbIS-tXpu7n3VDdS-H$uq8SaB zzU(v0`l8Of9Mfh-bj_RGi?2#8y zV+Ts9N8Cd#Cq=ZCLek`!8D`_#bc*2;&f|=)kRF5sq6NVkF(lV1$VM{fJ_mkL1Jydd zv~iU*S_+F>76Em{Dx8=_AGFp^7km&;M^3%T(X(m6xh6H2l2?E&LHxtghp2opcXh&f znK=t>Q4GQpp0wCv+@K;oT1;Wj)UBM06V>P=3gu(3$65guh`xGqse>hD88A+*ebud?HNN;WOp;L;@w6nBqlJbE)dlZ_1h93PEZCYXzGZ_tj{q&oV zfb*rdB^Xjp2ACjj%cD5}s*AyqdE_RTEj7SAY5n>2ld>0uYhI)$0WrFO)mPGEF6mrw zrutXJ#0e)g%F^L|^+m9@S{sHYQjRj8fMQSZyi_;wLq)iXs4rByMI3TQ_%WT9m?E; z!H=9QKzBQfuO9j8*>|AvRG9vKuW_>BDUX1wgIr4w35?pop3eH1ySbfjEPj}6v~2S6 z?e6&vhd&dnYCEx2#Ikgr86L!qPWGys}R z&C4!jI73Rjns3xDxf=IQE3F`m3fNd-@@mW@n-8@$0B}@z(URUPk9@yPCK8S{0XwXi7@t@I z2>d`m^$j-VMwZZzFTetC4VS^=9c#sc)!~<8aC;NsW5ZMV&|3Ot0cwqBpRe=x!KLIy zlAPWLu&y{5dydMT0RO;n(Oh>$8yV(ugD>0~2Qs3u4w7|&*Ea@^ zkaf!Cp*T*anF_4h9qvxK0$`1lmCzJn;6o^AYkBh4q&01 zn|5F;)75Ho!=FItp&FIM2}l&ni>++)Ojnrzg_nK9uP>?kp8rZ;v$>f zFW>k{7Tl>M>5(r0v|225j8(or;N`_kotDEcrL3t&t!Z2|jY)I1<{PBL1Kmu21{AaR^Y z9l4N8AG0Sd3VZ-e#_1RrCSi+Uc~vX&a`n}Pcf*4%6SbE;Y4J!% z4;kjURFdT|T&DGwGM@&Th1~A-Ev|X6QmVOinXqL14iS&g?*#XQu z!bug2;AUTu-+&s5%JEXzC?@}SUQ-|e(Ic?2CotWPMH<)Yd0%jJ)U(`3PZWSoZzq0s z1=DI4sP}D`v4^lWqLS2-G^z4gZ%Xa;CvQK!+*Lf{QZdzCIUhdUft2I-f_`@N5DljELhV=JdJKeX)BY~_LTNM zf`h?U9s~+(pG747PfdU$H>BQKje$wbp^%wIi@;OxJk#74FgdA19X7B2bMZUa=W_=_ z+Dj=HRVvqW!j!eUZA(J1G=$>Z)5qU4jRul5fI@hv-sefIYQoXvHQ8bPvkzjO-`@CB z$x9QCVFg>IFTMEP0`m{d_D|dnpTa>Sq28#0E647+S;EU}2JnzX3t{bqh*8I}^~;>2 zW>4K`FIW!%&B&Ny?t8FDja8a}dgRvV;N+Ql9E!S62|L!zYYnj@K{`}mG#bTyP)~x! zDQU{W#jVH(bJ#u!Y&Db2Y+MpxraRLp2*~b57_-MJjH4%6ojgoh2)Xv>A zX7Yg0A|I?ycA?j?7SKXY7%Cu+TP>dbsQi+oVQ+9qWg(s7r|&6<)N!Rdw`;h@$Fnm= zlOd~JTa&Pex%()csh)pWB+#K;K&V5zOiWTYjwD5M!JdSQ`DH$(NfVZ!srEuh!FYC< z5xOF&d>f`(5GJze4bJP~9kGF~bZDu&&6mMz83S50?|EpG`QTzNN^GEr2RD|5inYR5 z5*4oVqwb~7A5SCpkaWDkd3>H!%s9}GlQ7KXa^Fy;kDR57&Zf|ezS8+mo&Zyb*Kgf;LpRlqgE{pko{G5^7^?)0> zznJ%5wDW)eTQL@{^}`CM+`GHS;V7Z7o*D6a7SunT;0%r8k0SZNcGP*C<)ONj%aeMd zQQ)x1HngA8U93NWVD$XYL7UXgtXNB2)vbGoK`+-X7`b{xZo_ZyuU*BG4ihl*hm2%)|VV1$d#J|JynmZepmt$DGSOBwZHCzR`!q@qiL>36VDP-nM<5;Cpg;&#gB1~ z_*f(|&A_>*ez|?(MdoLRA!>=M*oB$2T|#=^JuDb=V1*O29Ym4T{k)^Q;$?RV#fdS$ zN(ff@o!2e7@S=L=+%KbMEWa~71kI!6$Hz)Dk3TycCI(6P6w@UxuIa*j{oh`I|DLq} zd?SXS4l&Cz$a(Bi#JE-s3>SGW^iA+ytzN#7hbGk)@G^MYO{4lu(F-jH{@)?u;ExFR zNmN_!!5$`m00spZ;v~kxxl@IxC_ML<-^gn0KGy6c_hqUp7HBBmdz2tK*K05UYNsi` z`osbn>HG2w#jD2R2iO?z37IR#*&`O>w@C<3Q?D_uXQ!KIm4?b$n5pkTFbj65keKtpCW>FDxiEClHB0qJ68MU>Y-RVpHOZE zDXxq^h-8gzVoA>^gaB$-q~-K%bO_1V*`AN2(lMtV*x9|xh??x1Xg>U6!V0kMLA6AI zlpgD*7$WNC9E+wKl;`q|BpnxkiJ?IGWCu!jfZfeV@3zn5~qtN=}#@ENb(1F_dx6tVn=MqXg#U1$-dX42#_UFMu`Utz7Gw8C z97bqx!368nHD)2Qi)?Ym&{JA0I8_Fm;y^X~on)hZDXFix{IOZVK7Z3|HV|fG%f6ZX zzbb=&3&M>^)E%o>!2jw}li$aNrbAr-AVe>-&(S5)%c}xLSMYeLN&;=*pO@B7*2)pQ zWUq6t+k^e)4D;sL2)g2g7jEOnoqi}()vH7 z!#{%pmJ?c>)^kpCr?5FGL$He|s6E;Y;iM(zx)R>!&~4Oq&q1g*p{T z)}mvtGb_I@QL>b6yb?P^F$O4k;$a>){w9L5OZdq?M{uY&tWvvU;s zoBJwfzs?WqFZriO0NU4pYCO#-NCVTa*y@YS!MMUH?mFL_9(p0kk~YwMU)TZ$b^a9e zC=ri~aGSdvXdF_izvALo?8+#OFrYTmVw%*8RELhM)^|JByK7F1SX-=tj!E8}SGlBr zn<-|1Ln1^e-brvc91UgwE-?PM+?=gjL(hKd_U5L#0g(6aElozO(tjK{D5OCUXW13= zuTsR{_UErp)l&lbIP%iMa2M>5iV!|LS{O8H4#ZIckMjB+f2$EFhl_#@kj_{iPEBg5 zXEwcx&~rb&&geup7=CnQ%5|89`o%}KtK!tl1<*0in_oYO7DAX~$AdphL*Cp2D_)t0$!HItfE?aYih zM2DBomiNQ%TTvuUf)+4@WpQDC4YjVvev5y$4eTs^M35?5~aR2ZPoXtH_$$ z&?`G&Z$?`(CKG}=L!aTA4TLXYqM#sQv>zh3h`a%vBKJocdHEuooipB)gc*njtzf_$ zTVr-vDO@-&Q|f z^j9VfQ$Q)6HFKZtKHPA99eu$V3^=`ZqvpP(XcPZ$)++NU$Ab*)C)#20%U!;9`<+@InscVV8tDl$$q*v**Zt7}$_cP~ zcM!K7Jc?%~d4tHZD_K-!Rv!8+J*rdv)-Fo=eJ?3Ks7wSQyGUbfz#VR5;)xm51-L)O z5;?mgx6CI`;L`_NO@h@pY-ycfXwL;O{69EK(0H8mbv0@1b^7kh@uTe%pDkUUAolCP zP`)j9hnsjhs!M2}Yzt`rLi!z#)q;qF^n#TRu*!Iu-DFV|sV;aj4il4KoA{Lbfy#r> zZyn6FQb`S~d@wh(1Fx-|T^ar{GWbX$Um+D-)|)Qv6CPnL*!rgHE%0XK9W88WhsRDx zK`U2XN7H5p09rq}Of5xCZYl$R`kwATg+watgZhs1c+LOF3jbS$kqW!iAsVOoyB@)D zqtyxdC2Z>-K7<%~i7hMw!*XcheNB~VK23JD*B)PZYaOS)teSfScm}Fj5v=c%!Oz=+ zDMSN8Aul4rKT?lZU&8u2xK6{?A%8V>Y*fN54=QTQVULp#>u#{-d+%l584{5PYyS` zNzv#4M>&a1Z{oc=q0Oa|3eExz@am;Uy3V|0GsInl843TTm;{}K#C7kyqoEyE~%^PWL0e8Tev08&23qn+5 z=?R4V0u$S#waRuq(iDs@B;%U-I8Ao>Oi6a?p!H(#P4KnexYq~a+0HQW-T-DuQ5EKi zRPuOh3AorG<99TGNj4ft|NMYX_~AU5hlrycvV|lyk6kQQ#tf~V7#&K662{RJN=fGK zQMU~8a{Y$q5r4UZ4k6~QD0hqaKRf+DUW};#m%L=?+WpH&hS^I)N{o90kd2s%9UImw z*_M@nvPg%*gP-;Fng!WYD9B*x&SwNMqS9{5hpKUmhIGaZe1YU+mJ5z1@?i7Yy;Cx- zQ<~PE<%aZpx@}^mYN}U;zdhWGeuP-r6Da7J-;A6FdyF*z`VJ>#z61;asMPvqx_QFB z--b1}K<8l)SP;9XN3^By275raN-y~&e(IKu=R_M#I}G0_9tH{TG1TB^^UZzZmpbML zx64959$IsosGmhpR>#-DkAt%&%@8?D6w^WV??9>?X5fj$+-7t>!8gbGbBW6dP6y-0 zgop{?sbawRX&Bi-g~Wi;MgN>3WY-My&>eeC*{i>N?_F(uZR@uFbKsWqM7tc5jD|F$ zFFPG3e%C))BCC8G(6hdnxTGd@sCM%-KV=F4Kliyusx;Q{Y^Rb>S5c(I4fp^5+Zqqt z8{n`ez}HR_drx^{649%mug!_2m!6A(InsM;!x@=9=0;iY!k+fx1ELW;Mv5XM@FNw= z#sy+!Rj8epa*Se07hnyLF%!dEHUrSQei5u3j)s|(7&O?~Z|UY;dUKW`)-{{~4-;H4 z;QxPEe1Me6SzGxE6dy`3FC*=+1#~wL`HhzekY2>toJGjHcq(Bog2>_JAGXxEcgT}D zIEnG^K@xbZ8CBYJ=o$@L=S{w`VRFaB&)5V5-x%X7(epFFArek0D_3E{lkoxOz!ZUWglK{C<1yKdid+E zE8zvrY4;@upUx=K9GA@9gx=;fw>p@ulm2BWQL=JA-8Diab2gBOp%geW^#YTcl6>ph{SmSh!nhO-2Iep%Ax@&vU1JSC0gV%VrO>$5usX9( z!U{@0HA$2*7nB5v@MMF=SXzwOL1a*q5tcFNmCl4vIF}4>+bLSoUR{fOz`6lXY8;pB zzcEIVHyd^HVO|F46>*?t^H=SRGJ@)^`Z6sm2!fIkoBhbZ6R7KlR($E#W@zuCPGa{F zDpd(pOah!g3r)a>If=XJ@u#E+mcig~%sDeQkj?;{knvi6?srAz{qProwOjt=9xiGR z_PUNsq13GTBc0d~m^fHMx4(BN1I#`_>zDKp(h?d0va4^bw#qGWYx=xsmvposy>hCW zb+_*Z5TRlyLX|wdko(6L_#YADuMc9X5gVY%Y}eagz_VG1uz{x#0z^VJP&mtPZOgv~kC3f}hUF8Fe1k|0}nn^G3HOO@Ifo~pR_eF*wc0Gb7 zbh%r{0h~Dom>xC;R>G1jZ;6_^#D@mEh^t3BM~B?dcY&SO_C7q0mhoD&mw}0EwB<%H zekPf4K@J&`ccLcUA3dFg;+cu8FpoAt1xq72#3g@J8nN&-$vkEva!o2wEZ!N`Z(fdDk8oOl!!O9c8uTeVRdR)r*bEoryy8 z=`ex(!l#xS>$+iqES{sX8q+N|zNEw4%nsU2m}PbBQpr+|Z|sruSl2`2rNH3x+ShMl zAr}6~zLoN)`XbbTWb=<%T>m38af~8DnzmZePHzq%MHCy(jMm@>%Cj2#Ilwy>Gf8XySSdw>F~Yk+|IaJpt)XGKC9Ov%~!0w5gy8P zh4I}6_9{+@Tro$mc0-Y0$K_nzyHsJx#Es5RGrj3|0CHO=V{cVLPLJi?c#{FD+zL$p z;&-h-VGCNK|KzQiYTyldO>3(~2H=RqJK1@3OFA__*w!R0pbwMQje(}q3a@30I1MoF z(Z6_mQ{F!^oji7fqT3sbJ4f8@Lwbfiw7n<~umdtkM=--`vVK+qF?ag{EmnMYft#9 z-73F$-}!5l=4b>geLl8G`2T?4VPhiUs|l34aJwZM7;GViN`b3a7c9e6ta1+0Y7*P> zku<8U*`YTp!Sgw}k$w}338hU;$^68Y%>$o$7G7zvDgnRvg!OIBqMb`wgAJA`f{r`- z4AF-w&ocnlAJfZ1jjRd+^yGOby-ZN2JE1Yc8VV<5K+VNcyZD@u!B;am6p*@3;)PPx z7=uVw7>*i@+6mMi&xeBSg2AW9Pb1oe9e>R+*yfpRl7;!<@6T!HKt-NVzTn&f*_;#X z{~feoQRIYWUwI@$s)E6seeSbZgSh9ySB5}ZD(RNM3fRMl1i%qjxKmyw6~rE&4-ls^ zL%)mGwc>EbJxL6ZkPrXJ_acU&! z_Q!(XToNkmmAg+4NT`1@_JWX@%7sX5r12BcqsU}}n7(6c!0&m71 z_b7_!C=^080DZYLZ(N=I3e-f?S(4|HX zLup=(B?zI>6g$E0=y_R(mYT zb&bJ~`(8=TKmR~1aUFZ$+coX`pwENJ{lT2+uedw#vAMPAPvG;#!0Zm{mxCd{^_~B* zIWPrM9>U}v`6={nbVM7YSf15?2IfB~)W@CruF4B0Me1^)Z=Y=@IP2g61uCOS56MaO zz$P>`iH&wiRz9G*1YO9gU{GbAB-cF>d%Y8gimMfI-wt8F28u@Ufsd2JzCU;QMCq(Q z+GHP-m?p+UnAoTgd2k1hmS#66Jhu^dVe4awPAql`nWPKXPf}~rRr*c!kvk2`r@5P5 zMKLHJv`cm)hprC*Giz9z4u9z7EA3x%J`MMac)FYq!)yn1$cM>>lzEsye0~aNMq|O0 zvKgiJ$Q3w1XhJlJt452#L6HRCxY+A=uxtW-|*wZojIj~K3@5(eqUpd zNw>)ivu|OvMXO~RjGp!9K|g-dsGrFzA*{%lK~CyEdUsMI$>hxW3{9Hc8a_=2{agb! zFoCZ>X72fpG&L=~Pa_XA2;FyZe82$xQb9G797-t02In*M*q?nrv_9(h{?$Z;&Vwo{ z;zG6N-})^7N3xQGuA;vWBffRN{^NcF;4aPrgyDmV=~WPqZr1Hd0mvq zGjX+O9EaMS=FDsCQVN(2n2y8in#7z7n+HZ~$UmPqj0T`6;eheBL)%D?5h+uev?d{c z7&+3D<4HCOv*|>vStOeFF-z!pcX9Mz&w31ny#K%rRAo)*fFp2erItwihL(?3@`uEcgC$ z+4?@XELEXuZl2%>cHOfW3TAze6HYLXaRO}77uJ^F*miI*!n@i*TY6D6Q6Rn_^IFso z>F(XKI%98y6)nY1X{{TMiaT6qga zBt;%{AdudL&1JLD+bzGSeYu%cpE|%^Ec_^+ZWhMNKyEM%TD1v78TFD_N}k;#8FAz~ zlbY+e2F@jQ;6vgE+)uD^<6XDH!3(Yq8bLfShAL21o<3us9bkW{WXkKxD?Kco3flC5 zDdUMqs3g=rdNP5mz994C`|20_NH{J`DR@jZ;T654;6T{l1ek5Op~obp^cn)0T;AYU zpnKHUGS??@*^?;vZSCIfZ=fuG zcZZGgLNlNY#<(D7^r-3sc%mCfC;H?n&r6+lBqH53V6V)SPnGi0#DF8NKGYD8M@`J zcppR?n|GP`14tp7N5^Dz2YGTOXMB4F2lR!wtbW$ZY~lx^ZLjc6zQP{xhcD{;XQse$ z4ImCeyH9k)Yw#;7MxpCqO4Qkl`D$~qqF1zWmUruV>jDCBO_6->ugxCI8*JksRmg{P zZ7R3DVR^svx)-2n5klwNd_yq38e05bO^H_&BpdnN_C$)MYOZJEnRGSK6vKI_$@?LB z7)8MMPuv5GC&Ag3h@fs)#R(EmrIaRfXkdsba^BnWy5ccXg|$Q-NQ zA$S4@6$dpzW5HcbCsVYk!U$bhU{xnbFL6o=s>le6`#nU`nKIH1RLbg7nVkE5kzU3) z-q@Zb3?J@#vcTHnhpQEaPb{EMYXt_b*=$-kq4&3h)3s)Phh{d5{ZTA(z6LH6Z4bK~ zX+LejExXjf)_fVA@@X7|LqgC0hrKrs$GZF4#&0UgozkGe6itdIB4a2NLP{=NWeAla zgp6fMNm80*CWMfwj43LGC}oNeN|GruqzLc1QS{W^{e7PI{T;{ekLRBbak+f1z1LoQ zt#h60Tq|{^DDM(Yo@t4pcedtodXv%HCo z?WH1nKw{8JTL0|~Mu|!ls8_8s39AsR><^tZd6>{*72rVVg(pq`fhh8G<28vZmTbs9P$#~NtbzvkLLH1TI zJN+b+bW)c>YC7lY^oQ)hFXqgWVA@KzbbOLQ*{r5G{aHlpEy^;!B$Q_0$R>${jjdDW zT#}#9u3a?h{8) zSgpJKhF)O4e}9f&zYCIau1uQDE4Obrrth?Aupkd)L=ewte7pN1M9iL@3i`hvcBoF2icic)e^A3E?;2 zNg|r$>|EO48_YRZG8wv7AdXs_e;M*wJTVOqOvUfBd(kA*$V`v*lXT9$3jozS^6=$? zhsD9o$@AANWpX4=PwaT$CQ}3S|C}!rLqUaTvZG3Ju*M0hHMH8XE}TT(pqgzZH&@wx z$SL@MabeVtS!OGn=L*L_m8Q<7_zoQ+my7dP?=~E)C!Iwod09CLu_Jb0bEK?P7Qp=h zU9|37*D9Gx{`4Uya`*igH986 zVR0C4>RV_%8L1{EXA{8mwP{0}=6Isd?Sqml-G?mYz4Y)QO{}#u6TFbv6O3 zk$#&bHtut4C`oZv3x2b8Du?J6*4okwLcs3Q2Deq*e|O@Lf*sT^39D$Qen3$0hMm!E z!(9znyR_mxY7LG@0HY?D5GS6hE&5r5HTduObdaR*C#+qug!K=F>2==hn|ATyI?fkC z{0BTOvRC?wIR~%(G(2a$ws=l)%ZT?qG1ogW?IV)Ig5GodFNHmop3S9dP^hx>Horl! z9~0LB4fmNV_`T;WHBdge`$O2w*$#90W%+0O9~emN9NwHR+3(ol_<8ZiH$gqwFO7#@ z8tXK+RUhjAR(VHqB$47)7JDRWLEuQu<2GLp8hTEbzi8<>p+7{!t4%+ZN$M|}fBxrf z)L%4l8TRYj8OC0uPRqxhRBAj64M>6?l}0jN$1L@Xo09qA`h!zY`6!lsK2qN_uGiMM zD7X_8%RZiOZz|q$h>D$BgSrRzKz_GHJQ1~s@Qs%ImJJVYc#3<-%{fc5+WYuNB2CZi z)=tF@B|BwrR8;>>t|jJM*;$Io&<)eRIa>KK5B*e|<~njOIo8e>nn+n&=)2yWEpgj` zcvOHpuYg@kxqws{&Gu*&@AH!2q^R-bt(&>n{v2d;m3zJC1qV>Nt06FIx{xu#Fm;X4 z{so)k=yKY5zRIk5yZS}5lHc|zN(1ai7))A-;&uwH2X#wf%n-)Jk#IunvjszoVM8Op zDqA+vPyPy%224YV##D-f4kWw8v!hs8%6Mc^r?&V;`9l5F@_vss&!e0D+kd3&=$VojypO%VGWsem9;VAQyhF=uf_##2Jv-iK;;VoGq9zQnx&7@opm5f`$k$(iwh84v+?UeJRC}RZaj{Ir@d6mReJ&r0lZ;m+Agf z`@b2nw0}VL(SpIT@-!ps`{%vd-lj+?3~v<27&UB(Q$onYtKipyB%0zO7q{NNN86CI zNL6n8lz(E?TD1&|3ks>36Q$MFnzyb;$9$BmJmTrT z8r#>cBB#Rpw^5%^JcRBWVspe81s#l)D=KS)%yILFhlxf<66C!KXnY zxAO?Rx*CJpUfvw^+Rqi`g4Oi)b)Fg4P?|_Oc?X;T; z`pTvxNJaOgdRb+RYCZ#tq44(35oE%*Vs~{^CFklNQC#>!GN7{Iw3b!uzVHW^alvL* zM{992CK9627Y#QB>d=~%fpkg&QcYB-oS$kSGngiAXnCQz`!H7({{E5D#>U74%Xkk`F55}Q;x6P&)QC(Hy z+%k=nwasD&KG>?~B$`dhM7=XGaMMA9v;>4J%2rEO$Hf<+<~){;A7~Ynkee7&lg{HChb@e|}#R*?cY5 z=eeXj-O|xB%@l#7u6HHy@t@r|(~-4O_X`D?+2@RUdyivdTRNr9@5)yQ;>*NoWSX*U zE!p51W5hf&o_^k5Q;5QZtNFGEU^A0bZR07|)y~qs0&c*I$Zey$Y3-h)B|O|L=Swc^ zIl3v{j?76Gp(K>J$e_FET+IvJQ;BZ^JZ5Y}=fq6L)*jRpG`G0>nVIpF+huXb=aC7v znrbFXh5CY_u^G2o@Gn&07puRSr9O{E)V{~Gw9sr|*5f^8sW=$#jYSymp`-gzm3nS0 zORHts-5KI{{GXR^&*dF>M!$zu(&?_DEay(892#oHlh7y{jw}U5gb3X{NsE$av-dyU z_a4p* z#zC2-+ve0`k5-`ApVo*CI(DQBL(SKqFxl_0B!teeflS1saF&^t9jQZ++3WStkg~}E zk@$jx#&yS|1@}dc?0sNbR(K2$zEw@I)AyTj2RR-yLJo}C{Xd2}U7S+)J=Ld6vXa%zxqgj!%Dn6FDm~+ANS@`S*BXu(NCZL(soO(3#mZX za8Yuk)OASD4N)GB+bnGT(wrc?vQrdX%|Ix)fNG|vogF5t1MBas1FLu@5UH@ZXmrLfLH&PDN9NjPT$RY)V?OXN33K1 zhu-&M@gu>{FoG}6{HoA{wdV03yh#WO59Z3usmrXf^WdM4kQAp1_K|kQ6Y;TqeRM)f zaoWw%xe`d3*93LFS%JQdRmc}@Q)kCVsX{eTzkm$(A+psZ9Er;ekGLEitBd;2-1vk! zl{G|@0ov}Qp*k_GI@|GBTX3nanhfbSHuZ^xY{z!Eigyl-@i!|V0aSD0a?Ke54SZ&9 zQq{Pw99&(IgmE64j;SZ)-$nVH>3!W3Eh6FwRUC@$+D(BJp)zy#^@A^T!zizI*_sl8 zT?ECf-d31<2wwl0%I%vGoc4YE%A#8?b=rMns>4;Gir%H0TIc^&?r6l!Vajp~oR&aC zSzhx1_x*x*cc&VwnY+L4j2lKJi|>42YV30;0qRXF5xCiCQr0Os>o=Ixi_%Df58wW++>>h1sNj{T|aHqR$?cj=qP7xJii%Is~zS~jQHZ^)Nw8A z`+~?+h$nTdj-ylQ6Y9n7IUt~&>j8S~MTiQ?p&EHNWZ9jZGM1yMf2Y_F2ERU9{^j7|kXdgg5Q67bo2>_e4lq7YzdESRGt&53iEO6$d< zTw1t2D#~Y|cS$@)RE61Fy|RX2C)V^Q)!X;?l6c2Lzkl?O(vE;S?P*^qY0S*YMe$N|x zrQ%}^jHz1BDq|0obS&oS(YbT<2}50rBnw+9XTJs0*iS7dw%IFBNVJyon_ zIropzuIr1r@Ilo6Cq|>c_fQctg}**TQCF=*VZ+6}*n1-QM{zmf4xjZX#f9!{N^Icj zZ(j?Rd256%bB@)2+-twpXmhk~LftdyH!BsgomEu}Og!aaz6MC4 zw*5WSk0R&8855_@)rI7E^vf>)ArB<3nCS?D6dLXWTgRSLPuaz#BKPHJJ?b;&NmEJ4;Xg$47Tn zA>KY#s3`N#MtVXEi;+~%Ik=rzHoXZRZMKdxAkA^rVEcgNDF<2 zt5|wgp>D8j<&b3PJ73OH<2#=;hfs7CMvo8MRv%H5X2Q zx``G0-B+%E{f$-Ju&RuFaQwx~I77oZpOLaf;?Can1p;6zpcr@$VD<8qiSDWRc&@8x zk^Edn>pKg2h)1VpO0RXFhNxmCdK5P$h~nmH!96>()1zr(HMWvZexrUv^PlfSdJ2~0 zfrC{$>)6xI;nMAMPIRT4NBXHzG;;cI56Y-+7@Ryp3UEEyWcQPKjxmWSv~3PU62Kmkm)fUb8P_L*dzEs1U%3&0If|EMprj=_ooBVxO1c4Wvj5 zlnv&#V>2H!5?Nt^S_;G}$oNHcBfey)TSrZi0|n#Yv3Dqp6rs?y*mHT%gr##{#X)=A zJuOL`{Nd5R{`-G65icn?w&e7BSVz56bAiTkG%WxVj1zPe`nNR)+VFG=w1m1sMBeSL zqYFkJ6#1fSB7DwNqHMxaFg~ zRGdmv!NpwF^wS|G^kxXzwa@$6w+v=?Fi3OS=pwlq&Y^F1 z@o8zN#uy+1M(0U@;irSU@zD1dx}t?l9!!#R(ok~ZL5ZRN02S&BA6{pr&s-u=>r=MZ z{N4)8qP&RY;ZEyL?jKHxX6kWf4`?%VyueZTD!R6D;xzvLtNS})G)}bqqv_mVu2u8t zD_trOjxB|5po7Qo#qAsyiGV@fU3>i=1r2gSJ(ebcS{C;lV(2#0VaJ?p$#os5)iIHpxK7UQKU=7jik?W1BUxLBIKm(*w^p?Nd|oIK~DbZPsrb z(gR}Ib{{>1|Ljmt`eISK?wBi|C5ytOhc(~YzExz_udA1W7hcHLo^|@qtM>@+aN>Xe@Q+{;|Qe7mb3CYrn{`F^*Km3~&SmL`M1ItF2_@o~eh$&0u zyxZj0jJ^XG0dlS<`sR*Z@4vG;^1Z3VKsmF;)5Z;yhPUpQ4+;yig9S}{u9d9%iv|5K zO{}q{FdyG-#4? zabfQK<%7b4#L50QCseKe#eyaqsgxb=Fowjz_bFowv=R&SXx){@$*&oGcPTj%8MU-E z9r^QKY*~YM@L2C1zif1MfwtKG=2X&iVE-RjskhIc{K#mS_N zC4ShJEwYv@v6Kf{$>hJAgnwBerc!d62OLD${=64VWQpGv=_4p1e-G}CeX=EuFV+8@ zy9+`P?a+4#2psF^J&%Zg``<`QcIhH1?uJk-t2${+>1}_tkwyK`XudxFcekp;?mpD5 z<^GqWZAP}%(Yc+2{2u31vN2!(W_pbAUOj)vf2>50PQrfLwdf6CVs}}lU{0bSi znlXn_opFhT_-COfvnK5@{Z`^D?2HbR@aQ+|G5$TyHN;jP3tGvI+RAta!dll%xXc*j z_t@hC_fC$ILQw%+q}r}%t}KM6*SWKZS5;CxnJ1@mQ|~V1)NQ)Acv-Az#QN{L0Dt(? z#K1jf;3@gSp0bSXoy=vJkl~2~)f&ti=+G&TRV&Ikjn17Sa8>lIox@VTfC{l55S)kQ zbr3pspznXhmJ?IMj@Dj~EJB8{mc@xb6~mi6ha1zN)1ZON+O*vXEpKGLL9Mc^$EL5?7wRacVoErUx3ojlx!SBO-16tI0eZbLWwIyN__KoL+PPEHd z*k+N*)d+A{gzNys)F|j#^vk@tcN>^=5qg9SWQbUmscdY)lyy4UYfv}gFYZC6TmV^s zhpYi*W5<8=*fg9*0a~(a(VtI~iffrMf&bb+AQ(CTYrNAbijBjh~;S@E# zY2JtSK+>YRxPKSs@M&Te#?8))jCR~AfZhn#-2yrlVv(RQB&=jZ4G=(nZj~)iZ!&;V zz30V5u7iaL$D+KA|7WuwTPriNbb>jl24vi;fS!;XR?RDLxy-!u&f=6TFuDsd<&TW5++J3V52InxcQ0JB9G6UhuK#ExH@X79|3?xg^mRtT zk+CP#BM0Dc>+Man57u4)p-%)Odplbf2tkK2h zJ~?V*dPv;(7fTVAKf7@i;>KIs^m|5K!JBn>*4p~NioIRTX^Ex{TI3c@H(@3-y}xea zi_lYQ0B(B~niq>JiMC%kWIkSg&U-ld7U>$n2l=$=pHBApOPPf5s>jcc?N=ZBMg{_p zCeJg<2nOW8!!;43s({EJ{igYU9}S(SwFJC2%qDxnDK@8OQV`84fHyq#{+=bzAGg@G z0q&Cdn{C02QR{n1;*&)>65G8OjDik?$P6*i68@ZMd4LaVVP98K^e7~)Xc#L6VPYPP ztci>c)833W>Lh3$R0g^CAc*eKA)7`U+*?sc}zbnPK3inogKN+n@ zs=p|#I!UG3gFi=-Q;US{9QHEk%AJ3~ns)P<>_)Q1hewBP&*Q!dq){G}G1B_)s=bc0 zr$sETf5DBc9vjtxbuIl{MiL!b?nw@Oh)DkYtlMU!cPz*v=Eamh((gT-BmbRz@!c3F zZ`A1bn8aWwdilX>W2c4Q16P5|27YB2#0E|n}BCR||no^ka?2@coN@a;ccq1EF4CycJlOmM@DZuyVMvj0PdDBJl z-DebOpP*P$Ld5PUnVI;#b4_V&Lgo0N6qyn$Dq^wVUn~>iq4~X~Pvs(>r(P%)s2h zTTX$9dHUOe1xy=2PkPyT09WqSK&?~!>~Y7)ummzNV)yNXN{vF#%d#F@{jhjfzd6@V zs67?F&G5%l{}*i?d~i3#Yk15a9&zD%wfMkaZy;D{1b7g;l@j#HDE4TrDX3- z6e0N0t)oAJb=rZ>tJh|d3OUY@K@LB}p9=X1&HnZsHPDJ7y&7OkHxwNqr71E9^E^!= zT(vwF%rRi(!4_2hFE7-#dlP1VbcE$D>P=$LpwJa<4VS%o**34FI!&Db_xNqz9Hzm0 zc|*RIwr8)unCr+wTh@ORRh;uQNd?DVY{pb774+z|_i!wGUz=_onmRqJ{%mwln|5!1 z8Lq(`X^W7TZzsSumwue7yF&U?|78>S2zoin`27Ns6qzwD<%*q*#>k z870Bxpl+oNmfkN#6NB0DgbGIi0ZWj9TObQ-cxt6iAl*XHEb1-Lzz z1mpnfyP6t;W9JKy)ANbK9V`ld7nU?NQ#xWFDuW4?y1wgy>r@H#G>|JM^6T8 z`ZXF39XFxb$~Tz(0r7l(!J?eAjM16QnyE|DsCb6DXznW8wuetFswqY!mB+ORTr*f0@X0t_E;yCC8~RROsyCtULV8}F_r9z`BY-?? zZ%IIYjIkfZ&jB+}WIAPet?i9OYbJ1&H%1_=1ZSELw>XTW38h? z4B+uyF;lLm-)SZBW#5#|xC-qJJycVdF&;H!4uOzI2K7D6w!2()CrZ)G+3m3>nK6W$ zTsP`H)z+4=SEJq}pf2MOq{GW$B+G4HH^uw%w$>!uPHn*WokPxX4{m|?YbU03Wf%Z@ z^48NA17CN_4R&D2xn*;4hp}n2ZEgj~w?8p57*}uK3dhX&mD0{R^XpLp}JNcrj@}u>bGh=(()Iv1Jh<0;yx>^EJ=se{N zFJ6Q@y~WsBIhZJDA#HcKaki{euHWg?TUo*-%TEnus9jd9K5 zfaNwirR0Jv5Q!>p!T??DhrMje19$jKLb5cC`yC9pB1u>%RvURFs2_MsIVy}DszUnJT#i<+lELN=IO zU@9*Ag-!Jf!J$!G_2@F04SxWWLuOkO&N;l{6X88^%P_a)QCUjbbHO7~4>qc{kx~M? zXnA9;!xFRDaHB>;W4b+nNqU`tr#IMNe3 zqG6k8Wp6y-Bnf%xkUN?cpKy2DxIvZ1zHM_!ryE6l2Z-s0i;PK~TJQz}Iw(zcH;E=EX*)sRw%0nd4CyOW%v9&eI9btCn6jd zf?O?HF>k^<{WjBJQi1cKX)@p+Pp2q|^Pf80ruNd;LTWBnS6}^gGgkXNb1cM^8Z_Rt zKF~T;aNz+1uOMcnfZ(zJ7$;-0;gaYmW=DbJ29>@0&=BVfwHnqe!>)q}$#?Nc`-`^i zV|n@FcC{d5haWBP?9Y{53J_SrJV{K+Ayb_)?-(!+2!HioNlH%4CkHEYh7U}uNtx?i z7f;D^0Cj2!3z=M6W4sMT9v?XHJJr!KmsJHL(0m~e<|cb{2#AQxOqRwhH%mLM(2K%0 zxK{ga)gtXgeeXm&Q?J70Dvwk(Ieky}Ti_nE?mQZK!s4lqY z-JZT3xo3?(l#4s+EcHh7KnxM+BGNH6Mu?ZpOX|T@p^=chsOck?y;aSo^OkZ#&NRk()q?lZLDW1$q4q@C2dFof@~E(s z-ZoLL_bt%xU8jAlLr{IMH~>DwX`)$CTjCMgiWRFN!m4Ri%lX!QRvZym!sodqEtn;< zP^+>$<&u9L%>>lP`I%(Q!|X{@e(c2WF-AprHM{j=yER%%Cbf&9?E4TFGL>eerWz4< zK!r$S3M0Gh%yxv4B#NH9T&{sSjBM^abC|%*Yhlx}DB}pwr%%Ye*m4)!SV5AnAnno% zaHEaY+%1h^OUWm+qN2hgKxMkqy%?ldqHn@62qlqS5?>moqu) zysrKMl!Q_SidkS;=LcY+qruu9V`|veX<(~Ie9BCG6YKE=jk>04*|$tWPMk7}EiqD2 z=mg$(+${5^lf!z*sSBJ3^yjJOT9_bmYJOjO)BKMqfjzip!t0`<>gk5Iz4&h8Ahf7A z;JWcesKp`_Hj?E4m@YYM3uPk1{++=~ae5ID;!~5=QL;x9ScA+R+s<`l+|b3Xy!Wfr z3`%Ig5AV^q7>lTy^c*C{2nxTQUtk%l+lL;DSMI^zX3T)ni5$wG=Hh1qUr=C*2f*aa z`vg$tli^~%BxDF2aXm!K61?$usae^74=DRpL(2N*wV*^IJdwr~0Qdd`CT|*zA;&3X zX7cB+q?vuQLvNRni89yHXcwQd!E47-2eoADuH&xG-9BLUDiyU?IWQm&hbC$yZzbXE z<+HO&kN9S%+t3Iw4jNr}o*?3=bJUCOQi?)|7W3xlb8W%>?XSwJ9;;4^L+!f&^pSJ= zwjI??)~SgeXWE?_sjiB=7fU8DEqrnN!0lg)tv`EmWn#yYzu2)9Zd=*7OuvBWSVctG z^Wx|0R|@R8Ml;)-M}4!fI=tjzH+Hamd=MG2`VK>sn8;Z1N%U}kxW=4}_PjX<2v?W% zhY)5=+5*BS!kpVhq0I#srBn2LYu?8gYao9#516`3PcBKr)rf1 z8f`)Z(4+k2I9S5rTewxlaIEzoCu1)>+=J2U+FVu_r5wxy&a&Y7ip@FDn8-V%{9sMA z#YJwb0rr+^QQsIMNll1?gRHxJk@yT6bT@EDo1cu<4J^~p%2iz<8vSf1hEi>kxv@ox zacV$7bXOEbo)^jgPBSXwmYiu91BX{`_geI(ENJF9*ADK0o^U4aYx2+gmoU?n)Rqi) zy&o%&aMBUi!ntXO?AiOIsTFO$fvWRpsH|Us<_(FCAqd5i!S{_- z$Uex3y~E8Fn_KD>pM`pgNU*vf+Sib~Skh`;@$nd3A>+APz0jMX;i@Nmj1 z-r%~9F8syKm9bQ+R#7<)?;*{=0HI@+1MD&C$k@D0AT#hHIlKy|jSIBvp0C+U=|t6z zl^(OlM>uCTsF7mR2tXlBC;M$ zp+^NH>&VFC!-K|sL2&I^0lb#n(F(glwwjtPAY*F|zrIsZ)rX(tG3WpgyZupKnlI`l znv?t?JRjI(I`|=LlUxP?Hj=-`Bu?>OWs&c1CPbx2!D?b5%?M~oqrmS66V5OVd6`f0=;}($GZydr?5B3yQ zVyIWuy9ixFQb?!T`3}FaSh|p%%&r77!S}iL)`7EE)@YVKUbB=al-$L*;JoaR6R_DA zNkQ)K731L*_??H36JJm%r2=z0_k0{U5ReE&iO^8DIKfC`CA_snXHli=cSf1;H?$pG z!u?rYQ6A#7o#mQ>KmUO%nL+z7a+p)h_Tv?lE;6g#qLr0>@&)W7eXc7$YZ)X!A5qSW zj${vQ1^}C~+b>2$t&@a5akj7y{?aU4^SE17Wc=T%dEF+K@2xwWL59WbcG}+u3O`&j z>VLd-e~*O~KPvX=Q-Qqe?;YCC+gf$X^k_S%jIwTgQSaybS?oxB;7*v0Stdu271SjK z8>7>-6p?-Ujx%(-dolHyas?O9Sqdk^(K2Ic2ec{$kE z#*M6&|9qvf0ZYoK)FHGdr*Yi^gR=la&t9q~rv&3u4jQvuM^8#X;@)nPAi6I{9aYP8 z!|CR~7KpCj1*})bZC_MW#p{&rt1;);#VB>hdz6HVvRWH^i%E0VCi<3M$FFbCt|ueC zty8mOE>q}9R$_5?*lE4i9Rsm`0_+2^*N%UEZOarAfn4ELR~D!Ogdm=nS2j__HED3dX{W<*aPKyvwdmkBnyADOz2rm^+k6DNC6t{ zT~YY#n?oH`2UxONwLs%~`Ai^BV%|!{3+Q%U97+`Ps?*JvH2G({A#_O9vO<1Au@0*; z#5tVDIDqIXv9v#5373;K0L1cVf&KD>93qyFK08|7jxKN{iqywGw|^Q)|Iq7LVyh;7 zI(t*Jq*pu{w5@fg+@cjBMgdwL9jOvXcu6-Mnb;VKy5c1XM~Be&`2x+A0-`A(ZGmkQ`x0r8tmNpAOa24kev-e%pNH&Hk<+a?K(VqD#)O`Tx zrg_b%k5<@?G(p_HyCBy^*duTMk;#N^VM{Of(iIY zm>cK_b(m?lSvd6LmVP~BLMMdl&(PEs$cVDlHzrylh{Em!0O;C)DCbRF`BOnYS8G_~|5L&HS6|>NMGC4Zt9r&s z*=`78^_T)9Y1eh3_*G43*{kWzvH5W2UF){1ruPeKT+SF>MC>z~=(L$s1VCjc<8u|R zpSyz}v%;O_7T$<@a0&j@gU-7a%n#n`gq$(tGBMETW~?~Nb^cUzaK7BMq4{7psg(fW z_0obTSq~|sqZ`j9KZkb23Y^@$LpIF5DW3imjjZEeZ&?IsS#yU9wLHF$qaX)}>D;oE zQh(|lBVhLIiO-j*GxrF*2kFBXrGQM$I<+Oy#+uYjBLu~H_CeX}SprPZ@f_FJA!-y! zfF0H)p-`nw6V-V~!*Z2X_{cRcHj&cAAsLRF^+8`;zKXPbc729 zsM89cd`1l++?I(|DOcErMnKRTu6_>?-aKu`!U1#?BH$wYvd1yBUhYmLT8g{w8VKSKYpD15 zU7B+eEiZ>pWhg$YXV^@ok>h1@#K@If$G=(?w|GfB4t;NgK|bV6sd2U_DOM;@2A$1Wx{rf}vl{QMfg$eiDG#gPQx(YCprIJW2uF<|Lth)wPgLH9}zteh* zsyZS4woxK|Fx!rmM?fhdrv};Y;!0D}`+uc7njKdegAazf6>i%1-o`1oD8V7HM&!c; zEtN?aw&i-;VCC;`^&f#KEn#K82!A^En^H5$t+eIvRfZcbs@9xB``M!zRF%X27CN0_ z+2m(xDEUnvKp0kwU_9gT&nD&&sa4vqv%ddtOq#6gb+&eOmZ8wi6 zMa*OPATU^ipz0@b;Uyn?m4qHqt2yH@*d>pnPvz=lJAi8<}cs2Kv+ z)F3R;SPTC8Ej4?dJ3tCkEHBZmj@lWz4#DK-j4N7FtMsn9YYX)5H+ERC`7$0-@M*ou zlbn$ubL0VD7OaGgqxPw&^8L|J1FQNbQlNe z#JwaHaqZAbUmC!E!{5G!)69sD^0|@{eo2cLz2vyUYrbgYvLFeuOudKm34tlqQNtSr zmTW&B4$4B3%zwCQgZeQ6>rw_e>WnAlL9vTl#BOj2sh0KYm*3bW(YadhTF4-r->&yh zpp+$G^75(h$aoi0-XUXQ^c1NNB0o3kYDZF#XD?87eZQD$Am+EGnAW_k7zhz%7d|3Y z{vg3VYjHBPjmz z4LI=?;GhH6t?<}SAmFw?NSZg_urHvX1D^UKsvvw93KbNsWmAmIJd)(+`ea zEHdrpC~yc-%ALnN7ron~SroIC0!&24%_(XV*l0#T^Wz+W!^)?K`o$Qzm;f8gJB04d zD~KsrLXC7WA4ECfWq-MR=W$#*d1h2D1!+ecB$eUJ_c0Hx-N?SCnJTi=`R}NM>4}6? z2PEp8K3onLps`Q(k}Qva-$bcZ6qduC9$=l{Yrkt;MyJ9unjlKUDOzgd4)mrt-LgJ7|T>>#hLSt&ylK+(INNK7EBL9NhagzvB#P z6+!QFbn+m0R75p*R|rv`a-YS{(o}zpRqs|!L|F(FD)zI!IKof@SWZJ?WqDPEa z6pKcVs%bwGrQb*FKR2!*!RO4ryP<9Xm;w)(b+PLj0D9f^cr5Jozl5}2jEu`NqAyd~l-zIF+&NibBao|Lre+}ml6FBfn zFrMuS27m3W*&qR9&NTE{rCMft5J*>e#q*^?JKxAShCmKNoxpbST3HkxjA;#uh9Cz& zhOjo?mYV99QhnL|bMLTXyp$^~5znf*5LMP6IS#w1OV|VxRl^z{s8>F_jDcKh3tx<~ zgX%Y_mYMsjo)Q%btl%+s!2hz)R~{T_^kJgGf@uoOQSUGR760NXx^|(c?0sbBcmleP zxb45w?{nN`_S<|c&D1A`DB^Ad0xKM;RV6q5>pX{&PY}Jigt8)QWo4`&LUDcxUWm;j zpj=V7F?oK#NLK6**;?;!tY!d~>rgE7d0&HNd=VYDqML*M#?c)1CL5rQ4v8+l^C-*p&UCB)+>V8mypyR+% zGGfm{GrCI!D69c$$O*wH>$dt5%yu7@5yItL(%RU>Y!p*00~4RcY`s$amEervx*d+T z9mxK0?C?V2qggul#Im}4=^DG=KVv-*3r3qfkb-kNrY_ZO+EdYva{VQ+Qq%Jzmi(|+ zDFKq$AJmQdmms(TSynXXvg(K$aHAITFO z?1vTEK_{q$`uDEL_j!eQlrr^Akq&<&7 z3}k)}GABNp)ezJ@T%Y|qjsL2uom_nl%@n$fJJTJxQBgYF-nM#vhTdZa`z9at!<8kQ zkqMVqNG!GO-ediA^}9uUzGeLffR1(p+8Rs|V!ys$GOON;ayiTHQ#k2oErf1`65}UF z6oVx?pFB~Fb2M7zO(OFGi{xiMuPW87}l9(y}ir;ws|WPlyBxnO`LY@Mc>UAsjy=oR^)00pooR z!kfU9qu4D4DK@W}`iz&r!-qn)3S68nGA-2%3|UCrb+sH9mE+}rjXbkCj+p-dNKFav zD_d0+-yGZtt=a`cZVFjZ6@>yW2P#u6uTU=V zrxKlf0s7`BBu?ULvQ`Wtt<}`Uiqcll5xEf*oO{3LW%PUXs;#|Vg}qvT=N)jzuN44#7p&B6l5fDH?mYV^IP8qX~I-)O?Xap z*9*k&2Dt1?!=$Iz44%E47HGVU+GGsj?6l@GV>yS}h!Ly=Uf8Pg@*4g1G$C`wCFBW8 zgaH|}6@qPpN6O$Wa49CS1yje%j%iu~hkG$|n>50Rn~@tbe9J>{mWAtH14e_F;y>Sm zq9E?UNA-j3$R7G#=`a; z#NFs31it7q#ET1SxGe&9)+=1^#;&M#2icqM;7INOaud^B^}01Txq_fz;;`{iVs_o0 zjk~2&kCvtIYv4j)cN4hST*7(Dy}y_JGpR8)x3Zt{%b)MkvnQs5wDJfT?FNPMR4O`R zG9;q2dsupL7Jd4}Dz23PKH1D(=}`AWj1Bas+dQZI1L!glLN^(6WGRDsaRsr?;w8uz z-#XndE`ReK>}?zv;P}w_2He~$=)Ee0b6UH8XxoSW2MKx=Zu3mODCFu+@Nj-YcK+d@ z5GHc%-jaEvuXPm$?8Z~9HG{RA^O~A@%7AAK5D|rxTjvR47)mb3FBvEo+=5b8&NnhN zLG1#cU_7-9BZKn4rh1kD;2%PD>H*8lQe(NOSec9Y9O8B=WKf1t;o$R*t=p9=&I^3` zgljuPJ2xRhHRD<3lM3i5+T=-j2~~IrsPsVi%ub7|=vj8^?kn!)OL=tcS;}r5*x`@c zCfck&6#FTIcx_0P2^3P)?aw{IJ7jj-A$|MBX-p@7~adi9F^K`v)YW-6dDY55jNPJy6XjGFHuNWf!H7uqRRRtgneC}ImcL}c1Z zED67Ltluns`|XZswd<5b?X^_Xf^`}1Oa&w0rsWaQeXFZ+n`gL4Zi)=`@lyzo`MBS# zO(Qc-2)*$W>=@ml*=%88?i^N%_xciPFs#yzuM3G zbq__`O6BZ87Mq!$`I?g4EqqaFy3iICo#umo?g5>+Fv(X;t+2JNL+&D@5#je1T*k~? zqb|8Al2PxYXrF@HV#+%Fg=TJ z9Q(CM`=J5!PDlerV>PM40;bHYR+r%pP6P?sNu9HlsSZ{{%2e9%iNO_eaT%F0C$4j? zh!2>bi2&q%aj;2nNnljxL5LvVUHrC6y)y~qO^QY#7F76F*>*C*E?rmEgO# zoS9CvST&hL6yvcV;T7sZRLF41OyP{O!CaBJ(o2aQV83*OY|47tq$!;6`9cOz8!5eO zZ>5Qzmo`2dc2Xoj^^-vSUj-`hRV29W39)mbc`5BVe|7f@Q5aPOsU&8625rdj8GC^Z zh6gW3+Y_p@d2vP+F_0;yB=LklgLE{32ZHh|5o#Rhz^I$<)f!O`vJec*!Nc60Rk+#C z1I#$h&PrgpZ0AVKt>)@ki$H_rMiInR)IV2$1&o~h&>pNEqW zH2e#lb^9ecm8OeME9+HGc^Fi)3FY?^PXEAbL1jVIzIez{g;%_&ohtSEqxW~6y@^Hq z=dYxMf&Vb%?`?iM8ewx00R)4DOKvBx-3R}H45;EqZLjjdWw?5cEsXJIdoWCs978Ds zfnLm?5{;w161fAaqW8ZIQFku+Zj)+MHQ8ygdJt7>Uy{Ri(l(Q!i13HUP=Dz9!RW>6+8QV)y@TS`0>*F%X>|dl^(Umz0d4?Yd@RGBZT)lJ zFn@A^%|Hj1a6B#H=KnI_8r(!>4x2P+{Sz+s>NXaMk+ z>ms5#vh3-a(NFx}c%(6JLi8n0uJ;|o`A!o3!52CD%9A9Ae*X-=+vgIn%Xl0d{l`Q| zTn)*3#otx@vn&mH;PiG2mhW7E|FQ?r*$PvZE>9QWgrbuIcg*7I*SY(9~! zJ7G6-=6LDe5N{TqX|dpc;>0=s_pyGQn*YEA|97?iceN&+$^YaeE|+d_9&UDi3JyY$ z*8_fqN#Qc>R5Uf6o%2uUR>~E(3(t$`xk+QSDSC3fc+Jh9>~f@b1M*za_k_=E;(ZD0 z@BKej4plPXEg1S=Z5Z!`qs8w}n``mYwk{_+7$=r+NKe#mZXhu5lpiZ8{Pfz*Hw;AyH{N_*Eq@RA_4O!CKL%9XxOG-d`xkujz&Wt|r z1zkM-3@5vp;|gzB*lQ=Sq$~e_xTIavZrW7spRNk(|I~W+N&B^Go9oC>{fKql0-89z z<8N#Kp#^0AS!|r1{iWK`=6NZ3vN})liDWuPxJxbI)v0RPB!$LpiX%%o-n8j0$6qVV|rc-{{f);g201$ zBhA<*Penwd(3PwI;rla@zs^Jg{|g>dCMvlMM6%9xGn4y7z4s@Zq(4daf39cl*srXT z!84rtvS-mxtMv$yL_F){2PPOgH!%K@;zo?uyd76%nggc1gXO=hxH^yf@^;+?w*>1TcWzVT8i5%GK6D7SvnyT04eaDU2d z0d#I`0u)wQ$;2>l2d91D(}qdva@ca-sDHBM3ySz?PmY^;v5YPB6=L|~==|s(da}R| zlgoD%v|{AY&e!x?;!;DoY2pl?n{WHBmrs8s9G`dh@z&bOGOv@Ka=sfeIy=wWQ5uxg z6Jm6)wm&~NVRZ8^y3kS>s4;U=sDlsY0#rIv9RI`CR$v)oWjF-V&rF!yV~9jGV}^KCJ*N}PCt$2=Dj^wd5N(^H2cx7?4_IJCL{2Q7MjBC%G-wA#g!t@Xzr zr=Oore(scA%T9hSbrFWh(>?uZ$HX>X@sfJQLpfl6r`(M~PR`o<=YB{f$ijuk8gi@< z`iBg11yl@UA8`n$kCM1m_Tkw*+w3icCZ0W#S2s>ijS{hE^v(M>KM4M@Z1TtgeagA> zGbTLjgz>)ahH$XloXzkF-mIrOTJ zW7~}$bEGWQeOxm(B7>MOrxDig(&tBu*8lh*lMMv}#^9QG500DnZ!RdNBzlA0cOTBp~nmUKX_}Ics;eWEWH`jIZ1C#Cv5Hi-pSfcy%mGE-a9QGG|?*> zCbX0@jz?#X=?r7ZS82iwRt$c~wD`$7eq@7k88|&BC8gX)orOv@Ih%uDt@oE@wheqg{iNiW^EXh}o(V7=q6}q8+6!cRmCx>U?ljXPw zFL}j^bxi7bb1(V7$(w%?qDlYZw3d_bf_4du^gkuGUVMlv=*AxOHvy6qrxfQ$9Q*aY zSFSOmfokQ%N0J8?=##>oXZQPa`Il=B4j13Nv9l_dgcX`9DegWA%aNjY-M1&1=h&;Q zv+>*veDcB*Hh%3Ie)<2f_U7?W?&14*l$KF+3N0d?Hb%DWWG#}&I`*Pu9TbD?S(1{i zB8)xzSi@i}Lt2z$+~{ zwtf@-^$+~xm8>N^lB7(rpK~sJYT#lpE={-oTDz@qaHh-hX6Z$+StM=Ffip!sW(0gS z{|Oz5C*l1uw@*_4>s0!P=>My@q<+RYb!5w-gYopgy?vOdkC851zNtU5)FVo)YW>&m z#NQD81Gm=xmo=GeJOr)5MVjlbKQE{N5V(k7_TjaNx|JhryH6bf35n{y5N{s{oZWYH zZM*-#aIgHQ{oHFf{v+y#UuOKg9wo?IuKfMmqEg>a8=?P#kZno+5p7MqaFM_6t*ii& z0XyUZGarv10Jhnmlq<+-2Vl?f3J*0?YP{U#jrsoVML2E6}*p1vG6EC1ifHGh2;Y@)&D~w}C7UnncH*9Nf zn~I#oZSi6Y|M3W3AX$iB{E>wpDXjVfTCz9hoUe;rS@>!5RFCOVF8gYlE#Y&9zT)aF zp$RcRDk)BRA9*;uABjyN59ROJ>h4{?zO(uO60N?`;M{*Lus=^K^&;fwU*0;H{`h$+ zlw$;@_>&8O9(SO^-Kw+Orj2Ivdl^Z{>W6DGeujXpNdC*Td&@sNT6P%Xq29CeTzUAgeT-v6I3_P-v~|JZxpvb#1tM&i-YzR{D4YfH(e0B%GS z%^NmuFU;cwx&T*Ia@{c$D>bP$$>HW9U?T;%lf_4Ae(>ds$(^C*j$<}^_ z&KMQ@)1_10k`{5RfJN-gaL*f)1Yu#loY{#0<4Sj^>jCx8ORs?lhly(P*ZB4Hf@o9O z`D3KqorCbNCkSoBvYEX%Pg?LK|2*~*OX)I9Fx^d&>jUGI^&wht$#_n!m&1ST=Lbl# z_gXFV$$Ef+yf{%db4&eJeZ2OIT1~rDukWefCP+6np)@#b^3hVxXg%hST31!p?*>8w zuV-9)$ZMz1k5A%=hNt*ov3sxZuidg13~%k^ocG>$=*`C+`p0bTEcRzBS52$sN&Ct<)3>&{V}b-Q6)Op1he!ON~pKz8g18}(7&a+zg<}(;z=Gc*FQY8 z{w>#+)q^AI8SPmg8FW$;w$WrAX}Iumy`{r}JjegCr1?LdBdnNhC?f)QO-OXwqS z%(e>-c58a;KeNWQhrf2qk0MCX)q_%^zvWD8Hv=}jeC8#Xm4_9yZ01P*E=mpd#^m~s zt`mVc5NkU7doAna<+VTl@mcEPu>R1s(OGLBxV~^9{fLkyXX#?h^U*sLs?k|o&t9+p z)D^lE5nCL2|D#gf`W(VIdh?mG-|qeT-r|U)UCh1|5o&_zeBh1YwP5yKdwyF7koG#S z_UKP4*B^`G$9ui1gq6|Filh72C0(%V)!BK1$L6dSy-nE#c#+tjqi~RK9kvDTg{$oF zgY_@*$17RHb^3~I%0K=9>#O3&D~F@%9qn1DLwXU#M@%BJ^cAYs|Cj{3FoIiu>Azgr z9FVqL33=|{o}ss_4s8Uck`U&LvErxI(N|@=u%4#BLg0i`iMaJ4PJiAHj?M6u1UOp$ z9r7UU%m^C8`0veDHr$n8_aghT+S)DiF@m^Xm&*IwegAU>kdVY)($H=FT7G+w9Na!e zI(g^;6U=^Ca5}9457#%-4D#F=M~r@(qw>c!-;smIyZw&iIz0BH?AEd##ee@s z`rFRrT*9b4B?xiQWM!xAI{w?HMxHu*GwH}$`2YP6p-e*-`re(R|9Twwh;4eToriw; z^NJ4?21@^S#fW{lnKh1Q)6Q4^)xf2(o4fdItbN)-NBA`uq&QAjii zDeR)6|CVyAzoLzX?>7X;**>V<2RiEBt$#rqB+c6c(aX^X%vqWy3f}NWc(ERjb9_L8 z*YymN6Y8VX#z8t}y)2-Q&hG-9yAT+8f4Q^@R&WA9)+}Pjfs_UhG&-rsXL)VpYo&dg zaZl;?=;e{X?x{89+(TtHH7+BBca{cbw-m!TG5g0roj=dTe?4@4F~h6sUgTP~|M73X z9wU>t?7J~c>dtIs83tM%I(~tD>&U9CBK+OSj~`6{M3JTOM_&*h46g`Qp^3rfRZ_IG zba<|r-kGf-7_|dw4;zV!0B7dc?j%Dy(hJ0~*R39CcGjTaVi~?Z+ey89Jl=Au>ia6n z^xgGmI~qW^RuMs-k@&R9_}i`B7x;lD{^b2rFav71AUPTSq5Mx6-CK4DxfId@J={XijTjK} z$c!}mf)nu9&qF|+FA2fH_yEQCWamz+^l0$Z&|^frCF_9|dg;^V%Ueo;q#tvQyqH$g z2L^GXpbw_++EHu9@!_OyhAmhXn8!I$UMGq&C?M19U}cjL9%fE@F_zlcmS-%ZToU_R zt_%_`%o(u@>!sxH;hLAm7)mNXjFm1V0}cHD4)=5D(t;BkKWb{AJkEWJWDfU!kzJ8O z1$KVJ_Nm;tSC;-m%0#1V2lHm0Z z)$)7IHG=!Vzn>r0WYK#qknq+6p)zpHi?nYO3S(03O=Avo@+f^UakK+`UNhAL8cToO zai7OXb{`%Z5wq_3wf>cq0=>D7Fm+D}bA^XZBEt3S#nulXWUNaRJ#3h(K43u-y+h<( zqKRD}BAVaA?qc#Z=y)CClVAr-MGGk>;2fqwG-$MgEp1rXVIHGzd<{fp(cq09eu#NM zoS^PBaR019?U#XvYWQailGz-!aRYLyaT4tZJm=n03`=1T29XO>4tdK?(ajBagNQVH zj{#VSbX*Q#bCB7ZyMDNR0(71G*t$IW*UmwXF;^zegZY2!&EI77gD`pgSmgS#dk3k4 zcCj9ZPw?4VG1qe59N4$cA!)#?H*ZxHZLlmN6r?0Ji}re$g4I)N+jrLDQOO6OioGpW z@gZaxL>Q`|XUplgresGWR#ug!UWn)(y{)6uf6pb$-14b1-}2#%jb-5F8Rx^^uur%7 z#Mr!8(_a4!ZMJ#}JIwXOJ^$-$HFO-rS&$(Rs$f!?quYUOJ}}O>1~%vTevM|SwZJZm z;H35IMy9`?ATvkQMT`{k2_H{Gc9DMf^>2fr|AvY>P^I?nRu1(Iw1>}z2!a0DG31O- zk`1>}C5XEf`+{M!ba=oX@VQY5Gefk1TUp(Y`s@v^=T9fVoQsm=H2uCOXuoisbWw8>ll zlI5tSC0x%?4k)I8)uteb$PR>hPpvPo|D*N~J5EEF4RaLD5TgO6{Kq+vv;0>luny%o z+1cLhxzM8%&d(fq@~sir?20cAJZ#WXlNyw=1&K@=2p^*zFY?!-&!kO@*i1G`P79^S zIpc3+*B-zHxz4>kn^Oyua+*PjonkU29ODDa?8W3WlRw+t+*bgjj!&V76{crw_W}H_JjaGEQjF4JZ7s@llf&rIYzrwu9PM7!9WX zYpc?1dH{eD+Da|x^WWaG`aW>Nif1W<6`||UBSX8p%r@Y;t4P&0JE7Yu>@<0#7#v1o zz`B$w;fUesaH3v}E13t5K0a8a^ObdB-)+|Y9T@P+zI%fCWwwkYyo<$nWd^|j%wz&T zO4E-X8){0ph8MB5W_y56&XnH|R5u5{M44VtnwnNNBU9EHWWIgsX7uG=&kwT^NO9Z0 zW}JY>alz5dagg3`JmJq9)~2Zu93ikm|M zTh(O8xCNYt4-w{eHs}-2ZA6BJKp3&jUTB7~)`CFft>`s2+Nj~bZI z3a;J-&8*M-NrJgF*gjA1WcTWO|re>Yr zgR6~Qh}g%iUTM&EB{aJcx(D+byGc zQs(=j8scP8>q)9wUWQOtiFxke+!w}{XGCfl@htiLk~IcqKHNIR-F=xC7gq^tSS=7+ zTxataQ(pK4sx>@}S=vvh+;#)}avIWN?5rW^?t2{2B6VaBPH07+eIYh*CVchVtQsh$ z@xERM$H;RBkodX8*NE67-~d+DD?c@w@~|GVvX2!9JlB)RKfC$sC*jXmi4K5jU~)xu z*KhBuOR$r_+@6EeW$`cdy-G*YQ?3Q__mozf*Z+BAK37``d) zq<~;7uKl!gxBXcykdjRE7=zju(W+5Q*}cAA#?=edx-{w1CBb%m?^cf-IU-#)g&6}+ z5*9#a6LUP?rN-lHU%(KY`AQ^6Jx?$vB731;$I#ZSxW~DxO)8Rc>Kmj+$eBwKhy$~O zM)djU?prSfOwwm-*n_0>u=} zI&4=#^?}NRGrnQ}F^#WEmjhv5bNh(Y6O*U3v+&oep5y~JdYp7yVQhRWm`${mCW|C2 zLI|~iVab&l7t8B$qP#=3=oojlGT#}w7&@P>!`+cYwIAQ~(_T*q@t>OmZ10`V!K;Cz!tLo1u} zyQi`CFZY?><0;qyYAl1X<4G^U-!lP*wqt7*!DWtAf@mINmcC|8fSd zF=gmEGR|u*I_Y!D@a>n6-CKvB!%=*HzZyt-3)n+wD^Lp&*9iMln~oZ`;^JYPI-<+g zG&L%+d}}bRKqs@%iOma-BW%B&lfM9#fEX9P5viL!PE`Hcx8Q5gnrB=^ywsW?iQlp= zv-9ajFo7Jt%Js7Ck3ESnNdD>*`^}B%8f?iK#U^NZanRGy$;~ByFYpN|=*h&lz)a(U zQr~55I%Am4F@8$+5Sq%^=ZSHdOa2Pkyu?gYUgZ~qWM!@5H2$|>7dACn4&u4Y>vwZT z&n_2xD=g_@qU`BP_lww!Z1++icWgbL3n2%*S{h-ENM%-^iAqaUf^eh?!!*7#+(CTE zGxL3O;QL)vJmklz`t*_HROz!I@aoG^KNm%2kQm{>y>}gs?hldVb$EdXi<9pCCnWlA z?XHL8cVU75swn7B1--s~@Fz&t(d|X-U z&e^0I7>prQH>!9!1LUic+)M8y<}1~lDtx`{H#x<-4()?fo^{w$YUb79A#mlrH16cT z%{C!(kh_rUj?){SlBgKFGOi-XK%NEB-YIUn3xhIVbbHJ;n1g>xCWqEL=ZPn^X^r4K zrtwaTHdHG^3FibOXWl2qjofd1F&R^*vV83t+6+W}&^9MoL@6+o9O%&f{d* z$lF`1q+6NNCPAb3!TmFAx2CV2cC3EV?$2(Q)pT$Cjbx_{N%o8E{~1kw;&eW~NCqAj z>Myq*g%DnjfE2I~?$Q!Y6~T@c4_N)+$Cy@gjAV(51$p#~4&r$202zI1Oy$r~41Hjy zw(VWobBgvku2zDC+Y}1-4Gca)PLb#Im>z2xN9)jQG4s*&+2p7tNM}~x zop9_WlMc@1BLXdUmk%^ra4sdnD3~4#FGzc11e;C?Ca=zU?FH91BqXmZMzcLI0H zEPV(Q8<(~CRi85Jwz_k5p>?2LA%IdKq4hEmi%QR&CRV!B80H3w<4qLfDx46Ru7rH; zaEPMIsf2=vl~^qkOkcH%yu4Xnj_WeG>$q%8y!>*h=SFYp)HoiSyA4;mu$Rt*`3eDY ziI<*SC(P-iGd1G~XEO^Pp*=<=M^tJo2e-7qj4_xyv-cW@7IT?)^obZ9PMR*8DIeUg z)YIn(Z~O(*XVp_i1aYdl$Z5gcF+tRp9K9zs;J)~x<2$&6UqeoW@o~bg zkto{@YAl;CAeV3Ul!if9Lm9~-1?)1eGgp({K`B~Tc*SUhe&0jX zYJI#^mrefD%}HvKgW+1SLvF`FDa_bIg%BN67FilY=p6OjrJZ?JPKqwrh)0D;N_;XN z%@x*fJp*BRh3cknIt>FQ=EK2kFa`Z#RB!Gtu7#; z`F)dEudp_08f3jeW?t!e$^1#Q9x$ef(bFAOP*xK_U`bo>8JdDU$Xuq@>qD5y;E&1y zyWdlfl&$@D<_FW=TeGF}p#|yy<^$uMzV*%XTQF58K;%@Oe~s(?^(1AH6a45xhk(N- zW&K3JVH(kBlpm5oiT7zVC&GExNM>dc8;-?g=PeUH89BT@s*kyVI0OF3HmUReB^0rZ-?LqMU&$-OyWO~fLLv!vL1n#iMRrgS>~8m?wBGN1yv9o zBBlLu;T#w@W1b>GWosIpwd6tRJ~f_Qs3})nikCm@R%OwmJvt5!KO*?=5MsQz^jM1@ zMEG8UlD3dxFhp{Sf9XVH@nh|d#`zQEZ!_n$z?TL^)lPll$0#j^Wm$v3W`YOQLm23lL-DAW$;nBIYBRs%g>g$Y|3nih%fPkJArbA`YNWqIQb zOlhZ0VM8_*_L9c@UQA$M=UVnWifZIM(1%66E%iN)+QD^d0PA3nxeRd%V}eP@SeTTU zhDf36zj5vqI_vd2W=*urW`Bvz3v>RQrqx z*7~5zoaBp_*F$PS4ez5WTFm@(EX+ZO3vg^7uc0xNPU+&4MXj-si{SrSNt3NIbbs=1 z)M@aPs&!pK5FD_2D6JVMSk8lwLO>taE7PmI%lVU#-Ce-sw4ACpYjyVokS2*YsVUUR zzY?k#Vj-yJF)pr9wkXOC*~F~IHm2Y&6;t~?eia^x+DLzG?BOu^SJYa&lgP2ci9{s2 zRqws*zhacPEFJul3To3%C44mkC{ZrnxHz1T@mGkj{%C{J&HPvgLycm4&}|>G=K8a0 z9-bo}>e{fhFr7fKyMk2%mtk?(C6x!@P)v7)(kZ9b1Hd@*hpHm>@l}wa7edx;iJ~ zA5K}qv7^@Ghkj^F8hn(w_yoKpXCdV6YbXJ9V$;(2dl20at2ev@OiTsDt~m>d3#6jK5a8Oa#$&3}Q<=o=K1;I1ITrLBdy40pF40 zCA7Jric_`8BrB)bp|iZkP-93IMB7?4Bv@Ti%%?D6n$zU~ z%`4|Af`rEO1)Z>R>3*Sw8lj%N_seq3MNCCn5#qsTzmMV+Ffb8dEURrel@RQ|7^?@q zm4G*#`_QaiiMH9w-_rr-Yor^4+d&cQwvp+D$2AU1+1pUj;4jz>1B(l5-bpWw92NwF zA>!%+oWiZHjBZVDvOLDYOKeQMWxc@rKf7cbX#awRrEshNw|un%xIA^NQhO9P_}rmI z9pg;=V7=s1McDJAea_Uw|00vlXJKO{Yk;yT2NSYnRyZ#{jkdw(Ed|wV03?Z2=#FvF zfU=M&1u@L8Jl)E;=;UcA2@_)*pqecp5rZ06;1ts|wfBF~5|`-~PAIe~daKyDis?}7 z3k27FfwsLYe3xvPBt8o_9KxKO6{b^A3^@=@NF2Z(^!l1)1(SG79^-w_0bsE3CAn$~ zXZ^0U(N(}H9-<~NIR@>nfxglZ&qKhJFtEgsPRs~*-1Bi>XXMfij2)O107UQN7wYyM zvMk%A8v8N9dcn3>YWEFc|BNZ}vfcO_R6V$!9Ix-sxE_Q)$~AHYTc*~q&p)cJ1Vql! z0B;76hi?+97pd=H3`r2-?mbxdZ;NsK@@etItW!t!q>okypC~ibGHt|i2^;aBFs*pv11gH_C9xm%y#5rk}KWK;4 zhxjgqZFx?i*tRw`b~^`Sob{orpp>R?_d?W71GlV34a7t>4a^}ZRHCJz%cl>gx;5;0 zK_A}TW|U6^RlT^duH|P`c+0my-H`V`*3}GPJLrTZqqPs0!mdp{5wOB(_%kG}-3Mb~teH4S*v4BaKnUo)&CmZA| zLr&v=fDJzVv>=hgm*7mAx)|ZYbSyJF%{6JU&l(j39smtCkm4rYo&zVIG=dTxk^hi5 zX8tqX_qN&$jbz%5r_E{$K<(aExC|$5-05$SDOJjyr1Pvfbr_SS`62-ZV~ zQre9o@QyIN=`LZml&~kWE`;w63)Af-n6eZ>P#Me;F)Qx?FEv+gKd!dNu0z(kmt0f# z30a2C5Ax$)J3oFuOt>;&O>i4REd(Ewc^?bI&U~8YQyyM8iPCM)GwyYt0N)o?I5&fQ z4Pg~zF>%fXOZA*p*SpY{nV3c#f5Tf|?;17q9Ay2KPg7@(XYGn<#0gj4@b&6S{ABp9 zDHVKOW8hez>#-hl!pzOm$uPH}P>fjzjdyCb_rj2b4)y*%j$h})2A^(7V(Wsre{u(r zoapY(<~_-ss=O0Zs`fqM3r$quZ|WOfv|sc zw7UA3>lev%;P|iy502YR^?LWrI8ueG0tch*5B|ul5R{2!J@q=G3b05^{N8@(sz7=7 zX5Z2_Kt+_)pYEiSupu0nKv`+eG^jSMajyn|}2b18scw25Jk z9($PP9X%AA#|9Q%7dFPFJE@8zfHuXBiJ+mB3|1Y{+j*R_31XR7!m_wVlB+|r0Bq;Z zuZu$Ka9u40CqOeHX^c#leJxwuFw%ffY-(ut7_T8bPeDn6P2rRHT*7r!b}1#C`HsdX zf!4*udsar!j0_Mx^#z8cN%)0A3o&mLGVED0f}jv|^WyIlr*RsG$r^^O%f<;C z$ZX?9|rwk<>M5 zzrjZsNllE(qNBU%H*{+Wqdo>xjlPi6ZK%2~7Y<1nwhljjzeTQL&vWfTAq@UEKga_R&OW&>fpwM7`uJ&2QH+bZz=<>zrP9 zkg#DFagkOQjNL_-`l|94y*%=o)xhwuVid!k2u%4)0B!V6oJ2e`{DK$}b&6IIQawH@u z+obRISlNQXYWkz8n*#_QLg1t}9K~d!Y5AgENO!-G<<8M~#}=>$3ih?gP5WR9@M1RK zvdG@HZP3ED$_TtL+Suzl%r;DPtcOhS+LxXi#>0BxhBuWX!fdA10Qo(h^;*SSSJjS@ z*`p6RqVwt=qNAzZAYPf$a>>M(eR(jjxC$v;4y|LtU-LF|}relc2OJ-sRiEzc>FB6=g~80VKQkweJ0 z9_GJ7DxSVKl6bLS$h-A|BoDDLD#uE|9MZW^vsnM;yI3Ff@>Qz^8G~=Mu*E-8lWUJ` zvy4=oJZX*X)YtqDZ43^C&h%h5doR~odRc9}bHOqE7Z(729JLKFNdf!Wkm~7Bi0VRWPa9 zLP;S>z`quqe9`^|^AJ=vC6|<&Mj_W~;LO(~CnH3FjFzaZhFI~|jHTe5hB!&;L`kn# zBaZl`12$K76k=VhefcHD4rwZY)#^AFmDWzcym7bft@Phll-r9m8VWz#ei_MXObrw# z#F}CWuUercHT((8I4?H>5Xt}S274il94&mhnN`gA=4fgp0w?C=@fjA^v+B{$l6ktG z@KtAyA@?u=7Yp9KLT;f@SY0Qad1RHEmmDHdcM9t7Mz7@T!^>#(QCIBB`*v`S{}{{H zaVxU!k{Zng-4{as$sSlKz)VZt#@Y*ehGZCA2_Nceb^u(sv8l0uIzx99Jmq5vxeC9b z&k1nMe(S)Q{fhe>)3lvVpUTE_-z+TT8hPed$6RG)noX3Fwu($RH_ zG>nI=xYk3V?DU3z;WhonCv!N;4<0wT4?bIl2+PeYXvf3`YK=DA3~XuD6{btC(zred zgWC>v4@&JTtq?h}7Bch*RM;YZyY{(Plp^QH!r?}un1iz`rQeIY>;xfq(b0Jp1>mnZ zVD_<|9uWP_lY>PH$S~S_IUT*V15c6ie43N*M+VTS0cp2NeXHZn6NC&4sv zUD!X2NwF@C>%;&dKE>o7pGhh~l0Y`as!7d{ONH|+{uA8Ryh9*z=et1kw_)y7j0<|uY^u?%7#HjHBpw2T1^i;I+jHQxXy{$a+Z zh2=oW=?Xz&5+QHVH%bmO@;4)X_j+-665+o6wP(v3X#C=6BHxF3g=>d|CU4(>T8X(v z{qN8|UwU4C(eCSh^WV}FygCm!ygJlKUhlb684NnlW$EFs`KTL*9|YOw3x_N^+(Fpo zsLgRc1FEtzC$F!#I{d=%u9^1Nz$PZa8mn&*`#FdTNiR97V1LhyH-Vo6hainV4^!DI z3oWxWNRFZ*o$}v*`&wbSV58WxZa6@bmY%Q`L49ap77gifH0;c-t`f8giQ)^Bm9XH- zG$dt=NiMo%jztVPHJD?JM2+VOr8Po;T;l~*hUs4~Ha@&pa~bfVCj1E0j!w5t=6VXp z_ra>IGkkrnPnOQCz>2_LJf2%FQLgSUsymxQk7cuho_)@B0-A2}NiBP$G;?kz0NRD5 z)T$}BA@XFmE&KhRDHyA`Zg1hQjl}&=zc$6C)B$|d|pjdjUeJ*1~Z1;n$;<8 zQk?uu#QhJ^Pj*1HCBc%=0RWffoU1w3?K`htel;L?N0Z%)*s{Z@FsU_r@uk#vYFrI@njYlt*-l#W#T~t1dfW{TN)Tj z%;oPzuf=p(7>&ie8}zadj(k{7a><=OeR-olrcr!2Hi*zW2M=VQc1!5zcH_1*v^a3f zi{rt_^G5Q9;Jh6$Ko({|_PX66yg()kyOTu{wZfiLppKi!Il(+1|0X`2BS2&$ct;=1 z>3P9Cqp5C-0M(aHvtG4IK4B;cn?;M++lHsn#Fx;_nQejXw0r{aGldGACMH0#&x~U= zvbIM|tIV1J&|h@vneNKVJuN?)V9+zTI;qv}0%KTBJR5WeIqN*;FrlrtlaS-3&=7;c z`E$F^kD1v)0#SWP6|nRX@eaHVbC^~Hzp<7Rnr_afL3gE|n$E|cVvWP^*1+>Mr#ZcV zyropW1ldYsIHhq?aT-AvzsFvvclq2QG2KtokRCa$iYKCcz#qNA+C_3A-)|8R`)p4S zz-t>9ES5Gwnx15_vhVC~!5h(uep|vhtp)FEv?FC#ei?%&ieKqucvB`mF47P65 z;yQ0^Id-q%NHNmI$Obr_lC;cntmQb^e?5n(W7TeCXF^Mj`jev5j8biuUJ=(iPS7&l zQ_Y=94jZdP%{}(@n%^KF>Gi zvPkiVT+ez6PCL{v*O}y|t-9|25Wm>(k2@Q$hX zl>=UJDF2%A^%E*|+12#de{FtXKu}=w6&y=hqui3C`C z4>F96W}e)2hrGlJPX2o0uY%PoFUfpBb^L)lkMvgdT*3YJ**0)An&|g zA$E@ew1YvE68ERi#t>&eHn=;ewZ0b_%w3L_V%8mMG@pQ0+mzN1dA$0 zxRi~3TpW*0d~%i^PU*|kFVHEmoX`tHxx6!oZIAXKpFLoI3o(+<2{3{rFEh~8UdU6; z{YRVL!QZ(k+7viQv5{1d;KSci=`FYCrUf6xSY>-4&fFSX8z@2|n90Co1PdVPr(TO| zA5NEzMi)Wfw#>QZ+;M$C3A+&Uf0*RCtJXHvH=fKNDWW@jaU5w8!+4)N6M1##VTdU} z4m-|6E1nq&)^V5V`K&y$!|m!Co0p?wMwlLGj$3#xKHYLqsFv-9(aR=TpDJi(ym5=C z=)tsk&v7gn?I7{AgoI7=o2z7GzUr`||1pa{)nXvVLe5lsLml(L_T2+o-^n{K#nKQH z-TT&d{RSF@v1b0mJ^@(~pt?ZdD$+c~Fy}@>Lu7??BTUjrMH`R|%y@PVe!TxiGp#s{ zZ;lUKpk#%K$?uZwo-nY#F*@N9L-GlFwo z1+-t}W^->Ko_KmOr_R?SsT84~rb?(GeRYE#t4!p~J2K~!E(Bcr_ zzGKP&=B6vvDK643QoXymxmih$L(g;~n?Z^JT;bq4x9*P|aYU(n)gY-if3 zsm>W9;`Pl12eHtwT=PyY>@?;}T6YGZB^}Z~qd(v0W}M-mjexVBj1bF=fSaR#QPi`5 z(t=EbpTq*cvys{;y=;>_W>Wm6&+Pb{Qd@R*+Dry>3W z%Nf@0*49_L%trUprccR9>>tj|miJjTcTrrO`1t5}weTVO?U@ET$jHDc${tRf?E%6L z40D;2xY?;YcaDEWFG16(d*AjibhR}MgV2r?1qxi!{3nF;wz{(HUOq#&jp(%sIf*|T zs`j_D9MJ(Y*pL47KR_btRUZH*@G$Y)Fu(;oMECR9J@4@_4jDHvaDi#4ZrzbN;j7v^ zR4`9%RLk)z^dKgpj8d&{Bj20=x6IvQ8|>nY2&&=oxm%Ywm%BBLd>U;mO# zyt9e7a!wNm0F3^$lFu#q?r#kx9TyX%J?nRfcJEx=#+8v+_jfS`k-h*`2`E%3iOU3; z`Kg|+ebvoG;oC+c7yA?a7#tb{5>ZCcL8^ytLCvKjmI`zcbD(fDuP!9knME5(c9}At ze1bWt>23X?+J`dL@8P9UwQ<4U5m2&p)Qq8%nHOu0JgG12!WHs_s_Bm5Uz(?&C=cW zkV{S+|5}49c;vd6#t~20IaJQ(I&j|{c(9EN_;FmlZXeHt)FR;k!s;9fJI(OfIki`g z^EwtwXddo7AUg3?i~-4ce>Cek*daWA7HgsZl_G_4((nY5$Y&_Q2p`gM`n}W__m;<} z0ZocqxvifV=&3H?G-4R_6=*vRa7>L?Jn)+9MVMaWep?uwd0#yjnp2*9St47C6qm5u zbjMtj`>sGfuH5J95b8z4GlH}PD1J;L-EQMKhtB-#&ehJp!T?9el}!xNUri8pkAAIT zMod*4jCL?bpj`oQ-0#@eymeOHarNBsxT{h^DnxcR+$51|(4;$$riPBS9{)=2(k``v zq6&p$y&t*=liDYVc;bc8fKXjA2z;QZiBZC-6-QX3eTILO{ z3Lz3>oU`vtL-q60$4sDh4>CJJc6}VS0Ifs4J_)=G>U;-YQ~coy^E{?=&&pkJ93P?O|EP#VdbLZTLsFY_mEYj z0R>BcN3UotgpHx>_y}@F)2A<8*F={DL)OK-VK?F7F5cW6^plqX4?V-tC(-{-=?yk+ zcR%31k%ihK1I}T|J5=;WrI&}_C2rB9(4P)Lq+ll<0o5i&40Uf z<1Sv-(N)rtoLYsxwEw3&dx6b-6>+9H&Cjszr}V0P19SGw>ejt*Xx!SlwR5LhgdVCd zU~cf*i;|afa8O0TZR363)5WN9#}bGwls%As{3MqxOMj}~*np6zYdxTsrzlf@Lm0CY z61+$AgTSwQk4$;GKg~UHcl}@nU@J~h+P(jFy8e`IU*SziZ_EoDL~!xLonmv)hY*2E z!|)~b-twk~1_m|>z4G?kX`L=D6v#+S<}8%jhO!(=8$`OIAWh`V$Mz0S7+$M111dZF zyDh&tM-3pnzo}r-n*2ijIxT!VK?H6LIZrPRNcyDKOS_!$U)5uLA9>4O1bxHOJ}N)P_9H)yZG-!*qA(hB9DMqTTp z1fE$6VEWs6-A3tlOkPN*(+U0z8&$Z|mcPp+h~@FT@nSLLJ9^y3R_XFQX;NURp2^oW z4D8>z*j80~o+V%7dv_q^iM=sg!EX{>&({<1vftVP$1`(#-}w&HBEfihvtsZSmpU9! zpjy7w`fa+0mQro;_y-`uBB`P^VtUQOYZTQfB~i(m5YlUv9;b$!X+O4OkyjKlF~x?fWb9OU??nw9mAIVf zb&KDuE*y2b?bIiXPW}F11}J^8u=DkIxBO!(38$s(QJ~2au3qN_ACUW-v>OyKw}AKZ zB2{Tmk?{(wq9;~Gmig?quQtEc9Kp`XEczBQ0ncgpANFN#YJqaF%4pxJjcXTFr|M}3E3 zI}wsbJep(Mfxi}~Dt7?0rH}~L>juxTWa7a6!)NipxO;AYK2y5r60|&6EpA@s_O?2|nBOh6cU2pbYxnO0TUL5Xw>lh%UKvW41~XceukEjm&v!{%C6%HzijA`6K5PYY*; zt!*mXV z4kO+21hD**u)mzzE~h#l#L<=4ocMdmnXw$OwOE<2RPVxzj`uuT_r)UTqo7^4ShBk- zfUoj#nS2BoZ)6Le?RLfQuH0)Ahouh+i#JF+U%PjZv1LyS>bhlsl)uQ6T_c^m}!-v!!o{3qrYgQE8%K8q2%ZrdG4`rXXNK31ba-x~+B3gRcLFQ{J~zF^*y) z6YcXGABojel*M};m;nmp=1T@LDb2n6Ed7rr$`-Hkrd2V1#fuzn?&SuyM^8nMH{tmB z*#~l}H*XTM4{oCi_NV^!%HNxCE}%oB3eY)o$jwN5P4A#|y?z-q~(Ep+Oc&}3BJ!QfU3 z;#L|2n$RO#Ikl6fUtHvY_OJAmM(_7>@*Ayc#c^?sm^^}J)R-X9a&bEBZ#U}^st2$r z|594+rAuFc6&mPb)t3o+`+uz^yWu7R;tQat;={y@7%@5 zIaWQF0bR#d4$$-UKz@}5%EimPF%m-v%$U0c>-oCmbLRBlk9j2&thlRyEH zM1F!WL0rF2onhTw=BtYeS51(Xnwu?RbAdc5`l;U*!{z3(ILdxcRT@p*h!-ngx|$FQ zLDpycweFj@tOx9ukA*46*Y=A5EtyYtzTerCChlGu-yY^tXad-0@a=pfYCL$DEoIs7>(C| zm#DnBO5{jG$#;@$fa|I#InsgmD(&w)+9+!7e|XL`L&cY`cvV~BtWOxHOsqC0eI~-u zaYs++)OpDeuIIX5ea9YJB+(f)Xiym***Ea@MlP4#j!&AFI`AbPfpG0AJ}VCQbuz2V zFmQLxeb-een8}&==-eDi>(Sq8)Gq&+pq?7ze4wr7Js8)seW9Qa?5S;xUkZwWacYd&3`B7!q>csY0zb$m`^os$j zNuL8JWLLK0Mw*k7rj%vu0%uMqs>cP0DfPFx_~BP8EtYRsH@jAZ$ZBpfZ;EF_o1`v( zUXkSOUC6SgU;1pHruto)=lgV%%JOx#guAvzRBahTTb4CtNgA!(ZnvVOAM^Z{)l&S~ z-h0izt^2QJV?+#aa3Q1W8Pauev%;Kd3GGcTh7wZDk4o4Jod-tOa&{T73UMeua%yjF z+dvX=&I4)L6fYRQehrFBb5GkQsRhT} zjb?>D#uU-H?~gcVPH}_24oX{gdAEdgZ2Fyp7Pb z`^+Z4mP2dZP!0PJjaJ9Y;CeoWX=d_~?iXLO|F%i?q2;7ZXMAf2t~jly(@2uV-09h& z3p)OXFx%^n={+C^9Uzt`kt>|(UP3R@mZnx%TZ+$LYOcRm%rH%|1+*0PZ8?TiiA|H* zX$SqW7P7q+jFMjBW0hg&cJj0?4raNe+FO4%pl|39;wktlf3I^T=UZqh0@DtE%wZ`J z&Kt;S%Co@}PD#Ouo5?#>F?#{`a-YT3)}G$sv6TV*ak)L}Ba;xR8%wW5?4+xDUBrBxC`T1C@ zYGu#SEwso*yHz9bVLf&W^kwRrUi@|ENZ7fp8DSfBmTn|@dBj?^E+{XFs`45fD<+ka zMJOXcO|XK}P_buse%+lnZu~$U+A#`1zXRWgWiKSr=?=~R$m|i*lj#;A5*gS6ETu^8 zqe{Bfr=RBD<1KsDMa=6A6-h=d@luHQV|d35B=0%orXHqFsZc>zJB8a>$=J9eAZE}uaz#@l(M`Ow%WF~;@s-yCkefM3fG-^L$M-3V>x zePu~465eY=K8PM(da)t^z6NHOuGUrsNzo2`-pt#hkw#Z?NkjNo{p}$Yxokv_^1)QT zkuIrhNVTLXO%UU;y$->okOLSHZkjQc=jCG5km{whsnKCT3w9ueuVwED=+(QJ%gz43r5Mr znl1wn5ZAkiwN-$ctj7b(R#yCSB2g;e;gO?4r}XIRT((iy(}JT^>O3*4I^O7iK!J1T|?6^{x5cfCCP9pbgz@#ESY# z;q{mZi^36S^HF{>;vx~mxH7Gkgs10c? z;e7nzqqpx{ooP6vOJ_jWX~Y_!qq9|uh983|6kZ{jb!7;9PQa?MiFcn8A14{ZWIBST zL0ekj>!oi6!kAo5x~#+@`o2-p)iMFa=6RQOA1016=s}G*$FAAS9MP0DeuU`J8lPAg zoZ~#Zb9TXE}YmLmgLR-C2n5VQ(XQG-3$3juY?Rx|PKmNsgwfsqd|I@}xr# zOk$T#>KNB`;#tHm(u-(Ji;ny_wnpeJsaF)67d0+LKDl<`(IgJ!lJ{>UZI=|`;TX9$ z!Ot9^-EfZnR73}F#V2_jNR0f;u7)oSxRnl7M$?481qI0dtg9 z%FWTAm#EHs)}IN}6)32*XSlL;5BTBzpi>O-5SpS zeH9kyN-Om4f2~qvdTyGC0#2CD%_DEv+40N!`4s{ow-oOcelXQaRV5~b&VgQ}TtG*b=_^ z1O0X@!Iud2IoW>91fwhg8AQ(Tq6kB~q7-?Df#-Cu%4YFj*uUC75u2#du9CcYVb4c^ z{q!v1MQ&&xEdsi53;umfZk_fhmar=ct3}|%-s$M3A71xpMC_VTA|JQ@N|zHeHWe+$ zu*lmWrxoYkrN=7>#WbEkcdR$^d*`_~#8T$LH}eG>M|-QP_DMKqIN6Y!b(c0xwoDTe zg>5^9rWsX;yWhWLy=GHcOz<2%8yeA355 znP{O&rr|8YqbY97x1yfifH6lKd~2`hgrBNby3K2rb6ZEs@*Dt~`LR#z&v;$F)+mW= z^gNf#_ni^i!Pzreb^Mu?w+#i(^o=R*`4tOMq;`sy`x?Tpi7K3O{wk z@-Onli@9V4>fah2{f!_yZ8Yw5mOSwyINfM?t_RsPNx|EQ!bcsTltHOHzt;{NH9WD-R^0@TdnbQ6A#}RXa zk^SVMu2+z<-|#>5xI1tBK#qoGLruGoVh-CGThM;-8~8aA3)=l{YQM@0x_KQ|47wvx z)aHun8JSkjo#)B%94)sqEQh*H6=^(D84b9%?=J-u-o`$sha{4Feqr2j&lg}B=QNB- zF2I*OY&r6t>SPS#X|J;<%U+5iM$WKt@_&H?z;GF3qJmY;9geVikv*p{H~p9GUJI-S zx9TG8>9P=7NwW0?UOiih;m+r8OYBF0T@*y|FyaYmLgx&Q?aw7m(N~Q&ZOC~D45y-L z2npFkSdiPrCI~(}t|kH!)tN7O(|tvw{y8K{O~HQt-<*K1B9@EX((5Ky5037fGs{Ll zA9>R%7BhW*aL&oYxC~~l3Nc^JC)zw?A45pBYW@Uc!xZrAe0?;NY|6c2o;hzry9o+mF$CTnCbSc6;{m@iG&aF!n_3(zSaOKt_&jv9b5kp?g&chZK$00{ z8f}ZI3QrKu@VVUsAAu*h6g3oYYu^V#8YTa)H4@m%D$=ORmO=qF?J45}zf%o9sWW;+sa!Pexx_M5p_gaWO!zv;vVoFnWs6WPwDWA=Ygy z^Zu3#)##HK6_4-A2hY#9xB5OjW_fjFllC1NZd=}6wKw!p7Zn$M9$#~~dc{!xp~`o2 z=M^z2sm-)H9Wp!MKddc)=MU(}%Ke4u&nE&l<{&BIK27!x5z*Cb&r#_@6v4rLE# zV=X$1tolps`?J$Wm-pm2UF`%IJ|n?(zaPbb8ATK}-g_O)b`b7BV^?#PAk(pXokF_6 zj2ba2-{E#}kwPh&8Y67j<6J>*;;{Xa)Ffs+yK?F8t_|3C?jP2z=Y2i_Y*J%rzh-b1 z=0elUaI;LD=Yyq1o*14SOKH5KYh>?VBDwO_n3|)R8aOZ3`&eIuUZO0j=0xtnrd#@9 zpLtYni5nY_jNS7xoSnSAr*@XB_iQt5Sk3vRE1m$O&^s+cn?tb8S1u|n*4K`(f56bA ze2kE#`IL`J3mvENj?p(R#wKTErrI05a#@ND4VO;!BoBRs>}y}$g)Q^orc^Fy9Hp)T zOPOsyrlYpK$dZL=g6rlKaA!1U<>bT-TWJef@V2V-2A7B8mZ-G;*e#_ng^y*bjy>Hq z&wdh0LZ2o(=us+`*ONLy&11^+YK{n~Xrp`3&;w`5_P@2>6(h2S?pcgtD{V=QFFCCm zKP?p{tqX*>ZX^0Kv%I9R2ts{Bf()PzJXZ-4m!fo_b84}b&zh6J-bs8jQtbVIbbSdl z6ngu=Wia-UEE6)8>{*61mdc(AktGt58I+}wC8cD>T9(KTXpneX@cKF?=+phT=USIOgfOHW)MQqa*7IeZTG06ioG zbJ0U2FQt1|my8X`L{BGNu=MRGaf|B<_G^^$`bo+eXYp8WY}xC3sXy!kp2~@+#_s13h4{jI%a$Fe6>Q5&*h)xphAo1f-J44SXZ;~8&|#J zpTH!@5WTSFA$%tQMk24PdCBDa^PHTA&SK@4gIWe==*P;mWyW+(y4>z_swyWvpo?GC z`tnV~`9-MG_{+XBHN}&HCt40cS4a!^=_;FhdMUQMk6gGhyA%T~j_+FWzDSzj11qw9 z(1xT|e5^K|d@_B%MfzApVKBkt)bPdPWPF8U5i!;yPs@vl4p=N-NV`UxJt zv$w%s@9{K%S8qJD)dGGOw|@Av$f8+N zG#e+=6}3>Ge~g}Km2utm=uT)9rhm7v$#lpNzV#F{ea@EX8H7d6l`J)_r^7jH)OKJ<@Akk)dA3jSVIAALP87%dr_(vnbMoxW-dwvI(5-V88nj(aYOBZ)^G_u!_#U)YN?m}i7s~gM_w$l+-}yRn+lJQ zk*ra*e-*$l#0XCk!Wa{P2>$i`LB8pKY!0N=7+MEOW3#=j$I8b`)dF z?m}JT7FWm;%jgC({(?}rtZ(WtNf`S*4Ph&|lj}U-nv)(^y%(Pv;=et8iAhou`Ef<# zVRMs@F{@aHwE$^dqU$xg6 z{aHs6Q5G*6`h(rB&MyHy%JqDt+}GIzC7jMx?LQ4l=1Qwajt)P|yqM(^2YTl3z7%~y z)n|}I*)#04eU z(8!Bp9hbkUOwF46rMXde%^4bJDmK{p(Zp5b^)BJX$)FI`-HFPK>p`||LcUt;Hy)GJ zRn#4fB$J+gZI@@#9UUQeQMyFl90!EFQh)#AqVb-EZknk6C`b6J@zr$`yE0TM%aZ&^ z-%!)A*)MLFLtYv!*|Pi`a=>JD-|I$6!HZg=?mmWj1`MXL;su9u}(BkBDW|d6CLmRVs?NT%q)Ax+C?b|dc&=_o2p&SYRM?w(B zfB)!7!EtWY85I6gx+PWVdpiaKZwU=%#eZzW6NPEo)k-Cs^~GT~KD1ds3)iK1uVaKL zs{oK02)4Lsrq$i;p#?G(U(ieoapzFVnRX6biEiXho_vF}t9|BrrhT9fKo+r9wR}}! z#m`)KCKRj+tz;KBLJwsIlhfvu?*jYIAQsm}T*hk(3&R>`_09CxX+BXjHN2MvmD91c zNMUwc@52``FP$2!>hJVH9oCh+j}=YT-~E9b942wU6+XDdjV6K>i6J8GZ?_q1Q6nF=hy%{i-*3 zyn;POhGu5qs^9oscz;BSm6Cs;(-oU>^9?9g(+ay)9Ej^mxSTuAGAO8eaZX=<)cNpY{Me>vm|Dyyi zXLm~~U+k#f`80uIKL&f+cPgG9s0>1!J`b$LPI(&>VslvC83=<%^1`Sq~GB4a@n ziHg!8$>}?(M4dNrz4GKnP!`o{4EiyKlS?t4u^WLsR6 z83853DU37!iRMxl^TrZRm817#MepuSrsN)*iXZ%TR*0vEh}wz2>P@+aG0}Z@E}3cc z%=dC@keU8=tS;ilf_1Gv<2UDa^9cPg=y5%s>g{ZStkMCFk1^O=+Fzp}bji$) zo8-m0;L~dqfS65 zLEeD>?oz@bGQ$(am4kxf3dy>jbUmatlNmu&J1y12cKn++?{qm&a?R_Wj+sDFk9I#w z+1@Ay@g>KEBdl%#nko4zI@EnIBJ?}gGJTBREz~3eO`!l@%$N6~LI10tiHgd$&E>5d zU@BJVFDqg*C|8?Q=t(*vU;70Rm3z*O5hd3m65g|%70hfI68yy2BhVD9aq$BRpJAvj z8+Fdpv!2X!sw~&^R}7&9IIEL)G3_qg(+Zl#%~Y^tS<2sB4Laz&gG0A7R8{AYD;)C5 z@x6J98)}4wo4a|ta>}lk3amU}UwD|#-sL?G=@vygMW`h)nFs9{)Z^#*b7_tNgM^`_ z*%F7R_uPAOn?Ht>c6!jsxmJFyXtay`bAlUaJxZX$;EsP3^?kpKI;XJGiJ4Byw84|| zGO&Ie%lOEqq(7RQPubA%d&I!RCKEmJhG|MLQ8y%9U`ei`;1<=Qb@%;pP(mL8D}xt` zNzSF+F+7Td5@q5+IuoOoAJ|_=H0DwoTG2Zt-N`DE$KA{#7OSYADjO6hJI^%)$WkHn zTbge+a>`|M2f@fxaA1PH_9e!%vA(qZnebRz?gg?Em#k^zl(*fp7hsAZrM)hCU*ce& zqI9N&8X+^*`s~wtqE|10f>lwyc37DiDW(Ll{-ee=t6(T3WcLL*{iai+-&;**-KHg- zc4@;o*EvZs<;Nus@btUm?59v!MsR#nD|}z|1eqPtb)r^>)0--Ohvv+SYfR0kw>$a~@AsjV zN18#iIqE>z%G3+SAcRY!Ezh-qoq>(T7arYt(CE0PIb)FA;%NBE>FPMjR{ZPpj*R_} zcFI|``h>lzDuJRN7-luUxwBSu3A^RZpEph zHSX+4|E1_>U-m0`h9arTCBP1wpguJBnGDv-l$PIr_>V_O9f5h)vXuGdd5~>=_F2^{ z2@t$$+TnO%c04P&{@1qITCXiS`#YFZ6~KC^@9vOha2&0rOLwRgdA9Zd>cds>*_s>Y59a&& zBt2f6PFPKM$3)!SMa2g7qtPuOat}x0J3EUQ$l&*|Q%t7r&oMK$40% zxl_dcSNKU(y%2^XYWdqt>A&xYPKvbC6|@jH&e&@l(wbY!T426ikj*oSJ;C21HUzdU z_hGC2i^PldVhQb@*l*O+H777A3p+r;KhXT1aj*SmBlJ}*U1i4;yUcka@x&i*MearH z`ARk~)(dBA7n^3<`p}k`d}neT{ImDAIxj?sS-a%V27&+ZHYob#TS7t^W6lr+MTPf1 zHy6FseMz18r58gHApqE z(odcYL79!{u5Gy7I*=c0#-^xgVT;$!_u$}~L`}xi?#|HfyR!jRx#4+^z|4a{R_a7+ z6<9Ito_J@yt?x+D#@=i|clZ4~`d%^joW!a9VU1Gy_~qG!J17^4iz@(sBwPE4GE8;@ z@*3DY^W(2t%^pr&h237&+z;V-%)cJ##M-b&sPUJDfn@mi5V~NP9s35|Q8M)1_+&Zj zuX`S@$(J&$0^Qs+G>MvrqENja8;((;tYO1~)zQXfhlmcEjV*A_;kNbZZh% zhgrHxqDTTf=2%uL>H~wWmM0bZ$gbK!!M>+3)T$dgbObsJSviH*4>ncYsduF(s z6ynkwG})3*!Pfk87ulB#aL;?3WbaecXLlmgWOyQGH1QYMj^Whst*H7MilR_zzs~u< zJF%)QrJQaDtM8O^?g(|$AGLD?rE4bLZ3uS0F4Ndl!_j1oVj4=HJ3VmBMii;Kl6{a` zaWiJRWgWGoww2kIhMUm7Ld!U}3Y2Ql;4Am~xi6C`MaDwU?m+8L1Gv{&I&pH1l*oS1 z6?YbNptIoq9ftL;xUHJHm6}wv4lp!cIMoH^Jj5gmIzX8f3 z*=WF?j^-b~^QA9rRilI{kj2@>G0a|lv5e#ITLutO$R!vPFS|AG`X4eR8GjpLqU7ST zPwd%pWFVadlRt}eJ}feMRN{Xs)P+xYZfjSVJ&GvToqqpsEkFSWmoqJdU7eG~7|CeG zyb?S2rU@qLPj6l?Wvce65-REiiOL^7eysF1$zRY0X7x67W^zSSZ+2MBTSu5^wN~>+ zP_Pyhgj2pT1@<9db&m|n=dh{OCn>L`+Ba+Mmo}ir&Xv-2C8@Kp4v5y8_&esFavhP! zNs@iD+KD*y;#JS5-4nLOzF+JiKAh%Irley<>T;JMiJxh(szJHex$wsQBc72<^?+qF za4vyp;*#*NHM7r2NH~gJ%xH>JN0%~iW+%fuHbpB()lOaSjz9;bHU{n-59u6Rb}CVH z6?ED-GfeAIp%h(rCO7{>-3L%t21dpkCS|^Ikb~->f6?mFkqU(dYrA$KD|qHsj5hIh zwE7_i_+OpOW^C{}#7xg2EbdP^=kGPd#v_iVPUwVP3w06-<}kYgsMbaI?{B@aUkJE` zsTaM?6HezY+E`bvfKgq`EL{DQ6ry~zXy9am6QVUOY(CHQlj?iHvbAcnx}Wk7Cu>zM zeL21O{IUI}6StePw(k`l`Wheq`Tf-Hm62%U4YVrf=b`3H+;(p!AG)~^UD-RF``L$; z5jKHUy$8-1c0UIQzkS9kDX*^G^+8(4pShls1ieWI&$U^OC8Os^+*#G5zD3A@oOWdo zEq+AwEP%7x&)KXE2)kIQ^DXuiW_qj5bi|bx@uv8=cH-pI zl5&h2C4V9sH_50%2C zg1^wXew+aLj49ruwRZb1)G{0Ge*;#j;<~OvRetgRJzMlUkS1_Y>X3u~fLiY{Lu+S? zyM?$>9oKq1>TRSzZ8#g>4ujeT(vh;WudX(d5>3ECRr!5oO5M0`r$L{dno;uPgt2s8 zRMLJzmhQWHND=mEiF+8S*`t$&_Apr%Tcc%$l^e&WZufAei|5wQu_TP-y>5~|!JqK4 zK^aeaOIT@`_jCk9iLD7EJMbF`=Y=m$ZvGgHU_|vax(Z80TRgRRO)in-(_`S!q{ar+PbzGR3 zpMkxUv=**Fe4Y}=inuQqYPnxH?$;0`N5n=xP-mHM#YdUA$*l^t^($^yv)cDZd|p~@~^U;wv$g-UcN*fX=ylOc9J}4sNkMm)Hu2Ji@7%ifp48x98)jkaU}S3tL%UZY zGSk+yyU8XtDsac6aIw;_;(7+=63>Jz0l2M_r~a!QGto`M1ma+%UJ6PYh_M}&>mp7p zbCIHpor51T-n}lFsQCG_fsFc~TRb1y%~`H-)d(`WVjJ}%MDRlvXsib++AU&jhDOWHDI>D!pWzsxb`?B_a zl8$U)orF8mjv_vo<17{kkHu+aDN!<=%xk&FZ+h>`<{Eul$?(;*(KRj-xex_e3(= z?h42L8Fh>?KD6#cIB4x3OoNX^i19?eyNx44=$o`I7;!#htX2@HTH)+lX&+d_&khu2ah0Y8H76s@@r< zw2&mYct<-Q)pZs-EbLuSNuG=suw#0bF3X!PD=*S?q?H`+9_mtIhWBV!2JcOYj#(r` z02TBdsatazl??bM)TYuiU%w4cM3*Fu1_%f%t}E0bF)&2R3+dhH=S%96ozgFZCgZ#*nm?brKPemPDTntf>wRb`?+zFxXDqq@gWorB6`j%Vo zNk24h0yCc?nqZAx`sl}Js~bi(dF6b{;M;ViX;cwpA52uHS812`OlFHxQalyx5H^n3 zePTj?SA8saQ5D6}5}q;%~ebLodV- zs1!}b1a?QcNoIymE-(%Tpq{artp^^gI|B)!2i)k&(fT$rp{ttOPbWJKq&Y$!vJLit zW$Fu_d?M>t6Zt)WqIfVxnpG)}NTeI=ZjG@l#~+c7mL7YZDq|u3CfTShm#UvH zio8ghC-)pyZn`G(Lrl;`khH~MYHs-xBq?!3_D&zOk5c^gmv|^Ima`EvPj$&|LtQO9 z5vWX1YV5Kkr7q%n?+cUbCQik;@m%FLjhI*I@?REdy2P`@UvXP^Bx>fwf^Mes=Bn#IKMHsSC>lr{?vqM{I6cz|YA*I$tV+|{ zH!R{3MI0>b#M_l^icYFV4hCwto#N%G?Iu&g83!BXAXjSF{nqZCKNUL{&fwDYKBy;C zuzSNRUxI^O+$jfZ`QbS@?vBEgp7b4~uGbv(?DA@@V&b_w%r(qu2z{x$3Fqo?wnkwG zlk3r|5Ju4cEx|tJ;7J`Z{x^i1SV9_>U{N751no^`)K5A6Z^y6RF>&3Y#eCy~yH;?D z1R(U>^la3rMvYnldlDa_wiQ><5tCl#fLqbWFMcxSWhe1vUR!<|y7?mzo&C}eEuPmh zVdxY-!>N>e56^G=>ik}2?%kdrap&YqZ@$N^jLhuQ^DT!{y3_V|5#H9KFDD!a zj;XIGSGZqByET`$VM@uqa=Bx}f|=i!J?T}ZtGtHsuo_4Gy|DC4;{!!(>3S>twwHMl zCf5y86Ve!pFh$#UYIoW)xwZ2D2Nl14s}7p+J%If2MnyUWUXP*PLAuXMGg>LQMqO$~ z*-dgUi4jF@f#9pZ_WTZ=K&{GD)|IYIjbzaba*3gw&b_dTqlh;;M*Cv8*K?fXRQRvv z4I4ywEwC;})Tv;AD@&%gja%Kx!V7?KqRDuEnzM~m^FGeys;4Su_~urk3*-W#3D5U^BqC6Y_z z11(CvFAE4$Ue@kMcLC}v;xN;kAYk#INJwJ>Y9}p*#&%rtG^v_3QnpNOfoW8D_{oJO z12K+9;($$+r`;gzg2?{_&HWzO@zVKiNlN#ypv%{{%v{x0dKg?1NEGx3cVdgg7|sax z!Pva$sF&18>$IP;dR%u_qS;&85293_gKw5{u(6&MYe}_#Lc=Fd(KcN*gnD{E4_dcL z`JQpE{qaj;o$vC5?irS})+A+6`hB!L44$A7CDhqI@V?$ORA8qx#YJrazw1v}xBV+8 zVbwHbdRd{`M12#a82BwshkmS28$(<67U{zxd|^?B3<(tGeN zh|l*wdUDof!!*CHo$YQJipi!PUC#73Z|KT^Ti4^?ojgY_*|U1}?K#ig8z#pJ zr0~Zce4jl1KbnU28w?-P+$ou@s7dAa|GGaN9R_Gv`Ef->ol-8AbziPoAC|mo;AVr~ z{sqfCm)|SOQ8G7ZQF1i-aoHlxEs_vptqvImUI?e8TmD9ZLNY|fw*+)ZHQUvOQZT>h zfv{SWU`ZST7qVe~H_DRO<+thqT;;vddBZ zfXoyqs6vxT|sp-4otrYWO1T3cNVzRYu0RYbtqE3}3d6I4gYh#v2P6e>$Hj9XgAW1RhqiAi0XR>Yb6!**&iS$@~ZrmzDwS zJnXsC!#CA(g>;+F;)dn|bta}ijf5>&x1POU4mVGbNsoB5mw+SN(&vWT3gvz-C_j4l z4DK=Q3MYwagM}#0_g4EvAd8RT;~K(uQ29H^xcGX|g#QA_<5mHXb=wNI+>|*9gBP3N zEgwy<+7MpM6HTTxopJv12(n#R#rGC+utb7FPGedEf1(<|zmFi?v+1)dI~zU%%cyKt z4~vP+U?}+}>j2?8wM9TS%HzoP*3ZiC@qEX=|9o>-zw#HK>6SHf&p(g7q4f$!6?QFrbBq z?%PtU4evLR&)yq928j7&V84?Ks%C0G#>MXnV&O6zOs~QY$d%p;L{_4(#zouYlYBQH z)UhoUpo+))zC2wzSYTCfyBr5Y!Org=W&Wl@XlF+U%c~`=`vq@LJ z66Rd1fR`e1VBHUZ4yyf2hT1uCsP~*M?k|Q1YJ4Bi^n&dh&}7^O>+y!Smdh*X;?9fQ zg77Tbqhhtj`)QjT!mOv7{QjYZJ}t&m^&r`@(kuzezPxU;l>H_|lRnmK!SvH5IwAY{ z4&_P_--x87$XXiFI=qjMOwKjb-yC=>Bf+zu@>p>W2n=o@^*68YH@;n8dz- zLdh$_ua*P*(FRs4)XX&gIv_lsz=>EV!6Vu4O5W%H6{NWx0MStQ?wIGWK~|Gy(qh(N z+~@%H_US<#daYbQ%pAaGM0boM#}to4Y2s|aNSKc9 zn%tVen*0mV>KTI&4(&#rXQ7w492X#gKLwWCys>3kV)N5IVZv9x4rw?3<+Bh|)LKK+ z+KqKAW0U=-cRlopZV%jkOVErfiHlhbycOSLmaQ#ItThNh39VKfSFI9KBJq)#Vs{@H zay|N>V`7x7=%LJHlWi`?ZuzIPhXRb33aQ}Dy!()2eGJEv_bRmx0^Exaj5pbFb{z`M zJlAwdec_*j8|_6)pv`WQ*Vat`G%`LIr*^&2FK{GZIY&`yL-K^M9tAL+k_|429=uwO zeXF@a+l&V`*cKcC7gIlXf}qZj1Di2AAQAO0Ra8wP=JhE+29HDB=2fpA@O>SDhs-M- zn?mZff!Q~S0ILH7E{*Cb6@_a|ETNk7#tZ;NBFegx|fR^G!A3xVq`K7!ViqfRsa zfV!(>t_FRZb@trR)u(ybAJ0bW#leS$IY4{*)BL|llr|W9%}>6d_bA%29l58JEYt20 za1@_V|GZGvUJ=2D(wf+A>05p}UQRgXwNeU`;kyi2jo1dyS#Lk&5Y8bkncs+8vDX0O zLci=R)_P8EgRgjEjOFE|X2qyL!bU6gW=%%ttva@|4}r1lZTo;;Oba*hhEzuK2Q3i6ECVYEM;q z5mG1~>wI{C#hs%F zyLqwTcRZNXVt-)m;F?{!ev)&=QsOCcaVBx5w@t_hfM0=2;Ng7couiiGL;`VE$#E1<1Ffpt}*=Q z#31~!cR*Xv@NnKOE1fkZ9O5l}9&bbGm~3v?9k#z~^*HKPv^jDx+^TDD)f583`DWCT zysLbVp6~?^$YtzvU5fE$r0h6z?Yp&Zm6Ltr0Uqp;f=>1)vm2<7n2T$Wn>06PCr&}w zKz_?R*Bh^KXO!$RJ;R(GnQTy{2f(8|6x7~odrL&?Q`9o56JVWlNXkX4l%qi!qf9of zSHq|TZ{`FMtnYC8k;fnQcnEA1!HQgo5-g#_NWQjAG_V;^T3$_=_18}?~G zEkYOsDv>>^iziP_t~HWb>jl z+u{a8(FDgJ!+-lMNqJgGrq=qXT%+%3htkVTs{Zi~A2Au$vANkUAu{t9lVk3gJOAC3 zg(SeoHiG%{(8hm4m{5qG@R%}im$%Lum`5QTq1K;iBs0dEErc+Gi9lcX-IYY$53Art zmx-=hDFy_5=yO>Y(uI-9g$m)`J~8bhonWvI^zMyZyAB zYn@~oX-LC8KrgbvXY2eJB93{H&Z8V%ODJQpXd@%`V@^!<>Y1LNoqHRT3OPrDCfDEg zK^ThyAYeB9>k_35PoTkL%XQf-!}Hkcnm7fWA$dNnoe=BcsB>$I;xSUA9Vp81!RRSF z#?8h6?z1`IUC+c07|Jbv^y9Y`)6oGLAoYc}?RBNW*s_y(kHQn;;t5E-T|)X3Q8b91 z#k9U6+n#@EHkenowEWk#y0kKzT52nje~MpNdit3u`qN0?tLVD+;$r1P{WmftuF=Q| z^?y%qHVjJ7zul%W5$%(-7vw8MWJ}J!u?#qko1Psg%S-&ZYi2A^eZ0ymgX-|q1}s;z zhO!7e_|k6`fS_aML}s zdg~pn^Y;CbQ^9@khtB7|VxfEN(uJF#Z?E*y(TpO+QZ`r(b76*ep2 z2x8?b%g5Rt!+Bp;xq8w+(m@w%3d&sKZv8%qM-ktvmmAnC-xE3eUcZto)nh)CrJ9qf z0=sQ2j;1OWQ)#im9l%=`d2yLdL_K?i#dV3>r=QVRkA%_C%1*>=3X%hhJ$j{h#-RUx zyc*z@#sp>TcHHkWb{oSWzm=k|5EA6FKQ!=wrb})y<8#^2+(p_>n)UhuyA)&O$zD}g36C4wSv(ap1aZu|Oa5KzG zRcaT;PTReNndd7c!3zzm!)(BFC&(xG`vD#sNthSeX~-p6!%|uoVdKuhrBEAGINL=$ zlcLh9D+ouT&#S^RMgC;hCBJh~JBTmw9-5?xlce7_8hBqiT@elv%))x^W4 z_E-2N4&(=C7ZjiP{HmQ>7Qu4M53SViVRdoS@$%;peP@FQq7VgS%~={E*!xZ4^T(&* zX7zm@uCDKn8Ih9h*W_X{803qJT@?)e7MuQ7{oYQd3)`xt3(n8+Xw$r7B`84tIoGA? zHyw#A0dToM`9NI4pCj`dcxt0{pLq6$$^Y3q;&svx6Ytz_mPfk}M4iq6)OWU;mEUhw zr&$)Cjins15ZaSJQC!0ZAt3yi*Z9Ztia0|AgJ1W8)ou(9?p?nu$0xYaiJu{6X zPJ|@x;Q+-!1S1Nm<;R@x7Us0dI~PW4-^-wUg>VR^sDqDGE!DJebLm_zH+RbV_{sMD ztpyMV^Vjmi8-DaL*nSbybsl1;vS{(ILuD;zuY+&t3@jndU08*sPrky;{&sN?Vx{V$ zt~hEyoDE0D%Z2JY0OUWCqR~4eRgYqWDPthDLRkEDBl-jZItYH;;^zgxJyPMrkv$Z^ zD?UV5x8cMgr@u)I4xhdYQUGf7+So%2iTW4FvnZd>0~43n`&|+#27$m+@NUJup>(a!nCn_ULx_A*U zc<6d^)iPe>bw~omkKXs(wfj{?J1ms)+(+0i7F7&Y=#oE)V}$uDG}P_j3LCkpaYsVS z6XLMCWHQbNX*e+1&>B!oNSHvy^OU=$S#|BvxCcN?UW8z|E9hKHem$LqC0cBGVaf1% zdm)c#IOMF&M=}C9EM%i+V8iHKRaP9{&FPcA<)rhx>svIwmpxrVAzZ zn4N4?2A%B-*8lF)V-Un`e?W?4A|ooKhcWDJxF`7CmH;IchaPv@4RNq(TR{FAf0Fg_ z{68<@5gN-a=_t(gkAacAW0p2XrK=qoj4^G#pYv<8;4heRj{?e_Wc>?i8}MaBmQUVB z?Pl+)37jUjAnHMvt>GaArNC8{aKH$ICw;m7Js_tO0%Ewb#nQTxXN z8*RCJoN*h;4fkBhjTTVq8@q0p zdJQ&C#n|olVzL2A&uw5PHqLVS@EO>s=eOTZ`p>Znw9z*rC^5Gj#g~<REC0^ zW66QmIx72{$>fuo$q(w}vTPE4|0~ra{l%lqbi;tI9u`8PPI4gA82St^MQ(0E-(17Y z7geu3DEaTETqm7|=$P`~?)}Ge$Vc)hsWDRb9LNcqPB|iDVc^!4DGMm*y8!MPwcZ)D zyk3kC?2)UvS!B)BuCa*m zWb$||!byuu#za4ta`9K{PnhoX}Z-=ZE4dF9BIk~(i?>Zn$q17n% zdID9kq-Q39M9*baH66O_y*yEGq-zXI#WI88Z!QwCr>^yb%HbLzfUNHi*u{Zji+iPW zIUMtD9qKMKfVu|cd(tIzPhO4W5OU?t8#Rs#z<5vz$Ctg zEpAFPG{pbwhqmUqbZlGwoJh~guOUF;Bq2g{=yP@U2hidVY{A@)plDe|jHB>^ISF*E z_h_`;j*65jvtO-s=XZ1uy9&vHG0v&Dg3$3P$_?PTS$0pHQX^LSNc`LQ7?br@WLBS5+6evhK>|FS+j%Qa%%uYDzQsQY!wAb;tP{Q z2D-SkzKyPv1^G2`?~98ckLnUx?S+(`LNY-QTlFgIBB(I*a&~M5%$5rtK7JE)8_sv6A;%>;&wtdO->+Z?jZ^B_t0DbA zr9r$kQW!_n0SDW|tP*>vy9PdF^8(1JANrE;>NA+MlFA7k=Q|e0o)5Pf-}kLMX}twI z${j>ZQH$$PNG;dcokNdgy6gzlQOMDXzwt^lO?<&{17bxU`_1>gt_;G(U{(b(TRa!w zEi}4|8q!%yrx{>|PeXA>P`W(B)QQXbY6ORryT;N{eVn?vU7p-Tb5XJe^~t$IIU}I9 zltESOg{=}%G!c}_mrGW0AGfgtZA(t!DecaVTNE5in;KyU$IsU{BaCMtO``H*I?+=b zL?KH=ge+X43Pp zr;k12^!~|(Gerk|4&4Y^!9>iYqE%gO_mMbmLkL2vRUgQ4xV{p1v7M(;Ge+sao?cGB zxwx&9=RKtXr1F@X53xC2EA)-Dl1Y+&<)CNO;6EHp|tmT~!Vz_RZzQyO0HjntXk*SM3(#%B1nZPdR} z0tpg;2 z1pd135hyS4oxXT;D+X6COs#pKsMDtn3a!(>O#x`A>#L^4k0`j#bDd-S4 z{sJHz5BLxk;Jc2oZA)6S%&=Q(_~rGN>L+}FL1KzamI`$d7XD$y4?yUHwwp-oQk|~3 zG=KEt{(DDw4`+s5^Xr3F@(c5`$#_<2X=Irv=U|q3_iGI9{77|KnP537R!~K6;@+;k z{Pm6@5*;9B%vvz_c5NIt{UI>Q5~hl}f*CqcE^NrL0I@53TOTq-?%A*Jx(9E2vBLI? zl5zm=L&N4s6DL#{1-p~-i9wwhW%;*6Iza#K)`+AadE&w8nv2=P;S&C^#4hRkL|~*x zLdN%n!Cs%Oedx?mF;wHEQ}dG8+FL+%v!2Iw27C7(SU7^)qo?eK1>5G;B@723T91E| z4N}U-uRa>(;35;Z`q3r!)nj$%cE|m4LPipH0la^H2V7Z|dH$3-w!9~N=!x3c1q?Bb z^>#hm%LKR{)qJ?Es`?|+QIpw2YrF3Q8Tl3-Uz5?xpl!K?>Q>U-i$(w}a3H^CkDgQb zy!nkCd#;MnzG#v9XR(IS%$7b%4~pvAyB#4=$oazTP)mhg6Y0(4NE5PU#`Bqvn*0}N zs)xX_%6(fYftO$S1_>mUoxz`LR*e=o1|#81-qwcL*iL zceodru|dp#N4U%eqny{5!fsRX$l0$bW!gHdu0t~&smJ4M4!68jE>^Fb`s`)H~xq>f${os?ks*iBjI*1R_vAQl4 z{c&4QN>xZju(<~IZqa;Tcq6N2BUQ_C4QER5!lo;CqCXoKS@y-UqLi%{N9|I>QC@({IfD`DJuj1~y z5vQW6Lj{{!sw2zFAV3+XE1pZ!|E=p+OC!(kw7pTGMAP1!ObRS{0s8XO9dm30u9sr@ zFWj2~V)*m*rx=dk%wgw*t8T^0q{h%1MQMzo2nGe#?BT>$n6z&@p4AuC$+?8^k7oLQ zXr076wfHKG?VDJFZ1rSVs5yWhW)e7!k>PCunon=(kpKUTPk$z@|8f2Q`HhY^t(YP| zFZ{!?Hl;HGv|$R2Q?fzjuO)#CmV2tKF|mo}74L;e!Fh%USChqfUjwP<;dupi)(;uK zYTeySqX>Qhx}?>mBp1raVX%Ki-GF4|Du?G_>y7uPo7!ugXwwmTcsS68k-ho#VFQmXqKFCoY8W0>i0Df0HhyYjJv zBKTd->S2yB{|iRc@eLINMgY}3%X1Ak!kh|#q6v<0vS#TQ>|CL3Wt000R&E)$#EB#m zCbhqubQe5_5?8`={?-|Y)KfC*%Y^&=>}l3=8tGE?$}SF`nBOC68WXFfQ#iV=EfCs% zn?xFon&{v2+5~Oy$+Q=^ofH^*YWxXX!c%yA`ilUpeuUxc^}B39jS>a~+y&Yn#UR={e% z6E|1XS^VP21doxC;LDr|bLO(pJDygB2P0ui9G)&Dudtm)n$}+#7=n0gaoAIw=;bqi z5#?ncqNTSb50)?;Q(mLPr`!4$IZ7!+M} zfSu+?eRdyQ%{a#vM+RciT+wj+#WeyL46;+_KrBroTD=ZDvYU(7T>@HXU7PC(TiX6i zqsb6&4*(%^`sjD}_dvfisGeLPoY?{+*(2&L1$&t2%Fhc;$tewXE@zyeVRBV=QScrA z{M|@0*3S@A>o`g;MyOBh>DY#WJB=f+w% zeOD^taC5pr?P}dFP#p%ER?-}zF)}{3S-HYAN_G-a2c^@X$$IgBzUl_mpS0aip_Un5 z>L)b#5H=`Pukjb7=U;$L;Mo$@(6QX>6`Zq~P!c1{sn>@b!{eRV`aOonIRP=M#J2Tw zGugB~krL+l_hj<#dprPRN_)hPjz9NY=Ozz)WRVz;8(k=8k%nx1RnF8d+`PUvy$V`* zW96lFPk{wjSE^Kt7V#}>pXcWc#BOJN7;AZ4l-0FiuP5gW_o{nIq-&Lr(Uy0_r4@rs zzx_N7A$E&Ydd%WuFG!)5+7LBEXC)8E39DQBwnKMvSbi704?%o`rDUUY@3;4E!~n}% zQLWs!$!>O=7Jic;khw5HC)$KL+OTdyKn)FQo-pd)PiV?eb&FH;=<8f9O{if*Q$gD! zFCrWgw6-vJS)q`vH8^BR66<$)ACh}N3|-U!aJ}V~b`~r3`ipE{2Q9j{DelhFNR4F) zgj*NQlLaPItY;JqAVGj;4S6L})9b8&u=!EEF5%h7qs&TOep=Z6u<$&)E(0XH2#@FZ z9HRFj$I`qeawkhN3uIJn2j6TSM=POY8g|(3bAO|=OWo7`P%Fot{a!6M z)1em_oCbIyVeSVXO`tSE>1YP`+})&X0!-cA{vWBd;o$%C^Y#urKXWgeGsXTs3p)Ig zPVMfD!k`OVPkJtGffU=G1NDZ#L0}AT*SCkEtzRIU=gZvPCm?W{h~e{U?OcUS3iJc_ zb{j@FE&LBS3r98~#zA3+nuLj<2O|k>AfxKm_3fRot&1b99*T$7O2fa$=&>bcTO_v# z-r8}?&4dOJGbVyWMvKgIh`B`?$)7}1#n1W%{1}{h*XCek@Vx0J$5>AbhL;ACK2`hj*Ff)S zm})MTWXS1Cls~=(6lwNwr!75$TvpB^?4V14#a9ir*Kqb#9{pw+c8YIN8==!$G)~-~ zrin_cj1I43Q?0*1pZU5`8KzPOKkZ`!g5}2PWXtMG71$|JjMJ!9{8Gb{i5Ze9y_mQ4 zvYQt?%-7<_>GlMUHLkZcW2PEb2}Z{%pFbmX@LvXAz$<@#qyx~~`a;ipZ$S9+VRPx_ zlfr2!#8IX{)5Gd_@r@hasP3V_<9HYE(_TZRd#Cq=rg~*KCpG$>gh9SIJr^{8mZ$i0 z>*V&PCMW*W#qkepf>!5S834g)XNc~U{fDxzkoO0mj#-_?G(GtA>Bm9q-iNj6CM_ZR zO2mR$m~Z7Iq%a-E8?KtsO|jzl!)p5e#}wx}$opFI&%6;YA}vn+I+n4%D{7nT!3d;K zS(Zxs+1xYckxo}@j`V2|!`fGQj%jUO;7kl*?Yh19)MMPJIzmqL>N08CDoWvS>${wC zd+!><gT4%WNP3K)4ECz=Oz}6^Zt4ts zp3h4^yudxDHk0Ff8I*biT272B^hHMp&it}vr2^+K2fJ=kXi(*N9rhhq^p+jou~PH2 znh#LMP3}2{S75bEBxFR!;fQRBfTG`6_`m>cIU+V!6qt%6tz7)2dwG9J)vwxQcCGol_SYQ` z9;VxIns+&K(sie84bRc>Zd1@rJjlB&F(Ix0 zuQK=~$0jDGs!*_)Um#nGYc+Ih-G1ylV|I9pKC+Xxa`Y#AP>kcJ=}LuiET-so`|iLA z`f}MY}7HCHim5Y`o^JpGgH#wU2QsbnO4TF4V0F0qn z=-TUe_p?%Aa*zUBQ`HxJ>8lq#=e0R3P z)0kER_Jr72-8YU8%tSJBL2Y#TGcCxngz-T?xYIK&4!&Re3SvQ~et#kTDni&K{zwbZ4$K(CD- z##0Nb?aOUn7n~|AsA{6igVmN-<9r1sqZx~3u;d}TRUpp4XuJ;R{62Kg=vMFl7RcX0 zteNh-d;ULPFJ;(!N|;uqn#qH-)a|)1M*`ld8-kK%{3Bm0Z3ZU@ye!UvSfyucCnmpL zfbHlf8DQj!UQVc9dJNCs+7lMx<_ECWP{x5wrvc{p6sF)Ys=oBcBtByAUKl#gzfJD-gK^t3Q(1kqA84qQ=*^&V^&J3M;j& zI>8tx>f=bQPUPjYCOY3Hg4y%iY7h9TfNu3*!M^o}V6; zO4K6XoV<1AIoQ?u2zDYdw$TGmOBqSsP+YDVtbP=x|G!%Is-=8cczg`<+`FK}mFklkilLT-ukmbIzBTB< zTAqzWNj)&1i30zQlRMD!e=1G4*#~F5*kk|xTv!D<?PADwsBtsp)RCdcQ?zr;<1ijb+RjGlI@~K&U|KSjGlW$c4ltLN zw>9ap0VgUu-WX6mjcPTtsyB;8mT!j->%q$cIBz`BF_z+qd*X)MATk!}r%D(X47^1N z`lCqa+HgPpLj1&&->(N$JI)f`zFNU|?InTvsMw)vPmnKmO$_*`wZU5I>nw`Ck-VK{ z%+kJ?Ay!6uNgPHneaVY35Lfu)>i#}!Fam<8Kx%OlEUo?sz~{o;abZmbGq@<^JG{T~ zF(26#%C}y73FUM+YSk9U=x_%yPc>mKJLB4` zpdqFfwqmY(KB@HN*4;9ori*6(=npU|Gb~gr`MPx7$C0GLXbpaJM@j!?yO~$iY#+d0 zwL~U&(NwNcwuv?3%3~fA{J@5M&`B!B4)9u`Qi#_08F7FFSY2V83Z}YET8i8(7YlkZZ$!-&*`MiQ-GxvTM?$d z1_xlRNN46UpYPt3VB@4y(whW|Rc%3+k2e4RJp_<{GTsPL9fa^kh2P**2LF$YAtP1& z9nGPg>$M+>S3QA%ze5y}sxm^Tqn>>T2Okh4arZNjtlNHuw8b#Alm?Q_=NdaCUJ*9!!l~euf7QQ%r*-#J!f>riQPDOfbM*n=Yjqkg zj%peyG{;r~ZDAlsBX?G}w1dU$Lo=MIm|6Di5L48%*kyX{tUI9HdQmRS{8n!nY?F^* z^ax66#AW+tQ5~T;)&*H?tbDp%ni_*@;auj|_K*HHD{_?~jaM-)B5o2hOIOab#>CdkbF48m>XrOeA^J`!*vV4zrvEK#HG1 z^#1B@gvXPC7tkYc9FqeFmiuGiV&Rl@D-&0e10}Il%lymCEp)}74}E$@9*#%!{E*GZ zB2^=HV{LD4Hat^Gy)k(LvW2=6nGJ-E*+2?z)~Gkl#QLBAr3Hwye)H|AnW#jQ<%nZ# zQVEMzsU%nmTIiu=o+@clhiu(oC{a06PwY`cYtg3A617|O8(@|$MwlrdC5YNnI6ZH; z51&}>j^z#Fzh3@-0|AL6YEe&d3jL>sm%faH!jc+@J_J_5gJko5YvMtcz{6+QNW#RN zaAsFQ63HJv1INjV_(NiQ08~{Rcnu6}D z*`Uv*44klq;w2m{5w?A6>0g9M*wcvXzpuQUmQyV01|SmRmd zhYC2%99!V_WD0(|M&m0Z_fKk!9SY{hDFwBd_621y?y?-NC~$U*^8?=aAz1DWkvX@D ziUu#2bV7$K6>}30?pN*k>D&LgHh=!MlmMv0(q?hT*#8{YC;ImS>H40O1K4dMO4zOR7}Th1VC``Pt~8p6@yNzLW?x)SCC!#hoI7R6LW<8pG% zlx}d>6w`N~Kd-oi&w4P+;~hKl5i8Guqqu)Ygbl_X?5W}k;hxubClp#RH?$3?!l+=g z=8@=ekmnyHW)vl|6HiuaH6(xj3C!A?p_Qe)CG#oQPS=0+R`MB`Qz@~V@WnqJ<}lr= z6;;W~4-LW~ytKCVs6Ph>9%-#a9A@hfON}s`yfPgX1wf?!$MgYzNF9tw=wKF}tgC;g zkoTbt5{EA$NJ2v$sGCSNn9|nqzp8Sg^L~`Rdrnrjs0E+fXA?zd&FG(>-iXlt<79P} zM_{fG3n=F3+(a){L|@Jg0h z^~w`O0BuS@dt~!kZ>GHZK^vlgmc9x_Of`(Yw}6NtKh71Z&-1_}W2bG2+(&8=G7L*^ zGzLLpTk*EH=oDZdm6`GXA2^sO7X5fwP4mu&f1hRp?GMU+;hi%;M=fB1^!nJNw9Vn` z&sd>REj}%Ws4fK~ARbBzU-#G7WmAiTFP~f+VA8YG9XCMAE^arpTL<0SBWaCZjFk zw0D-*A3C#}$G`a@ptmHDICy(EaGAUm7fG{&bOZ_WIac7vnqg5N9ooZsKabqhC@;FO?~bmzql-SZUuNeD$@Y|Dqr(@%PgZymNYwiFw^ zz$Fg-r4p3JMGU`~-nk<zML{_}RAIXyoHQ=Lnn#qs=jcSa53DVQxOj9- z*S^CF6sgq3&7c}fyy4piWi{?|QJX_rk0Ewi>%3DHSkxiNe0tX&#%1iQVOtgVnuKp8 z{i-Df#(K-N6%+!|DR~~5>&*gGxk66M1qw}^a6SYc-NYqX+}9<{WDVphbWB1w6P}p< zg53YX-hCsGHKq*v8GOaRUt$s>9QcMMNR>0_1O>-5#FvoEmG+jT#0fX_xhYS*0J#hu zpp!vu(E|s5HtcghVtXAjOriJBhXo@jaxM)hcbVyx2d7z~q;#|;>Q4c4K>lfHgT{-u zL6@kvV9El;As*Too*^AhllWnfOd+!_|0FvXj#%={#67g~knv5;`1fPD8jD&wXkBAE1jd-4BJJ|lBdo)kAiGMqm~@cOenN7A z#S#IWvTW7oC<7DJj3LD4JofiTN+I9dB*=7a3L=o|dgvZnm^_hdt{PxGU_y=q;9||A z16rme8iV_3+L@m6|3RFh91apAc%y2;4f*dEEtSA#tX}W^jhs@T6=gx<5?CB* z2CRrDMNgK%Y?x4Z+lmHwZB}p1#CZv9X0VVEgWLfn083PlmB~Kh+b1zYXJU`4O`Cz@ z=S+`CU(Pkh`{hePf4&i4!W1)p_C-Gwu+t#%z~LnN24o$(`F#@ZcvvOyklS1Vg}w+z zRl1n0qrD|YV`z377A#Q+fL;;}4z(2G@{x?drgk@#WYN9m4-AVo$;aGcB$*aXO>i4G z4&Kjv?+g>wV*4urXyu>a{(API2-n;3u5)2u8tF#b{E+BlT6l7N=VXH00YC1=tBaRS zO!n&_>f8o?0&<;tn*{U&Jxthx!<}8KbM2k06v2r(+QHebm2gom5?645m75dtw3jQ;dRube3pa2$ zstF4*(8})C=g#vzm*c{jYH)BArn-_028sQYsMEOqqf)ws>jd9_V)Q@N>7T!qmO(Ai zbm3BE=E?1Y;YPa?Cm}H2gmi}G)e>p9| zku}GnXBoTDsrCC={(T|BM0?PqosYV^?>A)&>Tz(tC$GdscgI8z2U%F7)jxiVGTk>} zOLiNKF+@0z-xmG?nY9H9<5ZhSn%FR-*D2MiSqfKuaqy3dS zz^MYB70KUzSMSdY3BOKff;*|=Jk4+Szurk{)U#x4;W)bge&S()@UzLhxI7*4PuzQW zUlfvpDWvCCdsg64tzfa6lkv>0Ra`VbRSk(f63?z?o^A_v4&DX3rN4vaPyaGA`rqH+ z??3>5t`E<2I`VkipJ#dQhdx7p@A^MEHjJD=7c5S}Z`5pB4fb3vn@FT)5c|e(o6A7T zkKFeWGC5jG?M(L~{5MtdW^1b+5jEH@{ohs@4sbOAv%Ws$myp) zk0GD|!ZAvIt>e^0$dcosY4)i*=Y3&Oax**?7t?t_YTF>>S`Ho!{_}SJcy&17JK#;e z9{T+a{;y-;gu8(WX(-kD<8k>$qY!3hG05>V-02wk-gy zE8lnj**%iQ9l0a>chC*XML$trc+fXBc+*fN0e%k;v)J zgkfns@lYU0ncH-o`!EjB1DS6hOeHmO(1zKRuYhNk8owqUgqh%Zhs!}^;XoqE!kar) zF>Lo}p|F;1HF68_dYlNl|LpU9!{`2{sRDESI_=l$cfX~^ye zS>f7D!f>Vic8dj?>(YhkrI^<5P_f+yI{-B3Tn+LhuH7A|f0&_qPekq)2p``97Au|$ zCSjtW@A(k&8BRMKN=2sEcefUBFY_5H#Pgr6**Vls`sL6y%`5o}um#uzp2~d-1yksL z!a@AkMy{cI7MNO!Ma%^u&&^MiJ7m+q=~IJxT1_2Iy_rJ7in%253}|6+hk>57wv_5F zu|MJAlEWgfrylKdYLC0X-Yd*?^PtfHbegO#@9ghDn|PtPnZ)CO2h$L0S{Rj6Z##5u zdUwK>nJsU$o+Io4%cS;1tP(`?*;;g(q8=)|x4#yK!+#bYy| z1nRByr!&<{tjMhTk9W=py;v*{ZT@ga{!i$VrdEUN5fJn!^!LjE#?!t4CD`9;XG8xs z^??KLfPg?F7ED+6ue{~$*G;41^%kO5SEjsu3Rr?myGL$cY<_>+XX6?PD+DO<;Rm)l zB;jC7D36xEkjX_4)lNUwnOgSwUP~+I@C3FVi88-)$UC|96eyAV4YWf5)v^QkDwgR3 zTw@|FN6_)xtYGc=5TFyL+NV%ongU&F?uiAdtQ%aM$Z4pSm>@k@POPyd8xr}LMT-XTB!M)lkTZ?U zkz$LhAcflcumP}0I3PiS9@qzBHoWeu7UrYPt~0Nl`lBrD&qx{$WI;2{LD-P``W7eg zX<qoIYyObl?Rw4w}fXU^H1$HhuVc=)$(B0p${S^J=d& z89%s4_kHuVNc;qJ^byduT0P-UIrx$q*cy?vU6`*C%*U*Q3KvBDn5PPpPHrKGmfO`} zys1cFF#YLqev!4es=n*$=^~4qcf)I(=2K7M;0k*OT%bHDDU}I9FRA;^ya(<|Kl1s) z3w|`R2vbRIWfh4hT9l4!#iF&ha+4L7iY{JaQdRT4S#8LP3f?UH^?;9pCcTRA)J?u_ zt~|WxaWihhJVLCA>Fy5ooK#Hg;@RqymMI{lx95)<{{MLt255{3fya>yD}wWe~<%nYcC6SHAB& z`%Y?dVFxnOl810^&`*O`v+cQ`qgr?$@*s)(E$f!W)L(&?^9J@Uw&92e`(4eeef`j} zv!I3mjD^~7GIZ)X_fwcOSpgVYW;3YrZLP>htJ0E*poCh|U;iMDiiv|iHIJM`AREC^ zur;AFdtwv(SN#(L33p=uZ*%Ft&ler>|FhzzEe2|(dZ}VKg7k`6E~9GZ@f7N~Zn$n- zk<}15aD89^%OqPVJQ80k1^|#JYS$=-x9z5X%59p}Y=Bbx4EdlIn! zX=%H3!9ilAl8XE2aoge7pq;u`+S|(4!o9XUCZeirLLz=FFZm|47cDW|vy>ge z0HkpNyl&dt{L-IAf-lhRjG)t8NGie=t zutUTP6X!itLAo^!V_%L`hY1ft#D&Oif#J&+ub_N};7h0v%3Eau7xk*7s85nhYJqP> z-CCk}U_S7$0lXJ0{^l^H;8nNx|10GF-Ov1L$N3rlj2HW$w641NBNHwh5nX38f!#W= z-47u(+6>K)O}2G0M;h+~-(vuZY+58efYsj8Vc`}~rGAF@u?^CH`v%YWG{Z1W{wd;U zkS7ZEnj`)I^;0q5cHzS-j|Nn6B6y}fN#uLTHMCPWG6jKwXFWi0U|)EMcC#TbL|*O> z(WUHY)BxC{P&u!+g?c+7Aw~>_+o%6s808SdZ=Wi>`QE?DK||jy!wEDdh|Psm>XuoG zc)%y?7Hu8H&#qUE@2|Y3a8r0>?Xt!etg>=gKTvqM*;O43%6yN1n0z2|vs4UrgJUhh%Hv57D^x5O+vKx95Qd{M z_}~9)K+jFM;hOTF&+_kI`);E8$UA?K^pB)0$`1jJ@D8oc4`@y8hscZGKa{Pu3o3&U z%3M^^wBLvfmk6i1e5ynR9`bpEdQWXhl9J?*mauO83EBiBeejih4A%1sTDXmIa4P3j z%@{C7Wq2j~XL7mk-c<9844FQwU;VLWAwvEga9N+>S!vszB=C~^surqNs5^M15zH|= zk5rr`J&ZjTQv%!C+@vDW7++k61+1cQ=)-7eg{oqjBRVYLy>WntcVZY?l2Td{F3Qo@ zNErNiw(B~}1(+|+aAh?vjfn&F6ba2@c9i61W-RCtf%Xa0n zB^qa$xJ-BbT#p=-pSkIEuW%SFnCD?Q0hYNb4=*C!(HI56Q>Va#M$KeqT)ocwVY@L1 zEVYGeym#HN*kn!yEF3DG@BaM+Q0@3X7=WG&CDLcS{ACpjQCMl*GP*Rfc_ju{eQyXY1Bg>IUfAGO98|y9&-Ev103QX&wfJY{hc%3 zH@LoL9|Ttnk?-&L6Mt&;#|6zy#(f)-0pTq)Ro)Ym0hDYS>jK>>s?n1bBaPZgG)%h^ zN32*Fa8n5QZAYJKX}xCcrC^drEuG89{Cv=WDIqqj&s7~}e}GV`WFk^NxeWzp31$lt zx@CYhNrLFWOn{D4)}fPp5eUj}EwLG?!GM)c3e_y=;&EeYOzAAPOY;1DkGeOO!qJ+-_AC*Zq`M%u zoch`^a`Q5gnP%5Z`YX{`o}*Mr7n7viE({9`ibzQflN3L3mEo#C9pfQ2 zo_wX$hi6qYQd@lLI*W$C!-etcG_OkX5ZSo2pRY_?-ML>OP56+K&xJglWhZYJu(z4+C@*G36%`xDExJK;Mn6A*7 zcJ{}=M!gqD{VD$M|7M;}w1H_P@%X}J_~@ggZ+x#6D*5N~K?l+)BnFH_d`emf(e>)- zV~&7$#n4<1lGI;B5N`oNMzNnbQQ=MCh2o$R(-!##VWw{UV1G0K?2hV3w;@&gwJOzP z!GVQ(z|@+MDgiXV;hy0CYY5(-~T$A7;B(~k_dX9%yN$6}$_j3pybJ`GuB*M6Ah6jj=4?Q8T4P|odUWXLer07Khs zT``d{eLcWv{R!0yXNVX-)J_w*)HJ;-w~h+0d`G@a@kB|USDcibl@a__nw^w}v_fCR>PP9om4w{gr z#X=Xc<=X{^D7nrNw7wdKT@=#?y8$g|h2FYLU=`%l=5~->W@n*It(@;KGSHR%5^&dZ zFZ0+=a(PX?h8D&A&S^%^beFb1I>kgAxV|61dcq)KChYdLub!g`s9hbc!LcCRVQikY zsvo1!OA~#VJ5`-Kw{@)0d=y+|t)q$w)zM&x+r&Nk{Qg4C5}Fw+1Im5X^^>`xnKCB- z&r?1+IM>R3A$&j47EFS40KRRjX9?bXA>UFmqHgg4E4Dd*t_|u|shSi?z8V^NQF`>; zd_B?jX@iRjcCcplpXbOx0?E3F4 zOF$8;TBs|qFbe^SH+O)%JOFbDt@7)D$v~9Qh}}{0JK*ge1j5n2>M3V~8c|`yGk0 zZ-zQBd|6ii>}lyH=*PM(9(7;~>(;e_ka+pDR1JGX8L9N7PC8W_Ym@2+<)4jHV@83c zF|ucSP(@SoBR-MgLVUs-XLNk<>*Gbg9i=vme3nS>;t#LbCN89AV`QVY_!+!E-Crng z$JKsY|7ZmmCMS&8IO!fXfwphC(4uVS)~=qT2l|PQtMmy| zr@Y~C4tU`Yms?Y)u|45k!cVksqQrL9gE8$J(NVPC38La@sTZ?@g%MgmE~c2us|X&^?oi}_e0tnzw#>n4&c8DaqcZK3Ca&ylU4a(RNsn<4;xwt z7Fp3iOKZN?u5ro{0F>xaooCaJ3PIW!zKP}6Pnv?i-diP6JOWMfH~3w)w6{ck$cLOovS_?>+L589v$FcR{_IllP4)&LjzV^xbz>`>+P>t>ztlzg|p zIO6%~V#;&X3#cQaOu@FnvxR!n+m9R8AZ^ zrE$53Y#~$$=I8QUK6GOh{TIc2_hJpj(mmTan&7vs`98dVT_Mr0KH zU6{eNe|vMZ8f~1VyuG?xFASG&=AkUxJ)UO;kC<+wHp{)P{u$aY>S(jH&svfF@lBY5 ziUWiCHXgfo0}KN&3zeeDmc{<-e!}T9lEbm6*wOu2<9;WC>G>vD4LstW2H&j)`U?AR zSDMXTvO}vuAU))+0X+im5KsC)#cdcVBytDwNKVM(Ka;zI3dBc+4_tgdiYi=BazhaH z3ps+yK!{>7kHdL)tv?PBaXP0bgj`QSq=MxHZp024mf2I^0e;vhyl7*TtDD9o3A;e_no+6d_CuCgm$fp> zyY?LxHUxih%Uv6oBAx+cw_`nK^f`Qjz^pFlUzGG1E@*>6UZ|gUMdk;LyH6_5*v4GV zLLs+9@U)l87&L4GW0efntwXa_llQqnGv?Mlc6n?$coY*rJZXC!@r7uv3 z9%GNJ;jd(TnOPLUh0BMwnB+PVFAkU44)fWCq3RxB;J0qOP?E~QYN4l-c@ruy@jIz6 z(G)<)R(^eK6u^&`Ig)zUMs-3Dv}n8L*zVFCjHHE@bwX#6yQDfK`Q3f0=d#D(_N){UK12{w%aZE{n0^Q7N}-<6Q# zMpGZGwOzo`FCH^}P3s-#7pxFx`BmZE(G$U@3fsRAi26M#wc)Fs-wgxY{j20iQRc`k zOW#rsmU%f}I5j(oHu-9fUOdk}tI>7vNAQ?ufs;*0I&J-L%RrcklJVBNYHM5)23Mp@ za#!+tg=MSXyoUCTvIiA4MleZJ-5fBoPb<`|?g3fIYxlZbSyrvmb3Fru+6PbYFsO_% zB;4npAV~Aygl78KiBGM6!azo9GwZ_S2wku_KCr+`_^E~VLTsZMuzn>91uj#dvFkB`C=D{YFuvwrzDmqi%D|7h;Q2Jj7In!LCO#wX78F;x%y=Qj3=KJ!ZC`G(I zO=xwlB>CnRCxD76WwOZN*`>`xPIXZ!`!ogT>OiNM{iT+yD_R$oh(Ft5(R_#n*T~aE z{{0j9nk$}yz%)C0xchxqTncyNI6;9V{`rN}E{OgbJQ=Sc9aX7ESr zwr8MeE52C=WKhS;d!%Uxjh7(wj72kHay3O9F}f<`+!)Or7-uW!ug(>ERo8r+4Gbqs z1SUhc^EI-2Vp!53kVyA0e96bWYAggZhfo3d&@{O-IS-1oA2VG5RmNMv`^y`bQ>r1; zNyd)#U5!iya{bz_D=0TQKX_`fzd1btZ;GANgVPCb+)MTI$KsKRGl-WNawfTs|9e1t zaFihuTvkp!{Kp?%CD{ZeVLMC-KiTCJIUsT6!~`e+cwthQXL}54u$YJEWn%%=rgOe1 zcwTXGXvpW=mosT1Wm&nFUltQ4oMlL32mZ%kP9rf`_c|ehsFE-1+wsh4rF*q8+`0`ogDY-xTTz!Ag`a zO^P&*hs>g>M4sfC*A7HiokI&QzCf_m7Ew24)gY%&%EysLsX-~GjeO|dbjvBvPtTtl zc|l%W*Uzjw-9Oe*zMSq=1d-)R>~>kN0yiiaD$19k2_)V2a0RNf17z&isXRbB)7hXC z5wL^f2(zI6pxlwGFjB*7HLrzGnr0q$Qr_s4#vbKB7z79@gLf+%bktIqD6gB5o?B+oAO$}tCjB@g4ejmmStH|#E0J_)&*HxIO`i=SjR3}KTt8^ z+P&lnNmAME>8=Sa?TJ60Y7Q!2tn6og=jmp0U%)p;kQLS744X>2v_-PmcnCZYt)hz` zt0wa|o`9e5`_;OBeGk^En^5NN#N%d)C|$66+dOAd4U-Mg0LBaFAQ#7AH*ksbd(;JF z@OiVk@a<_YHzMakzFDPTx~YAU_1B% z_Zy#()P}3rOx10uX&)_(v1^wxRB7yve*@5Dr+){!zY8Ec8_9Z>c#nAz17ixe6JJ4P z8^Tv;QvedLPF2PN8y&KxTh57Q!<)fHgDNj(EJzstSrN{TB%vl%cp<-eGdK};yBgla4z>bOD z3&4iY*nF5@RW3OHNQGBO$TZW9-V9lag%7VEoVgC5T;!VsScgSVU_YpxO76b8VN2D% z4$~g^J7iiL_pWKVMzks*%+!8qI3B#{o+pYz;iH?r%e+)~u4navmqxJ(1ouvlyIiwi zpn4Qn!=?k%A-!Xg8)jlnsLp5@sZ#*TaO|#l!IhoZLT7Wmq9VbF+(@v8q8VldP1w%! z(cpq|Nbz9BPjAU0_(lO=uO_z9d&sebw|`kSAFk>E6e5682`&T5LXMkp)N;tb@7tsG z54z)}*^|~R8fz8V#%~V)0(Ri7)r9i<6_b?DzZH*f8JW`BiQ#+h+W=WK=w&ONo%KRK z;$ot&uxe-NX+={AIi8qz5i10#TAY2HN%98dh%^C)o|9Jlq_b+P6@W=AAD?Mp!0Cw7Xa!SKEVT= z-I=!xurg+-ckkDA40X0hNFRj8yehM=Y09>8#4Hie)vCh&rbVz9c$#%D@X+G67ts9= zy03;%%BRrT&Y?PpGvSllV#(`RC|&43y3l{wCU5OsegQM1FYMa3tNCKrsMH360#T9^ zhpLb%B4*#eM@bz6vG8F|izXyk(NVHb82q54*cD9l=K!`;i@6)ZO9uwDBQBOOIGTJ! zIqEoOvFCIXuyoh9hbx;(mgr4Rk7?9d!d~_n08T>7OqR~a-)KC5t-lv2gJ#NA!K7(c zknH0SghHAEZfknXCnkgXr@eicjyWi%98TZO-t)*$uDZ{2{AKaR*)OqPW3-s4-n~&; zaa|dJB%3wfK5*5zJLM7Kqw4zL+*mUYcF$+*CASInE~GBE0}+^i1{U;nGi*lZSAg$9 zno?ZuJw}_1T;~!VgUBMyrj$QhkrD!cxGo3R|EeYS;8-#y_ZHk2{J^j9}AKUoXn1TMf&N{BHqfo6U_E!**o{mUa*LjA(!@TR`ZyoEC1{->p< zU}Eyi+otS=j=3x=U10b4U`p=pyb81qO{&>)eFbC_Dz2R2nM!F`O2u9}7w8<~v&5SO zGx-L7V9a&b67KxK`Svo8{(BMj_&PxW8)>H)vWAM<5~8^V_9eW5SSHo^22KM&jwaio z=dfEkD%VWk=s56cVMlw@J*r$lI6M7BA ze!RRvma&x^c>V+vVopQW`)rm#fN+?}`_-^#SFZ+yk^q#qoQI%h;;4ZB%nG%A5n zkps;OkD?Kf(YwuOMES`W!A!&9gexA`hED#ZN`4>$VKPwp<-9dx`yD`ZkGwf!sn@4Y zcJzjAy9o=HTu_->(&$WpFqxf<6q^1(3wexBd_cfE4tHTkRrLP0w_1^2Wk+TR<2Q3f zFDIZ{fe(ZOo!Ai#Ub#3L066$S{uZLfDCd(e0>S8ef<)gd)ZFW(o^lS-reO`YvecTz zWSqqtd^qByl9qUVrUJ6qd$O03Iw0U_2Y3Bg+v5hVvg1fbbUAUzrO|LojD^bibCNfE zsruOG(D@y&ZYe`h;`xWJL)%1GTIN%vS88(4F%8S>%lEQVa3Mchk@%3#jZ#I&gK-bK zj)*230?^A8-IY-LFJ9841yMmzBi~m>G@$eKm%!Sv zb}QYx&OQqywv5GLW%4k!11(t3z7Wqlqw~9O_FCQJ8>zH?upDiCpA*>#Id4L4?sR*f zxc=d|f1YVHM1LQy6gb8ErmVx3Am<;=rNUjXDiAy5^|B#_|La~1o*>qk(q z_5Tif^HD1+K@JYAKY;}2DJqk3yJkc%F(UGwS@_wQG z<6GtS( z7{B~STf#u;e5N>sfjRDKnTV-#&FgsNHW^91e5@sbh1k>BG zY64Py)}Om9q$FredygWUWH3kw9IoQdZ(7&BaxrL(+)dVj<8;ZKttyRq$T5TF<7Z55> zxIGw4yxe=%TRE0EP1Tu0r+04*kb6(OGcS%qO4JciHOzVY|gSc%fdE*K%whfHU%(Ak?FcJVPAA*$6HWI^_hGH65iwYeX{tS zB?!_H+Qd{IL-g;}q1M19V}rPTA>VPBY0Kne_JWfalTJjgw)O)i;vA+>zJs+?1L)hZXL;84bP`@6>@^0!rXT@tFqv;J) zjR3=%27nH^HT0Y@>27653JW}KUD>RSJ^b-1p#;;Jtr5aFJUAdd4YMx3qUqC z3mHQfU{uCFLg&f)V6Dsb;*I28Y8}J;RRy+7df~IzgH^V}$2l4V@3Xre zYZIE*NoSYLS#YXK^$V*20OQ_tgLwZo8Lks1vUWW1WII@_l=3Zu4}l zpEJTR38%Y%*XtzG8E{ByR@@Z-_FbZ_c#V8DPFz@crn9)^aLLwr14U?Dq;GQ|Mi>wk=XEZOH~WtLB?hccIvOVe{ZZeCfuD9 zB3JL0H9E7_Yv}?zq6W+leeOQs3PM^Qu<`f=_FENz!Mu4S@WR_b_YuRU%ZHq-{ap$t z+Xye&4V5uw2WBnnXa<*_-GM9+3k{Cj3(OEpFLy!O7elb#V2#}5UUv)g6`iS&jYPd(A zIH&ixC^r1v)U1`!PFnpvfFlLc>g05Kg}#8~>^MfGZK!cwZPg9CE7vaw6y(x_`CBqN zFnGAoj+m)k7RtSJOXiGavqMB!v4=?1%$*KJ0@|$*Bj9L8Q+Kp{kWn?f22SNO;9Tl#w`cC~!caaWu&0jF0W^TYe@svrr|X|L8wzuW za>{?tm59tkLYPwym}=Ob3c83C3C6{=TXzd`CL;OBQp;R(0~xE*XY=LdZ51r`DMwZk z1O2B8gB?Cueb1f*_`N+#d6K@~N@{4}EnRBf{D@NDISuE6kcCXSm}`ZgE4j|06sH7q zE_ZJ1w3X3D9!Vm*=kd0gI4CHES~!fCAd;0Q#zw7Ff4rQW? zzKCu+o8AUC6r(qXZKdcH)blmF1?&bklqsYRENt-|fGylqw>yZT&6L(3QtNF2?oReq zku+(~0k~q#=R_NV`uG02Y@*a75DqhjNsa5!4YR?if5yJRQBo|iq-#W5K=b%n?XY^? zjd5{DfIoDuH&^!eCX4O+0$Mk-+D?krpxhav3zmwKJ_a{=4emv@b>z1_Wz&$x_n(i#RA zKJ9ns2~@y?DO$TJ-VbV(Fx@1yV?9{}8*Z^(YiIT`=0iFqTLV5?O8?HXM;XlV{Gbpu zjf@!ZHpq@a)YhF^%T8NP=%0la$=3~@YMt@6w*i+yw!B51PGPY*_G+Tr3}r81kF)Ox z2e)#AEx&+v^l+Jek$G;Yc~bR~INpm@y(i@iu!+_EA0(3t82Jh3e>pG`=?l=r%&))H zL`^P9+^t+X#3f>b8yojSS>|^rayTQIMG^9lkH?HR1; z$#*XNWAN1DBg1$eU%zey!`PWn5QU#kWY5m{{!9-nw8DG0=*?%Zh_CR=y(GB3LT+n*Iwt8R?jyx8%J zBU}lk65<;@k7vZLk--N+E#k^=a8i`I52CjUYp3V$I*pMW%AY$(W9!@rvv+ZD`vv>c zR0p7{Agj?2&<8r1a){j#A9GuUoJK`civ%BAU$T{)e=u8dZ2Is3 zxFvC4p>mE`bH_7Od(LE~S}eKuQE_HR5?D82=S^zAfpHTN8!ENeMO4ATh|tbMprGjrXFnuJvKp2KGO*R!Ybn09*Hk z*MKk(GC8861oR2e?~~?+-244HK0?5_N>m8~#@|tV3J8b7)%gCUZHrkN3b4!7F0(M& z6^2+N&BCDs^%C8k2rc%W#0E%dHU)H#%dczl(i%id8CxnUd3Y4cC~D32x(Y@k z0n3fiyxd5}Thms8*(&7eHcJ2+aS=9Nwya-P*2M4_G%Gt=izw`3O(5sk@`~ z8C!)C^Tsjg34c)4>=%NDJ(lZczaDy{j|KgKA(a$<;At2x!*)%TL!Hrl$Hwfmq{l5n z!=c>SoTPOu8@N+5R7(Ao{Foqg<-{LEAllE+)sL&jX$BS+SknT%S}Y}D4<4ZcC@Wh% zWC?K)+cz`39+2M1q^Sqdc?J@Dac5501BJW6S+KkI1;dR;}LZ{+Hnlc z-5W|(gJrU^sIKEo6+WrEz-gG^Rub)&mcmW-Kx_OeGhlU#1oloe{%hSVH+ZTXr`2(}4h0b{XP^{&+( z*k}RPle1i_V51dtzI{W~>*P>9q56=MdifK;EHv-*&nkljTb(O31)ZTHeAN@%R!A=< zNk(l*ek925_gm*C14nuz%dYifQ4DvC0$FbYGAV`cJQORZH(ps>oXF&e zkl4|&`g}(K^;ifNtJh1*`V0K&_3nfRjxZlo$FTp*kgfbllX?-lg$Er#!h~AO17X1{7{Fq! zno)oZ?S(Q=fg0R&iBxuzMy9VAW+EsPL@8kV-JM*5YQ8Mk$adQD$xGfMg&Xmp6IwGi z5M^R%ra0C~==cfmvzkB~CZmI*z2{yC;ff@@Ug1Tb!})l-!0l|7jL@f=&o4D!)~hT< zx5mlR+y(C}*b-mgeFs;F$jK_HUJ;7;yEXA%+gp5>C|I>kkd%(9-vuXy?ac;tV&?J{ zV9@iUn6i&8FDnRJkDmZuTN6SJA@<9R-4AjW#iOs(@Q#THU;c=SredN^;x1Lq_rQW~ z^dtbVJ(CfoU%I}sTX(7Ti_&{(Op1+sq%$fgPnp4GNr}8xMvsN`b{&r@Acp60uKpnL zYMZ7g=oI|-1Q+Gh^no04c`>!&9Y=NmF3)Z+cNyLi>W~3nJp~u zoW3lOyaKI1HzD3utnNqXe3K{QZO>dak^!;P3kokx9nWhZ_vHbJl6cmHZrtIal>tWWEuaY-!W%j2IDnB2e!ac^(ZH zkK-)3%>KH0(mH!>W#VrRSz_1nxFQvFzmy{^wc0XSJ{PH_$e7hx*v?>-d(KS5epk-rRF*_sztydIRLj_>+*p}9s*k=HFXqv zPu(;dH1O*AkE`%>)%vFb7dF{SCo_*<1SRB)S#bDeCYtC`;ALV>NM*AJW zB8D~^4G}pkk(%lk`6+Mj)GvSHUeh3vz~9%@V}q#)1Y`aDko0|@bjR~FXZpO8)^}C< zuH~4Wdr`bcsj0@9KZBTQ70(g_5qso(>mw<(I1dLtkg9min_>qk^@?wRcxe)B(FH`_Q z9yfF><=#&rjri=lSwW1}y;TF=ATitTk-Yo@!3}8l7)WtRUFR=|KRa9)go(jd-;^=p z_>(EFMoR0-sThi1mq?WQH6C=_)~jcxhlW0lzvw^^sx=Y`JRJ`O%T0HGQKJj9!?$Ze zgW17a`R*E3BgN6yDpC499x)M0# zNzY-WDjr9=!k3_?0ZP4vX@I)Z-N+i7`2qYqN}YRi z?xT6pwZTn=mRi6`>*x=fB{D2}Ab;$Idx1kCLi6d5;wv*dG{zWRjp$-T`uPh(ITFt0 z-ij^&C5YDyq~&7o%#IG&!OX+Y%RM?%i=ED_hT)LY?nhILQnjBhOba4lAq(ML5iFCx zwLnu5@Sep#G}T34-oR5^lj_s3u?0^lsYqvC`8!YhV7co0xAr0PhI+)aae}LLFI{lk$NNdHf)LUI4^giXiInFtD z1xw^PUg3%#^=N(D#y46smvVlaRDu8O455}XwqTbv;4K%EL4aNwlfux8yF)e}CI5%L z_YS18|NqA$%4n!a6j5X}WJktnNiyTuyO3E{vYnO^B}JK0=CNh3q|B_WN}&{qr0fyC z&lk>c-}n3d`~2?T=a1hX-+%7=bX@1UUf1jO+~e^C$=?2yPE#$cG#&CeUJugjCvQ1F zZ=akU0SO61TLxa0Y^CPhDA~_3I8Ik%xzP4jLr`hXG&Otc;1wn+=j(N*Y`4jZ#A(P2 z!mlrA_JzdhJH7&QD zQ_^H#3WTJp*Fne)jSKhz#)3)bmKpueoVE?`Iv{amfxPqTFV-ap`Zeb{MCHsVyZek& z!guI=Q;*vnX>4I#ir2$y#@~Nuqm=N?@+mJ1HtfmNxu0L?S9L+#gItJO*s!}3M3TZF zFQe=GyFeeR;QIi`@1~GvtPGT$mU09^&CCl?t$g9yCs4j{j?w2?PDa21+Xp8l-m6r0 zL}1JIS*;SP?f8!Bk+}50?8!R8Ldr^WB!E!q%|7@AiI4&wRlv`)Xxom>{f+&NLb;1o z|F@r`@*%A6?@m`}+V|g}@=SCtwG>MH3=d&5&&cyBTo1h*X4;p(7|8@WL>9Z$6{7=u_y| z2t@-5igW8$^RA065ycAL?s&3;;h}2^KvIN5qGnjQ7|g`yyRE$UScQYr^oHFqD?BP@ zgUr~_u@8Mv|M>@irQ^@Pd15cnHo2kSZpv+Z}_K%)JF!Fe_+|H#Jb-7n6v}3X3FuAyo?zW1)EW#*gpw z3KHq$O8rim+#k?5snvfTQXX<9At_3n(%t6Pc6MC6(NCvshrp3IXc1vAx9!xgf?@a8 z1eKkGmXA7$+v1awzq_l$P*3?$UuV>IEUrHWp~}Nom7%pIax8&EqqyG1!StQnTWCUH zwD~G$>$dhow&mFdsZqtJ>wog{_{y<`dm)7)gsL-+-4i73#~HF{N33$$WZq!L)y!;# zIi-(G^Gz=t!FUUpH7B$^6dTS8s7-_*AVvf*`wR{?|E+0}DuvKo08hJ5HB>9qfi1l| z73%Kz-cR7+sOc>-6x}VrMfVfA^gy{orAb)v)lV1(E(jgMBFJ||MM0KO9OP`p=AjK0 zF}$y5^6pl)ys*Ee$#I58Wv#rG3TOMC-B|nES!=F8&=BRb22b$;WT z5p(0~P?y+K=~(Ts;mKae+ls^B$2(^EHlDs4ciP#(q~5`82&r(odtsj0@(ER!Ou=0m-P}L-Pl@h;htWC?vb+|^$WB_VfX(?%c=R!e6 z8({9%y1KrTdziji{aqMi{2{=XsRt~C?KWO0LtygonpYbCAxMJfPNA7liLu)v zt79rW6BQrI#h4*KAE|mG3rexVQF(J=F|uyljPPmk_4~A1D({H}Iy{{&KZa`9V25v^ zsw??PZwUIH+g{}|6D^kX9FR3)uT#A&*QXQN3T1L1SUs8Ip-72cgZ*?Y-=oXWMyKOT z^P#`_R487dm+s0vIVUdwbNrfCao9$H9F>hDZ2J zT>uD`uMs|8-Ao5Ea{%E?V&neT{oe1*9p2r3Ot$s~-ar23EE=^kc<8sL@R?xIp%1UN>}!cS0)ZhVu-r^H z)S8vvf~kj8!*8J{zC;chY&PIAX11VID4iwG3$@34O0jVzz1;T2wu7g&OId2vS{c%B zl*RzZ;_qVl!nxEqEb7*VPq#auf54KF>-OdcqX9`TDPf`r+m6eu+^blfJ;%s{JZcc( zx<%(8O)_Dlphm^#&CZ`_5WPVjRKk|)EjE`-&Oz}oOJt>)wVGIA_8U#88hd(C{)y6{ z>WLk5pS!h0tHtjsGpe`k*K08kNLNtrv(^wi6@1@j2!xzCs6jko4pdTuw za}PX-9CU>gz)o{8y*)D$rD`Gal1-p$>zSyD;L!uj+|{?&pH^7Pj?GZwrk~c zudynfJenXoz$mXb8o48>K3ZE`Q{#;I6}{FPNYpXnSLN4MKu`b0cmZ zyvv}PCl))9xsU~>L$!v}aU#=H?*@_?slIB=vS`NB(jt7oy2!(CA?dW+;n(rCJNOf0 zR?j=Beuh*+U=yp*0nL7Es0ff_3d|mk{S;i;ZgLT9KYF|b%7OAZa-U^LRiCBl*w{MX z0(7x`UGlh9qoVtM$sa!;Dn(mtntJI$KPwXz6fzhxJZZr_&^7AI@Nd_SQ(#hu)Z(Yd z5IjWcgGX}c`P;$h8W?oQGW5pgLvB6F1Hbd;g&w4g?)aD6ayAYm*M?+Q{1Fb^klykv z==Q|kmlMX$9MKa>4KlMfj+HDHT#SK=6D6^xQqnI`mXc=h`=?ilCdtUGcK-^{d%_*Z zmU{q}9A{>vVJi~K!wB31cKcSKhftJYhuELv2BYgq=QI*rQ3sq!jNXNkwsmZhB4hK= z=(y8H^?Ky5t&*zo8=$sseV?W=g!O{CwM2K@9yn*idV)pe1tWD56a})Tsp>w+#G0HA z&b1jrv6-`#{!GZRcS~czeO;!1K}jeufL~No4H9OU7^c zuHROh)c{?TNkVTSJ^3hA@_|@}lR|>^Zn^M#_=X25@#+&0VLCH-QBu$W8VA}NA$JdL zzyUFr_1+c51jrdt7yG;ByiX}J7YZ-k3ub~4gfNVSe9iU&eUw2Rz8^CRwJgbx6={W4 zlqQsrU8TKp5CYfh=ieOhnK_)Z;ZY0wy>ex`Pk=bhX~Qei_>{89Wq89C>mAwVsEGHf z^gil0V|OXNKo5Ioh(GZLAK-EGFD-UYvv~u}8(NjaSLgF!Cp+K_vK>pP$N@x?<|#UHzJ5Wsv3~ivrK7Tdbu1Ty6no1H8xa>mc+5j6x}OrBiD1GfFYK3)e-j7eS4w#n9H%OnZ!S zo+2v|P+5HUSIoLXCtw}aqNaL|4IAJ>c<;|pIzrk~6vkMn<(eSW(iQ;X9{iPgQ9tPuxK-G_( z&<)dd|IZXopfJ)VmMx&Xh!SbXt6eDZ^XesT&V!ywk_|xC!zC6**zMGh2HI1%=fPZp z4_8!uQ@M9XWP)YQvE%8lt9!Y&IR9o%hM-W_Prxt}2bV89rxBWc>mlCEYAI=yv-^4{ zxGOs?cjzTR-N7Sh7Sv1E5{-f?&PoF&zI}Dy@a9g9(vy$2UnqW47>}Bmq#(0q-+f^h zGvI2yMb!x`l4p36z?{Ap|I72PMu`G8B`fzF^~95X7eQLbLx7_p4H#1lP*EBurk6`% zQr{8^XKTkAWKdxY2%}7|G>$k*&);IwP=-2FEd>_QiwoCEU4G}nuhzs=Kw9I~VXC)? zKktEAdcyR{79#Co*iqlDFZ-I)q(nGr=g=oppkSueTMbB|k>+C%4(VGiu^#WbnO?53 zk7COQu2NOsas`+vrpTH_xr^?82_%+}yc>Wt^i4|}t>Bott2-R3IUD>AEjLx4i)Lt!ZTd1javc(+{Ux7c;8hRJJakwXm@4G1KqeQ?c2b{i-K+&Ubz zx$q~n7CUKdO{Z+0hERou$wu)&~aY`j4U?DG9Xz zN43&w-O^|cu%$t{m^H|b^%tZ{xxAjFeVUcP=P8sHY`;yS#}%LcES6hQk$BsKrwQB- zM*!c`9Ugpha;GSi%{g?9g5_U-WG&mdxneM(%^{pb>k0+b<E7YCK1t)8Mzc*-3G_L9S+E_pk3|sK8Z%rrs?qG9x*7 zjo8`H!!Bu~tP;iGFE=z|KPN!NOM4@h?L64R_ui_5-#!WfAe~trR(=Sg2aL*K5wrGK z;u$o-2(pkrIqc_eTkrCmu8c1tSYCbnVEuFOFKk|->34E%i8iSKrw$G1g6)mwPzndI z<=ZWFAYZi@i@uvW&Hn_hv*?4i*8mZ3?Sv|J_c~t8dFzGgM(;WhmGxkdE{4{#JZCQf zyg)(5_sGY4Tb)q%wd{rF*i)(j2e3-Pseq_w1=T!55zUi#609QYASf|y1k^b1UHOrd z!0&#WB zZe|+#HtQg1w<9mM`~Wygg5Z)rbM{C1o*fsgHw})0{B~@Xj2w6Slx`hc3egs^BhEZ`=D?(_s)HP)msADqo6{w?E~7n9qN{Z?X_a+otuDv#WoxK&JSF@>WB7U+rKCp!rn?1M3c9Sqirq8eN&MoBWl z6zZy(!kJ4*0(B(640far3K(n*%%FrZfPZkR<2tk9dDKHT^aQVhny2+Xfte`=i_9@h zua&|#-Ou66_>9jVf3-#B5wvx^Dq%NBR5%LKBkPVJ!0kL`2u_AZg}P!W9Bsb~=i<0n z$z~13U95*LMyqM_bWK3h33ZH^)-&v7KcR7y3AD^A264~N3I%(tm}%o=;1 zL9OL$XyGsegD9kF#K}8N^(nqSiPEq=p5HNz-v*LK;t;MYCh6HkkivC>(VU(jInuep5 zoDo>QH?1%EV4Tk_enm)8@!H)2iB*|x{T3RT+ob@(!sc-aIAif3bK9*qrzXZ7fg(H0 zmQqjm!6`I%_F32+N;!z6IqP1-(!KVG5%>j=8#`K{qcXpKd}lUqF|)by2DA0ztvkqbR9R@2R(jXmmqCs`YA=$~f(y3Abwf1-! zx*?d{+R-rwlhFj}qQM7uv4=vZcxb>=OURoTB)|kc16!uG-yj}Y1OGdM_c|qbc!FS$ z=QJeNY5-tQ1Lc9L8pXbVaD9j;<*Dk1$BS#UGG6VyCppjYa`8lc-4{V|b zQ;~-4AOIlbb)9~oU=k|ODvW|v&ijl+V|X{d)M7jRA_t-j$63rD%OEHMG)Z8xFymk# z|EBNnJ9Japo(SE|1g~MYx7H|j>*#e~m@H~CHZO;&0>Epm2PGBpvKm_oZPyo|Miu*j z`_SwZ|M40FY#$7l{#4ur(QYVMIJDYIZR=vm37~dZzXikPolRHq`=)Lt5PC`KptB|- z5DO}*9$Z#4wl63n4xp=^eki+6#;K2;$gq6>T}4TL_VG^KSpQA=g%C6I=m62aC;ie zS2&2z|7rzYf5I@f@sd~CuXeSQY)ob>?`Nc-(;*%l&<1M*&Z;_QsGtLbKwSOF@mu-r z@wbs<(2{MbJ~)o=iMO)LjR$|?erl2x0zT+5ybpC{UGF+zM&_rK2U{nv>7&+MZO~!A zbx8^=HXJ-ECwJ2nQU;0`Em;&DQ?lSv71NTW!n7Q*V}15F)~6=Fj9KF{m^yVpmuz`$ zpubFjX8MZfL4An>zt>L`@NZy)EL4L#^xb>v$85m9RAb`S%87;!lV*J|!Wzc$rg!+i zz3Wg{kv2O}@HI$Y6EE)sXQ4NXI@u7CF-p4Wo(53vh_g~~T3wC8Mu}EhDE6>k>w8#+ zl^j$s6iPtnY2;wD1%ihB>i+O75MHFUy7Qiry=io(!sI`*U-z&Xf@$i)&~|b;c6_Sz zeqknxne01tksiUHT8B}L)@=_|0^8pin)Q^J{(8S2T%et!g+fLb2_A~% z4N8r)Mo2i@wLp8spfmD$z>xR1HgNN0!Y{QR^K8C!+xmz;lzUQZf?0v{9Q$~Pp!EWC zfd!f;-eg`R3TvV*hmL~x6a1ZSioR@!SoSb|>JtK|)O@dYA`DbnqR5lLaKw2aa86qM#JiSHuHA(!IApyjdKHJ^1q2+EaMD zUi$Dvw|azZ6{-Fr8SusBbngnN3d4*)VdF9%`7imBd}C+e6oJCK_^O>Cq<450r0PaF zrX+ow(1+{GPM6D_q(&He)U)3DyDYEPQx~Ppt z=SsPrh9SempI`ZXSl=aVo*OJj39=j!ryoOT;+bFg;1lQvegxwcn(R%<_$T!t-`LKX-G?Baebb?dSdE%f%NoEl zVRilzy${qQJm;Y|C|dFjG;?gF%JNY9j0d&oHk)`fSRkVvLKf=jhSKU#E%FSM8dO|< zLm>a+jKv1sgSX=%-3F4( zp~fuc;S~Q?GyRmzv7I3>FSYr>J{_T{w{+`0q2jdygE@i|UI9c{=v?{YtLJsoD%g$g$udMVij z5y&mqf`3BhQS~v?Ud?US>0Uz4gImF8zs(YKAr-0o33xug{xk>J(QkH)5T5C ze0Rqy7|nP#xiq#d<^u-#p_%jD{@SPm1 zoiNDX0r~dzkPsb#-Fz_Y4ClcUL4J!f_l45wcuPQ1bPR?O8fpwQ0ONA&%!!A`I{@jF zS>s4n4x#qZ_wMFbZz}L*El*C+JAS=)G7QLYE$6oD0*qp=Ffy{ZEl6mOR(=mckSoFJ zSk)!gW7}%AhU7md(lPNLk1T&L5Het>#&bU>nNqveN{+5R(XS1_&vsbqUXK7Ass;H* z!Lwxup5(~W3@a7bx1zkB5L;aCs)%w0o`{QA#=V|I-N}Ra_)`Xz2l3yc4@O_HFRX&Z zS13rn4xL+j2OpvCyi#Gv%ue-q1Ya+@QV z0Z8G{UAcy=NoW_KDUzD{1D5T2eB@$TqXw9f3c(_yM7E&eIt}tGi;HC~iFxp_!-;3e zQw?R{Vfu-a1y;LhrufScO1~VFo4yj0qlQFPy9RXvbQsY}Ks$9+3J5F78~hAx&aG+< zznQKa0!H7p*1pG}Ki~d~B6R!jHs~sFv=9ccb$QRWQ!nxW>h}EO`BGICA^Z(9#XkDH z6Qwvswj8m}qP-c+r=eq>hbYq}m!MWKXvn`O;4*za1zfN&ghRl-*ZL$@L48|8JIbO$ zReTSd-jPfM-t}|(seayy-G4GLziJ5foJ8h_96V#)wt z!7q=jqu7WhQQrEc5e#5CeO?(SiW(@#*RLD6rO5$fOR4b}>B#l&MbrTB&m|{9c`UX>W0Fm2@T|)?sEM5KW zso|j_mO+y;cfpew1=~+=76qQ;AxC6?7$9C=MF1>9`ye()&iZcia(ss&&ibni-JK-K zJ3nPZCXfdW6?k%Zd@tQSOGB-T$Ace2WPQ`?pkhzYMvhvp!nN-w0q=?C_4kGL(dv$# zB=a$d?XXby2mQ8zVegg*pAsbzdGm5qc2ZY`iCDm`+adft_`A8#X*a9j9Obh%=f%Y)XVD51T1mQ>$@eK4*@SkW>B)NgV(xHpda1Bwc zLVLC zPLg1}ul}He!5FynkH8sw5Af2mBl&c_{b5inE_V5(P}r4yxjt&U+Wa-%oMwuafzW34 z;OqWG21S%sg}w>XQn68LK%S>Ldd_6{EsRaR>JA{Aw@;H- z;Q)Rrw$=b@^XdEnwvN^1pg`1hyx&JKxHeObGv?FL`&b5``f3S)xxeC43caDf6~lAi zR$IKdLfwa|&mntZ6Fb}Fp4Lr+{ZKU4eEO<|5;C<$u7FM{{>7-hnxwY(!Iqi6c|rmq z_=h?XhJ!bJm@ZHde*`g%ebM+M2q5P@SX9p!5<3FsBl!>TF(Rx{br^H<3>>+*-;rB? z#4VuM*63~B8eUoJB!w0zZ@B8GNms?!n&2`A;Q|qedC=fBey1%gh+{abA#p)PAwQ>F zt%xgFC;mRETpP;QM@Ow+mH@m6E0SYhe5;y?G(ZV*4DTaz*^U^etv&(fOu@~@RuTzJ zBb>2Pw}_AH$X6< ztqUv;WYEyA$IxzH-jG5`cr@t_=u;N>6+OYE@BZ&y|L+d`+a0JDr$kK(Gpo~5QFbsM zsu-vH3=1}qI41(J?XyyUQk8n32QWg7xY=>yMHJ5wWC6*C`X^=o>n<_~sENP9okMOw z2-lZoUINC8MWPBH8%pK|04p#JQxX|&6=e+y=I=NuM@o)PfdF7iCtZWdLgvZoAbT?N z1QkSMn^6X4nRNpJKHSfRl&o5X`wCp8aA)^Z(sKTQ!Q!Vyx`sms=~wQWLj?9;MVW+h zwfvTSq}5b|MP5-vE?XSXa;omBk(M(L?@*CUx+ZWR+R&hLsJv)Ndf@)J1Krx zO;V6KJ83oR;G1H4(t~KYkPdLz!9qI2Jn8+_anEzjranr7V7(y+;|7VgeW6n@$-$6!th+Cl2?EyaN5lJLPuL8Nn zkJ%WmM=GPPMpcj!wXZ)B=neA%3sHw9x*Z z)%L+y!9{VEp*jTC#!-Sa#g|E0*)bB9RBexTO}UPW^s;=Y)b^-NJkgw@3q&tFmQjEu zyzDC64y2Ku7Ox{}q<^SxQ-(vT<ISw%Rr>^AG{m3op>h)eY9&^gh>toh7Q@n4B<(nmj!<+Z zkaz{I61SFG1#a}hz3-zS;qfGu@Yhe6pRkTvHWzc^G8n48;Y3Heg?sN1AFGdcCi#yd zac4*b@z+nPKIo{Ued|++$4K)v5jJ~AuNg6C5d8_!`sK!m!$c@5!n26)MKpJ-+0X`m zX-FY#FqAu>H=K8m|45u;5SR>$b_jl4L!!d}c*lQv_Qb>d>mEYS2MR&Bd<-Q!6;zs5 z>)rU^Fp=aOP%J2IL>PsKSKdOKYHVjX_~}&J3FJX|`H@K2Igd&C0#4#zaQaB&oc^Uq z^y0s2!3Ir_*Eksc^~SO3n3$v2QLSgoNT!f(&7GL4RX5yHY2<_#9@ruM_NQ6=89&+@v$B}OBa zqIoGOlApu|9P?R4K}ki!(7y@(&8~C4g$uL%4aedKCWd}*H|$gW1Z}MGXBf`BboJ8T zlBmI4Qnw_1X)I4cv3L75!ZjS~a8E@EXF0N8;i5LlE3>i!*iuSvhn2Lj#g=-lPxlkF zMCBa)u%$oUc*q}*GleJkjf;UqgC)X4F`n?nKvAwa;g-dqL!Y^1ni`?Go26KLD0~%f~0!lemh&BzQo4 zgye4GH?Rs7nlV{RURrI53OrAU^xIP#F1caPswP0BBi)g7BUm!8D#%cb&9O~O8%9Ob zstaGVzqSTT1ijBHTn~Cfaq(S*H$;1fKhPw*?*6sp2vh7h(~#HPu}H(V#0EaiP9q+s z#a|IF#(bls)QsFdfFta<4`vsKvDr@IMd$c|EBF!`mL9hBGgWsSPMOug4?FZw`Yo;4 z;S#)HzIuv-!J5b|gjFtX^%1x?^^xshPcFSu^aOm7V`RF8Kp~8K!9GaId$Z!^&Ny88 zLFG*R4E|Eyya=2tzmp%<M@(VBBtf>HY_1g_M(gOo&Xtdw2C0-OtN26_4n{j^#1c#3i=l__sA!k> zr2=lwG-xYAesc{SM8i*tj^?;;Fe@otYih=ebDS2`Be=4`fz@Z$E1ln%pgxi zmGWaX;Ub(OoTpH4D+}R>(C%674eX2MOwew-H0>Cw9VRW>RHmF+YbN1DPPG)2)U>cH zD%)+udvyS9wt3xB0{da{JJl3;k<2c+6|{(@ZoXy$o6^=cq}(|a0hH1Tl%ga2bTesl zfn@&`rJTlze8yM4iZsQ(-XAy}tNUJk_4=QT$#oBp`~GiixmtAa;+E%^SG@gL^Bo&t z1yA}@$a0TBa*LcQ$;^;3@KJRm>4}>`%FGhE_#dTA2W|G|G%Lj}KFypDYeJP1Bc(-E zDPYr`bessHV`+Q--KMuube5F!VL zV-rJ0)M2$^OhVy`JnmM}yCO`3-!}t-JULa- zZ3erBrsE*-$2qW3__@vD9LrZlYs2GBO9IGW7{^cRwE2d;A2wLCFkknXR0&=!M?J+) zPj)v^L@hG^zap3IIOTHedMY4v^TX$a?(Lgs#ausB!GFK^4K4Y?X&AXca4=+>5ck1K z0KS;z7CW*``j|`*H5G2#1IS+(yQzBDx-X2$_>@b6&VBYE&>a%AnV#K{BQiQVQCtHs zprm-~YT^@d$1!EKGDK#m)&P~Ot{h4JzR_DLb*?3|GJxEw2U1oT zvls8jD-Z0?asDNd{aX#;i;2@VSC&uVZyF1|0iGk!Y+EItCRY3RAM3i&F}&P3kfJwR z0EsXVHUBGB)JvVUPD}J42!LtZH*cs$-l?x<`pTGmC#0sHNEqnDzmtj&3^?v07OgEE zm~Pj41uV(}2il#}dYHJq=!4S%4&%0h7svly_z=9c zdbfVtD%j?@Jh=}Q-wG1e@YnKb+6n}3CkX1rH;Co{GQJYMo?xkPsJg=!9RiuO1PSK{ zY{cLG;XL^Z^FG5wnQQ}%@7g<>oLUX?{Mki6tk+4C86IoLDIAL?P#?S2s+|l834Q`m{3ro`#^SieORYs%re=E zp*~!J@0e8_CtrHvZLkInG@GS}QnzqFh~XiogEGt8$8i$(^@!C-@6TQ7LewdRf(yG+ z15Oa_CeW2aG!F#P0SNu@pRi6WhXZ&IF3p_tC7u-raBeqv5dlvPi4Q`y`s(Gi;8^KJ z*kiX&pXe2WP`)dVz!bMYD;o?g5j8YXUty`bP}gotv$_fLp~(Gd=bP8X32VaC?=|Xo zh&n^0o9xwE^+2h14O(9!epi7^V+&iZ<*P7SR5NR%{4Re_2&YJv%iy1OahUdV(#nlE zLM9^nIdMY1h%xE|wBtbjmq*EJIHo6sk?SC5u*dMP6~fjMo{z}`^P#YWvXbD3e%*Jl z>1C_bRn1NsZBHTX;J`kKs)&b*lfsdGj4QNnBX;z(XM0iuwpR#EuTdB0 z-Kr`8&rfC@0UbQap3)P=D&H!6%VAi!ja<7&%j4#shku)!tgu^?A~UV$)#bR~VLgez zn%v>VOY-{66_=hpmVpUVPnj9b9{nZ!+6TM$1zxUGIep;sdb6O3jfYFgR-YAcKk#Nk?BZ_X+rbAb?t`lRNs-;%EzwT9jYXR-OuN<#1mMI- zcg$h{7vrefPQs4((PV?`zrdF>!Xa|o2YdJhKDJA9Af-Bp?>^zk(0b!GSMLry(@F&n z*#jr*FXsvpWTy3_b;|H+mQkYF@iC(0tDtE;Wt`F7@NC|osM@DZ^?9#_bh_jawIk6m zPecSL+I}jSu!=e=UFiz^LYXD|%}bjzti-k365nV&5&p18l1Q{*u$TEz>a0=o+jGee z`=;l6_6K68V#6DhGY8`5 z7ubthq}zV@2~LP}mdL$7vT9wAM|&L!pd+=;b?+oGD2sR&HBzo@^?`B*fgGIN9)1 z88o~_=n0jfD8t~1xYSFqlmh3hZ_)|XroR1G$q%xP`F!u{M9YQJ*;Bz%l$xo3Lb~lb z+l&l^i4IX>I2=x=W~&F`QG8Uot~bM<6!kBZi71ufgMBko?>vq#A=^c`vMCJ1bL9RD zIfZiNn&3Zd_R)K%i_9HF=R0*PuI9mkX$D1(w=_gqjbBeyhSjlbRkOAT`?+U@Ng_m_ zJwwr|xiBAYR)&x49??t9tFw+1BWxzFYb$vEL*wG^OW#EMQtNu&48OtedNEAuBHKW3 ze$2d7{kGLPzp?$7dOx0A=5h35I48;>D#bN}6118~72W&ep6E6EJmUWN)T!#)HUpd{ zSk;p!Qd1~3*C%OC#(ZPy>^v(+5c!J^untwn+$yV%=Nm0HWmxfO2T#SPX700&*+5tv z1?4f2E$@kZ#m;nolGE;ezEsBk4}OV6@dryOq|IjKXR(=|yNV4Evs|rd*^$=+K@`pG ztPA0nRGepA=2KQ{rv7}XJlJSxc$dVvXp{Hjlx2K6ehfd1q)O>nuPM4Cysdrzg)by= zfBqy85}W8Gfsm|rHPsyZn8h%~>ZGH2l#T3etym7*ZRQ!%8yQoqvTa3;gZoNF1_N8c z$`v^?ooxvbOiclcUZxByvz=~s_Zr!o_mZ@mlkHm9-jYqyozio;6g&FR6E zH$OW4$2GyaO9AV;Hl_K;vBm?sI)b)j8l6M+0xm_yXQt-4b?)Yj+Fjah+T7mXQYXDc z4=*1JMgT&4<30Fr$ZRdXd-P+B=0^J>+`!(ZPF3+eWUo}h)udd;uLMm@kFf9JJ0(%* z$&Q_O?7>@lofFh4VM7*;0)E{Vas<7#NEIy9S@Wx`z6`fmQflg~N#6XSc>aJl7$=!Wwxe`AcnrR?n4TJZyCtJYjel!#y(YEkR1-=DKN#p;ncQ-(rIH)as_ zz|>`u=k4L)=O38aGFWYP_DMIIYQ0(E*m5-8!m#heC`Hw9J)hm^#O)oTe|65a$nm#J zCpixX#7&R}BWj=^&75Ft zo<9|Bwb5QW!`9MObOjl_rnD@_M#7`1f$|huyq^ZBr|5RE+ja(~I6ENDwe9R~Q0m;E zJ>KnmqOpWcfJo?zuZ0n$#QuR5usnau{7l9FC_w_K7K2Fp-A6pT2WO%cHrjiR7d+6D zhgpLJW}#`7H%|PdzV!uu4Yms^<-UMvDz|-di#p%wGJI({G0CtbDu-w^hE^xeedE<{ zYw#-~a(Fa9&^=a%&zZoK4qFpzkLho;aqOZgBoiso-;ix*#*$*i!3DvH2ISU|@haRrE)4$@@iQrLp~T~b4`2+NEdYf$e#T4w#E?wlsaVMJNE1^*zjjiZdEOkvr3R3PFOEP%G}-&WPZbK?PIy`gr)r3AKKr|gN-tp;mqGZN%1s^a zE&jG7QHNfeiQ9Gu*`FYCrxC5V6Eh^s{QRv;Vb)LLwj>6@Rt9UHP9+f573$hw3~#?< zsRasGdN|Q=A?}^@p$D+?1BHCVIhjH#J9_qOQZV)6bI7}0z3!V+OrsWU!py)8Xnh4ODiS5E}jGS{5tjw!NQNe zP1(6fEe8%1$B@$-)W!H#YO}j2DLyXYYYX6cv3s^qmnNNk#J&77;9b@ve)2aod;eWn(K|>Ilxxb5)LP@I@@O z_?;l)pM=0guf3+mLpV-1dd4}1x2r$64f8xBm>P(YFvlRwZ&(c^!>?lCNqq0cKN(VX zPOY+9D3~gdNe^xlAiOQ+J?N?0(xU@}`#d-vUG1B%oX%hKWbX=-lE0LOMs)wi=n0F>Y54wlH8JAN_kidOJvczfhO2txp0M}08S5>SoV!7`Ck*FN zG=<(3442-dVW|;#*e+RGRs$EZc+JNMsj8I{`@nf z?PlNzd;%&pLS!)d6{U_8 zQb4zuwJpi-T@5;x-{KSduwfa#O5Eo=Ip;^qQR*O>a_b_vUN@5n_on$9iSspmUnFtI z?nf&k8~=sG{kB#k61Sdk_k6SWJRoi^E&cDpumHoe(LT};J5qsVCmcC?LkI9~YgzKE zikLG7ey=y4A%CgFP)q_Sw?SQu}WU zr_COPh3CM+_4Zom|L29@#Oz&M_`MTYa*yx7?|2d>8SOZSKDI^4ME5@}d=)MmQFx9P zkxNi);gqQ!t8%;}z0!yK@GL|z`8SEe&jlf%w3cN4>}UmUk`3j9X#mk9v3m0I zB&DWwDTU$+TS9cJ{48t<6)pgmnux-L0x&3`75 z=rYVAiM+V3A@o0`?S2ZJNP;%4)_9rR!4t$=D}vu5WYS8kaKL!uRAkUz&o4`|Wx25E z-`ti0^)S-f1~Zk&R{h`vib{K>3%piH`p+tdpTB8gkw6M>){@(0|CKf|$TuGlPEKC8h;~|WZ^B*aNtvXjJ!#rYxjNF6Tfc2@@`WhkCh35~YsQ^K%$%&) zKg5CD@Jb>1B6ezE8J##-zfw6iQ$CieP$Vq-_1`ZGgZhv4l%$wyH<(UZYzlm<>civ`uem1JwSY zkkaV##T}5Suv%Tee`Qgrlg=l=>Aod9_g!V-_s?p;6kzb4AALM4Q#VK+Rak|yqUSo2 z3<&<>eb8vHZH%KfeL>Cq!`<8T-ifW>-MxF%AJ1sy@FcoXih@7EZ_If=eGQtw@EaOf zUjZi5Hkf~OvHO@H^Gd?%cgB4^tz5&*_z;d!+peJ36u?04rhAPimo%8pFKwm;2mm+p zq#_|TisZD6?aQwBwxge5M9X(~i?0B`7y$5lDZ?)j9{9OGgGLKIL`l6U&ZPHc0Iot+ z(CGs#r}yV*cnnz^4Z8d8n!cHOd(~n=k;5nM^B~wERE6^gZdYIRsYv2T8)L zlHL%#9dFYU8;?I^W3lalV z@i()%wGisHbp_I)T@JPh*G$WmpxOyXY!86HRnn6mTPBZm0rqjelQaLyY6Se=U$9Rl z!@F~8s;sp1Y;yo|S^|HVC3p*O3|Oq;w?_cSp$a&D`&$DSgO3+quD|zZ7#eO@=yVQm z91H`JYzKJwZ2&ym%^aq`yo1gl!|_Fzu!;I*c)H|Rxy2u<+Tvgn4+d=<*|YOY3Ctj& z#^XyO@Z@p=(@Pa}KQ(A$dm8YVpy{idwQcFflxACi?oCbvefi-1`?k?50NL7v#^chv zSdsfIh%CQy21c0Yz#!Pl%Iz0+bWc@^k8C^oczIDM=_}DQAW4;CL%H-O92;>)^CJ)M z{kiYq?*g#8uIplmF8i{m%__5bR=*W+OMlE759K|d8+rtA33@+YuBUPX50k%QgM6vT z*y!U0DTF3RjQ zysR*&R-wCS3lhoqZ8`bewgUy(WV~48xq$eS?`IQ41t^k_OkhTKy;Jd?Y03XpPX7gv z4eHDi>Ht+S^J~!Q%AVT->+QS{6Kb5OF@IUhKn|XK2l`jDDa6in7>R-M1D(^%;JB zOBQD#&qaVStulLPu=Sylm+Q|M{MTbexA*62b0y?Vdb@DBrk{h!-$V3D1uJ+Zx{wma zQklX+={MOXlso4d4pj%( z1(khG7raKp4*~kgY&llPux52SFo9qQjB{F)xS?ht-)HfGx0iQ+X`wV@S(we)0Mz5# z1Go!!XMYw6cuf{{o6YpbbBAc}y7bP(cN>hi;W8R=UY0+-s9g4~TWcySMRH+k;`E}d z!Tq5|3hmJ$dsD?Q5xywz`Dy(%iZW&45wA*t+NwZ~wP{-=#q}T^df@DLvbZYHLajjH zj&=7vqQ$1afjGVeND}$O(tc8DNac%ldyKwwc)kB@FjlkXERE;p#B3j*wuR>&07`NK zNQ}iEI$6xJqHFjxl2dba{kI7|8Gh~&B(QGf&H|gnPyA)bz$2(>)PZpFl$6gxE z4QSaTf&-#p1PDnd3pTk|Ae(mr{`B|RqZ!L@)Sm`#I7&w& zhhHVCJuTO|(Gl-Nh}kat;PTvP%<3zoVzi7rou%LalYX+KsEu&PmrQmYE}h6pcW%8K zzGS81CO~F&;Of6qw)E-447ocySi)_x zPT3Uyt`uxh6vo=tx2;SEQCV^R0=V2t0k7Y;^MMh*z$_GNcVz%!yt8wz|72#_S$9cY8*a)6Gvq8FOx^S7Eo#|ItIoZ%$H04T{46revJX%G zMH}3q0$KmOLI4gVAG-Lzz>pavV>6!42W@Qo38<5qfMIzFZJLHsv<0Om%tbxD!~WGK z&#Imr$Nh!{#gcWnc~)Jumre?R~`6tpop+Z|5d%N|BJ zRMrVMezar$x$K4Nf>&v^NpUm;UP`y88HU+`&~MfJ1heM+?yJa11PQpiIB}M9)kj65`5`VU-$e1p;QGJwM;d>at8pJd?cJ{jCZSbl-BLkA^ajcr;TW*#_OQcS=f>ZUuq%bb zAD_D~wfip*f($C+c6%5iaMGc96ec-*2y2!at=j@>+o(H9^8lqYW1?Bv0HQW9LS)gD zhLHAs66KzEr6>AlEkbn6Ex#KEtZ*kmCOgn^Q6z(&6-81eg#IJg2|bBV@Av^US`O&| z`oJcu56C`m1gh5au*=c`@Y5j_X?sA*s{{w6Q*-*%BP&n^0k*mC_rwD*aPG`SVl}~% z%1gXbhO9y~NDbMlw!z^$OdZQ8*1l@jyU^J_XSYjL6Q@g^VhFtT4qTcq0M>NArpW$W zCtzYRJ)UVz&@I$jStAYpGAkuaGrEK18ambxx+svNv!!l7UKpRYVO?ZRoCYjE>5+&P z%EBof%3ES99nIqh(m%CFkT1Qdtn_C5^)13WoOikc&$4u z6O=q3ugIBzLx6Fn{t2>lo2-`y7msnC1MHuL2fS!@o=B%N9t*SGDxP=YZ9}+c?FqF2NF|hgg7dg^az(Vx zN$V5*@Xpl@l8JG5f9+vv6#HP~IsE7cY`P#!@cF4+zOwHQ6Mc>HRMWuM`zm)5qTKMk z13}%MLC@2RXf&|V%@oNnS3>Yox98+#K-5#89UVAzhh4gG__b1tlDNTuyU23>dOi=f-{3FXziA2r8r_qEonSxY#8ILt z)!PnVvgwwE4zRyEVaDfifR&d%+}h6*b@>T59@%zx0HSrO!KJjN*^_k(?^TT1YRyyf z0~s$joVLxc6MFp$hLo@asJRzu8N|(ZJN5|%!u^=#cnwZ@q+2=iwz-V#bj^aXq*wg) z813`%75mI65J;7LM{*!BWDN{d4?PRRnr;IYtX2k|TjDRmp=^OkUiqF3ycROZEpL5Y zD?4=r6t7Gl9CXOfmPZ(IYJTPnK=*xUTE*t#4~8*kj^5^!nHm+Zpu&>Bk@*EWG^QeR zVScs>rdkHEegZ^qKY;m;wM$<7UK|4G?P&2SUD@d;&f25T7cydK<1}qGNB+-4EFg+(y+hU_YHj%-AbtyOJ4K;r37t7mq4)`F3;hsOLC%BBx@D zij*J(+oCk>T0$_NDT8UXxfgJ(Kvn$F$XiuD^qI=&u5w)5CgK{GJ{$}zL!)RX_w|4R zI7KZ2h?n`G4^4qLPq!KFUUsC9men30#4DFXqX)GekU*)6jIKnE)vKGE?5jC_Us)xm zhFq{;*}+UfDShBqmF#@x@bD)P82 z$DswG6Ma|brJRt%7J0)ah53b7*$DNM32E6M`Csl>UU;)2^ACqpjrjyd`)!!rS^;8{{&ot?c0|+na}YZ1anAUrpz4> zWaEE|xf&v5*~)#->Vjt2*Z-9sY^Y%@$<0GRG3qX02i~4wE4#lV?aMCJJ-FsIDM4qy z1To)hj%E1m0 zjze+gOqgWx3cSyE*~wo&e+JRknH{-ik=3Bc5Q3A=y|+X2e6WHIa!W)KN%sRZr+qms zPwYd?wLhd4hbRERW^G8GQ602668;>X;1MBb25#RW87y1d|V5~p#vQNlFyQF9V z?NG|;``{lJy@|f8W9-4-EUL=9uOi_unPZ2xh4w^|HEA+c-axdnVzH;wmA+RvZck3h785$STdB&J+N`oHUZb6i3U zAPm9rTk|r19szgUib9pN=>~m4Q!4Bapgq}RpWu(mzHv{38-F# zdnvLqm`l6Ns5AgbX^D1NrMpP5v;* zcNlPfCHNwChmyAnjeA59f;$3CzYmD7o;*(O!hUP2kViy6V8!E&MYb?mj_`(??UMg% z10v~>oY~msJyCdz+cH=00j3E)byxa`7X8m_oi3@+UaOc?=#KNJxS|b9zOivINp^i$ zn8{SHW6KlKH`%E%jZ@$9Iziz~^P4F)ZIl_4-tX6{#Cp;{#zfkSJhIXlb?2W{fj<8o zj?LOS6-vUHO|++G?boLc4yI@Ozv{n*Cakwdmm&_ZYRI|EY&n9tH&<1Mr{d6!cqJbL}aj?_1^%9J_c~x5$n%O@^9Wf$zaAvH4T)}aER0zuiH&GN%g6O~Ss)9mJ^gj^F{)H~?Fy}d zH4n)Y{f&MyL8rjWypJ1bmWt2mjH?T+>f_`_>C#ti%zvV=Y_47lfg1>9z8CzwXlVA| zFD4f&O;7AQ25fwhUsQraT!{rYj^2|xiT1ldmfK7hV-SfGxrx7F@w1HqevnGz>>9Uv~ghz-8c1`3>*1FcuXXrATUY74}5B!7;Uk zI8T}f#kBwmIq&1pw7x$>!XuL9{frHN-E4S*Gqjk*Yxu@)%>e8rL#82vGzWP`u#|;B z6=!8S5;_bRkpRWeu|l=)#qmE+2aK~h13J31B}X~c1dPYvl#r-Y%R+T(TSu_1`SGt~ z^02K|iFuP?>j<-<+cWbU$SXIOe)gU*?;I{^99f{>&K=DPUt^~^CUo6bIS@4e_NwJa z92fNO@ffJw#P>N4bxsAsgsVSP&r*7mdBq{H!sz8-xzu(Hg{mh)z|2AIxzL9{oNpf4w z+OH^{T1{WXkbwcb4M}%WU+r!LKvP9O74c5rDo>4W%#1%5LeXD?p$QxMzY+|T(D3^v z!Z(s#eSZe%r$dHwfyElwZ4X-A7ebFwoB>_aOPgN8Yj8WI-PLw|&iwkP_f9$~v7-Baf3G@&r+&9Y z`Dc}k+!`VIrL>%(!?AKaFSwf6lb^k~%)=wRwUIL0glXv%bZ z&j8BhpVI!m_HRVKKaPsziBo1cN4}AToPAx_X6?vZjowrN#trjz?FwIU*Am-K9|9wj1ZiI2?z>K*no+aJzvDwY201o%|3S-6fW~{V|7MjdqfMnPrk*pkqW|- z-?iSrO1r~?w5rhFE^c{hntN;4BjTQUmqRMop`y@9AZ9QXkCOi>{f}8)`I5|egy_IQ z@j_y#e%c$p^(0Ofr%z?vFk4p^zygg?CIW^2?rMcD62WsO{|)KM#d0zbs!l(eNIFc~^TQQ8xU!W#=y1b{o-98&&CngcSlg&nzM3i9 z?kQx!VhMXguH&Cx$hX`Ey;C{fx_^I!)SA36^bw31WnVhqJb7TvMXi=kJK-7dRY|;wh+aMTCG5n1`!+6i+PRSx6`_R!5q6+0gbnv9y1=5x^$x#bI zCoai-MqDFdjc#U5d6lWFLiUGO+z00;f8eY&5cH2EHxgf_xqEz3)hZKLu#1&g+HEOK zIS1~&Byt{{+JdgD7Jpqi)TGGqelFG+3rW0_g(N_PkO}h?4o?7q!IOH-nb7 z+ckL^idX#dhg<{^^d}Rk31)16#qyUjmv%OAl+QAffRc>TIm0fAiCaBqw|zY@UpT^3 z-^YIjg(%hzg5teI2*>*MKxOYfg#xFsB>_Dx|2&MbhZt!jX;{$A+ax3+Ftle&<$YQ> zXiP4Q{^Q(Q1!|hDa2yZq!d#_-IWhh8?~At>OEpJ-0#U#cTsIvNh(NR>V?1fuFD-7T z-A;?vKKOlVPE8C#pf?&2nBZe~z`z1~C+wE^x3?yIM+P~Pq_QozmaZiM3 zzxT(3Ca@m)_s%TSqTbMDxxMo9W!WJu+3VM}aT3Gm1#TqtaYCz9nl3#pJ9dKh?Ctb6 znfa6s_&fQ~7rj78gWmrAWJnjbk}LXv@PL93K*ewpB81QeRHivX_3G5Y*7EPJ&lR|a zubPMIVIFGCIl_X5{^l;H9+NkbO0Z@y8O!ppMa20fxAz@1z;_>E*-ce-}NB#Nh#QsjUfB2>zGTfLZ!e zEH3P*QqPYg*W0bj*Mpia3Tn4d%S%fg@nJc7|=25+8D5qmpv z`1tiNE)892qJ3}ICVq1Gs*JiZ5yKC%GO;dT?%OLT0RFR)Q$Cu%_&>W+pC&h^9*!v< zZdL7BK$MAgE8WQE`3!oySs9CrT%Lq)Ft3T-N%owBqI-Q7lggjn=J3h^m#O_v;(LI0 zaOb@vY2gEZ?#Rd8o|Ew@BLW!??~Z%&sPp~zWhCaRGce_e<`6j>iPQVPL8Ewh)tgg~ zK*iWye(@KT3bz?UPuK~<I`7QF0^I(9wtNi|s*`n+S{JXq&)glWf>C`6>yaq9G+LQ8LeWI(RQ*I1J zV5q;^nbsHWeIXT?EjxhVrvWTbxE><%lgh+DwdGiPG|?K%+U2BMPcDmP1j)QfhF~6Z zrmdK_-ibQ6|Hp(5;f&wHw$9ZZCH4_8$@y2${}T+OF&hJ!ZN3dm+N=??Db&$z^SRr! z8!8tD?^4Y0obMis?s(OXNSbaRK{jyl3aA7(ne8X|9|341E++r1@cDIPu%^|_l8%26t#TsfL=nIkOKX^qjl9Hwewf0!8V$^5RCG%m|gVlIIU;~pM)epBKX;|Lq zpZOo#?JdXRLndn>)Q#M3uv);7Oa@!y*)UmVc7>oOhC}KF*6`K0;$G8wrg=a(sSyod zbjq!q=*Y-iN^$c*`?QRs&NMp~vydHN1J)T&m2wUBRA^i}3ap3Pj$CdR6gl-1`|D7k8SN%ZL z;k(Q?kTy3TD1KdkU2f3388Gsz}p4^I3GY9cr~`OmDrzBEyIEZ@!JVfNPd zuYQ%pf&@}AXj$^r_8m~ysBD3+ejAc~ls|rftERS36J0u?t6)@Q`nM2y9+5E`YtM51 zJ7!`~TAM>WC=rX8L}O;>1%fIQjX=X=c^}%&#r~)81lou_M+Tv(X`)|nHWf(#cqH|u*YW>Pwdam zLDLaaKs=S`TR;H4h~-;qf!}Y*I==s$=Ivv^eV-lBbzTBHe0OFq$)T|=&}jD3Zn*WV`J(qsJgbx zd;xF2blayp^RLcJ`VS~d)0efzzd=AwC!^=`WLFQeaMMFG3McDt*hzIWuiN~2{3gw( zF4)(QhYrv;som6i5or3c`VX_XUDQ_nD8Krb=n%*rrw_q$78%&C?{_Kt*LUsxD{C|l zLdui&@Jem`E*~wr^k$v?vZD}<(cS)Dqf@q!=;SZloASQDZ2&+hDuKXp+s0!HjG?Bu z0k|T+F@F+*0*eW%DfnZPH_CqUg@bnS{?r0=tfpzTM46)CMQ^}x%=fI6D0_Q}Myv0* zeD&{3!;rQjhe)F^QGJW$4TQqygH@$dmj5A#_ul&i33DEh#C4KA)FN5S!iQSVRx)M?-F9Iil4l<-#x4Y(MB+~> zE0(!jLC7cCf~1uzz5b61JF+6NGW0~>OM=P3EqqIci;)A9V6$^geTor><tkvaEL*BcTHAY{1&G8bg?RyC2T|$$ODp(b)OFY zw|RXfSL3q97PMOyg1|QI{a8rZ5xVq-wSn}+YQ>uPz^+M_A!(g2O_Y3}5ydF2THgLs z+)BH3v@aPH$sq_92uZ1ab^+BWT7(_V{K)PfpA|DGhoW66!#JC#?#e=XedGQ@W$(Y_ z#P}q%2LmE}Ui|SEXR3NIXB-JL*bM_Gi|6Hra4s_=i}c1e>7h>{DKbex-f$6CD>oqPb_h^pd*Z%^L>g5w~9DzVQZSHcphv2^K(K30Yr zI#qA4#N1mN(4^ObiEGpAK6$gDX{Ug?EyMwyRbtw6Ny4A_BGLCrlkH#xNw?S|?~IqK zQ`5pI?S{0)i=YBysr`hC1zF3RV9JFlMy|~kouB^fBu);m9RsMad|k`yzAq7K@*GwL zAZh?AWD_agX?yf+=b1%|H=4LYi?DO--fOv5F6XZ&&`rLOz4>$HTb--t*auj4vU8jh zWTDsCp);VHdhm2?xXA@x6n9=`-@bDJzhIoVpvJ~USNR*ZD=}z^=;qWjtU1BEam~jc zQOy@P!#ibfx?8x_MZDQ^`Lf5|2+gf;hMl6lj*D09G}_DcTW5dXpA!cL*wprEXzbJS zb02QYS7zZ9iz;K@uwil}0g`rI$Mc`ofc@QPG(j89ux^i>tXu)W7{}y}L}gA7@SZCA z3!SH@MacbZ_P=F;nnUVfbGlAP*~EttVa!ARU?w8XTrSt)-3)?e^|fOkB6?UL4>Mi@ z5%?#a$~k|u-JhKMaDmb7O_%84`8{v_p?9dpjj_7%kFq@Zj&(-REe&wY`S_Jt*Z20; zNAt*U@Jjj!X{S|TNMO&rPgsAYBB$Pyk*s_xe!lMX60BHAN~8oKkxT5k=+svyx=h0U zN)W&D8OsNIE7sCgdZWbb%l=g3QqPX{%{DzlO{qPtQT@~7Nq)X3tDKx>EG8OmFnutm zvZeOwreI7MwfwMCd~!m=NeutsDDk+Wu*!rZ(fTHZ{H@OsVx|JhzxJ+m^zr;SDvG#a z2J7S-|C;N7|2&sLMSRu^5vOy<_%@*M8vv_RP3*LK;ZK+T{o9wyW0&+Q{5Z(K+;c$- zZ2re4>=0geY{JC~vlcr(k3790@3%;FY1?P<^|Yt3#GpSvw{PE!W$A>=eFv742cR08C8#HH0yX5~d@x_PjrNr1 zFecg0^2H4O&2;JBu}fyswmFYJc(qDUU9?PP^z(of@~@Wv__W)y@9}*s?qAF36U)$b z^qoo(3{20wR!pPz08@DK>b#zWJ>7ZU%@gB8yGj#k^}76;0I|>#RX8O+Y}T+yIBdV)$*;iG2Q%9Pc^^N zm2?9yd^%!k6l6I@qrBAk zR}=U7TJd|@WJFdspP6%)R$*{4cd}l|5yxjG9^ww!EM5yDmj7p33WHcce~c0~@D)(t zpeQNlnOoP+oTJd4;N1-5h947BonBQfsC=URZyH|X&ZCRJO-P$w#XLqhjg{~xF{WQI zALSv^TM!_>s|Hr^SeYG8OJqv)K%Xm#!vkkg7n+o zbhG=QWL4fC)J&lmVzWFV&?wXsI;=relCAv&K;7AJ5CPMgS@XC8xTKtPmG0zDKh>|F zoEcFNum6zpzNutR+Kl&D^_tejeZ7$KZTtAy?k1H$>+Fw^^k>w?>|&`U!#UZzlh3 zA#O_V!i%r7;8u!W#?ht`dGphQ@yWlkcK_B<>!y2ph%XLQTkFmI&o1+Jmr{XSCph=j zIm%ERii%NVSF${ur%?iV-n9}#`Z?Hz&=_lO{@BT;`%-YdRQrJVi4?}%w|~xxMm+mJLUd| zU1mD1YXT^yq14O0a!E_7=I&4ty@fBIiEpAEEq4N5T{G;&RD`sjv+7Cv{8P9 zo12JDc@Zvh^Us&1o#-7Rv18(c+c)EgI7gX3jzK%!%H{LlvV`jkkq1mGEcG0B8jkmP z_j-fZhheRWzUhgD)27MCo75(n79pbL-u*B{IE-uSQC)J?>und)yaZ+~VhB{wvL`Ev zq9(Q7aW(DUM*K3js%35?ZMiN38seM}GX5KV_-thAaBVf(VBaBG8F+z1cr`#Y=cN`E z0moUQK$P0Fs$#tOsALONm@B`1`S{V9XVQ56<>b13ygk`I$H;nddFkIc=nFpN-YNC| zshO*2U9RiVqqw#XPg=Nvwm5OC{za8x6)7ihuZC1HEX(M&!uiwr|6`M$EmZRov2Mv& zQb5FPyQJYsGuKN>8InZ|Gjuu+%Rk+ueaUQm!9)YS(w{TnA7r{;i=58$}$tUU<1zioPhVj|FUz5e) z66k#}8oT0qd+R`o(d}CzM#W7hwR0J0Yhr*S_e`VuaMmerZONg#8MGBE;S3i)G6ZfePK;b$;5J#HB^S2#P5+bQZBeCbY1V7WKXN0&J;-|yLD6P$SCf-wgx5)%$&Wd z%{$oR1M$JzPtB~BiD&%HWrQ*TxaD*LStp&P@QvO`HpP1~Eb+;~yfGGK{^6)ubiy)2 zHEFb$SLN*QD7uN_((1q@&+)-rr(UI}D|xA1eoX8U{3`=?nqXW#7zuVr@N!%3rDK5o zT2hp5yU&+p@O5n@r|I;IGq4_J?QhFZF993wzZql6Lm&@hl2B$iNGCil{Rz5}2abEN zd?6UiZjfsjdLW2Oi?G`ewtv*VZoGL+$3 z@AuP#?Y+HM&<}FHfF!{!Y6J}d)?zyRCNuuMY_zbz4OZ`#j%4W&pGk=E35DG>SEtbZ z^oFTMirR{2j0~+PWza@-V zvWoc_-FDmaByJaKD!jEdRxX`(a=L=CF#!qo-BLtOWq)_siA7F1t7x~F6}b(IqoYXp zQaa(;epL%;`y9lAvLE@jTXxF|I!U_XGSIN+%XOa!`r*uVH|-BZZt@boOIh&kGr3zB zxW3x@`30Tb==Xl`Tk0``KT@E7Z_6RGd<87ZdDTE`_O&@nH!_LM#wMo&_g8Cbyb$gG zQCnzKIawiJ(?kD6&O`&3KnBoBx3npNzZ2i{oq^;1g|FgeQj~OW_tj1S%rK^{~fPM zV#SqEg${@DGBYjU850#;(_*^-?o%S-cKX$CHFF$c&$(AEIJsB{_3%pK= z|IEKI+?3;t&{LUN$iG@bLui)$tI*-EpAaT3l{(z*%~y>osI^d+%`#lXl2dT^Zd{V% zp5aVIzTeG2T_7kRNXj`cpwf3O0pv6FB5dml2aR*e!gDt2)+4Dmdb z?HRoG|9|Iyp@4V@(Z=#H05r7VyHJG9#KG5`aqbRHxBO7D?eV^lSWdTL6saX3v4X{1OYzdlwQ1YOBdCC^NgGO z3aDuAAvoB4TOtc}b4+|T+CHs!+|`_>9SozXm!}^}vvMZ6aLmE!oZpMsa#&7W3a8~` z@VP*@#g<6eN0|y>s(46|bDxF7KXvn>VZe6iEEHaSzl-H&&8G(CwbcYl=udcl;>Wl8 zEgNO(eZ?35<|dMv-j8+~faqJln{(VP9fp`y{2pT+=`^5#`@tRN2+4ER#UUS0 zj&IglUt)uU-qp5l5?FFzSom$L%hbhpm>CzQ#*|aAlHEMVX(6mxa>nkk?rhrUa#ebEQAb!vaMV*jhSBb~Ip&k%2A-LXhXXY;#vv!VX zkH_+Zypt-xvnQfh<%~}OdcxBV;RX@Iz{|N59?S5fmMGvZ@L$HVD>0b1d zXD@rqrk_rpao+N+!=Ij4M?91|{8 zjZcWMP7SCX?vEvarM5$kd$jeN(~cvIIQv~~;akN&P{K9u0QX&cYj;hpdfCy>Po;p) z1OUCOzPicAY@i|0zW7{z^agW3m;U-Y;~u|lk+-)UeWG$$sHnj$NimzRpWZgWRJ4b3 zrH)4t?(z_+VD`Vjv)ML0r8V4ylAh<|5iin>FJqjSoSew`mLx(XdlGaLQ6q*gxO z_M@Z&?1%oy&CL_Q#}kp5J3i(!>Aku!hpmu#@#1`e85|ye-e_mYD3qA?bKnpe2LblA=h} ziXtACkM7ROM!tW+%PMCZmm1E+JsN*{qMK99@M*J0+S?M3cX{%95zz%!jS9%Bc-%$k zDOnF$pE7qa%(>VW?1L=nuA;zi`9&0KidJgSQRu$>R}QsgvW@pmIp_ofFbu`QCLcec z;4*7%I!U|eO&bzGo!X&sYsK-$M9ul7 zV50YI@vVD@Q$8R6Hr_f0b@To2rB;ort0N^GhUXqWZ(riE-kqLeEZ8vRacC=FJ{!r* z{zantuM~3+zu1wglg(o|xg`kz!58Xz8B8Cz_~V* zh&BQ@=UTlT&df=@nw;%h$}yZ-UwZes=a47~IP$JOzP4@u(v6k@c_Xm2Xks9Ceq`_rLO&+ygud4aergHMk__FBT>ZQ)?Vx8H1m5Jd_`x(t(#H;uhX-tRyHIm zCnCQOJbmEF_t_~_g#!Cd!?_7DCErl$`J`DYd2?M=Re(k9)gsT@@s1+rL?lf9J)TQ) zG+u;4;h|@9Ofy+E1mOs}^4Oxi#@cEC%|S8oCshY6l!Yo0_nSjxF@`ejnzCbG4BgdZ z<>=J2RYBaz&JaIyh4|E*>c3258cPuOh@={lP5mh)?_S z6JOUaI`a+@RBy7_F@hIO?!-=Y(m~^j#Pg$#jst^XZ!--F{8!Glp^-OCAnMWsIPT{T z09ne26`>8A?>+ z@V5{;OV=5929Wz3A#B=mom0(Wgxt*!TLAW~8O;A^%r#i61Y6!RYF!_@y&-%5w#pC2 zGc&H7b$TMD#rhhUX`_{ATy6KAQ;8>jeAn+w;k_Cu?;AOD9+x1pt(3^dg}1a%d?rBa z4S|1OAquuP7`G7F)|Hh&Zzb&@Bjfby9H~liyHx1GXHdeJdR$9#Z>dyG?e(s!iCumn z!zr4{{vvw0t6KJ!?)VPY*uQq$lkHTY2%!_d4Lq0o#31cHDgqwDDJp#Q#GBI&+K-T! zBKJmnY0*&*yPsMB$}R1UhC?e%II=v~O%C*a!_YL-EB{H?fZBYQqqu*i%Pz(=h#}u> zRK_2{Dp>VPr5x~6+312HzNb96>G^_tXXo#06T7)RH~Gz>5yejDm~{tEx;@{xlO%PM zmWWF6*;)P^1(fH>8N4OdIpG?u4s(9-NcQKs2jxr0?~2r`%az{UO7afr!D<;a$2!F> zW~lom%4}|S@u1L1!JK^SW~Hv{jElqaNzZc(ThTtnI`L=!7}^G|NrY_Z2F;F}(dq=a8dBVf;>m zs;8dTo&Nms7vIq(MVa)IDH;lBnLNCoctJJJ(kkAvLXPTpVKVwb-;8|gYQ)FfVG^G2 zE!96VNDi|isCDL6nX7xF;AAPsv(FaRFs?1%{UJC~Mz%a+oq}N8T2`$Pfd7U=bzC~f z8W;asr+?^{F*dcQH{BD9nimrI6lw6KhyM4k)(L7PD4t;vkOa^&{BLjOy1)SQKxW2J zF(V-~|GJhJ@*N4?LzIQ5b{Z$Y2w!h{&|!CjlonN4_D03PIZvt*Uyp28;ocv; zdGL}cL0RF}qg%EZA@vX4=K8McaXx}=BlyU8`BnBaC`4Ce4!w>3u~`dpG$dwdo2c}u zy)Jf`t$FPU^r}NH%D>Nl&scZ_%`JPjrfQY0&@WwcbqdgML87bV&N$3-%{!!X+}srl zDW}B!}J)7cruUe^i}%)xLFiU+|>HZ2$FPr2G`;lsgN zGB`7;@p_Q6eb)xF=y|ipROCwi^zGg^$O1lI3EkrpyR2q=K+YR%T0}B$?eb#}ggcSE zb;*gU@<>6}kt~GiDheUdZcv>4F(a3+ea3@vC zYs1R1JF}KoL6RQt%0eeBx_ap}%d0E6?r^u9dSpwqKY$kH=Vix44L2#%0J3!|;F+vA z#BItLG9IOI-lVan^=yjoy>bs$_*Ek`%V=GYd69O+BKFS45nCBvpIqxDykWzJRlEJU z^q(7$i$g#{eLL-V04M~O%WF$7HL#w~`MbMhQnX!uvv^;R3yNRZ#!y>CHH)P#0d7zu z>G?jTr>Xgb9C(9=RP*({IkPu9bQ!*`i%#EEOEAqY>v*qtxpd9>%XUebB$j2U*2_Xp_O5_mnv>4gi|w&R8izl~K>*jswb zy(5Rx5Jv*w&;GP6m3{X)YidpH+)#Ea?tSS71z95cdHo67W=os6q7EEcmu86}rJ)Sj zyhyrEb|?U~2X^Vpa+IXQT!lRvw`B?#*NQy_Y=Nxok^b)53oLlvP z7X@k{mx?XN>yc2AZhwGc|EteCe;Dl)_GRI4YCfylGtii<9J$#})mqx?gDr_h>jskZ z)%PiDoQ;&&Z9YOk0a*Lng{EvdPD$!C6O^nauKGKwZ03WGBO;?G_I(5+ICDOa?bukj z3|TqQcnldLYs?hG;3pG&59rhE`Ll(Bnn@RJyGowjxQz6W_rn>sc`|^}9Vs0fPDr9mo_kN*9B`v-!w|5P)!O@ zYe(gGz)F;pRipDJG@~VbN1KM~_s#VU71j}3^h(JsrMm&$?p*Y5A}+l4;m0Q1r)o{L z`knHn9@fBcoDkJ1R|oN%CfhwPGoobb^UHd^uP@t^SSP%{tmG&Xh#-7ULLEkCrEhM3PN|ZHq#b?a588Yr_Fu$hdaor)_6P_A?^b5*%vH zc7LU|cKqDOGs0i*3WLij$-m)df%dyapal1Lp@G5YLZy&3l8^1V5bEei6Fd=`7?am)>Y zyM48ht#6|cvOI(Y%$({?*LDnTJ<}V&aUhao%xKbl187i?cqm)0O^=~hP!3$VE3a?B zU4Hz%?6|_l=u_Sy{tNAXT^$Bnf@qp*>#^aqnV`M8@E7Z)NgNAuSTr|<&!(L~PWr(Y z37Pu&PQyyy<{j@Wb~Tqn`_=KY39vE~?cLt!0)MxByknj-Z_Ogy3VGuIWp>H;<20lJ+9O=-E?_8fZ!lMz3J0{x$1kE)$4*n@L5N z->c=UFyInn@xCld&6x%|L)R-JdMwdw5 z!!JdnCFz8fXD@qgp4!@(Z~IKc%g^iMXb3$c%g@UuWR`GOLHcZQ^>d`m(Mdu5ob-A! zYOSYO?D;2p3$5Q^Da@*aa*us+%gl#m(8HZiY^E6X44!wAc4*h&=8<+$tV7t_IHAgK zk|?6hnt>!--+8VwA3fzjD#N?!L(X)Qu=YANgeY*_#)GZRX^{N;`bN0PELH;21nsSZ=8KIIC`R*>jdOd8ij`sWGBm?pxLp> zKNgD;J^4d0!hMBjNQp#Tmul^SP@Kh^gXR^sxJl+kD0|OqbsB!Uo=|dbUt*UjtT)*N zVVHWVekXxMoWL9H8EMPs*U2(;-1h~k&`#e=LEHc^LlGI`nybI3%I(}ODQ_+_52M1k=$T}+UVMJN)t`GE{KEU7VlbK1HLu&T|E+d^WmdN{%$00haV`WFX+y(6Eir>_As zP{c}jq>kkCmBP^zMxKB#@`WM;0~Zug$IrFJ zFL-^{^tLg(z;Di~`#P0y)WF1?haIuuV7GLRNG>({EDDqFaA0Daipgk4QA3G`vt0y< z<-ULYoZmjHbDbYu`ixogs!)j$ZD-9i*{ErXjhCO#=lDV&!dUEB8DvBfaad1XeoJKBzV9oD1JB+*C1eQ~cV4v?Z zOe5t7@PMZM_TmfUgx&w0l4c zXB4#oSEV^cB}3hywEO%dZjr?F=;|hAB%8gGo%r+ogzT2HMw50kF-!3SCE<;8br;L| z5mBq>Wu++rA?@*oMNYX;9j(z$yV9;{MYFz>iIQ9btx;+<`j!n9T8ys-()UH7=HB~? zg*h8aPtL6S0YWMame1<(SMX(5kcQFBr`8M#NVnjv$0k12977Yg%9yzLyOdNeyz5d4 zdl78EviZ`OYw9H5%c`NkD&wnUMGFcz5#Sb-gPe zDO|FiT09=F7A)Clsiu@m5Obu9Rp`$Y(C|5mcH5?2`w9cfY4;2~i9g#DBm;1Si18Pm zeQU#SVt$ml*1+47Pa7C}zCc#Y{bulhBOkU)T(qVtbzV#*;r#xx4tJ+NLc^Ugh-|?CeLqK6o zqJie!g1{1H-`j^JI6l}QL5{p!Jw2d}Yh*Hl|GhMo_Ym*Q_f)#rck}0)-|d^PbaFJl zxM0UI_dL6H3P6CX3(MMO6BP{!J2j-Q1y9E&tmm#$VYEdd=_u{V9coS&n9V76aq0Od zLwIkO&yS+MLaWPv;``UO;N=_4&Y@`RN4@=WmwPFIwBF&Dpl{x`oonzxnCD;{N;Xnt zqr&LY0bnG(uW=cvF1GBiP@$sOQyFf_=;G3>Bm|4v^DU+s0ajJK+l!3ZH)&^EQqS9) zL+A80tiji&L9pSvHZd;4zMO4xdS)7~2QRr>_UjHy&gE zNP(tYuIV`^Vf2`dO4q2%=1736T@(HIcgf#QbrXbGBodYpGa51f0oFdg>frEIX5A$Q z(l-T0S7$UNsVs}wdd$<3ldIP|M99xGT@%#fE1dlK2@0ri3558^=29=F3Y*+Hx#qcd z!_|xn3dS7_Bzf#bODL!H)`eFW=CJ6@mD_*u`W+BwN9Vpkw|JqE_JVz%kE;HLxACUYSMvnKb=gK? zVN=Ey7ueHN9)vvdXMT>_=D3)+MCX)cJh%n#zYYiriMGY>o*%uYiYVXF4CAz^K`=e# z{AS^(V#&@(@4*siYiiJ_nhc_tyXy3NY?2c4wxE`}hu$If`}YX+s?SKC_==`RZP}Ll zdROP}*8G^TjGhv+u3<_0sd)9C!(|0c@5>1`ZJgN#NEV6;LMNHir zxmom+8YS&s0v;>|G}O_ z!a$iL;YDhdbvk*dtFW<%`3U3{)nGO?BeMGXkpC-ew(mHiUk=_RwfRsUqLr9dpLx?n zGb__=JXVg*xzDtSQIH&-S$`fLc1f5108+E%FP~Qa#(()Xo>wl5h2==HZ~BFsWUM!3 zknVr|*Jhq8l!gPy4{ftmg({&|;sw!m{)_uwp<_4#A1J?VFAr!zp zc}4Dt-sX1#nJ0yWa^k%5CRwkn_AOR2k4`gAyo}{*%#I^(wC6d3gL^CpElw2qUye-h0K$nY_jpLTf>T#!$lIWr9m~?BO6aBAyjmsS+R-bFG93ks5!eK9)Bi9Kz4u!0qeOh(zbZZpV_~SKH4G#qgQ}tdZsmS!4*2$ z?>}rXfvmV$#l$suzpq)-vaF7#l{eRN1ZegNNSDmf9q)f4Pda8KbPZNJqIfQT)kMXy z22~APlZPsD(Y+8esmJ|ht(!=G`i;fp8?jDHV4WVN1gG9yWnymK8&31Y)KvPPYUH~> zK(~yt1qJ5GW0{g$14}t3S~r7;D#$(HP;r`>?G@V2U-<6(ufape`X2%U3l5bP%@TOX zJiRYWi&xbbIP6~{?UK@San_v0yojYYT5ft0BSe>O*}5$=-TmFp>yOUQTe?vZ0_dHfcH?s)PNN<1HQcH3uP`XLisSf=V>_{IOs7&+|B&gN%W@LX3LC_)w zppl{OAdFI!vEc^_IDDDq9*rLxDT%arMXZuAyE-->Wn2I!i>Vz?=atxY#g+!ci?v?<2jXZ64doQ)@0Q zvYR&GaYBgU(?Sk)lH;UDj#FBg)lCFh`W4}8X@T7qx^cOBoan~4mz(9+0{CN&=|zkq zSwtnknQz_hu9i{``;R|1TGq=o$@@aoopev(cb0`!aeFsP;TMjxawW@uo3jo5>DWDc zueiVtDV>!zjbT-D5FLbC-zE?Oh6>}5HXhj_JVZaNLsA>VcBCYn&Gp zJ1BXgLr4M+PF4%gT9d?><1Hwf%Pec!KXY&`qr`5ad`I(=dg)#$!-!`qv~z_OdRKxD zxkP`b@B9TF&x8k87t}ev?^m}1wJl;?qMKZVp%BZQ?#-2mY6m-D$xPgStIJGgj)=?0Dc zok!z{hWTuIx>&|}Un2yPe%7$>>t`&E5UKeh6`O0L`3-Z7t^lXL z&BNDK8=ArG!JX4EmoZf;r9c9m<90h$^M~Cxiew4xgiArpRx>PUOtnTHz1}%mzBA=B z#3gKJVpT`_(ATipbMC?O3;E4(1(}nt+oT%bPBAVIA1<6qoU5-^d^a?@hM1*HD?@j^ zm6wDAqh@rf#L?cz*M8(32Xw2+mZRj!+%N@&kww(NB8DysH7C(SC@O+Lp|3EQM;P_f z1GM-wK_vG0^URZ4s%Iy@B~EY)pY0@Pue7Wf^B*H<$Zd;o)vHntknCaT^k#kH1%evo zrhBJLrJIa7@|U0aBeqgqq_*~1icWS6pEA;GfM)ywOIBh}19m*yQj1V(4@!Sxbl3z_^Gu6A3|SHTIUNczk_xc=N; zYzDcmW+M_$T&>1bs0p8vHv*HJ{|fbBPoyCgTf}y0I;|2RknaI?J%Uo0Tu0_Q`@+&V zen7tJ>%&=SxBV6av13a%Szj?-P6{eP4;)HAp}Ltk5P{b7L|>x#zB=F0!IwpU(OP3e zn|+t|Kev{iFaN>DcH*~cN!~~FHmzAi>mjLn1DMzi&d|f*prC6mO6zTVh}^vfh^l;k z-KAv`*0Qb@SVUloiSlRXtjs3jlv&BW}T`ft2H(iG)pK+zkKqF^498Kj7XE`ke?PXLt z`k~i0D;Z3O5s`#=&{An3y2__u0&2S2&KxjDE~&=&nwDI3`^rHg^9o&>-G{BAza|OX z+B4VZ&j29!)+-R`x%-{mf|o7=nja~TqNFsDQfBHLxu&0bY!A}%@l^NX-zR&KIxI#*gP+}uOjl`zKV@;rxFK}0abUtZQj)hP1q zJWU7sq=VJVGBnhCrfY_LQgB=S^egm;lQ2obQ4$}rsL5c~jnG*0npO-Ku$T8qq$k8c z{E+D=wlJQsKMyN-eC;YP;rC+JaI~XlgI#_=pw6>2CqZ-bCnnEylL|RdPubI5rQtij zNu8aHbTn64K;QzNAP|l%*|qf4%(+1z9IYPT8S)NUS_uC^z@rhVPfymNp%p}C8c2w2 zeZz9a`=H3Lf=38;bDUx}gKk}DrLHkaY}<-HoTNTyQ}1z2sT(MV83R;EYB73Z><3k- zT3a9ijC&w89TKUtA%f5MyJ<`;*j`vLiZbYJtYb?H(K z&N%VCLjQ*@v4Cly+k04?k}07mcUBy9cT{$wA;9ne&ZXHF2s}~i#99w1qzxZ zz8;_Ak?5}-1hlX#q7QKLz|$Es=L8VdsnzWxb6=vW;0uUCzqYRnnr?vZOa(A`_r=~4 z=J2%TD3|D!oc}A0;Z;I>5T|9=;)jO}C+EGREn=NBJ!Q4lc`2IL>SrSTok(UPwb=-8 z|1ez)*OP@N4i(ws77n|<4#kvmytUigVG!7F^=bR@FEBhBkvFEz)82(oZ@Xu+3u#q3 z)(rM8g>-4Xl~iDiFkQN0*tVz(&+~1<^6WeHwPIIQ#Y6TH*JT_cen?g4-UPHBY-;b8 zKq;DDw8~}+!aabzn?t}~s2T9UVv?xYj$ zb%x&bA#}6RPCtqT2DiG_-H-Gxo|$|LWgcl$$-*+$s^?^_}Z3l0KuB|v@N z3H1dzN?y$2Q~Qn+AgB0KYjUe+7{IK+myd7e4?K!!NyYLPuHLaGw#>{EsxFKH%Xsrn z^T*q5fY7X9_moUObL2?7^s9+jCf(iiOjhZN;0jobVnZ~7(SVRKbJPWefbpnrP=Zw= z5w`xfq&CH7EBHZ;A}4blqZHOAv;Z@T4t^%7P8GUY3!QcX%y?PG{!9;C2o0!~GCxNi zVNq?Jk+=krlSRCazo}>X6GE^3K zQzhEo()2pa0#tF1W4^V7OLJj^2I80s0f)*YuNeS`S`t1w9k5>HQ2Sx$i9Tvlb=w@e zN}T@f-fr5uDE~Ygu|{(Z-hcpIAs?NycpbGst^=r{Ac52Xo3Tk&v3fL9(Is2Qp}8w> zrAhB4zS3V-g6XLMZea{CJ=EAzvdv!H_1$pv)8PmJ8v;W_vSxZc65+qu?Q&Ex?Lo+s zHz9TOQx1wrcBk95D1bn{=+1Vl*|=|dx=pO2=e@Ph`Q6c?Eo?47*3{r=pmYR@O{zv2A4BfPcrUl$AQJcn z5Gli<677BIvvkwXvN}&M97vjKY`}2QO1N;%hl&|yV5V|Ws|PKw`zz>x3vAo+_Skfi zDrBHBO7JuZ@HBDsJ6H1n#w86Ys*r`5I>fh?c-%}8Ai;%{22|uI@rBAZ5RKIoF_T~i zNXy;&p{ZS#`EDcnQ2m8u=-$|YiacKH(Q1F-Y!@c_kQ@eq{+`fC2H&|$i&g3W*n9JM zD%dQoX_0=?nV=!SKJzh4_v1{^q+#U zI62Y{Jbf{#5IDVx9~s0aY+&PJnp0yx#61n%dt=v@qqi=}yDR~CsMq#+(wzL?gLpx! zqd1}^iVKB^(7K2qEnDv{K}&_nAkSFG`&#T+fgS5&QP@ZLn;oj;E0HQuIQVOSqYe&Y z8-syuK#i%~JM~VpnvI_;sQ!-i`j7Mb^QHlOfZ*^%?#-J3gXkduxShU2W0v$44SO4# z0@`+Q8?P308+!LxNe+hq!2EL62d-9dw%LS*!j)m_zBqBLVNx=Wi`Ws|nq z{n4EtPcls%m+)y_DdS(M-hT|R>l$SH=P*+HaVox0`$ll42NEpKpTZQ$A1TGjpal8L z6(m3T_mCo>%kIXqQ)tmx_Uc!q>>s_GOwRBt8??vlAqXTm{v?pl!|@XI>eSJHZf3$C zV99{f(N-o=dK=U%nM$Q>|D4MIL{l5K;KPBgkz)|68xVwA=0f?o3<-rHk<8>?YRQA& zzbiTYug^-N;mdY4$3asXgM{zSBF$eWYvLz=kPjwi%%y(SChuMoQi=uy36EXRN-5*4 z!!2m_glnvA;*YyOVu;)F-t~5m9aCasV1>Y6U(PPAh71jZ#*RQr*VX{0n*T>>DF|PE zsM=2QPid3u+C+4<)^m zBmmYF1AO_tINR-iebx%prD$~g-Y|=p2rYx(dPFB4FcOk@@`U;(t3!DA>{~XU=fMXy zRkovG&90=^Dv9Oq8yC#MZ9OvOOP585iovOYzrLJK2YX!N^u@EbQsohL1U z8@s~#_x&+`Tb~gWWPWA!*oBReG{fUR&?D$!?}P}=i>E%!L{dPTKNqsC%NKVSv44nr zq2I%oCrU|8`}?!gaB<_!1+OoXgU2Lw*5A+8as&^(WHR*+vq^liS;V7b1929Yc~Glx z9;@J{@z0+4_3Up5zM}b6MidW&MEZ`qRCnz!a0>ZpI#E5fb74Z%?gS)4=nr_xA0^s< zHU@PGS8`HD8HSmn>&?R}jE`JkVj0JN3W~v&;e4Y&Z7spgFm?X!>z$=(2InLcr;)5- zB5u!ix1;gz{cdAdF(M%ALqb3AGyO(b^XK(NAqlr-)ZfC$yN`&6E3YR$(wT6|PDDzg zrYbQ`Veq?9S(0&EJ+)6im10%7uBrTe<5qMCoH4L~liG+!V7&bQC{+p)t-tx)=&vWH z)0Od*pK~5HUZU%VB|L7N*zLdes6Qt@9LMs^k@~PdF>n`@-4Ao51ez5YOXFUwZsW^$ zX_Y+s>$CYZT%4QpOS%Zm&IAR>pNpdK8z>!gi3lW$8WmB{Pv0{}!!llt{QJh$ym4Dc z(Fkb2F2DHp+)uy!!+&mr5d!DgEPOqHtg;}C7t5b`jNicve=1ocLR(-&EB zwSSP7|6N7LZbeW79~OJ$#!Eh|b_EuM)^?`RiYZaZ(4G4f?!btIjISzFrT_YD3ONCo zHHLRjg-do*M1rD_`SSsFAc@u;)Ze66I6FzyzPWw6 zA)F({U1FW@Utg}44~jj5$($#|s2G+7#*6j`#%VRt`ac5If0S%5p0aV@(ah!JusL*{ z9%7!Rlehz(cy#g&c#M@-Rx|4U(DxYdNh+;sc=h%~yy1Kw)$aWVeY~W;zs8zpD6elh?@sETi^=1mlsjEMA?37Yl%sgv^ z)^KtvTEAX@rRyW-EwW4c)IK}iNxCkKlHRT1xw`MV?Z1u;`c8T|ZR^S}eXUA*2W*^| z=ri<|vS-d`P)%;vS_Nm1K-k|T%}k?|{5#-1T!x4KckK#U;F@F&o3|=_-MK>wvr`br z)Z8ohHtV&Pg}K)LrOZEa)q9E)Btrez1CGJoIaG)1lhwEmRR_H1P4p^;1lPLb_0)m& z9)GM%kFk|wN>!Eif~4=X&<{$n+~uUpliUd5AwE^!O$DuYEe4x=FgpNsIm^ z@z+{!MlE`8)%F4MVF$s>q&e%Pq4AaS2(NPXSXX(~9-YN5DA-bSwENk;;{GE17k+?2 zb^ZP`sRy}6ULAh^`YS47r$%BFzG6U5c*RVlM3zFohj~+JWGAsgGh#Nk_1!*4*B|=G zLluMbO(D`|pUQ}RwD31#{jXpmbonFC6TSV^n&dxHA-|tt}qxNX(m*~^qEX=?AnI)KACjZsX zY4IrNSp37VB3VVf%{MwF#L#g1h@jPRYs03}AFA~^Qd&2eT3B>49b#eH=cU4t5n$JHC~NE9tFsY>IO2hT-*v&Q`@rBL^KV97{^ zL8dDCFKualM?m?Of#euVU+Feq)r$62>D(WV@ymBL-h$(p4U1l{uWLYHIxpe06xS9X zvo?p3-ZI6Gay)|$;J)kSW2eY6RW~06%1*QWSoJphP5B_XxK($iYM+zC%+X_eXp&4u zIYXsiA>q$N3H9XiLaY1VdaeqFfG$f8trl#=;yp5-FP{eQY~9KGEJllh1`9;{T~_^M z+~PKPCtPtC&r9#}r@qOm7yqNM!+KRvHW#ldOTPRy=N23GH~k@!g`; zw>e?giEfbxp*dL>zguVy=N24x&&{fQKgGWXhZn2mCcP+*@$B7U=GLajKI_@puLR$8 z@TCrWOB}wGRyXBqp8==t%G_BkUq6SuOCD)~U7~II8U1ac)e|znG$pIB@*l|iD}s;y1``8qe6q=mUI zlMzdb_b)5=TC3S_sYq7cft}A^K6_K6uf2-p2x_zX-aF4Vg|nv=Ckb{evBuUwEFP)+z@n?aJ3{*Q;m7$Jl zI|cR*l(2Q7;rog=+Ao;B*(JQVOvN?6jh)z^Hrvn7EO=Mk_07J@4@nS(5Y2cup%9Hs zi89H{4;fe-_yDQ)VWBh+vgKT2V30@_?wsP!J}qPL;c2#v1xtjtjyuWz8>Yq1%4)SU zi(SgYeU?s~Q)*@Z%W-w&Iqjyinn6TM&AGvDq!TV%6%UU(?XliXS$yi{&8!WcOJ(Y{ z>l@B#2dr8zI80R2a$ytCtg)K+WY$>sh36_T*O4C)??pv}a{*wWg))xHgpDDgL(ssg6!)6Yufc``)aOp*OPmUtu@G-xBdT(I(7Fy_J{S%H*WqCuQDsUJIb z0+Ofp0TR_qf2-}mRQ>pI_0<7sS86rKUaZcmiTnE240V)WE-!z!!ki`X$xiaU7edFr zmxFsl+iiWO1fl&8Q#^kO3(tv|EMdcia1C;(J|&0hgCkch@VCvO$BU>#H3N}V8|~!v zUz&%Xkcw`cd>dVQYqDltM^fUC)X7G5=Ek4-8Y$v2b687Ad^EPw$b%F@kpIL7v3Sab zC3dB;z-Mh0UqosLfMaMrBO(#sxLHe1;0<{EF5Bc^_<{a7@mzF93d^A-w% zuO#LxxL!emRxMlQ_udksVWlKE8&AR}ZFOW8g z+r%|=4Deb@p+x~|?&vrcZa;qeo!?z*<4`XzW^aDz$JN|{U&bqbb|j^xPACGZlP4Xl z13iVMr4Qu@v%pc;cdb43D~U>UHFm99uG50Awyd3VFE8Uz6ZD0erFP7@o`!VNP2N&w z#Cg^04ErDJ*Wyv*0*c1sJ?bgW(8BpFr}lXG3tEx%^f>vE|6*uSpnLy_r80xW=xH7b zmo7LL0(__-OVyIeLX)o^dkG4Jwr#6^v=7yN*V?1T3tCJByVfzS$jxdWvjbzoVWQ;( zN0%@%$U>gs#`1OqeyzTVJf^t7N1v%i%w5kNs4M;?vMs+D{deT&{}B#SagvpHnWz<4 zw2Aa=rc|jbD;9!hVb#E;&A+3-a@YgX--K+=o0HY&KXI7trPTO8a0ogP^rx1{CzInt z#(wZ|_DBWR{Puj*lLjFPl)(97jSnjz4BW>Ysh#!Dn>x8S+^yGtemV$T8U^23gsF_# z7$?vFoIDChnQHTMUb#wZivF>|e=ap9)Y!EUj8gRo&v|;ts-!+@YyBhfxl4l_WOuZ; zerL}5Vr$31jpa(s$dDx2jg$@WH8h?~f1`&WI%V;gl@=t)U9mfE!Me2gpVMC>Yzbd= z@PY2N3aN=DoVfHG;@17-?JNtTha_?S-j0gBA25}Goq17;^Q<|N7(A)ITcPIB+X{c|8QgOKX+H54N2%>!S*IE<6Nw2d08S1M zhBXG!=PMV`{GlMMr!M(Z7fMB(tS+7K^D`_Fwc+wVNf)8+ z@|U0^7m;)2Bp8}2&uk=3!Ms7W>-)RvSiq?-gPm}fJ0JA zi&#fVVxSzivzZ#Cx`vp{_!ht>Azt;TF=Fq5T?`RDb@lxby8hzgeBnQY;O{!^{cx|@ zZNY^L7dB4YzK2B}%cy@O@VOq@1BW3(9dlhKaUZud!f7xxvo&sPh)n z85s9RGdEE=r(aJg$WG3$HwhbW$)Y>%kCG>O6UXcqQ;nB9ybv6?poa~#ArH^mS4Zce zE+7nb2x$!9zDazfrZckCj(kMQGG_e&txmyBe2dJuo+KPv{;%&O?PaMQCXmWsdH9xW zwN%U4gsC^^A*?27saEsB)5Xg2-F~==-&Oe7EF>``?G&a5!7nrAU7nrB{91ih0PnfS` zb+Mcip`w~4ZuJ3|R1<{i?(&p}+VF3P6JD03ZfkJD@4Ao~S4aZg>(?`e30)a*lQhfN zJbC(DtKtjcqBH}NGKe{KM+5)+D*?x%t=4p5>w*OJDS2iy6X#7oLcfL`wq!bWr~f5y z8>>Z6H;mJ29(Jqgo`OM59D5g#PE~YMMC85TH0%Kor4WTJ{_?WWrI)t>um}#|iE2fR z_>}?I8<$_#s=I8lKyA3VeAnQ|Wlr9NLeGy9kJS4v))ovP<@ zM^C;RhC$F9A9@%eJC+3Y#V?MzTaWGb+ zb=H?ZIJw~*k(MHft&pjklnn`ocI2vmbFK-;@$Av>wq(rqR&Z?SlU4Rz9^(P@o-3}y zx}HBLjF~}VDQ71mj_ydmj4jCxg#xqyg1aeRZV5Op$eyb^Fvc~ z#l*WXkqVG)ITs=UVxbwCXEg=Ao5II9t@y%k5-P}ceD;`8$Y*uR#~0)|Hi?B%ZlD@T z7MltD#}bE_zYX8=%x@)L!P=0|{;O#HDFIQ<>{+OYLVW9%>#3=+#f%#p#(&Vuwt zf@}4|lg986)|^uX{#3ByDMJmvyzo}FHqL)`qW|5gH{ykET4p7z&E08{8=^lFf!tap z>IC8k22N3N)D>iOG+zf^{0w`LDgTz*8~(1aTdelxPSN_QBh!zpa!Pt2zYBSSj|yHN zwt;JCt)7jl^~Mwb@O$Je}KD=+d~fhAH%ZD*v` zugpKlZu+&pAsU>Wn0h-U@tF}M^Yr4G6U2O;BN&UD?o%EZp*nG1R*F+%|yE>SECM`-=wgh4+s{R--SjW=pu3hGD$h^4vBr#4~AL za$_$P3i{}%o0A(@GDdSx%oXL@3uY6KaiSo+nylR##Vl+1fX<(cNnLazocY{ObvteC zdCTwgV*1{ZM>5&y$|C*Ut44>@J~rnn4|IcXe;uLTBCQ7rm9TJ6G{y;Eg_h=J>j%)3FG;Vc#5)w#Kv zD#HFyhhd!BZOJY{xhNZv6fpZa8~KI%e7QpZRXC<&_*r7k=Gd8(yz+1xgHrQ8{hUgA z$rDMNM`C+r~937RHXJ#fxa zfxW8!`2j2p30GoyC{ik{Vk)b!?=-15yOZYpweH_H5epOvG(sv3*LZz(j4` zPl#;Q`P8l(PfEAnUc0;6EW`Ecje`jXtIv1W%DHWUPW7n(4%N&)n0RO< zLDT>PR0Jwm9UrYNz%|67GbiR}6X-lMF|>Q-f+3JYkrpPflsf^(;#{f9w|u8CP;IA1 zJb+ae-kn@U=ypLY!#YSH{Ad)r0FtB+u~pkr5}cc|2!|kHH`YD!e3-@Pwq>4b`!W#Y z5cufZzMB2Fw%rsW!%$1#fXk}J__{q>9rvxt^Ig>5U3wVE=9|Sl^KFeZjGWiOuoza_%bsyv(xE(a~ph7dOn-v~^s4A?DoEyeBLg zC6=rUjMpq%$SWqYP5We@ScTB(#ik-$8*Mi_CZAn&8-I@7p=tZ$!l%9aBE!?0yFDyA zBI^`8?ya;eulwYc={aboTIP|f8eRHDwd3;yg294>J(|I8)UF&aXn|d%bvm_ZFNsHc zQ8RVsd8TN;p-y!c(WYzLuL7=9g5IY#j0ZfAK96jR2ggp6(Fa%*_ojI7wYhO02sHyv z@QxZwWipwduiF$fMBdHT!vsA}hN`6QA9OdgcF6yT*3k=KuQ-8r3_zY`-T(-rZP>NA z`3739-GPzb2>glr=LlU;#}3}8n9#f&b_X0IuMVowBOG$s?WQxykZ`2q2<4c36sFM{ zEx7!J?x;^#8_MM5&w`>|sr7x(jt8VG8Y;88cmxT#u7@7VU+}X{-ys7tf8QJGHV{Q@?d*OOD z7yFu^kg99xFFr7{uVfKyAygWpPKO0B9{NRV=^RskZ5InpTd?BZxwrl8xSov}n@O~0 zauzgS;Gj;(9Ab-e#TNcVDl4#xdW#idQ8yJYQq`VS$en`TlMq1bx3rgEzWgn9`O7qH zf;xF)74)0L$S>J9f_B19Kn8aDyhNwTJ5TG-s{E{P+6(SDF(lw1C&VEd2cLGdOgY<-~4?bO>B==v)b zSgg-q=&xQ$hXo5gX>ocFI}=kWhH>HnFT-Nb5Ddy5mk3%s&`bQh|fT zdufmq3P7iTySqrz^gxEm%*eDUnpJV%PsQijHc;)R%~-Yl5fj1b)$TdE0uP@BB8Yd# z_?#DeUb^s;?0RhWeX7n&7|B>P3>3&XWzJ&MCiD+Jd-1HozOS2eA8O_$l%itr6Hn3m zZ274zNO)W=i@d{G*!NUp^l0S%WP`IJiz0r{U%^@z5=?{y2OG7`#y|%gk`_S6oIF`l zOCBT)`!LY>VZE~;Z8dYEr!2bWgV22&-&6;_V&VR-x^ka{EeoW5u7Pbn;a$q(8CuGv zpam1bh=V0Iymbd;fyzcFfo0zC55h))K`E_1w=Lv_t=jG_emkBvP&=mvc5e-rRCgbQ zBRcFoK+=TdJy?B4hqT?d2i~4!=<@V_pVRL&aG1QY2~LtjpEl*d1RcgI%u8{&M2I~i zi{6hZ6|h0@TpyS^#JpY^5 zd!|mB0cPYz07t&QHrcYKbMY*GVI^<1$wHlMLTT z=87bsC&#$s%Qe&wR&C>%V1z+7f~y0#vHu{S0A)}K@F=`ba~IPO zAm}fRkYD=tfm~1@qBe#56)m;E%%^3Y;*-}&%KC8Y?k60^s)G%$e_r&8BmjCuP+MQI z@hffX>o`#_z_#K!*hN7OW)^d^SupNk9-s0ar~3mpwJmvZmpw1;=W-lzSz}R z*r!F#hl>YR_T)2G<{cb$dT!HNaDotz*zEoWDreDJvp&LXKSSyLl|)|$P`hEN7Xgl~Q#*n!XFdRik;Gm7 zS)|6K!81{H31pHP$x*4geTzkij_H_8iLCN+w!j%(-*(8$NFtw)dzY33P!qSMlu?KJ zffcVe+`5NK{sxis@ScSxl9kH7<(=Fd@lXXQO?|-~-tFmp8uSOz}a(SsWT$c%IcYJiao&%-1{Vy<~?^kE2a)#O+KKVc2fX!|XXE~*WL6Kb;z6fQk}gm(mP+JRBgVfN=gG!c?-G3W$pg$oMHurLacA)L z&jERm)A$bD+Xr%uI80RH`H{gE(J4p{D(oDadF5hO%V7*E8nR?me7X!VV=m3z;fhqf za%L5Vhl_&`w(#$VH_PwLF4joiRTv0IY8VOVwzIqDUIT-}+9*Y9i7PHG}!q4+#<&TeP?%+s8xt85C88^ zXMv~tBI2H_26pb74y3qv0cpM`Cx{mnLq-KD-P;lOg?({WutlDBLOFVvGV7NM#My^3 zz;|Sw8`()+tQV^tGKVk93~KB?Rb!0M{w-v~V=2TvcQqC@flRwWz?JrS$!og)efHqV zm*iev=sLgKjNb*$>5pT%J&&f@0#eQsU$p#v4TuB8h9vVHt>Wo57=^qTL_$Sg+56Iw zSEy=3b3|eG!3X?PjoKvEQ!@p}4xI5S+-`Ss9)<+7F$CJMq2Sj1TZEyLa%+wVrtJG_ z_ske>*yici)de@IYtX$Px6FQUyP3B^XGigI7>kJ>JexrE5ZEv=sO3#s9lUu z8t8s)DX_oi;oVK=84Z;D;D0tw|76S;9~5eT*nVyRU7x+U^fxTCS_*8*q5c7n6@>9d z288)WQbE|z7-N<2t*o7_z-(sc2ZMGCFeAj)Xf|z>qp&YoAAHr~ZYR0m<9HM3o2l+P zm}qbhkdE|KNvDS9LqQ{{A~=I7G2D6^2et>RaUyb>OovA(gtmzCLi6E0Nlu?65Q*ds z_iE|1@u4HU5zXL^KZLtCJ$3^1UYX;WHE5%(-k=IYwdQzHCcsh?z8)noI{gdo|J2fR zUCbB?vq^*S&0isPSsj9xvl`=Dd$^N*1NV!F1UZ|wJ|r8~^l?iF;9dzlIz9Rn1!QbF zi_aW1xFJlk$d$;&w^y0-+jZa)+-8~N1 zjPIu;t(PEK3SY6?1bgMpGWo7Oxs&FwO*P6?i}@q1k^!Y|3ly7$RwIoVZOK^-OxoBQ zwmbA8VU_}%;rfvY<;~Yfs-0DT$Lag<$y0B~d?Z0<3Q4m@c`dg!1c3i0Qx_GJEGE^T ztB3m53+m^i!g4?2nr98>XN2M;f9*B(-T@e8+55@HY1b3M!fY9V7Rf@ek;o2I2pS=( zHA`M->QEwPrJv__fbciJQoLK9;r7-nd4cI;G}&wb^F!M5uftx>DZP;w7$$O_xEB_3 z4!;-aaRP*R)~N%8DV)&$BzTcQ^D&=fRdlxBBu*+^Fxi0ybWdUe zVsnj>_HOn3;_Bj*B~->>?4_5Ktn#89Re;qu;HZU&&*5<83fH@{8Fz}henJ@MrQPdH zu0VNXtIFO?_OTd>81Mil+-w zNJ(V$>FVd$AB!E^v5;L@5Mx8V6>twZAOfy0wA5iE65eZs*T=5LQcf42tVJ#O1_}1` zrEcz=hmil|N|aBdZ1;D9pDqUBlLmKV%wpgXyj&@O(-e8k5;i=N!ROS+X?}1Ql_|m(3M&^WQzTT ziO?fjWM+Za2+0r6b1UHBX)s3*W6bihzS1aVL-bWW`rA*&gZua3z&mQmm~4Ril-T%m z^(6n7Bu+Okss~hkE;&hhXm?gJsRJYbY?8kf-VHo~6Xj|SPA&MP6*(wYAz=w6A1tn* z{O^1@{Bm8tpsc^(Q*I^zZYmqY{f-$9$97(3>?yC$to3D$r zWFEnq^c34@HXsZ( zytHEXhn=TLzZzj|ge8h`SiBRFcP|Mh*3Uoi?pEFkcUGg$WX$?8#whCuuSob+A~bW7 zZ$QRG3(VU>K8&@5SOJY?g|95@MjuUEYO}jzJ$R@6Zpct$C&_c-e0xLcF?Fv?!1S71 z*_JYa1=x492ptdX5_s%8;_?w1lP1uCMms)Y;h+3unZ%xgolbukJ~roisei_S6S7N% zmD))4&_zj!@;~O1`hUtHqpV1>p;1S9<~SA?u)o%=MMiBlL#(GRs4w3=nPb^^fM02K z7QF^R4{OmaTL+UVleJP&>I_|9$4riR zsD9X&PaMhmmJ$cvK*flSri0a@M{lL8y~GxMlr-rpRY}j_XiS4risYLdD`Jl347Nu+;7ih@#7SNRzs$|F&n%dW+$u37Yu z`2U#8SNtu2FN7>5lkC zJ0T#d>qLXEM-|P$=N3qwrx7x6jN5EZTYFI}fj&W$3GPLNZSSv z(iw@Q?&`I#ejbogAkNZfI{7r%T9iD1wV~Atr%3p0Z#5qsq7H_6Ox|Y;?~M0Mjb(br zd#2th8#XpaM9fX8tU`0RQbo5A@_tuZ9)Bl1mKb><^lYAocA0gX@8NCeg(a=0WK_Tg z1c{YpU5l*ZqL2m>BUTWq)sb_&mESqz&1CS1Y`Ymy^HRq59EY|FidaLX`pUiHrYKlSjV;AA;6q0Uh z?*xA}Nt2QBD=Y!Fy}OZ`&%sC==VKvAwTsreHtbGs`&fYqf)(ZL&{+pV59W&Zq`TVG zIaB1*HlMDSD4zs-iR}t)l5FrZI(LtMEZNL1z3Gbc$*FpKMh|Z?F*oBSr&^R@j;SU=|h4^EN`UD!RzcD}c9=Y67~n?5i9RX3Op#3A>Cqnk;}M(P3gYnj z4@2$4F7xG%b#|#sP+s6yoC4vN3;7HReZM;BZ^_GnTlRy?bFKc}J*7LT9>qn}o*@)j z#d*cKn3)jM-4!Lkb{X8>m3c)xJpN(C9MhT3RrTXm+{|{Lrh^Y9d45m=zJ^jdzi~_-Bne^|t_l2{C zamc$i%KSLlA}f9EsEfKT&G%LRW^lKZge;%!`Y6LAO=78VuRFW-bL7(zUp*U}f*LkL z4C??+-`?c=q`AS?hA9;rxOfp~R2>T6aQx+VKof-wQdVBn$`_w0mqm=QD)|6M=v9uM z4fL+}Du-<5GX0*k@ZZe*eU|-=;aXh)*@kANttRWd0+-pb^}}ZQV&AWu2gB$2M`G>T zwAYQ1Zmoq^J7|a`;m>**8CpGlvz;AS)`dN=Rl>L4A6{X%G%>sgZX!}pd?h%>k`IvOC*~w6fGV%5wOx`YK+tmb3XyG&iu9-?Q zCK223QP-%QI(*+c?c;F&oM#76D^5l>_5ZOrh^U1~Q(~~Kbp@`f_K^vK_^2uH{ur!b z@pBvMnu5Rhdr3y&6p}W!>O4kN2Of2%zM01cNMVMo1dVKC-)I>^gC8_{D>PnkqP zRmtP@keN58lguzDvIn;&t<0jFJtHzbqBu2G49}Ra#PFcN(R}0SSL_TD*NPwRpp3!9 zt(s5kX>MGOnVZsM*-0x7>ed|ba7R7l@bb1Sk%iRRe9Mr|M^C-Zbi|6bMyvN5&0vt2 zznKTg4EDup*kugfo)ii+1-<_vA-1+#aUr@F^sp)`nD^cSn!&n|!%ryhW#U$|h}GUD z&MRbf1YfYQIA4gmwMwiYYlj0~o<$jRkpAU?NO;Qw)xlBYPVD!Tc{BsnD>A|m?Pfa8 z4O-883N&mLhYLxR6kjJ7>Vn?Idx~Q$zU4+<{%!q26^!Rw@*ri!~a>ci3*I<)9ogP?jjLye9->~YDF`s z4XM7t#*rd(Yo6p}=z-c5(t*m{Qb9VNQi#UJ9kn$jdO&8tJQ5Rzh#SMX7^pq02toaC z>|ruzc1i z{9!RQHX0=yIj4J)qL%)k6)HxaP0KUcEHjl<@n0|K?7(#;=DYFmQeQ%#HbTZLxCxx6 zfb<0YPp$;4E1=6rlR3OGBJnu;Y<%@HF}ViyN&W|Lk&lYgsjhrwq|@klQ0D2*FFlF> zu;F4GQXy+G5X&^C26J4NhCi^mb{d{v0x(iB`b!N?;;RK)&@6xkp|OPT6<1vQD4)z4 zAN)UZtQTjZ^g-$^-Xz1QthJ6D3G6+jH1_TKDP$PzNTMWLH8T;3k|id0$$=S2GJD_L zAlIlNGLbK9Z+CQR3-E1P;QW(uMt*#mmnCznQBZ^6q_<^fAroE&Q_k#A>WJCT3GLV`O z(G>)a_8ebT=olZx-LoXD>@*ZZUi0p1K{Fzbq*ZCpNC(95&ayK^B^R^y2rLWKKUoH1 z_lY8cnjoqO5;|jual)-rM!B1GLgl5MG-KD=Nerv7G=o=p%fiMFYIZ_B0B#9Mt7*jb zn3l0?0djt!#h%Pid2#lj&n!%W`JwiVYIdxYO0_Cbz7`<=-vYMW(DSU@kT0Hf&$^9T zArYv*+nBc%Onw{-5Vc7l=k8^M)arNQiO#HXeTrcFjB*;vJIuH>$;CSuOo@wYk#7!P ze!4&__RpFE`<;kB zaW)HaBXoOQbgYsD&uBh*V#>d=x(kt9D>+})is-0-f>gH!PB=8Fo8#K%{|t^Gk+v}QN~<;{qcEsM@w*Qxh_QRn zi54>d)|*q~j^HGQX-qNmQcN)LJ`sC!g-f#}8MBN4zlazLGLs%4f}#b-=j~X1)bI79 zGyKYAj72DN13C{z1{w;YiKcA8``W^+&zu8XxIM=*nb9Ec=TO3aa5bJ7^^6*N4Zt1v zdBsn7ky7r7QD2Y>YGD|PhlR@$e$UUyuju)Ge=}tegEVG;?NsVp)nDo5-Tz(y+GQl6yf&Oz>f=bu-dKL zb`KC&U7c)^zMW44In=I5V`+~LhF1fyva!ZW3YJ^U{|0lSoOXYyYaAUiS(;>6~&lk+fgBD*_p_2J1y z;1A7pNj!-8DkoaDedz#ZIz+a7rR*0i-gy-&t1zGa#H5W`WT+{bLr0n)b}W%UYsioQ zfd8U9Pm%b4^!)CLNu`)(zPKaOLr2J|ZD5Opm()+Q{a>C`0{K+1)bT|pIut_D3snfY z%FOTuent!U&o)5t_9`FH%m(zk@X^s}wjj7X5p*`9WB6;iZe$4(*)~o|Ug!sIc_4e! z|F&oUQh`O)lj?v@)QV(KL7DKY&WS++$sl0xCP~E#JAfQW{XukRj(eM?;fRh(|F+Kh zwD@_zIwif@wUF)B$S0SB5?_3`e3P>+<`iR%ziphh4lruReP5o;k^LF{!lM@Sy`4ay z33+pc9H;AV6Mv%gRx*D|pIefu?@ZE*Irl>;g*FOGz%KIOx^{qIkle?67RIgA8I@gc zb2CXa`UR$v>#S0m7V!yg;hixiinTau24R_s4a;);KyQ;URbmZ}XBKr-9^~IS(CxuW z%)`i~^AXjgAOIRHOzt|IyCaT~sTWY@Rk~j>bN{g!{2y-J;{Dk9Ixo+<0oC9|k4&Dp zxMU&uW{V9a@@ki0Eb@E3D5w--=C0Xu)9MW_-Gpd9VYAj%28rB<@3BWiK`<*7znt48 zkwMfvIbu@8*3$rJ2%$>Hp8KW~lOA>Nl-^I7wj@KaVpV8FT;KicWb6a#Tv5Bf-%YLq zp8t+Z?xvE?iiY~WdGEeDu-yLc7uhJcpNu3heB8Ck3govTAhLa_|Kr^{QhM%6%3k7j z&G3E)l99nk=*z{`W7@RnkgxG$CsY-SS7@K8^GXJG|D?lv8P=HuTzq2rQ*-*v_iz1Z zFAu(e{0?#3t3sBO{P&Z5-&x)RjgX}K#JtujSnP0%1)53~shJHY_@c|Tv^=BF&-O4d50OKk~r~E+vRx{II)X*-sNRv^Dx6;)I zb2H|2VmQ-#DPx`TroFGFe7d$=Uw>Hsz);^t-|SkSNJniS6l`@1G(6i;);=UHgsro!VH`%+g=DI_oCqn|JM+wtb4yyWC!~J}0 z=2aIF+cz&4Z0kv{?03fgs4>kvv$D7Fg57ndM3fNLW+Fj3tvR7NHI5+zJJNQZgn7QE zOJe2E(cz9&UoA>dl$>|_tH6tR&?fCaWNXB<5-C8Rnag-s8A$VrnP3GIOp=F!eijS}Sc9X>tx9^pWI36m z^gg>N(A_JYxt;D1wYPbnSh6B>Vvf?;`Ze1JCnw6;RDQfwy%9?gK^af4lGL>WI^(3jIX$FmtmNZEt4P;y^8mE7quflaTA zIn^PY@9R;AGsr;HA(p(UCRWN>i-Oc$y{HVL1 zxQ8w+3v`l*lBxiyZ}j3sh*N3X+vs*Y(&xiXN6Yd(0)cy1ezuxex_2g}$BY1CdxE#Kxk|;y+PJq{<5R-+ zd==jT;jEjlQT^L`?1h!V7rvBgQs%BUmKD+Pb&(dM5gd;`lLyb3uaVf~(j@p7x(mWZ2Zm8h^D2;QVcU-?m>DHGMDL zvg#0jyo5lC573M1qi>fPsy)^RBkuCO{)we?u(IEdhOFk;fa5ywG3EBMGh<_{yQ*1X zzL0Q+oS`^F#=&|lYv|wFS1*>G@+UrIqN4+TU_I8hG)Z?!0w|?VQWH4*chDA1Ndy;c z5KEYX3h(E+Al-j|dwmhXIJcqdzJckIoYC7phoE(g%XP}pz!SIrtbk&FQ>I6}*`9ja zRIKHN1b&Z)gMkgnAG{!;_FnSP75!o z4;O|b-HXLyY-EJiWOSA>`e4Dwhd%z zoa3|0;1%9>+hqBtF8M~+!#Oxu#ehxSxGM1`&XZRUcx9@-CZ@-Vta5&2Zqk9Li0`Y} z2i#!zm-2i2X$F{G8!F%I{n*V+C5@L=LZDT=dGq7#I0iQHDHVAxYGO+4`*y*E%!Wfz z&1lDI%#060PtwVsgKzrYKi`FQmKi!Y1<7Oc=nGFkKxmMgVW!d*=Jt^6;6WHCCn_gkcZMpkMaHsYeYvV3|jT$tr=89hq zrP(b4@RT^UJYGFJxF%YD0^;a5v6CDeydQNE#%-a3^PeY2#;B4hi)iE{h)=y^6;`!m zlFt2hpOVUae@1@GI@2@(IHCnodKzb&3$KkTs?L3Z4|(RYg>syzKHe~rtYL+C4KAG9L}G;6X*~iJL$i)& zt)>}V?UkkYbLqz+;gtn8H}0Z#(BUe`PFM;mZp}#`ma-N21#xFC`#cup<%^?b$qR}G z2*r)^s{zbj3QHaqb5)*sQBzexwYa!s(zH)2~5@!V$u9yx1Ct69$_d(FWNZTzz;RmEm zDg@+ZB8jnRaw3Uos1c#fIf@$A;5!En?R?~gMY_?F09xpFUVAfxZC|Xf-$=h9DS^K~ zy-DZnnFIzYHWSD1B7<&xleOlgRPvqcYrhGjpVi!rIbk+P5{Z2xvgNxE*{YE7C1?~3 z30v#pR(Y?z*CBu7T8$!IRR)PD%fs?Ny7Tf9L}I5siJLa^{>o(>YppAVSEbpPUwk}6 zxwIzd)q5O%p@>c5?v6fN^>YE{cbL6$JH%>)DF}NjGd=8|dBtXXiC48_l$JG*w3V9X zc~AL`wyZ|BKU5-Co@n0D4~>s4Rl$q^(gI{&C;9#u@f?>rsgh_)p-Q602-7LlI1+v4`} zjCRhjYQ9z=Sd4cBc)~c$+evqY4_30G?Ll2t(~;0m14?zXzgGixqno12rj=hTYJ~Yj zj6RR274(i*cWVa?1Su(i*K8L3tki)9oVF*?YS$ zm|m}Jx^jM{f3sg)x_(>lyIE&6=cHVc-hN09V4_gR*}IqLyyeu(Lgz*-W*dq;EfKW} z`Fd!c5*Z6gAUQ>FmGms0LyGB!#353Y`gCa8k_}TwB0VcN%J>a`k9=AbcjwsYyQ(_r z;^DJWvcS1-3oE(3;@G$5%bo%D(1wyQTNN+Dg;~L zx4er2W3p9}m(jt7Coou}+k7?=NCh(9&HaLgTDrmg1UvGLo{RuX15PqKc= zZKT7^Fq_c;GkZdSoKUuH^YMLg=b1o+;imrUx6svjz3)J0TxjYsF2eYad9a~yO0zDR z)+u0SI{|1V44|V>>!Kt_?gFv84u~ZLj;usn#AII>@~y3yZ*GL>z~zK=4ZM9@V6%IX zekejbJ1_mBZvF={bQPUt@6_8kv#MU4KIW3+)Ay0|ZS}%HoSb}|TgpUu{(-)8Z+j3Q zA%V0Ay#OU$-!zrv*)FinS6$iGhSqw`vjQrb!#=>iZEbM!^1;+6lIjX@tgP=ZB(`BTnV;^#7wlA)%7BeSfzj631{nCX| z$a3m&Z|074XLmoCox87t%$hplg`C|-ABoJ#=nGT7m@`TA8(cUai5kL7As^cr?bXdI zP-Uq#N66!m^a5;;o=CT+JYprl3|(9ad}z|Hu*S`6y?FJs{l?P~ z$>GV%m#2geBhhi<+|yC6mJ+9VM_ZxM<@^3Zs^+XOEkAAXnd!UoO=VFN%Jhyit=6Zk zX^v>vtTDhY3Q4-%TH#Avh!_HBiM)j2GXJGI48?_ebjEsa@$pY2GJaRM@T}+ZK8(Jw z!OTLQ1`FR$_oxmg-sBtSw!T<@usbfheMLhHZ(l`2c<}tFc>D5b5x@GA2$?=E-`8tH z#hP)MJ}Px|eZZPXwkqlAlI9yP@P@+W2ZlT=dZOo0;pc)6-Fffg0r5MN9+TOWKKT!h2O&>7x)lV`{{@+0ZIZte5ticd#jM-+Au$*SCno9Gi-GpKuKcC9+XzK!HoU-T;6*^xZAk=VIt0T_qbe ztiU`K_R<-X&=k>q7@6-}>qxhx4?uux`nVW~#8X zZit%Ri2JUDSwSMa#YKJZ+!q>DDCn%d3`uXi{>sMWG1?j7$QqOh%j6)%U=0pr}Lt!nJ4m`xs=VLLYcu*0^hMScQWPbe!e?l@sB$| zlA+7+%;%p1QMqbamVVa~*t9QuruAifUun2|+HSeMKlM6ad@?b7TpHn(epfkpU+w)l zdve#ctBl^V&OW(x=fbnARw{MPl~c<%Am(!0MY_Ji=h8qrY;S7EJaR%2=pFv)7+1mZ zwlMCLA=Go@yt-=7DBs?E^-u?mOg#q4lMTONT}{01d^GHtKfRAVdL9nL=Hd%t=e4&2q^V+4RjEsi}Xg?vEA3R0ey&-Lu_|(9Lz_ z)}$H!0c0AIJ35@N%XOnCd-^jns(xq40@I?{M(F%gyAl1wJVQWvVv7 zr5L8Yo0X!J-tXA^sOsC~)JI7Nj+G?Fb7x(|T}4S<{1Y;?Wwd9o-QdlVY>Nz3sDL`j4c#_=0_9K9x5#rGZhK@t)%Ce3XX?~R=e z_itmKkTAz}rFTJVD?c~9qt_51?aTGO9;EG$e{bWtx_#9;7-tmxeo)J=&pK0R5B&F z$O-Pg2JY_XY@{bjkl>Qf1l*)$G9`M>jCf!oG{sP*u zbOBOLf5V9Z3;#`;b5pWf4o#c)nAxMf^c?B9m~ymq?e**fqFa+Uo?lc1x2kLBZ8QR* zl4?%upy9}QzUN`f)(ZH%zk1;T#XNu!!Xkb+ernLNW{be>OjqR4#ZRlylW zM#pQK&UQ&Lfllsl(a}ZSs_mkw^Eo(7uWKHV0hgIb1?j!IWYrJ+ z%sZ&;_^(E5rUm)FUj;9OGct^EVHa&^W_`z-a!KaRqRy&oQRyc)@P4{!ZxO7c(ll!Q z90_ZwDTkkd9Z_H5C^|$u5Uq^Hli^e1kj8eROFJi1aHD>#w^zCu2=N+VXVbYn{*AHxFBysN+;t7a?)&sU6|e3jP5xPj-G$=b&+>=Ky1bT zMcR9SW5NGz<5^jeS&_0rD67oOkQu^dWM*U~BO_#8r6fsaMkw25m$Fycq)5mPA$w$G z{Xbv#egEF)eg41adDn3`9OdE~-|?B}d443!ysIR|Js;1C12QG!H7mXy$`bB~!MFb! znHcsM0!3dHryHt%7w`5!pkGPX79GHU0u_+$dij2vef(1U4JrcKjjbH!Xm;^O zM|t31YBEd#O(>G!sH8w<$@*-sre3~rTvyY_fF5vM*3i)9b~tt6W@w_vcRTTUBPY=W z@jEwFnRW2>{=ABOm>t0^ECvENcfR99_TY-6d39mCU*7^*iNloL90n^+$sf}qu5Ld@ zb+H?jq$pv{#Eu;l3a?R(swEyY`I|>nQjIR@9SrT!0w5+m*MS}z%YjZry>1}bs`6(} zGG=EUox0u=dw#drI$`HkBZK%;7(B$q$H+d4%yHsd*_og!ja?G?HZ$7AdJM!vgjozijWCUfBf3anTkay;` zdDrLoB(?XQz{H&d(r5&TE@Zk10yKKzT|U&z^e!^R%&tNR5wdW83k6%JoL1P-BKBT5 zrt1TX78K_fC!qmGv zOtV16i-Bd6ID7-_S2T$rJyF%Sd=p-vW_U79h09Yuhl$8)kWzN%i$m|{l5JnQJ;rmt z{As!ST;G@FhuLmE9nf$cW63-j>h=tp25)EMr>`2MUU}+TNv%pOC}{59gVApR4G*1l zv41K_i&7?cRfq*(EoU0D5#I+jYe1c`57S zWBkK565xhXP?jEcFn3Ir4x)6$f8T02fN3a$FK>twz_26-^dxIKoGUnguQ~R-`?N=1 z`^%b(nMFX%NB9q>gG(>)?=Ssm+sD5`CgA)y+V?3y*5`MzJ++{WqU1oo0n{zhLsQ@L zA$cinV4^Bvs`~9`w5OQW)n5q6fx@rB>k(Q_P;8skc;;siwZM7KF&XBm))2d&2UJF@ z!7k7#t^)s&9ddk^!C4(mDGp*LXW3Q<@R@Jl41Wi*$*(9E#Eg7&%Hsu&R>Es#LSg#c zkflYfssm0~!w;EVJJ3|Y`DRwc0JN{p{- zjt)s)x5@KdNv+vW@>vk)hQP1YfiM>gpt#YEw_{S*{%+6j0RNtz>wtg^zWoQ#LU|Ur z0(Ma-wSG|YI4CPo{X@VWFOh}Xq{)Xr(frC!fAvV3eA1M0dfr-c{ih_Lo)FPq7LneZ zDT)3)O!r<~Um+Ht*E$4xz>|%F$$-r+O^ip%K+j5OI4yObz2N=4ZE))h6e|P3YBeki zQ*aM~&PZ5+J4nc^iKI^0Kt>PpGyX`o)Uw9y{cqcGbv#~Q6MyEg6M_~aPYqjWZw*%( zBE}UO*nMj18>8p!w~pl!Fk7foCkfSWZc8u}nhQ1idv61U=Tn4xoWpdSGdBaC9OwVU zy{QL0u8&VG%A_?GPy#x~zV$_T$a^-AyCz?bm4d1#*YLvpn!O|p8f~gIU)BIZBedk> z(@t>>b!dYLi3L)VqLA+wP6$5`z3@KqQH||w&ED&f$%RhL)Ia?`^9xrHL(X6Mxkv_i zzOp@2${eZ1$JmIQATl7!f~L!4{v(0;zq2FNc)0Dwa*e}lvvV`9r~U1p8+X|#d;-zZ z*0@kgk~G*xvMDY2_HRl6wXu&W5cfe)*gW0H7fEEoX;GHm;mv<7vr*K1K$)X&|KtisWe!)=Q8-`fkIr3s=OT*JBCTWINLyXnsO~Sg& zZ0;M?#6{%VL?{FSRe5&4tm};*D7ZZS!wkv|k3ASK8iSe^qFfK(9j9ojW^C*pC|8Z; zo8LSLU!-?5UvkN>BsJ4sIgCgG|7egLSbe|-BAv)%^pSbUVF&`mjDD4%b{%2)iQxez zavdU|u6Vm&GRu&b7;ymwE!WqTMR!9o2g(a)g@qQk^iMU-4ZbRAPg;FF4%b-nJi+}2 zB;X(x#P#nZKz`bjh*x6iT5At+uMk9Uy>(2Yl8n0X67D&cpH-$RpkrwbaLh3IrwkXa zXk40q8`_PERgaf~yHiCe#D}mGoaU1^oirR5001Tqjf!rMPBBH@Qe0@eC2Vm{DQXMyT z4zyyd$dX?a*>fH z*`d{X{!u1O0H*pXkyp+1%t(niAGlrk7H}23@U0w9AGG*C5Y=q>x6KB6AQC*ur=V=a zQ<5h(<7tyI;O6JsHEWtIFcdTk%XKg1G8)+F=GUGK)(f*Nk*P^%x}FyzDK=@>1jH>b zZT!QJ%ML6W`u1;#2me^KNCG{@eM?`cnr2o}aOp>EFH~qEZM7-pbL|OS(Ajmrch#SN zXLr%RQ{v_DXle%NExX?G`9LA6j55E@XgVtawfK)6THdP$ zgTwHy8JWXjNfvG9}ceAb6R*8RWn$l0PYGAiT(g-NG zA9(0P{|gU&y0GiKgRLDT*C2~JS4p(yaf(8@r@(B)B^1^Ax|ILH=VnF;<}m|9O_ zuJFSI~|?%p`7I+W_HgQf9o%i9eB>ix|~bReqe^j%kRs{Fw5QIv4uD4M*m;|gcRbN_WR45IGKx%6R(2%jV-vJ)>v8?$wsAZPVexomuCTa^QOD7LmZZUZQf`s@s&MeLD9+q!N)qGTDFHz)UPxh{%kk9uQAJ1RcVSc#?v+8l!&6!YH z;N-!M2LAUu8U<#17txcCo84n|s`?#+^k1oEdC1tNJFX)6+aC{8;NXS~x4X3qHf^T- zoQE`BPw_$?0Ggri%Hn+~X2A<0gV)Y~Fs%)WkaWOvnVPY)UEgaUdi?RcgZJqjveD^;DIn;#4LH@DXZG8?@xuf64tSE#NBCb5I9BvP_3Kx0 z((&erZKtR>%}N%jKf@DZ%lm^XqGcXho!Dc-yUSCPT{WR@Oyk)M`|PLqZ8@a2ht6EM zSvA`CFaRUB<8}q{yCJKFZ~u;5XvQgmsGMB(c)VQr6w{zAZUn&P+56%9^5vukTQy`i zWm#nKs)khMO&QZ#*Q}Fwt~|5h2Ze`kFEk8GzM!9=b{l}fCtunI?}rWkbe`@doLB+{SCyb_%dg` z$tQ>OziijHrjVqeU|{V3EExEgU5YY#cRQ8l>%P&NbCp*p>#vgHKWT_oP9j;Qk*fh!BiR zn0{7GieHx5=A7$tcySPT<4gNZk&3^PdzpA_W4DocvasBdX&d!!;-qIb67s&gmtFtK zf48IPJY>RscA*C|L?{n~_r3~mONt&)cYk?pLVzUkm^(k3fk?-UKrbLb1rCLJPUE5j ztCr*}%eToA!Q>vHbd(hVaGxHqI#3y_>9RUIVDF31lQ3*7z$(J1LUcBLI zwe|};>0Pe|O2WuDx0h;~ul8TU&{V$2@;- z?M_bWk6fM6nF$~(UT))nT1%O40i1)!F^wb>Xx(gtBw#5%!nIMX3}^uG!@n?b|J9MU zP)+$6t#3+g(gq~Kjt3zvIqKp^1;=hCkid9b$^#|k|IHA~7++7qv(rzsCDf2#jL&jw z_L=H9?QF&MAMZzYjdFS~H5EA)+@5M46gc5LH_U-3Ds5K z+tPfL(kfxN_gC7F<^RD;l){0U)N9=Vztmnp%?s)g@^CE}uAhj3u4oZ@uzF4Ly#f8= znEoN|=A%{@IvVCN3!RUW&)=6k>bG#eh&nh#_A?$1fW>W4?~aLv!j}Z1JuMS`MH}km7NZiM|Y|&k3P=FDN#>`J_ZZSWmSHsX#hZY{GPA z`yC<5Khd^g^$D=gZGeB&Zp<;OscwHE_#smK1R&K8kSX56mJJ6>gv^i_gB;1y>cD?) zgwYmW-&wijx*qgNrioc%Q=4IRgZBd8O5mfUD7@amvA&-TUPqe^&nIM{6&fhNz=)3+ zkYcp3YY5)CuABIuuG@jcSu>gru}iH|-H>xvv*5m-+&z{AJIbMiULRNft8G?+ET0H| zk+3XPp!I=*M~nPXsfipy$i!m+j8I{3WSa^Y=O+(q1||3RHfp*bYKHuQa^kjYmkL+< zDGh?tK*`$cy*QK`Bmz9hC4jZ5LYMv2qaJ1StWc|ZDrtBq!jM28& z=^bNHOLi&@9uz=;rjmJtLFl9BcgV2N@Cz#_j^_V_`LZF8uTUe}_t=l3|1pa*&;V5v z+_wk@BxPzSLV=C3^w-R{BR}pRl$jgp^`AX|9GUED{AGY&iY;>|`_;IEL$5!Vl8Ei> z=JowH{s`iQ>fvShOwx48tkh=#4SAr8>w*+CG#d`4fO`N~<3Gp)2cCmZ=X!}P?sgH6 zbj0DjH6)gOn|9}Y2{Uu^ukY^0yEXl%3$PabKgZlX@%<8sJuh^V1>PkCfJxWMlwqGm zsS)zk?+yhm3^s{l-XNz8Ld7SpArp1pIIztW^h5!Y!fB0&k*a_jB4-*(TtL!|(2Kbg zM*iz-cI3|3QGWrOqTB-{Co*@<2xJguez8+6AbI2`A`)Fj%xpj~+fX-)nwPAV_^aaH z`MWdi{t6tjnwzc*D;ScoduJ>@;m>5|W4EVZ=iZpiWCqiUuU)A{ij8}Jgd{)*3IHmt zmGKi5Z2xFDS|Hu?b)`el=odiaqZWu6!B5?iT*o3OamL4Ak1)75Z`iwukDgVoB$J<7EdO#2~45D2)ZpcBVfLP$kfdouR0hoY3b+G&%C`!g9&4HTAYqa4tj6YqU zU{;RY##ax542D9FKCipu&x%f}el>s$lhK`T)~sC%z#uIg0( zVZgqC9Aj7t7$TBm9rrm7=GE5;S{w)r!RaMI+QZF6!7Xb$J0hGxHxs_0zEMWhH^;Q_ zfS!|1{w)5|+pbEHs5rGywfdc=;Hm$pAQYa4!sg9P1XSXa{j{%}fey?mDG{r`z`6CV zkY*yXb~P=r2p%4;HY<(<^vcntHd5>d3F(7juY2_EzmMT2;)ICe07_5KnA`Q6I=^*a zasy4{M8FxF36a^FpcUWS9QWlOq1QKNrRCCS|GU#Fh6Q85W^nOnj5^Fk zk0x#kW<5y7zzABw%frle&hFLK0VIHX9RLZf@u2I_P_UEZ>~GCx?RlcSf%gXGEoA3tD-%h1z})|VUVo^D=$8yK2`ygmD>uTsmG zn>_9l8?$+i__<#(`oGw>8}u+)B;B^Q&ezJ4)am<>{5ulniMPH*< z=AsG;04C$_2@s55tqg{?>2qM_Oi4m7AG(ZGe+ikrP-^2qz2nr>j{*l_1gzZa+Wn^C zxY`ke`R#q5cAZ8A>R;h;(_##`nuyY7gNUdJx^%hV#M1ZjGyG@dBXnaqRpV6LRISPM zGmbE@%QI*jGyK_?>8u*q+S>hgy|Z+~Z~cwTNN*eN&Z4Pm8nw9=^tOb;!5pDgrgt16<+>yQK#4|%jlAq_18nQCDfJ~s>y-; z+ylNPw#8p-svkb*C&DS;mf_=3AUtajbe18Jj5J*KGKp59D#_0W#t*QV%L1!xXJqlO zosq5M2{D|ER}LW5jypue>)(Ijv6iXQ!)Z6r&Lx{Tj~R69zKZp?J#M8{NEUIk&~o|c zTHVTo?HO|=7J5S7+_9Ry*_t#kxgKpUza{)k6U1Czsp0{Jd_3T>2kHt-N3sV zi=`*R1-zqq#EM75a`2_hhDWBS@*w$2?9WA~?z8>I_GjSjg(xtxmyy(9djM9%YMrx_ zuv56Gbxb;zu9-__(Uc8lV1>^zy2l95R=0KiEdHT5+2lxm29D&FYPwvuvfa`wD(V#T z=tQg0xuep(IQ*$QNai~6@p8_Y@WZeYid-#pxvwMD^3PZis$*DC$#7OckiCQy7G{3O zWgS-J3%hJxtG~wmT#HG6kzu7;{vn33Gqp0GA6?*2#JG_@P$~TNEiVC$oKfuqo7T1W zdPL2`Z-3Xb3`m=kA0N{imiOiv>4T*C8Q|4vQC_WUC3jg@;Xo_FZB*A0jaFjRgI0;{ zUn_A8R-%P1*|c{OR)TlL*zp%Fe272dp})v>$n-{6*8D>wr<5vRDZE`8FLK57^G?KH zcZ@FB@XdX)GvY64|0EV0eV$E(1e#zS+{-Z!U^}Fk( z>Z?yC9Yo5+f%xNNC zBZXVC_|@=7D?y!iY{>MIz7(;OZgRre5v~7x1XlcF_Nc<^D*;%{SD|=!DL8e>migg? z$}A=DH)Nb<*`^I4JveMX@iJr3jVJX&dhd$%H(Jj^Q5)>sFIz;ndc57(6j zQuKFw!|-#!+2xYiS-QV+J=dHAME{S81L*yjw7#)R5C@$#r7l4NG+}!X#UK)5e}k(m zB`_P-kViL*1~Ki1R6Y?tA^m5X-Ju=8I%dti*0Cm>kd~D+f>wGEaFwrw z&~aN_%7{Hol?^jB&H`sD0<RN{oJ35%(JLVEY=NlY?H9a;V7*NRW9fVmU1g!=QdH7}U)eSYNN@*|)H zrUre>+zl(L9~d4IJwUbOf#8xRLQ>aFv0>7s1nNzRQFzzVAv$ua$dwV`e($YnLjymQ zmTwQky1bb)oI6?BJ9v1{`9W2g->!E*PXKiZ1)C|&HVg?BEcl?=BXbIPtHF+8oGSc=hVif zId|t=y}Wo1hKiQdDHYiGzYmtI6&R9`TlVrL0%UrxREfFd@!!Ff>}RvMe}uztOEO)}+u)Uwu5`Z0p_5a}5bE91*Q{$jMtw3ICSKF!-WyvTjKfCT zxXmepU@siCrveuV;PhPO5qq8mc88c+cR`D4&PF!M5o0=oeZ1&M{v< zqy)w`m@-g+RFC=IQs6{OWK)EN?iYZ!c!375?}sM-^Q@d%X+%u9`yk1cE5A#Z`!(xo z&DuQJH}&|7GnbnHa6-P`2WN2RtWz^NPa6WwM#23RY8%6n z(!a0`suDD>J*39CN`q($C1Jo1JAB=R98-zfaB8PNP6=mz0pzyV^s7f{peLgjdzVa) zS3jTb9w%Zvch4BkvkVUU@9$!bFPAPe-Z+-ak}!7q5s#|rYru3N2{GV5S37QiaC;BU z;11!sAfZyG%V;g0*L+E@)#lPz{%}pvGV2++Fz6EDbPI0p&(}{ACm~o_H@E%3jRhF% z=`2ZE{do);sqeor(yG4nxcxaLumr%DmsH_QzVxuX^tXQkFI5Ov^~V)uLNJeyQ`#NE zWu0L&iJBtViPTum*8P%6N4x4&QZI5VkK|KY9@zmmyW1M&KgSI&$gSK2v!&ppk2 zlAQTc5}@Vs~_nGsw!$!W4fYFDIb9i(idTn@vB5>zl5^?^k-J<1h)e7Nrl4t zRS&=qCp8?__4xzMRDPP*T5_3Se2d*@^)#KN=a_YsaX=Bt+?#%oV?t#Bc5~V*H1yQ9 zXpo^^l}U$NR^9Z$hX5bZm?fY6h7+O+SPvp0(wyhn_^SvVX>3Mdi5-ArWwOyRh=)D( zKtT7H>&Y8*xv-d=AUIO`&O3QP_;NekIsG)}vHI`%S$8LG3e3$jvGhDuXmVeX?Tl4b zczEHJOJB(9Z&EGlD?j2;i*XYYHmvZ-lfAwJP$s65Ug3JFS(t+p4$!BDUa>iKd~j;$ zE8G;eBVE5bvgA7QpPjQ20iv+1l`fVAo3tdVpo!#C@inXWOV0y+-@W9O*z5bN);bBSx#Ri}oFDF6cC{Y#R0zC=&$YN6_cQ%Y_2}=VkI+vxCkgw^?=NY>}1}4n}<9 z%kfVK7?W@}I-p5s*WcZmDcM%s1?@Gy&34@!UGB-dri3`?Fp~3dmSs!ae1Br@=pYyH z`E7gGUiW_BG?0_F?<;&|j=r#mox1|UQ%I-|61VhXn{TUw5``6c;V1V`oKR3@@>4nK1pF+khiptRPkdenC;D=Rdhn5wmQ) z0~gvMqr?t&?l7`*RIV&Ca%8sO-)7S+L1bcg>f#0?)Ey&WlrMM12t=|gzQ7lP%(+u3QVh59=>S|NO=$WRm*esN8^Iem}PF0 zs!ty;SmMF@gB~}2|Jmk%x!+K;;eO=CYakcl06gFD?h1i#2!IAgEeZ^r_-Pq+ETT=Y zZAw<%>|ktK_3WmKpx;x@DWBrFj7kr&7h#+bi($hBNIbMQ=cD{c~uM7)`4ePM)H zE;#acGg=s*V==|etL4wp|5v!*RhJkYhvqCyAVYN4rc z55i?Pk*$h{_&>!PV0JcX21ORCbu-0ne38IORa>9ym#Vvn`SaL>nLwwoYg~A@t5-)m z;Hh_t6@A(2%00{-Dw@BK&rPXerIX4F0A)gIxD3b z8q$|Pp~c^OgZUrt5cm~hJ)V-)Se`eT=FvQHKO|K~{gJ=WAmI&UA;O&>@K8&i{Vsm} zSA4pYT3$T;sS-tYGQF^CMXaQE*&s}$6&ZO67U)Vdo^tI4*odSrLHXvWeerAX>ddEzoC(H2#Eq{Cdo;f z;!}-KZOp*bk#u@DtD~aZz280hje^&%kw$kVKA4fBnKi5MaCBG%FaIrq;KE_TJh0x) zC!H!^<&i}fN!^8M#{NYwzr)<@17=a`FQu&No>%h3YF*sMrG+W3G!wZn;LQwXH#+#_ zg;FGv=>b>vZN3ec|Eu~hXd(#&ti?H0V^YBzeNgDPh9h)Lw1P}|n)r5^>twNsngJp1 zYJ!LgX!ew>2HAcEkUkor$qDbGGV9ddQZY=%*#cs7y8r&(6$aArln7nOHTW6FK>)9_ zYZ1UY-9KkxtY914I}1~QjOygyfXqg3?`ojEtJn*}A`8X9v$2MWio+uiy?DWAcMRek zx`VgPgc%lU1WB;`Dka3Q#BSValr5=1;y}D2uZro;s8>uwB^D#M2$kGu2qF!m8I98Tt?lCjI5r2^gkqBm)f)e@wT;Nux~$Nay1})6(4qER_7J+(hn~xS43Z7U(sLTT z*)v(0f9Tj)W@?fjb#H$jra`|lpCmheGBUsc{GKs8c^Ux`PFBE`iUvyE*l4a>ujUl$ zc%tma(q7BLjioELHN6kf1hBVW9}PeeBTHa7wXAhWs?swan;<9A&U-8(R^3M@-Lzk! z7$nGb)>#`IEh{S(XPrG#sCZ+e`6P5^YXxWvXsnJ2t)$mV8V2tQeO%Brj}K6xrJl_|F7&cHH^vxrsL%`@Zqv%r zd0)zn5}?VE4cnC0?p>@pJxhE;lS}ePmHm6J3#QB)t`qvlv(_&hbQK?SPt=Q9S=UK@YIe zyvDcG@$(_*cYS&;oRTgVzphzMxt10gio&2`S|XfQMo?r3J~9-|ue~TZ>v;a)rpVBf zA7q#-Nd<){4d7WUv(|)to~9*v;g!3tmALCfF#9VG%fmLG61ian zs~)F2pg3W$doOvxwZg7N-%Kn9K-#(X+F5*7WF!~O3vlORiuiK|5%w*NN3sJV6Rk3p zK@)Rz-DGkjq`9TnAXrg5Tzgts7qK8| zdgt)zm$dq+q8rqUAXT-4Va>&)XFh^lM>CWmZhMNu^;KaF=wvD9KUP2N2zxuVsrk&+yt)Mc?Ik?L~9JGnV=s-Mp1l5P73G9Wk7qXwRJsX$&!&iiR zYWAO*cn$R~sy?;M>>Uj0&R7 z780gKb#sKgx+gEYzl4*K79->elzm07k?(=c{xz&E)%v?oTI_x zG3U~9qQ7c_hHq4C)q5RsuRHZM6-ixYPQTc2-)?E|?`7R%=r6wca8__}VcpZqru@$n zU+I^^rnjqS3f@@`cl(B``}!w2R@@cYwClCt)_bcZ$zNBb^7mceT2O$J(q&3n{3KKX z2<3A-#cdG8$C0R|3(-c1D(CN6NLY56?gW9Q{sN`GRx>`A@Z&-{eb^pceGK)dM_>_d z5!RnGc;!mPLz4X(q|HE1j;0>8ZZPWTey;SHBv$N2FZImWZFg$v5=01yQ0LIPf+brvn*7Sde@uw z3P1`frkAw~sy=cocG>t59Z9{WO3$XVMp6dkPxpr(DQY3mJjy1EX)%eXh#Te1YkHlTc~u8m49S zyu5Nmr<6JupxS)Cf3l8h5tVW32&?zFgU?k-whVd>*G%AM&>gnGQCN4fByJRNu>|U( zkhteU^A?K7W#7U>sv3Tfr#!k;po-4|k4bF98F6!MiGC0Y&k)XWhO+yWIX!Wfi2RSE z4X_GcKls~uQPEWrT~eJB?;wVzwAjw9rG~&7+3p91g;-^5=Q>ndTk+|!ZIBGyGJ4MO z%>@WvUHK-LtX+q_XU{{3+@^S7qb)DhkzqeU2!_hw`NK!v4|ybfhF@GS)r=2Vr)O*z?Ns?x?)W-DqST2&b!jXk)Tsd-? z<#Kct>=>_j&PVg!lboZJw+VR*qQ4JnFl_IEFo4_OQ*5-Q?yVQEQIKT&w73ASc5 zPJ-b%HkwxTmi&KHBDc6x36q*;jXoNI`fDHgsy*DY=djPM{)`_W{lrG^C%O{C3xI!p zV@~u3&F3}`%LxcgjU*L%uhftT>Lc7u$j#DmYfrrHJ!>$tQT_778dOv4aaZDouZfL5 z{&gkC7HUwK=oUv=ksJuPixaZ7!%gTjphBVs5%8b}m)dr|NkuEv;j)>Ko=LHJ9rj$o zZ=hI1J(J!#8B}}Ppg!r_F$)Jw@U*Njsh)@LOWkY536&;9{ByK($4wr{6#_*pPgdZI zBC6snrYiV*$!TGGU^ZGw&)CBw3~cZw3)SAN|1Q)m`~#wdgp1cOQG6!fa|B{9*l2Xl zDl`FxS{W!kC6%L*N5N;&9EyuQ*cm!hW@(^loPj$LE*pQ)y?LNhs7mQ+ z8cm3zR=0ILaCj3Dyrc|pV_4OcnKI<-cqp|ff;;txu%6E#&$vuGzh=+dnhim^fm2s}m4+vj4hjMNlropv|Fp&D zV=SZ3U0U4;z#}j=t~2R|>wP_%#2wS9n|iI#wdqBk&NEnquWg1@7bv$^rGkYmLRpd) z!ha|hUbcP<$P(@XVi$aTMXDQ3u7IioSmzdbEbx>{>0lPPk6rL3sGM#{ z2?sv`_oN?YNt4TxC@Xm_NaN<3kfE-Ge8UCI+WdgN(QnH64=e^_)ekFQw?5})p|~Lh zfl9S4^W7Ui(=-i^nx~=x18r%*OT$X#hbWNiA#KicCgr-~vCuJS0T$u{VVPqBkWf&N z88yG;Qz(FO_T)7H`A`kwGQ_?rMK0!dOEK{U@!l~Q3tsh-S+r>@khV67W}P` zKa;KdWhMzesH#HjG>R3|q+zGBljZYaeIbNXha2HqtX9V(KIny^IRuY==_iIN!Cx&+ zh%wKxCTghCHs3o$LmYDg79GA?Sk3>0Mg}un%U30|HoXrwf(PA*z&A66gP;+RX87i2 zqnm6#)++rV6AYq9OP^u(2WG2XhmjMrGxIlSa-}y%3GAR$IqOnIqPJ-%1kUEW!>bSt z2-i$H6?^fbL*2TX;SNmj`){=c#IQ$PLD`YOxOidJx)OiOdZk__q0Na#&DOnsDob#_CE?f>$g?d2Ok4Jr}KFQ@BprAWG@m%TjHIFyAZ$Hw`iy+BaX<+wWpW`m5TnWLw;x;I&Z)oIJhBYPQJRiW#wY_z^mWGL9Y-4L- znvJ_F7>fxx6ViR)_z6+|Cfip@hc+ere>dT77Jd+Th|+#cz_)R9?2mxe!#i;Kl=bmj z@+}%{WXl&M^Aq6OkO%6bo}&pbBwl)aP-t0*1o>9^3OAjGWSH334DG-uUv7gL&&ZkB z>gH}}bXDC_6eQKl;&g92|GxBe?-TRiP>x{ab>0P*67uc6cfPonLRrTOsv51a7Ya`L znCQ2(y-gm{IEHD45!z{UH)(RASbP>#j(bcsHl#f+$xJAFLTvqugiz4rfnp(W#M3xb z<&Le=Q02#qI^D)hBYBUa;<)Z*T9-rHP^{BiD4gmoFykNb->*v1PSB?;D&f#Bl(@T; zQnVuY6Tkmr@aLhE0_z~8avqfHD1Hb9hK?x~l4)1Amy#$uLvRoYSeer6Cy99VOZz~0 z3d~bo8j--Hg5(Ini;P9qvj)55tVFyc1CI&NlFLq@c-L69jO8H5p@XB}qQXUln{b}O zsGw4bq75_rf(Bn%L^$fC6hCm5;8v6M+^AO2rY zl7=-WIw8T0Um&O3oFG~d(T_;gom_Ia_7;>zcaL4%?K+Mz(yD4ugGxUXmq?_I zN-6lUJ<#b4byfJBe1WB{$bsQ zwlfA$d;VPVnX380g(KRjS13Rv=_NF3Nc3KeBH>|3nBMioB?{DwftiVhpQu3tHPNl5 zi!+J1khSV+qS!T4|6O;@J8x#Alha@mOC~SkT@?(!ffgC6jEEqx@8UYGujNAz!(0a84v4|C65@MtqxFW1OQ#KKy7KP$j zC%JBZUobA*kd&;v_5Z+T;5b-%4Gc?$vAm>J00?Y0M{(;!^(KJOncM8Q`Fe-DM@Oqt zLTr+}u58E0KA5)RerawUQCw*};=o+N6r@sE&v=wcj0Lgt!B&5rjd-&ruZWZO{X;VR zEW^j}XV|h>07ZWuoSkuLHLUH+{n?s5 zHPGc`n3jN97;!S7O5jxg>Z+!XQ(VI8x!Y(6I&TT+c@m`D(Sq+6i zF!pDyo;w@_KGVpcR1W@7f5x{I6mkUCeiMOwnDbjsL}M{RS*!7XS?@5CzEj7@{tPsn zx*GBndD#HMbNDS;77g3dqRi-NOWDJDusxvGm<9&3wE;;84+Ev`T)`lkNl%N-OwG3nF9t?zJAUrDHAtq{^o%(cgn5Wt8{5o5y(R|8efAX(uNKxTbiTaA zg-XR7&lmcNKC~4_`$B`uap)vW7M`$eXE|zac@>RN0MxU1`Mby~R2G_vVy|w+E7y_H zPicAa_2X^P(A+erKVxtszxI=U`C5UkT%cq4hV1)IE@w=onKhpPjH}J z8@cJPUn^7%I_DCG7CihRp?VL_Ld>A$429_7SZFp9q2KN#|@O!hwp~4k^xfpHkV{4azKHNB<+Om z_<=4eWPZh9mCiY+q?rqQE*PT;)#p3!iq@`P)!*eC?$vwhM3cMJ9@Li`0@EO_gU-T2 z&i8mbU(_(X==fc?pAgIQQ3m>P1FW0%v?MW*C6LUqm5N#nf(IZL$rwNp9|zUaf57uF zE9|lK{_-%rJ;0??c$sp(`fSI%x6r$ztE(pO`AA+-eO)f&fO_LMKOQJPFdu2HmXjW- zQeOZTC2cM}o1f%{>2z4L7Wj10^O(zejSnFy@ZtJ}?SWn$QMAAAwRBZ_B+FzJL;TGi*kbBdSGW?xJ1KzBG4VpEI0wF667# z)eqte7H?_{$PEk;D_4#t=%b=TQ>;L9;_V*Psr8ct<%*$al1ay_*DiKNi@5OWB5Mz! zKn?h2gXnjKi%>`9ZPtNggacCU`5<<@0@T*C1r20+Y+!z=mEXmU z1HHfS!RvNBLr2JZ^lIQ*Yk=COrLdf^T;(H>JTia$9OS4xV>aIKkcJDewD>|*_}dGB zuU3ci2S=64nBP(k%ZfLIa;xn6)t_=K+GE3)fbopVve)i5tWwa}LLN2&Lph#RI0x-M z>3mN`yIiv|KVZ|sTN)b!g2|BlSPsbxW?l{=GkN<~fkcn$ArhO-T7R^Q3bKD;hwwN4 zfVC!<#*ItOta;_Rba!8ke+>u0%_EZh zZW~hfzBQjCwHO(#`YEz>0e}4`NUr8}p6W~8987e1xtaJ-${U~y*B7mWzxEMBjp>fN zxU$`5WxODOg>v$=j?{^)zB$>&DXo8(LQ*HZ6S54W9-X=q`-Q#BTSPvmm_VZSrc}Yu z#FyDbi(TmTaWwCt!%QUwNA`8BPJZw~NDsXLOjL18378f!RKFul|7r^vuJFo7!-Jgo zI<>QQ70=-Z^jEv=9h{5c8CcoFvv~9>dmo)!md>#BZoJSbU0cjcYDZaFsFvZnwB@bYhJf@ zLVAN=);l)p1a>#da)yxiA|H$S~;{`CV(w(}vQl5@KL2Ed$?E&uS!f5%Dm z3v`7TL~kb+sZn8jpu%=O?y|n4fCwIw>%(xJ8b9CJl&bCz-^(A;9y-KwNJT+T_cs)c zL~iw&M-eUW$VG>_kwa&Klo7M+7G3iP^xIJP+sW##v|Rl)74p72X7`qZ+_RFg(TpWC zTf=!qq9AeF6%>{r>hvy$vwG`iLfFc~O4+DI=yhs0HdI+c10SEX{_1aOlBbB!rvA2m zIH3KAUAvkwv^&2^e1GS7(zfBe?lKbeJm>X!E$B?#)ZpKkBtonhTN1XXHJW!4a02wY zTX$$T+uebOK<-L9*68qHYm2h~$cC8Yhbltp@uw#Q>%DJ&C(4n!?7T|b*R)yIX2&Gv zEDM6R!g9Y=MHff!B=1H%2WdBpiIZzj&b?M(UibM4g2B6io9<6fzoo-H_f6rM2oh(^= zwy>ikAI*upNWw@_lz~U%ti(bMu~@QaY^1>Z40HOQbI!M~oe5XP(r@~FXq&W z{*+&m1)07EiH|rkT}4|^f)acQXXfr}K7+UkNv$n#VClABUIz|RYPr|Dy%4)2OwV*1 z>PQtU-^D8ZpieIQ6DjYOjfY)|vWz3-9U8lN1llS5EkOJ_*1WTGgyttf-|cVi00%XM zt^>x9hark6(cRc&lLJGiH8ps)dwYvpI(|e293t zu=IWlS2z?4EC_~ALZN>~@iN`;1xRy>=`Xk^5Ns3EcWIG!I;7YiCp>17uKRxca#-Uk zO|sGM;o*~1;m(~KjQrJ`uh(GiB1>cnV;qlqr)RgjAZO{-B+35SHNLg`=EST=qJsvn zoJd}TQCe@39+&^}z1>S9I0c+gLDkB?08bhkM7;O%r+W*MEx&ZNc(bzJct6Q@(7F-qN|fgV+A--&)jd%iOB9<$QVC^vJQ8S9-0|HSaO-wa1ez};tTB(5Pog*v zL>IKhLuU?oe0WGv@<@Z(Yl0fuXQ3n6TMNvM1bu$TgY2oZ-eGw#8Ji%~Gy!9uxM+NFz?S|_BA%AAoX74qp?vTmu@`w{y2tCJMTmIjU+`$A#Ixn_WEj05ElqPLnUrK*~iaQ}sBhf8ot{I4 zT34y*BP(^!cRhW)8@R0ixvWXvrCXhz%}RHZ`Y>*8CCb!lXLg{9`Zfad8VZU&A4;&M zW}(Cj6jXQIpWD`vZOAB>%N<_8ZT5?t#_&Uq5Xb!&?CJ~ZAuxJP@Eq)54oYi<-xwc< zI42CE*y%ZnzxsZc(Ou`(tbJlkZ*&otkaq7+*&*0pI!>xia11q>OO0CUFR_@nD=j?_ zl4Wy9^&ljnVoK3%0Inb(K8$ZTz27IMH6sdEls9WFgDmnu84-sc%%fFA68!`l4CTmH2t{5q zWA8v-Uy`bZkwpHKr%4K*jH5vt~Gcyoh5?rF5DG z6Ck`s(;_ojkNwyU{H)@A_bGku9zr-nOkcbVq&!-LK@ky#J- zAlxC*Gu=;l=@DLLeo+1(2)v6a`cWlC*`m4<4oQ0AAyesjlC*g9Ai}sahl0te^qj+u z=wUbBnu=n~ zVC+sDz^^-dD*>2nA^G{1L;ywI7hT8N$Caa2E70Ml)&01#a$0j8Z_cS^_gloB%Jw1B zlikCoV7{F!wmZnI?$_E(cO#iSh;G498BJ45o=L>Q7lGsGN(_n z?&OBAZqgl^7QbqnMD_>QbO}nxgRNl7U*Saj%S)c+G%-u!CD6b$%f~(c8B*i}F!?8#6Y$=t9*2_=6LKJ82v;Q)ck7YWkI7; zlwU<$cRw1kQ2?@rlE)VX9!9^u_-MR3WcFP?TJ@u|SCiiU&(nk1pwh%6#R*2QI2^-c|o&V-MBwNcQTk zg6_T4OlosY=vF;Y*v=R|7^=M}FqsJDQOmO)|E)1_g(l*>0o3~ zYdp6FJJw9rHh{`tM6Gq>n&d97ug1MH%2P%3=0{^;w+oGS?4Y$d&3*5XwkC$b3MeUU zY1awgiz<7*3eA?;GBwrOs>f$qs#kyzbL90Is-L-e3-P67$NT-CjJ0~>Zh#I*Xa^;L z4m$;mmr}EtZHK=cM&xBv!230cFy)9meA(gfvLj{BvC82yjrjuooqk2U2av30n)h?? zFNcX%&=61P3-4b)`t_;UVUr$4hc9*k-*5vrHFbSN9m-g%_jE~w94ui^eNdDSqpzsk zjg_YR@FC?625~*^xi8OJPtfNgJ;#9U$HbTd$Cn*jSl6P~S?cZPO`3$e?#|Z?0cScy zVChT9vsQi(1+U!XQ9V_dbMpSn^#Z!-K2~*n^+eb*!>cU(V{Ty1h_|@nLBvMq(?nar>$zWLeDM*uPO44Q>M&^* z^1E#pj=ic7#l%DFw=0!CR>+O+&&CgU2g(%-y~$(4{Y==Dd2RTCJegPMbGH*=H1zgI zc7mXDC+C?FVP6?W4Ws2a6;6f+&glkkI_Zw> zD*|0^k^f?~IOUs&&Ibg2LZe?PiwB_suq08=@KW6w^F4lcd55Y+k%Y>%`J{YKxc~T0 zh{H>?lFwnn$9udV`Fx66g)%v+H8K0h;X&U7P1kQd<)VA9her?sHz`8y43=p%)~h&4u=n#-bci}KWb$8B_y=ZUr}DO3%`m`^4MK3nyn$yMBGSW31x-*?;! zgekWM>S`4s?jYGGlw+v9t8Jrt{l=nDAVZe6zn7B=!srts4`(7&udI%C_Q=5bX1Vkr zJU$(WjK;ktL~N=gcet-eE@pU%5^Tydu?hAf+OK=4M26R|Z6i1sZj1?=kyduR$e1m( z)c(ue6W?iow^O;7X&^*xpeM;O&hRTUc(nH639II$dC(pl=0_=3yeS zUn(HbCbI#%0yzGDOfp5o+WBW+J`of+XLFLqmO_M-7XI%!d&?Vz_Z(2@VYh6tFc_Dc zvYhg|CLr3_%P8@bSGORW)Xp5C=rO`rRP2R8ANAO>)gq!4AU+KN=-;59^$qyjA!@k) zIfS5Y&nXXdoOe^w$SYznA|Z5UNJ5^-xqqI>9Tb~d!PDl4itN6g$)T2(?~1KyBr)}* zqwyDVo{amkQ(C0H7F!y6mvEEEV{#ujpiEG~aE16vABBVMDP3h#;?=wpe>VM@zCUat z&r$DH{@|^rYU*=&jD->=4!l%30)oLd7jaWY4Uk8yBv@=EtYWJs>6Fg_mEraR@mnSoVXuCfpScieuh>&g8=s* z(c1jhNcDznC9W)6SkmDg3-MjTS=(M7Qk5V!5U)eH$~x2Mmrn=MKvuo6X?F>WcuRA_ zs@7>IdA9Uqu1zMK)_45nHE3_er6Vton|=z*S%OW@78fo$im#As@uG6CFT+-8ab1@= z=4qNRGu3Uo6D%e-{!J6C>Rmb0ls|BP0qvL+@BlPpTE=YVM)7=!$Fk^BNmUcy?`ofR zv~vOGd|s=x?gQwK@4h&hL{Ymlb8c}~RMFk9kFIJovE6z(ymr3( z2?L+ia0SNM-L2;d@$_BZAPPfPOTKqJ0pmNCIIpKekc4 zMq#pZulGZ}X;pyS{m03|Jv`*c3T-6M1|&Gxz%B|6@?q6g4Ok$5^U)X4N>=MHr!ac5 zUt!&qm;(wU2&>0AfdMnopO#X5a#lJbge+2Q((!dCROoWt4$OJawxys=vo93|om%F1s39~8bW1Eq4-BjfV&5AEJf`T zb-y8A&+~p=74}+mViZ0r{t`i8LaD#$bV(Hs035z?^=Ae_OR}FSd)B@^2r1FE@8~fx ziWf~mQ2EhK^yx0h2hY3j9svH64(Y3OM}nDL^;Z@qr$@p9Y8x{hGP~j&%E+QrczACc zy?+7lOgnw^E!5r#NHZBt8(GAN|0~ty$Q>e8K~5=4+GDTJ(F$ZMo_<2m_mYbV2b-j2 z;zV*yzJE#S#9`PhN{H=`rUHUL`GBDv0|6&JU&HVjmya+=s%a#V2_tV zvdqJC--UiM_E?ZQ3jVB7Ab>W#Hk}DWbHz$&eFX0=mPSpff+(!c{k^J2R|q|BCfOx~ z1IWi2g8VO>7H0xRkH_MA6NKFdwgt%>)`povAMAyh#gkT@aZY(3w=_$uD*ZNM&KE{` z@2HaqRL4t6b!Kib4EyNKNWMMfhG^3#{leu?fqX-$45Wao%8UVoNE#mU8VV)Lkt^|%?^I z6lVTWI4mMw&7~f%8wM7n`>qRpH)OsSo@i1vD;4lM|HJq8LYP#%Bqvs20Ni600nuXx z(vUrO8RTeze8yAo?DXxoSMJwq$4@0ghtu;5?35m!Z@=pw00c2DzB`zkm3906eh*HA zQ!`4{!{%&QU12TPQA!pA9US^(Y*TQx9>9gH;M-d~QXud2a^{!`StkwS+R%eNVDbEL zs{QcmB_UPiQ^PZ}&$j4ih{Y&SW${zjdg!ZSVDpv4(~~x@Ui+0oQojEn?DNW*J1EPv zN2={&QP(k|UTy7cBOP0p$t%4Yy)6z~SXmsj#o9*d~C#R-2k_p+|R=x6DC&Dh?*2avqSB3ls zD|F0`4BbB69@`~zmSY`6|DhYP+Nb5&Y+tc}v{wCTU;jnC{r#Scmv3DHycuFy_#NxB zf8LTb@|F;$;D7&?V)TiqfXZn*=zW3(R1CCu*D$%4)g{bNT#jxK`En0r()Y`W(~9+p z#P9;T7bj8zE_7bNc5ei4;h9(R9b1LDzdj+`)cbY0HL)pD1MnD@1*eW5ro6=3@J(~8 z9kt;eJGiw3yL2&9$1ug50V?&Rd)7xTL{Y{!-_o545(X;z3Ae%8F5(8fg+A^2pCIjY z;CE11w5FxS4~v+;?s&|DOF@(woAL=U^#!PC^QN8(t7>|^`zO_LW&=-EaTOxURcP!r z7zlYODoF*x?lHXhz_yaB1^Pr}{futRicr25(6xU6<)WaO{LWG}4Eje+(;r$;`Lz+4;Q~U6y zl?S~eKuQtFaCp;L3F}LSnluNZ^oW{aoH4A`2PFx+F|`$g>rQTe^mJRRjSGak=CNBH zi1xu)`=D&cN-IL+s@zu_Pb1hXj}FJ%#%tpMbzcUn#r1C@cC5|PVKka$mWx`2@B6ae z`fXkD%S$!@5=IZ6G7mMxfubGpBR+($Y5Iq9rFu_A)iV@kwT&n?M zkk5>ZbhIR5o63aAS}Xc-Uu9Spv_KZxZ2(dbO(dZ0#igr~mX%KBDmD_ovpI+CZ9T2) zB-T&SEs1Q?D!c8HujmZDRx6~7$X;Jw>PR}%Uj%#{HDF;4Lh;}J&U7Lk+N7sBa;Lpq zbyp`Eb?jP)@FpHWc^NecGm(f#`4MNTWqX)%#P@qJ)eR-@SKON1DV!yuE~$u~eebf; z-dujX>bhMgE2x6}jNR&w)UbT ze`wr?G_y!Xeg1W-Z{pZS^yP3mkf?YOR#97PHMZI-b`FyFv6&M>&t7Qcw-&_jt$I3l z0bMu7umU7dCRmx9uY3mT=6sgPq8sqV6S1X@!y30j94qe&f%r5Ey$0Auj158xULVwlk3g()84w2mw4)oQRqrnJ%79@11f;!;>QlJy zAe9^5(6&FX*dn>*j2A_8@H3`X`};3|3AOYHGe~)Sf`+H$q9%cYE+yO0u?$oF;>x$F zy>d~{3l$3W?5U$696S>OJy=N3IoIe3uG5F4TRz<9A5JR=7B9`~NkyKG?|VzfZkGW_ z@x$&YZld2k!|~0*p4y=v3!xA^<7uwF1f9!gTx&LIrKyGdPp~i{VJ=;j@v5!ekO|w9 zVkm-_z#Pp}aQ6`Q8|xQ1y8aIr0H#`OkE{A#L5IG9FhKX{KB~bh`ghw-{GrkXLr$23 zO>d7LyMvGmrR(Gl8~5)l&2QPEz7YD^j(HLw`kE*QG{Rb(-e~Jb`#_lx7B z7AG;BXrM8al9J%a#~f5%Qtnr1CWn5cvINfDi~*s8db3~!jxh|+TC`W@CGJu#wn*HX z_nSqsi!!i^BZsT@*#k*0Gz1)vK{m=KeD>eu&DsY6hh~(z&+iA+);>-XrJCQm)%7ee z>qs+mt$p>gz;YxM7DgJWy$vh0-=R;BMh2m<_i`!d{LBt)S4L=}&jY69eD#2AD!l`1 zoY2v95xI3KwpE@hdLrJw%}&d=&3!JhwX}v>98D`GecyaQ33o&H{XuR0ta7e7^czr zO&g5ZJphnDl4^?_{C=~_l|CpnpU6YYx>g}Kk!2!MnQ%h5;UrpBvi}nk7L$urg7qu7 z>i8x11xJtO7fbx*^x{-q5}?_RU{%n39oaj}mzbCJJ7~T#%hD8QJ`-uhNSK4j8Q%Ho zSAloW4lKCMleW<1`_L0DSwBBk@2gyFD0Nk>ohWJCmpCF2;6{ZuSmNNW^Ta3Wn%lxc z*bz_9A5n2xl!UN>~Q5T=It1u+Yhx`b@)8mtmy+*6D|MQcq5tDfrDq*YILu*IIcoL67b>-MRAHmz|ExZRbduECv~5sWDeFygy`0 z$JRJ81UmDbA=ugkmXb-_6N$q2gsbfz?3!~7<7{5gWLb4P2t5OH)fz_z@H;MUn}Fzo%|qH09csIMRbzbSyduGUjT3aO7xKp1?5Ofa2yU^>tOSC%kc0;DC)2^?AxMcnOe zFIF#|WYR_NpyZ86H4{svAkr1o?hoM5X{4$#@&7BcnyTBJlX5|=P~4&JKd9BEAGCG+ zfLJYfaV+)KWlE;SzpQFS6l&`u;xKcT3%Ju}X8{IV2S=r^B?&iusLXKXE-PbVtPRaD zeVqn|t4gW=_a5*BndHsl4QRD%p=^!`yS_(A#3r)d*Lwx&*REVCz2t3;^lKr4)~EjT zYo_p$!{2bp>iM)^!zswiJ9V!kB_97f=jSjE3EW+#<8tH>B~wcWp79~B0KY@Fd|i&dzk~YUOmWAn)gqQHUW~o@a;D(| zP@(O;`(7iY^@LMEJ_5^*)4%uCQDM|G?Xf4m4}M`P8PhC($o@}ds#|L{TI194L+k_K zM9d0_f~_g`s9afb11dXP{-aEEs+nC9v_v_5+K8V6GHOn{Ecuu}w)qO#TY}?~-j1DA z14plb8H2DO)jJ%NzRDm!&pF!*&>0#unBh?O8Ht58ld3@p9|auLa;e+e0~0$LIUcj? zJ|}bI!ygEUAP@?iXAB{Y0=&YB*tMsBj`1@THnyM9&C$SEPirZXtUC_}vE=0cjvFM# z#sPLRCUDNm{O<8?@x)B2fC^p7eSpeLv&ACW%UV)&t3R+ihYtU_Bv*85s3haN=aI-Q z7%4XfA^cEewEBo-8$MMV!l-+ytH5!R1Z0B4B^#VHV2PEvk!w^~R1qj?_D(&m&@XXZ z)D)Yh#~>sI(4^6R-_5xbL}LraVbd>TbLL>IC<Pt+&X1r83^S+pOb`l z12rohynsI5fRUE$|2HmkSgK<1R|U|&-wt(80O7=R`$8KM&4Kd z8F;e|3F^#v$XiZu|65ERS{5OrXr=_wVw`&8sn2LNsZsoR{`yVW_AYwJ3+Hg4nDGrfjVT_~?$+g7NP8SfX>~LJX zN31Ro<^dg`H4+o_gnn>=MM%mFB!VX2yXN1Y%WAJTqD_tIsHL- zr<2S*ZGYq7m*55OlbOG1DmJ%|_m}VNvj51!ro_uSFKSHw%BT@h(Dj%WGKy2bcRW&) zn=L~yDeI~i-!sj-dj$bt^!Y>=+|s7~&+dkaUWe#R)Nq456|Us=Dc%4{xFuA}TU#Yz zV%|O9xKNosN4XfZnrHm3jy#>VQJXIX5?C3&67J`@U)!WZ7XlFrwiphb$VFtZ ziEJ~q+4%1`tW~ZEAPAzBo{$YFt#ni!9svf^S?&7RXt#}{QkL?9AZ>G1hC&htA{nw} zkI+w#h`Ig+T1Y0?`i5m#TjP?%k*dY^y8UId0t-PD(PU{cWzjeQtk{wuP*!RITxihQ zPlJmD&u3$3&Jk;?LB5=`AjC#Etv_ELa$1{;z{!R8{q&d9@RTPWGI)Pu43qc4bc{4i zMM=@qp7;j-qnsuST-i|{0y{Q4xGiJOS8f_<7|kiiw2XXOd!BO;I?LKxdvM^1d$~2< z)|o4{7uY3JJ$=JCJLZj3$4ehf6-iFh|70CPCC{2o7_L)|F5R}rJt%SBPmub=ckR%Y z2#uf9Lm%y$^sC)vZoD!_^MH1oL2cQE(e&%aZp8_KH8U+_IlCN*|C@<90kC93}$c5X40hPz^o8Gt5U%&wlz1 zCBI(Zo7g5XRNiuJ?RH%MzZj*=u(NiRi#cccA0G-t#|x`*FYCE)L=}%-3Ke7oJC{`< zo?3!C5{0eJ0=`gP<7KK*nbHA@m1>Lk7ael=%I9HT(e~q6~Q)m7Ztj`NRKhCgY zJu>FD|Mdj}m1Jpkph=a;0mBo6QUMKOx_Gp*X9&b+kpOKm7i!7V_48BN2hri4H5mEd zE}ggPYtR2y{yDvIaAt5*+za z8x{w!2bF5o>K@{FRQw5XJfpg^ z03}|c;x{6;+$xZJAbv>9e(HMen8HwBVpV0|o9U$8x&VL|0N!`kbq;79#C{~TUrQ~t z#L{^%F9{LNTr*VCk$e9g*E3wm)p612Jp(r7S0tL@cUgI51Ehv%mN^Q zbz)w=mtX}4#N)!>_u8Bg{|7N<4h)lW;rk7_?vv0GqY2?Lt*uq^m_fkDA3HZ|G7hv0Pe6HEe(ovZ(5W}{lf^A^Ub zZlBDcI#-6-_99RvNqr1JEE>-WTXQ{8~3LASyw$(1h#-MGqQDv$e|di(UVqCv90usgZW|bTL=8W*lNqZ*aAQ zh*c%Q8xCiod;q02s*D)iqLHJwH0zQ%#o@SFwO^J&Vf1-DMw#seb>dYxdda1KoNwee z7rsV?3st^J%DjS2zgu&HPli-2C~dF64D@#YSAPfM%!r%#_i?%?-!MwR|FO&#ZEJ_4 zC789t=V&;+mvI!pyC;b0>;TKZ*pSu#S2iRQ_B?1jIBI{}TIkUg z)8Bj)Hv2AR5-8R8N%TQXjR|>UGkF*B65Kr7aw=CAwFyfdJ)1`l_8;rH$%YTYK*eyZ z&U;{Wk5r8+3#VR?e;%2u)_nK?2DdH1+KifH)ht9zv(mu>bf5$rcCb&#KFR*jDhvSK|2P;|ZU`h1mH1 z>k_t^sr>Xyz^xlH@pD@=pb=E6fl7^Fg~1x884t~dP&$y17jQD%AS{H*+?XMo$>7WV z8G~Q$YySsvuMCbA|FKn!&RD) zD%JPr)&`?lM8sxz|46?Pl&OjR$(N=CB%N?hFw~y%K6c?t$g(=p&PHMGE1sV1NZMj2 zTQRu?0;MmN>o5=BQig=dfm^tNewz-IluV&@(w7(o{Pnir!0c9{Su;aw_Sia2^M1kUiE3!n-Hv? zb3V;C0G~|6O8FyqKZzP>2@@TcXt(`O>r!bq$t1s40FDh}a^Jdy(A&fcD_|3G9$n7+ zeEgX6JY7PL;ID`XR~`j`8EfBTP>WvI^?)RA3xp)ILG#fXow`wr-;jclc}?CQmYeXw zZ#%?4k52CE(uE@PeoiDJr517Wh(}d{d6(I4MQkS0Aql1jBplX^orIuEN;zw~^D57% zDc?Q+C${n-vqrT&E=Sm$jvn6w-0JDw(I;3uv*PlnULORf|MNEMvWOr(> zdcx5k5p9!YK%Uj-wLM9*A`beQ)28DKAiRrr9?xY&oM#Bbo0+#6se0xyMG_L#Poty? z(b%fuf}vuNog#h1Jk9p>%ERd?2yT}0e0DU~;hq}z{%~8N#~q6i1%n;7f+|LE&aoFf zuUabB_yWFlf%)5Dvvo!1ux6J8|BMm_2K!`X6$l!1i`m#zf@74;z|T*O^1IG)CklKy zO`5pfIqtEl+WLB7lST2G>=1)@z>tMX7s0J2kT=X+74_Z0~E(FK5(VkLH|(gXoaAu%DLDZSCfFl z*8)XaRDmbp$I4)Wd1(*;Tf`l^#KQW(^B-y%vC02QEdx1cIK(l&SC=*o0n&bJu_}yM zi>E;z3;Fnr+eh00M0ciZ#6>53jHy6>MEsNv>`1`YM1lbnw!LgMQAg#Lwj$rk6x}ZA2A{Kxp1Dpi!j;FtZ0BPx}1 z6I2U-Nn8w_(1^uK?MtyYw8`hGWiu=78$VcyaU| zz5BQF4z3Wp`EOT%dlNeRh0}6~chTcsdagg&X=$)YwrCO~P~qmRqU^VU*;eWD?YI8P zx4`Y)8I%FRy&vmK!T9y-*WU|gl?sb5edtBbnPCr>=@ibdepurici5OsxOMd))a~Xj zmqq8X4OnBdy6!tyc167O0pjZv_>do}>`MySyig^yw44Qa?|*RiAYrE3oX6atRmy(= zy9-ma5>Fp0X(AE%6m#bXsc_L`q#=D8;rnMQ9VV(t1D4?URbZmkUy73==cH^O1qaHI z*e0z)TS01iii_=Fv+}Wtcs_rQ3A;F2JBm{@potZo3t~+y#EIy*E|$C=5Xh?VBUOS? z5YG&O@=#`y2afKNT@xr8q+!rxzBUNf`Z+&UfRW8%3KV>eADS;CbR3eOpHCoG0}J5* z@CW&LIrDxyO!8VFPnida!5gZuKC?awRk!(2`B$8iVffG&lE3t*qxGbAPws5=Xjz%8 z1#nZG=U0W?z@?p1MYF+R zIvU|eT}39jtNdZ)Nv=zL5NV{N9kbpe=G7WzoI!y&GBCiB0grK$-NctL;cdj64m+_7 z0|PVnqAji|uBerx{Y6lNmfHCzKe=&H+oHF9m}DE zH=&U5OmWfoQdi( z)G6K*Q~G~EIHs^@LZ6elNTZIZ-p%=5Ykmgi6+6OSw>W1e3LzPtK**-J4cNm~jbTABS-H&0f^R>4>=tduyfrxF&33r0!jV8(KC|}xJ!Ec`358w z_QJ2}3HO7UxEqA*5T}i1FT1$4O4g71HDk}fTS zg}lrQMu~+l{2mF1CVOCXFN$w+o1xXGyON$gQhw{W>P+$75>ov7dB7yF;ZYpINg_&? zkH&IcEC$S95nhY*!T5N)R?!i$g^u-o0`5L6N3k)150L}QcbSA2;e$|TL_Pv5V&u!r zV1#?ge#!lrj~G82gzcq0S!&Q^p*~p79QsvJAzLh7M=9h#A&dtIZ`zM$@Lv_?OJc$+ zSTV)A`wo>(Fch5vk!_Kg9NfFp@waX&cf}I2$o}?SpTNWG#JtcWn{J-WDr+#gXb~Fd+DM+XI5CIQjA?2ltIZf87Cp#z(`=HeMDod6m z@PX-nGduNV{F3c4F0U5I&2=uk>()+EgwmUkND+Wf3#$)`wtf&lJ3wD0lwqT zXvFcF0U`g)bR=0#y#o@P35dekW)5#!sSux{tlNFayd0sggX_gqMw@?W^F5fa8o_iR z@t5%up$5noH98>`j{-gCZaQ<7!bNkU^L8`s)WnRIj4;$DOa??3%~z=rk$)BKi`WAm z$~?>eIt;4W74bNL?!1Sai4Z!=HiUjGOUTRL=oA({6f zWha9*6n6O>E2f1`4}0e?4al;B&r}9J0G3;a_A_r8sWA1XvrBun4jXC%+Dn6+dimv5 z?<^~o@k$k&&~Vy(;|KMcWXUkwuH4WA81!- zmM-_Pjav3S4ALvQtTWGyBp60Ae{mHE^<^R(tZA33erpZxmlCjxhq*!If{b$s|K($`Y=#KA( z)sIb~(=&e6+T$HYQ>~rMQ?1I(Y4+JPofD;Zl}mnh=a+rnr$64NAVOc6HCpT7wD4N! z)oNq6Or~_m!f6?Ae^OLfvAS;J^uTKS8IID$U7=H%p|iic1{yLRx!4JrIGVYe{PfI^ zK}QYQwF+)VTT~KldABR=cc`P6Z#e0F(pgDw*V#^A7^+rqT;5y7Hy9$2*0YJ-*f+&4 zYnqJydiW!esu7Y)e6I5Uj6zW1XRCql2J_QH6vD9Wa9 ze#kPQku<{>BU5uk=`+v*rg;aJUyVN%fJQ7I22r9@KvD_=Po=&WL*s@G<6F&uR=$7| zj?X0DVhwROQc)0MzE-^+USN~xJaeYL7R(lrssf)n_j(HOP^CgI2<4(h#0b&u$nX_5 z@y)xGLzDILHfu2;qk}|a6v9V>j;YePO!o52X|%*5$K|Q!zP;! zL^hWQKhL-vOm1gpJyM~0$^nXS|!N>Uf+6y>g2qUCvR{ z5O6k<1Z_g-O_hU6nBSL9Y7*scE{|S=F6FV?Zd`;{l;#((vXk)trk1a5QYp+zq51aF zMes+=jdz}jm48)fdAqKa`^7-N|q zA$ziBLKdCL?JGV>vk_5dcZOFC)(zXwU&XLRwYfX2|lqNhZ~md8NhAiaPvFU{}m>0Tkuhwo*T7Q5x-fVB)QpC5#=MbY^TQ{#Rz_u=e+|~%v!eogAt#Dg9Doo-3FP|u5_a}2L}uSlMe<#dfW zmVEoss&}!2e4e9McXD})BA+GrwgJAHjp(hHK30?#z&D2@NZ!=X1b14KNWr{ z{D67TBV?y41N?Fef4IV-jr;_y(7fE*){tE&TLXwIB#?zA1NVkqUgNV{Cc%Vdc>Pp3 z2qNXa{ZQ)w%F#6Vf;b3RBrjsdSenln7N5#|FUXo;A3m;$p%wKXsS@1#wGr{{n`%RT zTgD8R}us0}9~mLClsx*|+wz-&fzOmhIE{@5^dP~=%5hsqc!dByfAwfVBgf(8d) zgQV$&bE*P(*M}_3fgm&tC>1k(sid*o=6zqfMnqsjGza!2z!7d&@htfaiWEseeWs!I z+q!udigNOXYcL`DOy0yazXJ{I9rwMggY`9Vi@nZep6MfpzC1gvG&%{JeXPy}z9GdL zecA<0h;e@7B83_50y^?B6cA@UYGYv+%3IU!R$Es!JhpBn|G{s)_u-Fk5gUIr_nYW^ zaGpwrEcM2+04tBh8M*u#k?ey5of(_9GmUQ6H|e!nF|(I z`FK1mBiNEp`AgE{0~VsEamQdzrer1W+}exhbdcJS{xfguY)Hy`UG#doI4bzn78UB_ z&tGpJxx@+bybYKV*i&t~EqKGQO7K^?4eer?#d7OhW&-1~d%3cu)zHSvI2@hAidBQR z$#Kch{Hr<#+RLo^QNq^G)AqJPzeY?iJ*1yk%i67^2q#*0TgZsJuZ4Q+!dV@Wb>vmd zz2R5s^N#CRF}fdH=2I=pU9#-R=JpiL2G5mR;)cbdt9FBu=033NqwGI<46VLdmv+@< zso`wub$P?zTadtL@MP-+zH!31sbG#*x1UnBZHGZ*sU1qoUUKz zs~u5-DxUNy?_q%T&BomzDb|-1WzknC2Cf6w<{z?Q1RU6sE99hzB*Dj2x`~G^+ocvb zsy~5)XmoU;I7xt9+{V$DThJpmZxQDdM!mY1u#tN<(Q|(%e|D|Y z+bilc_b((2xR8CPE&Me$c_5j7)utJ=W9H>4x>~v+33;Zx*7Xb}Dr0=BImSTK0yI@ttkU|2q75 zgu@`oRaKt1ekZu=J_**n#xy}S+u4eNn}5JW@_-|@o`t95%Xq}}_`M{Du0|Uz)Mgy# zeJ>-)YiK++RA7#amVg3Ju!cA4sQ%?!8*B<9fT&ShT z|5`R%9Xtq zu+)W5cU~Cd6T(toTX=Mg>YS&Zds!jdg-OmJj|qvORHCA{@lenEVaELMyY!yYIJHBY zhBrPD=RuZMkL|4Eenx$Apen=NJTu7HvA6eOXsit47i3A!)F;=4I7#1EU5mWH73;XE zG9Cdoxk}$COke?9ewHYED^}S5pO=* zZa(bC=65gl;b!I?*-*L48^Y6(Dnpdi?>6T*1spzi)1$_eLkB8xdaw6|pL=1ZLa52^ z!k_#BN3ua3Zjm6gtz7C2`J!f7)}_h2>z`H!*i^u}zce(~C6um5h5xO^)Vm81;~buS zJ#qUZ(b*xTvP(wo=dLzBJyojn22*GHK_!&%RDP?bWZqex*5~R^nuA#RE8V%t@p6vG z3{j+d^#~f|Z zYIr%=yu}yCmQSJB?S3-x>u)T6Tu%Rn*+^jDkc{h+7wUJQHQVK}YUA@K!+w6V87F5u z$NkyYW4@>4nM}epu=mmHvFe*JmFr@m2*0~w$*HZ-N1!(7*~c6cY4+Wz79ED28uIzs zA#%)cGQ%QYTq8$aHmWlwvQUT~E^+Ylg>zZ%c?TWsFNZT0Z8Y*LsS9o8?j9qg3M@Z@ zmlJq;C2RV`VVFgB%uBu$4NL0D6qnD=&VIe$Wvabll2}CSm~G?WM2wwNl-NY71wuC1 z6pmH6dz*n2sW}vxdjkK~5PugdgH8z!*!7Yoa(*o=$y!Jln3a0wYB!>oK976Pg8mTB z*1P(|$kO()LhLQOqB&~pZvT3F;nSEVnL6D4VbjhUhfD7Y?1Y9-6`Qv<*|%?CJrH(lwgG`H^hrhubs1*FL{^@BcY`&vT!7)N1%*Qh_Gx z?ZgBoHuby`oxzFzOVb%Rl=&btr@q5jomjSNY99OUluVn0u4?hib?5TnA=UJ%lN_oH zYtQ$JtZL2s$}u%Nj?V;zwFxCp;%F;8=PPEO7tXdIN z5-UihM=`WI9dxyy8_D>LHRO{oK~GO7@THOuR_)eH_m`XexKZFRcjMd5FKL$FTlXC@ z<4x5HUK+UNoU4c*qD`-nH|3sZTs!S<_^!611Sgp@vWqR`E{1d)4J-%@R|tVNbtYo%C?@#>84^OH@ouF?&hHr!1q&nx8GL z+|i3Q+uPjlCW^x|EQSbkmul7=mGBb9iPp3}zq4-PH2GE)FijzjUMV&Dq-EPF)$~NG z_;`G?SJa8PuN|AwrH^~xR55>teEvdAp_a)#$*I0`F;i~2Sz~AIOlg1d#yvh*kD9TE zX_gu0H+pPYd{mLgZdkE8c-lfvBv&u&OtRfi)vSTeb@mI}M*b#+H+K6x2-FN%+QW7$ z$gk@ZlP1WW?NXQ@w)8L<{+giYYLIf%YX!B2 zH054m)GAxNnXp@QZ$P?McrhXJ`dbS~L8Uj@$ssy3!Dn^1kc1Wz7XFu58u%Q)NYyPb zV(!-C*y%Iza&kAti1O^q8=rbb$?F*{5W&Ade3yY7k1fYj{RfRLWrpT+AJOaZN&46r zp8O|Q{S(z_uEKx)D@xx3$!%`<{6x98+{!T0(b>jNe|P`Pw(U=6mem_AJ5b+Be}m}H=PX>$$@d7>F80ScYjp&)sm11N4SS`Ei#`mEpn5T% zV~GVB)_KpWRSNz7CcV9lyV;Jeu5Cv;awe0)9tN9YJ?=B1^*1I%lBVO8d(2!7e(Edn z1oOGG)ZV(rb<%kAIekCRni_NJy-6D8{WXSpEZ=y?oZ+IgnYJNZLlG)#sAz4S;yBX}WRwKC6aR_X;Lm5?7S`sqHl z^G|qLLrGhspzJnLK~-s$**=L#5g&Zwg?S{?@E(rjE}Yu~!Z4^k~)(p+g!d{HUaWB%^EUM@IYx_Q@r(qFY@p)EP z0#-=Bsa@)AdNFUv;^$0%k8UkRbWWes70C!A^f<3qUut}Zi*W4GjcG5)ZW~ybW z8?xNOJf_J)gQF)L?9^51@zs>_=zc&^QUK>()#_hBkC(I3?T5MuQRW5pimhuDjQLJ^ z^?G5{JVnHEvPL0&qdE2NvY&*L42*-!Rj$NEjh{jd>Hn2-A=Q7LIdTPV&_Mibyk`vm zTvP^62VV{7Na1VODu-_xuK)gW!Pc{qrIb6qa*W_zb&<2=>)V5OIc;CAUKLmK6(GR| zpBcHgRNeHOt~slKF7c+m@A!$7M2im#(`FOVycfJk3`AMFTUU+#W~07(C90 zK06frY@?nM`5chWsDg+QVu|8YZSAi0%{-dMXU(q^GQi+I;gM@bF%P!({xfZR2ZAn- z0FT`}&qrpz;ci#Rx*5rbc%WaF88nFZ{%D@RK0e*wSz#d3uz%uidaKamZpWLBuL+Qy zis8@l^RJ!bvEb4!z&L&SdQ@U6|5j)#AP2WBYCLD}g|mjP##+-9N-w)7tuHzkbWPKl zl$o?Sz8kZhjO$QMmCKoJ-kD99bQvnNhtrFeE~JDbje#R|l4|m}fUj1>^YG}Ob1NHX z=7HdIy%vIx%}_pODWvQ6?f{tVFRn``Q2U_~8qogX`rz zc~}?p6WNnst05U?LmA(Ne^BV*eUigIdJ#|YVxSMRLtR)*Hjq77HQ$4qFx-7&k^5dUuD6OAD%sCpmw&}+wiGMWw6AuY z>&au8&$v?1G4ULwTy1%;VM&P;tFd_7;&aC$MuWFaWKTLj$1(KEM!>U=GL2>hH{FIg z^wY&%%|zljSmVP6Rj#zDnzQJ+m5dY?=mdW4^0QgEQ-==ell4D>pF#zP{FIZhm>6Hp z`#L8v)SqE)`0`c-KWTDXJIT@dQQV1x$(Ts1B1ZivH@%1jS~$Z(KxvFvKl~v6&I*lf z?W^KT|Mh`;Pn~1{(9^-V7rBNgFAlt%zlF&;%M!;=t(?0X_d|}0SAJG#?hE3Q8+0Wx zg}k2VQ5V z4j&mCZY-I*@ig{~=3#yu)O?$FlTQ?e!)5L0{< zBlgiwdf3$EO@FdSLi)Yl=qF}y^%U-}bL;^jFzL5_%T+lp%dIWwnl_|b;xk)xV)%s@ z<~3X0Z>VOF_H6Z3=&&0EaO1XS{>?v8pI8#O<=RPN8qJ8kN zsj;k*q-p-vfQJGqZzxu9lPUf$B88Dsw`23%JsR!TAWPa*B-L> z{H(l_bLrcqM|2ZP<1y#Yoq83L6zJ6*T=w<_^iG`G5&SaqvOCUdp4Cd7NpuFh9}I*B zT2V1k>s(cnHS+|im~D%J_QogfuTK^h<1|bQ9K$z9MZ^Tv#w-7#s1%t+WLPNoWv^&V z2zJOU#QusWclpKKuy0v=%tiOkbAFn_r_}5Xj9#LT;0U1f$UlAeA7Ivd>J%2%hNY#Y zy<{Y$&TTy_2)#@0Y64;2YnNvzyqu|hexohqd|yC$|CtEC1s*4Q$Mkc^|10aQ!{bah z)@dkZ%c&Iz{&`I0$*0&22C7IeO2}$&I)=B>UxoiJnk3-kv%1h^c#M)R@^_>1)K>Mb z?C!!Z%c7IKKggR528eR^`>Tf@2TEO?sgkjZ$oqeY`|fxu|M&lhl2RJT3KgbM8`SzeZ8*v zyq?!}ciEApO5+ME?K{7&M}$e#Nb)Y=9bzb7=P(7LJ5}@#gDlzdRoe-LO8d10ue5T0 z9YAi}rNc9<`3zX5V;aVwF~ZVE_wdcj^D#5- zbPQS3>=f0E%y&pI^Xq~lE%SgyaB8+iU*3$q*3^aF;ePf2jSf7cX;^HZrx-pVMk?A3 zV|@~X-|F9hzynjbHE!?E=wlcUUv35AIofPg15DNF&X9fuG^`{GB-f^IBSJk7j`6Iv zC>QABj(7a|A`%PlI4UZDW3$2E2(TKRmTD zOXz66I1#&f%ON(WyRCC0JARTf1sj!RiVEmRJ7!%d9(B}gdWQZxeLWY&M9ZA~^$c-N zs{%tJ3>g!X~CI<0(y^3H-`7I<1Arr&h#=ngLPI>jb%EIcPAgmom` z+K!s;{h2`|lQt8cd^MA^1)G|;E`)GxQ-@^V4b1Ah%U1YqVwCe5t&V{*yY1nw@TnPG zaWi|x?tZ}tvN{7IOkTYHWi?2;(m4H2vn!u*xP$3G4WM*GBPkNk^O1P&Uw&5<>XIk} z9VGY&V?}8vmY-Ec(~_ilD7U&8x*HRI(MX0WbY-dB50P{+NN@wck;-!vV!ijRTGh+H zOL8AJlGE{!%pnf=n8C0JHIHZf!Q`TzABC?W4P>aO&=sVOndeOX*v!I7d4}Rn=S<$b zN=5mMjHN)Ta!H~^y)$iL&YUlgAN`LU-3YgH1|?tTyn0?=dz|gNBSv)&)9CI{g^yEg zN4iwvI~9b~a?573ScTkVQ$Hj}?+B7bGhN1{*}24~-ViHTv!~ovZJ!UaqG~h4I(!|WoX_c# z_o1WLG0@;6LyGH{Nd6O~&~fp#2b$$L0U{QhbR55}7$@cj%4!Q=_;n02<(KLk8ynAa zwrr@cT?!|}M(HNwn~K64Pat*t`>h&3k+YD;(u#)h{$a<2c()*}osIQ*qv+v56o>73 z=a877PRmT?`&WEAHlkmPS6#eb=V9JN<$~JD3wOxo*&P`Uh>w#fVC-=s?ekg^>+@?| zf7i;}Y6__6VqvAibfPrnR72{`F#f#C(A6^TLxsiPuI0|HB^`PE#J-HG9+6L!J>vyM>$2x(b1^xg0|^-ouOyX>%hW9;t|9zk)ntgno%TFVQ{~mgU2h@ z9ytj>utzG~|L5N`ANV8B!Kw#U6KHB^ zcm&ozHGEL$@3`QQj8F+sNTTE7o%XTUM<>mN&zzZ z-9NbiFrB9Kfte9O5|q4c&w}F4L4rdhY-%V<%?y(Jq;RO!^AAVpAq;VSYh!du1`-^0 zdUYB?V$TZ)li7OLl@fb;g>+xjdXv1gP$^_U%}7?NhbjYzkQ!y)acJOuo-0G)ifbc4 zz`U{V@l~gGLy8Y|0Nsi`)%kPfa_khQl^U$qrG`w8Xg>qBtH|(=F4rq1Xj4ck^PO+a zG{T;nWvj?r3K^!6z3$-R9Gv#AiDpyOS+N#o7 zwQwUTFnMvV!3B%s8i!bF_tMl%tp|Xq?v-I(mqR(;{HUTZZlUSHjD4lglUk9hwMN20 zXU_Mll_4wV=@q-O-zT=s`vgXd=2jmm2a8PX^VgHLcx=-6Hm^YF-rK2LdJQ_|bv;%? zOR};Sa#nmJ#&O}yXp0L>XvSMCCc=;b-x}wfFmD%R#7ZhZSa<=!Tr7{t6FA(+6SNFe zJkw?8yxmS87pB;e*)z=|Jy^poS3k#x#iXI$bfC{|{{F^7+nLffX%r<5{UFOXS4$^E zS7;!eAo>*Ppm_p|>A9uNjx?Si2;)o{)Q(*ZCqX)2l|f5V(FWRhZw?b;25b=L_%oy; z|9blv-Y+F9xg!=3L zSQ{r&j9H|m-BGOZvEyk{Ik!rWv_*eTY`6 z1-Bb(OlqP<=VU}rH9U7gllK;c1$xshkmiitA|xkwAUW|i?D0VXz80aLeiDhQ{GeLB z(vbD!QwmPus&{v(Kn&9F!Wc)9dAdcu=y@1bUjO2re{ZHK-B4Gf%wV>d2^4cA5v;2CM6#sN|O)JW! zyNrLgr>n3XN}Da@vfZyZ&Cc}3Z($_$`Czoa&s7u12Wx}2!<%zUH_FaskbAqF3p!#6 zlaUOX>0U_t#s;70tkde3@}a>3M@`nNJ&dvDBBOl!HTcRJRrE}4r?UlT ztMMz*6AlvJqmNOXGv40RTddgyn%;bm$?0{|HsN;sih16&V#}i*`lMhdz_)ZQY2qY@ z;*Z>w*iqW!BGkd4YmsW)QObX}ExyWu^{>1-ftfd#kaxz4!(!rWOs73L)MZLep-X^5#%^A6JkbJf-` za1BrFvQC!yreSWh=GCUNKCaU@jh*caOT04&GFq(6s(NC-b0%xZ_P!Blw-SPwxz0sk z(A-prt!DA=u*GG9fywR<*Xu4?8u~dVW25%k{&R)dOXS%V*HpMKQN)4M5Ockd&~b9c z1D$6e-IHyw98aFy{P^>lV^LRuR+)Ub0nbCe{E-Ozx|eN}bh`C6s3}aYzc;w z_N;go|B@m8^#5 zS5_9GH1>xQ*^p;@4@s6;IRo0NUhy}4fv=MA0v$23=lZ;^ZtS9btuNb@F3I9H`<$_L zZkafFa81p-yA_jBqrLdD|1@Ot310$}nl(|W>ZTu_`>k*V9G4dysFt)v$yHTPuGT+J zlL}(G$mS9RstKg6-l>g6r5QEUj24$uvvWX;bD$#t_*@{*+uwtqz^5UljK3&&O@-G% zvSq3uHG7?3p0Ty7S2^%v@r^7x|Fhml^XT3wLAqvhTL3K-;C>(kJp7epPH* zFB`!*aGrAVpx0p$;ZRqPHjrSsgG4u0A0=>OC0$Z}kadR^R65BjJqQO0e@Bt`B1r@^ zx$^7^6cKE3v*e7%qO(PTr#xB)0Bmbf z|1&i!J5P4Ol+C>yO?KUFrR6Tetx3(&wkd2Bl9tZYQJsU)xA*Ec5Ax3h1X=r7@ZEg( zn#FWj-7gHFw~?e)$qp&|AoC=n9A|x<&i&yg2Dayv_ne9!X&a-Cf&F@54|Yq?O{4P3 zrwSz|{jUrZqQV_zcLOWg<0Dg{%@cnmwqxI)+r5x*&b;gz2AxQQ?_5Zdx;iGg%K@7O z%&aOx`;8MoMv9!O&rl%bOh)<;$rngMJG+z6Hr*;QE0J0)Bs`*LF-V^LYx1Q-177+2afHY)cf;@~&i#{56iUVe zwO6ih-ENWL?wji^V;e}2xL;by^=b_xxAZQ|P=33dPb%WE26@q45{yC^&_K?gd%R>* zxFxHRU5y*qc6rLkK0iRKM2cXe^C6a%M5%^mnk+p2q@-$6a-u~}!8t2~g8MiYQ`Xz6 zoL;6xbMfc+p8<#rQHa-ZQ=!WkE@D~=w&kA6_*OeI6kyUux!}}w@J!%6e?!vc+>zAI zNYNX&&e)#x$7fa-yt0e^&8-VG9`t*exxIDSX;_x(B4?5chszW!2?K(J?_h{U&gr7m zUJKw{+VGz1GrslV^R!p;UUx%}j|+=QeljQw$>SE9fSyVvxOVoNJop0P;!8_(Iz+K1 z7~&MrJ7Z-zE`Mr}Q*S@S$egISLXR%+iI?@J?MjsFA!jPo6vO#jmvl<*)a% zGBPlL#`rgPaj_o5=~0L_K=<~y1j6$LqUnyF9BOBA2c=#rEF!vm#R@gMmcPh$+!3Qf{Z|&8F4s_usqNvnOOyDrW+MS zjfuIA`>G{Nq;S27>q%*es1uob#u$-(V)u($aS8%df{2b{wor#Jt3(3=-6KU-Qzmx_M8+w8DgA$QRejXhJC4 z6?*Nd#R+JHA5nTateH0{s?7sEzWwRLSY!W3&)D@u;62p1epln|f7qSvES&f8mA&xG z5EJ`LQ;In#BBUW1pmzdeb#GKGg!A0?0_Ut*JF5*hmWpmj@Yq2vI4fg=NGpGSV*hIu68g55_+gb~C!Ksj}rwVQP7Tt7<&j z{L^^H)R{_jwG%6Jdl=czXWVPzY7z`AihhV>?n6^o;AGTJs`gOZES|mP<{F;)p>54B z`d}yL%Mq{OgKyHyq?Jm>OFSPaEM?mviFs@hBZhtM5eM%|Xa-AtPd6^rbznB@kE8+% z=RkBXD5mH%QT_MZ)2tJyv9~tUcHkNJVUfoJHFZnvU&Z>GAj}O)Qu)oEW$$`awRBn$ZPYE7QoCZPtx?Ug z(x~SlV7U^$ajmHDu@mq>Re!%Do6rQPj`SIt-xy6u{}%R~Wkkt+rr3B%aC=WI%u482Q-g}s59IR>FgSlCJ9Fp}c2Zb4>jz*7>bc8tb zoX~1Zi=Dh~;TeyU3}u594AmQ{`|P2LR13Ee{-36s*~unHrLRN4$r;3p{y?BgDdCj8>UoV?-BueK&{*3A zUcT3Q>|eS<5f7^6&37j;^CJ=#rdWVQX*7ku>>{`4qWS?+qJ2(>NcGU^3%9{No<&^>cqXzB{)H`~kN10I!om@y1~41v+V%Ui(7U>S zHse|fP9z~lA*b?G?uS_8Z&z@oP|RVca`H4$@17>B)J#C~eTxfK zZ0C)DfuWY7=3Ue9tLz8l9H$$Lp9wVQKKh>e^r&jWqh+9jhf{Dh%mw#wDADi`d1W{$ z@x*Bk4F`>)%<&q4Ic^uO50ApS}@Xx(ChzcYUQy{cyj$JJ%pa; zy{*_#WQLKGR1UTE>i&?n%8=ijA8p>;= z1vl3+1Iy1CPu$T`^Zf(|X8L~Z8%l+oFL7?+s&mEWRE>ogzf(7otD)OCZEe{DTJoA@ zH4x4yGEJgKU-#NBECSQx1wgs2c}HrRjGI~b6i?z6=KUy>4cM$Kp>BIUP$jN#>W-i} zS;ESzc*~aDkM7o#M!aW;?=V1y*L7s9O)L2D#n+e|4{m4+v% zOOCB?eLbYQx)7C<hBjotef3io@ds|(D-o%{`vH3cH;o|fU8)h|9j@4NUK z*n#B)Ha%;#R+7110Si;T>0)&P-xtrB0d#ORVw4f+c>Vwk>Q`iJnGZ-!wa7WyTkNn) z^p3%40QfETND>G?62u0~_5y~>UgKAl%6&(fd?)%QoqRAj$<3b-rk{*hG-|h$OcTa$yM9L057V^y}6L8;M znBKUouli3k#f@Fsngqa z>b4xU9@mknAl;&*YRyo+seHG!YX}{8{HjUq891i#m9FqY=$3iZTncW{BgS}Nt5y0Y zUC6Bu{mN9+fR=u*iK+_r2YLBNzZfj3aKlW)H>c874UR%tI^VGoN3+DJJS_R1c7w%& z%Z?b1WR2RkA5SM`U?O3yV1(^oj3rnhp*l?;slpq&)Jvc>I9J`FP|(h+kZi-!k!NP) z=h;lJIn|E2K0hp2$-eOJ>f^zUYIAN1;fX*;RD=+~RP2J3=PrW7AHdaL#d82JHiYGS z@z3n}AplFtc+Wn)f_UzUb65=c4LXq`vG!z`s$iKcs?`AwwYf2qrY;YqH;HAnZPMSJ zxSy@%o2EVYhh|?p<9RkcJ1?II0cn(LRxiih7;J6sI87#dt|Dc8629t*M$sPmp6jpY zw&H@`@epNq<++w$o)Nq;W6YCZ5~MIaE`9Bhbu(2CH%bjFUZfeCo$Mo9^?`jA!CBj~=d781w@Qq&b7tbce!R zC!2!ckb3#jMt^yPeyP2N!KN3>{8U*=qIi;Qa8_uBgfl;{4F< z)2;;j`04FJ>W!`^9DY`*w<#gH{qg&eg9;I1v2H;_OKQuNfmWNcDM#{?n0lzD8t4`R zUj!=Ox!vvssg>h@o?1QPMA%DDkzhmRo`aPXrD8k#ji%%Mf>FnN>zu*5FzLFg2>JPl zp!x-Z>mBx!Fi%yOhOcS1eJ^mMV4a&6GOJhHHBIbov8_Qq&(~hG!IOaC(N6Q%Q#H%W z(IPFPJdzn8nXsjxq7xcHUI1ODLAt%^_c5Urhh|HQieDZ7JG%j1 zq=B1B!yXDldbD}NuSI&dCRD~(H5J$8xI%{2Ib=4i-M{-Mz zd%-`zCtTRhg_?e(_It3pYgJn=Ne?5x{Zw5;&Yp(~+U{oj27M(?eo79YY{W>?bR59G zh@=uFkqrOfS>e8j1_m%3h-bY57d5b7zJyVzt_DE%HMln^8QK4(UYfK>D2m~}X>Qu3 zZe;fBG-;n}JC}>!8h#5tKyX zdbX#>VW`(HV(xhVjx~9RJVCesA9$Dvkj@DLN&P4}iSd5Uo&jA2H@JZ*e0zeQT!0gb zioMoB|6<6G7t5`EMTKpr`ESPZjYB7EZNk?Iwm2R+Xu8*jHXS!F^r~z+cZ+j!rFMip zy7|!;HtqFEVeM*8w8rV|b2>x8VMl`jByWsRHpx|{7?f>4=w@c&TbpP)wiVMGtE!<(;|1V0BF z^nb4jAs#Iyadg*b7U5|rMO?Zb-3_zE<=v>_f-^hm`|7quGE^yV&|Z?rEW%UoTGa6$ zDnR{_!1_aUSb`v)v6~Wh2x|ie8k3CIWf$J#seUOBQrjVKVWXZVFwEr2`0!_(eT%%; z`Y608O52@agBzh?!mEB7ie%+Xq)3&zm`!YX5~H5umZ7PT`mWz&$uzD4*yTLK(~WxZ zN8I~4OPBjnofIz?yd8bn22inKjP41<5F&49DC2B_GyHP%*MmhaRs?}Q|DNH3gH~vA zVTL2VXGjcm0RRG(2TT%s?Twd}Qq(!`9o93%;UEFal=lRFKU^o$&_WRJDsA4M*(?Gs zBxuGAr(3nCmtJvS6}nniVIR!03e%&s?(a{ny3Q0)m{kX|urLM4@eN0u#H7>4TseVw zt51;`L(%Z*=tYTr`+iqKtiP-ak>mxCq=?Kjz z$j-k5J3Y_Lry=Kr=%G8#zCT3xRSdj0-6MT+&`S{y&`|8pnWw!ylwCrDVDw}W>62*7 zb{xmXQw1|>9C-*YFszGAk$pv+f3X#m3_CR}gsB-Wi@*~q&6g=MQNH9uDaK{}Nm2YZ zPIoW@!iI_cr$bQnFBj_hN8Z5U-t#_Q!9eKcL8Q`P&361r8sbfy*vbENlJAl9lS!=% z;b%o6L^h!;D1raB-7ytKyNA17wnbhV=tU;b@*`synecZ*X`w%JD!|!&QSVHoSM`U; zNW#*=C5Y5l=pS0Sr#zuwS#<9YOF(`C+_(fx5W3Qo`+X9@N z=ti2KLejtR#|h({K#tY(hm0>A@k4|W;erqIsDGO=0+rxl;Ut3>9kUkQwUhrr{{lT) ztfRC8>y90}OyTe;UI{_XWBrRVY#w!M#zpl{0DFZ7SS+u;bM9RwGzpauvN=xjtF+-A zUimLaEP^y!oLbRZNJ8O;s8WM`kSKmblY9f_uK1OHTl(j_Jn*A%j!6aUOWGeL+ zpZpcb7U*zW0~Js?4=T7mx5dzvo~_c0qq>7V~}zf|5ULgpyjOPrn?Lao;pi`|5C0|tcdoCAm{r<{mmS381BMl zd_obb_B;|W60n0bBF zjGPoY(cX$aB61+AP<)(Mh*z6$38h44^>#jU_hl3uv{ZdwIuppck3Cvr5}OY&pJ~>ivFGj zu)>S?CymIKJF?A-LY?b6ywZ+i22P!Ou}2ym1W$o>;WR4$<%*Dc-U&QoV@B#EK77?I zkO+RRNWi&`jH1P+UyYy2eX)L+HMEwz+EC;!5tqw@Nfqvd8h^#_9m&c6Aq9V z-go<5@SDrf6fX-?+o2Z0_ITA*{*#Pz1-9`mjw$^bBzQ#4xV>=8C9-1Ak)J0P6;c*NX zs25OplT_pB3}qmPxo3phIZSdaH_w@wCkW_;pt3LzRhd@nA278>CdcMdQQA0G#IHYn z|JdMinHE8p4|#(M%+~AWUjJYC3(mXw12aaYsN<~>f??wz6(uB=4dL;KtM--l`OSC97yJ%e_3X0j@uo% z<~3n^bL&VJf&3N78&j!lod0-o#;*k2(v*9qb<7JA@! zCPfQl@B1D3!@C1iY$<{Sz9riGxAsoGK>QU3H`#e=4`}cli za=YyO?nV*B-C>S@Bl)rA2PxD}#)NlPXQ`9?aE#hSuh&U5i}llF&8*hhtU&QN>1xBQ zyV7DMRRK>9NFu@e(6hP#f5hM$sj&9_60neXx>wL$Eh5-*;~K=h?TDujy?s@p!c44N zyDsm%l1_Qqm-%{a=Ob-5(#P?5X)HV+rarGk=;v?YfN@!ZKg@xl*M$e|SST~j58R^S z?>`I9`*^BTtDDCvRieF3$DtMXa>FRxyzBXYFEAY<4EABf!SD0Dgp@$mwyKa{IY1sg zq zhHu_UAyGs6?0D3(kODHf`eFaG#1{`>a@YxA+#LB>Z#q!hMRVFjq3Pzj15PqoTd^7p z_OvxP6>ue@hRAZ4hP`j)Hy!iT0~dIY`oD7(HxcZmrRu#o=o93UG4-oR)xgq$@PytX zIJo-|bh~#t4G4_^kSaMA&C1IwtbIlmq^ok)%|gHlkT^WoG3se2JDB^f?&=+(xTySL zxOooNOI=q>M4;d*$KE-fUtV?#u5!!_tbl4~`n*QSgM#xsx-wO56>G zg5$+;v9V?5R^sB+l}J3Z-nW}mo?!EQ{rc3+Vh;|4hc-A$r74ItHdl(Rc0_gzdE;}^>s0Cvq|I=FVw;nXa*QYz#@RLOFH0{cME1G3>0WXj5 zp+aG8hg7e{p^`a%Hq^-Zc3_DUd$0tdeu>HUR`KAVD0lm-?d&Nn1emVH&(N_;{A8GJb#ozs-Ivm)+dX_$1vqDWzJ@>>n*Xq;{cYH+Nf(l>{ z$&Bj2PKT=cLB7MY54`JI3@ni8ry+S@&h2ECIHVW__N?(27f)&j>G2tVU*oQB4h*+Z zCdNj=r-YtIh()xAIJ?BCIpFg|74eDxf!N6k7Yj4LlcIn}qhG$H8Gn%O@T*6p4#h68 z;0?9aRfgwV0AR|uOVfoVP8)Ae>|%g$s(;}-uu5qcFA?u^5xOd+rCLMO4=dIx%?S8I zmV>yAUvMPa`zKv4zO@qe`eI)@rXJb6c8u6BgVJJ(J7loYl&mBBnZW~zGX)yqGBc;D z8BX&*MUtkQ?>iW=w;{zGxbQ~^`D+&7k=Crx;|oepIe#Hf=`ff0W`-WYIf0Be-dny> z4>0|mn`KwOX=Ay~RooQWYpd@hPvnT7x(OAFpR$4cuNl}cU-)zG;E|SUVLc5Ci>!j8 zVibnp*NrJ63J63{m7X#70vsg1Bn`Ie0j#8bgrwM5=Rnq>hxfW|K!64(j06Zu#Hdx3 zmmmI;Dg3HZPP>lwW;^0&uNAg^98FNqO4Qfa7teA?S!dye>JL1Z^6kwBpHv@U{nGWgXrn z_CJIv| zC*r-OT2x_rU{4c7*bb}qh$U&llRH9d1STmxKOou3VQWn~8XY1MLpn)uIOs}M+hvMq z_%8S0|E&lrF8+21ko>3?wkf#Y5fv8~XO1`0X- zrql0$5%)xY`&dNXuY$UtvDGK}d1pInC&G;5kY>QFM0yg-9*(lx5gvvHJP?(~S=T^G zl%uQ52d+}wrMX?}{i9W$I%|mqXl3VkX@;EWm8OY;P5Wl`wW^DtYU$bFq zGz4q3(vV@sWiT?;FFJfFj|;X_tHm}eodDj}GUs{>_wojD7?%GTX7aZP+;As*jU0hP zP^|bBItvtVxKF?VFklX<)e?`?$U;jF=-A@+ZKzWFqKzvPH#V$N_CQ0gU6PzAY!>5&P1b0?;QF z(fAjues3)xFWmS?G%Px^4DbQW4^IrKfL|w-cOIXG;-D&oyzoyw#zQuUV3Z#&{VwaL zM9BPm{0c*eAV7Psf`fzGud(rCBWSo(#O=QV+5hXW?I*nC95Dp_=+gHhC{K}BJ0ku1 z4@VzozP(Lc$Tk0B=N`zeuA?u`Ha_%F7Q_F-w(IpQ5xC5k*bIL193;d8 zZ?cD0eQXhymz9ZU?yC&Un*8>WB0fk8e)>)SZyt2_c&I?mF5ey{Gwqu3 z?v)Te1Y@B-MYTv$u`j4n0rlhVUzg}`0*dG_Xvp?>a<7tNglYY{>ZUXK_kqNciQufe; zFZN5ggX|ML?~B|E11I@4cnlw`#MuA476X2axXCC#zUfcK6^XEW`_;>r@6KU4|L$oZ zJwwg~@Bi{#3{>QA*9&`G_T9J_BmFUMHQt+%1b^L? z$24p?@k#~5rD5uMR=1T2h)0aP@!x$>YLEXyweP8zi=s@naX8lT5`S_5QfvfpClBqq z9=OgDIqHd4#-)f3DmU@$rth{mpODUSsO?-jBM?uUM|VA$NClYMqXH4;WAKO9JwQuv z-m=qTAA&naf5W~c_}6{xn8!YBEF_h|d!;)7aG&AL4BT0|#t*N(BzLTK=j8$6Kvx^b};Rnh!}!QB5V-E=l+$Z5Q@U#(lFyo|EYB)4?t&+ z-LaAUurEiAwg89u@AwB~Ik^YQ609q;{iQT&g4GZR{$QT$CVJnbs7TBn z(HoPNs`yOOs7d;jCmWlJWm_~)h^^W3RonrA3ozznmgfPFnv#MMw4vw1%OiKJr#J(v zt*<(Nwwv>rR`&?br8{hJ5XQBc4?h#7js=aqT~+<<7kk{f${zOe8VbR({d{}d+H7$m8UT~iL`&dGnw4-_z(JMwJ5UK!>bGR#k3Y5y}i-`0f%*2 z-m0GKz{%hterxELAlmc7Lpi>>bb#;))+uhGc| z*lvo$$%LashR1%&T4WyIp)g_m&SmoysosUsx}{y0+;Z`E7ljb#o9P?S%!=|{=ADKb zh0mmj{cV|y+OwmsxF97%dB+U1@XVI1VO`}Vidcm&Nkan)BmBY8>pU0xmHVs?(b|dk zA~@KHWOx|%|6V&lMnwpUdq~%)@iboi3$)XM@v{8<$a3Oo9rp8o30FiDr@1~GCRdAw z2lgLC)>wGn0H2G0jTBoA2P;YBG${_;=lDUoj0r(lnIaZb3v-x&ydQ!!HcNZ7B1(3o z1yL2qGW9`_Ko0>`?6R-;6~OY&1Xw^=N)s{Kb<;_BaB|`~U;)aK-Kqdz8P(U|orii= zIdU+FB^N+>vpSIoI%+g)3n(-~ALV%I&u;P0`NmPSk`bkb`cD&$=yeoh-zU;ZT6L z05BW&tvz`uqJ)jwYh_QX_J4%g5Z(Rxyyo(yNbvFwGkb9kfPMw`H9c4x?MBdng>4QO zmy77v&%@qxLH)?IbzL5YaT|M_U_K$?W09n03Q#F9u{fl&i`y+*#mDj32=(#Cnde-e z&PZPgqb*{cb7hFn&|h-XjpD^a;nLRg;5~#oP}#wx-<}rm0a$#5brP1~CYaDUvp!Zm&qI>|-CpalrF_lQ=`vB2_0%K-zFww&;qkg0aG%0PiL~;gIEaH=T ziAe$$fe0RMu62aZOP`3WI?t~|G5i723z>lKO zD>3k6U*L%a*QYwlH|XEoBg8}c`?D>dC%j?i2pvTQ4;O&+=Pan*bE<8=K|e!Su`FVA)%%9t>n%Vgx@9v<1;?5fOL1R{B>wwV6xkm z(!0cDxbP95d(bi6lSCR55TTU)-2NK17CDOxV-k5W)0^oR^m0vO`N{hjf%rX>M@4y` z2)euYcC{#5r6NoZSj;WA zQ-1wcN)j&rO-55TR?P{vxzlvrJhiDI(`0YqrCfTVmuWsIrt-0j7BD#Ruz@To0CQd$ zp27J96%eC9mJaQ2>I!oHfs`dMU{iUag#3$Rl*5e?p`gACb#2GBC0r<1Nxn@yNjtY4 zH|lU5Cp5bfLo@Ex@dfhK=0@$iTKTGT(@73VKzn>WwT0 z&<#mMS4oz2H%OvdEX@Kvls}B?W|INt6R%i+0xGpbSmhCCbilF8S*^F&k{SrI@!BM^K z$5u~QpPI948*NTcz}a|>XR#hFK^Y@MpDPuu`afw~tyU5BS^IBI^WPuuw@F_hxmXn= zy}s2DHI(@I3$4F%W8c`i#OCU^ve@NNfmIgs z?#?AaaMret?G)HFNL)UFqT6A!{1Skvk$UTsT;2UY)dO5wHfW?7W1Bs6=^#XYyo2=f zQqX#Rcn()fYO#_~X-k2ZBis$}dWu@C=lj3b6}2VbR~=vaxOvOJj*{%4<|QKU8{6m2 z887Ib3gB7oqGEGv)a;mz*sg*n;=u;?DQ<$=K>BbgZA3ZzFw(7m-BBg zU4M(kl#vmX%g>OBKg6s$Usw~m>FZMXgTM4$)j5mlNqD}LU1i{io8#Cj*(-V#F8b;_ zOPdpE(rgy}jH?D+<{dfPPbPbvZ)9)T*URQ)3{}0nmTpvip(DMUUM-`W{?VB#rmS#A zrUb>F*er2T`laOfT#LJ~rrEH*-)n)xSXGfP+xc>(>FPqS#p&Dl2DKM8H>6Q+ISocj zL!lO~9~mjO94iQ^-(q=ug5)188mg@)&+!j8`Z=D;NX`sLMM zqY>gpsUZ&G{g!L(W(X@#?pRrvg--i;pcOB#oqLOLo=$q3Ll^A?R?dOsy0BtuV|FyB z;KK7h7dl#RqQ%10PiKP`l-UW?<7Yql`DS1*JLkC_EG3i+Qn;qy5_!38MCId~{;1e0 zi3mCSOv4rKV96XgS&GLZ&8z->%H5VJMLinQX{jt}#o6QQzHBz1^|g7fVw zQ8wQAr0Au~lJAHO9J7!RgJ(WmPEPbvca`_Oz@ zjJ?f*N}P%x6W^86OU__LjGE8Hx>Y3@jSx3x8wi#Q>m53|M9xuW>AJ*jA@V&Y4A zdG(0maOGRwh`v*|GP^!>>gA*AB_qsJ&YsCUt7D+Ta!aDb8H}euMN#gLY=AHXet$b- zI`q#izretRzJRh#v!qcVbcbG#KJY+*qzw^0AhF=cmZV@MF*K1#MG;$&hAZ~0r8_s> zl?;&CTpCoLXf%BY`|-sT0|}Dor5ipS!x>!GuT>fBLQnYD+)TcMrIs_$*?CSl?BZ0P zL)(n4(ha@tik!hQ6NAi=8#yLDPAlKNHuH;m#SSbRvoeM@PA`2d`uez7Hq81Hz3b4& z4PHvwu^zMeZn-!;3W z%pGd$W-2DaDOoUjk`}*ubS1yzKuXd2oUlTy$>DNmIRTyFX!{uRsgV7skEucGianQF zQ=4?EyAo}VMTyGj2~9E(jH4PTtqQgKJR_tcwzuU6?DSwSO`1gXlIfE6{bxpl2OB|?bWGSteoxI1V<6Oo1mok9&){8X zH6+w`hC>ZJG&XO=gQLm%t$J&EKwx+ZA4<&5>{>>H8^Q9ZC|PG9NY7b%#fRbo<^V;ViqK9x0+v96}bJ+peU z_i)((NcFG29~`0?p;2ScxxIQsMeB>1oj{+4_8=1&W*R0?0%1f-cDS8;SXHnlPTW885Mt(DnYj z@CL@C&Dg(CIbRt4NEt;P)X)JUOUsO>H*K>xB=upuEGw{%lori+s?CWGRu$ygj8Qq} z%38oPEuOZ9huKv@AV}8cm28ZW)#JC>_B>bA6{S?c_}Z-Lm}1P=Qb&ToCte;cElDav zzGtW^*3T8=kt(*(OIL*&&q!9iX2@)XPSxi6f~P`%LaX}1s9oZ%+}AY`bDp2Sd>K1> zNL?6;*C_q7IFaIDea)}EegCZTbifIEAN+@u0}ywFQ?t@qHdY4=3Zf`sY-Fhx$2;U% zN;JnU;UO{GFXkE-rfzzTuqY-zNml28#iqUcgPh3Yv)53_J?`jxFu@uv1 zk$(7AeLPZ>7*)%tLzL*6P|}&b#7=7(a3ov$1C7p-RJo@gw&l2sQN0#Mu*;V+&&EaV zz>;f=U5zx0bLF7>M4wHpsDg>G#Pdx%#!`NgMpk)M@o4c2r=U=+j@@9v#J{M zEi|Qt_R_62r02ErIIIRoB_+5YWZj)lcHxVB+{$MN6R02E?1DLBBREWMl-4(F9fPwk zraX822~y)VsPir(9nN3lNl7i-wZqwe(4Ku*|2mq0QlxOM2rp)iO$mJ$Uw&oC+QOFE zUSJS->f+M<1b=*nc+CCcTI8t-LQZz(7h|La&hk#zpSSM`lH2;R-~*viCLnD~@<7o_ zZYYmql@&juYKGo-X2bi>{{M z{i5zT(sM7{dUC@tV6ZlQC)Z->xheWll!(?EgdQMJ-_~5MimFmTk+bQm8P7DuLIWE zx?SOaApv>C_~71!8-n)aDEVyL4c#e2$4D#oYPa!`iI!G^!Br>a^YW>8CD+W?4B}*d z+%ED7yVS+S%spRt5h9msm+R_DjKY;1ae_o?zjb!$j&}M zC|LMINR0u7xs7=D5G0aap#m89Hf@!G0IBgiR?Z#IQBUcYsoBt?%@mB-Z~CR#eA zEX|1rmeF#*jVfp?2#=ORH`=5WZx@}1r-THkK*+KZu5U?T-rjO~YfJ@`8bs~EYaRO% zZVnyV34nDUHr>WEZN@l1aaj6a8vlMQPkO@8mU)G$(xauaZwsCC!^ga8=d0uzTd3Q&RoE%D!kxTd{?PvY1gc^D?pN>wT|Tl2 zpmOZ4t=fpm=dNE|5I%fjd7*2@z3N%5Q$^#DDGTMYMHu~xQMGO#vyZ^$ z-n}v!v89Y8^NEbacb#7&9-}HK$IROj^)P(EwhcJHKustJwiX$On*4JL3k&IA2>ioF z7f95RC5*W_Typl16egVBJpL6>l$b-;0MW*K>d}RbV(Bb4BO8Bzn2g~q*41+9=WbCl zDRgd~^0%CdytD)Iu#)DYoFtpX%X03LvTV$-239P{=4(tF_XXs>I_GRyDwGH3k*c0+ z>2r!9RC{7$Zf>seU9~gYz<1-=P3xhGv-w*KXk!mC0w4X7M8%aAgLVl;nUys2{$O^q zH+G}b17C`VUee#XL@<}2f%cnL*B^hGf5WWl+t=o~{Vq9|d5sgr$Bhg(qI11U6NS_i zh+UW7wZ1loF~mo2)HzemMI6c5a+Gw@Sz@18AE628=L)+N+|zraRk^-pGGWH}apdHE zdv>~`0Z#P-3CiU-k_C@M>9@J+TaB?-*l(P|PRswVQc81`MRR-lKF&#I7fn%69E$Mb313-tz)FN+@b^VmLX?HoGE zY(d1XF+2P6_!i zdtaCe?mGS-+P*R@%d~4(7*PZfM@0lA3_wz8X+-Jnl2A%%=?)Q8N*ZaUySoJiX{DtR zknZliZqS*L`C@Eb57mndaIF$R*sA$20C!S3L zY|nY~iWiS83&v|t zPX>EV7$KVaPWAoEm4?}rmMMA zFOy@|$Bd~|`$~&U zarJ19R*PUe6J*~3wW|UASYE~#bNe=T`BLM5m=R)?asr|Nq2QyD$GZxU%qB&My7S1w z$$5CtXA2!aQUmax-!6RpSMMeuOK&0Oz506E;SpqzZIwcI79Ke+h+yTFZt3=I<1K6KN4V=h03NO`T6b)I7Dud=qi9IKt@yrX zr5FM%wDl|Wn%HN@plJzQ7SqAOvrP`!cO2896XV?YpfnB({Y|aii$%X)d6o8q22z2s-U|O2m2U7j%3}#Y7ph;)4kgx0lK5)cRIRpF+5dR zD5+Em8NxmcOg;0; z%ZCwZblTgzPdmQT)Li4k7=DvW4pX?k5{&kXT){FYkXxN)de z(&N+iM|5l6Q+`aUmgYwaoXPYjlpn8H3DC9cu5U(>?qBU(pfiGvmWtWc<_F`A;X{@` zHs0gC;_*VXY)hw|M}HTyp<6?>7Njd&fA3$Ry2=$oc$o~aPJ_v$@>KH1 zz8DgrLz}ryGaSX-Dr5q3h;eAus}GoaVMJXW%$D>gujI2+gAq2{K^MofucPHn(9aZE z9XzU6O)3~^RLa%zbv+QXEe(R5tkE+1gputA#?v}97B#_AKfPD!h`t~6cYOJ(uo6r# zpJ>>)O%K^PN;l=hixJzSUROEHMb9NUog)fxs3iJxEdrccz|$9xynGo3_G$jhc-#;apB_IqHx3`{2sp&l^1D#zl`C zFv&0uTsXDlIOs%K=DW?A79R=71S-P8J zQ8@d}O3-qS^%fZFvSz^n*0T#u*(t^cYKHMU1kHKt%iZcBH|5-=-5r{Z9?3*{h8R=N zuoy91W!V_2iPNzdjmAtDBc1Mu??$)TaDDB5e`vamcYE!L<|bH*-c*E?bTaQVrvftv zSd$mN1yIWBUAikMb#TS52GIR0NmM}aQ*EW5OTU-Mhqen%8RLCYSqB5^t#tuITC zYtJAU&{Fc@VlT2+2{1&uSZtt4yMs9`ikdP4Cym+s<4v2~36q+sG^4w)zx!9c`i|y8 zR!Jxj%RFx`y8dYb`C9`W-XDKoo}*ux#6v!z5bP#)ye$J%ct|VZASiPcZ4!ecj$jm* z8B{-*)fArEfhF&!H_d;`f+0|x0aKCnO!j1&nfg3s0*f);91M-^jC&-uWngX`scpEE zwCIWP;Y$8vKFrT0IJGRO$kWoADY4qkKOa%UwP)o`QDClkRDb!JAR+T!j*N1}w$GHe z*ga+b2##>SiVrZ*TfmAY*lQym`?9A!vrPu0zW&t=*%5Y}Y6d+RXSPN~-k`~caWYQ; zRi0%93a-g#kME%RK=@}R(>#WGoIuS$`ivWLvM7#x@ITL^3X#48!}z<+khGzs=5#7I zOcOi$DDsiLaZthMQc%@*$aR);Ic-|sWznAhREXCFC zsp_@}&Yv>_u%_OBs3%1<`Ff7t*DE!w)r2q~P3<+z6^k_I8S_!`+7^BF*e&Ej=VxNHcaxt*LH-hyT>b@NV&AIVpgQZ3bb61F~nNM0)kO z8ntQwTtvSru_Ypi|0i5_0yP`d#SQFhFi9^`+4REE{mH<5K(C>VBag28`kbLUi4whT zmTDWdMtn7GxZ_(rcC|v+Z#2w5bBLRvwLmS|?zk@xI{TD}sI2eUw4b9;PI&()dSXV- zFM0Izm5R&r&OyB|Lf_lY^=%Q0xaGV-`}DE?ro1EnN)nH1wg9m|r02fCDFyH3YWw#W z=QOx(nF^=KQW)beOD;{sumOjWd(keWp?sr%{6$}maR9S}RyFPl*3K#b;U$${n-*a_ zLN|0spv_4EcKQ%$Cy*Q0fJVcA$Zp}uH<4#GW;=BpQ-!~E4G~nBe$PU*)&?EaM>Gk~ z=E>`@=L%R$tri6_$k}izYQoYO4TfjhvIjg1cJ6?WC?@@EPf;IU1YaUrsZ%d-akjk^=LBp z+1e!v>AOx@4cBzI8}(fL7A*VsK7E%LWF6WRFN4-5=*E;q`o*s@@%KYE zs7p^TH`!f7)@l_W5RoyZ5}d}i&^OVn?03^^9Nc?}^|B?DSyZp{j+&=)ClfMsh{M9` zUez9A0_ry`|FziK2Rs8I>GrX^g8cSy6&K!yWSVdl<)xISBXKUz3pBVCdi^OOqG1J9 zi>uT8Nj2=35g&O{Y+`DgaBSw&P-sgbQY$`}N8ob{jlOPwni&U_g^k>Lvv?(yQG&#u zPL8S`AAJ2o)|}5#&1R^BAz@W1I_eH|vQaiAWg~2mx^*V)gi$}-b{%o-Wz3|C9a^}Y zRbTYlObg04p&wE|#0WY|rYcpwCHsJ@A_tc>yAjoH+L~dQ z6N*CtGJCoq6QW!uU~TkbR1db`KkUUaKams+!@T=6Svj?t%&;c5(}kAy9@H(lr3N|Xo(;saLMt@fYC zHEY?AN<;Y|TP{1`)w{Bm@)=OTUFMQ!?>Y@1TdKi4Z6VOzG{i#jRD?YKjBvI4@xZf) zXzSGt&K}p2!tqrj8_1}e9w|W^fZ|(F-yw$RvWNk-G!w`Vo({Hb29sIXM)t);Q0^^F z;1#pm@wGo7o;x6CKL!1a)xO$_4h3vKa$i=9QEu;-5?I7i9jR31Pz;V!XPqH*<>q@#h1zot*^{ z)4uXr7PjOw1!#myGM~@D$;g!mn{5G4QF9;Hnk2+Pm4)*rNo&~`p&$0;ZRYdZ zW&-sAP^!ZQ@dbokz8it^G(Ww<`RG?k&g0*4L#9$*_mY{vGo|XrW!#qOn#eFeRNx2rC`qQ zIVt{IahoGwr&|~|H6x$@8q_hyl?N0XKhm^pTYe&uyOz>_SRLjVZ-*}HSY0GUN!8y4 zWYYF5o|m&eaykW!2FIt(qX-~5{jX-!hdt%PknC$F&|D)J0nY z!c#A^iO2eEIdEhVI_;IY4vOB4=v%_b>d&+sI{CU5eQ!$E>e9rBb_y8nGfJjrkb<%~ zi6EgvOh#v}aBoO(yL7?iVaCCH4>_7gCktWWk?pO|WM&Q(iFt$=8}uGbPp$b=hi<19 ztXK|zp)0PeYESqhmO>-`oYZoCLXOVfZTATwJ3Bqr61!(S*J`Z>3CWGi8G1Wrn*8Kq zy6E)5)as#>+0Si2KN)imXdgz|*PO?LxCRhK4TGMncG5?Tm!Y{>iZ|Z?{7`y1Sa)-?1=s4gu41SX8x>~%L<<2vNR5(DK^uwkj3rX zYWlWOircAp1&osKb=s>D3`HV1gA(Jr?;jyO|9Ot)n)DtIpAk-pRm~h&I-lfEtmfl zM!{sk`x|8S;hZnSEfwBJ<~NeR9W;gBW$6GGyX0U1USC>%7Iu4$&p4%HgW2&blj6{W z6a+|}<;77ft-kg0gq>WB3_Pr9mM31TM2oMd?4x}quhE2a*tO5#((aQ!ou@Kn<0tP4 zuwKj_trV%b%sCD!6q-3#h~FLW+(q#+w(Bd@&KUb_^ZYoZm$g3QtZO$A4)> z9SB+%u{Hq~ji5V{1M?jjpcb6GfjwxhABZty&t&X&*73j$!869yej-IJIWRCcC``~z zySLDYq?w?5-R*-vsf<%|X&1ubwCm6Y->cy Ay{kyn{o(qZVc<)hb#XHIs!AE`ojSAZ^BaYJujM4 z_G7n43*(I;B3sMjOuC4c2f9y49>RN~EMYITvA#d>Fy1H&LqPvaT)1d-eusH7_9-iW zr*i*QGU7y(R07=3VWh4POU#vwBmx?6AGbZF+{|7or6^!|#EPXzs>ZG!HM=}9Wma)u zfb*dESp){kUY@Bx!XK>P0?20%M2(lIzw)rZjq6`18nv9;$9RXp8IM1ZU%&(!aTCyMPDI5Q@x@Fk{# z)~NPDmGI27_ZLy6khY3x;ad0Ol;s^{ikR#1#i~%-7Qs-@AUpk0b6uEt>+zKsMGV|{ zn4~$(P4Y#5L8ZZDS#9uiYnnYlS8;J1Jz1?-R7UiKH+dH|C?RABcGg{lwjf`w$E8bEPfi@~>Ji?0)AN!#_7Z@lA>Dz^Ee zANNCkBpw*so5l4M*`ETZFyo~>3nNVX)}1oMwVw`6vr+)?Zm8aQ4WPt?z1|8gLH;+9 z$xLsiFQtG5*?r9+j5N{LaTO*e;XM`;4Qy_PFqP zV0sIU8{fYjOOlY^{+BFcHO^nmT@6DL!4t=WHI?GEuCZ&Zn%{+P|KzPq)786nRfuSP zcM`Y|sMDQNIpNWl^~%Q|5~VZDrP8;c29c1Xp|Q}D3;Z$n+>HHgiR#o&{3xkimzT1g zOk_XI^xr|}gFvvp)_@Tj!5G{@HwG>;ebNk5UWSeur^W3o&r+paC`)%0Tf(HNl0 zMKB;B%&9iH-54zvMb+HfdwL2f33D>axeD+LOFvembORApRgEDn?w}<|VN!Nh)O}7J8I~eN5(;dZaujVO#=mj$=IwXi^{ftlp<7*xclprPgFG1LX9EOet{GLr%Jh^ z=_SG{9@~#fRP#bf&}j^+B(CV(30lSZ)>|4l9$~7*rgCIrJIW=i+mbWEw7FuH11mT~ z>2k@^@#bSuUu-@vzDBTLcg;fMP3h%{@}W$di>C%cN+DIl3Z0IxBmw>3g`cviD>Xeyj z9buu!`%v#X0pfg)bJq zNlqwj4e%>vZL){%chdJ|!52!|X9$Yp4{DPx8N1Rhl54;2J`SEV`RpQFr+&W|OAAPcy-t2?k@B%UM!Um0i%hkOxW2es_YU=pVQt5R|6x!m%aXy(JJO zP|)++*>)#)k+!He_?pMFEfa+5*ywx#1EzoXSn%63NC;S=Mn37#(QmKMQ8{d{()9;z zFO=JDSbp59sMH+R;c!#L&sZT46>BD5P=pmh)V^kkSW3Y zNp$~0tT*5!Ox4ADU_SNnbM-~Wjj*@=WVwo9?o&`BMz!VnS9I`iZKHwC&6rODL^4M3 z+pntJmT#O7d$go9&mRA`<`HJJA}kBKMUTHD5`Z3ptfJ8V1CI|ajF?cS4SB%a-}4CB z5>x6pON8PC$Fdb$d*%4Q)sK*J4or^({`DZvJkQ}+7C11Eh^p`OE;v;3f^HZ%XRYKa z>}`}P?28*Mn=GNRUIad6H5C+_{~taSPKlNZz3(1LEj+*!E^NE1z~O|UxFv9@`K+_*gBblyfXkX2*m5W?OI-PFcvvjTl_yZ7Gunt`_~7S#~Ve4DjZxL zCnfE5UO1d86t(`2M~&h*=t^p1NCYk0!6%$rPKzw}a#)}04)_LnR|&jlK85l$OOan+ zRnoWw)(uO^7*{0|SUo`}(LiQ@A0)cMRTx0JoS^B<|EyrhyyaATdeHuZd-Hh2#4rli ziF%?{U6kJJs{oNNKbGD}8@>b}LI1Dau}KII?<>j?*Q(d|<<6AKsYj_~JY;Qeb=8K5*&LDmKWZPwr&mYvl6G3+<_L^ z7s%A^&9wXFpzD&vWN;FN;}MD7Ccc?MYVXNkeZZaIcb5YdndH3d!~rhCxK0r6Y*i}! zL7B2ri<@&XIDx2hzu#k&lVvb{v4Oy1?2;eO7c5!QK~j{|VJDkA#8v0!PiHNCWKeV} zxsZ45$;C9?*W4kSW)zC8($ojVac3`9pp#rGTt`dgZvxMKaH#!A{N<1--x+0HmmF^c z?z0<-UX@Vg?-ptzGXsX@z)IE9sV8`=U?c>N#J@yfgNSeUW;6BpjGly@kb-R+J|L-G zNQEkYGHo{MPx8#V<&!t5?v@=Y8qf)uve(oRN4I%G4!rS`?r#s0# z&5B__SWtLs&ERpj{RNoa!wVhgY%9TbO%W#v^h2ofE?oCne6T;A&N>6V za9|glXqP6Wv!db^_sxXx2CrlZ?{1u_mj7Ve@b=@ET&7a-m(rtsYSL!PB#DbW!x9e*fotdrc^tQd)?;VB=~j(@vFc-Wu=OD``P z7mZV?7sk*PLF@5DLWkVszzRYILHVI+b=I z?Tj+oOtL1?$z3@7@yf_Pepnr=!q)?)0fS~N;8yK(p9SVKFu8q)o9@OT$PuGFyntCr zFn`cufJ53|lYZZnIhAGKI^g!rF;S1hpW!$QKmA)uV~xx%WSRa61?1QpkwtFA~2)ra=5eH~NEb8T09=gB@0McS@KgG0G}!wm3n4uyO16 zvmIN&J-vwMr6Ct&^K4CTZH-G?o4a( z`TNWji(TrhwbzD`obsT*|E`B~5J75n6kKDM6KJ%mB{!%4Xrz!yIBSyd`5b6SDq$DX z!Q2&uDgPM5a}!m*EELyM0$=wWlHHkj<`N+n;GeJXJ<{!sub{J*!Sh`uZS%6zLRVP8 zUx}+4F8WP_PZRWI`{pKGEJ*q%!-U!g+J>s#E0D(1-8A|B@yynEh`QFn{$7sNg4(xo zyTXTM)>5VuEi^XEV@rD~djXtw>se^w1%`cOFu5&gq4Ge@=PK)Ufj2}!0pt=5-*R;` z7047a9{N+rkk$KMa}A_cl1`CLzK(`@Ik2dxC`)z$)X+JOd$v-Kk~Qmmw$_vPBiStU z>iurKY!#VH6b+>pTE7I`8=#ouiP4T1*0_aXCMb2?8{&<*jW^u;zN=I1A_WHDZi)m` z`_pOiQ$VeWZU!POE??35L@^JDHy-=6&QLd1b2ty7CGGgQUY;b# z!rYYKZk3b0Gs>2(T$vjvEi{n{>P~4yhP50*7%n}aTS@N}c5BuBIL}a1UxVO@_FeDQ zK*5;g777zBAKtj5_4#}#gRakVDQa8BwE zl;r2>bqddyt%$2{n4qO~rK^w=JFNOOMRD#Vn1l^PwI_&CS7Argpt7>nL@)hNEPxRIP%Uk&K|o!=r4d`mn(`>I(_)yzy8mp z(s^Kl&PzNCvb+lWs=avamr}^6J`c~3CorGvrwEK0^>*3fbJ1|-=B}q7o})>Z+gcQx zPx+hAbcwlR5$LejCb?n^t`t!*yfKe|||87L+H!pv|QeMKt ziXuG8i}cH_){ZE<{5qBEw8J+w;5w~O60$Fw)k)5c124Y9T zL6q^G3KsYbI$jF}X&Qxa54L$tAeY2g@9_Dtv(x`bU~lShXT$kER0Y~dzYZ(zD~u;g zS(dC=={ec6Ja*ek%F~~zY1!h zfd`CG&b|vx@$Kx**C!S5x#~0Vu+p)dV{0tHbbVH-PBZcxG7nTXMYewGj{3pg&W1=R zz4jO^pm+3U!SASaa+>-Y`?AX(TFpSiF1Rs2z~|7zC@VJbINoR$y|!8VeeaExp9Hcn z3Jk;RC;>k5{llo@KY4}^kau(I*t;S5PilT%QjJSFlu&?Bt5v$wNR6*31e$9n1eJG+#{uPJh=SDQ<9n(--=a^hm?TrAbHG+bme)ds#Y!j!>v zye5;NSgcpC;HLl+ia|AhZv-~B=C=C%`*+^*ODjhd+At-GQKqRJYmeyvOwaD(i_yOs zidC`89M>W0QzeFEt1C!y0ayZz%I`s+Je9_Krr6*c{g9z7+gwMo%<`}+cEjt7Gr;r&y%y|?PXqV0^LHzB*ca)H5=RGdHeqB@D-^p(4Bxt%J41x9PVp|MIx*}-){XyALk$p~-u zj&q)})$&;Va+}C)G&@Y6iCj!Y!@)8o3|!h->p`B=;L}v}x-$qT8NH6a5((wWqH;>g zhL2>L$YA}mIN`C!)C$%xL^&w2vGE_H*nWO(k_M#4wm~uO;rhol02#fWr_;e+VVs~} zwP~T*M2oleE#0QKbZs$wn2iqm>wU)lR0_1LcIyToqq#u}6#IsYl7Pi%RXy%<2{PITkbWLQx#W>Z5o+C60_|dfal0%PGTB>eb4T`-dqv_OCqa6+o#Jens}as1FF)%zY{4QUrskmB#vu&2pgX9O9;YF~(@UGWv#F z`1J)+Q3wL#c` z&>A9}EFJ1&w@|(@=FKu_!k9Vz@Es3|&5uysn`S?nOn)@teJd~wr&h{&ARcjd#5&^z z3S^r>R0?eSHqtC6(2T9H{G)jW^P_5sxe(Oi$p4Woqr_&l4V1Q!eh|+Y}U#-@no=-3r0RLK7D+be}Ko2T!Kj8-W?oy8I*YG zcwy4emG7TCxn_(8N?3a}d395r<Oi!gGRYRrN|UrhTv7Kc$rS#1GW34^k^JPQk_zF}uv^gk&0(0_cEC zP)JuMg_NRQS;2x*Hpw?lty~#~=IgTRKp>V*Q=|hcNn7tviB+l+?i3i{jqhVN9;AkJ zFK@0wx0Oh}O0-Z3t;&4j9r4jK7~u@BQx?j*JA5hu$D`MwEe{uc~sYo)>wL&L%gog@!Ant6hyF^>8+`kTBZlylHyG@<|WTP(O&dyG>*^nva*@Qe818uY@#$I zg0q^&C6Ppl6WldHu%d|tZVpEUoR0jxR?SPZ~$A>^=@l#Ua8pKrvQ2n*a)a&%iW96W=zC4Yn)SA=SL z!^LjgUYp79G6KKhMZ~F$JR^=JKE2kf^()ZJ0Ip+vrIouoY@#WY!JpYsIlUsK9ozuo zB$R{U7r~?=!B1Mn1dcM07%68JrPyq}*>8AT%f85b^2l%zx zwcZ5rf_~SPXGqQ2Ovhen)%)|=c_~#CTA|Bs0MrlIfG8q z7ksOw?|j8`1$}wjZAVt@^5nAM<^>c-6ryH1tpzm%&T*qOJ)Cd+S6Brr|G2SJ0tRwL zdKX-Ubj*V@Z_mG?L@8|*TpTo&4GL)fJ-X2$N<4OiD){;E+X+r7LA>)ed&YLm2^ir00HnKeW3x*C8uzIId<;ecnHirl$p~gi+WMcw z#KcpEIftOnKfPNoyzIQ>heLj#02cXpN|TRgLhONsCl0an+QI8DSc+Q&=xtb9p)g=% zjz3u@v5QS3<6*H@YZRxlLo*xe88gDWCOonSFPM?Y1I{?Vi>E0&{0V&TjKmt^so^aAtryT$eQpvn{;D6z=jCY#TL zLYhLYtf)&d*0~c3>v)52Im)9oU!T@`;Ynwzm77q1!vE!1;FKZn!28D&9tNB$WZE}} zw4l#5OLY#BB9E8Hoh?3+L1}h+ZHOL$%0z!=VNRXTS+4v7S^baZ@W!5OO~Tt+3Z*a3 zG^5Ic#rQo(!_-UfOH*RNV=;=5SI-p}3uE*wU^*_JEH_CyGbTI6!QnbUlsTg>Sbw ze6K!?DOG;xVH)uc&W-m(5|hp1cjpjbksw#1*IYpSS<; ziHQ&<(vP=xlMd3}T4HAcpG+gla5_zQ3PJGad)w0ePcBzjFU4HtvRCvW=B7ok7l`RX zV7cQNrStv>LbAWR<#1q(tZhC#!t=B!Yf3t6R@R*zxU21ejUx%ORn++-?rq7}d4Rxk zI_X7P1aAKv3e{T37r2Caga%d4C~fH~Ea??Gk+Ma?EOAT@+vdsYmHTVSvgmV=ads)I zmoH5$5I9T|G(b(1*F^_nCmxw_X2ZPNm$B`WUt?ACqfH`0nf^AA>*Q6?7MQE6{hQIi zO?-}wm3SN0ghPQ+dYgKDJw;HCYI|;ld?O}irx~c zcYhXRHFA~G!42@B{*XMSXY<4OHkky$Sbp!r=N2G#xH;FGk69<3_D^vTi{jGRzi;%> zuZEEc_(T+1XNha(MRYp7`5`UwdGx-AjSYp$Pu+2g4~&|8dgao79+_C!XYj@O+!7Fag zscuVz@@eVH2M_`)5c_1(>+p5M#MNug27iL^SQ#5~g}PYyjDq@Uw!w`-REeD|&&bK& zGeAgSi)Kqy3ES?XU_q-_Gep{2HJKs8OD0{<<%zmANad+ELgiXTb}7Bj6Lk2F6*M zVjV94^+noq70bfYY2wjbAgZ-V?0S!R=@yAfp;70weiwz){%-G(d!F5fQGF!)##*xb zS-k6!>{f7NRdt859^Fr`c+K7%$*usEW;#>XEsgx2C_tCBMJ*VR{@PlhOmE)P@n99B zC9Aume|;gCW&&Fy8vewMJgy})K}ePEV0Z7Q7@)}Diqh&YDi^-^_5Q$PRt+ZoF6w0X zYLcnNP&JO~wx_M0YCU*5YOh6<<+#y^}U?!d3KS<#_T%z7uU&h{5f44gX_l5)Kl zo;_Baoj|dJ>$=XrYLdwV%p{*%QWJimLUEzx`(CBAQ)%Z2*=|lZns-jzem=l#*n1N| zP>l7wpFK)|FOyZ#$kWN2_z=j#zjANfYf=k_@-?)6N1r@1`66vop4?6Z-e<>|D97!m zTd<^d4*SOSm5El|wZ=PC<&Miijo&%_&nnPJX9Vv8*d;5cWip~ zl#Fp4_wwf(G0!E~nr~^W^%+;zmv0QFGCU*`kGOTaeAWMd{GiUAFB!KYT1l;J#P-)ulcGjNjT7$7gJzv(2oXZ_)zi%i6KCTz9gZi zTqH3S-O{Yvr6jmv^etcrK@jC-W_TnxmR{Iz3|J{UT(qJD94bvImtWri{ERl#&@5}5 z7Sn-o647e~^t$zOv-9T@A2Xw)krHsWH7iyY@UFaIH5xxbw{_Sx^g z3bkQxo28O@!VYx**XY$vZFs6!XW zbO_gUEe$!8*?JWk!A8(Z4i6{}?;)P48NAu}{?0=8bodvc0sDO8A+A0;sN(}668!!6 ze&;2fT4jeG1OhN+?C}+Hv~47(al(SNNdL$&5RVK))p1(y)S?}oq_;8GH8dz}jEL2tOW1$FV&5jd(ox0Nfk(+Q&g@^{bM zdTU~nT9>oJAYI_t=r>a~V=e!r_bo?Ty4X}Zz4$K=DMEhae5xrlRxyoucSq7r=wCa} z26p*AS6k;FzWdPe9c`KDO~Vm|naaAhTMm<+xVIbN?T<&<%_D`x>3|Ls+O>NXqjhf@ z0m`O@Tq!&Ps*R3??e;{8g&lG@Lw`1lY2StWH1E2&tmY#YW(x;xQ%Ax;+?nif3v&(c zb?HKd%6$2TTKnFMKlmpw4MJ#DDT65G==)nBRi}VFEO#KKWJx$O=&verlS%_BgJ`97 zg`j8IhhQ(LEs(}*|0@>+H!(%+?d{LPOuATp7=snL48n|%ZgnTsohtB4{>5e!y@O@u z!&NBBkc%4t{%AK31l;F$_gv5Ju$LQ(h|%jbU3vO7#%+8Xvbw%koM#H^8S*TlqJ1a91*4Q!zKIX}YSWDE>W z9ZZuOdN&rAY#c3J$dzn-LS(mD2AB5XV)>)=!8qBWwz0Ump~@lpBDpf_XG*|F1W-7P zP^`Jf+m7DVZV0T%o>qxP;tzn&0ZXHG>|wXx=K?xao-vqZL2nFMBp+H#2f+ZpA*9nW zMvKC`r?NY1Sqyqi+QVlZ3H|RK+3-oBs>v?O*yMp-%y|;2J6NcH&yM{^HUP}+6+}ya z|C5hPEZNBnL=@E9-aBwPu9|n+s&?9H2}qF;ls`^AiRRmzSB~U_0;yNiXf~+=eKit# zfv~wYt1_4LB%!KysKhSB+*71kY?t5`n(0c{hVQSuBZ-m=4(-)8>Nky3Y3uU?Gb<4s zHaT5fMzgE4xvdR=@ZD0%(R#+wRewTT4&b=PYcH{h3--P%;tT`j5;4v(UA);{xj(LD zceK$SssH?8{KJFB2|;U(^LLQp50T^`2>M0*kSK!={t94*8v`+85;DeuDJ&C^+}jUb z9v`bsA?TJdp7kMQ?=r;%IOyW|v@xWIAqy%g5hsJ1x^gfS=f33%0J=YF9X?%~=}#&m z+!Db$4pOEZNX52BUJ`3fwZ;4VkY?Iyb=udoqY91{I^wjPVIs0+p*(4n|IEN1j}AI2 zEwY|1=5ZFzac_hQxXPghb@4tAND;S_2;9<)N^+EKw^yg6D;*sKN@ZB&wpKo+=y)a# zZKQ5R6gci}Z}E!lGg{0;j_I*os3a3@rC4YbIk&1=>*WVo#kcj`>30=PmLFgJxxCzX z`{nG$7J`9{r%O}XCm0Rq=mSVzSZZ>E6<8lF2?RFhMuT>s=)p7`(?7;%H43f1|N8QR7XN^^+h6m^A)Te;+=bfDQ| zk}uCr8PxE8&{txSdg+!V$pw+zpS#|;P!c~-GVzyFBsktn*%yO8lu76^z=^cb?EV#U zeif28;gx=3aDg2P(4z}_$3VuXZJ)uscL(2MtS1fKm>JY!0%k*sg%+(;?CqU<_$)?g zoQ9AlULEMsX3S>Wf!sl?I}cM4?bDB1^eqcz># z-K`bFZZ4<&vVO;%x!}D+W;e+5FBg6C`a3R7*ulpS`{WY%QXzvH zGD?3?pEpv3(5R557$=35NTmS2U(lX9aBE0SeB;}qkA(D5^+eEC@rj{obnQLLHMuC3*8!q9YAL;K4`C#S4^**e0~jTp(`Hq zZ^7c&r>kfo899pzgYTqox}L)Fhfj68H{m3L09HVm|9H~;HC8}?dS5FeH2Cq;KW((ZlKcfxvnl> z0A|K0r=ub zuPtR7{sf%9(4{{dIeLy+dnzj$Ey+ zB?I%%2JPG&MF3pXp6$tgg!cRt7XHl}{9fpLUrtyhDR*F>fRzz==IRWfwyjrCcOV4} z!gCt?T_-D)&c2Xg2m=h~+SP)3b+`OTmy;KD;XH2=jFfuKu6qBvrqFyQ zS7h4%lE)e~`>Z0uEOdmw-&LLKD-3z@;>9BVnGxExi9S%kEZGSF&;SAnrfaiT_NARr zQXw(hel7^{n4!EF;|=VP4^=w=oUIWMZn4ZaozI8B=t=WaM7}Ekr;3q(2^RW$H;xMF) zZSU`&9_ovadB%CLyF&l$`vak9E(gW}UC@;yW_=dzd3nqLF@bUVcNgBHVdd;9Y{w?? zEFvdp+#GH+hl>tr11bkZtq=f81V^gfK*r?g2dPLs)KgmUV(x`YamOlDzSA>DXb`}+ zE}LWL^OU2d0=z0+V*V6hg2D(k3t`zFogYo16@^-%#auhH3{oQrf!$E3-GB-$I+W&t zP10=+D2~d;nnGn{u~XbHl8e7BQKwnP%?blBC242}-I8;AGM3(P*BTKOXf*^1fn#L( z1`d5;PC}7Ku3UXu=#VIkEkwcQ_0KJuYt|$A($Cf{C z-G`}xNWAH@~6WqY*#1$ zluAEHD+eVDz3u7~NPhVgjZt!|qd5;>Ng2)g+2{%B>BTNeWA5AL3y#Pai>4#|ovwf- zA>e&keu##&{CNl12`8>HqXD+!jX^sZoXo+34j|0lsc$Ev3PCJoGEhS+9JC(wes||0 znW!(kv2P1(Yvb=AMZ+wSfRsoZ(7fcXwYffpj#hkERmz^c$Dc4jD^`ak(z$Rh>9!pq zi_ya@8vE!SOvNA?l`dR0O!H)}PF8+(cUvGnhN8z$?_BR9kG7YF^3pJ+OOaZ7l-nlq`?Mp=sO0VD(QtjSXeOdSr zYRp00q%)SF0I%y{If&~gHy$iYsIU;)TU>(53`^d9WPZgx=(alcD)#h2*;eE2%2fvfg{1DS zl?jKTxAD)VbSlyto;a=DH^$+R{g4CB*j*WQ<|z1OiB`=z883HHHh%twjv@d)-E`IZ z*1x8Mw1a;YmB~JjB670nR2sY&%xfaHj`Potyf`*XbAj41Ne>;bTXQbOLeYc$!ODJ zn*5KrWmt0m>Uj~oc7D>zV~bv$2=}Bk@?fnp_o^B=bK@?aynX?F&G59#xzfue(k=n| z2UZV0?TzZJVH?V;f3?1$Ks_zX&C{Rt$aNt+paa{exr{Ca^kXsmCw{ypk6PT*Fzm^C zByTpj=+3ZKQx74$9)Kh*pd^w}pG=>whU##6k4MshAlOzV=qnCpD?C=cZnOg#z}o)c z8FG8Z>WMaIZHSBA(u&u$G=iZaVs=2cTGzVPI@h_*B}tIF=Qvp=*J4nNY{aR`Y@-JJpc$|*(1|;0 zt{St_slHs`7A-~i1o)AMj$gDHTS2~^+P;%?TIwn#r#2f26<@L2=!=`%&bi7PXG*0N zjieXha|psMy^m8{=*tA({*o8QPy#RI^d+%L;=hEMX}t78G7ze2TS?-MGBQ4Px~^DP zenfQ=p@?v!$czDdz$>~oH0gor-(3<*?%)N4h>30?!ZZ&jQwC(<{X-Y2@K3-VjVT#a zEA+%(wZ&Cc(YEFYH)=ddEgem~v>g0=!2rc{cb#&UW%#@L7lAQa;L>9k2e#npKxlU!K2S8gbLM+o z&BY4*j5lO*DFmHUJ>q>1lTk4ijY~cL_5OKEY9rNVL|@RH>I5Ts*7dm03IIZ1ZD{vs z;K5~1UN7I5q}zf@`zjgQc)>}Wtn5n3jU?9_gX6X?S_$XaL$G`!&|>);!V@6lqqcC( zGwbSq&)-vAdfqkE7!tQF-B#FoSV#N#op<_nd?JQPGDlSSnK%d+#PF;V-#% zqt6a)mr7npE`Otb!E!x{*-lJU95(Tk?1RVaF>MJz?(Zewd$baVY*#&S`|15;;6TJ@ zn|AQ&ZaMD^x2jZgx)#-BDL@etPtM$y{*;)fm6WGSSO~K@=yhDaR?I-XYQ`UmuI#;- z!!DB^z!hpyqz3Xq5vtkts>fiJAOg|r$Th{Axa7gj9lUU*6)?SRn(gs2RG|Q3g^sal zJ%?cmI?<-^7vksOYDhVDnB(^|lZl$7TxXS|pg?IXKPx7B6>r8nf0%c0xTmS?NC_Z) zEDoQRwO7tr;Qj#kM<0k9gN>v>1zioYTFL-(h?MIg#=wr;$5%!{f(y`m@g|CZ_zJMC@HLVa zio_WRAgpmSK%su5wco4?Vp0Y__sr7Zkb;(eBInwy)p)dFWImm)nB>j2!$> zp+(;fJ;-0LUGCeOdgJy(VhXlnEUo*7$xV6!++U--8@lNnaaYffH~}Myw>Nm@AV{_A zS2JF?aN$WV)$9UP#T131=9@XOd*C&|`cequZcbH;H?M}`X{ze8Gr$wSvOq)edpsdJ zji^4ge9eMnnfG!82I-=cu*4ck*I^;?f|FC6d}R5@mqS9-?<6oYHh53+$mko>MaG9n zbG~fg2~4`}@c0T>i3Fuw0}0%HF!BdH?hJkW>2-U%#>9CWZPaiA-vFjWF3-S;zp|5G zmwdFA;U&pmN{JUw+l{u8)-53ZIiy^R&5G%oYPn`z2Q6F^%c!Pa?%;e2^vvb)P!J=T zm4kaiI%;>!Llquk0f))x#623Bd4bE{Oq4nR4mo>!G=I&@|NIB;09?)CC$_OB)9UKq zKH^N>Nza3;ZO!&Whki+zVLfA)!N( z>+%#)TGXIPr~7Ol-VTCrc=fZNk2QUU`0gm+Pw|4vBdF$K;R*z%0eI^zEkeuF4OviX zz|JMos(RoPO1F@*W$W+DWC5zjApr~A#DU>R;8TR8)3v??*tPQJZsGkVYN}D3>e&*2 z=9nyK&jh8Qaw_;HnV#~$?++AV{Fs^OB>s&Dwx&_ve3PeOgvIi`ux49-Nm4*ylC?iz zY!A^9c;8LjwLa`B>59KO{k#MV9h^pfp}%I;spq&KF{rpah4|E_vu`e>ujhH6!7BZ0CP^A{_;T# zD5}@jI|Wn>uILt0XWE;2FNkgNcZcy41mlC7F^e=RX1z|w?j;BW4GfmLBEc} zCz2sxnBt5D?Z?^7%a(KR`lNHnk3b*FUW;Xb8uY)^J!xr4#DXVx#qW;kex0rR0{@b2 zh@-Q=ylOJUj$BYn#~NzpTb$<7d#jtgOOOKEStKO`j?pp6h7&otKn|r3yYQ6l&r|;$ zoq7@a=j3}cxmYVsZQKM=df0@6B;E?^pMVGo9rxad@p}M0Q{u{%rW^M^`J2|WVx1=`gJN`%4_BWg72loMf+=ZGaGd(Usm;B%VZtc@$MA#wo=`bO? zXfBEfh<)FOGv2&;)1e#|dNTsFeSiXj0MaiVKG2!K1W>d;nBI3&kVs~&PrAf(K|+G4 z)eUZ!bA-=ei(Fj0;Ix^~uP&QLcVCI?K5p9}!~Y#~6|x^7#05vw9|v7bV3d^Ri4Ybl zF2g0AgYZne7R?jiPML#Xi*0o+>;=C!hb_M`aY zDN;jr5CG1iD{~s^L4K!iZmmp|kGWymx7c}1H!wVWbcZY)IksM!Dog07aTB|YP6M!4 zd9P6qv#XqsJZ(PxoVL!LamCS_nD#Tg=FY32uJ7mLE~eS~-je>e4cvuF3cY=|R1e~% z?0KQ;^9z^$=kJexdTZbJqgOd~o z7$vY94=^jl-a*{Stm`ct@`J0B<-6l&FV5}b&=hED2a<12R7;odkbzy9=m;F6{v8FDzi}q8qG*~(MYG`J1Q>Q5&*8lOvI2AG zLt)tV$gAtmbfzkJrHW`1O4Q5gP9_eT-bMGR_+?RN)J!M|)R-wnr|g>&<;9vabPms) zYQ$T?SB4ZXKyad%`wQ3c15&@Z02--B*cAvHXj~>=NaPi`twNDjcZQT$dfg0PCbxw>a`E`b;oE^ zpgC~4%ugmZE!94NSI>?Q;aj(2_=0DY*wjesY0*#Fz#K*9PR3y{`j zwSV_PN^4K%f^+*L=xvro7ND4_Di0j*%ipgC@LpHeaTtM%Yj@!sSl9q?kw^+T>Ippn z44;4!h!m9I=rN2<%W}fsV^Metp2Bdb8?aWgnM1EW0+Voue$CpK{rCrM4t(XD5IM*Q za7&$9uP*?LN{8$7J&hZlFw!7}y>|ugqL5>(bkc4#MBi88 zSYPsWFWE>TH4s+ZYe#}wDOI!`&uKgK5tca<>`+ajN|1}i6&=t$mNH{afeTi(65R z=Plg-0|0UDBPW=$4~3Ca&ZtVwuAco6u-e<5MP%~{q3SqMLc+QIYE1RUHt@M!%YsHJSxo|Rn1*Lg@qRJF|O>au_WE`g$7hK zmt1=2q}3}n-KHOz?|F$hMkbv{F;NeQhG-~$JX`NRj~n`n z67ACmA{2JnLhaEDTuy=E{QtGdJ#ofK2CKnc|CaKsf=3GKLWI*n2VhT;wi~!a)YPbu zZ*e(EyQEMtMVUR7Uzu=f{_C5=1BgwLrjfS*C3OI4z5^MQ0UDwdpc6MqF=>tVYF0AS zoS4PP#8eF^3H#l`b%1 zQY@4JMQ5F3O`W3t;+Wep*c;HXiDyv z_aNFeZPL~jfxHfP3zUXqFUZQu@{N9hsNkdRhw)I}i1qIj?2JI$d5m|cB_rzcn=RXR z1@x7BIZNDBUVo3(A=Sjv=iiJ6fbDe3aiLiWeops~FBKxGVD6JR!!;07`qS^1 zz;PJDh;S;)!OWXW35F5qXCaI+3ciZbCOds&(j~`e*x4l@U;U0(2C6RpwGo1bt?~*A zeh|)7V7fN5Dxm3-N27|?AYFXFh$6Bh$PCnz&6u=P{+L2kTS!o$&nFfO3QHkdb;)FQZNsa0GKUQk$4R zR-6E?rXwH#z&C0KL^KqE`%2XPq%QokCMUQ7>z&=SQzNl~lnJu6r_j%iPK_u;%tz84 z7;bR#zJdwE;Mpa6+Tv1$WFVUGEBpSLs@w-6H~P6A_cG_gII?vc4?jX5126>rAQ!34 z>_D~GZ=c^|j+_qr=i7gL`T}+!Iq}``nG=YygrCBU01PiVI3zC!@2(e>v}WIhz(U5u zlhFiVSHs|}DIRhbMTr&Y$=@jmr9Iz%=-IZG%d=UpBmfTq_(oDfq#uwj_S>bbz(7=6 zq5skn5am(3#3|>pH~<^|5EvFDXlxc_2pzeYq;M1wCokv0z4J^6R!s9KT4wzVn+A^- zH@8%*TC$-3?$xWa<;^Le(qL(6sjc_Kkl+xyS)au`IllJSNMSle?N#_UH1@JhKaRMR zn&V^OoiUcd`}U+R`Bo!XU+U`ouhwyol9L0ta>qyQATxO?Josln8#=^;U{p1@;u?mVfa1N*a3!=XQ5HOnRz>QuB(8Gz*M93Nj}E& zassG&1VcFeY724phQT3%kn^|3)0zW};8E-{H|t({pQY`r&`jD*yyIm7PU@du-~4O~R61D-R%{ zRbJ01F=&ljFacnTgEAVk{!n&;M#+x~Cm7ycFuZU9a^tnLk`Lvzsz^f!Kz`o@D;-=i zXc<@mi?uvG*Sv=V9F>LKo6S5^zGn30a?dQi%Dv?rO&w_vqV`(hwXer1aTxg0U+GIY z!YA%tdcug7>2V#M10*rm_NgXm0pOW>dpl;51y?-a^u2``gQ2pr(o+lcH#E(P#`q|A z)cxHj^>?_4xQFSE^(5$0;DMtl8%8vShN%03XLPbz!#ofeB>DNy>KnGg6>SCorBi7C!%@%4g@$N~wXFzP z+X_ZSoH3x2o?ZaAUVwlIbK8;ye;0BcbuVto2XX4o05eSzl)y>MYlAtXkY34UllScF z??d!d&nQ9w4~Gi#>&aH20OJnA#~6!v735lOfad`Jtj5MRY} zC+gBbS~%KFPk#=<{KrJHVPE2!@{duVTLM~51MTQzbkWyeg0%?onms-zssRgW_u)|L zE5!ybq@Z}g1vm?y5$sxpio-1#6Orkg#g`UIxU0SxMs#Cdwuk24$wfQXV5>TcKLe`2 z@Y_+u;&zJ%8HxaEqKkPWW(ltpI|!ks;|l3tf8nu%A2T|^cZq*#4hVwu@(08~5 zic0#8iSqG$dYkBNVzI9Hd7W0?ptbZN6ASE$`BFVENIU*{@U>6VKvRjUO-)1t!t3PW z%Y81zAg(@65T3r6`}(PKKTCNNuiG=Wr2-L(fwOe}>19Iz0Rw^NRFH6evyegaSmxC? zyOJ(GxpCPL$y-1Ps4(-o`uaQi$J8^7P9d_?QMAc(1Ogy^1ZC-ma4?}qYfs&2Sk$gd zTq>VtuuXtEAcB#neUiDbve+h9KAiP*+|MGrC!sRP4gk6}(fKiH!}u0pgF$&-ckKY4 zg#)O>W7|fx_RUCz_7SlaNC><-1OJ{a;HvfO8DN-k06ESI7(nIzWMpJ<0D?SAx_4>a z>stPl&fUrjaZ08-7UB>rWICtoea`i6&$dDLy)BrpBs%rQ`s2r4a!_@?oHk>&u zig|<%tsUDBC}ot~k;v^7wp=I8pu=yC9dU)YtUOH@$Uu*6O(ME zK$#49dfcA&s4y1k`1ydf;B#VRH)}rYpMTIAz-p9+*_F=+6YBtX^O!-71rp8r<24Ye zBAMA!Qg-(q;D89D4<%?%ucWf^38@=bE>S0d^pqspDYCV{CW`=rH69F+CaQ5n8q&eQ zM?mJD-cUTR0=;Ss!12IzZ5k@zdq5iv>fl|rdwN3!UFoM2vj1EPy!<(EGmhq;3+<(G zl5^V?%39FRrXQz~^xYQ-*(5U@<=OGI(R~nEnLw;svN&FZIG5$Sz$RGBmZrS_WoHQS zCyKxM00a3^)L_1D(1vgR`Iv>UHT9-f8b=Ujt?iEg1-Sx?T<`>jwO+#j9w(!FTxfd| zzOu;jwEsRf)jD%8=-Ye96zT91gTGmfa*boM@seC6a5HxnUF*nAla3PB`nHRC&By$+ zS%2Y8KvXa_K59D#O1cPL$Ur|2_YWbLP=_EF8tbQ$1jQ(d$He_}I*T(m+%`WGIJAmJE9>U4Kyqgu?lv04t@s2;NU!UktqQ^9^)p;`xqRs-m#oLTe?f}b0K>5@_;^guSD53-b)O@Y|fc^$#6$|%pg>`fo zJa!l3`4VlUOF6@YT|v)ph%&iZmqZ{Trlat!)?asjroz}y7RBXOBh=agxXZYF^d^o$ zRLlcGsX$}v%bP-#FMmcEp3(b$>$gC3EgFm@>;khN;yW=sgK8BSB6!o_4v7R15c7Oc z48URwlu0;85|rVkKr0a9a+3&_K%6lEfjjErnvZB zu4?|5AXr{4umn1|HOmEJk}xrFVf$bQQVi=U^KrorM(v+Ejs$1%nqR zfs@M)&5A0@>6%8ZrXZ@P5A3V)N1JX2y$2L}FF?s-Svgf0^dt(;Q_Hh#aE$xG6?`oC z_XV`^M?tZA9wWrTQB(R--~iq>WEZ^`U$Qal;*7!30e_0SOauDDh}HinslisR`QTT| z(T?9fbD4Jwm5X_kvoeA?`s)7q{j+jo>@N`ACOP(`JIX zM*b+qF`@g_@D!w1mV=6}=r9Ww1q5y*QANCG=pgu%_vt6wY>$3uipO?0{geV(#@C(>wYIHr%&&?!xYb z9Jju68(s(7D?L_%D^L(-+4}Yn=_8zYhuwt?mG0v?Z`$?!8N_Ez;+xMGep$M`8pt$U zOgmg_dPB>fY1-e5hKt;dHXHXq35Wl@iWf9MdxOk>n1Ig5VPc!>TU=hf6s#+fy|K)KJ zHtjacYo{XkwGD$;BTkEQ#wU)?PR-(5Q>H&M?AXm^J2`4p9;@Hbj-Kb*(7pFlHs0Ow zxoX1h#X?F&R&_ZuVKV^(DSJs;cwOT?--QXYe4zno(iC3NXy~zZyAqGD3>Cgd?K#V< zVuQD~ll4QlgPkw&W?p0$`7!0xkV8Tab(w`wd#eWL|FN!$d1H3*5}h5NgLAD2o0oO1 zIZtbY9wN+A+=TGVc2$g8$dwrX-?1dl4|L@}s^vrZH9gBhd zS`Jv7U8OY#ejhj=;@SsASD5xl;v|)9r|Py=MzA_7?pXTN=~(%gbDkk_>t+V@JD+S~8QN^nR&yaa_<# zN&4i*Wg<;r3Bm%AW_UGM*lQe#&LVy^m&mwJsc0fz%B{R@Qbj>>=W;SDs`(^ilwD<_ zpkl*AzJpX^4Q=xRA6_q{(~^%1VWx`PzUvwaI#k1kTddQTFs#2g|uF z3^5_0DzW6aof|wxCV~K!{6@)G@n)(+0D1I$14D7nL0jq-CE`K2=eENmFg{ehk^*m+ zRcZ9=&FcfX#RX3l=GtPdr!w%B&a{VNl_WIT&abu8%nI#UX9HgQz*s5S)fE9$)I0W2 z(BAB%%X}tu?^I&WY_{%Jw&QL~^H?2YzzX&cfnxA`B`cu~7vovfe8;2MwpOV68L%Ym zxJ8!vc;WS5LyhA@iP^cm%eM8|W7vnYjJo7|DZNSaQ4WpSO|b67(``$=QBr~05V@eK zZjR`~CQ*xSj3~s6NXHKv2J}_W!Oe>Jgh;84Dy9G0hPQeL+NV;kRc3)!D!jtAkgnIp z1GI5`m0T_gFHA-xX3v6?%Cf2W{C}{##;s5b$QbR&tIc=`B<6lV`|N!8Zg!0LwkPsm zDp^?=ag%fZ^nkxVE?7G&>6FjFc9X`)7RLUnBzjcOjq@nkz_T;0uKhkR*R63Q3uM8wAco*&SO4quJ3y}O4Msm}= zrOgE4LT0VP>>mH0(MH}AE}!*?`ClHY;Ck)_@__yQsOAp5FBoaG&Bsf*kTLg&gPKaC zeYm*ddYogC3P1`ld{?jYN1=FDXyR;MZ2=SfK%?95fk3@o}DBB6pIry zBj%i+FYFBmcHZs0llB{712hgHdq3GZ6pXY(yj5>!6Ui(D^+*}-LN4oZVli*=>fj*X zmZPe}ie+kYYNae6ENWlNsRZAaYNm1nLFM`rnW1kWx^CkJi}(X^E#IY@1|lUOoinEL z5t?)#t}YFVj6Zt1NjOjIiNCrsSB9u*ZgQ!b1z8M?2UqE|cUJcw+h~rEMWr0u@*D%^ z*lP&~n#TPvo@*koWb?V^tdVNhEVpk7o)Js=_P6(O1l0O*xC>e(0?-Ao`vMEG!UGoB5{wP}1FbkmoH%eKSLNCE5$I zofQykp!O`j6q#%J>Ad5T6%*~d>F;Tn} z8ZC{t%X3{vO?CDgw|=;#;{3KcB21%xESxX}l(b)XI=_!PA<5@DT_7Fy?A4?-zH-og ztjyYfA@T)TX4adCOEZwi$4!hXDAUN}jG=~R1zN3J8!wtaQ!s!2aYH}?DZ+84I#BKk z6|j8TQvsMvAT*qXb=+6_XR$v&MI+Wy+8gn&$OU|Y_~oSA*+|ag7jeTCvN8;%?&6iM zZ^%4lcLy`mMVW@0-n|@gp0heR=P=c{?d+g$taF*A-*M-HzCj4&4&a43045cPxd}V) zM-lfaHn80U@DeVYM9T#oS8eDIK(Yc8_8heQn!>#BzgL^zIZ+f5UIPe^?B z8FB6!@bw3JlYnrbDuzS^9a*5NzI{!Tj20oWDrQwvER^d>83D0~Yo2pxr&_G;S%w7J z)p7n;O^K&@)dWVAdNi^PYP2pp?7~aAGhfj52^oyzU+cmcUjY~}3evZ0*M3G7%H-`Q zy2s^XHnVnOe5mg|TAV1;DP5k`C@YeK_Ii*L9XJ+V6SU#g_nrkCmklT8MThri3u0l8 zKiJEldXv9B6N%r+9m-PGyKa(ff4y^pu|&t1oV0e-F(uYE!J!;OQO1A%V6(HPy6qvh ziT66D`JPy%vrC<$=-|u>{k6`)Xza~Y2cjyp-|$CQ0X3KdsLQs#hc@%h6g!Y+X}8;= zX;~5Eh-!Pu$k>Gg$2NowxJr0m;X>5L2oIh{V?kDTc6FbQ#wu0E=jhL7U$*+;nUm?x zCHdJ`kB@yjawWMdGb~lDtjoez#I21blv_W*U~KE#rHYZAE#OM;M1^72ocA_S!c@?I zH+FCUR^h8RR9>=UNkNxLGZ95#nL9HXUkYD2Ipk+o+)^_z{|VblyXFrcPc!!XDYg2C zk!TT8aA+O_6~gVRE5L~CheqTNIp>BqSd+(b@OQU8UjHbP#KUO_jlc3l2C*jIQ#JV& zY^Qe##B@E)W7B%pmRaShQ_NX0!Es1=8`J7ySU@)h6oWsSH?}SPU?8Q^z+sD%FtgB2!Na%tmgAvKdN5=nd80EYnBaO5fK}P2bn?F zI7RDTaF6mZw^c}tQM!p9Vtk}_Nln2dZdxfTByh}WJOxgo13ORN{Zt+DsBjkJ6gxcQfiR@E66rNSYk63T&qmjR#cm_`Ssa||U^d@6hZ7U^UVjSa zA?v7!S@WfP(2P~olE6xUPndd;H<59NVac!{DV<-S_~8{vaENrhGuH=UE{3 z&81(puPgz!Knqe6X8SJN-~wW`+rPkuf3l5yRnd}A?VBs48#jEZF9}9}VB>_L(;u(LM&B~ZWQ}SE zcJ-S%2uO;$o|J*^TVP*TnrqFBv;+e+|5UQsy$xJiXkY?&k;b2ZJf}9o*K_WUw3r{m zOZi5*qQW(prq`vivk~SYAng}6w?KfZSCp<{7lMH^j@>b9!v>td-Um-K&vJ|{3xpF0EXG^Y; zyo!PJ-LgJzeC2pmwOgWZ!6MEuegb-SCQ2DdzQ~{AGKS>G9B3x`&`N|SrIV$17XS}h z$+2hb>z4r`mXHT%s8vGG;TDQqBsNthTCwpE{0zGrP*AqV6dh0sgH;K_GbE~M>Wj}B zji$5uo^4qaVk+NOs+%0U8d`cb(%mtjuf1ua?5Lb_hC?|RhxD^7B9Dh)SGT2KlYmAg za)eZMF*bUNTa=+YPyvR6wdI*d^-OW=y`_cZuGCg@-AjWXu^ohs9mP!2A$v04Lo`-} z#oN*;d)j@&AJm09VBmI!ptWOs3z7azPMO_*gtG3{(@W z-Z5aa-lq0gAgJ!m{TpYbi9yk~VotyMyb5TcF#v$tFUtnvKdRu5kwU@QBYTWN+^nf| z#Nt9oN#|s1ZSK1uuj&9I)p|LRsE0S^8u>IEp2%zooo!}K5=Mht0}3edR>5=}PC@7A zHrUWp(v_MIiyd(C!sm~zlpBk>C+|n%aJ>pz_+~9T3>&=`|Y)#2QQZoktK*a1l)Q<*I(ohME z9f?MR!(_G@UbK@2L7`4m%DqEMk6)z(Dg}Uc57KCDhMb<&gRYW#s6k^XPFjBsa9y0O z1YGdmfsIf6gI9dh47uU3{WDHLGY)Kt`fG6RuqT`uCZ2N9~`d(gm>Eode(p!}8$&|zy12l?9*u;N|Q#BKZsoErwirjb6 zd>91ua^V6!s=NA=!01?iCw@a!=O-?{zN%9*A<~I$`s^zl{ANVRyj9mXon5apaojUX z=5g*t?NQ#>lg}Tp#=rffM8miAuW#28Hw;A|)K>xB9de=-z;dYqS*%WanT^0@Fpy|^om^w<}gjJWfA(IY&W{Z(xg-S_^5xlaF!YrnG7WW2~20Y zW!;5B;W4s!5rUr$H;P)X;5OZbvFODD7heX5dI*Gm3}G5R0HR7VV%*&v)uUNSD^1Sg!n=l(JB5+`20|kSTJK9yCUr&F@;gd-84kzwES|isU z;TLI1g$Kr1kYA16z8mnQsk%&FQ(ix8Qy{DR1-SV8UsX0F75-))_RG($EYtJ`)6Esq z-dkUn{r(;2<;S6=UUm;2-W7MO<0~xukjN2Yz^h1gXc*zb@uWDwrS}lHSiP}#v1xd$ z`q`lRpM=h1p$#*w8psjrfnbsXh$+fkW8OfjCn#n(Za1n50D@dy(9iPu&O#r;O|G|1 ztHQYN%c!BPYv#ao(0y0y+{-akD$Sk)97+T=u5)vH9hUq2lGK6tPyVEeLb)Ppbqai@|g&%Q#_kp!s< zaY@2{#Hvs5kGzT`-6*QUA&Gf};!?%BlXHSFgG_+Wtn(Q34f;dMLD+;k&S8cd%a>CW z|6~|{fBFC}vfpjC&Cu1nYnPoZ@c9*qSX+f%Ha1Uo!#W4j9E+Z4{AeXvn=Tz3pJtc= zO>Tbv{sXgnSH*pnZH|zOHnWBHH}=U`HOLIbjb5#-O7B`!NUH>!Iq5bjb^&AxL}B8# zldz8Bm<#x>+4tALGrR2`)MuW3f7?F-m4QO7whkob z^AC8wPuJqRaBp7?X9bN*`{cK7&K$oJLbJ*g zK#HEQ5Q~5}R}(??%3Ja+23H0vi~AGsdJAEO=`4OO8<| z%%(J+tx=fi_d4t@*<_E5sk!syP7zjBTHiz6MGDZEPu1uR@$r$r zU~rA<6dM5UzwlR3Zfx=eVkgPGyYd+=2>e*yZsE474Cs+hB%|0$PuZD*1v_*0j9soD z8rdNcIq~dQB4SWU0+8ipJu>8Ut!gu=sWJ=C15@7+6zK0Ue}x+HJz{kL$=)|QZT8&; z1d6K3K=HGJQBu*>z?kGf&Go=DB-E8GZh-4uonnjKp_g8&<%~KvkG};T9-!D{+4F?+qn=C z?ETVRQiMpg@eh$Q4Xd{YFJB-e72Qt+B^Of>gtj%Wj=m%QsG9wQzT|_1!8Brc_#QStcoihcxFA(;7*Si_7y$@E2w(=N_f;0a zvVnjL7q{Vm2HOv{z7pt)uMDcdhlSYY0!*(ZhiYjIR^5#A4pUE|AkE~GsW?M$2Gu0? z2J3roS5-S-d46rSNaX43FwgXLcbpVus8CyH9#NumV^{{bmZN!Hc45wp;v3^(-2xmE zNdrRERF{2EXuBYY-f@|>^OSa01W;@|%Cv{T0rVwW`bI!7GTJz3LU0BEV)DWR_OFz2 zFx@w~*rviDYjETyUf3}walG$twNnod9{o`OJq|g06;EK?4p?zjr2!4<+>E5Vejrm} z35u-`fmXbzonY`8W@?7*JS?nPXggwHaPs;FZ-NuUA5LpSj1|~n=O!RL0TKNOA@RQB z&O1gn{OP~`#wYl8Br*U*z}t+u&RV^tgAU>O}3s9FWK)P1JE4ZqG?E>CFEyeU`>; z{_!^_2-$gegjbmZpprF@9(XtVX6y@H`tN{P_ zLI9UmVZ>mtlC9}Z5IcPcsq}50Ky>#5#okc-~4{$ z?YktgGaSz}HCfvVMySdc?{(Q0jrQa)^kX!H_%E)Md=V>OT+r|wPr40hRUsF5+;OZw+*9I}Gzo15rNF(UC|GlU; z{utYo^SY7q6v-ih_fGXYs=|`_6U5k!f6N(=? zv?)MvrR#e0dvpI!8^;mDQB*#bwKi=YD*`_VQLVXDL{ZkSwOLp0ve&{%^3H?EqZH~` zfPQs4xnu~rp}&mMalX$>tTcENZoDHtcwm2EZy*(1as^As6;QA`>dnBsBBG5=lu?Ylq-SzG5}JkI~}hKZwmn4q#vAp zPZv)9e=fS8p8#hA^_@NBsS8o7-w%U|g6i9f>}wy+z#K>pn2fyryY`0H3TsIPBBy>F zqw`v*5sO%z+-r4-UcI$-d97d9wp7LEsN4q)$!`H`dihu#lo{hd#sEb|AW|x>>TE%_ z0ZDpwUKa?kTvuQ3>?wO$P!-I{2`qR8XrQt%8>HD_aiTaY`0^nCECAJMu{aSF@(8Rw zr2t~$V;Z0}^Y>C~=L}xTbrPhA!e!Mj5i0EJq}l)!+6UPtZ3>P2sx67~^r;vGW3Kan zsgwfHalEwHvl@h~3lMFZW<2{&ORt^#kBdUH*q-L)&P@V~vuIj$wqDyBDOD6AsgEbu ztkeP#qMhT#{%jd7FvM4GIk*b4^{Cfi3Zyr@FcpYL1&{zkt0yhjHX>9e=#fExyikL7I?}^*|*ye!~G|xJZc`xY9R=Q09OGufj)8=beT9{YMLKtRY<|F44?)?I#IcG{X!kobODS&17i`n z8|KysU%3Z0^|zqYatwq8=~c;}F;ZOl9CCmcy{0GBq9Ms0TA0pc3v$KDplMa&kcQ{KlEI@Y{bE>F<;rCo#7#fU`Roa zNGyz_K*Ln3XAS7r+hgakN$^3{pbe%6r^PQM?Sw#7n!iXYgeRIM)e`c>MH&Vv!3D|s?3vijZE1@aasFUrEy z+km)%mJ}5^P{Zf69d3MPqr-I2(!ZVqR+IGZF|Sk*rw&cdT}mK%pV~u;<-#HbyPwch;(0gEWLQ8P`@q;H9-bk9CD_k!>g+>qT(oOJ_B2+1Zj>V zpqTj_L|$tiZ)saU%@2)SCH34-(3%w6=}p+dUSy zaI5+g!qKsbxx79TbT=6){my0`p(T>o6LR_nL**R?!bgc`D_Bee{dvUQSTz*=0UIvBx6RwZp(KY_ zs)l$447&O?l>^BDl~qDNyFSFedr3*@;Ci(z0Fj&Zo~c(o8pgGv!Xau~4B*u1p4qCr z{trQP$_Lqxe$3^1Vz@o`VBt&gEsh1O-D8s||JFgp(;KkYtf&S?koxXqLCM-t1|=&Q zko=^B(nOQ z9<8W{FRU;eaWrW6Tmn~gf?N;!7w1vkk~6^d8_dfpwe*2ODm`U7yABD^0%_V0CfJ^C zOjFtLk_D7#FTcFy2a~^;FGgcQu0sN*sIwu_Z8+(IfwxLG6j*>%iQc`!+RJ){DsQcg z114z69w7+4Orl*R6~$4)pK*CI8fFh?`oZ(h8tFP^93rbr&mpwe1R*MBfRyeLYb70T zhN*!JTwL|OO<#@IKlT-lheD24mEk9!7teq6Ml|{h(2vIeTj~cRwLxy*{+$kP`-ZK> zV&5aPal!GKm_soY6l5vh*Fdtz`r^e4zR|})doqCn&N@=#Q-z+537y)P0YjvCBk0Op z*?HI&+&|XPaip2O021sa@Xu2aGrk2$zoYzSoe!a+UkzW~4++*Im;kRrBjm6Lr*&~% z2ROEi;Kq#`4BEvGezd3YF9aNWgobGW(4lbQ(UIG+l7W&?dSf?&G06*MP3%e=_65D& zNaPSZeIiy!iFWMp2h`B0RC9T;uI}RMzSkP0qM~p&k?X8cojpXssgl24lLB`@34(AB zYH|-fx*0udvlj-3sLdpL*EI-Hw|Gi>=OU|5v8>+-7N(2zjB}}&N$7N?;M42@Ry@|l zO_kI(xO(sp24Dv!d>6N6LnMbM7Jp6yLcFXd0i&((hchE!A37ccc<#wW81CYIm__co zsX7v}^xslN^rJ2}EQXINaZ5X$?f{mq;b|Ir2IFuZ6sfo0$x8hubk&%i7D7{v-EsD;yxK8}vS1i{IODHCF6vCIj#cUOpq)D-XE}1@WkXDx*Z-5PSmIW|S6;CkOlw9!VpkhRxk9)hf&WXD3#6r|Q^ZEvZq5QD)zvvO`lz0WLAvGy~HagU31B{iEE3$x1Wxb5OM z;WVjZ7y=QB?8wQAm^iE3e#(Q-w3gq!v!kEMrvsB}sJKQCqjkPMYx7t;C^rAuL9tNB z4cBy)9ToGrXZ5X_I@r3{)v<`-LipQ(Qxx;(;pm%(ZyA6>2)_Q_l?<3bC2D8Wq8l^s(JBcu~#%F zomUjHVvei!rBsq@5?;MW$ZakwA`N7cmF`QOnXl1#Q(#U z#8Jb&K#L;?2g&aH_XENSuU8E{r|fzx+IPcIe>JzwZ0xe-DA6kh-5iUdt)a(lpBY@% z*)@IylE(WHPpKV}^YE45z4Oqai3r-R`hBqIzhJhKf^Y|lVz&z%)y=s&w_73kjJ5By z@2J)>&Oyh@m=cqzNKv4Yb*J3$*WB*Fsyi@@aT!Ntjg?SdJl56xZ^|R+IvyX5OamE$ z|83xNYzzerc#ORPSfw!8n|d$zjZxhvvEK zxhkui><33S{@j0lWdDA4I$hhv8m$YDpJb;mJ)!;#CWKdw09ZLQPcN)TyWe;0-gdX+|f%?E)MrX0DxB`P53nYLfcOKJ_KQY^JX(mqkku)R?#p+=IF3wGe zJY-eLsBG$44e;7ce^f1t!H?H^>xGB3r7D=tlQ5OXYpP`?Y)aGbmESRWeEZzOlICQ* z6e@mm@%N*%V?|bT6YdO6-ztyF3^pp2uHaT7|b*mds4*#HSgI!R|`I( z^nhSEDwzp`w&nlYcmFbkR*bIg=gy;*k*m~NGv05SC064BC^Lk*A9I+pR7SGU)#yS>Pv5y3Rf|h^qQD z(8+lrJzOpB?6al%XxTW`?QfS|M(^LsSk$hGEMiEg(Y&)TIA8hA_qsyQfab|8$)I;b zN2TJY{Z3wTN}9DZs+_a3%Nw*FYDt+|JnW9i$uKV2CFd$0wPXQ~X)ot^!xP*-X1^+L zHSIgInuc#c32>i$dI zGXI53upOm4_|mv>ycCb}1j&h&PdrVmD#w`nyv0RUOxj1u>x)g@ySB53pJZSu-s5jL z;X(h@Z2p7O5oNi6-ueu2*H|+T_2Mi3J84d0Sn~B|nKh4RxbRLlBu3vZs(pLHI#wz} z{&9zyPWOty{MSJpe!cqaxTno2VUOPl&lm>=KZ(i#s zlY>P3Art*i@7rIu+~}c9g(v=+8BO&i^4Gc>J?f*)D&CNN|I}`K!Cyv1G|udfI-mL3 z`;7UfZ`@f4_EehTHa|I1|gw^!X>`Yk#jz4467QnPtSe*weYs0Gd2UU1sdiw38XZ2iC?`6he; ziE?~-^OgmH^LX*%732=Q!KqrO&U3}enI>zi;H9+ncuEy9k@?{UXiPhi%VW%LQe59w9p#l&8GAr!Br1$|A8Nes4OHrz|DZ>Ouz#+v*3GNh`& ze}SMAdVW?8Z2#}Y7P^C2C2wDmU}o;%>yuIMhJSGZ?(v&X`A8q=;BPmyrbvDCntkDm ztWoD%n)>*2TD}R_pc6iCzv~H;dnz{thwWnTOx{H|S1>OXVd`t2FXK5DO)+PZm7OjH zy*t3TeeWxKwJ;D8!AqI2r}nGL5&1fNKhi||c8z+mPD6m#2NJpXUB{nEbWO&aIW;(^ zf*AkMV1q)s`t<^Ej+pFVWy3M$Qlw= ziZ~@Z^t(}cS3m`qj+YXaH!d-CU*Be1kx>)DcIHbA?Sn1moqhqKH*M$0*_ZB(wh1+S z;=C`9tNJ9SWx}S-Q)Z&E_~4Z{Ws60eJdP#Tc%*yCRsIDRw{O`NWhS}RBL&(i`tgl# zuKOL8`DnL)r2gwf|LvVdJA16B=hYkw?tG7qDzs&nOQ#$_m;J{^$2?=*SKu1#?{S}~MgcRi{&KdVN3kD&QT2ouEN8%AH)Ud}>>*7S zh}6DL60Dlh>kjC+cS9xO2S+IDB@5L5L-z7+V0~`}AYthtF*^CPg>YUPy_&Xf<#Cnb zAIuXKGFeQXo?)~6Wb8#UT-GB-!O;~hcr#{^Qv9}(kfYFc)utqQS#|yl){|L=L2RM* zC_>O&nzuGO4-xkA8^H9w@3?J(d^1KRl{+(^6gu852R(C zJ1VxoBj59^!+yLfse!T|F8itPb>{tEx#6-DrFAmj&NQwOgk=QD6u-LK-W)F z8A|V+7~SIUOT6ctNe88EdB=^TBP6xVD!GX!nkTib-v^Ct>z{7hA?Mosq{E_1)W7h_ zNSls*RT5hXJ(?ON+Py9XIcV63Jz^!QnRQ z6JqElYs$hd{ePu>1z1*F)3!WNL;Y!$Vln}H$N-flUL*?i;gRjDjIP&r%H{@Z-++EBF3>$7Pr`nl)^*h9HSRv z;u%+Ky7!76YFp2o)2NPQPMAFDfKr~~Or@f$@Z;B_t8_^3$dMeqFlpd;`zcOIxWG$^ zV^pr(owMVw;H3p;1urQv8_&2)RchRt>{?Ypq5-$^=epk(R@)!@ax3A~aSSuBQ8Aav zOF5L|I3;N$Xu4UDkw%#h(J6fus_Y1H=gYc4CulfCOW3KnSnRmjz*qF@ongZh;|i0e z9LlETO2IB)rEfQfVmIWoLpC1U$(V20H*z~=I57*|Y9()dHWTA~GTn+(H_qH??Bft$ zrAD2i5fbECf9)gaa#$SczPz$%Zf0-?BOivSD<0pu1;r~Zg!?Q0{I=t{S z*TL520R9pe^neRj@#L_>Arv~qEI$lQKV-6~bow4K z#%V6x)j9{67|0!xSSn(RO|cw5EAP^RD>+IPebFk%Vvozh8sK1zgUPuU4o!auU%885 zDPJ=Vdtjxy7q8tfd0JbLC!BrHtH}7nINMmqbfRonH=CViPohRZ4w>DJXGQu_V{$#A z;Uo#-zHc6W2t1Z6jb+=Ny7a;vZ*p~BA#Q*K>uNYLICg=}qBBV^Pd4-qyLnSsOx}!l zcFuVp;HU2J)u=$P=DGBuCfEWUO@jFYwzO_p`5JX<_pD8x2+&V)4GJvbDw-eFK2b_=IG5${oVw%G*dtii)J z&4{^i6o`1*#eDkOHAiU{GTg3i26o<0Iv6RJ&c%yoWM&oR;*xy4#BbK~hSBH!d$A|;Lm*M4R2%cwjOR!oq_Rz&W73`s zcqnBZnK0&w;=`ZpR9Ow5Hz$+zJ^K``PZFp7X|l+r*tJRZo=2nHqD?kN%6x5=`0~^1 z<}HclqGLys*GuL0cNOF)HP>k=y8y-t#EagZY+G<9XzTr-6YpZIR5E^78s?#tcoNo= zY$c&NrfNNd_(-DCGCFdf;!92!zNdGZx7cJ&PE)#%W;G7kz~$bbSNH5P*4#I;uRfkF>#Ij7 z6e4Ph@-6fm0>z&I-U3Q?mdoMJ_OBqTqI7uirD&B*yNCYLrAv+c7OhlQ;~Uh7CwfwJ zy9X7C{aH`lr6N#)V7aF*+Nz5{4(3XuoA22IX9-1t zgrwFh9huaCLn8{s_{wJ<*tXYt7ZFH|$>mpQ^5<$Fqn7?Qn@UYofTOBk?=LM)s?LPO zS7V)`-bxjzM(y#|y&vW3)<;{(>|A_W`{{IBVlNQ{bBXhK-iZG!S+4yUhkk@F{k6pg z@ciL?N$Mzp?AtWnt&T(FTC9zzvUuwU;^+zb8D+Ni+{G%R%`)l7*3sr6v)|kCvP9{c zjZzA`Brxb>_!VtfpbCDpe$wrJoMYh;+oWHw#pe1AMJ0qrJ!o;`GFpQzAb&7t0&IyhwcAdP8R#m3gB*`*>n!ny~>Vm z#b{Zy$hzI1SgCDRqi3&9R$)3vKjgz+*Zy*yh}CHY=7}OOIW)0SMSfs4>{>CcuOBJ| zi9y=I(IERObBrk8sQb|Xoo+62v(f15l(_&^vUzKUf+q&Yuk)`(Z3OUy|Ay5Ka|TN_Y{{i_m^^Jhz^FF+3XTI zM%x~*%*V{D((1Nk_naW+wJtIs9}UbnC|b#Pn3<1T5sO&o{e0eJoq^Cwevmn7s7Y%t zoi4|k_md{bh776*&BD8J4Nbn@Bj_JU>%C4EIgtSk2y2uLE>M0ag@b<52x|c{0yH0a z@-DqYyADKZ9 zsj1^r#!)4%V}QsHDTkEIoVYth_XCbFEqkX_G5Y3JoG+UTp^xPF(Usgo#2i94<;CUu zoi*g>lQ!o`y5HAAd@>5U`W*#p=Xt1F^`ftBjBH&o=QF@f5?yr7==%4)r zXr=Qlr+Y0ic(78N>-eYgaazK^P1JT!iuYZKr*_}m*ef2uamBp5D5iLLG#D32bUzsu z;i#^=m^nNWx|;l)fmsE?yo_4oZjsaNnH|4@pP4L|o5~Q%`Pw$p`C!BPY>Hm3iq>LS zIn&KR{AxcF_sKEO7Jb{!zkD~hjzE}^SYv3)>D-+bUYuBLNT%hh{OZgGpmLmeH zX)2?_6^BvwII00otLNk}sL~Sjv%j#;q-dM_q`I|To1K5NT(nB%+AgWi(N@kl+Wr_a zy3v5z_g>5Ay3*xLD}U|ch7g|lgH9RdaYm8EuyYTOGK7EO_%2~KVx#B}XsL08-Q;_^ z>JYBmLxyFCf27=+MbFF|hO z600tfqKMRLSiP9wB#qDJnqNjaOjJ1E3U_}_SY`sLX-F6bKcgvGlC8#Lv1Vrygg5{| zB{-*k0jbJvu^7%_K|}5TPXVkLGZjHJtxJ_99WL~XEIfV6D%=?nUKAHEm2jzO)r+W( znTJ!F%`IIHXswXkKWO3c#dw`*kAp6Y7g#ty!N3DBgHP%UOX;@d~6|=C~5}B_x^p&)wz48*1kR;7g)+Z#bYI1 zA686JB@^+fwC=;WX)1KCg{YxbY^nk5|ByFs-4*H4^;A)QOfSuhU2ze^S}P$X$lT3{jus%RU|z(B~!fZNsj?5vvMSY z;l*C+A`?z!eu0fhN?&?WWd%b37JfK!=i$Iaxf{b0!x3Nduemkmr+r_^amsOij8b0B ztM_fwacNidNhd6wGdEN#6j`NuVP;zXj8n2C-sw)pUgd*9=1*6q7C)v^+Qi$=);4@i zSD&xmO5&Xkw$&`rdLzl;^}%rE1FCg8CDJF^Kb0k=i?qCad9xckWBH1Rh(s8^uwBEa z;;$cQbd}O?%C#3*yFP-xG=g*dTlPVQ^z%Gt>b(GMjXxsVzd;+O%V7zYs8ppOooE57 zWND&Ip^8y}|9vM~Ojyd|sy2E!Lzs}G_*QQY| zV!qUrB!^Hfe|}M61hE;Kg>+vsLX%kpxgn)eYhpDP9i9`$c~mH6gE&=$?Zgo&2s!Yr zJDtR!_ZXcs|2Oyi!zon=BHd6&Qjn&SFThkVf`TR+;hSC5kl!qH&}19dQcxdZ^oxo* z9mH`0y!8b4XdtNtuSh=g-FXvAHy2m@2@Y^NDTWusLYiqyUaHP5Pcdl-uB4~XXnoX(yf36?M`?5KZQ_p>12zbBdO;F{ z-e&}54wZdRk^@+~j4tlBgEpaxeq*+(%^~C+eg5~eV z*;ZeUURnM+eIRLBo2YIAHjW$r0LjSeTg*B#kwfDY;R5D*fmMS=fO3evB&zwAUTp8~ z#~aD&l+$oPwJ`Q^UhlWXN=nw*7ent#EE)o$q6#L-YmhnY3K)@0Ejct=)ekkqqme3G zJu&~jnM9DCpVW;o+c-e1KyR@+utT$ox(qno?d@oZL_V7=mAZDpkD zd4nd@^1!DTAsSTfEs}t`kZvu}lp&|Ys3L7A?Ij1Z2@x&*ks9o}29Gb2Lw+SX~N+3_7K6XE9PTsOy6kv~n#xN1M}MJUZ3fo)emK_a{Uc2h&WZ#gy75 z-(Hb}$JC4QfW{d&Hl#Cl3J&q*Zr;3ZF@P8Kxc;R5-Zl1l@Inx#0Q6w$JS1WKbCwVY zQ6H`3%q0EMy`N5xAJ$zr%&u7JCK_kWa0Yh*M zX&Ecl_YY@dbZSlZaWa{;@B(SX>K8-?=LU=~Eot|{__i;_!-dTu(4JPE>@4hGjdqL? z1-szAe&f$kn_W!`Zxw~;O@c(5QJE3U7RW=7_-E!@oTq#5!M5ehRD~{SY*jwpd4sn{ z23NK2vr|eEFw=Cj8Q*`z`(o;6sxaBAKPMvgI9VUp=K_xYp^+Z#BDL{&P?V8F zDi2PrfgFCZSCd{h@|L1 ze0<^*-)&~l2*i7_m$J3Z%Yk))xGMoT_^f*#k%9+vLBsUC1gK+k=!7w-u@+kO-<$I8 zdrSuIdG^8MA4Flh`LJ!D3638GzCjg2X6@AFXiyVCWSOs*V|ROclE545thi2#!T=oJ zvnA{JFvZlEoh<>i$9iy%V|jd=|Kj+jcsI6_&SD8SM@@CKnh~%MHJ1r)^D?oaR(d@048&ki@sL$~HiR zY6FYRB&Xy!Rg*$fug`{YIf%#CtEW5NS(z+*K6tk(vT&uWEko;)fy{KGZpsZ--=ZI*{od3eY`A|)`Hgp}&Ne|o8Tn70)wIQoyd7_8VeFgWX}w0Em(95@1Q(Pcbc!!- zX-QKP0UP>ugr_`UZQ0sc{!2ff$cu0Q`XrY68bgL57HFOj@Yr~%29eeAm@k);^L*<% z7EB{pZVK*S&T%{5HRnc}DSx*_ZANI>z3oh0h+=`nU9iIedS#s_r})yG-egd>O5FRt z>2drXPJEJQNGm9tgb29FUX^%8XZNKxWS)n;Arq+S2sWKZ-fdw){9oJ^WuPcWc8)q% zjfL_KjQv@p7tz0fA+>ml(NsH2{!fO_0drWE4E$NSiH6AwbS^E(1R;p-^QkKFegDyJj@EgQIP6s!M&v z*5a!isfk}oI|AMm4vP_UfX0DJ%h=C=fHzN`Bs6cFKD!LJjrSa66V?mUbY17qf}G6= zY

I$D|Oxym(J6eGHL8juS+qLKugE!u&8f|2V~A$whD$P5m*Be--&=W($I@hTg~1 z6C?*fQCQ(ARmED4h!m|ad|N{wf}R3VG7(OB4r5ti z1L@Jt=0ey3D)}CTbh2)S%?_edS@IPoUGZA-N%0$3?|rvm?&3DNe@KffsllSF>|C`r zO-%9kxrQ(A4ZHZ8*P%&{c<{#&^MQm101BaJY+)3L@))gBvcEws$n6BdUL-w!G4w5^JGn{vv)*WfjPB8EWY2xPf5A{^v2|vRLgF>+i=AL za>FLicl_Kjrj>_DFUmnen(DIQ$!`XA#G#PLVjR^ZDKquv0IPE@1zMZ!b3p@fDm{%| z!=v_$fPLCc=YQH)Q*1|9q!o&zoCI3GpE3+34@|T-O>24pNzNtx?hTsJA(k{ztUjp7 zQjL6yv#!-!9%YoDD`hHjX=NfgM^H-uNf9Br2a|#UQ(Na89O2QIWg~b;si+84*_}%W zGFKMAm_H<9PETU3{MEv7K!;Zyz_O&}c4z?`96W0`2=&d7$dry(Pe@f6pjgeORF&4R|U=;?2sR!X537iL!rpVrpH0_PZx+gt-h!gsa zucJ-sC;^pM+AyTxvAWfZwmuCJj0(++%Ichahz9)aUkCpPA=A3E5>$AvIcB#uTLHp# zV|`CxFbKooo2hbXBPCH=GXrOSfS?De=cB&{Z{VmhYL|(RUKokj2rX(it@N^ji5*u3 zs&cIjA&3DeIW4*xH8W6x03kgjydrJ;P&}*514(pjW$X?E!i8yN63+lBWq1#cG*?oAF}QTxu^={=3qA^O3J5 zz#1G<3c|0KsbpHqFI7I%WuI_>Q_P(l1M75epeMmzWf6=gKTC_^VHd4Btt}m_z?s@v zyq7cl6^Bl!vR#W24Q-ZE<>U4^ZPkBr@uf@8*TknEpvAzh!;#X$o-5}@#Mg;SP%iP& z*0sI;(NFk81UZuwKWiE3NPpn`;Mms{Xrmckrq{Itob*6?lYCi^omiU+mVLa;H)>)X zG1Da_^-}v{c8d<3bj{NEV)GyFT`i~KT;8Ogb&LAgWG%FEjelX+ijWEJ9Bf-gz`TAY zA^pLSG^Vy>EN2d5Gv#aS1QMT|iyWMFpkwL!XgCX4%d~p^Ee_o96sQRJi7W;}H6=9J z5I$-u5GJq8rBe;=kNa@X6!=m4+)a+|cn=8urVM}MMo$3{=RaJjwQ)>E7zj=xf?>Oc zV?W@De^6%2s0yH_iE~|^4GD)~dLiHm8WJQ>Ka5ZWpb;+Y(?y;wDCJ*=4^NFdpN51{ zLtqyF=*Deo$!`@8i>8)iTZ&noRojdri;n~Ce~XzaWYQEsVei|VB+tvw46*+LgujsX zQ}&mu4ZQ40>yaX~`{di$FAY?mG4%?$O3o>FD5S%tXBs!xY-CzR#{*f86CvGQxIIbc zZ@5=K(TUHOjLAMN2bM?l4eEOF?zXXl@wgks_vAASoSfzZPWf1zSIGA!<#Sgya3f** zG@Q!LD^$0dz;}>RE*i736=`yftzHP6tWz<$J$tIDywvq`jz|tk?quh>#_KkBX13w9 z3#6&eig$1hnyax@H#2HQE^Nq)xbi_M0U~zsyHERkS%u}77dPChpE5o6KSE1r<_2w? zqnWrzU1Bdk&SNrc-OO&4Uk$g0?xK4}rb-3oP}5^|dMB@zsaN_{jSjE9*wiMdoDfc2 z3a>nfO^{Fqs1ZrL!oE@Hl{dA-& zceCPSlV?RvV}N@%wpOtNf#i6nP3)tSJZ*}MSlV?2cB{=uW3gJ(@WAW1TI+#t#FZME zWTdGJliln>Y$q1SYY(UfpR7{whN|N4p${U^_lR6TJ9`kAKEz=zkz7g}VNVF2&y!=3#DNQ2a)2^8NQ~BeyBs*BqJhtKg$q%g0!i z`)r@eba1kiw)6mzr4iD=IQ@Pk-qhak1ES358w8K=L>teIy3-G!k)gKGz; zC+c{i5LRuJx@<~hU%1BV@YNxH)XGo}(6s2+O2{GNOadfaiax+iWZm;y*od%ewU@f& z8`K^>dUS2`72ygigdHCE9UdzaR71~XumutixRpNn+GIM+Sv^O)DL`WeGc+5*q9f2!1SpsCJvV~v z(1Ob@dH&j3A>y|%XXeYv-F=;n%^ppb2oHzh&|NZ7BdLPP}kx2f& z(HRsB>49}8iw9#%FcVaDWd#=oLEv~rRrBZ!Q?GC@B*7C5Atnv zf@o?j_2ZaUCXHOR%loC-c{Rr3Mq86Jp<-fmZ4t#Y$^fmq*E5FwRu{?NCuZ5`Eq!Y@ zzwfPhI!-2^(7bD5PR}PJ$edySVbaH~3qR4I6ZP6ytwr<1X@v&0A>#7!ir4bXc|5er zX#p4yg!)raX+D5tu{Syv2TF@9B%`kknV)c3pnUf1nOy!Aw@&>B9r8(#senw0LY>$1fw2W@;Q#IM&4ol=Ftr2U7(1OG07=SBer>JK#g zri3L%jc1b-s+JZGjoC{4sPUB%X3AI8v|Y%W;fHP{(JAGzDz|Leh4EGK#S5ni;*%B2 z?lh;UX)9V*eX6=zG1}NpNAXfm_|DbvT+PFz{4YrIBqeNWV}%Y8jH?^DdFOpK8z*bH4C(cNy- zRX|wsZN#XS4d#)sbm|x(O!9X~_751Sj$mUibsJ7k?a9$tAYW6Hjx40{*sv1<2#PwG zH9o-C0^c9!jK%Ya;f(TiCYS+vdOV@Nw)zv%6|74ChehoZgS^ZL8qIH48_Iky&1BiU zvOY05xDe~An~%~1g>`NP&cc}`gv!~Xl)UuukNH*(EQI}_(As#D_-fb1baS%dESTJ* zAN$}X@pp@kMu8HhKai-J+Vk6flN|v9M65xbq0n{k z2>cfUea0&C2@+?LB4obK;EFXUPXOt7dnuiz-AI1QY*p^q)*R93@_<}!5_k9#uj`U5 z;uVfjOHhF1@C+?FoSbScEnVU^A#cF6(jT$%?mCP6W{RR0AL%e*gN{ zCvfgNI{N=ff3jN`ut0Qz*D(`eM#^r4D7+e|%*K5L?{9r+)>(wTN7e4gV{s^Z&~N=} z+V6@;g~K{;eu((>9)LBG8F*P+7&d^9FaY?ZTSFdm<(R;fJ1MW(Ulo)*IWQ4b7}x-9 z3vD=FO@tH0zy4Yb# z0{n)pcd7kE2rnpev>M&}(cXqaI07uHAlAnR79mhfDPg)WIRR+4TM*`22BD>ACMurzDX* zovM~yQ)n}s+U8$L4`|CY^PY*nGCRTEgWnOGIeaQn%?N1U^j_aNfbPL0_(6jh1`pfw z4`kM$Ga9l$)BC>pYA1-@}BWUp1jPpJNmws0{O;tUW@)UT<7HYBeKg?}g*#GnY>bjtj*a8T=IaVQ$DC;bCXjs_C zzQvN(>jpN^&B?+2Y}-Q28;b46{;U>d)ENB|$X4qJTXg&t%H7>~fYYTLTeaOfm3Dt&U7i|n=vgm^SMWhFoXDwo~Fa^syC(5W+g z#G?H1?h#qu9%+EM+i?B zDqQv~^4)?_P$md4duQeHjr@HzlGFnoE#sGz!eOpHNRy&AJ{HD6O>*_TQ58 z-`c~`_d(2&uq0QqzW`gX7|>`kHXYFaVGlq|l_K~Y#j*9XzCr1=uNVfF&@`6Qy_XRE zaC2i$i*El|ald`nN16wKK8ir+=wCTN!HTn}G>v?OMbJdK1Gu?^x$TmLxnEpGz8fuw zh`(YhL;*JzfM0yD6J0sMG2&sBt&Gx-e9nq7F#d_v@4MdKtoOUz&c8o3`t*6wyfJQ0 zd}crkgam%T*oJvIxVcvs4JALIpVwf=`q`U#xb=k{CJIEnlzQv#{1C0(0B=ap1NVh} z1&ydkcoEREOF{`h^bj#C1zv4D)p1z+tEaPe5f$74<8A#F8xsve0umrMY$v%4g`B|_ z6&>6=@=32={L=zCiL^lC+9e(`JBRliemKg8NpZ`?{A}w2>o|==AsKiTq%7jp)EylQ z6oHfM|8Oh#Xov)=0g>XUMJRM_N1JJ7CE^bM5K8}O+};EiXW--aLc}j_BIohKx%f+% z4Ahwrw9tY}G3bIKul3@jmiY7YF9uhldpCjUiYF-Gj`RaQed9c3prKXEHxDQ6 zu)it;-S2EBC%2CC-4=e^XFS-6gZidbfAA294({fE{`jm{77hERW}+jX zqd1b&A_7#hDqgVWOjv-mZ#Di`Aa+0Lly!0|GS7!6{uvLb_JS6uFS8DRmoP%i1{|6d zM%UnL3CYOf{_6aPsSV)jr1mCcY`R$n&>5@C!cD{1A9H(Fti7yfOeQUN7{b-xJyKcsHW3F|R_PxkVd}Y<&Und$W7FGl08U3k_CL4Pu4t0#nUN zexSs1jL#ds_T|zZT7B+*nkebn_EkZ{hvmKGbjjL{YqUHP3${>XPB7NJWPmUyo(C>b{m2w z|Kd%+4vt45s26z6Z}yxvLst=IOsV38G(m#TB~ICQ?%Xj7B!VGZfY#9J+;(Sr#o*zd zoZ^u}>^l#!6_*=|9`QXu&8NUj1L$M3hl)r1@TCglUn$K1@UcP-#k*0!^`{GV-lXt@ey7QFJBnR`G-bFA{ zYbZp)=3v!(k5|_R4~I0b;~%dob(72k2@Es>p&BIw6I1J|UH&650t z3W5;kzYRj<&>(=IAs>I07Sb^vgZ;o!Sm+9xFoY9NUZx?6ie3sa2Gp?athabpAvelH zojC$JF3=duXB$X$B?D>sIcR{v%}l1PLKr6_YO;>} z)vm?E-h&3s6*L$ED-J55RV}s;4s|Mr$ z?nAcT7D_}H$U)`dxao2Rd0JW^Dn0nznfA>FYE3YH-SFxU9AV4jFA$txnd9}icFS#8 z+OQD|lmnwyObbGfE%t?M0u z;Yq@6S&Vqcj-4H)qEEYDKEt0k&-I%_L_dcscmbv(7+X{JKmDSoAqrYZHeO;j zTy58vLPN;=em}Wul*Ss=#s@%o@1=o_BEsh5#k`f6{CgQmcQ3~LZGqAKo;eXfChU!K zjZ(t@{l4&~%TWivVWmQc)p{kaGMfL==znIYERzLgWuKalfvnw1nx#PxFj4!G^4J?) z*jyRQs0D4tumd;d(t%{rwIb*5(wlm`&v|B{07Z!8w*&3F1OOXh=u1KFM2_EY2g~eB zZr-fhMxu+R*TqLzunu*;PCA6ajFYO7FAa?uu`YeUKNbt(=BYod3@p>&DW)ymPwJf?d~zqiVtkQhs}T5c_6ko|ns4H0B#^SU^0z zEEUITyfGAqX{$fHQqwYOrDR1p&O22QBDaq9VwE8Pn2SyKE-dD|-QXLq3aE9(L3~qW zC=<@D1nOyo^ixB!JFIF92i%C_G#xv8b5Wff7m5lCaa9&2GxsJ(k#w~Jy;myY9qX^L zfWK^lK9Bd_kJ<;}sN8km8g<(#wNeatFJC zHQPV?d{wu%0^I}>7+vWGAD*8X-GATlH`_vy%b-fi%&yBx>Ozlw)lbz2HhHzl>jceB^b6p;o{#uzg7J6^T z}6LT$5M)I|j%_Ol*qGxrT>NAIP8<|vS-@g%Z|4rj5Y28%1 zhJAa=>1bYg$rEXk5F|!ppHGA*HJ%Ck-vS=>v0G6Ab&59# zh&n&}pN;PI!qpH?N=!R;2rDT-!0_bBnuZUh4ny_fg*K6X&rb}k2QDs`xv)A|ch4O? zE$F!i1BHo=_uC($USo;)kdbnBS_(bvN3wcfPT%6~Utx*md)yU%;;KN;k#KFLg4GvK zSv~q5Qb$7^P8r_`3T@A!On&AWzHK^ADvt9qrOcm~+3|^@1G@5v05AXYfM0lg;aGa{ zJ5VS%_t0wFEec*cNRgmMsUojA_&xb`_rbfqZjd(g!#6UpboubF&;TN#NOKA+G69ux zs|U4b+g=@ZK8Dj9I&9{7C~ce@$}YWa*MEYmwU`z6E1C7Da{)6{co zeDpp5?700c$R0*Rcq0Os@O5Zg|qUjOl(%hZi6k?aPEm%4Ck4h zUyWWnZUl*M$zrz)rL-$}kVX(TUz7assFpFRBDwPp_isDk&*%E_$-w;zDb6nZ^3|>> ziLi0VJ5R{)&RlV)xDnVQuM2r_BRs=%J{Nm@0s^JlQpTLqr^uShuvvl#%x6SWcjprAGzr+M=uT|c&GkjAW;xNfAh9TM$`Zyy8ezM2UVTr4 znRooeg`28}NV&h4Z$`hbS=jbO=$i)+eLAbzYU-dbTGlHLuyL|EV%=x23Zj)F7@vw`13IvcE?(%-7E!PQ%CUWyaiW*Iw8b?bh_M0?9tC%qvQ z4m_a_B??ujJh0#Vd_H{g4IWK)Mdr22>)$@UpzWY$i7U0@)rV01ckdI`iz$8a>mAjX zdg2eA7RTC{0cBFLWIDF730rv_=ig0D5RC(Y)R_pkh4y3F7Jx89ts+IxE;d{eJ%FDw zz@DNQbT&otvb*%QC+WakS)9@_nNggT4~F#pw0)18gAwLsbb!?M<=OR#X=KsR4DrUQ zij)WjpP1xMbFt8bf4Ym~FZ)FeUsf+b_^Q@FUKu}3(3pFzPg&~2znU|s(dVu0{Y=KF~!_4Zb>guUlCe&SqOlU}5YHx5SB)M>t=GoVxv2^d^ zsj}jy!2@NtJyG-;P)hi>bq7oDDt7RJ@uk2-%lBvQzX83!KF~B`vZNguzI?jtY>FOJ z^@vIL$4GA_mVLi|oS+iE7*2}4ecv=7X(@fSbq@vWG3&XmM-lHla#0GV@T>{HeZUC(2NjlrwS!pO<{U5KS$cUcBS2C-8Gxb)< zRH}}O69pQ&_9ZK$DRGB~^jQkkyj{tJ(MtRo5rxOM+2XFRh)%F~Fi7VK7<|x|xsilO zvg%6l;_;V~SRVv~FzrG0#4=>Oc;H1NDRY8KJI6mJwoLbQEkYyEFFCKFElFv)Xk|!C z8x8HtZy|<|m@oh#*~WZ}p4r23ZXC#|Tt}qp{LlCPkAFbF#C}A|b0NKS;fs8z{YVpK zyiBBa;AHL@Stc~8Om=c&{&(try*X|O!p=EObA-0#MQ7h!FpjXvt|sPnGB6cdE-Cgf zFl8=;fAx{y^ry=Fp;+7g@`I#;T=|h8r^_dgy?<5#DfEpu501t?3B*^X#8PHLC4n`^ z9hgsb@6GRKzC-y|Ga1<+M9)Y^jn-L`*LM#1qr4r zPu~8_PhV(^F_qrz{k)K{9{jFVlK#zxVu63Fi1@kpZq;tIkIj6Q#m@8u`5p)9?bN11 zy4SSfR&VhV=}=Ifcnr-^LEPaWXHQ4j!l z0R)T0s1o5K)?P}Dp`n17N?%D9HL2lWh(Zks?Qbji)tu!Yal@c8t-8Xsv5b?2&4FQe*k^6%DI24h7 zFjn*iiop`$8_;GG4f>PI&!f3iqQQenyx{~5<$t@o(>nh+!I}~NjivrZNPhjTP}qug z7)QEYruj8ont$A&wzZD6PEG57eyf>uqg4yivTq+OzpLn#{4!TzUO@}#6gvS4|6}MD z3kqq1GzE?YvKC4+rvX`rVGn2FZV$M3y}$Q{XzEB;R;Gg9TmG~lfOw7@+TU5F_n?y* zdeL9U`OkmwGtA?k!V$v1r}x{A+}fCw>l6ud7nA5hqgRrdP=Luj0oVQ()Han&BpkY( z3=f^Um{}Cd=yU2IO=b;C!PjjO+3tRInPK{)(2=*`$|6{?gq3L@Vk%mp2fnsKQL(FIWz>MZ!- zw2q#38V)BKYs+9Jpj-|Wn$6!&gr3EL)-lFRGK;t4G?IQ0+*_ge&a!&nfml{{cs_m$Q6XsuOOO zHoJU%q2nCwd+UD!)?eQzaZC&+9&}|Rj(vN5kogg)SG_eao(N=B-h;M9ym<@-Fd*z) z?ms?>x`GBp;J43NZph={LWZ4I;7@vB+hfDeNDddYMlC=;ML25)#Hye{~ZCsJDsV31|8Qo04FMpuJsX>)3|@Kh4fPX9nK%mmR}JU zqB|JF+f-f+IatU_o2ffNmHdvP>U-%33>C{yAeNWZd#?p z$erffBC87t(6cbx^&0w&*bnJ4k^C&6_=dPLeF;GYv@SPtGS4QS#u8d7_ak}zev}y z#}#$oJtA&|*O6muUOL~3zys=8w|1-ydX4b;MXT%35XqB9fgpbXI!VwglMd$=p7m@2#o%zT?Hv~VG!g|v>u!j|v$2#r zfbNZeq~=`5I!coPr^_sk$=?`@Y;=Vvxf?zyx9tOHiHlb>0e`}~)O%Y_QPF>wOA4T> zd$5?w*Jj1E-}#OvLs0}mYc@cH{OFn+4(Lh2du*k#`-|}RbS4`b(DOHlQ-a%;KKQMk zXX+7p@BVlK`Ug9nH1P}SQ-X|7N_r6;z`v2!(V}EddI%V2HJ()!|A;{FbSUhOmq|&? ze`Bx5u$&hsNsm)YUzJP*=L|k~=^~()pS*~6-nJqi+BBo|0?e|9w!W$7UmX|o%31&j zB&QGS==*qBv&NFjR^R+jFvQsm!QZyXNN zxr?kW@~_w2H|1IoG}I>Mq`;rX1?LR)<=r_smLWX|7S(9qFI&}+lf z;=|KED_YqGg6-G>zx)M_5>m!_dsksZ8{!?cM`V25&}q%gw%8bT>q&6pW<3EYuuhVA7PKSGtAb>+d1X|Xq%OEGtiG?~i(K*p4 zk0hB2DbgG-?N}_qx7dLD(3=;H#3NABm%WdO+2WUC>50(E6yS#F((V=h&zJh=;y8-B zbs-#$89L>T@NAz5jiA5z(FvBbP>&3>CqeJL<}wyPv|hk?g5}k)i!2lMzEe~ERX#on zGJG5p7f=TVBw(wi$3FfG4DIw&`O{9`^HG;>%fB-tKX2Jvae~{{XdGY+;@sm`cN}4Q zOqTG<-$HxWbx3H8Im?DZO#8rpN%3f(Mr$G=U2eh5KhN~P{6T`iadjfU9}3w%P-==} zR08CnkJE5*qJtB;|LqHg{*D#lI$M2$-_;R;rj40JH`w>=!QCT%<&q+2GT1UAEZhi9 z2RR+s6tcvKO$&8B-?3!7?qpi5$%6hT1%rVa$ishx7#@j(`fnX%dY>4+6KvKUMnTop zXMkq~#HgPim5bzeJIghZ3_A{4DM%E-!tNEZ?6~<|ZMx|g0#$ZeR^rZp+-Mv@Ipep~ z?0P!$HUJGCeL1jmQ*4}j>Pk({=WL5Wc;|cpr>shpi-`sW_a9eAY&*Uz>+h~y0ObI0 znRs>RM^~TexaE7l5XM6A#9syMbarBl(|}#$NAhww%?>ob;<>W6kYE0|!@QWW-~J?C z;!Vg714>cvsDEwK-JIi3`w^4u1xe*c1DDe7lR49*Elu41l4nNJrfDMu4Lel*c_(+g z@XL6P!{H9sVb*!(^9>*UFmq@tN7DL6`0_^`CW29PaO@`Ir05?0o40Iy@IwS25A;kQ zgZC#>T$fkDR)6u_%EAN*@Oac0r0v`OL!!91&S@lkaU4xbV3p2*#! zavoCZAS*hT@hs6pWV{#63kL&#EC2-e$zCbfrMKVvj{W*`S&a{@0oG>)JFbeZv3zu9ba#b{)N8*rd_#$isR`U#u?dJNP8mX|oJLkiDtXfhMsXMYt@o^Dz)24EN zi@IIYtbGopBnPfWNt3{4=b5wH?td?~We3Q42`6p1T=B$hja(Cg@{Re7{yuMJCL8jT z+haC#GR;=jal?m?5c=I{=DtH-Kn7*k+eH5UYO5*g)D;3nYo<@(yoi3stawPR#T;m??AVO&Aiy{HiByS?ypA5f>My^ zsp#xT57AzPs?Z?E3ol>>;29QZ5s*#)3TgQ%aK~C<;2Z}>MQ@;%PeaZ^u3UZUZ#+Q_ z#WWnEZ=sXN>tNc(a)U=;l8@QrCjuKw-=J$C%w@6=!NslT<8~CE-Un994%Xg)_N(M9U=fNA=nC%nprOy)|p;KfAvc)&Pl#)$m%GWi+ zx$R(!r9VL8$|o259#}6X>_z=I6=BHK&%+ycT>5(d22?i&M-4Ulk(2}$jTEV>0U&g7 zB-Za`Q-<{Rw_I@njg;A8ffUxXklgaIMcFbH{Y7}Q522M1f!qm!`>;kLlKae4A2_XM zty(^S81Qx%u!~oX>O@(T&MRMy;N>E7``-Au!0JZfYDeoUh+U5hY%VwSH!H|I_LJe~ zQqM6u3j4NReUp3Ju0)SAXF^YjYJuf7q}-tGu|BU_Y;UIQHwooRm~+ft(la2!Kplnh z7wTW{1}d$$2$v>{r}~a~ED1rgOWcxKFM$;)bbcU)V+1b*RP5OSU@7V6y}{EdDEL9%F#J+=T!!~3xyPE7@@jWhHqt_YR4gGgvPG(eC)thgkeq{J zvkVS5rEj0Pw;gHdP8`>jkp!f%0D%!1bjo-)W`oMF%#!9rm%ETT_M#gBiTVa(Ju~7^ z;{sqEifZ-0Ondvmw&SKVkE5{;625_`jR2|ywyBzhtO+7Wf#4KG%2sgt5|t~hdG0;@ z0CHjhBsYP+RP&h;6~u8P5ts%e@3=r2<0Zd1rI0#;l~NOv zN}K!Y1QDFc+F{U<&JX!+)-=o_x#u;VcF-~;$-Y?t(D4AkaPSzUeV|8+Hg?U?t1NJH@qoG0%f=s1;8 zGAl8oQLDB6pgi4%f?kzIXb|YTl?-R>u(M@;3s61E~o>i95whr z5+pQ)lVr#l=iRnL0FAIgXrARyDK< zZ;TVd3BiTd4dJbv6$GtyEaf~H1=zkOy9Ezu9DLPMXS;C~lXh:8090/redoc +``` + +Replace `` with your server’s hostname or `localhost` if running locally. + +--- + +## Troubleshooting + +- **Port Conflicts**: Ensure ports `8090` (API docs) and your database port are available. +- **Environment Variables**: Verify all required variables are set. Use `docker compose config` to inspect the interpolated configuration. +- **Docker Connectivity**: Ensure Docker Engine is running and your user has permissions to run Docker commands. +- **API Error Codes**: All status codes and error messages can be accessed via: `http://:8090/redoc` + +--- + +## License + +*** + +--- + diff --git a/docs/mlconnector/Overview.md b/docs/mlconnector/Overview.md new file mode 100644 index 0000000..2a92a85 --- /dev/null +++ b/docs/mlconnector/Overview.md @@ -0,0 +1,10 @@ +## MLConnector +This section describes the ML API (MLConnector) design. It is based on Flask REST. This is the bridge between all MYSysOps operations and ML assisted operations. It allow for flexible and decoupled way to train, deploy, and monitor all ML operations within the MYSysOps continuum. It also offers surpport for drift detectin and explainability. Below the flow diagram. + +

+ +For installation and step-by-step guide, please checkout the following sections. \ No newline at end of file diff --git a/docs/mlconnector/Step-by-step guide.md b/docs/mlconnector/Step-by-step guide.md new file mode 100644 index 0000000..d9dff6b --- /dev/null +++ b/docs/mlconnector/Step-by-step guide.md @@ -0,0 +1,807 @@ +# MLConnector step-by-step guide and example + +**Base URL:** `BASE_URL` + +--- + +# Model Endpoints +## Model Registration +Model registration is a two step process. In the initial step, we add the model metadata using json description defined below. For example, model type, hyperparameter, modeltags and other features. The second step involve adding the model artifacts; .pkl file, training data, requirements file and python script that will be used to retrain the model (See example). +### POST /model/add +**Summary:** Add new ML model metadata. + +**Request Body (`MLModelCreate`):** +```json +{ + "modelname": "RandomForest", + "modelkind": "classification", + "drift_detection": [ + { "is_true": 0, "method": 0 } + ] + // other fields (see endpoint): hyperparameter, modelperformance, trainingresource, runresource, featurelist, inference, modeltags +} +``` + +**Responses:** +- **201**: Created `MLModel` object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X POST "BASE_URL/model/add" \ + -H "Content-Type: application/json" \ + -d '{ + "modelname": "MyModel", + "modelkind": "regression", + "drift_detection": [{"is_true": 1, "method": 2}] + }' +``` + +**Example Python:** +```python +import requests + +payload = { + "modelname": "MyModel", + "modelkind": "regression", + "drift_detection": [{"is_true": 1, "method": 2}] +} +resp = requests.post("BASE_URL/model/add", json=payload) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: POST /model/add + Note right of Agent: Body: MLModelCreate JSON + MLConnector-->>Agent: 201 Created +``` + +--- + +### POST /model/{model_id}/upload +**Summary:** Upload a file for a specific model. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|----------|------|--------|----------|----------------| +| model_id | path | string | yes | ID of the model | + +**Request Body (multipart/form-data):** +- `file` (binary) +- `file_kind`: `model` | `data` | `code` + +**Responses:** +- **201**: `FileSchema` object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X POST "BASE_URL/model/1234/upload" \ + -F "file=@/path/to/model.pkl" \ + -F "file_kind=model" +``` + +**Example Python:** +```python +import requests + +files = { + "file": open("model.pkl", "rb"), + "file_kind": (None, "model") +} +resp = requests.post("BASE_URL/model/1234/upload", files=files) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: POST /model/{model_id}/upload + Note right of Agent: multipart/form-data (file, file_kind) + MLConnector-->>Agent: 201 Created +``` + +--- + +### GET /model/all +**Summary:** Get all ML models. + +**Query Parameters:** + +| Name | In | Type | Default | Required | Description | +|-------|-------|---------|---------|----------|-----------------------------| +| skip | query | integer | 0 | no | Number of items to skip | +| limit | query | integer | 100 | no | Maximum number of items | + +**Responses:** +- **200**: Array of `MLModel` objects. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X GET "BASE_URL/model/all?skip=0&limit=50" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +resp = requests.get( + "BASE_URL/model/all", + params={"skip": 0, "limit": 50} +) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /model/all?skip={skip}&limit={limit} + MLConnector-->>Agent: 200 OK +``` + +--- + +### GET /model/getkind/{modelkind} +**Summary:** Get models by kind. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|-----------|------|--------|----------|------------------------------------| +| modelkind | path | string | yes | `classification`, `regression`, or `clustering` | + +**Responses:** +- **200**: Array of `MLModel` objects. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X GET "BASE_URL/model/getkind/regression" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +kind = "regression" +resp = requests.get(f"BASE_URL/model/getkind/{kind}") +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /model/getkind/{modelkind} + MLConnector-->>Agent: 200 OK +``` + +--- + +### GET /model/search +**Summary:** Get models by tags. + +**Query Parameters:** + +| Name | In | Type | Required | Description | +|------|-------|------------------|----------|---------------------------------| +| tags | query | array of strings | no | e.g. `?tags=fast&tags=tree-based` | + +**Responses:** +- **200**: Array of `MLModel` objects. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -G "BASE_URL/model/search" \ + --data-urlencode "tags=fast" \ + --data-urlencode "tags=accuracy-focused" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +params = [("tags", "fast"), ("tags", "accuracy-focused")] +resp = requests.get("BASE_URL/model/search", params=params) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /model/search?tags=tag1&tags=tag2 + MLConnector-->>Agent: 200 OK +``` + +--- + +### PATCH /model/{model_id} +**Summary:** Update metadata of an existing model. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|----------|------|--------|----------|----------------| +| model_id | path | string | yes | ID of the model | + +> _Note: Request body schema not defined in spec; typically a partial `MLModel` object._ + +**Responses:** +- **200**: (empty response) +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X PATCH "BASE_URL/model/1234" \ + -H "Content-Type: application/json" \ + -d '{ + "modeltags": ["updated-tag"], + "drift_detection": [{"is_true": 1, "method": 1}] + }' +``` + +**Example Python:** +```python +import requests + +update = { + "modeltags": ["updated-tag"], + "drift_detection": [{"is_true": 1, "method": 1}] +} +resp = requests.patch("BASE_URL/model/1234", json=update) +print(resp.status_code) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: PATCH /model/{model_id} + Note right of Agent: Body: partial MLModel JSON + MLConnector-->>Agent: 200 OK +``` + +--- + +### DELETE /model/{model_id} +**Summary:** Delete an existing model. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|----------|------|--------|----------|----------------| +| model_id | path | string | yes | ID of the model | + +**Responses:** +- **200**: (empty response) +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X DELETE "BASE_URL/model/1234" +``` + +**Example Python:** +```python +import requests + +resp = requests.delete("BASE_URL/model/1234") +print(resp.status_code) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: DELETE /model/{model_id} + MLConnector-->>Agent: 200 OK +``` + +--- + +## Training Endpoints + +### POST /mltraining/add +**Summary:** Initiate model training. + +**Request Body (`MLTrainCreate`):** +```json +{ + "modelid": "1234", + "placement": { + "clusterID": "*", + "node": "*", + "continuum": false + } +} +``` + +**Responses:** +- **201**: `MLTrain` object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X POST "BASE_URL/mltraining/add" \ + -H "Content-Type: application/json" \ + -d '{ + "modelid": "1234", + "placement": { "clusterID": "*", "node": "*", "continuum": false } + }' +``` + +**Example Python:** +```python +import requests + +payload = { + "modelid": "1234", + "placement": {"clusterID": "*", "node": "*", "continuum": False} +} +resp = requests.post("BASE_URL/mltraining/add", json=payload) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: POST /mltraining/add + Note right of Agent: Body: MLTrainCreate JSON + MLConnector-->>Agent: 201 Created +``` + +--- + +## Deployment Endpoints + +### GET /deployment/all +**Summary:** Get all deployments. + +**Query Parameters:** + +| Name | In | Type | Default | Required | Description | +|-------|-------|---------|---------|----------|-----------------------------| +| skip | query | integer | 0 | no | Number of items to skip | +| limit | query | integer | 100 | no | Maximum number of items | + +**Responses:** +- **200**: Array of deployment objects. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X GET "BASE_URL/deployment/all?skip=0&limit=50" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +resp = requests.get( + "BASE_URL/deployment/all", + params={"skip": 0, "limit": 50} +) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /deployment/all?skip={skip}&limit={limit} + MLConnector-->>Agent: 200 OK +``` + +--- + +### POST /deployment/add +**Summary:** Create a new deployment. + +**Request Body (`MLDeploymentCreate`):** +```json +{ + "modelid": "1234", + "ownerid": "agent-1", + "placement": { "clusterID": "*", "node": "*", "continuum": true }, + "deployment_id": "dep-5678", + "inference_data": 1 +} +``` + +**Responses:** +- **201**: `MLDeploymentReturn` object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X POST "BASE_URL/deployment/add" \ + -H "Content-Type: application/json" \ + -d '{ + "modelid": "1234", + "ownerid": "agent-1", + "placement": { "clusterID": "*", "node": "*", "continuum": true }, + "deployment_id": "dep-5678", + "inference_data": 1 + }' +``` + +**Example Python:** +```python +import requests + +payload = { + "modelid": "1234", + "ownerid": "agent-1", + "placement": {"clusterID": "*", "node": "*", "continuum": True}, + "deployment_id": "dep-5678", + "inference_data": 1 +} +resp = requests.post("BASE_URL/deployment/add", json=payload) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: POST /deployment/add + Note right of Agent: Body: MLDeploymentCreate JSON + MLConnector-->>Agent: 201 Created +``` + +--- + +### POST /deployment/add/operation +**Summary:** Record an inference operation. + +**Request Body (`MLDeploymentOposCreate`):** +```json +{ + "ownerid": "agent-1", + "deploymentid": "dep-5678", + "modelid": "1234", + "data": "{...}", + "result": "{...}" +} +``` + +**Responses:** +- **201**: `MLDeploymentOposReturn` object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X POST "BASE_URL/deployment/add/operation" \ + -H "Content-Type: application/json" \ + -d '{ + "ownerid": "agent-1", + "deploymentid": "dep-5678", + "modelid": "1234", + "data": "{...}", + "result": "{...}" + }' +``` + +**Example Python:** +```python +import requests + +payload = { + "ownerid": "agent-1", + "deploymentid": "dep-5678", + "modelid": "1234", + "data": "{...}", + "result": "{...}" +} +resp = requests.post("BASE_URL/deployment/add/operation", json=payload) +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: POST /deployment/add/operation + Note right of Agent: Body: MLDeploymentOposCreate JSON + MLConnector-->>Agent: 201 Created +``` + +--- + +### GET /deployment/get/status/{deployment_id} +**Summary:** Retrieve deployment status. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|---------------|------|--------|----------|------------------------| +| deployment_id | path | string | yes | ID of the deployment | + +**Responses:** +- **200**: Status object. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X GET "BASE_URL/deployment/get/status/dep-5678" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +resp = requests.get("BASE_URL/deployment/get/status/dep-5678") +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /deployment/get/status/{deployment_id} + MLConnector-->>Agent: 200 OK +``` + +--- + +### GET /deployment/get/opos/{ownerid} +**Summary:** List operations by owner. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|---------|------|--------|----------|------------------------| +| ownerid | path | string | yes | ID of the operation's owner | + +**Responses:** +- **200**: Array of `MLDeploymentOposReturn` objects. +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X GET "BASE_URL/deployment/get/opos/agent-1" \ + -H "Accept: application/json" +``` + +**Example Python:** +```python +import requests + +resp = requests.get("BASE_URL/deployment/get/opos/agent-1") +print(resp.json()) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: GET /deployment/get/opos/{ownerid} + MLConnector-->>Agent: 200 OK +``` + +--- + +### DELETE /deployment/{deployment_id} +**Summary:** Delete a deployment. + +**Path Parameters:** + +| Name | In | Type | Required | Description | +|---------------|------|--------|----------|------------------------| +| deployment_id | path | string | yes | ID of the deployment | + +**Responses:** +- **200**: (empty response) +- **422**: `HTTPValidationError`. + +**Example cURL:** +```bash +curl -X DELETE "BASE_URL/deployment/dep-5678" +``` + +**Example Python:** +```python +import requests + +resp = requests.delete("BASE_URL/deployment/dep-5678") +print(resp.status_code) +``` + +```mermaid +sequenceDiagram + participant Agent + participant MLConnector + Agent->>MLConnector: DELETE /deployment/{deployment_id} + MLConnector-->>Agent: 200 OK +``` + + +--- + +# End-to-end example + +**Base URL:** `BASE_URL` + +## 1. Build and save model +Below, we build a simple regression model using scikit-learn and save it to local storage. + +```python +... +# Replace with your training pipleline +reg = Ridge(alpha=1.0, random_state=0) +reg.fit(X, y) +... + +# It is important that all models are saved with a .pkl extension +# Serialize with pickle to a .pkl file +output_path = "diabetes_ridge.pkl" +with open(output_path, "wb") as f: + pickle.dump(reg, f) + +``` +## 2. Register ML model with +### 2.1 Model metadata +To register the model above, first we add the model metadata and then the model artfacts. Using the model above, here is json description example (To see what each parameter means see api documentation). +```json +{ + "modelname": "Ridge", + "modelkind": "Regressor", + "hyperparameter": [ + { + "parameter": "string", + "value": 0 + } + ], + "modelperformance": [ + { + "metric": "Accuracy", + "order": 1, + "threshold": 0.89 + } + ], + "trainingresource": [ + { + "resource_name": "GPU", + "value": 16, + "deploy": "string" + } + ], + "runresource": [ + { + "resource_name": "GPU", + "value": 16, + "deploy": "string" + } + ], + "featurelist": [...], + "inference": [ + { + "type": "string", + "value": "string" + } + ], +"modeltags": [ + "regression", + "fast" + ], +"drift_detection": [ + { + "is_true": 1, + "method": 0 + } + ] +} +``` +Use the above description, we can then make a post request to register the model. + +```python +import requests +resp = requests.post("BASE_URL/model/add", json=payload) +print(resp.json()) +``` +### 2.2 Model artifacts +The above step should return a model_id that will be used in the next steps. Here, will upload the model artifacts. These include; +- Model file (pickled file saved in step one above) +- Training data. This will be used for explainability and drift detection. (Note, it has to be the exact same data used to train the model, otherwise you will get wrong results) +- Requirements file that defines the environment the model was trained in. + +Upload these one by one using the example bellow; +Note: file_kind can be `model`, `data`, `code`, and `env` +```python +import requests + +files = { + "file": open("model.pkl", "rb"), + "file_kind": (None, "model") +} +resp = requests.post("BASE_URL/model/1234/upload", files=files) +print(resp.json()) +``` +## 3. Deployment +After adding the model artifacts, the next step is to deploy the model. The ML model is deployed as standalone docker application and an endpoint is returned to which inference data can be passed. +```python +import requests + +payload = { + "modelid": "1234", + "ownerid": "agent-1", + "placement": {..}, + "deployment_id": "", + "inference_data": 1 +} +resp = requests.post("BASE_URL/deployment/add", json=payload) +print(resp.json()) +``` +`placement` can one of the following; +- Placement to a specific cluster, node and continuum +```json +{"clusterID": "UTH-Internal-testbed", "node": "mls-drone", "continuum": "Edge"} +``` +- Placement on a given cluster +```json + {"clusterID": "UTH-Internal-testbed", "node": "*", "continuum": "*"} +``` +- Placement anywhere +```json +{"clusterID": "*", "node": "*", "continuum": "*"} +``` +This returns a deployment_id used to query the status of the deployment and also the inference endpoint and explainability. + +### 3.1 Query Deployment Status + +- **List All**: `GET /deployment/all?skip={skip}&limit={limit}` +- **Get Status**: `GET /deployment/get/status/{deployment_id}` + +**Example:** +```bash +curl -X GET "BASE_URL/deployment/get/status/dep-iris-001" +``` +--- + +## 4. Inference Endpoint (including Explainability) + +### 4.1 Predict Call + +Assuming deployment created with `deployment_id = dep-iris-001`: + +```bash +curl -X POST "BASE_URL/deployment/dep-iris-001/predict" \ + -H "Content-Type: application/json" \ + -d '{ + "data": [[5.1, 3.5, 1.4, 0.2]], + "explain": true + }' +``` + +**Response:** +```json +{ + "prediction": [0], + "explanation": { + "feature_importance": [0.12, 0.08, 0.70, 0.10], + "method": "shap" + } +} +``` + +### 4.2 Explainability Details + +- When `explain=true`, response includes per-feature contributions (e.g., SHAP values). +- Interpretation: Positive values push toward the predicted class; negatives push away. + +--- diff --git a/mkdocs.yml b/mkdocs.yml index 8033d68..ceb938d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -26,6 +26,20 @@ not_in_nav: /index.md draft_docs: | performance/ +nav: + - Home: index.md + - Quickstart: quickstart.md + - Installation: installation.md + - Design: + - design/*.md + - MLConnector: + - mlconnector/Overview.md + - mlconnector/Installation.md + - mlconnector/Step-by-step guide.md + - Developer Guide: + - developer-guide/*.md + - Tutorials: + - tutorials/*.md theme: name: material diff --git a/mlconnector/.DS_Store b/mlconnector/.DS_Store deleted file mode 100644 index e30ece5afe59c71ab3707e6f390fe9ec46d729ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14340 zcmeHNdu$v>9iDIPG<)mVSr;eS-nH=&lcsg-#E(mC=h2?+OWGt&6LNOXanibXx0__i z`SyBycXn$cthN-XO^XDy2t-Q@v=XmKJPK*0stJEULHq*>p#cd*K?o=n4*>;Ksr+VV z?|eRQ(x{ZANITNJ=eN7_?Kd~``)(Oy7%J-BjCC=_WQsgjmr(KmV_}|G1>Vo&f>1{- zpctY^WtB0L9byGG!ICVuVD!QUiJG{5J;eaiS$>{1w85a7QLVTwGDy7{cgou3X$ z_z|A>^CP?ys7!u<(-wB~sGHA<+%Y8^$CPqm3fIMeFsJq~A5MAH&1Xd}%o&6^gL`MV z9txbhlU>*u&JY#3pZW;+2rNW^`}!WfcPXCFW~}UC>g5Zrj@jg$r&CjQE|sxT)be~P zmoe=^SJzocb@hv`SS&A=8|2&P`{=wjVp*9K`Rh(OnYzt1rY6*uVJllmnpq?77?`?2 zLk=d)tZq#WS;eewJLBV`Lk`G+2{kw~)7jlSFwhb1jchp95uO?7>FNkadN&?B7Lb>< zt>3(F;%H_vYaOSjqX74Zf;EbIC4HDm?tFARok`L2@jkaHb9lb!P}O6XhQ;KiH_DTL zxjgxR(x8ouDv2>OZDr%;J;sE()TY_*pz7YdQKDHV(pIK8nYAa>=5#WXE@qMiV=$B9 zgYB_`FEs#>&-eFlv)OGb=Flj)WGN_%nz)5_Yn8F`!XwrCfBetL~3 zmMjalwq4iR)3;@C`_5a>G&U_&o3B)qae^^hFb|nVess#z3rF@R?X;2A&FtYs$+XQ> z#u&*aCyi!|2Lg`O@)epkR!o_970trkYMU%Ot)Z(m<)BUvvfI-6)pYe)S&R=~t!W2% z&v4$LRCf*Dw^~z1Y?_vubO&DFt|%i%={>8qd#iQp6>T(=Oc@zf4~YBpMiebk60=ix zxsCk;iZ(`a&?HU8ZbpaOy!8f6yMy2PmZV+SlQXjPRHxnB4-ISDxP2s=g!OFXxyJ#x=`2`1c-I<8mw6sy%tL>B3AItPk%xuXd5sH8pT9n)t zZ5Q}E7zSEIrIPZE?JBm4Mc5X$m+dE+Yl^1f$_Gk7N_HQgk016t=f-v5TRalEI^q?0JY{d{_*oN)cgHa?fhW$w41ISd5UW1?P8r4A~U*NR}3Q_4-HU(%Msr90|Rk<<1m$1s5dT=Nh zlW8re^4q8A7una@Np_0;kSO{K_G|V#_Bt43G(p2kv=S-Xuo~;I9^FJuPRtt+#UO@p z3w9GZ_hKIo;2`e61d>G1qeM|o&}rO*863j{_y``vLwFdE;gk3jK8?>1WuL*9@fAV1 z3JrIb2`F;BFh|2lD;9HiCHY?;{6wI&@4JK5z4`@uYc=LMyP6%aiA|HLZL&_<2@To{ zOHSJ9DBZcszb{7m`enVg4L@3dDR9jDi{N$%0n z?VCF|*7kWE8y%aPBa(-(QU&v6l2CdE2N{lJvo>e{tk8#dh-+p+uoZ&z*+9%QK2aV$HO3uTy< zt)cVCFm0`&P_-lLN*Zgf3)RRl9i6o@Om~kGs*zzf_9>yVdt8xWHg8cv6&HF=hKUY_ zLN%^&MTXh7JrweiVRllxw+us&+)7iKC&OsVS2Tv=q0x(!VJfPaBfqSpe-UnG2gzs4 zvHM7Vd7M4LzRJGEPP6ZkXM2u(+h4I)$iMv~`zw0`^=QOWsAxtIYj8c?-i#eY+YwhO z97mdHdkBYNA`cq{l<*-^4DTh)kSm5C#mDe*Jc=hsIeZGAb1D1{e6xm}Fq*-7ElzNL1;T|g!vkH<% zoV0EtFk47KfybNR1z3Uqq5!QA5}nYsm>See2NwDWfSARwHmvJk z8bnC}MAu?!5F=>9q#~MBVUHNXq+?uKo@+5RXwpIGk+B~;valx+bZr=yR6%qtrUo&B#y Date: Fri, 4 Jul 2025 22:03:14 +0300 Subject: [PATCH 3/3] fix: Remove .DS_Store Signed-off-by: Anastassios Nanos --- .DS_Store | Bin 10244 -> 0 bytes mlconnector/drift_app/.DS_Store | Bin 6148 -> 0 bytes mlconnector/src/.DS_Store | Bin 14340 -> 0 bytes mlconnector/src/endpoints/.DS_Store | Bin 6148 -> 0 bytes mlconnector/src/utils/.DS_Store | Bin 10244 -> 0 bytes mlconnector/src/utils/api/.DS_Store | Bin 10244 -> 0 bytes mlconnector/src/utils/train/.DS_Store | Bin 10244 -> 0 bytes mlconnector/xai-server-app/.DS_Store | Bin 6148 -> 0 bytes mlconnector/xai-server-app/tmpData/.DS_Store | Bin 6148 -> 0 bytes 9 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 .DS_Store delete mode 100644 mlconnector/drift_app/.DS_Store delete mode 100644 mlconnector/src/.DS_Store delete mode 100644 mlconnector/src/endpoints/.DS_Store delete mode 100644 mlconnector/src/utils/.DS_Store delete mode 100644 mlconnector/src/utils/api/.DS_Store delete mode 100644 mlconnector/src/utils/train/.DS_Store delete mode 100644 mlconnector/xai-server-app/.DS_Store delete mode 100644 mlconnector/xai-server-app/tmpData/.DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 8663f8809a1978f21bdef94a95728ebd0f2be0e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHMU2GIp6h3EK=$$D)Qz$q<7dBKB%K}|mTCixgE#+5%&|eC=&hCuu$m~qnncad7 zu|`ca5n|$BG?5s89(<5Q4LtZ4Nqit`d@zj>6L~Sw2Yv7-Molny?%df@7xuvyLUe9( z@44sPduH~0_d9oc?*agJ6^tZ68~_+qF4Z~IT%+)DUau-rXi-Qa`9o&h8_U>khV=KY znjIM;1R?|?1R?|?1R?}(1O(_in-^9qWYk6oLZ`m%G9JoQC?|!a5h^HLNeWjCj~FQ2$sP~qr9wF=q;Lle4<8u58N(9_25+b5 z$AjsBDIudaLLfrmY6SS%y&BfR2w33HJilkgY|HbTo4-V6Kj(jTa$@+%ZB#jiTFe^+1{RrZ){5*KQ6OHjq5x1rw`jX$2}pUz;Gvkxn)tE zoEcKFH}BZ4GeR~#zorx_j6wl2|DAx#0xJu<8VqnD3!dR+?F_9LhiuwdHn|pZVAEt5 z9Qre<=TkpF1FN&wog9lNCYp&DZ2>VhZ=il_OIsN)9_K;PGFRfo6Es*MHrp$9i;FAi zQYp5tO2n6yTCJ~tKuN0$ip1`{W4`4&-hi3+NT${K9%aGKtn2K{n|ypQ>)M5!1(LdH5$u>50cBV*!O4cc;9J;M$e^!~eDgL@jmh}NL3 zWb7cfcjrxNg;`mp-72d(>+>iC@rWiRA*-I;cbM{BxUN@{Of}?wThExbFtsXeOx-OH z76p#NxLN67b(oNcvTiO%pW74WJGB&3&#`;?yYJFHfA5&-ls;9r*2C2EY}gys^XA@h z+H!6Z{lE!;APm{*1riuXqXn!pjm!3#ED~Casj# zh>tCmGGyoqvv^NRP*XWW!mC~B$h9&gwr%^48zVz5%;7mvw_suYqUAhM+B#CxbP@zC zac(A;1N#1h^Z|W?^)BZfWzLeN%am9@@!LFFo^hp2RBJes*%Y6>BCf>LS(E`ny?GU> zvx)sey{#!0Qzc3|p{`pWQ`9O-DLL?MX(AOvrG1m4sMVBQVr+sN0FAyKp!5;Q&$f z0FgC|CXV1JT9`*43jtvt4hZ`gp2Vl{X?zBs#Z&k)zJjmfYxp{zCi1>7XgE#FT|zIl z_(5e_mVI@VTp}4E5FrpD5FrpD5FtTN^ovF>F$&oW=1GMfu2?0;4La=gNWH^7ZOk4sMo9N1pDM=*pC)5H z>HS7uhSv}^;%vd+gw+dOiTSP>J5M?9GbiOQ{vijqfrI)EZ_3gh?7BUoF<=b*cLsQ7 zi`42K%^Cy7fHAOPK)w$VRWJ!ydelz`ja~tWRk~F;mb--HL;;h4rAMw%oKGeCR2Qxo z&ZpBKg}5YO>CvadX=m06on5%0IPFe|D)dJ(ASMAzkMvONkATu( K#u)fj20j3DI7;0B diff --git a/mlconnector/src/.DS_Store b/mlconnector/src/.DS_Store deleted file mode 100644 index a7721b748f03cd3059daec51e682308b4fc4935f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14340 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 diff --git a/mlconnector/src/utils/api/.DS_Store b/mlconnector/src/utils/api/.DS_Store deleted file mode 100644 index 3320dcb5b8be191799fd98459770ab31edfcc02f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHMTWl0n7(V~>HnS9&mX_P5bfsXhwy@n6%2l`RQbfyjTY3Y^?#|c_%+73gW?P`t zG(Hd`5KL5Jyu>FpsNumx14I*rNPO@Gf&|6*q7Q0}z8HD&!T-#eZD+Sr9)tkuOfu&` zm;XO={_lMMIdf(RA<&wU8VCsxLU_EX6iYF2xoA7Rr(K*~vm7O$J&BJRsko}gv3y~g zwpZaH;3424;3424;34oJAb@)|z4%#7dZ~wihk%E`Bm#7O2;fa+*p?GaT1y8e))4?@ zAy!)#=0%!88L(y8mJ>{33tqrXQ8H7oj~Kwru|8nyg>5;(Br_*qA3nf-GT0{+u%3?n z2P}00VJ5xQL%>5|Is)|UUPxjjLrgN{Jio_Ns$!VI;C0{%3X6(M_!52=zc)Ihk4DXy znK4>p>3&-3)O9tU&Bx-q6?t?(tZ36UGp1;A+A>fi8CCXlE1IN_w(1#8GA!FDYv2W5 z7!VhYjny{}lP!RKttH;L$zOrWJ`dtGD)ug7MU`~L&5RlnNmm(A49*~up_%(0iKaDG z*9NgaI(UvqB>ta)-15c+S*zZOYUa;NDH~P0Z3@x+HWxH4n>-{1A`=bKOc9+Zm@|pt z!1dfcr}Bcav4%BGb%Dmvs@o9x1;)P_iF_Q}T|9Ha*iFkAX=6MtSd{huMmCfM-zR$Zb!N>+=%+P{qF`)Pe! zTE>)B`yVV{ut!Rn5M&y!f=xJ;FR^ zl^cAI^JP#c^xy)NM1Krc-QsWK#n1VD^w}LT!`z;dwd|#5NuNip@b1UUC8&Pl>#|dGp zIbRd5W%FXeDpat-WJ+Jp7Lp~TiEJP{NH50PC^?0z?E{dxjCH3 z)o@F>dM?B@vhj1-t)hR@A1lK}P`JmA{TZ7Zc8i^=_RYR6_ceCDDW%a;RzA0)a&gV_ z`q1k2;YmU<3T9d7WV1!!9NJq1wq`t^c`U4aRb9w%`Or+!C6-Vw^Vg_$b--687GVsq z;?iYUEJpsb;-j@yRU(IB$BHXfR{6vN3@X90ZLGy2*oEdbKA%{K;lVHfnnUKoJ=5JS?ckOU1z;V=^SC{p(rJP*g=1e}D^@G86pufrP_h2Mt{ z@+kRKE+yepcS<@p(4Uu-XY38sg}lxel-p~%Y_2Z-gd47U|2NsjAl+n} z?sSvQ@yYqdnA700@8+~Sr|9C1lB4z%<>^el>&&F%GA%iMOq&pcB*+j>NRq_v_ghb6 z15QY2&FVXR>nSDp8?+a-#h;!XaCRV|GxpaPH|}f diff --git a/mlconnector/src/utils/train/.DS_Store b/mlconnector/src/utils/train/.DS_Store deleted file mode 100644 index 3320dcb5b8be191799fd98459770ab31edfcc02f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10244 zcmeHMTWl0n7(V~>HnS9&mX_P5bfsXhwy@n6%2l`RQbfyjTY3Y^?#|c_%+73gW?P`t zG(Hd`5KL5Jyu>FpsNumx14I*rNPO@Gf&|6*q7Q0}z8HD&!T-#eZD+Sr9)tkuOfu&` zm;XO={_lMMIdf(RA<&wU8VCsxLU_EX6iYF2xoA7Rr(K*~vm7O$J&BJRsko}gv3y~g zwpZaH;3424;3424;34oJAb@)|z4%#7dZ~wihk%E`Bm#7O2;fa+*p?GaT1y8e))4?@ zAy!)#=0%!88L(y8mJ>{33tqrXQ8H7oj~Kwru|8nyg>5;(Br_*qA3nf-GT0{+u%3?n z2P}00VJ5xQL%>5|Is)|UUPxjjLrgN{Jio_Ns$!VI;C0{%3X6(M_!52=zc)Ihk4DXy znK4>p>3&-3)O9tU&Bx-q6?t?(tZ36UGp1;A+A>fi8CCXlE1IN_w(1#8GA!FDYv2W5 z7!VhYjny{}lP!RKttH;L$zOrWJ`dtGD)ug7MU`~L&5RlnNmm(A49*~up_%(0iKaDG z*9NgaI(UvqB>ta)-15c+S*zZOYUa;NDH~P0Z3@x+HWxH4n>-{1A`=bKOc9+Zm@|pt z!1dfcr}Bcav4%BGb%Dmvs@o9x1;)P_iF_Q}T|9Ha*iFkAX=6MtSd{huMmCfM-zR$Zb!N>+=%+P{qF`)Pe! zTE>)B`yVV{ut!Rn5M&y!f=xJ;FR^ zl^cAI^JP#c^xy)NM1Krc-QsWK#n1VD^w}LT!`z;dwd|#5NuNip@b1UUC8&Pl>#|dGp zIbRd5W%FXeDpat-WJ+Jp7Lp~TiEJP{NH50PC^?0z?E{dxjCH3 z)o@F>dM?B@vhj1-t)hR@A1lK}P`JmA{TZ7Zc8i^=_RYR6_ceCDDW%a;RzA0)a&gV_ z`q1k2;YmU<3T9d7WV1!!9NJq1wq`t^c`U4aRb9w%`Or+!C6-Vw^Vg_$b--687GVsq z;?iYUEJpsb;-j@yRU(IB$BHXfR{6vN3@X90ZLGy2*oEdbKA%{K;lVHfnnUKoJ=5JS?ckOU1z;V=^SC{p(rJP*g=1e}D^@G86pufrP_h2Mt{ z@+kRKE+yepcS<@p(4Uu-XY38sg}lxel-p~%Y_2Z-gd47U|2NsjAl+n} z?sSvQ@yYqdnA700@8+~Sr|9C1lB4z%<>^el>&&F%GA%iMOq&pcB*+j>NRq_v_ghb6 z15QY2&FVXR>nSDp8?+a-#h;!XaCRV|GxpaPH|}f diff --git a/mlconnector/xai-server-app/.DS_Store b/mlconnector/xai-server-app/.DS_Store deleted file mode 100644 index d0a50f11db88c591f4dfb31c9d7c59c497d170f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}T>S5Z-O8-BN@c6vWel*NSZ|O7RkEeE}nSP^k$i8cegLP0gVc@&NimK8Vlb z%dN0oW0pU$Q|e{zGp zOQqtV(EZ>l8fF7$`%ERNA0@+yPKd%Ggxp?7NvN`(nkC^>=X%B=YN9r9_U7}0R;zQ; zknL`B(U9|QyV;PPqvOS*CU*7@PcH^f@hDL*hD;8;YuU0`z$++U>U#DjNvx6w@Dy1^ zG$AoS3=jjvz&bHtPXSS1r=qD=Vt^R<5d*kCNN9+z#oVCYI^cuXXY^MPQ9#GH1fsO) zTFecC2ZWncK$FVt6N8&{uuB`~TFecabjJ0}FpizMc)V~uJJ_WTXWTVNUt)k5SZ1JX zx(=TI=kUv{eB>{uP>&cO2L2fXywdmjJt)eat>4PSvsOa8hlYZ2IVvEaFI@tlgZs#? eb{fA#9pYSzxj`HS?K&NhE&`em`Va%Zz`zHpvP`T1 diff --git a/mlconnector/xai-server-app/tmpData/.DS_Store b/mlconnector/xai-server-app/tmpData/.DS_Store deleted file mode 100644 index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0