diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 859b86547274..f28865413ddf 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,3 +31,15 @@ repos: hooks: - id: ruff args: ["--fix"] + - repo: https://github.com/codespell-project/codespell + rev: v2.2.6 + hooks: + - id: codespell + args: ["-L", "ans,linar,nam,"] + exclude: | + (?x)^( + pyproject.toml | + website/static/img/ag.svg | + website/yarn.lock | + notebook/.* + )$ diff --git a/autogen/agentchat/conversable_agent.py b/autogen/agentchat/conversable_agent.py index c842c993a47a..0dce81b5ed46 100644 --- a/autogen/agentchat/conversable_agent.py +++ b/autogen/agentchat/conversable_agent.py @@ -694,7 +694,7 @@ def generate_oai_reply( tool_responses = message.get("tool_responses", []) if tool_responses: all_messages += tool_responses - # tool role on the parent message means the content is just concatentation of all of the tool_responses + # tool role on the parent message means the content is just concatenation of all of the tool_responses if message.get("role") != "tool": all_messages.append({key: message[key] for key in message if key != "tool_responses"}) else: @@ -1682,7 +1682,7 @@ def _decorator(func: F) -> F: RuntimeError: if the LLM config is not set up before registering a function. """ - # name can be overwriten by the parameter, by default it is the same as function name + # name can be overwritten by the parameter, by default it is the same as function name if name: func._name = name elif not hasattr(func, "_name"): @@ -1746,7 +1746,7 @@ def _decorator(func: F) -> F: ValueError: if the function description is not provided and not propagated by a previous decorator. """ - # name can be overwriten by the parameter, by default it is the same as function name + # name can be overwritten by the parameter, by default it is the same as function name if name: func._name = name elif not hasattr(func, "_name"): diff --git a/autogen/oai/openai_utils.py b/autogen/oai/openai_utils.py index 42e95d0517c2..eb0b84cf7ed4 100644 --- a/autogen/oai/openai_utils.py +++ b/autogen/oai/openai_utils.py @@ -261,7 +261,7 @@ def config_list_from_models( """ Get a list of configs for API calls with models specified in the model list. - This function extends `config_list_openai_aoai` by allowing to clone its' out for each fof the models provided. + This function extends `config_list_openai_aoai` by allowing to clone its' out for each of the models provided. Each configuration will have a 'model' key with the model name as its value. This is particularly useful when all endpoints have same set of models. diff --git a/notebook/Async_human_input.ipynb b/notebook/Async_human_input.ipynb index 065c62465ca0..dc645f2ee1c8 100644 --- a/notebook/Async_human_input.ipynb +++ b/notebook/Async_human_input.ipynb @@ -1,183 +1,188 @@ { - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [], - "toc_visible": true - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - } - }, "cells": [ { "cell_type": "code", - "execution_count": 26, + "execution_count": 1, "metadata": { - "id": "tLIs1YRdr8jM", "colab": { "base_uri": "https://localhost:8080/" }, + "id": "tLIs1YRdr8jM", "outputId": "909c1c70-1a22-4e9d-b7f4-a40e2d737fb0" }, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ - "Requirement already satisfied: pyautogen==0.2.0 in /usr/local/lib/python3.10/dist-packages (0.2.0)\n", - "Requirement already satisfied: diskcache in /usr/local/lib/python3.10/dist-packages (from pyautogen==0.2.0) (5.6.3)\n", - "Requirement already satisfied: flaml in /usr/local/lib/python3.10/dist-packages (from pyautogen==0.2.0) (2.1.1)\n", - "Requirement already satisfied: openai~=1.2 in /usr/local/lib/python3.10/dist-packages (from pyautogen==0.2.0) (1.3.6)\n", - "Requirement already satisfied: python-dotenv in /usr/local/lib/python3.10/dist-packages (from pyautogen==0.2.0) (1.0.0)\n", - "Requirement already satisfied: termcolor in /usr/local/lib/python3.10/dist-packages (from pyautogen==0.2.0) (2.3.0)\n", - "Requirement already satisfied: tiktoken in /usr/local/lib/python3.10/dist-packages (from pyautogen==0.2.0) (0.5.1)\n", - "Requirement already satisfied: anyio<4,>=3.5.0 in /usr/local/lib/python3.10/dist-packages (from openai~=1.2->pyautogen==0.2.0) (3.7.1)\n", - "Requirement already satisfied: distro<2,>=1.7.0 in /usr/lib/python3/dist-packages (from openai~=1.2->pyautogen==0.2.0) (1.7.0)\n", - "Requirement already satisfied: httpx<1,>=0.23.0 in /usr/local/lib/python3.10/dist-packages (from openai~=1.2->pyautogen==0.2.0) (0.25.2)\n", - "Requirement already satisfied: pydantic<3,>=1.9.0 in /usr/local/lib/python3.10/dist-packages (from openai~=1.2->pyautogen==0.2.0) (1.10.13)\n", - "Requirement already satisfied: sniffio in /usr/local/lib/python3.10/dist-packages (from openai~=1.2->pyautogen==0.2.0) (1.3.0)\n", - "Requirement already satisfied: tqdm>4 in /usr/local/lib/python3.10/dist-packages (from openai~=1.2->pyautogen==0.2.0) (4.66.1)\n", - "Requirement already satisfied: typing-extensions<5,>=4.5 in /usr/local/lib/python3.10/dist-packages (from openai~=1.2->pyautogen==0.2.0) (4.8.0)\n", - "Requirement already satisfied: NumPy>=1.17.0rc1 in /usr/local/lib/python3.10/dist-packages (from flaml->pyautogen==0.2.0) (1.23.5)\n", - "Requirement already satisfied: regex>=2022.1.18 in /usr/local/lib/python3.10/dist-packages (from tiktoken->pyautogen==0.2.0) (2023.6.3)\n", - "Requirement already satisfied: requests>=2.26.0 in /usr/local/lib/python3.10/dist-packages (from tiktoken->pyautogen==0.2.0) (2.31.0)\n", - "Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.5.0->openai~=1.2->pyautogen==0.2.0) (3.4)\n", - "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<4,>=3.5.0->openai~=1.2->pyautogen==0.2.0) (1.1.3)\n", - "Requirement already satisfied: certifi in /usr/local/lib/python3.10/dist-packages (from httpx<1,>=0.23.0->openai~=1.2->pyautogen==0.2.0) (2023.7.22)\n", - "Requirement already satisfied: httpcore==1.* in /usr/local/lib/python3.10/dist-packages (from httpx<1,>=0.23.0->openai~=1.2->pyautogen==0.2.0) (1.0.2)\n", - "Requirement already satisfied: h11<0.15,>=0.13 in /usr/local/lib/python3.10/dist-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai~=1.2->pyautogen==0.2.0) (0.14.0)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken->pyautogen==0.2.0) (3.3.2)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken->pyautogen==0.2.0) (1.26.18)\n", - "Requirement already satisfied: chromadb in /usr/local/lib/python3.10/dist-packages (0.4.18)\n", - "Requirement already satisfied: requests>=2.28 in /usr/local/lib/python3.10/dist-packages (from chromadb) (2.31.0)\n", - "Requirement already satisfied: pydantic>=1.9 in /usr/local/lib/python3.10/dist-packages (from chromadb) (1.10.13)\n", - "Requirement already satisfied: chroma-hnswlib==0.7.3 in /usr/local/lib/python3.10/dist-packages (from chromadb) (0.7.3)\n", - "Requirement already satisfied: fastapi>=0.95.2 in /usr/local/lib/python3.10/dist-packages (from chromadb) (0.104.1)\n", - "Requirement already satisfied: uvicorn[standard]>=0.18.3 in /usr/local/lib/python3.10/dist-packages (from chromadb) (0.24.0.post1)\n", - "Requirement already satisfied: posthog>=2.4.0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (3.0.2)\n", - "Requirement already satisfied: typing-extensions>=4.5.0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (4.8.0)\n", - "Requirement already satisfied: pulsar-client>=3.1.0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (3.3.0)\n", - "Requirement already satisfied: onnxruntime>=1.14.1 in /usr/local/lib/python3.10/dist-packages (from chromadb) (1.16.3)\n", - "Requirement already satisfied: opentelemetry-api>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (1.21.0)\n", - "Requirement already satisfied: opentelemetry-exporter-otlp-proto-grpc>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (1.21.0)\n", - "Requirement already satisfied: opentelemetry-instrumentation-fastapi>=0.41b0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (0.42b0)\n", - "Requirement already satisfied: opentelemetry-sdk>=1.2.0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (1.21.0)\n", - "Requirement already satisfied: tokenizers>=0.13.2 in /usr/local/lib/python3.10/dist-packages (from chromadb) (0.15.0)\n", - "Requirement already satisfied: pypika>=0.48.9 in /usr/local/lib/python3.10/dist-packages (from chromadb) (0.48.9)\n", - "Requirement already satisfied: tqdm>=4.65.0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (4.66.1)\n", - "Requirement already satisfied: overrides>=7.3.1 in /usr/local/lib/python3.10/dist-packages (from chromadb) (7.4.0)\n", - "Requirement already satisfied: importlib-resources in /usr/local/lib/python3.10/dist-packages (from chromadb) (6.1.1)\n", - "Requirement already satisfied: grpcio>=1.58.0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (1.59.2)\n", - "Requirement already satisfied: bcrypt>=4.0.1 in /usr/local/lib/python3.10/dist-packages (from chromadb) (4.1.1)\n", - "Requirement already satisfied: typer>=0.9.0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (0.9.0)\n", - "Requirement already satisfied: kubernetes>=28.1.0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (28.1.0)\n", - "Requirement already satisfied: tenacity>=8.2.3 in /usr/local/lib/python3.10/dist-packages (from chromadb) (8.2.3)\n", - "Requirement already satisfied: PyYAML>=6.0.0 in /usr/local/lib/python3.10/dist-packages (from chromadb) (6.0.1)\n", - "Requirement already satisfied: mmh3>=4.0.1 in /usr/local/lib/python3.10/dist-packages (from chromadb) (4.0.1)\n", - "Requirement already satisfied: numpy>=1.22.5 in /usr/local/lib/python3.10/dist-packages (from chromadb) (1.23.5)\n", - "Requirement already satisfied: anyio<4.0.0,>=3.7.1 in /usr/local/lib/python3.10/dist-packages (from fastapi>=0.95.2->chromadb) (3.7.1)\n", - "Requirement already satisfied: starlette<0.28.0,>=0.27.0 in /usr/local/lib/python3.10/dist-packages (from fastapi>=0.95.2->chromadb) (0.27.0)\n", - "Requirement already satisfied: certifi>=14.05.14 in /usr/local/lib/python3.10/dist-packages (from kubernetes>=28.1.0->chromadb) (2023.7.22)\n", - "Requirement already satisfied: six>=1.9.0 in /usr/local/lib/python3.10/dist-packages (from kubernetes>=28.1.0->chromadb) (1.16.0)\n", - "Requirement already satisfied: python-dateutil>=2.5.3 in /usr/local/lib/python3.10/dist-packages (from kubernetes>=28.1.0->chromadb) (2.8.2)\n", - "Requirement already satisfied: google-auth>=1.0.1 in /usr/local/lib/python3.10/dist-packages (from kubernetes>=28.1.0->chromadb) (2.17.3)\n", - "Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in /usr/local/lib/python3.10/dist-packages (from kubernetes>=28.1.0->chromadb) (1.6.4)\n", - "Requirement already satisfied: requests-oauthlib in /usr/local/lib/python3.10/dist-packages (from kubernetes>=28.1.0->chromadb) (1.3.1)\n", - "Requirement already satisfied: oauthlib>=3.2.2 in /usr/local/lib/python3.10/dist-packages (from kubernetes>=28.1.0->chromadb) (3.2.2)\n", - "Requirement already satisfied: urllib3<2.0,>=1.24.2 in /usr/local/lib/python3.10/dist-packages (from kubernetes>=28.1.0->chromadb) (1.26.18)\n", - "Requirement already satisfied: coloredlogs in /usr/local/lib/python3.10/dist-packages (from onnxruntime>=1.14.1->chromadb) (15.0.1)\n", - "Requirement already satisfied: flatbuffers in /usr/local/lib/python3.10/dist-packages (from onnxruntime>=1.14.1->chromadb) (23.5.26)\n", - "Requirement already satisfied: packaging in /usr/local/lib/python3.10/dist-packages (from onnxruntime>=1.14.1->chromadb) (23.2)\n", - "Requirement already satisfied: protobuf in /usr/local/lib/python3.10/dist-packages (from onnxruntime>=1.14.1->chromadb) (3.20.3)\n", - "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from onnxruntime>=1.14.1->chromadb) (1.12)\n", - "Requirement already satisfied: deprecated>=1.2.6 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-api>=1.2.0->chromadb) (1.2.14)\n", - "Requirement already satisfied: importlib-metadata<7.0,>=6.0 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-api>=1.2.0->chromadb) (6.8.0)\n", - "Requirement already satisfied: backoff<3.0.0,>=1.10.0 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (2.2.1)\n", - "Requirement already satisfied: googleapis-common-protos~=1.52 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.61.0)\n", - "Requirement already satisfied: opentelemetry-exporter-otlp-proto-common==1.21.0 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.21.0)\n", - "Requirement already satisfied: opentelemetry-proto==1.21.0 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.21.0)\n", - "Requirement already satisfied: opentelemetry-instrumentation-asgi==0.42b0 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.42b0)\n", - "Requirement already satisfied: opentelemetry-instrumentation==0.42b0 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.42b0)\n", - "Requirement already satisfied: opentelemetry-semantic-conventions==0.42b0 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.42b0)\n", - "Requirement already satisfied: opentelemetry-util-http==0.42b0 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.42b0)\n", - "Requirement already satisfied: setuptools>=16.0 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-instrumentation==0.42b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (67.7.2)\n", - "Requirement already satisfied: wrapt<2.0.0,>=1.0.0 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-instrumentation==0.42b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (1.14.1)\n", - "Requirement already satisfied: asgiref~=3.0 in /usr/local/lib/python3.10/dist-packages (from opentelemetry-instrumentation-asgi==0.42b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (3.7.2)\n", - "Requirement already satisfied: monotonic>=1.5 in /usr/local/lib/python3.10/dist-packages (from posthog>=2.4.0->chromadb) (1.6)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.28->chromadb) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.28->chromadb) (3.4)\n", - "Requirement already satisfied: huggingface_hub<1.0,>=0.16.4 in /usr/local/lib/python3.10/dist-packages (from tokenizers>=0.13.2->chromadb) (0.19.4)\n", - "Requirement already satisfied: click<9.0.0,>=7.1.1 in /usr/local/lib/python3.10/dist-packages (from typer>=0.9.0->chromadb) (8.1.7)\n", - "Requirement already satisfied: h11>=0.8 in /usr/local/lib/python3.10/dist-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.14.0)\n", - "Requirement already satisfied: httptools>=0.5.0 in /usr/local/lib/python3.10/dist-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.6.1)\n", - "Requirement already satisfied: python-dotenv>=0.13 in /usr/local/lib/python3.10/dist-packages (from uvicorn[standard]>=0.18.3->chromadb) (1.0.0)\n", - "Requirement already satisfied: uvloop!=0.15.0,!=0.15.1,>=0.14.0 in /usr/local/lib/python3.10/dist-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.19.0)\n", - "Requirement already satisfied: watchfiles>=0.13 in /usr/local/lib/python3.10/dist-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.21.0)\n", - "Requirement already satisfied: websockets>=10.4 in /usr/local/lib/python3.10/dist-packages (from uvicorn[standard]>=0.18.3->chromadb) (12.0)\n", - "Requirement already satisfied: sniffio>=1.1 in /usr/local/lib/python3.10/dist-packages (from anyio<4.0.0,>=3.7.1->fastapi>=0.95.2->chromadb) (1.3.0)\n", - "Requirement already satisfied: exceptiongroup in /usr/local/lib/python3.10/dist-packages (from anyio<4.0.0,>=3.7.1->fastapi>=0.95.2->chromadb) (1.1.3)\n", - "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (5.3.2)\n", - "Requirement already satisfied: pyasn1-modules>=0.2.1 in /usr/local/lib/python3.10/dist-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.3.0)\n", - "Requirement already satisfied: rsa<5,>=3.1.4 in /usr/local/lib/python3.10/dist-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (4.9)\n", - "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface_hub<1.0,>=0.16.4->tokenizers>=0.13.2->chromadb) (3.13.1)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface_hub<1.0,>=0.16.4->tokenizers>=0.13.2->chromadb) (2023.6.0)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.10/dist-packages (from importlib-metadata<7.0,>=6.0->opentelemetry-api>=1.2.0->chromadb) (3.17.0)\n", - "Requirement already satisfied: humanfriendly>=9.1 in /usr/local/lib/python3.10/dist-packages (from coloredlogs->onnxruntime>=1.14.1->chromadb) (10.0)\n", - "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->onnxruntime>=1.14.1->chromadb) (1.3.0)\n", - "Requirement already satisfied: pyasn1<0.6.0,>=0.4.6 in /usr/local/lib/python3.10/dist-packages (from pyasn1-modules>=0.2.1->google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.5.0)\n", - "Requirement already satisfied: sentence_transformers in /usr/local/lib/python3.10/dist-packages (2.2.2)\n", - "Requirement already satisfied: transformers<5.0.0,>=4.6.0 in /usr/local/lib/python3.10/dist-packages (from sentence_transformers) (4.35.2)\n", - "Requirement already satisfied: tqdm in /usr/local/lib/python3.10/dist-packages (from sentence_transformers) (4.66.1)\n", - "Requirement already satisfied: torch>=1.6.0 in /usr/local/lib/python3.10/dist-packages (from sentence_transformers) (2.1.0+cu118)\n", - "Requirement already satisfied: torchvision in /usr/local/lib/python3.10/dist-packages (from sentence_transformers) (0.16.0+cu118)\n", - "Requirement already satisfied: numpy in /usr/local/lib/python3.10/dist-packages (from sentence_transformers) (1.23.5)\n", - "Requirement already satisfied: scikit-learn in /usr/local/lib/python3.10/dist-packages (from sentence_transformers) (1.2.2)\n", - "Requirement already satisfied: scipy in /usr/local/lib/python3.10/dist-packages (from sentence_transformers) (1.11.3)\n", - "Requirement already satisfied: nltk in /usr/local/lib/python3.10/dist-packages (from sentence_transformers) (3.8.1)\n", - "Requirement already satisfied: sentencepiece in /usr/local/lib/python3.10/dist-packages (from sentence_transformers) (0.1.99)\n", - "Requirement already satisfied: huggingface-hub>=0.4.0 in /usr/local/lib/python3.10/dist-packages (from sentence_transformers) (0.19.4)\n", - "Requirement already satisfied: filelock in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (3.13.1)\n", - "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (2023.6.0)\n", - "Requirement already satisfied: requests in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (2.31.0)\n", - "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (6.0.1)\n", - "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (4.8.0)\n", - "Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.10/dist-packages (from huggingface-hub>=0.4.0->sentence_transformers) (23.2)\n", - "Requirement already satisfied: sympy in /usr/local/lib/python3.10/dist-packages (from torch>=1.6.0->sentence_transformers) (1.12)\n", - "Requirement already satisfied: networkx in /usr/local/lib/python3.10/dist-packages (from torch>=1.6.0->sentence_transformers) (3.2.1)\n", - "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/dist-packages (from torch>=1.6.0->sentence_transformers) (3.1.2)\n", - "Requirement already satisfied: triton==2.1.0 in /usr/local/lib/python3.10/dist-packages (from torch>=1.6.0->sentence_transformers) (2.1.0)\n", - "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.10/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (2023.6.3)\n", - "Requirement already satisfied: tokenizers<0.19,>=0.14 in /usr/local/lib/python3.10/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (0.15.0)\n", - "Requirement already satisfied: safetensors>=0.3.1 in /usr/local/lib/python3.10/dist-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (0.4.0)\n", - "Requirement already satisfied: click in /usr/local/lib/python3.10/dist-packages (from nltk->sentence_transformers) (8.1.7)\n", - "Requirement already satisfied: joblib in /usr/local/lib/python3.10/dist-packages (from nltk->sentence_transformers) (1.3.2)\n", - "Requirement already satisfied: threadpoolctl>=2.0.0 in /usr/local/lib/python3.10/dist-packages (from scikit-learn->sentence_transformers) (3.2.0)\n", - "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /usr/local/lib/python3.10/dist-packages (from torchvision->sentence_transformers) (9.4.0)\n", - "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/dist-packages (from jinja2->torch>=1.6.0->sentence_transformers) (2.1.3)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (3.4)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (1.26.18)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (2023.7.22)\n", - "Requirement already satisfied: mpmath>=0.19 in /usr/local/lib/python3.10/dist-packages (from sympy->torch>=1.6.0->sentence_transformers) (1.3.0)\n", - "Requirement already satisfied: tiktoken in /usr/local/lib/python3.10/dist-packages (0.5.1)\n", - "Requirement already satisfied: regex>=2022.1.18 in /usr/local/lib/python3.10/dist-packages (from tiktoken) (2023.6.3)\n", - "Requirement already satisfied: requests>=2.26.0 in /usr/local/lib/python3.10/dist-packages (from tiktoken) (2.31.0)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken) (3.4)\n", - "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken) (1.26.18)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/dist-packages (from requests>=2.26.0->tiktoken) (2023.7.22)\n", - "Requirement already satisfied: pypdf in /usr/local/lib/python3.10/dist-packages (3.17.1)\n" + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: pyautogen>=0.2.3 in /home/vscode/.local/lib/python3.10/site-packages (0.2.3)\n", + "Requirement already satisfied: openai>=1.3 in /home/vscode/.local/lib/python3.10/site-packages (from pyautogen>=0.2.3) (1.6.1)\n", + "Requirement already satisfied: diskcache in /home/vscode/.local/lib/python3.10/site-packages (from pyautogen>=0.2.3) (5.6.3)\n", + "Requirement already satisfied: termcolor in /home/vscode/.local/lib/python3.10/site-packages (from pyautogen>=0.2.3) (2.4.0)\n", + "Requirement already satisfied: flaml in /home/vscode/.local/lib/python3.10/site-packages (from pyautogen>=0.2.3) (2.1.1)\n", + "Requirement already satisfied: python-dotenv in /home/vscode/.local/lib/python3.10/site-packages (from pyautogen>=0.2.3) (1.0.0)\n", + "Requirement already satisfied: tiktoken in /home/vscode/.local/lib/python3.10/site-packages (from pyautogen>=0.2.3) (0.5.2)\n", + "Requirement already satisfied: pydantic<3,>=1.10 in /home/vscode/.local/lib/python3.10/site-packages (from pyautogen>=0.2.3) (1.10.9)\n", + "Requirement already satisfied: anyio<5,>=3.5.0 in /home/vscode/.local/lib/python3.10/site-packages (from openai>=1.3->pyautogen>=0.2.3) (4.2.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /home/vscode/.local/lib/python3.10/site-packages (from openai>=1.3->pyautogen>=0.2.3) (1.9.0)\n", + "Requirement already satisfied: httpx<1,>=0.23.0 in /home/vscode/.local/lib/python3.10/site-packages (from openai>=1.3->pyautogen>=0.2.3) (0.26.0)\n", + "Requirement already satisfied: sniffio in /home/vscode/.local/lib/python3.10/site-packages (from openai>=1.3->pyautogen>=0.2.3) (1.3.0)\n", + "Requirement already satisfied: tqdm>4 in /home/vscode/.local/lib/python3.10/site-packages (from openai>=1.3->pyautogen>=0.2.3) (4.66.1)\n", + "Requirement already satisfied: typing-extensions<5,>=4.7 in /home/vscode/.local/lib/python3.10/site-packages (from openai>=1.3->pyautogen>=0.2.3) (4.9.0)\n", + "Requirement already satisfied: NumPy>=1.17.0rc1 in /home/vscode/.local/lib/python3.10/site-packages (from flaml->pyautogen>=0.2.3) (1.26.3)\n", + "Requirement already satisfied: regex>=2022.1.18 in /home/vscode/.local/lib/python3.10/site-packages (from tiktoken->pyautogen>=0.2.3) (2023.12.25)\n", + "Requirement already satisfied: requests>=2.26.0 in /usr/local/lib/python3.10/site-packages (from tiktoken->pyautogen>=0.2.3) (2.31.0)\n", + "Requirement already satisfied: idna>=2.8 in /usr/local/lib/python3.10/site-packages (from anyio<5,>=3.5.0->openai>=1.3->pyautogen>=0.2.3) (3.6)\n", + "Requirement already satisfied: exceptiongroup>=1.0.2 in /home/vscode/.local/lib/python3.10/site-packages (from anyio<5,>=3.5.0->openai>=1.3->pyautogen>=0.2.3) (1.2.0)\n", + "Requirement already satisfied: certifi in /usr/local/lib/python3.10/site-packages (from httpx<1,>=0.23.0->openai>=1.3->pyautogen>=0.2.3) (2023.11.17)\n", + "Requirement already satisfied: httpcore==1.* in /home/vscode/.local/lib/python3.10/site-packages (from httpx<1,>=0.23.0->openai>=1.3->pyautogen>=0.2.3) (1.0.2)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /home/vscode/.local/lib/python3.10/site-packages (from httpcore==1.*->httpx<1,>=0.23.0->openai>=1.3->pyautogen>=0.2.3) (0.14.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/site-packages (from requests>=2.26.0->tiktoken->pyautogen>=0.2.3) (3.3.2)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/vscode/.local/lib/python3.10/site-packages (from requests>=2.26.0->tiktoken->pyautogen>=0.2.3) (1.26.18)\n", + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: chromadb in /home/vscode/.local/lib/python3.10/site-packages (0.4.22)\n", + "Requirement already satisfied: build>=1.0.3 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (1.0.3)\n", + "Requirement already satisfied: requests>=2.28 in /usr/local/lib/python3.10/site-packages (from chromadb) (2.31.0)\n", + "Requirement already satisfied: pydantic>=1.9 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (1.10.9)\n", + "Requirement already satisfied: chroma-hnswlib==0.7.3 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (0.7.3)\n", + "Requirement already satisfied: fastapi>=0.95.2 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (0.108.0)\n", + "Requirement already satisfied: uvicorn>=0.18.3 in /home/vscode/.local/lib/python3.10/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.25.0)\n", + "Requirement already satisfied: numpy>=1.22.5 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (1.26.3)\n", + "Requirement already satisfied: posthog>=2.4.0 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (3.1.0)\n", + "Requirement already satisfied: typing-extensions>=4.5.0 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (4.9.0)\n", + "Requirement already satisfied: pulsar-client>=3.1.0 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (3.4.0)\n", + "Requirement already satisfied: onnxruntime>=1.14.1 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (1.16.3)\n", + "Requirement already satisfied: opentelemetry-api>=1.2.0 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (1.22.0)\n", + "Requirement already satisfied: opentelemetry-exporter-otlp-proto-grpc>=1.2.0 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (1.22.0)\n", + "Requirement already satisfied: opentelemetry-instrumentation-fastapi>=0.41b0 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (0.43b0)\n", + "Requirement already satisfied: opentelemetry-sdk>=1.2.0 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (1.22.0)\n", + "Requirement already satisfied: tokenizers>=0.13.2 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (0.15.0)\n", + "Requirement already satisfied: pypika>=0.48.9 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (0.48.9)\n", + "Requirement already satisfied: tqdm>=4.65.0 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (4.66.1)\n", + "Requirement already satisfied: overrides>=7.3.1 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (7.4.0)\n", + "Requirement already satisfied: importlib-resources in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (6.1.1)\n", + "Requirement already satisfied: grpcio>=1.58.0 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (1.60.0)\n", + "Requirement already satisfied: bcrypt>=4.0.1 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (4.1.2)\n", + "Requirement already satisfied: typer>=0.9.0 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (0.9.0)\n", + "Requirement already satisfied: kubernetes>=28.1.0 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (28.1.0)\n", + "Requirement already satisfied: tenacity>=8.2.3 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (8.2.3)\n", + "Requirement already satisfied: PyYAML>=6.0.0 in /usr/local/lib/python3.10/site-packages (from chromadb) (6.0.1)\n", + "Requirement already satisfied: mmh3>=4.0.1 in /home/vscode/.local/lib/python3.10/site-packages (from chromadb) (4.0.1)\n", + "Requirement already satisfied: packaging>=19.0 in /usr/local/lib/python3.10/site-packages (from build>=1.0.3->chromadb) (23.2)\n", + "Requirement already satisfied: pyproject_hooks in /home/vscode/.local/lib/python3.10/site-packages (from build>=1.0.3->chromadb) (1.0.0)\n", + "Requirement already satisfied: tomli>=1.1.0 in /usr/local/lib/python3.10/site-packages (from build>=1.0.3->chromadb) (2.0.1)\n", + "Requirement already satisfied: starlette<0.33.0,>=0.29.0 in /home/vscode/.local/lib/python3.10/site-packages (from fastapi>=0.95.2->chromadb) (0.32.0.post1)\n", + "Requirement already satisfied: certifi>=14.05.14 in /usr/local/lib/python3.10/site-packages (from kubernetes>=28.1.0->chromadb) (2023.11.17)\n", + "Requirement already satisfied: six>=1.9.0 in /home/vscode/.local/lib/python3.10/site-packages (from kubernetes>=28.1.0->chromadb) (1.16.0)\n", + "Requirement already satisfied: python-dateutil>=2.5.3 in /home/vscode/.local/lib/python3.10/site-packages (from kubernetes>=28.1.0->chromadb) (2.8.2)\n", + "Requirement already satisfied: google-auth>=1.0.1 in /home/vscode/.local/lib/python3.10/site-packages (from kubernetes>=28.1.0->chromadb) (2.26.1)\n", + "Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in /home/vscode/.local/lib/python3.10/site-packages (from kubernetes>=28.1.0->chromadb) (1.7.0)\n", + "Requirement already satisfied: requests-oauthlib in /home/vscode/.local/lib/python3.10/site-packages (from kubernetes>=28.1.0->chromadb) (1.3.1)\n", + "Requirement already satisfied: oauthlib>=3.2.2 in /home/vscode/.local/lib/python3.10/site-packages (from kubernetes>=28.1.0->chromadb) (3.2.2)\n", + "Requirement already satisfied: urllib3<2.0,>=1.24.2 in /home/vscode/.local/lib/python3.10/site-packages (from kubernetes>=28.1.0->chromadb) (1.26.18)\n", + "Requirement already satisfied: coloredlogs in /home/vscode/.local/lib/python3.10/site-packages (from onnxruntime>=1.14.1->chromadb) (15.0.1)\n", + "Requirement already satisfied: flatbuffers in /home/vscode/.local/lib/python3.10/site-packages (from onnxruntime>=1.14.1->chromadb) (23.5.26)\n", + "Requirement already satisfied: protobuf in /home/vscode/.local/lib/python3.10/site-packages (from onnxruntime>=1.14.1->chromadb) (4.25.1)\n", + "Requirement already satisfied: sympy in /home/vscode/.local/lib/python3.10/site-packages (from onnxruntime>=1.14.1->chromadb) (1.12)\n", + "Requirement already satisfied: deprecated>=1.2.6 in /usr/local/lib/python3.10/site-packages (from opentelemetry-api>=1.2.0->chromadb) (1.2.14)\n", + "Requirement already satisfied: importlib-metadata<7.0,>=6.0 in /home/vscode/.local/lib/python3.10/site-packages (from opentelemetry-api>=1.2.0->chromadb) (6.11.0)\n", + "Requirement already satisfied: backoff<3.0.0,>=1.10.0 in /home/vscode/.local/lib/python3.10/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (2.2.1)\n", + "Requirement already satisfied: googleapis-common-protos~=1.52 in /home/vscode/.local/lib/python3.10/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.62.0)\n", + "Requirement already satisfied: opentelemetry-exporter-otlp-proto-common==1.22.0 in /home/vscode/.local/lib/python3.10/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.22.0)\n", + "Requirement already satisfied: opentelemetry-proto==1.22.0 in /home/vscode/.local/lib/python3.10/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb) (1.22.0)\n", + "Requirement already satisfied: opentelemetry-instrumentation-asgi==0.43b0 in /home/vscode/.local/lib/python3.10/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.43b0)\n", + "Requirement already satisfied: opentelemetry-instrumentation==0.43b0 in /home/vscode/.local/lib/python3.10/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.43b0)\n", + "Requirement already satisfied: opentelemetry-semantic-conventions==0.43b0 in /home/vscode/.local/lib/python3.10/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.43b0)\n", + "Requirement already satisfied: opentelemetry-util-http==0.43b0 in /home/vscode/.local/lib/python3.10/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (0.43b0)\n", + "Requirement already satisfied: setuptools>=16.0 in /usr/local/lib/python3.10/site-packages (from opentelemetry-instrumentation==0.43b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (69.0.2)\n", + "Requirement already satisfied: wrapt<2.0.0,>=1.0.0 in /usr/local/lib/python3.10/site-packages (from opentelemetry-instrumentation==0.43b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (1.16.0)\n", + "Requirement already satisfied: asgiref~=3.0 in /home/vscode/.local/lib/python3.10/site-packages (from opentelemetry-instrumentation-asgi==0.43b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb) (3.7.2)\n", + "Requirement already satisfied: monotonic>=1.5 in /home/vscode/.local/lib/python3.10/site-packages (from posthog>=2.4.0->chromadb) (1.6)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/site-packages (from requests>=2.28->chromadb) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/site-packages (from requests>=2.28->chromadb) (3.6)\n", + "Requirement already satisfied: huggingface_hub<1.0,>=0.16.4 in /home/vscode/.local/lib/python3.10/site-packages (from tokenizers>=0.13.2->chromadb) (0.20.2)\n", + "Requirement already satisfied: click<9.0.0,>=7.1.1 in /usr/local/lib/python3.10/site-packages (from typer>=0.9.0->chromadb) (8.1.7)\n", + "Requirement already satisfied: h11>=0.8 in /home/vscode/.local/lib/python3.10/site-packages (from uvicorn>=0.18.3->uvicorn[standard]>=0.18.3->chromadb) (0.14.0)\n", + "Requirement already satisfied: httptools>=0.5.0 in /home/vscode/.local/lib/python3.10/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.6.1)\n", + "Requirement already satisfied: python-dotenv>=0.13 in /home/vscode/.local/lib/python3.10/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (1.0.0)\n", + "Requirement already satisfied: uvloop!=0.15.0,!=0.15.1,>=0.14.0 in /home/vscode/.local/lib/python3.10/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.19.0)\n", + "Requirement already satisfied: watchfiles>=0.13 in /home/vscode/.local/lib/python3.10/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (0.21.0)\n", + "Requirement already satisfied: websockets>=10.4 in /home/vscode/.local/lib/python3.10/site-packages (from uvicorn[standard]>=0.18.3->chromadb) (12.0)\n", + "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /home/vscode/.local/lib/python3.10/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (5.3.2)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /home/vscode/.local/lib/python3.10/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.3.0)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /home/vscode/.local/lib/python3.10/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (4.9)\n", + "Requirement already satisfied: filelock in /home/vscode/.local/lib/python3.10/site-packages (from huggingface_hub<1.0,>=0.16.4->tokenizers>=0.13.2->chromadb) (3.13.1)\n", + "Requirement already satisfied: fsspec>=2023.5.0 in /home/vscode/.local/lib/python3.10/site-packages (from huggingface_hub<1.0,>=0.16.4->tokenizers>=0.13.2->chromadb) (2023.12.2)\n", + "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.10/site-packages (from importlib-metadata<7.0,>=6.0->opentelemetry-api>=1.2.0->chromadb) (3.17.0)\n", + "Requirement already satisfied: anyio<5,>=3.4.0 in /home/vscode/.local/lib/python3.10/site-packages (from starlette<0.33.0,>=0.29.0->fastapi>=0.95.2->chromadb) (4.2.0)\n", + "Requirement already satisfied: humanfriendly>=9.1 in /home/vscode/.local/lib/python3.10/site-packages (from coloredlogs->onnxruntime>=1.14.1->chromadb) (10.0)\n", + "Requirement already satisfied: mpmath>=0.19 in /home/vscode/.local/lib/python3.10/site-packages (from sympy->onnxruntime>=1.14.1->chromadb) (1.3.0)\n", + "Requirement already satisfied: sniffio>=1.1 in /home/vscode/.local/lib/python3.10/site-packages (from anyio<5,>=3.4.0->starlette<0.33.0,>=0.29.0->fastapi>=0.95.2->chromadb) (1.3.0)\n", + "Requirement already satisfied: exceptiongroup>=1.0.2 in /home/vscode/.local/lib/python3.10/site-packages (from anyio<5,>=3.4.0->starlette<0.33.0,>=0.29.0->fastapi>=0.95.2->chromadb) (1.2.0)\n", + "Requirement already satisfied: pyasn1<0.6.0,>=0.4.6 in /home/vscode/.local/lib/python3.10/site-packages (from pyasn1-modules>=0.2.1->google-auth>=1.0.1->kubernetes>=28.1.0->chromadb) (0.5.1)\n", + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: sentence_transformers in /home/vscode/.local/lib/python3.10/site-packages (2.2.2)\n", + "Requirement already satisfied: transformers<5.0.0,>=4.6.0 in /home/vscode/.local/lib/python3.10/site-packages (from sentence_transformers) (4.36.2)\n", + "Requirement already satisfied: tqdm in /home/vscode/.local/lib/python3.10/site-packages (from sentence_transformers) (4.66.1)\n", + "Requirement already satisfied: torch>=1.6.0 in /home/vscode/.local/lib/python3.10/site-packages (from sentence_transformers) (2.1.2)\n", + "Requirement already satisfied: torchvision in /home/vscode/.local/lib/python3.10/site-packages (from sentence_transformers) (0.16.2)\n", + "Requirement already satisfied: numpy in /home/vscode/.local/lib/python3.10/site-packages (from sentence_transformers) (1.26.3)\n", + "Requirement already satisfied: scikit-learn in /home/vscode/.local/lib/python3.10/site-packages (from sentence_transformers) (1.3.2)\n", + "Requirement already satisfied: scipy in /home/vscode/.local/lib/python3.10/site-packages (from sentence_transformers) (1.11.4)\n", + "Requirement already satisfied: nltk in /home/vscode/.local/lib/python3.10/site-packages (from sentence_transformers) (3.8.1)\n", + "Requirement already satisfied: sentencepiece in /home/vscode/.local/lib/python3.10/site-packages (from sentence_transformers) (0.1.99)\n", + "Requirement already satisfied: huggingface-hub>=0.4.0 in /home/vscode/.local/lib/python3.10/site-packages (from sentence_transformers) (0.20.2)\n", + "Requirement already satisfied: filelock in /home/vscode/.local/lib/python3.10/site-packages (from huggingface-hub>=0.4.0->sentence_transformers) (3.13.1)\n", + "Requirement already satisfied: fsspec>=2023.5.0 in /home/vscode/.local/lib/python3.10/site-packages (from huggingface-hub>=0.4.0->sentence_transformers) (2023.12.2)\n", + "Requirement already satisfied: requests in /usr/local/lib/python3.10/site-packages (from huggingface-hub>=0.4.0->sentence_transformers) (2.31.0)\n", + "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.10/site-packages (from huggingface-hub>=0.4.0->sentence_transformers) (6.0.1)\n", + "Requirement already satisfied: typing-extensions>=3.7.4.3 in /home/vscode/.local/lib/python3.10/site-packages (from huggingface-hub>=0.4.0->sentence_transformers) (4.9.0)\n", + "Requirement already satisfied: packaging>=20.9 in /usr/local/lib/python3.10/site-packages (from huggingface-hub>=0.4.0->sentence_transformers) (23.2)\n", + "Requirement already satisfied: sympy in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (1.12)\n", + "Requirement already satisfied: networkx in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (3.2.1)\n", + "Requirement already satisfied: jinja2 in /usr/local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (3.1.2)\n", + "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (12.1.105)\n", + "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (12.1.105)\n", + "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (12.1.105)\n", + "Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (8.9.2.26)\n", + "Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (12.1.3.1)\n", + "Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (11.0.2.54)\n", + "Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (10.3.2.106)\n", + "Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (11.4.5.107)\n", + "Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (12.1.0.106)\n", + "Requirement already satisfied: nvidia-nccl-cu12==2.18.1 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (2.18.1)\n", + "Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (12.1.105)\n", + "Requirement already satisfied: triton==2.1.0 in /home/vscode/.local/lib/python3.10/site-packages (from torch>=1.6.0->sentence_transformers) (2.1.0)\n", + "Requirement already satisfied: nvidia-nvjitlink-cu12 in /home/vscode/.local/lib/python3.10/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.6.0->sentence_transformers) (12.3.101)\n", + "Requirement already satisfied: regex!=2019.12.17 in /home/vscode/.local/lib/python3.10/site-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (2023.12.25)\n", + "Requirement already satisfied: tokenizers<0.19,>=0.14 in /home/vscode/.local/lib/python3.10/site-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (0.15.0)\n", + "Requirement already satisfied: safetensors>=0.3.1 in /home/vscode/.local/lib/python3.10/site-packages (from transformers<5.0.0,>=4.6.0->sentence_transformers) (0.4.1)\n", + "Requirement already satisfied: click in /usr/local/lib/python3.10/site-packages (from nltk->sentence_transformers) (8.1.7)\n", + "Requirement already satisfied: joblib in /home/vscode/.local/lib/python3.10/site-packages (from nltk->sentence_transformers) (1.3.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /home/vscode/.local/lib/python3.10/site-packages (from scikit-learn->sentence_transformers) (3.2.0)\n", + "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /home/vscode/.local/lib/python3.10/site-packages (from torchvision->sentence_transformers) (10.2.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.10/site-packages (from jinja2->torch>=1.6.0->sentence_transformers) (2.1.3)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/site-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/site-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/vscode/.local/lib/python3.10/site-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (1.26.18)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/site-packages (from requests->huggingface-hub>=0.4.0->sentence_transformers) (2023.11.17)\n", + "Requirement already satisfied: mpmath>=0.19 in /home/vscode/.local/lib/python3.10/site-packages (from sympy->torch>=1.6.0->sentence_transformers) (1.3.0)\n", + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: tiktoken in /home/vscode/.local/lib/python3.10/site-packages (0.5.2)\n", + "Requirement already satisfied: regex>=2022.1.18 in /home/vscode/.local/lib/python3.10/site-packages (from tiktoken) (2023.12.25)\n", + "Requirement already satisfied: requests>=2.26.0 in /usr/local/lib/python3.10/site-packages (from tiktoken) (2.31.0)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.10/site-packages (from requests>=2.26.0->tiktoken) (3.3.2)\n", + "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.10/site-packages (from requests>=2.26.0->tiktoken) (3.6)\n", + "Requirement already satisfied: urllib3<3,>=1.21.1 in /home/vscode/.local/lib/python3.10/site-packages (from requests>=2.26.0->tiktoken) (1.26.18)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.10/site-packages (from requests>=2.26.0->tiktoken) (2023.11.17)\n", + "Defaulting to user installation because normal site-packages is not writeable\n", + "Requirement already satisfied: pypdf in /home/vscode/.local/lib/python3.10/site-packages (3.17.4)\n" ] } ], "source": [ - "!pip install pyautogen==0.2.0\n", + "!pip install \"pyautogen>=0.2.3\"\n", "!pip install chromadb\n", "!pip install sentence_transformers\n", "!pip install tiktoken\n", @@ -186,19 +191,24 @@ }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "yU8zQPetsW28" + }, + "outputs": [], "source": [ "from autogen import AssistantAgent\n", "from autogen.agentchat.contrib.retrieve_user_proxy_agent import RetrieveUserProxyAgent\n", "from autogen.agentchat.user_proxy_agent import UserProxyAgent" - ], - "metadata": { - "id": "yU8zQPetsW28" - }, - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "R2ITRFQisgzI" + }, + "outputs": [], "source": [ "from typing import Callable, Dict, Optional, Union, List, Tuple, Any\n", "import asyncio\n", @@ -255,15 +265,15 @@ " await super().a_receive(message, sender, request_reply, silent)\n", "\n", "\n" - ], - "metadata": { - "id": "R2ITRFQisgzI" - }, - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "code", + "execution_count": null, + "metadata": { + "id": "2v_DhqBFuA1O" + }, + "outputs": [], "source": [ "def create_llm_config(model, temperature, seed):\n", " config_list = [\n", @@ -280,18 +290,11 @@ " }\n", "\n", " return llm_config\n" - ], - "metadata": { - "id": "2v_DhqBFuA1O" - }, - "execution_count": null, - "outputs": [] + ] }, { "cell_type": "code", - "source": [ - "!pip install nest-asyncio" - ], + "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" @@ -299,53 +302,29 @@ "id": "yHIUO2CiwfIp", "outputId": "79ceccca-f91c-4dde-9e21-1f2129cdc1a8" }, - "execution_count": null, "outputs": [ { - "output_type": "stream", "name": "stdout", + "output_type": "stream", "text": [ "Requirement already satisfied: nest-asyncio in /usr/local/lib/python3.10/dist-packages (1.5.8)\n" ] } + ], + "source": [ + "!pip install nest-asyncio" ] }, { "cell_type": "code", - "source": [ - "import nest_asyncio\n", - "nest_asyncio.apply()\n", - "\n", - "async def main():\n", - " boss = CustomisedUserProxyAgent(\n", - " name=\"boss\",\n", - " human_input_mode=\"ALWAYS\",\n", - " max_consecutive_auto_reply=0,\n", - " code_execution_config=False,\n", - " )\n", - "\n", - " assistant = CustomisedAssistantAgent(\n", - " name=\"assistant\",\n", - " system_message=\"You will provide some agenda, and I will create questions for an interview meeting.Everytime when you generate question then you have to ask user for feedback and if user provides the feedback then you have to incorporate that feedback and generate new set of questions and if user don't want to update then terminate the process and exit\",\n", - " llm_config=create_llm_config(\"gpt-4\", \"0.4\", \"23\"),\n", - " )\n", - "\n", - " await boss.a_initiate_chat(\n", - " assistant,\n", - " message=\"Resume Review, Technical Skills Assessment, Project Discussion, Job Role Expectations, Closing Remarks.\",\n", - " n_results=3,\n", - " )\n", - "\n", - "await main()" - ], + "execution_count": 25, "metadata": { - "id": "ywFsRNMDteaH", "colab": { "base_uri": "https://localhost:8080/" }, + "id": "ywFsRNMDteaH", "outputId": "5716adad-de80-4595-eec9-523b1f1cd313" }, - "execution_count": 25, "outputs": [ { "name": "stdout", @@ -370,7 +349,57 @@ "Provide feedback to assistant. Press enter to skip and use auto-reply, or type 'exit' to end the conversation: exit\n" ] } + ], + "source": [ + "import nest_asyncio\n", + "nest_asyncio.apply()\n", + "\n", + "async def main():\n", + " boss = CustomisedUserProxyAgent(\n", + " name=\"boss\",\n", + " human_input_mode=\"ALWAYS\",\n", + " max_consecutive_auto_reply=0,\n", + " code_execution_config=False,\n", + " )\n", + "\n", + " assistant = CustomisedAssistantAgent(\n", + " name=\"assistant\",\n", + " system_message=\"You will provide some agenda, and I will create questions for an interview meeting. Every time when you generate question then you have to ask user for feedback and if user provides the feedback then you have to incorporate that feedback and generate new set of questions and if user don't want to update then terminate the process and exit\",\n", + " llm_config=create_llm_config(\"gpt-4\", \"0.4\", \"23\"),\n", + " )\n", + "\n", + " await boss.a_initiate_chat(\n", + " assistant,\n", + " message=\"Resume Review, Technical Skills Assessment, Project Discussion, Job Role Expectations, Closing Remarks.\",\n", + " n_results=3,\n", + " )\n", + "\n", + "await main()" ] } - ] + ], + "metadata": { + "colab": { + "provenance": [], + "toc_visible": true + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/notebook/agentchat_MathChat.ipynb b/notebook/agentchat_MathChat.ipynb index 4159784bccf4..92a9b39cd13f 100644 --- a/notebook/agentchat_MathChat.ipynb +++ b/notebook/agentchat_MathChat.ipynb @@ -117,7 +117,7 @@ "source": [ "## Construct agents for MathChat\n", "\n", - "We start by initialzing the `AssistantAgent` and `MathUserProxyAgent`. The system message needs to be set to \"You are a helpful assistant.\" for MathChat. The detailed instructions are given in the user message. Later we will use the `MathUserProxyAgent.generate_init_message` to combine the instructions and a math problem for an initial message to be sent to the LLM assistant." + "We start by initializing the `AssistantAgent` and `MathUserProxyAgent`. The system message needs to be set to \"You are a helpful assistant.\" for MathChat. The detailed instructions are given in the user message. Later we will use the `MathUserProxyAgent.generate_init_message` to combine the instructions and a math problem for an initial message to be sent to the LLM assistant." ] }, { @@ -266,7 +266,7 @@ "metadata": {}, "outputs": [], "source": [ - "# we set the prompt_type to \"python\", which is a simplied version of the default prompt.\n", + "# we set the prompt_type to \"python\", which is a simplified version of the default prompt.\n", "math_problem = \"Problem: If $725x + 727y = 1500$ and $729x+ 731y = 1508$, what is the value of $x - y$ ?\"\n", "mathproxyagent.initiate_chat(assistant, problem=math_problem, prompt_type=\"python\")" ] diff --git a/notebook/agentchat_RetrieveChat.ipynb b/notebook/agentchat_RetrieveChat.ipynb index 79db55191ffa..b98872edc5b3 100644 --- a/notebook/agentchat_RetrieveChat.ipynb +++ b/notebook/agentchat_RetrieveChat.ipynb @@ -42,7 +42,7 @@ "\n", "AutoGen requires `Python>=3.8`. To run this notebook example, please install the [retrievechat] option.\n", "```bash\n", - "pip install \"pyautogen[retrievechat]~=0.2.0b5\" \"flaml[automl]\"\n", + "pip install \"pyautogen[retrievechat]>=0.2.3\" \"flaml[automl]\"\n", "```" ] }, @@ -52,7 +52,7 @@ "metadata": {}, "outputs": [], "source": [ - "# %pip install \"pyautogen[retrievechat]~=0.2.0b5\" \"flaml[automl]\"" + "# %pip install \"pyautogen[retrievechat]>=0.2.3\" \"flaml[automl]\"" ] }, { @@ -143,7 +143,7 @@ "source": [ "## Construct agents for RetrieveChat\n", "\n", - "We start by initialzing the `RetrieveAssistantAgent` and `RetrieveUserProxyAgent`. The system message needs to be set to \"You are a helpful assistant.\" for RetrieveAssistantAgent. The detailed instructions are given in the user message. Later we will use the `RetrieveUserProxyAgent.generate_init_prompt` to combine the instructions and a retrieval augmented generation task for an initial prompt to be sent to the LLM assistant." + "We start by initializing the `RetrieveAssistantAgent` and `RetrieveUserProxyAgent`. The system message needs to be set to \"You are a helpful assistant.\" for RetrieveAssistantAgent. The detailed instructions are given in the user message. Later we will use the `RetrieveUserProxyAgent.generate_init_prompt` to combine the instructions and a retrieval augmented generation task for an initial prompt to be sent to the LLM assistant." ] }, { @@ -198,7 +198,7 @@ "# `task` indicates the kind of task we're working on. In this example, it's a `code` task.\n", "# `chunk_token_size` is the chunk token size for the retrieve chat. By default, it is set to `max_tokens * 0.6`, here we set it to 2000.\n", "# `custom_text_types` is a list of file types to be processed. Default is `autogen.retrieve_utils.TEXT_FORMATS`.\n", - "# This only applies to files under the directories in `docs_path`. Explictly included files and urls will be chunked regardless of their types.\n", + "# This only applies to files under the directories in `docs_path`. Explicitly included files and urls will be chunked regardless of their types.\n", "# In this example, we set it to [\"mdx\"] to only process markdown files. Since no mdx files are included in the `websit/docs`,\n", "# no files there will be processed. However, the explicitly included urls will still be processed.\n", "ragproxyagent = RetrieveUserProxyAgent(\n", @@ -377,7 +377,7 @@ "\n", "\n", "- `use_spark`: boolean, default=False | Whether to use spark to run the training in parallel spark jobs. This can be used to accelerate training on large models and large datasets, but will incur more overhead in time and thus slow down training in some cases. GPU training is not supported yet when use_spark is True. For Spark clusters, by default, we will launch one trial per executor. However, sometimes we want to launch more trials than the number of executors (e.g., local mode). In this case, we can set the environment variable `FLAML_MAX_CONCURRENT` to override the detected `num_executors`. The final number of concurrent trials will be the minimum of `n_concurrent_trials` and `num_executors`.\n", - "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performes parallel tuning.\n", + "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performs parallel tuning.\n", "- `force_cancel`: boolean, default=False | Whether to forcely cancel Spark jobs if the search time exceeded the time budget. Spark jobs include parallel tuning jobs and Spark-based model training jobs.\n", "\n", "An example code snippet for using parallel Spark jobs:\n", @@ -669,7 +669,7 @@ "\n", "\n", "- `use_spark`: boolean, default=False | Whether to use spark to run the training in parallel spark jobs. This can be used to accelerate training on large models and large datasets, but will incur more overhead in time and thus slow down training in some cases. GPU training is not supported yet when use_spark is True. For Spark clusters, by default, we will launch one trial per executor. However, sometimes we want to launch more trials than the number of executors (e.g., local mode). In this case, we can set the environment variable `FLAML_MAX_CONCURRENT` to override the detected `num_executors`. The final number of concurrent trials will be the minimum of `n_concurrent_trials` and `num_executors`.\n", - "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performes parallel tuning.\n", + "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performs parallel tuning.\n", "- `force_cancel`: boolean, default=False | Whether to forcely cancel Spark jobs if the search time exceeded the time budget. Spark jobs include parallel tuning jobs and Spark-based model training jobs.\n", "\n", "An example code snippet for using parallel Spark jobs:\n", @@ -922,7 +922,7 @@ "\n", "\n", "- `use_spark`: boolean, default=False | Whether to use spark to run the training in parallel spark jobs. This can be used to accelerate training on large models and large datasets, but will incur more overhead in time and thus slow down training in some cases. GPU training is not supported yet when use_spark is True. For Spark clusters, by default, we will launch one trial per executor. However, sometimes we want to launch more trials than the number of executors (e.g., local mode). In this case, we can set the environment variable `FLAML_MAX_CONCURRENT` to override the detected `num_executors`. The final number of concurrent trials will be the minimum of `n_concurrent_trials` and `num_executors`.\n", - "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performes parallel tuning.\n", + "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performs parallel tuning.\n", "- `force_cancel`: boolean, default=False | Whether to forcely cancel Spark jobs if the search time exceeded the time budget. Spark jobs include parallel tuning jobs and Spark-based model training jobs.\n", "\n", "An example code snippet for using parallel Spark jobs:\n", @@ -1224,7 +1224,7 @@ "\n", "\n", "- `use_spark`: boolean, default=False | Whether to use spark to run the training in parallel spark jobs. This can be used to accelerate training on large models and large datasets, but will incur more overhead in time and thus slow down training in some cases. GPU training is not supported yet when use_spark is True. For Spark clusters, by default, we will launch one trial per executor. However, sometimes we want to launch more trials than the number of executors (e.g., local mode). In this case, we can set the environment variable `FLAML_MAX_CONCURRENT` to override the detected `num_executors`. The final number of concurrent trials will be the minimum of `n_concurrent_trials` and `num_executors`.\n", - "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performes parallel tuning.\n", + "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performs parallel tuning.\n", "- `force_cancel`: boolean, default=False | Whether to forcely cancel Spark jobs if the search time exceeded the time budget. Spark jobs include parallel tuning jobs and Spark-based model training jobs.\n", "\n", "An example code snippet for using parallel Spark jobs:\n", @@ -1638,7 +1638,7 @@ "\n", "\n", "- `use_spark`: boolean, default=False | Whether to use spark to run the training in parallel spark jobs. This can be used to accelerate training on large models and large datasets, but will incur more overhead in time and thus slow down training in some cases. GPU training is not supported yet when use_spark is True. For Spark clusters, by default, we will launch one trial per executor. However, sometimes we want to launch more trials than the number of executors (e.g., local mode). In this case, we can set the environment variable `FLAML_MAX_CONCURRENT` to override the detected `num_executors`. The final number of concurrent trials will be the minimum of `n_concurrent_trials` and `num_executors`.\n", - "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performes parallel tuning.\n", + "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performs parallel tuning.\n", "- `force_cancel`: boolean, default=False | Whether to forcely cancel Spark jobs if the search time exceeded the time budget. Spark jobs include parallel tuning jobs and Spark-based model training jobs.\n", "\n", "An example code snippet for using parallel Spark jobs:\n", @@ -1891,7 +1891,7 @@ "\n", "\n", "- `use_spark`: boolean, default=False | Whether to use spark to run the training in parallel spark jobs. This can be used to accelerate training on large models and large datasets, but will incur more overhead in time and thus slow down training in some cases. GPU training is not supported yet when use_spark is True. For Spark clusters, by default, we will launch one trial per executor. However, sometimes we want to launch more trials than the number of executors (e.g., local mode). In this case, we can set the environment variable `FLAML_MAX_CONCURRENT` to override the detected `num_executors`. The final number of concurrent trials will be the minimum of `n_concurrent_trials` and `num_executors`.\n", - "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performes parallel tuning.\n", + "- `n_concurrent_trials`: int, default=1 | The number of concurrent trials. When n_concurrent_trials > 1, FLAML performs parallel tuning.\n", "- `force_cancel`: boolean, default=False | Whether to forcely cancel Spark jobs if the search time exceeded the time budget. Spark jobs include parallel tuning jobs and Spark-based model training jobs.\n", "\n", "An example code snippet for using parallel Spark jobs:\n", diff --git a/notebook/agentchat_auto_feedback_from_code_execution.ipynb b/notebook/agentchat_auto_feedback_from_code_execution.ipynb index 1f29c6d0aa56..49bd662378ae 100644 --- a/notebook/agentchat_auto_feedback_from_code_execution.ipynb +++ b/notebook/agentchat_auto_feedback_from_code_execution.ipynb @@ -45,7 +45,7 @@ }, "outputs": [], "source": [ - "# %pip install pyautogen~=0.2.0b4" + "# %pip install pyautogen>=0.2.3" ] }, { diff --git a/notebook/agentchat_chess.ipynb b/notebook/agentchat_chess.ipynb index 6b2a64a2a37f..9c3ca5c4e29a 100644 --- a/notebook/agentchat_chess.ipynb +++ b/notebook/agentchat_chess.ipynb @@ -35,7 +35,7 @@ "outputs": [], "source": [ "%%capture --no-stderr\n", - "# %pip install \"pyautogen~=0.2.0b4\"\n", + "# %pip install \"pyautogen>=0.2.3\"\n", "%pip install chess -U" ] }, diff --git a/notebook/agentchat_compression.ipynb b/notebook/agentchat_compression.ipynb index 295d16918567..26405da714ca 100644 --- a/notebook/agentchat_compression.ipynb +++ b/notebook/agentchat_compression.ipynb @@ -549,7 +549,7 @@ " compress_config={\n", " \"mode\": \"COMPRESS\",\n", " \"trigger_count\": 600, # set this to a large number for less frequent compression\n", - " \"verbose\": True, # to allow printing of compression information: contex before and after compression\n", + " \"verbose\": True, # to allow printing of compression information: context before and after compression\n", " \"leave_last_n\": 2,\n", " }\n", ")\n", @@ -835,7 +835,7 @@ " code_execution_config={\"work_dir\": \"coding\"},\n", ")\n", "\n", - "# define functions according to the function desription\n", + "# define functions according to the function description\n", "from IPython import get_ipython\n", "\n", "def exec_python(cell):\n", diff --git a/notebook/agentchat_dalle_and_gpt4v.ipynb b/notebook/agentchat_dalle_and_gpt4v.ipynb index 8d7577b14e10..3cdb051bed3f 100644 --- a/notebook/agentchat_dalle_and_gpt4v.ipynb +++ b/notebook/agentchat_dalle_and_gpt4v.ipynb @@ -17,7 +17,7 @@ "source": [ "### Before everything starts, install AutoGen with the `lmm` option\n", "```bash\n", - "pip install \"pyautogen[lmm]~=0.2.0b4\"\n", + "pip install \"pyautogen[lmm]>=0.2.3\"\n", "```" ] }, @@ -401,7 +401,7 @@ "How to create a figure that is better in terms of color, shape, text (clarity), and other things.\n", "Reply with the following format:\n", "\n", - "CIRITICS: the image needs to improve...\n", + "CRITICS: the image needs to improve...\n", "PROMPT: here is the updated prompt!\n", "\n", "\"\"\",\n", @@ -432,7 +432,7 @@ " self.msg_to_critics = f\"\"\"Here is the prompt: {img_prompt}.\n", " Here is the figure .\n", " Now, critic and create a prompt so that DALLE can give me a better image.\n", - " Show me both \"CIRITICS\" and \"PROMPT\"!\n", + " Show me both \"CRITICS\" and \"PROMPT\"!\n", " \"\"\"\n", " self.send(message=self.msg_to_critics,\n", " recipient=self.critics,\n", @@ -615,7 +615,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.16" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/notebook/agentchat_function_call.ipynb b/notebook/agentchat_function_call.ipynb index da15be2124a4..1585877cc154 100644 --- a/notebook/agentchat_function_call.ipynb +++ b/notebook/agentchat_function_call.ipynb @@ -36,7 +36,7 @@ "metadata": {}, "outputs": [], "source": [ - "# %pip install \"pyautogen~=0.2.2\"" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { diff --git a/notebook/agentchat_function_call_currency_calculator.ipynb b/notebook/agentchat_function_call_currency_calculator.ipynb index 0d8ac52ea2c5..8e5be9928476 100644 --- a/notebook/agentchat_function_call_currency_calculator.ipynb +++ b/notebook/agentchat_function_call_currency_calculator.ipynb @@ -36,7 +36,7 @@ "metadata": {}, "outputs": [], "source": [ - "# %pip install \"pyautogen~=0.2.2\"" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { @@ -222,7 +222,7 @@ "\n", "- objects of the Pydantic BaseModel type are serialized to JSON.\n", "\n", - "We can check the correctness of of function map by using `._origin` property of the wrapped funtion as follows:" + "We can check the correctness of of function map by using `._origin` property of the wrapped function as follows:" ] }, { diff --git a/notebook/agentchat_graph_modelling_language_using_select_speaker.ipynb b/notebook/agentchat_graph_modelling_language_using_select_speaker.ipynb index bbe487f419b0..72a98bb8835e 100644 --- a/notebook/agentchat_graph_modelling_language_using_select_speaker.ipynb +++ b/notebook/agentchat_graph_modelling_language_using_select_speaker.ipynb @@ -33,26 +33,26 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "%%capture --no-stderr\n", - "# %pip install pyautogen~=0.2.0b6\n", + "# %pip install \"pyautogen>=0.2.3\"\n", "%pip install networkX~=3.2.1\n", "%pip install matplotlib~=3.8.1" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "0.2.0b6\n" + "0.2.3\n" ] } ], @@ -471,7 +471,7 @@ " \n", " If you are the team leader, you should aggregate your team's total chocolate count to cooperate.\n", " Once the team leader know their team's tally, they can suggest another team leader for them to find their team tally, because we need all three team tallys to succeed.\n", - " Use NEXT: to sugest the next speaker, e.g., NEXT: A0.\n", + " Use NEXT: to suggest the next speaker, e.g., NEXT: A0.\n", " \n", " Once we have the total tally from all nine players, sum up all three teams' tally, then terminate the discussion using TERMINATE.\n", " \n", @@ -777,7 +777,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/notebook/agentchat_groupchat.ipynb b/notebook/agentchat_groupchat.ipynb index 042aebf4b6ff..ff152a4fc6d9 100644 --- a/notebook/agentchat_groupchat.ipynb +++ b/notebook/agentchat_groupchat.ipynb @@ -35,7 +35,7 @@ "outputs": [], "source": [ "%%capture --no-stderr\n", - "# %pip install pyautogen~=0.2.0b4" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { diff --git a/notebook/agentchat_groupchat_RAG.ipynb b/notebook/agentchat_groupchat_RAG.ipynb index c68b31819503..f683987b0f61 100644 --- a/notebook/agentchat_groupchat_RAG.ipynb +++ b/notebook/agentchat_groupchat_RAG.ipynb @@ -22,7 +22,7 @@ "\n", "AutoGen requires `Python>=3.8`. To run this notebook example, please install:\n", "```bash\n", - "pip install \"pyautogen[retrievechat]~=0.2.0b5\"\n", + "pip install \"pyautogen[retrievechat]>=0.2.3\"\n", "```" ] }, @@ -33,7 +33,7 @@ "outputs": [], "source": [ "%%capture --no-stderr\n", - "# %pip install \"pyautogen[retrievechat]~=0.2.0b5\"" + "# %pip install \"pyautogen[retrievechat]>=0.2.3\"" ] }, { @@ -815,7 +815,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/notebook/agentchat_groupchat_research.ipynb b/notebook/agentchat_groupchat_research.ipynb index b01e35f86921..74c957fb5f04 100644 --- a/notebook/agentchat_groupchat_research.ipynb +++ b/notebook/agentchat_groupchat_research.ipynb @@ -33,7 +33,7 @@ "outputs": [], "source": [ "%%capture --no-stderr\n", - "# %pip install pyautogen~=0.2.0b4" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { diff --git a/notebook/agentchat_groupchat_vis.ipynb b/notebook/agentchat_groupchat_vis.ipynb index 0a7b984a551c..78f32914ce76 100644 --- a/notebook/agentchat_groupchat_vis.ipynb +++ b/notebook/agentchat_groupchat_vis.ipynb @@ -33,7 +33,7 @@ "outputs": [], "source": [ "%%capture --no-stderr\n", - "# %pip install pyautogen~=0.2.0b4" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { diff --git a/notebook/agentchat_hierarchy_flow_using_select_speaker.ipynb b/notebook/agentchat_hierarchy_flow_using_select_speaker.ipynb index 4139c8095e80..bcd10fc02b7d 100644 --- a/notebook/agentchat_hierarchy_flow_using_select_speaker.ipynb +++ b/notebook/agentchat_hierarchy_flow_using_select_speaker.ipynb @@ -50,7 +50,7 @@ "outputs": [], "source": [ "%%capture --no-stderr\n", - "# %pip install pyautogen~=0.2.0b4" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { @@ -72,7 +72,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "0.2.0b1\n" + "0.2.3\n" ] } ], diff --git a/notebook/agentchat_human_feedback.ipynb b/notebook/agentchat_human_feedback.ipynb index 93b3afdf62d5..79b72c581e10 100644 --- a/notebook/agentchat_human_feedback.ipynb +++ b/notebook/agentchat_human_feedback.ipynb @@ -45,7 +45,7 @@ }, "outputs": [], "source": [ - "# %pip install pyautogen~=0.2.0b4" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { diff --git a/notebook/agentchat_langchain.ipynb b/notebook/agentchat_langchain.ipynb index e5359d838625..116cce46bcb1 100644 --- a/notebook/agentchat_langchain.ipynb +++ b/notebook/agentchat_langchain.ipynb @@ -47,7 +47,7 @@ }, "outputs": [], "source": [ - "%pip install \"pyautogen~=0.2.0b2\" Langchain" + "%pip install \"pyautogen>=0.2.3\" Langchain" ] }, { diff --git a/notebook/agentchat_lmm_gpt-4v.ipynb b/notebook/agentchat_lmm_gpt-4v.ipynb index 260a22d35a92..d1b478ea111b 100644 --- a/notebook/agentchat_lmm_gpt-4v.ipynb +++ b/notebook/agentchat_lmm_gpt-4v.ipynb @@ -15,7 +15,7 @@ "source": [ "### Before everything starts, install AutoGen with the `lmm` option\n", "```bash\n", - "pip install \"pyautogen[lmm]~=0.2.0b4\"\n", + "pip install \"pyautogen[lmm]>=0.2.3\"\n", "```" ] }, diff --git a/notebook/agentchat_lmm_llava.ipynb b/notebook/agentchat_lmm_llava.ipynb index e86a1007e68f..324eab8107fc 100644 --- a/notebook/agentchat_lmm_llava.ipynb +++ b/notebook/agentchat_lmm_llava.ipynb @@ -26,7 +26,7 @@ "source": [ "### Before everything starts, install AutoGen with the `lmm` option\n", "```bash\n", - "pip install \"pyautogen[lmm]~=0.2.0b4\"\n", + "pip install \"pyautogen[lmm]>=0.2.3\"\n", "```" ] }, diff --git a/notebook/agentchat_oai_assistant_function_call.ipynb b/notebook/agentchat_oai_assistant_function_call.ipynb index 1d73866d965b..dc1ec6f3143b 100644 --- a/notebook/agentchat_oai_assistant_function_call.ipynb +++ b/notebook/agentchat_oai_assistant_function_call.ipynb @@ -29,7 +29,7 @@ "outputs": [], "source": [ "%%capture --no-stderr\n", - "# %pip install \"pyautogen~=0.2.0b5" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { @@ -71,7 +71,7 @@ " \"question\"\n", " ]\n", " },\n", - " \"description\": \"This is an API endpoint allowing users (analysts) to input question about GitHub in text format to retrieve the realted and structured data.\"\n", + " \"description\": \"This is an API endpoint allowing users (analysts) to input question about GitHub in text format to retrieve the related and structured data.\"\n", "}\n", "\n", "def get_ossinsight(question):\n", diff --git a/notebook/agentchat_oai_assistant_groupchat.ipynb b/notebook/agentchat_oai_assistant_groupchat.ipynb index 01c12b9193bd..ad98f21dc7f7 100644 --- a/notebook/agentchat_oai_assistant_groupchat.ipynb +++ b/notebook/agentchat_oai_assistant_groupchat.ipynb @@ -15,7 +15,7 @@ "\n", "AutoGen requires `Python>=3.8`. To run this notebook example, please install:\n", "```bash\n", - "pip install \"pyautogen==0.2.0b5\"\n", + "pip install \"pyautogen>=0.2.3\"\n", "```" ] }, diff --git a/notebook/agentchat_oai_code_interpreter.ipynb b/notebook/agentchat_oai_code_interpreter.ipynb index 52939b16ef49..f023260b2f61 100644 --- a/notebook/agentchat_oai_code_interpreter.ipynb +++ b/notebook/agentchat_oai_code_interpreter.ipynb @@ -132,7 +132,7 @@ " human_input_mode=\"NEVER\"\n", ")\n", "\n", - "# When all is set, initate the chat.\n", + "# When all is set, initiate the chat.\n", "user_proxy.initiate_chat(gpt_assistant, message=\"If $725x + 727y = 1500$ and $729x+ 731y = 1508$, what is the value of $x - y$ ?\")\n" ] }, @@ -279,7 +279,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/notebook/agentchat_planning.ipynb b/notebook/agentchat_planning.ipynb index b1a6789560ea..43a7a22ac443 100644 --- a/notebook/agentchat_planning.ipynb +++ b/notebook/agentchat_planning.ipynb @@ -45,7 +45,7 @@ }, "outputs": [], "source": [ - "# %pip install pyautogen~=0.2.0b4 docker" + "# %pip install \"pyautogen>=0.2.3\" docker" ] }, { diff --git a/notebook/agentchat_qdrant_RetrieveChat.ipynb b/notebook/agentchat_qdrant_RetrieveChat.ipynb index c47deedc2a07..2dda59087938 100644 --- a/notebook/agentchat_qdrant_RetrieveChat.ipynb +++ b/notebook/agentchat_qdrant_RetrieveChat.ipynb @@ -29,7 +29,7 @@ "\n", "AutoGen requires `Python>=3.8`. To run this notebook example, please install the [retrievechat] option.\n", "```bash\n", - "pip install \"pyautogen[retrievechat]~=0.2.0b5\" \"flaml[automl]\" \"qdrant_client[fastembed]\"\n", + "pip install \"pyautogen[retrievechat]>=0.2.3\" \"flaml[automl]\" \"qdrant_client[fastembed]\"\n", "```" ] }, @@ -37,9 +37,162 @@ "cell_type": "code", "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: pyautogen>=0.2.3 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyautogen[retrievechat]>=0.2.3) (0.2.3)\n", + "Requirement already satisfied: flaml[automl] in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (2.1.1)\n", + "Requirement already satisfied: qdrant_client[fastembed] in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (1.7.0)\n", + "Requirement already satisfied: diskcache in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyautogen>=0.2.3->pyautogen[retrievechat]>=0.2.3) (5.6.3)\n", + "Requirement already satisfied: openai>=1.3 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyautogen>=0.2.3->pyautogen[retrievechat]>=0.2.3) (1.6.1)\n", + "Requirement already satisfied: pydantic<3,>=1.10 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyautogen>=0.2.3->pyautogen[retrievechat]>=0.2.3) (2.5.3)\n", + "Requirement already satisfied: python-dotenv in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyautogen>=0.2.3->pyautogen[retrievechat]>=0.2.3) (1.0.0)\n", + "Requirement already satisfied: termcolor in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyautogen>=0.2.3->pyautogen[retrievechat]>=0.2.3) (2.4.0)\n", + "Requirement already satisfied: tiktoken in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyautogen>=0.2.3->pyautogen[retrievechat]>=0.2.3) (0.5.2)\n", + "Requirement already satisfied: NumPy>=1.17.0rc1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from flaml[automl]) (1.26.2)\n", + "Requirement already satisfied: lightgbm>=2.3.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from flaml[automl]) (4.2.0)\n", + "Requirement already satisfied: xgboost>=0.90 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from flaml[automl]) (2.0.3)\n", + "Requirement already satisfied: scipy>=1.4.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from flaml[automl]) (1.11.4)\n", + "Requirement already satisfied: pandas>=1.1.4 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from flaml[automl]) (2.1.4)\n", + "Requirement already satisfied: scikit-learn>=0.24 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from flaml[automl]) (1.3.2)\n", + "Requirement already satisfied: fastembed==0.1.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from qdrant_client[fastembed]) (0.1.1)\n", + "Requirement already satisfied: grpcio>=1.41.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from qdrant_client[fastembed]) (1.60.0)\n", + "Requirement already satisfied: grpcio-tools>=1.41.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from qdrant_client[fastembed]) (1.60.0)\n", + "Requirement already satisfied: httpx>=0.14.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from httpx[http2]>=0.14.0->qdrant_client[fastembed]) (0.26.0)\n", + "Requirement already satisfied: portalocker<3.0.0,>=2.7.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from qdrant_client[fastembed]) (2.8.2)\n", + "Requirement already satisfied: urllib3<2.0.0,>=1.26.14 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from qdrant_client[fastembed]) (1.26.18)\n", + "Requirement already satisfied: onnx<2.0,>=1.11 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from fastembed==0.1.1->qdrant_client[fastembed]) (1.15.0)\n", + "Requirement already satisfied: onnxruntime<2.0,>=1.15 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from fastembed==0.1.1->qdrant_client[fastembed]) (1.16.3)\n", + "Requirement already satisfied: requests<3.0,>=2.31 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from fastembed==0.1.1->qdrant_client[fastembed]) (2.31.0)\n", + "Requirement already satisfied: tokenizers<0.14,>=0.13 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from fastembed==0.1.1->qdrant_client[fastembed]) (0.13.3)\n", + "Requirement already satisfied: tqdm<5.0,>=4.65 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from fastembed==0.1.1->qdrant_client[fastembed]) (4.66.1)\n", + "Requirement already satisfied: chromadb in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyautogen[retrievechat]>=0.2.3) (0.4.21)\n", + "Requirement already satisfied: ipython in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyautogen[retrievechat]>=0.2.3) (8.19.0)\n", + "Requirement already satisfied: pypdf in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyautogen[retrievechat]>=0.2.3) (3.17.4)\n", + "Requirement already satisfied: sentence-transformers in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyautogen[retrievechat]>=0.2.3) (2.2.2)\n", + "Requirement already satisfied: protobuf<5.0dev,>=4.21.6 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from grpcio-tools>=1.41.0->qdrant_client[fastembed]) (4.25.1)\n", + "Requirement already satisfied: setuptools in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from grpcio-tools>=1.41.0->qdrant_client[fastembed]) (65.5.0)\n", + "Requirement already satisfied: anyio in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from httpx>=0.14.0->httpx[http2]>=0.14.0->qdrant_client[fastembed]) (4.2.0)\n", + "Requirement already satisfied: certifi in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from httpx>=0.14.0->httpx[http2]>=0.14.0->qdrant_client[fastembed]) (2023.11.17)\n", + "Requirement already satisfied: httpcore==1.* in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from httpx>=0.14.0->httpx[http2]>=0.14.0->qdrant_client[fastembed]) (1.0.2)\n", + "Requirement already satisfied: idna in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from httpx>=0.14.0->httpx[http2]>=0.14.0->qdrant_client[fastembed]) (3.6)\n", + "Requirement already satisfied: sniffio in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from httpx>=0.14.0->httpx[http2]>=0.14.0->qdrant_client[fastembed]) (1.3.0)\n", + "Requirement already satisfied: h11<0.15,>=0.13 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from httpcore==1.*->httpx>=0.14.0->httpx[http2]>=0.14.0->qdrant_client[fastembed]) (0.14.0)\n", + "Requirement already satisfied: h2<5,>=3 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from httpx[http2]>=0.14.0->qdrant_client[fastembed]) (4.1.0)\n", + "Requirement already satisfied: distro<2,>=1.7.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from openai>=1.3->pyautogen>=0.2.3->pyautogen[retrievechat]>=0.2.3) (1.9.0)\n", + "Requirement already satisfied: typing-extensions<5,>=4.7 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from openai>=1.3->pyautogen>=0.2.3->pyautogen[retrievechat]>=0.2.3) (4.9.0)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pandas>=1.1.4->flaml[automl]) (2.8.2)\n", + "Requirement already satisfied: pytz>=2020.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pandas>=1.1.4->flaml[automl]) (2023.3.post1)\n", + "Requirement already satisfied: tzdata>=2022.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pandas>=1.1.4->flaml[automl]) (2023.4)\n", + "Requirement already satisfied: annotated-types>=0.4.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pydantic<3,>=1.10->pyautogen>=0.2.3->pyautogen[retrievechat]>=0.2.3) (0.6.0)\n", + "Requirement already satisfied: pydantic-core==2.14.6 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pydantic<3,>=1.10->pyautogen>=0.2.3->pyautogen[retrievechat]>=0.2.3) (2.14.6)\n", + "Requirement already satisfied: joblib>=1.1.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from scikit-learn>=0.24->flaml[automl]) (1.3.2)\n", + "Requirement already satisfied: threadpoolctl>=2.0.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from scikit-learn>=0.24->flaml[automl]) (3.2.0)\n", + "Requirement already satisfied: chroma-hnswlib==0.7.3 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (0.7.3)\n", + "Requirement already satisfied: fastapi>=0.95.2 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (0.108.0)\n", + "Requirement already satisfied: uvicorn>=0.18.3 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from uvicorn[standard]>=0.18.3->chromadb->pyautogen[retrievechat]>=0.2.3) (0.25.0)\n", + "Requirement already satisfied: posthog>=2.4.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (3.1.0)\n", + "Requirement already satisfied: pulsar-client>=3.1.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (3.3.0)\n", + "Requirement already satisfied: opentelemetry-api>=1.2.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (1.22.0)\n", + "Requirement already satisfied: opentelemetry-exporter-otlp-proto-grpc>=1.2.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (1.22.0)\n", + "Requirement already satisfied: opentelemetry-instrumentation-fastapi>=0.41b0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (0.43b0)\n", + "Requirement already satisfied: opentelemetry-sdk>=1.2.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (1.22.0)\n", + "Requirement already satisfied: pypika>=0.48.9 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (0.48.9)\n", + "Requirement already satisfied: overrides>=7.3.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (7.4.0)\n", + "Requirement already satisfied: importlib-resources in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (6.1.1)\n", + "Requirement already satisfied: bcrypt>=4.0.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (4.1.2)\n", + "Requirement already satisfied: typer>=0.9.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (0.9.0)\n", + "Requirement already satisfied: kubernetes>=28.1.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (28.1.0)\n", + "Requirement already satisfied: tenacity>=8.2.3 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (8.2.3)\n", + "Requirement already satisfied: PyYAML>=6.0.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (6.0.1)\n", + "Requirement already satisfied: mmh3>=4.0.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from chromadb->pyautogen[retrievechat]>=0.2.3) (4.0.1)\n", + "Requirement already satisfied: decorator in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from ipython->pyautogen[retrievechat]>=0.2.3) (5.1.1)\n", + "Requirement already satisfied: jedi>=0.16 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from ipython->pyautogen[retrievechat]>=0.2.3) (0.19.1)\n", + "Requirement already satisfied: matplotlib-inline in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from ipython->pyautogen[retrievechat]>=0.2.3) (0.1.6)\n", + "Requirement already satisfied: prompt-toolkit<3.1.0,>=3.0.41 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from ipython->pyautogen[retrievechat]>=0.2.3) (3.0.43)\n", + "Requirement already satisfied: pygments>=2.4.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from ipython->pyautogen[retrievechat]>=0.2.3) (2.17.2)\n", + "Requirement already satisfied: stack-data in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from ipython->pyautogen[retrievechat]>=0.2.3) (0.6.3)\n", + "Requirement already satisfied: traitlets>=5 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from ipython->pyautogen[retrievechat]>=0.2.3) (5.14.1)\n", + "Requirement already satisfied: pexpect>4.3 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from ipython->pyautogen[retrievechat]>=0.2.3) (4.9.0)\n", + "Requirement already satisfied: transformers<5.0.0,>=4.6.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from sentence-transformers->pyautogen[retrievechat]>=0.2.3) (4.33.3)\n", + "Requirement already satisfied: torch>=1.6.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from sentence-transformers->pyautogen[retrievechat]>=0.2.3) (2.1.2)\n", + "Requirement already satisfied: torchvision in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from sentence-transformers->pyautogen[retrievechat]>=0.2.3) (0.16.2)\n", + "Requirement already satisfied: nltk in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from sentence-transformers->pyautogen[retrievechat]>=0.2.3) (3.8.1)\n", + "Requirement already satisfied: sentencepiece in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from sentence-transformers->pyautogen[retrievechat]>=0.2.3) (0.1.99)\n", + "Requirement already satisfied: huggingface-hub>=0.4.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from sentence-transformers->pyautogen[retrievechat]>=0.2.3) (0.20.1)\n", + "Requirement already satisfied: regex>=2022.1.18 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from tiktoken->pyautogen>=0.2.3->pyautogen[retrievechat]>=0.2.3) (2023.12.25)\n", + "Requirement already satisfied: starlette<0.33.0,>=0.29.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from fastapi>=0.95.2->chromadb->pyautogen[retrievechat]>=0.2.3) (0.32.0.post1)\n", + "Requirement already satisfied: hyperframe<7,>=6.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from h2<5,>=3->httpx[http2]>=0.14.0->qdrant_client[fastembed]) (6.0.1)\n", + "Requirement already satisfied: hpack<5,>=4.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from h2<5,>=3->httpx[http2]>=0.14.0->qdrant_client[fastembed]) (4.0.0)\n", + "Requirement already satisfied: filelock in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from huggingface-hub>=0.4.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (3.13.1)\n", + "Requirement already satisfied: fsspec>=2023.5.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from huggingface-hub>=0.4.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (2023.12.2)\n", + "Requirement already satisfied: packaging>=20.9 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from huggingface-hub>=0.4.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (23.2)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.3 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from jedi>=0.16->ipython->pyautogen[retrievechat]>=0.2.3) (0.8.3)\n", + "Requirement already satisfied: six>=1.9.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb->pyautogen[retrievechat]>=0.2.3) (1.16.0)\n", + "Requirement already satisfied: google-auth>=1.0.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb->pyautogen[retrievechat]>=0.2.3) (2.25.2)\n", + "Requirement already satisfied: websocket-client!=0.40.0,!=0.41.*,!=0.42.*,>=0.32.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb->pyautogen[retrievechat]>=0.2.3) (1.7.0)\n", + "Requirement already satisfied: requests-oauthlib in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb->pyautogen[retrievechat]>=0.2.3) (1.3.1)\n", + "Requirement already satisfied: oauthlib>=3.2.2 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from kubernetes>=28.1.0->chromadb->pyautogen[retrievechat]>=0.2.3) (3.2.2)\n", + "Requirement already satisfied: coloredlogs in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from onnxruntime<2.0,>=1.15->fastembed==0.1.1->qdrant_client[fastembed]) (15.0.1)\n", + "Requirement already satisfied: flatbuffers in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from onnxruntime<2.0,>=1.15->fastembed==0.1.1->qdrant_client[fastembed]) (23.5.26)\n", + "Requirement already satisfied: sympy in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from onnxruntime<2.0,>=1.15->fastembed==0.1.1->qdrant_client[fastembed]) (1.12)\n", + "Requirement already satisfied: deprecated>=1.2.6 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-api>=1.2.0->chromadb->pyautogen[retrievechat]>=0.2.3) (1.2.14)\n", + "Requirement already satisfied: importlib-metadata<7.0,>=6.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-api>=1.2.0->chromadb->pyautogen[retrievechat]>=0.2.3) (6.11.0)\n", + "Requirement already satisfied: backoff<3.0.0,>=1.10.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb->pyautogen[retrievechat]>=0.2.3) (2.2.1)\n", + "Requirement already satisfied: googleapis-common-protos~=1.52 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb->pyautogen[retrievechat]>=0.2.3) (1.62.0)\n", + "Requirement already satisfied: opentelemetry-exporter-otlp-proto-common==1.22.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb->pyautogen[retrievechat]>=0.2.3) (1.22.0)\n", + "Requirement already satisfied: opentelemetry-proto==1.22.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-exporter-otlp-proto-grpc>=1.2.0->chromadb->pyautogen[retrievechat]>=0.2.3) (1.22.0)\n", + "Requirement already satisfied: opentelemetry-instrumentation-asgi==0.43b0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb->pyautogen[retrievechat]>=0.2.3) (0.43b0)\n", + "Requirement already satisfied: opentelemetry-instrumentation==0.43b0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb->pyautogen[retrievechat]>=0.2.3) (0.43b0)\n", + "Requirement already satisfied: opentelemetry-semantic-conventions==0.43b0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb->pyautogen[retrievechat]>=0.2.3) (0.43b0)\n", + "Requirement already satisfied: opentelemetry-util-http==0.43b0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-instrumentation-fastapi>=0.41b0->chromadb->pyautogen[retrievechat]>=0.2.3) (0.43b0)\n", + "Requirement already satisfied: wrapt<2.0.0,>=1.0.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-instrumentation==0.43b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb->pyautogen[retrievechat]>=0.2.3) (1.16.0)\n", + "Requirement already satisfied: asgiref~=3.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from opentelemetry-instrumentation-asgi==0.43b0->opentelemetry-instrumentation-fastapi>=0.41b0->chromadb->pyautogen[retrievechat]>=0.2.3) (3.7.2)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pexpect>4.3->ipython->pyautogen[retrievechat]>=0.2.3) (0.7.0)\n", + "Requirement already satisfied: monotonic>=1.5 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from posthog>=2.4.0->chromadb->pyautogen[retrievechat]>=0.2.3) (1.6)\n", + "Requirement already satisfied: wcwidth in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from prompt-toolkit<3.1.0,>=3.0.41->ipython->pyautogen[retrievechat]>=0.2.3) (0.2.12)\n", + "Requirement already satisfied: charset-normalizer<4,>=2 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from requests<3.0,>=2.31->fastembed==0.1.1->qdrant_client[fastembed]) (3.3.2)\n", + "Requirement already satisfied: networkx in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (3.2.1)\n", + "Requirement already satisfied: jinja2 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (3.1.2)\n", + "Requirement already satisfied: nvidia-cuda-nvrtc-cu12==12.1.105 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (12.1.105)\n", + "Requirement already satisfied: nvidia-cuda-runtime-cu12==12.1.105 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (12.1.105)\n", + "Requirement already satisfied: nvidia-cuda-cupti-cu12==12.1.105 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (12.1.105)\n", + "Requirement already satisfied: nvidia-cudnn-cu12==8.9.2.26 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (8.9.2.26)\n", + "Requirement already satisfied: nvidia-cublas-cu12==12.1.3.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (12.1.3.1)\n", + "Requirement already satisfied: nvidia-cufft-cu12==11.0.2.54 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (11.0.2.54)\n", + "Requirement already satisfied: nvidia-curand-cu12==10.3.2.106 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (10.3.2.106)\n", + "Requirement already satisfied: nvidia-cusolver-cu12==11.4.5.107 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (11.4.5.107)\n", + "Requirement already satisfied: nvidia-cusparse-cu12==12.1.0.106 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (12.1.0.106)\n", + "Requirement already satisfied: nvidia-nccl-cu12==2.18.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (2.18.1)\n", + "Requirement already satisfied: nvidia-nvtx-cu12==12.1.105 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (12.1.105)\n", + "Requirement already satisfied: triton==2.1.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (2.1.0)\n", + "Requirement already satisfied: nvidia-nvjitlink-cu12 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from nvidia-cusolver-cu12==11.4.5.107->torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (12.3.101)\n", + "Requirement already satisfied: safetensors>=0.3.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from transformers<5.0.0,>=4.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (0.4.1)\n", + "Requirement already satisfied: click<9.0.0,>=7.1.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from typer>=0.9.0->chromadb->pyautogen[retrievechat]>=0.2.3) (8.1.7)\n", + "Requirement already satisfied: httptools>=0.5.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from uvicorn[standard]>=0.18.3->chromadb->pyautogen[retrievechat]>=0.2.3) (0.6.1)\n", + "Requirement already satisfied: uvloop!=0.15.0,!=0.15.1,>=0.14.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from uvicorn[standard]>=0.18.3->chromadb->pyautogen[retrievechat]>=0.2.3) (0.19.0)\n", + "Requirement already satisfied: watchfiles>=0.13 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from uvicorn[standard]>=0.18.3->chromadb->pyautogen[retrievechat]>=0.2.3) (0.21.0)\n", + "Requirement already satisfied: websockets>=10.4 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from uvicorn[standard]>=0.18.3->chromadb->pyautogen[retrievechat]>=0.2.3) (12.0)\n", + "Requirement already satisfied: executing>=1.2.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from stack-data->ipython->pyautogen[retrievechat]>=0.2.3) (2.0.1)\n", + "Requirement already satisfied: asttokens>=2.1.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from stack-data->ipython->pyautogen[retrievechat]>=0.2.3) (2.4.1)\n", + "Requirement already satisfied: pure-eval in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from stack-data->ipython->pyautogen[retrievechat]>=0.2.3) (0.2.2)\n", + "Requirement already satisfied: pillow!=8.3.*,>=5.3.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from torchvision->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (10.2.0)\n", + "Requirement already satisfied: cachetools<6.0,>=2.0.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb->pyautogen[retrievechat]>=0.2.3) (5.3.2)\n", + "Requirement already satisfied: pyasn1-modules>=0.2.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb->pyautogen[retrievechat]>=0.2.3) (0.3.0)\n", + "Requirement already satisfied: rsa<5,>=3.1.4 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from google-auth>=1.0.1->kubernetes>=28.1.0->chromadb->pyautogen[retrievechat]>=0.2.3) (4.9)\n", + "Requirement already satisfied: zipp>=0.5 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from importlib-metadata<7.0,>=6.0->opentelemetry-api>=1.2.0->chromadb->pyautogen[retrievechat]>=0.2.3) (3.17.0)\n", + "Requirement already satisfied: humanfriendly>=9.1 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from coloredlogs->onnxruntime<2.0,>=1.15->fastembed==0.1.1->qdrant_client[fastembed]) (10.0)\n", + "Requirement already satisfied: MarkupSafe>=2.0 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from jinja2->torch>=1.6.0->sentence-transformers->pyautogen[retrievechat]>=0.2.3) (2.1.3)\n", + "Requirement already satisfied: mpmath>=0.19 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from sympy->onnxruntime<2.0,>=1.15->fastembed==0.1.1->qdrant_client[fastembed]) (1.3.0)\n", + "Requirement already satisfied: pyasn1<0.6.0,>=0.4.6 in /workspaces/autogen/.venv-3.11/lib/python3.11/site-packages (from pyasn1-modules>=0.2.1->google-auth>=1.0.1->kubernetes>=28.1.0->chromadb->pyautogen[retrievechat]>=0.2.3) (0.5.1)\n", + "Note: you may need to restart the kernel to use updated packages.\n" + ] + } + ], "source": [ - "# %pip install \"pyautogen[retrievechat]~=0.2.0b5\" \"flaml[automl]\" \"qdrant_client[fastembed]\"" + "%pip install \"pyautogen[retrievechat]>=0.2.3\" \"flaml[automl]\" \"qdrant_client[fastembed]\"" ] }, { @@ -153,7 +306,7 @@ "source": [ "## Construct agents for RetrieveChat\n", "\n", - "We start by initialzing the `RetrieveAssistantAgent` and `QdrantRetrieveUserProxyAgent`. The system message needs to be set to \"You are a helpful assistant.\" for RetrieveAssistantAgent. The detailed instructions are given in the user message. Later we will use the `QdrantRetrieveUserProxyAgent.generate_init_prompt` to combine the instructions and a retrieval augmented generation task for an initial prompt to be sent to the LLM assistant.\n", + "We start by initializing the `RetrieveAssistantAgent` and `QdrantRetrieveUserProxyAgent`. The system message needs to be set to \"You are a helpful assistant.\" for RetrieveAssistantAgent. The detailed instructions are given in the user message. Later we will use the `QdrantRetrieveUserProxyAgent.generate_init_prompt` to combine the instructions and a retrieval augmented generation task for an initial prompt to be sent to the LLM assistant.\n", "\n", "### You can find the list of all the embedding models supported by Qdrant [here](https://qdrant.github.io/fastembed/examples/Supported_Models/)." ] @@ -1079,7 +1232,7 @@ "\n", "- `result_type_name` - A String to specify the name of the result type.\n", "- `cb_coef` - a string to specify the coefficient on the confidence bound.\n", - "- `init_loss` - a float to specify the inital loss.\n", + "- `init_loss` - a float to specify the initial loss.\n", "- `init_cb` - a float to specify the intial confidence bound.\n", "- `mode` - A string in ['min', 'max'] to specify the objective as\n", " minimization or maximization.\n", @@ -1233,7 +1386,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.11.2" } }, "nbformat": 4, diff --git a/notebook/agentchat_stream.ipynb b/notebook/agentchat_stream.ipynb index bc71afd4b587..d71459822821 100644 --- a/notebook/agentchat_stream.ipynb +++ b/notebook/agentchat_stream.ipynb @@ -45,7 +45,7 @@ }, "outputs": [], "source": [ - "# %pip install pyautogen~=0.2.0b4" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { diff --git a/notebook/agentchat_teaching.ipynb b/notebook/agentchat_teaching.ipynb index 16b51130eced..61dac0688164 100644 --- a/notebook/agentchat_teaching.ipynb +++ b/notebook/agentchat_teaching.ipynb @@ -24,7 +24,7 @@ "\n", "AutoGen requires `Python>=3.8`. To run this notebook example, please install:\n", "```bash\n", - "pip install \"pyautogen~=0.2.0b5\"\n", + "pip install \"pyautogen>=0.2.3\"\n", "```" ] }, @@ -34,7 +34,7 @@ "metadata": {}, "outputs": [], "source": [ - "# %pip install --quiet \"pyautogen~=0.2.0b5\"" + "# %pip install --quiet \"pyautogen>=0.2.3\"" ] }, { diff --git a/notebook/agentchat_two_users.ipynb b/notebook/agentchat_two_users.ipynb index b170d2ec63f4..6ab0c93639dd 100644 --- a/notebook/agentchat_two_users.ipynb +++ b/notebook/agentchat_two_users.ipynb @@ -44,7 +44,7 @@ }, "outputs": [], "source": [ - "# %pip install pyautogen~=0.2.0b4" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { diff --git a/notebook/agentchat_video_transcript_translate_with_whisper.ipynb b/notebook/agentchat_video_transcript_translate_with_whisper.ipynb index aa2996b0d886..2a34ee6aca2c 100644 --- a/notebook/agentchat_video_transcript_translate_with_whisper.ipynb +++ b/notebook/agentchat_video_transcript_translate_with_whisper.ipynb @@ -45,7 +45,7 @@ "# %pip install moviepy~=1.0.3\n", "# %pip install openai-whisper~=20230918\n", "# %pip install openai~=1.3.5\n", - "# %pip install pyautogen~=0.2.0b4" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { diff --git a/notebook/agentchat_web_info.ipynb b/notebook/agentchat_web_info.ipynb index 2dc5339544c4..6bf5d1d3e0ac 100644 --- a/notebook/agentchat_web_info.ipynb +++ b/notebook/agentchat_web_info.ipynb @@ -49,7 +49,7 @@ }, "outputs": [], "source": [ - "# %pip install pyautogen~=0.2.0b4 docker" + "# %pip install \"pyautogen>=0.2.3\" docker" ] }, { diff --git a/notebook/agenteval_cq_math.ipynb b/notebook/agenteval_cq_math.ipynb index 9890eaa439d5..36cb0fe4072c 100644 --- a/notebook/agenteval_cq_math.ipynb +++ b/notebook/agenteval_cq_math.ipynb @@ -1,789 +1,3635 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": { - "id": "-pftZ-ZF1_BA" - }, - "source": [ - "\"Open" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "NPUGFpKP1_BH" - }, - "source": [ - "# Demonstrating the `AgentEval` framework using the task of solving math problems as an example\n", - "\n", - "This notebook aims to demonstrate how to `AgentEval` implemented through [AutoGen](https://github.com/microsoft/autogen) works, where we use a math problem-solving task as an example. \n", - "`AgentEval` consists of two key components:\n", - "\n", - "- `CriticAgent`: This is an LLM-based agent that generates a list criteria $(c_1, \\dots, c_n)$ to help to evaluate a utility given task.\n", - "\n", - "- `QuantifierAgent`: This agent quantifies the performance of any sample task based on the criteria designed by the `CriticAgent` in the following way: $(c_1=a_1, \\dots, c_n=a_n)$\n", - "\n", - "![AgentEval](../website/blog/2023-11-20-AgentEval/img/agenteval-CQ.png)\n", - "\n", - "For more detailed explanations, please refer to the accompanying [blog post](https://microsoft.github.io/autogen/blog/2023/11/20/AgentEval)\n", - "\n", - "## Requirements\n", - "\n", - "AutoGen requires `Python>=3.8`. To run this notebook example, please install pyautogen, Docker, and OpenAI:\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "execution": { - "iopub.execute_input": "2023-02-13T23:40:52.317406Z", - "iopub.status.busy": "2023-02-13T23:40:52.316561Z", - "iopub.status.idle": "2023-02-13T23:40:52.321193Z", - "shell.execute_reply": "2023-02-13T23:40:52.320628Z" - }, - "id": "68lTZZyJ1_BI", - "outputId": "15a55fab-e13a-4654-b8cb-ae117478d6d8" - }, - "outputs": [], - "source": [ - "%pip install pyautogen~=0.2.0b5 docker\n", - "%pip install scipy\n", - "%pip install matplotlib" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "HxgqKJrd1_BJ" - }, - "source": [ - "## Set your API Endpoint\n", - "\n", - "* The [`config_list_openai_aoai`](https://microsoft.github.io/autogen/docs/reference/oai/openai_utils#config_list_openai_aoai) function tries to create a list of configurations using Azure OpenAI endpoints and OpenAI endpoints. It assumes the api keys and api bases are stored in the corresponding environment variables or local txt files:\n", - " - OpenAI API key: os.environ[\"OPENAI_API_KEY\"] or `openai_api_key_file=\"key_openai.txt\"`.\n", - " - Azure OpenAI API key: os.environ[\"AZURE_OPENAI_API_KEY\"] or `aoai_api_key_file=\"key_aoai.txt\"`. Multiple keys can be stored, one per line.\n", - " - Azure OpenAI API base: os.environ[\"AZURE_OPENAI_API_BASE\"] or `aoai_api_base_file=\"base_aoai.txt\"`. Multiple bases can be stored, one per line.\n", - "* The [`config_list_from_json`](https://microsoft.github.io/autogen/docs/reference/oai/openai_utils#config_list_from_json) function loads a list of configurations from an environment variable or a json file. It first looks for an environment variable with a specified name. The value of the environment variable needs to be a valid json string. If that variable is not found, it looks for a json file with the same name. It filters the configs by filter_dict.\n", - "\n", - "You can set the value of config_list in any way you prefer. Please refer to this [notebook](https://github.com/microsoft/autogen/blob/main/notebook/oai_openai_utils.ipynb) for full code examples of the different methods.\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "YRycFEDJ1_BJ" - }, - "outputs": [], - "source": [ - "import autogen\n", - "\n", - "config_list = autogen.config_list_from_json(\n", - " \"OAI_CONFIG_LIST\",\n", - " filter_dict={\n", - " \"model\": [\"gpt-4\"],\n", - " },\n", - ")" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "fBZ-XFXy1_BJ" - }, - "source": [ - "\n", - "## Construct `CriticAgent`\n", - "\n", - "We construct the planning agent named `critic` and a user proxy agent for the critic named `critic_user`. We specify `human_input_mode` as \"NEVER\" in the user proxy agent, ensuring that it will never ask for human feedback. Additionally, we define the `ask_critic` function to send a message to the critic and retrieve the criteria from the critic.\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "id": "9XAeyjd11_BK" - }, - "outputs": [], - "source": [ - "\n", - "critic = autogen.AssistantAgent(\n", - " name = \"critic\",\n", - " llm_config = {\"config_list\": config_list},\n", - " system_message = \"\"\"You are a helpful assistant. You suggest criteria for evaluating different tasks. They should be dinstinguishable, quantifieable and not redundant.\n", - " Convert the evaluation criteria into a dictionary where the keys are the criteria.\n", - " The value of each key is a dictionary as follows {\"description\": criteria description , \"accepted_values\": possible accepted inputs for this key}\n", - " Make sure the keys are criteria for assessing the given task. \"accepted_values\" include the acceptable inputs for each key that are fine-grained and preferrably mlti-graded levels. \"description\" includes the criterion description.\n", - " Return the dictionary.\"\"\"\n", - ")\n", - "\n", - "critic_user = autogen.UserProxyAgent(\n", - " name = \"critic_user\",\n", - " max_consecutive_auto_reply = 0, # terminate without auto-reply\n", - " human_input_mode = \"NEVER\",\n", - ")\n", - "\n", - "def ask_critic(message):\n", - " \"\"\"\n", - " Initiate a chat with the critic user and return the last message received from the planner.\n", - "\n", - " Args:\n", - " - message (str): The message to be sent to the critic user.\n", - "\n", - " Returns:\n", - " - str: The content of the last message received.\n", - " \"\"\"\n", - " critic_user.initiate_chat(critic, message=message)\n", - " # return the last received from the planner\n", - " return critic_user.messagelast_message()[\"content\"]\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "6vPTtNkhk2V1" - }, - "source": [ - "# Run the Critic\n", - "\n", - "To run the critic, we need a couple of math problem examples. One of them failed to solve the problem successfully, given in `agenteval-in-out/response_failed.txt`, and the other one was solved successfully, i.e., `agenteval-in-out/response_successful.txt`." - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": { - "id": "5H1WRs_wkiK0" - }, - "outputs": [], - "source": [ - "def read_without_groundtruth(file_name):\n", - " \"\"\"\n", - " Read the mathproblem logs - bypassing any information about the ground truths.\n", - "\n", - " Args:\n", - " - file_name (str): The single log file that wants to get evaluated.\n", - "\n", - " Returns:\n", - " - str: The log file without any information about the ground truth answer of the problem.\n", - " \"\"\"\n", - " f = open( file_name,\"r\").readlines()\n", - " output_dictionary = \"\"\n", - " for line in f:\n", - " if \"is_correct\" not in line and \"correct_ans\" not in line and \"check_result\" not in line:\n", - " output_dictionary += line\n", - " elif \"is_correct\" in line:\n", - " correctness = line.replace(\",\",\"\").split(\":\")[-1].rstrip().strip()\n", - " return [output_dictionary,correctness]\n", - "\n", - "# Reading one successful and one failed example of the task\n", - "response_successful = read_without_groundtruth(\"../test/test_files/agenteval-in-out/samples/sample_math_response_successful.txt\")[0]\n", - "response_failed = read_without_groundtruth(\"../test/test_files/agenteval-in-out/samples/sample_math_response_failed.txt\")[0]\n", - "\n", - "task = {\"name\": \"Math problem solving\",\n", - " \"description\": \"Given any question, the system needs to solve the problem as consisely and acccurately as possible\",\n", - " \"successful_response\" : response_successful,\n", - " \"failed_response\" : response_failed}\n", - "\n", - "sys_msg = f\"\"\"Task: {task[\"name\"]}.\n", - "Task description: {task[\"description\"]}\n", - "Task successfull example: {task[\"successful_response\"]}\n", - "Task failed example: {task[\"failed_response\"]}\n", - "\"\"\"\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "Vu70o024lenI" - }, - "source": [ - "# The Criteria\n", - "Now, we print the designed criteria for assessing math problems. " - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "k9DsDB5hqvtG", - "outputId": "0edd7a0c-b031-4f67-efc6-1a1e77066921" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33mcritic_user\u001b[0m (to critic):\n", - "\n", - "Task: Math problem solving.\n", - "Task description: Given any question, the system needs to solve the problem as consisely and acccurately as possible\n", - "Task successfull example: {\n", - " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", - " \"level\": \"Level 5\",\n", - " \"type\": \"Number Theory\",\n", - " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", - " \"problem_id\": \"0\",\n", - " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", - " \"round\": 0,\n", - " \"messages\": [\n", - " {\n", - " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", - " \"role\": \"user\"\n", - " },\n", - " {\n", - " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", - " \"role\": \"assistant\"\n", - " }\n", - " ],\n", - " \"time\": 11.140539407730103,\n", - " \"trial\": -1\n", - "}\n", - "Task failed example: {\n", - " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", - " \"level\": \"Level 5\",\n", - " \"type\": \"Algebra\",\n", - " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", - " \"role\": \"assistant\"\n", - " },\n", - " {\n", - " \"content\": \"\",\n", - " \"role\": \"user\"\n", - " },\n", - " {\n", - " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", - " \"role\": \"assistant\"\n", - " }\n", - " ],\n", - " \"time\": 24.91333508491516,\n", - " \"trial\": -1\n", - "}\n", - "\n", - "\n", - "--------------------------------------------------------------------------------\n", - "\u001b[33mcritic\u001b[0m (to critic_user):\n", - "\n", - "{\n", - " \"accuracy\": {\n", - " \"description\": \"Measures the correctness of the problem solution\",\n", - " \"accepted_values\": [\"correct\", \"incorrect\"]\n", - " },\n", - " \"conciseness\": {\n", - " \"description\": \"Determines if the solution is provided in the most concise way possible\",\n", - " \"accepted_values\": [\"not concise\", \"fairly concise\", \"very concise\"]\n", - " },\n", - " \"problem_solving_time\": {\n", - " \"description\": \"Measures the time taken by the system to solve the problem\",\n", - " \"accepted_values\": [\"0-1 minutes\", \"1-5 minutes\", \"5-10 minutes\", \"10+ minutes\"]\n", - " },\n", - " \"clarity\": {\n", - " \"description\": \"Assesses the clarity of the solution provided by the system\",\n", - " \"accepted_values\": [\"not clear\", \"fairly clear\", \"very clear\"]\n", - " },\n", - " \"difficulty_level\": {\n", - " \"description\": \"The level of difficulty of the problem\",\n", - " \"accepted_values\": [\"level 1\", \"level 2\", \"level 3\", \"level 4\", \"level 5\"]\n", - " },\n", - " \"mathematics_discipline\": {\n", - " \"description\": \"The branch of mathematics the problem belongs to e.g algebra, number theory\",\n", - " \"accepted_values\": [\"algebra\", \"number theory\", \"calculus\", \"geometry\", \"statistics\", \"combinatorics\"]\n", - " }\n", - "}\n", - "\n", - "--------------------------------------------------------------------------------\n" - ] - } - ], - "source": [ - "\n", - "current_task_name = '_'.join(task[\"name\"].split()).lower()\n", - "gen_criteria = critic_user.initiate_chat(critic, message=sys_msg)\n", - "criteria = critic_user.last_message()\n", - "cr_file = open(f\"../test/test_files/agenteval-in-out/{current_task_name}_criteria.json\",\"w\")\n", - "cr_file.write(criteria[\"content\"])\n", - "cr_file.close()" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "PETPZluOEGCR" - }, - "source": [ - "*Note :* You can also define and use your own criteria by editing `criteria.txt`" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "SmpUZv_ylo9U" - }, - "source": [ - "# The `QuantifierAgent`\n", - "\n", - "Once we have the criteria, we need to quantify a new sample based on the designed criteria and its accepted values. This will be done through `QuantifierAgent` agent as follows. \n", - "We note that can skip the designed creteria by the agent and use your own defined criteria in `criteria_file`." - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": { - "id": "4uUkZJh_subA" - }, - "outputs": [], - "source": [ - "import json\n", - "\n", - "criteria_file = f\"../test/test_files/agenteval-in-out/{current_task_name}_criteria.json\"\n", - "quantifier = autogen.AssistantAgent(\n", - " name = \"quantifier\",\n", - " llm_config = {\"config_list\": config_list},\n", - " system_message = \"\"\"You are a helpful assistant. You quantify the output of different tasks based on the given criteria.\n", - " The criterion is given in a dictionary format where each key is a dintinct criteria.\n", - " The value of each key is a dictionary as follows {\"description\": criteria description , \"accepted_values\": possible accepted inputs for this key}\n", - " You are going to quantify each of the crieria for a given task based on the task decription.\n", - " Return a dictionary where the keys are the criteria and the values are the assessed performance based on accepted values for each criteria.\n", - " Return only the dictionary.\"\"\"\n", - ")\n", - "\n", - "quantifier_user = autogen.UserProxyAgent(\n", - " name = \"quantifier_user\",\n", - " max_consecutive_auto_reply = 0, # terminate without auto-reply\n", - " human_input_mode = \"NEVER\",\n", - ")\n", - "\n", - "dictionary_for_eval = open(criteria_file,\"r\").read()\n", - "\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "64rRJfB2l6lO" - }, - "source": [ - "## Running the quantifier on a single test case" - ] - }, - { - "cell_type": "code", - "execution_count": 18, - "metadata": { - "id": "zQ0H3sy8l-Ai" - }, - "outputs": [], - "source": [ - "import os\n", - "\n", - "def get_quantifier(file,criteria_file):\n", - " \"\"\"\n", - " Running quantifier agent on individual log.\n", - "\n", - " Args:\n", - " - file (str): The log path.\n", - " - file (str): The criteria jason file path\n", - " Returns:\n", - " - dict: A dictionary including the actual success of the problem as well as estimated performance by the agent eval.\n", - " {\"actual_success\":actual_label, \"estimated_performance\" : a dictionary of all the criteria and their quantified estimated performance.} }\n", - " \"\"\"\n", - " dictionary_for_eval = open(criteria_file,\"r\").read()\n", - "\n", - " test_case , actual_label = read_without_groundtruth(file)\n", - " print(\"actual label for this case: \", actual_label)\n", - " cq_results = quantifier_user.initiate_chat(quantifier, message = sys_msg + \\\n", - " \"Evaluation dictionary: \" + str(dictionary_for_eval) +\\\n", - " \"actual test case to evaluate: \" + test_case)\n", - " quantified_results = quantifier_user.last_message()\n", - " return {\"actual_success\": actual_label, \"estimated_performance\": quantified_results[\"content\"]}\n", - "\n" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here, we run the quantifier on a single math problem test case, `sample_test_case.json`, for demonstration." - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "Pf623aNbHZTG", - "outputId": "0031871b-a438-43f5-d2b2-c99fa1ad0dbd" - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "actual label for this case: true\n", - "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", - "\n", - "Task: Math problem solving.\n", - "Task description: Given any question, the system needs to solve the problem as consisely and acccurately as possible\n", - "Task successfull example: {\n", - " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", - " \"level\": \"Level 5\",\n", - " \"type\": \"Number Theory\",\n", - " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", - " \"problem_id\": \"0\",\n", - " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", - " \"round\": 0,\n", - " \"messages\": [\n", - " {\n", - " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", - " \"role\": \"user\"\n", - " },\n", - " {\n", - " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", - " \"role\": \"assistant\"\n", - " }\n", - " ],\n", - " \"time\": 11.140539407730103,\n", - " \"trial\": -1\n", - "}\n", - "Task failed example: {\n", - " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", - " \"level\": \"Level 5\",\n", - " \"type\": \"Algebra\",\n", - " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", - " \"role\": \"assistant\"\n", - " },\n", - " {\n", - " \"content\": \"\",\n", - " \"role\": \"user\"\n", - " },\n", - " {\n", - " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", - " \"role\": \"assistant\"\n", - " }\n", - " ],\n", - " \"time\": 24.91333508491516,\n", - " \"trial\": -1\n", - "}\n", - "Evaluation dictionary: {\n", - " \"accuracy\": {\n", - " \"description\": \"Measures the correctness of the problem solution\",\n", - " \"accepted_values\": [\"correct\", \"incorrect\"]\n", - " },\n", - " \"conciseness\": {\n", - " \"description\": \"Determines if the solution is provided in the most concise way possible\",\n", - " \"accepted_values\": [\"not concise\", \"fairly concise\", \"very concise\"]\n", - " },\n", - " \"problem_solving_time\": {\n", - " \"description\": \"Measures the time taken by the system to solve the problem\",\n", - " \"accepted_values\": [\"0-1 minutes\", \"1-5 minutes\", \"5-10 minutes\", \"10+ minutes\"]\n", - " },\n", - " \"clarity\": {\n", - " \"description\": \"Assesses the clarity of the solution provided by the system\",\n", - " \"accepted_values\": [\"not clear\", \"fairly clear\", \"very clear\"]\n", - " },\n", - " \"difficulty_level\": {\n", - " \"description\": \"The level of difficulty of the problem\",\n", - " \"accepted_values\": [\"level 1\", \"level 2\", \"level 3\", \"level 4\", \"level 5\"]\n", - " },\n", - " \"mathematics_discipline\": {\n", - " \"description\": \"The branch of mathematics the problem belongs to e.g algebra, number theory\",\n", - " \"accepted_values\": [\"algebra\", \"number theory\", \"calculus\", \"geometry\", \"statistics\", \"combinatorics\"]\n", - " }\n", - "}actual test case to evaluate: {\n", - " \"problem\": \"Find $24^{-1} \\\\pmod{11^2}$. That is, find the residue $b$ for which $24b \\\\equiv 1\\\\pmod{11^2}$.\\n\\nExpress your answer as an integer from $0$ to $11^2-1$, inclusive.\",\n", - " \"level\": \"Level 5\",\n", - " \"type\": \"Number Theory\",\n", - " \"solution\": \"Since $5 \\\\times 24 = 120 = 121 - 1$, it follows that $-5 \\\\times 24 \\\\equiv 1 \\\\pmod{121}$. Adding 121 to $-5$ to make it positive, we find $(-5 + 121) \\\\times 24 \\\\equiv 116 \\\\times 24 \\\\equiv 1 \\\\pmod{121}$, so it follows that the modular inverse of $24$ is $\\\\boxed{116}$ when taken modulo $121$.\",\n", - " \"problem_id\": \"5\",\n", - " \"response_with_ans\": \"To find the modular inverse of 24 modulo 11^2, we can use the Extended Euclidean Algorithm. Here is a Python function to compute the modular inverse using this algorithm:\\n\\n```python\\ndef mod_inverse(a, m):\\n g, x, _ = extended_gcd(a, m)\\n if g != 1:\\n raise Exception(f\\\"{a} and {m} are not coprime.\\\")\\n return x % m\\n\\ndef extended_gcd(a, b):\\n if a == 0:\\n return b, 0, 1\\n else:\\n g, x, y = extended_gcd(b % a, a)\\n return g, y - (b // a) * x, x\\n```\\n\\nLet's use the above function to find the modular inverse of 24 modulo 11^2:\\n\\n```python\\na = 24\\nm = 11**2\\nmod_inverse(a, m)\\n```\\n\\nI will execute the above code to find the modular inverse of 24 modulo 11^2.\",\n", - " \"round\": 0,\n", - " \"messages\": [\n", - " {\n", - " \"content\": \"Find $24^{-1} \\\\pmod{11^2}$. That is, find the residue $b$ for which $24b \\\\equiv 1\\\\pmod{11^2}$.\\n\\nExpress your answer as an integer from $0$ to $11^2-1$, inclusive.\",\n", - " \"role\": \"user\"\n", - " },\n", - " {\n", - " \"content\": \"To find the modular inverse of 24 modulo 11^2, we can use the Extended Euclidean Algorithm. Here is a Python function to compute the modular inverse using this algorithm:\\n\\n```python\\ndef mod_inverse(a, m):\\n g, x, _ = extended_gcd(a, m)\\n if g != 1:\\n raise Exception(f\\\"{a} and {m} are not coprime.\\\")\\n return x % m\\n\\ndef extended_gcd(a, b):\\n if a == 0:\\n return b, 0, 1\\n else:\\n g, x, y = extended_gcd(b % a, a)\\n return g, y - (b // a) * x, x\\n```\\n\\nLet's use the above function to find the modular inverse of 24 modulo 11^2:\\n\\n```python\\na = 24\\nm = 11**2\\nmod_inverse(a, m)\\n```\\n\\nI will execute the above code to find the modular inverse of 24 modulo 11^2.\",\n", - " \"role\": \"assistant\"\n", - " }\n", - " ],\n", - " \"time\": 13.481226921081543,\n", - " \"trial\": -1\n", - "}\n", - "\n", - "--------------------------------------------------------------------------------\n", - "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", - "\n", - "{\n", - " \"accuracy\": \"correct\",\n", - " \"conciseness\": \"very concise\",\n", - " \"problem_solving_time\": \"10+ minutes\",\n", - " \"clarity\": \"very clear\",\n", - " \"difficulty_level\": \"level 5\",\n", - " \"mathematics_discipline\": \"number theory\"\n", - "}\n", - "\n", - "--------------------------------------------------------------------------------\n", - "actual correctness: true\n", - "predicted coprrectness:\n", - " {\n", - " \"accuracy\": \"correct\",\n", - " \"conciseness\": \"very concise\",\n", - " \"problem_solving_time\": \"10+ minutes\",\n", - " \"clarity\": \"very clear\",\n", - " \"difficulty_level\": \"level 5\",\n", - " \"mathematics_discipline\": \"number theory\"\n", - "}\n" - ] - } - ], - "source": [ - "test_case = \"../test/test_files/agenteval-in-out/samples/sample_test_case.json\"\n", - "quantifier_output = get_quantifier(test_case,criteria_file)\n", - "print(\"actual correctness:\" , quantifier_output[\"actual_success\"])\n", - "print(\"predicted coprrectness:\\n\" , quantifier_output[\"estimated_performance\"])" - ] + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "-pftZ-ZF1_BA" + }, + "source": [ + "\"Open" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "NPUGFpKP1_BH" + }, + "source": [ + "# Demonstrating the `AgentEval` framework using the task of solving math problems as an example\n", + "\n", + "This notebook aims to demonstrate how to `AgentEval` implemented through [AutoGen](https://github.com/microsoft/autogen) works, where we use a math problem-solving task as an example. \n", + "`AgentEval` consists of two key components:\n", + "\n", + "- `CriticAgent`: This is an LLM-based agent that generates a list criteria $(c_1, \\dots, c_n)$ to help to evaluate a utility given task.\n", + "\n", + "- `QuantifierAgent`: This agent quantifies the performance of any sample task based on the criteria designed by the `CriticAgent` in the following way: $(c_1=a_1, \\dots, c_n=a_n)$\n", + "\n", + "![AgentEval](../website/blog/2023-11-20-AgentEval/img/agenteval-CQ.png)\n", + "\n", + "For more detailed explanations, please refer to the accompanying [blog post](https://microsoft.github.io/autogen/blog/2023/11/20/AgentEval)\n", + "\n", + "## Requirements\n", + "\n", + "AutoGen requires `Python>=3.8`. To run this notebook example, please install pyautogen, Docker, and OpenAI:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, - { - "cell_type": "markdown", - "metadata": { - "id": "2VtdM44WEGCS" - }, - "source": [ - "# Run `AgentEval` on the logs\n", - "\n", - "In the example below, log_path points to the sample logs folder to run the quantifier. The current sample belongs to the prealgebra category which will be downloaded from [here](https://github.com/julianakiseleva/autogen/tree/agenteval/test/test_files/agenteval-in-out/samples).\n", - "In case you want to replicate the results described in the blog post, you can download all the logs for math problems using the following [link](https://github.com/julianakiseleva/autogen/tree/agenteval/model-logs/math-problems/agentchat). " - ] + "execution": { + "iopub.execute_input": "2023-02-13T23:40:52.317406Z", + "iopub.status.busy": "2023-02-13T23:40:52.316561Z", + "iopub.status.idle": "2023-02-13T23:40:52.321193Z", + "shell.execute_reply": "2023-02-13T23:40:52.320628Z" }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "!wget https://github.com/julianakiseleva/autogen/blob/agenteval/test/test_files/agenteval-in-out/samples/prealgebra.zip \n", - "!unzip z.zip -d ../test/test_files/agenteval-in-out/agentchat_results\n", - "!rm prealgebra.zip " - ] + "id": "68lTZZyJ1_BI", + "outputId": "15a55fab-e13a-4654-b8cb-ae117478d6d8" + }, + "outputs": [], + "source": [ + "%pip install \"pyautogen>=0.2.3\" docker\n", + "%pip install scipy\n", + "%pip install matplotlib" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "HxgqKJrd1_BJ" + }, + "source": [ + "## Set your API Endpoint\n", + "\n", + "* The [`config_list_openai_aoai`](https://microsoft.github.io/autogen/docs/reference/oai/openai_utils#config_list_openai_aoai) function tries to create a list of configurations using Azure OpenAI endpoints and OpenAI endpoints. It assumes the api keys and api bases are stored in the corresponding environment variables or local txt files:\n", + " - OpenAI API key: os.environ[\"OPENAI_API_KEY\"] or `openai_api_key_file=\"key_openai.txt\"`.\n", + " - Azure OpenAI API key: os.environ[\"AZURE_OPENAI_API_KEY\"] or `aoai_api_key_file=\"key_aoai.txt\"`. Multiple keys can be stored, one per line.\n", + " - Azure OpenAI API base: os.environ[\"AZURE_OPENAI_API_BASE\"] or `aoai_api_base_file=\"base_aoai.txt\"`. Multiple bases can be stored, one per line.\n", + "* The [`config_list_from_json`](https://microsoft.github.io/autogen/docs/reference/oai/openai_utils#config_list_from_json) function loads a list of configurations from an environment variable or a json file. It first looks for an environment variable with a specified name. The value of the environment variable needs to be a valid json string. If that variable is not found, it looks for a json file with the same name. It filters the configs by filter_dict.\n", + "\n", + "You can set the value of config_list in any way you prefer. Please refer to this [notebook](https://github.com/microsoft/autogen/blob/main/notebook/oai_openai_utils.ipynb) for full code examples of the different methods.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "YRycFEDJ1_BJ" + }, + "outputs": [], + "source": [ + "import autogen\n", + "\n", + "config_list = autogen.config_list_from_json(\n", + " \"OAI_CONFIG_LIST\",\n", + " filter_dict={\n", + " \"model\": [\"gpt-4\"],\n", + " },\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "fBZ-XFXy1_BJ" + }, + "source": [ + "\n", + "## Construct `CriticAgent`\n", + "\n", + "We construct the planning agent named `critic` and a user proxy agent for the critic named `critic_user`. We specify `human_input_mode` as \"NEVER\" in the user proxy agent, ensuring that it will never ask for human feedback. Additionally, we define the `ask_critic` function to send a message to the critic and retrieve the criteria from the critic.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "id": "9XAeyjd11_BK" + }, + "outputs": [], + "source": [ + "critic = autogen.AssistantAgent(\n", + " name=\"critic\",\n", + " llm_config={\"config_list\": config_list},\n", + " system_message=\"\"\"You are a helpful assistant. You suggest criteria for evaluating different tasks. They should be dinstinguishable, quantifieable and not redundant.\n", + " Convert the evaluation criteria into a dictionary where the keys are the criteria.\n", + " The value of each key is a dictionary as follows {\"description\": criteria description , \"accepted_values\": possible accepted inputs for this key}\n", + " Make sure the keys are criteria for assessing the given task. \"accepted_values\" include the acceptable inputs for each key that are fine-grained and preferably multi-graded levels. \"description\" includes the criterion description.\n", + " Return the dictionary.\"\"\",\n", + ")\n", + "\n", + "critic_user = autogen.UserProxyAgent(\n", + " name=\"critic_user\",\n", + " max_consecutive_auto_reply=0, # terminate without auto-reply\n", + " human_input_mode=\"NEVER\",\n", + ")\n", + "\n", + "\n", + "def ask_critic(message):\n", + " \"\"\"\n", + " Initiate a chat with the critic user and return the last message received from the planner.\n", + "\n", + " Args:\n", + " - message (str): The message to be sent to the critic user.\n", + "\n", + " Returns:\n", + " - str: The content of the last message received.\n", + " \"\"\"\n", + " critic_user.initiate_chat(critic, message=message)\n", + " # return the last received from the planner\n", + " return critic_user.messagelast_message()[\"content\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "6vPTtNkhk2V1" + }, + "source": [ + "# Run the Critic\n", + "\n", + "To run the critic, we need a couple of math problem examples. One of them failed to solve the problem successfully, given in `agenteval-in-out/response_failed.txt`, and the other one was solved successfully, i.e., `agenteval-in-out/response_successful.txt`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "id": "5H1WRs_wkiK0" + }, + "outputs": [], + "source": [ + "def read_without_groundtruth(file_name):\n", + " \"\"\"\n", + " Read the mathproblem logs - bypassing any information about the ground truths.\n", + "\n", + " Args:\n", + " - file_name (str): The single log file that wants to get evaluated.\n", + "\n", + " Returns:\n", + " - str: The log file without any information about the ground truth answer of the problem.\n", + " \"\"\"\n", + " f = open(file_name, \"r\").readlines()\n", + " output_dictionary = \"\"\n", + " for line in f:\n", + " if \"is_correct\" not in line and \"correct_ans\" not in line and \"check_result\" not in line:\n", + " output_dictionary += line\n", + " elif \"is_correct\" in line:\n", + " correctness = line.replace(\",\", \"\").split(\":\")[-1].rstrip().strip()\n", + " return [output_dictionary, correctness]\n", + "\n", + "\n", + "# Reading one successful and one failed example of the task\n", + "response_successful = read_without_groundtruth(\n", + " \"../test/test_files/agenteval-in-out/samples/sample_math_response_successful.txt\"\n", + ")[0]\n", + "response_failed = read_without_groundtruth(\n", + " \"../test/test_files/agenteval-in-out/samples/sample_math_response_failed.txt\"\n", + ")[0]\n", + "\n", + "task = {\n", + " \"name\": \"Math problem solving\",\n", + " \"description\": \"Given any question, the system needs to solve the problem as consisely and accurately as possible\",\n", + " \"successful_response\": response_successful,\n", + " \"failed_response\": response_failed,\n", + "}\n", + "\n", + "sys_msg = f\"\"\"Task: {task[\"name\"]}.\n", + "Task description: {task[\"description\"]}\n", + "Task successful example: {task[\"successful_response\"]}\n", + "Task failed example: {task[\"failed_response\"]}\n", + "\"\"\"" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "Vu70o024lenI" + }, + "source": [ + "# The Criteria\n", + "Now, we print the designed criteria for assessing math problems. " + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "k9DsDB5hqvtG", + "outputId": "0edd7a0c-b031-4f67-efc6-1a1e77066921" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "dZdIbHPFEGCS", - "outputId": "83c0a51b-f184-494b-81a0-d4b4a3667319" - }, - "outputs": [], - "source": [ - "# You can set your own log path - we also limited the number of samples to avoid additional costs.\n", - "# By removing the condition about limitations on the number of samples per category, you can run it on all 120 problems\n", - "\n", - "log_path = \"../test/test_files/agenteval-in-out/agentchat_results/\"\n", - "criteria_file = \"../test/test_files/agenteval-in-out/samples/sample_math_criteria.json\"\n", - "outcome = {}\n", - "\n", - "for prefix in os.listdir(log_path):\n", - " for file_name in os.listdir(log_path+\"/\"+prefix):\n", - " gameid = prefix+\"_\"+file_name\n", - " if file_name.split('.')[-1]=='json':\n", - " outcome[gameid] = get_quantifier(log_path+\"/\"+prefix+\"/\"+file_name,criteria_file)\n", - "\n", - "# store the evaluated problems\n", - "with open(\"../test/test_files/agenteval-in-out/evaluated_problems.json\",\"w\") as file:\n", - " json.dump(outcome,file,indent=2) # use `json.loads` to do the reverse" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mcritic_user\u001b[0m (to critic):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mcritic\u001b[0m (to critic_user):\n", + "\n", + "In evaluating math problem-solving tasks, we can establish certain criteria to assess the level of success in solving the math problems. Below are the criteria with their corresponding descriptions and the accepted values:\n", + "\n", + "```python\n", + "evaluation_criteria = {\n", + " \"accuracy\": {\n", + " \"description\": \"Correctness of the final answer provided.\",\n", + " \"accepted_values\": {\n", + " \"correct\": \"The given answer is correct.\",\n", + " \"incorrect\": \"The given answer is incorrect.\",\n", + " \"partial\": \"The answer is partially correct with minor errors.\"\n", + " }\n", + " },\n", + " \"completeness\": {\n", + " \"description\": \"The extent to which all necessary steps are included and properly documented.\",\n", + " \"accepted_values\": {\n", + " \"complete\": \"All necessary steps are included and properly documented.\",\n", + " \"incomplete\": \"Some steps are missing or not properly documented.\",\n", + " \"overly_detailed\": \"The solution contains unnecessary detail that doesn't contribute to understanding.\"\n", + " }\n", + " },\n", + " \"efficiency\": {\n", + " \"description\": \"The method used to solve the problem is concise and does not include redundant steps.\",\n", + " \"accepted_values\": {\n", + " \"efficient\": \"The solution is found through the most direct method with no superfluous steps.\",\n", + " \"inefficient\": \"The method used is not the most direct and may include redundant steps.\",\n", + " \"acceptable\": \"The method used is reasonably direct with little redundancy.\"\n", + " }\n", + " },\n", + " \"methodology\": {\n", + " \"description\": \"The approach used to solve the problem, including the use of formulas, theorems, and problem-solving techniques.\",\n", + " \"accepted_values\": {\n", + " \"appropriate\": \"The methodology used is appropriate for the problem.\",\n", + " \"inappropriate\": \"The methodology used is not suitable for the problem.\",\n", + " \"partially_appropriate\": \"The methodology used is partially suitable but could be improved.\"\n", + " }\n", + " },\n", + " \"clarity\": {\n", + " \"description\": \"The ease with which the solution can be understood by others.\",\n", + " \"accepted_values\": {\n", + " \"clear\": \"The solution is presented in a clear, logical manner that is easy to follow.\",\n", + " \"unclear\": \"The solution is difficult to follow or understand.\",\n", + " \"somewhat_clear\": \"The solution is generally clear but could be improved in some areas for better understanding.\"\n", + " }\n", + " },\n", + " \"use_of_language\": {\n", + " \"description\": \"The correctness and appropriateness of mathematical language and notation.\",\n", + " \"accepted_values\": {\n", + " \"appropriate\": \"The language and notation are mathematically sound and correctly applied.\",\n", + " \"inappropriate\": \"The language and notation have errors or are misapplied.\",\n", + " \"mostly_appropriate\": \"The language and notation are mostly correct, but there are minor errors or inconsistencies.\"\n", + " }\n", + " }\n", + "}\n", + "```\n", + "\n", + "These criteria should provide a comprehensive framework for evaluating math problem-solving tasks in terms of accuracy, completeness, efficiency, and clarity.\n", + "\n", + "--------------------------------------------------------------------------------\n" + ] + } + ], + "source": [ + "current_task_name = \"_\".join(task[\"name\"].split()).lower()\n", + "gen_criteria = critic_user.initiate_chat(critic, message=sys_msg)\n", + "criteria = critic_user.last_message()\n", + "cr_file = open(f\"../test/test_files/agenteval-in-out/{current_task_name}_criteria.json\", \"w\")\n", + "cr_file.write(criteria[\"content\"])\n", + "cr_file.close()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PETPZluOEGCR" + }, + "source": [ + "*Note :* You can also define and use your own criteria by editing `criteria.txt`" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "SmpUZv_ylo9U" + }, + "source": [ + "# The `QuantifierAgent`\n", + "\n", + "Once we have the criteria, we need to quantify a new sample based on the designed criteria and its accepted values. This will be done through `QuantifierAgent` agent as follows. \n", + "We note that can skip the designed criteria by the agent and use your own defined criteria in `criteria_file`." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "id": "4uUkZJh_subA" + }, + "outputs": [], + "source": [ + "import json\n", + "\n", + "criteria_file = f\"../test/test_files/agenteval-in-out/{current_task_name}_criteria.json\"\n", + "quantifier = autogen.AssistantAgent(\n", + " name=\"quantifier\",\n", + " llm_config={\"config_list\": config_list},\n", + " system_message=\"\"\"You are a helpful assistant. You quantify the output of different tasks based on the given criteria.\n", + " The criterion is given in a dictionary format where each key is a dintinct criteria.\n", + " The value of each key is a dictionary as follows {\"description\": criteria description , \"accepted_values\": possible accepted inputs for this key}\n", + " You are going to quantify each of the crieria for a given task based on the task description.\n", + " Return a dictionary where the keys are the criteria and the values are the assessed performance based on accepted values for each criteria.\n", + " Return only the dictionary.\"\"\",\n", + ")\n", + "\n", + "quantifier_user = autogen.UserProxyAgent(\n", + " name=\"quantifier_user\",\n", + " max_consecutive_auto_reply=0, # terminate without auto-reply\n", + " human_input_mode=\"NEVER\",\n", + ")\n", + "\n", + "dictionary_for_eval = open(criteria_file, \"r\").read()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "64rRJfB2l6lO" + }, + "source": [ + "## Running the quantifier on a single test case" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "id": "zQ0H3sy8l-Ai" + }, + "outputs": [], + "source": [ + "import os\n", + "\n", + "\n", + "def get_quantifier(file, criteria_file):\n", + " \"\"\"\n", + " Running quantifier agent on individual log.\n", + "\n", + " Args:\n", + " - file (str): The log path.\n", + " - file (str): The criteria jason file path\n", + " Returns:\n", + " - dict: A dictionary including the actual success of the problem as well as estimated performance by the agent eval.\n", + " {\"actual_success\":actual_label, \"estimated_performance\" : a dictionary of all the criteria and their quantified estimated performance.} }\n", + " \"\"\"\n", + " dictionary_for_eval = open(criteria_file, \"r\").read()\n", + "\n", + " test_case, actual_label = read_without_groundtruth(file)\n", + " print(\"actual label for this case: \", actual_label)\n", + " cq_results = quantifier_user.initiate_chat(\n", + " quantifier,\n", + " message=sys_msg\n", + " + \"Evaluation dictionary: \"\n", + " + str(dictionary_for_eval)\n", + " + \"actual test case to evaluate: \"\n", + " + test_case,\n", + " )\n", + " quantified_results = quantifier_user.last_message()\n", + " return {\"actual_success\": actual_label, \"estimated_performance\": quantified_results[\"content\"]}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here, we run the quantifier on a single math problem test case, `sample_test_case.json`, for demonstration." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "Pf623aNbHZTG", + "outputId": "0031871b-a438-43f5-d2b2-c99fa1ad0dbd" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": { - "id": "qbrRRiP_EGCT" - }, - "source": [ - "## Plotting the estimated performance" - ] - }, + "name": "stdout", + "output_type": "stream", + "text": [ + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: In evaluating math problem-solving tasks, we can establish certain criteria to assess the level of success in solving the math problems. Below are the criteria with their corresponding descriptions and the accepted values:\n", + "\n", + "```python\n", + "evaluation_criteria = {\n", + " \"accuracy\": {\n", + " \"description\": \"Correctness of the final answer provided.\",\n", + " \"accepted_values\": {\n", + " \"correct\": \"The given answer is correct.\",\n", + " \"incorrect\": \"The given answer is incorrect.\",\n", + " \"partial\": \"The answer is partially correct with minor errors.\"\n", + " }\n", + " },\n", + " \"completeness\": {\n", + " \"description\": \"The extent to which all necessary steps are included and properly documented.\",\n", + " \"accepted_values\": {\n", + " \"complete\": \"All necessary steps are included and properly documented.\",\n", + " \"incomplete\": \"Some steps are missing or not properly documented.\",\n", + " \"overly_detailed\": \"The solution contains unnecessary detail that doesn't contribute to understanding.\"\n", + " }\n", + " },\n", + " \"efficiency\": {\n", + " \"description\": \"The method used to solve the problem is concise and does not include redundant steps.\",\n", + " \"accepted_values\": {\n", + " \"efficient\": \"The solution is found through the most direct method with no superfluous steps.\",\n", + " \"inefficient\": \"The method used is not the most direct and may include redundant steps.\",\n", + " \"acceptable\": \"The method used is reasonably direct with little redundancy.\"\n", + " }\n", + " },\n", + " \"methodology\": {\n", + " \"description\": \"The approach used to solve the problem, including the use of formulas, theorems, and problem-solving techniques.\",\n", + " \"accepted_values\": {\n", + " \"appropriate\": \"The methodology used is appropriate for the problem.\",\n", + " \"inappropriate\": \"The methodology used is not suitable for the problem.\",\n", + " \"partially_appropriate\": \"The methodology used is partially suitable but could be improved.\"\n", + " }\n", + " },\n", + " \"clarity\": {\n", + " \"description\": \"The ease with which the solution can be understood by others.\",\n", + " \"accepted_values\": {\n", + " \"clear\": \"The solution is presented in a clear, logical manner that is easy to follow.\",\n", + " \"unclear\": \"The solution is difficult to follow or understand.\",\n", + " \"somewhat_clear\": \"The solution is generally clear but could be improved in some areas for better understanding.\"\n", + " }\n", + " },\n", + " \"use_of_language\": {\n", + " \"description\": \"The correctness and appropriateness of mathematical language and notation.\",\n", + " \"accepted_values\": {\n", + " \"appropriate\": \"The language and notation are mathematically sound and correctly applied.\",\n", + " \"inappropriate\": \"The language and notation have errors or are misapplied.\",\n", + " \"mostly_appropriate\": \"The language and notation are mostly correct, but there are minor errors or inconsistencies.\"\n", + " }\n", + " }\n", + "}\n", + "```\n", + "\n", + "These criteria should provide a comprehensive framework for evaluating math problem-solving tasks in terms of accuracy, completeness, efficiency, and clarity.actual test case to evaluate: {\n", + " \"problem\": \"Find $24^{-1} \\\\pmod{11^2}$. That is, find the residue $b$ for which $24b \\\\equiv 1\\\\pmod{11^2}$.\\n\\nExpress your answer as an integer from $0$ to $11^2-1$, inclusive.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Since $5 \\\\times 24 = 120 = 121 - 1$, it follows that $-5 \\\\times 24 \\\\equiv 1 \\\\pmod{121}$. Adding 121 to $-5$ to make it positive, we find $(-5 + 121) \\\\times 24 \\\\equiv 116 \\\\times 24 \\\\equiv 1 \\\\pmod{121}$, so it follows that the modular inverse of $24$ is $\\\\boxed{116}$ when taken modulo $121$.\",\n", + " \"problem_id\": \"5\",\n", + " \"response_with_ans\": \"To find the modular inverse of 24 modulo 11^2, we can use the Extended Euclidean Algorithm. Here is a Python function to compute the modular inverse using this algorithm:\\n\\n```python\\ndef mod_inverse(a, m):\\n g, x, _ = extended_gcd(a, m)\\n if g != 1:\\n raise Exception(f\\\"{a} and {m} are not coprime.\\\")\\n return x % m\\n\\ndef extended_gcd(a, b):\\n if a == 0:\\n return b, 0, 1\\n else:\\n g, x, y = extended_gcd(b % a, a)\\n return g, y - (b // a) * x, x\\n```\\n\\nLet's use the above function to find the modular inverse of 24 modulo 11^2:\\n\\n```python\\na = 24\\nm = 11**2\\nmod_inverse(a, m)\\n```\\n\\nI will execute the above code to find the modular inverse of 24 modulo 11^2.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"Find $24^{-1} \\\\pmod{11^2}$. That is, find the residue $b$ for which $24b \\\\equiv 1\\\\pmod{11^2}$.\\n\\nExpress your answer as an integer from $0$ to $11^2-1$, inclusive.\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the modular inverse of 24 modulo 11^2, we can use the Extended Euclidean Algorithm. Here is a Python function to compute the modular inverse using this algorithm:\\n\\n```python\\ndef mod_inverse(a, m):\\n g, x, _ = extended_gcd(a, m)\\n if g != 1:\\n raise Exception(f\\\"{a} and {m} are not coprime.\\\")\\n return x % m\\n\\ndef extended_gcd(a, b):\\n if a == 0:\\n return b, 0, 1\\n else:\\n g, x, y = extended_gcd(b % a, a)\\n return g, y - (b // a) * x, x\\n```\\n\\nLet's use the above function to find the modular inverse of 24 modulo 11^2:\\n\\n```python\\na = 24\\nm = 11**2\\nmod_inverse(a, m)\\n```\\n\\nI will execute the above code to find the modular inverse of 24 modulo 11^2.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 13.481226921081543,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "```json\n", + "{\n", + " \"accuracy\": \"correct\",\n", + " \"completeness\": \"complete\",\n", + " \"efficiency\": \"efficient\",\n", + " \"methodology\": \"appropriate\",\n", + " \"clarity\": \"clear\",\n", + " \"use_of_language\": \"appropriate\"\n", + "}\n", + "```\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual correctness: true\n", + "predicted coprrectness:\n", + " ```json\n", + "{\n", + " \"accuracy\": \"correct\",\n", + " \"completeness\": \"complete\",\n", + " \"efficiency\": \"efficient\",\n", + " \"methodology\": \"appropriate\",\n", + " \"clarity\": \"clear\",\n", + " \"use_of_language\": \"appropriate\"\n", + "}\n", + "```\n" + ] + } + ], + "source": [ + "test_case = \"../test/test_files/agenteval-in-out/samples/sample_test_case.json\"\n", + "quantifier_output = get_quantifier(test_case, criteria_file)\n", + "print(\"actual correctness:\", quantifier_output[\"actual_success\"])\n", + "print(\"predicted coprrectness:\\n\", quantifier_output[\"estimated_performance\"])" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "2VtdM44WEGCS" + }, + "source": [ + "# Run `AgentEval` on the logs\n", + "\n", + "In the example below, log_path points to the sample logs folder to run the quantifier. The current sample belongs to the prealgebra category which will be downloaded from [here](https://github.com/julianakiseleva/autogen/tree/agenteval/test/test_files/agenteval-in-out/samples).\n", + "In case you want to replicate the results described in the blog post, you can download all the logs for math problems using the following [link](https://github.com/julianakiseleva/autogen/tree/agenteval/model-logs/math-problems/agentchat). " + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Here you can find an example of how to visualize the obtained result in the histogram form (similar to the one in the blog post)." - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "--2024-01-06 19:06:41-- https://github.com/julianakiseleva/autogen/raw/ddabd4f0e7c13a50e33cf8462e79358666371477/test/test_files/agenteval-in-out/prealgebra.zip\n", + "Resolving github.com (github.com)... 140.82.121.4\n", + "Connecting to github.com (github.com)|140.82.121.4|:443... connected.\n", + "HTTP request sent, awaiting response... 302 Found\n", + "Location: https://raw.githubusercontent.com/julianakiseleva/autogen/ddabd4f0e7c13a50e33cf8462e79358666371477/test/test_files/agenteval-in-out/prealgebra.zip [following]\n", + "--2024-01-06 19:06:41-- https://raw.githubusercontent.com/julianakiseleva/autogen/ddabd4f0e7c13a50e33cf8462e79358666371477/test/test_files/agenteval-in-out/prealgebra.zip\n", + "Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.108.133, 185.199.110.133, ...\n", + "Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... connected.\n", + "HTTP request sent, awaiting response... 200 OK\n", + "Length: 28567 (28K) [application/zip]\n", + "Saving to: ‘prealgebra.zip’\n", + "\n", + "prealgebra.zip 100%[===================>] 27.90K --.-KB/s in 0.005s \n", + "\n", + "2024-01-06 19:06:41 (5.85 MB/s) - ‘prealgebra.zip’ saved [28567/28567]\n", + "\n", + "Archive: prealgebra.zip\n", + "warning: skipped \"../\" path component(s) in ../prealgebra/\n", + "warning: skipped \"../\" path component(s) in ../prealgebra/9.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/9.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/16.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/16.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/8.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/8.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/15.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/15.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/6.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/6.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/3.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/3.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/4.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/4.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/18.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/18.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/1.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/1.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/14.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/14.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/2.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/2.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/10.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/10.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/7.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/7.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/log.txt\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/log.txt \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/13.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/13.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/17.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/17.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/11.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/11.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/12.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/12.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/0.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/0.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/19.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/19.json \n", + "warning: skipped \"../\" path component(s) in ../prealgebra/5.json\n", + " inflating: ../test/test_files/agenteval-in-out/agentchat_results/prealgebra/5.json \n" + ] + } + ], + "source": [ + "from pathlib import Path\n", + "\n", + "log_path = \"../test/test_files/agenteval-in-out/agentchat_results/\"\n", + "\n", + "# The file is no longer in the repo, we can download it from an older commit\n", + "!wget https://github.com/julianakiseleva/autogen/raw/ddabd4f0e7c13a50e33cf8462e79358666371477/test/test_files/agenteval-in-out/prealgebra.zip\n", + "!unzip -o prealgebra.zip -d {log_path}\n", + "!rm prealgebra.zip\n", + "\n", + "assert Path(log_path).exists(), f\"The log path '{log_path}' does not exist.\"" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "dZdIbHPFEGCS", + "outputId": "83c0a51b-f184-494b-81a0-d4b4a3667319" + }, + "outputs": [ { - "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "LKu2xZJcEGCT", - "outputId": "7780bc7c-382f-4ad3-b8c6-ac6051302303" - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "import scipy.stats as stats\n", - "import matplotlib.pyplot as plt\n", - "\n", - "# computing average and 95% interval for failed and successful cases on all criteria\n", - "try:\n", - " # convert the criteria to dict type if it is already not\n", - " dictionary_for_eval = eval(open(criteria_file,'r').read())\n", - "except:\n", - " pass\n", - "\n", - "criteria = list(dictionary_for_eval.keys())\n", - "nl2int = {}\n", - "for criterion in dictionary_for_eval:\n", - " score = 0\n", - " for v in dictionary_for_eval[criterion][\"accepted_values\"]:\n", - " nl2int[v] = score\n", - " score += 1\n", - "print(nl2int)\n", - "\n", - "average_s = {}\n", - "average_f = {}\n", - "\n", - "conf_interval_s = {}\n", - "conf_interval_f = {}\n", - "\n", - "for criterion in criteria:\n", - " task={\"s\": [] , \"f\" : []}\n", - "\n", - " for game in outcome:\n", - " try:\n", - " tmp_dic = eval(outcome[game][\"estimated_performance\"])\n", - " if outcome[game][\"actual_success\"] == \"false\":\n", - " task[\"f\"].append(nl2int[tmp_dic[criterion]])\n", - " else:\n", - " task[\"s\"].append(nl2int[tmp_dic[criterion]])\n", - " except:\n", - " pass\n", - "\n", - " \n", - " average_f[criterion] = np.mean(task['f'])\n", - " average_s[criterion] = np.mean(task['s'])\n", - "\n", - " conf_interval_s[criterion] = stats.norm.interval(0.95, loc=np.mean(task['s']), scale=stats.sem(task['s']))\n", - " conf_interval_f[criterion] = stats.norm.interval(0.95, loc=np.mean(task['f']), scale=stats.sem(task['f']))\n" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"Amaretta's birthday is July 27, and her brother Enzo's birthday is September 3. Every year, Amaretta and Enzo celebrate by eating cake every day from Amaretta's birthday through Enzo's birthday (including both birthdays). If they did this for the first time in 2008, how many cake-eating days will they have observed by the end of 2016?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"There are $39$ cake-eating days each year: the last $5$ days of July, all $31$ days of August, and the first $3$ days of September.\\n\\nThere are $9$ years in the list $$2008,2009,2010,2011,2012,2013,2014,2015,2016.$$ Besides listing them out, we can also see this by subtracting $2007$ from each year, which gives us the list $1,2,3,4,5,6,7,8,9$ (which clearly has $9$ entries).\\n\\n$39$ cake-eating days each year for $9$ years make $39\\\\cdot 9 = \\\\boxed{351}$ days in total.\",\n", + " \"problem_id\": \"3\",\n", + " \"response_with_ans\": \"To calculate the total number of cake-eating days, we will first calculate the number of days between Amaretta's birthday and Enzo's birthday in a non-leap year and in a leap year. Then, we will count the number of leap years and non-leap years in the given range (2008-2016). Finally, we will sum the total number of days for each type of year for both non-leap and leap years.\\n\\nPlease run the following Python code:\\n\\n```python\\nfrom datetime import date\\n\\namaretta_birthday = date(2008, 7, 27)\\nenzo_birthday = date(2008, 9, 3)\\n\\nnormal_year_days = (enzo_birthday - amaretta_birthday).days + 1\\nleap_year_days = normal_year_days + 1\\n\\nleap_years = [year for year in range(2008, 2017) if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)]\\nnon_leap_years_count = 9 - len(leap_years)\\n\\ntotal_cake_eating_days = non_leap_years_count * normal_year_days + len(leap_years) * leap_year_days\\nprint(total_cake_eating_days)\\n```\\n\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"Amaretta's birthday is July 27, and her brother Enzo's birthday is September 3. Every year, Amaretta and Enzo celebrate by eating cake every day from Amaretta's birthday through Enzo's birthday (including both birthdays). If they did this for the first time in 2008, how many cake-eating days will they have observed by the end of 2016?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To calculate the total number of cake-eating days, we will first calculate the number of days between Amaretta's birthday and Enzo's birthday in a non-leap year and in a leap year. Then, we will count the number of leap years and non-leap years in the given range (2008-2016). Finally, we will sum the total number of days for each type of year for both non-leap and leap years.\\n\\nPlease run the following Python code:\\n\\n```python\\nfrom datetime import date\\n\\namaretta_birthday = date(2008, 7, 27)\\nenzo_birthday = date(2008, 9, 3)\\n\\nnormal_year_days = (enzo_birthday - amaretta_birthday).days + 1\\nleap_year_days = normal_year_days + 1\\n\\nleap_years = [year for year in range(2008, 2017) if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0)]\\nnon_leap_years_count = 9 - len(leap_years)\\n\\ntotal_cake_eating_days = non_leap_years_count * normal_year_days + len(leap_years) * leap_year_days\\nprint(total_cake_eating_days)\\n```\\n\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 15.208062410354614,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"very efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"Two numbers are said to be 'relatively prime' if their greatest common factor is 1. How many integers greater than 10 and less than 30 are relatively prime with 28?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"Since $28=2^2\\\\cdot 7$, a positive integer is relatively prime with $28$ if and only if it contains neither $2$ nor $7$ in its prime factorization. In other words, we want to count the number of integers between $11$ and $29$ inclusive which are divisible by neither $2$ nor $7$.\\n\\nAll of the odd numbers are not divisible by 2; there are 10 such numbers. The only one of these that is divisible by 7 is 21, so there are $10- 1 =\\\\boxed{9}$ numbers between 10 and 30 that are relatively prime with 28.\",\n", + " \"problem_id\": \"12\",\n", + " \"response_with_ans\": \"I will find the relatively prime numbers with 28 in the range greater than 10 and less than 30 using Python code. I will use the math.gcd function and a loop to check each number in the specified range.\\n\\n```python\\nimport math\\n\\ncount = 0\\nrelatively_prime_numbers = []\\nfor number in range(11, 30):\\n if math.gcd(28, number) == 1:\\n relatively_prime_numbers.append(number)\\n count += 1\\n\\nprint(f\\\"Relatively prime numbers with 28: {relatively_prime_numbers}\\\")\\nprint(f\\\"Number of relatively prime numbers with 28: {count}\\\")\\n```\\nExecute the above code to find the integers relatively prime with 28 and their count.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"Two numbers are said to be 'relatively prime' if their greatest common factor is 1. How many integers greater than 10 and less than 30 are relatively prime with 28?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I will find the relatively prime numbers with 28 in the range greater than 10 and less than 30 using Python code. I will use the math.gcd function and a loop to check each number in the specified range.\\n\\n```python\\nimport math\\n\\ncount = 0\\nrelatively_prime_numbers = []\\nfor number in range(11, 30):\\n if math.gcd(28, number) == 1:\\n relatively_prime_numbers.append(number)\\n count += 1\\n\\nprint(f\\\"Relatively prime numbers with 28: {relatively_prime_numbers}\\\")\\nprint(f\\\"Number of relatively prime numbers with 28: {count}\\\")\\n```\\nExecute the above code to find the integers relatively prime with 28 and their count.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 6.9820802211761475,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"moderately efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"How many positive and negative integers is $12$ a multiple of?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"The number $12$ is a multiple of $-12, -6, -4, -3, -2, -1, 1, 2, 3, 4, 6,$ and $12,$ for a total of $\\\\boxed{12}$ integers.\",\n", + " \"problem_id\": \"1\",\n", + " \"response_with_ans\": \"```python\\nnum = 12\\ndivisors = [i for i in range(1, num + 1) if num % i == 0]\\n\\npositive_divisors_count = len(divisors)\\nnegative_divisors_count = positive_divisors_count\\ntotal_divisors_count = positive_divisors_count + negative_divisors_count\\n\\nprint(f\\\"Positive divisors of 12: {divisors}\\\")\\ndivisors_negative = [-x for x in divisors]\\nprint(f\\\"Negative divisors of 12: {divisors_negative}\\\")\\nprint(f\\\"Total divisors count: {total_divisors_count}\\\")\\n```\\n\\nExecute this code snippet to find the divisors of 12 and count how many positive and negative integers 12 is a multiple of.\",\n", + " \"round\": 1,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"How many positive and negative integers is $12$ a multiple of?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To determine how many positive and negative integers 12 is a multiple of, we need to find the divisors of 12. Then we will double the number of divisors, as each positive divisor has a corresponding negative divisor.\\n\\nLet's use a Python code snippet to find all the divisors of 12 and count them.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"```python\\nnum = 12\\ndivisors = [i for i in range(1, num + 1) if num % i == 0]\\n\\npositive_divisors_count = len(divisors)\\nnegative_divisors_count = positive_divisors_count\\ntotal_divisors_count = positive_divisors_count + negative_divisors_count\\n\\nprint(f\\\"Positive divisors of 12: {divisors}\\\")\\ndivisors_negative = [-x for x in divisors]\\nprint(f\\\"Negative divisors of 12: {divisors_negative}\\\")\\nprint(f\\\"Total divisors count: {total_divisors_count}\\\")\\n```\\n\\nExecute this code snippet to find the divisors of 12 and count how many positive and negative integers 12 is a multiple of.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 17.360238790512085,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"moderately efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: false\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"In isosceles right triangle $ABC$, point $D$ is on hypotenuse $\\\\overline{BC}$ such that $\\\\overline{AD}$ is an altitude of $\\\\triangle ABC$ and $DC = 5$. What is the area of triangle $ABC$?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"In isosceles right triangle $\\\\triangle ABC$ below, $\\\\overline{AD}$ is the altitude to the hypotenuse.\\n\\n[asy]\\nimport olympiad;\\nunitsize(0.8inch);\\npair A,B,C,D;\\nA = (0,1);\\nB= (1,0);\\nC = -B;\\nD = (0,0);\\ndraw(A--B--C--A,linewidth(1));\\ndraw(A--D,linewidth(0.8));\\ndraw(rightanglemark(C,A,B,s=4));\\ndraw(rightanglemark(C,D,A,s=4));\\nlabel(\\\"$A$\\\",A,N);\\nlabel(\\\"$B$\\\",B,S);\\nlabel(\\\"$C$\\\",C,S);\\nlabel(\\\"$D$\\\",D,S);\\n[/asy]\\n\\nBecause $\\\\triangle ABC$ is an isosceles right triangle, $\\\\angle ABC = 45^\\\\circ$. Since $\\\\angle ADB = 90^\\\\circ$, we know that $\\\\angle DAB = 45^\\\\circ$, so $\\\\triangle ABD$ is also a 45-45-90 triangle. Similarly, $\\\\triangle ACD$ is a 45-45-90 triangle. Therefore, $DA=DB = DC = 5$, so $BC = BD+DC = 10$, and \\\\[[ABC] = \\\\frac{(AD)(BC)}{2} = \\\\frac{(5)({10})}{2} = \\\\boxed{25}.\\\\]\",\n", + " \"problem_id\": \"13\",\n", + " \"response_with_ans\": \"```python\\nfrom sympy import Eq, solve, symbols\\r\\n\\r\\n# Step 1: Find the length of side AC using the Pythagorean theorem\\r\\na, b, c = symbols(\\\"a b c\\\")\\r\\nPythagorean = Eq(a**2 + b**2, c**2)\\r\\n\\r\\n# We know BD = 5 and it's an isosceles right triangle so:\\r\\nBD = 5\\r\\nBC = BD * 2\\r\\nside_A = BD # Side A is equal to BD\\r\\n\\r\\nisosceles_triangle = Pythagorean.subs({a: side_A, b: side_A, c: BC}) # Substitute values into the equation\\r\\nlength_AC = solve(isosceles_triangle, side_A)[0] # Solve for side_AC\\r\\n\\r\\n# Step 2: Find the length of side AD\\r\\nlength_AD = (BD * length_AC) / BC # Using the proportion\\r\\n\\r\\n# Step 3: Find the area of triangle ABC\\r\\narea_triangle_ABC = 0.5 * (length_AD * length_AC)\\r\\n\\r\\nlength_AC, length_AD, area_triangle_ABC\\r\\n```\",\n", + " \"round\": 1,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"In isosceles right triangle $ABC$, point $D$ is on hypotenuse $\\\\overline{BC}$ such that $\\\\overline{AD}$ is an altitude of $\\\\triangle ABC$ and $DC = 5$. What is the area of triangle $ABC$?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Let's first analyze the problem and draw a plan to solve it.\\n\\nPlan:\\n1. Use the Pythagorean theorem to find the length of side AC.\\n2. Since right triangle ADC is similar to triangle ABC, we can set up a proportion to find the length of side AD.\\n3. Use the area formula of a triangle to find the area of triangle ABC.\\n\\nNow, let's execute the plan using code to calculate side AC, then side AD, and finally the area of triangle ABC.\\n\\n\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"```python\\nfrom sympy import Eq, solve, symbols\\r\\n\\r\\n# Step 1: Find the length of side AC using the Pythagorean theorem\\r\\na, b, c = symbols(\\\"a b c\\\")\\r\\nPythagorean = Eq(a**2 + b**2, c**2)\\r\\n\\r\\n# We know BD = 5 and it's an isosceles right triangle so:\\r\\nBD = 5\\r\\nBC = BD * 2\\r\\nside_A = BD # Side A is equal to BD\\r\\n\\r\\nisosceles_triangle = Pythagorean.subs({a: side_A, b: side_A, c: BC}) # Substitute values into the equation\\r\\nlength_AC = solve(isosceles_triangle, side_A)[0] # Solve for side_AC\\r\\n\\r\\n# Step 2: Find the length of side AD\\r\\nlength_AD = (BD * length_AC) / BC # Using the proportion\\r\\n\\r\\n# Step 3: Find the area of triangle ABC\\r\\narea_triangle_ABC = 0.5 * (length_AD * length_AC)\\r\\n\\r\\nlength_AC, length_AD, area_triangle_ABC\\r\\n```\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 22.85700249671936,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"moderately efficient\",\n", + " \"Code Correctness\": \"mostly correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: false\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"John counts up from 1 to 13, and then immediately counts down again to 1, and then back up to 13, and so on, alternately counting up and down: \\\\begin{align*}\\n&(1, 2, 3,4,5,6,7,8,9,10,11,12,13,\\\\\\\\\\n&\\\\qquad\\\\qquad12,11,10,9,8,7,6,5,4,3,2,1,2,3,4,\\\\ldots ).\\n\\\\end{align*} What is the $5000^{\\\\text{th}}$ integer in his list?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"We can treat this list as a sequence with a repetitive pattern. We see the sequence repeats itself every 24 elements (from 1 to 13 then back to 2). When 5000 is divided by 24, its remainder is 8. Therefore we see the $5000^{\\\\text{th}}$ integer is the same as the $8^{\\\\text{th}}$ integer, which is $\\\\boxed{8}$.\",\n", + " \"problem_id\": \"4\",\n", + " \"response_with_ans\": \"We can solve this problem by finding which \\\"group\\\" the 5000th number belongs to, and then determine the number within that group. Each group is either counting up from 1 to 13 or counting down from 13 to 1. There are 13 numbers in each direction, but since 1 is counted twice (once at the end of a down-count and once at the beginning of an up-count), counting up and down would consist of 25 numbers (13 up + 12 down).\\n\\nLet's first find out which group the 5000th number belongs to and how many numbers in total are in the complete up and down groups before 5000th number using code:\\n\\n```python\\nnum_group = 5000 // 25\\nremainder = 5000 % 25\\ntotal_numbers_before = num_group * 25\\nprint('Number of complete groups:', num_group)\\nprint('Remainder:', remainder)\\nprint('Numbers before 5000th number:', total_numbers_before)\\n```\\n\\nAfter knowing these values, I'll determine if the 5000th number is in up-count or down-count and its value.\\n\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"John counts up from 1 to 13, and then immediately counts down again to 1, and then back up to 13, and so on, alternately counting up and down: \\\\begin{align*}\\n&(1, 2, 3,4,5,6,7,8,9,10,11,12,13,\\\\\\\\\\n&\\\\qquad\\\\qquad12,11,10,9,8,7,6,5,4,3,2,1,2,3,4,\\\\ldots ).\\n\\\\end{align*} What is the $5000^{\\\\text{th}}$ integer in his list?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"We can solve this problem by finding which \\\"group\\\" the 5000th number belongs to, and then determine the number within that group. Each group is either counting up from 1 to 13 or counting down from 13 to 1. There are 13 numbers in each direction, but since 1 is counted twice (once at the end of a down-count and once at the beginning of an up-count), counting up and down would consist of 25 numbers (13 up + 12 down).\\n\\nLet's first find out which group the 5000th number belongs to and how many numbers in total are in the complete up and down groups before 5000th number using code:\\n\\n```python\\nnum_group = 5000 // 25\\nremainder = 5000 % 25\\ntotal_numbers_before = num_group * 25\\nprint('Number of complete groups:', num_group)\\nprint('Remainder:', remainder)\\nprint('Numbers before 5000th number:', total_numbers_before)\\n```\\n\\nAfter knowing these values, I'll determine if the 5000th number is in up-count or down-count and its value.\\n\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 16.342331409454346,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "```json\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"mostly effective\",\n", + " \"Calculation Correctness\": \"mostly correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"moderately efficient\",\n", + " \"Code Correctness\": \"mostly correct\"\n", + "}\n", + "```\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: false\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"An equilateral triangle has a side of length 12 inches. What is the area of the triangle, in square inches? Express your answer in simplest radical form.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"The area of an equilateral triangle with side length $s$ is $s^2\\\\sqrt{3}/4$. We have $s = 12$, so our area is $12^2\\\\sqrt{3}/4 = \\\\boxed{36\\\\sqrt{3}}$.\",\n", + " \"problem_id\": \"18\",\n", + " \"response_with_ans\": \"```python\\nimport math\\n\\nside_length = 12\\narea = (math.sqrt(3) * side_length**2) / 4\\nprint(area)\\n```\",\n", + " \"round\": 1,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"An equilateral triangle has a side of length 12 inches. What is the area of the triangle, in square inches? Express your answer in simplest radical form.\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the area of an equilateral triangle with a side of length s, we can use the formula:\\n\\narea = (sqrt(3) * s\\u00b2) / 4\\n\\nIn this case, s = 12 inches. Let's calculate the area.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"```python\\nimport math\\n\\nside_length = 12\\narea = (math.sqrt(3) * side_length**2) / 4\\nprint(area)\\n```\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 14.153439283370972,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"very efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: false\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"What is the product of $0.\\\\overline{05}$ and $1.8$ expressed as a fraction in simplest form?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"First let's convert $0.\\\\overline{05}$ to a fraction. Let's define $x=0.\\\\overline{05}$. If we multiply both sides by $100$ we get $100x=5.\\\\overline{05}$ so $99x=5$ and $x=0.\\\\overline{05}=\\\\frac{5}{99}$. Since $1.8=\\\\frac{9}{5}$ we get $$\\\\frac{\\\\cancel{5}}{99}\\\\cdot\\\\frac{9}{\\\\cancel{5}}=\\\\frac{9}{99}=\\\\boxed{\\\\frac{1}{11}}.$$\",\n", + " \"problem_id\": \"9\",\n", + " \"response_with_ans\": \"```python\\nfrom fractions import Fraction\\n\\nfraction_1 = Fraction(5, 99)\\ndecimal_2 = 1.8\\n\\nproduct = fraction_1 * decimal_2\\n\\nsimplified_fraction = Fraction(product).limit_denominator()\\n\\nprint(simplified_fraction)\\n```\\n\\nPlease run the above Python code to find the product of $\\\\frac{5}{99}$ and $1.8$ expressed as a fraction in simplest form.\",\n", + " \"round\": 1,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the product of $0.\\\\overline{05}$ and $1.8$ expressed as a fraction in simplest form?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the product of $0.\\\\overline{05}$ and $1.8$, first we need to convert the repeating decimal $0.\\\\overline{05}$ into a fraction.\\n\\nLet's call the repeating decimal $x$:\\n\\n$$x = 0.\\\\overline{05}$$\\n\\nTo convert the repeating decimal into a fraction, we can multiply both sides by $100$ to shift the decimal point two places to the right:\\n\\n$$100x = 5.\\\\overline{05}$$\\n\\nNow, subtract the first equation from the second equation:\\n\\n$$100x - x = 5.\\\\overline{05} - 0.\\\\overline{05}$$\\n$$99x = 5$$\\n\\nNow, we can solve for $x$:\\n\\n$$x = \\\\frac{5}{99}$$\\n\\nSo the repeating decimal $0.\\\\overline{05}$ is equivalent to the fraction $\\\\frac{5}{99}$.\\n\\nNow, we can find the product of $\\\\frac{5}{99}$ and $1.8$:\\n\\n$$\\\\frac{5}{99} \\\\times 1.8$$\\n\\nFinally, we will simplify the fraction. Let's write the code to compute the product and simplify the result as a fraction.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"```python\\nfrom fractions import Fraction\\n\\nfraction_1 = Fraction(5, 99)\\ndecimal_2 = 1.8\\n\\nproduct = fraction_1 * decimal_2\\n\\nsimplified_fraction = Fraction(product).limit_denominator()\\n\\nprint(simplified_fraction)\\n```\\n\\nPlease run the above Python code to find the product of $\\\\frac{5}{99}$ and $1.8$ expressed as a fraction in simplest form.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 18.04914665222168,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"moderately efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: false\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"What is $.0\\\\overline{3} \\\\div .\\\\overline{03}$? Express your answer as a mixed number.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"It is almost always easier to use fractions than decimals when dividing. So the first task is to convert these repeating decimals to fractions. First, $.0\\\\overline{3}$: \\\\[\\n10 \\\\cdot .0\\\\overline{3} = .\\\\overline{3} = \\\\frac{1}{3}\\\\\\\\\\n\\\\Rightarrow .0\\\\overline{3} = \\\\frac{1}{3} \\\\div 10 = \\\\frac{1}{3} \\\\cdot \\\\frac{1}{10} = \\\\frac{1}{30}.\\n\\\\]Next, $.\\\\overline{03}$: \\\\[\\n99 \\\\cdot .\\\\overline{03} = (100-1) \\\\cdot .\\\\overline{03} = 3.\\\\overline{03} - .\\\\overline{03} = 3\\\\\\\\\\n\\\\Rightarrow .\\\\overline{03} = \\\\frac{3}{99} = \\\\frac{3}{3 \\\\cdot 33} = \\\\frac{1}{33}.\\n\\\\]We now have the tools to make our calculation: \\\\begin{align*}\\n.0\\\\overline{3} \\\\div .\\\\overline{03} &= \\\\frac{1}{30} \\\\div \\\\frac{1}{33}= \\\\frac{1}{30} \\\\cdot \\\\frac{33}{1}\\\\\\\\\\n&= \\\\frac{33}{30} = \\\\frac{3 \\\\cdot 11}{3 \\\\cdot 10} = \\\\frac{11}{10}\\\\\\\\\\n&= \\\\frac{10+1}{10} = \\\\boxed{1\\\\frac{1}{10}}.\\n\\\\end{align*}\",\n", + " \"problem_id\": \"15\",\n", + " \"response_with_ans\": \"Now, let's simplify the fraction:\\n\\n$\\\\frac{33}{3} = 11$\\n\\nSo, the result of the division is:\\n\\n$.0\\\\overline{3} \\\\div .\\\\overline{03} = 11$\\n\\nSince there is no remainder or mixed number component, the final answer is 11.\\n\\nTERMINATE\",\n", + " \"round\": 3,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is $.0\\\\overline{3} \\\\div .\\\\overline{03}$? Express your answer as a mixed number.\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To solve the problem, let's first convert the repeating decimal numbers into fractions.\\n\\n1. Convert $0.\\\\overline{3}$ to a fraction:\\n\\nLet x = $0.\\\\overline{3}$\\nThen, 10x = $3.\\\\overline{3}$\\nSubtracting the two equations, we get:\\n9x = 3\\nx = $\\\\frac{1}{3}$\\n\\nSo, $0.\\\\overline{3}$ can be written as $\\\\frac{1}{3}$.\\n\\n2. Convert $.\\\\overline{03}$ to a fraction:\\n\\nLet y = $.\\\\overline{03}$\\nThen, 100y = $3.\\\\overline{03}$\\nSubtracting the two equations, we get:\\n99y = 3\\ny = $\\\\frac{1}{33}$\\n\\nSo, $.\\\\overline{03}$ can be written as $\\\\frac{1}{33}$.\\n\\nNow that we have the fractions, we can compute: \\n$(\\\\frac{1}{3}) \\\\div (\\\\frac{1}{33})$\\nTo divide fractions, we multiply the first one by the reciprocal of the second one:\\n\\n$(\\\\frac{1}{3}) \\\\times (\\\\frac{33}{1})$\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Let's compute the product of the fractions:\\n\\n$\\\\frac{1}{3} \\\\times \\\\frac{33}{1} = \\\\frac{1 \\\\times 33}{3 \\\\times 1}$\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Now, let's solve the multiplication in the numerator and the denominator:\\n\\n$\\\\frac{1 \\\\times 33}{3 \\\\times 1} = \\\\frac{33}{3}$\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Now, let's simplify the fraction:\\n\\n$\\\\frac{33}{3} = 11$\\n\\nSo, the result of the division is:\\n\\n$.0\\\\overline{3} \\\\div .\\\\overline{03} = 11$\\n\\nSince there is no remainder or mixed number component, the final answer is 11.\\n\\nTERMINATE\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 34.40860724449158,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"mostly effective\",\n", + " \"Calculation Correctness\": \"completely incorrect\",\n", + " \"Explanation Clarity\": \"moderately clear\",\n", + " \"Code Efficiency\": \"not applicable\",\n", + " \"Code Correctness\": \"not applicable\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"The perfect squares from $1$ through $2500,$ inclusive, are printed in a sequence of digits $1491625\\\\ldots2500.$ How many digits are in the sequence?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"We consider it by four cases:\\n\\n$\\\\bullet$ Case 1: There are $3$ perfect squares that only have $1$ digit, $1^{2},$ $2^{2},$ and $3^{2}.$\\n\\n$\\\\bullet$ Case 2: The smallest perfect square that has $2$ digits is $4^{2},$ and the largest is $9^{2},$ so that's a total of $6$ perfect squares with $2$ digits.\\n\\n$\\\\bullet$ Case 3: The smallest perfect square with $3$ digits is $10^{2},$ and the largest is $31^{2},$ yielding a total of $22.$\\n\\n$\\\\bullet$ Case 4: The smallest perfect square with $4$ digits is $32^{2},$ and the last one that is no greater than $2500$ is $50^{2},$ giving a total of $19.$\\n\\nSo we have a total of $1\\\\times3+2\\\\times6+3\\\\times22+4\\\\times19=\\\\boxed{157}$ digits.\",\n", + " \"problem_id\": \"5\",\n", + " \"response_with_ans\": \"```python\\ndef count_digits(n):\\n return len(str(n))\\n\\nperfect_squares = [i ** 2 for i in range(1, int(2500 ** 0.5) + 1)]\\ntotal_digits = sum(count_digits(square) for square in perfect_squares)\\n\\nprint(total_digits)\\n```\\n\",\n", + " \"round\": 1,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"The perfect squares from $1$ through $2500,$ inclusive, are printed in a sequence of digits $1491625\\\\ldots2500.$ How many digits are in the sequence?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To determine the number of digits in the sequence, we can first find all perfect squares from 1 through 2500, inclusive. Then, we can count the number of digits in each perfect square and sum them up. Let's implement this in Python code:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"```python\\ndef count_digits(n):\\n return len(str(n))\\n\\nperfect_squares = [i ** 2 for i in range(1, int(2500 ** 0.5) + 1)]\\ntotal_digits = sum(count_digits(square) for square in perfect_squares)\\n\\nprint(total_digits)\\n```\\n\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 9.788081884384155,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "```json\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"mostly effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"moderately efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "```\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"All 50 states as well as the District of Columbia and Puerto Rico, have distinct two-letter postal abbreviations. If a two-letter sequence of letters (such as CO or EE) is chosen at random, what is the probability that it is a postal abbreviation for one of the 50 states, the District of Columbia, or Puerto Rico? Express your answer as a common fraction.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"There are $26\\\\cdot 26$ possible two-letter sequences of letters, since we have 26 choices for the first and then 26 choices for the second. But only 52 of these possibilities are valid, so our answer is $\\\\frac{52}{26\\\\cdot 26} =\\\\boxed{ \\\\frac{1}{13}}$.\",\n", + " \"problem_id\": \"8\",\n", + " \"response_with_ans\": \"We'll use a reliable source like USPS to fetch the postal abbreviations, and then calculate the probability.\\n\\n```python\\nimport requests\\nfrom bs4 import BeautifulSoup\\nimport fractions\\n\\nurl = 'https://pe.usps.com/text/pub28/28apb.htm'\\nresponse = requests.get(url)\\nsoup = BeautifulSoup(response.text, 'html.parser')\\n\\n# Find the table containing the state info\\nstate_table = soup.find_all('table')[0]\\n\\n# Extract state abbreviations from the table\\nstate_abbreviations = [row.find_all('td')[-1].text.strip() for row in state_table.find_all('tr')[3:-2]]\\n\\n# Add District of Columbia and Puerto Rico.\\nstate_abbreviations.extend([\\\"DC\\\", \\\"PR\\\"])\\n\\nnum_valid_abbreviations = len(state_abbreviations)\\ntotal_possible_combinations = 26 * 26\\nprobability = fractions.Fraction(num_valid_abbreviations, total_possible_combinations)\\n\\nprint(f\\\"Valid postal abbreviations: {state_abbreviations}\\\")\\nprint(f\\\"Total valid postal abbreviations: {num_valid_abbreviations}\\\")\\nprint(f\\\"Total possible two-letter sequences: {total_possible_combinations}\\\")\\nprint(f\\\"Probability: {probability}\\\")\\n```\\n\\nPlease run the above code, and the output will show you the list of valid postal abbreviations, the total number of valid abbreviations, the total possible two-letter sequences, and the probability.\",\n", + " \"round\": 1,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"All 50 states as well as the District of Columbia and Puerto Rico, have distinct two-letter postal abbreviations. If a two-letter sequence of letters (such as CO or EE) is chosen at random, what is the probability that it is a postal abbreviation for one of the 50 states, the District of Columbia, or Puerto Rico? Express your answer as a common fraction.\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To calculate the probability, we first need to know the total number of possible two-letter sequences and the number of valid postal abbreviations.\\n\\nTo get the total number of possible two-letter sequences, we'll calculate all possible combinations using 26 letters of the alphabet. There are 26 options for choosing the first letter and 26 options for choosing the second letter, so the possible sequences are 26 * 26.\\n\\nNext, let's find the valid postal abbreviations for all 50 states, District of Columbia, and Puerto Rico. To do this, we can create code to download the postal abbreviations.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"We'll use a reliable source like USPS to fetch the postal abbreviations, and then calculate the probability.\\n\\n```python\\nimport requests\\nfrom bs4 import BeautifulSoup\\nimport fractions\\n\\nurl = 'https://pe.usps.com/text/pub28/28apb.htm'\\nresponse = requests.get(url)\\nsoup = BeautifulSoup(response.text, 'html.parser')\\n\\n# Find the table containing the state info\\nstate_table = soup.find_all('table')[0]\\n\\n# Extract state abbreviations from the table\\nstate_abbreviations = [row.find_all('td')[-1].text.strip() for row in state_table.find_all('tr')[3:-2]]\\n\\n# Add District of Columbia and Puerto Rico.\\nstate_abbreviations.extend([\\\"DC\\\", \\\"PR\\\"])\\n\\nnum_valid_abbreviations = len(state_abbreviations)\\ntotal_possible_combinations = 26 * 26\\nprobability = fractions.Fraction(num_valid_abbreviations, total_possible_combinations)\\n\\nprint(f\\\"Valid postal abbreviations: {state_abbreviations}\\\")\\nprint(f\\\"Total valid postal abbreviations: {num_valid_abbreviations}\\\")\\nprint(f\\\"Total possible two-letter sequences: {total_possible_combinations}\\\")\\nprint(f\\\"Probability: {probability}\\\")\\n```\\n\\nPlease run the above code, and the output will show you the list of valid postal abbreviations, the total number of valid abbreviations, the total possible two-letter sequences, and the probability.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 27.01692771911621,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"moderately efficient\",\n", + " \"Code Correctness\": \"mostly correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"What is the sum of the lengths, in centimeters, of the two legs of a 30-60-90 right triangle, if the length of the hypotenuse is $2\\\\sqrt{6}$ centimeters?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"We know that the ratio of the lengths of the sides of a 30-60-90 triangle is $1:\\\\sqrt{3}:2$. We know that the length of the hypotenuse is $2\\\\sqrt{6}$ and the ratio of the length shortest leg to that of the hypotenuse is $1:2$. Therefore, the length of the shorter leg is $\\\\sqrt{6}$. Since the ratio of the shorter leg to the longer leg is $1:\\\\sqrt{3}$, the length of the longer leg is $\\\\sqrt{6} \\\\cdot \\\\sqrt{3} = 3\\\\sqrt{2}$. The sum of the lengths of these two legs is $\\\\boxed{\\\\sqrt{6} + 3\\\\sqrt{2}}$ centimeters.\",\n", + " \"problem_id\": \"17\",\n", + " \"response_with_ans\": \"Let's solve for x and find the lengths of the legs.\\n\\n```python\\nimport math\\n\\nhypotenuse = 2 * math.sqrt(6)\\nx = hypotenuse / 2\\n\\nleg_1 = x\\nleg_2 = x * math.sqrt(3)\\nsum_of_legs = leg_1 + leg_2\\n\\nleg_1, leg_2, sum_of_legs\\n```\\n\\nNow, execute the above code to find the sum of the lengths of the two legs.\",\n", + " \"round\": 1,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of the lengths, in centimeters, of the two legs of a 30-60-90 right triangle, if the length of the hypotenuse is $2\\\\sqrt{6}$ centimeters?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of the lengths of the two legs, let's first analyze a 30-60-90 right triangle. In a 30-60-90 triangle, the ratios of the side lengths are:\\n\\n1. Opposite the 30-degree angle: $x$\\n2. Opposite the 60-degree angle: $x\\\\sqrt{3}$\\n3. Hypotenuse (opposite the 90-degree angle): $2x$\\n\\nNow, we are given that the hypotenuse is $2\\\\sqrt{6}$ centimeters. We can set up the following equation and solve for $x$:\\n\\n$2x = 2\\\\sqrt{6}$\\n\\nNext, we will find the lengths of the legs and sum them up.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Let's solve for x and find the lengths of the legs.\\n\\n```python\\nimport math\\n\\nhypotenuse = 2 * math.sqrt(6)\\nx = hypotenuse / 2\\n\\nleg_1 = x\\nleg_2 = x * math.sqrt(3)\\nsum_of_legs = leg_1 + leg_2\\n\\nleg_1, leg_2, sum_of_legs\\n```\\n\\nNow, execute the above code to find the sum of the lengths of the two legs.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 18.742590188980103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"moderately efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"Each interior angle of a polygon measures 170 degrees. How many sides does the polygon have?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"The sum of the interior angles of a polygon is $180(n-2)$, where $n$ is the number of sides. That means each interior angle has a measure of $\\\\frac{180(n-2)}{n}$ degrees. We set this equal to 170 degrees and solve for $n$. \\\\begin{align*}\\n\\\\frac{180(n-2)}{n}&=170\\\\\\\\\\n\\\\Rightarrow \\\\qquad 180n-360&=170n\\\\\\\\\\\\Rightarrow \\\\qquad 10n&=360\\\\\\\\\\n\\\\Rightarrow\\\\qquad n&=36.\\n\\\\end{align*} The polygon has $\\\\boxed{36}$ sides.\",\n", + " \"problem_id\": \"14\",\n", + " \"response_with_ans\": \"Quick note: A single backtick should be used for inline code, and triple backticks should be used for code blocks. It seems I accidentally used single backticks for the code block in my previous response. Please use the code below instead:\\n\\n```python\\nfrom sympy import symbols, Eq, solve\\n\\nn = symbols('n')\\nequation = Eq(n * 170, (n - 2) * 180)\\nsides = solve(equation, n)[0]\\nprint(sides)\\n```\\n\",\n", + " \"round\": 1,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"Each interior angle of a polygon measures 170 degrees. How many sides does the polygon have?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"We can use the formula for the sum of the interior angles of a polygon to solve this problem. The formula is:\\n\\nsum_of_interior_angles = (n - 2) * 180\\n\\nwhere n is the number of sides.\\n\\nAs each interior angle measures 170 degrees, we can write the equation:\\n\\nn * 170 = (n - 2) * 180\\n\\nLet's solve for the number of sides (n) using Python code.\\n\\n```python\\nfrom sympy import symbols, Eq, solve\\n\\nn = symbols('n')\\nequation = Eq(n * 170, (n - 2) * 180)\\nsides = solve(equation, n)[0]\\nsides\\n\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Quick note: A single backtick should be used for inline code, and triple backticks should be used for code blocks. It seems I accidentally used single backticks for the code block in my previous response. Please use the code below instead:\\n\\n```python\\nfrom sympy import symbols, Eq, solve\\n\\nn = symbols('n')\\nequation = Eq(n * 170, (n - 2) * 180)\\nsides = solve(equation, n)[0]\\nprint(sides)\\n```\\n\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 16.42014193534851,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"completely clear\",\n", + " \"Code Efficiency\": \"very efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: false\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"Simplify $\\\\frac{2m+8}{3}-\\\\frac{2-m}{3}$.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"Both fractions have the same denominator, so we can subtract them: \\\\[\\\\frac{2m+8}{3}-\\\\frac{2-m}{3}=\\\\frac{(2m+8)-(2-m)}{3}\\\\] Distributing the negative sign across the parentheses, we get \\\\[\\\\frac{2m+8-2-(-m)}{3}=\\\\frac{2m+8-2+m}{3}=\\\\frac{3m+6}{3}\\\\] Notice that every number in the numerator has a common factor of 3. We can use the distributive law in reverse to get \\\\[\\\\frac{3m+6}{3}=\\\\frac{3(m+2)}{3}=\\\\frac{\\\\cancel{3}(m+2)}{\\\\cancel{3}}=\\\\boxed{m+2}.\\\\]\",\n", + " \"problem_id\": \"19\",\n", + " \"response_with_ans\": \"\",\n", + " \"round\": 15,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"Simplify $\\\\frac{2m+8}{3}-\\\\frac{2-m}{3}$.\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To simplify the expression, we can combine the fractions as they have the same denominator:\\n\\n$\\\\frac{2m + 8}{3} - \\\\frac{2 - m}{3} = \\\\frac{(2m + 8) - (2 - m)}{3}$\\n\\nNow, I will calculate the numerator and finish simplifying the expression.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\\n\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"My apologies for the confusion in the previous responses. Let me simplify the expression step by step now. \\n\\nWe have the expression:\\n\\n$\\\\frac{2m + 8}{3} - \\\\frac{2 - m}{3}$\\n\\nWe can combine the fractions as they have the same denominator:\\n\\n$\\\\frac{(2m + 8) - (2 - m)}{3}$\\n\\nLet's further simplify the expression using Python code.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 37.317880630493164,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"not at all clear\",\n", + " \"Code Efficiency\": \"not applicable\",\n", + " \"Code Correctness\": \"not applicable\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"A $30^\\\\circ$-$60^\\\\circ$-$90^\\\\circ$ triangle is drawn on the exterior of an equilateral triangle so the hypotenuse of the right triangle is one side of the equilateral triangle. If the shorter leg of the right triangle is 6 units, what is the distance between the two vertices that the triangles do not have in common? Express your answer in simplest radical form. [asy]\\ndraw((2,0)--(0,0)--(1,1.732)--(2,1.732)--(2,0)--(1,1.732));\\ndraw((2,1.632)--(1.9,1.632)--(1.9,1.732));\\nlabel(\\\"$60^\\\\circ$\\\",(1,1.732),2SE+E);\\nlabel(\\\"$30^\\\\circ$\\\",(2,0),5NNW+4N);\\nlabel(\\\"6\\\",(1.5,1.732),N);\\n[/asy]\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"Multiply the short leg of the right triangle by $\\\\sqrt{3}$ to find that the length of the longer leg is $6\\\\sqrt{3}$ units. Double the short leg of the right triangle to find that the length of the hypotenuse of the right triangle is 12 units. Since the hypotenuse of the right triangle is a side of the equilateral triangle, the side length of the equilateral triangle is also 12 units. By the Pythagorean theorem, the distance between the two vertices that the two triangles do not have in common is $\\\\sqrt{(6\\\\sqrt{3})^2+12^2}=\\\\sqrt{252}=\\\\boxed{6\\\\sqrt{7}}$ units. [asy]\\ndraw((2,0)--(0,0)--(1,sqrt(3))--(2,sqrt(3))--(2,0)--(1,sqrt(3)));\\ndraw((2,sqrt(3)-0.1)--(1.9,sqrt(3)-0.1)--(1.9,sqrt(3)));\\ndraw((0,0)--(2,sqrt(3)));\\nlabel(\\\"$60^\\\\circ$\\\",(1,sqrt(3)),2SE+E);\\nlabel(\\\"$30^\\\\circ$\\\",(2,0),5NNW+4N);\\nlabel(\\\"6\\\",(1.5,sqrt(3)),N);\\nlabel(\\\"$6\\\\sqrt{3}$\\\",(2,sqrt(3)/2),E);\\nlabel(\\\"12\\\",(1.5,sqrt(3)/2),SW);\\nlabel(\\\"12\\\",(1,0),S);\\n[/asy]\",\n", + " \"problem_id\": \"7\",\n", + " \"response_with_ans\": \"We have found the distance between the two vertices that the triangles do not have in common (C and D):\\n\\nx = \\u221a(252 + 72\\u221a3)\\n\\nThis is the simplest radical form for the required distance. \\n\\nTERMINATE\",\n", + " \"round\": 3,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"A $30^\\\\circ$-$60^\\\\circ$-$90^\\\\circ$ triangle is drawn on the exterior of an equilateral triangle so the hypotenuse of the right triangle is one side of the equilateral triangle. If the shorter leg of the right triangle is 6 units, what is the distance between the two vertices that the triangles do not have in common? Express your answer in simplest radical form. [asy]\\ndraw((2,0)--(0,0)--(1,1.732)--(2,1.732)--(2,0)--(1,1.732));\\ndraw((2,1.632)--(1.9,1.632)--(1.9,1.732));\\nlabel(\\\"$60^\\\\circ$\\\",(1,1.732),2SE+E);\\nlabel(\\\"$30^\\\\circ$\\\",(2,0),5NNW+4N);\\nlabel(\\\"6\\\",(1.5,1.732),N);\\n[/asy]\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Let's denote the vertices of the equilateral triangle as A, B, and C, where A is the right angle of the $30^\\\\circ$-$60^\\\\circ$-$90^\\\\circ$ triangle, B is adjacent to the $30^\\\\circ$ angle, and C is adjacent to the $60^\\\\circ$ angle. Let D be the vertex of the right triangle that is not a part of the equilateral triangle (the $60^\\\\circ$ angle).\\n\\nSince the shorter leg of the right triangle is 6 units (AD) and it is a $30^\\\\circ$-$60^\\\\circ$-$90^\\\\circ$ triangle, we know that:\\n1. The longer leg (BD) has a length equal to the shorter leg times $\\\\sqrt{3}$ ($6\\\\sqrt{3}$ units).\\n2. The hypotenuse (AB) has a length twice the size of the shorter leg (12 units).\\n\\nNow, we are trying to find the distance between vertices C and D. Let's call this distance x.\\n\\nTo calculate x, we can use the law of cosines on triangle $\\\\bigtriangleup BCD$. Here, the angle at vertex B is $180^\\\\circ - 60^\\\\circ = 120^\\\\circ$. We have the lengths of sides BC and BD, so we can calculate x using the law of cosines and then simplify the result.\\n\\nThe law of cosines formula is:\\nx^2 = (BC^2) + (BD^2) - 2(BC)(BD)cos(120^\\\\circ)\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"First, we need the length of side BC, which is equal to the length of side AB (since it is an equilateral triangle). Thus, BC = 12 units. Now we can use the law of cosines formula to find the value of x^2:\\n\\nx^2 = (12^2) + (6\\u221a3)^2 - 2(12)(6\\u221a3)cos(120\\u00ba)\\n\\nThe cosine of 120\\u00ba is -1/2, so:\\n\\nx^2 = 144 + 108 - 2(12)(6\\u221a3)(-1/2)\\n\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Let's simplify the expression for x^2:\\n\\nx^2 = 144 + 108 + (12)(6\\u221a3)\\n\\nNow we will calculate the result:\\n\\nx^2 = 144 + 108 + 72\\u221a3\\n\\nx^2 = 252 + 72\\u221a3\\n\\nNow, to find the value of x, we'll take the square root of both sides:\\n\\nx = \\u221a(252 + 72\\u221a3)\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"We have found the distance between the two vertices that the triangles do not have in common (C and D):\\n\\nx = \\u221a(252 + 72\\u221a3)\\n\\nThis is the simplest radical form for the required distance. \\n\\nTERMINATE\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 35.88237428665161,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"mostly accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"mostly correct\",\n", + " \"Explanation Clarity\": \"moderately clear\",\n", + " \"Code Efficiency\": \"not applicable\",\n", + " \"Code Correctness\": \"not applicable\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"On a number line, the coordinates of $P$ and $Q$ are 8 and 48, respectively. The midpoint of $\\\\overline{PQ}$ is $B$, the midpoint of $\\\\overline{BQ}$ is $C$, and the midpoint of $\\\\overline{PC}$ is $D$. What is the coordinate of $D$?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"Since $B$ is midpoint of $\\\\overline{PQ}$, the coordinate of $B$ is $(8+48)/2 = 4+24 = 28$. Since $C$ is the midpoint of $\\\\overline{BQ}$, the coordinate of $C$ is $(28+48)/2 = 14+24=38$. Since $D$ is the midpoint of $\\\\overline{PC}$, the coordinate of $D$ is $(8+38)/2 = 4 + 19 = \\\\boxed{23}$.\\n\\n[asy]\\npair P, Q, B, C, D;\\n\\nP = (8,0);\\nQ = (48,0);\\nB = (P+Q)/2;\\nC = (B+Q)/2;\\nD = (P+C)/2;\\n\\ndot(P);\\ndot(Q);\\ndot(B);\\ndot(C);\\ndot(D);\\n\\ndraw(P--Q);\\nlabel(\\\"$P$\\\",P,S);\\nlabel(\\\"$Q$\\\",Q,S);\\nlabel(\\\"$B$\\\",B,S);\\nlabel(\\\"$C$\\\",C,S);\\nlabel(\\\"$D$\\\",D,S);\\n[/asy]\",\n", + " \"problem_id\": \"6\",\n", + " \"response_with_ans\": \"Let's find the coordinates using Python code.\\n\\n```python\\nP = 8\\nQ = 48\\n\\n# Find the midpoint of PQ (B)\\nB = (P + Q) / 2\\n\\n# Find the midpoint of BQ (C)\\nC = (B + Q) / 2\\n\\n# Find the midpoint of PC (D)\\nD = (P + C) / 2\\n\\nD\\n```\\n\\nExecute the above Python code to find the coordinate of D.\",\n", + " \"round\": 1,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"On a number line, the coordinates of $P$ and $Q$ are 8 and 48, respectively. The midpoint of $\\\\overline{PQ}$ is $B$, the midpoint of $\\\\overline{BQ}$ is $C$, and the midpoint of $\\\\overline{PC}$ is $D$. What is the coordinate of $D$?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the coordinate of D, we need to follow these steps:\\n1. Find the coordinate of B (midpoint of PQ)\\n2. Find the coordinate of C (midpoint of BQ)\\n3. Find the coordinate of D (midpoint of PC)\\n\\nI'll use Python code to find the coordinates of B, C, and D.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Let's find the coordinates using Python code.\\n\\n```python\\nP = 8\\nQ = 48\\n\\n# Find the midpoint of PQ (B)\\nB = (P + Q) / 2\\n\\n# Find the midpoint of BQ (C)\\nC = (B + Q) / 2\\n\\n# Find the midpoint of PC (D)\\nD = (P + C) / 2\\n\\nD\\n```\\n\\nExecute the above Python code to find the coordinate of D.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 9.041668176651001,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"very efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"Triangle $ABC$ is a right triangle. If the measure of angle $PAB$ is $x^\\\\circ$ and the measure of angle $ACB$ is expressed in the form $(Mx+N)^\\\\circ$ with $M=1$, what is the value of $M+N$?\\n\\n[asy]\\ndraw((-10,0)--(20,0),linewidth(1),Arrows);\\ndraw((0,0)--(10,10/sqrt(3))--(10+10/3,0),linewidth(1));\\n\\ndraw((10,10/sqrt(3))+dir(-150)--(10,10/sqrt(3))+dir(-150)+dir(-60)--(10,10/sqrt(3))+dir(-60),linewidth(1));\\n\\ndot((-3,0));\\n\\ndraw(dir(180)..dir(105)..dir(30),linewidth(1));\\n\\nlabel(\\\"P\\\",(-3,0),NW);\\nlabel(\\\"A\\\",(0,0),S);\\nlabel(\\\"$x^\\\\circ$\\\",(-1,1),N);\\nlabel(\\\"B\\\",(10,10/sqrt(3)),N);\\nlabel(\\\"C\\\",(10+10/3,0),NE);\\n\\n[/asy]\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"Since $\\\\angle PAB$ and $\\\\angle BAC$ are supplementary, $\\\\angle BAC = 180^{\\\\circ} - x^\\\\circ$. Since the three angles of a triangle add up to $ 180^{\\\\circ} $, we have $\\\\angle ACB = 180^{\\\\circ} - 90^{\\\\circ} - (180^{\\\\circ} - x^\\\\circ) = x^\\\\circ - 90^{\\\\circ}$. Thus, $M + N = \\\\boxed{-89}$.\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"We know that $x + y = 180^\\\\circ$. From this equation, we can express $y$ in terms of $x$: $y = 180^\\\\circ - x$.\\n\\nNow we substitute the expression for $y$ in the expression of angle $ACB$:\\n$ACB = 90^\\\\circ - y = 90^\\\\circ - (180^\\\\circ - x) = x - 90^\\\\circ$.\\n\\nComparing this expression with the given form $(Mx + N)^\\\\circ$, we can see that $M = 1$ and $N = -90$. Therefore, $M + N = 1 + (-90) = -89$.\\n\\nThe value of $M + N$ is $-89$.\",\n", + " \"round\": 2,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"Triangle $ABC$ is a right triangle. If the measure of angle $PAB$ is $x^\\\\circ$ and the measure of angle $ACB$ is expressed in the form $(Mx+N)^\\\\circ$ with $M=1$, what is the value of $M+N$?\\n\\n[asy]\\ndraw((-10,0)--(20,0),linewidth(1),Arrows);\\ndraw((0,0)--(10,10/sqrt(3))--(10+10/3,0),linewidth(1));\\n\\ndraw((10,10/sqrt(3))+dir(-150)--(10,10/sqrt(3))+dir(-150)+dir(-60)--(10,10/sqrt(3))+dir(-60),linewidth(1));\\n\\ndot((-3,0));\\n\\ndraw(dir(180)..dir(105)..dir(30),linewidth(1));\\n\\nlabel(\\\"P\\\",(-3,0),NW);\\nlabel(\\\"A\\\",(0,0),S);\\nlabel(\\\"$x^\\\\circ$\\\",(-1,1),N);\\nlabel(\\\"B\\\",(10,10/sqrt(3)),N);\\nlabel(\\\"C\\\",(10+10/3,0),NE);\\n\\n[/asy]\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To solve this problem, we need to find the relationship between angle $x$ and angle $ACB$. We know that triangle $ABC$ is a right triangle, so the sum of angles $ACB$ and $ABC$ must be $90^\\\\circ$. Let's call the angle $ABC$ as $y$. Therefore, angle $ACB = 90^\\\\circ - y$.\\n\\nNow, we need to find the relationship between angles $x$ and $y$. Since $PAB$ and $ABC$ share the same vertex $A$ and angle $PAB$ is opposite angle $ABC$, they are explementary (their sum is $180^\\\\circ$). So, we have $x + y = 180^\\\\circ$.\\n\\nNow, we can express $y$ in terms of $x$ and then substitute the expression for $y$ in the expression of angle $ACB$. Finally, we can compare angle $ACB$'s expression with the given form $(Mx + N)^\\\\circ$ to find the values of $M$ and $N$.\\n\\nLet me do the calculations.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"We know that $x + y = 180^\\\\circ$. From this equation, we can express $y$ in terms of $x$: $y = 180^\\\\circ - x$.\\n\\nNow we substitute the expression for $y$ in the expression of angle $ACB$:\\n$ACB = 90^\\\\circ - y = 90^\\\\circ - (180^\\\\circ - x) = x - 90^\\\\circ$.\\n\\nComparing this expression with the given form $(Mx + N)^\\\\circ$, we can see that $M = 1$ and $N = -90$. Therefore, $M + N = 1 + (-90) = -89$.\\n\\nThe value of $M + N$ is $-89$.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"TERMINATE\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 28.305670976638794,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"not at all efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"Simplify: $\\\\frac{\\\\sqrt{2.5^2-0.7^2}}{2.7-2.5}$.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"We have \\\\begin{align*}\\n\\\\frac{\\\\sqrt{2.5^2 - 0.7^2}}{2.7-2.5} &= \\\\frac{\\\\sqrt{6.25 - 0.49}}{2.7-2.5} = \\\\frac{\\\\sqrt{5.76}}{0.2} = \\\\frac{\\\\sqrt{576/100}}{0.2}\\\\\\\\\\n&= \\\\frac{\\\\sqrt{576}/\\\\sqrt{100}}{0.2} = \\\\frac{24/10}{0.2} = \\\\frac{2.4}{0.2} = \\\\boxed{12}.\\\\end{align*}\",\n", + " \"problem_id\": \"2\",\n", + " \"response_with_ans\": \"```python\\nimport math\\n\\nnumerator = math.sqrt(2.5 ** 2 - 0.7 ** 2)\\ndenominator = 2.7 - 2.5\\n\\nresult = numerator / denominator\\nresult\\n```\\n\",\n", + " \"round\": 1,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"Simplify: $\\\\frac{\\\\sqrt{2.5^2-0.7^2}}{2.7-2.5}$.\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To simplify the given expression, let's break it down step by step and use Python to calculate the values:\\n\\nStep 1: Calculate the values inside the square root: $2.5^2 - 0.7^2$\\nStep 2: Take the square root of the result\\nStep 3: Calculate the denominator: $2.7 - 2.5$\\nStep 4: Divide the result of Step 2 by the result of Step 3\\n\\nNow, let's execute Python code to get the result.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"```python\\nimport math\\n\\nnumerator = math.sqrt(2.5 ** 2 - 0.7 ** 2)\\ndenominator = 2.7 - 2.5\\n\\nresult = numerator / denominator\\nresult\\n```\\n\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 8.612567901611328,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"moderately efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"Bekah has exactly three brass house number digits: 2, 3 and 5. How many distinct numbers can she form using one or more of the digits?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"If Bekah uses only one digit, she can form three numbers. If she uses two digits, she has three choices for the tens place and two for the units, so she can form six numbers. Finally, if Bekah uses all three digits, she has three choices for the hundreds place, two for the tens, and one for the units, so she can form six numbers. Thus, Bekah can form $3 + 6 + 6 = \\\\boxed{15}$ distinct numbers.\",\n", + " \"problem_id\": \"11\",\n", + " \"response_with_ans\": \"To find the answer, we'll consider all possible combinations that Bekah can make using the three digits she has:\\n1. Single-digit numbers: 2, 3, and 5\\n2. Two-digits numbers using the digits: 23, 25, 32, 35, 52, and 53\\n3. Three-digits number using all the digits: 235, 253, 325, 352, 523, and 532\\n\\nLet's calculate the number of distinct numbers Bekah can form using one or more of the digits with Python code:\\n\\n```python\\nfrom itertools import permutations\\n\\ndigits = [2, 3, 5]\\n\\n# Single-digit numbers\\none_digit_numbers = set(digits)\\n\\n# Two-digits numbers\\ntwo_digit_numbers = set(int(''.join(map(str, p))) for p in permutations(digits, 2))\\n\\n# Three-digits numbers\\nthree_digit_numbers = set(int(''.join(map(str, p))) for p in permutations(digits, 3))\\n\\ndistinct_numbers = one_digit_numbers | two_digit_numbers | three_digit_numbers\\ntotal_distinct_numbers = len(distinct_numbers)\\n\\nprint(\\\"Distinct numbers:\\\", distinct_numbers)\\nprint(\\\"Total distinct numbers:\\\", total_distinct_numbers)\\n```\\n\\nPlease run the above Python code to calculate the total number of distinct numbers Bekah can form using one or more of the digits.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"Bekah has exactly three brass house number digits: 2, 3 and 5. How many distinct numbers can she form using one or more of the digits?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the answer, we'll consider all possible combinations that Bekah can make using the three digits she has:\\n1. Single-digit numbers: 2, 3, and 5\\n2. Two-digits numbers using the digits: 23, 25, 32, 35, 52, and 53\\n3. Three-digits number using all the digits: 235, 253, 325, 352, 523, and 532\\n\\nLet's calculate the number of distinct numbers Bekah can form using one or more of the digits with Python code:\\n\\n```python\\nfrom itertools import permutations\\n\\ndigits = [2, 3, 5]\\n\\n# Single-digit numbers\\none_digit_numbers = set(digits)\\n\\n# Two-digits numbers\\ntwo_digit_numbers = set(int(''.join(map(str, p))) for p in permutations(digits, 2))\\n\\n# Three-digits numbers\\nthree_digit_numbers = set(int(''.join(map(str, p))) for p in permutations(digits, 3))\\n\\ndistinct_numbers = one_digit_numbers | two_digit_numbers | three_digit_numbers\\ntotal_distinct_numbers = len(distinct_numbers)\\n\\nprint(\\\"Distinct numbers:\\\", distinct_numbers)\\nprint(\\\"Total distinct numbers:\\\", total_distinct_numbers)\\n```\\n\\nPlease run the above Python code to calculate the total number of distinct numbers Bekah can form using one or more of the digits.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 15.620970249176025,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"completely clear\",\n", + " \"Code Efficiency\": \"very efficient\",\n", + " \"Code Correctness\": \"completely correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: false\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"In the diagram, $AB,$ $BC,$ $CD,$ $DE,$ $EF,$ $FG,$ $GH,$ and $HK$ all have length $4,$ and all angles are right angles, with the exception of the angles at $D$ and $F.$\\n\\n[asy]\\ndraw((0,0)--(0,4)--(4,4)--(4,8)--(6.8284,5.1716)--(9.6569,8)--(9.6569,4)--(13.6569,4)--(13.6569,0)--cycle,black+linewidth(1));\\ndraw((0,0)--(0.5,0)--(0.5,0.5)--(0,0.5)--cycle,black+linewidth(1));\\ndraw((0,4)--(0.5,4)--(0.5,3.5)--(0,3.5)--cycle,black+linewidth(1));\\ndraw((4,4)--(4,4.5)--(3.5,4.5)--(3.5,4)--cycle,black+linewidth(1));\\ndraw((6.8284,5.1716)--(7.0784,5.4216)--(6.8284,5.6716)--(6.5784,5.4216)--cycle,black+linewidth(1));\\ndraw((9.6569,4)--(10.1569,4)--(10.1569,4.5)--(9.6569,4.5)--cycle,black+linewidth(1));\\ndraw((13.6569,4)--(13.1569,4)--(13.1569,3.5)--(13.6569,3.5)--cycle,black+linewidth(1));\\ndraw((13.6569,0)--(13.1569,0)--(13.1569,0.5)--(13.6569,0.5)--cycle,black+linewidth(1));\\nlabel(\\\"$A$\\\",(0,0),W);\\nlabel(\\\"$B$\\\",(0,4),NW);\\nlabel(\\\"$C$\\\",(4,4),S);\\nlabel(\\\"$D$\\\",(4,8),N);\\nlabel(\\\"$E$\\\",(6.8284,5.1716),S);\\nlabel(\\\"$F$\\\",(9.6569,8),N);\\nlabel(\\\"$G$\\\",(9.6569,4),S);\\nlabel(\\\"$H$\\\",(13.6569,4),NE);\\nlabel(\\\"$K$\\\",(13.6569,0),E);\\n[/asy]\\n\\nDetermine the length of $DF.$\\n\\n[asy]\\ndraw((0,0)--(2.8284,-2.8284)--(5.6568,0),black+linewidth(1));\\ndraw((0,0)--(5.6568,0),black+linewidth(1)+dashed);\\ndraw((2.8284,-2.8284)--(3.0784,-2.5784)--(2.8284,-2.3284)--(2.5784,-2.5784)--cycle,black+linewidth(1));\\nlabel(\\\"$D$\\\",(0,0),N);\\nlabel(\\\"$E$\\\",(2.8284,-2.8284),S);\\nlabel(\\\"$F$\\\",(5.6568,0),N);\\n[/asy]\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"Since $DE=EF=4$ and $\\\\angle DEF = 90^\\\\circ,$ by the Pythagorean Theorem, \\\\begin{align*}\\nDF^2 &= DE^2+EF^2 \\\\\\\\\\n&= 4^2+4^2 \\\\\\\\\\n&=32,\\n\\\\end{align*}so that $DF = \\\\sqrt{32}=\\\\boxed{4\\\\sqrt{2}}.$\",\n", + " \"problem_id\": \"16\",\n", + " \"response_with_ans\": \"Now let's calculate the square of DF using Python.\\n\\n```python\\nDH = 9.6569\\nHG = 5.6569\\ncos_alpha_beta = 0\\n\\nDF_squared = DH**2 + HG**2 - 2 * DH * HG * cos_alpha_beta\\nDF_squared\\n```\",\n", + " \"round\": 2,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"In the diagram, $AB,$ $BC,$ $CD,$ $DE,$ $EF,$ $FG,$ $GH,$ and $HK$ all have length $4,$ and all angles are right angles, with the exception of the angles at $D$ and $F.$\\n\\n[asy]\\ndraw((0,0)--(0,4)--(4,4)--(4,8)--(6.8284,5.1716)--(9.6569,8)--(9.6569,4)--(13.6569,4)--(13.6569,0)--cycle,black+linewidth(1));\\ndraw((0,0)--(0.5,0)--(0.5,0.5)--(0,0.5)--cycle,black+linewidth(1));\\ndraw((0,4)--(0.5,4)--(0.5,3.5)--(0,3.5)--cycle,black+linewidth(1));\\ndraw((4,4)--(4,4.5)--(3.5,4.5)--(3.5,4)--cycle,black+linewidth(1));\\ndraw((6.8284,5.1716)--(7.0784,5.4216)--(6.8284,5.6716)--(6.5784,5.4216)--cycle,black+linewidth(1));\\ndraw((9.6569,4)--(10.1569,4)--(10.1569,4.5)--(9.6569,4.5)--cycle,black+linewidth(1));\\ndraw((13.6569,4)--(13.1569,4)--(13.1569,3.5)--(13.6569,3.5)--cycle,black+linewidth(1));\\ndraw((13.6569,0)--(13.1569,0)--(13.1569,0.5)--(13.6569,0.5)--cycle,black+linewidth(1));\\nlabel(\\\"$A$\\\",(0,0),W);\\nlabel(\\\"$B$\\\",(0,4),NW);\\nlabel(\\\"$C$\\\",(4,4),S);\\nlabel(\\\"$D$\\\",(4,8),N);\\nlabel(\\\"$E$\\\",(6.8284,5.1716),S);\\nlabel(\\\"$F$\\\",(9.6569,8),N);\\nlabel(\\\"$G$\\\",(9.6569,4),S);\\nlabel(\\\"$H$\\\",(13.6569,4),NE);\\nlabel(\\\"$K$\\\",(13.6569,0),E);\\n[/asy]\\n\\nDetermine the length of $DF.$\\n\\n[asy]\\ndraw((0,0)--(2.8284,-2.8284)--(5.6568,0),black+linewidth(1));\\ndraw((0,0)--(5.6568,0),black+linewidth(1)+dashed);\\ndraw((2.8284,-2.8284)--(3.0784,-2.5784)--(2.8284,-2.3284)--(2.5784,-2.5784)--cycle,black+linewidth(1));\\nlabel(\\\"$D$\\\",(0,0),N);\\nlabel(\\\"$E$\\\",(2.8284,-2.8284),S);\\nlabel(\\\"$F$\\\",(5.6568,0),N);\\n[/asy]\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Let's use coordinate geometry to determine the coordinates of points D, E, and F, which will allow us to compute the Euclidean distance between points D and F.\\n\\n1. Assign coordinates to points A, B, C, D, E, F, G, H, and K.\\n2. Calculate the slope and equation of line DE and line FG.\\n3. Use the slopes and the coordinates of points E and G to compute the coordinates of point F.\\n4. Calculate the length of DF using the distance formula.\\n\\nLet's start by assigning coordinates:\\n\\n1. A(0, 0), B(0, 4), C(4, 4), D(4, 8), G(9.6569, 4), H(13.6569, 4), and K(13.6569, 0).\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Since the angles at points D and F are not right angles, we need to use some trigonometry to find points E and F. We already have the coordinates of points D and G.\\n\\nLet \\u03b1 be the angle between the horizontal line and the line DE, and \\u03b2 be the angle between the horizontal line and the line FG.\\n\\nLet P be the intersection point between the horizontal lines passing through points D and F. Therefore, the triangle DPF is a right triangle. \\n\\nSince we know the angles \\u03b1, \\u03b2, and the length DG, we can determine the length DF using the law of cosines:\\n\\nLet's calculate the length of DG first:\\n\\nDG = DH + HG = (13.6569 - 4) + (9.6569 - 4) = 9.6569 + 5.6569 = 15.3138\\n\\nNow, let \\u03b1 be the angle between line DH and DF, and \\u03b2 be the angle between line HG and DF. We can use the law of cosines to calculate the length of DF:\\n\\nDF^2 = DH^2 + HG^2 - 2 * DH * HG * cos(\\u03b1 + \\u03b2)\\n\\nWe also know angle DAB = \\u03b1, angle GHB = \\u03b2 and AB = FG = 4.\\n\\nWe can calculate cos(\\u03b1 + \\u03b2) using the cosine formula for the addition of angles:\\n\\ncos(\\u03b1 + \\u03b2) = cos(\\u03b1) * cos(\\u03b2) - sin(\\u03b1) * sin(\\u03b2)\\n\\nTo find sin(\\u03b1) and cos(\\u03b1), we can use right triangle with sides DA, AB, and DB. Since DB = BA = 4, we have:\\n\\ncos(\\u03b1) = AD / DB = 4 / 4 = 1\\nsin(\\u03b1) = BA / DB = 4 / 4 = 1\\n\\nSimilarly, for angle \\u03b2, we have right triangle with sides GH, HB, and GB. Since GB = BH = 4, we have:\\n\\ncos(\\u03b2) = HG / GB = 4 / 4 = 1\\nsin(\\u03b2) = HB / GB = 4 / 4 = 1\\n\\nNow, let's calculate cos(\\u03b1 + \\u03b2):\\n\\ncos(\\u03b1 + \\u03b2) = cos(\\u03b1) * cos(\\u03b2) - sin(\\u03b1) * sin(\\u03b2) = 1 * 1 - 1 * 1 = 0\\n\\nFinally, let's calculate DF using the law of cosines:\\n\\nDF^2 = DH^2 + HG^2 - 2 * DH * HG * cos(\\u03b1 + \\u03b2)\\nDF^2 = 9.6569^2 + 5.6569^2 - 2 * 9.6569 * 5.6569 * 0\\n\\nNow let's compute the square of DF.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Now let's calculate the square of DF using Python.\\n\\n```python\\nDH = 9.6569\\nHG = 5.6569\\ncos_alpha_beta = 0\\n\\nDF_squared = DH**2 + HG**2 - 2 * DH * HG * cos_alpha_beta\\nDF_squared\\n```\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 44.82826566696167,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"mostly efficient\",\n", + " \"Code Correctness\": \"mostly correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "actual label for this case: true\n", + "\u001b[33mquantifier_user\u001b[0m (to quantifier):\n", + "\n", + "Task: Math problem solving.\n", + "Task description: Given any question, the system needs to solve the problem as consisely and accurately as possible\n", + "Task successful example: {\n", + " \"problem\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Number Theory\",\n", + " \"solution\": \"Prime factorize $144=2^4\\\\cdot3^2$. The sum of the positive two-digit factors of 144 is $2^4+2\\\\cdot3^2+2^2\\\\cdot3+2^2\\\\cdot3^2+2^3\\\\cdot3+2^3\\\\cdot3^2+2^4\\\\cdot3=\\\\boxed{226}.$\",\n", + " \"problem_id\": \"0\",\n", + " \"response_with_ans\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"round\": 0,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"What is the sum of all the distinct positive two-digit factors of 144?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the sum of all the distinct positive two-digit factors of 144, we need to first find all these factors. We can do this by iterating through the numbers from 10 to 99 and checking if they are factors of 144. Then, we can sum these factors and print their sum.\\n\\nHere's a Python script to accomplish this:\\n\\n```python\\ntwo_digit_factors = []\\n\\nfor i in range(10, 100):\\n if 144 % i == 0:\\n two_digit_factors.append(i)\\n\\nsum_of_factors = sum(two_digit_factors)\\nprint(\\\"The sum of all the distinct positive two-digit factors of 144 is:\\\", sum_of_factors)\\n```\\n\\nPlease run this script to find the desired sum.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 11.140539407730103,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Task failed example: {\n", + " \"problem\": \"Find all $x$ that satisfy the inequality $(2x+10)(x+3)<(3x+9)(x+8)$. Express your answer in interval notation.\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Algebra\",\n", + " \"solution\": \"We have \\\\begin{align*} (2x+10)(x+3)&<(3x+9)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)&<3(x+3)(x+8) \\\\quad \\\\Rightarrow\\n\\\\\\\\ 2(x+5)(x+3)-3(x+3)(x+8)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (2x+10-(3x+24))(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (-x-14)(x+3)&<0 \\\\quad \\\\Rightarrow\\n\\\\\\\\ (x+14)(x+3)&>0.\\n\\\\end{align*} This inequality is satisfied if and only if $(x+14)$ and $(x+3)$ are either both positive or both negative. Both factors are positive for $x>-3$ and both factors are negative for $x<-14$. When $-14 0$ and then find intervals where the inequality holds true.\\n\\nLet's first find the factorized form of the quadratic:\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"I apologize for the confusion in my previous message. Let's find the factorized form of the quadratic using Python code.\\n\\n```python\\nfrom sympy import symbols, factor\\r\\nx = symbols('x')\\r\\nfactorized = factor(x**2 + 17*x + 42)\\r\\nfactorized\\r\\n```\\n\\nPlease run the Python code above to find the factorized form of the quadratic, and we can proceed to determine the intervals where the inequality holds true.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 24.91333508491516,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "Evaluation dictionary: {\n", + " \"Problem Interpretation\": {\n", + " \"description\": \"Ability to correctly interpret the problem.\",\n", + " \"accepted_values\": [\"completely off\", \"slightly relevant\", \"relevant\", \"mostly accurate\", \"completely accurate\"]\n", + " },\n", + " \"Mathematical Methodology\": {\n", + " \"description\": \"Adequacy of the chosen mathematical or algorithmic methodology for the question\",\n", + " \"accepted_values\": [\"inappropriate\", \"barely adequate\", \"adequate\", \"mostly effective\", \"completely effective\"]\n", + " },\n", + " \"Calculation Correctness\": {\n", + " \"description\": \"Accuracy of calculations made and solutions given\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"neither\", \"mostly correct\", \"completely correct\"]\n", + " },\n", + " \"Explanation Clarity\": {\n", + " \"description\": \"Clarity and comprehensibility of explanations, including language use and structure\",\n", + " \"accepted_values\": [\"not at all clear\", \"slightly clear\", \"moderately clear\", \"very clear\", \"completely clear\"]\n", + " },\n", + " \"Code Efficiency\": {\n", + " \"description\": \"Quality of code in terms of efficiency and elegance\",\n", + " \"accepted_values\": [\"not at all efficient\", \"slightly efficient\", \"moderately efficient\", \"very efficient\", \"extremely efficient\"]\n", + " },\n", + " \"Code Correctness\": {\n", + " \"description\": \"Correctness of the provided code\",\n", + " \"accepted_values\": [\"completely incorrect\", \"mostly incorrect\", \"partly correct\", \"mostly correct\", \"completely correct\"]\n", + " }\n", + " }\n", + "actual test case to evaluate: {\n", + " \"problem\": \"How many integers $n$ satisfy both of the inequalities $4n + 3 < 25$ and $-7n + 5 < 24$?\",\n", + " \"level\": \"Level 5\",\n", + " \"type\": \"Prealgebra\",\n", + " \"solution\": \"Subtract 3 and divide by 4 on both sides of the first inequality to obtain \\\\begin{align*}\\n4n + 3 &< 25 \\\\\\\\\\n\\\\Rightarrow\\\\qquad 4n &< 22 \\\\\\\\\\n\\\\Rightarrow\\\\qquad n &< 5.5.\\n\\\\end{align*}Similarly, the second inequality yields \\\\begin{align*}\\n-7n + 5 &< 24 \\\\\\\\\\n\\\\Rightarrow\\\\qquad -7n &< 19 \\\\\\\\\\n\\\\Rightarrow\\\\qquad n &> -\\\\frac{19}{7}.\\n\\\\end{align*}Therefore, we are looking for all the integers between $-\\\\frac{19}{7}$ and $5.5$. Since $-\\\\frac{19}{7}$ is between $-3$ and $-2$ and the largest integer less than $5.5$ is 5, we need to count the number of integers between $-2$ and $5$, inclusive. There are $5$ positive integers, $2$ negative integers, and zero, so there are $\\\\boxed{8}$ integers that satisfy both $4n + 3 < 25$ and $-7n + 5 < 24$.\",\n", + " \"problem_id\": \"10\",\n", + " \"response_with_ans\": \"Here's the code to solve the inequalities and find the intersection of their solutions:\\n\\n```python\\nfrom sympy import symbols, Eq, solve\\n\\nn = symbols(\\\"n\\\")\\ninequality_1 = 4 * n + 3 < 25\\ninequality_2 = -7 * n + 5 < 24\\n\\nsolution_1 = solve(inequality_1, n)\\nsolution_2 = solve(inequality_2, n)\\n\\nintersection = (max(solution_1[0], solution_2[0]), min(solution_1[1], solution_2[1]))\\n\\nprint(f\\\"Solution to inequality 1: {solution_1}\\\")\\nprint(f\\\"Solution to inequality 2: {solution_2}\\\")\\nprint(f\\\"Intersection of solutions: {intersection}\\\")\\n```\\n\\nExecute this code, and let's see the solutions for both inequalities and their intersection.\",\n", + " \"round\": 1,\n", + " \"messages\": [\n", + " {\n", + " \"content\": \"How many integers $n$ satisfy both of the inequalities $4n + 3 < 25$ and $-7n + 5 < 24$?\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"To find the number of integers $n$ that satisfy both inequalities, we'll first solve each inequality individually, and then find the intersection of the solutions.\\n\\nStep 1: Solve the inequalities\\n1. $4n + 3 < 25$\\n2. $-7n + 5 < 24$\\n\\nStep 2: Find the intersection of the solutions\\n\\nStep 3: Count the number of integers in the intersection\\n\\nFirst, let's solve the inequalities using the python code.\",\n", + " \"role\": \"assistant\"\n", + " },\n", + " {\n", + " \"content\": \"\",\n", + " \"role\": \"user\"\n", + " },\n", + " {\n", + " \"content\": \"Here's the code to solve the inequalities and find the intersection of their solutions:\\n\\n```python\\nfrom sympy import symbols, Eq, solve\\n\\nn = symbols(\\\"n\\\")\\ninequality_1 = 4 * n + 3 < 25\\ninequality_2 = -7 * n + 5 < 24\\n\\nsolution_1 = solve(inequality_1, n)\\nsolution_2 = solve(inequality_2, n)\\n\\nintersection = (max(solution_1[0], solution_2[0]), min(solution_1[1], solution_2[1]))\\n\\nprint(f\\\"Solution to inequality 1: {solution_1}\\\")\\nprint(f\\\"Solution to inequality 2: {solution_2}\\\")\\nprint(f\\\"Intersection of solutions: {intersection}\\\")\\n```\\n\\nExecute this code, and let's see the solutions for both inequalities and their intersection.\",\n", + " \"role\": \"assistant\"\n", + " }\n", + " ],\n", + " \"time\": 19.949471950531006,\n", + " \"trial\": -1\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n", + "\u001b[33mquantifier\u001b[0m (to quantifier_user):\n", + "\n", + "{\n", + " \"Problem Interpretation\": \"completely accurate\",\n", + " \"Mathematical Methodology\": \"completely effective\",\n", + " \"Calculation Correctness\": \"completely correct\",\n", + " \"Explanation Clarity\": \"very clear\",\n", + " \"Code Efficiency\": \"moderately efficient\",\n", + " \"Code Correctness\": \"mostly correct\"\n", + "}\n", + "\n", + "--------------------------------------------------------------------------------\n" + ] + } + ], + "source": [ + "# You can set your own log path - we also limited the number of samples to avoid additional costs.\n", + "# By removing the condition about limitations on the number of samples per category, you can run it on all 120 problems\n", + "import os\n", + "\n", + "# log_path = \"../test/test_files/agenteval-in-out/agentchat_results/\"\n", + "criteria_file = \"../test/test_files/agenteval-in-out/samples/sample_math_criteria.json\"\n", + "outcome = {}\n", + "\n", + "for prefix in os.listdir(log_path):\n", + " for file_name in os.listdir(log_path + \"/\" + prefix):\n", + " gameid = prefix + \"_\" + file_name\n", + " if file_name.split(\".\")[-1] == \"json\":\n", + " outcome[gameid] = get_quantifier(log_path + \"/\" + prefix + \"/\" + file_name, criteria_file)\n", + "\n", + "# store the evaluated problems\n", + "with open(\"../test/test_files/agenteval-in-out/evaluated_problems.json\", \"w\") as file:\n", + " json.dump(outcome, file, indent=2) # use `json.loads` to do the reverse" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "qbrRRiP_EGCT" + }, + "source": [ + "## Plotting the estimated performance" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here you can find an example of how to visualize the obtained result in the histogram form (similar to the one in the blog post)." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" }, + "id": "LKu2xZJcEGCT", + "outputId": "7780bc7c-382f-4ad3-b8c6-ac6051302303" + }, + "outputs": [ { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The final plot would be saved in `../test/test_files/agenteval-in-out/estimated_performance.png`" - ] + "name": "stdout", + "output_type": "stream", + "text": [ + "{'completely off': 0, 'slightly relevant': 1, 'relevant': 2, 'mostly accurate': 3, 'completely accurate': 4, 'inappropriate': 0, 'barely adequate': 1, 'adequate': 2, 'mostly effective': 3, 'completely effective': 4, 'completely incorrect': 0, 'mostly incorrect': 1, 'neither': 2, 'mostly correct': 3, 'completely correct': 4, 'not at all clear': 0, 'slightly clear': 1, 'moderately clear': 2, 'very clear': 3, 'completely clear': 4, 'not at all efficient': 0, 'slightly efficient': 1, 'moderately efficient': 2, 'very efficient': 3, 'extremely efficient': 4, 'partly correct': 2}\n" + ] }, { - "cell_type": "code", - "execution_count": 22, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 695 - }, - "id": "zqa86vwgEGCT", - "outputId": "248cd0bc-0927-4d9f-b911-088bd76acf5d" - }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAABI8AAAMVCAYAAAD+r9SpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAAEAAElEQVR4nOzdd3gUVd/G8XtJJwkhEEpCSaihV2lSQpEmRVC6tAcUBMWCiChIURBB4MFGEbDQiyBKL1IEqQLSQWlKCb1DCAHO+wdP9mXZTEiWFJDv57pyXdnZMzO/nezMzt45M8dmjDECAAAAAAAA4pAmtQsAAAAAAADAo4vwCAAAAAAAAJYIjwAAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABgifAIAAAAAAAAlgiPAAAAAAAAYInwCAAAAAAAAJYIjwAAAAAAAGCJ8AhIAZ9//rlsNpuKFCmS2qU8Ms6cOSNPT0+1aNHCss3ly5eVNm1aNWzYMMHL/e6772Sz2XTkyJEkqDL13Lx5U6+88oqCg4Pl5uamEiVKWLadNm2aqlSpoixZssjLy0shISFq0KCB1q1b91A1hIWFqX379vbHq1atks1m06pVqxzaffHFF8qbN688PT1ls9l08eJFSVKfPn2UM2dOubu7K3369A9VS3Las2eP+vfvn+D3TP/+/WWz2XT27NnkLcxFsfXdq2rVqqpatWrqFIQEiWv/Wrhwofr37x9ne5vNptdee83l9UVGRqp9+/bKnDmzvL29VaxYMU2YMMGpXewxNa6fkydPOrQdPXq0wsLCFBgYqNatW9uPBbFu3bqlEiVKqG/fvomqNTo6Wl9++aUqVaqkwMBAeXp6Klu2bGrWrJlWr16d6NeeWHEdyxK6Tx05ckQ2m03fffddstaY3GJfx7Bhw1yaf9SoUY/VNrj/8+/fJr7PvapVqz4256uJqdVms1keTwEkjHtqFwA8Cb755htJ0u7du7Vx40aVK1culStKfZkyZVLDhg01d+5cXbhwQYGBgU5tpk+frqioKHXs2DEVKkxdo0eP1tixY/XFF1+odOnS8vPzs2x77tw5VaxYUW+88YaCgoIUGRmpESNGqEqVKvrll18UERGRJDWVKlVK69evV6FChezT/vjjD73++ut66aWX1K5dO7m7u8vf318//fSTBg0apN69e6tu3bry8vJKkhqSw549ezRgwABVrVpVYWFhqV1Oshg1alRql4AHiGv/Wrhwob766qsk/8Jz6dIlVapUSTdv3tTQoUMVHBysadOm6aWXXtKlS5fUvXt3p3m+/fZbFShQwGFaxowZ7b//+uuv6tatm4YPH668efPqrbfeUo8ePTR+/Hh7mxEjRuj69evq3bt3gms9e/as6tSpox07dqhDhw565513lCFDBh0/flw//fSTatSooS1btqh48eIubIkHszqWsU8lzqhRoxQUFPSvDmQeJ0/C5x6ApEd4BCSz33//Xdu3b1e9evW0YMECTZgwIcXDI2OMbty4IR8fnxRd74N07NhRs2fP1pQpU+L8D/o333yjLFmyqF69eqlQXeratWuXfHx8EtSzIK42devWVaZMmTRhwoQkC4/SpUun8uXLO0zbvXu3JOnll19W2bJl7dN37dolSXr99deVOXPmJFn/9evXlTZt2iRZ1pPm3kACj6a49q/kMnr0aB06dEi///67SpcuLUmqXbu2IiMj1bdvX3Xo0MGpt2CRIkX01FNPWS5zwYIFqlGjht544w1JcgqhDh8+rAEDBmj+/PmJCpPbtm2r7du3a8mSJapevbrDcy1atFD37t3j/OdDUrE6lrFPpb5H9dwGrouKipK3t7dT71kAjwYuWwOSWexlAJ988omefvppTZ8+XdevX5ckxcTEKHPmzGrTpo3TfBcvXpSPj4/Dyffly5fVo0cP5cqVy95t/80339S1a9cc5o29nGHMmDEqWLCgvLy89P3330uSBgwYoHLlyilDhgxKly6dSpUqpQkTJsgY47CM6Ohovf3228qaNavSpk2rKlWqaMuWLXF25T558qQ6d+6s7Nmzy9PTU7ly5dKAAQN069ateLdN7dq1lT17dn377bdOz+3du1cbN25U27Zt5e7urmXLlum5555T9uzZ5e3trbx586pz584JunTIqvt5XJcdJHQbz5o1S+XKlVNAQIDSpk2r3Llzq0OHDg+s5caNG3rvvfcclv/qq686XN5hs9k0fvx4RUVF2S8PSWx3f39/f3l7e8vd/cH/I4iJiVHPnj3tf+tKlSpp06ZNTu3uv6ymatWqat26tSSpXLlystlsat++vcLCwtSnTx9JUpYsWZy6is+YMUMVKlSQr6+v/Pz8VLt2bW3bts1hXe3bt5efn5927typWrVqyd/fXzVq1JB095K+gQMHqkCBAvLy8lKmTJn0n//8R2fOnHFYRlhYmOrXr6/FixerVKlS8vHxUYECBew9AaW7l+Q0bdpUklStWrVEbe+jR4/q+eefV7p06RQQEKDWrVs71TBjxgzVqlVLwcHB8vHxUcGCBdWrVy+n99OhQ4fUokULhYSEyMvLS1myZFGNGjX0xx9/OC3vQdsuLve/1++9BGXEiBHKlSuX/Pz8VKFCBW3YsMFp/t9//10NGzZUhgwZ5O3trZIlS2rmzJkOba5fv27fd7y9vZUhQwY99dRTmjZt2gPrO378uDp16qQcOXLI09NTISEhatKkiU6dOiXp7n7z9ttvq0SJEgoICFCGDBlUoUIF/fTTT07LSsi+mZz7edOmTVW4cGGHaQ0aNJDNZtOsWbPs07Zu3SqbzaZ58+ZJct6/2rdvr6+++kqSHC4Vu/8yk0mTJqlgwYJKmzatihcvrvnz58dbnyT99ttvypIliz04ilW/fn1du3ZNixcvfuAy7nfjxg35+vraH/v5+enGjRv2x126dFHz5s1VrVq1BC9zy5YtWrRokTp27OgUHMUqU6aMcubMaX+8a9cuPffccwoMDJS3t7dKlChh//yLFbutp02bpt69eyskJETp0qXTM888o/3799vbxXcsi+vz48SJE2rWrJn8/f0VEBCg5s2bO13aFysh+1TsJYMrV65Uly5dFBQUpIwZM+r555/XiRMnnJY5depUVahQQX5+fvLz81OJEiWcLkVcvny5atSooXTp0ilt2rSqWLGifvnllzhrfJCE1hcWFqbdu3dr9erV9vfxvb1dHubcZvz48Qk+j0rMceR+d+7c0cCBAxUeHi4fHx+lT59exYoV02effebStrMS+7k1f/58lSxZ0v65Ebtff/fddypYsKB8fX1VtmxZ/f777w7z//7772rRooXCwsLk4+OjsLAwtWzZUn///be9TUI/9zZv3qzKlSvbj32ffPKJ7ty588DXEPt3Gjt2rPLnzy8vLy8VKlRI06dPd2gX+/5ZunSpOnTooEyZMilt2rSKjo7WnTt3NHToUPvnfObMmdW2bVsdO3YsznWuWbNG5cuXl4+Pj7Jly6YPPvhAt2/ffmCtCTl/jf28/PTTTzVkyBD7tq1atar+/PNPxcTEqFevXgoJCVFAQIAaN26s06dPO6xnxYoVqlq1qjJmzCgfHx/lzJlTL7zwgv37APDYMACSzfXr101AQIApU6aMMcaY8ePHG0nmu+++s7d56623jI+Pj7l06ZLDvKNGjTKSzI4dO4wxxly7ds2UKFHCBAUFmREjRpjly5ebzz77zAQEBJjq1aubO3fu2OeVZLJly2aKFStmpk6dalasWGF27dpljDGmffv2ZsKECWbZsmVm2bJl5qOPPjI+Pj5mwIABDutv2bKlSZMmjenVq5dZunSpGTlypMmRI4cJCAgw7dq1s7eLjIw0OXLkMKGhoWbs2LFm+fLl5qOPPjJeXl6mffv2D9xGffr0MZLMH3/84TD9nXfeMZLM3r17jTHGjB492gwePNj8/PPPZvXq1eb77783xYsXN+Hh4ebmzZv2+b799lsjyRw+fNg+LTQ01KHmWBERESYiIsL+OKHbeN26dcZms5kWLVqYhQsXmhUrVphvv/3WtGnTJt7XeufOHVO7dm3j7u5uPvjgA7N06VIzbNgw4+vra0qWLGlu3LhhjDFm/fr15tlnnzU+Pj5m/fr1Zv369eb06dMP3Ja3bt0yN2/eNIcPHzadOnUyfn5+5vfff3/gfO3atTM2m8288847ZunSpWbEiBEmW7ZsJl26dA7bbeXKlUaSWblypTHGmN27d9v/ft9++61Zv369OXDggNm6davp2LGjkWQWL15s1q9fb44ePWqMMWbQoEHGZrOZDh06mPnz55s5c+aYChUqGF9fX7N7926Hmjw8PExYWJgZPHiw+eWXX8ySJUvM7du3TZ06dYyvr68ZMGCAWbZsmRk/frzJli2bKVSokLl+/bp9GaGhoSZ79uymUKFCZuLEiWbJkiWmadOmRpJZvXq1McaY06dPm48//thIMl999VWCtne/fv2MJBMaGmreeecds2TJEjNixAj73/He9+NHH31k/vvf/5oFCxaYVatWmTFjxphcuXKZatWqOSwzPDzc5M2b10yaNMmsXr3azJ4927z99tv2bZ2YbRdb373uf68fPnzYSDJhYWGmTp06Zu7cuWbu3LmmaNGiJjAw0Fy8eNHedsWKFcbT09NUrlzZzJgxwyxevNi0b9/e/neP1blzZ5M2bVozYsQIs3LlSjN//nzzySefmC+++MJyWxpjzLFjx0xwcLDDfjdjxgzToUMH+/5/8eJF0759ezNp0iSzYsUKs3jxYtOjRw+TJk0a8/3339uXlZB9M7n38zFjxhhJ5sSJE8YYY2JiYoy/v7/x8fExL7/8sr3dkCFDjLu7u7l8+bIxxnn/OnDggGnSpImRZH9frl+/3n6ciP37lS1b1sycOdMsXLjQVK1a1bi7u5uDBw/GW2OtWrVMzpw5naaPHTvWSDLvvfeefVrsMTVLliwmTZo0JjAw0DRu3Njs3LnTYd7p06cbX19fs27dOnPq1ClTo0YNU7duXWOMMVOmTDGZMmUyZ8+ejbeu+8Xum4sWLUpQ+3379hl/f3+TJ08eM3HiRLNgwQLTsmVLI8kMGTLE3i52W4eFhZkXX3zRLFiwwEybNs3kzJnT5MuXz9y6dcsYY+I9lt2/T12/ft0ULFjQBAQEmC+++MIsWbLEvP766yZnzpxO+0pC96nYbZ87d27TrVs3s2TJEjN+/HgTGBjodAz54IMPjCTz/PPPm1mzZtmP5R988IG9zaRJk4zNZjONGjUyc+bMMfPmzTP169c3bm5uZvny5fFu29hjxqeffpro+rZu3Wpy585tSpYsaX8fb9261RiTNOc2CT2PSuhxxBjn84bBgwcbNzc3069fP/PLL7+YxYsXm5EjR5r+/fvHu90SK/Zzq0iRImbatGlm4cKFply5csbDw8P07dvXVKxY0cyZM8f8+OOPJn/+/CZLliwOn3uzZs0yffv2NT/++KNZvXq1mT59uomIiDCZMmUyZ86cMcY8+HMvIiLCZMyY0eTLl8+MGTPGLFu2zHTt2tVIctpOcZFkcuTIYQoVKmSmTZtmfv75Z1OnTh0jycyaNcveLvb9ky1bNtOpUyezaNEi88MPP5hbt26ZTp06GUnmtddeM4sXLzZjxowxmTJlMjly5LC/jntrDQkJMZ9//rl9v5NkXn31Vae6+vXrZ3+c0PPX2Pd+aGioadCggZk/f76ZPHmyyZIli8mfP79p06aN6dChg1m0aJEZM2aM8fPzMw0aNHCY39vb29SsWdPMnTvXrFq1ykyZMsW0adPGXLhwIWFvDOARQXgEJKOJEycaSWbMmDHGGGOuXLli/Pz8TOXKle1tduzYYSSZr7/+2mHesmXLmtKlS9sfDx482KRJk8Zs3rzZod0PP/xgJJmFCxfap0kyAQEB5vz58/HWd/v2bRMTE2M+/PBDkzFjRvtJ2u7du40k8+677zq0nzZtmpHkcELVuXNn4+fnZ/7++2+HtsOGDTOSHL7UxuXQoUPGZrOZ119/3T4tJibGZM2a1VSsWDHOee7cuWNiYmLM33//bSSZn376yf7cw4RHCd3Gsa/t3i/YCbF48WIjyQwdOtRh+owZM5zeA+3atTO+vr6JWn54eLiRZCSZ4OBgs3bt2gfOs3fvXiPJvPXWWw7Tp0yZ4vS3vv/LrTH/v73v32axAca9J3n//POPcXd3N926dXNoe+XKFZM1a1bTrFkz+7R27doZSeabb75xaBv7Hpw9e7bD9M2bNxtJZtSoUfZpoaGhxtvb2+G9GRUVZTJkyGA6d+5snzZr1iyn1xWf2Ndmtc0mT54c53yx79vVq1cbSWb79u3GGGPOnj1rJJmRI0darjMx2y4x4VHRokXtX5SNMWbTpk1Gkpk2bZp9WoECBUzJkiVNTEyMwzLr169vgoODze3bt40xxhQpUsQ0atTI8jVY6dChg/Hw8DB79uxJ8Dy3bt0yMTExpmPHjqZkyZL26QnZN5N7Pz9w4ICRZCZOnGiMMWbt2rVGkunZs6fJlSuXvV3NmjXN008/bX8c1/716quvOv0tY8UGOrHhkzHGnDx50qRJk8YMHjw43hrffPNNkyZNGqfjdps2bYwk06lTJ/u0RYsWmd69e5t58+aZ1atXmy+//NJkz57d+Pr6OoT+d+7cse+3kkx4eLj5888/zblz50zmzJnNpEmT4q0pLq+88oqRZPbt25eg9i1atDBeXl7mn3/+cZhet25dkzZtWvvfMnZbP/vssw7tZs6caQ/rYsV1LDPGeZ8aPXq00+eRMca8/PLLTqFQQvep2ONr165dHdoNHTrUSDKRkZHGmLufo25ububFF1+03DbXrl0zGTJkcPhSa8zd84DixYubsmXLWs5rTPzh0YPqM8aYwoULO2yvWElxbpPQ86j7WR1HjHE+b6hfv74pUaKE5bKSSmhoqPHx8THHjh2zT/vjjz/sn+vXrl2zT587d66RZH7++WfL5d26dctcvXrV+Pr6ms8++8w+Pb7PvYiICCPJbNy40WF6oUKFTO3atR/4GiQZHx8fc/LkSYc6ChQoYPLmzWufFvv+adu2rcP8secl97+vNm7caCSZ999/36nWuPa7+49x94dHCT1/jX3vFy9e3L5vGmPMyJEjjSTTsGFDh/nffPNNI8keZsa+l+//JynwOOKyNSAZTZgwQT4+PvYRxfz8/NS0aVOtWbNGf/31lySpaNGiKl26tMOlW3v37tWmTZscLo+YP3++ihQpohIlSujWrVv2n9q1a8c5Alb16tXjvA/EihUr9MwzzyggIEBubm7y8PBQ3759de7cOXs329jRa5o1a+Ywb5MmTZwug5o/f76qVaumkJAQh7rq1q3rsCwruXLlUrVq1TRlyhTdvHlTkrRo0SKdPHnS4fWfPn1ar7zyinLkyCF3d3d5eHgoNDTUvr2SQkK3cZkyZSTd3T4zZ87U8ePHE7T8FStWSJLTJXRNmzaVr6+vy5cOxJo9e7Y2btyoWbNmqVChQqpbt67T++J+K1eulCS9+OKLDtObNWuWoEveEmPJkiW6deuW2rZt67B9vb29FREREWetL7zwgsPj+fPnK3369GrQoIHDMkqUKKGsWbM6LaNEiRIOl7R4e3srf/78Dl34XWW1zWK3qXT3crRWrVopa9as9v0t9h5Use/bDBkyKE+ePPr00081YsQIbdu2zenSAFe2XULUq1dPbm5u9sfFihWTJPv2OXDggPbt22d/rfeu+9lnn1VkZKT9Mp+yZctq0aJF6tWrl1atWqWoqKgE1bBo0SJVq1ZNBQsWjLfdrFmzVLFiRfn5+dmPARMmTHDY/xOybyb3fp4nTx6FhYVp+fLlkqRly5apaNGiat26tQ4fPqyDBw8qOjpaa9eu1TPPPJOgZVqpVq2a/P397Y+zZMmizJkzP/D93alTJ3l4eOjFF1/U7t27de7cOX311VeaMWOGJClNmv8/PaxTp44GDhyo+vXrq0qVKnr11Ve1Zs0a2Ww2h1HTYi97OX36tP766y/t2bNH+fLl0zvvvKPixYurdevW2rlzpyIiIhQYGKinnnpKa9aseajXf78VK1aoRo0aypEjh8P09u3b6/r161q/fr3D9PtH8rz//Z8YK1eulL+/v9MyW7Vq5fA4MftUQutctmyZbt++rVdffdWyvnXr1un8+fNq166dwzrv3LmjOnXqaPPmzU6XiSXUw2zHpDi3Seh5lJSw40hcypYtq+3bt6tr165asmSJLl++/MDXJkm3b9922t4PUqJECWXLls3+OPbYWLVqVYf7/sVOv3c7X716Ve+++67y5s0rd3d3ubu7y8/PT9euXUvUuVLWrFkd7mMo3f27JnTfqFGjhrJkyWJ/7ObmpubNm+vAgQNOl57d/zkf+xl6/7lS2bJlVbBgQadzJav97s6dO/r1118ta0zs+euzzz7rcGyM3f7335czdvo///wj6e7f09PTU506ddL333+vQ4cOWdYEPOoIj4BkcuDAAf3666+qV6+ejDG6ePGiLl68qCZNmkiSw31XOnTooPXr12vfvn2S7o5q4+XlpZYtW9rbnDp1Sjt27JCHh4fDj7+/v4wxTvf+CQ4Odqpp06ZNqlWrliRp3Lhx+u2337R582b7yDexX/bOnTsnSQ4f/JLk7u7uMLpObF3z5s1zqiv2nh8JuSdRx44dde7cOf3888/21+/n52cPr+7cuaNatWppzpw56tmzp3755Rdt2rTJfm+WhH5JfZCEbuMqVapo7ty59i/z2bNnV5EiRR54b5dz587J3d1dmTJlcphus9mUNWtW+3Z3VeHChVW2bFk1adJEixcvVmhoqP3mtfHVJN09UbxXXH/rhxV7/5oyZco4beMZM2Y4vVfSpk2rdOnSOS3j4sWL8vT0dFrGyZMnnZYR12vw8vJKkveM1TaL3aZXr15V5cqVtXHjRg0cOFCrVq3S5s2bNWfOHEn//7612Wz65ZdfVLt2bQ0dOlSlSpVSpkyZ9Prrr+vKlSv21y0lfNsl1P3bJ/ZGxrG1xa63R48eTuvt2rWrpP/fxz///HO9++67mjt3rqpVq6YMGTKoUaNG9qDcypkzZ5Q9e/Z428yZM0fNmjVTtmzZNHnyZK1fv16bN29Whw4dHO6rk5B9M7n3c+nuF6fYLzjLly9XzZo1VbRoUWXJkkXLly/Xb7/9pqioqIcOj1x9fxcsWFA//vij/v77bxUpUkRBQUEaMmSIhg8fLkkOX1zjEhYWpkqVKsV5f6xMmTIpb968SpMmjVavXq3p06dr9OjRiomJUaNGjVS1alWdOHFCnTp10nPPPafz589bric2+D18+HC89cQ6d+5cnJ99ISEh9ufv9aD3f2KcO3fO6TNTcj5OJGafSmidsfdai28/il1vkyZNnNY7ZMgQGWPi/VvE52G2Y1Kc20gJO49K6HEkLu+9956GDRumDRs2qG7dusqYMaNq1KjhdM+h++XJk8fhdX344YcP3CYZMmRweOzp6Rnv9Htrb9Wqlb788ku99NJLWrJkiTZt2qTNmzcrU6ZMiXpfP+xn5/3v+3un3b8f3v83jX3eal++f/749rv4zqsSe/7q6t8lT548Wr58uTJnzqxXX31VefLkUZ48eZL8fllASmC0NSCZfPPNNzLG6IcfftAPP/zg9Pz333+vgQMHys3NTS1btlT37t313XffadCgQZo0aZIaNWrk8N+1oKAg+fj4OIRO9woKCnJ4HNdIFdOnT5eHh4fmz58vb29v+/S5c+c6tIs9aTh16pTDl4hbt245fRAHBQWpWLFiGjRoUJx1xZ60x+f5559XYGCgvvnmG0VERGj+/Plq27atfXj6Xbt2afv27fruu+/Url07+3wHDhx44LKlu71NoqOjnaafPXvWYbslZhs/99xzeu655xQdHa0NGzZo8ODBatWqlcLCwlShQoU458+YMaNu3bqlM2fOOARIxhidPHnS3tMhKbi7u6tUqVJON2CNqybp7k0jH/S3flix2++HH36w9xqLT1zv4dgbslrd0PfeXhjJzWqbxW7TFStW6MSJE1q1apXDiHf33hw9VmhoqP3Gtn/++admzpyp/v376+bNmxozZkyit11SiV3ve++9p+effz7ONuHh4ZIkX19fDRgwQAMGDNCpU6fsvZAaNGhg/0IXl0yZMlneBDXW5MmTlStXLs2YMcPhfRHXfv2gfTO593Ppbng0YcIEbdq0SRs3brTfdLl69epatmyZ/v77b/n5+aXY6GpxqVu3rv7++28dOHBAt27dUv78+e3HiypVqjxwfmOMw3/h7xcdHa3OnTvrgw8+UJ48ebRr1y4dOnRIPXr0kI+Pjzp16qT33ntP69evtxxRs3bt2nr//fc1d+5c1alT54E1ZcyYUZGRkU7TY2/efP/nZFLKmDFjnAMN3H/D7MTsUwkV+3ly7Ngxp15X96/3iy++sHzfxfUlPLklxbmNpASdRyXmOHI/d3d3de/eXd27d9fFixe1fPlyvf/++6pdu7aOHj1qORLovHnzHJafkHMiV126dEnz589Xv3791KtXL/v06Ohol4NBV8V1o/jYafcHU/f/TWOfj4yMdApET5w44fSeiA1GE7KueyXF+WtCVa5cWZUrV9bt27f1+++/64svvtCbb76pLFmy2K9OAB4HhEdAMrh9+7a+//575cmTR+PHj3d6fv78+Ro+fLgWLVqk+vXrKzAwUI0aNdLEiRNVoUIFp0u2pLuj4Hz88cfKmDGjcuXK5VJdNptN7u7uDpepREVFadKkSQ7tYr84zJgxQ6VKlbJP/+GHH5xGUKtfv74WLlyoPHnyuDxcsre3t1q1aqUxY8ZoyJAhiomJcXj9sScW9w/vPHbs2AQtPywsTDt27HCY9ueff2r//v0OJyGubGMvLy9FREQoffr0WrJkibZt22b5pbJGjRoaOnSoJk+erLfeess+ffbs2bp27Zp9NLGkcOPGDW3YsEF58+aNt13saEFTpkxxGHlp5syZDxwtL7Fq164td3d3HTx40KmbekLVr19f06dP1+3bt1WuXLkkqcvV3gZW2yx2m7r6vs2fP7/69Omj2bNna+vWrZKSZtu5Ijw8XPny5dP27dv18ccfJ3i+LFmyqH379tq+fbtGjhyp69evW365qlu3riZNmqT9+/dbfmm22Wzy9PR0+JJx8uTJeEdJsto3k3s/l+7u6zabTR988IHSpEljP6Y+88wzeuedd/T333+rSpUq8vDweOB6pbvvzeQYjtxmsylfvnyS7o5i+Nlnn6lEiRIPDI8OHz6s3377Ld6eUx9//LE8PT3Vo0cPSbKP6Hnt2jX5+/srJiZG0dHRTiN93qtUqVKqW7euJkyYoGbNmsU54trvv/+uzJkzK2fOnKpRo4Z+/PFHnThxwuGL38SJE5U2bdpkDeuqVaummTNn6ueff3a4hGbq1KkO7Vzdp+JTq1Ytubm5afTo0Zbvy4oVKyp9+vTas2ePXnvttSRZb2JY9VpJinMbSQk6j3LlOBKX9OnTq0mTJjp+/LjefPNNHTlyRIUKFYqzbdGiRRP/Ylxks9lkjHH6zBk/frzTyGMP08suIX755RedOnXKHkjevn1bM2bMUJ48eR7Y0zR2P588ebLDP9U2b96svXv32nvLx7py5Uqc+929x964JMX5a2K5ubmpXLlyKlCggKZMmaKtW7cSHuGxQngEJINFixbpxIkTGjJkiNNQvpJUpEgRffnll5owYYLq168v6W6X6xkzZui1115T9uzZnU7K33zzTc2ePVtVqlTRW2+9pWLFiunOnTv6559/tHTpUr399tsP/DJdr149jRgxQq1atVKnTp107tw5DRs2zOlEo3DhwmrZsqWGDx8uNzc3Va9eXbt379bw4cMVEBDg8N/mDz/8UMuWLdPTTz+t119/XeHh4bpx44aOHDmihQsXasyYMQ88UZDuXrr21VdfacSIESpQoICefvpp+3MFChRQnjx51KtXLxljlCFDBs2bN0/Lli174HIlqU2bNmrdurW6du2qF154QX///beGDh3qdPlYQrdx3759dezYMdWoUUPZs2fXxYsX9dlnnznczyYuNWvWVO3atfXuu+/q8uXLqlixonbs2KF+/fqpZMmScQ41nBBPP/20GjZsqIIFCyogIEBHjhzR6NGjdfDgQf3444/xzluwYEG1bt1aI0eOlIeHh5555hnt2rVLw4YNc7pk7GGFhYXpww8/VO/evXXo0CHVqVNHgYGBOnXqlDZt2mTvuRKfFi1aaMqUKXr22Wf1xhtvqGzZsvLw8NCxY8e0cuVKPffcc2rcuHGi6ipSpIgk6euvv5a/v7+8vb2VK1euB162N2fOHLm7u6tmzZravXu3PvjgAxUvXtx+ueXTTz+twMBAvfLKK+rXr588PDw0ZcoUbd++3WE5O3bs0GuvvaamTZsqX7588vT01IoVK7Rjxw77f4+TYtu5auzYsapbt65q166t9u3bK1u2bDp//rz27t2rrVu32oefL1eunOrXr69ixYopMDBQe/fu1aRJk1ShQgXL4Ei6ewxZtGiRqlSpovfff19FixbVxYsXtXjxYnXv3l0FChRQ/fr1NWfOHHXt2lVNmjTR0aNH9dFHHyk4ONjhsriE7JvJvZ9LUubMmVWkSBEtXbpU1apVs7/+Z555RufPn9f58+c1YsSIB2772C+eQ4YMUd26deXm5qZixYrZL4t4GN26dbMPHX3o0CF9/vnnOnbsmNN9Pp555hlVqVJFxYoVU7p06bRz504NHTpUNptNH330UZzL3rdvn4YOHaqVK1fa750WHh6u0NBQdenSRa+++qpmzJghd3f3BwY6EydOVJ06dVS3bl116NBBdevWVWBgoCIjIzVv3jxNmzZNW7ZsUc6cOdWvXz/7fUz69u2rDBkyaMqUKVqwYIGGDh2qgICAh95uVtq2bav//ve/atu2rQYNGqR8+fJp4cKFWrJkiVPbhO5TCRUWFqb3339fH330kaKiotSyZUsFBARoz549Onv2rAYMGCA/Pz998cUXateunc6fP68mTZooc+bMOnPmjLZv364zZ85o9OjRSbU5nBQtWlTTp0/XjBkzlDt3bnl7e6to0aJJcm4T60HnUQk9jsSlQYMGKlKkiJ566illypRJf//9t0aOHKnQ0FB7AJva0qVLpypVqujTTz9VUFCQwsLCtHr1ak2YMEHp06d3aOvq515CBQUFqXr1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lELPIwBAgo0ePVpdu3ZVcHCwGjdurIwZMyoyMlKbNm3S3Llz4/xPdkL99ddfqlatmo4fP65KlSqpUaNGunbtmnbt2qVBgwY5fEH/8ccf1bJlS925c0cNGjRQeHi4Tp8+rY0bN2rChAlq0KCBve3777+vwYMHK3v27HrhhReULl06/frrr3rnnXe0ceNGzZo1y972vffe09ChQ5UnTx61atVK/v7+On78uNasWaMVK1aoSpUqSbYdfvnlF0lS+fLlXd5mCRHby8Ld/cEf+cYY1a5dWxs3blTFihVVp04dpUmTRkeOHNGPP/6odu3aKUeOHJLufoEaPny4atSooXLlysnDw0Pbtm3T6NGjtWTJEm3dujXO/553795dGzduVIMGDeTm5qbp06erVatWCgwM1FdffaVdu3bp2Wef1Y0bNzR16lQ1bNhQ+/btU65cuZyW1bRpU+3YsUNNmzZVTEyMZs6cqY4dO+rUqVMJutfQwYMH7V9Oa9WqpUaNGun06dOaPXu2lixZol9++UXlypWTdDcsK1u2rK5du6Z69eqpefPmunr1qv766y998cUXTgGnp6enSpcurXXr1unatWtcupaKYkOikSNHSpLefPNNSbJftrV371717dtX1apVU+PGjeXr66t9+/Zp6tSpWrBggbZu3arQ0FCX1m2MUevWrTV16lTlz59frVq1kqenp5YtW6aOHTtqz549Gjbs/++Td/36dVWtWlU7d+5UhQoVFBERoaNHj6p58+aqVatWotad2GNMVFSUpk2bJi8vL7Vp0yZB8/zxxx96+umn5ebmpueee06hoaG6ePGidu/erXHjxqlXr172tkOGDNGBAwdUvnx5NW7cWBcvXtTixYvVuXNn7d+/P85/Ely4cEGVKlVS1qxZ1a5dO/3555+aP3++9u3bp59//lmVK1dWqVKl1KFDB23ZskU//PCDLl68qGXLljkt69ChQ6pYsaLKli2rrl276q+//tKPP/6otWvXat26dSpYsOADX++YMWPUtWtXBQYGqkGDBsqUKZM2b96sQYMGaeXKlVq5cqU8PT0lJf5zokKFCpKkFStW6OWXX07Q9geAlER4BABIsPHjx8vT01Pbt29XpkyZHJ47d+7cQy27devWOn78uL7++munE+djx47Zfz99+rTatm0rd3d3rVmzRiVLlrRsu2zZMg0ePFh169bV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nfuB80+bNk3VqlVTixYtNHLkSJUuXVre3t76559/tH79ep05c0Y3btyQJE2ZMkWjRo1S1apVlTdvXqVLl0579uzRwoULFRQUpA4dOjgs++DBgzp8+LC6dOmSLK8dSadbt27q1q2bSpYsqSZNmujWrVtatmyZjDEqXry45Wh/CdG5c2dt2LBB33//vX777Tc988wzCgkJ0alTp7Rv3z5t3LhRU6dOtV+C27NnT82ZM0fjxo3T7t27VaVKFR09elQzZ85UvXr14r0/1/0edIyR7oY8CxYsUJYsWdSgQYNEv77hw4dr2bJlqlatmnLnzi1vb29t3bpVv/zyi/LmzavGjRtLkho0aKCwsDANHTpUu3btUpEiRbR//37Nnz9fjRo10uzZsxO97sSqXLmyPv/8c23YsEFlypTRn3/+qR9//FEBAQH2kTnjU6RIEY0aNUpdunRReHi4nn32WeXJk0eXL1/WoUOHtHr1arVv315jxoyRlPjPidgeno0aNUry1w4AScL8y126dMlIMpcuXUrtUgD8C0RFRZk9e/aYqKio1C4lVYwaNco0bNjQhIaGGm9vb5MxY0ZTrlw5M3bsWBMTE+PQ9tatW6Zv374mR44cxtPT0+TPn9989tln5tChQ0aSadeundPyT548ad544w2TO3du4+npaTJkyGDKlStnRowY4dR227ZtplmzZiZLlizGw8PDBAcHm7p165r58+c7tV22bJlp0KCByZQpk/Hw8DBZs2Y1FSpUMB999JH5559/jDHG3Lx50wwZMsTUqlXLZM+e3Xh6eposWbKYiIgIM336dJe3Q3wKFChgihYtGudzoaGhRpLlz8qVK+1t+/XrF29bSaZfv34PrOfo0aOmV69epnz58iZz5szG09PT5MyZ0zRp0sRs3LjRoe3NmzfNoEGDTL58+YyXl5fJmTOn6d69u7ly5YoJDQ01oaGhDu3btWtnJJnDhw87rTciIsJYnZLEtazY9tevXzc9evQw2bJlM56enqZw4cJm/PjxTstYuXKl5TY4f/686dOnjylSpIjx8fExfn5+Jl++fKZVq1Zmzpw59nYbNmwwnTt3NkWKFDHp06c3Pj4+Jl++fOb111+3v4fu1b9/fyPJ/PHHH3G+LqS8uN5Lxhhz584dM2bMGFO4cGHj7e1tsmbNajp27GhOnToV53vz22+/NZLMt99+m6DlG2PMjBkzzDPPPGMCAwONh4eHyZYtm6lataoZPny4OXPmjEPbc+fOmU6dOplMmTIZb29vU7p0aTNnzhzL9cYnvmOMMcYMGTLESDI9e/ZM8DLvtXjxYtO2bVsTHh5u/P39jZ+fnylUqJDp06ePOXv2rEPbQ4cOmRdeeMFkypTJpE2b1pQpU8ZMnz7dcv+UZCIiIpzWefjwYcvPkLiWdW/7HTt2mDp16thrrVevntm1a5fTcuI7Xm3atMm0aNHChISEGA8PDxMUFGRKlSplevXqZfbu3Wtvl9jPidy5c5sSJUo4TY/Lk34uAiBpJTQzsRlzX//8f5nLly8rICBAly5dinNUBgBIjBs3bujw4cPKlSuXvL29U7scPOa+/vpre8+E2Ptp4MGqVq2q1atXO11i+Ki4deuW8ufPr7CwMK1YsSK1y8ETjGOMdOTIEeXKlUvt2rWzjwb3qFmxYoVq1Kih77//Xm3btn1ge85FACSlhGYm3PMIAIBU0rFjRxUsWDDeYbzx+Jk0aZKOHDkS5+WDQEriGPN4+PDDD1WiRAm1bt06tUsBAEuERwAApBI3Nzd9++23KleunK5evZra5SCJ2Gw2jRs3TqVLl07tUvCE4xjz6Lt48aKqVq2q8ePHK00avpoBeHRxw2wAAFJRuXLlntjLSf6t2rdvn9olAHYcYx5t6dOnV//+/VO7DAB4IMIjAADwWFm1alVqlwDgMREWFvbI3h8NAB4n9I0EAAAAAACAJcIjAAAAAAAAWCI8AgAX0AUeAACkBs5BAKQGwiMASAQ3NzdJUkxMTCpXAgAAnkSx5yCx5yQAkBIIjwAgETw8POTl5aVLly7xnz8AAJCijDG6dOmSvLy85OHhkdrlAHiCMNoaACRSUFCQjh8/rmPHjikgIEAeHh6y2WypXRYAAPiXMsYoJiZGly5d0tWrV5UtW7bULgnAE4bwCAASKV26dJKks2fP6vjx46lcDQAAeFJ4eXkpW7Zs9nMRAEgphEcA4IJ06dIpXbp0iomJ0e3bt1O7HAAA8C/n5ubGpWoAUg3hEQA8BA8PD07kAAAAAPyrccNsAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJffULgAAACROZGSkIiMjEz1fcHCwgoODk6EiAAAA/JsRHgEA8JgZO3asBgwYkOj5+vXrp/79+yd9QQAAAPhXIzwCAOAx07lzZzVs2NBhWlRUlCpVqiRJWrt2rXx8fJzmo9cRAAAAXEF4BADAYyauy8+uXbtm/71EiRLy9fVN6bIAAADwL8UNswEAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABgiXseAXjsMEw5AAAAAKQcwqPHFF+e8SRjmHIAAAAASDmER4+ppPzyTBCFxw3DlAMAAABAyiE8ekwl5ZdnenHgccMw5QAAAACQcgiPHlNJ+eWZXhwAAAAAAMAK4RHoxQEAAAAAACylSe0CAAAAAAAA8OgiPAIAAAAAAIAlLlsDAAAAAACPPEYKTz2ERwAAAAAA4JHHSOGph/AIAAAAAAA88hgpPPUQHgEAAAAAgEceI4WnHm6YDQAAAAAAAEuPVXg0ePBg2Ww2vfnmm6ldCgAAAAAAwBPhsQmPNm/erK+//lrFihVL7VIAAAAAAACeGI9FeHT16lW9+OKLGjdunAIDA1O7HAAAAAAAgCfGYxEevfrqq6pXr56eeeaZB7aNjo7W5cuXHX4AAAAAAADgmkd+tLXp06dr69at2rx5c4LaDx48WAMGDEjmqgAAAAAAAJ4Mj3TPo6NHj+qNN97Q5MmT5e3tnaB53nvvPV26dMn+c/To0WSuEgAAAAAA4N/rke55tGXLFp0+fVqlS5e2T7t9+7Z+/fVXffnll4qOjpabm5vDPF5eXvLy8krpUgEAAAAAAP6VHunwqEaNGtq5c6fDtP/85z8qUKCA3n33XafgCAAAAAAAAEnrkQ6P/P39VaRIEYdpvr6+ypgxo9N0AAAAAAAAJL1H+p5HAAAAAAAASF2PdM+juKxatSq1SwAAAAAAAHhi0PMIAAAAAAAAlh67nkcAAAAAAODJYLMNe0CLm/bf/Pw+k+Rp2dKYHklT1BOInkcAAAAAAACwRHgEAAAAAAAAS4RHAAAAAAAAsER4BAAAAAAAAEuERwAAAAAAALDEaGtPqDn7I+N9/sb16/bff/rzpLzTpo23/fPhwUlSF5DSIiMjFRkZ//4Ql+DgYAUH874HAAAA8O9HePQYScohCmfvezFpigIec2PHjtWAAQMSPV+/fv3Uv3//pC8IAAAAAB4xhEcAnmidO3dWw4YNHaZFRUWpUqVKkqS1a9fKx8fHaT56HQEAAAB4UhAeAXiixXX52bVr1+y/lyhRQr6+vildFgAAAAA8MrhhNgAAAAAAACwRHgEAAAAAAMAS4REAAAAAAAAsER4BAAAAAADAEuERAAAAAAAALBEeAQAAAAAAwJJ7ahcAAAAAAADwYJf/93OvmHt+Py7JI4750v3vB64iPAIAAAAAAI+BDZKWxfP8KIvpNSXVSvpyniCERwAAAAAA4DFQXlIhF+aj19HDIjwCAAAAAACPAS4/Sy3cMBsAAAAAAACWCI8AAAAAAABgifAIAAAAAAAAlrjnEYDHhs02LJ5nb9p/8/P7TJJnvMsypkfSFAUAAAAA/3L0PAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAl99QuAAAAPJjNNuwBLW7af/Pz+0ySp2VLY3okTVEAAAB4ItDzCAAAAAAAAJYIjwAAAAAAAGCJy9agC6dP6cKZUw7Tom/csP9+eO8ueXl7O80XmCmLAjNnSfb6AAAAAABA6iE8gpbOmKSZX42wfL7Pi43inN7s1e5q3o37ZgAAAAAA8G9GeATVat5GZarXSvR8gZnodQQAAAAAwL8d4dFj6/L/fu4Vc8/vxyV5xDFfuv/9/L/AzFx+BgAAAAAA4kZ49NjaIGlZPM+PspheU1LiexkBAAAAAIAnE+HRY6u8pEIuzJfuwU0AAAAAAAD+h/DoseV8+RkAAAAAAEBSS5PaBQAAAAAAAODRRXgEAAAAAAAAS4RHAAAAAAAAsER4BAAAAAAAAEuERwAAAAAAALDEaGsAADzBIiMjFRkZmej5goODFRwcnAwVAfHjPQsAQMojPAIA4Ak2duxYDRgwINHz9evXT/3790/6goAH4D0LAEDKIzwCAOAJ1rlzZzVs2NBhWlRUlCpVqiRJWrt2rXx8fJzmowcHUgvvWQAAUh7hEQAAT7C4LuW5du2a/fcSJUrI19c3pcsCLPGeBQAg5REeAQAAAACAJwr30EscwiMAAAAAAPBE4R56iUN4BAAAAAAAnijcQy9xCI8AAAAAAMAThXvoJU6a1C4AAAAAAAAAjy7CIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWHJPioVER0dry5YtOn78uKKiotS2bdukWCwAAAAAAABS2UP1PIqOjta7776rzJkzq3LlymrRooX+85//OLTp2LGjQkJCtH///ocqFAAAAAAAACnP5Z5HN2/eVK1atbR27Vr5+vqqatWq2rVrl86ePevQ7vnnn9e3336rH374Qb17937oggEAAADgSRQZGanIyMhEzxccHKzg4OBkqAjAk8Ll8Ojzzz/XmjVrVLlyZc2YMUNZs2ZV5cqVncKjmjVrytPTU0uXLiU8ApBELv/v514x9/x+XJJHHPOl+98PAADA42fs2LEaMGBAoufr16+f+vfvn/QFAXhiuBweTZkyRR4eHpo2bZqyZs1q2c7T01N58+bV33//7eqqAOA+GyQti+f5URbTa0qqlfTlAAAApIDOnTurYcOGDtOioqJUqVIlSdLatWvl4+PjNB+9jgA8LJfDoz///FP58uVTSEjIA9v6+/vr4MGDrq4KAO5TXlIhF+aj1xEAAHh8xXX52bVr1+y/lyhRQr6+vildFoAngMvhkbu7u2JiYh7cUNK5c+c4iAFIQlx+BgAAAAApxeXR1vLnz68jR47ozJkz8bY7ePCgDhw4oKJFi7q6KgAAAAAAAKQSl8OjJk2aKCYmRm+99Zbu3LkTZ5ubN2+qS5custlsatGihctFAgAAAAAAIHW4fNna66+/rokTJ2ratGk6ePCg2rVrp0uXLkmSVq5cqZ07d2rs2LHau3evSpUqpQ4dOiRZ0QAAAAAAAEgZLodHPj4+WrZsmZo2bar169dr06ZN9ueeeeYZSZIxRuXLl9ecOXPk4RHXsNkAAAAAAAB4lLkcHklSSEiI1q5dqwULFmjOnDnauXOnLl26JD8/PxUqVEjPP/+8GjduLJvNllT1AgAA4Aljsw17QIub9t/8/D6T5Blva2N6PHxRAAA8QR4qPJIkm82m+vXrq379+klRDwAAAAAAAB4hLt8wGwAAAAAAAP9+hEcAAAAAAACw5PJla7lz505Ue5vNpoMHD7q6OgAAAAAAAKQCl8OjI0eOJKidzWaTMYabZgMAAAAAADyGXA6PDh8+bPnctWvXdODAAY0bN05Lly7Vf//7X9WrV8/VVQEAAAAAACCVuBwehYaGxvt8oUKF1LBhQ33yySd66623VKpUqQfOAwAAAAAAgEdLst8wu2fPnkqXLp0GDBiQ3KsCAAAAAABAEkv28ChNmjTKlSuXNmzYkNyrAgAAAAAAQBJL9vDo1q1bOnDggG7dupXcqwIAAAAAAEASS9bw6MKFC3r55Zd18eJFlSpVKjlXBQAAAAAAgGTg8g2zq1evbvmcMUZnzpzRoUOHdOPGDXl4eLh8z6PRo0dr9OjROnLkiCSpcOHC6tu3r+rWrevS8gAAAAAAAJBwLodHq1atSlC7smXLasiQIYqIiHBpPdmzZ9cnn3yivHnzSpK+//57Pffcc9q2bZsKFy7s0jIBAAAAAACQMC6HRytXrrR8zmazydfXV7lz51ZgYKCrq5AkNWjQwOHxoEGDNHr0aG3YsIHwCADwhLr8v597xdzz+3FJHnHMl+5/PwAAAEDCuRweudqT6GHcvn1bs2bN0rVr11ShQoU420RHRys6Otr++PLl+0+uAQB43G2QtCye50dZTK8pqVbSlwMAAIB/NZfDo5S0c+dOVahQQTdu3JCfn59+/PFHFSpUKM62gwcPdvn+SgAAPB7KS4r7czB+9DoCJGnO/sgkW9bz4cFJtizAis02LJ5nb9p/8/P7TJJnvMsypkfSFAXgifJYhEfh4eH6448/dPHiRc2ePVvt2rXT6tWr4wyQ3nvvPXXv3t3++PLly8qRI0dKlgsAQDLj8jMAAACknASFR/GNrJZQNptNv/zyi0vzenp62m+Y/dRTT2nz5s367LPPNHbsWKe2Xl5e8vLyeqhaAQAAAAAAcFeCwqOEjqwWH5vN9tDLiGWMcbivEQAAAAAAAJJHgsKj+EZWS27vv/++6tatqxw5cujKlSuaPn26Vq1apcWLF6daTQAAAAAAAE+KBIVHqTGyWqxTp06pTZs2ioyMVEBAgIoVK6bFixerZs2aqVYTAAAAADzuIiMjFRmZ+BvIBwcHKziYm8UDT5JH/obZEyZMSO0SAAAAAOBfZ+zYsS6NVN2vXz/1798/6QsC8Mh65MMjAAAAAEDS69y5sxo2bOgwLSoqSpUqVZIkrV27Vj4+Pk7z0esIePI8dHh07do1zZs3T9u3b9f58+cVExMTZzubzUYvIgAAAAB4RMR1+dm1a9fsv5coUUK+vr4pXRaAR9BDhUfTp09Xly5ddPnyZfs0Y4wkx9HVjDGERwAAAAAAAI8hl8Oj9evXq02bNvLx8VHv3r01Y8YMHThwQOPGjdPRo0e1fft2zZs3T15eXurTp49CQkKSsm4AAAAAAACkAJfDo2HDhunOnTuaMmWKGjRooJUrV+rAgQPq2LGjvc2+ffvUtGlTffXVV9qyZUuSFAwAAAAAAICUk8bVGdevX6+goCA1aNDAsk2BAgU0e/ZsRUZGql+/fq6uCgAAAAAAAKnE5fDo3Llzypkzp/2xp6enJMcbrElS/vz5VbhwYS1atMjVVQEAAAAAACCVuHzZWsaMGRUVFWV/HBQUJEk6ePCgihUr5tD29u3bOnXqlKurAoAkN2d/pOVzN65ft//+058n5Z02bbzLej6c4WoBIOVc/t/Pve4d7fe4JI845kv3vx8AAJBYLodHYWFh2r9/v/1xqVKlNGvWLE2ZMsUhPNq+fbv+/PNPZc2a9eEqBQAAALRB0rJ4nh9lMb2mpFpJXw4AAE8Al8OjmjVrauPGjdq9e7cKFy6sVq1aacCAARo2bJiOHz+uChUq6NSpUxo1apTu3LmjF154ISnrBgAAwBOpvKRCLsxHryMAAFzlcnjUrFkzrVu3Tvv371fhwoWVI0cOjR49Wp06ddLUqVM1bdo0SZIxRuXLl9fAgQOTrGgAAAA8qbj8DACAlJbg8Gj27Nlq0KCB/cbYhQsX1rJljl2G27Vrp8qVK2vmzJk6cuSIfHx8VKlSJTVq1Ehubm5JWzkAAAAAAACSXYLDo6ZNmyowMFBNmzZV69atValSpTjb5c6dW7169UqyAgEAAAAAAJB60iS0YYYMGXThwgWNGzdOERERyp07t/r166e//vorOesDAAAAAABAKkpweHTy5En99NNPeuGFF+Tl5aUjR45o4MCBKlCggCpUqKBRo0bp3LlzyVkrAAAAAAAAUliCwyN3d3c1aNBAM2fO1KlTpzR+/HhFRETIZrNp48aN6tatm0JCQtSoUSPNnj1bN2/eTM66AQAAAAAAkAISHB7dy9/fXx06dNCKFSv0zz//6JNPPlGRIkUUExOjn3/+Wc2aNVOWLFnUuXNnrVmzJqlrBgAAAIAn0GVJx+77OX7P88fjeP7Y/+YDANcl+IbZVkJCQtSzZ0/17NlTu3bt0sSJEzV9+nQdO3ZM48aN0/jx45UzZ061bt1aH330UVLUDAAAAABPoA2SlsXz/CiL6TUl1Ur6cgA8MR46PLpXkSJFNHToUA0ZMkSrVq3S5MmTNW3aNP3999/6+OOPCY8AAAAAwGXlJRVyYb50SV0IgCdMkoZHsU6fPq0dO3Zox44dio6OTo5VAAAAAMATJp0IggCkhiQLj65du6Yff/xRkydP1ooVK3T79m0ZY+Th4aFnn31Wbdq0SapVAQAAAAAAIIU8VHh0584dLVmyRJMnT9bPP/+s69evyxgjSSpfvrzatGmj5s2bK0OGDElSLAAAAAAAAFKWS+HRpk2bNHnyZM2YMUNnz561B0a5cuVS69at1aZNG+XNmzdJCwUAAAAAAEDKS3B4dPDgQU2ePFlTpkzRwYMHJUnGGKVPn17NmjVTmzZtVLFixWQrFAAAAAAAACkvweFR/vz5Jcl+H6O6deuqTZs2atCggTw9PZOtQAAAAAAAAKSeBIdHxhiVK1dObdq0UYsWLbiPEQAAAAAAwBMgweHR/v37lS9fvuSsBQAAAAAAAI+YNAltSHAEAAAAAADw5ElweAQAAAAAAIAnD+ERAAAAAAAALBEeAQAAAAAAwBLhEQAAAAAAACwRHgEAAAAAAMAS4REAAAAAAAAsuSfVgk6cOKHjx48rKipKVapUSarFAgAAAAAAIBU9dM+j0aNHK1++fMqRI4fKly+v6tWrOzz/9ttv6+mnn9Y///zzsKsCAAAAAABACnM5PDLGqHnz5nrttdd06NAhhYWFyc/PT8YYh3blypXThg0bNGfOnIcuFgAAAAAAACnL5fBowoQJmjVrlgoVKqQ//vhDBw8eVLFixZza1atXT25ublqwYMFDFQoAAAAAAICU5/I9jyZMmKA0adJo1qxZKlCggGU7X19f5cmTR4cOHXJ1VQAAAAAAAEglLvc82r17t3Lnzh1vcBQrMDBQkZGRrq4KAAAAAAAAqcTl8OjOnTvy8vJKUNvLly8nuC0AAAAAAAAeHS6HR7ly5dKBAwd09erVeNudPHlS+/fvV8GCBV1dFQAAAAAAAFKJy+FRw4YNFR0drb59+8bb7u2335YxRo0bN3Z1VQAAAAAAAEglLodHPXr0UEhIiD777DM1bdpUixcv1o0bNyRJhw8f1s8//6xnnnlG06ZNU65cudS1a9ckKxoAAAAAAAApw+XR1gIDA7VkyRI999xzmj17tubMmWN/Lm/evJIkY4xy586tBQsWyNfX9+GrBQAAAAAAQIpyueeRJBUuXFg7duzQZ599poiICGXIkEFubm4KCAhQhQoVNGzYMG3fvl3h4eFJVS8AAAAAAABSkMs9j2KlTZtW3bp1U7du3ZKiHgAAAAAAADxCHqrnEQAAAAAAAP7dCI8AAAAAAABgyeXL1qpXr57gtm5ubvL391dYWJgqVqyoBg0ayNPT09VVAwAAAAAAIIW4HB6tWrVKkmSz2STdHVntfnE999lnnylbtmyaNGmSIiIiXF09AAAAAAAAUoDL4dHKlSu1bt069e/fX6GhoWrdurWKFSsmf39/XblyRTt37tSUKVN05MgR9e/fX8WKFdPevXs1ceJE7dy5U/Xr19fWrVuVL1++pHw9AAAAAAAASEIuh0cBAQEaOHCgWrZsqfHjx8vd3XFRjRo10vvvv6+XXnpJH374odauXatnn31Wb731ltq1a6cpU6bo008/1ddff/3QLwIAAAAAAADJw+UbZvfr108eHh4aM2aMU3AUy83NTaNHj5anp6f69+9/d4Vp0ujzzz+Xh4eHli9f7urqAQAAAAAAkAJcDo/WrVun8PBweXt7x9vO29tb4eHhWrdunX1aYGCgChYsqMjISFdXDwAAAAAAgBTgcngUFRWlEydOJKjtiRMndOPGDYdpNpuNEdcAAAAAAAAecS6HR0WKFNGJEyc0bty4eNuNHz9ex48fV9GiRR2mHzx4UJkzZ3Z19QAAAAAAAEgBLodH3bt3lzFGXbp00SuvvKINGzbo+vXrku72Stq4caO6dOmiLl26yGaz6e2337bPu3btWl29elXly5d/+FcAAAAAAACAZOPyaGvNmjXT/v37NWDAAI0bN87eA8lms8kYI0kyxshms2nAgAFq0qSJfd4///xT7dq1U/v27R+uegAAAAAAACQrl3seSdIHH3yg9evXq1mzZsqYMaOMMbpz546MMcqYMaNatmypDRs2qE+fPg7zdejQQd9++60iIiIeqngAAAAAAAAkL5d7HsUqU6aMpk2bJkm6ePGirl27Jl9fX6VPn/5hFw0AAAAAAIBU9tDh0b3Sp09PaAQAAAAAAPAv8lCXrQEAAAAAAODf7aF7Hl27dk3z5s3T9u3bdf78ecXExMTZzmazacKECQ+7OgAAAAAAAKSghwqPpk+fri5duujy5cv2abEjrdlsNodphEcAAAAAAACPH5fDo/Xr16tNmzby8fFR7969NWPGDB04cEDjxo3T0aNHtX37ds2bN09eXl7q06ePQkJCkrJuAAAAAAAApACXw6Nhw4bpzp07mjJliho0aKCVK1fqwIED6tixo73Nvn371LRpU3311VfasmVLkhQMAAAAAACAlOPyDbPXr1+voKAgNWjQwLJNgQIFNHv2bEVGRqpfv36urgoAAAAAAACpxOXw6Ny5c8qZM6f9saenp6S7N9C+V/78+VW4cGEtWrTI1VUBAAAAAAAglbgcHmXMmFFRUVH2x0FBQZKkgwcPOrW9ffu2Tp065eqqAAAAAAAAkEpcDo/CwsIUGRlpf1yqVCkZYzRlyhSHdtu3b9eff/6pTJkyuV4lAAAAAAAAUoXL4VHNmjV18eJF7d69W5LUqlUreXt7a9iwYWrdurW++uor9e3bVzVq1NCdO3f0wgsvJFnRAAAAAAAASBkuj7bWrFkzrVu3Tvv371fhwoWVI0cOjR49Wp06ddLUqVM1bdo0SZIxRuXLl9fAgQOTrGgAAAAAAACkDJfDo8KFC2vZsmUO09q1a6fKlStr5syZOnLkiHx8fFSpUiU1atRIbm5uD10sAAAAAAAAUpbL4ZGV3Llzq1evXkm9WAAAAAAAAKQCl+95lCtXLhUvXlw3b95MynoAAAAAAADwCHE5PDp9+rS8vLzk6emZlPUAAAAAAADgEeJyeJQnTx5dvHgxCUsBAAAAAADAo8bl8Kh169Y6ePCgNm3alJT1AAAAAAAA4BHi8g2z3377ba1Zs0bPPfecxowZo4YNG8pmsyVlbQAAIBnM2R8Z7/M3rl+3//7TnyflnTatZdvnw4OTrC4AAAA8mlwOj2rWrCljjM6ePavnn39eAQEBypcvn3x9feNsb7PZ9Msvv7hcKAAAAAAAAFKey+HRqlWrHB5fvHhRmzdvtmxPryQAAAAAAIDHj8vh0cqVK5OyDgAAAAAAADyCXA6PIiIikrIOAAAAAAAAPIJcHm0NAAAAAAAA/34u9zy612+//abVq1fr+PHjunHjhiZMmGB/7siRI7p586by58+fFKsCAAAAAABACnqo8OjAgQN68cUX9fvvv0uSjDGy2WwO4dHQoUM1duxYrVq1SpUrV364agEAAAAAAJCiXL5s7dSpU4qIiNDmzZv11FNPqX///sqbN69Tu/bt28sYo9mzZz9UoQAAAAAAAEh5LodHH3/8sSIjI/Xqq69qw4YN+uCDD5QlSxandmXLlpW/v7/WrVv3UIUCAAAAAAAg5bkcHs2fP1++vr4aNmyYbDZbvG1z586to0ePuroqAAAAAAAApBKXw6Pjx48rX7588vLyemBbLy8vXbhwwaX1DB48WGXKlJG/v78yZ86sRo0aaf/+/S4tCwAAAAAAAInjcnjk5+enM2fOJKjtP//8o4wZM7q0ntWrV9svjVu2bJlu3bqlWrVq6dq1ay4tDwAAAAAAAAnn8mhrJUuW1IoVK7Rz504VLVrUst3q1at18uRJNW7c2KX1LF682OHxt99+q8yZM2vLli2qUqWKS8sEAAAAAABAwrjc86hjx44yxqhDhw6KjIyMs83BgwfVoUMH2Ww2vfzyyy4Xea9Lly5JkjJkyBDn89HR0bp8+bLDDwAAAAAAAFzjcs+jFi1aaM6cOfrhhx9UqFAh1a5dW//8848kqW/fvtq1a5cWLlyomzdvqk2bNqpTp85DF2uMUffu3VWpUiUVKVIkzjaDBw/WgAEDHnpdAAAAAADg32PO/rg7vsS6cf26/fef/jwp77Rp423/fHhwktT1OHA5PJKkqVOnKk+ePBo5cqRmzpxpnz5o0CAZY+Tp6amePXtq0KBBD12oJL322mvasWOH1q5da9nmvffeU/fu3e2PL1++rBw5ciTJ+gEAAAAAAJ40DxUeubu7a/DgwXr77be1cOFC7dy5U5cuXZKfn58KFSqkevXqKTg4aZK4bt266eeff9avv/6q7NmzW7bz8vJK0AhwAAAAAAAAeLCHCo9iBQUFqW3btkmxKCfGGHXr1k0//vijVq1apVy5ciXLegAAAAAAAODM5Rtmz58/X7du3UrKWuL06quvavLkyZo6dar8/f118uRJnTx5UlFRUcm+bgAAAAAAgCedy+FRw4YNFRwcrFdeeUWrVq1KwpIcjR49WpcuXVLVqlUVHBxs/5kxY0ayrRMAAAAAAAB3uRwelSxZUufOndPXX3+tGjVqKHv27OrRo4e2bNmSlPXJGBPnT/v27ZN0PQAAAAAAAHDmcni0ZcsW7d+/X/369VN4eLhOnDihESNGqGzZsgoPD9eAAQO0f//+pKwVAAAAAAAAKczl8EiS8uXLp379+mnPnj3aunWrevTooRw5cuivv/7Shx9+qEKFCql06dIaPny4jh07llQ1AwAAAAAAIIU8VHh0rxIlSmjo0KE6cuSI1qxZo86dOysoKEjbtm1Tz549GSUNAAAAAADgMZRk4dG9KlasqFGjRmnLli2qU6eOjDG6c+dOcqwKAAAAAAAAycg9qRd46dIlzZkzR1OnTtWqVavsoVFgYGBSrwoAAAAAAADJLEnCoxs3bujnn3/WtGnTtHjxYt28eVPGGPn4+KhBgwZq1aqV6tatmxSrAgAAAAAAQApyOTy6deuWlixZomnTpunnn3/WtWvXZIyRu7u7ateurVatWqlx48by9fVNynoBIEldOH1KF86ccpgWfeOG/ffDe3fJy9vbab7ATFkUmDlLstcHAAAAAKnN5fAoa9asunDhgowxstlsevrpp9WqVSs1a9ZMGTNmTMoaASDZLJ0xSTO/GmH5fJ8XG8U5vdmr3dW8W49kqgoAACB5zNkfGe/zN65ft//+058n5Z02rWXb58ODk6wuAI82l8Oj8+fPq2jRomrVqpVatmypnDlzJmVdAJAiajVvozLVayV6vsBM9DoCAAAA8GRwOTzatWuXChUq9MB2x48f15QpUzR58mTt2LHD1dUBQLIIzMzlZwAAAAAQH5fDo/iCo6tXr2r27NmaNGmSVq1aJWOMq6sBAAAAAABAKkqS0dYk6c6dO1q6dKkmTZqkn376SVFRUfbQqGTJkmrdunVSrQoAAAAAAAAp5KHDo23btmnSpEmaNm2aTp8+bQ+MvLy81L17d7Vu3VoFCxZ86EIBAAAAAACQ8lwKj44dO6YpU6Zo0qRJ2rt3ryTJGKPAwEA1bdpUX3/9tQIDAzVo0KAkLRYAAAAAAAApK8Hh0dWrV/XDDz9o0qRJWr16tYwxMsbIx8dH9evX14svvqi6devKw8NDX3/9dXLWDAAAAAAAgBSS4PAoS5YsunHjhowxcnNzU40aNfTiiy/q+eefl5+fX3LWCAAAAAAAgFSS4PAoKipKNptNgYGB+vLLL9WiRQvZbLbkrA0AAAAAAACpLE1CGxYuXFjGGF24cEGtW7dWjhw59Pbbb2vLli3JWR8AAAAAAABSUYLDo507d2rbtm166623lDVrVp04cUIjR45U2bJlFR4erg8//FAHDhxIzloBAAAAAACQwhIcHklS8eLFNXz4cB09elSLFy9WixYt5OPjo7/++ksDBgxQeHi4ypQpk1y1AgAAAAAAIIUlKjyyz5QmjWrVqqUpU6bo1KlT+vbbb1WtWjXZbDb7ZWynT59WjRo19N133+nKlStJWjQAAAAAAABShkvh0b18fX3Vrl07LV++XP/8848++eQTFSlSRHfu3NHKlSvVsWNHZc2aVS1btkyKegEAAAAAAJCCHjo8uldISIh69uypHTt2aOvWrXrzzTeVJUsWRUVFaebMmUm5KgAAAAAAAKSAJA2P7lWiRAmNGDFCx44d08KFC+l5BAAAAAAA8BhyT+4VpEmTRnXq1FGdOnWSe1UAAAAAAABIYsnW8wgAAAAAAACPP8IjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIAlwiMAAAAAAABYIjwCAAAAAACAJcIjAAAAAAAAWCI8AgAAAAAAgCXCIwAAAAAAAFgiPAIAAAAAAIClRz48+vXXX9WgQQOFhITIZrNp7ty5qV0SAAAAAADAE+ORD4+uXbum4sWL68svv0ztUgAAAAAAAJ447qldwIPUrVtXdevWTe0yAAAAAAAAnkiPfHiUWNHR0YqOjrY/vnz5cipWAwAAAAAA8Hh75C9bS6zBgwcrICDA/pMjR47ULgkAAAAAAOCx9a8Lj9577z1dunTJ/nP06NHULgkAAAAAAOCx9a+7bM3Ly0teXl6pXQYAAAAAAMC/wr+u5xEAAAAAAACSziPf8+jq1as6cOCA/fHhw4f1xx9/KEOGDMqZM2cqVgYAAAAAAPDv98iHR7///ruqVatmf9y9e3dJUrt27fTdd9+lUlUAAAAAAABPhkc+PKpataqMMaldBgAAAAAAwBOJex4BAAAAAADAEuERAAAAAAAALBEeAQAAAAAAwBLhEQAAAAAAACwRHgEAAAAAAMAS4REAAAAAAAAsER4BAAAAAADAEuERAAAAAAAALBEeAQAAAAAAwJJ7ahcAAABSz4XTp3ThzCmHadE3bth/P7x3l7y8vZ3mC8yURYGZsyR7fQAAAEh9hEcAADzBls6YpJlfjbB8vs+LjeKc3uzV7mrerUcyVQUAAIBHCeERAABPsFrN26hM9VqJni8wE72OAAAAnhSERwAAPMECM3P5GQAAAOLHDbMBAAAAAABgifAIAAAAAAAAlrhsDQAAAACeQIy4CSChCI8AAAAA4AnEiJsAEorwCAAAAACeQIy4CSChCI8AAAAA4AnEiJsAEoobZgMAAAAAAMAS4REAAAAAAAAsER4BAAAAAADAEuERAAAAAAAALBEeAQAAAAAAwBLhEQAAAAAAACwRHgEAAAAAAMAS4REAAAAAAAAsER4BAAAAAADAEuERAAAAAAAALBEeAQAAAAAAwBLhEQAAAAAAACwRHgEAAAAAAMAS4REAAAAAAAAsER4BAAAAAADAkntqFwAAAAAAAJCSLpw+pQtnTjlMi75xw/774b275OXt7TRfYKYsCsycJdnre9QQHgEAAAAAgCfK0hmTNPOrEZbP93mxUZzTm73aXc279Uimqh5dhEcAAAAAAOCJUqt5G5WpXivR8wVmevJ6HUmERwAAAAAA4AkTmPnJvPzMVdwwGwAAAAAAAJYIjwAAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABgifAIAAAAAAAAlgiPAAAAAAAAYInwCAAAAAAAAJYIjwAAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABgifAIAAAAAAAAlgiPAAAAAAAAYInwCAAAAAAAAJYIjwAAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABgifAIAAAAAAAAlgiPAAAAAAAAYInwCAAAAAAAAJYIjwAAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABgifAIAAAAAAAAlgiPAAAAAAAAYInwCAAAAAAAAJYIjwAAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABgifAIAAAAAAAAlgiPAAAAAAAAYInwCAAAAAAAAJYIjwAAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABgifAIAAAAAAAAlgiPAAAAAAAAYInwCAAAAAAAAJYIjwAAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABgifAIAAAAAAAAlgiPAAAAAAAAYInwCAAAAAAAAJYIjwAAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABgifAIAAAAAAAAlgiPAAAAAAAAYInwCAAAAAAAAJYIjwAAAAAAAGCJ8AgAAAAAAACWCI8AAAAAAABg6bEIj0aNGqVcuXLJ29tbpUuX1po1a1K7JAAAAAAAgCfCIx8ezZgxQ2+++aZ69+6tbdu2qXLlyqpbt67++eef1C4NAAAAAADgX++RD49GjBihjh076qWXXlLBggU1cuRI5ciRQ6NHj07t0gAAAAAAAP713FO7gPjcvHlTW7ZsUa9evRym16pVS+vWrYtznv9j766jo7rWNoA/eybuEBJCEggOwR2CS7HibsUpUihQaHEN7u6FQnH3Ai1airskWPEgwSJAiM7z/cE3pzMk0N57SyaQ97dWV5Jj7LO6zzl7v9tiYmIQExOj/R0REQEAiIyM/HgJTTbR/9qVol69/NeuBQCRkY7/6vWESFrKfAYk/4vkIflfpGb/Xv4H5BkQnyL5BojULGXmf+DzeAaMsRKSHzxO8e+OsKCHDx/Cx8cHR44cQenSpbXtY8eOxbJly3Dt2rVE54wYMQIjR45MzmQKIYQQQgghhBBCfLLu378PX1/f9+5P0T2PjJRSZn+TTLTNaODAgejTp4/2t8FgwIsXL+Du7v7ec1KbyMhIZMyYEffv34eLi4ulkyNEspNnQKRmkv9FaifPgEjNJP+L1Ezyf9JI4uXLl/D29v7gcSk6eJQuXTro9Xo8fvzYbPuTJ0+QPn36JM+xtbWFra2t2TY3N7ePlcRPmouLizw0IlWTZ0CkZpL/RWonz4BIzST/i9RM8n9irq6uf3tMip4w28bGBkWLFsVvv/1mtv23334zG8YmhBBCCCGEEEIIIT6OFN3zCAD69OmD1q1bo1ixYggICMDChQtx7949dO3a1dJJE0IIIYQQQgghhPjspfjgUbNmzfD8+XMEBgbi0aNHyJcvH3755Rf4+flZOmmfLFtbWwwfPjzR8D4hUgt5BkRqJvlfpHbyDIjUTPK/SM0k//9vUvRqa0IIIYQQQgghhBDCslL0nEdCCCGEEEIIIYQQwrIkeCSEEEIIIYQQQggh3kuCR0IIIYQQQgghhBDivSR4JIQQQgghhBBCCCHeS4JHQgghhBBCCCGEEOK9JHgkhBBCCCGEEEIIId5LgkdCCCH+NQaDAQDw6tUrAABJSyZHiP+a5F3xOTDNx5KnxafOWMYIDw+3bEKESKUkeCSEEOJfo9PpcO7cOZQpUwaPHz+GUsrSSRLiP2YwGLS8e/v2bYSEhFg4RUL850hCKYXr16/j1atXUEpJAEl80nQ6Hc6ePYt69erhzp07lk6OECmCMagKAHFxcR/135LgkRD/z/TBE0L8d0hi8+bNuHTpElatWmXp5AjxHzMYDNDp3haPFi1ahAYNGqB///64d++ehVMmxH9GKYVbt24hd+7cGDx4sLZNiE/ZL7/8gsOHDyMoKMjSSRHC4kzLLL/++itmzZqFs2fPfrR/T4JHQuCvB+/69euYNWsWvv/+e2zZskVaNYT4Dyml0KVLF3h4eGD37t2WTo4Q/xGSWiFs1KhR6N27N+zt7VGrVi1kypTJwqkT4j+n1+vh4uKC06dP4+nTpwBk+Jr4tJUrVw42NjaYMGECnj17ZunkCGExpoGjyZMno02bNpg5c+ZHrb9K8EikesbKwqlTp1CmTBn06tULU6dORePGjdGqVauPGr0V4nOTkJAAHx8ftGjRAnv37sW6dessnSQh/jFjr4zZs2dj1KhR+Oqrr7BkyRK0bNnSwikT4j9nMBjg5+eHfv364dixYzh06BAA6X0kPm0VKlRA48aNce7cOdy/fx+AjB4QqZMxcDRmzBj069cPlStXxtKlS9GwYcOP929+tCsL8YlQSiEkJAStW7dGxowZMWPGDPz222/46quvcOzYMTRt2hQnT560dDKFSHGSar3W6/UAgDp16gAANm3ahDdv3kjBTnwy/vzzT8yfPx/FihVDz5494e/vr+07fvw49uzZgy1btlgugUL8Q8aKRUBAAABgxowZWu8jIVK6d8sYJLWyRJs2bfD69WtMmDABwF95XYjUZtOmTRg/fjw6dOiAkSNHomLFito+koiJiflX/z150kSqlZCQoP2Mi4tDbGws+vfvj2+//RZVqlTB0qVLMWTIENy6dQvNmzeXAJIQJowTCj98+FD7GwDi4+MBAFWqVEGrVq2wc+dO3L59GzqdToZKiE9CeHg4bt26hapVqyJv3rwgiZs3b2LQoEGoUKECateujYYNG6JVq1aWTqoQGmOZJqltlSpVQocOHXDhwgU8evQIgPTUECmbsYzx7NkzPH78GMDbxl7TgGixYsWwf/9+XLp0CYAMxxSpD0ns378fANC5c2fkyJFD27ds2TI0a9YM5cqVw9y5c7Xy+f9Kgkci1dLr9Thx4gTKly+PESNGwMPDA82aNQMALUobGBiIYcOG4c6dOxJAEsKETqfDpUuX4Ovri4CAAIwZMwbPnz+HlZWVdkzVqlXx+vVrTJo0CTExMTJUQqQ4SVU2nj9/jujoaOzduxfHjx/HpEmT0LRpU0ydOhU1atTA2LFjkTNnTqxevVomhRcphl6vx5kzZ7B8+XKEhYVp24wr79SvXx+vXr3C2LFjzebJECIl0ul0CA4Ohr+/P+rUqYNVq1YhNDRU2+/s7Ix+/frh2bNn2LlzJwAZjilSn4SEBNy8eRO2trYoUaIEAGDv3r1o3rw52rdvrwVXe/TogZkzZ/4r/6Z8OUSqtmvXLm0eACcnJwBve07Y2NhoLXYjRozQAkhfffUVjh8/bskkC2FRppXtly9fon379ggLC8Pw4cNRpEgRDB48GL///jsAoHXr1ihXrhwOHTqE169fJzpfCEsytmwDwNOnT7VGg+rVq+Prr7/GsWPHULZsWQwcOBBRUVHYuXMnfvrpJ/zwww9YunQpACAiIsJSyRfCbBhPREQEKlasiLZt26JKlSoYMGAAnj59qpVlKlasiJIlS2Lv3r0IDg4GIL2PRMr27NkzVKhQAdeuXcNXX32FGjVqYODAgXjx4gWio6NRuXJl+Pn5Yfbs2VqeFuJzZfq+NpalDQYDcufOjRcvXmg9o5s0aYLdu3djwoQJOHjwIHbv3g1XV1fMnj0boaGh/3s5nEKkckOGDKFSikopHjhwwGxffHy89vvIkSOplKKbmxsfP35Mg8GQzCkVwrISEhJIkvfv32dMTIy2LTIykmPHjmWVKlW0Z6ldu3bcvHkzFy1aRKUUhw8fbsGUC2HOmJdJctmyZaxQoQLHjh3L8PBwbfu0adM4YMAALliwgM+fPzc7PzAwkDY2Nty3b1+ypVkIo5cvX5r9ff78eT548IBnzpzh7NmzmSlTJiql6O3tzY4dO/Lw4cMkyV9++YV2dnYcNmyYJZItxAcZ38vh4eEMCQnRth87dowzZ85klixZqJSin58f27Vrx5s3b3LUqFG0sbHhxo0bza4hxOfENF8fPXqUW7du5cOHD0mSz549Y+PGjenh4cFMmTKxYcOGvH79utn5BQoUYIUKFf6VtEjwSKQqpg9fdHS09vuIESOolKK/vz+PHTtmdo5pAOmHH37g1KlTP35ChUihgoKCqJRix44dtQASSS2YunbtWrZo0YLOzs7U6XT08vKijY0NK1asaFYYFMJSTL8Do0ePppubG3PmzMnFixcn2p+Ubdu2sUCBAgwICOCTJ08+alqFeNePP/7I6tWra5WDEydOUCnFpk2bauWaJ0+ecMmSJaxVqxaVUrS2tmazZs04YMAA5s6dmzly5ODly5cteRtCmDG+dy9evMj69euzaNGiXLNmjdkxDx8+5M8//8zq1atTKUVbW1sWLVqUSikWLlyYkZGRlki6EB+VaZlk2rRp9PHxYY4cOXjw4EHGxcWRJF+9esWgoCDeuXOHUVFRZuevWrWKrq6u7Nu3L+Pi4v7nzg8SPBKpwj9piRg8eDCVUixatCiPHz9uts80gPSfXFOIz4ExrxsMBoaFhdHOzo7u7u7s2bMnY2NjSVL7gJFkbGwsr127xq5du2oFO51Ox61bt1ok/UIkZcqUKdTr9ezYsSMvXbr03uNM3/XTp09n7ty5mS5dOgYHBydHMoUg+TYfvnz5kp07d6ZSim3atOHGjRtpZ2fHgIAA/vbbbySZqGKwadMm9urVi3Z2dnR2dqZSio6Ojty0aZN2XSEsyZgHT548SQ8PD2bJkoX9+vUzCwa9m0+3bt3Kvn370tHRkY6OjrS1teX27duTPFaIT5Xp+3zUqFG0srJio0aN+Msvv2jbk6qjGq1du5aFChVitmzZeOvWrX8lTRI8Ep8940fk2rVrHDhwIKtVq8YqVapwwIABPHPmjNmxxgBSkSJFzHogyRA1kVoZn59z586xWbNmbNSoEbNly6a1Zvfu3VsLIBl/Gs+Jjo5mZGQkJ0+eTKUUy5Qpw2fPnlnmRoQwcfr0afr5+bFGjRqJgkBXrlxhUFCQWUDp4sWLzJs3Lx0dHVm0aFEJHAmLuXHjBocNG0adTkdra2sWKlSI+/fv1/YbyyvvVqAvXLjAUaNGsUyZMlpD2YsXL5I17UK8z40bN+jn58dixYpxx44d7z3u3Yry2bNnOWnSJDo7O7N169YfO5lCWMTPP/9MOzs7dunShdeuXXvvcQaDgTExMbx58yZ79uzJTJky0dvb+1/taSrBI/FZMxaeTpw4QS8vL9rZ2dHLy4vu7u5UStHOzo5r1641O8cYQCpRogSPHj1qiWQLkaKcPXuWrq6uLFWqFAcPHsxt27ZxwIAB9PX1pVKK3333nRY4el8LSJs2bZgmTZpE47CFsIQtW7bQysqKixYtIvn2W/H48WOOGTOGnp6edHZ2ZubMmbVhyk+fPmW3bt04dOhQ3r9/35JJF6lMvXr1OHPmTLNt27dvp16vp1KKZcuW5b179z54DWNAyWAwMD4+ni1atKBSirt37yYpPTWE5Rjz5tixY2lnZ8dly5Zp+/5pvgwNDWXNmjWp0+l48uTJj5JOISzBYDDw1atXrF+/Pn18fHj+/Hmz/Zs2beKAAQPYoUMH/vHHHyTJ169fs0aNGlRKsUGDBv96uVuCR+Kzd+3aNWbIkIGlSpXi2rVrGR0dzXv37mktd0oprly50uycoUOHUinFbNmy8dGjRxZKuRCWFxYWxooVKzJdunTcs2ePtt1gMPDy5ctaL6T3BZCM8yJt2rSJSimZM0ykCNOnT6dSin369OG9e/e4cOFCli9fnlZWVixVqhQ7duxIGxsburm58ezZsyTfDs005nEhksPBgweplGLGjBkZEhKivVtHjhzJihUrslGjRtTpdGzYsCH//PPPv72e8fxLly7R0dGRHTp0+KjpF+KfMBgMrFq1Kv38/LRtfxc4Mu43/ly3bh2VUty8efPHSqYQFhEREUF/f3+WKlVK23bs2DF27NiRSina2Nhoi9UYe6E+efKEv/zyy0fpXWr1v63VJkTKt379ejx79gxTp05F06ZNAQAZM2bEyJEj4efnhx49eqB169bIkiULAgICAACBgYF49eoV0qdPDy8vL0smXwiLevnyJa5du4by5cujWrVqAP5aIjRv3rzYtWsXqlSpghkzZiAhIQGTJk2CjY0NDAYDdDodbGxsAADh4eEAAFdXV4vchxCm2rZti7Vr12LatGlYtmwZwsPD4evri/Xr16NEiRLw9vZGkSJF0KNHDzx+/BgAYGUlRSaRvCpUqICNGzfCwcEBPj4+eP78Odzd3TFs2DB07NgRJOHn54fp06eDJKZMmYIsWbKYXSMuLg7W1tbaOxkAvLy8kC5dOly/fh0JCQnQ6/WWuD0hAAAxMTF49eoV3rx5gwcPHsDHx0fLq8DbModSCgDw+++/o3z58tp+48/nz58DAJ49e5bMqRfi40pISECaNGlw7Ngx9O7dGy9fvsSePXsQERGBfv364csvv8T58+fRu3dvTJs2DUWLFoWHhwdq1qz5cRL0r4ejhLCA90VXDQYD69WrRw8PD61rbHx8vFmLxtixY7XJJ2NiYsxWkDK9jhCp0cWLF2lnZ8fq1asnagk0/j1r1izqdDq6urqa9UAyPjenT59m1qxZ6e3t/a9N2CfE3zHNrwaDgbGxsWbv9zt37rBNmzZs3Lgxhw8fztDQULPze/ToQWdnZ165ciXZ0iyE0bvv27NnzzJt2rScP3++2fZbt26xd+/e1Ol0bNCgAW/evKntu3nzJkeOHMlz586ZnfPrr78yQ4YMrFevnvSmEylCq1atqNPpuHHjRrPtpuXvDRs2MH/+/InmK7148SJLlSrFtGnT8u7du8mSXiH+bR+qa545c4aZMmWiUopubm6sVKkSz58/b7ZYjbu7O1u2bPnR0ynNaOKT9+2332LOnDlYunQpWrVqZdaCFh8fD4PBgGfPnuHMmTMoVqyYtt/YCvfdd99h2bJluHDhAqysrMxaO4yMLR5CpDbZs2dHzpw5cfnyZVy4cAGFCxfW9hmflZIlSyJ9+vSIjo7G9OnT4evri969e2v78+XLBx8fH0ydOjVRq7gQH4NpL4t169bhwIEDCA4Ohr29Pdq2bYtSpUohS5YsWLZsWZLn79ixA/v27UNAQAAyZMiQnEkXAsDb96tpPr5x4wbCwsLQr18/ODg4oHXr1gCALFmyoHfv3gCAWbNmwWAwYNy4cYiPj8ePP/6IWbNmIX369ChUqBAAIDIyEtOnT8fjx48xfvx4WFtbW+L2RCpEkx5ERvHx8bCyskLTpk2xfft2jB8/HiVLloSPjw+Av8rfwcHBmDNnDqytrRP1YH79+jXSpEmD/fv3I1OmTMlzM0L8i0zf9deuXUNYWBhCQ0NRrFgxuLq6okiRIti/fz+uX78ODw8P5MqVC87Oztr5S5YswevXr7UyelLP2r/mo4enhPiIEhISuHnzZlauXFmbj+Xd1rrAwEAqpTh8+HC+fPlS224a4S1evDh9fX3NlgUVIrUy7aVHklOnTqVSik2bNuWbN2+044zP2rZt21iyZEmeOHGCWbJkYcGCBbVJhaVVWyQ303f7yJEjaWVlRXd3dxYoUIDe3t7U6XRs1KgRd+3aleT58+fPZ968eenh4cGrV68mV7KFMGN8vwYHB/PBgwck3y677OTkRHt7e/78889mx9+5c4d9+/alvb0906VLxyxZslApxXHjxiW69pEjR/7V1XeE+DvG/BwSEsLTp0/zl19+Mes18ezZM3bo0IFKKZYqVYq//vornzx5QpI8fvw427RpQxsbGy5evDjJ65uW74X4lJjWW6dMmcIcOXJo8xhlzJiR3bp1Y0hIyHvP37RpE4sUKcI8efIkS887CR6JT158fLy2/Pf58+f5448/MiwsTNsfFBTEAgUK0MPDg1u2bGFUVJTZ+RcvXqSXlxcbNWrE2NhYWXVEpDrGPP/q1Su+fv2a165dMxveGRwczGrVqlEpxZYtW/Lq1ataUOjKlSv86quvWLJkSUZERGjDQJcuXWr2b8jQT5HcFi1aRJ1Ox44dO2qTXt++fZtNmzalUootWrRgdHQ0ybffkStXrrB06dJMly4d8+XLJ5VrYXFnz56lUop16tTRGrdWr1793gBSSEgIlyxZwmLFirF69er86aeftH1SthGWYsx7p0+fZu7cuenk5KStFLh27VqtzP7gwQO2adOGtra2dHNzY4ECBVizZk16eHjQxsaGEydO1K5puoKgEJ+DMWPGUCnFSpUqccaMGVyxYgXLlStHpRT9/f21RgTy7TP19OlTDhs2jFmzZqWnp2eylVkkeCQ+aaYfjZcvX7JUqVJUSnHRokUMDw8n+XaFnNmzZ9Pd3Z3p06fnpEmTtAfs9OnT7NChA/V6PdeuXWuRexDCkoyFuosXL7JFixbMmzcvnZycWLlyZQ4bNoyvXr0iSZ48eZKVK1emUor58uVj+/btGRgYyOLFi1MpxdmzZ5Mkd+zYQaUUJ0+ebLF7EqmbwWDgs2fPWKFCBebPn58XL17U9m3evJm5c+emh4eHtry5wWBgQkICDx06xCpVqrBnz568c+eOpZIvUjljuebNmzesXr06S5QowVWrVpkd86EAkvFc00Y0CRwJSwsKCqKHhwd9fHz49ddfs2HDhvT09KSnpyenT5/O58+fk3y7StTixYtZo0YNpk+fnt7e3mzRogXXr1+vXUvys/jc7Nu3j66urmzZsiWDgoK07cYydfr06fn48WNt+5MnT1iwYEEqpVitWjVeu3Yt2dIqwSPxyYqPj9eG1RgMBhoMBu7atYslSpRgmjRpOH/+fG0S7ZiYGE6fPp25cuWiUopp06ZlmTJl6OnpSWtr6yRbM4T43Bnz+smTJ+nm5sY0adKwUqVKWu8LpRTLlSunBWIvXbrEIUOGMHPmzFRKUa/X09fXl9OnT9eu2adPH+p0Om25XHmehCXcvHmTjo6O7NOnD8m3+XDz5s3MlSsX06dPz9u3b2vbHzx4oPW0e/HihdnQTCGSk+nQnhs3brBQoUJm71fTYT7vCyCZHkPKO1hYjmmQZ968eSxYsCB37txJ8m25fP/+/cyfPz/TpEnDKVOmJFr45unTp3zx4oXZdSRwJD5H48ePp7W1Nf/44w9t2/r165knTx56enpqw9Gio6O1nv9//PEHly5dqg3vTC4SPBKfnHPnzmm9Ici3Y6EnTZrEmJgYxsfH87fffmORIkW0AJKxNSMuLo5Hjhxhr169mDt3bmbPnp0tW7Y063EkHyWR2ty7d485c+ZksWLFtEJddHQ079y5w7Jly2rzDxjnE4iNjeXz58+5a9cuHjt2jJcuXdKutWnTJmbMmJGFCxc2ayERIrldunSJVlZW2nwvGzZsYK5cuejp6akFjsi3PVZLlizJbdu2WSilQpi7du0a7e3tWaNGDbOhCMbyiWkwyBhAcnFxMRuiJkRKcfHiRa5evZrVqlVjkyZNzPYlJCTw+PHjLFCgANOkScOpU6dqjVVCpAbG93mzZs2YLl06kn/N5/tuYxf5dm675cuXa1OwWKJxQIJH4pOyfv16KqU4ZMgQkm8/SsbKrXGYQVIBpHdbM8LDwxkREWHWQieBI5GaGD84GzdupFKK06ZN0/YZWzVevnzJKlWqUCnFnj17Mi4u7r0fqmnTprFgwYJ0d3eXuWKExYWEhNDPz4958+blkiVLtMDRrVu3zI4bNWoUbW1tJXgkUownT56wcOHCVErR1taWBw4cIGleSTD9fe3atbS2tqZSileuXJGeRiLFiIiIYKFChWhjY8P8+fNzwYIFJM17xxkMBi2A5ObmxunTp0sASaQ6Xbt2pYODA589e8bdu3czZ86ciRq7SLJq1aqsWLGiRZ8RCR6JT8rFixeZKVMmuri4sHPnzrSzs2O5cuW0ldaMkgogycdIpFZDhw5973jocePGUSmljbE2DgU1/nzy5AkzZcrEAgUK8OnTp4nODw8PZ//+/anX65k3b16znkhCfEx/F/D/5ptvqJSiu7s7PTw8EuXfTZs2MXv27Kxevbq26IIQKUFoaCi//PJLKqVYoUIFbfXK9wWQli1bxjlz5iR7OoX4kNjYWG7atEmbj7RGjRpJliOMAaQiRYrQwcGBY8eOZUxMjAVSLMTHk9Qk78ay9qpVq6iUYpUqVbQeRzdu3DA7f+HChfTx8eGgQYMsupKxBI/EJycsLIwZM2aktbU1M2bMyF9++UXb9+4DaRpAWrhwoQSQRKqzYMECKqVYr1493rx5U9tufFYmTZqkTXBt/IgZxcbG0mAwsEWLFlRK8dChQ0n+G/v27eOSJUu0Co4QH5tp4OjixYvcv38/z58/b9bLNDw8XFslsEGDBmZzGS1cuJD58uVjhgwZknWiSSH+jvE9HBoayurVq1Mpxe7duzM0NJSkeTknqQCq9KIWlmTMf8afMTEx3LZtG4sXL05nZ2fOmzdPGwZvymAw8NixY/Tz8+O8efOSNc1CfGym7+WkeoeGhIRoE2C7uLiYraxGklu3bmXevHlZoEABiy/oIcEj8cm5f/8+dTodraysaGdnxzFjxmhdYN8tNBkDSMWLF6ejoyNnzJghrRkiVbl16xZ/+OEHWltbs06dOvzzzz/N9gcHB9Pd3Z0VKlTgw4cPte2mz1LPnj3p4uLCK1euvPffkQqLSC6mBa+xY8fSxcWFSina2dmxQoUKWj6Nj4/nxYsX+cUXX1ApRQ8PD1avXp0FCxaknZ0ds2TJIj3lhMWYVq5fv36d5KSnoaGhrFSpEpVS/Pbbb7W55GRomkhpPlQGePPmDbdv3848efIwffr0/Pnnn98bQJL5EsXnxvTZWLlyJdu1a8eWLVtyzJgxZvsuXbpEd3d3KqXYoUMH7t27l+fPn2f//v2ZNWtWuru7m63EZikSPBKfnIsXL3LMmDFcvHgxc+XKRXt7ewYGBmqThyUVQPr111+ZJUsWac0QqdK9e/fYt29f6vX6RAGk58+fs0OHDlRKsWXLlnz27JlZxSQoKIj58+dn0aJFtaXNhUgJZs2aRaUUy5cvz8GDB7N27draMLULFy6QfPs9iImJ4aBBg1i+fHl6e3uzXLlyHDJkiMVb70TqZSynXL58mZ06dWKhQoWYL18+du7cmXfu3DHrBfpuACmpHkhCWJIxP//555+cOnUqO3TowG+++YZbtmzRGqWioqK4fft2+vv7M3369Fy2bFmSASQjyd/icxMYGEillNl/VatW5eXLl7VOEEFBQQwICDA7xtbWluXKlWNwcLCF7+AtCR6JT1JERARJ8vr168yZMyft7e05atSoRAGksLAwbQlmqfiK1OxDAaTLly9rlZNq1apx2bJlfP78OQ8cOMA2bdpQKcUff/zRgqkXgomGVVauXJkNGzY0mxdg5MiR1Ov1dHV11QJIRnFxcdrcRtJTTliKMe+dPHmS6dKlo6OjI0uWLMmAgADa2dkxICCAu3btMuslHRoayooVK1Kv17Nbt2589OiRpZIvhBljfj5x4gR9fX1pZ2fHNGnS0MnJiUop1qxZU+vhGR0dzR07dtDf359eXl5cvnz5BwNIQnzKTAOge/fuZdq0adm+fXuePHmSV65c0ebuDQgI4Llz57QAUmhoKA8dOsRp06Zx+vTpPHr0qLZyeEogwSORohk/SnFxcYyPj09yzqLg4GCtB5JpAOnGjRvs0aMHx4wZYzaxmLRmiNTq3QDSjRs3tOfh0qVLbNGiBV1dXamUol6vp1KKjo6OnDx5snYNeX6Epc2ZM4c7duxgQEAAt2/fTtJ89Z7x48dTp9PR1dWVFy9eJPk28GQwGJJc7lyI5BYcHExfX1+WKFGCa9as0bbXrVuXSikWKVKEO3bsSBRAKlOmDJVSPHjwoCWSLUSSgoKC6OnpyaJFi2o9iiIiItiwYUMqpZg5c2ZtPrrY2Fju2LGD+fPn1+YjNX1/C/E5eLeMsXjxYmbOnNmsUSs0NJSjR4+mo6MjS5UqxXPnziVqJEuJrCBECmUwGKDT6XDlyhUsWrQIZ86cAUnUqFEDXbt2Rdq0aQEA/v7+2Lx5Mxo0aIDRo0fj5cuXqFatGtatW4dFixZhzJgxsLa21q6rlLLULQlhESShlELGjBnRq1cvAMD06dMBAFOnTkW2bNmQL18+TJ06Fd988w3Wrl2Lly9fImfOnChVqhQqV64M4K9nUghLOXjwIHr06AEvLy8opeDp6QkA0Ol0Wv7s378/AGDQoEEoV64cDh8+jPz585vlX/kOiOQQHx8PKyvzovbLly8xYcIEODo6ol+/fmjUqBEAYNiwYdi+fTuqVKmCU6dOYdCgQSCJqlWrwtbWFp6entiwYQOOHDmCChUqWOJ2RCqXVBkgLi4O8+bNQ0xMDPr164emTZsCAG7evAl7e3sAwJAhQ5AmTRoAgLW1NapWrQqDwYCuXbsCQKJnRIhPnbGMMXr0aKxevRqlS5dGvXr1UKBAAfBt5x14enqia9euUEph7Nix6NatG+bNm4dChQpZNvF/x6KhKyHew7Rbd/r06WljY8PcuXMze/bsVEqxfv36PHr0qFlk99q1a8ybN682caqtra1ZjwkhUou/G5Jz586dRD2Q/tdrCvFvSGrOund9//33tLOzo1KKq1evNjvP9Pzx48fT1taWSqkUMcmkSF3atWvHtWvXJlqk49q1a/Tx8eEPP/ygbRs+fDiVUuzRowfPnTunzY1RpkyZRD2QjOSdLCzh3XdydHQ0ixQpwvLly2vbLl68yGbNmlEpZTbX6OPHj7URBDExMbx9+3aypFmI5GL6Xo6KimKXLl1oY2OjzW/06tWrROc8e/aMY8eOpaOjI8uWLcvTp08nZ5L/YxI8EinW5cuXmSFDBhYvXpwrVqwg+fZjU7lyZW1ulj/++MMsgBQREcEBAwZw+PDh3LRpk7ZdClkitTCduHLevHls164dv/32Wy5evJjh4eHa83L79u33zoFkJEN7hKWcOXOGb9680f4eNmwYx4wZY/a3cUnbEydOkPwrv5q+74cNG0Z3d3devXo1mVIuBLlv3z7qdDrmzp2b27ZtSxT8mTZtmlaJXrZsGW1tbdm6dWstkH/lyhXa29tTKcWcOXNy06ZNUo4RFlO2bFnmy5cvyX337t2jr68vGzduTPLtu7tFixaJAkfk2znp5syZYzaVBClldPFp+lC+NZY5njx5wr59+9LDw4PZsmXj+fPnkzz+2bNnHD9+vBZkio6O/ihp/jdI8EikSGFhYWzWrBnz5MnDzZs3a9uHDh1KpRQDAgJoY2PDypUr8/Dhwx+s5MpHSaQWphNXZsqUiVZWVrS2ttZWbKhduzZ37typHWfaA6l+/fr/qAeSEB9bly5dqNPpuHv3bpJ/BYp69uxpNmmksbdGtmzZePLkSZJJB5CMk2QLkVxevXrFVatW0dfXlzlz5uTWrVuT7D0UHR3N2rVr08/PT5sLw5iHS5QowXbt2tHe3p7Lli1L1vQLYfTs2TMWLVqUer2ep06d0rYbeyAlJCSwfPnyzJEjBy9cuKAtsvFu4Gj37t1USnHSpEnSMCU+Kz179uTSpUu1v/v06UMbGxvtnf706VP26dOHer2eJUuW5IMHD5K8zpMnTzh16lReuXIlWdL935LgkUhRjB+UM2fOMH369Bw8eLC2z1iB+Pbbb3ns2DH26NGDSinWq1fvbwNIQqQWQUFBTJcuHYsXL84lS5YwNDSUO3bsYJMmTWhvb89ChQpx69at2vNy9+5d/vDDD1RKsWLFitpKhkJYQnx8PGfPns0sWbLQz8+PzZs31977xiEOpsMmhgwZQqUUs2bN+sEAkhDJwTTPRUZGcuXKlfT29n5vACk0NJSOjo6sWbOm2faDBw/SxcWFW7duTbJXqBDJwfguffToEc+cOUOSZo1MsbGxTEhI4IgRI7T3sFLKrCJNvh3GVrNmTebIkYPHjx9PvhsQ4iP7448/qJRi3rx5uW/fPg4ePJhKKbZr14537tzRjnv27Bn79u2rdYAICQkxu86nVG6R4JGwOIPBoFUGIiMjSb5dOWfgwIHa2NDFixfT2tqabdu25c2bN0mSv//+u9ajomzZsrL6iEh1TD8yxueoa9eudHV15ZYtW8yOvXfvHidMmEBHR0d+8cUXvH//vrbv7t277NatG2fMmJFsaRfifeLj47l161a6urpSp9Oxdu3aZhUW028G+VeP1KxZs2pzBUhjgrCU6OhobfnxvwsgJSQksHDhwsydO7eWx4ODg9miRQtmy5aNt27dMjtWiORmmu9u3rxJpZTZ/Ebk2yBo/vz5qZRi8eLFzfYdP36cX331Fa2trblw4cJkSbMQySUqKorr16+nh4cHPT09qZTiN998w4cPH2rHGJ+hvwsgfSokeCQsZvfu3WbDCY4fP87SpUubdYslyfDwcFauXJk5cuTgpUuXtO1RUVEsVKiQNrZ63bp1yZZ2ISxp586d2u/vViiKFCnCPHnyaH+bVrIfPHjAjh07UimVaDJ5Y2WHlIq3sBxj3psxYwaVUnRycmL69Om5d+/eRMs5JxVAcnNz49mzZ5M1zUKQ5LFjxzhkyBAWKVKErVq10uY0ev369XsDSLGxsRw9ejStrKxYoEABNmvWjPnz56dOp5NgvkhxHjx4wC+++EIbBm/q3r17zJkzJ5VSLFSoEDt37swOHTrQx8eHNjY2nDRpknaslDHE56Zu3bpUStHd3Z1z5szRthvLKcY8bxpAKleuHO/du2eR9P4vJHgkLMLYza9SpUokyVOnTtHGxoYBAQGJZpm/e/curays2KJFC7Ptu3fvpoODA3fu3MmLFy8mW9qFsKT69etTKWXWgmcMIMXHx9Pf35/58uXTKtrvFtIOHTqkTTgfHx8vhTiRIrwbBD148CBHjRrFyZMnM0uWLPT29uaOHTvMAkbvntOrVy86OTnJ3F0i2S1evJiZMmWivb09GzRowFmzZpmtqpNUAMk4IWpoaChHjRrFPHnyUClFf39/s/e7vKOFpSSV90JCQtiwYcMkA0iPHj1ily5d6O/vT3t7e7q7u7N+/fpcu3atdoz0oBOfA9Nn4+rVqwwICGCVKlXo6urKvHnzcv369YkCR6Y9kPr162dWFv+USPBIWMS9e/fYrl07KqVYqlQp2tnZMSAggPv27Ut0bHh4ODNmzMgyZcrwyZMnJN+uRNKsWTPmy5cvya6BQnyuVq9eTXd3d9ra2nLBggXa9tjYWMbFxWmFukWLFmn7DAaD2bORI0cOFi1aNEWv5iBSD9O8eeTIEW7YsIGhoaHatmXLltHPz4/e3t7cuXNnooKW6XLPxm+EEMllwYIFVEqxbt26/OWXX8z2mVYwjAEkHx8f5siRg1u2bGFUVBTJtyvJRkVF8datW2Z5WMo0wlKMee/+/fvcsGED7969q237UAApNjaW4eHhvHDhAkNCQrQ8bnpNIT5lpvnYOE/o7du3efv2bW7evJlp0qShv78/169fr30D3m3QffLkCYcMGcKgoKBkTv3/ToJHItkZHxyDwcD69etTp9MxTZo0ZnO0GB9Mg8HAN2/e8LvvvqNSilWqVGHnzp1ZvHhx6nQ6zpw50yL3IIQlbd26lWnSpKG1tbVZAIkk9+zZQ6UUc+fOra1WRf713B09epQuLi7s0aNHsqZZiKSYFsImT55MHx8f+vn5cevWrdpyztHR0WYBpO3bt2vnHDhwgKVLl+bUqVOTPe1C7Nixg66urmzUqJFZD+j39RZKKoD05s2bJI+VHkfCUozv5dOnT7Nw4cJUSrFfv36MiorS9j148EALINWqVUs7993hxaZlfiE+daZllhUrVrBevXrs3r27ti0mJoarV682CyCZPhO///47Dx06lOhanxIJHgmLiI+PZ0REBB0cHLQJxmrWrKlNmP2umzdvsnfv3tqxmTNnNlsGVD5KIjVISEjQ8vquXbvo5uZGBwcHzp071+y40aNHUynFAgUK8Oeff9a2BwUFsV27drSzs+PmzZuTM+lCfNCoUaOolGKTJk24Z88ebbsxv8fGxnLZsmXMnDkzfXx8uGDBAs6dO5clS5akk5OTDF0WycpgMPD169esX78+vb29zRbs+LvyiGkAyd/fn5s2bZJeoCLFMF312M3NjUWKFDErb5NMMoD05ZdfavuNgX8hPiem7/bAwEA6OzuzYMGCnDt3rtm+2NhYrlmzRgsgGYdtHjp0iP7+/kyfPv1767ufAgkeCYv6+eefuW7dOnbr1o1KKVavXp0vXrzQ9ptGZWNiYvj48WNeuHCBd+/eTfIYIT5npgW2p0+fsm3btnR1daWdnZ3ZMLVnz55pS+cqpfjFF1+wbt262mSWEydOtNQtCJHIzp076ezszLZt2yY5X5FpAGnlypUsUKAAlVLU6/XMmDGjBI6ERdy5c4e2trb/uBenaeXi5cuXXL16NT08POjh4aGtIitESvDo0SOWLFkyUQ9m0/J2UgGkatWqJXtahUhus2bNolKKnTt35rlz55I8JiYmhmvXrqW7uzvTpUunLfyULl26T35RDysIkUxIQilltq1169YAgHLlyiEhIQGLFi1Cy5YtsXLlSqRNmxY6nQ4A8PDhQ7x69Qo5c+ZE+vTpza5pPEaIz5nBYIBOp8OpU6fQtm1bREZGIl26dHB0dERkZCQ6d+4MAOjUqRPc3d0xfPhwFCpUCOPGjcPly5fx8uVLlCxZEkOGDNGeO+M1hbCkw4cPIzo6Gp07d0b27NkT7VdKgSSsra3RtGlTlChRAjt27IC1tTVq164NPz8/C6RapHbnzp1DbGwsMmfODODv36dKKcTExCA6Ohqurq6oVasWoqOjER8fj6xZsyZTqoUwl1S+DQoKwuXLl9G3b19Ur14dQOLytk6ng8FggLe3N2bNmoX4+Hhs374dW7duRb169ZL1HoRILnfu3MHcuXNRpkwZfP/998iRIweAxHVcGxsbNGrUCO7u7ujcuTOCg4ORNWtWbNmyBXny5LFU8v8VEjwSycL4cXr06BGuXLmCe/fuwdHREV9++SWsra3h5eWFwYMHQymFhQsXolWrVli+fDnSpUuHe/fuYdKkSTh8+DC2b98OX19f7QF9NxglxOdKp9Ph6tWrqFmzJnLlyoVhw4ahefPmuHr1Kvbv348ePXqga9euMBgMWiCpXr16qFixIgAgOjoajo6OcHJyAiCBI5EyxMbG4vjx4/Dy8kLp0qUBJC6EGfNqdHQ07OzskD17dvTu3TvJBgkhkoudnZ3Z3x/Ki8a8unLlSuzfvx/z58+Hs7MzWrduDb1eD0DeySJ5jRw5Eq1atUoyYH/kyBFERUUhICAAAJCQkKDlU+Cv/GwwGEAS3t7emDNnDjp37oxatWol2z0IkdwePnyIq1evYvr06VrgCEj6/a/X61GlShVcunQJYWFhcHZ2houLS3Im96OQ4JH46IwFotOnT6Nt27a4fv06EhISAAD58uVD165d0bJlS2TKlAlDhgyBUgoLFixAixYtULt2bRw7dgzr1q3D2LFjkTFjRgvfjRCWs379erx48QJdunRB8+bNAQA5cuRA7ty54eXlhcaNG6Nr165QSuHrr78GADg4OMDa2hqurq4gCUB67ImUw5gXQ0NDcfHiRRQoUMBsv/H7kZCQgJkzZ6Jly5bw9fUFII0HwrKcnZ0BAGvWrEGTJk2QKVOm9x5rzKsHDx7EhQsXtL9NK+TyThbJZdKkSRg5ciRu3LiBH3/8MVEg1PiODQ0NBZA4bxrz76pVq1C2bFlkzZoVvr6+2nkSCBWfq6dPnwKAFgR6txHLGGh98eIF0qZNC+BtOdzBwSH5E/uRyJMtPjqdTocLFy6gatWq0Ov1GDduHM6cOYOlS5ciOjoaAwcORGBgIGJiYuDr64uhQ4eiT58+OHXqFL777jvs2rULkydPxoABAwBAqwALkdrcuHEDNjY2aNKkCQAgPj5eK6A1bNgQixYtAgD06NEDCxYsAABYW1tr50uPPZESGAwG7aetrS2+/PJLxMXFYefOnQD+yp8JCQla/h46dCgWLlyoFdyEsLQyZcrgyy+/xJUrV7Br1y5ER0d/8PiDBw9iy5YtqFatGhwdHaUsIyziyJEj+OGHH9ChQwc0btwYdnZ2iIuLAwCtYdc4PcTkyZNx48YNbeiw8d0NvB1u3K5dO2zbti3RvyGBI/G5MgaBfvnlFzx//tysPE1SaxD4+uuvMXDgQIuk8WOTp1t8dBERERgyZAicnZ0xevRofP/99yhcuDCKFCmCbNmy4eXLlyhVqhRsbW217q9DhgzBr7/+iuXLl2Pnzp3o06cPgLeVDan4itQoISEBNjY2iI2NxZ49ewAAVlZWWqGOJOrUqYO8efPC1tYWPXr0wIwZMyycaiFgVuEA/qpYGH8WKVIE3t7eGDx4MFauXKkdZyyE7dy5E9u2bUOWLFlkfiORIhgDP40aNYJer8f48eOxb98+LYD0bkX72rVrmDdvHhwdHVG7dm0AEsQXya9kyZLo378/Hj9+jB9//BH169fHiRMn0LJlS9y+fVt759aqVQstWrRAUFAQxo8fj5s3b0Ippb2zr1y5gvnz5yNDhgwoVKiQBe9IiH9fUoF947ZKlSqhcuXK+O2333DgwAGzwKvxnb5s2TKcOHECLi4uWkD2s5JsU3OLVCskJIReXl7s2LGjtu3ChQts0aIFlVKcP3++tv3ly5fvXT1NVlUTqd3GjRuplGL79u35+PFjbbvps1G5cmVWqFCBSinOmDHDEskUQmOaN7dv387BgwezevXqHDZsGDdv3qztW7BgAXU6HZVSHDhwIHfv3s2nT59y4sSJzJMnDz08PHjlyhUL3IEQ7/fq1St+++23VEoxS5YsXLRoEe/du2d2zLFjx9iqVSt5JwuLatq0Kd3c3Dhr1iy+fPlS296kSRMqpdigQQPeuXNH23779m1WrlyZSimWLFmSu3fvZnBwMLdv387atWtLfhafJdMyy/Pnz/nnn3/y4cOHfPr0KUkyPj6eS5cupbu7OzNmzMhly5bx4cOH2jmbN29m4cKF6e/vb/Y8fU4keCT+de8GeX755Rcqpbhw4UKS5OnTp7XA0bx587Tj4uPjOW3aNN66dStZ0ytESmK6nPO77t+/z1q1alGv13PSpEl8/vy52f6zZ8/Sz8+Px48f55MnTz52UoX4INO8HBgYSAcHB7q4uDBjxoy0tbWltbU1v/nmG+2YZcuWMXfu3FRKmf2XN29eXr582RK3IMR7Gcs6ERER/Pbbb+ns7EwnJyeWKlWKs2fP5ty5czlgwAD6+fnRycmJU6ZMSXSuEMnh7Nmz9PDwYPv27RkeHk6SZkFOYwCpTp06WoU3ISGB169fZ+PGjbV3sV6vp16vZ7p06Th9+nTtfMnP4nNgmo9nz57NwoULUylFGxsb5s6dm2vXriVJxsTEcOLEicyQIQMdHBxYunRpDh48mA0aNKCnpyc9PDw+6zKLBI/Ev8r44J0+fZo//fQTybetF25ubuzatSvv37+vtcCZBo5Ict26dVRKcdOmTcmdbCFSBOPzExISwl9//ZXjx4/n9u3beerUKe2YrVu3Mm/evLSysmL37t3522+/kSRPnDjBr7/+mh4eHvzjjz8SXVMIS5k1axaVUmzTpg2PHTtGkjx16pQWKOrevbt27KVLl7hu3Tr27NmT/fr14/r1681a9YRISYzv11evXvHHH39kzZo1EwU/a9asyfXr1yc6R4jkcvLkSSql2Lt3b5Lk4cOHqZTi4sWLtWMaNmyoBZBu375tdv6yZcs4YsQINm7cmHPmzOGRI0e0fZKfxecmMDCQSikGBAQwMDCQ/fr1Y9asWanX6zlw4EDGxcUxOjqaGzdu1J4bpRS9vLzYuHFjXrt2zdK38FFJ8Ej8686fP083Nzdmy5aNwcHBfPLkCfPly0elFMuWLWvWC8no7NmzLF++PIsWLcqrV69aKOVCWI6xAHbq1CkWLFiQjo6OWktfmjRpOGrUKO3YTZs2sUqVKtoHK3v27HRwcKBSipMnT7bULQiRSEhICPPly8eyZcvy0qVLJN/2Mj106BAzZcpEX19f6W0qPmnvVp4PHjzIrVu3cu3atbx27ZrZECGpaIvktHDhQr58+ZIvX75knTp1aGVlxUGDBtHJyYlFixblnj17GB8frx1vGkD6J0NuPtRTWohP0aZNm+jk5MR27doxODhY2z527Fgqpejj48OwsDCzc65du8bLly/zxYsXjIqKSuYUJz8JHol/hfEDEh8fz+7du7NYsWLcvn27tn/v3r20t7enUopt27Y1O/fs2bNs3bo17e3tuWzZsuRMthApyvnz5+nq6sp8+fJx1KhRXLlyJYcNG0ZbW1sqpditWzft2ODgYC5atIgVK1ZkyZIl2aJFC65atUrbL5UUkRKcOHHCbG47g8HATZs2MWfOnPT09NQqKHFxcWat3cZvilROhKX90zz4vuMkLwtLKFWqFHPlysWTJ0+SfNswlS1bNup0OmbNmtWsh3JMTIz2e1IBJGOAScoV4nPXs2dPpkmThkePHiX5Nu9v27aNuXLloq+vr1ZOiYuL085Jbc+FlaUn7BafPpJQSuH27dt4/Pgx9u7dizp16mgrisTHx6NSpUqYNm0avvvuO2zfvh29e/dGQEAA7t27hxUrVuDSpUuYOHEi2rRpY3ZNIVKLV69eYeDAgXBzc8PUqVNRtWpVbV+lSpXQp08fzJ8/H+7u7hg1ahT8/f3h7++Pli1bQq/XQykFGxsbAG9Xt5KlckVyM813sbGxsLGxQVhYGADA1dUVALBlyxYMHDgQEREROHHihLZ6WlxcHPr3748uXbqgcuXK2vtfvgMiuRnzcUREBGxtbREeHg4vL6+/Pe/dvGosx0heFsmtbdu2uH79OgIDA5EzZ04AgJ2dHW7dugUnJyfcvn0bN27cQJkyZWAwGGBjY4P4+HhYWVlh48aNaNSoETZv3gy9Xo/p06dr72kpV4jPybtl5aioKBw4cAD+/v4ICAgAAGzfvh39+/dHeHg4Tpw4gcyZMwMAzp49C71ej6JFi6a650KRSaxHJ8R/6NGjR8idOzeyZ8+ON2/eYMmSJShVqpRWgQCAmJgY/PLLL+jRowcePXoEALCxsUH+/PnxzTffoH379gCk4itSp8ePHyN//vz44osvsHr1agDQCnMAcPjwYdSpUwcvX77Er7/+iipVqlgyuUKYMQ34jx49Gk5OTujSpQvu3LmDvHnz4ttvv0WdOnXQvXv3RIUwAOjbty8WLVqE3377DSVLlrTQXYjUzlj+uHDhAn744QeEhobi1atX6NOnD5o2bQoPDw9LJ1GID3rw4AHKly+PvHnz4ueff4abmxuCg4Nx5MgRbN68GSVKlMDGjRsRFBSEhQsXolOnTtq5pmWOpk2bYsOGDahQoQK2bdsGZ2dnS92SEP8607rmiRMnkCNHDqRNmxalS5fG8+fP8dtvv+HSpUvo27cvwsLCEpVZKlWqBDs7O2zevBl2dnYWugvLkBq6+FfodDp07doVt2/fxtWrV7F582YAb4NDBoMBAGBra4sGDRrg5MmTOHjwIBYtWoTff/8dGzZskMCRSPXCw8Px/PlzODk5adusrKxgjO+XK1cOY8eOBUlcv37dUskUIknGwNH8+fMxbNgwnDx5EhEREfDz80PNmjUxa9YstGnTBpGRkTh+/LhZIWzNmjXYvn07qlSpgty5c1voDoR4W5Y5d+4cKlasiEOHDkGv1+PBgwf49ttv0bdvXwQHB1s6iUJ8EEk8evQIsbGxcHNzw9GjR5EvXz7cuXMHS5cuxYgRIzB+/HjkyZMHnTt3xpIlS7RzraysEB8fDwBYt24dqlatiurVq0vgSHx2jHXNYcOGoUmTJtixYwcAoGzZsrhz5w6mTJmCvn37JtnYNXfuXFy8eBFVq1bVOkikKhYbMCc+Ow8ePOCYMWPo7OzMPHnycN++fdq+fzLmX+YDEKlZSEgIHRwcmC1bNp4/f95sn3G+gaNHj1Ipxa+++opk6htnLVIe08lWSbJWrVqsW7eu2TK1mzZtoru7O5VSZhO/k+SqVauYP39++vn58fr168mSZiHeZSx/xMTEsHXr1ixRogS3bt1Kkjx+/Di7detGnU7Hpk2bftZLMItPmzEfDxw4kDqdjs2aNaODgwNLlCihrcxqtGXLFubNmzfRqmuk+Xwu715biE+Zabn5t99+o5eXF9u0acMrV66QfDsPr3GRJxcXFwYFBZmdv2nTJubJk4dFixZlSEhIsqY9pZA5j8R/jO+Zj8jb2xtt2rRBfHw8xo4di8mTJ8PNzQ1FihSBUupv5zGS+QBEamR8Lnx8fNC7d29MmDABa9euRZYsWeDi4gLgr2cjLCwM1tbWKFWqFACZf0BYnl6vBwDMnj0ber0eN27cwKhRo5A3b14tbzdo0AAvXrxA3759MWzYMPz+++/ImjUrbt++jVOnTsHBwQG7d+9Gjhw5LHw3IjUy5tOQkBDExsbixIkTaNGiBerWrQsAKFmyJLy8vODg4IDp06cDeNtanTdvXrPzhUgpfvjhB5w+fRrr16+Hp6cnBg4ciC+++ALAX0PT6tWrBwAYPHiwNnStQ4cOAP7q9WzM15LHxefCtNwcGxsLvV6PXr16ab2e8+XLh44dO2L27NkIDw/HqVOn8OrVK2TPnh0LFizAkiVLEBERgUOHDsHHx8dSt2FREjwS/xHjsLLHjx/jxo0biIiIgIeHB4oVKwa9Xg9fX1906NABBoMB48aNg1IKgYGBKFq06D8KIAnxOTLme+PzEx4ejoSEBMTFxZlNxPrll19i3759mDBhAmxsbNCiRQvkypULOp0OV69exeLFi+Ho6Ij8+fNb8G6EMB9iHBQUhJ49e8LX1xcJCQlwd3cHACQkJECn00Gn06Fjx47IkCEDNmzYgK1bt+Lo0aPw8fFB8+bN0bdvX2TLls2StyNSMaUU7t69i9y5cyMgIABOTk7o2LEjgL8mfvfz80PPnj0BIFEASco0wtIWLFiArFmzagttGBev8fT0RGhoKH7//XdUrFgRbm5usLKyQkJCAvR6vVkAqWvXrkhISMDXX38NwLxBV/K4+JwYh27WqVMH1apVQ5EiRQC8LbNYW1vjm2++gY2NDebPn69Nq2JtbQ0AyJ8/P7Zu3Qp/f3+Lpd/iLNXlSXx6jF39Tp06RX9/f+p0OiqlqJRigwYNuGLFCu3Y+/fvc/jw4bSxseGXX37JM2fOWCrZQliM6fAGYzfws2fPslSpUsyQIQNdXFzYv39/Hj9+XDtu48aNLFq0KPV6PUuWLMlhw4Zx8uTJrFChApVSnDp1arLfhxCmTLt9Hzp0iCS5dOlS7Xswbtw4bb/BYEg0vPLx48e8ceMGX716leTwCCGS27Vr19isWTO6uLhQKcV58+Zp+0yH69y7d499+/alra0tGzZsmGiIsRDJbc6cOVRKsWPHjnz9+jVJ8sKFC2zSpAnnzJnD5s2bUynFnj178unTp9p5pkOOt23bxhw5clAplWiYjhCfunfLIEOGDKFSilZWVixTpgzDw8O197zx2Pj4eN6+fZvTpk1jr1692KtXL27ZsoWPHj1K9vSnNBI8Ev+RoKAgpkuXjjlz5uQPP/zAyZMns1atWrS3t6e7uzsnTZqkHRsSEsLhw4fTwcGBVatW5YkTJyyYciGSV7Vq1Vi4cGH+8ccf2rYzZ87Qzc2Nbm5urFixIvPkyUOlFMuWLcvdu3drx+3fv5/ffPONVhlXSjFHjhxmFRqZ70hY2rBhw+jq6sr58+eTJJcsWaLl1w0bNmjHmVa+Zd4MkVIFBweza9eutLW1Ze3atXnz5k1t37sBpF69elEpxV9++cUSSRWCJDlr1iwqpdi6detEQR9jIOny5cts2rQplVLs1avXewNI69ev5/Lly5Mn4UIkE9N39/jx4zl8+HCSbwNIrq6udHNz4++//07yr+dByikfJsEj8bdMPy6jR49mzpw5uXfvXm3b06dPuWLFCjo5OdHV1dVs4r1Hjx5pEd4tW7Yka7qFsJSoqCj279+f1tbWrFatmvZh6t69OwsXLszt27eTfNtDb9y4cVRKsVixYty1a5fZdYKDg7lv3z4eP36cd+7c0bZL4EhYgmm++/333+nj42M20SRJLl68mEopZs6cWcvnpBTGxKfh8uXL7NixI5VSbN++PR8+fKjtM83Dt2/f1t7rQliCMXDUqlUrBgcHm+17t0fn+fPn/1EAyUjKGOJzM2vWLG0S+efPn5MkBw0aRKUUvby8ePv2bZJJPw/CnASPxD9y/Phx/vTTTxw+fDjbtGmjbTctTK1fv5729vasXLkyw8LCtO0PHjwwG5YjRGoQGRnJMWPGUKfTsVq1ajxw4ACLFi3KgQMHascYC2jTpk3TAkimPZCSIpVwYWmvX7/mH3/8QS8vL546dYqkeWVj4cKFVErRz8+P27Zt07ZLhURYmjEPRkRE8O7duzx37hxv3Lhhdszly5fZoUOHJANISeVhydciuc2cOZNKKbZs2TJR4CgkJISLFy/mxYsXzbZ/KIAkxOfG9L0cGRnJ2rVrs3Hjxone94MHD6ZSit7e3hJA+ockeCT+1suXL7XlPN3d3dm5c2eSiSuxkZGRWoHr3R4URlLIEqlJREQER48eTZ1Oxy+++IL+/v48evQoSTI6OtrsWNMAkumSuhIsEinJ2LFjqZRinTp12LRpU237u3MbmQaQduzYYYmkCmHGmD/PnTvHypUra/MbKaXYrVs3s/fuhwJIQljSggULqJRip06dEgWO7t+/z969e9Pa2pqLFi0iaV6GMAaQrKys2L17d4aGhiZr2oVIbj///DO3b9/ODBkycNWqVdp20955xhEypgEkmY/x/SR4JJJkjLoau/bt2bOHBQsWpF6vZ8WKFfnixQuSiSu2q1atolKK06dPT3K/EJ8r08n2TFstYmNjGRgYSL1eT6UUAwMDtX3vBlOnT59OpRQLFiwoFW6RIo0ZM4ZOTk60trZmoUKF+PTpU7P3fFIBJGdn57/tUSfEx2TMo6dPn6arqyuzZs3K9u3bs1+/fixQoACtra2ZL18+Llu2TDsnKCiIHTp0oJWVFVu3bs2QkBBLJV8IGgwGnj9/Xgt4GoNDRvfv32ffvn21ybHfPdfowoULbNiwIZVSPHjwYLKkXQhLOH78OJVSTJ8+PdOnT89z586RNJ8U28gYQPLz8zOb704kJsEjkYjxI3Ps2DEWKFCAK1euJEnu3LmT/v7+VEpx5MiRZscbH8S1a9dSKWVWABMiNbh//z7Jv1orzp8/zyVLljAuLo6RkZGcMmUK9Xo9c+XKZTZn2LsBpMmTJ1MpxdWrVydf4oX4D0yePJkeHh60sbHhpk2bSJrnY9PfZ86cSWtr60RdxYVIbo8ePWKxYsWYO3du/vrrr9r2a9euccKECXRwcGCuXLnM5uq6du0a27RpQ6WU2TlCWMqIESO0CrExKH///n326dOHSil+99132rGmlWPTANLp06dlsnfx2Xv+/DnHjx/PnDlzUinF4cOH882bN2bHmD4jw4YNo1KK/v7+jIuLkw4Q7yHBI5Gke/fuMU+ePMyVK5fZB2b37t3aQzh27Fizh/DKlSusXbs27e3ttaE5QqQGixcvprW1NTdv3kzybeBVKcUWLVpoy3qGh4dz3Lhx1Ol0rFq1qtkqbO8GkIytI0JYirHQZFp4Mu3GPWXKFNrb29Pe3l5bSfN9ASTTOfCESC7vFvyPHDlCFxcXs3nnjF6/fs3p06fTxsaGLVu2NNsXFBRkNqRNCEswreQahw97enry559/1npN9O7dO8njybdTSyRFppMQnyPj+//FixecOHEivby8mD17dh48eDDRt+HdhaHeXblQmJPgkdCYPjxBQUH08vIyGx9qtGfPHubIkYNKKTZq1IhDhw7lzJkzWaFCBdrY2HDKlCnJmWwhLG7KlCnaeOkpU6bQwcGBJUqUSNRSHRERoU2iXbVqVR4+fFjbJxOxipTCNN9FRUXx4cOHjIyM5KtXr8yOmzJlCm1sbN4bQEoqACXEx9S4cWMuXbo0yX2zZ8+mUopz584l+XZIsak7d+6watWqVEq9d5EPeScLSzLNf8YAkq2tLXU6HQcNGqTtezdwdO3aNbZv357z589PtrQKkVz+7r38/PlzTpo0iW5ubixcuDBPnTr1wQCS+DAJHgkzJ0+eZMmSJdmlSxeWKVNG256QkGD2oO3evZu5c+emUorW1tZs3rw527ZtazZcTQpZIjVZu3YtraystKFp58+f1/a9u+qDcRLtd3sgCWFppnl10aJFrFChAq2trenl5cXixYtz7969Zi3YSQWQpBAmLGH37t1USjFr1qx8/PhxouDl77//TltbW/bo0UM7590KxIwZM6iU4tatW5Mv4UL8B94XQDp27BjJt+9f03fwjRs32KVLFyqlOGbMmGRPrxAfk+nzcPz4cS5fvpwTJ07kjz/+yBcvXmiL0zx79oyTJk2iq6vrewNI4p+R4JEw891332ldYYsUKcLIyEiz1jnTB+2XX35hvnz5qJQy62307qo7QnzOjHn91q1bWjDVxcVFW3Hw3cAr+TaANGbMGNra2rJixYo8cOBAcidbiA8aMWIEdTod/f392bhxY1aoUIFKKdrb23P06NHaHF8kOXXqVNrY2NDFxYVHjhyxYKpFard8+XJtqH14eLi23WAwMDg4mL6+vlRKcePGjdo+07kt5syZIxMJixQvqQCSp6dnooU2bty4wU6dOlEpxQkTJiR3MoX4qN59DtKkSaNNKK+UYuHChTljxgxtkad3A0inT5+WANJ/QYJHIpEePXpolYQPDUUg3waQjEPYpk6dqm2X4JFIbS5evMjmzZuzW7du1Ov1dHd357Zt27T9BoPB7Nl5+fIlR44cSaWUNumwECnB6tWraWNjw06dOvHatWva9vnz57No0aK0tbXlhAkTGBMTo+0z9tjIkCED37x5IwUykazeLXOcOXOGXl5eXLNmjdn2RYsWUSnF7NmzJ+pddOXKFVatWpV+fn4ywbtI8ZIKIHl4eGgNV9evX2fHjh2plOK4ceOSPE+Iz8GkSZOolGLz5s25ZcsWHj58mD169KCPjw+dnJw4aNAgbe7FFy9ecNKkSUyXLh2zZMnCs2fPWjbxnyAJHgmNaQ+jnj17UilFHx8frfLwvgCS6RxIs2bNSr4EC5HCREVFkSTnzZunBZCMLYGmwaNXr14xPj6esbGxWoBWiJSiQ4cO9PDw0CZuNx0CYexxam9vn2hemHnz5jE4ODg5kyqExrRcYgwSpUuXLlFwPjAwkEop6vV6jhgxgrt37+aGDRtYt25dKqU4Z86c5E66EP+V9/VAWrJkCb/99lsJHInP3tmzZ5kxY0ZWq1bNLOgfGRnJX3/9lXny5KGrqysXLVqklWXCwsIYGBhIPz8/3rp1y1JJ/2RJ8CiVMn5A4uLi+ObNG75+/dpsJR2S2oenYMGC/yiA5O/vT6UU582blwx3IITlGJ+DqKgohoWF8dGjR1q3WKNZs2ZpASTTpZ9v3rzJ0aNHc/78+WaVcinUieTwbo8g0/e+wWBgVFQUs2fPzjx58jAhIUEbdml63tSpU6mUYoMGDbQgqBCWYjAYtHfpgwcPtO0//vgjbWxs6OrqmiiANGfOHDo7O2vDG2xsbOjh4cHp06ebXVeIlC6pAJLxv7FjxyZ5nBCfiqTew6bbdu7cSWtra7O6pzGvJyQkcOvWrfT09DSbx5d8O6z5+fPnHynVnzcdRKpjMBig0+lw+fJldOzYEYUKFUK+fPnwxRdf4MCBA3j58iUAYObMmfjmm29w8eJFNGnSBNevX4dOp4PBYAAAKKVAEgBQrVo1TJw4EUWKFEGZMmUsdm9CfGzG5+fChQto1qwZ/P39kSVLFhQtWhTz5s3D06dPAQA9evTAjBkzEBERgdatW2PHjh0IDg7GxIkTMXToUOj1euj1eu26Op28jsXHZTAYoJQCABw5cgSBgYEYMmQIzpw5A+DtO93e3h7ZsmVDSEgIgoODodPpoJQye9937doVuXLlwr1796DT6WBtbW2xexKp1/Lly7Fr1y4opaDX63H8+HEEBARgyZIlAICOHTtizpw5ePPmDdq3b49NmzZp537zzTfYv38/VqxYgW+++QYLFizA1q1b0atXLwDmz4oQlmJ85777uynTcvnAgQMRGBgIAJg8eTIGDhwI4K9yixCfEtP3cHR0NIKCgvDkyROz8siff/6J+Ph47RmIi4vT8rpOp0O5cuVQrlw5HD16FPv27QPw9llydXVF2rRpLXBXnwFLRq5E8jNGa0+ePMk0adLQ09OTNWrUYK1atZghQwa6urpyzJgxZt34unfvTqUUixQpwqtXr773miQTLeUsxOfEmNdPnTpFV1dXZsqUia1atWLv3r1ZtGhRWllZsVOnTtpwH/LtUB5HR0cqpeju7k4rKyuzbuRCJAfTVmfjXABKKdasWZP79u0zO3bgwIFUSrFdu3Z8/Pixtt3Yu+PNmzfMmTMnS5YsmTyJF+IdV69epYODA21tbXnhwgWePXuWtra2LFmyZKIVLBctWvTeHkhJkR4awlKMee/ly5d8+fIlr127Ztaz80MrWZrm25MnTya5XYhPhWm+nT17NqtUqUJ3d3c2b96cERER2r4//viDtra2rF27dqJzjc/LihUrqJRKNKG8+O9I8CgVunXrFrNnz86CBQtyy5Yt2vYlS5bQ3t6eSileuHDB7BzjHEh+fn4MCwtL1I1QuneL1OLevXvMly8f8+fPbzYcbcuWLcyQIQOVUjx69KjZOZs3b2aXLl3YqlUrrl69WtsuhTqRHEzzWd26denk5MQ2bdrw2rVrZpNeG4+LiIhgmTJl6OzszDFjxvDhw4dm11u3bh1dXV3Zu3fvREPahEgus2fPpp+fH52dnWlra8vSpUubBUJNK9rvCyAltRqmEJZgfP+eP3+e9erVY6ZMmWhjY8OAgAAOHz5cO+7dKSZMGfO8MU9LGUN8ikzzbdOmTZkmTRrmzJmTM2fOTLQS5pMnT1ikSBEqpRgYGKhtj46O1n7/7rvvaGNjk6huK/47EjxKRYwfk4ULF9Le3p7z58/X9l25coXNmzf/4JxF7du35+TJk5MlrUKkVJs3b6aNjY3Z6oKXL19my5YtqZQye67eZfpBlEKdSG4dOnSgg4MDx40bx2fPnpFMXNkw/r57925tYuy6devy999/561bt7hw4ULmz5+fGTJk4M2bNy1yHyJ1M3139u/fn1ZWVrS2tuakSZO07UlVno0BpHTp0nHDhg3Jl2Ah/sa7vZp9fX3ZuHFjfv/998yePTuVUqxSpYqFUynEx2daFmnYsCEdHBw4dOjQRI1Ypg1Xp0+fprOzM62trTl48GCz43bu3MlcuXIxICAg0dyk4r8jwaNUqGXLlvT09NS6wl64cCHJwNH9+/cZGhqa5DWkpU587l6/fp3k9r59+9La2lr7CJ0/fz7J5yckJIRnzpxJlrQK8Xe2bdtGV1dXduzYUZsk8kPv8ZiYGO7bt4+VK1emUopWVla0sbGhnZ0ds2bNykuXLiVX0oVIJDY2lnFxccydOzczZszItGnT0s3NjQcOHEh0rGkPpB9//FGbTPjPP/+UsoxIMe7fv888efKwUKFCZr2ajx49Si8vLyqluHv3bgumUIjkM3ToUDo6OjIwMJBhYWEkk250NW7bvXs3XVxcqJRi6dKl2b17d7Zq1Yre3t50d3dnUFBQcib/s2Zl6TmXxMeVkJBgNikvANjb2yMuLg7Pnz9HVFQUxo0bh7Vr12Lu3Lno2rWrdtyMGTOwZcsWnD9/Ho6Ojtp2kjKRpPisrVq1CpcuXUL37t3h6+trti9NmjSIj4/HzZs3kS5dOkyYMCHJ52fp0qUYNWoU/vzzz0TXECK5HTp0CFFRUejfvz/Spk37wfc4SdjY2KBy5cqoUKECZs6cibt37+LFixcoVaoU6tSpg4wZMybzHQjxF+Mk7Zs3b0Z4eDiCgoIwdOhQNGjQAOvXr8cXX3yhHWtaBurYsSNevXoFnU6HbNmyJXu6hXif8+fP4+rVq5gyZQpq164NADhz5gwWLFiA0NBQ/Pjjj6hevbrZOTIRtvgchYaGYsOGDShQoAA6d+4MNzc3kEwyrxu3Va9eHUeOHEGfPn1w5coVHDt2DN7e3sifPz+mT5+O3LlzJ/dtfLYkePQZevToETw8PGBlZQW9Xo+TJ0/i4sWL6NSpEwAgY8aMCA8Px7Rp03D79m1s2LABc+bMMav4Hj58GBs3bkTp0qUTXV8CR+JztmLFCrRp0wYuLi5wcHBAx44d4e3tre3PkiULAGD69Ol48+YNNm/enChwdOzYMaxcuRI1a9Y0C7wKkdwMBgMiIiKwc+dOZMyYEVmyZEFsbCxsbGz+9tywsDCkSZMG3333XTKkVIgPMw14Gn83VghKlSqF+Ph4jBgxAk2aNEkUQLp37x6CgoJQs2ZNbUU1QCrfInlNnjwZzZo1SzL4fubMGZBE+/btAQAXL17ElClTsGbNGsyZMwcdOnQAAERGRuKPP/7Al19+KXlXfJbOnDmDq1ev4ueff0b69On/9j1t/B7ky5cPa9as0VZmy5UrF1xdXeHq6pqMqf/8yVvnM7Nq1SoULFhQW47w1KlTKFeuHJYvX44HDx4AeLvMct68eTFt2jRs2LABU6dORbdu3bRlD4OCgjB79mxERUWhVatWUvkVqUZkZCQ2btwI4G3L9sSJE7FgwQI8evRIO6ZRo0aoVasWVq1ahc2bN2PcuHFmgaPLly9j5syZePLkCdq1a4c0adIk+30IYaTT6eDk5ARra2vY2dnBysrqbwNHSik8efIEc+bMweXLl5MppUK8n3HJ5qdPn+L69evYtWsXHj16hJiYGO2YLl26IDAwEHZ2dmjSpAn27NkDALhz5w4mTpyI1q1b4+jRo2bXlcq3SC5Tp05Fv379MGLECDx8+FDbbix7G38+fPgQQUFBGDt2LNasWYO5c+eiW7du2vELFy7EoEGDcPv27eS9ASE+MuMzcPPmTQCAs7MzgL/vtKCUwrVr1xASEoK0adPC29sbVatWRaZMmSRw9BHIV/MzkpCQgOfPnyMuLg59+vTBnDlzUKFCBRQtWhTDhw+Hj48PAMDd3R29e/dG5syZ4eLigvTp0+PBgwdQSmHfvn0YNGgQ1q9fj8GDB6NmzZoWvishko+Liwu++uorAEDNmjVRvnx5jB8/HvPnz9cCSDY2NujSpQtKly4NKysrJCQk4PTp04iKisKOHTvwww8/YO3atRg6dCjq1asH4K8PohCWkJCQADs7O1y5cgWHDh36YH40GAwAgJCQEEyYMAHXr19PrmQKkSRjq/O5c+fQoEEDFClSBLVr10apUqXw/fffIywsTDv266+/RmBgIBwdHdGiRQt06tQJX3/9NebOnYu+ffsm2ZtaiORQvXp1dOrUCUuXLsXgwYO1AJKxYlyhQgUAwMSJEzF58mSsW7cOs2fPNmucOnHiBBYvXowsWbLAzc0t2e9BiI/J+Cw4ODgAgPZu/1DwKCEhAQCwbNky9OvXD1FRUVLm/tgsMM+S+IgiIyO5YcMGuru708rKiv7+/ty7d6+23zhxZFhYGGfPns0sWbJQKUVfX18WLlyYTk5OTJs2LadNm6adI6tCidQkLi6O1atXZ9asWblu3TqWK1eO9vb2HDZsGENCQki+fY42btzI8uXLUylFW1tb+vj40MbGhhkyZODMmTO168nzIyzJOCHw5MmTqZRiv379Eu1L6u+uXbvS1dWVt2/fTpZ0CpEU09V0XF1dmTlzZn7zzTdcu3Ytq1SpQqUUv/jiCz59+tTsvOXLl7Ns2bLU6/XMmDGjvJNFinD16lV26NCBSim2bduWDx480Pbdvn2bZcqU0SZ0X7p0qdm5wcHBbNKkCd3d3blp06bkTroQyWbXrl1USrFixYq8e/fue48zLbP4+/uzYcOGyZG8VE/mPPqMkISzszN8fX3x6tUrAEBERASsrP7636zX60ESbm5u6NixIypXroxZs2bhypUriIiIQO/evVGxYkVUqVIFgMwHIFIfKysrVK5cGX/88QcAYNSoUejbty8mT54MAOjcuTN8fHxQv359lC1bFmvWrMGZM2fw7NkzVKtWDcWKFUOZMmUAyPMjLM/YYhcQEIB06dJh0qRJyJEjBzp16mTWmmeaVzds2IBdu3bhyy+/hIeHh0XSLQTwNv/evHkTbdu2RY4cOTB06FDUrVsXABAcHIz9+/dj3759aNasGdatWwd3d3cAwFdffYUvvvgCDx48gK2tLfLlywdA3snCMvj/PSFy5cqFgQMHwsrKCosWLYKtrS2GDBmCjBkzInPmzBgyZAjat2+P0NBQPHr0CNevX0emTJmwf/9+LFiwANu3b8f06dPRoEED7boyD6n43NSoUQPVq1fHH3/8gV27dqFNmzawt7c3O8Y070+bNg13797F999/n2if+AgsGbkSH8eOHTvYtGlT9unThxkyZGC2bNm4d+9es9a2pFre4uLizP6W1jnxuYuJiSH5V143/nzz5g39/PxYv359kuTvv//O4sWL08HBwawH0ofIEtAipVm0aJHWqj179mwt/5vatGkTCxYsSG9vb964ccMCqRTiL7GxsRwxYgR9fX25YsUKbXv//v2plGKXLl1YoUIFKqVYpUoVPnv2jGTS5Rd5JwtLMebHP//8kzt37mSTJk20nv/du3fnvXv3tGN37NjBvHnzUilFnU5HV1dXKqWYPn16zpgxI9E1hfjcGAwGLlq0iC4uLsyQIQPXrl3LyMhIbb9pfXXHjh3Mly8fixcvzkePHlkiuamOImVg4OcoIiIC9vb2WL58OYYMGQIHBwf8+OOPqFChglmrW0REhDaZmHFCSonWitRg48aNOHLkCL7++mv4+/tr2+Pi4mBtbY3AwECMGTMGmzdvRs2aNbF//34MHjwYly5dwvfff4+uXbsiQ4YMAP5qVZRnR6REpr0tZs+ejZ49ewIAWrVqhbJly6J8+fJ49eoVli1bhh07diAmJga//fab1ltDCEuJjY3FDz/8gDt37mDr1q0AgHHjxmHw4MHo3Lkzxo0bBzc3N+TPnx/BwcGoXLkyVq9eDQ8PD2l9FimCMR+eOnUK9erVQ5o0aeDo6IisWbNi3bp1AIAOHTpgxIgR8PX1BfB24Y1Lly5hz549MBgMKFWqFAoXLoyAgAAA0oNOfP7i4uIwePBgTJ06FenSpUOvXr1Qu3Zt5M+fXztmwYIFmD17Nh4+fIjDhw8jT548FkxxKmLR0JX4nxlbHsLDw/n48WM+fPjQbP+rV6+4YMECenl5MWvWrNy3b58279GtW7fYu3dvzps3L9nTLYQlLVmyROuB4eTkxG+//ZabN282O+b8+fN0dXVlt27dSL5tAd+7dy9LlixJBwcHjhw50my+AiFSMtNW6uXLl7NIkSLU6/XanF1KKTo6OrJ27dq8du2aBVMqhLlr165prc67d+9mmjRp2LBhQy2fGgwGNmnSROuhUbRoUb5588aSSRbCzK1bt5gpUybmz5+fu3bt0rbv27ePderUoVKKHTp0MOuBZPShuemE+BwZyysxMTEcMmQIfXx8qNfr6eXlxQ4dOrBNmzYsUaIEnZyc6O/vz8uXL1s4xamLzHn0CTNdgeSHH37AzZs34eDggCpVqmD69OnQ6XRwdHTUVo8aMWIEOnXqhJkzZ8LFxQXr16/HnDlzMGHCBAvfiRDJ5/nz59i1axcAIGPGjMibNy+WLFmChQsXokqVKmjVqhVq1aqFggULokuXLpg2bRratWuHEiVKoGLFihg7diyGDh2KwMBAvHr1CiNGjNBWhhAipdLpdNo346uvvkKZMmVw/fp1bN++HVZWVnB1dUXt2rWRM2dOWdpWWATf01MoZ86c2iqAJ06cQEREBHr27ImcOXMCeNvjM23atKhUqRKio6NRsWJF2NnZJWvahfiQs2fPIiQkBN27d0eNGjUAvM3vlStXhqenJ2xtbfHTTz/Bzs4OAwYMQMaMGbVz330mpDed+NwZyys2NjYYPnw4SpUqha1bt2L16tVYtWoV4uLikD9/fvTu3Rtff/01MmXKZOkkpyoSPPqE6XQ6nD9/HpUqVUJCQgLy58+PW7duYfbs2bh06RJWr14NLy8vODg4oHXr1tDr9Rg7dizq1q0LFxcXvHr1CuPGjcMPP/xg6VsRItm4u7vjhx9+gIODA5YvX45GjRqhdevWuHv3LpYsWYK2bdtqk1qmT58ePj4+2Lp1KwoVKgQbGxtUqFABI0eOxLfffgs/Pz8JHIlPhk6n0yroWbJkQZYsWVC9enVLJ0sILbD57NkzPHnyBHq9Hr6+vnB0dDQbonPr1i1YWVkhV65c2rlnzpzBrl27MHDgQLNlzd8XjBIiuQUFBYGkNkQ+Li5OW8wmX7586NmzJ/bs2YN58+ZBKYWBAwfCx8fHkkkWwqKMASQrKyvUqlULtWrVwoABAxAXF4fo6Gjkz59fplqxEBkw+wkyGAwgCYPBgEmTJiF79uxYs2YNjh49itOnT6Njx444dOgQmjRpgkePHgEA7O3t0apVKyxfvhydOnVCo0aNsGrVKvTv31+7phCfO/7/3ETFixdHz5490ahRI0yfPh0HDx5Eo0aNcO7cOYwbNw5p0qRB69at8dNPP+Hu3bvYs2cP4uLiALxdsbBSpUr47bff0L17d0vejkjlTN/bCQkJZvve/dvo3YKW6TUoUyAKCzAGh86cOYPq1aujVKlSKFWqFOrUqYMbN26Yze2SMWNGxMXFYfjw4QgLC8Pp06cxc+ZMREZGmrU+S+BIpCQFCxYEAJw8eRIAYG1tbba/XLlyaNu2LVxdXTF37lz06tULUVFRyZ5OIT6mD5UxkqqHGt/9xvOyZs2KXLlyoWDBgjLnlwXJhNmfGGOB6MaNG8iWLRvq16+PfPnyYezYsdoxT58+xfjx4zFt2jSULl0a69ev1yb2NYqJiYGtrS0AmXhPpC6mlYrz589j3LhxWL9+PVq0aIFJkybB29sbAPDTTz9hz5492L9/Pxo3bowxY8YgTZo0iSolUkkRlmD63l69ejX279+PuLg45M6dGz/88AP0er3kTfHJuHz5MsqXLw8bGxuULVsWoaGhOHLkCDw8PLBp0yaUKVMGwNsJtKtWrYrDhw/D2dkZMTExiI2NxaRJk9C3b18L34UQSTt37hwCAgJgZWWFtWvXolatWgCA+Ph46PV6KKXQoUMHXLx4ETly5ECpUqXQq1cvC6daiH+PaZnl5s2biIyMREREBHLkyKH1sktISIBer7dkMsU/kdyTLIn/nnECsTt37lApRU9PTxYsWJBHjx7V9hsn0nv69Cn79OlDpRTLlCmjTaQtS3sKYT7h5Llz59isWTMqpfjVV1/xypUr2r4XL17w7t27DA0NtUQyhfhbI0eO1CZ/N/4XEBDAkJAQSydNiA8yLY989913zJcvn9lkwhMnTqS7uzs9PDz4+++/m53Xt29f1qtXj+3bt+fGjRuTvKYQyenv8t7MmTO1Mvnu3bvN9l25coXlypXjlClT+OrVK227TI4tPgemz8a0adPo7+9PKysrKqWYPXt2fvfdd9p+46JOIuWSnkcp3Lp16xAZGYlOnTpp2yIjI9GxY0f8+uuvePXqFRYsWIBOnTppEVv+f2vzs2fPMG7cOMyaNQuFChXC5s2bZQy1SFU+1KuO7/RAGj9+PNatW4fWrVtjwIAB2twEQqQkpnl69+7daNWqFerXr48OHTrA29sbw4cPx4oVK1CoUCFs3LgRWbJksXCKhXi/CxcuwNHREdOmTQMAzJkzR9tHEvPmzcPw4cOhlMKGDRtQvnx5s/0Gg0FrqZZe1MJSjHnv5s2b2Lt3L06cOAEXFxcUKlQIDRo0gKurK+Lj4zFgwABMnToVHh4e+P7771GtWjU8ePAAy5Ytw7Zt27B69WrUr18fgPRqFp+fMWPGYOjQoahQoQJq1KgBDw8PTJ8+HZcvX0bx4sVx4sQJSydR/BMWDFyJv3Ht2jUqpejt7c3ly5eb7QsLC2ObNm2olGKhQoUYFhZGkoyLiyP5V2vFs2fP2LNnTyqluG7dumRNvxCWYtqq96HWwPf1QGrTpg2vXr2a5HFCWMq7+XDjxo3MnDkzL1y4oG0LDw/noEGDaGVlxUKFCvHWrVvJnUwh/pHHjx/T0dGRSinmyJGDS5cuJfn2nW363p4zZw7TpUtHDw8PHj582Owa8m4WlmbMqydOnKCfnx+trKy0XhVKKdapU0crk7x584YTJ0406ylqPH7y5MmWvA0hPqo9e/bQxcWFbdq0Mevhv2LFCup0OlpbW0sv/0+EBI9SsKioKC5YsIBubm7MmjUrly1bZrY/LCyM7du3p1KKJUuWZGxsLMnEAaQnT56YdfkW4nNWt25d6vV6/vTTT9q2/yaA1L59e7MPnBApxdChQ+nt7c0OHTqwd+/e2nbjuz8iIoKDBw+WAJJI8YYNG8YMGTJQKcWBAweS/Ot9/W4AKUOGDHRxceG+ffssklYh3icoKIjp0qVj8eLFuXjxYoaGhnL79u1s3Lgx7ezsWKhQIe7YsUM7/o8//uCMGTPYsmVLjhkzhjt37tT2ydBL8akylkGSMmrUKFpbW/OPP/7Qtq1fv5558uRhhgwZePfuXZJkdHS0tl8aB1ImCR6lcG/evOGPP/5IJyenJANI4eHh/yiAZCQfJfG527JlC9OkSUNfX18uXrxY2/6fBJBatWpFpRQbNGig9eoTIiWIj49n27ZtqZSitbU169aty9jYWG2eAGM+Nw0gFStWjDdu3LBksoUwY/o+HjNmDJ2cnOjk5KTN4fhufibfzhmj1+u5YMGC5E2sEO9hMBgYHx/PLl260NXVlVu2bDHbf/fuXY4fP54ODg6sWrUq79+//8HrSRldfKpOnTrFzp07J5nHExIS2LBhQ2bIkEHbtnnzZubKlYvp06fn7du3te3Xr19PNNpGpCwSPPoE/K8BJCFSm927d9PFxYXe3t7/VQDp7NmzrFWrFqdPn/5R0ynEfyMqKorffPMN7e3tmSlTJv75558k/3rnmwaQhg4dSqUUy5cvL98EYTFJtSCbTow6YcIEWllZ0dnZmefPnzfbb/reNh2iKYQlmebLwoULM2/evNrfpu/aBw8esEOHDlRKcerUqcmaRiGSQ3R0NLt27UqlFDt16sQHDx6Y7TcYDGzevDldXV0ZEhLCrVu3MmfOnPT09DQLHJFk9erVWb16dUZERCTjHYj/hASPPhH/SQCpSJEijImJsVBKhUgZ/tcA0tOnT5PcLkRySSrfGSslUVFR7N69O5VS9Pf3Z3h4uNl+Yz4PDw/n6NGjGRwcnEypFsKcMS8+e/aMt2/f5r59+xgZGak1dBlNnDiRer3+bwNISf0txMcWHh7O4OBg7tmzxyzvxsXFMXfu3MyfP/97e/0fOHCASilWr15d8q74LAUFBbFz585USrFdu3aJAkgrV66kUopNmjRh3rx5mT59eq3hy2jRokX09PTk8OHDpbErBZPg0SfknwSQWrduTaUU16xZY6FUCpFy7Nq1638KICX1txDJ4d08Gh4enigvmgaQ8uTJk2jhBOM1JA8LSzHmwXPnzrFSpUp0d3enUop58+bl6NGj+ezZM7PjPxRAEsJStm/fzvr162vDgI1l7ISEBMbFxbF+/fpUSpmVMwwGg9l7PFu2bCxevLg07orP1tWrV7Vedm3btmVISIi27/LlyyxUqBCVUnRycjJroCXJrVu3Mk+ePCxQoIA2/5FImSR49In5uwBSWFgYf/31VwulToiU578JIAlhSaZ5c9myZWzQoAHd3d1ZqFAhNm/enH/++ac2qWRUVBR79Ojx3gCSEJZizMenT5+mq6srfXx82L59e06fPp0lS5akjY0NW7VqlWiFnYkTJ9LOzo62trY8ffq0JZIuhGb+/Pl0cXFh9uzZOWzYMB49epRv3rwxO2bXrl1aL9A9e/Zo242B+yNHjtDFxYXffvttsqZdiORgWt64efMmO3bsSKUUu3Xrxnv37mn7tm/fzvTp01MpxWHDhnHPnj28ffs2hwwZwuzZs9Pd3Z1BQUGWuAXxH5Dg0Sfo3QDSzz//nORxUjkWqZ3xGTAOYfPx8ZEAkkjRTHsJjRgxglZWVsyUKRPLlSvHrFmzUinFLFmy8Oeff+aLFy9ImgeQChYsqG0XIjkl1cPtxo0bzJ07N4sVK8bNmzdr24cMGaItVd68eXM+efLE7LyxY8dSKcU5c+Z87GQL8V4//fSTNtTGdJUoMnF+DwwMpFKKhQoV4ooVK7TtQUFBbNeuHe3s7BJNqC3Ep860HL1mzRqOGTOGhQsXpqOjI5VS/Oabb8wCSLt372bJkiW1979SilZWVixdurQMr/9ESPDoE2UMILm5udHX15cLFy60dJKEsAjTyYFv3brFS5cumXWVNZIeSOJTsnTpUur1en799ddaS9zz5885cOBA+vr6Mn369FyzZo2Wf9+8ecNevXpRKcVSpUrRYDDIcDWRbIwBS9P3aUxMDIcMGcKMGTNy1apV2vb+/ftTKcXu3buzePHiWgDp3R5I0utIWNKxY8fo6+vLatWqmU3U/r4yQ1hYGIcNG6ZViKtWrcp69eoxZ86cVEpx4sSJyZV0IZJdYGAg7e3tWalSJXbr1o29evWiq6srlVLs0KGD2Spst2/f5sGDBzlu3DhOnjyZhw8fTjSMTaRcEjyysKQK9/+0wP/mzRsuWLCASikuWbLk306aECme6XwaVapUoZOTE5VSzJAhAxcuXJhobgHTANJPP/1kgRQLkVhSkwHXrVuXmTNn1lrijPO+vH79mj/++CM9PT2ZI0cOPn78WDsvKiqK/fr14+XLl5Mv8SLVK1myJKtUqcJHjx6R/Cs/v3z5ku3atWPz5s21Y8eMGUOlFDt37szQ0FCGhoYyZ86ctLOzY4sWLczys5EE+EVyMpbBx40bR6UUN27c+B+dv2nTJpYoUYLp06eno6MjK1WqZDZCQPKz+Nxs2rSJOp2OrVu3NpsE+/Dhw2zSpAmVUuzYsaNZDyTx6ZLgkQW9uwKJadT1n85XERUVJRUFkSoZn59Tp07R1dWVmTJlYocOHThmzBgGBARQKcXAwMBErRm7d+9m2rRpmS5dOs6dO9cSSReC58+f58yZM5N817948YJp0qRhpUqVSP4VODJWal69esVvvvmGSin27duXJBOtXCVEcilWrBiVUmzatKkWQDLm1ePHj2srAW7fvp0uLi5s3Lgxr1+/TvJtMLR8+fK0srKiUop16tRJNJ+MEMnt9evXLFq0KHPkyKFt+1DD7rsBoWfPnvHFixd89OgRIyMj33ucEJ+D4cOH08bGhnv37iVpns8vXbrE2rVra71NTQNI0jv606SDsAiDwQCdToczZ86gZs2aKFWqFCpWrIhu3bqBJKysrP7Rdezt7ZE3b17tmkKkFjqdDjdu3EDr1q2RM2dOzJ49G4sXL8agQYO0Z2L48OGYMmUKnj9/rp1XvXp1rFixAs+fP4e1tbWlki9SsTdv3qBJkybo1asXtm/fnmi/s7MzfHx88PDhQ0RGRkKv14MklFIgCUdHR/Tt2xdp0qTB3bt3AUDyskh2xjLHqVOnUKNGDaxfvx49e/bE48ePoZQCAJQsWRLOzs4AgD/++APR0dHo06cPcuTIAQBwcHBAjhw50KVLFxQrVgwBAQGws7OzzA0J8f+ioqIQHh6ONGnSAHib1415Oik6nQ7x8fFYv3494uLi4O7ujjRp0sDLywtOTk4AAJLQ6aTaJT4/ly9fBklkyJABgHl9NF++fOjduzcAYO7cuRg3bhxCQkIA4IPPlEi55C1mITqdDsHBwahRowZu376NokWL4s2bN1iwYAFKly6N+/fv/1fXFCK1iImJwaJFi2AwGPDtt9+iTp06AIAhQ4Zg8eLFaNq0KcqUKYMJEyZg5syZePr0qXZuzZo1cfv2bXTq1MlSyRepmL29PRYvXoxWrVqhdOnSAN5WLAAgISEBVlZWyJkzJ65fv46pU6ciOjpaCxwZubi4QKfT4c2bNxa5ByGMFWYA+OWXX1CtWjVs2LBBCyABfzWUkURQUBAcHByQM2dO7RqnTp3C9u3bUaJECZw8eRIDBw4EALO8LkRyMwaL7t69i8ePH3+wfG2sKF+6dAnTpk3D3r17zfYbK8hSURafq4CAAMTHx2PPnj0AACsrK/Dt6CaQRJUqVdCoUSPkzJkT8+fPx7hx45CQkGDhVIv/lkQbLMBYKNqyZQsyZsyI5cuXY+fOnTh16hS+/fZbnDx5EvXr18edO3csm1AhUjCS2Lt3L/LkyYPWrVsDAMaMGYOxY8eiW7dumDJlCgIDA2FtbY1Ro0Zhzpw5Zj2Q/Pz8AEiPPWEZ5cqVw08//YT06dNjypQpGDt2LOLj46HX6wEAY8eOhY+PD5YtW4Z169ZpASRjBWT37t2IiopCqVKlAEhlW1iGlZWVFkDavXt3ogCSTqfTKuJZsmRBREQEZsyYgcjISFy4cAFz5sxBQkICvL29tWsae9kJYSmenp4oXLgwnjx5gl9//fWD5QRjYGnv3r04fvw4fHx8kiuZQqQIJUqUAABMnDgRv/76K4C3wdL4+HjtXX7jxg0UKlQIvXr1Qvfu3bWyjvgEJf9IudTr3bGdzZs351dffWW2LSwsjAMHDqSVlRWLFCnC27dvJ2MKhUi5khobHRISoi3xvGnTJrq6urJx48a8evWqdkydOnXo7OxMpRR79OjB6OjoZEuzEEkxzcsPHz6kra0tHRwcOG3aNG0OJOOKmunSpaO3tzd79+7Nu3fv8vnz51yxYgULFCjAjBkzyjdCpAimc3dVr15dW97cOAcSST5+/JilSpXSFjUwrsQzefJkSyRZiCQZ388bNmygg4MDixcvbjYJ8LvHkW/nXsyTJw+rV6+urTwoxOfi3bm6oqOjE20bP348lVIsU6YMd+zYYbZv69atzJ07N3/99VeZ9+sz8M8m1hH/M2PX7UePHuHRo0eIi4tDQkICqlevDuDtUAWlFNzc3NC/f38AwKRJk9CoUSNs2rRJ6yUhRGpkfH6ePHmCq1evonz58gBg1sJ35MgRGAwG9OjRA7ly5dLOiY2NRcmSJaHT6ZA9e3bY2tpa6jZEKmTMh0YxMTFaHnz58iUyZMiAQ4cOoVmzZhgxYgQMBgN69uwJOzs7NGjQADY2Nhg2bBhmzJiBlStXQimF169fI23atNi5cycyZ85soTsTqRlNegfx/+dpjIuLg7W1NXbv3o0aNWpgw4YNAICZM2fCy8sLHh4e2LRpE4YPH46goCB4e3ujSZMmaNq0KYDEz4oQlmDM1+XLl0fVqlWxbds2dO7cGYsWLUKWLFmglDLLq1euXMHMmTNx9+5djBgxQpsnSYjPgWleX7duHQ4cOIDjx48jXbp0qFGjBpo2bYqMGTOiV69eePr0KaZOnarN6VisWDEEBwdj5cqViIqKQq5cueQd/zmwdPQqNTBGWU+fPs28efPS0dGRnp6etLKyYosWLRgWFpbo2PDwcA4cOJB2dnbMly8fb968aYmkC2Fxxmfi3LlzLFeuHHU6HUeOHGl2TGxsLEuUKEFfX1+znkVnz55l9uzZuXz5ckZERCRruoUwtXnzZrO/x48fzyFDhmgrUZ08eZK+vr50dXXllClTtJ4c8fHxvH//Pr/99lvWqVOH1atX54gRI6THkbAY4zv5+fPnfPjwIU+dOsXo6OhEK/6Z9kB6+PCh2b7Y2Fiz46U1WqREt2/f1nrLlShRgsuXL+fjx4+1/Tt37mSdOnWolOKUKVO07bKKlPgcmObjESNG0NbWlm5ubsyVKxd1Oh2VUvziiy+0nkZxcXGcPXs27e3tqZSiUoo6nY7Zs2fnpUuXLHUb4l8mwaNkcvXqVXp6ejJjxozs1KkTq1SpwjRp0jBdunRcs2aNWZdvYyEqIiKCP/zwA5VSXLVqlaWSLoTFGD9cp06dYpo0aZgvXz5OmjSJr1+/TnRsv379qJTi9OnTSb6tjLdp04Zubm48ePBgomsKkVw6duxoVrkYPnw4lVIcOHCgFjwi3x9AEiKlMJZPzp49y/Lly9PX11erWH///fd8+vSp2fFJDWEzXsP4LpZ3skjJbt++zbp162oVYh8fH1aoUIEFChSgXq+nl5cXZ8+erR0vgVDxuVm4cCGVUuzcuTNPnTpFkjx48CA7dOhABwcHFipUiLt379aOP3/+PHfu3MkJEyZw27ZtDAkJsVTSxUcgwaOPyLSA9PPPPzN//vz85ZdftH0LFixglixZ6OXlxW3btiUZQAoLC+ORI0eSP/FCpBB3795l3rx5WbBgQe7atUvb/m6FY9++fcyVKxeVUsyWLRvTpk1LnU7HqVOnJneShTCzY8cO+vj4UCnFKlWqUCnFXr168fr164mOfV8AyfT7IJVtYUnnzp2jm5sb06VLxwYNGvDLL79kpkyZqJRioUKFEvUyMgaQ6tevzwcPHlgo1UL890JDQ7l27Vo2bNiQfn5+9PPzY968eTl8+HAeOnRIO04CR+JzYjAYGBERwfLly9Pf3z9RmeXBgwccP3487ezsWLduXenhn0ooUpZo+ZjOnTuHAwcO4OjRo4iJicH27du1fXFxcVi7di2GDRuGN2/eYOHChahZsyasrN5ORfXu+H+ZD0B87pjEKjurVq1Chw4dMH78ePTu3RvA+5+F/fv3Y/v27fjtt9+QK1cuNGjQAF999dUHzxHiYzLm6aCgIJQuXRpRUVEoUaIEduzYgTRp0iAhISHRqiOnTp1Cw4YN8fLlS4wcORLdu3fXvgtCWILx/RkfH4+ePXvi7NmzCAwMRLVq1UASL168QLt27bBz507kyZMHBw4cgIeHh3Z+lSpVcODAAezYsQNffvmlBe9EiP/No0ePoNfrYW9vD2dnZ217UuUXIVK69+Vb4/aQkBBkz54dtWvXxoYNG7SVB43l6Xv37qFPnz7YtGkTli5dijZt2iRr+kXyk5rURxQVFYVhw4bh+++/x/nz51GoUCEAbx/IhIQEWFtbo3nz5ggMDISDgwM6d+6M3bt3a8vevlvRlYqv+FytW7cOT548SfIDduDAAZBEvXr1ALydXP7dZ8EYA69cuTImT56MkydPYs2aNRI4EinG9evX8fLlS9jZ2eHYsWNYtmwZAECv1ydaBrp48eLYtGkT0qRJg++++w4LFy60RJKF0Oh0Oty4cQOXL1/G6dOnERAQgGrVqgF42xDm7u6OLVu2oH79+ggODsagQYMQExODhIQEAMC+ffuwadMmCRyJT5axnJEhQwZ4enrC2dkZpu3vEjgSnxqDwaDl25s3b2Lt2rVYvnw54uLitO2Ojo5wdXXFq1evALz9Fpjm9UyZMqFt27YAgAsXLiTzHQhLkNrUR+Tg4ICBAweiYcOGuHXrFnbs2IEbN25AKaVVGKysrLQAkouLC9q2bYutW7dCOoSJ1KJ3795o3rw5Vq9erQVOTTk5OSEhIQH3798HALNeGsbnRCmFlStXavsdHBxgbW2tHSOBI2EpxkJWuXLlsHTpUsybNw8ZMmRAnz59MHHiRABvC2MGg8HsvV+8eHGsXLkS/v7+qFKlikXSLoRRaGgoSpcujdq1a+Ply5eoWbMmACA+Ph42NjZaD7oVK1Ygd+7c+P333/HixQvo9XrExcUBAOrXrw8AiYKlQnwKkgoOScBIfKpMG1UHDx6ML7/8Ei1atMDatWtx8uRJ7RiSyJgxI3799VesWrUKwNt8T1IrsxcrVkxbCVZ8/qRG9S8zFoqMrW2lS5dG3759Ua9ePVy6dAlLly5FaGgogL8qDFZWVmjWrBkGDx6sdf+WD5JILZo1a4aqVasid+7csLKy0p4dY0U6Y8aMMBgMWLZsGZ49e6adZ9pisnfvXrRu3Rpr1qxJdH15lkRyM+Zd02BQunTp0KpVK3z11VdYsWIFvLy8MGDAAEyaNAmAeWve3bt38fTpU5QuXRpnzpxBrly5kv8mhDCh1+vxzTffwMbGBteuXcOKFSvw+vVrbTilMUjk4OCA8uXL48aNGzh16hQAaIF8IwnmCyGE5ZgGjurXr485c+Yga9asOHDgAObPn48yZcoAePuuTps2LQYNGgQAmDx5Mn799VcAb8vWxvf/1q1bodPpULx4cQvcjUhu8gX/l7w7BtS0d0RAQAAGDBiAqlWrYsqUKVi0aFGSAaSWLVvi2LFj+Prrr5P/BoSwkICAAGzYsAHVq1fHuXPnMH36dDx79kyrSLdt2xYBAQHYsmULtm3bhhcvXgD461kLDg7G3LlzkTVrVmTPnt1i9yEEYB7UjIyMxLNnz7Q8a/wuVKpUCStXroSXlxf69++PCRMmaOfv378f3bp1w6JFixAfHw87O7vkvwmR6hnLNPfv30dkZCTSpUuHnj17onPnzvD29sahQ4fwxx9/mDWYGYNEnp6esLOzg6enp8XSL4QQIjHT3vgtW7bEb7/9hv79+2Pp0qWoUKECfHx8tOOMDWANGzbEkCFDcP78efTq1QuLFy9GbGwsEhISsGHDBsyfPx9+fn7aUGbxmUuumbk/Z8bVFa5evcohQ4awbt26/PLLLzl79myeP39eO+748eOsXr06bW1tGRgYyMePH2v74uPjk7ymEKlFVFQUy5YtS6UUJ0yYwOfPn5N8u8rUqlWr6OfnR09PT/bu3Zvnz59ndHQ09+3bx6ZNm1Kv13Pu3LkWvgOR2pm+t5csWcIqVarQ29ubWbJk4ejRo3nx4kWz4/fv309vb28qpdivXz/OnTuXhQsXpl6vZ3BwcHInXwgzFy9eZKZMmRgUFKRte/bsGcePH083NzcWLlyY+/fvZ1RUlLb/ypUrLF68OH18fHjp0iVLJFsIIcTfmD9/Pp2cnNi3b1++ePGC5IdXcg0LC+OoUaOolKJSivny5WPu3Lnp4uLCDBkyyPs+FZHg0f/IWFk4ceIE06dPT0dHR2bOnJmZM2emUooFChTgpk2btONPnTqlBZDGjBnDR48eWSrpQlhUXFyc9vzExsaSfPt8lC5dmk5OThw3bhyfPn1Kknz9+jWXLVvGokWLUilFJycnZs6cmQ4ODnR2duaUKVO068oy5sISTPPdyJEjqZSin58fGzZsqC1VXqtWLe7bt8/svEOHDjFfvnxUStHa2prZsmVLFGQSwhLGjx9PpZS2FLkxjz9//pzjx4+nq6srs2XLxr59+/LcuXNcsWIFW7VqRaUUZ82aZcmkCyGE+ICGDRvSy8uLd+7cIfnPy867du1i48aN6e/vzxIlSrBHjx68efPmx0yqSGEUKTMz/6+uXbuGypUrw9vbG99//z2aNWsGABgwYAAmTpwIGxsbXL16FZkzZwbwdhnmESNGYNeuXRgwYACGDh0Ke3t7C96BEMnn1KlTKFy4sDZW+uTJk/jll1/QvXt3eHh44Ny5c+jatSuCg4MxePBgdOzYER4eHoiNjcWjR4+waNEiXLhwAU+ePMEXX3yB8uXLo3r16gBkVTWRvJjEErdz587F999/j1atWqF79+4oVKgQXr58iZw5c+L58+cICAjAyJEjUbFiRe2c4OBgnDt3Dq9fv0aNGjWQKVOmZL4TIRLbvXs3vvzyS6xZswZNmzY12/fixQssWrQIM2bMwOPHj+Hl5QW9Xo98+fKhbt266NatGwBZvlwIIVKaK1euoFixYqhVqxbWrVv3t2Vn43vceFxsbCx0Op02T6npVC3i82dl6QR8St59uIxxt5UrVyI8PBwTJkzQAkdBQUHavEZz585F5syZtYevePHiGDZsGMLCwuDt7S2BI5FqrF27Fi1atECvXr0wbdo0XLp0CaVKlUK5cuXQpk0beHh4oHDhwpg/fz66du2KMWPGAAA6deqEdOnSwc/PD6NHjwbwdpUfYwAKkMCRSD4vX76Es7OztuKIsXIcFBSEhQsXokaNGujVqxfy5csHg8GAihUrIj4+HjVr1sT27dsxbNgwjBgxApUrVwYA5MmTB3ny5LHkLYlUzjQfG+ft8vDwAACcOXMGTZs2NaskpE2bVpufcf78+SCJxYsXo2jRonBzc9OuI+9kIYRIWYzvZhcXFwB/v7CMUgp37tzBzp070aVLF9jY2Gj75B2f+sj/8X8oPDwcOp3ObClxpRSUUjh69CgyZ86Mr776CgBw6dIljB49GsuWLcOcOXPQoUMHAMDTp08REhICAChZsiS2bNmCHj16JP/NCGEhZcqUgaenJ2bMmIHWrVujRIkSKFu2LAYNGoSsWbNqxxUuXBgLFixA3rx5MWbMGCxatAjPnz8H8FfQ1jRwBMgHTCSPU6dOoXbt2ti9ezeAv5asBYBbt27h6dOnaNu2rRY4KlOmDG7duoWxY8fixx9/RNeuXXHkyBGMGzcO+/fvt+StiFTMtNO5MVj09OlTvHjxQlv5r2DBgsiWLRsuX74M4O2E76arYaZNmxadOnVC165d8fz5cwwbNgx//vmndl15JwshRMoTHx+P2NhYnDx5Ek+fPv1g8Mj4zj9x4gQWLFiAoKAgs/3SszT1kS/7P1ChQgX4+vriyZMnsLKy0gJIJBEeHo4XL17A2dkZAHD27FmMGzcOa9euxdy5c7Wu2wAwe/ZszJ8/H2/evAEAbSUSGTkoUoP4+Hj4+vri8ePHvphIoAAAMdtJREFUSJ8+PdauXYu0adNi2LBh2rAz02ehUKFCmD9/PvLmzatVvJ8/fy4fKmFRR44cweHDhzF69Gjs27cPwF+FJ39/f0ydOhX16tUDSXTu3BkXL17EiBEj8NVXX8HDwwMlSpQASRw5cgS9e/fGkSNHLHk7IpWKiooC8NfKO+fOnUPBggVRsmRJ1K1bF7169cKoUaNAEk+ePMH9+/cB/LVioDHPu7u7o0OHDhgyZAguXbqEbt264dy5c5a5KSGEEH+rYMGCKFu2LO7cuYOjR4++9ziS2jv/559/xuvXr80aekXqJMGjv5GQkICcOXMiKioKZcqUMQsgKaXg5uaGAgUK4OLFi9izZw9mzZqFNWvWYO7cuejatat2nQMHDmDKlCkwGAxm3f0AidqK1MHKygokERkZidDQUBgMBjx69Ah79+7VjjEu+2xkDCAVKFAAQ4cOxYwZMxATE5PcSRdC07t3b0ydOhVHjx7FoEGDtAASAGTPnh2NGjUC8HYI2969e1G5cmV8/fXX2vDkihUromDBgmjQoAFu3bqlLYsrRHKZPXs2atWqhbCwMCilkJCQgN9//x0FCxZE+vTp/6+9O4+P+er///+YLBKVCLEVsQW100VT0qi1lsQapbVEa2n0W4oLUUWViiVq/6BqKaUVRHURbS1Xi9r3ELXVViUoUtKIbHN+f+Q3c0lJ26uXZiJ53m83N+nM+/2ec3p7z5jzzDmvw7Zt25g7dy5Tp07lzJkz7N+/n/bt2+Pv78+rr77KokWL2LBhA2fOnOHKlSsUK1aM0NBQRo4cyZkzZ+jcuTMxMTGO7qaIiPyO7Ze0wcHBJCYmEhERwfnz5+85zjYjFWDZsmXs3buX4OBglVoRtNvaH7BVnk9NTTVDhw41FovFVKxY0Vy5csUY858dohYtWmQsFospWrSosVgs5uOPP850ndjYWNO6dWtTrlw5+64lInnVzz//bGbMmGFWrFhhKlSoYCwWixk6dKhJS0szxhj733c7cOCAqVKlipkzZ052N1fkvqZMmWIsFovx8/MzmzZtsj9u+3dj3bp1xmKxmEmTJmU6b+TIkaZs2bImISHB/Prrr9naZpH/+7//MxaLxXTv3t2cP3/+vsdcvnzZ/PjjjyYyMtL07NnTWCwWU6dOHVOnTh3j5ORk36rZYrGYFStW2M+7ceOGeeedd4yPj4923xERycHi4uLsO8E2adLEHD9+3KSmphpjMn8PX7t2raldu7apVKmSOXv2rINaKzmJwqM/YXsDpaammiFDhtwTINl07NjRWCwWU7ZsWZOcnGx/fNu2baZLly7GycnJzJs3L1vbLpJT/H4L0ISEBGOMMVevXjXly5c3FovFDBs2zP5+S09PN8ZkDEZsA+xffvklG1ss8ueyCpCMMWb37t3G2dnZBAYGmh9++MEYY8yaNWtMnTp1THBwsElMTHREkyUPswVH3bp1s9+TNlar1f7nblOmTDGurq7mq6++MmlpaSYmJsZs2bLFLFiwIFNwZDsvPj7eXLt27Z/vjIiI/E/OnDlj6tWrZywWi3niiSfMjBkzzPnz583t27fNb7/9ZsaMGWMqV65sihYtao4cOeLo5koOofDoL/irAVKbNm2MxWIx3t7epmXLliYwMNAULlzYPPLII2bKlCn2437/5Uwkt7KFQMnJycZqtd43ALp06VKmAMl2zqlTp8ygQYPM8OHDza1bt+zH6/0jjmC7L38vqwApJSXFDBw40Dg5OZnq1aub5557zhQqVMgUL178noG7yD/tj4KjW7dumaSkpPuet2nTJmOxWMysWbOMMfd/H2T13hARkZzt3Llz5sUXXzTe3t7GYrGY/Pnzm5IlSxp3d3fj4uJi/P399Z1FMrEYo2rNf4Vti9q0tDSGDx/OtGnT8PX1ZceOHfbC1wCTJk3iu+++48iRI+TPn5+GDRvSrl072rVrB2jrWsk7bPf6Dz/8wOzZszl8+DAJCQm88MILdOnShUqVKtmPjYuLw9/fn/PnzxMaGkrnzp355JNPWLx4MREREYSFhTmwJyL/cfjwYSpXrpxp3f/UqVMJCwvj6aefZvz48TRr1gzI2H0tMjKSadOm4e3tzWOPPcb06dN57LHHHNV8yYPmzp1L//796dKlCyNHjqR69er25y5cuMDSpUtJS0vjzTffxN3dPdO5hw4dol69evTv358pU6boO4yISC5z48YNYmNjiYyM5OTJk6SkpFCxYkXatm1LQEBApnGuiMKjLBhj7ilkbXvszwKktLQ0Ll++TIECBShYsKC9Ur2+dEleYbvX9+7dS1BQELdu3aJq1apAxuC7efPmDBgwgMDAQPs5cXFxtGjRgtjYWPLly4fFYiE8PJwhQ4Y4qhsimXz44Yf06dOHBQsW0K1bt0wD7bsDpPDwcJ5//nn7c5cuXaJgwYIAeHh4ZHu7Je+aPXs2AwYMoG3btsyZMydTgfaff/6ZGTNmMG3aNMaOHcvbb799z/nXrl2jbt26lC1blu+++87+fUZERHKf1NRUrFYrbm5ujm6K5FAujm5ATmILh2wD3ytXrhAfH8+FCxeoXLkypUuXxtXVFRcXFyZNmgTAtGnT8Pf3twdIaWlpuLi44OPjY7+mjYIjySucnJw4evQo7du3p0KFCgwYMIBu3boBEBgYyDfffENiYiLGGIKCggAoWbIk3333HfPnz8cYQ40aNTRjT3IULy8vatasyZAhQ3BycqJLly72AMkWcoaFhTFq1CgAe4BUokQJDbol2yUnJ/P5558DkJSUlOkXYhcuXGDmzJlMmzaNQYMG2YOj3//irGjRopQoUYKLFy+Smpqq+1hEJBeyffa7urrax673m0ghoppHxpivvvrK3L592xhj7JXm9+3bZ2rXrm0eeeQR+05qzZs3N6dPn7av78+qBpLtGiJ51c2bN03Xrl1N1apVzWeffWZ/fMSIEcZisZiGDRsaNzc34+fnZ9auXfuH11I9DclJoqOjzRNPPGEKFChgPvzww3tqxdhqIPn7+5uvvvrKQa0UyXDt2jXTtm1bY7FYTPv27c2lS5dMQkKCGTx4sLFYLOZf//qX/dj77XSZkpJimjVrZsaNG5edzRYREZEcKM+HR927dzdOTk5m0aJF9kHAoUOHTJEiRUz58uVN3759zciRI81TTz1lLBaL8fX1NevXr7cHRHcHSGXKlDFxcXGO7I5IjnD06FFTqVIlM3ToUPtjo0ePNhaLxfTr188cOnTIjBkzxlgsFtOsWTPz5Zdf2o9TQWxxtD8rCrx27do/DJCmT59uLBaLadq0qXZVE4e7fv26CQwMNBaLxbRo0cL06dPnT4OjM2fOmMuXLxtjjP1vY/T5LCIikpfl6fDIarWatWvXGl9fX+Pj42Pmz59v7ty5YyIiIswTTzxhvvnmG/uxSUlJZtiwYcbT09NUqFDBxMbG2p9LTU01AwcONBaLxSxevNgBPRHJWX777TcTHh5u7ty5Y4wxZvHixcbV1dW8/PLL5vTp08YYY7Zv324sFouxWCzmySefzDRDSSQnOH78eKb/vl+A5OHhYRYvXnxPSDR79mxz9OjRbGmnyJ+5fv26CQoKsn/m9unTx/7c72dLnzp1ynTu3Nl4eXmZ69ev24MlBUciIiJ5W54uImKxWAgMDOSDDz7AxcWFsWPHsnTpUr788ktq1KhBixYtgIy6Ae7u7owdO5ZBgwZx7tw5+vbtS0pKCgAuLi689957bNmyhVdeecWBPRJxvLS0NAoUKMCIESNwc3Pj5s2brFixgtKlSzNkyBB8fX0B8Pf3x8/Pj5deeomDBw9y+/ZtB7dc5D/mzp1LtWrViIqKsj/m5OSE1WoFoHXr1gwfPpwCBQowZMgQPv30U5KSkuzH9uvXL9OuViKO5O3tzUcffUSbNm0ASEhI4OeffwbIVNPi1KlTTJo0iaioKAYOHIi3t7e9zpFqX4iIiORteTo8gozBQOPGjVmwYAHOzs6Eh4cTHx/P008/DUBKSgpubm5YrVbc3d0ZMWIEDRo0YNeuXezduxfIGCy7urrSoEEDAPvgQiS3s93r6enppKamAhlh6t0SExPZtWsXderUoVatWvbHN2zYwMGDB+nVqxenTp2ia9eu2ddwkT/h7u6Oj48PPXv25NNPP7U/fneA1LlzZ9q3b098fDyDBw9m8eLFJCcnO6rJIn+oSJEifPjhh7Rq1YpVq1bRv39/zpw5Yw+HTp06RUREBB9++CETJ05k7NixgL7TiIiISIY8Hx4BODs707hxYxYtWoS7uzvHjh1j+fLlJCUlkS9fPowxODk5kZqairu7OyEhIVitVk6cOAHcO1jWrlCSF9h2QIuJiSEkJISGDRsSFhbGhg0bgP/8ltrDw4NChQpx/vx5jh07BsDx48f56KOPqFSpEpUqVaJixYr2a4pkt7vvu7S0NAB69epFREQEJUqUoFu3bvcESLaQKCgoiFq1auHl5cWECRO4c+dO9jZe5L9QpEgRli1bRqtWrfjyyy8ZMmQIly9f5urVq0yaNMkeHL355puAdroUERGR/3D580NyL3PXFoTOzs40atSIOXPm8K9//Ys9e/Ywc+ZMBg4cSP78+UlNTcXV1RXAvrymWLFiDmu7iKM5OTlx8OBBGjduTFJSEp6enhw4cIAVK1YwcOBAhg4dCkD+/Pnp06cPY8eOpXfv3lSsWJHY2FhiYmKYMWMG5cuXz3RNkex09+B406ZNnDx5kpo1a/Lcc8/RpUsXAEaNGkW3bt0A6NixI1arFTc3NwCio6Px8vIiIiKCKlWq4OXl5ZiOiPxF3t7eLFu2jJCQEL744guSkpLw8vIiKipKwZGIiIhkKU9+KzDGAPeu33dxcaFBgwZMnz6dChUqMGPGDObNm8ft27ftwdHx48eJjo6mYMGClChRItvbLpITWK1WkpKSCA8P57HHHmPVqlUcOnSINWvWkJqayrBhwxg9ejQArq6udOnShdGjR3P27FmWL19OYmIi8+bNY8CAAcB/3pMi2enuwXFERATdunUjPDycy5cv22cWdenShfDwcEqXLk23bt1YtmwZN2/eBODzzz9n+/btNGnShJYtW1KhQgWH9UXkv2ELkNq0acOGDRuIiopi8uTJCo5EREQkSxaTx0Ztti9Ely5d4uDBg/z44494eXnx7LPPUr58eVxdXUlOTub7778nNDSUn376iWbNmvHaa6/x448/sm3bNqKjo5kyZQqDBg1ydHdEHKpOnTr06NGDIUOG2B87ffo0DRo04PLly4wYMYLw8HAAUlNTuXnzJvHx8eTPnx8fHx9AgxRxvIkTJzJy5Ei6d+9O7969adiwIZB5duqKFSt49913OXXqFH5+fhQqVIgdO3aQL18+vv/+ex577DFHdkHkb7l+/TqdOnWiefPmDB8+HNBnsoiIiNxfngqPbF+I9u3bR8+ePTl27Ji91kX58uVp27Yt48ePp0CBAvYAaeDAgRw7doyyZcuSnJxMmzZteOaZZ+jdu3ema4rkdrZ7PSkpiTt37mCM4dlnn2XlypXUrl0bq9WKMQZnZ2fOnj3Ls88+e0+A9Ht3D85FHGHLli0EBwfTokULxo0bZ6+/Zbs37/6M37hxIytWrGDx4sUUKVIEX19flixZQrVq1RzZBZH/SXJysn0Zpr7TiIiISFbyVHgEcPjwYRo2bEiFChV48cUXeeKJJ9ixYwcff/wxZ86coX379ixduhQPDw+Sk5PZtm0bgwYNIi4ujrCwMIYMGWIvkK0vWZJX2O71gwcPMmLECI4fP061atXYv38/n3zyCc2aNSMtLQ0XFxfS09PvCZCGDx/OhAkTHN0NkXtMnz6dIUOGsGnTJpo0aXLfY34fcp44cQJPT0/y589P4cKFs6upIv8ohfkiIiLyR/JUeJSQkECPHj3YuXMnH330ES1atLA/99NPP9GuXTtiYmJ49dVXmTVrFm5ubqSlpfHtt9/SqVMnpk+fTq9evRzYAxHHiYmJoXHjxlitVnx8fLh16xY///wz9evXZ8OGDRQoUMAeHNn+PnfuHHXr1uXGjRts376d+vXrO7obksfs3buXpUuXMm3aNHvtOhtjDC+//DIrVqzgypUrFC5c+J4BtO1eTkhIwNPTM7ubLyIiIiKSI+SpaTOJiYkcOnSIevXq2YMjq9WK1WqlbNmyrF+/nscee4w1a9Zw4MABIKOIdtOmTYmNjVVwJHnO3VuY2wrJR0ZGsnfvXnbt2kWDBg3YuXMnL730EomJiZmCo/T0dMqXL8/u3buZP3++giPJdnfu3GHq1KnMmTOHQYMGkZaWlul5i8WCu7s7aWlp7Nu3D8hcvN22DBMy6iLZ/l0QEREREclrcnV4lJ6eDmQU6gW4cuUKFy9eJD09HWMMxhicnJxwcnIiPT2d4sWLM3ToUK5fv87mzZvt13F2dqZMmTJA5sG0SG5me3/ExsZy9epV0tLSeP7552nVqhX58+enVKlSrF27lpYtW7Ju3Tpeeuklbt++nSlASktLo2LFivTp0wfQ+0eyl7u7O2+99RYdO3bk/fffp3///vYAyXYvBgYG4uTkxJIlSwBwcnLCGEN6erp9BtL48eNZtGgRv/76qyO6ISIiIiLicLk2PLJarTg7O7Nr1y5GjBjB5cuX8fX1pVKlSpw4cYK4uDgsFos9YLLVLqpXrx4A586dA+7dQlw1jiSvsFgsXLp0iccff5ySJUuyb98+GjRoAGS8v9LT0ylYsCArV668b4Bkq4F0N71/JLvVqVOHd955h3bt2jF//nx7gGS7F2vXro2fnx+RkZEMHjwYyLj3bTOO1q1bR1RUFJUrV6ZWrVoO64eIiIiIiCPl2pGck5MTx48fJygoiKioKM6ePcsjjzxCmzZt+PHHH3n77beBjFlFdwdEly9fBqBq1aoOabdITlKyZElef/11vL29OXXqFD/88IP9OdsMI09PT3uAFB0dTceOHUlMTLwnOBJxlJo1azJu3LhMAZJtRqqvry/Tpk2jXLlyzJgxg+DgYBYsWMDhw4cZPXo0gwcP5ueff2bBggUUK1bMwT0REREREXGMXBce3b0sZuPGjRQtWpQZM2ZQv359nJ2d6dGjBzVq1GDx4sX07duXmzdvYrVasVgsHDt2jEWLFuHh4cFTTz0FoJ1HJM+yLduZOXMmPXv2xNnZmenTp3Py5EmcnJxIS0u7J0Bq2rQp69ev59///rejmy+Sye8DpDfeeIOUlBQgY8bpypUref7551m/fj19+/bl8ccfZ/z48RQsWJCtW7dSrVo1B/dARERERMRxcuVua/v372fHjh1s374dFxcXPv74YwD7Mpq9e/fSo0cPTpw4gZ+fH08++SQlS5Zk3bp17NmzhylTptiXL4jkFX+0TbMxhhEjRhAREUHp0qXZsWMHZcqUuWd3tYSEBL799lvatWuXza0XuT/bP3G2ezs2Npa3336bL774gtDQUGbNmkW+fPmAjJmnFy9eZOvWrTg5OVG7dm1q1qypGUciIiIikufluvAoISEBX19frl+/TtmyZXnppZeYNGkSycnJuLm52QfIR44cYebMmaxfv56LFy+SL18+KlasyIABA+jbty+QMYtJNVokL7Dd6xcuXODw4cOcOHECDw8PgoKCKFq0qP29c3eAtH37dsqWLZupOPbdS9X0/hFH+Cv33R8FSCIiIiIicq+HOjzavXs3hw8fJiYmhipVqtChQwd8fHzYvn07rVu35ubNm7Ro0YKvv/4a+M+gwhYg3b59m/j4ePbv30/p0qXx9vamQoUKmY4Vye1s9/revXvp1q0bp0+fts/W8Pb2Zvjw4bRr147KlStjjGHUqFFMnDgx0wyk+xXHFslud39ub9q0idjYWA4fPkybNm2oXbs2FStWtB979OhR3n77bT7//HNeffVVZs+ejaur6x/OwBMRERERyase2vBoyZIlvPXWW1y5csX+WMWKFVm3bh2PPfYY+/fvp0mTJiQkJDBq1Cjeffdd4K+FQho8SF5z5MgRGjZsSLly5ejZsyddunTh+++/Z/r06ezatYvQ0FDCw8MpXLhwpgCpaNGi7Nmzh/Llyzu6C5LH3f3ZPnHiRCZPnmwv3H7nzh0aNWrEsGHDaNmypf2cuwOk1157jZkzZ+Lq6uqoLoiIiIiI5FgP5dSaOXPm0KtXL8qXL8+MGTNYsmQJjRs35vTp0wQHB3Pp0iWeeuoptm7dioeHB+PHj2fq1KlAxi5sdxfVvh8FR5KXJCYmMm7cOAoUKMCYMWMYMGAAxYoVo3Llynh5eZGeno6/vz+FCxe2F9EODw8nLCyMa9euqTi25Ai24Oi9995j5MiRNG7cmM8++4yrV68SHh7Oli1bCAsLIzo62n5OjRo1GDduHC+88ALz5s1j2LBhjmq+iIiIiEiO9tDNPHr//ffp168fXbp0ISwsjMcffxzIKIbdsGFDdu/ezTfffEPTpk2xWCwcPHiQ5557jjt37jBx4kSGDh0KYK/TIpLX3bp1i2rVqtGwYUOWL18OQExMDJMnTyYyMpJ58+YRGhoKwJ07d3B3dwcyZujt3LkTf39/h7Vd5G7r1q2jb9++NG3alLCwMGrWrInVauW5557jwIED3LlzhwoVKjBr1iyCgoLs58XExDB16lTefPNNatSo4cAeiIiIiIjkTA/VzKPZs2fTr18/2rZty+TJk+3B0e3bt3FxccHf3x+r1UpcXBwWi4X09HSeeOIJtmzZgru7O2+99RbTpk0DUHAk8v87d+4ccXFxPPXUUwAcOHCAiIgIIiMjmTt3rj04Anj77bc5fvw4kDFDzxYc/dlsPpEHIavfdVitVpKSkvj6668xxvD6669Ts2ZN0tPT8fPz44cffuCjjz7i3Xff5ezZswwePJgvv/zSfn6dOnVYuHChgiMRERERkSw8NOFRcnIyn3/+OQBJSUn2JQopKSk88sgjAJw+fZrChQtTs2ZNAPsW4k8++SRbtmzBw8ODoUOHEh4e7pA+iORExYoVo0iRImzdupUDBw4wbdo0VqxYwdy5c3nttdfsx61du5apU6eybdu2e66h4vLyT7NarfYlxadPn2blypUsW7aM1NRU+/1XrFgxxowZwzPPPIMxhjZt2vDjjz8SHh5O69atGTVqFM899xynT59m1KhRrFmzxn597bYmIiIiIpK1h2bE5+bmxsqVK2nTpg0bN27k9ddf59SpU+TLl4+UlBSWLl3Kpk2b8Pf3p2rVqvbz7g6QNm3aBEDBggUd1Q2RHKdkyZL4+fmxdu1aXnvtNZYvX86CBQsyBUeHDx9m2rRp1KpVi2eeecaBrZW86O5i2CNHjiQwMJAuXbqwcuVK9uzZA0D+/Pnp378/PXr0AGDhwoX8+9//JjQ0lJCQEPLnzw9A6dKlKVGiBLGxsbz77rskJiY6plMiIiIiIg+Rh67m0Y0bNwgJCeHrr7+mQ4cOREREcOLECV5//XXc3NzYvXs3hQsXvmdXNVuNo19++YVixYo5sAci2ePuXQNt74ekpCSSk5Px9PTEycnJ/nxsbCydOnXixIkTdOrUiZUrV9qvc+DAAaZPn05UVBTvv/8+PXv2dEh/JG+6+7O8ffv2bN68mfr16zN8+HAqVqyIj4/Pfc/r378/S5Ys4cKFCxQuXNj+ePPmzWnevDlly5alWrVq1KpVK1v6ISIiIiLyMHNxdAP+W97e3ixbtoyQkBA+++wzLly4QFxcHG5ubmzbts2+I9TvaxrZ/rto0aIA94RLIrlJfHy8/b0AGff/oUOHeOuttzh27BjlypWjWbNmDBw4kIIFC1KuXDlGjx7N22+/zVdffUXHjh15/vnnuXTpElFRUZw8eZKIiAh7cHR3MCXyTzHG2D+nu3btysaNGxk1ahS9evWiRIkS9hpIvw9KU1NTuXDhArdv3+bw4cM0bNgQgDVr1hAbG0v79u3p3LmzYzolIiIiIvIQeuhmHtncuHGDl19+mXXr1lGgQAE2b97MU089RUpKimpXSJ5Wr149PDw8+Pjjj3n00UcBOHjwII0bNyY9PZ0yZcpw8+ZN4uLiCAoKYsmSJRQpUoSbN29y+PBhRowYwY4dOzDG4ObmRt26de1Lf0DBq2S/Dz74gKFDh9K3b19GjhxJ4cKF/zTAXL58Od27d6dx48b06tWLCxcu8NFHH5GUlMSWLVsoV65cNvZAREREROTh9tCGRwDXr1+nZ8+eREdH07lzZ8aNG0flypU1K0LytKeffpr9+/fTqVMnpk2bRunSpWnXrh0XL15k7NixNGnShISEBEJCQti4cSONGzdm1apVFClSBMiYxbFv3z7i4+MpU6YMhQsXtodQCo7EETp27MiOHTvYtWsX5cqV+0uf8ampqYwbN86+QYKTkxOVK1dm9erV2lVNREREROS/9FCHR5C5BlK7du2YNm0aFSpUUIAkec7dwU6rVq1Yv349nTp1Yvr06XTr1o1WrVoxbNgw+/HJycl069aNNWvW0LhxY6KiovD29r7nurb3kt5T4gjHjh2jbt26BAUFsWrVqj8NMH9/n27YsIGjR49SrFgxGjduTOnSpbOj2SIiIiIiucpDV/Po9+6ugfTFF1/g7OzM5MmT8fX1dXTTRLKVk5MTaWlpuLi48PXXX9OyZUuioqKIj4/nxx9/pGnTpkBGyGRbkrZ8+XK6du3KmjVr6Ny5M6tWrcLb29t+HcA+EFdwJI5gC4tsu2T+2X1osVg4e/YsX3/9Na+++qq9QLaIiIiIiPx9uWL9iS1Aat26NWvWrCE0NJSEhARHN0sk2909I+Obb76hSZMmbNq0ievXrxMfH29/ztnZmfT0dPLly8fy5csJDg7m22+/pUOHDly/ft0eHIk4WlpaGikpKezZs4dffvnlD8MjW4H4PXv2MG/ePI4ePZpdzRQRERERydVyRXgEGQHS4sWLCQgIoGXLlnh6ejq6SSLZIikpCcgYZDs5OXH48GHWrl0LwKZNmwgKCuLOnTuMGDGCixcv4uTkhNVqvSdAatu2Ld9//z1btmxxZHdEMqlTpw4BAQGcO3eOHTt2ZHmcMca+q+bSpUtJTEykYsWK2dVMEREREZFcLdeERwBFihRh48aNDB06FICHvJyTyJ9auHAh9evX56effsLFxYWdO3dSv359VqxYwZUrVwBYu3YtgYGB7Nu3j0GDBnH58uX7BkirVq1i7dq1BAcHO7hXIhlsn+HBwcEkJiYSERHB+fPn7znOarXaZyQtW7aMvXv3EhwcTP78+bO1vSIiIiIiuVWuCo8A3NzcgHuLporkNsnJyRw4cIDDhw/Tp08foqOjadq0KTVq1KBPnz6UKFECq9UKQHR0NM2bN+fTTz9lwIAB9wRIaWlp5MuXj6CgIAD7eSKOZPsM79ixI88//zy7du2iV69enDhxgrS0NCBjqZptuWZ0dDRTpkzBy8uLfv36afmliIiIiMgD8tDvtiaSl12+fJn58+czZswYnJ2dqV27NjNnziQgIADICFHT09Ptg+iWLVuyYcMGXnjhBWbNmsWjjz76p7tXieQEZ8+epWvXruzevZvHH3+cl19+mQ4dOlCsWDGsVitTpkzhk08+IT4+nu+++46aNWs6uskiIiIiIrmGwiORh5Rtdt2GDRsIDAzEGEP16tX597//TfHixTOFQnfvnmYLkNq1a8ecOXMoVaqUI7sh8pedP3+eN998k40bNxIfH4+7uzuFChUiPj6etLQ0/Pz8WLhwIdWqVXN0U0VEREREchWFRyIPuQ8++IAlS5bg4+PDp59+yrPPPktkZCQ+Pj6Zjrs7QGrSpAmbN28mOjqawMBARzRb5G+5ceMGsbGxREZGcvLkSVJSUqhYsSJt27YlICCA4sWLO7qJIiIiIiK5jsIjkYfU3XW94uPjsVgsjB8/nqlTp+Lv709UVBQlS5bMNAPp1q1bFCxYEIDPPvuMDh06OKz9Iv+r1NRUrFarvdadiIiIiIj8MxQeiTxE/qw+0dWrV4mIiGD69On4+/uzatUq+7K0s2fPEhkZSbVq1TKFRqp5JA+bu4NT28/aJEFERERE5J+jrWhEHhK2kOfMmTOsX7+ePXv2UKNGDZ566ikaN24MQPHixXnrrbcAmD59Oi+88AIff/wxN2/e5MMPP2TOnDnMnz8/03UVHMnD5u6QyPazgiMRERERkX+OZh6JPARswdHevXt56aWXuHDhAq6urqSkpFCoUCHeeOMNRo8ebT/++vXrREREMHv2bFxdXfH09OTSpUuMHz/eHi6JiIiIiIiI/BUKj0RyONtynJiYGJo1a0apUqUIDQ2la9euxMXFUa9ePZKSkhg4cCBTpkyxnxcfH89nn33GmjVrsFqtdOnShZCQEEBL1UREREREROSvU3gk8hC4fPkyXbp04datW7zzzju0bdsWgKlTpxIWFkbhwoWJj49n2LBhTJo0yX6eLXi6efMmXl5egIIjERERERER+e9oBCmSQ6Wnp9t/3r9/Pzt27CAkJMQeHI0aNYqwsDCGDBnCsmXLKFiwIJMnTyYsLMx+XlpaGoA9ODLGKDgSERERERGR/4pGkSI5yOLFi+nfvz8Azs7O9gCpUKFCvPrqqwwaNAiAWbNmMWHCBHr16kXfvn0JDAzkvffeA2D27Nm88cYbALi6uma6vooKi4iIiIiIyH9Ly9ZEcoi5c+fag6PfLz9LTU0lMTGRQoUKcezYMYKDgylUqBALFiygZs2aAERHRxMSEkKBAgW4dOkSW7duJSAgwCF9ERERERERkdzDxdENEJGM5WTffvstAG5ubkyePBnAHiC5uLhQqFAhAOLi4jhx4gTvv/8+NWvWJD09HWdnZ65du0blypWZPHkyFy5cUHAkIiIiIiIiD4TCI5EcwGKx0K5dOw4ePEiDBg1YvXo1kydPxsnJiQkTJmCxWEhNTcXV1ZWbN28CcObMGSBjedvRo0f55JNP8PT0pFGjRvbrqji2iIiIiIiI/K8UHonkEB06dGDs2LEYY9i1axcBAQH2mUcTJkyw1y+qX78+xYsXZ968ebi6ulK1alU++eQTNm/ezPz58zNdU8GRiIiIiIiI/K9U80gkB7AtPVu4cCGhoaFs3ryZEiVK8PTTT/Pbb78xfPhwJkyYYD9+27ZtBAcHc+3aNSBjN7UxY8YwcOBAIGMZnIpji4iIiIiIyIOg8EjEwe4Oeo4ePUqLFi2oV68eq1evZv/+/TRq1IjExMR7AqS4uDjWrVuHh4cH5cqVo379+oCWqomIiIiIiMiDpfBIJJstXryYEydOEBoaSqlSpXB3d88U+IwdO5Z3332X3bt3U7duXQ4cOECjRo347bffePPNN5k4cWKW11ZwJCIiIiIiIg+aRpki2WjOnDn07t2byZMn0759e3r16sUPP/zAnTt37Me0adOGwoULM3PmTBISEnjyySfZunUrHh4eREREMGrUKPuxVqs10/UVHImIiIiIiMiDppGmSDZJSUnh888/B6Bq1ao4OTlx4MAB6tSpQ/fu3YmKigLgySefpG3btmzcuJHffvsNgMcff5ytW7dSqFAhJkyYwKBBgwCFRSIiIiIiIvLP08hTJJvky5ePyMhIWrduzcmTJylbtiyTJk1i0qRJ7Ny5kxdffJFGjRqxYMEC+vbtS0JCAtOnTwcy6iI9/vjjbNq0CYBSpUo5sisiIiIiIiKSh6jmkUg2u3HjBl27dmXDhg20b9+epUuX8uuvv7J+/XomTpzITz/9RKFChbh27RrPPPMMUVFR+Pj42Hdku3btGkWLFnV0N0RERERERCSP0MwjkWzm7e3N8uXLadWqFZ9//jk9evQgPT2d3r17s2PHDhYuXEhAQAAAzZs3p3DhwgA4OzsDUKRIEeDeekciIiIiIiIi/wTNPBJxkBs3bhASEsLXX39Nu3bteO+996hUqRLGGCwWC/v378fX19ceHomIiIiIiIg4gsIjEQf6fYA0depUfH19Hd0sERERERERETstWxNxIG9vb5YtW0arVq344osvGDJkCGfPngUyimSLiIiIiIiIOJrCIxEH+32AFBYWxpkzZ7BYLI5umoiIiIiIiIiWrYnkFDdu3OCVV14hOjqaJk2a8Nlnn+Hp6enoZomIiIiIiEgep5lHIjmEt7c3ixcvJiAggJYtWyo4EhERERERkRxBM49Ecpjk5GTc3NwA7DuviYiIiIiIiDiKwiORHErBkYiIiIiIiOQEWrYmkkMpOBIREREREZGcQOGRiIiIiIiIiIhkSeGRiIiIiIiIiIhkSeGRiIiIiIiIiIhkSeGRiIiIiIiIiIhkSeGRiIiIiIiIiIhkSeGRiIiIiIiIiIhkSeGRiIiIiIiIiIhkSeGRiIiIyH/h3LlzWCwWypcv7+imZLJ582YsFguNGjVydFNEREQkl1F4JCIiIrna9u3bCQ0NpWrVqnh5eeHm5kbp0qVp3bo1CxcuJDEx8YG91owZMxgzZgy//vrrA7umiIiIiKMpPBIREZFc6fbt27z44osEBASwYMECzp8/T5kyZahduzbGGNatW8err75K5cqVOXLkyF++rqurK1WqVKFixYr3PDdjxgzGjh3rkPDokUceoUqVKpQtWzbbX1tERERyNxdHN0BERETkQUtNTaV58+Zs376dRx99lIiICDp16kT+/Pntx/zwww/MmjWLRYsWcfr0aWrVqvWXrl26dGmOHz/+TzX9b/Pz88uR7RIREZGHn8IjERERyXXGjh3L9u3bKVGiBDt37rxvfaLq1aszb948unfvjpOTJmOLiIiIZEXflERERCRXuXnzJrNmzQIylpH9WWHrgIAA/P39ARgzZgwWi4UxY8bwyy+/0L9/f8qXL4+rqyuvvPIKcP+C2UuWLMFisXD+/HkAKlSogMVisf/ZvHlzpte8ceMGI0eOpGbNmhQoUABPT0/q1avHggULsFqt97TxlVdewWKxsGTJEs6ePcsrr7xC6dKlcXFxYcyYMcAfF8zetWsXw4YNo27duhQvXhw3NzfKlClDSEgIR48e/fP/qSIiIpKnaeaRiIiI5Crr1q0jISGBYsWK8cILL/yta/zyyy/UrVuXixcvUqNGDby8vHB2ds7y+BIlSvDss8+yb98+kpOTqVu3Lm5ubvbnvby87D8fPXqUFi1acPHiRfLly0elSpVITk5mz5497N69mw0bNrBq1SosFss9r3PixAn+9a9/kZSURI0aNShYsOB9j/u97t27c/r0aYoUKULJkiUpVaoU586d4+OPP+bTTz/lq6++0i5tIiIikiWFRyIiIpKr7NixA4Bnn30WF5e/91Xngw8+wM/Pj+3bt+Pj4wPAnTt3sjy+VatWtGrVivLly3P+/HmioqLuO+MpMTGRdu3acfHiRQYMGMC4ceMoWLAgkFGDqXPnzqxevZq5c+fSr1+/e85/7733CAoKYvHixXh7e/9pu2xGjx5NQEAAvr6+9sfS0tL46KOPeO211+jduzenTp3S8j0RERG5L31DEBERkVzl4sWLQMbSsb/LxcWF1atX24MjAHd39/+5bR9++CGnT5+mQ4cOzJw50x4cQUYNpuXLl2OxWJg2bdp9zy9WrBjLly+3B0d/tV09evTIFBxBRh979+7NSy+9xJkzZ9i1a9ff7JWIiIjkdpp5JCIiIrlKQkICAAUKFPjb12jWrBmlSpV6UE2yW7NmDQB9+vS57/O1a9emfPnynDlzhp9//jlTeAXQsWPHv92v48ePExkZyZEjR7hx4wZpaWkA/PTTTwDExMTYaz+JiIiI3E3hkYiIiOQqnp6eQMYSsb+rWrVqD6o5mRw5cgTIWEY2YcKE+x5z7do1IGMG1e/Do7/brokTJzJq1Kj7FuO2uXHjxt+6toiIiOR+Co9EREQkVyldujQAZ8+e/dvX+F9mLf2RmzdvArB///4/PTYpKemex/5Ou7Zu3cqIESNwdnZm4sSJtG3blnLlyvHII49gsVgYNWoU48ePJzU19b++toiIiOQNqnkkIiIiuYpt6dWOHTvsS7NyCg8PDwBOnTqFMeYP/zyo3c8++eQTAMLCwhg+fDjVq1enQIEC9l3aLly48EBeR0RERHIvhUciIiKSqwQGBuLh4cHVq1dZvXp1tr62LZDJSvXq1QGIjY3NjuYAcO7cOYAs6xnFxMRkW1tERETk4aTwSERERHKVQoUK8cYbbwAwaNAge3iSle3bt7Njx44H8tr58+cH7r/kDCA4OBiAWbNmYYx5IK/5V9t05cqVe57bsGGDwiMRERH5UwqPREREJNcZM2YM9evX58qVK9SvX59ly5Zx586dTMecPHmSfv360ahRI65evfpAXtfX1xeALVu23Pf5vn374uvry3fffUe3bt2Ii4vL9Pxvv/3GqlWrGDx48ANpD0BAQAAAkyZNylQHau/evfTq1Qt3d/cH9loiIiKSOyk8EhERkVwnX758bNiwgY4dO3L58mV69OiBt7c3tWrVws/PDx8fH6pUqcLcuXN59NFHqVSp0gN53RdffBGA//f//h+1atWiUaNGNGrUiEOHDgEZNY/WrVtHhQoViIyMxMfHh+rVq1OvXj2qVKlCoUKFePHFFx/YTCiA0NBQfH19OX36NFWrVqV27dpUrVoVPz8/vLy8eP311x/Ya4mIiEjupPBIREREciUPDw9Wr17N1q1b6d27N2XKlOHcuXPExMRgjCEoKIhFixZx8uRJatas+UBeMyQkhJkzZ1K7dm1Onz7Nli1b2LJlC7/++qv9mKpVqxITE8OkSZN4+umnuXjxIocOHSIlJYWGDRsyZcoUVqxY8UDaA1CwYEG2bdtGjx49KFiwICdOnCAlJYXBgwezc+dOPD09H9hriYiISO5kMdm14F5ERERERERERB46mnkkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZUngkIiIiIiIiIiJZ+v8AQjK9N7po96QAAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# Create a bar plot with error bars for the average values of \"s\" and \"f\" for each criterion\n", - "\n", - "plt.figure(figsize=(12, 8))\n", - "bar_width = 0.1\n", - "index = np.arange(len(criteria))\n", - "\n", - "\n", - "plt.bar(index , list(average_s.values()), bar_width, label=f\"success ({len(task['s'])} samples)\", color=\"darkblue\", yerr=[(avg - conf_interval_s[key][0]) for key, avg in average_s.items()], capsize=5)\n", - "plt.bar(index + bar_width, list(average_f.values()), bar_width, label=f\"failed ({len(task['f'])} samples)\", color=\"lightblue\", yerr=[(avg - conf_interval_f[key][0]) for key, avg in average_f.items()], capsize=5)\n", - "\n", - "plt.xlabel(\"Criteria\", fontsize=16)\n", - "plt.ylabel(\"Average Value\", fontsize=16)\n", - "plt.title(\"Average Values of 3 different baselines cases with 95% Confidence Intervals - math problems \", fontsize=12, pad=10) # Adjust titlepad to move the title further above\n", - "plt.xticks(index + bar_width / 2, criteria, rotation=45, fontsize=14)\n", - "plt.legend(loc=\"upper center\", fontsize=14, bbox_to_anchor=(0.5, 1), ncol=3) # Adjust legend placement and ncol\n", - "plt.tight_layout() # Adjust subplot parameters to fit the labels\n", - "plt.ylim(0,5)\n", - "plt.savefig(\"../test/test_files/agenteval-in-out/estimated_performance.png\")\n", - "plt.show()\n" - ] + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/vscode/.local/lib/python3.10/site-packages/scipy/stats/_distn_infrastructure.py:2241: RuntimeWarning: invalid value encountered in multiply\n", + " lower_bound = _a * scale + loc\n", + "/home/vscode/.local/lib/python3.10/site-packages/scipy/stats/_distn_infrastructure.py:2242: RuntimeWarning: invalid value encountered in multiply\n", + " upper_bound = _b * scale + loc\n" + ] } - ], - "metadata": { + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "import scipy.stats as stats\n", + "\n", + "# computing average and 95% interval for failed and successful cases on all criteria\n", + "try:\n", + " # convert the criteria to dict type if it is already not\n", + " dictionary_for_eval = eval(open(criteria_file, \"r\").read())\n", + "except:\n", + " pass\n", + "\n", + "criteria = list(dictionary_for_eval.keys())\n", + "nl2int = {}\n", + "for criterion in dictionary_for_eval:\n", + " score = 0\n", + " for v in dictionary_for_eval[criterion][\"accepted_values\"]:\n", + " nl2int[v] = score\n", + " score += 1\n", + "print(nl2int)\n", + "\n", + "average_s = {}\n", + "average_f = {}\n", + "\n", + "conf_interval_s = {}\n", + "conf_interval_f = {}\n", + "\n", + "for criterion in criteria:\n", + " task = {\"s\": [], \"f\": []}\n", + "\n", + " for game in outcome:\n", + " try:\n", + " tmp_dic = eval(outcome[game][\"estimated_performance\"])\n", + " if outcome[game][\"actual_success\"] == \"false\":\n", + " task[\"f\"].append(nl2int[tmp_dic[criterion]])\n", + " else:\n", + " task[\"s\"].append(nl2int[tmp_dic[criterion]])\n", + " except:\n", + " pass\n", + "\n", + " average_f[criterion] = np.mean(task[\"f\"])\n", + " average_s[criterion] = np.mean(task[\"s\"])\n", + "\n", + " conf_interval_s[criterion] = stats.norm.interval(0.95, loc=np.mean(task[\"s\"]), scale=stats.sem(task[\"s\"]))\n", + " conf_interval_f[criterion] = stats.norm.interval(0.95, loc=np.mean(task[\"f\"]), scale=stats.sem(task[\"f\"]))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The final plot would be saved in `../test/test_files/agenteval-in-out/estimated_performance.png`" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { "colab": { - "provenance": [] + "base_uri": "https://localhost:8080/", + "height": 695 }, - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - }, - "vscode": { - "interpreter": { - "hash": "949777d72b0d2535278d3dc13498b2535136f6dfe0678499012e853ee9abcab1" - } + "id": "zqa86vwgEGCT", + "outputId": "248cd0bc-0927-4d9f-b911-088bd76acf5d" + }, + "outputs": [ + { + "data": { + "image/png": "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ybEPp/j1euDAAX333Xf2OpOq/8KFC+rdu7fy588vHx8fFS1aVO+9957DmVO395M0btw4FSlSRD4+Pvrzzz8lufcaxdfxyy+/qE+fPgoJCVFAQIAef/xxnT592mE97d69Wz///LO9Vnf7Oxo7dqzCwsLk5+enunXrateuXQ7P//777+rcubMKFy4sX19f5c6dW127dtXZs2cd2l2+fFm9e/dWwYIF5ePjo5w5c+rhhx/W9u3bHdpt3rxZTZo0UVBQkPz9/VW3bl398ssvSdZ5Z58z8a/d119/rWHDhilfvnzy9fXVQw89pP379zuN78583V0GV44dO6Zu3brZ9+1ChQrpxRdf1I0bNyRJ586dU9++fVW2bFllzpxZgYGBeuSRR7Rz506naU2YMEGlS5eWv7+/smXLpkqVKjkdX9w9XrkzrdsZYxQcHOxwCXBcXJyyZs0qLy8vh33xvffeU8aMGe2Xvd7Zh5PNZlNUVJRmzZpl3y7vPAPvwoUL6ty5s7JmzaqgoCB16dJFV69eTXhFS9q1a5cuXLigdu3aOczvscceU+bMmTV37lyX4127dk3Xr19P8DlfX1/7DxrZs2eXJHstixYt0o4dOxQREZFobXdOc8SIEQoPD9eoUaNcHgOfeeYZValSxf44qWOr5P62X7BgQfsPQyEhIQ7ve676cHL3GCq5tz/Fbw/79+936zX+/PPPVaVKFfu2WqdOHaczsX744QfVrl1bAQEBypIli5o2bardu3e7rDEp7taX1Hbszr4Y/5rNnTtXb731lvLmzSt/f3/7ZfmzZs1yqm/58uWy2WxaunSpJOnQoUN66aWXVKJECfn5+SlHjhx64oknHPq6S8i+ffvUunVr5c6dW76+vsqXL5/at2+vixcverTuXOncubMyZ86sw4cP2/fFvHnzauLEiZKkP/74Qw0aNFBAQIDCwsKcjkPuHCPXrFmjypUrS5K6dOni8J59uz///FP169eXv7+/8ubNq/fff9+tZbj9c2eJEiXk6+urihUrau3atQ7t4redP//8U0899ZSyZcumWrVqSbr1w9K7775rf88vWLCgBg4cmOC+tGLFCpUvX16+vr4qVaqUFixY4FatydkH//77b3Xo0EFBQUEKCQnR22+/LWOMjhw5ohYtWigwMFC5c+fW6NGjneaT3PcQIF0zAFJNeHi46datmzHGmLVr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M2fO6OzZs2rcuLH27dunY8eOSbrVp8fu3bu1b9++ZM3j+++/V5UqVeynj0tS5syZ9dxzz+ngwYP2S8Y8UapUKa1cuVKLFi1S//79FRAQ4NZd6r7//nuFhoaqTZs29mH+/v567rnnPK4lId98841q166tbNmyOWwrDRs2VGxsrNOp961bt1ZISIj9cXJeo3jPPfecw+U4tWvXVmxsrA4dOnRXy9KyZUvlzZvX/rhKlSqqWrWqvv/+e/uw27fZ69ev68yZM/b+tG7fL7JmzarNmzfr+PHjLuf122+/ad++fXrqqad09uxZ+3JHRUXpoYce0tq1a506c3dHly5dHPqjqV27tqRblyYld75JLYMrcXFxWrRokZo1a6ZKlSo5PR//uvn4+Nj7aomNjdXZs2eVOXNmlShRwmk9Hj16VFu3bnU5v+Qcr5KaVkLit68NGzZIktatW6fatWurdu3aWrdunaT/XdYWv7499cILLzjN++zZs7p06VKC4wQHB6tt27aaNWuWRo8erX///Vfr1q2zH4elW5ezxfvll1/Uq1cvNW/eXC+88IJ+/fVXlSlTRgMHDnRo17dvXx07dkwbN27UsWPH9OSTT+r48eMaMWKExo0bp5s3b+qVV15RgQIFVKVKlSQvBY1fhixZsri1LpJ7bE1q208Od4+hnuzHSb3GixYtUlxcnN555x2n/ozi95+VK1fqwoULevLJJx22eS8vL1WtWtXps0NyeLINSp59dujUqZPDMVW69fkhJibG4VKqFStW2C8bjXf7eDExMTp79qyKFi2qrFmzJvoZJSgoSNKtS/SSulzVCs8++6z9/6xZs6pEiRIKCAhQ27Zt7cNLlCihrFmzOmyr7h4jk5I5c2aH/toyZcqkKlWquL1fVK9eXRUrVrQ/LlCggFq0aKHly5c7dX9w57YT/955512JX3vtNUlyujw2T548evzxx+2PAwMD1bFjR+3YsUMnTpxwWZ8n++Dtr4mXl5cqVaokY4y6detmHx7/Wt2+njx9DwHSKwInIBXExsZq7ty5ql+/vg4cOKD9+/dr//79qlq1qk6ePKnVq1dLutVZbOvWrbV48WL7deoLFixQTEyMwwemffv2affu3QoJCXH4K168uKT/dXAar1ChQi7rWrp0qapVqyZfX19lz55dISEhmjx5skN/BIcOHVKGDBmcpnHn3fVOnz6t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QKe7+91p3rx5ql+/vqZNm+Yw/MKFC06/MgcEBKhdu3Zq166dbty4oVatWmnYsGEaMGBAso9XiU0r/o5srtSuXVvvvfeeVq1apeDgYIWHh8tms6l06dJat26d1q1bp8ceeyzJ+afkFy/p1i/38b/ex5+x1Lp16yTHiz9zLaHAzBijnj17qlevXvZt6Pjx48qTJ4+9TZ48eZwuf71drVq1lC1bNn355ZcaOHBggl/w4t3LY6urebtzDE2J/bhIkSKKi4vTn3/+meAX6Pj55syZ854eP+K52o6t+uwg3QqcIiIiNH/+fOXKlUuXLl1S+/btHdrMmzdPnTp1criT2PXr1926i6sklS1bVmXLltVbb72lDRs2qGbNmvr44481dOhQl+07duzocAZjQuGKVdw9Rqb0MSWh90V/f/8kA/b4z5379u2zn5koSSdPntSFCxec9uH4M55vX6a///5b0v/u0nune/1e6ul7CJAecUkdcI9du3ZNCxYs0GOPPaY2bdo4/b388su6fPmy/VbuGTJkUJs2bfTtt99q9uzZunnzpsPldNKtMwiOHTumTz/91OX8oqKikqzLy8tLNpvN4eyegwcPatGiRQ7t4s8emTRpksPwCRMmOE2vdevWmj9/vssvje6cRi7d+jD2+OOP6/vvv9fkyZMVEBCgFi1aOMxHcvz16MaNG071uRIWFiYvLy+n/oHuHDdnzpyqV6+epkyZosjIyESX5c7b2mfOnFlFixZN8Na98R599FFt2bJFGzdutA+LiorSJ598ooIFCyZ6WURCLly4oJiYGKfhU6dOlSSXfePcWdPx48c1b948+7CrV6/qk08+SXYtSWnbtq02btyo5cuXOz134cIF3bx5M9Hxk/MaJUdAQIDbXzziLVq0yOEL85YtW7R582Z7uOJqm5WkcePGOTyOjY11CgVz5sypPHny2LenihUrqkiRIho1apTLfrk8Xe6kuDtfd5bBlQwZMqhly5b69ttvtW3bNqfn49edl5eX03r85ptvnAKLO/fLTJkyqVSpUjLGKCYmJlnHq6SmlZjatWsrOjpa48aNU61atexfiGrXrq3Zs2fr+PHjbvXf5Ml26akBAwbo5s2bevXVV+3DXG1Xly9f1rhx4xQcHOzQV8vtZs6cqSNHjjj8aJIrVy57+BMTE6P9+/e7PNsmnr+/v15//XX99ddfev31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JF27dk1vvPGG8ufPb2/76aefJnu5d+3apW3btql169aJ9i01bNgw7d69W9OnT/fo+OHufnH8+HENGjRI1apVU86cOeXj46OCBQvqpZde0qlTp5ym27lzZ9lsNv37778aNWqUihcvLj8/P5UqVcoeyty4cUNvvvmmChYsKF9fXz3wwAP64YcfnKYV37/W9evX9cYbb6hAgQLy9fVVyZIlNWHCBBlj3F7eU6dO6dVXX1XRokXl4+Oj4OBgtW7dWrt27XJqu2/fPnXp0kWFChWSj4+PsmfPrnLlyql3795O82zatKn8/f01c+ZMt2sBgLSES+oAAHdl8uTJeumllxQaGqrHH39cOXLk0IkTJ7RlyxYtXLhQrVu39njae/fuVf369RUZGalatWqpZcuWioqK0u7duzV8+HD17fu/SwLnz5+vp556SsYYNWvWTCVKlNCpU6e0efNmTZs2Tc2aNbO3HTBggEaOHKm8efOqVatWCgoK0rp169SvXz9t3rxZ33zzjUPb999/X0WKFNFTTz2lLFmy6NixY1q/fr1WrVpl73TaivWwevVqSVK1atU8Xmcpwd11cO7cOfXu3Vu1a9fWo48+qmzZsunff//VkiVL9MMPP2jt2rWqXLmy0/QXLlyoFStWqGXLlqpZs6a+++47DR06VMYYBQUFaejQoWrRooXq1aun+fPnq3///sqVK5c6duzoNK0xY8Zo9erVateunZo2bapVq1Zp3Lhx2rRpk9auXStvb+9ElzU6OlpNmjTRmjVrVL58eXXr1k0xMTH67rvv1KJFC02YMEEvv/yyJMkYo8aNG2vz5s2qWbOmmjRpogwZMujQoUNasmSJnnnmGYWFhTlMv3r16lq1apU2bNigRo0aefiK4G7Fb7Px/eP07t1bkpQ1a1ZJnm/L7krOMSguLk7NmzfXqlWrVLZsWT311FM6e/asXn311UTPUnLFnWPM9u3bNWzYMA0ZMkSlSpVK9rIlZ79Yu3atRo8erYceekhVq1aVt7e3duzYocmTJ2v58uXavn27goKCnObRp08fbd68Wc2aNZOXl5fmzp2rp556StmyZdOECRP0559/qmnTprp+/bq++OILtWjRQn/99ZfLM0fbtm2rHTt22I/R8+fPV8+ePXXw4EGNHj06yeX9559/VK9ePR09elSNGjVSy5YtderUKc2fP1/Lly/X6tWrVbVqVUm3ArYqVaooKipKTZs2Vbt27RQVFaV9+/Zp0qRJGjVqlDJm/N/Xs0yZMqlixYrauHGjoqKiuKwOQLpD4AQAuCtTp05VpkyZ9NtvvylnzpwOz509e/aupt2hQwdFRkbqk08+Uffu3R2eO3r0qP3/kydPqlOnTvL29ta6dev04IMPJth25cqVGjlypBo3bqz58+fbP8AbY/TSSy/p448/1vz58+1fPqZOnao8efLo999/l7+/v8N0z507Z//fivXwyy+/KEOGDCpfvrxb7e8Vd9dBtmzZdPjwYeXNm9ehze7du1WtWjUNHDhQK1eudJr+Dz/8oF9++cX+BT4iIkJFixbV2LFjFRgYqB07dqhw4cKSpL59+6po0aIaNWqUy8Bp+fLl2rp1qx544AFJt17XDh066IsvvtCHH36o1157LdFlHTJkiNasWaO3335bERER9rNALl++rAYNGui1115Tq1atlCdPHu3atUubN29Wy5YttXDhQofpREdHKyYmxmn6lSpVknTrtSZwSj316tVTvXr17GeO3HlmkqfbsjuSewz67LPPtGrVKjVp0kRLly61n3HUq1cv+/bkrl9++UWSVLFiRZfPR0dHq2PHjipfvrz69+/v0fIlZ79o0KCBTpw4ocyZMzu0++yzz9SpUyd99NFHevPNN53m8ddff+n3339XSEiIJKlLly6qWrWq2rdvrzJlyuiPP/6wr9fGjRurXbt2Gj9+vD788EOnaf3999/atWuXPdiKiIhQ1apVNXbsWD355JNJruOOHTsqMjJSy5YtU+PGje3D33rrLVWqVEndu3fX77//LulWmHXhwgWNGzdOvXr1cpjOuXPnHMKmeJUqVdK6deu0ZcuWZAeMAJDauKQOAHDXvL29XZ45kiNHDo+nuWXLFm3btk116tRxCpskKV++fPb/Z82apaioKL322mtOYdOdbT/66CNJ0ieffOLwa7HNZtPIkSNls9n05ZdfOoyfKVMml5eVZM+e3eHx3a6Ho0ePKmvWrPLx8XGr/b3kzjrw8fFx+oIuSaVLl1b9+vW1du1alyFMhw4dHM4WyZIlix577DFdvXpVL774oj1skqT8+fOrVq1a+vPPP3Xz5k2naXXs2NEeNkm3Xtfhw4fLy8sryctS4uLiNHnyZBUpUsQhbIqv6Z133tGNGze0YMECh/H8/PycpuXj4+P0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e998s2fP1pQpU1SnTh0VKVJEgYGB+vPPP/X9998re/bs6tKli8O0//nnHx04cEAvvvii9QsOAPcAgRMA4K6MGDFCy5Yt05YtW/Ttt98qICBARYoU0eTJk9WtWzeHtu+++64yZcqkadOm6eOPP1bBggX19ttvq1mzZpo/f77TtIsVK6bt27drxIgR+vbbbzVu3DhlzpxZxYoV01tvveXQ9vHHH9fmzZs1YsQI/fzzz1qyZImCg4NVvnx5de/e3aHtkCFDVKdOHX344YdavXq1Lly4oBw5cqhQoUIaPHiwnn76aUlSQECA3nvvPa1evVrr1q3TqVOnlC1bNpUoUUIjRoxQ+/btPVoPCSlYsKAaN26sefPmacKECfYgJ96yZcscfi2XZO8/KX782wOn/fv3O93W+59//rGHe2FhYUkGTslZB4899pjmzZun4cOH6/PPP5e/v78aNGighQsXasiQIW6tg7vVp08fNW/eXOPGjdP+/fuVPXt29erVy77tJcXHx0c//PCDpk2bps8++0zz589XdHS0cuXKpVKlSumFF16wX9pSqVIlvf7661qzZo2+++47XbhwQblz51bDhg3Vr18/VatWzWHaa9eu1eHDhzVu3LiUWHRYKKW3ZXePQdKtYGbx4sWKiIjQnDlzNH78eBUpUkRjx45VsWLFkhU4Zc6cWR06dNAnn3yiyMhIj+6yl5Tk7BcjRoxQ9uzZNXPmTE2aNEm5cuXSk08+edd3ykuOr7/+WoMGDdKXX36pkydPqlChQvrwww/d7pOpUKFC2rFjh8aMGaNFixZpxowZ8vLyUmhoqOrUqaM2bdrY2z755JO6fv26fvnlF23ZskXR0dHKly+fXnzxRfXr18+pL6nPP/9ckvT8889bt8AAcA/ZzJ3n//8HXLp0SUFBQbp48eJd35YbAJJy/fp1HThwQIUKFXLrsikgMatXr1bDhg31+eefO3zpROIGDx6siIgI/fTTT6pXr15ql+NShw4d9MMPP+iff/6xd3QP3Gt79+5VmTJlNHjwYL355pupXU6qqVevnn7++WenS6HTips3b6pYsWIqVKiQfvzxxyTb81kEwL3kbuZCH04AAKQhDz30kJo0aaKhQ4cqLi4utcuBRf7++2/NnTtXb731FmETUlWJEiX07LPPauzYsbp8+XJql4MEzJo1S4cOHUryLFQASMu4pA4A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AAAAAMA95lGn4QEBATp9+nSS7Q4cOKDs2bMne/o///yzevToocqVK+vmzZsaOHCgGjVqpD///FMBAQGelAwAANxw/tRJnT990mFY9PXr9v8P/LVLPr6+TuNlC8mlbDlzpXh9AAAASB88CpzKli2rX3/9VWfOnFFwcLDLNocOHdLOnTv18MMPJ3v6y5Ytc3g8c+ZM5cyZU7/++qvq1KnjSckAAMANK76ara8njknw+beebulyeNsefdTuFec+HQEAAHB/8ihw6tChg9auXatnn31WX3zxhfz9/R2ev3Hjhl566SXFxMSoQ4cOd13kxYsXJSnBs6Wio6MVHR1tf+zJZXwAAEBq1O4ZVW7QKNnjZQvh7CYAAAD8j0eBU5cuXTRnzhwtWbJE4eHhatKkiSRp586d6tmzp5YsWaLDhw+rYcOGateu3V0VGBcXp969e6tmzZoqU6aMyzYjRoxQRETEXc0HAABI2XJyaRwAAADunkedhnt5eenbb7/Vk08+qWPHjmnq1KmSpB07duijjz7S4cOH1bp1ay1YsOCuC+zRo4d27dqluXPnJthmwIABunjxov3vyJEjdz1fAAAAAAAAeMajM5wkKXPmzJozZ47efvttff/99/r3338VFxen/Pnz65FHHlH58uXvuriXX35ZS5cu1dq1a5UvX74E2/n4+MjHx+eu5wcAAAAAAIC753HgFC88PFzh4eFW1GJnjNErr7yihQsXas2aNSpUqJCl0wcAAAAAAEDK8eiSum+//VZxcXFW12LXo0cPff755/riiy+UJUsWnThxQidOnNC1a9dSbJ4AAAAAAACwhkeBU4sWLZQ/f369/vrr+uuvv6yuSZMnT9bFixdVr149hYaG2v+++uory+cFAAAAAAAAa3kUOFWoUEGRkZH64IMPVKZMGdWoUUOffvqpLl26ZElRxhiXf507d7Zk+gAAAAAAAEg5HgVO27Zt0++//67evXsrODhYmzZt0gsvvKDQ0FB17NhRP/74o9V1AgAAAAAAIJ3wKHCSpDJlymjMmDE6duyYFixYoMcee0wxMTH6/PPP9fDDD6tQoUIaMmSIDh06ZGW9AAAAAAAASOM8DpziZcyYUS1bttTixYt17NgxjRo1SqVKldKhQ4cUERGhokWLWlEnAAAAAAAA0om7DpxuFxISoj59+mjLli3q1auXjDEpejc7AAAA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nUgmcvPmTV599VXCw8Np2LAha9euJU+ePLZuloiIiIiIiMhfohFOIpmIh4cHixcvpk6dOjRv3lxhk4iIiIiIiGRJGuEkkgklJSXh7OwMYF2xTkRERERERCSrUOAkkokpbBIREREREZGsSFPqRDIxhU0iIiIiIiKSFSlwEhERERERERGRDKXASUREREREREREMpQCJxERERERERERyVAKnEREREREREREJEMpcBIRERERERERkQylwElERERERERERDKUAicREREREREREclQCpxEREQkW9q+fTu9evWiTJkyuLq64uzsjKenJ02aNGHGjBn88ssvf+l8ly5dwmQy4e3t/fc0+Cnt3r0bk8lEgwYNbN0UERERyUYUOImIiEi2cuPGDZo0aULTpk1ZsmQJKSkp+Pn5ERgYSPny5Tlw4ADDhg2jRIkSHDp0KEPe09vbG5PJxKVLlzLkfCIiIiKZnYOtGyAiIiLyrCQkJFCnTh3OnDlDuXLlmD9/PnXr1k23T1JSEkuXLuW9994jNjb2T5+7SJEiREdH4+jomNHN/p9Ur16d6OhocuXKZeumiIiISDZiMgzDsHUjRERERJ6FHj16EBYWhre3N0ePHsXDw+M397127Rq3bt2ibNmy//P7ent7c/nyZS5evJjpptyJiIiI/B00pU5ERESyhQsXLrB8+XIAQkNDfzdsAihUqJA1bBo/fjwmk4nx48fz73//m9dee42iRYvi6OjIq6++Cjy5htOSJUswmUxcvnwZAB8fH0wmk/W/3bt3p3vPmJgYhg0bRvny5cmVKxd58uThpZdeYs6cOaSmpj7WxldffRWTycSSJUuIioqic+fOeHp6Ym9vz/jx44Hfr+G0Y8cOBg0aRJUqVcifPz/Ozs54eXnRuXNnIiIi/sTfqoiIiMiTaUqdiIiIZAvh4eGkpaXh5uZG69atn+oc586do2rVqjg5OVG7dm0MwyB//vy/uX+pUqXo2bMnX331FXfv3iUwMBAXFxfr9sKFC1t/3rt3L23btiU+Ph5vb2+aNGlCUlIShw8fZtCgQWzYsIHw8PAnTtk7cOAAAwYMwNPTk3r16pGYmEiePHn+sD8DBgzgypUrVKxYkdq1a+Pg4MDp06dZtWoVa9as4csvvyQwMPAv/i2JiIiIKHASERGRbOLIkSMAvPDCC9jb2z/VOZYvX063bt1YuHAhzs7Of7h/nTp1qFOnDrt37+bu3btMmzbtiVPqrl69Svv27bl16xbz5s2jf//+2Nk9GIgeFxdHp06d2LZtG5MnT2bcuHGPHb9gwQJGjRrFpEmTrMf9GdOmTaN+/fq4u7une33dunV07NiR/v374+/vT86cOf/0OUVERERAU+pEREQkm/jll18AKFiw4FOfw8PDgzlz5vypsOmvmDlzJnFxcbz55pu8/vrr6UKjfPnysWzZMhwdHZkzZw5PKr9ZpkwZJk6c+JfCJoC2bds+FjZZXu/YsSNxcXHs2rXrr3dIREREsj2NcBIRERH5kxo3bkzevHkz/LwbN24EoHPnzk/cXqRIEUqXLs2PP/7IuXPnKFOmTLrtbdu2fepRWzExMWzcuJHTp0+TkJBgrRV16tQpAM6cOYO/v/9TnVtERESyLwVOIiIiki0UKFAAgOvXrz/1Of6uFeYuXLgAQN26df9w319++eWxwOlp2/X+++8zadIkUlJSfnOf27dvP9W5RUREJHtT4CQiIiLZQrVq1QgLC+PYsWOkpaU91Yigv6uWkdlsBqBDhw7kzp37d/fNly9fhrRrzZo1jB8/HhcXF+bMmUPDhg157rnnyJkzJyaTidGjRzN58uQnTuETERER+SMKnERERCRbaNmyJcOGDePWrVusX7+edu3a2bpJVkWLFuXcuXOMHDmSF1988Zm856pVqwCYNGkS/fr1e2z7uXPnnkk7RERE5J9JRcNFREQkWyhZsiRBQUEADB8+nJs3b/7u/tevX+fMmTMZ8t5OTk4A1vpIj2rRogXw3xDoWbD0v3jx4o9tu379Otu3b39mbREREZF/HgVOIiIikm3861//olSpUly8eJE6deqwb9++x/ZJTk5m0aJFVK1alejo6Ax5Xy8vL+C/hbgfFRwcjJubG6GhoUyfPp3k5OTH9rl48SKff/55hrQHoHz58gDMnz8/3fslJCTQs2dPEhISMuy9REREJPvRlDoRERHJNtzd3dm/fz+dO3dm9+7d1K1bFx8fHypVqkSuXLm4du0ahw8f5tdff8XV1ZXnnnsuQ943MDCQXbt20a1bN5o2bYq7uzvwIGgqW7YsXl5efPPNNwQGBjJixAimTJmCr68vnp6eJCQkEB0dzfnz53n55Zfp1q1bhrRp6NChLFu2jE2bNlGiRAlq1KhBSkoKe/bsIVeuXPTu3ZtFixZlyHuJiIhI9qPASURERLKVggULsmvXLrZs2cKKFSs4cOAAO3fuJCkpiXz58lGzZk0CAgLo3r07Hh4eGfKer7/+Onfu3OHzzz9n06ZN3L9/H4Bu3bpRtmxZAOrVq8epU6eYM2cOGzduJCIigqSkJAoWLEixYsXo1q0bgYGBGdIeAB8fH44fP86YMWP47rvvCA8Pp3DhwgQFBTF+/Hg+/vjjDHsvERERyX5MhpYeERERERERERGRDKQaTiIiIiIiIiIikqEUOImIiIiIiIiISIZS4CQiIiIiIiIiIhlKgZOIiIiIiIiIiGQoBU4iIiIiIiIiIpKhFDiJiIiIiIiIiEiGUuAkIiIiIiIiIiIZSoGTiIiIiIiIiIhkKAVOIiIiIiIiIiKSoRQ4iYiIiIiIiIhIhlLgJCIiIiIiIiIiGUqBk4iIiIiIiIiIZCgFTiIiIiIiIiIikqH+Dx3bsMPfNWoAAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" } + ], + "source": [ + "# Create a bar plot with error bars for the average values of \"s\" and \"f\" for each criterion\n", + "\n", + "plt.figure(figsize=(12, 8))\n", + "bar_width = 0.1\n", + "index = np.arange(len(criteria))\n", + "\n", + "\n", + "plt.bar(\n", + " index,\n", + " list(average_s.values()),\n", + " bar_width,\n", + " label=f\"success ({len(task['s'])} samples)\",\n", + " color=\"darkblue\",\n", + " yerr=[(avg - conf_interval_s[key][0]) for key, avg in average_s.items()],\n", + " capsize=5,\n", + ")\n", + "plt.bar(\n", + " index + bar_width,\n", + " list(average_f.values()),\n", + " bar_width,\n", + " label=f\"failed ({len(task['f'])} samples)\",\n", + " color=\"lightblue\",\n", + " yerr=[(avg - conf_interval_f[key][0]) for key, avg in average_f.items()],\n", + " capsize=5,\n", + ")\n", + "\n", + "plt.xlabel(\"Criteria\", fontsize=16)\n", + "plt.ylabel(\"Average Value\", fontsize=16)\n", + "plt.title(\n", + " \"Average Values of 3 different baselines cases with 95% Confidence Intervals - math problems \", fontsize=12, pad=10\n", + ") # Adjust titlepad to move the title further above\n", + "plt.xticks(index + bar_width / 2, criteria, rotation=45, fontsize=14)\n", + "plt.legend(loc=\"upper center\", fontsize=14, bbox_to_anchor=(0.5, 1), ncol=3) # Adjust legend placement and ncol\n", + "plt.tight_layout() # Adjust subplot parameters to fit the labels\n", + "plt.ylim(0, 5)\n", + "plt.savefig(\"../test/test_files/agenteval-in-out/estimated_performance.png\")\n", + "plt.show()" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" }, - "nbformat": 4, - "nbformat_minor": 0 + "vscode": { + "interpreter": { + "hash": "949777d72b0d2535278d3dc13498b2535136f6dfe0678499012e853ee9abcab1" + } + } + }, + "nbformat": 4, + "nbformat_minor": 0 } diff --git a/notebook/oai_client_cost.ipynb b/notebook/oai_client_cost.ipynb index e4b356793133..6ee5d7e4fa04 100644 --- a/notebook/oai_client_cost.ipynb +++ b/notebook/oai_client_cost.ipynb @@ -233,7 +233,7 @@ ], "source": [ "# Since cache is enabled, the same completion will be returned from cache, which will not incur any actual cost. \n", - "# So acutal cost doesn't change but total cost doubles.\n", + "# So actual cost doesn't change but total cost doubles.\n", "response = client.create(messages=messages, model=\"gpt-35-turbo-1106\", cache_seed=41)\n", "client.print_usage_summary()" ] diff --git a/notebook/oai_openai_utils.ipynb b/notebook/oai_openai_utils.ipynb index 38a0fd0d4df5..dadc43866b63 100644 --- a/notebook/oai_openai_utils.ipynb +++ b/notebook/oai_openai_utils.ipynb @@ -60,7 +60,7 @@ "metadata": {}, "outputs": [], "source": [ - "# %pip install \"pyautogen~=0.2.0b4\"" + "# %pip install \"pyautogen>=0.2.3\"" ] }, { diff --git a/samples/apps/autogen-studio/autogenstudio/utils/dbdefaults.json b/samples/apps/autogen-studio/autogenstudio/utils/dbdefaults.json index 69ebcfafb212..570323652594 100644 --- a/samples/apps/autogen-studio/autogenstudio/utils/dbdefaults.json +++ b/samples/apps/autogen-studio/autogenstudio/utils/dbdefaults.json @@ -180,7 +180,7 @@ }, "human_input_mode": "NEVER", "max_consecutive_auto_reply": 4, - "system_message": "Your task is to ensure you generate a high quality visualization for the user. Your visualizations must follow best practices and you must articulate your reasoning for your choices. The visualization must not have grid or outline box. The visualization should have an APPROPRIATE ASPECT RATIO e..g rectangular for time series data. The title must be bold. Importantly, if THE CHART IS A LINE CHART, you MUST ADD ALINE OF BEST FIT and ADD TEXT ON THE SLOPE OF EACH LINE. Note that today's date is 12/10/2023. At each point, do your best to determine if the user's request has been addressed and if so, respond with a summary. The summary must be written as a coherent helpful response to the user request e.g. 'Sure, here is result to your request '. The summary MUST end with the word TERMINATE. If the user request is pleasantry or greeting, you should respond with a pleasantry or greeting and TERMINATE." + "system_message": "Your task is to ensure you generate a high quality visualization for the user. Your visualizations must follow best practices and you must articulate your reasoning for your choices. The visualization must not have grid or outline box. The visualization should have an APPROPRIATE ASPECT RATIO e..g rectangular for time series data. The title must be bold. Importantly, if THE CHART IS A LINE CHART, you MUST ADD A LINE OF BEST FIT and ADD TEXT ON THE SLOPE OF EACH LINE. Note that today's date is 12/10/2023. At each point, do your best to determine if the user's request has been addressed and if so, respond with a summary. The summary must be written as a coherent helpful response to the user request e.g. 'Sure, here is result to your request '. The summary MUST end with the word TERMINATE. If the user request is pleasantry or greeting, you should respond with a pleasantry or greeting and TERMINATE." } }, "type": "default" diff --git a/samples/apps/autogen-studio/frontend/src/components/views/playground/sessions.tsx b/samples/apps/autogen-studio/frontend/src/components/views/playground/sessions.tsx index 2e06442f90e6..b200cbd80aaa 100644 --- a/samples/apps/autogen-studio/frontend/src/components/views/playground/sessions.tsx +++ b/samples/apps/autogen-studio/frontend/src/components/views/playground/sessions.tsx @@ -80,7 +80,7 @@ const SessionsView = ({}: any) => { const onSuccess = (data: any) => { if (data && data.status) { message.success(data.message); - // console.log("sesssions", data); + // console.log("sessions", data); setSessions(data.data); if (data.data && data.data.length === 0) { createSession(); diff --git a/samples/tools/testbed/README.md b/samples/tools/testbed/README.md index 46325da86487..fa4f87404ea3 100644 --- a/samples/tools/testbed/README.md +++ b/samples/tools/testbed/README.md @@ -162,7 +162,7 @@ For the sake of brevity we will refer to this folder as the `DEST_FOLDER`. The algorithm for populating the `DEST_FOLDER` is as follows: -1. Recursively copy the contents of `./incudes` to DEST_FOLDER. This folder contains all the basic starter files for running a scenario, including an ENV file which will set the Docker environment variables. +1. Recursively copy the contents of `./includes` to DEST_FOLDER. This folder contains all the basic starter files for running a scenario, including an ENV file which will set the Docker environment variables. 2. Append the OAI_CONFIG_LIST to the ENV file so that autogen may access these secrets. 3. Recursively copy the scenario folder (if `template` in the json scenario definition points to a folder) to DEST_FOLDER. If the `template` instead points to a file, copy the file, but rename it to `scenario.py` 4. Apply any templating, as outlined in the prior section. diff --git a/website/blog/2023-12-29-AgentDescriptions/index.mdx b/website/blog/2023-12-29-AgentDescriptions/index.mdx index d82e191ca427..b72f74e1a6af 100644 --- a/website/blog/2023-12-29-AgentDescriptions/index.mdx +++ b/website/blog/2023-12-29-AgentDescriptions/index.mdx @@ -87,7 +87,7 @@ With AutoGen 0.2.2 onward, GroupChat instead relies on the description field. Wi ``` You are in a role play game. The following roles are available: -assitant: A helpful and general-purpose AI assistant that has strong language skills, Python skills, and Linux command line skills. +assistant: A helpful and general-purpose AI assistant that has strong language skills, Python skills, and Linux command line skills. user_proxy: A user that can run Python code or input command line commands at a Linux terminal and report back the execution results. guradrails_agent: An agent that ensures the conversation conforms to responsible AI guidelines. diff --git a/website/docs/FAQ.md b/website/docs/FAQ.md index dcd4dab6f54d..b63df3a18aaa 100644 --- a/website/docs/FAQ.md +++ b/website/docs/FAQ.md @@ -93,7 +93,7 @@ If you have problems with agents running `pip install` or get errors similar to ### Agents keep thanking each other when using `gpt-3.5-turbo` -When using `gpt-3.5-turbo` you may often encounter agents going into a "gratitude loop", meaning when they complete a task they will begin congratulating and thanking eachother in a continuous loop. This is a limitation in the performance of `gpt-3.5-turbo`, in contrast to `gpt-4` which has no problem remembering instructions. This can hinder the experimentation experience when trying to test out your own use case with cheaper models. +When using `gpt-3.5-turbo` you may often encounter agents going into a "gratitude loop", meaning when they complete a task they will begin congratulating and thanking each other in a continuous loop. This is a limitation in the performance of `gpt-3.5-turbo`, in contrast to `gpt-4` which has no problem remembering instructions. This can hinder the experimentation experience when trying to test out your own use case with cheaper models. A workaround is to add an additional termination notice to the prompt. This acts a "little nudge" for the LLM to remember that they need to terminate the conversation when their task is complete. You can do this by appending a string such as the following to your user input string: diff --git a/website/docs/Use-Cases/agent_chat.md b/website/docs/Use-Cases/agent_chat.md index 2ac7057bdddf..03f59484f8d3 100644 --- a/website/docs/Use-Cases/agent_chat.md +++ b/website/docs/Use-Cases/agent_chat.md @@ -48,7 +48,7 @@ specified with a JSON schema describing its parameters and their types. Writing is complex and error-prone and that is why AutoGen framework provides two high level function decorators for automatically generating such schema using type hints on standard Python datatypes or Pydantic models: -1. [`ConversableAgent.register_for_llm`](../reference/agentchat/conversable_agent#register_for_llm) is used to register the function as a Tool in the `llm_config` of a ConversableAgent. The ConversableAgent agent can propose execution of a registrated Tool, but the actual execution will be performed by a UserProxy agent. +1. [`ConversableAgent.register_for_llm`](../reference/agentchat/conversable_agent#register_for_llm) is used to register the function as a Tool in the `llm_config` of a ConversableAgent. The ConversableAgent agent can propose execution of a registered Tool, but the actual execution will be performed by a UserProxy agent. 2. [`ConversableAgent.register_for_execution`](../reference/agentchat/conversable_agent#register_for_execution) is used to register the function in the `function_map` of a UserProxy agent.