From cacbafe5979d40c70b0d940a45975323099403b3 Mon Sep 17 00:00:00 2001 From: arch3rPro Date: Mon, 13 Oct 2025 00:16:27 +0800 Subject: [PATCH] feat: add app LiteLLM --- apps/litellm/README.md | 444 +++++++++++++++++++++++++ apps/litellm/data.yml | 27 ++ apps/litellm/latest/data.yml | 11 + apps/litellm/latest/docker-compose.yml | 80 +++++ apps/litellm/latest/prometheus.yml | 7 + apps/litellm/logo.png | Bin 0 -> 42953 bytes 6 files changed, 569 insertions(+) create mode 100644 apps/litellm/README.md create mode 100644 apps/litellm/data.yml create mode 100644 apps/litellm/latest/data.yml create mode 100644 apps/litellm/latest/docker-compose.yml create mode 100644 apps/litellm/latest/prometheus.yml create mode 100644 apps/litellm/logo.png diff --git a/apps/litellm/README.md b/apps/litellm/README.md new file mode 100644 index 0000000..c785ee8 --- /dev/null +++ b/apps/litellm/README.md @@ -0,0 +1,444 @@ +

+ ๐Ÿš… LiteLLM +

+

+

+ Deploy to Render + + Deploy on Railway + +

+

Call all LLM APIs using the OpenAI format [Bedrock, Huggingface, VertexAI, TogetherAI, Azure, OpenAI, Groq etc.] +
+

+

LiteLLM Proxy Server (LLM Gateway) | Hosted Proxy (Preview) | Enterprise Tier

+

+ + PyPI Version + + + Y Combinator W23 + + + Whatsapp + + + Discord + + + Slack + +

