From f589041208ce137a7343677d19389ae2edb8b471 Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 12:44:46 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- .dockerignore | 5 + .env.example | 71 + .github/workflows/build.yml | 124 ++ .gitignore | 192 +++ .vscode/settings.json | 11 + Dockerfile | 89 ++ LICENSE | 21 + README.md | 151 ++ README.wehub.md | 7 + SECURITY.md | 19 + assets/examples/test.png | Bin 0 -> 422822 bytes assets/web-ui.png | Bin 0 -> 24513 bytes docker-compose.yml | 80 ++ requirements.txt | 10 + src/__init__.py | 0 src/agent/__init__.py | 0 src/agent/browser_use/browser_use_agent.py | 169 +++ .../deep_research/deep_research_agent.py | 1261 +++++++++++++++++ src/browser/__init__.py | 0 src/browser/custom_browser.py | 109 ++ src/browser/custom_context.py | 22 + src/controller/__init__.py | 0 src/controller/custom_controller.py | 182 +++ src/utils/__init__.py | 0 src/utils/config.py | 100 ++ src/utils/llm_provider.py | 355 +++++ src/utils/mcp_client.py | 254 ++++ src/utils/utils.py | 39 + src/webui/__init__.py | 0 src/webui/components/__init__.py | 0 src/webui/components/agent_settings_tab.py | 269 ++++ src/webui/components/browser_settings_tab.py | 161 +++ src/webui/components/browser_use_agent_tab.py | 1080 ++++++++++++++ .../components/deep_research_agent_tab.py | 457 ++++++ src/webui/components/load_save_config_tab.py | 50 + src/webui/interface.py | 95 ++ src/webui/webui_manager.py | 122 ++ supervisord.conf | 80 ++ tests/test_agents.py | 400 ++++++ tests/test_controller.py | 131 ++ tests/test_llm_api.py | 159 +++ tests/test_playwright.py | 31 + webui.py | 19 + 43 files changed, 6325 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .github/workflows/build.yml create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 README.md create mode 100644 README.wehub.md create mode 100644 SECURITY.md create mode 100644 assets/examples/test.png create mode 100644 assets/web-ui.png create mode 100644 docker-compose.yml create mode 100644 requirements.txt create mode 100644 src/__init__.py create mode 100644 src/agent/__init__.py create mode 100644 src/agent/browser_use/browser_use_agent.py create mode 100644 src/agent/deep_research/deep_research_agent.py create mode 100644 src/browser/__init__.py create mode 100644 src/browser/custom_browser.py create mode 100644 src/browser/custom_context.py create mode 100644 src/controller/__init__.py create mode 100644 src/controller/custom_controller.py create mode 100644 src/utils/__init__.py create mode 100644 src/utils/config.py create mode 100644 src/utils/llm_provider.py create mode 100644 src/utils/mcp_client.py create mode 100644 src/utils/utils.py create mode 100644 src/webui/__init__.py create mode 100644 src/webui/components/__init__.py create mode 100644 src/webui/components/agent_settings_tab.py create mode 100644 src/webui/components/browser_settings_tab.py create mode 100644 src/webui/components/browser_use_agent_tab.py create mode 100644 src/webui/components/deep_research_agent_tab.py create mode 100644 src/webui/components/load_save_config_tab.py create mode 100644 src/webui/interface.py create mode 100644 src/webui/webui_manager.py create mode 100644 supervisord.conf create mode 100644 tests/test_agents.py create mode 100644 tests/test_controller.py create mode 100644 tests/test_llm_api.py create mode 100644 tests/test_playwright.py create mode 100644 webui.py diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..140fab3 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +data +tmp +results + +.env \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..000f11c --- /dev/null +++ b/.env.example @@ -0,0 +1,71 @@ +OPENAI_ENDPOINT=https://api.openai.com/v1 +OPENAI_API_KEY= + +ANTHROPIC_API_KEY= +ANTHROPIC_ENDPOINT=https://api.anthropic.com + +GOOGLE_API_KEY= + +AZURE_OPENAI_ENDPOINT= +AZURE_OPENAI_API_KEY= +AZURE_OPENAI_API_VERSION=2025-01-01-preview + +DEEPSEEK_ENDPOINT=https://api.deepseek.com +DEEPSEEK_API_KEY= + +MISTRAL_API_KEY= +MISTRAL_ENDPOINT=https://api.mistral.ai/v1 + +OLLAMA_ENDPOINT=http://localhost:11434 + +ALIBABA_ENDPOINT=https://dashscope.aliyuncs.com/compatible-mode/v1 +ALIBABA_API_KEY= + +MODELSCOPE_ENDPOINT=https://api-inference.modelscope.cn/v1 +MODELSCOPE_API_KEY= + +MOONSHOT_ENDPOINT=https://api.moonshot.cn/v1 +MOONSHOT_API_KEY= + +UNBOUND_ENDPOINT=https://api.getunbound.ai +UNBOUND_API_KEY= + +SiliconFLOW_ENDPOINT=https://api.siliconflow.cn/v1/ +SiliconFLOW_API_KEY= + +IBM_ENDPOINT=https://us-south.ml.cloud.ibm.com +IBM_API_KEY= +IBM_PROJECT_ID= + +GROK_ENDPOINT="https://api.x.ai/v1" +GROK_API_KEY= + +#set default LLM +DEFAULT_LLM=openai + + +# Set to false to disable anonymized telemetry +ANONYMIZED_TELEMETRY=false + +# LogLevel: Set to debug to enable verbose logging, set to result to get results only. Available: result | debug | info +BROWSER_USE_LOGGING_LEVEL=info + +# Browser settings +BROWSER_PATH= +BROWSER_USER_DATA= +BROWSER_DEBUGGING_PORT=9222 +BROWSER_DEBUGGING_HOST=localhost +# Set to true to keep browser open between AI tasks +KEEP_BROWSER_OPEN=true +USE_OWN_BROWSER=false +BROWSER_CDP= +# Display settings +# Format: WIDTHxHEIGHTxDEPTH +RESOLUTION=1920x1080x24 +# Width in pixels +RESOLUTION_WIDTH=1920 +# Height in pixels +RESOLUTION_HEIGHT=1080 + +# VNC settings +VNC_PASSWORD=youvncpassword diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..87b4173 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,124 @@ +name: Build Docker Image + +on: + release: + types: [published] + push: + branches: [main] + +env: + GITHUB_CR_REPO: ghcr.io/${{ github.repository }} + +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + platform: + - linux/amd64 + - linux/arm64 + steps: + - name: Prepare + run: | + platform=${{ matrix.platform }} + echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.GITHUB_CR_REPO }} + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push by digest + id: build + uses: docker/build-push-action@v6 + with: + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + tags: | + ${{ env.GITHUB_CR_REPO }} + build-args: | + TARGETPLATFORM=${{ matrix.platform }} + outputs: type=image,push-by-digest=true,name-canonical=true,push=true + + - name: Export digest + run: | + mkdir -p ${{ runner.temp }}/digests + digest="${{ steps.build.outputs.digest }}" + touch "${{ runner.temp }}/digests/${digest#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4 + with: + name: digests-${{ env.PLATFORM_PAIR }} + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 + + merge: + runs-on: ubuntu-latest + needs: + - build + steps: + - name: Download digests + uses: actions/download-artifact@v4 + with: + path: ${{ runner.temp }}/digests + pattern: digests-* + merge-multiple: true + + - name: Login to GHCR + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v5 + with: + images: | + ${{ env.GITHUB_CR_REPO }} + tags: | + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}} + + - name: Docker tags + run: | + tags=$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") + if [ -z "$tags" ]; then + echo "DOCKER_METADATA_OUTPUT_VERSION=${{ github.ref_name }}" >> $GITHUB_ENV + tags="-t ${{ env.GITHUB_CR_REPO }}:${{ github.ref_name }}" + fi + echo "DOCKER_METADATA_TAGS=$tags" >> $GITHUB_ENV + + - name: Create manifest list and push + working-directory: ${{ runner.temp }}/digests + run: | + docker buildx imagetools create ${{ env.DOCKER_METADATA_TAGS }} \ + $(printf '${{ env.GITHUB_CR_REPO }}@sha256:%s ' *) + + - name: Inspect image + run: | + docker buildx imagetools inspect ${{ env.GITHUB_CR_REPO }}:${{ env.DOCKER_METADATA_OUTPUT_VERSION }} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a7a55cd --- /dev/null +++ b/.gitignore @@ -0,0 +1,192 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/latest/usage/project/#working-with-version-control +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +test_env/ +myenv + + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ +temp +tmp + + +.DS_Store + +private_example.py +private_example + +browser_cookies.json +cookies.json +AgentHistory.json +cv_04_24.pdf +AgentHistoryList.json +*.gif + +# For Sharing (.pem files) +.gradio/ + +# For Docker +data/ + +# For Config Files (Current Settings) +.config.pkl +*.pdf + +workflow \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8b09300 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "python.analysis.typeCheckingMode": "basic", + "[python]": { + "editor.defaultFormatter": "charliermarsh.ruff", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.fixAll.ruff": "explicit", + "source.organizeImports.ruff": "explicit" + } + } +} diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..d093f82 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,89 @@ +FROM python:3.11-slim-bookworm + +# Set platform for multi-arch builds (Docker Buildx will set this) +ARG TARGETPLATFORM +ARG NODE_MAJOR=20 + +# Install system dependencies (removed libgconf-2-4) +RUN apt-get update && apt-get install -y \ + wget \ + netcat-traditional \ + gnupg \ + curl \ + unzip \ + xvfb \ + libxss1 \ + libnss3 \ + libnspr4 \ + libasound2 \ + libatk1.0-0 \ + libatk-bridge2.0-0 \ + libcups2 \ + libdbus-1-3 \ + libdrm2 \ + libgbm1 \ + libgtk-3-0 \ + libxcomposite1 \ + libxdamage1 \ + libxfixes3 \ + libxrandr2 \ + xdg-utils \ + fonts-liberation \ + fonts-noto-color-emoji \ + fonts-unifont \ + dbus \ + xauth \ + x11vnc \ + tigervnc-tools \ + supervisor \ + net-tools \ + procps \ + git \ + python3-numpy \ + fontconfig \ + fonts-dejavu \ + fonts-dejavu-core \ + fonts-dejavu-extra \ + vim \ + && rm -rf /var/lib/apt/lists/* + +# Install noVNC +RUN git clone https://github.com/novnc/noVNC.git /opt/novnc \ + && git clone https://github.com/novnc/websockify /opt/novnc/utils/websockify \ + && ln -s /opt/novnc/vnc.html /opt/novnc/index.html + +# Install Node.js using NodeSource PPA +RUN mkdir -p /etc/apt/keyrings \ + && curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \ + && echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \ + && apt-get update \ + && apt-get install -y nodejs \ + && rm -rf /var/lib/apt/lists/* + +# Verify Node.js and npm installation +RUN node -v && npm -v && npx -v + +# Set up working directory +WORKDIR /app + +# Copy requirements and install Python dependencies +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +# Playwright setup +ENV PLAYWRIGHT_BROWSERS_PATH=/ms-browsers +RUN mkdir -p $PLAYWRIGHT_BROWSERS_PATH + +# Install Chromium via Playwright without --with-deps +RUN PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=0 playwright install chromium + +# Copy application code +COPY . . + +# Set up supervisor configuration +RUN mkdir -p /var/log/supervisor +COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf + +EXPOSE 7788 6080 5901 9222 + +CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d77a86e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Browser Use Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..e5a24ea --- /dev/null +++ b/README.md @@ -0,0 +1,151 @@ +Browser Use Web UI + +
+ +[![GitHub stars](https://img.shields.io/github/stars/browser-use/web-ui?style=social)](https://github.com/browser-use/web-ui/stargazers) +[![Discord](https://img.shields.io/discord/1303749220842340412?color=7289DA&label=Discord&logo=discord&logoColor=white)](https://link.browser-use.com/discord) +[![Documentation](https://img.shields.io/badge/Documentation-📕-blue)](https://docs.browser-use.com) +[![WarmShao](https://img.shields.io/twitter/follow/warmshao?style=social)](https://x.com/warmshao) + +This project builds upon the foundation of the [browser-use](https://github.com/browser-use/browser-use), which is designed to make websites accessible for AI agents. + +We would like to officially thank [WarmShao](https://github.com/warmshao) for his contribution to this project. + +**WebUI:** is built on Gradio and supports most of `browser-use` functionalities. This UI is designed to be user-friendly and enables easy interaction with the browser agent. + +**Expanded LLM Support:** We've integrated support for various Large Language Models (LLMs), including: Google, OpenAI, Azure OpenAI, Anthropic, DeepSeek, Ollama etc. And we plan to add support for even more models in the future. + +**Custom Browser Support:** You can use your own browser with our tool, eliminating the need to re-login to sites or deal with other authentication challenges. This feature also supports high-definition screen recording. + +**Persistent Browser Sessions:** You can choose to keep the browser window open between AI tasks, allowing you to see the complete history and state of AI interactions. + + + +## Installation Guide + +### Option 1: Local Installation + +Read the [quickstart guide](https://docs.browser-use.com/quickstart#prepare-the-environment) or follow the steps below to get started. + +#### Step 1: Clone the Repository +```bash +git clone https://github.com/browser-use/web-ui.git +cd web-ui +``` + +#### Step 2: Set Up Python Environment +We recommend using [uv](https://docs.astral.sh/uv/) for managing the Python environment. + +Using uv (recommended): +```bash +uv venv --python 3.11 +``` + +Activate the virtual environment: +- Windows (Command Prompt): +```cmd +.venv\Scripts\activate +``` +- Windows (PowerShell): +```powershell +.\.venv\Scripts\Activate.ps1 +``` +- macOS/Linux: +```bash +source .venv/bin/activate +``` + +#### Step 3: Install Dependencies +Install Python packages: +```bash +uv pip install -r requirements.txt +``` + +Install Browsers in playwright. +```bash +playwright install --with-deps +``` +Or you can install specific browsers by running: +```bash +playwright install chromium --with-deps +``` + +#### Step 4: Configure Environment +1. Create a copy of the example environment file: +- Windows (Command Prompt): +```bash +copy .env.example .env +``` +- macOS/Linux/Windows (PowerShell): +```bash +cp .env.example .env +``` +2. Open `.env` in your preferred text editor and add your API keys and other settings + +#### Step 5: Enjoy the web-ui +1. **Run the WebUI:** + ```bash + python webui.py --ip 127.0.0.1 --port 7788 + ``` +2. **Access the WebUI:** Open your web browser and navigate to `http://127.0.0.1:7788`. +3. **Using Your Own Browser(Optional):** + - Set `BROWSER_PATH` to the executable path of your browser and `BROWSER_USER_DATA` to the user data directory of your browser. Leave `BROWSER_USER_DATA` empty if you want to use local user data. + - Windows + ```env + BROWSER_PATH="C:\Program Files\Google\Chrome\Application\chrome.exe" + BROWSER_USER_DATA="C:\Users\YourUsername\AppData\Local\Google\Chrome\User Data" + ``` + > Note: Replace `YourUsername` with your actual Windows username for Windows systems. + - Mac + ```env + BROWSER_PATH="/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" + BROWSER_USER_DATA="/Users/YourUsername/Library/Application Support/Google/Chrome" + ``` + - Close all Chrome windows + - Open the WebUI in a non-Chrome browser, such as Firefox or Edge. This is important because the persistent browser context will use the Chrome data when running the agent. + - Check the "Use Own Browser" option within the Browser Settings. + +### Option 2: Docker Installation + +#### Prerequisites +- Docker and Docker Compose installed + - [Docker Desktop](https://www.docker.com/products/docker-desktop/) (For Windows/macOS) + - [Docker Engine](https://docs.docker.com/engine/install/) and [Docker Compose](https://docs.docker.com/compose/install/) (For Linux) + +#### Step 1: Clone the Repository +```bash +git clone https://github.com/browser-use/web-ui.git +cd web-ui +``` + +#### Step 2: Configure Environment +1. Create a copy of the example environment file: +- Windows (Command Prompt): +```bash +copy .env.example .env +``` +- macOS/Linux/Windows (PowerShell): +```bash +cp .env.example .env +``` +2. Open `.env` in your preferred text editor and add your API keys and other settings + +#### Step 3: Docker Build and Run +```bash +docker compose up --build +``` +For ARM64 systems (e.g., Apple Silicon Macs), please run follow command: +```bash +TARGETPLATFORM=linux/arm64 docker compose up --build +``` + +#### Step 4: Enjoy the web-ui and vnc +- Web-UI: Open `http://localhost:7788` in your browser +- VNC Viewer (for watching browser interactions): Open `http://localhost:6080/vnc.html` + - Default VNC password: "youvncpassword" + - Can be changed by setting `VNC_PASSWORD` in your `.env` file + +## Changelog +- [x] **2025/01/26:** Thanks to @vvincent1234. Now browser-use-webui can combine with DeepSeek-r1 to engage in deep thinking! +- [x] **2025/01/10:** Thanks to @casistack. Now we have Docker Setup option and also Support keep browser open between tasks.[Video tutorial demo](https://github.com/browser-use/web-ui/issues/1#issuecomment-2582511750). +- [x] **2025/01/06:** Thanks to @richard-devbot. A New and Well-Designed WebUI is released. [Video tutorial demo](https://github.com/warmshao/browser-use-webui/issues/1#issuecomment-2573393113). diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..bae17b9 --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub 来源说明 + +- 原始项目:`browser-use/web-ui` +- 原始仓库:https://github.com/browser-use/web-ui +- 导入方式:上游默认分支的最新快照 +- 原作者、版权和许可证信息以原始仓库及本仓库 LICENSE 为准 +- 本文件仅用于记录来源,不代表 WeHub 是原项目作者 diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..f6c3df8 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,19 @@ +## Reporting Security Issues + +If you believe you have found a security vulnerability in browser-use, please report it through coordinated disclosure. + +**Please do not report security vulnerabilities through the repository issues, discussions, or pull requests.** + +Instead, please open a new [Github security advisory](https://github.com/browser-use/web-ui/security/advisories/new). + +Please include as much of the information listed below as you can to help me better understand and resolve the issue: + +* The type of issue (e.g., buffer overflow, SQL injection, or cross-site scripting) +* Full paths of source file(s) related to the manifestation of the issue +* The location of the affected source code (tag/branch/commit or direct URL) +* Any special configuration required to reproduce the issue +* Step-by-step instructions to reproduce the issue +* Proof-of-concept or exploit code (if possible) +* Impact of the issue, including how an attacker might exploit the issue + +This information will help me triage your report more quickly. diff --git a/assets/examples/test.png b/assets/examples/test.png new file mode 100644 index 0000000000000000000000000000000000000000..4e3ae5e2ede6eeea86a010d0e242a72c72528ea7 GIT binary patch literal 422822 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

iQ@`q&Z=cWu{{G3jF?M!#X6JG^@-P4 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Ξ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

i?W0Zp6cuQoi@0+@abgRak_}B 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

Z6{cYq2;} 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�vr4V-ooGkAc@fA_GKdC?o31sJTd;lk6m1mp9 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

{Cl={R=?V0YlKvwkNLI_6J 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 z z%CL_&alVE^_lk4yjefgn}>rrX#pPI_dn4 zm{OTH;CHw8z49B|i>MEnj~yf*x%U5_8u910nk^&6xUl&hqIp9%C+*q%OK%Ih9LG=s zE7KR0I7!mm5h*d**uha!jUV;=dE)(sXEq)D6^rYP2a z(q7{;I87A`aP}v`=^2^54##Uf!@SI2!(sQE#$*j128a%#w01U4mj&!@kxe-HJZsG^ zc=&~Egp36%F`C=^8dpBeNhIIl6s>P>Ny8+tTPxgZRf>QImJ$2ON%9K}A+-2FRwImv z%o_0x^4gS$N!&Badi}+`b_h#^Q@wo{9Am0U=SMJB|Fz?9UKhy0_kKquC6Q~^Fnvwt z-JNa|yRP-U#E<)W} zP2|CdgNT{SPo421IuKKNl>Vv_yK>Az(BO4N_%w+rHDnega)W8dzz zy?70l&%maK?hZ#-59bHZ7p@RNlmN^y%e7KWsQsYZjBMJTxbq*-t+xNq6=4^^oAqK& z<>ogacXo4NQ%Z7UV7*kAmI)K8f>`I51ux>Q6>PQd3fH{v;& zz26;(<0BQI0<}&t!djS>65UXU9rEfO)Cs4STK3!ZG;CUHEaCB~v>VchzP6ngCRD}$ zoEx^KJ8ZII{Pm_hLs5`Z9J^P+8@sh>kYpWRcjb>ZHQ&J$_ZZ}STC!d}ZY#fG7JkKc z(6UY1?%x{U<6dx$veq~^g-G!FUXa^AwqH1)CjH3W$Nq~2^v(sOMozG5w`b}69b)54G1VizL z3zmn12!A*dPuQ3qI|D$oMuTV8uK^0^i(&$d&RPZQSGMP6d?_k|F@)!$Lq$h=t>LbsaQQGnMQh7*R~kZDXm7z(({>Oe1iC!UnSebbObA9kMH0F2WEy$z|b>${0k$ z<`4IDAc@SZ1dD`SGz@13f;&HR$O&fewi^k~$iTxJGe4M_Vo zW@PNz$5jh#g-@HndHc>kNR-~6UWjsglpI|I01X(!45pxV8f4go{5sr3j zo{Gvi9|3G(iQK)fpkRlpXOPb&=zFMAm}qI66M|~>`S+S9&gckQQTfvNktn!2S^-x41mDWxDR3s& zr3xX*dMg?d@R@jr7=?pz%b!yft|8 zht0uJW7zalyApa@wwsXh^9U3~s~WhtneIoBc?jqU7WIKYYgtlOr6u_<0`UKTzwG#G z%ncRj5$Z&x0r79X&SE4HW|B`jOJA>~s0`wGH|W&(1)F;GTtlXv#a~e>4>^Z6mJc&0izrolBi!S)!k0DdW0u=MVos_CK~X1qSowgi4_C3(%jb7Qh-WhefLIXmfC zDH_~>ed0BOo<#XI20XBYzV(7~t|CUnyefq|CvyyBud?FkBCL(nN%_@bg}E}bw1J21 z7a$yL3^Fs(-y9O&&ejK93EMcDo3m0M4FhxoB2Mm)U{xLLm;Dh%|G6AcXs~Q2znk}y zAzxh)1a*-0F;8cZOH!4G2GrEZL+@%F&lj{QXEn-@MX3|?_P%#N?D%unr)e2JJR9x?R->5Rj7UxHA zX=_q}f32xPqS6Q9HCtsLMND1T=1iM2u?+`Kf{tz1<8%5@gm|F$T1#``tXkxrJYmM# zEK8R4LDYI6DjRC_Fo;eqh-_35e84|Nfd3Q=PNFV&H~dAC@>oTlGB>qWWa0_u>~*8=Wn`vnLCYgIIMTXgfYWpomn0Arr$5s_%`A+9BolTkPk9xn8| zoEnj5(F7nDGT3EM6pIQ9C1UOo>u;eit*@;OXqkwoxRJGGdRp6kN$9~S`9NMadMM}- zu;UAePXfHTC7m#evwapOhdF2NEt;>X{>(?UL*TPW68<%4uRrS$3 zhTCnkcHL1acpc8F zw&Aal-jr}SvQMg=R*cPu=sv-QE({|(hfBq5VeWjsm@KbFTm}IUC80a6Gdx7C=NeOe z%pnXE*o;fE_1=U!|zpGRb5Uz5n1R~@&8vAL@<&alAc_U8+kcW_MSEw zO7x2!dmFgB{I&nKxD;wsWd~eyMlrY3rF33J8dx53i4)eFIhwI^XeX6``MK~sq}}%^ z2wFd)mE^)^@_0^c!b}&_LTA_5ioK|#7P8on7xLkh2m8T)sGq@B_NnLCUs8Z>ik`eH zGnn?rwBkEt)8&gPdW~xoj8a{j5+@}GeoQz?9Y&YJi0yfNjvA{->)OacTF!hUtM1emWjKRNq=t>M0>8br+ z%Q@2Eqs-P?QbFB5hoHMMk(`{(5#_j@Nvj+F<^5H861|+`koZK2kxq+Txn<`Tznf1p zaYMrG^mDU)*~=${gP<;{^g-OpHuyEX%M{Pb8+2Uaq>YgUoXxIB1#>n?4s;V|+@K6S&Y)?Jh$7lHctLO5;1MwVnva>U3R38N1GWeqoiZVV@Bivz|gvwAyj!CMK%E7cEgxLl}O(R#Aoz|jraHWn>YWaEu5D; zH?64xdB}R=|LZUnP&M;aH2RPVDN4@1*tcq8*v2r+#{CKt{6NGkzU)D=@axu~GiJVK zH1Zt@Gh5Cl5}w9jGsuZ#WQZj$>8q`7+Rks8M|~-d4lcKfB?u*FuRypFozGOdb~aY4 zXF^FpL5c8TMNNp4B;Kv2OHhHNCX5!ntxx<-GiWwHCWW16c<~#%O!IMdXvKRONJ>gt zdt7fk&-Y?<$`_gT6V-Gcw1VMLWdQZzds1Duq=31}^~=}(z6}3ueD&8<$bnSWK228v z1KMbnhWD6Rv$=fDvlkt~m>6ZMr4$RiXfQq&rt=z|AcHCP89yo+M2K2tSsp6ROgpp6 zKo`4ajVdco z8AsN!!E7MT|0CPfo6TNGD?nCMZl}c$9xnuqEx%6iLImFwg|Hl@K^Y7l_VQoqS{<_s zCyNbTo-U6Wxx~kZ>W*hxs#9-X!#4%Vy3$p`9}+fZMC&$w!YWwe9w)bd^}T`<9!4IS ze-e~UFdsAiwrR1&Y-i+*SrErPCGb6m-JaKOJix&X+z;GG7(=;>C*s#TRdOwbRnzXC z6GB&#QO@%s!xxmxDRuvTOp2k5B`0Rc1*zD#*|!N5iW-=-yL?1JRung`sUa^dE4vyo zPoV_;@Dw7`c`e9*uK1W9(Xw#PcJyeG>jyA2Yd%C9Gjng26V+EUI`gm7^mGumK%3c$ z-Knd3?=`cq1kgGXKU`_H8vl_~(U$-7>^C+lpJVuEXwJEeBTBklg98IGu+DR4H_m5O={D_yNbkdt5PF>2_N;1AePXYV0VB+Q^1boCgsh^B>WjpD;0D=*98@Mv=C{WW4L8HDLg+B^<|`|I~V5xa4>KE~sbgDsER60J7;(*fW7xy%& zJ)I9vGrfW^yAaPBWe7S82s}Qpa|>W{Do8G2rlUm2xCGNqdEAADc+L-*Vqy$qfr~WA zwWV~-GsbOAUb+XQ?dUnj+oV-AD^dMei3wxs;hkL&H=?T|=JW`v&gLW+9W6hp{-xLY zbpL9`RZt|=++Js=r6tEM`|VnVTZ-vf(mdMH4wjky8phh=>L5A^oZ^HR>n7-}(-);^ z0%H{Q%GNzXEw)$D(^OXy`|JiGk9VAixGQ;KSNGB_j~5{{5ZW0uB`90I+7pjc|CJ-q zne=zY>)rZ02s`~Rreoqx*ks^}8LV|0|9;3*GWn&dKG^Y5k408)oeBg-E?)5G=$&!t zADQ|eH>L4k-D=YBO2A{R_yhhFy8?|m+twklS<0e)0qfoaQ)XMV?{@#N{fQ0;!byBP zpDn$rKnvghbWy4_Jq+&z4dxsN6D@tq*OL=GeD#lu)}|7(2XwQ}May|YA-_4`&~Aqv z-y4o!t&NN4-BS6yojz%1Z$QI8iEf@+dvyGjfF8C)cx|KZz9THId1+%fm|S%`z#xIk z%nY*6bWP=udLL7w-`M)O&Zr28K3QXShuY5Nh6f(v6<3evbiyc<_Cs2qoPMt=pKa{> zbKb7cEcZ(*p!FZ2!^kn@;(x}NTF0pv@yA|0KLRPt#oSdWW1&-agK#x2X9uH1<(2sE zuPC!3i6v3v!m^-3Oqv4T4u}^R3poKVBm-^v?_i++%pWi5Q4w zGhV^X%n)Xlg~3vl*1mL)&hDW!|Cp1l!Jq?JRvVr@z-Zi^9+EKd1bf@pvDw_$k!lNqrwL+Z*1%qC$> zNeg|&QE+k-WTq*19lDJg92oSzt|^-Ug+(bpX8ZhBK*HCpfr#@b|0colB992%3}1OV zj0C8g9C(@Hn|q_1Jk%-gMH|NMp8--|Y!n~A>ZplwfGLq%QHTtu!47*WlCI_!O>mO* z9gtwMsxQ`NNLPNE7q}qYT7{^MY=f~K%&-Pd?krW7#1VU_H%_NmfTHG)x+G8S7@}M* zqHp}fBI6bj`oA-=^~53!Xs(kXl_oy1Qy5T&#Opx)Ls|Z(D`{>4<7@+^!$3to()+LoAP_>Ck8LD6=IWmHX!x- zcecCrt>3U(GP$BwU6^Vd54~l4{CVd*@JdWWqz&aYr-y7`b;SPx%<7d;ZrSlHj22(b zgDN#QCUbs;$(W>)`F4qlRHkX03N=Hpak0a$l=7ov^9*6#%zTEvb=@;C;;^N-b;lrk zFc31j0~hj~&q7>73vPZ=HBA^BCRNG?WijT8D)%cDA|grzGV&=|eojmr{jI=RqG;$N z%PjGjY`Vsq9v(`hCd$KteMh+Crd)l=|N27+jOi?$?mQyuH^ zF*u5}UFX}#zFgLf3WbC)NHpO}Cvl{KC0fMAWfAgG35BW;-4CH>7DmOc=80H(g(31_ z#z5Pz_66(f`wE;wW{xO$7yQdD{9n6(01V+)o@yXCfpntFVTD4%s7YcwmYQ@KBpfS= z-gp6H{k*BLzbBc36%4Vz5a5^&B5=4Z;vjwX=-Dt5W{WAA`}n32ik+rZE`a;Ph3%M zkMEUP_r|O@G|69?|66aZ@BXjIwuAqtbia;zDg!2W2PjLN0ePjY^7j0$kMJQ-99)^)b>7;YjYTMVKh6pWjnwJb_;p15l8tWaYY^sTw-1X&B-WJ_RRRp1 zD7+Za62y!IE=QAHGT2f8+2~kYRn8)~;s58{7>>Dty733ovYAzw-yf{VNsUnxn#wSS~yl7#!q&idU*hrs$4{ zp1kF83z<xINXBmh&mX06flJh#WrhdO*7QSH!Io_25dbjt!suIWu+hoCJaK2qP*{I-?8p!qCEo&+0K1OFRx2l+rE{E*DkSIDZl`E6o2sEC% zJ7~#fbP1tlesrQbCcQmBEn)rP@Ro}Q;m?&;nm5)J{&6)8r!&~|kCO{`15tDjAXVA> zz--yWq13S9eHegQT9mIonZfP)9@rOIr`Ky?*vVZV9DW#E^5f2`-hXY^&7Z=WGuJVa zn5{iArL6`q3gw3NQ1Yr%*C;DJ{SfP3_9Nd>p3;}0N_J7)p#Fj%JpAwTAzoebpJ+L! zbnyMNSV^lvK2V&L$CigQ6FzD0OD@WdlpJRGXKHy-Wr?+Sz{TsU_3rvrAZh{;EK;aH zlW2Q9rd7qz)d_qn2KeSj`@$C;hFoglN-@d1NW~fWb}f`R|n7(K&5J?)wp9x?dBM5ld=7{-@msCQpJ zfg}9T!WU{kTS4tlqJ~g@2qY;8F<6(@me9ig^XIvt|DAGB_}WP$MRRzV9HEU4DYQpr zIoKw-)9UzEAc0;!>zKug4Q>Q7$ne;aetBvAl0~y`VKZy=lOL55dg-eiuO6EAntdzL zHm%U(QD=+u1MvE?znb$bHaxZ4mz>KTrt!pJkIRptcIm3LbLr}R_`|#Jn_tTRE&%wK zW5oY43#$>dHhRdB`zkh^}MR8YL)-kLQq z%)wZ%?D<>XS2d1ZL%H*M0njqhTuwTm^qoJ{_4S>3;Bm|}qO1(2S1)Iq{hh?V0*w=Pn769HZX@o5;tIYS@`klG)oi* zb8^GQ;Cxe0Ir)9OL2-|Bh2CwFNH&~SFQ(6e<8^B9RCL7|n-r^`c>K7d`8}=h+}7f7 zWyxZtjVL3gp4qxnVr%k#j53*R$!H_m-0AB-CT(!lgyTNlZ>o^g6L(1kZ!w*ZDf;-Y zLSW>NlZXq8w$0HgmYG{O5Bw1oETeKx-p19EF?6@yN^HiRK;l!Kj7VH_TRNx0-FmF58w#94{SL3Zhc++ z{f+OItPh*3u?n6q*c|+vP%b@Lm!Abo2wg7s?ML1Y@uYKZY z{uY(0KO`XZH?kM2=}TM@G4YMjqYB#E+rt;54PSu6Q?b9ez8M)0tONhOL!bCERvN7*gxPnE4p~MO|S}Q$R2EWa)Ip)h!7&b3R#wiTgh`QbT?ct!#-3pHZ`zUcdRQ25Yd*jr)@f=*0QS*#@_jBP+G-z1&~tJu1-Aq z1^e|ftMd)-q$^(7mr5!JJMaP1RqGb%4r1?Tr z%cAD{CPjqD6Z7=1u@G!XAw7bOM;U&+HHhLh z&AAml$$fPt)iYYPlX$(TqbL9T?5^P9RJ}vU>X#JOpGHki z&@t*C)uXoGffqUKNtZXuAhEy!2_l>V=W6DymDG}hlRYj2TQ6tA;CLO@T!9Dq-o8*H zwUN0vxj|X^wDaxIz@3xA(8GE4iYzRO7yh%KP4puB251R`0#eoPD1uW2(<$hNXJwjV zgXDWHCwY;RKDYpCJA+B9yzBkVqag6+hixJ!;gyGsdG4ODBqB0`NvTikz6}unHRHW&eOx8Q_YWzfVr zt+vzMt|XFKg*vuaN~m3BV-OpD+V9xJG$Und2CBzfLsD3T)oN$>poDb1DRNy)bV@y! zOaHU z`Y_r3&CAqP#S>$&r@=TK<>+S`y`N#eLPV(l4V0am*KYZH;g@}0Iwv%S{hJPS!>J3? z>P8>!ZK}-AXDgmE(q0EUXU8NP%~Yhwur;<0JizPh+{dvzf)%N)x?K0ij z*`dA;l|A-bA9$&`&;u_Ba!+eU^bJpVjuW#s(R)DEOWqzk+>k2=l&TX;nF5s74$G~d zY#*D7&vc>bW7!V^x&faJE|oZS$1+Xse9fKd z-{_5wI%gMxe?;uB?pU-^SG5)WeNw9Nn$}0Xq$550!-bGs7s~Nq9Qbh*2!eSS@Rfgu zT&zkNAdPHnuHec?Zf1m{@WH7+lPZ{2N6Squm62Td>kPGny*x$9&nOiFq95@ko4TFy z*IAjeYV(uPuvoVa;Wb%X#J8}Bfd8?U*d8b7M+#Yc?z8^-KGi#=xXz=}w_t(4%cX6Q z$zVmK-s~?FjZe|A8}z0$C93J) z@Bb7;UBOKW{s&jF^b=cVYf)uJ^Crgp>D9!xAw1AYNrpCZ z&auwqu`sq9av*8N$i%xUBekaGQ~J(=N9VR*+_szzNIE zl|^_Lb(dg@Ey_>MK{BPMboJX`YL~t6JPA&$ zwugmdKIR>zepT@>9cLusqz|-;f7*ERY6urwFcuD!0fF|$psq6qN2$oNLHt#=*AMyy z2hHhq)wz^Gj&bJaxCRIs{zVew@Wq0OA<8O$LVe%k8Y-U`+6=NQW`f84&+Z7eO;qp*je{`>bPJ2zgWvDh>HVASJK`*Oxu^+O z&|958iP@i(%+W2(B9V|prws(P0x{5A#zfQRbdjs58Rlg9_PfSL-Io22nY%jo{R%Ma zF(dp00{0S|vG#K@kHr3AHp-VK$yjE|_kP7LxVm&<4`lZtSD!((oMBmm&|Kg9|JFr6 zO=JGiS+_ItL#;=fnPlkaspir*2$d2EZHf{PSbY*;C zg${4*w-=7+CB%1^S`alF;$GmN>Xu&p2R4g85Czy$dj55GDckJ|9>*Zmcj!{4`hp050R zh_X(nuRm0%Usl<7$CUQh+BcRe-1QqiG6o))&Q<^`uB5D5v&H7;Ay$rQK3hML-0Z1C z{x)83){qn2!00FqPMS^SIZBzC^={zd>Ook=lD!<5@`amLh`es8D2~e$4+J|tdjOta z+E{;NzzQ+4!JILvw)owaQmu8$b$Z3s&L!xzHbwc5gmKbud%hKq+!g+pT#A;0#xwoW8*XLwb5RU;xt*%9 zHZL?GK36|z|I6PVWKGhiYv!+BD44BYE5p8VRr>U(euT%Ao%V)9n4oygurZTb)}?Te zmK3$gB`<26q8*zxo@ILCHoD}Zzf^^yI#UFWI~duH1krE!7Q|{=l-A(y zo=0u>zA}tVInCBFtu;Z*G!17J_^cV{0;?J7o@N00a*|rmd{0~e*U^n!IjlwkPnmV8!hDzZP-2GkSf=YGgYvDpGE8Qo6Hv$Bj7`%HtR-%S05!KdZt?3p zHnW6@77kDo*?l0WUzfLD`k~_XKTgB>mRetTR(r#~x@Dach|@$Qy^z6cNj$ta4ZLo; zP9z}Xwpw)J~IJ2Pa=(_P-<}j*x{k60w_@DZ<*uQ1WRc5Aj*HrE`k^5!!8eq#7p)*n;8p@{J8=Pfq65Lx6{Se>!wHoE$LVmyfue$4czp>GR zvFD7WbbXKs2}s_0^}KNh)|pr{@5*s$Ks$a1mEVu^$@}5AKVCJ5Aag`bYRv_o?z>mR zMR5!3-w$GCS&V2Bb2$l}x({+3$WOoM$p0Z#yR6o@it8C|&D;La)ET<#;qK=rA3q|r z9!VmK{jvi{F|i8Rhx;eA=~;U|inP~Kb&jtuSb@l8Z~Uh}q@Uyj$MQw$v=fGJ>{lZj zI6<)>nD**lk^Ljw$>CP)SOx~#;$q}3);Q}Wx1}o-eGfIBTb|VhjczRhT#P_p%n@L@ zaou}&xB>L5-h5WO@x0kdgBZN~J zut~Xw7hh+yA-cR4)0?q;jGQR#{rs4%n-bVfrO#dk7i;0)&rc%Q0sLT}gm#v&;h_Ys zrb9kHYQ=8GsrQ=sDORV2w#bR#&{E2Zw~*t-*!pbuEk$~s{xM;3s|dC9jD41tXS=wz z53aNifA3|E_O^06=XUyoq^D40b_o&;>cP(8r^{u#LC+%GkTgIj?bkye-* z6P{vpA>?MB#yr)vR;K^48;48?Z2fZag46!~_#mx&5R{umC^ppaG^56=`#Xv6(#ubP zH)fACiZSnz2($wwWgPPEfpbNwm zHen#L0R)LO*7Wr3ueQH0RVX;OqBc5A+&XaR)=RUCfM#v6d*7mgs#D>+%mCLJ#vE7b z;pU>h%@Sjm2+ki#y-;%b3iN`SsCN7|IPM5i(#XN$O{BImbJvCDdb|O9sml+uG{|g+ zVS9E-*kV(DENLX)y3o-_^~}IA_2llS1^1Ivz%Or5u?A@loQnxZ8;58N??=CL_xol9 zb-z;|9N-yfl4Qb6usV@p!mRct4*RHQ&bC2T%SwVTZMo$Kg;jWuSoGRp!sPP(yUb2d^p%cUKSG0LGoZ65DQFxQb~*EbZi7=Z73xg7Y;f9*dD{I-bMM;UD@ zIaYI50@8IGpUn;B?_)N}s;QX4{vuRa=3iw)pbq*{H96>T5k zA!{PnZgR2LPY{LKfP}Z|f0TgjCd5@Byr@6d{^C{Q4kOC>E!OB^a7xR;l8*D{sg!jI zX$rZ&3M^n|Y9r3u{$kWQIW}ejWZ++AVfpN1(`%?PwOGvinMLL~z2!xh$u2 z!J15{e|^eqqceytRQDL2E@_@U%hK=<{o}%HZmJ${_-WkS>35SKzCvgOHmzM#!wX#P z#oknyeQnsO?(1y3Q|ztb2>*Z8XQ~9w3GKW0R9nm$AX$H8lJTQov7w;oaw6gQ^@;X? zM%8X*MnCG6U!p&s+)cp$neI$|CVs;`&3p^em)JDg32ZkerxY~x*rr(6$usI@I;r&J zb|Jxn>i->JnKXV;z}O-IfPnfFcL(X$*T2U(QyH!q8^hp(yvvT=_buX1*~#qa__oIp z?40~Y;6q~I!q=%@L&x|PYwC5!mOtPwY-o!{%nBS&=K;Pc}_D|Ra`WrmnRg0d!3 z4kd1g)G{@U$sG%XUE#Ah?rF}TN3@GP0q%7#HjBC;h9Ou`>Fycfr--p*9KrcYY+qB~ z9}$*WDr|=^215Xw`XpNv=^(>G8~Ep=TyL>gwVpm{=V#6u1DnUd?GkK!L-SWQ>4Br0 zU%+NqHWN@-)oZ{v8g~yNo?!o)s1EvhhgxMUx4cUzJ8}DU9x}~Gs7#^zXFA^4{X;9o zR0h-XR|+aPgmu~Lt?dztan=P#cz(im4c(ga=5_iVuLVcabx9}7kc>7H5ANrgO6jga zrbYgr&Eb~b_9Gks@9(xJ84oL%eH`U?dLp^berSTv+)x7=F_Z8iRG0hp=G?pxIlh|d zK4jyea@o}0xxt8euZ9UhSrDu%zcXe$Nm0Sp;AKHt_5c`NM875DX?$*y$LiY%Co&W% z%vj-nR6P~jvNfmIQK;<$U&PM+w#6z)&FY~0HQ5R2Hv5g)DNXT`0qNMnrgf?zaeWHa zZHo>eqGw3=G5wzVJ{7^H=0U&Il^QCXT|nWo4NkZByE-ZK$wd-kJ2i{@W_$I5BR}tO4~6scUKe(AcDm26PC>x z;m40L`b9xyomoK}E719-2dRGp_1e&@gP;6;Iqu4q6C267pj^`sdp;cOQJrDvn4S=C zh)KnBIG=I`h_KU}Gb?)h zEELd~-8ag=%~AKGUX_Dcu{dD`-~MV8+#KFc4Gf9E*CpQX%XBydaIhj`8`Kg@BI-`@=t}5cx*ldlsE}uFJaPIP9iSP8vAlD-O4hNm8Vw4 zD@77dE&TkWKQKr;rYjDz;6e->xDcalB&0n-kfZnrBRQX_YV$gz`T|v_ZnA{L=G!C> zZg?)Y&h<7(jYD@k+wh%(khzk7BfoVE!0!_d6HM({$w&4;ycTeQKFJ2}QT1=WXmB7p zAU&azp{y!sE|6}3!H35gRJ}{vTjDiAq21M|-gWR;$8k`=tarfk^gVl(9-xP-XBL-<%6;^H!)4Bfz&BqDL^qxM6hj^GI(b-_l{ORkcK~w(iOagUcCZV?q zzFoqFJBrYrA?rmaZxoA%d1`B;hdI`%>$Itf7APc4QP zu8!`_F(_=!F8S97Oo-G;>*?K)qz4TpHMOuH`-S1vwCH}wnKU5Lodyo0LrrrlqSnY` zCNTHmiULcMVWR{nkQvvL%*aOEuJb(Qe7nTR+4=a3+Z2ya!S=;Pi*wyVTk_+zn#W%~ z&GJOxv|1MjYwuZ*V^&B%GUTY3)H1haf)or%?L(vuO)53E;J>%Q*-GZ13W7)WV`}Mu zjL%%e-tYF$Wc>{$W92L_zqm;fd))~OX{%dMS|E7mhF%8y7Mti0PAxtfnE>5!c$J6E zRlCquLVJ1T7pk&F1}C5-jr$2E3@$(#q>JF0qTne1hNh7D=w zC~Fr&F|{6qu>%cCsu|6yBO16eU*a!Mq^vuG&Lv1_jHx(a1&$~vX;MjqVC15#Wir@Q z*}ExFO>z!x^8R=ARV0G{pYC~sz=l_kg3qwNy4|a02?n@G>RKx8SC;56t?4fuvky5F zfjwqs5-DbSPD;+85NM^r7-iimspIyuB6SPOZ&o|kY@h4K-`cWzH;Q|$h^Ne_Nf!Jw3)$KwY53msO3OPCQA6H`^~s9P}PkVs>~Je3&bb&ZBKj1JgTf;i#A3ddZ_Bsb3DxpZMixkOC_hUmwuw zWYN(b`sP?Xdy#{qY7`row^B`9uP6}H-Ekj^PoG;U3H^vZdxj3G9OhFBh3H}drO)QK zy%2!afqD+MO3va^pC~R*iINZ328nDC9<5D*E<2KJXwCJNKZ-iHYOGVJdbgzeZng5l z@_PIjM0>zl-40xUWfB>)wK(FL&VcQs@l%+9j+g!Lq!!8Xgmi^$#+8s6yZX-aq1bo^ zKc)#;5eX|RuA@D<(ZOrwFpt_dO&gsGf0pKrJH|bz(@M|3OZg_uaUclDR%mPaw z2Trqnis;3cq1n=V;7`v6%7a3;$(&EiO&?XV8k#-=T!K&A2VBMeyT^=7_HV;I_|>T9 z+FJ!3pU1|GdB~AmQeNCfgtZBC^>IyZ%5vlu=_97dH3HrL%Hsh%PY;w4QdvBzc$FVe z><`^LBt~kkM5_MbjmFBh8=6ODgMk_@yK=>uvl|{&%{8=`qc`)p2m<^%Pb_UNBEh&h zD+{$``iY_f1HFcvv!&ZAt>iCnIM2t-s1PK!S~e53#H}ddebK;c6r%H`+$oXWyC1`i zyTaM#CiJ9xD)G)a4`@D=e-uL$qD0p752QY_d_PW0IfZNz%vN2A(Vj14s#yQd{FY&im~O$@u{R*A9ZpO;B$8<-T9!`PdD(1DQ*WB z?7Y&sL%d`8cjM{*BkQcgqU^f1ucFc*B3%N~2uL^5(j`N8H$yi_ONvN0NOw0#cju78 z(48|d!0?UteLwg6eDBL&9KbOg*WP=rz4yA#b^byXS-Kr#=8es!eIBiHRgmV|J~3-2 zAz>b(>k1~I_|TK$TJ%%G%S~;K&FaikGc;04vO;niT(l4UD(7Ol5U&|W^eW{Gu&K$M z$vWa}+cjEJgMJp~#?|FNF}r3_c7ccwCOb-uM@Vn3t5q{_;GU0}ZsE}5+~(Z7*S9;_ zl3Y(f<+zpU?Yos^bniT-agKYu9;Bm!16`}N>$RIQe;i5RCjnJIU>E_+XFqci#kUpL zI9>J}fM6Va17;Gu-A()t@Fz9R8zCgI)XvBRZrefO)!Zu_84HWaD({~I%UFM`OAnd; zpqYyz(OiFDPW|r-e!{#z^;nXvz^ZV^ji(y+{L|$gYa0G+=pc3NH@oKIm!+=$u>Bb= z!ncKtj~?+x>Z1ZNbz1 zA#iCvtkvm9dvMqleFIw*KnM*j*nok_%ca)7C_AlpV;c;@Y`^Kx{~(esr>-@_OzM_c zDm*gSmo?TlVyA zT8KCae%Xzld7-sIi$0kTd4-y9uh%I6g< z-ZqkoREkW|YhgN$o9l@m znkqntRoO4RTuD-z4`^90U4lUI$%7auR{E|j$|N(!8({~oa#c|MeUAgQqt;RLm7Z_e z!xFGi({~+&VMPo^D9!80WV+0aQ#x|XC6D$;EnVP1n_!?%8m#_F;q9d|qQ38NuOu^| zrXe;)BheOjoVTtie>5zqLl%(gI-lw=>*EjRpv(mwDf9au(S{Cb5u(+Um07)w^%aSa zOc%ou4sB(B^VWvoZXVZ~^f$}VYR`x6*v?d~pGQ_Vd^WVJGaIU&I6?^gq zCSekqfSvacih)bMncbvRl(QHTyPwj+)tw2X*y`Z!lbrSVU{z zY}eK6iiM(f_RgDA`ktyAdVf)%7$182tot_oO* z7yUz@K|o~0#7N!GQfpFP+VMuJfuz<9#eBp0__*+JS*b6hLGlxRCOF+9y(Xz7s{5lv zC^-OG4D`!*qBt<4(`;DZZDLLBzw3WqPpIiN69kpa_4f~y4}>`(q#!I;IA_#Ee>PtW zrod%Ws!FcE$f~%WNU-4GT-wVpwV4p)Fv_5Ezu%tJ&4O(xWH(2E!klQWfCy{9de3MA zl{lDWyzvFGuu3xMmi5O7)_`VE1SUzB2njY;n1IF_H0sNt?@GkXjhRWN?bM^&$$HcG zv9abJS5vmmiXQ4%R8eiuN3jH6)x5ZVL0!;AUXx+UNOsu9=-f!c#q1bfS$%ra=e*gp_IV_>4+Gyx&4rQ(Nm>tAI_d_I70hoKVxqLDS6XE9BEaj$;S>K%9suPoNo%IVdYaVue+EdYfzY4ik zSacH;UXs0(Z24xV+I2t|Zs3Yk4N;-L+UIHTy`i+l&|udljqSL%J>fhN&Gw4bO!Y)z1r=GB74 zMy06U{j1Avi9?F0>#yC+@TWkcX@Y*LizUcfs_juj9Z}8nKl-j(8?MUgQgz(*o;lL0p>VaI%w=-@2 zmL)BV8eM zsLz@W%Ccnpo#kqk3m!kt7r4DkE*2LUnR8$?CVw4B`?>NR)nTCN>0x9XydUkXb7sC% z`s=T^IdN7U@*n(s=YT(ZD+5agUQ(z7si>Z3MY(7TPa#F z@bKBqRx$oK7t?>7kI+i4{)|y|7Ad;&PDh+()UtuBqOODNfHwr~3q@grF%!XZ_FkBu z&+p)D_keG{#lM$z;U3+gIv?I(o=PpK5Uf1Fy_$e``ptNAd10F?$OhmG)^0$1OJvc~ z1?_lfNUj%$`>%?do_OF{oAly+SQvQni@;XD1CYl0>9E{EFlKr`@%?>lO3_+Ze&9aF zLZ<>Q`RJy;izoa8oDzPmWU+aV?0JKDUhW@0PZdUGDN#zH&S!7J1SJ-%_IN{>eo~x| zv^7huU+cJ%%kB>3HmK@OrH{wvsQvi1daz_;0`wb+wfvp*{Cam$c=V2LIgDSo^YH@< zNOweQZtb|!T!^C#DXrRZY%`N3^7Q<03Qzqgn0`4icq{0L6i1)Iuu@4Uf#o@u5U(bC zFZ$;wVo ztm7@KV6VBp?|jX25Cs(^#r>*ih5ZF*Ny?OWnoO&w^;?84MAn?U zQF&-cS*anfSh}kP$$+dsH=3rlBUeTI-^6xObc|Q@RiKa&P~l>%N`YJ}w@^Fpf`3z! z3Ivc^X;m$#lc^cSRjiTr>b9@Y&(DgicQ{BqxSK$?^KNQi>LiWYIkD2TvtC4|JK+YV zYu%x|s&M2f@!g{zh}u8`)*XDd-8`W{I9i|_nv^eIJ2K|dhMT1sI%P2)8z_K0{Yweh zUYj&iP>ov{gZ)m>#n=+B*XMh+H)7a&I?k9Zm;IjV+F*7d^y|Y!* zXOZS~1Rh>!o!@4iusd9_69mO^pwQ>Rk>~P(eDWSK@~UV1V@*Z|mUp8UKJOz=XmnR4u)zNiET zdYt)Hvx6W1q1hrEFlnn5+~iMAK;C@-nc3V0VvAUucPeA)bVIz0nzRE+q>SdhFxjY{ z3J`q7hGWwj9jS6n3ZWeeN15i2eYn)BsZ3y3vnW><)`+DsvF`>L-EivN?j5Yg&tcmb zXs0xocsH}t9?KW`i>H0@M%jeNSz2~#Xz}flzu{n6fmbgqZ;1S!m>WX@>f zV&;Nk(J^7ywG-n~OU;M01I8UOKV4gb=B(n8<6sv?>y7cgSxrlfy8R_TQ;OhX-xCT= zEb0#T`Wxncdo{m1RBQa8+;)q9g5|~oABkmJ7vpfIwRROX&Nz{56|ez$gI*+buDORg zchlW~--zTv_0~v(B6=%BoLrowTPsd}u@V5=wJ|jI;RGuQ5PtsJIj`tG`V2lSZ9VhS zilf%_ML+%DkXnuB<_71B26{B{eh~CD$obfk%kIV}iT>2> z1kGTZ0$)z&jBg?uqVp$qAmBhS61I zG+SHuGT+{DnJJ5>wGF;|rwm8-kJp2;;ZG=T`kxDzcFXDn%_|Jg-@v-AmBz~|&6efw z`~*%NTuZnID4jBrjn2C~OgnJ;*Yk)zXoMB)I>vV_V5_amh{;okuj@20;Q&ir{5|qp z>3--!(|y=J05Oe`384!$wk4lc6Zl2Ovd?w5au>UH&sI!pL6E5-G z?eb5{FG&5G7tXceK+iET!mpAVY$(fEKm{mrcQD9uzUx~6x>Rwl}@uPhDLr)Sj&>N!R@)ud|YV~5bE`+ZlXa8*%j1NK0O9;%iQ+1D_B{_EU=xXPzbGBy`yTAAo#`l^(! zIHkx#(9d&>!4tPo+A?n-e(35%djlbI2OdRBT|oQsD6;^JIR*^rd0~W}WRm;yQ9%DK zYDM!`T|v<8mGaL;>=BVD8`Ob%@vkD7Jt%&H0&m$q4Vvcff=Jq3#c_o>M-djn-_t%z zE9(7zIKa9Z20fi1AP;h`^q#6Xd0k;}qk<4D9w6^lPjrJt`1VqoUv?CH0i?%Zi#6|~ z@OKWkXW=<Y)h*{FXXGC>PW|4LMV+q z9lh;o@(7z~MZYt>3Eu^Yy3;MRAI|IQVQ$#>FESRPE<`4uaNI46f`-Gkryi8F4}y^uYDYKm;o`auwNJ#Q(}{^FY_PQ5pRNJr%wuI3(CofY0vQ@kxV5ijt~*Ubl`rCTX6mZ7*5@Z}b5tzPaBWo5q!N)7-&EdZE0>Y(8c1y1j;oqXrm#WljQ&Umajh z>0+-w^h1vPLTm6&>OH}iLi}|ZZE`#ZMn^8vg#s%9#hGfs?NQ+ z*L{f#uzokb{XN$Q%iqxDL%l+N}3bm@iQ5+I;1?}(+o{gd46F^2#6cmMI+xz*d} zWq2XPzVLfIuFKM$j==Of@0H~oqK{6AB?y|y`j`Lu;PKcDa{G$jjTWNLB<};J{_jVx ze*N!A{^#R?e_&64KgECjtADkf|I8QQkHquex%=<$s-OMaM)%L}w?d0b`H-%cZarKi z1ZTN6W!1Q>d!>b=Z}1MQFDHp~%ZhP%G~Ld(6m7LyG0rc|4X?g=9L+|M*b`uyY2G=$ zBsXxyN+RiXHMat~fUqRm4A2f`E3dZ;OR62$C{2?hnU-=xwP$~5G7VnkF%QXt=hUq(P%#vR|9|lLK@t_M^`dFo|pAQ z|MQIYO2-u(n}YxUH&w4{Jx`*HK%2}H5 z6r|wZOc+TqE`FfJP4PQOsV3C$XHtBXLP^7$;u&m{>Xx|oO_cCu)Z_)7MbilM09md# zDJB>wzq}D__drp|k%EWpb|}pNouQi&(2S|LRX2L1zHHF%21hc%^+r)IC~~{r(bpU! zQHV;-oZkZ5M8Y34;-B{ZjE*UFF)q>Qkh?FFb4E9UOLDpsFR<}8i<(Sv4Gh{yDV{h0 zaf+n;`eP@<<=*H2fml=%yKHYb+M{`R^G2f2)Bnd&HUM05-MPhkEvA;3n7zad0~5935Y)V=sK%nq0i4-mCzC^hyQNaqTa3~Q@F zHW)jhVIe9lZAQuasj)!VxJZ6B|#GehjF7Or-aor$vAmn|{+PU5W0u zd<1r7BRE76!mF|M$cH(6MUrv&MejR9iP2LEbuEy=N3DLF-!W>t0P<^3F+7_vh+TS9 zza!pH{{|cch8<1nd=+2E3Ptz_Oj!&i--9^Ii0DQeWrdtaXX`z&P#U!BF~wh7=U`ll z6$$CB{YB*f2Nln<-qeXz;R#eMsh0U(y-M79c4Fi=xb&L2*y2y{tzi966Y$?r*W9V{d z(kD!77R1lpz+AZ%7ZE8N&ko}{ciuVm1fIK4#D6RaMf2f>ymRVbi{(N;eL;ae8_Xft z!l=1_80fgd=5Wd;xH@h5N1H4oDS>St*}BN$IY?LjyI~0cyGs& z7MIyy96=IU%9 z*)jJG3W1)Z^L%CT5Z85~7ylT}vN%i$DtPxr)~70=0fVoVOK{z7;{jn-9yB1$`}x%>mdk_2>{H-JIyRn)G(3y`=s?EN>f=KF7&4|{`C9_b(*cK9vq|3UXw5& zBU2WQzgv_gXnNPtPbD)M-)F0HK#h{Aj=&H7MM23h{uM{m@=!(lar74^swXa6;gDr$ zqZb1D^yTw=|FJP5sjB?0SO{{`pF_Y;yWIb^b8X>6y)ha#XVc*rBRlWAEi5W}5O@pT zDk_YYuGItf-QOLa0=Ks;;>Ks=5q&7F%O3v0hNTsQ>An;@7O02)74WANQkuARv)p@u zO3W|crWn1ky$&LV3aeOgzRRk=p#Sr(Tn%YJFxsfcEk}hg1lzGiMAGv+2C}<7Wg;S#~y&u?{vJ3s`k=RT(QOI zev_O&wfBWi%80I+?+*80tDF4)uI^R-Ej));S=^0=y-MtZoMJ3@(u%iz z5IOGkE_KhASjGhF`;eQot_K8^sVdZh3J|Quxd;6yZ0_gFgfF;P^ZxiMY~nLu;@=S% zdk0`Q*rErj(zf)C<>9Wd5t3<6hCvBK%g;e;?l=12c|Y zz8Fe%0g{w9i|s=O-7fog2|}qqPj}cMD0!jQ-Q>(Gr@@00{TuDTmhjR6S~_40qzTm?C~5ouPPucdsMCMxGT}@q(jAhW=x?H zbz@35$|r=)ADQegbJ$0%YuaCdw(rx9XT$Rx-WUm_T^hU|Mb_rir)HF`1PKAZ02DlK zj6b7HRx~^-CVG$Ynelz7wFnP5^b1mI`3-=>5&rN=CO&2U`q$B|Y+2lLzrrQnCf%p& zZXJYI*nq-eu%W~w0W#W%WDibxY(Mp%F~Ir1CV=lnDh6i6#Sj2ewD}C&ys)KKu+#hq zVc&eLq99EfIN|NF%t<|^hnM)*CdI<%0wN;xXDzqhb_3BFA<`_<++2XqzBwzAf1pFEvl;41D)M)0d~yK(2a(Y@(RF~@kD zJC==xdahg5iW~RXeov=A$ir%$!=mXh5Lu`x2Ps9-J-jRU#E}cPh+*znnB}YtU$XDJ z--hke&v&IdpV$5jomJZZj!sIRPh{3C`n{4i1&rv$--r*CFL1pvdG-UdiLHapxQUQ? zX7?A8Ec?{?*L?%8JzEURg;5Xy3A@}o%~1^eUB1=b&0?ct`OqSp7ag*HMvk*4>lNwd z)P#mx>(o0Uv8rP2H)gvg-l6-S88GG$_?siz<;5R*=KgFlp5@;{hFQKpAzJ;cg*GPx ztSzlQ=k}{%ag>_hem3gc_KeF>{C#=CnBY9g1 zz6K}tRXOV5o&D>?7OF(XU~i5OhLkv8$txlnBYd_sd}f3dg=H zC?2iqX3kiUOIwpW6CN3R+h5Yx{Tn0Y*p@hBpws{4C$rIQf*Aa=Ty1FGvFs&Uf26=yx_2f-aorehI*!5*d_QNRY!D~diIS-xCm#tEb2 zI{BLz{wS&$usuZpUFOEK%R0?8Ym2%$xN+Gwn&y7c-iGnZqK1CC(WC9TrPz=DGuW$x z`(Ck=l)4>^nL3z#pY;0d)ZW5SXP7Pjth461`quIA%m2z)e}4D^5AP8hj_8Ib<;nWn z3ae@I8N%@@Rz0sT1pnKKQl;cw^<9dW52qPt;#ZQ``76|yNnT>5$va7DqH(M zwl_S#|M18wMW_BobS@TXL@l)JY=8~g&twz`uVj*3PX8vA2SxU}R5~cV>yWr4=`zCH>LZ|Z!zIT$O zeFuUYG$&7wg3xSobonu~SY5>a9E-F*b(_aHIlc3b1#(i(QRu{dw&f;Uruy8Toh zZc98Lg*(rsqVwh0fxK_iwER_7-+`$BKbbOJE^-D)(LeoWJ*sKl(6JX?(;-ClsVzeHHN?#sHjq)7z8 z<_~x`uL>a}!tnRYkRkbAr@&>CMxf^Y)*}G?;rrL!U0dP9bnYJu zYWoOr7!9yqi@0b9r828t1qRg!=IvInG}z|*r2i^9T)OY_EfulVdgSsaCbn7Nv?vg- zd8o*M?(c>04KQce^DWr6WWn%W(6yESExa7pM>vyAJMWb``&;`n#55Fa1Y#LRp@F z^JErw4|*}UG^dTdbg1GgA0m0^)Mqwba9{GpOOk3@u6KJqvLF1(PZ&o>DWMww;Mv4@ z=Go`xVndH#>_{wYI~TmFQLo?sClE=gZTmdaMOZ~LMw26-9)~PkdwOE~ee;aAxBfo& zrw~EKbDy2Uut9R}>(nyQdkLG+ptie|1j1>7YRS(9wUQO_4STD4Pz=dqssO@~4b+yUefFN(xZNV_{)r^ z1VMrtx{`U<_+@0$tgYjUgO$=GvG_pB@jRe{+_;}juFh-`K8z(icu@S4smSuleI8QP zrS0Gy{!hxls=kH-;!p zSwdV|)^9F#NK60qG&=0#`guGkIbEmqX-PeBUGI2n_ifrE`XoI3jv2QEld4UW_9n$BP3B>)`AdiUsgKB_+y6VPQ3V;PsJaHTghqc9_~}RR0g` z@j>JO&e@I4p$uLReO)(R4Gh9*>2%~6GG0ryw-I1HaRpB<#W1n311Wsy3S6${n6DF38+7O$n zw=$8sLIgxQ*PR;9QA7^W9<+mN5NR8-qQ`c!iUryqcEs1;;v)&gquFA`zYGozB=b57U;cj$DTbJo5q9Ac_5V?TaUf zFGo1H_5Aw4!Fh~=i+B(|aVxVHvY(7fgdKl&nVRd|VP3OW@z?t1F8n6guj)6hiQFBR zMcQi~LE0`PKL^%Xt&Z+ntjVV2+9Tx4FH1<9vrk+-kx+@T-Yxgw`6mm(q|ewxn%RT| zL2!ZlgU(8)mX4b`)tT{Hluo5xK*X)E?s?p`E?T^;p1UePb-fjlVZG*bjVnvu-L^o& z&tiX>No$javEZG9jWXLrqNWJDd>kXyy-P|+=UhvPpPVmT2KQFrWx4IjmRhOLh`{mf z5UGU9j2ogz0{WJrZs*2gY!-{JK2+*MO1}1+NG9*2g$G9K~N2O&1`b3 zy$TlUXS1VoQOh`Bp=i0?+rjGydMDIJw!2vCsU)3xOMOtmwn*ZASXWt{sokovh(oLN z0Mk~3f|u3(2eMDY)&AtO7mR+LyU116^o#fhBeV7<1YL1Pc)Pk!p9DBb|Cy?QBRsh` z7VvR5b@cjnIDWmA1$;9jXEB+VasSUOJbCha!e})qH9-Ti_qi&Nm`|qrvsE^nLuC44 zu3S~vFM~5%PH#WSPW!U<)>vt-Jhk`@6Ga@?rO6lqE>~C#>txplN6J6wBr3n7SF&%Z z8EqVrow`q^fi!%-uaPjJ<}VWOMe%JL(pNa>Zq^PeST8E7m9M;J64cjC!x?X666E^q zO}Fith@D(+<7>{8y;!GkIf~gpSK@lz))3Ni+0Ybd_wtCX_A||=$+rFGelG`CD-Bbh z*0xt8d_$8LoqbHx_klK=LSWt58Xf^KUUp9PDjr8!%$)Lgl=BSZqYtQ1cxop?KDs&I z(fea%9>3a=DUH>k_GMv`7)g@P1gx<%Zvo&kxwdu3X=V8BUXGOI3~?9t$$55f!gU%x z_k&fLdfr`QR*o_sgGW>1fvvr@aL%(07MT03KSH z=743_Pu2Pqax#!O-He>CKh{& zeglCG8*lAYao^lc(PN$*J7Q$C6k9l4-taKZZMg6BDj^ddQsG$`Okcqv$H+d~TQ)(( zXGA}!)WWv`Ho1vu(m_)e!nf4XUj{?F zP`o5^@=1&?UhYBSykFI%Nq^ja-+K+_B3d{r9`EOlS(rTM7(dE8*HWIAHYdtz{jL|_ z%@AAbOkw2X=G(F~1mwE{@4hSdGYNRmU0kEqUM3p|qd%Qs`xAmm30#*Jco-iRs*_IK z^{b>WP#1LM)>I1xvgTJD3X1OLREHy~y{^VdW;Z~w^>+~cgJcR3t=xTspPHB3Z%w{t zwrqIm`HQ1tMgng_3JYSqWo1+CDL8D_-iMvl`- z7Me6eDn$a*9x_Q*B#>vwXLGKoW_CWlNJ|r%UfhS>@RWe`Pq#go7d(d6+oYqte=2l- zl=NK|_4Yr^S=1_@t<1=3s1UR-b5Xm5>CY>t4{1MW=O&VrXU++Y3Vmvww;sKNXgw;r zUW8@H-#e9`w0UJ_8dw{=L`(&8H{b~iHC-LdU&;Dx8NCktF?8#YX}#2EyBveYUMHI; zOv=)6>SM?;7fu8rPX1i0TEelBe{`kJnhnhQ>?pUAFVY~%=9b&JU*mXL3%sztB9l?U zZsBIx75H3d=Js+j!Q7y7Q0J-v`cT3Y&6S9o#?{;jT=CrP9q{uZ2NlcS*tbw+g-;IN znhA6u!h}G;;3NfA`(e%T+SgM?lx;}GK6eMhQ~9AE?C7+R^R)6b4;FL%Cf4Qr3p=W77R_!u{tCtbJ?f=dT% z&K5QE9?dDDID8~pY8pTqhdx-oYEy?%emh&M7X8&`7McrPO#>I>#disiYvFldi`Iad zyhcmbai&m`MUySdl`H5nrFyLm3K?;OkFAD5Qa_L{T-mXYknXY%GULveVi-$chqidb#ClZ}K z#}&)wZ@%<%n66}f-Px{(WnW1gCqEXvB$?2tlN)g6HWOOwzNp+-!|+Ulh5=bEmSMd5 z524ZoosfQKsBxCF_lc}pCUp91bo|`J{XP4HZ;P*g!>-`m%@K@uT9Zc=Jw5XdtbN_t z6>-1BtFg1&aPFD(lSzG`1!wqy0|Su-er?m3bO>i^z0yB$aVVTdqSA0*_+d3sS{&;O zJmkM?WP^^9l}kS+<^uc~ZpvN2cQf?^sjQA4Z924bX(S7{kZto85=INFQ(xd!QqMAM z`rT?>a?32&b)ApUY3C`3WSFfJOy|5mSocZW$(PBAYqXZQQ+{ywdVl+qY~~xSfsKz3 zh{>VeGryJlWUoSDm%V+uD%e_{D3ym#ORN8@^*n2l$J>J+4+I1EzhpZ|#~$3%Gbyx9 zQ#T!T*K)j!f*ZX?(H4He0BIx7-h80ct&FxT`pzC;raB^h92vZ{r0-DSIHTZBV1GKj zRI0gOvehR8VQpSLEo|HT)b|UEPovm+9C z^N?~rQ<~V~;V^H9$O71%_Hq_h68>PZ!sE#qcN*)`;}`wcKD!p>dohGDG-gk1!Al6}T~VOl z=!fykt*4EPVj4gbX-wcWuF9d3RLoGPd?QWS*) zmN6g^@Y+{ySmDZ8gqP4bAfINh3mCz@Jm#ytEKf4u%}X5`tW^JtKgqR)WO>X7U}r1$ zCBkE_Oc>gy1bnA$d*0p)<^pJqR4Z&cMh(26=H#};aZI!(PL&+ z7LqQ<+iz2W5h&d8Jg5;~T}?X{cY+LuT!M!dBcQC>(hNb1QaVY-aSYfB-|z+z`yHDW z&d&Cj!sL||utB6FGl`v|lKPIT%rk3hpv}fXP<)Ejy)J|$flW_^iFD*6D63V$eC)>A z<3x66vz_x~rgmKpdB?K1=!Go%3GVuQ57!tkv_Uv^q8Z3~%{k!tN z5MG80j&o#=Xtb0R+#+u{Jz^jsl89ro%&l?D1@iW#k9@4_`R9Dbo$LTl$etV+`b&s` zL6(7&Y_fq>%JNFrhC_TcCgVyIs{f)=h%i4ETz>0Ag2(0Y?Im7H?$L`qxv7ts#5%Ry zerW!{3jJfiJ7PCGR-wm$gy$Swo-#@e<)1el9SG#jYZ7Cl)inoM-t$x4LhZ{~%W}?r z_`?pvLf|bdJmR?ge&tn}=h_`37{T{nHhK0aBFB`qF|QBxe3CoMNsc>tkzX$Q8?b&W zEx(Lm^wN%Fs5pD&*hP)tEsskYc#}`p9EGLD^y0X-~APfYsjp1o|vmY6i z7I3{uja{ z3;P*X9&KFjb!r;=A9MG(XjTrFaXIa*3IIxL`7vFW>YaA!1uP1xfSgx9fSJUe0;s{n z&X5z_Ud}*pnws@`z)-Bk0pTC}M@vu9O?18{a1`8Y@(qso^=e>>k^&>)XBs<(2d` z#>T2A;?sXfOT~-7@EB~oHdG)smqL#~_L5D^-dcy5vbPasNuS?qbhqZxP#OL=n%;SqoybZ_( z>ZZH=FLp~O;Sryb^XNG~nxHpGl$huZ_z^Dbd;xl0i-JcrMI$#Y`gO>pW7H->u_`Z7 zR3|7`kJf_)Y5-|tA5)4+E36DB;0MVD+RNhPJ6L|Yg%p)%iDB;2*Z%kTxA?HvDPadL zCzbZDW49P~>&JBs8aSYcG;TfAW+^2Hiu`jW;yV|?w$dfbv)~PDqc)}f2>LPL_Rcb| zbnRGGst!6P#kxTwuOJe+Im(uZ&@t3NW~F=1{bP7V9sV&gi=F;so}f>Z#cn42z~4Cs zd1SF5h96Q}A>Qvsv!xg2{CUTsX(ge@wYjPS!a_ywsgLRi&Uo!P}yHcR>%kmWc!7w)5v!#q__7A8Y>Z8xhD``f_IiI%zs z%Td}5HflFS?3ueAJzm7SOFA9i4K|T;J{9A49?>>8J2O%gWEJhFc0F^CZg=-B(OCPl zm%b;m;O_RTt@m7ZrM9w7NdW)XX03&D9#v~Zs~Q)gh=V)Po zX`lW$Wa!JO8}QE+A%)p&9s^*))U53O+r-)qtJu{JDP$?lwn4#LmrT1(IZ|xqxCMGz z`}r(QLG3!$GF$e&S8-?g?2p2O1~2)sd-Q}9e(X$Z*j8)m>vs9WdAlhk@A>__FACeQ zN^5TD@1tFpUf&f9M`#sh?LaiDTI&zQ1QLq36m+;;e~HaO4T^=qu}oU_){mV47(C;f znD4dKf}%~sdQo_&>czD9!3^TcEQWu0+t_G%4Ka~*PnBlKiTJEl=ubz0HIyzpdjlV0 z?<66-5exUy^^_kew4+CvYojQHSEg++@YGvrUGZ45Vm=fEaUZj=w`=rhJ21%A7uF6> zg*HncQ|8w!rIig*?V3cCe@=*Z7NF6yAnmYC>@Y0tci=H^yT=1I>Qt8{@NH#St=W{; zuQY{@KU0dCImtgixGdv4%80r=sO*JmFpdJEhi~wyD#Vrv zGFsZRRDX8sgcd+ni{Xle@9Z2s(>7~j-Z8@Z`p_;73c?=!KDS2Q{TxW{k5D?Pm^vsFk`?t^qMz88-YKIp|%`oC8 zPl^Unbe=ZZ&NdIr4*C$}pGS^uq#s4Pi5`f|=#QB=>RTl$*wl~TBU_$A4!pd(MBWLs zTtFHivMe!QG7-k1Q{N57Qa-vKDQ}fBirV4Xy8>4OU$6wHjZd`90U;^N6m=T(j61UR zo<;GtkDQ&(34n}p@#21Nfw7cVuI=lf1xHfI?%VUQIY`b65_feTo&BTDz|pf1zFPb8 z2t1IJO>u)lxu^63PgS=q-!OM&-k;o{>|2@|n^*9_HC9H7cy((JghA6ja#bnHC^n#r zwyd~n+uQ;28<*A>3f}(S+8cH}Y>KaQn*kx|rY)3xKfZHlbXS$O5U^cTA(P{M=CD|N50Jwdujt`pyyVbb8{TMn-e9Y8M5H{HTI27)@#(!iONR!uWUh>l zuC29XS4h#zNs>g!@`cU3uK}WeVdR0h9NDF#*<)f1<=2CC5PTrSJhlE*EER8`Z1)9!Vg`&1XzLICF0?k=?w z#~T2Z((THm_J+d!c+KkVh<2ms1a`Fgz&B5{qGn|y_oLb53HAgUo)BSGrAw&WOw^aB zij3!k&%~~mU?&k-xb(Hk-?7Z-y=Ga2e3scmZYBT$6M{lQ6TsxI*Cn44TvII|tV#um z*sIy7<_GyLowPA1Y<{uVs!N-`FLF{X%F(2Zz7S6ir!$mEl@ni7>Y0}4XKs`{f2eKn z6pkA5&lIyB*Jx}!?n>h>k4~##_Rkv}or2}>!}^VuG7ecD1BPYwb($X1qOmqIN1sRg zLz0i%>OJeLmw1~i#qM-%uo>)S0Tf_jesn=TMR$nc&pC5X7I0h4v7WeobeXI?fu&b= zT#{>v&usq?tVU_>$lwPP74SlA4qLx;m(GG7G$My{S~m+p6!i9quoc>^GP}igNM;1* zI$1$}!a6VkU2(8>FxS*x$f~QQfm}QHq7HnxTD{e4um1IcWrpnZ>;M!L`VzyZqMGX2 z(U@lqpkmgp@whg_rnY+p`&6rI05*2DM#yoKkhf=nTR+%_ulG`W;T!b`GQ z5k6-yu=Kd`&>wSPTI#Yz|7nA)+yK|T-}>t%75DZ#hRz6iL&NHrHYokHw$2%&BD0oF!5g#Sv@OdSY!Idq6oK#z1`Bh5lL_wYp$I0wGpcqyz)Y1LpC^ z)R&A^gREnU4}N0B#i&bdREo~RUTS%vSF<;G^ZXj5igg;PA5Ib%fr>E8G}wUF4h| zrmy)FWVNg=D+q-}O>ZfI>%fB{r4WsIZ|*Z<4I7n&9%qdRr{<(6Z~iGaC6WjFZIKtE z(PgbiyAsEZ6Wh*S!vEf+N7Vevy%<(D-17<^b@Q89-8I0a4_g{bv+s13l;Dbo`Ybp2 znd_L*+q=muC7Z=9x0O}}XWjzEYH|B;WUpe4U|(y!`Sp>~|5-UrFBYZ1UQVm=iCgWP4o!S@69C}-x#w12Wl;v|@A6K6HuxUOXZxDK2PVbFj zA1K2-71I#O{dj7{;&R~O4I|I>U0ZZ2D1yVYSfMjOtSj|PTr?iVvit(yJyCaOy{}$X zJQWPB$VkWHrO&v*doJ!s=QMWb1ba-T-N#Sj3I}?5@>)z>Xp{esz3+TzYT5ecSdSub zETHsbK_m!B2~|KuK|wkJ2~DIEdgviw0~9GLgx)&|Nu(rnP!W(WC6rJ#)IjJYKnT3S zbMC$8dG7lMydU2Au=mb}ovfKzvu3T|`t6xL{&8FzVxb<4jIV@Z|BPk;^t16#jMr?q z+{ki9OA>BdJFw?G^PbCEX&M7Y17Gk&x{mg7Q^}aQWfSV*Na6|dx57!1h>B*`R1y8I z5@p5He3x>bQ(T-k)BK33!I@Tz{6%EECs-_O;vH&QU7;l&!g}q5AFvzpaOk5+))lLT z5}h{M4QhIL&_SkdgOdaDXCXD#G)~VqR41r-d(!##D6V(zJt56F32Lz|ywd+HcH_#~H<6Zpmk-tyYNI~K zpGp7dctXpMxN8R9ZtIFNj{j4ssci>WFyPG&jvoU0#;501`A49vA+EHQ&YAPNDG1j`g_ftxD_-K>8zD)+_FNin>pyEPY zaf5R<>Mm-fK2_=4pbd&CXL(X=cW)d3C5mx`r6RAd0nwq&DqCd@l^2NEtaUx{fYE|LcpBINGy7_NawB{^m}u{V<*Bl@f0=MgrKT z#9Fd*?d?NfnN|8p-+6k1_s#`B_My)eCxOM~xUrA4fdU;4K)xXj}x{zKLflM<^f|@>w^@{{H`7SB}a%{{p%~@FVd(Sch zw!pQb+||N~fr_L{UHhv#(E%kW@G;ovfsL}#!$lPV%-Qm{1J9f#EhM!QoZ8F^&UWvE zNq_o!MZulKE((c7F;fV~bK1YC3)t^6y39=#=>Mqitw-8%BZ z!h4_-m3RBUm2)OzX8X33yz_2u#V+ZVaARK!w?IDQui3)_I^?Rt6erGS?_a&TH5*aR zDedtJURAa3E#Bi|H64`^Zp5*?1pjk8{b+Z zt@zCf7bK#-r+t;i&p>_GmPc4=V+dY3j*$lWCBTYk^Z`$NbN*V%p@!Zuz}p-}x0|Bh zvS~i{+Lk$O=rlDFE_*WT{Zm}j(7U>? z%?q!Q9Me%HSPi#H3}uc#NQbP^s;e3u~To(H2X2#J8IKzIEfs^BJjbsD|m@9JIUS!CB%NWw_DZ zup~Y=X4|qqBXyx;uG6)gHh@S0a7u)XJ`QvqJBc2&x6oJfP`SIzjGO$E+ zangC~Si?eCtw_#FD%f9Or`)@~V8;-#8i!bh5KY|D(hD<57ii_cl}J%AlF~K%DE#SM zv!WoEgq)fIoT8q^mIqQPkjhqkX&i<*iJQ2po@V`=C1VYXx1nc{ftDd&C@N4nl~o%_Ki z|LOo1@pDX&8IW}+>=l@Bw;{@K$tEH+KySRH=&Xk#H>SswjT{63Dx0UO?#9k80oG%; zicwp$^hMWlUw2$f4~^YWd3Wp_ zET4ZRh8*bVY#{n_RE+GG3B(+9ACL6PF!weKK_usJdV)2J8qFdB{t?$X-rNipfEwX; z7)(UF`;kz9=-zvb_}mn}cUG=zT_I|@d_9TPje42@?`(v(=Rg(q#BgMwkaPFO zOCUqDHFUYhgxqo?I$*R)wt8f}u09o|TT)@%Vmf?Se)$~zaU|-+z&FKBoT#ZNVXe9YZ@uv&GeP;@kG%}#2*=?HhdM=H zvfZPj7bu1S-9Bfr9f8srsi83gX~!aBhE+~p#Sw$YUhInIRQ$NrL*hx;9{Jf0l|_Do z&W_%B?q1yfZK8yBW$wlge>y(Uun}goG9vE5&%`M_tr6Sj!;^AmBgmydOvxl?gs7~?D)ZEcJD?O%FeaTky- z`FMjx-z$x2^!4r$Biy9}ws+gjxwUkD6cXI+yvnEj=P}bS2bZ_E97*$Zf22Wv%mOJY|{p+V;Y@$ z>v5%pv-QpE{^b+F0eMfQ^Azi^Lx?2&XQ~!$k&kVKUkJJ>w9-wIVaC=iX}t$(8V8{X zM+BK$BP)}izPoBuv&$BP536SaZX46RCOzGJH_aOszB=d#C^AzOsjPvE`B4ML_M>-y zpQxEBmIGpH7qj0pbC-}$t%DEo-Clk*+&Q6qw7_Ek7Ws`; zH@zPyW@8=5-q|~)W}x-)1uvf7JMTE*)j{J5lN-iX`L@6&IE#e>)$aq$y(Ikmw^yRg zsgcw(b!eRqCT#)9n}sbbkwWN$`@ z$1ByXqYrESkhWBPyD4zRs1FB4)?u|jm-DI+TtMyeUFno(>ofK(`ckLtc`P~*xY&=gAe`rW#L6w%xRUAw=Zl?U(*S? zrH|;mufAU`@?%T^>fQ=Tt1Ud?vfCitjm^&f>ew8-99~~^JYwlU0w>yI*(Uy}-cG*M zt1LqRcjsXYt)dAklxZ%rP4FVSu&KfZLmqc8NZ&lTq%|qWRM2N-qv;>5KdXtev9llQ zt2~D>lb0fCIihj3Ajarm^yM@xEIvI2IdI1R`1pi1sX))9=Y(#%VD)jp)4LTdZ1Y9$ zY8uwR$y#loB=fZc<$f!H5YC4hg z*?^fjH!nl$f$$MnFLAodKtxN86!Y=tu{?8j%=OcP13O6m^nLHT7Xx0?GWTO$Q7(gi zVHVsu4IVl}(>9i@)~T)>J0~g)CVN{TtxCtx-I@v({ZGl%f$3x_z4r`iWVzKk`mNO{ zF|*YDUTi`OjJv@)zsn@)>lwjUs;at{T~I`-+hXf1f8fI_q?l^Q_yWynL+cF{n&k5F z^32%~_z})Nc-2})zXb<4c^&J|dweHgnC{G1>EWpv{W=9xmQZ#2WEoHA#I@af6ukPg-rU-wlIG{qBMb4*r@! zJTB=3DuXtJ=fm-79Z)~`D~3Xi@V(~^gAC_}>qF+x@eP+U&$6qbpuTF$BYjCd~eoX$&$?iuP4ruN6@KPT5jqaVlHe>h00U`4MZ)j6|0h4$1ps!+rKq-7=CdOlDSkO z8GDw=kNmsbY1Ute`kZo-WooG`?gFjNu4{i+Qz*}2bQH4+dcwey6;=&=UFRVlM?IGZ zqf84Wz52G`TNClW9|w2+`igiv|1TlOPg**P{Ss6B0@G#qyI34L#?0$a&7W_*_}9%} z=cyzA`LF+{Z_G{E{q&>kh_!+Nq0Xn)BCTt!od>-GzbS0z{%o|yGG?lcru6dqxL*P} z{#8M7wc7JkQTcgA2oo`2xu~xDlka{5Uv7LjT!y^D?-QMh%NgS{=~O+)RxsThe3htJ zR6_`A!0Ux-krGcXzA5e@vrC}Xg6#zcV^e91dANCF!s0+(8_>Iw>$x^3(DV86?uG%Tg< z2aZRpH;XpP0tgq6G?P=6RSRX4cJS-`ZbV8z zSXm;^An}6P{&ZQx_MG0JkU<*|+6>qT0Clg)r2DL7on4_CT(wnb1P{hL`nGaX-PZZj zaxYp(8W1MVM?np&wyK}0vj2Buh4WEj;p!xnaq%$a?Dw&gR~#jgwv&1WdDS}g?mRoR z43{Z4^o?9f|3Sgpq-^iIA~l!g_CLasg%Js$AWKx#itv219tVmrWqQF&eF0c7ri?-% zO=BA1jEC@mrL*;1$)=|kKh8!48%X*_IPFf&;%AZ)tp?JN@J*^Ve`I=GMgDsp#f`k6 z7}))B44&t?_ND(8@?+WsINd!@W$fMcM(S0W0*|X8oC&9Vv9fhke^nSAl*=gRAy9GjQ5imr*35SC>uU zZ*{sWv3M}~$h_cNwsc;d7HH60D^W6NbhyCj6@)R}kWz)qI?d%-e3fau{wkk@VwhHk zvI1)r5e3H;9o?`DwJQsfoEwdm%% z-g*ErG0kNH66JEr8Tm~2s!WdUGo0Osl)Abq*ir0)zm%9xixsH8rhhx(^4}^p__Lu$ zW^<<5WwXvctxm*J>mebTODQY~UwM;;vT;98Y6k7Xzq*^UO5EC)3FJ;(TGrdP} z6aN6SXw2}f`;6;*MYS4rxhm0Gg3CPy!~%ts`X5O+A90LPgs{@3gCTMIUMFQ$lt%Xc zXt>;711KaP0K=8UQ4vB;?@W)gR-IvH(*JJ3sdI+}XO^iWBWuZ5Ivp+S{ZVlo^N7-MpJ+l&=*~$neh7Tya~oq3r_yW5=3Z+y6tAfJWutRbiJtf5~$E0Iob*@BjetuP->0R79cenV%1`^Z*K&bS8O$6I{eH zu*7trx82;{pQhbJks$G)TAZ;4+Z7piPf<~0`&|R0i~#kuWdcH#oCU123CTxR*hlgy zsteaP=9mh6TfCo9_t7L`5AgWY%(Fx7`l}?$|C$#r>d#gN*?y1Mt=_n#GY{H6m?Q4@ z8u2vZt2G|&qIfvDt@M=~<~>LW#cki6c?LSSvRQgscm3%uKNVGhF8n#D64_d79I2L~ zRgHX447*^J8%M{5G=&gu@FWpw$>9xkkE1h^F={p@qr^94xt)(SG4T7!ScG>2OkJ;` z(VSnS0i|+zP<96oX)z+{h;ANI$u62(zHvLx+Uhv+q*brz_*>&F;;s8|;l0NhRSdv9j_#SGNeDT2_<1oyR zw81%)r04WXS1#6A*~(PtSfO5y`R+d1KEoKBnGC8O+6sH2cOAAZa$nhc2U}xFs*=@N zbnF_8B`klpwdA?Lev6WnUDzVl-xbretMI^_r#M@hhBBZvA}!zl1c{(j2h+qt$hWe} zc`ooQ-%?i%kyKv;(w)9&^Be1jk~MV#f3h*R+WTXv3~5{Z*DRJU6Z4~(R*7=yLN>oN z36FDjZeP2ZP3H7G_1~uFzRxXt+$tXIC-#MQ0Rc$Ksi~zA8h>~hJ8i*z4a8( z+y8e3#%=?Osi}Ra371 zK(xoNE5M~L0mz-Rpa-lZKI>4oUljhk^?#kT-p5_a?Um^1-G7$B1I(&s_prpuSmr({ zR1;O74T4iMF9LmL{ZOAPtd;yOsiwRtGI;;N)OoTM63bH*_%>%PU&d`R=&{T2y~+!$ zU~a0|pxi0Lm&}UnZZ2T-)XljiFi4HdVcItNm-rt^hb+HI&kJATZQ;s{WBzB2yw0!Ip2FWWokS*2BLD&Umn!$P+VY&{@hKU!(Ka+U4hEQ0chtX z-`p}zarOU;$k-_U?DX0XCHd=qE!);Yq|n6k8%cbeDh=idJDSxwp!SAm}4i8oTn2>+n{Qo!p z?V$Ys_V`;rEFyL7o%Qw})vL_g;2>Pcpskk_BTs4E(q@uIL*?C*WhHJB_a|>dR5R!* z-+x0LhQfcBXR6?Q=@SqE7IEH2M+cGqw6ZcpdOCV+tX~nnThSR?r-c9%d(X6cLs2(5 zI5+|WdEycaF}Dh|)piRwHan-hBDKqS#)7B)aj|t#Bb}QswH{W=bx1#8OfoDEs`^`9 zs$M18p!QkwG_K;je^`TtT$nG*Fv~OOKjU&1&usmXLk`TD$3lgCgo#WJ@`H7(;tnif z3}8BlFbzUEbdlFLP{l+Xwu~W@*yRVUuTHP7-%;GynhgOUH$C>V**QjEnq;uSAY*$# zVm0jLASS9`%NAT4Sn0RFTDtF*m>G}ADiT&)NcLFoGyS{zho`CFLzZn@hx|@0JD*nH z`>T!Q&1C8Itu2GD6reF03<|XTA>vO1;I)__qo|RUy=eKkg@?PNyGKKJaDBBPG;}sZ zG(Jyab0AA1{)6bwR#FL$^&sC$Zl~BuSzNEtge-`=CrDkDPB4@?5cF^%iO?1Q@$;U` zhY3r&nd!8?A9;59d^(82hzOTKWHu6neV3Y=in~9Ogq61TSZ*E5thR<8%+igIL9WO4 zr&!p|)-*2UuF<{~M%Irj2!==O9T_V$Rp%51kiUaR;Al%)^i= z4Fu*Y(d}{7s?f&S{Vtm1^t2|HHL~Pq1+}H(I^_cjER^-%!thw6gi)>=P8nWh$eK*!}L! zf7<35YvEsDPU5S0>(FwxHB&SZfzM`c2hB1l1REU6Q8F zqYqL`mM5sQP=vsN$5yaw0W}FxHZ76~VHh)vYuK-u*$6c%0hjx4Y@IHXm>t2)xlC#+IVd9=P}WGSd;Um$24iC$##XnS^2 zHtxNTIpo~4uvpCc2``y?e)k%@B}-A3hk4vX0L}v;_-pFgj_# z$%ELBZXMU@kD6Lsf-}@aDF=6A!D^z7m;*vPzxfuaT^?;wu11#)#uR!;;UAhY5tV&& zUVZ?`9=#pGS+Q>1e>ropm7lj_FnBy1P2{Fo`>spNY9$pn-rfpRj6x1*zy8o+Nge<7APQJXQA2q|n{@WRD`x ze*qNCdfW(QPMH=`omoci?ieK9*eG8MQ8M_pDOhy_-bFjOdc?Htp~;`ck%is9(&UyUXN_bIR0W+<;s21GWhVS1vkzV<_)Ha#8Lh8X_qpuYCari- zo0jzMpQl-TBoicTYF3W&e{{p$EtSM``-c9!oZMU#xmK;oICv`9?LoQ%`S$5$X^O{e z+Q0(_JuF$e`8Wf_=qicp+nO1oYFY3$#z-baS*rAn3QPe22SD-dkT(fQmnAdZgGzGC z)45SZe?wuY!@+5^SN#*NL&f;Jh+lR+p7ljrTNM)(*Vs`AR{IW6U_@E%{fx@k`}iSa z?~@9Hkd*PUfcctx((ZjwUr}{m0izIYnkiT==n&c&VtI4lcj-srhTknU^R7=Hc#6G_ zn!h!QP6a8}y(&zRb+b#=p2TU2C>F8tQkr%MXwxBTxx5~* zLE&49#Q5`9$LNnVqE6sgO_dyt<`Ov_N1bZ%47=2S1LQ0$S-;*(&Yqc00_7Qkn1gpm z{bYv9)q31!g<;I7>X)eIr$!ldGeX#d&!AaGrUv=o{#&hLU=qXOyxd&0HLNzO2G$#LA}L`sJb)``f@8gx8a= zV?OzOw~LPI7W&wm{Zk_S38u9z`feDrUm%Jt0Wi(F$y>YG{15$09f2c>eA_H62b&M? zsTq%mIGzQx;`r&!K4 zJN;c9Oj*b(-oeco458SCM1*+@sd|o$a`PMjDqHWHh*SPoPcqLlub6svx`PiXp)?nd zG^zjMBJw1>B=Q7$-PTxWx|n(pq;X1QMmj#LjrpUh<(U`LtmTwPnp$ORr_(tq<}6rU zEP3qv1@%E%962~1++%FK|U&HnFaLH@!g5w%LMr58ID~=go zf^Mkp-4&sZeCca684#vw8SB)JiKs$ni7{k%-uIrhIR$2FB{}C*^aqA!qhgmEg*yi? zOyDX@?UvTdlT$L?A%L4A8kwQCU72BKYNs*Sl$fn%PTcNYkCEv=^w2 zcN2^%rb&A!vTP~l`a;iZU$w3rapF&}96L<>k$ZN&2*t>k8SxC1Uw+ldEZ z89|#mZqgUscT+Q5?I8(Z21swxZm*L8?%519;x(dl6_hZnA$FOePSL2uruiP|(Io;p z;r8gmo=%k;tr$n4OYneoe*RnFeqQA~I=1}ZDIRA1^>zPd2iRO=I#SLgQrpNMFRBak zg;kMuVrG0QZG10HXX{Abz*s(Cr*{RiY@KizvW!y!sCxQs2;Zz&rV3nRf)H$+AL+JN z|5P_)&k`XD`p{@ChMGB|y$e1d(@In(Kz{(&i=k+w>3gYu4uDYOd|V-ULfXQke%%zf zg-f})uy$b5)9T<7D>nbniC2PJYeZ6sHpKo(f1073xiyq~@Yn|XdS>=&BMLr^c%O5$ z*u?rp&|;jzfgyzcI>K*3bhC4u0i2}fTv?eJd=Tw1jBy*yZ@EgU_>dNW08@olH>HX(s-snrNIJD%5#_*t6xavDLEcL&7<1w-xFp)x<{iwIi5NR>6tb zdkeKyZ9%&kw{`*xMVo^yk)^66WqPBcwW_$^Iq&sqBM)>`f34o7m6Mi6ECTUP|>V(%MTSw&EKBy`?9*5x;4!A!KQAA35u*F-gIc^bFN5*!c-1X9lPN zV?^t$kUUmK_X$W44pag_mw_@w;Yf36GlM!RNuV}rnFcVaH|p~3eS2!zL9>wJt$~10jiSSjm4`X5@>Pmzh2GIr{%E58<+<$e#;qh5yq|LG4jOFPZe21}4 z$9R1t!7xc7YU;e;1!LqoO(FN&a$&{Q;tvxRE}>mIzZC*kV~p^Daoknlie?=Yby&K9 z4N`!D*W1=CBc)sDRSVlI$u05upA%Qz#4NNI_ho~!s*@`fpe1rL)`ko9GxT+SdQ1PCfNRNDe*IutCd(O3rwn<}|B{JL%9 zIzhsiNcIA*GraTWTT#o952$yLZl~oFa_DhK4zF|tC>RtQS}0nEM|vYHKp59$><2(K zD1jMol}?PcasyA*=+bb`*Ewi_d=uty&@wU%F?zZC+=TV77V%vBpE}z)W%y7{)KRJo zFcN-JCgS`O;fg6PI`g`OfAPpxp)Z6Xt(XRWNDslS^yBe{_B(`XwMw~K9opoCq4J7r zegtu{AY!==6r!Ty@|fnL?Ahv8BUX`(tg0TdGUX|6v@`vOQ&m-WNHTsXWvdftG%Kn!^o9N_gRfe0x@}jlwx(AfhsAd^%cBN#Y4 zren&uP9sfDs2hamS4B>H2q43s4-JQNlo&E6D=F(aqo$$#yTZDeD(J}&Z6n4a z76<<8*Pgv~{9mjHCZD9pb8HMCI`qgG@r5hRTWSXCbR$V@_=<k%Gd=;0I_-HlS5R&*~FE!j8G?kB$0b#BJnp=7Q1D zr!g?xa`l#jy`6*e8Z8x(u~zE_FU?9g|KIgx!s(pdoK_i3fGEmsUd0gr`fvm}_gLF6 z<_DnFGhQ7J$h1wZUTEtF`dk@RHyf!&Qq0xU!C@lGSJg+ULI5S_@n=W*Y7#?F;J^4Ua0omWuYD7SqJ{AjOcrR77 zNPHW7@8gfkf7Z_dM6E?N5$p6+H(Jp{d4RglrwCN^6@P!Z{B-$Z(P$dxr->Ot)YOC- zhZ=7HR7ZPqet9<0exZ$E=8(>+OZtHnKB?>`_E0WNwr^PSpe*5+0D=E2JU@)T?(Ql} zYiq{rAyaTJkHzLz60dUa`YiYCF2f>_H(G?VB3ik9ovqcynp}!Bfd19hoEI3l%->E2)IH*xmxv&Zx=Cw~^I1h}{F zDR;OigofZS`fdkEq^k+43}BMH;sw(d1XlN&gX#e&!x^pS@GCNicx@ovahY`YB>Ly% zQocLKZB!438Ji;__v)n1K&S8E(~KoMIGuVEUCDLeRQy(>cvSs7r?uVJZ#k4=^Enr? zVIoJv3;DdBOi6627oSN-b(Ksk;|Sd*$IA-lym~S1;$J#?c)WP=Pz_9UCdrD)$m>od4$oaE6b)cqJOZ*EH``^LIo%_j*5~rBp9lfnkC?X~e&*S=G zYv!%`=5A$MdntJTu>!c!E71pP3xt-ZxJFiBQ;QmM9i2NQ=|ok8>PG3&1nLj}3&^MT z>{lOv{!P1K*)uqd=RVe?L-* zS3W*c6V0`DIOq&9kr`3w{%NexE^eqs=0NPE|CG~`lXU}dpxO$YVA-FBGdnYPhJSm@ zjgg9AQ8*} zA8hiIU~yk^Upt=V&hd8%Ar{50eKU*Z_4-o_7VyUXtQZD06;n@C7Z7kq{xlhp{rY64 z9l=VOOp_}dvnU4pT7$65ZV)Dw$H=IE+Pq1V07s4x#VfYuU<-(qBLj4FZ_QeSNQ%5i zTujo{n?XB^EmZjC7)cB?Dtlq_GJL0N3nMenXNxKk?E9P`1s20;T=R$W1xy;s`DxtKTiy z1f;a3sC0*o%*|aTY24+@>LXILiv?DCXZjeIsgO)zdLn4osqd!PIKmanHM@+iVIz`% z6w>EoP~#Nd8Ee+X+vezk0W>Sne)ovm_D&LG%YAvhUgeSU?mmbXK~#4Loa;8o-bjKy zGUtM4am=}vS!3(=6_=VgH3x%>hEz*2`Mt43Io=_!ZQL%hXK`2dqv?;uxb%{336+7) zd~@GV2-vXUYA8f$9{0y3`5J? zj${G9RR6t(BZ@vt4zHoVzZ|sZckl%?Y@w_|5`YEG-%JmjW~=9^d3e4cq+t7At8MTd zxghR2YVMm|&*ENxTSP>t`uM@n+(7N|Z1uwd{0#EHY?~Ks_#pdcRH|FM!Q5Ygttmj;c&1-|!zdJKRHuK7) z<9t^i$GAk`O&7lhoo)~@HU)JLuCztOr;xDMDITD>Ahpwwkvk0$gMc949HgnP;ilsx z`7tGx&|sEzyYCzhhALelv=X*4w+NW0D;>`z_OsOtc;l@U^ljWykY38F)r^F!^welK zIg4yOKQFQdZiJdN+)7m>Pqe6*pqw)sQpz4{x-aH7$kD-W1z#u%&W$2+qUx|X>1j)B z{<3S(%NOcR1K0l498LJ@qOB2$ziEZ_u^p!{zi)utMW}Vl8ap>fPA;76UH^Ip#Nmz^ z)N$8;=YgjR3w+;?7R7A_ycTes^$6`CDOEVF$+iircNBK@>j`WPl+1J?<5G(ls)FAO zW)^1#@ww}@9!vDO$*|1!UM1;8&C;{>gAuW*BnO|(|r8J}1j z-22q`TtcJh;44Bg;EU#GF%QsVPi4YwL{a@LthrgF-pd~-S7WkX3VT=`vAM&lzG;%? zr7UWRo~3|`)(GxeK>DgqNyus)D19mY24WVO=B$s5B8~63VOed(ObsOHZ}> z5V6@{p1BIloEHU1uexCpfo;@AW5oh6oegKaaT0;F5)zyV^%WaLP6Qb%0HbNOTMl6Z z-v+uVsTD43-uw;S0bG0&*lYNZx^nQz{(MMh$fX{$*={#*V^Ha!sXNFs%2Bz2{rHOG zxUI16US1$H3SvDT)S`RM`5;3KT%&5#C=p=3a*&yLmx%xFYsI~5ADV+N0i(teEC;@> zofQH2qY6|c?_pPJb<@p{UtoV}snKB8a91!`#?riUS)UO!)G=D?$?^-H|C5oBQUC_- z^!?(tTR1Vf?VfGhGvBc7U0sOS9)w9pb7DrwU3Yi)ni?vI`RTp&%(p_cRWRf=c!n{4 z(-v*Ty;<{9n#W}-;(g7Ki|T4~IS(KFn+cj+ZBB6$G69z%k3F1l+253pcJ~N-7jILy z@&^enZCpDif1i<`(TjhGRh7}59IVmv&{@vi4J2eoxh3v9W)&=>3nQ#!2AZCmKp#@O z3=ig>5`sG;crLl%lGAWX=%>c|pHWnX#-xBWJwaG=vZ2o$i`|fo3C;1^W6zF?n&Ij9 zKn|kN8ljT+y1HahWeBq^RKuEphk~(|;va5ltrF~Qwf#5lbA0r7VvN?y%$kReACT`U z_kJ3*iz^LI+pTZZ+X{*qL@9T{IavT(oY-4T@L#&WA|f(c z)gn=M%M@lmR&Epp!zc7UE@-$EnSOC&A9nY=T+m`m>(wn6(}<&bvX~v#7GMvM%5T3k z+Tr5g;&;$RI4j&UviP#g*0o4D=ZbGAT1p@jGy>?|KB#gJ4$kRSh0rZX+b6hN{Rfh; zj(n4-mNl~;WAY0FGQC%v0H0^miTqvP8OSIb(lMSil`RhJr8A_?Dnsy+a2v5U+4!k{ zIGBg@_(OL}^N{;v9N_S&?Tlh_(`l=vw4$AmS^EB2HBrqjL0;oOSR?~eIb%DM&)C}y zgS#!8PRe|}Eb}xR3s&BGl~VgqGvTZATeO&_R78EpgTdz{{E4@f%lmVWy7s?^Wg&ii z+7f?THZa*@jqT;A0)VrNG4jkscNwm6l1lEnl4qVLC#l0{Q8g9@&HL;9@tsD(| zVRC(imxuWBUg6uVlGkW(jm$`}Ive-Y9~Dx8as%f%DuE8{3n&lj$f(vw|A!@hJgTXx zvLC-G6ZDS?dRPZECQmvq__we*)Xkj_^-s&)`j=Au*d(TCP)3V1DTIUdz$8mw2+$$s4f+qwcIN=3O1#)r69 z-i#)kB{5&5f2-=Kx9NIAPmt6wX}i=EMv{JM9N3!JQ`H(Y$0TRCvk~&%!||Y=7tGWf zZB~Dj;rVCrHC)A^xd~KCI zE=Jrcrv^6P>DqUMMGVD%w{o#ZB?PU#of~MsoM-sJA>7c2L&T;>jlyt_8}uONr8g!$ z=Z%2AGaUg;pVAQ=H3-vi?J)PJLnFB-`UdT=S1Pn-xmQN zJJ($)q{K)vjH5cwh1l-)&X2ZODt>S-@eGhCY|R)FURflN2X_G`b7HpG!M)XTsWg7Q zhPp+btcmkhLrp_m#i{YNCfM6d`?rC7NJ-9akhp2gBzyDOiw`Af7P{2q;FKBC=2V`J z(3sH)+fYUngW)i0-SnbC9@PS>kZ>^X-FPb2p=#_O!NsmRa?OL#hi=24w$Eh$T`XJ6 zxU3=A{k6(iqCeKWOV_T}GdQf<)XE;UNWVeeq8pDAJMEYY`SaB_)yqu|YdRy)t}!j- zFf~CJ$0ve1vJ*{y8RF;fi<&1to$W50{nd?u05CJpugbiBCT(ojoX;d(KhyqTW)GMd zGPVq~2Z7K*VFd90VHhc_n-)I_YCtXQHPjzc^25<-CzIprOwJ!DscD~Q zHI-VgQoPf!5aDyJ>EUp@*}I}wzK4O@&sr#Mf@`dugdyq(eup**evihVpQ?-19DGDb zdf4InX>F{U8_Tvzc=OfHUcSN9*+!IZ*v8lNuz7k*>`{+K>_B>k3A6zh#CSfmaV~hQzJ7H>-N)iia+OJX{hc$1BY#QTopE3%+*|&e0!P$ zYidm8fZ(jy2qnepS?&6Uuw;ApzD0>TO#T}I-)f?!C|2sCNes0^>f z(U8sIv^kv|x#N>#1uu;ia39yljYECxNH^*|HnuBI>Gm2AQ^~>#Ir{<_DS{3}@w?w6hcLlHqc>`zMiX0)OuQpmnM)i1wTj-^x81fuZ6XT& z#Dod?e2k3j^E)2q-xIG=Z+0nc)Q6^RK;O$Dc);F?5$L-_HU6FELH#RaMsP!Wd-tG+X6y*S zU}km}Y#tx|7iFfCkxU2DLM6iiCBIXbhx1(_D%P{&ZVzQb23?BY@wD^^Iu;$AuO}Rk z;CO<-J{zG9B2h2zm*a4Nsz>J#x-S5id`WKdVVs3|VZh4@HYD8?DS;<=k4hG42+#;F#8$ zKC37!TOt)9xH&l9)CzerbZb1omu)A={72bKjmafwJ_?E^r)Fmf4gn@g6%&N$qh92} z#Zy}cPAJ09M{HqZPcr7!iPb32EeT%eV|B>jERp4SvT8J>qPdM^&(Y3}sU756UH|>e z$FOpC*WqcI0Q}JKgew-ZRH<(r;+-wgeTgnPDd*b-ru&LKT@h9vp!7cHDbK6;Gpmt2 z`DEg=s_5ssxwpGsNC9B?;*_2rVr^SI{EQf!rcT*(M`i2bDwHD`E3 z$Y7d%W4WvtCIFMcs?I2V=F(*CCfNXw0ppFrYFB*fVi%>8(lwNf zm801%_l&LNw>OOoOtpQxal13U-ditRSN_z3(|AP6_Dgkm&X{dvC`}#RgCI}zTWxjW zdCA4gYkd4>il&oXZRot~g+wGTK^%Cd6l5-|)u7W9X>1879)H3}B!69L&UupG{yCg)X&*SHhw1K;YSdaHN+eJj!zw*>V-b);;& zmHy7y#EUBaR+Wp(qtUd^#~2RP5l}#Sum32l-JCYz#`b^ijuz zoc8&KM}ypz;pDyv0S&->M|?T0Ir$lt{L}=hm4Q0dOFtcP;(W9$i4jl2I*4iMtpl9} z-D~|O8EZf@-}Hh*X87V7PhB7gD--q9D?Mg=!qIqvG4%dTjxLT^s#Wh z8twQ+hjU&AA-|2*B7-5@-}?KF5P*jYg}Mv0Non78y8LhyFRZtLO?mODLxBD%pfzjxk0z4fuimLN7qx@NlKhRtkDxRKX;N*V zfPi%AA_&qufrO56vK);m{`m)drvo_*1n zPskr{Lq|`Ce8AhUC_wUC1wCx1CPUO0Rh|(D7Uscu1=9cP^8&N%FfNdJzcFnlkw)kE z!)JDb0pBvW?5Ph!4c7^ShMwKqHkxTPyMjQ8%S$MtN$KekhQ*IHHj9J9$cpy!ux9fLwrJni zqEY+jyFqI}ENs!;W$D=P`74PH2?gR8J~8pfHZ*ld3JjMo-C#4!0-BPuhiQgu53Kar zXs*L_A9O%dE4Di~guzt`kFVySS}s5c-eY^jR0j`bl(sWprq?jlP{tgZ{={cbHG2zsE-D zqkNq);R@?GjiyPcc5IF!3w%L(ZR$fH-x4WKCJnzZ6xC&&QHZpfr7T)Qv3ZdVN)&Ne{od{LI~+SXQWGD?SD ziOpzWo4&wjHrrDS6q=yf+l&(G>h1dU3T4~Ui`a~bOjs2h)tDf;$#-g%R_Hrjn6gX& zKt3-TUYgbzP);sdspscMlTFO-cfEHvn$=K^OokTSl$9)1w#AFu=Xd#J?V@n(7IWui2*I$d^gQLL*o;p{&M|vo6y=}y$@-XPALC3sjEXG$N zYx(j4x}kGC^yI~{h;X^3xCCkj(^wY_o~zLdXQEDEE^C;Q8AvIuebxl~{hRVSEz@}} zig3SXhd*mBMr}=L<{R*apX9UZw!UL+DE)2-tE6)*-s7Ti3QOx9J|~yC=-BWF)D{Al zQtTQ=JE0$~4_a&=amcl2_$au+TSkC?^0-O3&||Il(7o$lbuhUugZGon9(|kpSK;y_ z!Ii(6G|$s?8DCnY&MuUU>Yi|{Mo1S6j4%(VZ{*x)%3B^@T-Z-C7 zpI9GYGmGyO<5Aymnp$F{gpQ$3=%R|zbrx}C?-gdU@v-Ykhfv7uX&dyNw^Xnh*#j#w z#w5UWIP^~y&D{U3!+(f#%za&hN-rCuZIOwXfx*ToNe+RLnct2s($n5o_dULOi=Wg_ zOmc;XkJ4zpvlw457?k~+#>smAw>`$e@&DCyh%0i4?io}4yPyC5ea(hTVf^y_NWOvqrE#0iHY7i$#NgQ`X~^Ql;;bM&EC04IbJIO z9-e$p$lgnCQY)1ez6-)8VY8T$gh1XB)pX&vqitYR?d!UV?z}Z#JE(QOCn(_I@G3T4 zpdvdJZu4#`PlEA2T)Qyd^*KNfAuDu3_|^QqVHb+x-^SUMn7^H&`V7}Dh6itq^~Qoh z%Grc^-{hC#-_q`_w9-^UC#XY>)eBs_JF^o!(hbTOW2Yn&Og71rPv6@2ttn}eS0FBV za>cF_Xmav>V*UPBUZ(X~jaOm|x^_or;jD7~vfgYQ`tZm5W-ikuFY$|fZ{>`}dx`rM z@odt)gkGf*nei0gsy3NKjohLKc$TL|xe=+CBR$ITn=pm==2t4UhaymCr$;Z;IGU}C zjYG};sID8&IsT74e$B^ev-8SmR(6loYjEO%Xz%+1E{?MES@COHWkU(sOL6y+D~Jv# zGX<=87x9jmJ&$24gAN9=)5{mVM6@$Wu=f=|Ro+5Kd2a(t>@d$bc78^qYjPXfM-`sX z=}pq18yCLyODOvc0`(r-!+i_mWkdBMdPb8P7Wm6on=Eeou*#4l`|9+SJwN6rFjosC z+M$5rUukN11NGJWZvU4Z`kf`<+HH7UHk?>CoZbq-p4TWrRs}={(1zfBW6rk+)v8v2P|lMYd9n^a z_$7ULcu1VBz(^WtUBZNT82@N1N#gWH@nDnX;l8I$>h$ReZBu zyojJs=tKUx;;s^hLaOTj5>2Z6*I8i0(}nnYxTS_vSblgzeWXl)OXE*qZC%^s(q(%)Thk=;aU2n z@+(tfmS}4E=w7Z)X7u*RXa+HI-M;Iq4a5P^5`1K(QGE8dChpG@Ysp+cu(5o~sqV~Y zNXR;z|4Bh<3X+}ey|xS$vx|FSa!88V=*0WgeAN9C_w(Hk@h%5RUt*Fpqf=U@6n2e* zi{0ZF5eR(DUBGyW!-Xlz?iB$9pA~fnbT9tv(C534~fH(nMMUx zflc|p#G2BATEeTQA#Q6;5@StuLVDio9Yvt>4kB2sl-XXJF&4rG?((Laj1K>=+EWKM z9K=diTMw{Nda)Kn`~fwXd2&A|bWn0yJp8xRcO1G$*0s4U?-w50zv1u)U2OkiJ z842%he5hR}_@ci8s#jOs*OFr0b?V@9$ARa??fKw?eDybwuU$V-K{( z>w>k!JpXx~Q=j@ql+bE(GlWRoy!5%$SS)U|#9uJvo#b@M;Gh>enU$a#?7L`qKCy~9 z_-GjJaoHS9w9h>b@VgS5b~pM1_CKa~s`*gvXDY%8I#?|!`9r0SP~nS@#{ zm0sI&QMu%<8W)Sk( z)0bb4^k;OAF_MQfk`tYmw#^{o=6ys`OS84$*viT%{M1-m)^JEE+ zIn*F&8d5!}n-8jRDsxk5jmI|@*1D3A6| zc&O{pLXSP6&)(x+68owgA{c2aMN;;T}5;-s_x*qu^k@>(IhscCeXXA&l$A@p=bW7*;qLQl1_rm0XEeD^M z`_A7w0hTF=)lS?<2Um9(luzWU5Y*EyR6@6E%L@9BQ0fsDmqeu)j;nPp62M=cQ49Ff zX6u{||09Fn)UL}6O@U6M+3az(^)(HHQn07WO&nzogV1n2Qdq*{(+8TCm^ZD^>A2eG zd5a+w?eEqi7M(W?f^mIl*d}EA6rhC;tT~&lfQnu8SVIJR_*7Phzayx&pBAJf18N`X zcuqD$+4$|PI-bZOuM)5+o})mCXLX&G-ld;2qNO;5PC~V-GYPwn_%<^TnkM;ap}arE z@~p*M5QL>|c-XeU!)5zRga+fJPpRKB2UQcx^vvqR8n}26+-pr@a=_H?P`l{FY2JQC zDCqryPSgW%`A41EuB7#jjrp6O!d*##?(W4GVf65YL?-lsJO}n;Rl4cj*+MEOJY?>t zb^%HAw3YZS{`raYb*CL$$!|(kN7&gMa1UVAidMw3nGPp_Gx5r zAmCA`B;~Q3sZrLdWY?!hYMUhvO@ggS7A}Gb7%S@enQQ<}Qwz>LmkATIi(qpF0`nDg3D($z|g4}QYvAP6=Sb%Hv(HdV;~#Z zQ*GKMjZ?_ZRkP9BP8a!RRX#%^?TXsU>BdsvdzGui;<*M8c$j@Lh1n|qK`d^BXLj5p zo=Jmpn(c!6|0>1QdVj42-g)|bD0-=8QLc~g`MTJgkz{LYCcWM9*B9?LjTbVykaP3KQbQ_av%A-3y zIjs-(FMtoasEUkXEW21+l>k%AIM@Lv=)i0L1dJ4#&|&0oFus5B5;u^PY^B*_!y=`o zxnZI3Y!V%}7&m&Aa8mEIsL`?D!Zv6A>sLdEK)rDvg9EH5|ge2 z)2jtTJ|X#y^l<1X$QKB7zFIkPZ8adV+{m_-zVMnW8a0?*F_+P zNd8mbN4K;a(|Bg=H{;y1pDv31;_@<7Ow1+a=F)mMX%IeR{z7M0O#=bjHxFU0C?W{#_<#wa zV3Zpg%+5b27E*h#r(>)ujinvaiKBKMTOI4iGyE?Z4!`d8k*qTVG8?^oYLF@+#id09 z&FAtadZYTu=oy>uy(Z3le)hIU)0_6k+RX}y%^&g&Pk;Se#rr+jjopB)MQ`6SmWoe_ zvtGQcQWN#O1I(ey2EySe13GJ#&JQ!|Dq%Mk{jeXgChqVa1B;4>Y+YZ0w8zo@TO z!=9TK2nDRRKtk!ky8HS2Ev*d?e^;{^c$Q53&gA`S-Ul-mK*B8)0gBn2rF!jGTRjmk zgb(`^Iqh7t!!>j{;guG>-~qwVY6 zoX+-Ojys50IXT@x>RE_St2l5B<7(%R#qbQ*gUu1VP%@^UY@qR;-%Dj?5pKo4 zv+3q(uGS~y5N5##z>6dE^~3so$q8IVwHwRY`DNtt!`@e8()r3{N3F&B&o(0d4UQzH z2Rf!;(@z9?@KXeiU8lzv1#Djw_aM2e`Ms095t=_P_NoW2&-it)^f=M$j?v-DHzSVT z)x(b(19~-$1>PRO;w9mg!#4i&w`|ETpj3D3(nX-|z9+!DsxC~ryrE>9R<}yMn5;`s z3M4b}Qm;uvC4^HMPW66&OH&aCuZAm(9sU)O#0W?Oqz8)Ozcl0!fm?rJdI{6-pl0^6 zS3NjGTlIClMQBIpaP~-G&vc^&DyuX!`VDy`ISkfL^4ItCAOo%hx3BGqxobEbD$T9e zF4iV}^viuy>MzBN>h{#I=Z}HH3NN%ciz(%Ji9>StKWJhbC)Vx8(&ilsBH}Zm*Sbw0 zV{@6akA#HD7?PHB-PiGmqir^7-srArenW%GC7+ezW6?o7=hmO&5fH(mtS$H*f3Sr; zqE{@hm~rvo0FN(nrGSf>e<)1$P`luu!?C`dPGsF!|(1#b1s3 z&3n#>7jAkpI0o8T4e6A3DCUzMBvM>_vuob<5OBN=-b$v+CNlsQb35{b+ z+y~0_6zQjLVE`a*r*=r)y9}gTO~y)i;oEX6(!Z&yHjahw#-p+vrD`BYF)ctRDqS>} zxUXhoX9*w8)aYVd110veYU>H$%W|{pDAPw`Vy$0kFK-#GX4C$qc`m4MU4sAZY)2HJ zP`2q{=+`B9ZpSUfHck%WQ}Eyu5$afbqsA_M@gSB7W<6WhI=f7*XQ{Mn4{K=9<~{fD z-5|DgLDmNgC+5c#_5pN0S;O#8_o|~r%u0@IMt_~s8`XdDtwgmeoPd*nGvYu;7EgLiD;G(V^Ysanmy`0Nbg>0)nV9~T2`IZq!`UVS<_7b@vn(gl*pLJ6k3 zynb^ncD@wXR*$~+y47lzKM|Zd-c`$cTeo;gu2*e-U8}%#K)+x`qBu39o z!{UKS`LO`LI`qY%2QEm)*<%nRMrqYY-zYtb`PrELkCVU_x87o0G4rhuRV$G`cW!zbeh#tlZ*wh=mZhlQIZh~Z^v#ow@*D-maiMU}L&$AP; z0>D)YK(hHe;(LzI( z&*qeJ{AEachL+JJ;?{Y+@{rJeh7R9;!{%&%s{5iwxQmPE8Y}mx`Kx zu4{73P8&|;l*%cPQJd#84)4`2j_#)5=4jh@DcrqzYbwW=^cV3vd5|2=cc?vLyZDOy zyrNYv*w~~rElc%}sh3CSYV!Fyh*b#gzU=|8OxV0x`HB+_YAo0DtX)45MF?ws-Wy)+ zRtq)RAqhTBfVnp%tmWr-TouK^-6Bpyw}(GKPNx1@O%{T%VIqRpGHpi~#Zlmka+Nk) zocnx^Ax7@HEPlfcoIg>Ee#2~|>yX|b49{$2yE-qVs$pSfA5LVKASyF@Gq{d7ak{O7 z#dspv8s43Qy?2&7lxeQIA zE>+67mrpYzY|Obi1Q8Em>z`LO(`yhM4+L6h!yZlVUzM2y0O?Ft#;Kw&-J0R)ftrwm zT`kYIr79O56EIz>`TK{B%Ozf*^k0l;K`;O;CmwnIRylugZD`J)IFq4{W>K1FXq~_h zaFabQ7m|!}zxsWb74P1I^TAh>2M6B7R61^mbyO4}Qym8u|1LXg&PQl{(ch&cU(61C zsK60LR!tpsQO*RHdUUxzTAAqGGH?X6dEr}Xmm5u^qSSvJD-khlMtsJnq%@@M_G+1OkzKe|Y`ISJsWf80^PMGP;ZO z6B>j-%BxvT98SSV0@bXQ(#O`>JR2WSj){0DI8_)kp&L~$;8QSwT5K{J!9hAXXP69Z zz%qS?>&I0E=9U!>WeHtG55I8Qxx7?h?wU*?Dgou_S=6}?bd44&viYhv)Hf8Aq`>O- zXSl@9AK~urC&`Hm2Xo!Yh)S{UjP|6wucv$&J?o&@JG33&MJc{jWSdgUtNHV7=+^!R zKx(THxPx1~#`H}QUc~uyXD5T*cB;c$tdp)gI{-v8c|_mzDpxI^gRch8hDZ*G@R{s4 zCHUcU%sTk!p@mLn&!8AcGR7Kf7)qoJhvCARN2~Due3D?A5hZC5u(zOwgp<3zJjCVT zWa@@63HT$~wWCoj=&hEk77slzaQBvkE~S1T4iV=^*fUQkNjB1G{7wx_jMbEbui6t+ z4ex#)vsBocbt3VN=NArY3lHj6NYx?Xp!?@<6!9Cw`?c>hfzFfm*+REj;Z_DRv%Z!6BU%P&oP$OL(htgYN|^w*>Kcd94TYN(Uh zf-+2A7t?B4VgV;ov9v@`F~OH_dbV4Wl;BVuaqyAC`ZLC zKtHCQ`UNvmU~fOV+KQy4o8!uS?Eh>4y-j2Xkj8&PzrK$Vh1h>^^S)Fl3TPq@A##Q) za9;ZXhue0=DA}YluEr)+zgl#RRnfTj;h;|TVB&oVP9V55`mDxOCF?QT{pT#t@1-S+ zgUSTi0c*=fBRNtV#{{Sva>M#Z)pmI8;nK%n5~NK6JLw7NU2hP)*jylm&V90_4q#!o z=UWu$m@&DwFN8NLQPM43W?CXN!}qwVQs;bFnJ)y{uo*G~9OwOrwUfnGms;a0B_w#Zyxue1i$*l2yMY}qi+FHzTOp$6{_KDDj!-W^hH zDkvMCWc1QvD{5Kp1p31c1n4GnKZ%H)RgUFRdT~~~T5Ov62)e+KywD+?;VWwBeTQ2N_!Mb<3LZ#m%fjiYQtQScGOAP87H=m*`Eb zH{ApM?ZWyVTqSDK5)fEcoxmP)psY?OXl&ynz+rHeB#|O2J1)ZUTqY;ZALp(26Qr}PxkJ!n|pVvTLDyv$gdn z9U))?r}K>Dv=kgbEbM=2)+UPx>}sA?nSjrJd*z=6Z{#1%=v-AS81ad{ga_LBn#b^< z44Ah)6}LFj^LeSSWxkgPr}2uue<|!(M^q*gHMWAb&O*Qk()oA!62)99+b%Oqj8>;* zLT9Y4GRwc?>Nm|z?}FZ@jb~%);FKOwp+gC!zi)vK2CKWiatUE0wz5qOLGa0a;4KhU z%Wy&&ptdD>BYzNpW^=7rH2&nO*9%xrIE%BL9M{?%{;s#hf4W^Yin&H0zg}Er;nWC) zm=){HB&gP)1X;MfgO_JurgnzFdTvasZ7XJY3FovCk z4Qs!>o+tqPLJ3ttWFM#9-AY7os(6CoI@Ka8hk&FjON`GP6pFd>Z<%Xbk|fH>VF6kN zBl4&($T@$q9&$PdmsU`Z1zgUtPZ0rzfTOHii6yKTHvtO@;5db17F$w)DNAWZex4Lt zQov)t{9}jtHq5^8ivBl!E(gr5x0~3hMZRtEquKeXffKV#8cYoD#q7arh8e8j9zx~K zUQ@L(W?&g8G#%}P;n2ZYX_uTLXZ#kPm3J^gVA&)&O1dF#l9vJ&VW}lHZ)I@npuMw# zihPKzjQxyJ|B@bNeJJLfB*<}tCX*8;maGmhC1>&cwQfeFI;Bk+(ZzK%ww<|LP$?i~4&Vo7h4 zY^#{_{LkjRbIc<;;ofcq*$XUGi(6nNS>1tkJFfJ?qwsSURyBxb{+NEZ%+?=EKg zDl)xvFfSFgf#0}We#O=XhVIS|6EUFAjBNJnN%JB0nwjtZlErdO{Qq6D-$qz%u;phw zOZ`y`osS!YB}S@ZP%0Xj8Vl!! zPNUTNl}*!O`<8lGcs-q>#&+j)Oj#%W34LYhUPXFVJWZzxZA3AyU0(T4@6M0F>YAlL zBsFcC9P_7;stLecoQ~IEmz|>H2evRp$m+YvX z;5PMEXH!sY`LW&PSy{WF$fAVZPEit2a@oTB@ryRUDdo>?e8OlE*ZcYJ%F+C8;)U%n z!7k@H(iYBqkirjV28O%vS}(zG-2pn5v`|6})GNHvRj3 z2npyvPfR|vBYMmIJwiwY}bY4E0~+QYGAIzYzJw#!nh2bXdbbuHAw$qME;=v zJ+y2T+OIwIZtiKXsf`aGjq1g+&x>T5V5h>g2x8O3xl2i#A1aD!U>g#qle5I<7iJ_S zd>V%HJnw*5uI6(Op-cE7`HPepaYB=gvZ#;jOF)@)Pp&e9jEFuXrjYchzg#%<`G1)| zM3*C+IX$YV==m?bkD}X#my{p&g-k*DE)RQ%szI zZo=PP1vK=h6-|n_27jMl?4f_;V3Xw}#q;O4=yw0-6zJwvkpCY3&|1jIZHoVrguj=< ze%JK9L3X})U&<||U5%IvDw3IJ-xbDafsX`2G=5KjW|#qni_m)0_bqCERp2

k6++ zj{KKa5%tzBE6_KN5aWWF53!fwAFuFrFtZVNScKQQ4UK~KL~Ms%|6)x#^;G02z+Z6l zdPwE&S#wL$I3AKtlRt?+8pBl2S~-Ql9r@1OHi!y?Bz^iG?7M>ZnNcKlu|1 zEeap!|6z1yoL>zd{`B}%W0yHDwy~b1?66?|l8Qi8fAMmcD^DWccOe>5_}%fZ$m8T* zMKVqHbJ%LAohnzt48V`h;MEtyU$W;2`OIj58%8@wvfE>-O`*nm3Bh@W%=N4tFL zIPVi@JeM7}74FvKU7bPazh4sQ9v^1&Y3W-y8lfgjW~a=1`lMFFd3Hl5$5<~9G4+=9 z35g4`Xk0yHE7QI!x}4o4B{3N876MVFCE21~-rW8E)69LMdRKSX@ctY7o=)`SnJ&gB z1}^!ORjW+(?YhXWIHBz0rM395)Ex2O;bmr);)h#B0olz&=AMC-bC<7V#wU!He3D-r z_WBd%T=xOALOcEA0LV$bEaDA% zHuH64`Nd7p2;rLUahJwi-j-Hl$5vq?>g&g{G_d|+=$txOM zzS_QIdb<`8%Tf=yn&hFawpW$Wis`pm3nhQ&AwazA9Xu`jeq5pAA5aJRllcyYry{fo zJdDq!e?AjcL(~#!^IEA{`n4iN5>#TclI6Qky%`8zg^SKT4Jxh2%ft6Vk$^tgn&0b+ z)5>en#6OmKxcjrK!Z_z}{D#;?z+8EHRj-j=c#RNv(2YFp;Sb3~dm)lJt8s-oTuaTd zVaz9|m{mduQ>5%?u|wTA0$d+FjO?j59AUaKtc3m6Tx(Bd`LY#~0<~EmyCvdTP<-@3B>*Ef~$jNr4B7@4HnG#R&t%vRAqu znr40fAZY^Y5xDbi!niOaUG-kTdCla47=^o~2nCr~L6CE)?{revu>Z3kf`i*2UFO-S zh5h>-D?(BsVf#Nm^wt(J;=?`r9hMqL;Y{@oPthR-r{a2{c;#_WX$g*uQ=hZRG6`t7uDMPkX?snIakWp~Kv>z(-(0DH%y>P#e zU4Nm%pTL-m(zHW*!^G{I3bBxs{rzz|AKNVmjL;3^2lpPlvN3<~oy;ID3b0Kg$E?mlDcO84Ir9cNu7Rl1ymCC( zJ=*4J%Y4ia^E+V~YTg}x5XL#{_bV!=UHQ}7^}g6c7^|~3Vi>V# zUfkVsMS4FBm_zFZcm>cv*$e~pW!2^|rc&R$nS&aiXnPE2-0TTxu_eC67x^FJR zTo3NAf`{>h5ohtaZ3)ImO~<5%wb}q94d(T@aRU0XaVV+b-5>oD;1dbUyoXoG-Sjk51+_;94ixbY1igGvbM9zoQ+Ql5jaW~qx3e&C96352RC56 z<6XTFQ!E)%+1dN&(lcf;kFMxZ%Xg}`dkKcPw<#~)Tr%CfG<;Q6E9(W|c~^fy!6Np6 zpN&HEnM-JOi7*4=O9?x++gLi|6&HF#nk*C6kff#!3{W7vJ0iebCObou9ad-li0h8y zdsX7Mzo%|@!OESt60^g6`;p-SVMOMBxPlG_c3wc;x)Ka)rQPByEuV-KRa6rfrjueW`Tk+3HvXz8+d#Ba zEaB$W3cv)mr_}m1A>sn<+5{adoGWvQUx2%o#s9FJiBAjlj=TRkE`8iBez5FijIxoH zVB6rryQnHzn~O!>_WⅈU{de$~tdtUI;n<5UF#`*;6BwJC6BaE{DTbL9p7fcUHkn5KNWkdnEPy|} ze}d_jTIex#ydV#al;oE31MQF-MircV&UqB>fX)P|}JiJ6dQt>b5iuqKZhEW#!2R0c;k%cj8KzM{pYyZ}DVa z&*gYv)cAGWujE?s-b#@bSC8W##vn=QaZY*u7X1rOC7?l8dV+b81OjJo38H$I)%x1qYA+cykP?L(wHx0Q{+3-apGesF>dW}@#Z_zrg3;5f3(ec>iYa71 z7}O6s*f1Y|%!m=EnBH(&GKTDlI7Y@!j%^-mNeEyHpO|YGr$cF_yC~3ALJr<<@C{7q zIa+H9KKw4o&&e8IcjHH9t#ZGmz1o+N0bccVQoMg^k(I~7@CgQZGG8L7)tvmPFT41i zqw%Cxa}_0<{piE>)~N0z)PVo_S0a$GaEJO9nTviM-w_O&PT({&6IIU34^PLZ zde{(#nsTDq!?n*|Id2)#EKR*=X}`JYVUMqr$R+!}#kJUVNpdM-A2hRz0G7?`GtPc*f#i(8V=$0Z% zi>%MNTgLg#zmYwezouCsmlF%w(+kQ@Zs1LW+hUkw{D4HmPwEPT3TAd4mA>Ua=H-l} zLmBR;H{&g$rv25u2{csRJ`=VvXRINLlsfIT4%>!!4d@34j2b<5Q{^}q`BHJJy6b&q ze)YQMX2lc4mH!N{m8Iyog=mF^d&Z#y&VZ7F$7TCV5XNw3S|*3|*#x!jS^Jp;w8kpk}rSo^&* z2UZJTN6cISf*54Vr<`m)*d5D$L%`G^;c;yhrWoomOb{6I*arTL=FSn-_m|xG7;#$U z6B}(7*o`K&5Y{^G#;<-*xh21Rruka)M-cgM7Y>2g8be+yY&TtA-vgUF^k=8UAZ$Kt zKtCZQswK)l5f=ENK;d_O!NV4f5ar?6vn=49wgY)q3MOt@&2Ot$$?{>JiAxDQm;Cm@ zm8x}mP;dU=$6RIt8eHqo-WhXAj}7Q#6}?p{PR3h|yU_Bf2r~9idWHm{v?4B)?ZNr3 za^yW=|H0(S3cg%xRRgM|8i`^~Ch%d5>hzhEFK*&U01x5t0bZM@UIfwbD^eF>O!bV&CCGUx~m}8)8<7bl} zvxN^g?(h0&QtS+`%P1YH8P3y6KiIoU`qVgJZmPf#Vb>$GyhZK`tI*}srk<;mbBfQ3 z_W|PRTuP9S;MWk^e%b;{+GvMwf=Zz`^>o>nCZ<(#uV#ehbZ8QXC=}e1PY2AeepFcE}}%|8&H1| zSRT$|vot8&L7uSge;9qS=apJR_wC3XRWA3UD>&`}qUwMp|MBC|aL5>v+!n@2Hay6j zxasiR2080ejkt0}Z;o7~9kIkoF`VNEo|3tyD7{?6E|d&=Ub#iydAnvh8IM*fRgo!t z`akyO>R0VdVPcnZ)Xn;}9nTBWG#)rca%B5>+kCUhkpS zQVve6lxGZ&EB+nUuO&+NFe9TECuG5Sr(+x5n*>2N1SW43KD$E*!c$Kle61vj#?pSR z)Bt=^FnHBwKwHe-EB|&k&s1T$Iy2QWK17xWa zyy&o`l}SvA4=c{Re}o?8dDJu?105MsoqU+3U)SOU&^(3U+)$ zW?u}cS7`K#HB2U`1x+}rUnTI5GbnCWm440lwk*^iXJ`EQrYy0#L_&_>l6l}(LctS5 zqb#oi3IuQ}BtX(mcD0EujQT8SK2Be3*Y2eT-wzik!j9Jl?r@}$=S>v@zv3oqWj>-o zQ2drap#os2iPPMzznA!$r?(8neXB0oOyL6AAB7AY=z4xsqMO#^89DtMj1wkmjwM)t9i4 zYt!@3diK`{g?f|Davd|GJCp|`y+W#~|AF?NnH=wHzdGOZnVX_Y+Bs!hg=MuDuRIMd zCCTr;)UM}6elqogzBE9Z{nIdl!a_gf4MA_a_bE#)nCnQZ0&fMXO)g* z0SK}0Gg%?#-+%UJ`IJkwHd|p#+~}lw&mvL{@CD<8yU|6Y26}CVyf^NNBQ5;;e2U(s zlfCFJuFyV^Tc0bOZuKIrEV~FP-Q=M&9*n@W#LPwHaMaxQ&jVE7W6t5kWMibB^nNep z^B{}1##a=F{;b@!F*fv-2M zX`-Zm-abU_TaSh2nv41`1( z*~-}-vm}A_%J!wzval(7r?Dbo6DyQ)=t>r21zPB#&Lf*I$9mJR9P;@UB_CvIj2v2a z@NC7Y$V_L(EG1eK+v-7uCK&TZlN3KY+7c+dS%|#=YXDvqs%D0nwJk0ry?k=(WZ(yu z==+0aE?K=8GA(~)4q`PsOQQ0@eY3fv%X`74`lUAJN8<(Lv-4X=G;_vjMg5=_&yDjHX4cDOX6eibA3brieZRj~f}y~NjGiaJ>MWr~MS@hjH| zGj(PYj^3Jg-nPCc-WFUGleyFN?3p?@J2peV{ld%prIj%ujpBL9PL;}Qy2ad5su%Fd zLcDFcaN(0VkHX-{fjcz?Ggp9Aaq}}DKrc}WX_1%j|3lSVg~izg+qxkHcXy|8CwOoT zZjD=TClFkNHxgWeyEX1k2ZFo1OK^8T{ja_DexB18-*w;2IjcsE@fItWv1$qNtV*Qx za$*^%Nnd>6AHVs12Q$Ke(jcVkp0eZhLyiT+ZFkiS#{|3x z;n{y3wJ|1FjuPoyBq5bKi3Bdzl{{nUqe&?f{C*-tF0VwF2#zXJ z;a6T-_?MKqS_9OUR;XpS$9)b8Z(8phr!vin&nsn`$fi>DX)q}@Tk&OxQE;!iZ15-h zOpi1)B|JU}$~+Dq^E2S{s6T=5J~yoLZnqn|DZowVV84s#W&UdPu+=6^5p@+{N2>mU zAH&L?WO{T(E2Uf2zUyV5=jjJRMN{d6Kkf7mm{?md3!d3HmzAQ2{r{hS`6Fayr49tM z4J9}GC(u#q<*7qJ_zLiznpSw6&VDYkKVjkfZV?a1DLD9QVdF`x#kheG24gjBvWkP3OKW#Fk_H=qz)HUf(6V(cip^ld}n8KdPJisy`1T zB;OBuXlr?$5udh+N^hH??P%lKK;9fi!B!Ugq;mt%kk_cgxTllw$8|E|_goWrrtA33 z^b*uTrhr?v1)G|aH(BpLH~xb7RZOQmlT-U**%lY25EyU$*A5vnTvQ2H7cNWvSm(tf z?okV|t!nJJPK{10k3YpZf&FLVRU+`YWN7-rII)HpLp3uWVDU{2le%j;ZEMWbV-Nq( zW-t+s6%Dr0kV%_D0iH=QI_{pJ*p`B>n%GZ|!uCstD$1dicmJp!&wMW{Q8_>h#_uQLMd^4weQ)u}pbI^R zXS-OT(SP@!BmAhvPjFm>M#M*_)8YRyy1j6`v7j;@KBOW@Bo>5bDo_^Bow$Yz75=0*k<<%s+PuTd8k2KmS zCF{P|F4moK)g*<{ zpT&k9qPh9p;59LM$=gT8_ExP~iGszu>sI3Rry@W;SMiN@M;X1_fhlUnm$KedrQD(`tD zfS7cbCW-@uu$$7?nQ<3YZaZSl5sM4YMV5g?{ck%dw?xQS+)t>Uf(n^@@>*+A(HN-P zdd!HNvAdD4BfJe$oogqdmBc=9pWA>PSrI|i4zbL4F^8sUsCEy_C?N`Z468>zxrs#z_(;gv2nX?o8nllW=OqKaR(>tfCQ(;)95pG|GhtSP1*(})EwQ&=Lm~N-qRr}%i*OcdWlUyx^ ztzYYcfYb>$m;IdA%Fknql~|wfucv}$?M_wNvw5eM-KGjV2{X)^xy2jNT$k_ImA z?aeyEDXpFxh~OW-PmVYfAtc0;m(b0Q?$><}yw^B7u{jLHqT+MgQO*aKsdKq=)|crK zRDUi78zAl2VWFH4XJhiN)+){XDfb#DkR1qtI+~m(9_=oJv zD0*oo6)ckC<2Vm98xBEQ>VMgAEA^vZ?uS*E%mnKLr6{|O?`v#^reY}epG>PH-Y6^{ zU=a;7-6h~#dQ!}({i-M??WGD{=IHy)pnFfQ$Q;W+>Kot;ev$poLioxj3%0*>x)Ch9 zOa?rL`u|8m6)ZuWuboN^B#|EuA2dj5$37(^3{OVdam-{*g)KqC;kxRKi9upQ(+LQ) zyNre98SV;;t2v8wXc|Y=zO}nx*JXNXh+xb-vT=F1Ixib?AS}v?K?Jp@U771IHgZ0)9wlq%e z9|J=SAz)bug`&ROt14XO?(B$%t$4X=uf-yY9vaJL1;ZYxWwnw=%V?(Mi9PM`wMjKT z-$kn{!_c2XZo2+&d*$2D@vQ793MG-vlXrVHQC4Pm??qdWsf`21h7m1aXEh zfklR>O7~kz-5G8lpri> zRfE~`UA=wk#=y6p?sdrDt7aA$DdCsOs#;Q;&XRIrq+Wk)XGvtPq};g(=j~VpHMv7) z#UZf@t!M%J+EZtyqI;e=g&@p(vHXKy+im9)p&X!N=#Ih>7>G{q#2k&uI2Q}vf{fDn z7mP*;Ab@uW*`!y78fLHW~ybMFW`5^)&FZpQ09i3qo&IC zAJ~33EG>Vr(vg`noQwPmc^4p7IQsA!dg1rTt@!$#q`33hN%8q6;P=IY@1E#|M~6R& z?fRFBE~#1ygtIO*)+Y(YxGVZ8~RN}{O75yf7>^p~>+qwPp$lFez%%?_*Wt$!;Cs@^MbmrzZa zoLPVqPStOmdq3h#Q*2IQ!iB^|hUjb59R2ln$ioeLu&O}dKWVVqo(ueL2UWR+^@Hdh zx}AQe$t!<;EhH@LYC(F0Ac}SWMUs0kLn2N4%y{#n(>t!MU$_PadWWzN$*j|GB1)hk zQ|LzGIcb6MXmH_i->69T@>N2OAgIp4gudsMxJxdo7kM8~el%2B9=Mi^XCBt9Fpr?b zH!_U`YJt|L2y|icu`SN`XpXgqK*lYYQ5ss59%cfziryh(U!}ay=tK|=N>P%c(7Bug|MCdHik1#Zfop(d3iszh^7IXQ<=-$gSU}%3&AJF=T z|I7F1pEwHw;#wLyKjGx@D7;9A28szZFc}eMT*uK5p6JygQ|3MQNi;a&8_d0i`fAMrCKMbJ7yg1vDHfF zPMv7SYFc3F8P~Uq<66JqN!f4s3lA#NNu6)Y+Q-!tBvEmX6{y@H)U!t|xb9y`w;gew zCxV@iEK-Q)<8FN3QRawx(kBaZw^9v|)x?t^V4vAN&EVu6dM?{-D^$+tlJ;oLwr+<8*9ur&g1*U$XhA(n zy6x=U1uA9TBQ(iEHMfm;aypsO757ZvRAZ{ee|rUb-jo~i?mv82Bq%}rOCaQ}d~Hca z+lUsCvcEMhq#plfPmZjx_xw!tg$brC0DHfy*(J{ZRq@k7Fjgmv>?*+m8Z$PQFe{?B zz}OaF5ySHD@CppuQ_`q{c*}bX!jpy<)Ly0Obuq1~_MUM_XhlFciL$M$;{j+VW6I=b zUOCa+@hZMqtVL&a38@G4a^YPN4wt|9IA^Y`}Lq+K+=# zzMz)3z$#UUEq_AP4_CC)oItMxduca1i=ax}5VY^@vhtB_~@p>#m#ZeJDuH zve-41it?N&x;dLol>oG9T=n+=?n))~c=Bq0p#jViu6CaakwoWi-Kd5C7BwCcUT09# z@h@F%IVh0q_4s_!TWXb`4{zt~JB^I41=gxxiP?6&-6k`N^NAkPUkEf%`@FN+RPkzr z&ig<$JD$W41M=^+oIF?~rM0CBD%~UT7NOIxBE`hqZJ_e|!b`VkNsgkB9HMd+*IG*o z??=d%RwY939qQ|Vo?xki@qN*TJ0Xrnq`-#>lSV$H}+L>{YS*_qq&f}OkCQxS}CH23cdGI!O-mo&q53v z>-|q)R>`SnY4ip|eg=0{4GXL~?IN1Jc~2ID8q6ph^_uOaFSw@_5{YbbL^?`Oe(+qq zyo#Wh-kY!92f;m9J}UV0U5!X2b=uU2#S9?`5$prApCsJ`Zy^A?dm^BOJ726?CIC;>RK3EV76m`5rAN-G9D(S&bVPS6tX&Q|tN2hlL zSraXk;UTxW@E20wF^VetlX-7`s1{XSSDJ`U)W>p|@nTpW^iYoQR2XR@7kSM~pz-~O z1nLTSpNS~R;RGEiXx7+38qD~O&;YBM&ib*;-|OivI-ZAD;DS15eM=&o0jAt^w_3h$ z`k27<5LTCARTnlfvyR0JaJ4Z!U`BA(W9DI%x2uDhpSn-!Q@i)&-_L*8FDq>yRO^SB z?2p@WuiGT`g_$!3ZOZUX0#O}om9p^b@2{%pN>UOhbW&FvS#&esSvbjq`R`YR)?22Z zgk=Q&XzKpN^QaKZtDq#J{p-IZN60Ye-&V>jUZuougf_2#fW`6@G-MDQl!}~emPMmD z2N+DGx^DP#g8WrX%aPbJR;~H)cR2;#^B=v!F}TPaCGnn0<~Yaf2+$mpxmIVRK^b-O zYg$V|Dpmid!gm4VFDeEk9hsrg&xvu_q{rJ`PGU<>c-tQGvfmn!#0dbV7DnjmR!e0v z=C4ATPVccaw!Fjl*ekV=yC5Z=n#3~gP)_IUxDnBzI=y0`m0QjEq9D;gk>im-=QC(J zBpsIi43+FLY7c~!O0*|53kF8;=^IMxgw`hHFySvWVS(Ol9+1i@W&Zb4xRLzNDgH}w zj=f+z|3}Tf#IwUjz-$T8d;Qm}f9I=0Sgv_>rKxIs?;qtYBKsvs-_>@UvIz>0)&#k-{{( zj$n0CDSSg^w)K}{j&J@8X$Ntoo*ZFMCSm(&VxDH%9VPSG!Wdcu zHB3IKLl;#bn$sqsjjI?IFc`o@grYHfIGqG}FpdvaBH`lnxz}rlEkkeic#Db@R@%0U z?7n&~FeG94(Vr5X9n3F}vohSI7sW>U6`~;3asZortRCO$Z~*UkvxTISl^A(IS-U1W zD7Hb4@4R4?PQ}dJ2rAawp{@e}C-~b-A#SqU)pN=gn4fkX zg1r>5LYtjYjatz^@%h^|1$TU_C3A&c@ldzf`-NQZMt0zd@8ydUNnB1Rw#^U{D2pQW zB94$ni0E~oM<-}h7R6iZH15v+i1Wkx8nSBDmpoE9cZvzAvnHc+%K|LCoMn{yTSvgg z9rwgxtv6tkz%BJ4_;pwH*Lk(He`SmFQqOwwyss&y=mtjV*ue7rud0}VY|MB*7OkHA zBD<>-?dIjg@Go8mcTv*Y)Uw5QoVhhMnkPBSYkx`NvO91iVhQs4*Pk)8+(f2N(8llQ z$fsjQIv>Q@%MpIX4$Rz3ful<4f1nK~A9*X(e$PYIv7kPGb-C<3!V;vZY6p+!50ySB z)IE%&%$*xp^{_b`)ja!IJM{HuKi6lvYrt>d?zQT)c~Ys9Azrm9lX3?KW8!kP;GZmz znb^KG^`2e!C)35MRgv*2miqpH!#*F8)(w7OEg4dc>nyX$G9%lqaj+%qMe;lQTdtZf zY@tfmM>Eo9T54UEdfPFK)-Ixk6k<}sA9McQULj+cFKR#1?7%@+=Y3yFYB5{&HV>qm z9gN0aLN#w}(99dzg_Zm>+Q-xf=yZ#L1OzJrf&9b+w*==|p|gNm5UNK$c6`MRKj%la zg?7v^Cp!Ju03PKW-e${>f}zB?5UuA#A|unw$%ANl*KkeK z^NwfH{S1|7ktbKa;atn9@%53;_s1#FU4Lz3P7L2&t7mEpE~@`r{uEUc*R-58_UcmN z6@6uZWlWu@#HqN=1($K=xrlj={Kc|p`%tK)pmM;KN>B3B_PL^jx@(OKg%2;y^%gEI zZ6W1OCllbMVbk=oILF*{i;QUSxfI-PJ6R!BIF1%k}>FkM7^d1f?3>(>SedvOb{88Gq6bZaE8ufQE=1J zHd^&pKi-O@uE92R&lWS+x8QXk`EFQiFen(kRx`z#L8>3cVp-zX%UL#1(gmv-V5{+d zGtt0`aNO5A#YtKFOHZcL7n zXzw}trr>fy;bCB1*H&ak<;h$ukNYJPl$6N@;2`$SYT}(uhF{h+8BG1cEZMjn_2aEb$=j6mFd8ttQn?hv)OBD{&zD84fRf~mN>mhQJ zI~oDGcEuG8sIRM|DNp;L-u5pS%MUKqMQvbd1El<1k`)W@2sx#L4hYJlt_tutq7n^^F%*k?IQcpzcY&w94r8=l?#2N z#@Df?J^x+nqP9FCwlYNq-Flwv2r0VGm z&ld`D++GXw@1q>2pp*~2X`+u-S&glhcID2LF;Sr%Bz+6N!@oV7{k|B(<2L0bAX@6- zDk_L^GnJ{Nqs!@=WM`EtQSLos5cXmetD9cLrL0m6Yr&wG6FMt|Z@N`kHkdH;Y_kGQ zdE=|^Qfe+VP-?N-z}3y~Qs0+p-oDwo{bsViWCA?YZq0p`8iLG=(4c;uxBK$^cJJYe~^qtHDoOE)m6*vNTY%)R3$*%r>bAAUlvVHz>o5={Z_$(%~Ta zX-dT%r!Z-7{c|yY=cNFqi0BztSB)%gX3y;Mcegk(yX&GsU*@>TlL?j8S$gHAreRym zdWbFQx0YS?TDYTLk5)d6yv_j37Y}p&&Ss^0&BHRISWTbUmCq|j zob;Kk$e|b|Ou!v;N=`rB=(bgfus`{%Ze`z&n=5=ymMH}P+K%$AmaU8e+h+% z0e3(f()v~Iz%IM<>!n;Kv!qhrps%Cd225(Pd=gZYvaM9qn!vVoUkos?Sz$^R%P*h~ zsQt(pxLvR@bbw`9=1rsVde(z;`KJ*b6$~B9->cU?oFKBa?qTz|7H32rXJZe{r}=aE zC59)>cI2TMD9MXiR-0*xo*ssDA)K>E$-Yp+W-3vbQ$A`FZR;?_gvS137H`Z29lqY> z1j5mHR(OwCpZM&|&6dGFh*KS@@mg27H}DY8#Wf1M-Kw_FdVa#tQR}6cx)=SG9H1A4 zmSO%!J`-bKMr>RYSpzLn8(>xoh^88c^Wq}3ITwm!WygtP%^|=I?hRerh_qROx5sA2 z^VUszGK3qKS)QqL$w$2^rrJ=~b#@|8sAOUSRBIqWLF|Tg8WEQWe_FUHn6WkDo?8!a z+Ej}^PAyxgArj|rcK@~}T5Uwm)oFYyhHolg5XlU$kj;@gE4PblrAD)XfZQM3x{1Cm z(3j%5cj2!b{czKLznSE7Iwz`lG{bkY`SC1AKRdIYL>@B>s#NlF`-%j+D2qEngq4R94phLFa2+kCwb- zQ@yd}>K0qmr^_3RtE1#F#yy4IWBQ(ymtu3gBa@mgyIb7c&; z+XRzWUCP?0FW$M3l}D+W674#2<$rZ&5~VM0Kg?GOzA68xnI3r2cPN)dP>5O#b>@Qb z>Vk$iMx^-5VQ$OO z?(p)BmXqtb%fkl$k}V-;`I=$n z3q>10WyXE}ohC)|4w`@g23q#0vyy;gtWL!&wi26>M7iVgprH@2jVXuK`De}VEz{W% z=R&IHu@(7EUt~yua~ujrMMyvrZC90rN0X0qKGqYbvUB?7N#Ys;c&Z(4-({8gZl76b zhr9e*;CY09z?a}bzUFb9CCm&Y=NiQPMd&kG8uJ5Okm7}Lux{$<&uE*d+iO>X%nx)< z5kGTko+7wy*LL+RZIpMzJcOEd(7?#Nf0xQGQT8h4AX07ehr_NijvT!&H$je++U7ov z|DhtQRO0u7&>@ojs4=0s=y(O288?l8nuL(u%atx5HF!cRr7_2hG#`4}@nzu3qq z@s!*9T0Oe-`eY?}vH_CgbGT>@&MgZ7xmIne;fuw>dnz|&XfK~J~S zI4w%ST15u^tmq<)LXep`EcL&BN;;;|&|`RlhhCGz+q~^%y;yK36krhOrfne~9*w)Q zu07}<@NPJ`P8G8eW!7lc(9)%w6J%k>w8eR^w)=L4ZBbV61kO(Rk@0lqUM|h3bn;{S zGTouobD0TuK7hp2d&B7TG;5eynVtt>_J_yVahY7pj#|0A(lsngx{|lwB^3SG6-M;l zzl>26-Zm0-1SMIR$HcSuV$q_db&_ewF`~tnxtx9ZQq4{k0OQ7X%ivYGy@}l3$HmYk zuKy=<3;ic^GctM(bsoWhpLj@Ln^{Qqh;!;2VEQ8ciO#NZR5 z0<32fwmSR~J|~GKlp&qAwuW*EUC1aMA@kgkC6Ut|=kK;=2_%Y#EFL6r*kn)c+48(b z5P$hFx${ADO?YOCGCIFsLU@O;OCU_>#0WCKKd61p@`K{hwa=Jrf(t5U^+?0Lr$;?% zN0>_OI?2hQ6(&zfZ(dol_ix--`qVxuMj@YFrN;vhG=JtJ4=-u{z=&20t26<)`_=GV zkYpBmTFi3H>7H-k*88V z&iAJwsx!T4+ql&MAm)r3KZ3yg1xw(VwVThmYnT9X-u2NOq8r9kxg5=0oKsB>1iPQq zK(e=e$`_e&D#d@3=Q(ULa&u}hCTWD#RVM*DHT}xT5K2_=w2_oK=5lwFU0Dn>f8rev z_XAvudLGu zv25^}q8;aR&p!6mD91#TT54(rYw)ML9^J>^n??$DE`jo7cc*EKrj7R6HmJ1)WCg7e zKT>b;S#2ewJr1^gt07=-8jjDPe)0=t&rh+Uq0uUz15|N0r)u_G*J)O~-P%{??+oDx zG9zIO9eqP@^gLar`*`V2(LCeN#O|(4Pj|9N6`QsNYWFX8Ssgo7D=S0QQ;Z7Pj>X~ia&Yz!5DLO8J{m180~xRg z*KXw7}{&z$#f^d?A=!MpNe5oHRDpDAzP3j1p@Fnnwy18wz6U#qL{u-t9LPOHbevzaaPsINuQ!&*K$c-N9^ zgc2#lz3yWJK45yNeC%nER|ahGF6$b13cl*(k{Yp!|GQO)Z>v(Y_X!9w#*g5TW%4{( zDhyHN72sanN4#b`dD449Mf$7hbA0(#>)ZylvY5?vc-^;a$UqapCxUz7IU-g*)TnDBdb6 zmR$M&j>$?@WqQDI9`_O~%DRCSZuuK0wZ>G%g;H6czI%tjPQezaAuaRMBRV(tMch`2 zch^5M_&DL!SzLyfn$wPJ=4{0Ylc+L0Pd$X{a7-RAH|D^)m|)HgF=ho-eI>e?wGYPm zwWk#rOZ$5+U8va&u z3H7)UNb?Fq_QCVCsXiKy7w@Uz$QM?zeX(4Z>1{6M*5IuSC3)p!%4VOus0=0tOePH_ z1q9AQlFBBW#Z_!`duW;D@t0V3s6`Sdl7IV=P@{gL!kju78S|fATIy*SPfow!*5PZ0 zrD|ErY_1abL&+z_#;TJg)euG9Jt_FRvj%N|GDfG%c(g?1YCr(R{-0U~TxUq?vrpu! zZK@x#q-oXb1=y|rlkPJVZ6;Jr)}jlPK1xKAk+isP!YlE9Ez~L8i@Ywn^0QVUF$D&w z90R2XrnMYqvUi!@tqZ?k(u`kilRjG0$$PsQ41G$xeOyK!db43BMHGx)+5VRn37J;dS4pFn=#qi6np@jV26j&oO(R9cI8yrK3! zHghv>Cg;yY0YLEf!-2J{l1MuUwn&Z%HT-`ifyMun1k4W$0n%cwAnaV5wo6mZm$!3{ z*`<)G(Mo=;gwRfu0_O*nceNmKN9`B<0yYhb{z83@BX|Kp!|;@Lr=B-<;tC1XO6%1Y z)bO_oMbL-XU1LhAXN;{g?cyHef8wJ#xty2UrIk%j20vhr-hD}898>U`B{pxP`s5j; zwF;0Q`+mto|5fU_)Lj4TngHr!dIv43*V-i$uzLs+SYnWKMDU%T5#@G1EqnfNDbDft zlZ|cn0=|x&s*sW=(Dm*OvkeggJ|t#ib#FXWJ^dF4??SGxekd8Wei?g=fdn8zN zS_l;=24y0OdVa2BeB(Ba_k5Q(Us=iaxsGd=?$mAj$JxOqTlGxyltPM#T0eTZSDN-! zhf~G1V)#piXOpIDy>($ppP`r`zdD5*(!^0V|+GQEg(<#^$BRx+;VxDaOM>^8F{T= zU?0~4P==y3)V__QCLuNGQz?M_oUx}Hf$VmZ%p+I4bNSCD+6$LYKPaIr>2d@ z#K%Y6Qwv6gtet7UIqZEP*_(aPlXjU)WzH>Qh;X2WTyxF_B|2M4B7+NLi;dlj5Tp+Hoj zNL8licR4lv5LD-E{mi(0NByF7ApZP*F}3CP1zFK;U|oU^$BP5RIQ+NCLmOi2al?10 zYmsaEO3mW1+0dPeZ;O~khqA;RpOs3ZEI0Tvl~TQ|#kNl;P(1^4qKbInt?-Z9o|7I} z46Jdww63ifAsN(p0X91K6;rg21>X*>K_E&BMkO-9$efz@mSuy?Veiu4XdF6*upUm_ z<^QClm1Y86G?&|p$t8*%`s4w05axU=#=qi2wetL>4*(u}mQceS5TSFa<8nedko{Ea zR;%mE+p6bQ(!~HdT4q$*J7gmv>>-h}I{Sg|G94IdIs$UI$-Qlzqo_U1sG)jh(tPP8 zRBGC)PK%IBN&V;3C-9i~My>n}6rh*gu3ZM>jN;|cv8{5%n@t$TL4gAn8J6rPL#e$u zW5GSGy(tzks*aywpl4C;N1j5^E@Y9B(96p*!~DM`#9;S-BkeZVt=~1?-2Eco0jsW+ z2M^CQ{4a?V-zJI(b~5a$u}@7;S|4Of4evfGa-rgJkQu4GlUND+pvZXqa`66k@>kD# zUUAs+cd@2=FT~DaOoLe_1_Tv2~FdCejFTQ0|ckX)Van`{w7sl$LN<) z-QoR(P8L`_std(;W;$sPjKZUWoSqg0bNO=g;(_X(=9GzafYEiy`-hp5a*bmFYD)CH z>Qz__fvWpHl+yMi(i7d>N=etxNA2@e1UOmg1%r`!xJ&nCGw5yzB$=xEutgUOg&gJY zo1&Po@=e1SpKRSz@?3HmUq~$_hMx83hM9&bO^wcN71wQn)kb3*5#1UBo4KJg-cH;B zQf&Iak{3cF=gOoU<&m$vD|;uwWf}_Ap;=S)6-r}JW=K&;Mog~E&;uNmj&>Art)TdR zAJyp|+Mq6ZFw*PGk@%14xM$ZdJ-1t+07_*f;sfD8?_f`yEb=_={P?)cz={r~#g4KM z0uzPQTj_EkQKv-iuS@{zc$Zqwcx>en?YDFhS9!vlFs|K7IaPS;NQ~d!BHCsQ8%3y} zVlbSG=MxJDMx{~Oo(kS%>p9n^Y>BtqS$+9|zE;~!4~`nuB&9APNHRr#;chB$7bHJV zCq*LKY|kGSe=0xGG*(N$^AlqK$hUzP46UZjtpJpYL=4TS>o%wUJfj3n{N>P<$|foV zk&8DxgL2AlZ=Sq`ils{_;Wxc~I&F1`K-1JIl}O3{@{G85Ptu-Ve=9JXxMTVvMgmtH zq!PJU1fKMDAMmYl(RkKjt0g-b;@#9!l@v5tV4CE1EqNT%D5oGVbET0n#Sl!+J8}8K zgn{wOL==JXCGa+9_Je?AF5t;pXowBkXDU>lBSG)Z@PgQvEx^_2p$rg0>Kk0rpk=np`?vovL@Z(9>K5yC9^JnXf{u=k`*5BQ?3KP6X>15R(C& zT=r;MfsY=fs7{?SX5)aMtkZw&G4uh->M?!LdFJ=j>E_wZlV!9exy+>ncSMQRPF>HN z6dXLCggVs*?ac6kZOj7K{4a%XQ%zj@3=$5??N5wTa?qUX`Gs>9f7nup zC$c$kkP7$ucM&*F@7L(vTU^3I?{=H{z|s^bd8TjKW@<}5R_s9WIkudYSR?#+S3^Ij zq8+Dp8JzAk`Z+Ze7-FC1CBt z7RdVH05k8%Sq60X>*cZP_!2gkyIIt8R-^L+=?bM6FC3K+AcR@fEW$=cY|lSQQ47)e z)c_bL*N-(Rck3G`uf*K*t4whe#16;_>)ne5&p|4NzEcHZ;gj3azW^4vVGp;LMNjMA zCWhooHMC+I41R#@?pB`@;*RK71MznSxBeq>Vwnlq?0JLcf1T$VQ#MBX!YyGP{J zA+nBaIAQ{*Vtrm$rnG!<9nGPLI;e+jfD2j*8Fq`M)+UO!lQ?X{lhf_ML6vTD{N%VROo$nREuiVVR z={U=J@SjGUklK3+pw%Yc41ZAiM-~>vgnFDU^E!;~6=0H2Hb1C+Pbf69K zFt7B!YLhDQ%GGcm%-0#*XpY+V4BHX42YV*$-t*JxSqZ^Ty{swg69GUK^fF_wu~>~c z9d0!jEOu8q-=`MXTm12;lScaM`=u^jFbw?V^OI7fSmwjo6?vwE#|PuX@@-FiJ{nE? z0y@GYRF1=7Og3hXJqwJj&pD?0QRmzNK&BMBJtiPL;CR#i;6u3ls{j_gLyl^2@Jj8| z{HH=E+<}CMRLU#Vy*!O{XMMT^a&=hut*H9AXH)dLRN090E+mU%^;#(d?mdTc+*c!? zZdK$6nd!*Sv|}z%(64MgFPf8^NQz<3&m=1pH8wUfR=k;c%R)+4Zo{&K`34KTIv>q8 zBx&C}AHCeK4jD#@vK5_O6_xe3t}T~bl-vnAL9S5mf_HffT~$@Mza_Q$o@=eUp6LzY z-XT`hiD*@mlyil4_CLa@jj((Lvd4u)Im`w9tG4EU-_dUTyAhF*BucH<_T@8pCn-o2 zJCGHsvHa@9(N@jhJr3w8K6gRzt4AWO_gT9Ws=%7!pmqUqfw$s`8IRYMuVs!rjMzw* zYPOi_rQUXAk<#H9o&H{sxuO%YRLktGQONKUM_-yKe=T&{!TY?wUsdM&yeYs5kF@>N z&GwE+`{K`9cNz*QmZDlt8}{AyE`ES>Hi7`*Pka6R__1?F)SGMh`NE;OM6Ire=AQsp z0PHRXy@|6iQ0QKhVeTOR%=cr&LNE2@{YbK?1j9yw*6;s|zax%V6@)wG#lp(6Zm+u- zV`b0f-oy{_ebE187o|cj@Jo?%UL<5q22ww4d)#}{6UAmhijzeDi^v;n*AOV(NkQ!;R*7L*y-HI{LKSs7M@8Dxfiu#G zS*&|s3ut(g2l`DC75d)%VQL?4$+ybViWl1-i1>Ha)!qoJG9>qE&)AUpxDG}IC~t*ITe zU2TgAg~%kf3o0?+b>7pPS0q9TD7Lv!;<#{1m*f5u<-cL)q){SB+t$b3Xx4J|0Vlmo z+xumxw@HuhofYjI;D+s@5e4aq<6}_g8G=8nP%9{R)1Dob0H}}CK9zs?g_OK4hpr znPfM7lK;%Cu=N>E*y8SImMn^OA3Z)4NkF90kklQ5)_~YoQi>icsM|k>U20XJNx1x3 zNDV^cP%EPx2q6?R> zsOb{NBT7#ISHxoofmDPg{_a3^Cb<0)Q@-M*K4C^W97o1}2lVpnWDvKnhbf-LUGY8M zxK^dUKTX?i$tDsieLYW_wU@H+!fNVj#_P+8_+eGwWMH2*S?WomJrlq25DtuF6V{F(@DQ?9Y1iy!v`PS@p828X_%4Im%Q<@dbeWZTMRU zIdHqJ-D`@J)BTQ+OPO>3KlSdCc1Sh^P=(-|83~9%sl@ zWm2Ud5oBR#<(+&-RGe1(yA1cNqA%utr1x$8x@)~j!Sl9b5F%e@tP!nEwGL!baInj6F%x z$F?pEZ{f%Jwe{`y4z91iGc*&o91$sc(T#_~NNE2z-DJIrj8tP|u9R~T`?sZ7Xkcjt zS~dtf3BhAH0S@)X*P_?mk6yS(3k#Z>Pu7AP&C5;h7t95etPhUKycoG*!l&fw zV5|jm2nQhw!$){uXFM}pX_Y2xGcB-44~NOru6xO46jc?jqAx+lh=Z7n{||+aYI)7b z{5Dw~w<~)=m^B?$VC{;K+z|U)GgowGHtl)sK-~MUHb?OV^Ua~!Rykem(8-Lt+Pgb% zb3jFp`x2!0-q9L!0ta$#dHL*)_5js*HN6<+_w*HUHzp{0@6FPHQwG5aK<2p1KrMQ) z64_m00Z&s)0P?(UbqP6ERL&o><;{#nC?L-?;|@qXg25TPkHOD6A_krZ(0KV#Y<$mM z9Jp%qt69evady^!f($wo*sd{dQ{MGe8U_7QEV1tnBEYB`z^E zkn3b&MpM}ZwgHF6zF|7lXOYLs-o2KPe<~-?qu`eUT*;NF`la$ zcDAp9az=&lYa!E|FXi!m3n@Q+#OtCld5D8QRWy>TUzPhsb zx+Cnm*5cbP8vA+-H)@{`rlMZIyC?zl`aJMo<;bV^`7gv@v5vFd>;xmt@w&ZKDBrsk z?C&f_y7JfD^zPqS7ld^yo+E_WY)Db{m$G5oBSfgHLZiZI?ST=i`WmXLC2Nh-Ya6Hx zhRwvs%}M#I#Y{!mEnOuZ)@>?R7+AdK)Ym+x7>pq`D}8QjO51JY;|s4GUU`QfsmkVmjGX44P>BG(*EC{$g6bnbeA^ zE2<1%m0((;9vyCf8yR0Qg-=yKrZ?Z}Qz=%fRDYNVpUe@g-L4=46M zk4FzA9!7wy8O7(FxYS%(+G0(DOt^Yf4Fl_r&Ww9qO$gi>Et)jD>r<$wm^|lcqQ5%> zt^$%HJ7W0FE$9S3$IVF-8R&#n5?E4Sk0U;$LK$vLm0~w8yBjz~!bABoNLH2A>Cpg{ zYN^aU_Vuy7!2kx73|og{C#3X9xc6pUluG7(!l?LW0n&&l9}G}Nbn@b@E?!dQq(QLZ z|Hs!`hqbkB>%+J^#jS>vV5Jl*5S$j*phXH4cbA|o6mNmx&W03s_d}|-z8I~4Y`_YgdAl*sjRb^=qvLmwf2XUdEED?Y8{$S$!blv9Dm+)y*ZI{u@9AynXKYs&==g z1a~Y>%vCr)lPYjMSs7zm+3l|;bY0H3V^@!Cr)|3o7=jgkE6SaVk3xl(F+xgK+My%( zsU)W^PJXphL*qx*{*Qv~Z$kB|q3!$}tK}W7h9zTWW9(wWU9Sk#5K(cp73amKkUss+Y-7%|D4Qpqg@(uUJ@ZV+uc~`^JD5N8tBr3ZDdF z>VWq1Cq2IW6t8{1EMx%f525o{Y}+B{*oFX$-v1c_3ovk+bu`iPDbNF?Hq2EAYZl)d ziYG<(qcv+cW32pev$6^tisyxC>kG`b>`*MO%*Xo5q>X8Df4!}4dRKaN15 z`KF*s+e0?f*`*gN0qOHFqc;UGh$#ZS?+#*LzK@Mih?e_93n`>#J|knh|7^ztjO$NLva_&*HHq@|uppf1 zC6vw&A+@Kc?yI6^=Q6d+Ju#sEo9k;55|V)ScJWowFs$I4cv-ZmAzE5m?-LDfZtlF3 zNfq;QnNzhbKX&wwhoUz(H?VF$`QYzj^3oIk7$Vw5>RRCj0xa}sM$y6#$}7mP=2@CV zl|%{jpK1tJ`T`>9dl^K%`GSIisx3%_LV({1iW^rkf89MfnRpYQ)(u?n^uMOaZ3(eS z?&jw9wX94VOKMeo{i|ATwVXnL?0Q zp82!j12p~<);|t*7{Tc&9}jy1zZG&_Cm~`Ii+pa{&8DPG^^1H6*W#dpv;z0!rpwI4d(HJm*fSY(_x9wc%6}*49xck$(WCcS?LZXXp4{pvD zK*7nCmEQ}LA{LkwNeJ4a}xjhiw(%Sl4 zvPA|iU@mqW1!WBlx-=XKMk(&cqB673T7>t(H{eQ-fh*Ax{MTJz!EQ~p)SSf6{0uS*d@LFv3jJ?h1R704eB8F^4)#M+G&+jt_ zYC=E&%7>5;YX!MlTymC&JUk>+tctXJG>HQD9_9={3RD=$@Y)g zl?Dqs(`L8$oV^?SszxnfpH_Q({Lr7NA6axQYPIs`O7!zjAi=+SmL7ip?XUm!ZPlL( z3wPCYt~H+BcmSR&jxa5 z2g@JKfF`#^DgueAAos1-CgwaH{jwo_HbN|Rj>6=B{oH-~S73NJp6}hwnV|RaSKg9L zIGj~BhB4~Jpdh*iT>1NtS&N0^!^^#rB;Jd ztP+m?E)^H-*{+=fiwo1i*f;gp78YNbcwYl!(-XFy%iVHJmf^E2v^~vClrLp=dAw1- z*LvkR`PRcq0V@=UA}jw0V3r?DfAu|IfSxg+p`nqG@pdtL$p$nw3iI*vFBMk}{!ADy zux7j3m={KJGokM7VOYnY_9%%f&<)Qo0$nmCu}Vc|$E~$ny^XKgjBg2$R4yU;KPj#@ zdY{MN93SmqHD65oX+mv2=v!cm%nHW`z>43m=3^8HXOs7@@|rhX7id;)evpGh7Uji= zD>q@jip|PmD!N=^;v$sZ$|$AH0`#M$^hJK_56d&738bdv%$bXN7<~xL&CRD{v#Drk z!dNpr-@Rsk3pj^#&wm_j6y->uPpGK;#C7{u1=DeRF1;t?OX~-4O5u-$=HQ#2yMXaK zGcZt&BbhC5c z$qs&D3WO|f9@F$$5My0!6xgv{t+$-bM^G7hN;G*a&AAMTdfr~F)%cVG@khAgze4S% zk(?a1``&yMB966la#CCWveV`I+-ZBJj(80?v*<5(TS#5#XKjm_al^WQ2^U{AnPk^# z048XqI_T^UWB=?YWn%#FRQ#GZ$HwDM&4?@=-ws^{ef`XhurE4Bd=iw8(V6XmKcH#qAIF;``yoblQ!H>?_gDJ<@!{CPoTPE zb~ZX8w`BbRxJ6`+hh2x*$e-Brs$Obu1UG$`UV`SEdXNr--f*FY zt7Mg@OND)UPO|oQio($Vf<_{{E4i+tTNC?~DEhB!Bv&dtU^N3r?sM{#d-7HMv!j2R3k4 z)qz}p9_JMi5vk7On+?gy?8_R@bwHIdLM0p!w`n>J2riZ*F!z*SBl5IV8f?cJS#c4T ze&O*|X+B}#n}TbBIMe+iF7TX0*9PV=KYJYxdlkL(-RO?WZs2{jKuz}O7}1&Xi|+J| z2&cFkQd&lwOcY{IuYQv7b)Vhc9B^O0yEsj)b1-dntXZ%8MP@Td55E4H_v_CQmLjtP zlcGxpy5W7hCy@)Z-?wBIDAV=UR&mqIuz$CS;4kNPv+b>NoQ`S?sUEA*R5$)kv57~< zZF?L-eSLk$#4M$_Y;0_{@Lnemyw4LNtBr-qo;q9@T-+X7xVTguYHW1oTwGi%GTohH zm)0-g?Z5_2fTiU0-%E+ENbjUuo(i7PajGHYhP)|5y_>}ZdUsI@XWLW{D-mjMxCN9^ zA>rB}h?lo`a)uICk=}r~LaHT8)|+aGQztSxXY9kan5AM2!UhlVC2u8E~)dFa-`nFr9)kupXzUfRKDn= zs|=fD;u6RzJooWEl4VX|ryZUeLtQZTPhJTU`-OjG)P|OuAFjNG28>I;@zqxX>$hI3 zFnJl!8%RcM2b+%s2>-&XlDKzMv+^6vHnxR2WEHxiLi0y#87!NN=0j}%3iKlRu!gst z*}o4@Tff$}<9K5!YZL8MEeF_Q|K|~je?gu<(M0RcbPfLE;$k14_#d(89WWS-i+J|u zFr6(Jy2)UC!`gm^HOa1rIPhmuF@8rvB1V}ctlYw|0uRYEJC_%e6Vq<>ufnyoMHMT> zXr1MbmZ({BIxy6W7B6so>BQ&QzuNv}vYO8uW*{R1NVq+*J(udUb(8hVOAwKR?jsxVWY$ZBT`F#t`us57u&i|t`G>NT z&r+^8h=~1F*5!OU<*FxS$y2uUjIUd9DIB(C2STx(d>vjK`-$!EpGpqL$Ubo&)tY`K ze7`_>e~Ec-Pb}-vu6EjNN*>M86D86UK#q1+HOPQ;kVVToY+w}*8ys|V{3$g(5ur& zKt?MeAps@q zz-gPuXf)2!luDrA5E0FKm60lF*0|M0Hf3@%n?-yaWb~N{Eg!SPLH(g`_tiV25szQm z=M07Ov-oHH#7;@$ol1Mr`ltdBoq$kY|DT~(( z)GGXr*#jH}iRC^dyv1RMOPJVkJlf*cF1i)K*;Iq6{CQ6Ey?V1~V8a^f-PsejO)yP! zY(LgxDQ%$Fbn}JK{`}ooIn1`URD{a&fZsTLy?gK-Sk#RmKQqBW=+g*%I$-6)!GRnFAl6`5$JPHA+k6JL2U9;5e+Z(or%4JDbtzZ>MC3Y z!t{OGC(%_)gj{$1^omLTA=fBy08i0kjmnw#S}lJ2I4%0{;X`p;7Q_aIc}ha8i%u*V>E6nf3? z@LFTIK1^)WOaPXX3HODF!U@P~G+*gcM8xQ>P&72&a{V9p>z>#dPc3Gv@Hw+L-^`Tw zqVw84fT;vPe&I8e)(N~Tk>BV-u15cNE-1S{xs}@=G37w^zA}G zG1#G;QSNkXvC7Q|c~!EIdz3}vEku|_po9p3krn^^rkQRpe~!1q&}X`7qLE&!BqjxE z+qB&hhc}=b#@!%y*B%ie7%Y!0rS?B&C;90=kWHtHq?CHm%K0m54`>m3KK}e11CvdI z7)uu8(eE3ZF=7|8tBrkHTPB!9VPz%nPKF?nw-2a;O(;FH*pj(OU-TRqTz`Go4>PX} zhoy-*0tlua8H67%c78hJ05bW?-FlAp=+UFTBQp{OF_vHmZxZuDKiRiN03yMVV-(s3 zfk8oNwzKtWxCZz0{#gN17ux~a+SI8;OYrr-_k)C-bIbpm7xV6X9*N6XGWTR-eI&OJ z`8%sfucq1+yM*5s1z62lm1KgBD1x3OUrR8Fn6NfCyQtK-!M{#ejJOx%S~Go(fPn8( zSQyaa6X?*UHQ6(xPpFR|Ng(5Oj4B>{bjM<(93kCl%5&qIxK2A{OF1XyntHlh;ThUn z3`=8lJk)UuZ(DZ>aFIf7(Rt6!V;=LP*|&j-jcTrX>GL$jj+>kY&`UJ+yM-cVHuM6xPG(i%!n*cTRp_rlpn>aWdCTf*8ERqiN~BArWxa#Z-g>mbO?+)0RmDr6J!2LorUYk2gxianz2yjoKG68n8(I?T+l+u;kJ_WCUxz1CMOhDGFUnd>&8soBH_ z5}$Rz78RL9WgW*OiH6>|HWS4oyKZrhSZNfk?d>6j?-9o1=LgF$l8K2DeKkEjcIEyB z_VH?fVE9m8&OgkWO+j0;k(dUTJYwkwUbwc zgcq2GHZGgvf>wwk+ior`B_*Y_0Q*meSxw)Y_xEYW0JjsxQJM3ht*y=7fy4~6sO^@5 zjZHOJ6{3Nbu6gLPx<*BT>d=BoFNCI}#JPgk09|p z4JcR+01aXe;;9wsHZaa@r5d!Qn6_W4RAVZ?12gyqZ@}+vwkG$t`J^nYgY{iNXmVc0 z*Fw3Dzw^kE5~I@s>j){3zP7R0w00#nU1?Ebns zwBUhEbSn7n3LacYEaomQ!$WNZD8f_*b}&oqWig;6qBd-Ruhf7Ywc#@XLx@wgZ0JAxKAf0Nda^q74e_h z++*P#g7?Uph+@7P9|6_3C6J8D0v@NIh#?1iNRc7*g4uEX^J##M;J)y+!4CW?8ii>a zEt>f8m4L|u$3ahH--pPeNy_O*7UjIPDA-+G4~ukmNSZpSuEsL22scf6{}?w?Ez&Js zYwHheahpbCEzcwZYhPKN_!D=OuYFSgB0p&#5vdsR2 zwgt9t^Y?dExEVZB3s#gv4uKa*>t=R6Jl5e%gU#=0^Ep#L9x=9%k+wy2cx||lwr)E| z-nCin6P<-l^?W*YKe$eKU*F*N?QNMx3LK6tV)m>S>)?EZrJ8Q0t0!U=H6y1XLU}%4 z(FxcdG~0Z|wh4B-{nh6u+-$Iu%ga$?lPH)p{Rka$ADq9bkh3axWr+IhkH|4S8zLqq zmQz%WB#VxHRNQv6Oh;Wq<&oIrA^7E~mg+-2YZj;YO$@;8_ z%~iL+cNZ~aKVk!mf%APqkGT8SW}bkJO6#fszA%LH9}KLk-WQF%-asWGilMCD09YEY zD&)&gEO6-CrnEREpvAXQkx9A4=NUPB)`ph#6*@)m90XM}qHJNR5JJgI%`64ckPJ{0 z%i->g4`bkcsx^w@tA_a?g6nKPvAyY4fQPh?_H4o^4x@cF7@GC6A!8iNttI_C@bG{S zJF}Z3Caw}b$&_mn{+Lxqg~PSjtdq!|Yw(~pHnD#Lmz`r=Adjo~+C*3*XO8Ksup8HN zg8Z1)+smzK&MP2gEB%nUay2|(z@e+l@!>T_r!A#)WgBX~j)|)qBWb=h3B{KT@sbrh>XHR=-?n@QAL^_g%ufv_r2Q3Vli#uM`yBt(Weox7`dND(4tE>+qp8Xe4y1EYib#x9^t2hLIT`&lYh7#_(Q!&k&g*1%(@u9`l+hg5# zR(ipX3R+LNTj^HYS-ul+i7yCDj3+QL_CR=V8c)ruj3?08p_)YFeeH$>j!8WF@q&$$ zQw!)%?6cRBB;>+kZEd|jZBw>bRMsj96aaRc_QZaqztS!UciTrwFniWGE=pdnu!7a{ zS>hiR)h+nZz4F-Y0%{NiA1cj~6k;=Hw6#DHw-Zg^`xy%Tr!TvoA%H;HnSYq1D6T7lfFm%4bdSlN@)J#OIeYGJ_BR)?0(sKOHu^GB+ z9}v18jXIxWb2&|{k8rx>Ke(k>s=BRFD6wURbMet*)20B8uTs*wRj~@N3T>GehB#6T z92#zcyqiI+^i-qMLvC^2ItZ?xI&GGOx3hn|zAZ-Y?%J*dY2Az;A_dR=*cZnZ)~C%T zUT^P`Su^?Ow)W(_vTBiLDdP8yo8a|4(YC)6eqqK9%9YVMiQC;d-oW_DKK*jU^F$@J z3?^CubU-mTq5}y`7-|dkk-`^|>6t_f#W6tmE6(a8PKGzSR4NR2c{)opM7Z=UifEK5 zddA#b(SY>Mu_nfEzXMyo*Xkkf`BRV@q8tV!ckrb+tpc&D?H9~!%tcxUhERQ(w6FSKx(1H2Em34ppdhGs@ zC`(F&g{kh^m4_}%M5VNjz+NZVm64} zHUGWS48|Rgf11+`CiM#o_U3NvrSrNPLG^12YkuFL;4LxP0lkrxA;QcYzkV)0e;;bG zWuVTXEXXoXf_tOGodk4?uekfl3(X3}M$Vgrq>5zp4}$6=Zp7EPCOS%_ibH9uor9-S zin^XpyxE3#c8-f(9`pdm1kpb!(nRpYr;({Dv$6qD=c!w^;E<8qxK@tQR%1f{+FQpC zOaQ`kj%yo5-N$hQva}M-%GgH*D&QN*jTqjyZqw8H=34o0l?_pO_3L?^)*Fr+;Pk#SzxSC`(&KnP0>~NZ!;fVu8A6!fE31> z6uPgQkd4w6Yn_n4#<|h7hiGS_eYPvGw4wsQ z8|hBnH1aRmX_8_C;XnZ}FMK@4|JqbjTidiVgpiG!yXONg`F>UA4Z+!hKR72RM^#NN z@IFnxXTXx4n+{J;7iuD$VK25EIsoMF`VZuvGa6omUe@C3`cI?xN=8~bd2ep54u z>Mh2s?~DC@Beb)5{4{?t66&v_Bbd(6_)U(4_Mj~wneqjaDWe_i6#bf4M6qvWtqyA& zU(-C@=4NAtKeM&dP9-oxP`S6nXt~H%y?N_@pT08zX_E~!jP41}~(a{N+#j_TzFnG;sUmA(dpXw8Opq#ZJ$YaqWY)yBlJFiqfgJ zBpn23ja8_Nvva%^mK;zM1fuUYz#RfR9i zt74wjHJt)%D2BNwIbQ8H@r<{Df%_y3MK$lh(RMRY%T2`WWk-Ze_?d`Yb6Y(7^qsy3 zf$2+C!mrGceX(Tmu$nQq@(-nBRv52F{C*&$a{)Xl0wkjM(96BwiI*NI^uje8W3>vx z!^2h8)pIb)0lq&tg1c2G`ThQ!$AVS@laRBtS81^)GYB}N3~Lo?=BWTd&?@>nncqwS z>1Fhh9K(NTR&q3wim9_lH>!Q$Bw#Qy&1K9A)BlJLSvwPOG^l~DJ@{Fo=uwKS>R*jW7cirX%tpT*^8Arzq5*lxr)i z!<&_>zO%i)QUdYPI)lG#I57sEPswbSH<=t?2;o&+eP-`dU)MSJme8kHH7-qkSb-Hz z^H2B zH0fo6U4M--V3*_eLb4(GW^rb!^86c}#Ne)crBvkNV&Jb|I@i~0U^#%=1FC8z7{vgp z1$;EsLoqSN|jzt8j~*33;|KjJaMxz2K51nP66+h=l4(<9fa zq^Z&fA`i7XS!!2!{YRL&3DE6F3_W@%+PS-I%oQT<*(E`N2m9kTQxq5eM2@xWR8fld z>2|{#(~FBEEP9~hO0N{;hRG(8KENxmGM*h<2f{5tA}31?Vmpp!PQj^(%K2FV{0G;y z%S$Kk55#u*j$mhF$yqLmO0(`%nal4(^!uIKpGHqDx$S1`4sXnLEn9zQuPM+f8e;?% z)Nzg%uRI9aO@Ei(1@&MwQt=s7hO-u_Ay{gvtJzFIG=%^(lCZKW;I+#F#1HqC7XyG+ z?{f{@YdK>CvU;0Hnip6{YePL#7MUfAtE|E5ysoRvgEt9hu9R@}r?iIu2zI1XPq1fJ zjq@YWv)vJAu@cX8bIh+jjk^hq`yQOM=9++XF{PA6*X3(yXb+mxlHAnY1!!u8?+B0y z{WZh!mb|tnrXxGDVLjV!uNrR5%#;RZ0nuTRnswWV>6-%LhONpO)9V*T^8{4&L4}VnL7bRw-`Xf)PX>tgN3_W zZCvAeJv>`5%ilqkk{f(dig%G(f&SfFlT=v z+yKNdXJIfgYinhx6~@ij20Dzz{wmD;5V}pc2g)WtNGjGd7rn_c$NPrjZ~|4@(aU4M zK=W}hlk&^>mp{CRGUH@q=YH=O z9`Qr6P1_JS+EDFn%%ggw7aN#|6z4O8wNJH~&6q*&B;4OMC@;18zUCulS_|g*D}NC7 zKDOLRSmwxPQ{a*Jt6gnP%Tbvp#>4w|pOPI7z9N>3rkAj{FI5MG2!6{^0_+kTZ@33n z6WZh5#yR8~DsTUUB|c>TpFg!bqE+p4SZ=6aIzK1 zsUJ|*ie_!Iiu3hSM6UP5IiCyyUU83|iBJ{;!v47qYoQc^i@B-7GGobRB4ScEMcI{! zliN7a_qCXu!;$dRiZzoBR%D4avM{r5L*j3D3k*&|3P{`;BSFsANPUM>@MKe zee-rR820!1C0IKlIbN659ll@j?6iDFo<&E@Yrxy@DwBuh(oh9dMiw^<1M;QB6-0$o zw~YBUI|p(x=NGeal3p^1ttq2T4_Fom2Gl}d4!fl+vWN{SSrizL4-AxOr1Prs3!FG5 zSI2hH#HblgSJC(U-IAt52`{pQpP%0g@l3S!z=WofJ1mkR$U0+c7UbG~frh(#~r z9R^NNHh;(q%(d>$47Tqv>E}djkt2fr(;0Csis7F*qE4Q@J6#2zLPCpfj;~*!GOf8h zlq%FMKFyZRQgbzm%X|IhGS_I{+wJC_8@bQf#7wW_%VBVM@q1>VHc+mG?<)UG9=}`X zV@doo4Cs%2`qk)YDJ>r8)k|Sox-8;UoI4@4{T6n-jBLMkzKL%Gn#3M)sP-jTuGNeo zYo6fqp>Sy=#f!z4<|5NEFSGM}xu?$YnRztK z*@RW3ThK`8Gl044r{&4kI7X?a0f;^HX2P$=x-`0>W5(@xFgQmg`(+OESwD+3`R zVc*S+LmPudx?4g$#xJ;LU2KdI5W`--ek~5@tPV2{;dOO&WMh@bN^U8lgKhql#Sf?9aNihcclN5>5wq#sKU`&$yrW!2{zlq{V0Y`1jah+ZLa_HFRc@a2@Y<12OS8$thr`6U;#Uwv<}3eAjV-^%4BWF7hg z<2&_bb(vT67wV0)|3!etFO|^HBB(2nS521$>Po5_8X8iA{X|kyQ(;5#jiX62iWTcsNL*E5yo_+q!`rmJo)zkhUmr!p$mtcfi<+TT}2 zGZ<84UjKh(xA0{vJG=2+!XN-iZh_X=eo_i%7vQpSV*}zk&n-?Q_zu;52aSj!HaC4b z&fw`}|ANtN&NSL2VrQlASccED^mMeB$2ju*lA+N5amLe5RUi|Wa7B1Oag?t1cDky^ zx4R^gdm2jG7PaQj~wFq9?wwGr@itt(jmNcS2H-OaPz8AwB?7 zWoB2mo0G|9peQS6YWf5Z4==s|t*EdtzI+_;B?TY8-X|D&jW7bOmaE++fX~R4jZ#O` z2CBKi`jvVKRgc*I9~fGO=u;!_y|tgazO;2aW>Zy1Yd#{{AM!^FB_44zYw1JuKX|*p2$_~-O&YLvd8hX<6ayQb%J6F~4^sZ;DgdR&i=z39Bns?c?L9emcSQRK7~L^w*T?HGHS!Nr zmfQW^(Sb7i1Aju_r}q6r@k*_?sZ#CF4_Xf!(9O|B+}hcUkn_|?IScDQ>wiGu0KOAy zGu*hQ;JN-PODf{0h}>1jR&l|8bUn#?jTh54ZBkdeF^h||{WBpRR6g6=?!=%2zY3qF1~1=ykKs_>z*6`iC83#wGyq<$rBTI+cn6%iDt}s!95L zc$9w`SJE~-9wjjU=^SV+n6Z3c=^z5>|3`K-VkHBy`y8C@T<)xjhCa>{2cq}`Xt51Z z{NhqU__9IFxn<>&FlbiH`Bg>V_kC(baQaKF60+5~p<;~$6K|Ry!p5rT>b#aUC6cqZ zlwS+A;keb4QmeeWCxFh#E8SBm%<{0N^2Pz|ST6yMMwiivKZ)N0P0r{7vB-w!W(<6Y zwtoD+zW+BT9N(4vrc&3noYFO1f43ENIBYq|K3-t9Wg1y(Lpl^VjV6L5-NyE)d+$nr zOKE3xi(SIh7V(?YA@>5DI&5I@={K=7h^!9$D{?|bOtRszHiU$LPbi@`l@_^>W!R+;ZU8;a{e(Uw7J^|q5>GV}NX zD_e;VP%6o(u>{M!(5(zOWj75oPncv#91;k-ee9>F=R!BUD;+&7SG=aRhN>Y6lsJrm zGA+QFFSuB=uN8+4Bl;loyTcdW?SwreR)91t)wMNn9|tdx>nYA|hMl8}Lr_!9tJxOe zaYslNl`DBqyJ_0_ZEE32trVn8FF3!=ytDpRh}uX$YT4h1#%|^olYWYL$fL$5J^boOPQd)8fHd>Y`8w_T>RDauvU79m&xBKC6O8*vZ$!BXOgM=vgR( z$FCvEHR0=%Juyt$g<6P$TeJO50Hq0>?#@N*?>id!-<$~UH6O)iX*oGns9&)2@{)~= zj0j$BSHbYKd8;X?slWQRiaJAAz5k@sE&riok%lv9V;lPHpJ1{mqHwk95DKK@t?<3E z$Rw1O=CO671=fdB{R3*IU;b{OH_?-4md?o&^dl#<7o+(?lBJmjL;75kl=mf@bHe;g ztN|ko;uadlR{LR0?{6i`Y{FY0lj$=|;TWc1`yVvJMwk9eVYlmiOo96P470AB^2k1= zg;L1(!%+zVKLQb!kKdly(z`CBW#JzL_xwWf42k-k-bRm}&v9yw}DhAhW&lc($Jd)*uVy;cDT z+bT`tN?7TDRXJaZ)A+?|+#&EZ!@|OVO(bOZsn!EZ%ACAB8C+QeOXickemosuM^N9^ ziZ^1-?|d=zSDizqpqm^L@M4f}TCd!<+uLqWxaoymU*kF;%nx1Y0L`8ij(M*_YbdAB z))o#Rbj-d#dg*^&>Fz7-aQbrk2gJk=*>FCEq5dAiem{u8qO2*U!y1=JMM9Q?Rs4HU zE7gElJ71vs@n7o#sG!0lxOnb-jco&JjZwH(_H93=%He0( zgrwG&9PNB)YV#!a_o%;0THGBc^4N2CG7^yyW7$PlTDKKIt4vM}P(JWJbN9>;MHNd_ zmTPa0$igR-)qjgl3%qbF{4Pf`*}<#TADpLjEz&??(fO2MPZ_ zf&M8-y?4WBMa99v!L9&bL^RN42otCoEk&Wk;Vwl5n)Xz)reW~zGfzI^r_`y$&?y&B zmmePaDe2yeNAJwz5m_8B)A_#q=6JiJy;k1XA-%R8)wz~Wg~1Uq)qY{|X_vV%b}(Ng zxB(p?qKqKucXRmF)diz?jXzhp2+$ezaU$Ix<@Wk{TT|PD$1$S#8`W7Wu{%WIwCv8J&Sr2efdz3LpGs@Wk*D(m^Oe)X0Tm*hwt>?} zvO@2p0f7Uc)PcU>cg4w~n3UyP+F?9w_{^eLbL~A05aY|AMgh8=?b!y60^^r1zZDJq zE>@ES92otsmzhA>?7B|u41azzC;BZt^YhLp54dMBZWrPyg*_fp8& zF6GkQo&U(v_#Q(w8i+@~vD%#VN)q|?1^xt-tj06+qImRzDD=XA%qIjEO+a4yGW*LP zx|=>39?72f2x)pnLV~h>vI*54ke^QgueMhd%RaYH(;JZwDO(wn493w%Y($!U#1~3Z z=(GW*bB;T(x(yv$rcPvDl*J*Do+7>~?;^Yu#!Fm(L53`@$SFGE$UxI*@@zA0H>yMB zwj+IedspYd9q>HeimCnXdBX;Yq|7u)Vpb66=1;e0QKeXJx`{ululnG?Z)l2nrf-h~aA568CNKmYFJOgWV zsWZCzd*KZZ++rnm$2?ka#J!m0YWF-5i42M0nSX$q?tdNJ(d*4gr$+=5^vVfxvP<7wf?W2K7v##1VTw+(b! z&V}C!!a1T=@rKr#vgSk4$Gh+E=Ux3AHFOoGy$|43wozvsaB?*>Nb{w`yg`99b6mC= z*%+W8a=bV+XGX}g@F23$m2lO57f|sYC_wUK$IHxq#;5I$7bU7Q6dAU716p&hxS=nd z*nNFE&MmyjATcq+H{W8n5{6)gei!D~XKi;{`3e!w54r=gsbJd;_F*cIg9dI$b&i76J$nV2* z*t|Jp0lh=G&*62msa+UX{znW`W9~64T0(GhtWu@rbMyDdZ-6L|%Jl5lY^aVDDMzbw zr#SN*cV~rG@r^G&a%&OP(ZQX2+qBy-Z}-?74^nD}v1l?p9#3uFTDOyP1_*TqTGu5U zwF{O6*b68hl|5bl9rEmPducY_;TQiSw8+w3$Hunju6`}ZYh&znYd*>tSF$_u4r?dT z8Yer>%HBg->v&Yq#FymHIGxeZ`o_n!LI-Qc%?ZTmlfk|HT;02@5$g&t%Z zz(t*zR+j$|cH3kdueN`w8xGi;*#BW~hxqCjs|EB}z2Cpf=zH(QN-^BrUhVClooR>g z<%DN*EFDW??N8ttkCHxI&fme)KGg3xRIH7qC@E}0SE)r4qb3+T8Qx`M2JX@Z%|8rMTEk$C@pddUWYQApvPtfTzDrKU5%k(MR}Zf@^2_A} z={*}SsrElo6!6MCS0UnNbC`N3@t)|g)Z(!~XF&0X2Pg zGoIWDP@cK%lY`hqfuGi(e0~Wi1#><2=H=hTE2_tCJ=f~vWtKp=IMB|QJ>^}Lhah5~ zKb~ZTD@}T76o&XlrX>gnrDYkkrA=&|=(PEXHo9%)it=m;_ z@bkIZ&J9Ly8!Brq&d)R(o^Urw)}Y=Nh(sl91R+!4^zoYAk<5ec=nzKd{Jm`nD;YSE z*J_Xx`;moT zO$&_ZX?X*SyMW`JCW`?f4KD_;=~6yN>tu5rw(9)4b!)PW>ggMyZ}G30?_g4ReJ4}$ zg|L_}I|*BfGhZl5AjLX?z%D^WAL)(fvSEG1aX<^FzhCS^Ec#QdZOtO?+tjrDwx8}3 zQovHaXbA%f%v{au&ql54-_;>b?4b{?UCBvKK#qqwwW=B!2uRd-@0CjyjQPvqzVNKIAGpB&_ zIu*`HiFaO&Z$c_bKGSO{QKH2b3Zile*Pv;EnA$an*Na<26NkRM(GQIcgu-E@Q}Jn3 zTh}NaRP9Yz!?mdU5Tl3nJ|kTv_rB24mTO=f{qG;Tw_7Z~ zi^6+8rB>C4ZLkmSKCWMJJ}66akG*3T5ICULUKQF@N~P?Fxvh7Zx|Z^M)9rGk(A>Iu z3T!&VNr&qdtV5nFgGwvI)pT{)1qG?8xD3Q?ZEYnUkL~c5!0TrK{a_@M-?_xp?T&FI z8H}6dKj{fAXT@6fWctRnJ{YLCzrTsK&GULW2K+faeIWY*sJ=3C^u1ePsnR&RRwXa& zDS3(6xAsVO3-16QKx)pUiP}Tdk@lIO*jl!MeAKiDRpZ$MyeN{jl+tO|l0wlNux8T9uEkT0^ zcXwxSC%8LRw%4tLiKJ7O-L)EodhnnveMd z=>87tH#tWtZdF`nd%gNmzeDId zdgga3=hrbMmJYy^FJ3AIj}RM}^Hut+bZ&ALs`!F6@;D{#;^G7ML8U$s>Orj@TR zL!7y}a1p4VVC)@Sgt5%3w5e?`^Z<^NyUq@&jC#X+dEpUvYRS~LO@^r+j*~k-!V?-v z2~;j>*0tvliOKtZALT)3vyD7$A{wFrn(m1vkvB(kr~m-q?qY}uI(m(0W3do>lyC%u z?&2mL=!@}n4Scei_+R9Pu8{A{4@OFR;27WS&l*Z*q7y;nuvt{ra=7IKY`(ReDal_h za`;rqE${@7mhjH{g=l|PrrhiLvuvFvkVgYq8s$qPJGOc&L98CtY%H)$^xgF{;&@Y7 zTE9vXZXqxxQpw$FQuM7T9_y-1@I>spttg6*Oz_aDLVMQT(w&)Zc85#-;e-Y+Tu0Gg zgYG=4rY?dPH5akjO0c|@A?wFW_>9Pqy1FD}sMr*BS(;r=H2)0GtG9V@Ai)LHPXnL~ zA24u8zuCt4m8jmU?m~^TE8HL3M4PuvpAo7PJcBr=?|iI4QD{~?0x9tD}8jof_I}G~2l^1j{%31an>2V{$tDGR~zB7j0g{+2sDiCm?B`-|)>U;Vd@s z=%PapXQUlrvy8}zt4)lgHXrC+4C%PPF|ZtLcbr-HDh;A+mA)! zt z1(%TD?VF^Nl%%9WF!S)hfL}xeqUCJaA4&?!jZ){M+5PEa%q+Lf_a_S`P;lwA$Gi|8 zdMd@mRufBOr?D`Y((S&9YI{Ef?>+$SLJ|hjs&tbOsH`6zBDit^99>0J0HsK*o6jNO z95yr?d~8iBb%FKQt}Lmk0BoEdPn4i^5`U0-I2Xz7IJPnw7R|z7#_d!JXanZ$2SUaF zS_*}p-^QhreBKZ2&!j5C^>npS4IlAz{@ ztM?N+u#R>SBq|EblKCao;`W|eKD#HVR>*$K6x&IqF}ReF7baBr=!_>0YI={wCH$}F>sM%RZyy{N z!eP>#PFmKPoSaO2N_dn6;%p_-!YE}7Ub=HZ&9zUY0vWB9Og&ky)R_GiRlJfSV55_y zp9_EE;J{C_&NA2I`f*)%2APp@R0>*voseQxsgEDpdAa~xfG^xH?j4{hE{8TOsYBLQ z$Rw-wFw7xRMufo8YR50ow4bv8V*_s{8e!AxOZdU79}((LyY$Cn3TJs*KW;xKkUCZw zN+CM?JgKQ0meBrta<(Wi2@?71O8^{{OU_k`ECMpgK~65RAk>tt?9L)r%*xzT%%AP5 z#frFfb^05ZGPk;SRa_LPDksM{nqRQ7neWut)SRn&k_Kf#C>d1mZV(of7u2hesF1Hv ztI)G8B%6O)vp*ii#6;HZnA?!=?9$M&O^1K8dXM8VAOZleVB474lrE|GuG>4Q7Hs}n z+W^4-dt^!xnWKw~IJ5$l$V8*0bQY~QKVT3jqu1Qr*k~?Y%xaXOX!3C^k0wogRK;Cd$$XeF3X~&j0po^*Z zMY<(S6+gxY_n{X4u+|%c!DQTdh`}(wck+D59eG%GNe!K70WoNB5iviL} zRjw?(sHc&$vUQwyrAJy0$^zm$xpG9#pT2B#DLcI_j z9U_!;V>h|N6|a{@1@6LY@RD|{l79?{2bEFx9~pK2k&zSQGXU>EjdlG%L!?+#C2RX( z$7TCw+vSCwFR$wL#mHsC{!ACRyZSrojlo!W(>vR<3I+v}?$(GbB6$5l2yVt#c>co~ z5pO$GS#+gVhKsS;IHWWIC_#UTHNf0R!62=v?M;>)`pcdg<*C1bsE{-#$}8Lbsu z-A?1pXLJq`-T4Y^VhiKWk>#}bCZA3#zWKu3DEmr$Og(tzz2OTn+9Una0qM<04)m72 zkZ>aiRW9=4*0p@DF9}baAIU6Ef(@`4z4SKR*IC|BR7hzN=U?XsguTxj3PvWNojJqA z!~|UK%ARBmeyP8O(j!Pc?)cc_=Cok`*~gdMz`b;U6c(~kV(8!-PhxZx+C3(S-|(?D z?QevMNV%pA6N;6LEhc8qA!gZnk(lnEGkr+(B_IZb z%TTM+a=S6zo{#&815SxpV%}MBty(KnRGF>k0w1R@*`wRK880gmMy`bjT)01?Y^h(t z?^9m-V&H5wB`1gVrDTY0hw7IlAwFLqsD}2X)#vjU&MH{XZ@Y<=VqS{t*OndrwDPN3 zJMFE4X{mw^NsRe*&13Qq$~tMxzpTEKxdW9hvJH;Lw1c`lLputnB>KZkTY zhSAp$vjA3EbSH#QZud_bJdYkapV6F(a}cRC%MJ)h8NBns%e7H{C#_q9^tdDXQaEws zV)XrAYiR8OZJJjoRb`-z+ldi+&KP?mEnTnVb3nVquq5v)^hYxbpt8(_$`TzaOIvuT zqb{0^4U>cNRupY05Xs5OEl%=@{3FS)jZ)Gx81We^_AM|};=Y0~5*OW~g{bFSX7YLM z_Xq+@hLgEXxF2hL7#VvXr5P<%az{7QV`eByc*$`LdIIaunTMPmt_4yLBy zr5MqUez+7GzL$lRdSYZVrhS*-pXrJ3aU?XD4@`aGp{3$y)*mI4IaKaDR&UH1#XQsR zp_UInfSS~2F9w#w8==@4tBL!-pOVCjADIC(^9)*NJ>V*+@=LMnsLVT#OeAS#G!P z%jW&5&yq{cA(q$Mv;6Rkde}d;^a~Kh>i0S?J9wmHpFd0V-0_gv{c+B&ODxsK*@awn zNSmbg^LbIdL+&S#???4r-hrHR&K{bG8#_(9-EP`!yb3CN4LY}I7@vjj$gGmXc|uvJ zwRNljwHV!fO6pPTF55mt)AthKFW;lKsBA};t~-a;sDulIn(DIs&sJ$oUu0XedvW+& zw${PvJ#Zm4lB zQOFZNKR^F{FjWYEBCGA~ZS&jbrs|p+;7taPBOHh2^tZ)>)606AyMz3|~l49tqa#twahaZdgHp0uO~CSB@=wBre;|JdX*{(y~_iGTFs&nkqK%vmev1y-m`S ztPAob(k1dG=R!C4Qc3QH6KgV*p+L&o&qGv$80ngVxs)G>cuJ@&GQUpKirwc(!kBcz zaq(Y-rimuT*}uU7U_WjemtcJZDR}R!R&(QIRJl zu=wUxoswRW2t&SWvc9=c^R?c6=vUdhonP2)Y|Z;%C0lqGqf0K5k9S~?Xw;3Abib!H zIngyv*@=D-5w9Tr_x3yy7N6diUmj*;)#1|fmMnx!^~sp&znsbmYZdyVIu2D>Ey@{m zk*ayK|GU>tx05rVWN^^LRft@nh@oMwqS!w4eHY0Glb55*%t;&QmdO5SL1CB-R5o}i zeZ?6`V6v@XsJViLnk&K{T}e@_#UANoh4MvjdqCB&+yKX}!TrFnUL^iXP< z)3xKFt_)-c#>>$Qt70!{Y<}<`Ir%T?kw}=CSYmQogQDm?GH)vL_$_|~4_{0It0^py zQB#Drx>Gm%t`hdjl(Qgj`>ZL&G*$$?g*_peN$H{e9Vg7()(p|cp(6VyA)`-O;^&F- z=RFMs_U8>->bI7FnbyM}w;!D|ey`AR2}?FCwj-_eYnR?UO|+yKy#Ft}g7EP1<=L(@ zn@{8hu_lh~3?&1g{UH?8)Z_v>&&)N}!FCBpasR}Nab4X5CxcAdCVZjcU4JzvBoY&k ziPiRB&7t^XjS!?!W|A`#A|6jmOBiU3hvzmXi+$|dCUM*uap*BBeqNO!(aYSut~~KT zOe)|U}zyAAH z;_(urr)rW%=wY5!S`L8wmb-N>mK-ZTNdlCu^;6`#n;O*f-4vhwnE_N{4*L%E_TC@4PZ zrRcW0DHO{AwtA6wBBopUhvF|CbQzOxhx+pK^J)GDAb%y=1vhZge}WFg{wFrzu7+lX zPH_vb%nTzj;u!wQ^2p&qWqD6mTa1!=zuM}v?=y)#h<%!Vqr|@G%fZ$42QRc+*wqC- zg1*X($)qHr1;K^Ui@o6QbJTe?GMzlUh+}fAfsyeT(TZFKr>q?J#p7G=jw|KLvp_QC z8O97om}DRoIt78rJ-~EaNUiQixKHHsL}J@-7|@3_H($`2B<0-J&*bY>uwk#f<%Yvl zd_cIRCeBn=#a6$ZA~<#4XspnEKK1Q2q<fe9$G|oL^(AT7Opph*`2`@QP>46Pu==w7f6vhj}LTMw@ zQ#BgxH&CZbbdG6En>)#E7?T}2|(F<;?h&jxMRJ=#=& zoZo}aJ8mW7NJ;i~L)KpyJJMfUn$Tz5lRP}zz(t2X9$r1Zq7(GMzm}DikLem#5Mhx} zH7&Vh-?e*s_1fdQqRhr_vuc9%%Mfx*q*fqQ?Sew;SIXFin0@xs=RejoJhQ^`slJGm zhX&Pz5~BT3^>`SfQ?Js0Lp*`vJ)0`)w%7BGej=Q|E(0UV*{JqVMT;sIoKna95aC?T zR*uMhk^SoGX_Nj(X~1g|MzOnCk6ezDGSP`(vpPX!|mFdo3HnlA9Nc{`T3mCj;mQc99+Sf5e~kvv|=tBOFE2E|S>#Gx8z!(=jI|H+5{)#S)iN>XR z^7tExM~oGwc+C8Fl-2xmpWds<-B(;76bdZH+ttCNZO@^u5SydAuAESRU1q5WT)N-3^2vZRabM&a8OyMICI=7Ln>owdFUv4%iim!dlq{TKkof# zvO!rqWs(L8jd{G&6MrY_sL1>(G)x(Mzr9rCuYzBlS>5Iud7I$o+GRkvL>R`EeGo`> z%^wT&z#cFg+sy5NaZYpY{0<<|U#WcjwKbF*rW!9%==#fjOtFj!nR%f>5(L`yIP=chuCTj=-mYn)`fD(*=@?0t@J()?D;gd(Zt|3%q<5r8u3FKD?> zg?kXq-@^BYD#Mb@#Eu_A2P*KF0hK9x=c%V6SrN(qU9qG5xIvwtA z`LguCaO^)bRD55TspfJMIC zoTI!q%Mi1iVx{Ly;d-5XTt|2B8<1{6cfq!LH&|kI^?QKyTF0*npYzXf@nczH4wl&b zhjl&QY2xOq0>V@g?1XABzEKN6vbtM@#91f8|J9K*idMuvhmJ|%LTZ`X+7dqHE+_{ z3`igJL?loAtg5UJ{PzL-qkr!G=a>^5jgF+oE&>G`AQ|$y}i-JC@Sc2`46}wEreo{&SsJiGo&2ozxNzl+~7_ihR28 zFkO~KK}vZ2m4|Qh0*vf!n%M&FiJo-dVC{-VS^6$xE|Ew*y1&0j= zDwT1I;=HqQIZC5bb zP)SZW3yD1jPCNcWzjPaFaDG&5!hQ~w_Q7;uDdbU;>@sJk-xhifP78-(i58D=y;}YM zWl#Sjm{Z-qFtcxE1dFF3#oD=R0ajdF_GE#U5@-osUAeZmjjbF}SWCiGc~orI zNkB}U{ecToxxkKmk2q1fAk_`pTWf}8ZZ2Z3BRdJXmE_lZX^SvY6950j7M8RSTwF%= z4>|s72BJ3}kYSeFlHJXd0n&rgc~i}I4EQFbFvb9uGjO(!g5MeMoN=wDr%pc!EXe({ z&|J?6yO5a8ngu=mp;?=+(k(>{l>b|Q^CLGNtW6s9%YKCx7VbAMoYuTm>L`<{9sQuN zaAOWroO0r@fDtoC0@S&G7X#?3D_9YwqqZaAM)iPGAwGJo+y&P$ZE zw1lCy&FL(5K!vHDT{Ru%d9nm{HTx!-Q{s=!a~%YCvzZ^xeNO*R1fP5HH#Hk;YibJR zd=vUsT7P2jRP7j*Qulh^r59^Xy9RtQQHk!bEwXHX-Hn`lxVfpyJ~3FV>8$LYi{s=C z-&HK9V{>rQ;&p&xh1rE`+Be<@_t`)Rs^@Hk6hkwehFpEa|0bQhj$kx?JO- zCYIXD1sWmf9TU+#8kdfM!7rfs&T%B|32&$SArd#}Tq>1HbKqvcCCN2cWw^{>U&x#+ zslXgjDlq_2XsmZr-DZ}84|z#Q%fD^$IGe%S8}~s-fPh7nTzqf`#+sf<10g9oxlf8; zO-mT%t47%Pm(9kJ#XN=|4k{fFq${sYru!yQD@D6aL-gK-vsy`Xggk*pvFC;j-s!jy z95KM;duDFcW&PQ-`&p_CXbE~pKjf&z$-La5q)C$M=+D4-^PuJc@I?28d@WR)2`;MR zYHhF!D(S@x$yQ)Wa)zuh(bq|-E;m_jGe1#aJ+6#9A3uyaQBEKbKcU@>DN~zyL_&*u{}(}&>}bGn zv9i@Q<(>|W2-`y%a6R49Se@3LlMls$QJhNFUNLU11zx6;{E(`_UYx8ZU!q>pn9#o4 zuz5SS7>0-)LXIp1u_83Jl^2Pw-yQ=7v^`>epJkYkD`ZeC8j2E2!dyY7)fDH}?XH(g)so%2diw`w&F~C3_0BC>c=u)Tq0k zc!eUpxNv=3_b;i|%=R`4kqLfv9Ae)z-hA&{t9O4XSE5n4M9-oj$M@XaY5_3drf zyx%Ib_2XMaRLh~zP^f2A1{|D~BB*ecfatB7MfW2`6$BJsJeTKJoI}9^4~!E(4{1nF>oN*Ot6wQiZydL*9yb*TO0n_ixkkSg%_d z>GeKNtt#05F%+UZL#+tnWMo}xn~~*qCh`)bkR#C@L@m%B6?suka|+ax@cS@I-6$XN z;~99@i5}V&Y?iK->(1|3Jv4+3{(MO}a4S%t5!!$lF_;ceRP2tCH9Fo$t198M@@Pq} zSAXps!S-DU^PRSR7hv_U>FJUmT{7(kh<60ow} zHpB+4qGkHi*IL%*rmkW~uEy3|nv4KlG~Y}WwWMT@1>yz91;J)9_!xaAukm(gSsTCJ zT8KgE4)lGLa|9-~0F>arcxpfTSCKz@Sd40h0ya*+wD7bqc1ag}JyMV7SP2I$bjKAL zT3%kzGqCVt(RB(6mlb1oUF*E_74epx6Cw__fUyKV^!7IcQg ztx_3H8zbOHdqO;ON>6f8otou?mBk_Ott-zfzNxHd7(W=*_om}qzA*Q`QqSSlRe z{|$HaJNwl!?$kK)SslzMzL?*MEIJ!D3Wl`sI6k_8scUvURhO2q3~Hz(?5Di%60*+1 zn@wY)Qm-S;8_=%<1Ur@s8HRv_X=R2Ks^R5r!4~Y1gi2MZgJ-_2# zey?d2hv^(xbuk|vy`8R^&}~{<5+aOFtr}tGb>My0)zY$Nut6mg)CwGVZ!zeiO=2FA zW7L=P96WKzlVPLLMETUMN*}H6e^TH=v*)B9XH<;Q_dEv-Rc}QPQACmoQ&)=#Hs^AC zt9v+wkTnatOlTuLC>0ou2?ozo)9(C~e z$b)g-;BUWP^y<4$i!ZAL7$kT=q;~RO#^AeQE-Kc?A6^We!@28( zx?nv(^|+?kXFEM{?Nlp@YrV|F-XNgcsWrX8r!CFnWO+IyB=`3s<+n$J29Wa^GWsx; zIW29z!Ns7JOO{J529(4`Pq?kD!QSHr+qRhEKB-L3xVaggP2T)gTFb{~%NL8ERwna1 z0Bf%ClCzZS>zRT>)kUlCJ{$MmG5k}ue1S4Ylx>v@IsfC`F^W-B^Go~|u3 zyvR32uXGwieO7(hpRZ+>9C+&gm=&ip?kqPr*(ZE+$J=o0?q}%fU|Q3pLH?kOh>k^g zS;@5^!(pzl@9l`Ix@f@_*d$vf0KNNeS$S|USd zT%Dq#Dm_zBn8EZpdE8pSfy)~T*tzf<)FD4;VIf=H4ylGdY~a(ie(XZ=d>uc+P~PoF za0YgQe`z5Tq#4%WLg-DIVBXAjJ~?2@HKk?}e3|5954-DCw_G)kQ#CK$O(se&?uGq5 z!LiV2v|bct*0$q&F3s&#aDkg10S>s@D_I?6It9b38k#VO2Yc2NHgSS@u=U zlVD@*qw%cx(Q|z5gI>zH7$MSlURQTh%Ja_#m$A05&|wRdj!q@<(xb$K#T;FE51sl* zR5euefY&|U`W|GQK0@$xxtMW@IT&3n*u z_>}k+O+aYg<7X3QEH`x>=QyrwmvR!M?8?$*9)`TR&j&H{w-SaAW1DrWwIhAF82yBwL+Q(^slT%*TlXfg?u>T@i z#=2s#i4Rzz*-e`&fse{kCjj?fU`zuT4;# z`ssLG1G7t4(yfG|8+WduQXIop^`&~N0OhL-I{2Pv4P3~sIBps|`QcQ@r`<_;r!oCM zVf(qUZ~|co)7GN1O&DH7$@n$itK?s(8~o2B4$yvJV?JZgQ{`Nh9J)L3+9qmxe#pjR zF1*K$dBlUe1$Vs&O>3y3tu{%G0CJU1GS5WnKa!s^LD;8kXsV!tLX|4;gspL;faRKEm5} zR)O#I;IN92jezA)at0UeazXuVNM*Nf)q_V&|C4z{^Fkr|<+W3!ml0)r9hX{VNpPuZPfKOXfu+*+hol9FIw^fOc zh1@}uc9C5n>6O2gy1mCFx+Q@CFxYAM*@aWr>&P=>ddM3Gyd58~y@HM_?@y4IPpwTKa+BoBXYvZyP*y zP22R1lWm}-BZ@m^F9qD?4|E@TEw0iIxhfyL!^a)i~j64-mH z53#bab5&RVf)m_qD3@y(Ec#fz6&~_#vlSW_vS+yhBF6`no4hPEoeobbwNH@cQKkioOh`o`&|*L}pLt8VY1_3(>$_W(V( zS?7#}a`#ABn@)B3H^Ex=WR^CM%|bJ>ovb%b_Q>-a3k#gO{69`cbY}#Mh$=Wo4;hRi zi9&sMp!svCXMnCYC-~}J3VR3Z1TE8hD{6Ry>Dr)qXMUoEip{6)r>xC5I0_<-2#w0{ z$6dnjQSxMTQQc>KhTGdgp>3~B*7!?JyX?Jiu;mDX;$9ZQtQNNrLXD~om(e2As<6QW zn=7#)E;7cGLt}_60&WzYu4=pFiXEA{e&eKh%sN!2p<8F0#l*g2C7)e9FgDdfjHb`e zI}waz0`<{Lslo zN!F($D33aqUYu)FgT~AHfldyq{3y281HoThzOOSIGcN0-#CAxe)kH43Z*fc*{R2M^ zd|B7w!|P$>`WpGX0A`aqBNFbPwg_FK3=_2L<&~#kQMx{8_m;9YpQu;H2MO8UoDjNd zwp!c_v>=MhF*B3=oY-%}nnW=afRe;Zy3IF(TVmQs&{LHyPO6$MizrX$(jDYVO7>=I zR5<`xYC3B~(NLGCA#E6!k_FRNEqG4|czPg5Z`loV^Kcf63uH)Dw<4NiOuYbOGGD9_ z#FhwD6j{yRXMdAfqnQ1)C1XvEH8cH|c7nQ3&>PWPF)mt%Bu2Ti@W5loy@K}|pYXod zSd@tS<3qW61GjCmiQdHrf?>|kyXfw~0R`@@ezQ~8mf$Zbkc{k$g+hZNq~Qno#x(Q% z%dY+yTha-s{?#_DDpnsYmk(nNcNYiPZn;)mzTnE&d`1x{MXu*Rpv4O!S?&^9ti?KV z&HIKfqt~!tyHOQA>F%h;-n8AiyHZNt*tSQR>2`M5xZOG3u}-VAesC@c)_sMTRJUsa zwZ6fzNn_|Fkp32 zWk|G$(ZiHodPIEZ4_;xwsSTQRu3EuKeALzUQq-zny91+v=VR?6!2ipm@>uy3D5^iTFuI08hBto3IX{%<}&{8FI=ijLh#@Bm1 z{mCM&MN7$$Sw`=>3$jc2$!rDS$nS6qFxdn zO?*xxfHsj&%H6;yA0_&l_WB{iF2gCYhsE+68$eBT92;F^<-iHb{Wz|-h)!a&lz{1( zZIxwfK>-VhUcY0nnJ#3qkxxlWwQTZ+REa;Ouizj< z>r89IN-54q8Na}d=ps0jt>(z1V!mQhUYFU&=QCqJ_L5R%RV4#ti#S zru&rGv+gvTuMeZ#;tP70Hy`T1tirX`bhx$a@9nh9vI$N}wAn#WlWTV-IVPx1Quv?h z0bO`CT;5F@y_j@VrF}og=z7oOu$MMHS5xf*>WqX$M5QgXIT?LNW_gr!1ewR~q&nQ$ zVg{^wk?l%{fR{;zH{HuaL3>WI<}o+!1F3d;3R_YcL++1^>DN*8TRS?Ak$H(HNUWpG zFZvSQxy^cum&1?4JKS6TRZq2?!z`yJc5k6s_?Oaj0sg>}wy z+D5I)XsTwBLwXZQLTu&zf<0pGxvSKR+!F3%6)bfVWuS~T^TQ!SUzZe;2G7(+@z!Z+ z9@V5dnjx#c{sq3Mkb*O;5I)=yr8j9YDkbQnGDZ}vKh zAG(`E{rs(JZXQUV89y1HouTmEWO zhgOHIt=Jj+Pud9mLl}seX2Hw) zPB=@_s~>b~-=s9rX@T<~=pl0-Tk)s+H`Va3;gKceQE?ixB+>eEem-FW%-elU({4#j zCj`ACk`8&U-*=Boj6mZXVbA;wJB0X%7oLP(cwgTpro${ve~UFyGI+Z*P8Uu+K^O}?x85Wp71@eB%tp=AMa!;$K!F=k!xcxoBuL)v@K>jdUj<2dwRgwnTQ8gE ztx+R=DpE~+OD%XC;LuAwr%hn5+-QrKT6?UDBrid=iqynJ*7uqkTCJx8j==cfn!|Xh zz4JKo#l*vgE(svPpE~IT(G>58jewaiwuVB8J=*uwmMa~1=7#V?x4r{(Xfz>&AADB6Nb&84Fy`?2GgeB%j+juJk{ImnE#45r8!I9)FI+UDs$6D4gwQ?N zEI<8A!L0@HVphzLYxHJiJ%c9&n)8zCRUb9)`6bs}@ps$D;p&E0`&tBXLk~zSx}JzM zz6U+l{a7Rl`r2dwpcgiaxY0UMO2_F!ze!n6d2I#K%~7qYA${7j5A?x63~-bCJpV?< zClW@7r_7z%H0tDyhV?-AWhLhMrqQ8Udex(>2o(jXWU1y%l@?CKC88R%Y+&lES~iUBjFiN{!>)!@ zvChr?u?nMi+tZ6ec;}Z7zFO0p32M}5g(;uxyU z=j9naLSR<}KZEaM#lhxU@bh_ca_Ke6j74Y&kl0wtzy?pbqu`i)t+>< zR#eYd?2zb$y&eDh{Z$=E(5Db(d;!8QTb<_{4M+C-i53ti3GI#?7@E&VN#XN7<-I?B`Jc~$luhQr>A@C$fq_N1gJOI*-uS)akXXS0c% zHtm)hmH4m$4+t}3F8 z(38QJo)-DLQP)HJ&Hy^_G`ivf`eehOa`yv(S!yLL^#+Be@RY&_(%IXzMA}#GH*5{5f;3eEvP6VSx53SHe8^V;PjO;$5_aFBedr;&LP5h1^S$n3 zV+ncQGK4X){rBq6#rqPea6hxDz&0re4HiW8#~7Jb`PDT`U*b zY-m;1)Y17sT9eX5@BU!6Tu_9swQgVH9F@%jHf8ux!gOouvIbqb2->yITS5F|aye@R zxxq0n5(}%#hqDKBiP~gLvuU7_PIiYB9)<}Mdch&t!0kv z--eMDJRc?~15dD_FxA(AoZwaD;Ov>T#bVH@a>x%$?zd0j_g>w%2OZzqFFB998TmkG zrTx4}9&qiPt7dmMr|`b_43|MVuzD!ePtDRqrllrASIK>2a3EWq=`m!Z+uw?dBta=1mfUg#0o^yp zQUCC<}*QhcHCWVST-*(p}dY%M>{WOpdTy&0$I6g#)2`-9ergWGISi& z58Jh3`DY2cy!A}@w^`1$9rL1V$LiZgAJmi+NNnR%t-F2d(7=m?a!lP-*mecwC(r-iuf#Siasbsinj6+$?LiMu*@hXN(tAYDi~(<@ckY(w`ED{!{SDx8 zFv=mQWyACRzu> zQrm)PZ%H|e(^}Ke!;3x|Zs8l=I3h@uf6{Rb?wWX6n83xu54NZw`{mZ=*4}73Q|CP{ zy&eGa)Y z;Gj74g%Y0tlpb-AAZ~EnAcl#A042O;Xc?fOk}Rz2GqV+KEO(^0>$tT4%+nS|b_0~a zxv+Z;GK@FHpPuuWIxyx)WjP2`#Ty!vGYp`EJk9Lk$z_T)v()`ijIV674mD-?QBW0% zTQ5jIppXKciIIfU21QHF`@U$mqguZILg^s39_wQXTjDs8!r}AbL1=~~pfAYa)O8}X z;Zw2?qV1qhY$(i9Zq??I#ybKo+>NE$M;RZXa5r~<=hbtDQ?3gi2K}=_eUy{R5y4`J zLnAIF#Z~CD;iIE4tE=}deV|=jw!UXqW%0v-*5=$sXmvX$4;hbS3l)%I%vJ|Ds0D6u z!S?cTgC@Y77Qu0x=bm3>clqqkzh6|g*4wTyk{rYkuMjplBv0~GWlK%wy(Tc5Z|tRO zh)XH-J_DN5-l}}=t|%WnEO!%9cM!&&X!HNGk7;Jkix^kC1wtVZFKszc_;7jwMvsZe zKU2aIwr94`xcEqyqL;ER-r8x6;#AN9tdP0E&m-oxxQ%}xSRwKj<)0EFD_c7 zvx)|-VAuuFX@@SmNQ(r0DF_;!Ib-7_4r;23LWzfiM7P4}-enN+5o`&qh8xcXyB!A6 z+?m_H#b(rulHD+ zg!;`cuHCKJ`^uAWM+@>K+cCfPOKDtNBeyAG!6G|0M41G4oyQ+zY5PWNi`+u64HysV zri7;LESTvD+7pdq?_@Gr2oU!oys^i01YI#a7Ejb%8a;9z=j}xqG$M;q4RCQjgx<7o zE@q_qkC4bi%NWt#${Hnt#`*0rZA45Svi8tkv7@ge@pc~99KB-D&HN2ZQBWeiws_vr z(=IMdRnMCT{!HFe;{G;_IL7K0?T=Sip~nWQ5$ZE*PZiK6Z~njb&N3{jsD1Y$9gVdHd63yO z??E@SgTts;=kShmFs0pL>8H-Oh4M+qp97i5guV)LcZDWB9tH&Z?1oR=FCW@fM2vra zVb7jH3ZEbEuG@PxRXwD5pu!rH6%)Xw*t2cf<19pE4?!OYjemd!T96dP@}0RUD|#{) zK+=L#AEZP{-rR}3DH%bN*-H2lA)G^d-o}~^8!l71jG) zSNj;LGIHxo^IWJmhJ4JkUz{%atf_rD?K8emJt~|Oh#Se5hm{J8BYF(F?g1u^6TS%F zoROT~5}v;cZ((S9InEMpz~Z*B2d+8YA63x;>zb% zG%SK-sQ^P&X4UQOl|^H{|IGw&eQ*`L4o*Bpms(S>W?27Pg{ap?dcXa_7?qgX`@$J1 z&`s{!(o7}k;x*alzz$Ke;Wbr=g6LJ70Jpl!)lnRx-xAEUGQKBDzeeDT1iDms{*V%1 zOd`y9JUoN&&hn-+Td+^xN%*4@n#>0X*yi#5M(UBP_nRXbzm!)Vl3svQnUiBfzLyY! z%&DLq<%`|4_;ph2ONV)&+ z>r=les9NtR9YQ0`KF1^O|7#N5M^tAB^yP#sl034wF_s9!j}8E~deNPLDJ#3+F(wZ_ z4ted9o+MKeu8$00>mzS@eAkTYul6NYck5XBJH&nQYL30C3lWrhLbwoSgiR6O75Kjec+XB(QqgQj znje4Pjhmf(H}d_5Y7Zx{QV764@y;$RM>(#4TAA29pIl3gJXKHPPJ z*L{R=)7|T~UG>Gr631K))|i+#r&mT)O_MpfEh4gv%1iU9@&_lM`5tLSi8u|%QNL^h zy!z~us*!|wRCR1#*O(6__-2v|Otg3Z#hU55~b?_t2WUIEFPO{@wDATzo^7Tvs?l`X-y zjNRuzuy@GOAI@Ca*Vmc^==uLpTXdqloKc~uDL%}-El57`2q3wKl81Ki=#r^%6E%n| zZmD>9wer;9puBe9d0wU4K#nPr9TSfz@O@lDzM~a4I?PF-A48^}w5=0!qeq6?&qGM9 z!7v}PhC`8qB{`8cnD)5$oYlAiC6Q`|(tgyaTPDXQoOh37fzj9(94b=oS1YqEM)~Bm zLt_+x{S%5~N+9^XNsm||jU+EX#8&`=pi?EB^5NX4KtjgHKelgdg=TV$;=5S7f+pmJ z-Y`y6W|L}opHK%X>Qvw5?N8uPt?#2@E76_5*1~QOI*k(0aEZ-Pz11cTB2_gh{TD@X ze{roTI3o1@@x0Y z@#{2*Gsrb?vfSP;VBjOc+L6U#UnJ8)tXcZd{r=EztjTHr=YVwrq!81w7E3jRaP^ zTjE#+QZO?3olFyW$|*5nwS2X@RA)TBPd7fCwyNUkR#)aBP`)FKCLW+RoFh`cY)nVi zDwD;zuw6$wG>%!2GmDYMR$?~{9o5Qox|htW2MuWXmD9Nq;>X3^;>&MyJ-xrsh-z!e z^Bu2&jfNs*LUcpTcMjCXrsn2ZR{eH;QSuUn1`61e2O*~v4$*AcA5oZ{jFL7TU20y~ z8Ei$)e=K@IISW4&Hn4mgI)x;rn3V9kr$%nfN$DiKUOg0ivx(anK93{8m!fnf z%&45_oqa~>Hryp!l7-@S#tq&L_RXMVuv2NITLb=})m^f`9lFSq82M}HEW{&$YG*n$ zkXD<-6?W1SrJh1nW>LBkEF>cUm}bl0SHA+Ca|S{vSBxpYC}EQa-3mX48e}ce{G9k2 z^n1-g6ZYM}lq$M*YG9G*it`9`b?`1aK+@uae1iex@Lg_T}C!K#rSwVFwtPoQ|HaH6KKyvXCqd%-)Ao=<3alOh^=XJNmfqiP@csnQ5|6RzjICMK7rkOV@K?IVm|PDpA87jW1CYKi=l+uf>Pn&hqH?U)qo} zMNz-+j~x3N?2~h&-QxTSiDNioZgVDz(?TO3?VpRo*~;H(1In~C+r5Ofx%D10Z0h_@ zUF&`V=VBgrsa}Sn%O~{u%y#07etaq8v~m8NE=MH+$$_8tHnDqLnIdPZIWmHSsm`Qj zsGuH?3M8VuRz@k5-M&%TSG0muA6lq_x^)%?^1#-6s6lgJTJ1UT<8+0Yyn!slWQUz7 zDl{{D)y%A~2t5-6C=VO(bMeBtSM*lRs z?L{ZyfAfqY!?!TQeq*8(`BfBOBJpm!2HitGJ2Q=HZyWF48#vjHpIXmg2)_2yo*tAV z&-KP{fXW8tf)9)tX{$iD)YYad?tYDxFOwM$?(F91T(-X@ALLSW#v#9%>wvpr84!aC zBWc_(s`V@9#2cl_em|h~t`VM=N30~$-3E)crVQW)Pd+p?ZZYCrr$Fx6)XPh5=Dw}! zZSxhhp}}*mcWYE94h)VmyF_WS(%|1p^; zTWZhAu>BE^n@=~g(C*7Lf=|VTw*l>ZBRH9n3vRs3$>s_dl;5vTaFHPNzcN2f;8EY4 zSR)!dNSj3M4ZB{~cyI8Z*37|^W2ADsF&gH}`EX*b4R~)#&?8GBIYjDfcO9DAV}6P=nz-2h$`$+PrL!AfpoN@9{8uIC?iAjyai2bpCB3Izd z2~bi$lT;rSK0FXCHOxcKk~<&eS(WgBnS5xM6tc&zdB*J=?`5@LM(u?c$DsOB28duu zNNIE33lS7bEA(SgsddU}7!nnXx=#|Yw>PBH9vbjgB#d3(KtFK(vNtC`{^m2hA$TOY@2Vm6l`DPc)bCV7{6d1U!o@mDAp+fW8iOC$3i1i#(-m zJf~SAynVi^1Hd*aG$onodtBO8yQa>xgOzKGpVWpU`2LLGQ>&rcKlRx}b)iVS^B24j z=GgPVYw#(p^Hzgy0*vqak%#E?iQQijJooVt_$@&q9h*^gRUWKE2>RB+kg{AV$A&D= zSO&^}8#qHGYc;pHvXiT^*p9NMs}FYUi3WV>(^p^Xa|)NgQ)T!w*+H{69&EHPF(;;m z>t?k)fYi1N7`;R2{@U(LXU&~o0QbeA)$^LmsSnMx{DUx58HPwfPudlwtL~anaOH2h z$66vdf9pkCK~Km&7es0Q&WBt-db{ss6{M31t0QMWE-$_TH?x?nh|7gW)rt`9vW@2Z zc>mqeL0hdR`Um+{pkT$Iq|B_@m+Gz7%(mLMykrY|3n##R%sFhsnIhyK>8g1(g)>!g zI-}hcs*rHy?-&Ps%CY?=NMvGOhH!J^+n%uUE zeEU*fIW_Zeb_7?1lZM?~-n%J}Lp`vVBD?+S%p-@vXfPgcuf8sbT*;aCyn0CMR$76I zGPLWVbY2Jy-)a@uV|oZMwiPX^?R~g6yz^P2g|*rrwCBW1H+p1=&Lbj>Zj-_@h^QI^ zEVjRwd?{9T!~JU`P83j1mqCLp4vHx1DPJ;+ndPzB_O9nDKJH!Is^VlHi*6 zFao<|%`&yAf&$vql*M7PS@8v2c?&O5akT(kP`wI8XK`Y)<>1k*w3?qFUQH>5SH<+e zkyfoNgYeIL2Bml2@q>-ZlNfz`g{-+T_oaQ_zvjc`m9Hk28}X(j*J;ECFG}$mJXpX3 zl}=2Hs9||`i0mA6$6Y(sf_P3^ip8_)rV&{uBnHZZcQEI!CTf9>*D0gB_NSIU50G%$ zv&;9~*PeZ05Bh!P&1Ozflwa;b*Qb;R78FN5#70ZBcCrZQ`m1OzpNaEuo@6hiU8G?u zJu-v8iN0Wm#Z5w|cGjmLOP~zcqA9sZ@{#|u7F@tJkmbs-JTeC`{=Iv=G_UkNl#L#N zvAWWK=I~Q#(m3kH?m}s$Iq7X@$jRQatoP6w0e|UcFZgP`$X7q+?hO`VGP8iu33p{l zA^ET^?L>J#@7rNKP4>#hoZgX$IM`U-@=B(oAgcED&U2$~hN-m&1MQIn;Ny{*r{mDi6m3S`0QXL^D zBUag*57KHh+Q1s-6+CHDJ67mUVIae@09gFyhq@YsLsYBpvS+d{gyQ%M$9*AM`?a_X zx2JNC5j17Ajo@oQ;9DUcQ(hWlw>&k?O6ZN_wx7a&-V4OtApL_s(;M(~ztogul?FB3 zf|b6gXG#<|Q6x7+c1Ko~W|na@I~JNPwQNcEX0B_rO?jhLSq3Xth>S|uuzPT(N&H7J zeZegfu`)}74Ld*>nH#+qBJvUasA=G(+THwfLH`lh$J_VMj9x8c+%nq^ zbv}`J5lMf`r5X%i7Z{}nie4LkvR20Pif`b&ME{lxj|X+P51GmuOg!?q#8}+#PPsTV zFV-ZYP`P7dg#N%m?P?B%dN>v1ENo37{)#+j8!sI8IT9$b4=pvy{iL0YgY6ji2z9x! zvqJlrLGhHBZYEl7e7EIsD34d_pOIff&a6iHGsJd+rS8?I59t=A!WTw_O&0tjndiup zlkCiqTDhaYL0o^Cvl<)IR59y}TgE3SRWC66#QAHKKRFaVzWj{7R&FeEi~NGUtPG*? zJv@l7anT&lXL8ke=thQjb%l|{r{`~b(;Ni3fBqKmYR%vO*&Z^wwjCKGK-3AMrf|rr z@Hlkl6UkEg#@LLkPcSVg9@dfViK7?WOS1j8R-?+>kUSAFHMy_Cq3Bm!@7B1Plz#oj zm5yj5WLQM{p#hF&*{`PiCFx#ZsV3*?%H3_89cxHrnZgr5lR}kPmlawTs5sE?W;H&l z)EgBT7;N)f2x85tqos9S#d$UDg+!qd8Y|a*P()m9 zdCHP(T;H;`HMLfMx-m!2p2O|z3UP=`xkLcztfEv|gz5SIfn2T+tz4r4?h)BV#8vy4 z7+Oj=Er8N(K=(-9NC4Z9hjeNiXW9ZwbPCiV*Qy~BDG|EmVx=DYlU34+c ze|($CXxws|EFdzBm3Moo+HKkTc3~qQFw2c7<*?j-cQb7b$_B2OC*oJVk;}A#H9&dSh#v|;BbMn7I`a{YvL%2 zjusf4rrUF}F)l(Pa!1fcST$sX4G!cZe;bDa>yRou!b#OGc*#on4o_aa%?zFl#GAl= zTog4;)S8-H<5X(0cN3|THBI=W$B&)eSS+c*IbUIQxj3JCDj7G>#Q&#iuazK{F-JAP z#v34i>xk9wmxu(f5%n=fS$GtG3(v`2%L@92+Ju!-k#jPQxIoI~^4@T3#S3L828bBF zmYy9eZnG;+$1F=*GqDB=w}%Ueq%heW1d;_dJWOrIuIt}EY1a;?#wN!ZP)ztqB647@ zUs=7C=z&W&@nS`%4!}4~sx2%eY=F7A`@8ppyP`ovQ>i~Emn&s(V-$rd;7gZyUDfa= z`+O5y-H&sNwg;oEFZ>d(bR4fg3K2cpa}~teqrMkp;3%SfC~5t$Ch#)1eGTV@+zrB5 zN5$(a+@RVQiBKs+gZj)mG%C^(?0klnkKW>NUcIHjRZS<_VbwrC@KjEGD)`$X@m|7= zk9uzAiykTzp1s~eM23-^*!MsrG5+Pn{%c0FSx2^frD&Wqn9j#qDtJ6LinnAPo>yx$ zRq#pXIj%E}o^5Gm={$C?+ho(vh?_v)RSWm(nz0PJ>YQM7V{(;5M)#T%4S|eopzIuu z$#JE6?Nye5y#VFs3wPiRphIoNs{dJoh?QMobwHpqJBqSVWn+F%?>4+pgcd^C0mu3G z4pZxR57~HRa~TRsUMQ^u4Q4m>StWF0iv4(JZQ>_{MOI=11-d9s!^F#TtXds^9E_5? zbTBDo46fpTetc4uZ(@pbx~OtB^jSZ|21-R(wcMY$fYtMAc%K_0_5k77Z_zCMSL`~J=&Fz#l1m$5kz==u0}|~e$_R{ zS1=8Z4&ECPD(bP(jw`*KP{Mq3Tqfm0ayi#dK5frdyU8<^P`_dZ#orx#IBrrg$v@oh z^*_Vf;_mXbTmYR6gQ_G1?JA8U_a0ypWfn<=Z0jSuwM+{2h8f`4ufn(WFSdW|=?HNzwSf<54c zqkd3;5C&!mQoe+`a*I_d?L(Y9NnW_qa6sD0x0Z1MsGJ>1sBU~B6jTgKnV`u@RmXfp zWH9gQ9^6%v@HHSk^}iy3_6MARK=dAwN88K4;sVr(Og2Q@@>0}K*IvH!@x&%-r_b>X zjBR!DsX0lx|wGoQ2*GwnBss`ST=zeT zjO-K4fIUqB-%#?91zr72$okpsEe+TxGrH_Ur&lb4yKm5$ofQ-6bn&?SN$6ugeCb%$o>c6)%bgQd6B$D46jh~+#X=YZEW9Y)-OqS88-!#I|3*p z<`OWDR#Cl0Nk50dH@Qr=iKVF15N!-2GKPpw@OM^dMG_3VOoFZX&@}Lkc7ZR_A4j>B z1D%B-1&jc1>sMOY!=E-15Edv6IWLD@Y<|_O08 z?xYrbBLODt@1Xje03-TV=fiT7KE>~R zDT1^pOlZgOuf5mq69}i3b2RbAHgdn>nsjKx*&X;UUe@>&t%==B1~1Q<<3eBE$#-y?!V0|*%kB>&9`NwDl#8%a#b+qO74NCuiay z=r9JpUzxECkg%e@mkQKSx85^KO^x^w7}JNb`FbRq3QH6ZuoWaaYu5ea+lP;=SeT{m zrhzn*&Lm?0et>`6KxiM;tRIG)CRBxZFJu^>ofCT@I%zuL)7@+-s&FHO;Rb*39rpmV z$Ln(&S6k$rDs`0fB7DPvnh4~GIaCvv4uc+Ey7~X5WB%rhV`=@9QuUvAb$texwEmAq z{vCdp`#&1$A3*v4Y(EhGtCRluOaK4R!aL&sK_@6li)Av?i&$yeJ*>Xku}{zxNon zg?znO5OBvB*09d8jZE@++`q_WrZg9hHA&|EiPqf8UUr%%h=P44H4!~Jp#hpYt~*ob z_WNw8R;qtPvy&QoqWSY5qvi4C0Ks@(xiKOz_8;FE!u*5Y+IC?=R|VBbn1h}q)_>4R z-dofvG$y#7_i`bE#}vCGAdjK_kMNY-#QYW6>-wVYpO^&IMMWB{^QMHN?!Sgczi;#j z;_f!R0=7~0G=7_N=Ii5v$_?QTV?QND*@l>}Kdsv#1$tKeFfVf*ZhcK~TtiKBh(;M` z@l<4&+r4?aEqoHOee7O6?)Gn=Y{A40q*F($;_^93(CPSe{}uK?YE!$ z&yIBmnEwgpo0La*i=c-$@lTh1k+N?sFg$`KR8{f$=8Xp~ZOjCp(V?{Syj9IC@%>Cq ziPBzo&cD?94m2#Mw9kdDm_w*BXj{6$|cO=o5Q7+OWK8VEhS+_}?mm|^%A`t{G)+g}hPbkHhP4UQpH?=n-S>d*c85rA7aF zX=0XU55e8}YZGmFMvez2QYk`f} zYG?R(6xiL^C;LNXHZdv!l5rf}*}=@3uI=pYf+g*4{NhP3Y{`Dvo#Jz6E2_S73XJdG zmfiG$CWQBeJLx2vk!$w?PKa~{j0p#m28L-q8e46yFknhSqclX%{{jD}m&3KDO%(-I zu3qH?xDD~=Rq1Z9`R$E$IY*R~F5@O1=MLjAyk^qz(E60m(V31~;Y<99sTsv3=3GA5 zmbM!rC#hx{pt`_OWOiT;C0SfOB#F=$%c4uF?Mn1LX}KczA%B@}i+s?yjOt@B1()RL z2laA8HIWr7W8d`?Cw*t3=nxJ5e6T(P7BG6)GL8Az5_<05HZUxX{!`z8c#_6rx7Y*jznwSiD|hk1!az?w1U$u}_1g6ci~z!k)uh`%Aie_oO) z7z^_h3Gg(@KTD9Dz8CLG{Vn`BM;x8Qn@q#Z_${?Izzi#xI4LW8g8Ra>Dt#3T?vV1F zjLYo$^~D06Lq{Il8>N+f??4Zn7&}!ya$P)aWool61cfC##`r=i zikHX|DKFf$l#YO2;Ti!k6{{<2b-%G#$ig93?8&s8&q&-%Y)W;s?jlj^q~4AEQA5Uj zVh_ZmS0JW1!vFLRi<=No-=Z9Mz3FS76vw5`n(n{@^X1=;Ek}Jmaj~gLQa3-wZ+jRf zrQeztUY!rHte>fsAF`O*GpuXX6`~|Qw;jUQH{h_7dbavYcZ9=>M!FmIsOKlWrk1Ox z%#Q@eG`;1Im*-Whm$z3AvQX8ofyHAUW&ET1;^uRFPHir?FGnOj)qMr*n z|JvE@S$j*T(*y{9aVSrw0^!! z2$YVCi@TOqF$B(5;S`1e%mVfz3YdI-KIpe$O30KXw?Htq`Me~k&h0;Ma0FBFm1yox znNIhA@`faGsmBN%X0)J4G;OFaJup7A7q?^i$IRvKCHOB!$3JE=4I`aDaJQ0`)RBsk zU1%xXcvcU->_^%ROR`w&zNq94mX6eS>X0&`u-fMqgmgoy;1~ZCvJJuyE*p1s*`gxu6xFDTR|fG-X)Sy9dMM(Ht9yS(<)5 zIw|JNH!Ge{Ipm<_YaOY^hWx$?-NcN|ug=~)u@-D+t*$MQ7j?Seq@u4013VgiB{hBD z8~hTu$O-8nHcYeGJ`QG=h@zy*Qs{}`6|9{xf_-&A;Xrvwr?Im1Q74?UoX$MLDW)szrv__U$DD{?Z-+bheGEa~UI5!VAR`Ep5i~KM^F8-NU|D)`@rCcL^>%|q@wPa;A zb>;-5DptFj66sc-UXRd#pb93L6St1w4=F3DnK%$+{pdX>S;HeDSHfs^>i zli=&Id*B!=RIa^-nW zBkLau!M|1^%g8@4NAdcyudw4V9@~`(rEC_|^!eK%Wh=rc_g$`z7o8YDi}ZCk`PSdf zoWpFN$6%%=i;^0M_e3S?(Z97Nf&}Id>se%dH7C6_RI@uZU+=0pJJ{oGKfx)<)B~0M z=tsUrCPp-qd{+A_*M35@dzzOxMsJcr-FJ@rE?5MIl=JQcHbGZu_r6(Wf!PZ69&rjI zL8l#swG_&01>X4>8+MPDkt@OJY>11>`A>I}rW(=J zUsjz|@AZ0>ZSIuWd}MnUCf!yh`jiN>yN9$GXtW-u@S?^2s>WonaR^Q3@4ej`fSh3V)+L@k=W!+H<_cpx}NzwS4j;!3evPBAN(kc z5D=liqD7%qmz1y*_4pgq-7C4aFF@zgk>1j6qLq05$cBPkhP8T>;Ri7Lg z(>8;LqhF(Z0l5S@h@D)QbiS^PzLff44g_|034f2jR1Nl z8u~`v7^F&}p6V(7fw6K(6Xquq!wb@)zgEBaq?F?S?XU)btpTog@z=dwOR=c{j2{eF zYlGDitfZ)Tn&!M*8GG9;JwLIR*C&fPw8hVZJwFKL*v1+^Emhb^^^UO2zXDUx(kMtU zwyw_{A#!}H=4DC0KE{R;$XX5R z?3)gbc*HL&sxq0Z#Edwm84D`T!jE@IDVlCoNvH)S1QG&<}1-5t23g5;GXxyJHyJ$U64zuV6uH zYB}8vj-=Dti)oG6bQXC0xChQm82c>CWJ$#1lm!SC8xyuZcCrguM=15wm_?N@SVj!U z{K}x$>zKt}dbH2xqx<&V%j6j^d%0nn1$dKNWJz^?&H;Zwtlu#HGV*cmCj^MArlR|X zK;JX%vlmOTWQeY7s*N>MC1G-uXFCRdwd00&`hdlxHhNg3R#|Ku&V98_K{DN#*N-Tr zwA%>YI3XwmM+e(f2cZT4pN%GS{rovCA|BmI@XTks*5I=M<-xoD6ppd7;p2U2hc4B4S7(S;-O4Bqb;(_meKIgz=P6|Gn?MZ4sdd4BIGy6DlK$P4 zDil-l%4q>~v8hlU;{sFc;@h2t_Wev@QsL5R{L9iXaRiEt&RO(dUK3W;;kj?K-fM_$ zQ&31hG!rZm%2sfw_fWZYUNYZs2_00b>sY2dOKiLsy0V>u+Y{h?%!~`MF4h$s$d=$*gq_qehAbV)E-FgkP_mv3TJB1e=0vXLdjCGPcDJcS_d;6>-!(2=)=f>e3 zqAkVk7?B4K3Xj9g@N`2Svl*7Bw)dAaeID6HED}%}zhZ$Mx4LqYynt&1-_Aul ztY!{McXJG_5k_DH@*df_pfl39gqiMHXf}N0tzndM3|ukiL^4Px2L-1oh-p}Ch&10R z`ywsKRlRk&lK#>B1%m*?d>m%qPz3Qky{)%P`{HI5;A=u4;34|ib}e%tMM3hwPFHaZ zVW6+6J$cvO2*#7Q!WY=cTocIRH<91K%k=UKkO~QzxHGNlX(RL~z@3^>)xOF0dXdCJ zbM(IsjE+=)a)BtlkbTV+B;FwyO5gBvROtaPNLAC4zBV#7aeRYKSUNx%C>{&iGI4@2 zIwc^%hHXu<{2kv;Fs~^?G8dGUg0QP^=Q@i`H;RgE&NqhJPb4EFkpT8haMmT}V$L7QOBfFqUZKv$(_U9l-ex_CO$+ z7uPqy2)~9Wgdft?>EgPaxgT{S6*dvq$!D@w2(-SW<64~EqK4`!ENCUaPp1T7+Rke` zuU?|v`T~KA*i@oO9#bXpA=S_lBRda&((Z$3#j#^F-BYBUd3i||=}Og4^KWkT3>I;# z&|TIIlD~WXKn#m?vsbTOm9}hcq*B9#^xPQivS9rBZj}D1G$d8Buty)V`o&2GaEs?@X{=Xur+)ICgdHU zo6Oy;)j$y+(7rI5S67cQHqCM;OQ}Z&B)xf=;J7nm+}oMTPD(?F7uck#+rQ7i5}%wR z)kkRzz^YHw*qR+6^KY~*em?Wum#|D>8QRop!%IR&j384GFS?g- z20!<`sUr6|K;c%%uUF%A^z3$Wqo%EMnVF*9Zy9PCfwO8nN60vJYi6f>XKT~Us(v^H zm8^PVMlrvu>5pEsAC9JFIVIE>Zu<-(Hm-kl#Z6e*$!lq{hsRan-b4AHXTx~&zg9E} zPUa1OM*vCEM%v-|KvoR(2c{kHF6oh}ltrO)BLne`KvMhbX^(IauPytzov9fzrMp)x zhJxa>ze?uIde`$NrgJcY<92qaSx!Wv`wLY}_GCYO``Pc9{DejInivJ0T=v>(7?jQN zy_(Lx>m;-GILY-yB_^qeva;COI33aEoa+dw24t&7G;LTx!bWDdAQ!Zpv|vp^*F!9jEi6_f z5D=5^FR!eR?fdaU!_=}9+lXFk_+LIje{|9U{XaP~6=?z)+A7~Zvk8tQq(vMq#7Fq_ zX)3u&TD>BwV&?x{(p|n0Uha$f+R@id!Cx8&CsUTj=fh%r)LfgR_)>iM*PZuj3x8b3^Cq!ue^o3(6 zDVp4uvQo)zs(ZuI7FmMl%BOsr4d?fVzx$7WUatOmcc;WMiL}^az4G=4s-2V9 zT*`z zbX0zc0?@BKpOEnFG;hZ{i>|)ZSp|3OR12@-`OIJT&|9Qebnp#RcNvhk>|un5y_^m7 zDRQWACmpI^Otnm=^U565Ff(2Ri~nd}jerQ@GHwc*K^a9z=0`g|oM|prAYo-^+VNoN z%Cc747aMZCkkx(;HO7bw!KVBOJX2ODP`-F;-+RrZqiJ^8uCLlZP+6jzl{3;S1+1qd z9^bK157K|34cvExbZR_9_nm-@a!S(MoF}w1@JyMnmo0iht5QtSN=yke9-|VqNtsbkCxO+iSGETu6?js4N*LTfLv=)~bE#iY zv9Gf}ZL;NK&*VB?!b63fen5$}Pu$g-a@ZA+A39}cI$*lSx!0Ot5MC6nQY4Z`eMe<{ z;ax|tQ*{u1GmMD)B=3gAGkZ)FJI?>9r+5fl5oz@ph92e{XEa$NSNnwFX`ARgSD0Sd zuO+PH+uWTv3UQTh7`Zcjv+d$h+c@0{8hP#iVMTDuQtzx%Xyr$$kYct&c3v2Ct{y}CHS zvY5){OY_;mZ;oEJ!u4vzr;AWHANSu4PKSrD&Sl-MWb+t_`ZjOjQs9G^$$=&iJTfhL zrxa%F{!1@u_dR`q#=XU@mj21UN}F>_Nx1z6IuJiSwRZB;22KNSsaXf_i{U7Gp@SK{TY79HqI)tv4;58XQ{u zQnCY#_vx{6!`Qws8$*%(#0H8%6?kMgAB$NGYM-ev_W;T@+M3Em9;FPJ9xyl1^#{Qc z$By50h^~5H;sz2=dsNn@NP{5{snvL@%zO?(=r|MKW)eYu%1OvoRR1E&0(Iu033j$vZ zS`qmfD~G|J)A1{_4BfNtx5~s8qHoa23yrun>j!&+f69HpZF?0bYp!6NfcfAzF;GPl zDYZ09IY8$-_*xssRL^_E*|d0e5QiGM&Gm)T<6BD7#Vnu?-~F-O&9q(^_^}e|sbfHj zo$kc~7Yx-JHmAmyU^*#3O6iSuQTc2ebd9s?1se@!wNGz^@^5rTZkSMC zKTC`#^ekP$l==sIyOFXy0XKvi;CR9+t}BC{jU;$%#Hh#Gcp=(&Lr(-lyuL>M6y2oH znQR`dP=TMeUWY>tC=kPDS2(URh2eHG70Xv;P}cWphW|gE3kvE7{wyf-86Lg$^j67* zN+qU}g*>}YAc>nJ@l)e_YeU7Z+3^Crn{@%9$05QyOlBpgk(70Cn6fiZxxPWrtGOEn31=*~1!olTXfZe#V|1?E_0gt@)NeE&i# zCGrgskVS-)?qG`=safv37VvTQ#^kd|8-XjKCnN{w z@ga@5p0Azfi-Rrjqq+3#rqUL{>^Ve^_ji8Hzd@i@3-u zK0kF;akp$bwu+`Zg)fGz+3i|ua>CH~VmY#`g@rdRpJpm(GxOTSVUEXUSp?zWhfDq(${D!JuMVK4nS#sl;YAd4wFgB$37@dV1NNh>nN+4=f2ZRaFjL+7=F;wVY=;u$h;NK*=1c~$L{N5nJ2V1 zYLZ%hQjotF7>B%$hmFJKtI7#caY5{3Bb~(AQ3sv(GR3d&0h~AYF}w$VLz#qh00)W& za@s~_TS}OYb%c5K8$POq8{iBNId2>U+&K>}Hiz=zal&ZLB&lb&sb`COqji@D%{w&7 z55$ktTASaAXAm-=GCTA|wCN}Z5kcw=MOVIWU|JniP{TIUB5>LWy`s!<2h0d^o%6i z_Xov$7d7)&8QD>$u|o=7!9TCot4DVR^l*Q6SJnx(+SCEA?VS`DVoP;|$BNR4Y2XS} zZhu(Md3odtsu-zGi%p_s`X9r>&kAu^{8i(?RceecUqAseU|sR8VN+p}o( zjIbAvYGKg1eOm)KB{^^@GC@;Xn(NTFSPhTvbz}f{o)Jj1@(SYYfSAtakBJ6m+qu%) zrPGYe9VkWJdm!J_{H%$$-i}Ceds215;lFsd#IIAT_jY* z7A?IlDp!V9GLb)U!JBrcS18H@#rPKKebB|1rj-4QEF1Uys@jsgNa{Wm{KWmDw4|rZ zXTq6`RDne?N7YpGls%G2Ju6KG7dH(@oEH$%OCLp#!Fqp`*d*ETD zGG8}-E>#S6tENIa_8A`ph^5n)^}4-1v!>Ta=Za@jF>pJg(3Z_A{FK|=Hx!T|7DZ}&F(TqiYz;GzIxv__Z%;Eme^$} z)7;L+qw&n;Q@AEgw7wxR_mLI>^;D+m9-za83-~N0V16i|AbHDx%wObJbmD*@Y;(|c zB_;0q1X?(-Wi{_?_ZsZ)C<>K3+nvCRhTWMhVHhKMxP_;)}~2T(nt!$VD)}N9K|yW2-vQ3WZ5iYQR;uHzJY6(y&ocM zl$Wopygec)6%X`8w63E6L^n^bARAk&OK`FA!Y)u~jWD`oPAm44PeSjzN<{geteHlsyq2~)z7l$mriG08sI zWpTn%eDIs8iE_|y&i``8+Qt4e5>=6Rwl|}yF!}j9H!)~dg~K)%T{B%1Pc9uoco8qq zO_-7J2;=5bhYs-zMC2q=)N-}rzAlmc_fyJ+!>1cbLfxMNyM>B0OvvVI!eKE6z}4kq zbu^siknzOE->;0kZS&fAB_u5nL4ahL5(LuELLQ5Mme0f91HotXa}~z^NSt&3nYgqY z>+;tL0#Eb3tlM1v6r{1PfXWhaN1CDGP$W%M{ioU%YnVJldvxy*)dT4Q$ zbC?t6>+x|tfjVtUKf9A&RI0~%p5Eg&J%x{K1Ba2(BV|`<1KukUOOfCe_4txeBG-Xw qM1Q< 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

V%v-@MWV-Bj);j&%&&-xL8qccMQU&g`T2 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 literal 0 HcmV?d00001 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..97fdd2c --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,80 @@ +services: + # debug: docker compose run --rm -it browser-use-webui bash + browser-use-webui: + # image: ghcr.io/browser-use/web-ui # Using precompiled image + build: + context: . + dockerfile: Dockerfile + args: + TARGETPLATFORM: ${TARGETPLATFORM:-linux/amd64} + ports: + - "7788:7788" + - "6080:6080" + - "5901:5901" + - "9222:9222" + environment: + # LLM API Keys & Endpoints + - OPENAI_ENDPOINT=${OPENAI_ENDPOINT:-https://api.openai.com/v1} + - OPENAI_API_KEY=${OPENAI_API_KEY:-} + - ANTHROPIC_ENDPOINT=${ANTHROPIC_ENDPOINT:-https://api.anthropic.com} + - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-} + - GOOGLE_API_KEY=${GOOGLE_API_KEY:-} + - AZURE_OPENAI_ENDPOINT=${AZURE_OPENAI_ENDPOINT:-} + - AZURE_OPENAI_API_KEY=${AZURE_OPENAI_API_KEY:-} + - AZURE_OPENAI_API_VERSION=${AZURE_OPENAI_API_VERSION:-2025-01-01-preview} + - DEEPSEEK_ENDPOINT=${DEEPSEEK_ENDPOINT:-https://api.deepseek.com} + - DEEPSEEK_API_KEY=${DEEPSEEK_API_KEY:-} + - OLLAMA_ENDPOINT=${OLLAMA_ENDPOINT:-http://localhost:11434} + - MISTRAL_ENDPOINT=${MISTRAL_ENDPOINT:-https://api.mistral.ai/v1} + - MISTRAL_API_KEY=${MISTRAL_API_KEY:-} + - ALIBABA_ENDPOINT=${ALIBABA_ENDPOINT:-https://dashscope.aliyuncs.com/compatible-mode/v1} + - ALIBABA_API_KEY=${ALIBABA_API_KEY:-} + - MOONSHOT_ENDPOINT=${MOONSHOT_ENDPOINT:-https://api.moonshot.cn/v1} + - MOONSHOT_API_KEY=${MOONSHOT_API_KEY:-} + - UNBOUND_ENDPOINT=${UNBOUND_ENDPOINT:-https://api.getunbound.ai} + - UNBOUND_API_KEY=${UNBOUND_API_KEY:-} + - SiliconFLOW_ENDPOINT=${SiliconFLOW_ENDPOINT:-https://api.siliconflow.cn/v1/} + - SiliconFLOW_API_KEY=${SiliconFLOW_API_KEY:-} + - IBM_ENDPOINT=${IBM_ENDPOINT:-https://us-south.ml.cloud.ibm.com} + - IBM_API_KEY=${IBM_API_KEY:-} + - IBM_PROJECT_ID=${IBM_PROJECT_ID:-} + + # Application Settings + - ANONYMIZED_TELEMETRY=${ANONYMIZED_TELEMETRY:-false} + - BROWSER_USE_LOGGING_LEVEL=${BROWSER_USE_LOGGING_LEVEL:-info} + + # Browser Settings + - BROWSER_PATH= + - BROWSER_USER_DATA= + - BROWSER_DEBUGGING_PORT=${BROWSER_DEBUGGING_PORT:-9222} + - BROWSER_DEBUGGING_HOST=localhost + - USE_OWN_BROWSER=false + - KEEP_BROWSER_OPEN=true + - BROWSER_CDP=${BROWSER_CDP:-} # e.g., http://localhost:9222 + + # Display Settings + - DISPLAY=:99 + # This ENV is used by the Dockerfile during build time if playwright respects it. + # It's not strictly needed at runtime by docker-compose unless your app or scripts also read it. + - PLAYWRIGHT_BROWSERS_PATH=/ms-browsers # Matches Dockerfile ENV + - RESOLUTION=${RESOLUTION:-1920x1080x24} + - RESOLUTION_WIDTH=${RESOLUTION_WIDTH:-1920} + - RESOLUTION_HEIGHT=${RESOLUTION_HEIGHT:-1080} + + # VNC Settings + - VNC_PASSWORD=${VNC_PASSWORD:-youvncpassword} + + volumes: + - /tmp/.X11-unix:/tmp/.X11-unix + # - ./my_chrome_data:/app/data/chrome_data # Optional: persist browser data + restart: unless-stopped + shm_size: "2gb" + cap_add: + - SYS_ADMIN + tmpfs: + - /tmp + healthcheck: + test: ["CMD", "nc", "-z", "localhost", "5901"] # VNC port + interval: 10s + timeout: 5s + retries: 3 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f705524 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,10 @@ +browser-use==0.1.48 +pyperclip==1.9.0 +gradio==5.27.0 +json-repair +langchain-mistralai==0.2.4 +MainContentExtractor==0.0.4 +langchain-ibm==0.3.10 +langchain_mcp_adapters==0.0.9 +langgraph==0.3.34 +langchain-community diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/agent/__init__.py b/src/agent/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/agent/browser_use/browser_use_agent.py b/src/agent/browser_use/browser_use_agent.py new file mode 100644 index 0000000..f7f6107 --- /dev/null +++ b/src/agent/browser_use/browser_use_agent.py @@ -0,0 +1,169 @@ +from __future__ import annotations + +import asyncio +import logging +import os + +# from lmnr.sdk.decorators import observe +from browser_use.agent.gif import create_history_gif +from browser_use.agent.service import Agent, AgentHookFunc +from browser_use.agent.views import ( + ActionResult, + AgentHistory, + AgentHistoryList, + AgentStepInfo, + ToolCallingMethod, +) +from browser_use.browser.views import BrowserStateHistory +from browser_use.utils import time_execution_async +from dotenv import load_dotenv +from browser_use.agent.message_manager.utils import is_model_without_tool_support + +load_dotenv() +logger = logging.getLogger(__name__) + +SKIP_LLM_API_KEY_VERIFICATION = ( + os.environ.get("SKIP_LLM_API_KEY_VERIFICATION", "false").lower()[0] in "ty1" +) + + +class BrowserUseAgent(Agent): + def _set_tool_calling_method(self) -> ToolCallingMethod | None: + tool_calling_method = self.settings.tool_calling_method + if tool_calling_method == 'auto': + if is_model_without_tool_support(self.model_name): + return 'raw' + elif self.chat_model_library == 'ChatGoogleGenerativeAI': + return None + elif self.chat_model_library == 'ChatOpenAI': + return 'function_calling' + elif self.chat_model_library == 'AzureChatOpenAI': + return 'function_calling' + else: + return None + else: + return tool_calling_method + + @time_execution_async("--run (agent)") + async def run( + self, max_steps: int = 100, on_step_start: AgentHookFunc | None = None, + on_step_end: AgentHookFunc | None = None + ) -> AgentHistoryList: + """Execute the task with maximum number of steps""" + + loop = asyncio.get_event_loop() + + # Set up the Ctrl+C signal handler with callbacks specific to this agent + from browser_use.utils import SignalHandler + + signal_handler = SignalHandler( + loop=loop, + pause_callback=self.pause, + resume_callback=self.resume, + custom_exit_callback=None, # No special cleanup needed on forced exit + exit_on_second_int=True, + ) + signal_handler.register() + + try: + self._log_agent_run() + + # Execute initial actions if provided + if self.initial_actions: + result = await self.multi_act(self.initial_actions, check_for_new_elements=False) + self.state.last_result = result + + for step in range(max_steps): + # Check if waiting for user input after Ctrl+C + if self.state.paused: + signal_handler.wait_for_resume() + signal_handler.reset() + + # Check if we should stop due to too many failures + if self.state.consecutive_failures >= self.settings.max_failures: + logger.error(f'❌ Stopping due to {self.settings.max_failures} consecutive failures') + break + + # Check control flags before each step + if self.state.stopped: + logger.info('Agent stopped') + break + + while self.state.paused: + await asyncio.sleep(0.2) # Small delay to prevent CPU spinning + if self.state.stopped: # Allow stopping while paused + break + + if on_step_start is not None: + await on_step_start(self) + + step_info = AgentStepInfo(step_number=step, max_steps=max_steps) + await self.step(step_info) + + if on_step_end is not None: + await on_step_end(self) + + if self.state.history.is_done(): + if self.settings.validate_output and step < max_steps - 1: + if not await self._validate_output(): + continue + + await self.log_completion() + break + else: + error_message = 'Failed to complete task in maximum steps' + + self.state.history.history.append( + AgentHistory( + model_output=None, + result=[ActionResult(error=error_message, include_in_memory=True)], + state=BrowserStateHistory( + url='', + title='', + tabs=[], + interacted_element=[], + screenshot=None, + ), + metadata=None, + ) + ) + + logger.info(f'❌ {error_message}') + + return self.state.history + + except KeyboardInterrupt: + # Already handled by our signal handler, but catch any direct KeyboardInterrupt as well + logger.info('Got KeyboardInterrupt during execution, returning current history') + return self.state.history + + finally: + # Unregister signal handlers before cleanup + signal_handler.unregister() + + if self.settings.save_playwright_script_path: + logger.info( + f'Agent run finished. Attempting to save Playwright script to: {self.settings.save_playwright_script_path}' + ) + try: + # Extract sensitive data keys if sensitive_data is provided + keys = list(self.sensitive_data.keys()) if self.sensitive_data else None + # Pass browser and context config to the saving method + self.state.history.save_as_playwright_script( + self.settings.save_playwright_script_path, + sensitive_data_keys=keys, + browser_config=self.browser.config, + context_config=self.browser_context.config, + ) + except Exception as script_gen_err: + # Log any error during script generation/saving + logger.error(f'Failed to save Playwright script: {script_gen_err}', exc_info=True) + + await self.close() + + if self.settings.generate_gif: + output_path: str = 'agent_history.gif' + if isinstance(self.settings.generate_gif, str): + output_path = self.settings.generate_gif + + create_history_gif(task=self.task, history=self.state.history, output_path=output_path) diff --git a/src/agent/deep_research/deep_research_agent.py b/src/agent/deep_research/deep_research_agent.py new file mode 100644 index 0000000..86be301 --- /dev/null +++ b/src/agent/deep_research/deep_research_agent.py @@ -0,0 +1,1261 @@ +import asyncio +import json +import logging +import os +import threading +import uuid +from pathlib import Path +from typing import Any, Dict, List, Optional, TypedDict + +from browser_use.browser.browser import BrowserConfig +from langchain_community.tools.file_management import ( + ListDirectoryTool, + ReadFileTool, + WriteFileTool, +) + +# Langchain imports +from langchain_core.messages import ( + AIMessage, + BaseMessage, + HumanMessage, + SystemMessage, + ToolMessage, +) +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.tools import StructuredTool, Tool + +# Langgraph imports +from langgraph.graph import StateGraph +from pydantic import BaseModel, Field + +from browser_use.browser.context import BrowserContextConfig + +from src.agent.browser_use.browser_use_agent import BrowserUseAgent +from src.browser.custom_browser import CustomBrowser +from src.controller.custom_controller import CustomController +from src.utils.mcp_client import setup_mcp_client_and_tools + +logger = logging.getLogger(__name__) + +# Constants +REPORT_FILENAME = "report.md" +PLAN_FILENAME = "research_plan.md" +SEARCH_INFO_FILENAME = "search_info.json" + +_AGENT_STOP_FLAGS = {} +_BROWSER_AGENT_INSTANCES = {} + + +async def run_single_browser_task( + task_query: str, + task_id: str, + llm: Any, # Pass the main LLM + browser_config: Dict[str, Any], + stop_event: threading.Event, + use_vision: bool = False, +) -> Dict[str, Any]: + """ + Runs a single BrowserUseAgent task. + Manages browser creation and closing for this specific task. + """ + if not BrowserUseAgent: + return { + "query": task_query, + "error": "BrowserUseAgent components not available.", + } + + # --- Browser Setup --- + # These should ideally come from the main agent's config + headless = browser_config.get("headless", False) + window_w = browser_config.get("window_width", 1280) + window_h = browser_config.get("window_height", 1100) + browser_user_data_dir = browser_config.get("user_data_dir", None) + use_own_browser = browser_config.get("use_own_browser", False) + browser_binary_path = browser_config.get("browser_binary_path", None) + wss_url = browser_config.get("wss_url", None) + cdp_url = browser_config.get("cdp_url", None) + disable_security = browser_config.get("disable_security", False) + + bu_browser = None + bu_browser_context = None + try: + logger.info(f"Starting browser task for query: {task_query}") + extra_args = [] + if use_own_browser: + browser_binary_path = os.getenv("BROWSER_PATH", None) or browser_binary_path + if browser_binary_path == "": + browser_binary_path = None + browser_user_data = browser_user_data_dir or os.getenv("BROWSER_USER_DATA", None) + if browser_user_data: + extra_args += [f"--user-data-dir={browser_user_data}"] + else: + browser_binary_path = None + + bu_browser = CustomBrowser( + config=BrowserConfig( + headless=headless, + browser_binary_path=browser_binary_path, + extra_browser_args=extra_args, + wss_url=wss_url, + cdp_url=cdp_url, + new_context_config=BrowserContextConfig( + window_width=window_w, + window_height=window_h, + ) + ) + ) + + context_config = BrowserContextConfig( + save_downloads_path="./tmp/downloads", + window_height=window_h, + window_width=window_w, + force_new_context=True, + ) + bu_browser_context = await bu_browser.new_context(config=context_config) + + # Simple controller example, replace with your actual implementation if needed + bu_controller = CustomController() + + # Construct the task prompt for BrowserUseAgent + # Instruct it to find specific info and return title/URL + bu_task_prompt = f""" + Research Task: {task_query} + Objective: Find relevant information answering the query. + Output Requirements: For each relevant piece of information found, please provide: + 1. A concise summary of the information. + 2. The title of the source page or document. + 3. The URL of the source. + Focus on accuracy and relevance. Avoid irrelevant details. + PDF cannot directly extract _content, please try to download first, then using read_file, if you can't save or read, please try other methods. + """ + + bu_agent_instance = BrowserUseAgent( + task=bu_task_prompt, + llm=llm, # Use the passed LLM + browser=bu_browser, + browser_context=bu_browser_context, + controller=bu_controller, + use_vision=use_vision, + source="webui", + ) + + # Store instance for potential stop() call + task_key = f"{task_id}_{uuid.uuid4()}" + _BROWSER_AGENT_INSTANCES[task_key] = bu_agent_instance + + # --- Run with Stop Check --- + # BrowserUseAgent needs to internally check a stop signal or have a stop method. + # We simulate checking before starting and assume `run` might be interruptible + # or have its own stop mechanism we can trigger via bu_agent_instance.stop(). + if stop_event.is_set(): + logger.info(f"Browser task for '{task_query}' cancelled before start.") + return {"query": task_query, "result": None, "status": "cancelled"} + + # The run needs to be awaitable and ideally accept a stop signal or have a .stop() method + # result = await bu_agent_instance.run(max_steps=max_steps) # Add max_steps if applicable + # Let's assume a simplified run for now + logger.info(f"Running BrowserUseAgent for: {task_query}") + result = await bu_agent_instance.run() # Assuming run is the main method + logger.info(f"BrowserUseAgent finished for: {task_query}") + + final_data = result.final_result() + + if stop_event.is_set(): + logger.info(f"Browser task for '{task_query}' stopped during execution.") + return {"query": task_query, "result": final_data, "status": "stopped"} + else: + logger.info(f"Browser result for '{task_query}': {final_data}") + return {"query": task_query, "result": final_data, "status": "completed"} + + except Exception as e: + logger.error( + f"Error during browser task for query '{task_query}': {e}", exc_info=True + ) + return {"query": task_query, "error": str(e), "status": "failed"} + finally: + if bu_browser_context: + try: + await bu_browser_context.close() + bu_browser_context = None + logger.info("Closed browser context.") + except Exception as e: + logger.error(f"Error closing browser context: {e}") + if bu_browser: + try: + await bu_browser.close() + bu_browser = None + logger.info("Closed browser.") + except Exception as e: + logger.error(f"Error closing browser: {e}") + + if task_key in _BROWSER_AGENT_INSTANCES: + del _BROWSER_AGENT_INSTANCES[task_key] + + +class BrowserSearchInput(BaseModel): + queries: List[str] = Field( + description="List of distinct search queries to find information relevant to the research task." + ) + + +async def _run_browser_search_tool( + queries: List[str], + task_id: str, # Injected dependency + llm: Any, # Injected dependency + browser_config: Dict[str, Any], + stop_event: threading.Event, + max_parallel_browsers: int = 1, +) -> List[Dict[str, Any]]: + """ + Internal function to execute parallel browser searches based on LLM-provided queries. + Handles concurrency and stop signals. + """ + + # Limit queries just in case LLM ignores the description + queries = queries[:max_parallel_browsers] + logger.info( + f"[Browser Tool {task_id}] Running search for {len(queries)} queries: {queries}" + ) + + results = [] + semaphore = asyncio.Semaphore(max_parallel_browsers) + + async def task_wrapper(query): + async with semaphore: + if stop_event.is_set(): + logger.info( + f"[Browser Tool {task_id}] Skipping task due to stop signal: {query}" + ) + return {"query": query, "result": None, "status": "cancelled"} + # Pass necessary injected configs and the stop event + return await run_single_browser_task( + query, + task_id, + llm, # Pass the main LLM (or a dedicated one if needed) + browser_config, + stop_event, + # use_vision could be added here if needed + ) + + tasks = [task_wrapper(query) for query in queries] + search_results = await asyncio.gather(*tasks, return_exceptions=True) + + processed_results = [] + for i, res in enumerate(search_results): + query = queries[i] # Get corresponding query + if isinstance(res, Exception): + logger.error( + f"[Browser Tool {task_id}] Gather caught exception for query '{query}': {res}", + exc_info=True, + ) + processed_results.append( + {"query": query, "error": str(res), "status": "failed"} + ) + elif isinstance(res, dict): + processed_results.append(res) + else: + logger.error( + f"[Browser Tool {task_id}] Unexpected result type for query '{query}': {type(res)}" + ) + processed_results.append( + {"query": query, "error": "Unexpected result type", "status": "failed"} + ) + + logger.info( + f"[Browser Tool {task_id}] Finished search. Results count: {len(processed_results)}" + ) + return processed_results + + +def create_browser_search_tool( + llm: Any, + browser_config: Dict[str, Any], + task_id: str, + stop_event: threading.Event, + max_parallel_browsers: int = 1, +) -> StructuredTool: + """Factory function to create the browser search tool with necessary dependencies.""" + # Use partial to bind the dependencies that aren't part of the LLM call arguments + from functools import partial + + bound_tool_func = partial( + _run_browser_search_tool, + task_id=task_id, + llm=llm, + browser_config=browser_config, + stop_event=stop_event, + max_parallel_browsers=max_parallel_browsers, + ) + + return StructuredTool.from_function( + coroutine=bound_tool_func, + name="parallel_browser_search", + description=f"""Use this tool to actively search the web for information related to a specific research task or question. +It runs up to {max_parallel_browsers} searches in parallel using a browser agent for better results than simple scraping. +Provide a list of distinct search queries(up to {max_parallel_browsers}) that are likely to yield relevant information.""", + args_schema=BrowserSearchInput, + ) + + +# --- Langgraph State Definition --- + + +class ResearchTaskItem(TypedDict): + # step: int # Maybe step within category, or just implicit by order + task_description: str + status: str # "pending", "completed", "failed" + queries: Optional[List[str]] + result_summary: Optional[str] + + +class ResearchCategoryItem(TypedDict): + category_name: str + tasks: List[ResearchTaskItem] + # Optional: category_status: str # Could be "pending", "in_progress", "completed" + + +class DeepResearchState(TypedDict): + task_id: str + topic: str + research_plan: List[ResearchCategoryItem] # CHANGED + search_results: List[Dict[str, Any]] + llm: Any + tools: List[Tool] + output_dir: Path + browser_config: Dict[str, Any] + final_report: Optional[str] + current_category_index: int + current_task_index_in_category: int + stop_requested: bool + error_message: Optional[str] + messages: List[BaseMessage] + + +# --- Langgraph Nodes --- + + +def _load_previous_state(task_id: str, output_dir: str) -> Dict[str, Any]: + state_updates = {} + plan_file = os.path.join(output_dir, PLAN_FILENAME) + search_file = os.path.join(output_dir, SEARCH_INFO_FILENAME) + + loaded_plan: List[ResearchCategoryItem] = [] + next_cat_idx, next_task_idx = 0, 0 + found_pending = False + + if os.path.exists(plan_file): + try: + with open(plan_file, "r", encoding="utf-8") as f: + current_category: Optional[ResearchCategoryItem] = None + lines = f.readlines() + cat_counter = 0 + task_counter_in_cat = 0 + + for line_num, line_content in enumerate(lines): + line = line_content.strip() + if line.startswith("## "): # Category + if current_category: # Save previous category + loaded_plan.append(current_category) + if not found_pending: # If previous category was all done, advance cat counter + cat_counter += 1 + task_counter_in_cat = 0 + category_name = line[line.find(" "):].strip() # Get text after "## X. " + current_category = ResearchCategoryItem(category_name=category_name, tasks=[]) + elif (line.startswith("- [ ]") or line.startswith("- [x]") or line.startswith( + "- [-]")) and current_category: # Task + status = "pending" + if line.startswith("- [x]"): + status = "completed" + elif line.startswith("- [-]"): + status = "failed" + + task_desc = line[5:].strip() + current_category["tasks"].append( + ResearchTaskItem(task_description=task_desc, status=status, queries=None, + result_summary=None) + ) + if status == "pending" and not found_pending: + next_cat_idx = cat_counter + next_task_idx = task_counter_in_cat + found_pending = True + if not found_pending: # only increment if previous tasks were completed/failed + task_counter_in_cat += 1 + + if current_category: # Append last category + loaded_plan.append(current_category) + + if loaded_plan: + state_updates["research_plan"] = loaded_plan + if not found_pending and loaded_plan: # All tasks were completed or failed + next_cat_idx = len(loaded_plan) # Points beyond the last category + next_task_idx = 0 + state_updates["current_category_index"] = next_cat_idx + state_updates["current_task_index_in_category"] = next_task_idx + logger.info( + f"Loaded hierarchical research plan from {plan_file}. " + f"Next task: Category {next_cat_idx}, Task {next_task_idx} in category." + ) + else: + logger.warning(f"Plan file {plan_file} was empty or malformed.") + + except Exception as e: + logger.error(f"Failed to load or parse research plan {plan_file}: {e}", exc_info=True) + state_updates["error_message"] = f"Failed to load research plan: {e}" + else: + logger.info(f"Plan file {plan_file} not found. Will start fresh.") + + if os.path.exists(search_file): + try: + with open(search_file, "r", encoding="utf-8") as f: + state_updates["search_results"] = json.load(f) + logger.info(f"Loaded search results from {search_file}") + except Exception as e: + logger.error(f"Failed to load search results {search_file}: {e}") + state_updates["error_message"] = ( + state_updates.get("error_message", "") + f" Failed to load search results: {e}").strip() + + return state_updates + + +def _save_plan_to_md(plan: List[ResearchCategoryItem], output_dir: str): + plan_file = os.path.join(output_dir, PLAN_FILENAME) + try: + with open(plan_file, "w", encoding="utf-8") as f: + f.write(f"# Research Plan\n\n") + for cat_idx, category in enumerate(plan): + f.write(f"## {cat_idx + 1}. {category['category_name']}\n\n") + for task_idx, task in enumerate(category['tasks']): + marker = "- [x]" if task["status"] == "completed" else "- [ ]" if task[ + "status"] == "pending" else "- [-]" # [-] for failed + f.write(f" {marker} {task['task_description']}\n") + f.write("\n") + logger.info(f"Hierarchical research plan saved to {plan_file}") + except Exception as e: + logger.error(f"Failed to save research plan to {plan_file}: {e}") + + +def _save_search_results_to_json(results: List[Dict[str, Any]], output_dir: str): + """Appends or overwrites search results to a JSON file.""" + search_file = os.path.join(output_dir, SEARCH_INFO_FILENAME) + try: + # Simple overwrite for now, could be append + with open(search_file, "w", encoding="utf-8") as f: + json.dump(results, f, indent=2, ensure_ascii=False) + logger.info(f"Search results saved to {search_file}") + except Exception as e: + logger.error(f"Failed to save search results to {search_file}: {e}") + + +def _save_report_to_md(report: str, output_dir: Path): + """Saves the final report to a markdown file.""" + report_file = os.path.join(output_dir, REPORT_FILENAME) + try: + with open(report_file, "w", encoding="utf-8") as f: + f.write(report) + logger.info(f"Final report saved to {report_file}") + except Exception as e: + logger.error(f"Failed to save final report to {report_file}: {e}") + + +async def planning_node(state: DeepResearchState) -> Dict[str, Any]: + logger.info("--- Entering Planning Node ---") + if state.get("stop_requested"): + logger.info("Stop requested, skipping planning.") + return {"stop_requested": True} + + llm = state["llm"] + topic = state["topic"] + existing_plan = state.get("research_plan") + output_dir = state["output_dir"] + + if existing_plan and ( + state.get("current_category_index", 0) > 0 or state.get("current_task_index_in_category", 0) > 0): + logger.info("Resuming with existing plan.") + _save_plan_to_md(existing_plan, output_dir) # Ensure it's saved initially + # current_category_index and current_task_index_in_category should be set by _load_previous_state + return {"research_plan": existing_plan} + + logger.info(f"Generating new research plan for topic: {topic}") + + prompt_text = f"""You are a meticulous research assistant. Your goal is to create a hierarchical research plan to thoroughly investigate the topic: "{topic}". +The plan should be structured into several main research categories. Each category should contain a list of specific, actionable research tasks or questions. +Format the output as a JSON list of objects. Each object represents a research category and should have: +1. "category_name": A string for the name of the research category. +2. "tasks": A list of strings, where each string is a specific research task for that category. + +Example JSON Output: +[ + {{ + "category_name": "Understanding Core Concepts and Definitions", + "tasks": [ + "Define the primary terminology associated with '{topic}'.", + "Identify the fundamental principles and theories underpinning '{topic}'." + ] + }}, + {{ + "category_name": "Historical Development and Key Milestones", + "tasks": [ + "Trace the historical evolution of '{topic}'.", + "Identify key figures, events, or breakthroughs in the development of '{topic}'." + ] + }}, + {{ + "category_name": "Current State-of-the-Art and Applications", + "tasks": [ + "Analyze the current advancements and prominent applications of '{topic}'.", + "Investigate ongoing research and active areas of development related to '{topic}'." + ] + }}, + {{ + "category_name": "Challenges, Limitations, and Future Outlook", + "tasks": [ + "Identify the major challenges and limitations currently facing '{topic}'.", + "Explore potential future trends, ethical considerations, and societal impacts of '{topic}'." + ] + }} +] + +Generate a plan with 3-10 categories, and 2-6 tasks per category for the topic: "{topic}" according to the complexity of the topic. +Ensure the output is a valid JSON array. +""" + messages = [ + SystemMessage(content="You are a research planning assistant outputting JSON."), + HumanMessage(content=prompt_text) + ] + + try: + response = await llm.ainvoke(messages) + raw_content = response.content + # The LLM might wrap the JSON in backticks + if raw_content.strip().startswith("```json"): + raw_content = raw_content.strip()[7:-3].strip() + elif raw_content.strip().startswith("```"): + raw_content = raw_content.strip()[3:-3].strip() + + logger.debug(f"LLM response for plan: {raw_content}") + parsed_plan_from_llm = json.loads(raw_content) + + new_plan: List[ResearchCategoryItem] = [] + for cat_idx, category_data in enumerate(parsed_plan_from_llm): + if not isinstance(category_data, + dict) or "category_name" not in category_data or "tasks" not in category_data: + logger.warning(f"Skipping invalid category data: {category_data}") + continue + + tasks: List[ResearchTaskItem] = [] + for task_idx, task_desc in enumerate(category_data["tasks"]): + if isinstance(task_desc, str): + tasks.append( + ResearchTaskItem( + task_description=task_desc, + status="pending", + queries=None, + result_summary=None, + ) + ) + else: # Sometimes LLM puts tasks as {"task": "description"} + if isinstance(task_desc, dict) and "task_description" in task_desc: + tasks.append( + ResearchTaskItem( + task_description=task_desc["task_description"], + status="pending", + queries=None, + result_summary=None, + ) + ) + elif isinstance(task_desc, dict) and "task" in task_desc: # common LLM mistake + tasks.append( + ResearchTaskItem( + task_description=task_desc["task"], + status="pending", + queries=None, + result_summary=None, + ) + ) + else: + logger.warning( + f"Skipping invalid task data: {task_desc} in category {category_data['category_name']}") + + new_plan.append( + ResearchCategoryItem( + category_name=category_data["category_name"], + tasks=tasks, + ) + ) + + if not new_plan: + logger.error("LLM failed to generate a valid plan structure from JSON.") + return {"error_message": "Failed to generate research plan structure."} + + logger.info(f"Generated research plan with {len(new_plan)} categories.") + _save_plan_to_md(new_plan, output_dir) # Save the hierarchical plan + + return { + "research_plan": new_plan, + "current_category_index": 0, + "current_task_index_in_category": 0, + "search_results": [], + } + + except json.JSONDecodeError as e: + logger.error(f"Failed to parse JSON from LLM for plan: {e}. Response was: {raw_content}", exc_info=True) + return {"error_message": f"LLM generated invalid JSON for research plan: {e}"} + except Exception as e: + logger.error(f"Error during planning: {e}", exc_info=True) + return {"error_message": f"LLM Error during planning: {e}"} + + +async def research_execution_node(state: DeepResearchState) -> Dict[str, Any]: + logger.info("--- Entering Research Execution Node ---") + if state.get("stop_requested"): + logger.info("Stop requested, skipping research execution.") + return { + "stop_requested": True, + "current_category_index": state["current_category_index"], + "current_task_index_in_category": state["current_task_index_in_category"], + } + + plan = state["research_plan"] + cat_idx = state["current_category_index"] + task_idx = state["current_task_index_in_category"] + llm = state["llm"] + tools = state["tools"] + output_dir = str(state["output_dir"]) + task_id = state["task_id"] # For _AGENT_STOP_FLAGS + + # This check should ideally be handled by `should_continue` + if not plan or cat_idx >= len(plan): + logger.info("Research plan complete or categories exhausted.") + return {} # should route to synthesis + + current_category = plan[cat_idx] + if task_idx >= len(current_category["tasks"]): + logger.info(f"All tasks in category '{current_category['category_name']}' completed. Moving to next category.") + # This logic is now effectively handled by should_continue and the index updates below + # The next iteration will be caught by should_continue or this node with updated indices + return { + "current_category_index": cat_idx + 1, + "current_task_index_in_category": 0, + "messages": state["messages"] # Pass messages along + } + + current_task = current_category["tasks"][task_idx] + + if current_task["status"] == "completed": + logger.info( + f"Task '{current_task['task_description']}' in category '{current_category['category_name']}' already completed. Skipping.") + # Logic to find next task + next_task_idx = task_idx + 1 + next_cat_idx = cat_idx + if next_task_idx >= len(current_category["tasks"]): + next_cat_idx += 1 + next_task_idx = 0 + return { + "current_category_index": next_cat_idx, + "current_task_index_in_category": next_task_idx, + "messages": state["messages"] # Pass messages along + } + + logger.info( + f"Executing research task: '{current_task['task_description']}' (Category: '{current_category['category_name']}')" + ) + + llm_with_tools = llm.bind_tools(tools) + + # Construct messages for LLM invocation + task_prompt_content = ( + f"Current Research Category: {current_category['category_name']}\n" + f"Specific Task: {current_task['task_description']}\n\n" + "Please use the available tools, especially 'parallel_browser_search', to gather information for this specific task. " + "Provide focused search queries relevant ONLY to this task. " + "If you believe you have sufficient information from previous steps for this specific task, you can indicate that you are ready to summarize or that no further search is needed." + ) + current_task_message_history = [ + HumanMessage(content=task_prompt_content) + ] + if not state["messages"]: # First actual execution message + invocation_messages = [ + SystemMessage( + content="You are a research assistant executing one task of a research plan. Focus on the current task only."), + ] + current_task_message_history + else: + invocation_messages = state["messages"] + current_task_message_history + + try: + logger.info(f"Invoking LLM with tools for task: {current_task['task_description']}") + ai_response: BaseMessage = await llm_with_tools.ainvoke(invocation_messages) + logger.info("LLM invocation complete.") + + tool_results = [] + executed_tool_names = [] + current_search_results = state.get("search_results", []) # Get existing search results + + if not isinstance(ai_response, AIMessage) or not ai_response.tool_calls: + logger.warning( + f"LLM did not call any tool for task '{current_task['task_description']}'. Response: {ai_response.content[:100]}..." + ) + current_task["status"] = "pending" # Or "completed_no_tool" if LLM explains it's done + current_task["result_summary"] = f"LLM did not use a tool. Response: {ai_response.content}" + current_task["current_category_index"] = cat_idx + current_task["current_task_index_in_category"] = task_idx + return current_task + # We still save the plan and advance. + else: + # Process tool calls + for tool_call in ai_response.tool_calls: + tool_name = tool_call.get("name") + tool_args = tool_call.get("args", {}) + tool_call_id = tool_call.get("id") + + logger.info(f"LLM requested tool call: {tool_name} with args: {tool_args}") + executed_tool_names.append(tool_name) + selected_tool = next((t for t in tools if t.name == tool_name), None) + + if not selected_tool: + logger.error(f"LLM called tool '{tool_name}' which is not available.") + tool_results.append( + ToolMessage(content=f"Error: Tool '{tool_name}' not found.", tool_call_id=tool_call_id)) + continue + + try: + stop_event = _AGENT_STOP_FLAGS.get(task_id) + if stop_event and stop_event.is_set(): + logger.info(f"Stop requested before executing tool: {tool_name}") + current_task["status"] = "pending" # Or a new "stopped" status + _save_plan_to_md(plan, output_dir) + return {"stop_requested": True, "research_plan": plan, "current_category_index": cat_idx, + "current_task_index_in_category": task_idx} + + logger.info(f"Executing tool: {tool_name}") + tool_output = await selected_tool.ainvoke(tool_args) + logger.info(f"Tool '{tool_name}' executed successfully.") + + if tool_name == "parallel_browser_search": + current_search_results.extend(tool_output) # tool_output is List[Dict] + else: # For other tools, we might need specific handling or just log + logger.info(f"Result from tool '{tool_name}': {str(tool_output)[:200]}...") + # Storing non-browser results might need a different structure or key in search_results + current_search_results.append( + {"tool_name": tool_name, "args": tool_args, "output": str(tool_output), + "status": "completed"}) + + tool_results.append(ToolMessage(content=json.dumps(tool_output), tool_call_id=tool_call_id)) + + except Exception as e: + logger.error(f"Error executing tool '{tool_name}': {e}", exc_info=True) + tool_results.append( + ToolMessage(content=f"Error executing tool {tool_name}: {e}", tool_call_id=tool_call_id)) + current_search_results.append( + {"tool_name": tool_name, "args": tool_args, "status": "failed", "error": str(e)}) + + # After processing all tool calls for this task + step_failed_tool_execution = any("Error:" in str(tr.content) for tr in tool_results) + # Consider a task successful if a browser search was attempted and didn't immediately error out during call + # The browser search itself returns status for each query. + browser_tool_attempted_successfully = "parallel_browser_search" in executed_tool_names and not step_failed_tool_execution + + if step_failed_tool_execution: + current_task["status"] = "failed" + current_task[ + "result_summary"] = f"Tool execution failed. Errors: {[tr.content for tr in tool_results if 'Error' in str(tr.content)]}" + elif executed_tool_names: # If any tool was called + current_task["status"] = "completed" + current_task["result_summary"] = f"Executed tool(s): {', '.join(executed_tool_names)}." + # TODO: Could ask LLM to summarize the tool_results for this task if needed, rather than just listing tools. + else: # No tool calls but AI response had .tool_calls structure (empty) + current_task["status"] = "failed" # Or a more specific status + current_task["result_summary"] = "LLM prepared for tool call but provided no tools." + + # Save progress + _save_plan_to_md(plan, output_dir) + _save_search_results_to_json(current_search_results, output_dir) + + # Determine next indices + next_task_idx = task_idx + 1 + next_cat_idx = cat_idx + if next_task_idx >= len(current_category["tasks"]): + next_cat_idx += 1 + next_task_idx = 0 + + updated_messages = state["messages"] + current_task_message_history + [ai_response] + tool_results + + return { + "research_plan": plan, + "search_results": current_search_results, + "current_category_index": next_cat_idx, + "current_task_index_in_category": next_task_idx, + "messages": updated_messages, + } + + except Exception as e: + logger.error(f"Unhandled error during research execution for task '{current_task['task_description']}': {e}", + exc_info=True) + current_task["status"] = "failed" + _save_plan_to_md(plan, output_dir) + # Determine next indices even on error to attempt to move on + next_task_idx = task_idx + 1 + next_cat_idx = cat_idx + if next_task_idx >= len(current_category["tasks"]): + next_cat_idx += 1 + next_task_idx = 0 + return { + "research_plan": plan, + "current_category_index": next_cat_idx, + "current_task_index_in_category": next_task_idx, + "error_message": f"Core Execution Error on task '{current_task['task_description']}': {e}", + "messages": state["messages"] + current_task_message_history # Preserve messages up to error + } + + +async def synthesis_node(state: DeepResearchState) -> Dict[str, Any]: + """Synthesizes the final report from the collected search results.""" + logger.info("--- Entering Synthesis Node ---") + if state.get("stop_requested"): + logger.info("Stop requested, skipping synthesis.") + return {"stop_requested": True} + + llm = state["llm"] + topic = state["topic"] + search_results = state.get("search_results", []) + output_dir = state["output_dir"] + plan = state["research_plan"] # Include plan for context + + if not search_results: + logger.warning("No search results found to synthesize report.") + report = f"# Research Report: {topic}\n\nNo information was gathered during the research process." + _save_report_to_md(report, output_dir) + return {"final_report": report} + + logger.info( + f"Synthesizing report from {len(search_results)} collected search result entries." + ) + + # Prepare context for the LLM + # Format search results nicely, maybe group by query or original plan step + formatted_results = "" + references = {} + ref_count = 1 + for i, result_entry in enumerate(search_results): + query = result_entry.get("query", "Unknown Query") # From parallel_browser_search + tool_name = result_entry.get("tool_name") # From other tools + status = result_entry.get("status", "unknown") + result_data = result_entry.get("result") # From BrowserUseAgent's final_result + tool_output_str = result_entry.get("output") # From other tools + + if tool_name == "parallel_browser_search" and status == "completed" and result_data: + # result_data is the summary from BrowserUseAgent + formatted_results += f'### Finding from Web Search Query: "{query}"\n' + formatted_results += f"- **Summary:**\n{result_data}\n" # result_data is already a summary string here + # If result_data contained title/URL, you'd format them here. + # The current BrowserUseAgent returns a string summary directly as 'final_data' in run_single_browser_task + formatted_results += "---\n" + elif tool_name != "parallel_browser_search" and status == "completed" and tool_output_str: + formatted_results += f'### Finding from Tool: "{tool_name}" (Args: {result_entry.get("args")})\n' + formatted_results += f"- **Output:**\n{tool_output_str}\n" + formatted_results += "---\n" + elif status == "failed": + error = result_entry.get("error") + q_or_t = f"Query: \"{query}\"" if query != "Unknown Query" else f"Tool: \"{tool_name}\"" + formatted_results += f'### Failed {q_or_t}\n' + formatted_results += f"- **Error:** {error}\n" + formatted_results += "---\n" + + # Prepare the research plan context + plan_summary = "\nResearch Plan Followed:\n" + for cat_idx, category in enumerate(plan): + plan_summary += f"\n#### Category {cat_idx + 1}: {category['category_name']}\n" + for task_idx, task in enumerate(category['tasks']): + marker = "[x]" if task["status"] == "completed" else "[ ]" if task["status"] == "pending" else "[-]" + plan_summary += f" - {marker} {task['task_description']}\n" + + synthesis_prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + """You are a professional researcher tasked with writing a comprehensive and well-structured report based on collected findings. + The report should address the research topic thoroughly, synthesizing the information gathered from various sources. + Structure the report logically: + 1. Briefly introduce the topic and the report's scope (mentioning the research plan followed, including categories and tasks, is good). + 2. Discuss the key findings, organizing them thematically, possibly aligning with the research categories. Analyze, compare, and contrast information. + 3. Summarize the main points and offer concluding thoughts. + + Ensure the tone is objective and professional. + If findings are contradictory or incomplete, acknowledge this. + """, # Removed citation part for simplicity for now, as browser agent returns summaries. + ), + ( + "human", + f""" + **Research Topic:** {topic} + + {plan_summary} + + **Collected Findings:** + ``` + {formatted_results} + ``` + + Please generate the final research report in Markdown format based **only** on the information above. + """, + ), + ] + ) + + try: + response = await llm.ainvoke( + synthesis_prompt.format_prompt( + topic=topic, + plan_summary=plan_summary, + formatted_results=formatted_results, + ).to_messages() + ) + final_report_md = response.content + + # Append the reference list automatically to the end of the generated markdown + if references: + report_references_section = "\n\n## References\n\n" + # Sort refs by ID for consistent output + sorted_refs = sorted(references.values(), key=lambda x: x["id"]) + for ref in sorted_refs: + report_references_section += ( + f"[{ref['id']}] {ref['title']} - {ref['url']}\n" + ) + final_report_md += report_references_section + + logger.info("Successfully synthesized the final report.") + _save_report_to_md(final_report_md, output_dir) + return {"final_report": final_report_md} + + except Exception as e: + logger.error(f"Error during report synthesis: {e}", exc_info=True) + return {"error_message": f"LLM Error during synthesis: {e}"} + + +# --- Langgraph Edges and Conditional Logic --- + + +def should_continue(state: DeepResearchState) -> str: + logger.info("--- Evaluating Condition: Should Continue? ---") + if state.get("stop_requested"): + logger.info("Stop requested, routing to END.") + return "end_run" + if state.get("error_message") and "Core Execution Error" in state["error_message"]: # Critical error in node + logger.warning(f"Critical error detected: {state['error_message']}. Routing to END.") + return "end_run" + + plan = state.get("research_plan") + cat_idx = state.get("current_category_index", 0) + task_idx = state.get("current_task_index_in_category", 0) # This is the *next* task to check + + if not plan: + logger.warning("No research plan found. Routing to END.") + return "end_run" + + # Check if the current indices point to a valid pending task + if cat_idx < len(plan): + current_category = plan[cat_idx] + if task_idx < len(current_category["tasks"]): + # We are trying to execute the task at plan[cat_idx]["tasks"][task_idx] + # The research_execution_node will handle if it's already completed. + logger.info( + f"Plan has potential pending tasks (next up: Category {cat_idx}, Task {task_idx}). Routing to Research Execution." + ) + return "execute_research" + else: # task_idx is out of bounds for current category, means we need to check next category + if cat_idx + 1 < len(plan): # If there is a next category + logger.info( + f"Finished tasks in category {cat_idx}. Moving to category {cat_idx + 1}. Routing to Research Execution." + ) + # research_execution_node will update state to {current_category_index: cat_idx + 1, current_task_index_in_category: 0} + # Or rather, the previous execution node already set these indices to the start of the next category. + return "execute_research" + + # If we've gone through all categories and tasks (cat_idx >= len(plan)) + logger.info("All plan categories and tasks processed or current indices are out of bounds. Routing to Synthesis.") + return "synthesize_report" + + +# --- DeepSearchAgent Class --- + + +class DeepResearchAgent: + def __init__( + self, + llm: Any, + browser_config: Dict[str, Any], + mcp_server_config: Optional[Dict[str, Any]] = None, + ): + """ + Initializes the DeepSearchAgent. + + Args: + llm: The Langchain compatible language model instance. + browser_config: Configuration dictionary for the BrowserUseAgent tool. + Example: {"headless": True, "window_width": 1280, ...} + mcp_server_config: Optional configuration for the MCP client. + """ + self.llm = llm + self.browser_config = browser_config + self.mcp_server_config = mcp_server_config + self.mcp_client = None + self.stopped = False + self.graph = self._compile_graph() + self.current_task_id: Optional[str] = None + self.stop_event: Optional[threading.Event] = None + self.runner: Optional[asyncio.Task] = None # To hold the asyncio task for run + + async def _setup_tools( + self, task_id: str, stop_event: threading.Event, max_parallel_browsers: int = 1 + ) -> List[Tool]: + """Sets up the basic tools (File I/O) and optional MCP tools.""" + tools = [ + WriteFileTool(), + ReadFileTool(), + ListDirectoryTool(), + ] # Basic file operations + browser_use_tool = create_browser_search_tool( + llm=self.llm, + browser_config=self.browser_config, + task_id=task_id, + stop_event=stop_event, + max_parallel_browsers=max_parallel_browsers, + ) + tools += [browser_use_tool] + # Add MCP tools if config is provided + if self.mcp_server_config: + try: + logger.info("Setting up MCP client and tools...") + if not self.mcp_client: + self.mcp_client = await setup_mcp_client_and_tools( + self.mcp_server_config + ) + mcp_tools = self.mcp_client.get_tools() + logger.info(f"Loaded {len(mcp_tools)} MCP tools.") + tools.extend(mcp_tools) + except Exception as e: + logger.error(f"Failed to set up MCP tools: {e}", exc_info=True) + elif self.mcp_server_config: + logger.warning( + "MCP server config provided, but setup function unavailable." + ) + tools_map = {tool.name: tool for tool in tools} + return tools_map.values() + + async def close_mcp_client(self): + if self.mcp_client: + await self.mcp_client.__aexit__(None, None, None) + self.mcp_client = None + + def _compile_graph(self) -> StateGraph: + """Compiles the Langgraph state machine.""" + workflow = StateGraph(DeepResearchState) + + # Add nodes + workflow.add_node("plan_research", planning_node) + workflow.add_node("execute_research", research_execution_node) + workflow.add_node("synthesize_report", synthesis_node) + workflow.add_node( + "end_run", lambda state: logger.info("--- Reached End Run Node ---") or {} + ) # Simple end node + + # Define edges + workflow.set_entry_point("plan_research") + + workflow.add_edge( + "plan_research", "execute_research" + ) # Always execute after planning + + # Conditional edge after execution + workflow.add_conditional_edges( + "execute_research", + should_continue, + { + "execute_research": "execute_research", # Loop back if more steps + "synthesize_report": "synthesize_report", # Move to synthesis if done + "end_run": "end_run", # End if stop requested or error + }, + ) + + workflow.add_edge("synthesize_report", "end_run") # End after synthesis + + app = workflow.compile() + return app + + async def run( + self, + topic: str, + task_id: Optional[str] = None, + save_dir: str = "./tmp/deep_research", + max_parallel_browsers: int = 1, + ) -> Dict[str, Any]: + """ + Starts the deep research process (Async Generator Version). + + Args: + topic: The research topic. + task_id: Optional existing task ID to resume. If None, a new ID is generated. + + Yields: + Intermediate state updates or messages during execution. + """ + if self.runner and not self.runner.done(): + logger.warning( + "Agent is already running. Please stop the current task first." + ) + # Return an error status instead of yielding + return { + "status": "error", + "message": "Agent already running.", + "task_id": self.current_task_id, + } + + self.current_task_id = task_id if task_id else str(uuid.uuid4()) + safe_root_dir = "./tmp/deep_research" + normalized_save_dir = os.path.normpath(save_dir) + if not normalized_save_dir.startswith(os.path.abspath(safe_root_dir)): + logger.warning(f"Unsafe save_dir detected: {save_dir}. Using default directory.") + normalized_save_dir = os.path.abspath(safe_root_dir) + output_dir = os.path.join(normalized_save_dir, self.current_task_id) + os.makedirs(output_dir, exist_ok=True) + + logger.info( + f"[AsyncGen] Starting research task ID: {self.current_task_id} for topic: '{topic}'" + ) + logger.info(f"[AsyncGen] Output directory: {output_dir}") + + self.stop_event = threading.Event() + _AGENT_STOP_FLAGS[self.current_task_id] = self.stop_event + agent_tools = await self._setup_tools( + self.current_task_id, self.stop_event, max_parallel_browsers + ) + initial_state: DeepResearchState = { + "task_id": self.current_task_id, + "topic": topic, + "research_plan": [], + "search_results": [], + "messages": [], + "llm": self.llm, + "tools": agent_tools, + "output_dir": Path(output_dir), + "browser_config": self.browser_config, + "final_report": None, + "current_category_index": 0, + "current_task_index_in_category": 0, + "stop_requested": False, + "error_message": None, + } + + if task_id: + logger.info(f"Attempting to resume task {task_id}...") + loaded_state = _load_previous_state(task_id, output_dir) + initial_state.update(loaded_state) + if loaded_state.get("research_plan"): + logger.info( + f"Resuming with {len(loaded_state['research_plan'])} plan categories " + f"and {len(loaded_state.get('search_results', []))} existing results. " + f"Next task: Cat {initial_state['current_category_index']}, Task {initial_state['current_task_index_in_category']}" + ) + initial_state["topic"] = ( + topic # Allow overriding topic even when resuming? Or use stored topic? Let's use new one. + ) + else: + logger.warning( + f"Resume requested for {task_id}, but no previous plan found. Starting fresh." + ) + + # --- Execute Graph using ainvoke --- + final_state = None + status = "unknown" + message = None + try: + logger.info(f"Invoking graph execution for task {self.current_task_id}...") + self.runner = asyncio.create_task(self.graph.ainvoke(initial_state)) + final_state = await self.runner + logger.info(f"Graph execution finished for task {self.current_task_id}.") + + # Determine status based on final state + if self.stop_event and self.stop_event.is_set(): + status = "stopped" + message = "Research process was stopped by request." + logger.info(message) + elif final_state and final_state.get("error_message"): + status = "error" + message = final_state["error_message"] + logger.error(f"Graph execution completed with error: {message}") + elif final_state and final_state.get("final_report"): + status = "completed" + message = "Research process completed successfully." + logger.info(message) + else: + # If it ends without error/report (e.g., empty plan, stopped before synthesis) + status = "finished_incomplete" + message = "Research process finished, but may be incomplete (no final report generated)." + logger.warning(message) + + except asyncio.CancelledError: + status = "cancelled" + message = f"Agent run task cancelled for {self.current_task_id}." + logger.info(message) + # final_state will remain None or the state before cancellation if checkpointing was used + except Exception as e: + status = "error" + message = f"Unhandled error during graph execution for {self.current_task_id}: {e}" + logger.error(message, exc_info=True) + # final_state will remain None or the state before the error + finally: + logger.info(f"Cleaning up resources for task {self.current_task_id}") + task_id_to_clean = self.current_task_id + + self.stop_event = None + self.current_task_id = None + self.runner = None # Mark runner as finished + if self.mcp_client: + await self.mcp_client.__aexit__(None, None, None) + + # Return a result dictionary including the status and the final state if available + return { + "status": status, + "message": message, + "task_id": task_id_to_clean, # Use the stored task_id + "final_state": final_state + if final_state + else {}, # Return the final state dict + } + + async def _stop_lingering_browsers(self, task_id): + """Attempts to stop any BrowserUseAgent instances associated with the task_id.""" + keys_to_stop = [ + key for key in _BROWSER_AGENT_INSTANCES if key.startswith(f"{task_id}_") + ] + if not keys_to_stop: + return + + logger.warning( + f"Found {len(keys_to_stop)} potentially lingering browser agents for task {task_id}. Attempting stop..." + ) + for key in keys_to_stop: + agent_instance = _BROWSER_AGENT_INSTANCES.get(key) + try: + if agent_instance: + # Assuming BU agent has an async stop method + await agent_instance.stop() + logger.info(f"Called stop() on browser agent instance {key}") + except Exception as e: + logger.error( + f"Error calling stop() on browser agent instance {key}: {e}" + ) + + async def stop(self): + """Signals the currently running agent task to stop.""" + if not self.current_task_id or not self.stop_event: + logger.info("No agent task is currently running.") + return + + logger.info(f"Stop requested for task ID: {self.current_task_id}") + self.stop_event.set() # Signal the stop event + self.stopped = True + await self._stop_lingering_browsers(self.current_task_id) + + def close(self): + self.stopped = False diff --git a/src/browser/__init__.py b/src/browser/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/browser/custom_browser.py b/src/browser/custom_browser.py new file mode 100644 index 0000000..1556959 --- /dev/null +++ b/src/browser/custom_browser.py @@ -0,0 +1,109 @@ +import asyncio +import pdb + +from playwright.async_api import Browser as PlaywrightBrowser +from playwright.async_api import ( + BrowserContext as PlaywrightBrowserContext, +) +from playwright.async_api import ( + Playwright, + async_playwright, +) +from browser_use.browser.browser import Browser, IN_DOCKER +from browser_use.browser.context import BrowserContext, BrowserContextConfig +from playwright.async_api import BrowserContext as PlaywrightBrowserContext +import logging + +from browser_use.browser.chrome import ( + CHROME_ARGS, + CHROME_DETERMINISTIC_RENDERING_ARGS, + CHROME_DISABLE_SECURITY_ARGS, + CHROME_DOCKER_ARGS, + CHROME_HEADLESS_ARGS, +) +from browser_use.browser.context import BrowserContext, BrowserContextConfig +from browser_use.browser.utils.screen_resolution import get_screen_resolution, get_window_adjustments +from browser_use.utils import time_execution_async +import socket + +from .custom_context import CustomBrowserContext + +logger = logging.getLogger(__name__) + + +class CustomBrowser(Browser): + + async def new_context(self, config: BrowserContextConfig | None = None) -> CustomBrowserContext: + """Create a browser context""" + browser_config = self.config.model_dump() if self.config else {} + context_config = config.model_dump() if config else {} + merged_config = {**browser_config, **context_config} + return CustomBrowserContext(config=BrowserContextConfig(**merged_config), browser=self) + + async def _setup_builtin_browser(self, playwright: Playwright) -> PlaywrightBrowser: + """Sets up and returns a Playwright Browser instance with anti-detection measures.""" + assert self.config.browser_binary_path is None, 'browser_binary_path should be None if trying to use the builtin browsers' + + # Use the configured window size from new_context_config if available + if ( + not self.config.headless + and hasattr(self.config, 'new_context_config') + and hasattr(self.config.new_context_config, 'window_width') + and hasattr(self.config.new_context_config, 'window_height') + ): + screen_size = { + 'width': self.config.new_context_config.window_width, + 'height': self.config.new_context_config.window_height, + } + offset_x, offset_y = get_window_adjustments() + elif self.config.headless: + screen_size = {'width': 1920, 'height': 1080} + offset_x, offset_y = 0, 0 + else: + screen_size = get_screen_resolution() + offset_x, offset_y = get_window_adjustments() + + chrome_args = { + f'--remote-debugging-port={self.config.chrome_remote_debugging_port}', + *CHROME_ARGS, + *(CHROME_DOCKER_ARGS if IN_DOCKER else []), + *(CHROME_HEADLESS_ARGS if self.config.headless else []), + *(CHROME_DISABLE_SECURITY_ARGS if self.config.disable_security else []), + *(CHROME_DETERMINISTIC_RENDERING_ARGS if self.config.deterministic_rendering else []), + f'--window-position={offset_x},{offset_y}', + f'--window-size={screen_size["width"]},{screen_size["height"]}', + *self.config.extra_browser_args, + } + + # check if chrome remote debugging port is already taken, + # if so remove the remote-debugging-port arg to prevent conflicts + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + if s.connect_ex(('localhost', self.config.chrome_remote_debugging_port)) == 0: + chrome_args.remove(f'--remote-debugging-port={self.config.chrome_remote_debugging_port}') + + browser_class = getattr(playwright, self.config.browser_class) + args = { + 'chromium': list(chrome_args), + 'firefox': [ + *{ + '-no-remote', + *self.config.extra_browser_args, + } + ], + 'webkit': [ + *{ + '--no-startup-window', + *self.config.extra_browser_args, + } + ], + } + + browser = await browser_class.launch( + channel='chromium', # https://github.com/microsoft/playwright/issues/33566 + headless=self.config.headless, + args=args[self.config.browser_class], + proxy=self.config.proxy.model_dump() if self.config.proxy else None, + handle_sigterm=False, + handle_sigint=False, + ) + return browser diff --git a/src/browser/custom_context.py b/src/browser/custom_context.py new file mode 100644 index 0000000..674191a --- /dev/null +++ b/src/browser/custom_context.py @@ -0,0 +1,22 @@ +import json +import logging +import os + +from browser_use.browser.browser import Browser, IN_DOCKER +from browser_use.browser.context import BrowserContext, BrowserContextConfig +from playwright.async_api import Browser as PlaywrightBrowser +from playwright.async_api import BrowserContext as PlaywrightBrowserContext +from typing import Optional +from browser_use.browser.context import BrowserContextState + +logger = logging.getLogger(__name__) + + +class CustomBrowserContext(BrowserContext): + def __init__( + self, + browser: 'Browser', + config: BrowserContextConfig | None = None, + state: Optional[BrowserContextState] = None, + ): + super(CustomBrowserContext, self).__init__(browser=browser, config=config, state=state) diff --git a/src/controller/__init__.py b/src/controller/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/controller/custom_controller.py b/src/controller/custom_controller.py new file mode 100644 index 0000000..00e050c --- /dev/null +++ b/src/controller/custom_controller.py @@ -0,0 +1,182 @@ +import pdb + +import pyperclip +from typing import Optional, Type, Callable, Dict, Any, Union, Awaitable, TypeVar +from pydantic import BaseModel +from browser_use.agent.views import ActionResult +from browser_use.browser.context import BrowserContext +from browser_use.controller.service import Controller, DoneAction +from browser_use.controller.registry.service import Registry, RegisteredAction +from main_content_extractor import MainContentExtractor +from browser_use.controller.views import ( + ClickElementAction, + DoneAction, + ExtractPageContentAction, + GoToUrlAction, + InputTextAction, + OpenTabAction, + ScrollAction, + SearchGoogleAction, + SendKeysAction, + SwitchTabAction, +) +import logging +import inspect +import asyncio +import os +from langchain_core.language_models.chat_models import BaseChatModel +from browser_use.agent.views import ActionModel, ActionResult + +from src.utils.mcp_client import create_tool_param_model, setup_mcp_client_and_tools + +from browser_use.utils import time_execution_sync + +logger = logging.getLogger(__name__) + +Context = TypeVar('Context') + + +class CustomController(Controller): + def __init__(self, exclude_actions: list[str] = [], + output_model: Optional[Type[BaseModel]] = None, + ask_assistant_callback: Optional[Union[Callable[[str, BrowserContext], Dict[str, Any]], Callable[ + [str, BrowserContext], Awaitable[Dict[str, Any]]]]] = None, + ): + super().__init__(exclude_actions=exclude_actions, output_model=output_model) + self._register_custom_actions() + self.ask_assistant_callback = ask_assistant_callback + self.mcp_client = None + self.mcp_server_config = None + + def _register_custom_actions(self): + """Register all custom browser actions""" + + @self.registry.action( + "When executing tasks, prioritize autonomous completion. However, if you encounter a definitive blocker " + "that prevents you from proceeding independently – such as needing credentials you don't possess, " + "requiring subjective human judgment, needing a physical action performed, encountering complex CAPTCHAs, " + "or facing limitations in your capabilities – you must request human assistance." + ) + async def ask_for_assistant(query: str, browser: BrowserContext): + if self.ask_assistant_callback: + if inspect.iscoroutinefunction(self.ask_assistant_callback): + user_response = await self.ask_assistant_callback(query, browser) + else: + user_response = self.ask_assistant_callback(query, browser) + msg = f"AI ask: {query}. User response: {user_response['response']}" + logger.info(msg) + return ActionResult(extracted_content=msg, include_in_memory=True) + else: + return ActionResult(extracted_content="Human cannot help you. Please try another way.", + include_in_memory=True) + + @self.registry.action( + 'Upload file to interactive element with file path ', + ) + async def upload_file(index: int, path: str, browser: BrowserContext, available_file_paths: list[str]): + if path not in available_file_paths: + return ActionResult(error=f'File path {path} is not available') + + if not os.path.exists(path): + return ActionResult(error=f'File {path} does not exist') + + dom_el = await browser.get_dom_element_by_index(index) + + file_upload_dom_el = dom_el.get_file_upload_element() + + if file_upload_dom_el is None: + msg = f'No file upload element found at index {index}' + logger.info(msg) + return ActionResult(error=msg) + + file_upload_el = await browser.get_locate_element(file_upload_dom_el) + + if file_upload_el is None: + msg = f'No file upload element found at index {index}' + logger.info(msg) + return ActionResult(error=msg) + + try: + await file_upload_el.set_input_files(path) + msg = f'Successfully uploaded file to index {index}' + logger.info(msg) + return ActionResult(extracted_content=msg, include_in_memory=True) + except Exception as e: + msg = f'Failed to upload file to index {index}: {str(e)}' + logger.info(msg) + return ActionResult(error=msg) + + @time_execution_sync('--act') + async def act( + self, + action: ActionModel, + browser_context: Optional[BrowserContext] = None, + # + page_extraction_llm: Optional[BaseChatModel] = None, + sensitive_data: Optional[Dict[str, str]] = None, + available_file_paths: Optional[list[str]] = None, + # + context: Context | None = None, + ) -> ActionResult: + """Execute an action""" + + try: + for action_name, params in action.model_dump(exclude_unset=True).items(): + if params is not None: + if action_name.startswith("mcp"): + # this is a mcp tool + logger.debug(f"Invoke MCP tool: {action_name}") + mcp_tool = self.registry.registry.actions.get(action_name).function + result = await mcp_tool.ainvoke(params) + else: + result = await self.registry.execute_action( + action_name, + params, + browser=browser_context, + page_extraction_llm=page_extraction_llm, + sensitive_data=sensitive_data, + available_file_paths=available_file_paths, + context=context, + ) + + if isinstance(result, str): + return ActionResult(extracted_content=result) + elif isinstance(result, ActionResult): + return result + elif result is None: + return ActionResult() + else: + raise ValueError(f'Invalid action result type: {type(result)} of {result}') + return ActionResult() + except Exception as e: + raise e + + async def setup_mcp_client(self, mcp_server_config: Optional[Dict[str, Any]] = None): + self.mcp_server_config = mcp_server_config + if self.mcp_server_config: + self.mcp_client = await setup_mcp_client_and_tools(self.mcp_server_config) + self.register_mcp_tools() + + def register_mcp_tools(self): + """ + Register the MCP tools used by this controller. + """ + if self.mcp_client: + for server_name in self.mcp_client.server_name_to_tools: + for tool in self.mcp_client.server_name_to_tools[server_name]: + tool_name = f"mcp.{server_name}.{tool.name}" + self.registry.registry.actions[tool_name] = RegisteredAction( + name=tool_name, + description=tool.description, + function=tool, + param_model=create_tool_param_model(tool), + ) + logger.info(f"Add mcp tool: {tool_name}") + logger.debug( + f"Registered {len(self.mcp_client.server_name_to_tools[server_name])} mcp tools for {server_name}") + else: + logger.warning(f"MCP client not started.") + + async def close_mcp_client(self): + if self.mcp_client: + await self.mcp_client.__aexit__(None, None, None) diff --git a/src/utils/__init__.py b/src/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/config.py b/src/utils/config.py new file mode 100644 index 0000000..de82bb9 --- /dev/null +++ b/src/utils/config.py @@ -0,0 +1,100 @@ +PROVIDER_DISPLAY_NAMES = { + "openai": "OpenAI", + "azure_openai": "Azure OpenAI", + "anthropic": "Anthropic", + "deepseek": "DeepSeek", + "google": "Google", + "alibaba": "Alibaba", + "moonshot": "MoonShot", + "unbound": "Unbound AI", + "ibm": "IBM", + "grok": "Grok", +} + +# Predefined model names for common providers +model_names = { + "anthropic": ["claude-3-5-sonnet-20241022", "claude-3-5-sonnet-20240620", "claude-3-opus-20240229"], + "openai": ["gpt-4o", "gpt-4", "gpt-3.5-turbo", "o3-mini"], + "deepseek": ["deepseek-chat", "deepseek-reasoner"], + "google": ["gemini-2.0-flash", "gemini-2.0-flash-thinking-exp", "gemini-1.5-flash-latest", + "gemini-1.5-flash-8b-latest", "gemini-2.0-flash-thinking-exp-01-21", "gemini-2.0-pro-exp-02-05", + "gemini-2.5-pro-preview-03-25", "gemini-2.5-flash-preview-04-17"], + "ollama": ["qwen2.5:7b", "qwen2.5:14b", "qwen2.5:32b", "qwen2.5-coder:14b", "qwen2.5-coder:32b", "llama2:7b", + "deepseek-r1:14b", "deepseek-r1:32b"], + "azure_openai": ["gpt-4o", "gpt-4", "gpt-3.5-turbo"], + "mistral": ["pixtral-large-latest", "mistral-large-latest", "mistral-small-latest", "ministral-8b-latest"], + "alibaba": ["qwen-plus", "qwen-max", "qwen-vl-max", "qwen-vl-plus", "qwen-turbo", "qwen-long"], + "moonshot": ["moonshot-v1-32k-vision-preview", "moonshot-v1-8k-vision-preview"], + "unbound": ["gemini-2.0-flash", "gpt-4o-mini", "gpt-4o", "gpt-4.5-preview"], + "grok": [ + "grok-3", + "grok-3-fast", + "grok-3-mini", + "grok-3-mini-fast", + "grok-2-vision", + "grok-2-image", + "grok-2", + ], + "siliconflow": [ + "deepseek-ai/DeepSeek-R1", + "deepseek-ai/DeepSeek-V3", + "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B", + "deepseek-ai/DeepSeek-V2.5", + "deepseek-ai/deepseek-vl2", + "Qwen/Qwen2.5-72B-Instruct-128K", + "Qwen/Qwen2.5-72B-Instruct", + "Qwen/Qwen2.5-32B-Instruct", + "Qwen/Qwen2.5-14B-Instruct", + "Qwen/Qwen2.5-7B-Instruct", + "Qwen/Qwen2.5-Coder-32B-Instruct", + "Qwen/Qwen2.5-Coder-7B-Instruct", + "Qwen/Qwen2-7B-Instruct", + "Qwen/Qwen2-1.5B-Instruct", + "Qwen/QwQ-32B-Preview", + "Qwen/Qwen2-VL-72B-Instruct", + "Qwen/Qwen2.5-VL-32B-Instruct", + "Qwen/Qwen2.5-VL-72B-Instruct", + "TeleAI/TeleChat2", + "THUDM/glm-4-9b-chat", + "Vendor-A/Qwen/Qwen2.5-72B-Instruct", + "internlm/internlm2_5-7b-chat", + "internlm/internlm2_5-20b-chat", + "Pro/Qwen/Qwen2.5-7B-Instruct", + "Pro/Qwen/Qwen2-7B-Instruct", + "Pro/Qwen/Qwen2-1.5B-Instruct", + "Pro/THUDM/chatglm3-6b", + "Pro/THUDM/glm-4-9b-chat", + ], + "ibm": ["ibm/granite-vision-3.1-2b-preview", "meta-llama/llama-4-maverick-17b-128e-instruct-fp8", + "meta-llama/llama-3-2-90b-vision-instruct"], + "modelscope":[ + "Qwen/Qwen2.5-Coder-32B-Instruct", + "Qwen/Qwen2.5-Coder-14B-Instruct", + "Qwen/Qwen2.5-Coder-7B-Instruct", + "Qwen/Qwen2.5-72B-Instruct", + "Qwen/Qwen2.5-32B-Instruct", + "Qwen/Qwen2.5-14B-Instruct", + "Qwen/Qwen2.5-7B-Instruct", + "Qwen/QwQ-32B-Preview", + "Qwen/Qwen2.5-VL-3B-Instruct", + "Qwen/Qwen2.5-VL-7B-Instruct", + "Qwen/Qwen2.5-VL-32B-Instruct", + "Qwen/Qwen2.5-VL-72B-Instruct", + "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", + "deepseek-ai/DeepSeek-R1-Distill-Qwen-14B", + "deepseek-ai/DeepSeek-R1-Distill-Qwen-7B", + "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B", + "deepseek-ai/DeepSeek-R1", + "deepseek-ai/DeepSeek-V3", + "Qwen/Qwen3-1.7B", + "Qwen/Qwen3-4B", + "Qwen/Qwen3-8B", + "Qwen/Qwen3-14B", + "Qwen/Qwen3-30B-A3B", + "Qwen/Qwen3-32B", + "Qwen/Qwen3-235B-A22B", + ], +} diff --git a/src/utils/llm_provider.py b/src/utils/llm_provider.py new file mode 100644 index 0000000..2ef3d63 --- /dev/null +++ b/src/utils/llm_provider.py @@ -0,0 +1,355 @@ +from openai import OpenAI +import pdb +from langchain_openai import ChatOpenAI +from langchain_core.globals import get_llm_cache +from langchain_core.language_models.base import ( + BaseLanguageModel, + LangSmithParams, + LanguageModelInput, +) +import os +from langchain_core.load import dumpd, dumps +from langchain_core.messages import ( + AIMessage, + SystemMessage, + AnyMessage, + BaseMessage, + BaseMessageChunk, + HumanMessage, + convert_to_messages, + message_chunk_to_message, +) +from langchain_core.outputs import ( + ChatGeneration, + ChatGenerationChunk, + ChatResult, + LLMResult, + RunInfo, +) +from langchain_ollama import ChatOllama +from langchain_core.output_parsers.base import OutputParserLike +from langchain_core.runnables import Runnable, RunnableConfig +from langchain_core.tools import BaseTool + +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Literal, + Optional, + Union, + cast, List, +) +from langchain_anthropic import ChatAnthropic +from langchain_mistralai import ChatMistralAI +from langchain_google_genai import ChatGoogleGenerativeAI +from langchain_ollama import ChatOllama +from langchain_openai import AzureChatOpenAI, ChatOpenAI +from langchain_ibm import ChatWatsonx +from langchain_aws import ChatBedrock +from pydantic import SecretStr + +from src.utils import config + + +class DeepSeekR1ChatOpenAI(ChatOpenAI): + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self.client = OpenAI( + base_url=kwargs.get("base_url"), + api_key=kwargs.get("api_key") + ) + + async def ainvoke( + self, + input: LanguageModelInput, + config: Optional[RunnableConfig] = None, + *, + stop: Optional[list[str]] = None, + **kwargs: Any, + ) -> AIMessage: + message_history = [] + for input_ in input: + if isinstance(input_, SystemMessage): + message_history.append({"role": "system", "content": input_.content}) + elif isinstance(input_, AIMessage): + message_history.append({"role": "assistant", "content": input_.content}) + else: + message_history.append({"role": "user", "content": input_.content}) + + response = self.client.chat.completions.create( + model=self.model_name, + messages=message_history + ) + + reasoning_content = response.choices[0].message.reasoning_content + content = response.choices[0].message.content + return AIMessage(content=content, reasoning_content=reasoning_content) + + def invoke( + self, + input: LanguageModelInput, + config: Optional[RunnableConfig] = None, + *, + stop: Optional[list[str]] = None, + **kwargs: Any, + ) -> AIMessage: + message_history = [] + for input_ in input: + if isinstance(input_, SystemMessage): + message_history.append({"role": "system", "content": input_.content}) + elif isinstance(input_, AIMessage): + message_history.append({"role": "assistant", "content": input_.content}) + else: + message_history.append({"role": "user", "content": input_.content}) + + response = self.client.chat.completions.create( + model=self.model_name, + messages=message_history + ) + + reasoning_content = response.choices[0].message.reasoning_content + content = response.choices[0].message.content + return AIMessage(content=content, reasoning_content=reasoning_content) + + +class DeepSeekR1ChatOllama(ChatOllama): + + async def ainvoke( + self, + input: LanguageModelInput, + config: Optional[RunnableConfig] = None, + *, + stop: Optional[list[str]] = None, + **kwargs: Any, + ) -> AIMessage: + org_ai_message = await super().ainvoke(input=input) + org_content = org_ai_message.content + reasoning_content = org_content.split("")[0].replace("", "") + content = org_content.split("")[1] + if "**JSON Response:**" in content: + content = content.split("**JSON Response:**")[-1] + return AIMessage(content=content, reasoning_content=reasoning_content) + + def invoke( + self, + input: LanguageModelInput, + config: Optional[RunnableConfig] = None, + *, + stop: Optional[list[str]] = None, + **kwargs: Any, + ) -> AIMessage: + org_ai_message = super().invoke(input=input) + org_content = org_ai_message.content + reasoning_content = org_content.split("")[0].replace("", "") + content = org_content.split("")[1] + if "**JSON Response:**" in content: + content = content.split("**JSON Response:**")[-1] + return AIMessage(content=content, reasoning_content=reasoning_content) + + +def get_llm_model(provider: str, **kwargs): + """ + Get LLM model + :param provider: LLM provider + :param kwargs: + :return: + """ + if provider not in ["ollama", "bedrock"]: + env_var = f"{provider.upper()}_API_KEY" + api_key = kwargs.get("api_key", "") or os.getenv(env_var, "") + if not api_key: + provider_display = config.PROVIDER_DISPLAY_NAMES.get(provider, provider.upper()) + error_msg = f"💥 {provider_display} API key not found! 🔑 Please set the `{env_var}` environment variable or provide it in the UI." + raise ValueError(error_msg) + kwargs["api_key"] = api_key + + if provider == "anthropic": + if not kwargs.get("base_url", ""): + base_url = "https://api.anthropic.com" + else: + base_url = kwargs.get("base_url") + + return ChatAnthropic( + model=kwargs.get("model_name", "claude-3-5-sonnet-20241022"), + temperature=kwargs.get("temperature", 0.0), + base_url=base_url, + api_key=api_key, + ) + elif provider == 'mistral': + if not kwargs.get("base_url", ""): + base_url = os.getenv("MISTRAL_ENDPOINT", "https://api.mistral.ai/v1") + else: + base_url = kwargs.get("base_url") + if not kwargs.get("api_key", ""): + api_key = os.getenv("MISTRAL_API_KEY", "") + else: + api_key = kwargs.get("api_key") + + return ChatMistralAI( + model=kwargs.get("model_name", "mistral-large-latest"), + temperature=kwargs.get("temperature", 0.0), + base_url=base_url, + api_key=api_key, + ) + elif provider == "openai": + if not kwargs.get("base_url", ""): + base_url = os.getenv("OPENAI_ENDPOINT", "https://api.openai.com/v1") + else: + base_url = kwargs.get("base_url") + + return ChatOpenAI( + model=kwargs.get("model_name", "gpt-4o"), + temperature=kwargs.get("temperature", 0.0), + base_url=base_url, + api_key=api_key, + ) + elif provider == "grok": + if not kwargs.get("base_url", ""): + base_url = os.getenv("GROK_ENDPOINT", "https://api.x.ai/v1") + else: + base_url = kwargs.get("base_url") + + return ChatOpenAI( + model=kwargs.get("model_name", "grok-3"), + temperature=kwargs.get("temperature", 0.0), + base_url=base_url, + api_key=api_key, + ) + elif provider == "deepseek": + if not kwargs.get("base_url", ""): + base_url = os.getenv("DEEPSEEK_ENDPOINT", "") + else: + base_url = kwargs.get("base_url") + + if kwargs.get("model_name", "deepseek-chat") == "deepseek-reasoner": + return DeepSeekR1ChatOpenAI( + model=kwargs.get("model_name", "deepseek-reasoner"), + temperature=kwargs.get("temperature", 0.0), + base_url=base_url, + api_key=api_key, + ) + else: + return ChatOpenAI( + model=kwargs.get("model_name", "deepseek-chat"), + temperature=kwargs.get("temperature", 0.0), + base_url=base_url, + api_key=api_key, + ) + elif provider == "google": + return ChatGoogleGenerativeAI( + model=kwargs.get("model_name", "gemini-2.0-flash-exp"), + temperature=kwargs.get("temperature", 0.0), + api_key=api_key, + ) + elif provider == "ollama": + if not kwargs.get("base_url", ""): + base_url = os.getenv("OLLAMA_ENDPOINT", "http://localhost:11434") + else: + base_url = kwargs.get("base_url") + + if "deepseek-r1" in kwargs.get("model_name", "qwen2.5:7b"): + return DeepSeekR1ChatOllama( + model=kwargs.get("model_name", "deepseek-r1:14b"), + temperature=kwargs.get("temperature", 0.0), + num_ctx=kwargs.get("num_ctx", 32000), + base_url=base_url, + ) + else: + return ChatOllama( + model=kwargs.get("model_name", "qwen2.5:7b"), + temperature=kwargs.get("temperature", 0.0), + num_ctx=kwargs.get("num_ctx", 32000), + num_predict=kwargs.get("num_predict", 1024), + base_url=base_url, + ) + elif provider == "azure_openai": + if not kwargs.get("base_url", ""): + base_url = os.getenv("AZURE_OPENAI_ENDPOINT", "") + else: + base_url = kwargs.get("base_url") + api_version = kwargs.get("api_version", "") or os.getenv("AZURE_OPENAI_API_VERSION", "2025-01-01-preview") + return AzureChatOpenAI( + model=kwargs.get("model_name", "gpt-4o"), + temperature=kwargs.get("temperature", 0.0), + api_version=api_version, + azure_endpoint=base_url, + api_key=api_key, + ) + elif provider == "alibaba": + if not kwargs.get("base_url", ""): + base_url = os.getenv("ALIBABA_ENDPOINT", "https://dashscope.aliyuncs.com/compatible-mode/v1") + else: + base_url = kwargs.get("base_url") + + return ChatOpenAI( + model=kwargs.get("model_name", "qwen-plus"), + temperature=kwargs.get("temperature", 0.0), + base_url=base_url, + api_key=api_key, + ) + elif provider == "ibm": + parameters = { + "temperature": kwargs.get("temperature", 0.0), + "max_tokens": kwargs.get("num_ctx", 32000) + } + if not kwargs.get("base_url", ""): + base_url = os.getenv("IBM_ENDPOINT", "https://us-south.ml.cloud.ibm.com") + else: + base_url = kwargs.get("base_url") + + return ChatWatsonx( + model_id=kwargs.get("model_name", "ibm/granite-vision-3.1-2b-preview"), + url=base_url, + project_id=os.getenv("IBM_PROJECT_ID"), + apikey=os.getenv("IBM_API_KEY"), + params=parameters + ) + elif provider == "moonshot": + return ChatOpenAI( + model=kwargs.get("model_name", "moonshot-v1-32k-vision-preview"), + temperature=kwargs.get("temperature", 0.0), + base_url=os.getenv("MOONSHOT_ENDPOINT"), + api_key=os.getenv("MOONSHOT_API_KEY"), + ) + elif provider == "unbound": + return ChatOpenAI( + model=kwargs.get("model_name", "gpt-4o-mini"), + temperature=kwargs.get("temperature", 0.0), + base_url=os.getenv("UNBOUND_ENDPOINT", "https://api.getunbound.ai"), + api_key=api_key, + ) + elif provider == "siliconflow": + if not kwargs.get("api_key", ""): + api_key = os.getenv("SiliconFLOW_API_KEY", "") + else: + api_key = kwargs.get("api_key") + if not kwargs.get("base_url", ""): + base_url = os.getenv("SiliconFLOW_ENDPOINT", "") + else: + base_url = kwargs.get("base_url") + return ChatOpenAI( + api_key=api_key, + base_url=base_url, + model_name=kwargs.get("model_name", "Qwen/QwQ-32B"), + temperature=kwargs.get("temperature", 0.0), + ) + elif provider == "modelscope": + if not kwargs.get("api_key", ""): + api_key = os.getenv("MODELSCOPE_API_KEY", "") + else: + api_key = kwargs.get("api_key") + if not kwargs.get("base_url", ""): + base_url = os.getenv("MODELSCOPE_ENDPOINT", "") + else: + base_url = kwargs.get("base_url") + return ChatOpenAI( + api_key=api_key, + base_url=base_url, + model_name=kwargs.get("model_name", "Qwen/QwQ-32B"), + temperature=kwargs.get("temperature", 0.0), + extra_body = {"enable_thinking": False} + ) + else: + raise ValueError(f"Unsupported provider: {provider}") diff --git a/src/utils/mcp_client.py b/src/utils/mcp_client.py new file mode 100644 index 0000000..126d49d --- /dev/null +++ b/src/utils/mcp_client.py @@ -0,0 +1,254 @@ +import inspect +import logging +import uuid +from datetime import date, datetime, time +from enum import Enum +from typing import Any, Dict, List, Optional, Set, Type, Union, get_type_hints + +from browser_use.controller.registry.views import ActionModel +from langchain.tools import BaseTool +from langchain_mcp_adapters.client import MultiServerMCPClient +from pydantic import BaseModel, Field, create_model +from pydantic.v1 import BaseModel, Field + +logger = logging.getLogger(__name__) + + +async def setup_mcp_client_and_tools(mcp_server_config: Dict[str, Any]) -> Optional[MultiServerMCPClient]: + """ + Initializes the MultiServerMCPClient, connects to servers, fetches tools, + filters them, and returns a flat list of usable tools and the client instance. + + Returns: + A tuple containing: + - list[BaseTool]: The filtered list of usable LangChain tools. + - MultiServerMCPClient | None: The initialized and started client instance, or None on failure. + """ + + logger.info("Initializing MultiServerMCPClient...") + + if not mcp_server_config: + logger.error("No MCP server configuration provided.") + return None + + try: + if "mcpServers" in mcp_server_config: + mcp_server_config = mcp_server_config["mcpServers"] + client = MultiServerMCPClient(mcp_server_config) + await client.__aenter__() + return client + + except Exception as e: + logger.error(f"Failed to setup MCP client or fetch tools: {e}", exc_info=True) + return None + + +def create_tool_param_model(tool: BaseTool) -> Type[BaseModel]: + """Creates a Pydantic model from a LangChain tool's schema""" + + # Get tool schema information + json_schema = tool.args_schema + tool_name = tool.name + + # If the tool already has a schema defined, convert it to a new param_model + if json_schema is not None: + + # Create new parameter model + params = {} + + # Process properties if they exist + if 'properties' in json_schema: + # Find required fields + required_fields: Set[str] = set(json_schema.get('required', [])) + + for prop_name, prop_details in json_schema['properties'].items(): + field_type = resolve_type(prop_details, f"{tool_name}_{prop_name}") + + # Check if parameter is required + is_required = prop_name in required_fields + + # Get default value and description + default_value = prop_details.get('default', ... if is_required else None) + description = prop_details.get('description', '') + + # Add field constraints + field_kwargs = {'default': default_value} + if description: + field_kwargs['description'] = description + + # Add additional constraints if present + if 'minimum' in prop_details: + field_kwargs['ge'] = prop_details['minimum'] + if 'maximum' in prop_details: + field_kwargs['le'] = prop_details['maximum'] + if 'minLength' in prop_details: + field_kwargs['min_length'] = prop_details['minLength'] + if 'maxLength' in prop_details: + field_kwargs['max_length'] = prop_details['maxLength'] + if 'pattern' in prop_details: + field_kwargs['pattern'] = prop_details['pattern'] + + # Add to parameters dictionary + params[prop_name] = (field_type, Field(**field_kwargs)) + + return create_model( + f'{tool_name}_parameters', + __base__=ActionModel, + **params, # type: ignore + ) + + # If no schema is defined, extract parameters from the _run method + run_method = tool._run + sig = inspect.signature(run_method) + + # Get type hints for better type information + try: + type_hints = get_type_hints(run_method) + except Exception: + type_hints = {} + + params = {} + for name, param in sig.parameters.items(): + # Skip 'self' parameter and any other parameters you want to exclude + if name == 'self': + continue + + # Get annotation from type hints if available, otherwise from signature + annotation = type_hints.get(name, param.annotation) + if annotation == inspect.Parameter.empty: + annotation = Any + + # Use default value if available, otherwise make it required + if param.default != param.empty: + params[name] = (annotation, param.default) + else: + params[name] = (annotation, ...) + + return create_model( + f'{tool_name}_parameters', + __base__=ActionModel, + **params, # type: ignore + ) + + +def resolve_type(prop_details: Dict[str, Any], prefix: str = "") -> Any: + """Recursively resolves JSON schema type to Python/Pydantic type""" + + # Handle reference types + if '$ref' in prop_details: + # In a real application, reference resolution would be needed + return Any + + # Basic type mapping + type_mapping = { + 'string': str, + 'integer': int, + 'number': float, + 'boolean': bool, + 'array': List, + 'object': Dict, + 'null': type(None), + } + + # Handle formatted strings + if prop_details.get('type') == 'string' and 'format' in prop_details: + format_mapping = { + 'date-time': datetime, + 'date': date, + 'time': time, + 'email': str, + 'uri': str, + 'url': str, + 'uuid': uuid.UUID, + 'binary': bytes, + } + return format_mapping.get(prop_details['format'], str) + + # Handle enum types + if 'enum' in prop_details: + enum_values = prop_details['enum'] + # Create dynamic enum class with safe names + enum_dict = {} + for i, v in enumerate(enum_values): + # Ensure enum names are valid Python identifiers + if isinstance(v, str): + key = v.upper().replace(' ', '_').replace('-', '_') + if not key.isidentifier(): + key = f"VALUE_{i}" + else: + key = f"VALUE_{i}" + enum_dict[key] = v + + # Only create enum if we have values + if enum_dict: + return Enum(f"{prefix}_Enum", enum_dict) + return str # Fallback + + # Handle array types + if prop_details.get('type') == 'array' and 'items' in prop_details: + item_type = resolve_type(prop_details['items'], f"{prefix}_item") + return List[item_type] # type: ignore + + # Handle object types with properties + if prop_details.get('type') == 'object' and 'properties' in prop_details: + nested_params = {} + for nested_name, nested_details in prop_details['properties'].items(): + nested_type = resolve_type(nested_details, f"{prefix}_{nested_name}") + # Get required field info + required_fields = prop_details.get('required', []) + is_required = nested_name in required_fields + default_value = nested_details.get('default', ... if is_required else None) + description = nested_details.get('description', '') + + field_kwargs = {'default': default_value} + if description: + field_kwargs['description'] = description + + nested_params[nested_name] = (nested_type, Field(**field_kwargs)) + + # Create nested model + nested_model = create_model(f"{prefix}_Model", **nested_params) + return nested_model + + # Handle union types (oneOf, anyOf) + if 'oneOf' in prop_details or 'anyOf' in prop_details: + union_schema = prop_details.get('oneOf') or prop_details.get('anyOf') + union_types = [] + for i, t in enumerate(union_schema): + union_types.append(resolve_type(t, f"{prefix}_{i}")) + + if union_types: + return Union.__getitem__(tuple(union_types)) # type: ignore + return Any + + # Handle allOf (intersection types) + if 'allOf' in prop_details: + nested_params = {} + for i, schema_part in enumerate(prop_details['allOf']): + if 'properties' in schema_part: + for nested_name, nested_details in schema_part['properties'].items(): + nested_type = resolve_type(nested_details, f"{prefix}_allOf_{i}_{nested_name}") + # Check if required + required_fields = schema_part.get('required', []) + is_required = nested_name in required_fields + nested_params[nested_name] = (nested_type, ... if is_required else None) + + # Create composite model + if nested_params: + composite_model = create_model(f"{prefix}_CompositeModel", **nested_params) + return composite_model + return Dict + + # Default to basic types + schema_type = prop_details.get('type', 'string') + if isinstance(schema_type, list): + # Handle multiple types (e.g., ["string", "null"]) + non_null_types = [t for t in schema_type if t != 'null'] + if non_null_types: + primary_type = type_mapping.get(non_null_types[0], Any) + if 'null' in schema_type: + return Optional[primary_type] # type: ignore + return primary_type + return Any + + return type_mapping.get(schema_type, Any) diff --git a/src/utils/utils.py b/src/utils/utils.py new file mode 100644 index 0000000..f0f0b76 --- /dev/null +++ b/src/utils/utils.py @@ -0,0 +1,39 @@ +import base64 +import os +import time +from pathlib import Path +from typing import Dict, Optional +import requests +import json +import gradio as gr +import uuid + + +def encode_image(img_path): + if not img_path: + return None + with open(img_path, "rb") as fin: + image_data = base64.b64encode(fin.read()).decode("utf-8") + return image_data + + +def get_latest_files(directory: str, file_types: list = ['.webm', '.zip']) -> Dict[str, Optional[str]]: + """Get the latest recording and trace files""" + latest_files: Dict[str, Optional[str]] = {ext: None for ext in file_types} + + if not os.path.exists(directory): + os.makedirs(directory, exist_ok=True) + return latest_files + + for file_type in file_types: + try: + matches = list(Path(directory).rglob(f"*{file_type}")) + if matches: + latest = max(matches, key=lambda p: p.stat().st_mtime) + # Only return files that are complete (not being written) + if time.time() - latest.stat().st_mtime > 1.0: + latest_files[file_type] = str(latest) + except Exception as e: + print(f"Error getting latest {file_type} file: {e}") + + return latest_files diff --git a/src/webui/__init__.py b/src/webui/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/webui/components/__init__.py b/src/webui/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/webui/components/agent_settings_tab.py b/src/webui/components/agent_settings_tab.py new file mode 100644 index 0000000..a93eb76 --- /dev/null +++ b/src/webui/components/agent_settings_tab.py @@ -0,0 +1,269 @@ +import json +import os + +import gradio as gr +from gradio.components import Component +from typing import Any, Dict, Optional +from src.webui.webui_manager import WebuiManager +from src.utils import config +import logging +from functools import partial + +logger = logging.getLogger(__name__) + + +def update_model_dropdown(llm_provider): + """ + Update the model name dropdown with predefined models for the selected provider. + """ + # Use predefined models for the selected provider + if llm_provider in config.model_names: + return gr.Dropdown(choices=config.model_names[llm_provider], value=config.model_names[llm_provider][0], + interactive=True) + else: + return gr.Dropdown(choices=[], value="", interactive=True, allow_custom_value=True) + + +async def update_mcp_server(mcp_file: str, webui_manager: WebuiManager): + """ + Update the MCP server. + """ + if hasattr(webui_manager, "bu_controller") and webui_manager.bu_controller: + logger.warning("⚠️ Close controller because mcp file has changed!") + await webui_manager.bu_controller.close_mcp_client() + webui_manager.bu_controller = None + + if not mcp_file or not os.path.exists(mcp_file) or not mcp_file.endswith('.json'): + logger.warning(f"{mcp_file} is not a valid MCP file.") + return None, gr.update(visible=False) + + with open(mcp_file, 'r') as f: + mcp_server = json.load(f) + + return json.dumps(mcp_server, indent=2), gr.update(visible=True) + + +def create_agent_settings_tab(webui_manager: WebuiManager): + """ + Creates an agent settings tab. + """ + input_components = set(webui_manager.get_components()) + tab_components = {} + + with gr.Group(): + with gr.Column(): + override_system_prompt = gr.Textbox(label="Override system prompt", lines=4, interactive=True) + extend_system_prompt = gr.Textbox(label="Extend system prompt", lines=4, interactive=True) + + with gr.Group(): + mcp_json_file = gr.File(label="MCP server json", interactive=True, file_types=[".json"]) + mcp_server_config = gr.Textbox(label="MCP server", lines=6, interactive=True, visible=False) + + with gr.Group(): + with gr.Row(): + llm_provider = gr.Dropdown( + choices=[provider for provider, model in config.model_names.items()], + label="LLM Provider", + value=os.getenv("DEFAULT_LLM", "openai"), + info="Select LLM provider for LLM", + interactive=True + ) + llm_model_name = gr.Dropdown( + label="LLM Model Name", + choices=config.model_names[os.getenv("DEFAULT_LLM", "openai")], + value=config.model_names[os.getenv("DEFAULT_LLM", "openai")][0], + interactive=True, + allow_custom_value=True, + info="Select a model in the dropdown options or directly type a custom model name" + ) + with gr.Row(): + llm_temperature = gr.Slider( + minimum=0.0, + maximum=2.0, + value=0.6, + step=0.1, + label="LLM Temperature", + info="Controls randomness in model outputs", + interactive=True + ) + + use_vision = gr.Checkbox( + label="Use Vision", + value=True, + info="Enable Vision(Input highlighted screenshot into LLM)", + interactive=True + ) + + ollama_num_ctx = gr.Slider( + minimum=2 ** 8, + maximum=2 ** 16, + value=16000, + step=1, + label="Ollama Context Length", + info="Controls max context length model needs to handle (less = faster)", + visible=False, + interactive=True + ) + + with gr.Row(): + llm_base_url = gr.Textbox( + label="Base URL", + value="", + info="API endpoint URL (if required)" + ) + llm_api_key = gr.Textbox( + label="API Key", + type="password", + value="", + info="Your API key (leave blank to use .env)" + ) + + with gr.Group(): + with gr.Row(): + planner_llm_provider = gr.Dropdown( + choices=[provider for provider, model in config.model_names.items()], + label="Planner LLM Provider", + info="Select LLM provider for LLM", + value=None, + interactive=True + ) + planner_llm_model_name = gr.Dropdown( + label="Planner LLM Model Name", + interactive=True, + allow_custom_value=True, + info="Select a model in the dropdown options or directly type a custom model name" + ) + with gr.Row(): + planner_llm_temperature = gr.Slider( + minimum=0.0, + maximum=2.0, + value=0.6, + step=0.1, + label="Planner LLM Temperature", + info="Controls randomness in model outputs", + interactive=True + ) + + planner_use_vision = gr.Checkbox( + label="Use Vision(Planner LLM)", + value=False, + info="Enable Vision(Input highlighted screenshot into LLM)", + interactive=True + ) + + planner_ollama_num_ctx = gr.Slider( + minimum=2 ** 8, + maximum=2 ** 16, + value=16000, + step=1, + label="Ollama Context Length", + info="Controls max context length model needs to handle (less = faster)", + visible=False, + interactive=True + ) + + with gr.Row(): + planner_llm_base_url = gr.Textbox( + label="Base URL", + value="", + info="API endpoint URL (if required)" + ) + planner_llm_api_key = gr.Textbox( + label="API Key", + type="password", + value="", + info="Your API key (leave blank to use .env)" + ) + + with gr.Row(): + max_steps = gr.Slider( + minimum=1, + maximum=1000, + value=100, + step=1, + label="Max Run Steps", + info="Maximum number of steps the agent will take", + interactive=True + ) + max_actions = gr.Slider( + minimum=1, + maximum=100, + value=10, + step=1, + label="Max Number of Actions", + info="Maximum number of actions the agent will take per step", + interactive=True + ) + + with gr.Row(): + max_input_tokens = gr.Number( + label="Max Input Tokens", + value=128000, + precision=0, + interactive=True + ) + tool_calling_method = gr.Dropdown( + label="Tool Calling Method", + value="auto", + interactive=True, + allow_custom_value=True, + choices=['function_calling', 'json_mode', 'raw', 'auto', 'tools', "None"], + visible=True + ) + tab_components.update(dict( + override_system_prompt=override_system_prompt, + extend_system_prompt=extend_system_prompt, + llm_provider=llm_provider, + llm_model_name=llm_model_name, + llm_temperature=llm_temperature, + use_vision=use_vision, + ollama_num_ctx=ollama_num_ctx, + llm_base_url=llm_base_url, + llm_api_key=llm_api_key, + planner_llm_provider=planner_llm_provider, + planner_llm_model_name=planner_llm_model_name, + planner_llm_temperature=planner_llm_temperature, + planner_use_vision=planner_use_vision, + planner_ollama_num_ctx=planner_ollama_num_ctx, + planner_llm_base_url=planner_llm_base_url, + planner_llm_api_key=planner_llm_api_key, + max_steps=max_steps, + max_actions=max_actions, + max_input_tokens=max_input_tokens, + tool_calling_method=tool_calling_method, + mcp_json_file=mcp_json_file, + mcp_server_config=mcp_server_config, + )) + webui_manager.add_components("agent_settings", tab_components) + + llm_provider.change( + fn=lambda x: gr.update(visible=x == "ollama"), + inputs=llm_provider, + outputs=ollama_num_ctx + ) + llm_provider.change( + lambda provider: update_model_dropdown(provider), + inputs=[llm_provider], + outputs=[llm_model_name] + ) + planner_llm_provider.change( + fn=lambda x: gr.update(visible=x == "ollama"), + inputs=[planner_llm_provider], + outputs=[planner_ollama_num_ctx] + ) + planner_llm_provider.change( + lambda provider: update_model_dropdown(provider), + inputs=[planner_llm_provider], + outputs=[planner_llm_model_name] + ) + + async def update_wrapper(mcp_file): + """Wrapper for handle_pause_resume.""" + update_dict = await update_mcp_server(mcp_file, webui_manager) + yield update_dict + + mcp_json_file.change( + update_wrapper, + inputs=[mcp_json_file], + outputs=[mcp_server_config, mcp_server_config] + ) diff --git a/src/webui/components/browser_settings_tab.py b/src/webui/components/browser_settings_tab.py new file mode 100644 index 0000000..77fbfb5 --- /dev/null +++ b/src/webui/components/browser_settings_tab.py @@ -0,0 +1,161 @@ +import os +from distutils.util import strtobool +import gradio as gr +import logging +from gradio.components import Component + +from src.webui.webui_manager import WebuiManager +from src.utils import config + +logger = logging.getLogger(__name__) + +async def close_browser(webui_manager: WebuiManager): + """ + Close browser + """ + if webui_manager.bu_current_task and not webui_manager.bu_current_task.done(): + webui_manager.bu_current_task.cancel() + webui_manager.bu_current_task = None + + if webui_manager.bu_browser_context: + logger.info("⚠️ Closing browser context when changing browser config.") + await webui_manager.bu_browser_context.close() + webui_manager.bu_browser_context = None + + if webui_manager.bu_browser: + logger.info("⚠️ Closing browser when changing browser config.") + await webui_manager.bu_browser.close() + webui_manager.bu_browser = None + +def create_browser_settings_tab(webui_manager: WebuiManager): + """ + Creates a browser settings tab. + """ + input_components = set(webui_manager.get_components()) + tab_components = {} + + with gr.Group(): + with gr.Row(): + browser_binary_path = gr.Textbox( + label="Browser Binary Path", + lines=1, + interactive=True, + placeholder="e.g. '/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome'" + ) + browser_user_data_dir = gr.Textbox( + label="Browser User Data Dir", + lines=1, + interactive=True, + placeholder="Leave it empty if you use your default user data", + ) + with gr.Group(): + with gr.Row(): + use_own_browser = gr.Checkbox( + label="Use Own Browser", + value=bool(strtobool(os.getenv("USE_OWN_BROWSER", "false"))), + info="Use your existing browser instance", + interactive=True + ) + keep_browser_open = gr.Checkbox( + label="Keep Browser Open", + value=bool(strtobool(os.getenv("KEEP_BROWSER_OPEN", "true"))), + info="Keep Browser Open between Tasks", + interactive=True + ) + headless = gr.Checkbox( + label="Headless Mode", + value=False, + info="Run browser without GUI", + interactive=True + ) + disable_security = gr.Checkbox( + label="Disable Security", + value=False, + info="Disable browser security", + interactive=True + ) + + with gr.Group(): + with gr.Row(): + window_w = gr.Number( + label="Window Width", + value=1280, + info="Browser window width", + interactive=True + ) + window_h = gr.Number( + label="Window Height", + value=1100, + info="Browser window height", + interactive=True + ) + with gr.Group(): + with gr.Row(): + cdp_url = gr.Textbox( + label="CDP URL", + value=os.getenv("BROWSER_CDP", None), + info="CDP URL for browser remote debugging", + interactive=True, + ) + wss_url = gr.Textbox( + label="WSS URL", + info="WSS URL for browser remote debugging", + interactive=True, + ) + with gr.Group(): + with gr.Row(): + save_recording_path = gr.Textbox( + label="Recording Path", + placeholder="e.g. ./tmp/record_videos", + info="Path to save browser recordings", + interactive=True, + ) + + save_trace_path = gr.Textbox( + label="Trace Path", + placeholder="e.g. ./tmp/traces", + info="Path to save Agent traces", + interactive=True, + ) + + with gr.Row(): + save_agent_history_path = gr.Textbox( + label="Agent History Save Path", + value="./tmp/agent_history", + info="Specify the directory where agent history should be saved.", + interactive=True, + ) + save_download_path = gr.Textbox( + label="Save Directory for browser downloads", + value="./tmp/downloads", + info="Specify the directory where downloaded files should be saved.", + interactive=True, + ) + tab_components.update( + dict( + browser_binary_path=browser_binary_path, + browser_user_data_dir=browser_user_data_dir, + use_own_browser=use_own_browser, + keep_browser_open=keep_browser_open, + headless=headless, + disable_security=disable_security, + save_recording_path=save_recording_path, + save_trace_path=save_trace_path, + save_agent_history_path=save_agent_history_path, + save_download_path=save_download_path, + cdp_url=cdp_url, + wss_url=wss_url, + window_h=window_h, + window_w=window_w, + ) + ) + webui_manager.add_components("browser_settings", tab_components) + + async def close_wrapper(): + """Wrapper for handle_clear.""" + await close_browser(webui_manager) + + headless.change(close_wrapper) + keep_browser_open.change(close_wrapper) + disable_security.change(close_wrapper) + use_own_browser.change(close_wrapper) diff --git a/src/webui/components/browser_use_agent_tab.py b/src/webui/components/browser_use_agent_tab.py new file mode 100644 index 0000000..b51a166 --- /dev/null +++ b/src/webui/components/browser_use_agent_tab.py @@ -0,0 +1,1080 @@ +import asyncio +import json +import logging +import os +import uuid +from typing import Any, AsyncGenerator, Dict, Optional + +import gradio as gr + +# from browser_use.agent.service import Agent +from browser_use.agent.views import ( + AgentHistoryList, + AgentOutput, +) +from browser_use.browser.browser import BrowserConfig +from browser_use.browser.context import BrowserContext, BrowserContextConfig +from browser_use.browser.views import BrowserState +from gradio.components import Component +from langchain_core.language_models.chat_models import BaseChatModel + +from src.agent.browser_use.browser_use_agent import BrowserUseAgent +from src.browser.custom_browser import CustomBrowser +from src.controller.custom_controller import CustomController +from src.utils import llm_provider +from src.webui.webui_manager import WebuiManager + +logger = logging.getLogger(__name__) + + +# --- Helper Functions --- (Defined at module level) + + +async def _initialize_llm( + provider: Optional[str], + model_name: Optional[str], + temperature: float, + base_url: Optional[str], + api_key: Optional[str], + num_ctx: Optional[int] = None, +) -> Optional[BaseChatModel]: + """Initializes the LLM based on settings. Returns None if provider/model is missing.""" + if not provider or not model_name: + logger.info("LLM Provider or Model Name not specified, LLM will be None.") + return None + try: + # Use your actual LLM provider logic here + logger.info( + f"Initializing LLM: Provider={provider}, Model={model_name}, Temp={temperature}" + ) + # Example using a placeholder function + llm = llm_provider.get_llm_model( + provider=provider, + model_name=model_name, + temperature=temperature, + base_url=base_url or None, + api_key=api_key or None, + # Add other relevant params like num_ctx for ollama + num_ctx=num_ctx if provider == "ollama" else None, + ) + return llm + except Exception as e: + logger.error(f"Failed to initialize LLM: {e}", exc_info=True) + gr.Warning( + f"Failed to initialize LLM '{model_name}' for provider '{provider}'. Please check settings. Error: {e}" + ) + return None + + +def _get_config_value( + webui_manager: WebuiManager, + comp_dict: Dict[gr.components.Component, Any], + comp_id_suffix: str, + default: Any = None, +) -> Any: + """Safely get value from component dictionary using its ID suffix relative to the tab.""" + # Assumes component ID format is "tab_name.comp_name" + tab_name = "browser_use_agent" # Hardcode or derive if needed + comp_id = f"{tab_name}.{comp_id_suffix}" + # Need to find the component object first using the ID from the manager + try: + comp = webui_manager.get_component_by_id(comp_id) + return comp_dict.get(comp, default) + except KeyError: + # Try accessing settings tabs as well + for prefix in ["agent_settings", "browser_settings"]: + try: + comp_id = f"{prefix}.{comp_id_suffix}" + comp = webui_manager.get_component_by_id(comp_id) + return comp_dict.get(comp, default) + except KeyError: + continue + logger.warning( + f"Component with suffix '{comp_id_suffix}' not found in manager for value lookup." + ) + return default + + +def _format_agent_output(model_output: AgentOutput) -> str: + """Formats AgentOutput for display in the chatbot using JSON.""" + content = "" + if model_output: + try: + # Directly use model_dump if actions and current_state are Pydantic models + action_dump = [ + action.model_dump(exclude_none=True) for action in model_output.action + ] + + state_dump = model_output.current_state.model_dump(exclude_none=True) + model_output_dump = { + "current_state": state_dump, + "action": action_dump, + } + # Dump to JSON string with indentation + json_string = json.dumps(model_output_dump, indent=4, ensure_ascii=False) + # Wrap in

 for proper display in HTML
+            content = f"
{json_string}
" + + except AttributeError as ae: + logger.error( + f"AttributeError during model dump: {ae}. Check if 'action' or 'current_state' or their items support 'model_dump'." + ) + content = f"
Error: Could not format agent output (AttributeError: {ae}).\nRaw output: {str(model_output)}
" + except Exception as e: + logger.error(f"Error formatting agent output: {e}", exc_info=True) + # Fallback to simple string representation on error + content = f"
Error formatting agent output.\nRaw output:\n{str(model_output)}
" + + return content.strip() + + +# --- Updated Callback Implementation --- + + +async def _handle_new_step( + webui_manager: WebuiManager, state: BrowserState, output: AgentOutput, step_num: int +): + """Callback for each step taken by the agent, including screenshot display.""" + + # Use the correct chat history attribute name from the user's code + if not hasattr(webui_manager, "bu_chat_history"): + logger.error( + "Attribute 'bu_chat_history' not found in webui_manager! Cannot add chat message." + ) + # Initialize it maybe? Or raise an error? For now, log and potentially skip chat update. + webui_manager.bu_chat_history = [] # Initialize if missing (consider if this is the right place) + # return # Or stop if this is critical + step_num -= 1 + logger.info(f"Step {step_num} completed.") + + # --- Screenshot Handling --- + screenshot_html = "" + # Ensure state.screenshot exists and is not empty before proceeding + # Use getattr for safer access + screenshot_data = getattr(state, "screenshot", None) + if screenshot_data: + try: + # Basic validation: check if it looks like base64 + if ( + isinstance(screenshot_data, str) and len(screenshot_data) > 100 + ): # Arbitrary length check + # *** UPDATED STYLE: Removed centering, adjusted width *** + img_tag = f'Step {step_num} Screenshot' + screenshot_html = ( + img_tag + "
" + ) # Use
for line break after inline-block image + else: + logger.warning( + f"Screenshot for step {step_num} seems invalid (type: {type(screenshot_data)}, len: {len(screenshot_data) if isinstance(screenshot_data, str) else 'N/A'})." + ) + screenshot_html = "**[Invalid screenshot data]**
" + + except Exception as e: + logger.error( + f"Error processing or formatting screenshot for step {step_num}: {e}", + exc_info=True, + ) + screenshot_html = "**[Error displaying screenshot]**
" + else: + logger.debug(f"No screenshot available for step {step_num}.") + + # --- Format Agent Output --- + formatted_output = _format_agent_output(output) # Use the updated function + + # --- Combine and Append to Chat --- + step_header = f"--- **Step {step_num}** ---" + # Combine header, image (with line break), and JSON block + final_content = step_header + "
" + screenshot_html + formatted_output + + chat_message = { + "role": "assistant", + "content": final_content.strip(), # Remove leading/trailing whitespace + } + + # Append to the correct chat history list + webui_manager.bu_chat_history.append(chat_message) + + await asyncio.sleep(0.05) + + +def _handle_done(webui_manager: WebuiManager, history: AgentHistoryList): + """Callback when the agent finishes the task (success or failure).""" + logger.info( + f"Agent task finished. Duration: {history.total_duration_seconds():.2f}s, Tokens: {history.total_input_tokens()}" + ) + final_summary = "**Task Completed**\n" + final_summary += f"- Duration: {history.total_duration_seconds():.2f} seconds\n" + final_summary += f"- Total Input Tokens: {history.total_input_tokens()}\n" # Or total tokens if available + + final_result = history.final_result() + if final_result: + final_summary += f"- Final Result: {final_result}\n" + + errors = history.errors() + if errors and any(errors): + final_summary += f"- **Errors:**\n```\n{errors}\n```\n" + else: + final_summary += "- Status: Success\n" + + webui_manager.bu_chat_history.append( + {"role": "assistant", "content": final_summary} + ) + + +async def _ask_assistant_callback( + webui_manager: WebuiManager, query: str, browser_context: BrowserContext +) -> Dict[str, Any]: + """Callback triggered by the agent's ask_for_assistant action.""" + logger.info("Agent requires assistance. Waiting for user input.") + + if not hasattr(webui_manager, "_chat_history"): + logger.error("Chat history not found in webui_manager during ask_assistant!") + return {"response": "Internal Error: Cannot display help request."} + + webui_manager.bu_chat_history.append( + { + "role": "assistant", + "content": f"**Need Help:** {query}\nPlease provide information or perform the required action in the browser, then type your response/confirmation below and click 'Submit Response'.", + } + ) + + # Use state stored in webui_manager + webui_manager.bu_response_event = asyncio.Event() + webui_manager.bu_user_help_response = None # Reset previous response + + try: + logger.info("Waiting for user response event...") + await asyncio.wait_for( + webui_manager.bu_response_event.wait(), timeout=3600.0 + ) # Long timeout + logger.info("User response event received.") + except asyncio.TimeoutError: + logger.warning("Timeout waiting for user assistance.") + webui_manager.bu_chat_history.append( + { + "role": "assistant", + "content": "**Timeout:** No response received. Trying to proceed.", + } + ) + webui_manager.bu_response_event = None # Clear the event + return {"response": "Timeout: User did not respond."} # Inform the agent + + response = webui_manager.bu_user_help_response + webui_manager.bu_chat_history.append( + {"role": "user", "content": response} + ) # Show user response in chat + webui_manager.bu_response_event = ( + None # Clear the event for the next potential request + ) + return {"response": response} + + +# --- Core Agent Execution Logic --- (Needs access to webui_manager) + + +async def run_agent_task( + webui_manager: WebuiManager, components: Dict[gr.components.Component, Any] +) -> AsyncGenerator[Dict[gr.components.Component, Any], None]: + """Handles the entire lifecycle of initializing and running the agent.""" + + # --- Get Components --- + # Need handles to specific UI components to update them + user_input_comp = webui_manager.get_component_by_id("browser_use_agent.user_input") + run_button_comp = webui_manager.get_component_by_id("browser_use_agent.run_button") + stop_button_comp = webui_manager.get_component_by_id( + "browser_use_agent.stop_button" + ) + pause_resume_button_comp = webui_manager.get_component_by_id( + "browser_use_agent.pause_resume_button" + ) + clear_button_comp = webui_manager.get_component_by_id( + "browser_use_agent.clear_button" + ) + chatbot_comp = webui_manager.get_component_by_id("browser_use_agent.chatbot") + history_file_comp = webui_manager.get_component_by_id( + "browser_use_agent.agent_history_file" + ) + gif_comp = webui_manager.get_component_by_id("browser_use_agent.recording_gif") + browser_view_comp = webui_manager.get_component_by_id( + "browser_use_agent.browser_view" + ) + + # --- 1. Get Task and Initial UI Update --- + task = components.get(user_input_comp, "").strip() + if not task: + gr.Warning("Please enter a task.") + yield {run_button_comp: gr.update(interactive=True)} + return + + # Set running state indirectly via _current_task + webui_manager.bu_chat_history.append({"role": "user", "content": task}) + + yield { + user_input_comp: gr.Textbox( + value="", interactive=False, placeholder="Agent is running..." + ), + run_button_comp: gr.Button(value="⏳ Running...", interactive=False), + stop_button_comp: gr.Button(interactive=True), + pause_resume_button_comp: gr.Button(value="⏸️ Pause", interactive=True), + clear_button_comp: gr.Button(interactive=False), + chatbot_comp: gr.update(value=webui_manager.bu_chat_history), + history_file_comp: gr.update(value=None), + gif_comp: gr.update(value=None), + } + + # --- Agent Settings --- + # Access settings values via components dict, getting IDs from webui_manager + def get_setting(key, default=None): + comp = webui_manager.id_to_component.get(f"agent_settings.{key}") + return components.get(comp, default) if comp else default + + override_system_prompt = get_setting("override_system_prompt") or None + extend_system_prompt = get_setting("extend_system_prompt") or None + llm_provider_name = get_setting( + "llm_provider", None + ) # Default to None if not found + llm_model_name = get_setting("llm_model_name", None) + llm_temperature = get_setting("llm_temperature", 0.6) + use_vision = get_setting("use_vision", True) + ollama_num_ctx = get_setting("ollama_num_ctx", 16000) + llm_base_url = get_setting("llm_base_url") or None + llm_api_key = get_setting("llm_api_key") or None + max_steps = get_setting("max_steps", 100) + max_actions = get_setting("max_actions", 10) + max_input_tokens = get_setting("max_input_tokens", 128000) + tool_calling_str = get_setting("tool_calling_method", "auto") + tool_calling_method = tool_calling_str if tool_calling_str != "None" else None + mcp_server_config_comp = webui_manager.id_to_component.get( + "agent_settings.mcp_server_config" + ) + mcp_server_config_str = ( + components.get(mcp_server_config_comp) if mcp_server_config_comp else None + ) + mcp_server_config = ( + json.loads(mcp_server_config_str) if mcp_server_config_str else None + ) + + # Planner LLM Settings (Optional) + planner_llm_provider_name = get_setting("planner_llm_provider") or None + planner_llm = None + planner_use_vision = False + if planner_llm_provider_name: + planner_llm_model_name = get_setting("planner_llm_model_name") + planner_llm_temperature = get_setting("planner_llm_temperature", 0.6) + planner_ollama_num_ctx = get_setting("planner_ollama_num_ctx", 16000) + planner_llm_base_url = get_setting("planner_llm_base_url") or None + planner_llm_api_key = get_setting("planner_llm_api_key") or None + planner_use_vision = get_setting("planner_use_vision", False) + + planner_llm = await _initialize_llm( + planner_llm_provider_name, + planner_llm_model_name, + planner_llm_temperature, + planner_llm_base_url, + planner_llm_api_key, + planner_ollama_num_ctx if planner_llm_provider_name == "ollama" else None, + ) + + # --- Browser Settings --- + def get_browser_setting(key, default=None): + comp = webui_manager.id_to_component.get(f"browser_settings.{key}") + return components.get(comp, default) if comp else default + + browser_binary_path = get_browser_setting("browser_binary_path") or None + browser_user_data_dir = get_browser_setting("browser_user_data_dir") or None + use_own_browser = get_browser_setting( + "use_own_browser", False + ) # Logic handled by CDP/WSS presence + keep_browser_open = get_browser_setting("keep_browser_open", False) + headless = get_browser_setting("headless", False) + disable_security = get_browser_setting("disable_security", False) + window_w = int(get_browser_setting("window_w", 1280)) + window_h = int(get_browser_setting("window_h", 1100)) + cdp_url = get_browser_setting("cdp_url") or None + wss_url = get_browser_setting("wss_url") or None + save_recording_path = get_browser_setting("save_recording_path") or None + save_trace_path = get_browser_setting("save_trace_path") or None + save_agent_history_path = get_browser_setting( + "save_agent_history_path", "./tmp/agent_history" + ) + save_download_path = get_browser_setting("save_download_path", "./tmp/downloads") + + stream_vw = 70 + stream_vh = int(70 * window_h // window_w) + + os.makedirs(save_agent_history_path, exist_ok=True) + if save_recording_path: + os.makedirs(save_recording_path, exist_ok=True) + if save_trace_path: + os.makedirs(save_trace_path, exist_ok=True) + if save_download_path: + os.makedirs(save_download_path, exist_ok=True) + + # --- 2. Initialize LLM --- + main_llm = await _initialize_llm( + llm_provider_name, + llm_model_name, + llm_temperature, + llm_base_url, + llm_api_key, + ollama_num_ctx if llm_provider_name == "ollama" else None, + ) + + # Pass the webui_manager instance to the callback when wrapping it + async def ask_callback_wrapper( + query: str, browser_context: BrowserContext + ) -> Dict[str, Any]: + return await _ask_assistant_callback(webui_manager, query, browser_context) + + if not webui_manager.bu_controller: + webui_manager.bu_controller = CustomController( + ask_assistant_callback=ask_callback_wrapper + ) + await webui_manager.bu_controller.setup_mcp_client(mcp_server_config) + + # --- 4. Initialize Browser and Context --- + should_close_browser_on_finish = not keep_browser_open + + try: + # Close existing resources if not keeping open + if not keep_browser_open: + if webui_manager.bu_browser_context: + logger.info("Closing previous browser context.") + await webui_manager.bu_browser_context.close() + webui_manager.bu_browser_context = None + if webui_manager.bu_browser: + logger.info("Closing previous browser.") + await webui_manager.bu_browser.close() + webui_manager.bu_browser = None + + # Create Browser if needed + if not webui_manager.bu_browser: + logger.info("Launching new browser instance.") + extra_args = [] + if use_own_browser: + browser_binary_path = os.getenv("BROWSER_PATH", None) or browser_binary_path + if browser_binary_path == "": + browser_binary_path = None + browser_user_data = browser_user_data_dir or os.getenv("BROWSER_USER_DATA", None) + if browser_user_data: + extra_args += [f"--user-data-dir={browser_user_data}"] + else: + browser_binary_path = None + + webui_manager.bu_browser = CustomBrowser( + config=BrowserConfig( + headless=headless, + disable_security=disable_security, + browser_binary_path=browser_binary_path, + extra_browser_args=extra_args, + wss_url=wss_url, + cdp_url=cdp_url, + new_context_config=BrowserContextConfig( + window_width=window_w, + window_height=window_h, + ) + ) + ) + + # Create Context if needed + if not webui_manager.bu_browser_context: + logger.info("Creating new browser context.") + context_config = BrowserContextConfig( + trace_path=save_trace_path if save_trace_path else None, + save_recording_path=save_recording_path + if save_recording_path + else None, + save_downloads_path=save_download_path if save_download_path else None, + window_height=window_h, + window_width=window_w, + ) + if not webui_manager.bu_browser: + raise ValueError("Browser not initialized, cannot create context.") + webui_manager.bu_browser_context = ( + await webui_manager.bu_browser.new_context(config=context_config) + ) + + # --- 5. Initialize or Update Agent --- + webui_manager.bu_agent_task_id = str(uuid.uuid4()) # New ID for this task run + os.makedirs( + os.path.join(save_agent_history_path, webui_manager.bu_agent_task_id), + exist_ok=True, + ) + history_file = os.path.join( + save_agent_history_path, + webui_manager.bu_agent_task_id, + f"{webui_manager.bu_agent_task_id}.json", + ) + gif_path = os.path.join( + save_agent_history_path, + webui_manager.bu_agent_task_id, + f"{webui_manager.bu_agent_task_id}.gif", + ) + + # Pass the webui_manager to callbacks when wrapping them + async def step_callback_wrapper( + state: BrowserState, output: AgentOutput, step_num: int + ): + await _handle_new_step(webui_manager, state, output, step_num) + + def done_callback_wrapper(history: AgentHistoryList): + _handle_done(webui_manager, history) + + if not webui_manager.bu_agent: + logger.info(f"Initializing new agent for task: {task}") + if not webui_manager.bu_browser or not webui_manager.bu_browser_context: + raise ValueError( + "Browser or Context not initialized, cannot create agent." + ) + webui_manager.bu_agent = BrowserUseAgent( + task=task, + llm=main_llm, + browser=webui_manager.bu_browser, + browser_context=webui_manager.bu_browser_context, + controller=webui_manager.bu_controller, + register_new_step_callback=step_callback_wrapper, + register_done_callback=done_callback_wrapper, + use_vision=use_vision, + override_system_message=override_system_prompt, + extend_system_message=extend_system_prompt, + max_input_tokens=max_input_tokens, + max_actions_per_step=max_actions, + tool_calling_method=tool_calling_method, + planner_llm=planner_llm, + use_vision_for_planner=planner_use_vision if planner_llm else False, + source="webui", + ) + webui_manager.bu_agent.state.agent_id = webui_manager.bu_agent_task_id + webui_manager.bu_agent.settings.generate_gif = gif_path + else: + webui_manager.bu_agent.state.agent_id = webui_manager.bu_agent_task_id + webui_manager.bu_agent.add_new_task(task) + webui_manager.bu_agent.settings.generate_gif = gif_path + webui_manager.bu_agent.browser = webui_manager.bu_browser + webui_manager.bu_agent.browser_context = webui_manager.bu_browser_context + webui_manager.bu_agent.controller = webui_manager.bu_controller + + # --- 6. Run Agent Task and Stream Updates --- + agent_run_coro = webui_manager.bu_agent.run(max_steps=max_steps) + agent_task = asyncio.create_task(agent_run_coro) + webui_manager.bu_current_task = agent_task # Store the task + + last_chat_len = len(webui_manager.bu_chat_history) + while not agent_task.done(): + is_paused = webui_manager.bu_agent.state.paused + is_stopped = webui_manager.bu_agent.state.stopped + + # Check for pause state + if is_paused: + yield { + pause_resume_button_comp: gr.update( + value="▶️ Resume", interactive=True + ), + stop_button_comp: gr.update(interactive=True), + } + # Wait until pause is released or task is stopped/done + while is_paused and not agent_task.done(): + # Re-check agent state in loop + is_paused = webui_manager.bu_agent.state.paused + is_stopped = webui_manager.bu_agent.state.stopped + if is_stopped: # Stop signal received while paused + break + await asyncio.sleep(0.2) + + if ( + agent_task.done() or is_stopped + ): # If stopped or task finished while paused + break + + # If resumed, yield UI update + yield { + pause_resume_button_comp: gr.update( + value="⏸️ Pause", interactive=True + ), + run_button_comp: gr.update( + value="⏳ Running...", interactive=False + ), + } + + # Check if agent stopped itself or stop button was pressed (which sets agent.state.stopped) + if is_stopped: + logger.info("Agent has stopped (internally or via stop button).") + if not agent_task.done(): + # Ensure the task coroutine finishes if agent just set flag + try: + await asyncio.wait_for( + agent_task, timeout=1.0 + ) # Give it a moment to exit run() + except asyncio.TimeoutError: + logger.warning( + "Agent task did not finish quickly after stop signal, cancelling." + ) + agent_task.cancel() + except Exception: # Catch task exceptions if it errors on stop + pass + break # Exit the streaming loop + + # Check if agent is asking for help (via response_event) + update_dict = {} + if webui_manager.bu_response_event is not None: + update_dict = { + user_input_comp: gr.update( + placeholder="Agent needs help. Enter response and submit.", + interactive=True, + ), + run_button_comp: gr.update( + value="✔️ Submit Response", interactive=True + ), + pause_resume_button_comp: gr.update(interactive=False), + stop_button_comp: gr.update(interactive=False), + chatbot_comp: gr.update(value=webui_manager.bu_chat_history), + } + last_chat_len = len(webui_manager.bu_chat_history) + yield update_dict + # Wait until response is submitted or task finishes + await webui_manager.bu_response_event.wait() + + # Restore UI after response submitted or if task ended unexpectedly + if not agent_task.done(): + yield { + user_input_comp: gr.update( + placeholder="Agent is running...", interactive=False + ), + run_button_comp: gr.update( + value="⏳ Running...", interactive=False + ), + pause_resume_button_comp: gr.update(interactive=True), + stop_button_comp: gr.update(interactive=True), + } + else: + break # Task finished while waiting for response + + # Update Chatbot if new messages arrived via callbacks + if len(webui_manager.bu_chat_history) > last_chat_len: + update_dict[chatbot_comp] = gr.update( + value=webui_manager.bu_chat_history + ) + last_chat_len = len(webui_manager.bu_chat_history) + + # Update Browser View + if headless and webui_manager.bu_browser_context: + try: + screenshot_b64 = ( + await webui_manager.bu_browser_context.take_screenshot() + ) + if screenshot_b64: + html_content = f'' + update_dict[browser_view_comp] = gr.update( + value=html_content, visible=True + ) + else: + html_content = f"

Waiting for browser session...

" + update_dict[browser_view_comp] = gr.update( + value=html_content, visible=True + ) + except Exception as e: + logger.debug(f"Failed to capture screenshot: {e}") + update_dict[browser_view_comp] = gr.update( + value="
Error loading view...
", + visible=True, + ) + else: + update_dict[browser_view_comp] = gr.update(visible=False) + + # Yield accumulated updates + if update_dict: + yield update_dict + + await asyncio.sleep(0.1) # Polling interval + + # --- 7. Task Finalization --- + webui_manager.bu_agent.state.paused = False + webui_manager.bu_agent.state.stopped = False + final_update = {} + try: + logger.info("Agent task completing...") + # Await the task ensure completion and catch exceptions if not already caught + if not agent_task.done(): + await agent_task # Retrieve result/exception + elif agent_task.exception(): # Check if task finished with exception + agent_task.result() # Raise the exception to be caught below + logger.info("Agent task completed processing.") + + logger.info(f"Explicitly saving agent history to: {history_file}") + webui_manager.bu_agent.save_history(history_file) + + if os.path.exists(history_file): + final_update[history_file_comp] = gr.File(value=history_file) + + if gif_path and os.path.exists(gif_path): + logger.info(f"GIF found at: {gif_path}") + final_update[gif_comp] = gr.Image(value=gif_path) + + except asyncio.CancelledError: + logger.info("Agent task was cancelled.") + if not any( + "Cancelled" in msg.get("content", "") + for msg in webui_manager.bu_chat_history + if msg.get("role") == "assistant" + ): + webui_manager.bu_chat_history.append( + {"role": "assistant", "content": "**Task Cancelled**."} + ) + final_update[chatbot_comp] = gr.update(value=webui_manager.bu_chat_history) + except Exception as e: + logger.error(f"Error during agent execution: {e}", exc_info=True) + error_message = ( + f"**Agent Execution Error:**\n```\n{type(e).__name__}: {e}\n```" + ) + if not any( + error_message in msg.get("content", "") + for msg in webui_manager.bu_chat_history + if msg.get("role") == "assistant" + ): + webui_manager.bu_chat_history.append( + {"role": "assistant", "content": error_message} + ) + final_update[chatbot_comp] = gr.update(value=webui_manager.bu_chat_history) + gr.Error(f"Agent execution failed: {e}") + + finally: + webui_manager.bu_current_task = None # Clear the task reference + + # Close browser/context if requested + if should_close_browser_on_finish: + if webui_manager.bu_browser_context: + logger.info("Closing browser context after task.") + await webui_manager.bu_browser_context.close() + webui_manager.bu_browser_context = None + if webui_manager.bu_browser: + logger.info("Closing browser after task.") + await webui_manager.bu_browser.close() + webui_manager.bu_browser = None + + # --- 8. Final UI Update --- + final_update.update( + { + user_input_comp: gr.update( + value="", + interactive=True, + placeholder="Enter your next task...", + ), + run_button_comp: gr.update(value="▶️ Submit Task", interactive=True), + stop_button_comp: gr.update(value="⏹️ Stop", interactive=False), + pause_resume_button_comp: gr.update( + value="⏸️ Pause", interactive=False + ), + clear_button_comp: gr.update(interactive=True), + # Ensure final chat history is shown + chatbot_comp: gr.update(value=webui_manager.bu_chat_history), + } + ) + yield final_update + + except Exception as e: + # Catch errors during setup (before agent run starts) + logger.error(f"Error setting up agent task: {e}", exc_info=True) + webui_manager.bu_current_task = None # Ensure state is reset + yield { + user_input_comp: gr.update( + interactive=True, placeholder="Error during setup. Enter task..." + ), + run_button_comp: gr.update(value="▶️ Submit Task", interactive=True), + stop_button_comp: gr.update(value="⏹️ Stop", interactive=False), + pause_resume_button_comp: gr.update(value="⏸️ Pause", interactive=False), + clear_button_comp: gr.update(interactive=True), + chatbot_comp: gr.update( + value=webui_manager.bu_chat_history + + [{"role": "assistant", "content": f"**Setup Error:** {e}"}] + ), + } + + +# --- Button Click Handlers --- (Need access to webui_manager) + + +async def handle_submit( + webui_manager: WebuiManager, components: Dict[gr.components.Component, Any] +): + """Handles clicks on the main 'Submit' button.""" + user_input_comp = webui_manager.get_component_by_id("browser_use_agent.user_input") + user_input_value = components.get(user_input_comp, "").strip() + + # Check if waiting for user assistance + if webui_manager.bu_response_event and not webui_manager.bu_response_event.is_set(): + logger.info(f"User submitted assistance: {user_input_value}") + webui_manager.bu_user_help_response = ( + user_input_value if user_input_value else "User provided no text response." + ) + webui_manager.bu_response_event.set() + # UI updates handled by the main loop reacting to the event being set + yield { + user_input_comp: gr.update( + value="", + interactive=False, + placeholder="Waiting for agent to continue...", + ), + webui_manager.get_component_by_id( + "browser_use_agent.run_button" + ): gr.update(value="⏳ Running...", interactive=False), + } + # Check if a task is currently running (using _current_task) + elif webui_manager.bu_current_task and not webui_manager.bu_current_task.done(): + logger.warning( + "Submit button clicked while agent is already running and not asking for help." + ) + gr.Info("Agent is currently running. Please wait or use Stop/Pause.") + yield {} # No change + else: + # Handle submission for a new task + logger.info("Submit button clicked for new task.") + # Use async generator to stream updates from run_agent_task + async for update in run_agent_task(webui_manager, components): + yield update + + +async def handle_stop(webui_manager: WebuiManager): + """Handles clicks on the 'Stop' button.""" + logger.info("Stop button clicked.") + agent = webui_manager.bu_agent + task = webui_manager.bu_current_task + + if agent and task and not task.done(): + # Signal the agent to stop by setting its internal flag + agent.state.stopped = True + agent.state.paused = False # Ensure not paused if stopped + return { + webui_manager.get_component_by_id( + "browser_use_agent.stop_button" + ): gr.update(interactive=False, value="⏹️ Stopping..."), + webui_manager.get_component_by_id( + "browser_use_agent.pause_resume_button" + ): gr.update(interactive=False), + webui_manager.get_component_by_id( + "browser_use_agent.run_button" + ): gr.update(interactive=False), + } + else: + logger.warning("Stop clicked but agent is not running or task is already done.") + # Reset UI just in case it's stuck + return { + webui_manager.get_component_by_id( + "browser_use_agent.run_button" + ): gr.update(interactive=True), + webui_manager.get_component_by_id( + "browser_use_agent.stop_button" + ): gr.update(interactive=False), + webui_manager.get_component_by_id( + "browser_use_agent.pause_resume_button" + ): gr.update(interactive=False), + webui_manager.get_component_by_id( + "browser_use_agent.clear_button" + ): gr.update(interactive=True), + } + + +async def handle_pause_resume(webui_manager: WebuiManager): + """Handles clicks on the 'Pause/Resume' button.""" + agent = webui_manager.bu_agent + task = webui_manager.bu_current_task + + if agent and task and not task.done(): + if agent.state.paused: + logger.info("Resume button clicked.") + agent.resume() + # UI update happens in main loop + return { + webui_manager.get_component_by_id( + "browser_use_agent.pause_resume_button" + ): gr.update(value="⏸️ Pause", interactive=True) + } # Optimistic update + else: + logger.info("Pause button clicked.") + agent.pause() + return { + webui_manager.get_component_by_id( + "browser_use_agent.pause_resume_button" + ): gr.update(value="▶️ Resume", interactive=True) + } # Optimistic update + else: + logger.warning( + "Pause/Resume clicked but agent is not running or doesn't support state." + ) + return {} # No change + + +async def handle_clear(webui_manager: WebuiManager): + """Handles clicks on the 'Clear' button.""" + logger.info("Clear button clicked.") + + # Stop any running task first + task = webui_manager.bu_current_task + if task and not task.done(): + logger.info("Clearing requires stopping the current task.") + webui_manager.bu_agent.stop() + task.cancel() + try: + await asyncio.wait_for(task, timeout=2.0) # Wait briefly + except (asyncio.CancelledError, asyncio.TimeoutError): + pass + except Exception as e: + logger.warning(f"Error stopping task on clear: {e}") + webui_manager.bu_current_task = None + + if webui_manager.bu_controller: + await webui_manager.bu_controller.close_mcp_client() + webui_manager.bu_controller = None + webui_manager.bu_agent = None + + # Reset state stored in manager + webui_manager.bu_chat_history = [] + webui_manager.bu_response_event = None + webui_manager.bu_user_help_response = None + webui_manager.bu_agent_task_id = None + + logger.info("Agent state and browser resources cleared.") + + # Reset UI components + return { + webui_manager.get_component_by_id("browser_use_agent.chatbot"): gr.update( + value=[] + ), + webui_manager.get_component_by_id("browser_use_agent.user_input"): gr.update( + value="", placeholder="Enter your task here..." + ), + webui_manager.get_component_by_id( + "browser_use_agent.agent_history_file" + ): gr.update(value=None), + webui_manager.get_component_by_id("browser_use_agent.recording_gif"): gr.update( + value=None + ), + webui_manager.get_component_by_id("browser_use_agent.browser_view"): gr.update( + value="
Browser Cleared
" + ), + webui_manager.get_component_by_id("browser_use_agent.run_button"): gr.update( + value="▶️ Submit Task", interactive=True + ), + webui_manager.get_component_by_id("browser_use_agent.stop_button"): gr.update( + interactive=False + ), + webui_manager.get_component_by_id( + "browser_use_agent.pause_resume_button" + ): gr.update(value="⏸️ Pause", interactive=False), + webui_manager.get_component_by_id("browser_use_agent.clear_button"): gr.update( + interactive=True + ), + } + + +# --- Tab Creation Function --- + + +def create_browser_use_agent_tab(webui_manager: WebuiManager): + """ + Create the run agent tab, defining UI, state, and handlers. + """ + webui_manager.init_browser_use_agent() + + # --- Define UI Components --- + tab_components = {} + with gr.Column(): + chatbot = gr.Chatbot( + lambda: webui_manager.bu_chat_history, # Load history dynamically + elem_id="browser_use_chatbot", + label="Agent Interaction", + type="messages", + height=600, + show_copy_button=True, + ) + user_input = gr.Textbox( + label="Your Task or Response", + placeholder="Enter your task here or provide assistance when asked.", + lines=3, + interactive=True, + elem_id="user_input", + ) + with gr.Row(): + stop_button = gr.Button( + "⏹️ Stop", interactive=False, variant="stop", scale=2 + ) + pause_resume_button = gr.Button( + "⏸️ Pause", interactive=False, variant="secondary", scale=2, visible=True + ) + clear_button = gr.Button( + "🗑️ Clear", interactive=True, variant="secondary", scale=2 + ) + run_button = gr.Button("▶️ Submit Task", variant="primary", scale=3) + + browser_view = gr.HTML( + value="

Browser View (Requires Headless=True)

", + label="Browser Live View", + elem_id="browser_view", + visible=False, + ) + with gr.Column(): + gr.Markdown("### Task Outputs") + agent_history_file = gr.File(label="Agent History JSON", interactive=False) + recording_gif = gr.Image( + label="Task Recording GIF", + format="gif", + interactive=False, + type="filepath", + ) + + # --- Store Components in Manager --- + tab_components.update( + dict( + chatbot=chatbot, + user_input=user_input, + clear_button=clear_button, + run_button=run_button, + stop_button=stop_button, + pause_resume_button=pause_resume_button, + agent_history_file=agent_history_file, + recording_gif=recording_gif, + browser_view=browser_view, + ) + ) + webui_manager.add_components( + "browser_use_agent", tab_components + ) # Use "browser_use_agent" as tab_name prefix + + all_managed_components = set( + webui_manager.get_components() + ) # Get all components known to manager + run_tab_outputs = list(tab_components.values()) + + async def submit_wrapper( + components_dict: Dict[Component, Any], + ) -> AsyncGenerator[Dict[Component, Any], None]: + """Wrapper for handle_submit that yields its results.""" + async for update in handle_submit(webui_manager, components_dict): + yield update + + async def stop_wrapper() -> AsyncGenerator[Dict[Component, Any], None]: + """Wrapper for handle_stop.""" + update_dict = await handle_stop(webui_manager) + yield update_dict + + async def pause_resume_wrapper() -> AsyncGenerator[Dict[Component, Any], None]: + """Wrapper for handle_pause_resume.""" + update_dict = await handle_pause_resume(webui_manager) + yield update_dict + + async def clear_wrapper() -> AsyncGenerator[Dict[Component, Any], None]: + """Wrapper for handle_clear.""" + update_dict = await handle_clear(webui_manager) + yield update_dict + + # --- Connect Event Handlers using the Wrappers -- + run_button.click( + fn=submit_wrapper, inputs=all_managed_components, outputs=run_tab_outputs, trigger_mode="multiple" + ) + user_input.submit( + fn=submit_wrapper, inputs=all_managed_components, outputs=run_tab_outputs + ) + stop_button.click(fn=stop_wrapper, inputs=None, outputs=run_tab_outputs) + pause_resume_button.click( + fn=pause_resume_wrapper, inputs=None, outputs=run_tab_outputs + ) + clear_button.click(fn=clear_wrapper, inputs=None, outputs=run_tab_outputs) diff --git a/src/webui/components/deep_research_agent_tab.py b/src/webui/components/deep_research_agent_tab.py new file mode 100644 index 0000000..88faea0 --- /dev/null +++ b/src/webui/components/deep_research_agent_tab.py @@ -0,0 +1,457 @@ +import gradio as gr +from gradio.components import Component +from functools import partial + +from src.webui.webui_manager import WebuiManager +from src.utils import config +import logging +import os +from typing import Any, Dict, AsyncGenerator, Optional, Tuple, Union +import asyncio +import json +from src.agent.deep_research.deep_research_agent import DeepResearchAgent +from src.utils import llm_provider + +logger = logging.getLogger(__name__) + + +async def _initialize_llm(provider: Optional[str], model_name: Optional[str], temperature: float, + base_url: Optional[str], api_key: Optional[str], num_ctx: Optional[int] = None): + """Initializes the LLM based on settings. Returns None if provider/model is missing.""" + if not provider or not model_name: + logger.info("LLM Provider or Model Name not specified, LLM will be None.") + return None + try: + logger.info(f"Initializing LLM: Provider={provider}, Model={model_name}, Temp={temperature}") + # Use your actual LLM provider logic here + llm = llm_provider.get_llm_model( + provider=provider, + model_name=model_name, + temperature=temperature, + base_url=base_url or None, + api_key=api_key or None, + num_ctx=num_ctx if provider == "ollama" else None + ) + return llm + except Exception as e: + logger.error(f"Failed to initialize LLM: {e}", exc_info=True) + gr.Warning( + f"Failed to initialize LLM '{model_name}' for provider '{provider}'. Please check settings. Error: {e}") + return None + + +def _read_file_safe(file_path: str) -> Optional[str]: + """Safely read a file, returning None if it doesn't exist or on error.""" + if not os.path.exists(file_path): + return None + try: + with open(file_path, 'r', encoding='utf-8') as f: + return f.read() + except Exception as e: + logger.error(f"Error reading file {file_path}: {e}") + return None + + +# --- Deep Research Agent Specific Logic --- + +async def run_deep_research(webui_manager: WebuiManager, components: Dict[Component, Any]) -> AsyncGenerator[ + Dict[Component, Any], None]: + """Handles initializing and running the DeepResearchAgent.""" + + # --- Get Components --- + research_task_comp = webui_manager.get_component_by_id("deep_research_agent.research_task") + resume_task_id_comp = webui_manager.get_component_by_id("deep_research_agent.resume_task_id") + parallel_num_comp = webui_manager.get_component_by_id("deep_research_agent.parallel_num") + save_dir_comp = webui_manager.get_component_by_id( + "deep_research_agent.max_query") # Note: component ID seems misnamed in original code + start_button_comp = webui_manager.get_component_by_id("deep_research_agent.start_button") + stop_button_comp = webui_manager.get_component_by_id("deep_research_agent.stop_button") + markdown_display_comp = webui_manager.get_component_by_id("deep_research_agent.markdown_display") + markdown_download_comp = webui_manager.get_component_by_id("deep_research_agent.markdown_download") + mcp_server_config_comp = webui_manager.get_component_by_id("deep_research_agent.mcp_server_config") + + # --- 1. Get Task and Settings --- + task_topic = components.get(research_task_comp, "").strip() + task_id_to_resume = components.get(resume_task_id_comp, "").strip() or None + max_parallel_agents = int(components.get(parallel_num_comp, 1)) + base_save_dir = components.get(save_dir_comp, "./tmp/deep_research").strip() + safe_root_dir = "./tmp/deep_research" + normalized_base_save_dir = os.path.abspath(os.path.normpath(base_save_dir)) + if os.path.commonpath([normalized_base_save_dir, os.path.abspath(safe_root_dir)]) != os.path.abspath(safe_root_dir): + logger.warning(f"Unsafe base_save_dir detected: {base_save_dir}. Using default directory.") + normalized_base_save_dir = os.path.abspath(safe_root_dir) + base_save_dir = normalized_base_save_dir + mcp_server_config_str = components.get(mcp_server_config_comp) + mcp_config = json.loads(mcp_server_config_str) if mcp_server_config_str else None + + if not task_topic: + gr.Warning("Please enter a research task.") + yield {start_button_comp: gr.update(interactive=True)} # Re-enable start button + return + + # Store base save dir for stop handler + webui_manager.dr_save_dir = base_save_dir + os.makedirs(base_save_dir, exist_ok=True) + + # --- 2. Initial UI Update --- + yield { + start_button_comp: gr.update(value="⏳ Running...", interactive=False), + stop_button_comp: gr.update(interactive=True), + research_task_comp: gr.update(interactive=False), + resume_task_id_comp: gr.update(interactive=False), + parallel_num_comp: gr.update(interactive=False), + save_dir_comp: gr.update(interactive=False), + markdown_display_comp: gr.update(value="Starting research..."), + markdown_download_comp: gr.update(value=None, interactive=False) + } + + agent_task = None + running_task_id = None + plan_file_path = None + report_file_path = None + last_plan_content = None + last_plan_mtime = 0 + + try: + # --- 3. Get LLM and Browser Config from other tabs --- + # Access settings values via components dict, getting IDs from webui_manager + def get_setting(tab: str, key: str, default: Any = None): + comp = webui_manager.id_to_component.get(f"{tab}.{key}") + return components.get(comp, default) if comp else default + + # LLM Config (from agent_settings tab) + llm_provider_name = get_setting("agent_settings", "llm_provider") + llm_model_name = get_setting("agent_settings", "llm_model_name") + llm_temperature = max(get_setting("agent_settings", "llm_temperature", 0.5), 0.5) + llm_base_url = get_setting("agent_settings", "llm_base_url") + llm_api_key = get_setting("agent_settings", "llm_api_key") + ollama_num_ctx = get_setting("agent_settings", "ollama_num_ctx") + + llm = await _initialize_llm( + llm_provider_name, llm_model_name, llm_temperature, llm_base_url, llm_api_key, + ollama_num_ctx if llm_provider_name == "ollama" else None + ) + if not llm: + raise ValueError("LLM Initialization failed. Please check Agent Settings.") + + # Browser Config (from browser_settings tab) + # Note: DeepResearchAgent constructor takes a dict, not full Browser/Context objects + browser_config_dict = { + "headless": get_setting("browser_settings", "headless", False), + "disable_security": get_setting("browser_settings", "disable_security", False), + "browser_binary_path": get_setting("browser_settings", "browser_binary_path"), + "user_data_dir": get_setting("browser_settings", "browser_user_data_dir"), + "window_width": int(get_setting("browser_settings", "window_w", 1280)), + "window_height": int(get_setting("browser_settings", "window_h", 1100)), + # Add other relevant fields if DeepResearchAgent accepts them + } + + # --- 4. Initialize or Get Agent --- + if not webui_manager.dr_agent: + webui_manager.dr_agent = DeepResearchAgent( + llm=llm, + browser_config=browser_config_dict, + mcp_server_config=mcp_config + ) + logger.info("DeepResearchAgent initialized.") + + # --- 5. Start Agent Run --- + agent_run_coro = webui_manager.dr_agent.run( + topic=task_topic, + task_id=task_id_to_resume, + save_dir=base_save_dir, + max_parallel_browsers=max_parallel_agents + ) + agent_task = asyncio.create_task(agent_run_coro) + webui_manager.dr_current_task = agent_task + + # Wait briefly for the agent to start and potentially create the task ID/folder + await asyncio.sleep(1.0) + + # Determine the actual task ID being used (agent sets this) + running_task_id = webui_manager.dr_agent.current_task_id + if not running_task_id: + # Agent might not have set it yet, try to get from result later? Risky. + # Or derive from resume_task_id if provided? + running_task_id = task_id_to_resume + if not running_task_id: + logger.warning("Could not determine running task ID immediately.") + # We can still monitor, but might miss initial plan if ID needed for path + else: + logger.info(f"Assuming task ID based on resume ID: {running_task_id}") + else: + logger.info(f"Agent started with Task ID: {running_task_id}") + + webui_manager.dr_task_id = running_task_id # Store for stop handler + + # --- 6. Monitor Progress via research_plan.md --- + if running_task_id: + task_specific_dir = os.path.join(base_save_dir, str(running_task_id)) + plan_file_path = os.path.join(task_specific_dir, "research_plan.md") + report_file_path = os.path.join(task_specific_dir, "report.md") + logger.info(f"Monitoring plan file: {plan_file_path}") + else: + logger.warning("Cannot monitor plan file: Task ID unknown.") + plan_file_path = None + last_plan_content = None + while not agent_task.done(): + update_dict = {} + update_dict[resume_task_id_comp] = gr.update(value=running_task_id) + agent_stopped = getattr(webui_manager.dr_agent, 'stopped', False) + if agent_stopped: + logger.info("Stop signal detected from agent state.") + break # Exit monitoring loop + + # Check and update research plan display + if plan_file_path: + try: + current_mtime = os.path.getmtime(plan_file_path) if os.path.exists(plan_file_path) else 0 + if current_mtime > last_plan_mtime: + logger.info(f"Detected change in {plan_file_path}") + plan_content = _read_file_safe(plan_file_path) + if last_plan_content is None or ( + plan_content is not None and plan_content != last_plan_content): + update_dict[markdown_display_comp] = gr.update(value=plan_content) + last_plan_content = plan_content + last_plan_mtime = current_mtime + elif plan_content is None: + # File might have been deleted or became unreadable + last_plan_mtime = 0 # Reset to force re-read attempt later + except Exception as e: + logger.warning(f"Error checking/reading plan file {plan_file_path}: {e}") + # Avoid continuous logging for the same error + await asyncio.sleep(2.0) + + # Yield updates if any + if update_dict: + yield update_dict + + await asyncio.sleep(1.0) # Check file changes every second + + # --- 7. Task Finalization --- + logger.info("Agent task processing finished. Awaiting final result...") + final_result_dict = await agent_task # Get result or raise exception + logger.info(f"Agent run completed. Result keys: {final_result_dict.keys() if final_result_dict else 'None'}") + + # Try to get task ID from result if not known before + if not running_task_id and final_result_dict and 'task_id' in final_result_dict: + running_task_id = final_result_dict['task_id'] + webui_manager.dr_task_id = running_task_id + task_specific_dir = os.path.join(base_save_dir, str(running_task_id)) + report_file_path = os.path.join(task_specific_dir, "report.md") + logger.info(f"Task ID confirmed from result: {running_task_id}") + + final_ui_update = {} + if report_file_path and os.path.exists(report_file_path): + logger.info(f"Loading final report from: {report_file_path}") + report_content = _read_file_safe(report_file_path) + if report_content: + final_ui_update[markdown_display_comp] = gr.update(value=report_content) + final_ui_update[markdown_download_comp] = gr.File(value=report_file_path, + label=f"Report ({running_task_id}.md)", + interactive=True) + else: + final_ui_update[markdown_display_comp] = gr.update( + value="# Research Complete\n\n*Error reading final report file.*") + elif final_result_dict and 'report' in final_result_dict: + logger.info("Using report content directly from agent result.") + # If agent directly returns report content + final_ui_update[markdown_display_comp] = gr.update(value=final_result_dict['report']) + # Cannot offer download if only content is available + final_ui_update[markdown_download_comp] = gr.update(value=None, label="Download Research Report", + interactive=False) + else: + logger.warning("Final report file not found and not in result dict.") + final_ui_update[markdown_display_comp] = gr.update(value="# Research Complete\n\n*Final report not found.*") + + yield final_ui_update + + + except Exception as e: + logger.error(f"Error during Deep Research Agent execution: {e}", exc_info=True) + gr.Error(f"Research failed: {e}") + yield {markdown_display_comp: gr.update(value=f"# Research Failed\n\n**Error:**\n```\n{e}\n```")} + + finally: + # --- 8. Final UI Reset --- + webui_manager.dr_current_task = None # Clear task reference + webui_manager.dr_task_id = None # Clear running task ID + + yield { + start_button_comp: gr.update(value="▶️ Run", interactive=True), + stop_button_comp: gr.update(interactive=False), + research_task_comp: gr.update(interactive=True), + resume_task_id_comp: gr.update(value="", interactive=True), + parallel_num_comp: gr.update(interactive=True), + save_dir_comp: gr.update(interactive=True), + # Keep download button enabled if file exists + markdown_download_comp: gr.update() if report_file_path and os.path.exists(report_file_path) else gr.update( + interactive=False) + } + + +async def stop_deep_research(webui_manager: WebuiManager) -> Dict[Component, Any]: + """Handles the Stop button click.""" + logger.info("Stop button clicked for Deep Research.") + agent = webui_manager.dr_agent + task = webui_manager.dr_current_task + task_id = webui_manager.dr_task_id + base_save_dir = webui_manager.dr_save_dir + + stop_button_comp = webui_manager.get_component_by_id("deep_research_agent.stop_button") + start_button_comp = webui_manager.get_component_by_id("deep_research_agent.start_button") + markdown_display_comp = webui_manager.get_component_by_id("deep_research_agent.markdown_display") + markdown_download_comp = webui_manager.get_component_by_id("deep_research_agent.markdown_download") + + final_update = { + stop_button_comp: gr.update(interactive=False, value="⏹️ Stopping...") + } + + if agent and task and not task.done(): + logger.info("Signalling DeepResearchAgent to stop.") + try: + # Assuming stop is synchronous or sets a flag quickly + await agent.stop() + except Exception as e: + logger.error(f"Error calling agent.stop(): {e}") + + # The run_deep_research loop should detect the stop and exit. + # We yield an intermediate "Stopping..." state. The final reset is done by run_deep_research. + + # Try to show the final report if available after stopping + await asyncio.sleep(1.5) # Give agent a moment to write final files potentially + report_file_path = None + if task_id and base_save_dir: + report_file_path = os.path.join(base_save_dir, str(task_id), "report.md") + + if report_file_path and os.path.exists(report_file_path): + report_content = _read_file_safe(report_file_path) + if report_content: + final_update[markdown_display_comp] = gr.update( + value=report_content + "\n\n---\n*Research stopped by user.*") + final_update[markdown_download_comp] = gr.File(value=report_file_path, label=f"Report ({task_id}.md)", + interactive=True) + else: + final_update[markdown_display_comp] = gr.update( + value="# Research Stopped\n\n*Error reading final report file after stop.*") + else: + final_update[markdown_display_comp] = gr.update(value="# Research Stopped by User") + + # Keep start button disabled, run_deep_research finally block will re-enable it. + final_update[start_button_comp] = gr.update(interactive=False) + + else: + logger.warning("Stop clicked but no active research task found.") + # Reset UI state just in case + final_update = { + start_button_comp: gr.update(interactive=True), + stop_button_comp: gr.update(interactive=False), + webui_manager.get_component_by_id("deep_research_agent.research_task"): gr.update(interactive=True), + webui_manager.get_component_by_id("deep_research_agent.resume_task_id"): gr.update(interactive=True), + webui_manager.get_component_by_id("deep_research_agent.max_iteration"): gr.update(interactive=True), + webui_manager.get_component_by_id("deep_research_agent.max_query"): gr.update(interactive=True), + } + + return final_update + + +async def update_mcp_server(mcp_file: str, webui_manager: WebuiManager): + """ + Update the MCP server. + """ + if hasattr(webui_manager, "dr_agent") and webui_manager.dr_agent: + logger.warning("⚠️ Close controller because mcp file has changed!") + await webui_manager.dr_agent.close_mcp_client() + + if not mcp_file or not os.path.exists(mcp_file) or not mcp_file.endswith('.json'): + logger.warning(f"{mcp_file} is not a valid MCP file.") + return None, gr.update(visible=False) + + with open(mcp_file, 'r') as f: + mcp_server = json.load(f) + + return json.dumps(mcp_server, indent=2), gr.update(visible=True) + + +def create_deep_research_agent_tab(webui_manager: WebuiManager): + """ + Creates a deep research agent tab + """ + input_components = set(webui_manager.get_components()) + tab_components = {} + + with gr.Group(): + with gr.Row(): + mcp_json_file = gr.File(label="MCP server json", interactive=True, file_types=[".json"]) + mcp_server_config = gr.Textbox(label="MCP server", lines=6, interactive=True, visible=False) + + with gr.Group(): + research_task = gr.Textbox(label="Research Task", lines=5, + value="Give me a detailed travel plan to Switzerland from June 1st to 10th.", + interactive=True) + with gr.Row(): + resume_task_id = gr.Textbox(label="Resume Task ID", value="", + interactive=True) + parallel_num = gr.Number(label="Parallel Agent Num", value=1, + precision=0, + interactive=True) + max_query = gr.Textbox(label="Research Save Dir", value="./tmp/deep_research", + interactive=True) + with gr.Row(): + stop_button = gr.Button("⏹️ Stop", variant="stop", scale=2) + start_button = gr.Button("▶️ Run", variant="primary", scale=3) + with gr.Group(): + markdown_display = gr.Markdown(label="Research Report") + markdown_download = gr.File(label="Download Research Report", interactive=False) + tab_components.update( + dict( + research_task=research_task, + parallel_num=parallel_num, + max_query=max_query, + start_button=start_button, + stop_button=stop_button, + markdown_display=markdown_display, + markdown_download=markdown_download, + resume_task_id=resume_task_id, + mcp_json_file=mcp_json_file, + mcp_server_config=mcp_server_config, + ) + ) + webui_manager.add_components("deep_research_agent", tab_components) + webui_manager.init_deep_research_agent() + + async def update_wrapper(mcp_file): + """Wrapper for handle_pause_resume.""" + update_dict = await update_mcp_server(mcp_file, webui_manager) + yield update_dict + + mcp_json_file.change( + update_wrapper, + inputs=[mcp_json_file], + outputs=[mcp_server_config, mcp_server_config] + ) + + dr_tab_outputs = list(tab_components.values()) + all_managed_inputs = set(webui_manager.get_components()) + + # --- Define Event Handler Wrappers --- + async def start_wrapper(comps: Dict[Component, Any]) -> AsyncGenerator[Dict[Component, Any], None]: + async for update in run_deep_research(webui_manager, comps): + yield update + + async def stop_wrapper() -> AsyncGenerator[Dict[Component, Any], None]: + update_dict = await stop_deep_research(webui_manager) + yield update_dict + + # --- Connect Handlers --- + start_button.click( + fn=start_wrapper, + inputs=all_managed_inputs, + outputs=dr_tab_outputs + ) + + stop_button.click( + fn=stop_wrapper, + inputs=None, + outputs=dr_tab_outputs + ) diff --git a/src/webui/components/load_save_config_tab.py b/src/webui/components/load_save_config_tab.py new file mode 100644 index 0000000..aaa1441 --- /dev/null +++ b/src/webui/components/load_save_config_tab.py @@ -0,0 +1,50 @@ +import gradio as gr +from gradio.components import Component + +from src.webui.webui_manager import WebuiManager +from src.utils import config + + +def create_load_save_config_tab(webui_manager: WebuiManager): + """ + Creates a load and save config tab. + """ + input_components = set(webui_manager.get_components()) + tab_components = {} + + config_file = gr.File( + label="Load UI Settings from json", + file_types=[".json"], + interactive=True + ) + with gr.Row(): + load_config_button = gr.Button("Load Config", variant="primary") + save_config_button = gr.Button("Save UI Settings", variant="primary") + + config_status = gr.Textbox( + label="Status", + lines=2, + interactive=False + ) + + tab_components.update(dict( + load_config_button=load_config_button, + save_config_button=save_config_button, + config_status=config_status, + config_file=config_file, + )) + + webui_manager.add_components("load_save_config", tab_components) + + save_config_button.click( + fn=webui_manager.save_config, + inputs=set(webui_manager.get_components()), + outputs=[config_status] + ) + + load_config_button.click( + fn=webui_manager.load_config, + inputs=[config_file], + outputs=webui_manager.get_components(), + ) + diff --git a/src/webui/interface.py b/src/webui/interface.py new file mode 100644 index 0000000..083649e --- /dev/null +++ b/src/webui/interface.py @@ -0,0 +1,95 @@ +import gradio as gr + +from src.webui.webui_manager import WebuiManager +from src.webui.components.agent_settings_tab import create_agent_settings_tab +from src.webui.components.browser_settings_tab import create_browser_settings_tab +from src.webui.components.browser_use_agent_tab import create_browser_use_agent_tab +from src.webui.components.deep_research_agent_tab import create_deep_research_agent_tab +from src.webui.components.load_save_config_tab import create_load_save_config_tab + +theme_map = { + "Default": gr.themes.Default(), + "Soft": gr.themes.Soft(), + "Monochrome": gr.themes.Monochrome(), + "Glass": gr.themes.Glass(), + "Origin": gr.themes.Origin(), + "Citrus": gr.themes.Citrus(), + "Ocean": gr.themes.Ocean(), + "Base": gr.themes.Base() +} + + +def create_ui(theme_name="Ocean"): + css = """ + .gradio-container { + width: 70vw !important; + max-width: 70% !important; + margin-left: auto !important; + margin-right: auto !important; + padding-top: 10px !important; + } + .header-text { + text-align: center; + margin-bottom: 20px; + } + .tab-header-text { + text-align: center; + } + .theme-section { + margin-bottom: 10px; + padding: 15px; + border-radius: 10px; + } + """ + + # dark mode in default + js_func = """ + function refresh() { + const url = new URL(window.location); + + if (url.searchParams.get('__theme') !== 'dark') { + url.searchParams.set('__theme', 'dark'); + window.location.href = url.href; + } + } + """ + + ui_manager = WebuiManager() + + with gr.Blocks( + title="Browser Use WebUI", theme=theme_map[theme_name], css=css, js=js_func, + ) as demo: + with gr.Row(): + gr.Markdown( + """ + # 🌐 Browser Use WebUI + ### Control your browser with AI assistance + """, + elem_classes=["header-text"], + ) + + with gr.Tabs() as tabs: + with gr.TabItem("⚙️ Agent Settings"): + create_agent_settings_tab(ui_manager) + + with gr.TabItem("🌐 Browser Settings"): + create_browser_settings_tab(ui_manager) + + with gr.TabItem("🤖 Run Agent"): + create_browser_use_agent_tab(ui_manager) + + with gr.TabItem("🎁 Agent Marketplace"): + gr.Markdown( + """ + ### Agents built on Browser-Use + """, + elem_classes=["tab-header-text"], + ) + with gr.Tabs(): + with gr.TabItem("Deep Research"): + create_deep_research_agent_tab(ui_manager) + + with gr.TabItem("📁 Load & Save Config"): + create_load_save_config_tab(ui_manager) + + return demo diff --git a/src/webui/webui_manager.py b/src/webui/webui_manager.py new file mode 100644 index 0000000..0a9d5e1 --- /dev/null +++ b/src/webui/webui_manager.py @@ -0,0 +1,122 @@ +import json +from collections.abc import Generator +from typing import TYPE_CHECKING +import os +import gradio as gr +from datetime import datetime +from typing import Optional, Dict, List +import uuid +import asyncio +import time + +from gradio.components import Component +from browser_use.browser.browser import Browser +from browser_use.browser.context import BrowserContext +from browser_use.agent.service import Agent +from src.browser.custom_browser import CustomBrowser +from src.browser.custom_context import CustomBrowserContext +from src.controller.custom_controller import CustomController +from src.agent.deep_research.deep_research_agent import DeepResearchAgent + + +class WebuiManager: + def __init__(self, settings_save_dir: str = "./tmp/webui_settings"): + self.id_to_component: dict[str, Component] = {} + self.component_to_id: dict[Component, str] = {} + + self.settings_save_dir = settings_save_dir + os.makedirs(self.settings_save_dir, exist_ok=True) + + def init_browser_use_agent(self) -> None: + """ + init browser use agent + """ + self.bu_agent: Optional[Agent] = None + self.bu_browser: Optional[CustomBrowser] = None + self.bu_browser_context: Optional[CustomBrowserContext] = None + self.bu_controller: Optional[CustomController] = None + self.bu_chat_history: List[Dict[str, Optional[str]]] = [] + self.bu_response_event: Optional[asyncio.Event] = None + self.bu_user_help_response: Optional[str] = None + self.bu_current_task: Optional[asyncio.Task] = None + self.bu_agent_task_id: Optional[str] = None + + def init_deep_research_agent(self) -> None: + """ + init deep research agent + """ + self.dr_agent: Optional[DeepResearchAgent] = None + self.dr_current_task = None + self.dr_agent_task_id: Optional[str] = None + self.dr_save_dir: Optional[str] = None + + def add_components(self, tab_name: str, components_dict: dict[str, "Component"]) -> None: + """ + Add tab components + """ + for comp_name, component in components_dict.items(): + comp_id = f"{tab_name}.{comp_name}" + self.id_to_component[comp_id] = component + self.component_to_id[component] = comp_id + + def get_components(self) -> list["Component"]: + """ + Get all components + """ + return list(self.id_to_component.values()) + + def get_component_by_id(self, comp_id: str) -> "Component": + """ + Get component by id + """ + return self.id_to_component[comp_id] + + def get_id_by_component(self, comp: "Component") -> str: + """ + Get id by component + """ + return self.component_to_id[comp] + + def save_config(self, components: Dict["Component", str]) -> None: + """ + Save config + """ + cur_settings = {} + for comp in components: + if not isinstance(comp, gr.Button) and not isinstance(comp, gr.File) and str( + getattr(comp, "interactive", True)).lower() != "false": + comp_id = self.get_id_by_component(comp) + cur_settings[comp_id] = components[comp] + + config_name = datetime.now().strftime("%Y%m%d-%H%M%S") + with open(os.path.join(self.settings_save_dir, f"{config_name}.json"), "w") as fw: + json.dump(cur_settings, fw, indent=4) + + return os.path.join(self.settings_save_dir, f"{config_name}.json") + + def load_config(self, config_path: str): + """ + Load config + """ + with open(config_path, "r") as fr: + ui_settings = json.load(fr) + + update_components = {} + for comp_id, comp_val in ui_settings.items(): + if comp_id in self.id_to_component: + comp = self.id_to_component[comp_id] + if comp.__class__.__name__ == "Chatbot": + update_components[comp] = comp.__class__(value=comp_val, type="messages") + else: + update_components[comp] = comp.__class__(value=comp_val) + if comp_id == "agent_settings.planner_llm_provider": + yield update_components # yield provider, let callback run + time.sleep(0.1) # wait for Gradio UI callback + + config_status = self.id_to_component["load_save_config.config_status"] + update_components.update( + { + config_status: config_status.__class__(value=f"Successfully loaded config: {config_path}") + } + ) + yield update_components diff --git a/supervisord.conf b/supervisord.conf new file mode 100644 index 0000000..6010766 --- /dev/null +++ b/supervisord.conf @@ -0,0 +1,80 @@ +[supervisord] +user=root +nodaemon=true +logfile=/dev/stdout +logfile_maxbytes=0 +loglevel=error + +[program:xvfb] +command=Xvfb :99 -screen 0 %(ENV_RESOLUTION)s -ac +extension GLX +render -noreset +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +priority=100 +startsecs=3 +stopsignal=TERM +stopwaitsecs=10 + +[program:vnc_setup] +command=bash -c "mkdir -p ~/.vnc && echo '%(ENV_VNC_PASSWORD)s' | vncpasswd -f > ~/.vnc/passwd && chmod 600 ~/.vnc/passwd && ls -la ~/.vnc/passwd" +autorestart=false +startsecs=0 +priority=150 +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 + +[program:x11vnc] +command=bash -c "mkdir -p /var/log && touch /var/log/x11vnc.log && chmod 666 /var/log/x11vnc.log && sleep 5 && DISPLAY=:99 x11vnc -display :99 -forever -shared -rfbauth /root/.vnc/passwd -rfbport 5901 -o /var/log/x11vnc.log" +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +priority=200 +startretries=10 +startsecs=10 +stopsignal=TERM +stopwaitsecs=10 +depends_on=vnc_setup,xvfb + +[program:x11vnc_log] +command=bash -c "mkdir -p /var/log && touch /var/log/x11vnc.log && tail -f /var/log/x11vnc.log" +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +priority=250 +stopsignal=TERM +stopwaitsecs=5 +depends_on=x11vnc + +[program:novnc] +command=bash -c "sleep 5 && cd /opt/novnc && ./utils/novnc_proxy --vnc localhost:5901 --listen 0.0.0.0:6080 --web /opt/novnc" +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +priority=300 +startretries=5 +startsecs=3 +depends_on=x11vnc + +[program:webui] +command=python webui.py --ip 0.0.0.0 --port 7788 +directory=/app +autorestart=true +stdout_logfile=/dev/stdout +stdout_logfile_maxbytes=0 +stderr_logfile=/dev/stderr +stderr_logfile_maxbytes=0 +priority=400 +startretries=3 +startsecs=3 +stopsignal=TERM +stopwaitsecs=10 \ No newline at end of file diff --git a/tests/test_agents.py b/tests/test_agents.py new file mode 100644 index 0000000..a36561e --- /dev/null +++ b/tests/test_agents.py @@ -0,0 +1,400 @@ +import pdb + +from dotenv import load_dotenv + +load_dotenv() +import sys + +sys.path.append(".") +import asyncio +import os +import sys +from pprint import pprint + +from browser_use import Agent +from browser_use.agent.views import AgentHistoryList + +from src.utils import utils + + +async def test_browser_use_agent(): + from browser_use.browser.browser import Browser, BrowserConfig + from browser_use.browser.context import ( + BrowserContextConfig + ) + from browser_use.agent.service import Agent + + from src.browser.custom_browser import CustomBrowser + from src.controller.custom_controller import CustomController + from src.utils import llm_provider + from src.agent.browser_use.browser_use_agent import BrowserUseAgent + + llm = llm_provider.get_llm_model( + provider="openai", + model_name="gpt-4o", + temperature=0.8, + ) + + # llm = llm_provider.get_llm_model( + # provider="google", + # model_name="gemini-2.0-flash", + # temperature=0.6, + # api_key=os.getenv("GOOGLE_API_KEY", "") + # ) + + # llm = utils.get_llm_model( + # provider="deepseek", + # model_name="deepseek-reasoner", + # temperature=0.8 + # ) + + # llm = utils.get_llm_model( + # provider="deepseek", + # model_name="deepseek-chat", + # temperature=0.8 + # ) + + # llm = utils.get_llm_model( + # provider="ollama", model_name="qwen2.5:7b", temperature=0.5 + # ) + + # llm = utils.get_llm_model( + # provider="ollama", model_name="deepseek-r1:14b", temperature=0.5 + # ) + + window_w, window_h = 1280, 1100 + + # llm = llm_provider.get_llm_model( + # provider="azure_openai", + # model_name="gpt-4o", + # temperature=0.5, + # base_url=os.getenv("AZURE_OPENAI_ENDPOINT", ""), + # api_key=os.getenv("AZURE_OPENAI_API_KEY", ""), + # ) + + mcp_server_config = { + "mcpServers": { + # "markitdown": { + # "command": "docker", + # "args": [ + # "run", + # "--rm", + # "-i", + # "markitdown-mcp:latest" + # ] + # }, + "desktop-commander": { + "command": "npx", + "args": [ + "-y", + "@wonderwhy-er/desktop-commander" + ] + }, + } + } + controller = CustomController() + await controller.setup_mcp_client(mcp_server_config) + use_own_browser = True + use_vision = True # Set to False when using DeepSeek + + max_actions_per_step = 10 + browser = None + browser_context = None + + try: + extra_browser_args = [] + if use_own_browser: + browser_binary_path = os.getenv("BROWSER_PATH", None) + if browser_binary_path == "": + browser_binary_path = None + browser_user_data = os.getenv("BROWSER_USER_DATA", None) + if browser_user_data: + extra_browser_args += [f"--user-data-dir={browser_user_data}"] + else: + browser_binary_path = None + browser = CustomBrowser( + config=BrowserConfig( + headless=False, + browser_binary_path=browser_binary_path, + extra_browser_args=extra_browser_args, + new_context_config=BrowserContextConfig( + window_width=window_w, + window_height=window_h, + ) + ) + ) + browser_context = await browser.new_context( + config=BrowserContextConfig( + trace_path=None, + save_recording_path=None, + save_downloads_path="./tmp/downloads", + window_height=window_h, + window_width=window_w, + ) + ) + agent = BrowserUseAgent( + # task="download pdf from https://arxiv.org/pdf/2311.16498 and rename this pdf to 'mcp-test.pdf'", + task="give me nvidia stock price", + llm=llm, + browser=browser, + browser_context=browser_context, + controller=controller, + use_vision=use_vision, + max_actions_per_step=max_actions_per_step, + generate_gif=True + ) + history: AgentHistoryList = await agent.run(max_steps=100) + + print("Final Result:") + pprint(history.final_result(), indent=4) + + print("\nErrors:") + pprint(history.errors(), indent=4) + + except Exception: + import traceback + traceback.print_exc() + finally: + if browser_context: + await browser_context.close() + if browser: + await browser.close() + if controller: + await controller.close_mcp_client() + + +async def test_browser_use_parallel(): + from browser_use.browser.browser import Browser, BrowserConfig + from browser_use.browser.context import ( + BrowserContextConfig, + ) + from browser_use.agent.service import Agent + + from src.browser.custom_browser import CustomBrowser + from src.controller.custom_controller import CustomController + from src.utils import llm_provider + from src.agent.browser_use.browser_use_agent import BrowserUseAgent + + # llm = utils.get_llm_model( + # provider="openai", + # model_name="gpt-4o", + # temperature=0.8, + # base_url=os.getenv("OPENAI_ENDPOINT", ""), + # api_key=os.getenv("OPENAI_API_KEY", ""), + # ) + + # llm = utils.get_llm_model( + # provider="google", + # model_name="gemini-2.0-flash", + # temperature=0.6, + # api_key=os.getenv("GOOGLE_API_KEY", "") + # ) + + # llm = utils.get_llm_model( + # provider="deepseek", + # model_name="deepseek-reasoner", + # temperature=0.8 + # ) + + # llm = utils.get_llm_model( + # provider="deepseek", + # model_name="deepseek-chat", + # temperature=0.8 + # ) + + # llm = utils.get_llm_model( + # provider="ollama", model_name="qwen2.5:7b", temperature=0.5 + # ) + + # llm = utils.get_llm_model( + # provider="ollama", model_name="deepseek-r1:14b", temperature=0.5 + # ) + + window_w, window_h = 1280, 1100 + + llm = llm_provider.get_llm_model( + provider="azure_openai", + model_name="gpt-4o", + temperature=0.5, + base_url=os.getenv("AZURE_OPENAI_ENDPOINT", ""), + api_key=os.getenv("AZURE_OPENAI_API_KEY", ""), + ) + + mcp_server_config = { + "mcpServers": { + # "markitdown": { + # "command": "docker", + # "args": [ + # "run", + # "--rm", + # "-i", + # "markitdown-mcp:latest" + # ] + # }, + "desktop-commander": { + "command": "npx", + "args": [ + "-y", + "@wonderwhy-er/desktop-commander" + ] + }, + # "filesystem": { + # "command": "npx", + # "args": [ + # "-y", + # "@modelcontextprotocol/server-filesystem", + # "/Users/xxx/ai_workspace", + # ] + # }, + } + } + controller = CustomController() + await controller.setup_mcp_client(mcp_server_config) + use_own_browser = True + use_vision = True # Set to False when using DeepSeek + + max_actions_per_step = 10 + browser = None + browser_context = None + + try: + extra_browser_args = [] + if use_own_browser: + browser_binary_path = os.getenv("BROWSER_PATH", None) + if browser_binary_path == "": + browser_binary_path = None + browser_user_data = os.getenv("BROWSER_USER_DATA", None) + if browser_user_data: + extra_browser_args += [f"--user-data-dir={browser_user_data}"] + else: + browser_binary_path = None + browser = CustomBrowser( + config=BrowserConfig( + headless=False, + browser_binary_path=browser_binary_path, + extra_browser_args=extra_browser_args, + new_context_config=BrowserContextConfig( + window_width=window_w, + window_height=window_h, + ) + ) + ) + browser_context = await browser.new_context( + config=BrowserContextConfig( + trace_path=None, + save_recording_path=None, + save_downloads_path="./tmp/downloads", + window_height=window_h, + window_width=window_w, + force_new_context=True + ) + ) + agents = [ + BrowserUseAgent(task=task, llm=llm, browser=browser, controller=controller) + for task in [ + 'Search Google for weather in Tokyo', + # 'Check Reddit front page title', + # 'Find NASA image of the day', + # 'Check top story on CNN', + # 'Search latest SpaceX launch date', + # 'Look up population of Paris', + 'Find current time in Sydney', + 'Check who won last Super Bowl', + # 'Search trending topics on Twitter', + ] + ] + + history = await asyncio.gather(*[agent.run() for agent in agents]) + print("Final Result:") + pprint(history.final_result(), indent=4) + + print("\nErrors:") + pprint(history.errors(), indent=4) + + pdb.set_trace() + + except Exception: + import traceback + + traceback.print_exc() + finally: + if browser_context: + await browser_context.close() + if browser: + await browser.close() + if controller: + await controller.close_mcp_client() + + +async def test_deep_research_agent(): + from src.agent.deep_research.deep_research_agent import DeepResearchAgent, PLAN_FILENAME, REPORT_FILENAME + from src.utils import llm_provider + + llm = llm_provider.get_llm_model( + provider="openai", + model_name="gpt-4o", + temperature=0.5 + ) + + # llm = llm_provider.get_llm_model( + # provider="bedrock", + # ) + + mcp_server_config = { + "mcpServers": { + "desktop-commander": { + "command": "npx", + "args": [ + "-y", + "@wonderwhy-er/desktop-commander" + ] + }, + } + } + + browser_config = {"headless": False, "window_width": 1280, "window_height": 1100, "use_own_browser": False} + agent = DeepResearchAgent(llm=llm, browser_config=browser_config, mcp_server_config=mcp_server_config) + research_topic = "Give me investment advices of nvidia and tesla." + task_id_to_resume = "" # Set this to resume a previous task ID + + print(f"Starting research on: {research_topic}") + + try: + # Call run and wait for the final result dictionary + result = await agent.run(research_topic, + task_id=task_id_to_resume, + save_dir="./tmp/deep_research", + max_parallel_browsers=1, + ) + + print("\n--- Research Process Ended ---") + print(f"Status: {result.get('status')}") + print(f"Message: {result.get('message')}") + print(f"Task ID: {result.get('task_id')}") + + # Check the final state for the report + final_state = result.get('final_state', {}) + if final_state: + print("\n--- Final State Summary ---") + print( + f" Plan Steps Completed: {sum(1 for item in final_state.get('research_plan', []) if item.get('status') == 'completed')}") + print(f" Total Search Results Logged: {len(final_state.get('search_results', []))}") + if final_state.get("final_report"): + print(" Final Report: Generated (content omitted). You can find it in the output directory.") + # print("\n--- Final Report ---") # Optionally print report + # print(final_state["final_report"]) + else: + print(" Final Report: Not generated.") + else: + print("Final state information not available.") + + + except Exception as e: + print(f"\n--- An unhandled error occurred outside the agent run ---") + print(e) + + +if __name__ == "__main__": + asyncio.run(test_browser_use_agent()) + # asyncio.run(test_browser_use_parallel()) + # asyncio.run(test_deep_research_agent()) diff --git a/tests/test_controller.py b/tests/test_controller.py new file mode 100644 index 0000000..173bae4 --- /dev/null +++ b/tests/test_controller.py @@ -0,0 +1,131 @@ +import asyncio +import pdb +import sys +import time + +sys.path.append(".") + +from dotenv import load_dotenv + +load_dotenv() + + +async def test_mcp_client(): + from src.utils.mcp_client import setup_mcp_client_and_tools, create_tool_param_model + + test_server_config = { + "mcpServers": { + # "markitdown": { + # "command": "docker", + # "args": [ + # "run", + # "--rm", + # "-i", + # "markitdown-mcp:latest" + # ] + # }, + "desktop-commander": { + "command": "npx", + "args": [ + "-y", + "@wonderwhy-er/desktop-commander" + ] + }, + # "filesystem": { + # "command": "npx", + # "args": [ + # "-y", + # "@modelcontextprotocol/server-filesystem", + # "/Users/xxx/ai_workspace", + # ] + # }, + } + } + + mcp_tools, mcp_client = await setup_mcp_client_and_tools(test_server_config) + + for tool in mcp_tools: + tool_param_model = create_tool_param_model(tool) + print(tool.name) + print(tool.description) + print(tool_param_model.model_json_schema()) + pdb.set_trace() + + +async def test_controller_with_mcp(): + import os + from src.controller.custom_controller import CustomController + from browser_use.controller.registry.views import ActionModel + + mcp_server_config = { + "mcpServers": { + # "markitdown": { + # "command": "docker", + # "args": [ + # "run", + # "--rm", + # "-i", + # "markitdown-mcp:latest" + # ] + # }, + "desktop-commander": { + "command": "npx", + "args": [ + "-y", + "@wonderwhy-er/desktop-commander" + ] + }, + # "filesystem": { + # "command": "npx", + # "args": [ + # "-y", + # "@modelcontextprotocol/server-filesystem", + # "/Users/xxx/ai_workspace", + # ] + # }, + } + } + + controller = CustomController() + await controller.setup_mcp_client(mcp_server_config) + action_name = "mcp.desktop-commander.execute_command" + action_info = controller.registry.registry.actions[action_name] + param_model = action_info.param_model + print(param_model.model_json_schema()) + params = {"command": f"python ./tmp/test.py" + } + validated_params = param_model(**params) + ActionModel_ = controller.registry.create_action_model() + # Create ActionModel instance with the validated parameters + action_model = ActionModel_(**{action_name: validated_params}) + result = await controller.act(action_model) + result = result.extracted_content + print(result) + if result and "Command is still running. Use read_output to get more output." in result and "PID" in \ + result.split("\n")[0]: + pid = int(result.split("\n")[0].split("PID")[-1].strip()) + action_name = "mcp.desktop-commander.read_output" + action_info = controller.registry.registry.actions[action_name] + param_model = action_info.param_model + print(param_model.model_json_schema()) + params = {"pid": pid} + validated_params = param_model(**params) + action_model = ActionModel_(**{action_name: validated_params}) + output_result = "" + while True: + time.sleep(1) + result = await controller.act(action_model) + result = result.extracted_content + if result: + pdb.set_trace() + output_result = result + break + print(output_result) + pdb.set_trace() + await controller.close_mcp_client() + pdb.set_trace() + + +if __name__ == '__main__': + # asyncio.run(test_mcp_client()) + asyncio.run(test_controller_with_mcp()) diff --git a/tests/test_llm_api.py b/tests/test_llm_api.py new file mode 100644 index 0000000..938f825 --- /dev/null +++ b/tests/test_llm_api.py @@ -0,0 +1,159 @@ +import os +import pdb +from dataclasses import dataclass + +from dotenv import load_dotenv +from langchain_core.messages import HumanMessage, SystemMessage +from langchain_ollama import ChatOllama + +load_dotenv() + +import sys + +sys.path.append(".") + + +@dataclass +class LLMConfig: + provider: str + model_name: str + temperature: float = 0.8 + base_url: str = None + api_key: str = None + + +def create_message_content(text, image_path=None): + content = [{"type": "text", "text": text}] + image_format = "png" if image_path and image_path.endswith(".png") else "jpeg" + if image_path: + from src.utils import utils + image_data = utils.encode_image(image_path) + content.append({ + "type": "image_url", + "image_url": {"url": f"data:image/{image_format};base64,{image_data}"} + }) + return content + + +def get_env_value(key, provider): + env_mappings = { + "openai": {"api_key": "OPENAI_API_KEY", "base_url": "OPENAI_ENDPOINT"}, + "azure_openai": {"api_key": "AZURE_OPENAI_API_KEY", "base_url": "AZURE_OPENAI_ENDPOINT"}, + "google": {"api_key": "GOOGLE_API_KEY"}, + "deepseek": {"api_key": "DEEPSEEK_API_KEY", "base_url": "DEEPSEEK_ENDPOINT"}, + "mistral": {"api_key": "MISTRAL_API_KEY", "base_url": "MISTRAL_ENDPOINT"}, + "alibaba": {"api_key": "ALIBABA_API_KEY", "base_url": "ALIBABA_ENDPOINT"}, + "moonshot": {"api_key": "MOONSHOT_API_KEY", "base_url": "MOONSHOT_ENDPOINT"}, + "ibm": {"api_key": "IBM_API_KEY", "base_url": "IBM_ENDPOINT"} + } + + if provider in env_mappings and key in env_mappings[provider]: + return os.getenv(env_mappings[provider][key], "") + return "" + + +def test_llm(config, query, image_path=None, system_message=None): + from src.utils import utils, llm_provider + + # Special handling for Ollama-based models + if config.provider == "ollama": + if "deepseek-r1" in config.model_name: + from src.utils.llm_provider import DeepSeekR1ChatOllama + llm = DeepSeekR1ChatOllama(model=config.model_name) + else: + llm = ChatOllama(model=config.model_name) + + ai_msg = llm.invoke(query) + print(ai_msg.content) + if "deepseek-r1" in config.model_name: + pdb.set_trace() + return + + # For other providers, use the standard configuration + llm = llm_provider.get_llm_model( + provider=config.provider, + model_name=config.model_name, + temperature=config.temperature, + base_url=config.base_url or get_env_value("base_url", config.provider), + api_key=config.api_key or get_env_value("api_key", config.provider) + ) + + # Prepare messages for non-Ollama models + messages = [] + if system_message: + messages.append(SystemMessage(content=create_message_content(system_message))) + messages.append(HumanMessage(content=create_message_content(query, image_path))) + ai_msg = llm.invoke(messages) + + # Handle different response types + if hasattr(ai_msg, "reasoning_content"): + print(ai_msg.reasoning_content) + print(ai_msg.content) + +def test_openai_model(): + config = LLMConfig(provider="openai", model_name="gpt-4o") + test_llm(config, "Describe this image", "assets/examples/test.png") + + +def test_google_model(): + # Enable your API key first if you haven't: https://ai.google.dev/palm_docs/oauth_quickstart + config = LLMConfig(provider="google", model_name="gemini-2.0-flash-exp") + test_llm(config, "Describe this image", "assets/examples/test.png") + + +def test_azure_openai_model(): + config = LLMConfig(provider="azure_openai", model_name="gpt-4o") + test_llm(config, "Describe this image", "assets/examples/test.png") + + +def test_deepseek_model(): + config = LLMConfig(provider="deepseek", model_name="deepseek-chat") + test_llm(config, "Who are you?") + + +def test_deepseek_r1_model(): + config = LLMConfig(provider="deepseek", model_name="deepseek-reasoner") + test_llm(config, "Which is greater, 9.11 or 9.8?", system_message="You are a helpful AI assistant.") + + +def test_ollama_model(): + config = LLMConfig(provider="ollama", model_name="qwen2.5:7b") + test_llm(config, "Sing a ballad of LangChain.") + + +def test_deepseek_r1_ollama_model(): + config = LLMConfig(provider="ollama", model_name="deepseek-r1:14b") + test_llm(config, "How many 'r's are in the word 'strawberry'?") + + +def test_mistral_model(): + config = LLMConfig(provider="mistral", model_name="pixtral-large-latest") + test_llm(config, "Describe this image", "assets/examples/test.png") + + +def test_moonshot_model(): + config = LLMConfig(provider="moonshot", model_name="moonshot-v1-32k-vision-preview") + test_llm(config, "Describe this image", "assets/examples/test.png") + + +def test_ibm_model(): + config = LLMConfig(provider="ibm", model_name="meta-llama/llama-4-maverick-17b-128e-instruct-fp8") + test_llm(config, "Describe this image", "assets/examples/test.png") + + +def test_qwen_model(): + config = LLMConfig(provider="alibaba", model_name="qwen-vl-max") + test_llm(config, "How many 'r's are in the word 'strawberry'?") + + +if __name__ == "__main__": + # test_openai_model() + # test_google_model() + test_azure_openai_model() + # test_deepseek_model() + # test_ollama_model() + # test_deepseek_r1_model() + # test_deepseek_r1_ollama_model() + # test_mistral_model() + # test_ibm_model() + # test_qwen_model() diff --git a/tests/test_playwright.py b/tests/test_playwright.py new file mode 100644 index 0000000..6704a02 --- /dev/null +++ b/tests/test_playwright.py @@ -0,0 +1,31 @@ +import pdb +from dotenv import load_dotenv + +load_dotenv() + + +def test_connect_browser(): + import os + from playwright.sync_api import sync_playwright + + chrome_exe = os.getenv("CHROME_PATH", "") + chrome_use_data = os.getenv("CHROME_USER_DATA", "") + + with sync_playwright() as p: + browser = p.chromium.launch_persistent_context( + user_data_dir=chrome_use_data, + executable_path=chrome_exe, + headless=False # Keep browser window visible + ) + + page = browser.new_page() + page.goto("https://mail.google.com/mail/u/0/#inbox") + page.wait_for_load_state() + + input("Press the Enter key to close the browser...") + + browser.close() + + +if __name__ == '__main__': + test_connect_browser() diff --git a/webui.py b/webui.py new file mode 100644 index 0000000..34e93ab --- /dev/null +++ b/webui.py @@ -0,0 +1,19 @@ +from dotenv import load_dotenv +load_dotenv() +import argparse +from src.webui.interface import theme_map, create_ui + + +def main(): + parser = argparse.ArgumentParser(description="Gradio WebUI for Browser Agent") + parser.add_argument("--ip", type=str, default="127.0.0.1", help="IP address to bind to") + parser.add_argument("--port", type=int, default=7788, help="Port to listen on") + parser.add_argument("--theme", type=str, default="Ocean", choices=theme_map.keys(), help="Theme to use for the UI") + args = parser.parse_args() + + demo = create_ui(theme_name=args.theme) + demo.queue().launch(server_name=args.ip, server_port=args.port) + + +if __name__ == '__main__': + main()