+ +LiteLLM manages: + +- Translate inputs to provider's `completion`, `embedding`, and `image_generation` endpoints +- [Consistent output](https://docs.litellm.ai/docs/completion/output), text responses will always be available at `['choices'][0]['message']['content']` +- Retry/fallback logic across multiple deployments (e.g. Azure/OpenAI) - [Router](https://docs.litellm.ai/docs/routing) +- Set Budgets & Rate limits per project, api key, model [LiteLLM Proxy Server (LLM Gateway)](https://docs.litellm.ai/docs/simple_proxy) + +[**Jump to LiteLLM Proxy (LLM Gateway) Docs**](https://github.com/BerriAI/litellm?tab=readme-ov-file#litellm-proxy-server-llm-gateway---docs)
+[**Jump to Supported LLM Providers**](https://github.com/BerriAI/litellm?tab=readme-ov-file#supported-providers-docs) + +๐Ÿšจ **Stable Release:** Use docker images with the `-stable` tag. These have undergone 12 hour load tests, before being published. [More information about the release cycle here](https://docs.litellm.ai/docs/proxy/release_cycle) + +Support for more providers. Missing a provider or LLM Platform, raise a [feature request](https://github.com/BerriAI/litellm/issues/new?assignees=&labels=enhancement&projects=&template=feature_request.yml&title=%5BFeature%5D%3A+). + +# Usage ([**Docs**](https://docs.litellm.ai/docs/)) + +> [!IMPORTANT] +> LiteLLM v1.0.0 now requires `openai>=1.0.0`. Migration guide [here](https://docs.litellm.ai/docs/migration) +> LiteLLM v1.40.14+ now requires `pydantic>=2.0.0`. No changes required. + + + Open In Colab + + +```shell +pip install litellm +``` + +```python +from litellm import completion +import os + +## set ENV variables +os.environ["OPENAI_API_KEY"] = "your-openai-key" +os.environ["ANTHROPIC_API_KEY"] = "your-anthropic-key" + +messages = [{ "content": "Hello, how are you?","role": "user"}] + +# openai call +response = completion(model="openai/gpt-4o", messages=messages) + +# anthropic call +response = completion(model="anthropic/claude-sonnet-4-20250514", messages=messages) +print(response) +``` + +### Response (OpenAI Format) + +```json +{ + "id": "chatcmpl-1214900a-6cdd-4148-b663-b5e2f642b4de", + "created": 1751494488, + "model": "claude-sonnet-4-20250514", + "object": "chat.completion", + "system_fingerprint": null, + "choices": [ + { + "finish_reason": "stop", + "index": 0, + "message": { + "content": "Hello! I'm doing well, thank you for asking. I'm here and ready to help with whatever you'd like to discuss or work on. How are you doing today?", + "role": "assistant", + "tool_calls": null, + "function_call": null + } + } + ], + "usage": { + "completion_tokens": 39, + "prompt_tokens": 13, + "total_tokens": 52, + "completion_tokens_details": null, + "prompt_tokens_details": { + "audio_tokens": null, + "cached_tokens": 0 + }, + "cache_creation_input_tokens": 0, + "cache_read_input_tokens": 0 + } +} +``` + +Call any model supported by a provider, with `model=/`. There might be provider-specific details here, so refer to [provider docs for more information](https://docs.litellm.ai/docs/providers) + +## Async ([Docs](https://docs.litellm.ai/docs/completion/stream#async-completion)) + +```python +from litellm import acompletion +import asyncio + +async def test_get_response(): + user_message = "Hello, how are you?" + messages = [{"content": user_message, "role": "user"}] + response = await acompletion(model="openai/gpt-4o", messages=messages) + return response + +response = asyncio.run(test_get_response()) +print(response) +``` + +## Streaming ([Docs](https://docs.litellm.ai/docs/completion/stream)) + +liteLLM supports streaming the model response back, pass `stream=True` to get a streaming iterator in response. +Streaming is supported for all models (Bedrock, Huggingface, TogetherAI, Azure, OpenAI, etc.) + +```python +from litellm import completion +response = completion(model="openai/gpt-4o", messages=messages, stream=True) +for part in response: + print(part.choices[0].delta.content or "") + +# claude sonnet 4 +response = completion('anthropic/claude-sonnet-4-20250514', messages, stream=True) +for part in response: + print(part) +``` + +### Response chunk (OpenAI Format) + +```json +{ + "id": "chatcmpl-fe575c37-5004-4926-ae5e-bfbc31f356ca", + "created": 1751494808, + "model": "claude-sonnet-4-20250514", + "object": "chat.completion.chunk", + "system_fingerprint": null, + "choices": [ + { + "finish_reason": null, + "index": 0, + "delta": { + "provider_specific_fields": null, + "content": "Hello", + "role": "assistant", + "function_call": null, + "tool_calls": null, + "audio": null + }, + "logprobs": null + } + ], + "provider_specific_fields": null, + "stream_options": null, + "citations": null +} +``` + +## Logging Observability ([Docs](https://docs.litellm.ai/docs/observability/callbacks)) + +LiteLLM exposes pre defined callbacks to send data to Lunary, MLflow, Langfuse, DynamoDB, s3 Buckets, Helicone, Promptlayer, Traceloop, Athina, Slack + +```python +from litellm import completion + +## set env variables for logging tools (when using MLflow, no API key set up is required) +os.environ["LUNARY_PUBLIC_KEY"] = "your-lunary-public-key" +os.environ["HELICONE_API_KEY"] = "your-helicone-auth-key" +os.environ["LANGFUSE_PUBLIC_KEY"] = "" +os.environ["LANGFUSE_SECRET_KEY"] = "" +os.environ["ATHINA_API_KEY"] = "your-athina-api-key" + +os.environ["OPENAI_API_KEY"] = "your-openai-key" + +# set callbacks +litellm.success_callback = ["lunary", "mlflow", "langfuse", "athina", "helicone"] # log input/output to lunary, langfuse, supabase, athina, helicone etc + +#openai call +response = completion(model="openai/gpt-4o", messages=[{"role": "user", "content": "Hi ๐Ÿ‘‹ - i'm openai"}]) +``` + +# LiteLLM Proxy Server (LLM Gateway) - ([Docs](https://docs.litellm.ai/docs/simple_proxy)) + +Track spend + Load Balance across multiple projects + +[Hosted Proxy (Preview)](https://docs.litellm.ai/docs/hosted) + +The proxy provides: + +1. [Hooks for auth](https://docs.litellm.ai/docs/proxy/virtual_keys#custom-auth) +2. [Hooks for logging](https://docs.litellm.ai/docs/proxy/logging#step-1---create-your-custom-litellm-callback-class) +3. [Cost tracking](https://docs.litellm.ai/docs/proxy/virtual_keys#tracking-spend) +4. [Rate Limiting](https://docs.litellm.ai/docs/proxy/users#set-rate-limits) + +## ๐Ÿ“– Proxy Endpoints - [Swagger Docs](https://litellm-api.up.railway.app/) + + +## Quick Start Proxy - CLI + +```shell +pip install 'litellm[proxy]' +``` + +### Step 1: Start litellm proxy + +```shell +$ litellm --model huggingface/bigcode/starcoder + +#INFO: Proxy running on http://0.0.0.0:4000 +``` + +### Step 2: Make ChatCompletions Request to Proxy + + +> [!IMPORTANT] +> ๐Ÿ’ก [Use LiteLLM Proxy with Langchain (Python, JS), OpenAI SDK (Python, JS) Anthropic SDK, Mistral SDK, LlamaIndex, Instructor, Curl](https://docs.litellm.ai/docs/proxy/user_keys) + +```python +import openai # openai v1.0.0+ +client = openai.OpenAI(api_key="anything",base_url="http://0.0.0.0:4000") # set proxy to base_url +# request sent to model set on litellm proxy, `litellm --model` +response = client.chat.completions.create(model="gpt-3.5-turbo", messages = [ + { + "role": "user", + "content": "this is a test request, write a short poem" + } +]) + +print(response) +``` + +## Proxy Key Management ([Docs](https://docs.litellm.ai/docs/proxy/virtual_keys)) + +Connect the proxy with a Postgres DB to create proxy keys + +```bash +# Get the code +git clone https://github.com/BerriAI/litellm + +# Go to folder +cd litellm + +# Add the master key - you can change this after setup +echo 'LITELLM_MASTER_KEY="sk-1234"' > .env + +# Add the litellm salt key - you cannot change this after adding a model +# It is used to encrypt / decrypt your LLM API Key credentials +# We recommend - https://1password.com/password-generator/ +# password generator to get a random hash for litellm salt key +echo 'LITELLM_SALT_KEY="sk-1234"' >> .env + +source .env + +# Start +docker compose up +``` + + +UI on `/ui` on your proxy server +![ui_3](https://github.com/BerriAI/litellm/assets/29436595/47c97d5e-b9be-4839-b28c-43d7f4f10033) + +Set budgets and rate limits across multiple projects +`POST /key/generate` + +### Request + +```shell +curl 'http://0.0.0.0:4000/key/generate' \ +--header 'Authorization: Bearer sk-1234' \ +--header 'Content-Type: application/json' \ +--data-raw '{"models": ["gpt-3.5-turbo", "gpt-4", "claude-2"], "duration": "20m","metadata": {"user": "ishaan@berri.ai", "team": "core-infra"}}' +``` + +### Expected Response + +```shell +{ + "key": "sk-kdEXbIqZRwEeEiHwdg7sFA", # Bearer token + "expires": "2023-11-19T01:38:25.838000+00:00" # datetime object +} +``` + +## Supported Providers ([Docs](https://docs.litellm.ai/docs/providers)) + +| Provider | [Completion](https://docs.litellm.ai/docs/#basic-usage) | [Streaming](https://docs.litellm.ai/docs/completion/stream#streaming-responses) | [Async Completion](https://docs.litellm.ai/docs/completion/stream#async-completion) | [Async Streaming](https://docs.litellm.ai/docs/completion/stream#async-streaming) | [Async Embedding](https://docs.litellm.ai/docs/embedding/supported_embedding) | [Async Image Generation](https://docs.litellm.ai/docs/image_generation) | +|-------------------------------------------------------------------------------------|---------------------------------------------------------|---------------------------------------------------------------------------------|-------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------|-------------------------------------------------------------------------------|-------------------------------------------------------------------------| +| [openai](https://docs.litellm.ai/docs/providers/openai) | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | +| [Meta - Llama API](https://docs.litellm.ai/docs/providers/meta_llama) | โœ… | โœ… | โœ… | โœ… | | | +| [azure](https://docs.litellm.ai/docs/providers/azure) | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | +| [AI/ML API](https://docs.litellm.ai/docs/providers/aiml) | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | +| [aws - sagemaker](https://docs.litellm.ai/docs/providers/aws_sagemaker) | โœ… | โœ… | โœ… | โœ… | โœ… | | +| [aws - bedrock](https://docs.litellm.ai/docs/providers/bedrock) | โœ… | โœ… | โœ… | โœ… | โœ… | | +| [google - vertex_ai](https://docs.litellm.ai/docs/providers/vertex) | โœ… | โœ… | โœ… | โœ… | โœ… | โœ… | +| [google - palm](https://docs.litellm.ai/docs/providers/palm) | โœ… | โœ… | โœ… | โœ… | | | +| [google AI Studio - gemini](https://docs.litellm.ai/docs/providers/gemini) | โœ… | โœ… | โœ… | โœ… | | | +| [mistral ai api](https://docs.litellm.ai/docs/providers/mistral) | โœ… | โœ… | โœ… | โœ… | โœ… | | +| [cloudflare AI Workers](https://docs.litellm.ai/docs/providers/cloudflare_workers) | โœ… | โœ… | โœ… | โœ… | | | +| [CompactifAI](https://docs.litellm.ai/docs/providers/compactifai) | โœ… | โœ… | โœ… | โœ… | | | +| [cohere](https://docs.litellm.ai/docs/providers/cohere) | โœ… | โœ… | โœ… | โœ… | โœ… | | +| [anthropic](https://docs.litellm.ai/docs/providers/anthropic) | โœ… | โœ… | โœ… | โœ… | | | +| [empower](https://docs.litellm.ai/docs/providers/empower) | โœ… | โœ… | โœ… | โœ… | +| [huggingface](https://docs.litellm.ai/docs/providers/huggingface) | โœ… | โœ… | โœ… | โœ… | โœ… | | +| [replicate](https://docs.litellm.ai/docs/providers/replicate) | โœ… | โœ… | โœ… | โœ… | | | +| [together_ai](https://docs.litellm.ai/docs/providers/togetherai) | โœ… | โœ… | โœ… | โœ… | | | +| [openrouter](https://docs.litellm.ai/docs/providers/openrouter) | โœ… | โœ… | โœ… | โœ… | | | +| [ai21](https://docs.litellm.ai/docs/providers/ai21) | โœ… | โœ… | โœ… | โœ… | | | +| [baseten](https://docs.litellm.ai/docs/providers/baseten) | โœ… | โœ… | โœ… | โœ… | | | +| [vllm](https://docs.litellm.ai/docs/providers/vllm) | โœ… | โœ… | โœ… | โœ… | | | +| [nlp_cloud](https://docs.litellm.ai/docs/providers/nlp_cloud) | โœ… | โœ… | โœ… | โœ… | | | +| [aleph alpha](https://docs.litellm.ai/docs/providers/aleph_alpha) | โœ… | โœ… | โœ… | โœ… | | | +| [petals](https://docs.litellm.ai/docs/providers/petals) | โœ… | โœ… | โœ… | โœ… | | | +| [ollama](https://docs.litellm.ai/docs/providers/ollama) | โœ… | โœ… | โœ… | โœ… | โœ… | | +| [deepinfra](https://docs.litellm.ai/docs/providers/deepinfra) | โœ… | โœ… | โœ… | โœ… | | | +| [perplexity-ai](https://docs.litellm.ai/docs/providers/perplexity) | โœ… | โœ… | โœ… | โœ… | | | +| [Groq AI](https://docs.litellm.ai/docs/providers/groq) | โœ… | โœ… | โœ… | โœ… | | | +| [Deepseek](https://docs.litellm.ai/docs/providers/deepseek) | โœ… | โœ… | โœ… | โœ… | | | +| [anyscale](https://docs.litellm.ai/docs/providers/anyscale) | โœ… | โœ… | โœ… | โœ… | | | +| [IBM - watsonx.ai](https://docs.litellm.ai/docs/providers/watsonx) | โœ… | โœ… | โœ… | โœ… | โœ… | | +| [voyage ai](https://docs.litellm.ai/docs/providers/voyage) | | | | | โœ… | | +| [xinference [Xorbits Inference]](https://docs.litellm.ai/docs/providers/xinference) | | | | | โœ… | | +| [FriendliAI](https://docs.litellm.ai/docs/providers/friendliai) | โœ… | โœ… | โœ… | โœ… | | | +| [Galadriel](https://docs.litellm.ai/docs/providers/galadriel) | โœ… | โœ… | โœ… | โœ… | | | +| [GradientAI](https://docs.litellm.ai/docs/providers/gradient_ai) | โœ… | โœ… | | | | | +| [Novita AI](https://novita.ai/models/llm?utm_source=github_litellm&utm_medium=github_readme&utm_campaign=github_link) | โœ… | โœ… | โœ… | โœ… | | | +| [Featherless AI](https://docs.litellm.ai/docs/providers/featherless_ai) | โœ… | โœ… | โœ… | โœ… | | | +| [Nebius AI Studio](https://docs.litellm.ai/docs/providers/nebius) | โœ… | โœ… | โœ… | โœ… | โœ… | | +| [Heroku](https://docs.litellm.ai/docs/providers/heroku) | โœ… | โœ… | | | | | +| [OVHCloud AI Endpoints](https://docs.litellm.ai/docs/providers/ovhcloud) | โœ… | โœ… | | | | | + +[**Read the Docs**](https://docs.litellm.ai/docs/) + +## Run in Developer mode +### Services +1. Setup .env file in root +2. Run dependant services `docker-compose up db prometheus` + +### Backend +1. (In root) create virtual environment `python -m venv .venv` +2. Activate virtual environment `source .venv/bin/activate` +3. Install dependencies `pip install -e ".[all]"` +4. Start proxy backend `python litellm/proxy_cli.py` + +### Frontend +1. Navigate to `ui/litellm-dashboard` +2. Install dependencies `npm install` +3. Run `npm run dev` to start the dashboard + +# Enterprise +For companies that need better security, user management and professional support + +[Talk to founders](https://calendly.com/d/4mp-gd3-k5k/litellm-1-1-onboarding-chat) + +This covers: +- โœ… **Features under the [LiteLLM Commercial License](https://docs.litellm.ai/docs/proxy/enterprise):** +- โœ… **Feature Prioritization** +- โœ… **Custom Integrations** +- โœ… **Professional Support - Dedicated discord + slack** +- โœ… **Custom SLAs** +- โœ… **Secure access with Single Sign-On** + +# Contributing + +We welcome contributions to LiteLLM! Whether you're fixing bugs, adding features, or improving documentation, we appreciate your help. + +## Quick Start for Contributors + +This requires poetry to be installed. + +```bash +git clone https://github.com/BerriAI/litellm.git +cd litellm +make install-dev # Install development dependencies +make format # Format your code +make lint # Run all linting checks +make test-unit # Run unit tests +make format-check # Check formatting only +``` + +For detailed contributing guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md). + +## Code Quality / Linting + +LiteLLM follows the [Google Python Style Guide](https://google.github.io/styleguide/pyguide.html). + +Our automated checks include: +- **Black** for code formatting +- **Ruff** for linting and code quality +- **MyPy** for type checking +- **Circular import detection** +- **Import safety checks** + + +All these checks must pass before your PR can be merged. + + +# Support / talk with founders + +- [Schedule Demo ๐Ÿ‘‹](https://calendly.com/d/4mp-gd3-k5k/berriai-1-1-onboarding-litellm-hosted-version) +- [Community Discord ๐Ÿ’ญ](https://discord.gg/wuPM9dRgDw) +- [Community Slack ๐Ÿ’ญ](https://www.litellm.ai/support) +- Our numbers ๐Ÿ“ž +1 (770) 8783-106 / โ€ญ+1 (412) 618-6238โ€ฌ +- Our emails โœ‰๏ธ ishaan@berri.ai / krrish@berri.ai + +# Why did we build this + +- **Need for simplicity**: Our code started to get extremely complicated managing & translating calls between Azure, OpenAI and Cohere. + +# Contributors + + + + + + + + + + + + + + + diff --git a/apps/litellm/data.yml b/apps/litellm/data.yml new file mode 100644 index 0000000..73cea5e --- /dev/null +++ b/apps/litellm/data.yml @@ -0,0 +1,27 @@ +name: LiteLLM +tags: + - ๅฎž็”จๅทฅๅ…ท + - AI +title: ไฝฟ็”จ OpenAI ๆ ผๅผ่ฐƒ็”จๆ‰€ๆœ‰ LLM API + [Bedrockใ€Huggingfaceใ€VertexAIใ€TogetherAIใ€Azureใ€OpenAIใ€Groq ็ญ‰] +description: + en: Call all LLM APIs using the OpenAI format [Bedrock, Huggingface, VertexAI, + TogetherAI, Azure, OpenAI, Groq etc.] + zh: ไฝฟ็”จ OpenAI ๆ ผๅผ่ฐƒ็”จๆ‰€ๆœ‰ LLM API + [Bedrockใ€Huggingfaceใ€VertexAIใ€TogetherAIใ€Azureใ€OpenAIใ€Groq ็ญ‰] +additionalProperties: + key: litellm + name: LiteLLM + tags: + - Tool + - AI + shortDescZh: ไฝฟ็”จ OpenAI ๆ ผๅผ่ฐƒ็”จๆ‰€ๆœ‰ LLM API + [Bedrockใ€Huggingfaceใ€VertexAIใ€TogetherAIใ€Azureใ€OpenAIใ€Groq ็ญ‰] + shortDescEn: Call all LLM APIs using the OpenAI format [Bedrock, Huggingface, + VertexAI, TogetherAI, Azure, OpenAI, Groq etc.] + type: website + crossVersionUpdate: true + limit: 0 + website: https://github.com/BerriAI/litellm + github: https://github.com/BerriAI/litellm + document: https://docs.litellm.ai/docs/ diff --git a/apps/litellm/latest/data.yml b/apps/litellm/latest/data.yml new file mode 100644 index 0000000..f557798 --- /dev/null +++ b/apps/litellm/latest/data.yml @@ -0,0 +1,11 @@ +additionalProperties: + formFields: + - default: "4000" + envKey: PANEL_APP_PORT_HTTP + label: + en: Port + zh: ็ซฏๅฃ + required: true + type: number + edit: true + rule: paramPort diff --git a/apps/litellm/latest/docker-compose.yml b/apps/litellm/latest/docker-compose.yml new file mode 100644 index 0000000..0018155 --- /dev/null +++ b/apps/litellm/latest/docker-compose.yml @@ -0,0 +1,80 @@ +services: + litellm: + args: + target: runtime + image: ghcr.io/berriai/litellm:main-stable + container_name: ${CONTAINER_NAME} + ######################################### + ## Uncomment these lines to start proxy with a config.yaml file ## + # volumes: + # - ./config.yaml:/app/config.yaml + # command: + # - "--config=/app/config.yaml" + ############################################## + ports: + - ${PANEL_APP_PORT_HTTP}:4000 # Map the container port to the host, change the host port if necessary + environment: + DATABASE_URL: "postgresql://llmproxy:dbpassword9090@db:5432/litellm" + STORE_MODEL_IN_DB: "True" # allows adding models to proxy via UI + depends_on: + - db # Indicates that this service depends on the 'db' service, ensuring 'db' starts first + healthcheck: # Defines the health check configuration for the container + test: [ "CMD-SHELL", "wget --no-verbose --tries=1 http://localhost:4000/health/liveliness || exit 1" ] # Command to execute for health check + interval: 30s # Perform health check every 30 seconds + timeout: 10s # Health check command times out after 10 seconds + retries: 3 # Retry up to 3 times if health check fails + start_period: 40s # Wait 40 seconds after container start before beginning health checks + + networks: + - 1panel-network + labels: + createdBy: "Apps" + db: + image: postgres:16 + restart: always + container_name: ${CONTAINER_NAME}-db + environment: + POSTGRES_DB: litellm + POSTGRES_USER: llmproxy + POSTGRES_PASSWORD: dbpassword9090 + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data # Persists Postgres data across container restarts + healthcheck: + test: ["CMD-SHELL", "pg_isready -d litellm -U llmproxy"] + interval: 1s + timeout: 5s + retries: 10 + + networks: + - 1panel-network + labels: + createdBy: "Apps" + prometheus: + image: prom/prometheus + container_name: ${CONTAINER_NAME}-prometheus + volumes: + - prometheus_data:/prometheus + - ./prometheus.yml:/etc/prometheus/prometheus.yml + ports: + - "9090:9090" + command: + - "--config.file=/etc/prometheus/prometheus.yml" + - "--storage.tsdb.path=/prometheus" + - "--storage.tsdb.retention.time=15d" + restart: always + + networks: + - 1panel-network + labels: + createdBy: "Apps" +volumes: + prometheus_data: + driver: local + postgres_data: + name: litellm_postgres_data # Named volume for Postgres data persistence + +networks: + 1panel-network: + external: true \ No newline at end of file diff --git a/apps/litellm/latest/prometheus.yml b/apps/litellm/latest/prometheus.yml new file mode 100644 index 0000000..5cb4f90 --- /dev/null +++ b/apps/litellm/latest/prometheus.yml @@ -0,0 +1,7 @@ +global: + scrape_interval: 15s + +scrape_configs: + - job_name: 'litellm' + static_configs: + - targets: ['litellm:4000'] # Assuming Litellm exposes metrics at port 4000 diff --git a/apps/litellm/logo.png b/apps/litellm/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3f109dc8c3c8ef9bf4f8c4c8706149bfbdf43c2 GIT binary patch literal 42953 zcmV)5K*_&}P)004R> z004l5008;`004mK004C`008P>0026e000+ooVrmw00006VoOIv0RI600RN!9r;`8x z00(qQO+^Rj3Iq=*0n!&`xBvhE0dI0nQ~}STcbWhIfB;EEK~#9!?EQDRBw2RQi~iP* zh_uI_^0rO2o7PN^x6*hcMh0Y%uDC*166gvcxNt8Q9!9_iLckL|oFw3ZuFOLq2_zvQ zhepz9Mq_$>PtUaPt~S->&GBg?Vz2kdj-449Co@mxDc3zytG=u}nHjNTyS0~JOSlC$ z9E1>nXl90Q`J;~j@N4h>TH>uOQ26f0UIdV&(Uy;X`;T(*%yU}5C*qs_&fiu^15{NI zOVaJ|>}NhJsIqzGigX$c5s;+YMU0X1OkHd93p&4lzaF~pJ~d&utuGeQcDsYBQmIsE z+NR!l#~u9acm6Hb&V7_u{MO@u(g`D$mzTM{+#wX@Kfkhm4Q3*A(*a--_mytDNQZoP z3o?+K-GQ%E*t`E*Dc8z;@4x(B{`n985bZ_-)-J&O5oGfsfP^!1eEl!|64m7;{`>pi zgDmXh(2xES(b9e*Q3NDuK@bXusvBn3Xpmgl3XDwyLlOuYh^hfKf*KS7L{I}5zzAfk zEDETC1r$UTG!+xKyK!m>(y&}kn{?7W`w!R$fBWII@|Lf)r3!#*4}mLPt(8JLpZy3% zEnzp}nJ1s(Ge7q)={6hCSOSE~-cA1czy3G;%-{SO&YpT6RSSHvFiW=(_-Y}%`X+9{ zj-U!_7r6JgF7U)R?x%j@0qO@2lUQq>`T1Yu74Q3cz5lQMJ4u%I2JOYYp+abt3Q&@A zxn$AcbQ%Su1k{fO0tV9waELnOd8mvyoE3-W8BPd@fLKe(0#;2UJ>8MC`mXn+APKa) zKv$J+k|gog=4O2M%EkC-uQ@D1f{b`q!8f{P(W?2X#r3~Gm4tBon}c6K}Ui*^meF@pooA5AQ|?lZ^F9g zsa;=NOTzBu)Tkz16Lv-EHcRDJXYc-G?wx-!)u@tU7S&ujuUlXKEmYOfdVx3p-+wOG zC3UZA1zPQ!y<9JAxWz(WBlxxtogr4k^W7?c=9?DypMU??IdJHJNVqD`Jo-e?c-MDD zR-`I6tpXJ*rh*WPBqFE;>QG8;RTb2lt^lIOalDdY9JcJLh!3dT`bC5LJ{@aAOMNnpZ5 zS|_;9iP#EQH;%w@;ZzW*fh>Y18|%&Zm9KeyC&hMJ)!EhV;-Su$PR}IWHPzDcvP4$t zv;v#9PeV|aN~J=(z2*>EZ(-{+aEk&@1IOOO@`)3?^Pl{`dFadvf2s5&C+)1PZ?)t? zbV#D=OzB0Ps{wT@n^l2Gq2_qrvNc9hwOs`z6=MLSVgOV!X)=3~sxW}K;yGzABWie6 zYnMG2e-2pj6fhikHxg%;dCH$XU##M>865WwsObU_XrPK<-C@)QHU!-~z?G(LZYFzM zEBeeI{vl6&xvAgz!#~V_`3K*KF-qsfv#1?FVrB25`|HxBo3Q9FZ3wQuiLU~fnc>jg zceDBQrz!1!1$Tb%8|2(Z%RC+KH&xPlC$)=PRQGn0WKUD7^9nPVq@qfQh#C`ERby2_ zNF8e|8U8sG(45%ngwj5Gdd+h7z0G7}GtCILgA5XO?O~!Bc$Xq#`_Jxr>31``Ptxpj z=oMswlj&y!7E1BPJjTpagwmb|-bm;8UFoAwKSSC)%b)&>e}TvT@Wa?Np*Ay1k|a>C zKoo)rptD8bPJ~-rbq2R6@ECZ{Q_9v>m!En~iEli-hxhy+e^)-gF(2Idfj?1xa-}^J zl}hu1spr^FXZ*>5Xttrf!gx^2sy35ivKFL&pZ{x+QeJDAgmHFHA3QKjUyVH$f&!|E z`<(qJnuxBWc3mF-cvGK#JdU3Gw0-vBFX#{c=s)G({=L74sYSFKTj%=|_)S9Y3P#{!RRe>?(HK;Ybc{;#hr1TI1%YD6_X(mK;Xbz`x+vhkUR z9`7_Zx2!q!i2kWR^UeI+-~L;Ktqoe6n@FN)wWiu`^yTHRVkG{mS7NCS{$X2NyyMbm z`TX2_JF|o5DjD|e zqw*4jVnO6|?eHux^J4wzp31u)*a%FxwlG(2Kk>W&C3*F`zEfZQrW5+}KlY;pQABHN zOK3OX7AJj62A*A7qFk-Y(Yx;A*sES651(zxQ}6pLK_pu1#_95zaPF{*>J<`Tz|M6eNX#7>pLf`#67x~NOFSBVwdGcb5hN+k*>-Uya%wEJU z2wF-+1W*+_beo8dr%gQ;dIZ>OOWO)2r=4L(7J8@g?Qr`j7TQx_Rj))VwClc>K-DPH zw893et9Lb@ZdO|>_LD#Mf9dI`pSzZG_p*eqdIScjrLEv_>wG=bWbxVBoePR7Wo8mh z{YI1Ftn3Xy;9(dbxpy7%t`oG8jcZ#wgU?VSA+q|=Jay=EZ{^W(t zM)RpJTH>xf|L_0)PILGb3tv?T{N5*(PAB2)nJpq4`%P2@_6Ew5pe1qk6zlDx{f%{F z5!i2Rk)GDe;MOa|nPo~i5hyIYd>}(W-{O*H1Mu(um8#IrzK?;VaIK;y8auun=6tsZ zoNGRRAQ?eLkxn-V)~mJJN)QBF-L*B1O^HK?XL#g?{}gLq{0w-1nXMI2`xWaS^3|cl znpxl#uYWy%a5uc;G2?|TBTAscoj4>;6-jU4iI(3|9yulZ+Zba6hlB^R{>^0XHK3Bc z0{Tc?Yy$>W*jW@3N*;-&hrC^&1GIoGpaC>cE^6QB+7|B5kK=kwU9oM=l!s+h_qLkN z`Ow-YO?K#nfw61n&%@>wnA>{;mhk4oS2hA4c_)Y7_BMX-m;MpIeCHv4@RxqeeD?Ue zE5H&kFHjMi0(b#e)1qRehh`)8=lE@_>S6=(WY$wSfJhty)`3}I9$3uYXS44;MIEQ4 z(!$?q?pecn>=8e&{T|MCi+05!^cJuIYy#`R8qikNPWBv6@dv2pNdBYnv{71kPniq9 z+j5!!L@MTMfJEWk+Ina6UElPLozMNpr|qUq1!MYs*|Xo>dHDigN${1agON{#!z z`CiU{X@$+|VQJm=+S2m;+~P_09zbM4Y*JQLkwG=_)Ko-d$6NAL51@=YK#luM+McSpxQF{k{XZ4LAlYCLz2EI{?j-p-YaVcKnd>aTy7ZNKo8vS+^mwOn?JOYV3BJp0+3GgQ$+xB#36&f}0fWsoY%ko$LjzHH-OJo_FBQ0dBw zAXoOqr#2QI{grg%)qg@h`yYNIT5}VEG;bl#MgJ@X;i6q`!5*sJx3qSX3 za`#{Pk;pbS_aQ7RM5=1o&X(>LJWK4`^Jblcz;WPq92E+4*LkJYF#GIIkl&nn!>3gil?N&9w8yykRtL1oD%9boPx?DZo>9MLne4pxSk=ukGk%q2>FA| z;8^W_3?6vigylt$NfnFRg1-va+ayql1MFrvKbM+tcK_Ubl3ZzZzCPZx=l||6(OFp| zZpW~>MqfGq@`;Xkc~Rh?uZT5aC`-TaOWL}4j`=gEf}}pXS70wH29X#f{49>m?q=7B z4)?&wk9(9@k*DYpXo_mpiX3g3=<@G<(_guyagsLI)+}eA!I{Fx`mDSp;bnus-}~q@ z{M`K~91<(R)}>44P`qYO%^g?>mtQk~-pQYSQG@=*+QAur^ak`BAi>G9$FtWVoSoL< zs7BFgB7g6-g8YWPDzn#3fMI>iC*%uo2jK#4eoq6>;AG{lh*;GDKdk{VVn{St@lea2 zl^PW|SDTM;9Kfte?b?aAym4iH^ZEGF6Ax#7jWxLMb)<0&&wS}-&)tr2t)s-QD}2K* z{tAF;YuWzK4}Hoc1Pf6V?!_UL&*WHiCYZ)_F`&)N+PoY10Pqgr6*z5jOrMgBYiAM| z$3o{}H!}1~9sGE`c6tU!jXwaq8#n>f#APkgZFpZk;4_U|`GZ@*KIe&A0> zo!5QSzD6{E5NDbxQbC^(ZpRHj#EuJ&wYvj&GfuwUm(5ikad$$}N#xyWDd>*bVu!qn zecGwLYfaUsQAT+dJH$DN9K})RL`1f5^Y7a}fcih)D z&9+9z_po;Alu1L;Aif(L9ER?xYdj@4esXUPEWRCpcmCwR;3FUYZQkS@J^T2Ff3^L_ zzwjM;TYJg=t8e*k;&vOhKC#OoTz`1!Be1GemKODE|M5QvT4Lrd%c$AK%jgEfEHIJ5;Jh`4O%*QmF?g=kZc919u{Vm4#7GFClzJ@9JyppG!J$p~~I+*oyU)E=D^Ufno-mm*wfj>z7cv7G& zB1drEZZYm~iP_E}UK%jBA4yY8rzL69(6|5U=Mgm}(b54y51g&dsftM?tvRYI zvD-8*PqNBn=e|dt1zaT1t3)KC&x&13D6-s!zAbs4zJK&Qg9pa7@EF?-$PRxObqxLh zS<7B4I0~I-yI~tkd)0j$m{(QZ#MzG@%lhF%8+%t2l$itOIL*>>$1b>1%86hg-P3BQ z!iGrv;^%+-pTt|A`33gw|5IGL@az1mkA8~3`i?i>m{r*UURo@4SdzKQYe=*s#%jqL zj$N$G&nl8;<-82i0`Iz zr9`@!u#;Tt`{=dB%Q)_#39RA}X)F7j#qaf~^KP~8UX~x|lZaGs>vM7A+8lx|>}g*~UiH8Kz=d;C?lewbl)w5@zx&#z# z9J_q9TB%fzB@)f4suhBvl(9eYJ6d-PPNsYfPL3N$5+O1n^F12!_lG!^crQ*?oWX6Z zA==TQ_kX2UrPiOnLs>ING$p*L2z+y8;3My5;kh=SJbHx1nVDKD=C+QhRskYgER35^&N!BJ z_R5uI;0-tvk#FEyIAa9#9SN#9q&=@=okbpfOsB??+=$LaB;Ja_6pefDJYgKxgw zn7|h{zBzCM%}Du-r`eb{ovHX#*UWvWQbA1~?>6 za@Y9lr-7n<+hpw@!LjihBd#COkcbjFO{wW*N-qsdVOXEwL4 z5P|attmPfQ_Bq1JJsf)L8>_YX`Pk8r4kDgBOnG>h}|gBf|y!VuC#*Ld%OGJ|0h{}>?j$*5?)n~hOKKTOMywG;%c+&h{{3@%UUSdpi+}k0N$auyfs>{HF74i6HYMCB1QvrOATSHd zZ=-%_p33p#C5s%pQd*j81{KHSW+JbE2!V)3IqEwc7c&H&!$l6ghQ18C+mxn7KjeKl zs(v?45tdg@P2;3c^dX)^<{K4Fl;0j^$oHmjP4U?~J%=&ZUQZC*TJFKkb$~mF^HE5{ z-p939yzVIOu)l(%^gFbZA}E62m#QGr3d*J(mcm-vsLvkQ-?;L*v#GYbfofMv_n#oW zc;<%8-VH!t0Yo&K<&A&o$8_!a3&El9`<_w~m5+cdw}P4$_E&b+4fF6D(z?hJ@HU*X z>S`SZ@-T~|ws+x6;5KK-k|2x&W`F4uP&Zwv*F%JQne{MStV_CwTO_xiB3y!XgzX=$ky z)KcxK@v}7%3M%Gp>*HmY5LgtEcj1&2#fX{RLJ6lSy${E7c?W^3X?vLM*ABU+h^+ZK zNM-sZRq}|LN8%{ECty3m7wafRxwgl>^1%}~8Uh@mEoRRz`aDmH#Q8Pw9NGfTm-;+T zfi_}{1wtZ&kL(0h?F5y|o7ZUcRrh%B&Ofi%t7{AunL zDt7>fahuo6U{^Cw15We|#^w6)cqH+E=Miz-SgzOlok>*)39OPD?H z1>iZHM%f>Dc^RwN_im$2HB5>XXE_9Taw~NSvh_th#Fdw`=E!1)T(XYTE(zQm6{0{KcH7~2y7-UsF zywo((9#M~Q@D1N*|+O042!t+>(GyQnpQ3**Jc$bI;}9^@G(w7 zZv?G^Mi}XepxOv)VH#E{?^@8U?(hEpl9ltHypGE-x%=95o9giWaON~|t0`~!Z;zKc zL3B`5y$QxggJen9$8v>vh0bx{?ex8#^4STe0WVV>1zwLc6Z!9_nTuhX==|pKRLTd& z&)`ma&ms>S_{%Y{!6UL~t!vpheXS&q)K?3B@8mV}dvGSc^0 zc%^7|AdGd_%Yq_owhz6rn7PWaI}RTBPk$KkQRSQe+aF%H$={tX^iGz2A zXKA%ObKuj}xdl{Jkkq&^F0sU!pJXt)&A!I)Xg0C)pj~&h7N0r^SllMN1IIQSwwJKo zX~Bz1lVa%>pZdj9+8vz*cC`jCP4IJ)A9ER}#rNTaSEJDx7B{_sJJe@z`J_9zeVq)s zR!6ky58N&eiQftQ5pZTF+9f`*gi3ayu~v}J>^ZS4(0$M4&z|3N>dVPHPAVV0GuKX0 zBB zUxh>7JZm*cTX}AwxFJfo(|Qhvz@wB>x1bLZjuV>0vAw=#@@}AL!isTg{aT#wdfuIO zn6E$){54**+ylIYz6NsHz0uyY|A}WJfOr1dmkV7VI;Kg!1ExpdVW(K{ z{zxB^i(Akc`c!-x z$AcoW`+KYOvqpNmaWBoo6zzYtf=}sN$LR}p!&VnhVT{8*%TAM4WTyv*>0jY{ zU}J^!;6B;^-G8y1n$mtz@hS1gA+K-EYcV~%8prMqo1C54U2>Cn8&2l+r+mJRX$<~( z#4Y2fZoUq1p51v_)th<=K$*VQdN<_(iyV@7(5T=7Q1VFZulFztiM@E`m0|bd4g^me zc0yv`AOGB_E9Iq)aB=2Ki-+Zh|J`H7Yln1E^B;=s_h3|gnNfqyKHoWbRXoG~eSccM z^9TP!xMj-+H-hC*)EHyUFs)(!J%8ePig`DVV#4-3$2);o|IF9gcCgb3G1>hx%fLIInRyTvi zJ@0wG8NKV&8u$N?7m!pj11giAF+)I^AHL-Wo;!?UjOtj193ieujWHmGAf$BctjxUY zZQ)ua*lVyef*qC@xY&Nt2AbmB8Q+@w%!oF|Enb&HgDx2}{csnK8!NKY#cPY;okqM^_hy_)bEiJ#I6ci2Kq-cFrV+`$ zpLpHjVDASH;&fNqvo&WX)y%w#Z1np!Qi~oAd2oJEn!7F2mkDlA;^gPl!jXMa`N8k4 zJk{>(jcgJ~znyW&n}3GaIKKrazjO;7p9Flhg=6$n#|}f>Y1#~Mo5|N98a9?&aBabR zb(L{8-3I++?US;w#lHg_6;6N`8SS;T4JkzgRrS?8W^j4dHW}1%Go(EQ)Tnzy+7<|( zTBlficHMx6s`gNVt*XMO$m{g58} zhVKeDYI_d@6*HQ5A9|9A7{54g#PQ}{OFW62XHkwmjFVTqS596lI1K^|{XhfHF5iM1 z2i~#5*L?O4AXlT+59up1HyAJ4d2rOQZ$&XU0wcg#wzJaP5ZZWTcE5xI0jeC@e4%;# z&fC({U;Kh#j6tm+=~#JpSRbeGg*G4^T*?fE*?GP1CqJg|J06P8EG%Cx@7ZJe>NFkR z!1fM^7>kot^Kx%K73nz0%Oi(y)dkCJS9a|dc`MvP-kS+RKiPl}XDkMNOampHKfq@8 zDkf*hzx%%hP!aJQo#0GWTeuL!VSVoXZA9~a6IokC_s-bl$^ZF3+p90WXql_4#4V;V z2<2Ie3Bds3GK;9#WAA()Ctvw}#LLT-lITGPfH?4?oBfw~+Ux1bHO(8e;$bZonts-^2y-7j6779Eq)nc+*mZvk{-e zA@WGQk?A9EZ%-RlsV2?Rxwf=hdrov`+0f3#3yNSSrCmh@(g^LdKluE(F(3-Dsw#i- zlP`u(tp-OGS(4GL^RVZ6_O>b#ycefn$S3$7)y^=O!v!VGWS@tr?j~96eALkOaQC|f zyMsKN>MIfY3@KLwYq-Sko{A2m?0H>I535vr5pd7pe5PBuHU?aL1L?U~<;|Ez5f$Oe zvC7uz-+9-G#E1bxlPQ_foHyt=%h0yaufk0!PD9p{$punn{w_U@3k6jU!A$ghPD0rjS)t2t!naAu+T z?DIGugM1&nUw?|z*}Q^50yWIavdx?-E@|z2yWN@D`wf4|Xys1aH9md^3ga8fB@`>0 z4^cdM1ol}}EXyBwKf3oo`NBqbUVBAOh7NiZTaw~Jwq8kJvp5Os?0@r__fOztn%x98 zc<|K&tMr4@Z^26!Li&y$R};_fU2Jd1DJqBUq5PiBQ(>>rQXCOFl)JacX~G~9dyTe& zmRH-dSi0>*<-ni)ejrvz6;!fxQ~75P-P^;Q`SYFjJh?j=OdzQ0;=lQA*>mR|^NK85 zDMi~4Ai)V$l?G;a1&!ULq0}#xAx*&aO1$2 zip^`NcLUz`tPEn9*zWu3Cp#Nd=0}jNkwYx+xPb27*`F^Kik<^kzucl!itThViFC*JI-!y z#arF9y3m$ZoS;DjakDspZR6P?^i5!I3|pH*5E(YMZ0Y{DOZm{@xQ@JalK z^NN5FXEQ#)&qA4o+Y<+dTQGD^ZewWTnBz1u&0kd<&wQgi*x*`4c~>kKXxS zF|+eaDY6ttl>o%{s()^uE9buA>hF41<1h|^^PW~axy9uv^ilc_<596#O!xAQLn+H{^X_|@=Nkyrq zL3RFB-~PYD<_du7-udw|^w{ooZil!=?a(V_&j;UAPWB%?*fjH1RjjYlreef-SdQ$Z z#Ub9?a7dJ&@Z#UYCf4AP|MtS9O~c~&Fg5S4d5d+vhVT-Qf%D*#(_KxzEnhx%jmiA+ z^VB}T?X?Ryh1OUc)2zOMYU&cSk2FGhI9X2ha(i-5q)VcxqGwSl4jRzMypP z>t|w9nK1%JCPo0SWxf-af4QFoZ)fn&*hfFB!fu>3yoS+hD_>H(?G{`Y@bTNzuC>43 z=ON#deI9L$%}iSK5jmzW?o~$LTTE+%fM_=eY8*R0ySi~9;QVo@-aod(BN6z=KmIAS z@fr5L>uY)CKl~9k&D`Qfuw+D4O|DpzJ3vOZpW*@y?qNGiGm3)dS?myp{Pi&tDI;Ef zd>(mk*>|rKsA^9cH37SOUAvO|+avKLBGa(FQNa<8i1CHSVS7}Q;^NW|umb{%X0PnN zwNk~b2hrT#2kwjZzxQ3TQ(?4`gWG%fF#qfmpJVaPyCmu~>%eUGQ0<=>J5HugqP~Z| z*(mQIK59~Y>dgH(cQ-#tlRP&M-naRd#`!uz9!WhiUyIjny27A{<;$>6b3Y7*4eqC} zINj;`ytB~~&RpsP9L7N|fFBi+nIms~Yn31p+GF)#WBBuGofn>bN|IN+*+li3{moKs zMqMnUBKaPTJYG{^kBGd9zU$c}hH*bxHC%B1EQ6&i{XIKTRDS~dQXIG7IzgVoj-tF* zsic~!I}9R}!4Z#qUhz@)6~Sj@xq|cdGGp!?<|`dBSbsPN1)LUN$}3O=L5E$Vv%;3c5U%Ii4t?;eS#QAqjEKDE#K4r4F+EO;W+ z#36A(|1u7NkwC3U_Z@7u9{)t#dH#u!2t52mNfSsCG4;8Sxjl<((OhH;Pu&44dg??nwE#$ocFph=J!z3*7RkG1VN(lX0Rnxf57Fpw?ID#;if@i+| zrjUZ?9{L6O#zBwuSA@0FY$e!xq~1RBLP%o^4&FBOrfrDz;~)PNY^+i`a8M4t{*3{` zyr7buF!{la0*g}`9j0&hofQ1FM{&xhX&g5E{eH1tW^(T^9bEp`!GG84Z0fhN`}THH zVi{vF#t;O-z-u_`YLmBd&#UbEfcFtSf!;!52-go~vlgYxq zuPV;Ta_-P;Umfmw(_3ZS#oOS6fBkPsb!jQM_uXGt6(gn0TXGWi!w+}?r#+rl{`7TU z4;L0-67X7U@2v4MLSFC)&FY>yDrh*WW-bf)J7-;@%BHfW;Ug3_>Ib=$JC? zZkN-xN*G22s_wZxcipKeaxoo_&`-|4#bm^x=%IBO=bX`IG+qqI!Wk9z_^__3S$lpk zLm68y3!5-pnhnbfTdb`QwI>ZA@c;Jci+s7U#b=%?>G5}bSI|utXNK5#2cOiRRF8xu z91EOh8Ae7tHAcmH-VhKKpK~~y$9_*#1YegX@S)$iYf-S) z_NlXs^Q_qcfqT#K2PTg z+a5H4!1G6r(An4^xbv`-Puy4ENRp_(WhR=z6sLU3BjF?yOo{AV9MqyOpt!vh!f5%_Czh&cmN0wgu_FyHd z&LpXo2pRj7LMOpd-#I2nLVvo=G8pGOjm9uyFq7n{`=|Z>I>MlQ=l`}@y}1-{2~{%0 zvW_B(mybh77)&NF4%!FCKi56Sy(c0hX-s02aw%f3NhycIezh#r0^VRE=Ib>Mg(Gz$#d^*i5!ntL|@Ay4IBd=-7}{gmtrrQqm!^ zDUnUF;zU(b5GAI7yfK+3HyV88pZ+0-ADELjyz#x2l{l>jpqPm_c8YVHI6mQ^im*Q$I{(?;KyotkBp|?nNU4_s-eNb|J3qr+Gs;YLgPFKNveBWGwj6~_ zVyv~aB*0pWl2R&{3DT4>#|Z?pWsC`^l&gq9U=))x2Z;%|)3sq+dRC8v1T=E|M?O&!II5B)A}leZa{feHsd(MNzFr>nruk zXJ2TMZVmJ`L*O#6d)*11|J+A-`Vq|1z4y&n0;7{_{VeWOJCeP3C%rMdcMr~dOCktndFs%eojzV6)5VAZ|XB8}4<>L1pT{pl;0{0c7v74A=FFS^!OsU9lC-*GT|Qf+U3+*LJ7I|%x95KldY`=D6D2@U}`KPP^|_ow`dR`#t>9iokIp8&n~{=wWXz}K9{aM zYI}!E2=K-ad=p#i8}jU#izdDMzDi5A;tYK*f&2uW14l)d+)C}}b&~&W3Fr9X{iS!B zko@HP%7I05!OH-oXZ{ftNZlSX8LB15TN^AYLV$4_zBdWkzk>C_Cj(azM3ulg7Pw+l z0%Iu09croJ;gc6xIe!+@jX@Qg$=FtW%So?QYb_E+SXFFh{|#^&@P%5PH@@Kwy!n9> zEG;gQ#0hE@dP=tpH;l)TTqr6a9l>H~*yVz*bYefAosf4Nf_sJ5PPwIhXY!PI5l4xy z(3i1y;{H+`8+`zW!2Z55po)k#qf({x`ZrYg$bacjs-$!sVGRMk<{fWmV|A4?kDb-^ zs62xh5u;XZR^(h6rv~&%w!MCPCu*3tl1T18b{@{(7>ATe z=n*)@h#|;WQ-=rHxhg`MvE7n6d88Rljx$7CGAU6g?2QvDQN(dcu-z`*$}zUe5gWFJ zwYJ9_rs_1`&e-Frz3bz4R8WG|1}8uEB%O`t`MS5gg@ySAY{p25^xLr6Nn>*NDiCRe zs{wEoljs{9E`Is_W=33F#))n_DYX3ad^y|z$3|aa5V?5_mO)T)%@h%}DTc1)|)AdCX$_wOa_bOy~?*|cch$s|8jGI-^D7_ham z#^;}Y9y5E2_q}N=7RLrJv2)C&@0pi7=IQ6jnv{zAN%!33ut5KpJ_2WFcF+E6Oy5xhCCbb$);L7! zN{;U{LYVEBcItF6^-w8?h7+d4d{wwRZ4wzn)aVee#jLbjY&Dv!CMijpl7<140@A1o zK$v-k1>`-uirzy0Zv}BOa5aUQ`V5Wc5}$mw$+5+!x#zAs2%{3#J2rcvID50UPjsx> zOi{Pn^i}!NI1qplHIe6GewOMH~V@InX5hL4)gyUHOb!Ww7<~XNf0Yw&~!8kd9M!w=YtEb0yHDR zk;y!gjI;M5~XdTFl4z@Vx}DO*0jw`S%@~S&|T}Ww%Mf9XmP;` zagvZ~KoFJ*qOzmhs+23`o{}mIoYY~&A+KbdKtL{dVA$3dr%fh1P*hVEm-evMsPo59 zZBeyr+RGpxU#`G2*^F6^1?$ znkI0^;t+p~+wg$PtEf}m2PNC62HM!9a~^mDAsd&74!llIF22G9oy|ImH6m(zB^6|+ z&dlO8(31r2Ywk6NGd)eLZp^?>c9HsyS|H09gdRmvM^oBss4o*ijYE_$Q%3bBD3Gj{ zV;7ArGijSB4A@sP%+@OGD@9a7ft7?yYio4YS7|q!#IX_tA()6L3@C+Vq9{T{2?9f) zP^nZf>VhGHz`HCuw?*lhr*a6~E3wxfvx)^T<64W&B$>InIX2c;`ScT~Nvr!gv8RMu zOR8?48e@7abedX>HCPOZwLSUUwJ+D&W4(C57hCsKc&8ZjA{$-BX{0YsuqpgKX?D*n zt{&6)$BA>ARVLgPep^u8T1s0FKdIqdW-PMp_ZGDvW&WT0WMSqrp{qBfcbaCS!Ifs4W~)UUKoEokQAkv&P(m<4Kv1q?0t4dAND%?0 zD56Y2Xaa(ue^iNpm<-W!2<+Z{+;4VyhUls(X_`7uG9Zp)mX`OjUaIoYIblzU^25j8$F8c%(Ky%iKeHGzBuLc$~a}#3S)?v zccyaYyTG2V9j%q#en${}>~UH=NqF0LyjQN=dq`BICL&_8PNvyr61+BY+lKWI9Ts^s zPI=@VFcu~pXnt^p?E%@7s_sYr;IyTFqYl#Ee5Q$Ut&CEAj_1Yz5iE+eiF4dHhP2yd zA#G4Cm$L#|ZD-C7{vzj_8)UMb(`Pst)bz7Mh}Y5%9&ANR z+cpP_q356fRnSmqcVhwxDOW-su*&jm$Saa2&6Ues+Gx?-++w}aA_|=!u|yRr^{R9J z7einSK@<{(AyE(#g&~nq!XO|r&f6<6>O8*!!5GQj1A>qNA7!jV&@@emn z+l^_rJ9Ii7I-M@aFP>&k?I4v>G;q?12-aj2STma^DT2l5DBk9pL7wR3zw^HQlahaL z)|_WYdDiWu+_UF##O(68fr>(E5F-YosRT$Audl+BpC+t*>_htI2kr~5C?OWo(2%P3 zGBk`an|OD!8k5KVD(-|@V0!bBXP+mf@)OOy&3u2=W`P75h0x3g*}E2oWUQnbG%M?t zH?>TymChU`I&ng^T;`SK7RUB4a8GBA#`$xcyL^e}>Ka?^h$xDP$^o@n4TEBgp;8K| zR;!c)9MVLgdj&y;#DSyCK}ZlddDmo|M3N-5nhp^+Ha2LrS~MDs-g~pzq}yo`$1zx& z&9K%$?SGRkQ;GfviBus;z5RDbi>KfyaKL2wtMY8{T=pI_`3iaWwQIDZ+RK>e zobDZBh&s+mjG)#csS`blnHP0iYlE{k{?SU%-ejg)({s*6=Ba_}U zGs;Z8#=?xDUawKFDCKgQQs_8KLG_m=tnMR!twyJUB2Dw;ZT$;Nc&ze&R zS_!dYn4yw+acAq$3(mM<2%JBILwvm6&fuwZ6}Pw7C+K9Jb)RPpmG@|9on)uR`Im<& z8&@fZ4xdg|RinASuA*v}`TMfF+Ew;8cX>M)NY&Ge&8gx1x zB6WnMY=q^7Itz1qnVXwqer}eT`V94IK&4!wS`kW7NGXIc3^0;rB7;LBAE`?YX*HWG z&GZBLk@ps9ra#;5Mw|d9FL9Ekb_F=d-&^a-a9in!%MMofPu;&>hzBkna=- zy4opqwc8BOzwlgmPe`OD7qXEJWlZlC=Y%oK^o5jX7z{+11g^KakigJ`R&g`Dv z^Dndj1`XXhChCT1BydUPymyhehf1-1_nsI--0g5sI_z7l@xc<5gH5hHe~R-LE^=ly zn?6$|ib_P~5@8rpiULZd61B)Fo#tv4g212(jb?*R3|m`UY^`6Q+i4@+4NyxYmQpEX z&r+G$`aH|^67zGjEZ57_YBgpnA?0!jExE!hyAUDk!iWS;@! z^EVg#A9_fhPu7>2>-wROkXprJiAtH12Of#9few1gEs=ZQDZ@(DgQyW=dA%gufWyD=Z_ z(5PdZgD@cVwn>w1R&^0rf>Rz?FaN3%+JL|WsDael?XqyLhjF*fk@O;S^&0mt?`3he zOzXu9ym;X}XD(gHe3Q$Lnnt0McS`|LDIyA?Qi-UFCGK|FTyLzJ+}(%+E7FTccj9QLmJp+-ig{3@Dk*FF7-hxu_@C;XKPF7%=qY(6C?&E`nE# zi5S9g$P$^s`z7-%@{o#?nk#{1)f#r*OxFqWN+hqCg2^~cf1lsm(-5a}cHb3-=4l^P zCI`l#*3yWom9#u7;gKKuLC&U>HP!q8Ch4qC`aX#)>yg(7;ZFMnElzwX{jVxQ#3dK`aDfGM{B3$+XnI@{DHDL#=Mi!fcrjlv0lFuTWlZ^8A;c z;MsFA?M_TunsKXFcCuor;v6t)<1Kg zK7Hqj80);UZ;a2zL|w!CI7}Cx?vuZlm|T9&E5P!HM=xbsQ3qh$Ue#8)Rw>{ADihk$ zzCfE>)9UPf;p}M+N@cS8G)3@}c@51+zB`bnaZi>*1POwksl}@IPLeE3BqXAwSdu_c z;|rnqX;*^AI^{6rEi=kpw=eTR^fjzpyu>37|IkUm3;GpyXaBv%$eW)l>kvl7 zvBtz$O|jY87f`}rFsWms)4*kqXa>%ssT{k?1?_GEYPqLg;`o6I-#ZtRw$JeFlO3La z;WVcjipnf;7!#EOmx;b)=yqI{k0?zkg&_-3Oub&=!0Zxx_AIeHSEE`kGoK->YKjn} zahCByyz@zjB7JJ+!vYHh#_~uiW2meDySI@FEVTcerYWndtHg0UR4X6Han|p?39eKs zv3Kv@sVMeMfZe!ZNAxW$lOnL!3k^@pqk~^KL>Aeg9#E-=Sxn>3nZpK~B*3u?(+KRI z#qbdylR{n|xoQ~butI86jE~BZjAB?NFp<+#r_xIg7K8z6QfG#-2}U7mv=D2#KWMT% zKg*kMTV!#z%f`7)9)Ii!o_ThQPA8^as#2*|iEK*AMwD%rh=7@(MXg$4u3BN=-aYJF zs4zP-!))2vb|s@=vBue%6AUPkytYwrNE(qLYDVP(lS}2AOBw*|`1h#y-t?)mvbxII zvuBx~pC9_Wzt2ZK0W=y7W@l%q*XuV$*qv~jOrvx0*ZBf!(|}h9`*JTkKGXRwqz3Q^ zJXIZDFU$IqW>UqM(ytCTt?B97A+T=$9ArW5y?R5LGRI&riDMP18d96mPMU;aK-IQs zHJU6)#G!pPzGo(3-(rcG)>B+Qv&y5FmDSaCOsPhtRK-L}tsWAnP%ecmAuKP-C!51$xY~1f02LyW1tb`QF-}=!yb}i?-V<~P1)UU8M=q!; zo12@=&dzf9@Zla?JPbUwRaI73S9>9aUi{ca<%R13c|Yh$5jd|q3g~B;nG`$%=N+3y zdSpRw?E+&==xYl3j!z0Dpp?1YOp3hT*gdJT%!At97Oo>*Pig zMu-?1wvDr=CfII^{hcn0Gc&yHK**5;GaPEBv>Gd%zIdKSqe)dG?!RphVQB$Gh>cTr zmBWxqrOa&L?7H=^MYURSB~q-q%p4*pfs;Rd2v9cF)lz97YN`}P1VPxBV`0El;}O+` zg>Pq-onysxE8;1uX5MS{dc9Zgw+LP?&a=|0N}6V2h@zyLOGwo-OWklY(%{CJ&gUR+ zf~wHhL{EwvrR>#Wf|W?q)Zr@)iuv+_pkk_^-b*b#i;?P<^2Yg+5KZ{{gF9=LqO ziuW{f)%aX-EukAIswrXIrd|qpOKpj}kL}@&JVA2#3~QU4tgo%njk}bhki#{@{Ct^e zxsyFtGS^5!>0;EN+C_~+Qqip5mSzWkR&%#f_E{$#g4W8Fetd3bk}AK+iM} zJGmfVcgSm^CpC9MzfwpU7nV4!9K1R7$6N(a?JF82P17(`A;=V|lgqP0O`x=6yi$KM zd<<}z={>NnsrhKITYX5g&1V9WA+if_@6f>*!+e_3+S=r`wFY+`KFV9`B`U!cE}lD2 zb8C}MyNjaKYE>$gigQCOmwkW}VgiDw><);Y;z?Xeo79<~#0XIkVY0{~V~or2C^^?w z>nW>$c@vQ7QD!d&6eqGcW>qE4ikFB~07J85uokR!l+dQ5w}rJSSDFcF8ET2k8Lfp( z2qI1!o@Ac`B4RCJF-SL{lem-yTTw{cRtO}(sPqmJDU4wJDqeFK7E-tqcnUlr2-)>@ zzz*u8`c5-LZW0j*LPP>z#A4Je6}5|k%w(4SNsG67Id)njcYYGDF%*U2Y{RM7_Bv|N z4O6<^CdZ?I69;Gc&Ux6k0F||;+1lJ-ed9byk`RR@s?{ph%B+jZ@k*p1a`Cnqn`v>QS}C#u1oyEWB{) zG><&dAWk67T=U{~I%pp1S5?d0I3MNckwY9_TEG}*9&`~epQLfb?=aL}B0ToyA`tjM*=w9-CN~!R9Y!9=&5U6SiNPTrxK>MOn zUcs0P22l+>3q1{Z&nOWQnIdb#Zat~4sR!1`LG^r^vkfSYot)piz`|^uuRjRK4wN{w zmC(9;ijB*s>2^DqAYf*uMy)#QqJ>P!1s8--Mn!{uvN&9kue?bo$inlEL)HabQRi<)O!${QmDh%=0gH@GQInNvG>% z)zqhm^~mgk{ge0<3ybI3H@lSeYY>4`AK{Nh6`IXXrqQo(<;rD}xQi9T>G`v~>Wy!r zR4-#w(~D~A4e-W6-t@W~K7O}c67NHf- z&`oCu(}>gvGL`6g-C(x}yqlyG#i9h`uJvcO*^P^$clMqZc1uZbxHd!7a(nY4OS4rz zaJ0(a@)jFsuh86d5k*q2GdEMBR4P#}&k|&mHt4a+0Y-xCyD&rCAY+TofVss}VlTV) zWuE?2=>&*6?z>?gQs9&sjikaCA34bjFI=KNGmGcotj#>AGNn?FB1)REaVbFnMwEK3 zLbVcQO0_%!`(^KQHa1N$LEw@i2w>c{kbsOmw*`6qrW%TOOK^5`pU<>92@-n*4m<)+ z%cO+4h9;fi{0TEn;KU6@;8cW}a)mc0P3}9qhugOvBfiq2xwQ^Jd1)U}xkR~?QYuA6 zrdIGM%IvXGd4LiRv%8v{V}(f2`^~#Pf>$QlZOB>t3|`*#%d%bmErP1>?5PeP|I~9> zT_lhQwYK*>p)WHhndTTtiDQ?-$zPY+l+?!fWJIn99+ADPK%XNBG{6|=QJZLh6-cpI zvAC2veI?d#_1g`Dt6`z1+2fulPHVOrK;TIqH0{HnZwKDy6*fg@uR9o3-b9l*sUVwe zF1>J;dbo;^QY)31nW>+NS=m)4aHgNkJIzzp z)Vds64k2x30>ek@1GyTxddkr3jVC>2!jCFbFAyC87**eMNfL{9wR<|E@==R5B_XXA~;#A#4$8dn=bOMmCfR z_kZ{7dLM!P=Y(gTd73Xi5|PS2OqPu_NwYqy5+^RfoHMamtfnrfbLKfExX7%y8za@A zFJtE;6f*7epprb>n`%jI7b`-l36@M=&d&QhC-O3a-LTNR!4FF&15X2fHh0TfytEKl zm2$hmOr^rT5>wjP;?tjdfzN&F^Q>Mz$=842ee7KhnVqdsG7fQ3A_yQ9NRt#}4CQi#YOU^MTybY$KO}Fv zPSDG&(3dH@U6(<{+9X5Dw0G@92s&&`1J`7KXRDiLhk`Lew`=+QmlK|RF2R@(wW-rE zXXRwoX2_`4v9(zu0KsJ#_LLZIc@X)5y%eZ+5rwT)Uy9FBt?Dpq6x)tyXv~&^>pG-}!@wIeYpd zM&>wr>|zW zrGdusPW*W)>tAj^JK44fY3fZf^gNtKQQzWgU`#{r@h+UwC&t#&=n9|x!V{c2+ofEY z#insqNX)0%aR}(*%p3)Fh#P0`X@`!&M@F-yGp7Z>Vsu4Y}~#Nj~)9N4b2V!@m7@ zP^nZ2f&jG%MxauzP_IW+${|t7RG!%U}d@p zjr@Jn@c36Xu1xiz`mZ@l&nOdD%EksE3 zye!bCw%u-rBuPkZGT<=Lvzz9eb&C!aBGOYXxsC4HFH%`=G8)|9J8P!hRfZ(Bhy*lS z4LltmDJ`^ud27N z_BXuy+S^dK1(4)inDru@Dvcwm@{3V`#`Vyt6O1JA+-d+e`&oeX2 zw3)HKs+p24Q?^-6atN#>NlcPNBypU{u>}Oqe4wp53T)Ma1f*6R3!Nq?hSVm#U_#d& zH*YF#95(^EuSOHSoBMa=J9;$;yc@0AjZ}U)$PmOL%v7t)Kl1`#`h!1Ub8~|O2M|c zg0%@YO$Qd&%g!!6Z|2C+J6yo3U~TNQ**0*8Mekof*OxB(Rv!= z{^AS_y_*_>(D2}=pX9~U4H7L8C(aep8bNX%QiF$s*KEfH3Y;OPmyJ{Cw7OKwU0i5+ z)*l%h-$1`pB@99|g*1*)c(;0+n90-1=ARXV40ryK4ltno=uA+_ka6L!bT(=PzDhdH+75&>?RW z20i!2G>LmuG46C}Hk+)kC&b-Wp*v)5f4C@}0z!>bIQ3i&d!AT5Qre@UNs{!wAI69E zWn$f7W}LtB(@#CaLtk8@o77RsI0rRZ?Pog>BvG^_i}nvLcaZoX2X9`2xSM2-8J=a< z?AhMwLwn;+Q&$bLTB*9THHopt*@Uf4U5!GKUeWKM=L>yP5O|vUU0z$+WjX}*2Ss;^ zd&r*E*^MIyxO5>_b*gY`kHFKUqs5qoOqRPzENQ1fv$aX9m69gi95wLH!j2U*sv{_)dwxE+z=2N~V0(RZ``z{^-~cP0 z*G6a5ttYeQSn1*x7lbe>arTn%u?J7mYL*GYk_-78XxL`nRo?cSvjs!X#S@!mzh@js zhS;7Nv$oZD5%q15xm>DKrln~LsS86gTE%EL=k+YuB+Zn5G8hkhb70baH#qH%%bYaP zg}=s%NJmGJ+R>2sGKv#JM&jG_bKg!{nZYCQv<~8fMR%s@t3o{$I+s>?^m7j}U#e0o zRY0K>xg1n+w~1P%)9oi;6Hzqj(CxO}_nP#6>&dAZ1`?@2Kks@(~WuZnS^Ja-@@7ww!8h1cR1@2wlAahZV=ipz>3Q*Fx$C;f)(y@bi- zS>K-&=@R$pCP(*h1-rCA*)e_SWDtf zK&d5-`_VQ=6l1$2Nr!g3OORE3OOiBucV0(f7!qJ;Y;IsLK8B{-*R5Y=Z!j&aXO1P~ zwgjkDtFZ5W6zREI0%I4oC^LELt*WeEUg62dFG0Fa+SwYu6@C11-hY|gPS1N>c?zs< zIn`PMU8AwFLfpQTYtO}0yN@n4PnxS;8%7cJ+HF|dpqs2mJ>v_-JAn;XqaVcS9XIzX94CypM1)46vzl_gRcG)1gN58xqa8O!A-5}23dfEv zbM(kw;y4|-lZ$0j{DL`1dz?W&h`|RaoH=)qW}``cW--ftnFV!tC7<}BA1;6`Md@}r z+;;33NpgrdUdMzXPtPwkc(5ne0H)EU?1uU(ed0DLJ{cT7`RatzKo5bZ z0e{N0a0SjLoiv+u(tnhC);+(`>h~*%ZZ{wwt}cIoxY%QDd;GnPR6+ zx6`20NwV10LZ?zoyWL`AW1Vy7&+(c&XV`aOAGKO-F!yqn3oBKeCzDqOsaHn1Gp*ff z@xtk|T)BLiJ^K#y%vCTNfyY6&+huEWi-qO;&gL;*#2B;1dq_53|hO6lHB~jW7s_!VueC#){Bb+)KGMht(2RgKdfE`;>jRJ7H>= zhH&KF?V9vcFHZ^`22HcMdCWR9eEE{yD6#SgJk4}^P1|lxwOuWn0;#x}X|!5ssg$EI z&duLzKa(WM<(^VPVv?jotJN8bzyO_Yn{v6r!2<``+I*5rVyRRrS;D#O89v3US8RD- z;jDuu%qFJeDE{K!MUo^LK;VHfjqte2gSD0~fBDNi`skCaCZ{t59x+Es7Q(2#Y#iP^ z=1$tQkHCs!70^uSrZgHG)M_Ymp1IaKw4K*eDq<71*3S~o)X^;SW4{NP%b?AYG>MCzNknOEwP-e4 zgh6h~=!=UYLZwt?|G|T7ZN#)h(Drtu8kAE9e=~7Eb~u^ePo-L?(P+@=baoL!=sur6 zf1bx4f1L9dF0k1$XjZ9k*wi{sppc#?uQ|`0Hf)C6(lZNXbB3~#`AX*}r!T{L*}rdT z34#EdZgTSEGqkrH0w-&myrR=`rCxh^!Sb@WUR!2*hiPSc&d=Y|V)6uaeuxeF6j%T? zBTzTVG7@)!C@HJ$gza*rYvUvdZ5+tR_J?+MV;2K#)3*grdaqZ2O;ho$2O%(DtC4or z*o-$wf~?{}rIyKlZmPVPt8`H;5pK8F7uZmK67Ha&~WPEo&=R zP*tk6s6UU8Ib#TE7OfFPVWznk(lljhX@Nrr7in(Bn5fLDy?0Tbsgug!N!>5uHZ?K4 zTIE$bWgCJ+-VW34Q^i$e7$8uiC~s<2jH;OUQe~z*#Tn-xnlgDx z9;HvY7pIt&-slDb*T@0+6waWQ(Awd{W zpD7Q-@_Gg^6=!IRN~P>TatJ&-Q%7|_Nmr1t#O&e;W=cxQrld$u<}){^#L8|FxXG9T zWg{TP;nKkV)bnhFvTWOR6#@sC6nwABToBllWrEhlu)hK zD3>gaMgvkqYD2WMMW71=8JnIKo_&MCBk(k!xV`OV(MgfGOD2vM8_WBEOZH{xoQL%G zt+R2o5o>70kVw#(a9esZZ*U0QVmbu2IM&;{VNP>OO)Up2PM*@hps#xa)p8B}+$UMN za+zAv%-CJ;_2v_;CA2$T!YHQE+@RS^DVM@+sbQ}*3=1JF{yofmly`$H-j{um&4mto zXb$0qyP*uQ_zdQ)_AZl2l2VZ}BJ}DJ_aWn6G;`}vB?^S*)&}iX3r#FmLOP{Q#Kt`x zncu(#VdQFIQq#^f2%OhIZ_rm@P0E$Fafn~!nn&KRBAS|@Yq0J?R-~H=8I#VE!JQfn zU}1`Zde(bdcG$DgQ!BEp03xjJ+0VioXIZdao_P3+$mx?9lw{z*B+4Snq!*n8+G%};%j z3#VUXX7z<$?kIY-eH4)pk&te;1)2*L%-HCnw1+tDc95Bmd^*=29*-z~t=46X^s&Ul zWZ+4%ar6~s6Yhh8Tsx5)Xz_5u6**N^x}B{4?|}36ka^0iGris_sDU)KJ;xWDtNC;d z9XY0P;FvbrE^k_$M*D1WIOOH#{*OgQ$~zHdS%J60Fn;EfA0hnkPyYTS@T8>dcDI&+TJrAvfcXArSe zjZiWHrAn1B$TClcL2i5W?UeaE5 zsPKDULp&Jex&88fUo~f29jApJ1b?^`pFQ}XQMT{mhD?(LHR^&$GVSvq0^d;Z)OT86 z<`jpB9v7y8GZc^)@Ns_mP2o9YLA8786CX`4e(6($-}L?8#;1Z(S`ulh^KBkCcX{?8 z$U41=lY=Lna|^5jhj0q8X<{y8T=Ib_5IF0&N8k*RE>=oNrA(<(Wq$uL4j#O~`jtz_ zi(h1OeTAT7nWZ_MO-*$v!L-c_d4?RdNKTGoa?G?bk3xk!n#1SjohKK{}4E$@5_;rsvB@8;RY z3ENs5L#qpEvXSIscrwNeOb0xFd% zL(b)Cm6k>MbK0Z8@2}k=@T8omzh;HLg=M(M)bQ3?)q}_EyT9X45dQ2x{D+)B@M`A1 z;d`5iv4vZP@j>2k!=F~GzzHUg3-+#Kn@koAk$=8tqa)ZBnLg!WIX0~ox||Q4poCN- z%JYZOeS4YPXrqCljwK3Rw~bo%#V&~7;yj+RC`1C==*95nI}^vw^-xTeM#CX-spMVI zm0mf{B6F$QQ<(KW4@_b1>Yi`)7%JWSBfpH0q)uxbMa85n%D5)IraAEaFQ#3}TCf^q zb3I6yG^5b88dwnm$yX%Y*36{qdo{?LXP>7*V6T1ln&e5J>vc$8Ih%LCEHaLHmyT4? zma6Kn{?tzqe*X7f3BLST$MtTr)5VF%VU%T-kp=)`ZyVQ8s7xY>z^^ zaggHn*0d~;Ct?XZ@8$eHOmI4+Nkb0-rJgq8Qn}hW_v9D!3y*%5Fq)a+10Q@J7tTGK zGPl_3hSjq6bgTo~v3w`;9l4BCN-Z#1XrjN*v(dFFCacIsPh&eNAn|tPi~_MKqX-)n zw-&4ETuwQJSGy9L5HS$8T!duACSsJbZ6cz~2QD&pZ!INmHYi_tgiGgFXtmk{&sH&n z;r29PaRNz__PwBTnJ$2VsGspHbf)#~VVVmM3^EQNDs_mWu*V9gK2I}b0To&7NA_j2 z*&b*L-bD6zHG#AXOzo1F!q)o${t*S?nW-S2{^OjO##mI_x9vT!YI zzq_&jws3pdEz@M+<==~i`|{Lx+n5BjlD0bwfrcghAg?$BGaH{b}`D>oiqI zrg~vzW}qMWoKfRVOrGM}!u`(VwNSp|inoQX|J{x^ff|w|AxUGB*q8kjl1wCMwwlho zmAIt$Y3f2UeX;XCXA#lvbm=CEOJ+B-iK=q>${KTf4pWK_Lb*oUR7mYmYxFcoG4Zk& z?%R#_*|*cg?d55U8ehroEf&=pEBDXETaDF^e_Y@G_OIi2e)>NWb~_z@@&EJBDIK{_ zm-j6;sSfSru;2(^2ekuSz{$Zob|42`oD49nIVtbdF)0Ge_~yvUV?rsj-x?i%6!(ls ze#2%yfN7?eOEth)%gWk1C!c$s%J~*?r%DjcV#Uz2hen}CWdP#D3>pH(Q{2JN`2!_a z(ronjDBdT|^NEXDD5cW{gi*%o#xa_tL;|xjb;{*3?RJL?msS9nsn0n|+wD_cYi-Yg z#X~2CN~KOac0nIO*;Q|dqB3I2Trvx&sbR$+p>S0+crqwjvhoN#E%o(sY?tZnzn*>e zr};2f;cfE&Ox$RkdF+e);%9%CZl_DA>uY@Jw||=l{^Bc1_8sZicF+N-_>>AVD3l1> z5!!dAjngW3*;y9wimDbOdh#6hxeIjK9m2q+u(b*zE{rDfWs5=k7x3(v4}@jOSK_z0CK zq#Zh4fFN0|r~Y!NDi{cYka%;Gz!+vK6_O<3VpL~#&jB_=gPMN7hD`MM&9FOc&m*zd ztLz4WySTkSX;E+A+g5g;4EbGh_5~g?cc9o{K@}_2}45Zb_sx$MnjWF zpGfr1w>E(4aP`E%7a8)Z!N~wufTL3k-m~B9I5~J4J)#|ixD(|?rcd?`aDMy%hJvTU$(Y}#T3b=cIb~!r;toy>WKIlD*(;!i z&;~@-aA0MH^#>nhV|^VH1Ot>QD16R`>jgou?X_dy^EtQ*FaNy21cb&Am=0mk!P*UM zx=D%>rwOL&ko00RM&|Zl?|BQC_uPdkmr2zkHUXQ`t}ReGd^?o`$9Q4ANt~v=eu@Zj z+@;-alcIFem_~b(R(p%N*)sc;s5*#l%=bc+DuEuY;&$21Kx|| z3{EJY<}|W6%DtPEnw|<5Q=jZoger>CJDmZ=-?RJGkhEjYeBleMKK=xu$pWzHowR26vl1S;;zKLd>5M|VNZf=g*+1af4xgkyy;v^vm zg*|(h*t5Jq61NGGl+}xu+5g(Nk}e&(k!B+u@rs$A`hwfDmza)o^g%#pv(FRXn@SMR zF4kMMDAo`E=U*VTF3V`BxHPGce)yx5zveA^@biDrz3sN+&2yFg3o0^+i@V}jfy>$J z=#+!<6LEy;ZM$9;4jGiYi?aGPhwb8;U{DTkwm9?bvz&bR5o!b&{xwvnAf z#o#c9QQ+xu^8v z7axQyfq!o|m1;BmAAj-tY5&20P4{*#H-tf!at!zsnr+<4GVN(*aRR;1O*748dITP| z2v=hp91F7TC5VOe{3Xsl_!+|3QVX4TlVr{jqmVZb#+ZTEC<^Re!M5x3FP9P16Pgs& zge2LbTv2M3h%kWGR+Gm1CKt{<%feEH|&i zxp1EKwN)Bho5XQU7>3N$>r^Whq9~-*Y_NL%5|__jpmOX^UjP1Yfc=M9jVjk)=RA5( zc=>lXvTqm1aqfn4pT^Q{{Qu@O`@coo({pv)S4Ma(|R`}hY{z;tGAM zFDcHw@gfcxXPM5uGRE1Gml(`gImtlt>2``8yKYEb^ky+h%9$5lp#7yUGj9y7$o&#( z-&a^{LB}TAfK6LO5eKY1Xa2AIn zQ)#VLwe|ReAM0$LeoD_i^*FikYeMq&LEzM*59`{UZ%%F_-V&v%8jkmA=xe#XQ^&Ko zEFIHi&rsZnwuM9DX+Uu&TZz7x*I@6iBlv^?-B1XZ=V`v{?W{JNBwHK!0Drd%zDh%H zRY0H=MF=jFhx@@0g%RYE{CdRoB~bcNfP?jc2dH|M#xNA28z*#+-ofnrEH?dm;xr*C zRhXTdL*^D~*Jq%1fOQp&&63g=IfTN5+Dv=g2}*>E``CKJ2QjaBJ9hP((Kseii&2P5 zHPV?`!nq|jOJ!oh%x;}xj4#D9=8V5~E0~uD6c>Cjt+hgM)c491Ju|AB;P&N<^y_hF z&mD^*A}*16&f70J{ueIu{ac7!-fezLg0-9Pek)bD&?PLU&BQ>u;|q?G|S zQE}AwgTP)U4{%l-H*geq6;nBQ_fEw*9P6G}gk5(8?z>thsI`=uE#gj_U~MgnD9R|L zx6Ef(n~cH*nOtnN&#a0V?AV?U1}+Rs`P%EBHKeLE_V1%wuMtatRV4`wK^T%s;QHAs zM&@BSW$!z54sJYO1B%=s)%(r2ul*nrZ>Y34o_kiDxaNyKPaCfI5DpP1y;oH=z$t2f zkG}mk>&#dLHpYgj2+wy;KeKxBhu)OWQ3OEf)v20=eW8}-bI)ouNn3}H9d5o*KT=bX zu}5SkzjFMbC(iV>WF6Y|3?$GaGfS3TSheY*R%-mw( zilP+h_!>K4sAt>XyY5%EWHvj-!cs_A`y7K2!KxkO^)<|Uc68sw%iO6Q+0tPDuE8L8 z2Qhsc>@>YFILdpO=>qpHZePBDbGw|F?KY}{rPJ;^y@F(WYDoMxt=f0Jwx>>EBeWZ*UJk0 z#QTh>(}bad+tc1%cv^465QhsFnH+fmutN8|F`KnlzS4$VmSAHA$+#v%ArPR)ug1=N z@a2#FD(5T9U7)2*uIE>$NwL7mY{I6U=q8SW@5a5-v(md^k#50Icv&NGUJPrqyW)Bt zUSxN~p@mcIdPUYGAeobH`^Cz9`$G4Eq85qU1FEk~V;kUJE}q!{fdstx8|OsQ)GnkO z&Bb`t$`Dp+$Sep>?On#HS*6V>4M~R1z5VqjZzRra~~`YM1nZZAwz@7H_C1UTi> zdHR(&r-Ac0H{os2!<&9M8=x2!F;;A-&CLs+`Do{B-*A{{&))61va?&vc4pWSu+(hv z+28vO<_^!rrCMdhsC3MrbIvHR{pM+_>JtoRWE*#X-g_#>$-c2Z{4`b#!4ZJxvNk5AyncUM;0bmlBE48tTzIM=n7CFgt=i67 z`sv^K4bov%J+deHlr-Co@7m7fm2=Phx1Z>i zS{L=~7aziQM_Y0OVYH1%RY^?1-}(OcnYFe}YOTwaW-v47{cd_;bUP2IfveuIEF!}L zT(%D{&q{acE3}3wvvz97ze-as#6%Cc*)5ENuTlhV;AG!PO*h3o6$6jbFMBd6cy8}G z;ERmQ72T(MVnB@|0m_lq>Gke253RiR_Bs3eKlA@!8=GSv=v2_7Km;vSxp?YDx$>pY z>cM;ONmomImOw;%GWCudFuSV43*09@+zcd#N*u~O{9*sgkozznbqh=@#dGkvPN4$RZ9 zD_o2`+NlpNs@)wZ(-dIdvEiHD!Z`RULtwA8@&(E!%@pZnSA*MUkF&c{p(eZcF&Haz z4^Ssj#07Ag_4fJaFYhb0^zlFV9c*(G((yS1cJ81}FdFm8U;h=J{FR@vz$Im>AkI81 z{8%pZO^ z(I$@djtk$9zDa!*njo#!t1Blz_X&IO@T|41Eg^~7sSm+Uf@q+KSlDRCyzK+;WA*uS z>9PIurS(#+rZS0-Wj_3vPS&B@0iA*h`|Ettyye1uld?&ELi_^fgEV$U3U!oqX5yD# z<^7{yUj@|Hi$yVm_TEXX6~${(9Dz8^U^weI!cc7MA)MQ!|IVmNueQdpml2mX@KF20 z`g}dQ{L0Fj{k0$eXOgxy2cs57z*q`w12BpjMZoh{m`ehFXH6hd<^>}idJx9**Ton+BJ3ql*?A5eyoY1=p5WnUpSS5N9te_W-eVYoAO|Eig)c{<<2UTdE^Rp;T`vKIG=25a~f%hd5o z(jyD`%QLo5Wr6&=9||i;S$a7GTORY1QOp+yd-tn3Pu|BORRw!uk6gMsMdg1&_!2&6 zD`da*ZVZkZ@!wyMFsKeU)}XDA)W`Fyp3veydN>|aLd)wjXm1)f2K=`g{xsg4{$WfL z8{!9*)i%y6DRlcH#%&R3bNrKC3kNp#;b=y(i!{_{zZ|bWV_iJ3aQ*Pc5?K3 z@ydFO?U~!;;Z474SqOZ3jO;*;tc~qw-;TP2|EOA8b?G<36m!zvwb7AQ*A8I#Cz5)@ zz`CZJ+XdeG`GLo0cZoYC=AVx5;oys7`}tjONR#{kc$8KM^uZ;9h9(DcE&=p8_(VD> zoWtI@Z2J(+V1a9qrewQ^`>`+BN+ja5cuv1Ffh^A7!m4}8=0Z@-wMcVt+86Isv0zg& z-cUaq-P9OfO60~k*kP`~s{v$l5&GnqAU=7VUjNMcEFLVsvqsa`WR=hRFeKz~whO`d zvKW!=d-(6ovbyGof$~;HpW#tuNK;8EK=Tav@1(|kGq3@_G{uq#`0~J?VY5`>7O2n# zo3@zoAqLc?KUS_A8us8)6L&vj#s_Gr=^R!p$tBe02!XwhOkW?)sG>1( zGidm<5>y<-Qc(kZ9q8bq>hTKD*6+MKmFZY(FVDAIJfFT5S=6X zlD#)Dso8+U?oj*o>Gm__6A~u|Gu+&bXiviU+Kx7b^z~A7Lwn8Qwsuwtm${QwOeL># zCbwvUmyTmDnI~4R!^@&U*TEWX*l=l){0%$*4luYI(y}3^)bTfN)bco`s0p%OD!T>G zs;e+fq?pc!dPGFnzd}m8dBrJnsn#&)C!cGDKUhLanZEL~ECr%Lqg`ARBA;Sc?ll)T zRG@=Sg*K_J78+s;ZTbtL)DBa(`^`xFgqJRB1LeWD_7kC{gq7qd+3AK|>IP@lyv6Mc zX9)mVPSK`hQ3VPivKLaN?stY>Wv8+#{IVGxF_mh(9~53 z+2PP+3N0=lvtud~NXU$rN17A@~382M3-=56jf+xB@OI0t^RE7LAdhgEyZE zik7UT89?dByU}_0N@E;2hQ$r=q0Z>iLaz~z0)>Q!4a@5aPT>MGccxZ)@=Xiu z=sXF*&sSrmd(q^<=t+1d$i_f};Q2%xY#Z9%u|y520zX#l z`M5{6{moft5ip+~U|%}#>kCEmV?Ns6dB`v0fG_VYuicw`3WY2gfSpM@!9Ti%(hfW?9BO`< zWTtKA2HpiV`#;zI`8^;yl?@3YahYUGC3_O|Tn(CB^{H?0>~zouEp7Qo-dcBg0}S9q zB@Iur`s}&6_e)sa<`|bx?=f=jp2r(I4zwQj8D7J9l#%u0+~KsNyNsj{K!^84JDabt zE3Ylz^%*>_dKn(gtfFuUr^Qj?qb7K3)1y!CGfV{V=0Rb{C+*;7Pdp*VHCA&Hvjdsx zyT&+A=OJ&c`_*vkHNaZ$iYLy3(5B=9KKJ)D@r1}&36bkS3xBA!3Np!AYs1>I$ep!xb$ZW`a zGK>}Y7%p?Bfu24OP(D|I4lQx5KCP?B5gKA@_S{1FRRb=+frYJMeG|?JK1M zbko~eg}KY8L_@m(HMnOGb(wu6qwpNsj|a? z_FeAvUkJfxIj=5W_r(ku5!vRC133kQ6`p0Ia`zS23$!g-h{{CzMXX-v zhGkHFvC|((`P!Z&3)$9Ah|GEXVV4C&gZ&QdTJFK3vFF7HZz^J^L5W1|f;c0DZabPo z4Gf|)nxuF*16W_b>NMo2t& zv@`g})~tG|H)+waJQW&ct_N9vh-X*4*cGVB;*NbfbmW_Fl}(&Y_-h|DKH-rj@O$Q4 z)5BIBf<_MGIDLUhen=AKT^^;@)e|>q-ja(#uF8>lU;C#;aE&OR*3GoQoRvms)YDu2 z0bwN&Lc&1gZTK~I2;8V3)?;ni$I^URW};*mb2wYla(EAUtKN}`9`q={PT%{zXhp5A zVcy*chPzZW4P7@+L`-5k4LuINLk32XdNdGmWbKM)gJ}b1 zbfu-ImP0025}IUx73S}{%L{3!HbR#qq;YtyQYERj z%$KG#cjJpO%EIN6I#RS!HOZn{#l$u{L^vYp1V#*gcTUNyim`c`#T+chhcdOe<3~Pd zz)v!Pqn$;$3n&f!R{SvOXL$*zN3t(?D%|6>zv_>#1UD^g#9D5rGTK+eY)HdVnMboi ziVI+pVeQvmttOBo!)LZR6$phZMxSapM=toL=A2i`NU>8+ljvVEA74f4qv5L{>8X&} zc3%VTNHpjVl${U$-{fHJ)l7z+i6KEeP_H@ZnmLBE^WbakViZX3SQYl@$$_Qc-aO(>Gnw0YvMpd9R+nO*e>3MkQ1 zGbLlQPE={Xdm7GpU4+f0_-R>}2NDQ$;b<@1en|USq1auim-2pFl17`N5^wGK&Ig8lyH`<=3~f1-A! zBbGn19+p@yEk-~8(Ggc7a;w{c(E<0V{ivyJtMFiX-Q(yyem+JF-6uwLcf65bp*Zcc zVg`IX^+})8UOy2f_|N?~1&^D(L>W3>dK?H!%I*qii&ZLFW;(% zr{U5&3rSmA0%dcx7`C{JlkD%{^~K1=c9i|vK7ICgZjKZ-hn z<4W(BujNk0HNZPC$X={t`$!7pYn0}SYfbfI3P)r@$|lLh(^e{dl2fqg{AT<=lw^KT z42kMyVl23CJR|Q9IJxr`SC8G&k$Wvfr)2F`yw5d!Zn41HDuIx8RrbrImV4u$teC$N>0Wq{sEZDhm>F z)BrE@ImB#%W|(BebmF{PWN?wAI9I|_u}jZ z&XIi2OQJ@Ljh>s7*d3|IzPLxg|7Dgue^VnpC8 zH{gk&xhZrmxrqk^a+!s~Xeuu){`q6(nFw+(Eh$1uy_W`T?-KNVX(V#a9_3fOpsS=; zU-)xsi^Fnzzj?l913Gg=dTUR%pPXDCrwYC5Upm-Jh=dHE77p)UuQ|3RxFIXDYow_B zD%0S5CBt-rd|h24@Yby;!Tis;-Td(@?LNDL)Nz13qCC05q15WAP*P5Rzg@P4nu>Et z&_Sl*<)`Eg0wBkh*&kUaEcE+#$&E(NLoRY_!gs{%hkJ|1E^iC-^NPK>`r!7fgdEIslugA`gv&L*}Ut(4(9aM`d-JkVt9_Ck80T9kHJGE5e`F}ey03} z-uNXhr;fPL^~cp2zx(xtdWTHVnMj}<5*x5tZ{AQ_aNr z_8y^oki_uUo|0s+1aM;VWORyY+bc*`vcI~P!Rgp;4YS7c4olN{*SHY;Lc<=kL!ZBR zwwW8?olT4Wfl5DezyG(xcF%40L)Om6BRauY-(T~gQPDHf73`>Bji!s4kD+~8C>$>L zfxO!6IV#DPF?E!Tl!=Pt;k+`qiZOZH7A$yW2i$dgCXWdW&< zFwH+{$H054aO+jk&JSH1(37-dxA^XVeA3`K7vT1e9>j1>x&Fr$_?7lK*ROJwB1Qf8 z-#_p78p*!p2l&qRPwWc(y@Fi7KHuE&znp|B?@dh~UfX%T=mf9M{%2^B3|85GV6cK5 zR+Bx_)4MnQkEfFOrkI7gk^oj4ync-kvwzmIW`a9+gD}b zVAa`HGbWeOmRiiZ)^^5s$q*;OocG3dUm@P}6d$$S)*$Q69v1HI?yz>h3MackKIAI} zs=nWtYRtHC{(SLPQo8E7HcVQ&yumxz1z#o5l0L*2CD9=LYKfj!;^4 z%IJfcJgw-9!PMgg5WE^yYkc!5t)A4k zoQQ=^lF2Q6tDF0)_}9OEKYx5s!xPUKfjOz84d^vmUwGj~uwdtorSZ;VRSX7RRMUsH zt~4yA&1L>URQKO1dsh2pTiGcRUSm=+=Q44tb8WUE;k0`D+>y;RDtqAbRq^XH+56#V zwDa$gK?n$~?gbV3Q7$ikQC3IKS; zmg2uiY}_kHz6qef^EEqB`csRQ6q6hxA?I7MBgd!q751JConlI?qtN# zSH7<_Mp$)cf%i%d>lq1Im>|{TrGOVxN|sej#W;8IZ$?0CT-u( zQQdp2lah_l<|aU;KTyitpm#^%!5}n`Hq~I88@(Qu!+dVS9xq=j zJ=B@=Q7r(~w5iLrP82R>Zc2I-OCGPe!DK56NoCz4dZfMbg;YjN6qSG*RS_*)8s}lR zN3ycEWU4IeZcrcP{9-e~6EZ1rC^%!TgZ=EJ|2U#W4i;J(let&TbH>q^gD8j*jD#rQ zRJ|{msES@nBWDk$gauWCA1+(#Huqq611SlnO^^nqP{=$kvuq2 z5*Q~*i9c3kY*3jTeP#m7LfMs{MXIO$x8+=(CVZEv6;}ePXxP-8LRaqlK=XX0vAP(2 zfz$r5!YvHCMD+AQHIfPIzDf1=O;!w6#2@3NjKT&09=s-~p1M{SKG^T+b3i8Z@hPEq zSGSnu&#MgNc)#3OSMZ<_fUsO%6Pby!etMz^3>ES40Nq?3TSBOIsJq}y#L84>+Kw@s|dl%?m0X!f5Tnp205|nA0iHn^BIhPNEMhL)b zov)l0pj6{eNiP7WT~WZB+L-|{QqVvMea$mV#cN{ixXNFT*DYJ(=N+81Bm{D}9S#GH zVX)~1ZdI%$F*h1Oq+-vxecL)=4jsm{V|SETbqd{#BW*h{ka?lq`S)1*-@%|W0QUO@0NYe{U z=pvdSTimayvTf_l43Z);6+yd;$m~QdEX7f0a5!LXtLv1%P1z9KCLk6qd%NYvSd@_HbB z-FDNNlH1CTnT(7AJL75aLHZOFbXOV_8oyARv34ZL^lM(kYQ4?NemO5@&RxFhZC0p# zVXxi}Za|Sp?|!TK6C&$SeO)S4@*Y?jf>*AccWg*Lb3JiV4OQ(@{4iEFf2hOQa{}vR zP-8koW}~l{f*Qq%1@+glBRxkJ0>+9LwK`tUQS} zXHKm9vlJAeE`neVV-k1r%la{~gH=1ArP9@6(#xO*&1GkFWY!;{B?j`4rb0Q;7T$Fc zenEvB+gVJw*UN)|2jnU4Ua(iX8zKH%_tSt$7T{K(v31yAhrpd#jnB(@5YClSz^EHcHYs)m=t0G+Ke_dQfBFpGTwMjBqn zibBn97T$kA(jFM5qgGzknF|g@*h@EJwD%O6`QD5#j*%GNdtFdcT;1LS1pSrOLrK1t zZ2k`Q!5??6?y%6EKFRPcJJ~kl!sXVe{<1Fq1@zEc*a__?CdQy7^heZSLYvh6*@wZ( zh1-Je#^u>ecG)a^c*JM)tlYS@>D?Li(Gr{J3T1u7&eqk6s)eR+ijH5dm4 z6pJWDE)QmDq2Ch#65&4EYC#&23*f~3xVpdrvVwR1mSJJv6=w8D+ws+;ywSV-7)c$l zXEdaQjK<>b#Q6)?WoLapWSZSP-XMsx@XkC%SglYXIq;?|5drH;N-#m*i?T!H>q2X9^GP_zRJDgkf>P9j zdh1%I3oDxp>t=Hya@ix?D7>Ihz-dYVB|>Rd{;%R{i62D^$Xl>*HGL64s8wZf7bTuJA1$t ziBB!CajW?$jh=X}n4ye-J7Y6Jo^dx3YzMmhf;lGj`MA`2=%%+*e>Qm}#o~~}4!&r3 zSSb+5wcutX+-Q<7bp1?Z{(LSQCPkAd=n}FaSVln55x-Tl8{5XyRD&w;luNUb#FAv@ z_FxX6D$PSX%3f#xF6!MX!djf<4||~LK@|A;0~!LL>Sq2X8S#t8rhZcCk43A}d5@uj z>U3v)SZpqV0lC!7yLtk8D(A=oAs@UT6;ONKAfL&++ik3BfyK&WyKc4efae||1LL+<^RZnA0X z>PxEQls}^ z2bA{7UQT&o+(<@0(->00@DcuQpdiBHAlvot2~s!FV~qVauVk;fJ6e$8DylAn?2L0j zl;9^`VO(2|m4!9h#+bHPM^PB#2+STQGFV&?4OdZ*8PX5cNGr5IcGU2)J#$BcV@^f~Ek-GS2{3skPRFVXq;E((u zIro#Pqp}#YLHzOEN`|~;doqoIW$BFF1czV@#6GY5<^%Vqqi)2m6 z6i<`$a1Gt3HfG#9AC5`t&K6uhe}=f^&0e$(RD(jtsoor6-XEsUGB+t)eA2~Yh40l# zzVjZxviyF8tdFjY6mxIyy#KwrmkytZI|Is&4jTAZfUoqK$B=u0b-oKx9l#X{>uLJv zA3kduJ?z^lni^AS>mqs&t39TV(d1bZZ@%WNy>6$cyGJi&A<{-c;X8lG$A$+`+^G|- zJx_P;o~MtWia=aeJ=wVhNOWdNf)qY4%lVx$v+quql5M0eIsjRexcsdn?1|^Od!Kk* zF5m}^BA&nB<|Vp~5#n~E;xXbL5G?H}2H@?niBWk|Md5NBpr}K1X?LwECYT z2eQN~(-Zf6W_mC>U`ey=(;5t5F}r_3u(5BV>l8zuOIWiYD`32m6{Zw9oG?| zL?BMch%f*@SgTHl8-p){MXLHFXf^k`1oj)HM@IDtMwImz$B4Q#8WARm+UBqYY^gk~ zkfJ+z#Vy^>q|D3~maATXWn+cEHHl@!@_wqY_~Dey6C)D9Dd5Lhookr#3FVXPjTur#|2wTbCEPBCi|23+ zT7U?C;{-Zdv@nMeHK9xIe_)K2fmgI3^L)0_^8T&hoV@U{zG@I;@L;f zt3n|wc~|j1*$iN$@hqp&MF;IkUs+^D#dmldxmIJ}V#X%j;t+G?ckgr=o3__drSS{@ zUHSvWTY(E=`$39xW;amX=^a>oEZC@Swz8d25&3PKR_xM@R*%RYxd>OhuhB6vNjH*e zc3+PZpFd05ceh!;lGcYak6=L@3^G=&f z;tk^2a2BzWcz}dT>G#4(M;krP8;d>Kc3S1TrFx@om*{y?IB@M#ELfHcsbknOt=9AIjWukYvR)Y76v?DO{YR?^uM_u$L)OtKv}%tfiOHY_-EHFmj8cO%$k-@9H~L@y!8^$NG+E z@3^HUSi`Hf^kfKUjS)E8I)HFXw%JDC6j`_-A>oEEDA_CPksyJn6i0nu;M&&vU|TXz zcDYOxzz*KtRNFE2k1|gD>J&kD)MrTD`-dvLdXtU_eq~+ZNshQrSaL5RT_8;dd3!34# zhL`gc4a$f&3kucv&uL#2*xN;VZgkr5ncpjx%$NZmz{IHR!1@@qHr5_s=%&O*H%|VuYUu48F zlG~E~5ZyqV7eu7wF;o-qWw#RvbnxEnZDsjypPun|yd{r}FukAIjiTN(pEaPuY88x! zHNBg&NGX!X>wJ(pQwCU$4~mrm0_raAqRXqzHS2Y2t0YMIN5_KIGO{@Q1Q779318uJ z`Y3hBrp!#`s?z2+rKbD9^Pz_HoR?%}cL7A2TCY5|Z}$?lxp8~oD*KFrGNm#!Jy7_J zk)10My0?`?uf7tla)n9AeP)JPRh80L(nF=~bYnp+oQnW(yykASYUlDMkRd8k9$Rh!7 zV_UA$-(1a%UCjkeoz34KfKQyCc-Xi&**JN=aPbOq0|j}xSvWZbIXQjn!p;6KfW4!c zwFUV94|sRLweSXD{GSZ2*7oKuuEzGD{|CeKM$h$slBkz+A-rJ({)4eLH5D{<1c9Bc zEv;MupZ|NJVl-u<;sOE%sN~E&?95$V+0=|pZH=AHs6IQ|gNz-(_u63oHxBCma+sOB zm^xd7T&*1)04^G`l2r22pZU0ee0*%5*txXJmt^09>HiySZ|vY^VQlK^=4|c^cnhSm za&-j>a&UNfc(7ZWo3fi)kwE}TZwUVXK{%S3+x_p*{~@K4GPf{xvvZ~TPc~CWJ4ZKX fDi@HksW}xJ)qmbVN>i@*jp7ZYB2^)26!^aYkBR7I literal 0 HcmV?d00001