From b5c672ec615076e939ab4138cbb78347cdfc2551 Mon Sep 17 00:00:00 2001 From: liubiren Date: Thu, 8 Oct 2026 20:25:29 +0800 Subject: [PATCH] 1 --- agent/application/pages/conversation.py | 6 +- agent/application/states/conversation.py | 37 ++- agent/application/states/models.py | 3 +- .../workshop/knowledge_base_retrieve.py | 296 ++++++++++++++++++ agent/application/workshop/research.py | 254 --------------- agent/application/workshop/web_retrieve.py | 260 +++++++++++++++ agent/database.db | Bin 430080 -> 479232 bytes 短视频合成自动化/caches.db | Bin 5394432 -> 5742592 bytes 短视频合成自动化/main.py | 2 +- 9 files changed, 592 insertions(+), 266 deletions(-) create mode 100644 agent/application/workshop/knowledge_base_retrieve.py delete mode 100644 agent/application/workshop/research.py create mode 100644 agent/application/workshop/web_retrieve.py diff --git a/agent/application/pages/conversation.py b/agent/application/pages/conversation.py index 30f1601..3242d37 100644 --- a/agent/application/pages/conversation.py +++ b/agent/application/pages/conversation.py @@ -298,8 +298,10 @@ def use_guidance() -> rx.Component: workflow_button(WorkflowType.BOOK_FLIGHT), # 工作流按钮:银行客户服务 workflow_button(WorkflowType.BANK_CUSTOMER_SERVICE), - # 工作流按钮:研究 - workflow_button(WorkflowType.RESEARCH), + # 工作流按钮:联网检索 + workflow_button(WorkflowType.WEB_RETRIEVE), + # 工作流按钮:知识库检索 + workflow_button(WorkflowType.KNOWLEDGE_BASE_RETRIEVE), flex_wrap="wrap", align_items="center", gap="12px", diff --git a/agent/application/states/conversation.py b/agent/application/states/conversation.py index 5ed6021..7d1021d 100644 --- a/agent/application/states/conversation.py +++ b/agent/application/states/conversation.py @@ -248,7 +248,7 @@ class ConversationState(rx.State): if not user_prompt.strip(): return - conversation.user_prompt = user_prompt.strip() + conversation.user_prompt = user_prompt @rx.var def is_user_prompt_sending_button_disabled(self) -> bool: @@ -394,9 +394,23 @@ class ConversationState(rx.State): usage=usage, ) - # 研究 - case WorkflowType.RESEARCH: - from application.workshop.research import ( + # 联网检索 + case WorkflowType.WEB_RETRIEVE: + from application.workshop.web_retrieve import ( + run_stream_events, + ) + + # 运行并流式输出事件 + stream_events = run_stream_events( + deps=conversation.workflow.deps, + user_prompt=user_prompt, + message_history=message_history, + usage=usage, + ) + + # 知识库检索 + case WorkflowType.KNOWLEDGE_BASE_RETRIEVE: + from application.workshop.knowledge_base_retrieve import ( run_stream_events, ) @@ -720,11 +734,18 @@ class ConversationState(rx.State): # 设置用户提示词 self.set_user_prompt(f"帮我查询账户余额") - # 研究 - case WorkflowType.RESEARCH: - from application.workshop.research import Deps + # 联网检索 + case WorkflowType.WEB_RETRIEVE: + from application.workshop.web_retrieve import Deps - # 初始化研究工作流 + # 初始化联网检索工作流 + workflow = Workflow(type=type, deps=Deps()) + + # 知识库检索 + case WorkflowType.KNOWLEDGE_BASE_RETRIEVE: + from application.workshop.knowledge_base_retrieve import Deps + + # 初始化知识库检索工作流 workflow = Workflow(type=type, deps=Deps()) # 其他 diff --git a/agent/application/states/models.py b/agent/application/states/models.py index 23952a8..c28be92 100644 --- a/agent/application/states/models.py +++ b/agent/application/states/models.py @@ -61,7 +61,8 @@ class WorkflowType(StrEnum): TALK = "对话" BOOK_FLIGHT = "预定航班" BANK_CUSTOMER_SERVICE = "银行客户服务" - RESEARCH = "研究" + WEB_RETRIEVE = "联网检索" + KNOWLEDGE_BASE_RETRIEVE = "知识库检索" class Workflow(BaseModel): diff --git a/agent/application/workshop/knowledge_base_retrieve.py b/agent/application/workshop/knowledge_base_retrieve.py new file mode 100644 index 0000000..4e40f62 --- /dev/null +++ b/agent/application/workshop/knowledge_base_retrieve.py @@ -0,0 +1,296 @@ +# -*- coding: utf-8 -*- +""" +知识库检索 +""" +from asyncio import sleep +from typing import Any, AsyncGenerator + +from httpx import AsyncClient, HTTPStatusError +from pydantic import BaseModel, Field +from pydantic_ai import Agent, ModelMessage +from pydantic_ai.messages import AgentStreamEvent +from pydantic_ai.run import AgentRunResultEvent +from pydantic_ai.toolsets import FunctionToolset +from pydantic_ai.usage import RunUsage + +from application.workshop.database import connection_pool +from application.workshop.models import DEEPSEEK_V4_FLASH_RESPONSE_MODEL + + +class Deps(BaseModel): + """ + 依赖类 + """ + + ... + + +class Args(BaseModel): + text: str = Field(..., description="查询文本") + keywords: list[str] = Field(default_factory=list, description="查询关键词列表") + + +# 实例化工具集 +toolset = FunctionToolset() + + +@toolset.tool_plain() +async def knowledge_base_retrieve(args: Args) -> str: + """ + 知识库检索: + 用于基于知识库检索相关信息。 + """ + if connection_pool is None: + return "数据库连接池未初始化" + + # --- 召回,先根据查询文本获取嵌入向量再基于查询关键词和文本向量混合检索 --- # + request_count = 0 # 请求次数 + response_payload: dict | None = None + while request_count < 3: + request_count += 1 + try: + async with AsyncClient(timeout=60) as client: + response = await client.post( + "https://api.siliconflow.cn/v1/embeddings", + headers={ + "Authorization": "Bearer sk-xsnuwirjjphhfdbvznfdfjqlinfdlrnlxuhkbbqynfnbhiqz", + "Content-Type": "application/json", + }, + json={ + "model": "BAAI/bge-m3", + "input": args.text, + }, + ) + # 检查响应状态 + response.raise_for_status() + # 解析响应载荷 + response_payload = response.json() + break + + except HTTPStatusError as exception: + # 若触发限速则等待若干秒后重试 + if exception.response.status_code == 429: + await sleep(2**request_count) + continue + + raise RuntimeError( + f"HTTPError {exception.response.status_code}: {exception.response.text}" + ) + + except Exception as exception: + raise RuntimeError(f"Exception: {str(exception)}") + + if response_payload is None: + raise RuntimeError("response_payload is None") + text_vector = response_payload["data"][0]["embedding"] + + # 混合检索 + async with connection_pool.acquire() as connection: + results = await connection.fetch( + """ + WITH bm25_retrieve_results AS ( + SELECT + id, + document_id, + index, + text, + return_text, + text_fingerprint, + ROW_NUMBER() OVER (ORDER BY paradedb.score(id) DESC) AS bm25_retrieve_rank + FROM document_chunks + WHERE text @@@ $1 + ORDER BY paradedb.score(id) DESC + LIMIT 50 + ), + vector_retrieve_results AS ( + SELECT + id, + document_id, + index, + text, + return_text, + text_fingerprint, + ROW_NUMBER() OVER (ORDER BY text_vector <-> $2::vector(1024)) AS vector_retrieve_rank + FROM document_chunks + ORDER BY text_vector <-> $2::vector(1024) + LIMIT 50 + ), + merged_results AS ( + SELECT + COALESCE(bm25_retrieve_results.id, vector_retrieve_results.id) AS id, + COALESCE(bm25_retrieve_results.document_id, vector_retrieve_results.document_id) AS document_id, + COALESCE(bm25_retrieve_results.index, vector_retrieve_results.index) AS index, + COALESCE(bm25_retrieve_results.text, vector_retrieve_results.text) AS text, + COALESCE(bm25_retrieve_results.return_text, vector_retrieve_results.return_text) AS return_text, + COALESCE(bm25_retrieve_results.text_fingerprint, vector_retrieve_results.text_fingerprint) AS text_fingerprint, + COALESCE(1.0/(bm25_retrieve_rank + 60), 0) + COALESCE(1.0/(vector_retrieve_rank + 60), 0) AS rank_score + FROM bm25_retrieve_results + FULL OUTER JOIN vector_retrieve_results USING(id) + ), + deduplication_results AS ( + SELECT + *, + ROW_NUMBER() OVER (PARTITION BY text_fingerprint ORDER BY rank_score DESC) AS duplicate_index + FROM merged_results + ) + SELECT + id, + document_id, + index, + text, + return_text, + rank_score + FROM deduplication_results + WHERE duplicate_index = 1 + ORDER BY rank_score DESC + LIMIT 50; + """, + " ".join(args.keywords) if args.keywords else args.text, + "[" + ",".join(str(x) for x in text_vector) + "]", + ) + if not results: + return "未检索到相关结果" + recall_results: list[dict] = [dict(row) for row in results] # 召回结果 + + # --- 重排 --- # + request_count = 0 # 请求次数 + response_payload: dict | None = None + while request_count < 3: + request_count += 1 + try: + async with AsyncClient(timeout=60) as client: + response = await client.post( + "https://api.siliconflow.cn/v1/rerank", + headers={ + "Authorization": "Bearer sk-xsnuwirjjphhfdbvznfdfjqlinfdlrnlxuhkbbqynfnbhiqz", + "Content-Type": "application/json", + }, + json={ + "model": "BAAI/bge-reranker-v2-m3", + "query": args.text, + "documents": [ + result["return_text"] for result in recall_results + ], + "return_documents": False, + "top_n": 10, + }, + ) + # 检查响应状态 + response.raise_for_status() + # 解析响应载荷 + response_payload = response.json() + break + + except HTTPStatusError as exception: + # 若触发限速则等待若干秒后重试 + if exception.response.status_code == 429: + await sleep(2**request_count) + continue + + raise RuntimeError( + f"HTTPError {exception.response.status_code}: {exception.response.text}" + ) + + except Exception as exception: + await sleep(2**request_count) + continue + + if response_payload is None: + reranked_results: list[dict] = recall_results[:10] + else: + reranked_results = [ + recall_results[result["index"]] + for result in response_payload["results"] + if result["relevance_score"] >= 0.6 + ] + + if not reranked_results: + return "未检索到相关结果" + + # --- 重构结果 --- # + refactored_results: list[str] = [f"检索内容:**{args.text}**,检索结果:\n"] + for result in reranked_results: + refactored_results.append(f"{result['return_text']}\n") + return "\n".join(refactored_results) + + +instruction = """ +你是内部知识库问答助手,可调用 knowledge_base_retrieve 工具检索已收录的文档片段。 + +## 一、检索判断 +需要调用 knowledge_base_retrieve:问题涉及项目内部资料、技术文档、产品规格、历史方案、代码库说明、内部流程等知识库已收录的主题。 +无需调用:纯闲聊、基础常识、数学计算、代码编写与解释、用户已在对话中提供完整材料的分析任务。 +【检索硬约束】 +1. 最多**2轮知识库检索**,严禁发起第3轮。一轮定义:单次思考决策发起1次检索;**单次思考步骤最多只能生成1次工具调用,禁止同一思考周期并行发起多次检索**。必须串行:执行1次检索,拿到结果评估之后,才允许在后续思考中决定是否发起下一轮。 +2. 发起新一轮检索前,必须评估已获取的文档片段,现有片段足以回答问题则立即停止调用工具。 +3. 禁止仅改写同义词、做语义几乎等价的重复检索;若存在局部信息缺失,优先从已有片段中提取可用内容,不要直接发起新检索。 +4. 默认只执行1次真实检索;拿到结果后评估证据,满足以下任意条件,必须停止检索: +- 现有片段足以作答;多个片段交叉印证同一结论;继续检索仅起到重复确认的作用。 +❌禁止以"再查一下""补充更多文档""确认一下"等理由发起额外检索。 +✅仅在以下4种场景,才允许执行第2轮检索: +①第一轮无有效检索结果;②回答问题必需的关键事实在已有片段中完全缺失;③第一轮返回的片段与用户问题明显偏题;④第一轮只召回了泛泛结果,缺少问题指向的具体实体/术语。 +第二轮检索必须更换关键词组瞄准明确的信息缺口,禁止原样重发上一轮查询。 +> 重要:第二轮检索执行完成后,无论信息是否补齐,都必须终止检索,不再发起任何 knowledge_base_retrieve 调用。 + +## 二、调用工具前的改写规范 +调用 knowledge_base_retrieve 时,禁止直接把用户原始疑问句透传,必须先完成: +1. **去疑问化**:把"支付模块怎么设计的?"改写成陈述句"支付模块设计"填入 text。 +2. **指代消解**:结合对话历史,把"那个功能""之前那个报错""他说的方案"替换成具体名词后填入 text。 +3. **关键词提炼**:从问题中提取 2–5 个核心名词/术语/专有名词填入 keywords,例如: + - 用户问"退款流程里签名校验为什么会失败" + - → text="退款流程签名校验失败" + - → keywords=["退款流程", "签名校验"] +4. keywords 只保留名词、术语、产品名、技术栈名,禁止包含虚词、疑问词、动词短语。 +5. 若问题本身就是一个名词短语(如"支付模块文档"),text 与 keywords 可一致。 + +## 三、事实规范 +- 【事实】:检索返回文档片段原文直接支持的内容。 +- 【推论】:基于已确认片段做的合理推导。 +- 【推测】:证据不足前提下的主观判断,必须显式标注。 +严禁编造文档片段中不存在的结论、字段、参数、接口名、日期、数据。 +> 知识库未收录相关内容时,直接告知用户"知识库中未找到相关资料",不得用模型自身记忆强行作答或补全。 +> 若2轮检索结束关键信息仍缺失,直接说明现有文档无法回答该问题,不编造。 + +## 四、引用规范 +回答中引用知识库片段时,必须标注来源,格式:`[文档 document_id 片段 chunk_index]`,编号必须对应检索结果中实际返回的 document_id 与 chunk_index,禁止编造编号。 +只引用回答中实际用到的片段;不要把整段召回文本原样堆砌给用户,要先总结再引用。 + +## 五、输出规则 +简单事实类问题:优先给出结论,附带关键片段与来源标注,回答简洁。 +复杂问题(多文档交叉、方案对比、流程梳理):按「关键证据 → 分析 → 结论 → 来源标注」结构组织;先陈列依据再输出总结,结论不能超出现有片段可支撑的范围。 +""" + +# 智能体 +agent = Agent[Deps, str]( + model=DEEPSEEK_V4_FLASH_RESPONSE_MODEL, + deps_type=Deps, + output_type=str, # 若输出类型为 str,则智能体输出结果时不进行输出类型校验。若定义输出类型,需考虑处理相应事件 + instructions=instruction, + toolsets=[toolset], +) + + +async def run_stream_events( + deps: Any, + user_prompt: str | None, + message_history: list[ModelMessage], + usage: RunUsage, +) -> AsyncGenerator[AgentStreamEvent | AgentRunResultEvent, None]: + """ + 运行并流式输出事件 + :param user_prompt: 用户提示词 + :param message_history: 消息历史 + :param usage: 使用量 + :return: AsyncGenerator + """ + if not isinstance(deps, Deps): + deps = Deps.model_validate(deps) + + async with agent.run_stream_events( + deps=deps, + user_prompt=user_prompt, + message_history=message_history, + usage=usage, + ) as events: + async for event in events: + yield event diff --git a/agent/application/workshop/research.py b/agent/application/workshop/research.py deleted file mode 100644 index cb7a24f..0000000 --- a/agent/application/workshop/research.py +++ /dev/null @@ -1,254 +0,0 @@ -# -*- coding: utf-8 -*- -""" -研究 -""" -from datetime import datetime -from html import escape -from typing import Any, AsyncGenerator - -import httpx -from pydantic import BaseModel, Field -from pydantic_ai import Agent, ModelMessage -from pydantic_ai.messages import AgentStreamEvent -from pydantic_ai.run import AgentRunResultEvent -from pydantic_ai.toolsets import FunctionToolset -from pydantic_ai.usage import RunUsage - -from application.workshop.database import connection_pool -from application.workshop.models import DEEPSEEK_V4_FLASH_RESPONSE_MODEL - - -class Deps(BaseModel): - """ - 依赖类 - """ - - ... - - -class Args(BaseModel): - keyword: str = Field(description="查询语句") - - -# 实例化工具集 -bocha_web_search = FunctionToolset() - - -@bocha_web_search.tool_plain() -async def web_search(args: Args) -> str: - """ - 联网搜索工具: - 用于查询互联网实时信息、新闻、政策法规、行业报告、企业公告、最新数据。 - """ - if connection_pool is None: - return "数据库连接池未初始化" - - # 关键词 - keyword = args.keyword - - # 根据关键词查询联网搜索缓存 - async with connection_pool.acquire() as conn: - results = await conn.fetchval( - "SELECT results FROM web_search_caches WHERE keyword = $1", - keyword, - ) - # 若命中缓存则返回结果,否则先召回再精排、重构搜索结果 - if results is not None: - return results - - else: - # --- 召回阶段 --- # - try: - async with httpx.AsyncClient(timeout=60) as client: - response = await client.post( - "https://api.bocha.cn/v1/web-search", - headers={ - "Authorization": "Bearer sk-a9ed73d8b26745799cf970f84d70f512", - "Content-Type": "application/json", - }, - json={ - "query": keyword, - "summary": True, # 显示文本摘要 - "count": 20, # 返回结果数 - }, - ) - # 检查响应状态 - response.raise_for_status() - # 解析响应载荷 - response_payload = response.json() - - except httpx.HTTPStatusError as exception: - return ( - f"请求错误 {exception.response.status_code}: {exception.response.text}" - ) - except Exception as exception: - return f"请求异常: {str(exception)}" - - if (code := response_payload.get("code")) != 200: - return f"业务错误 {code}: {response_payload.get("msg", "未知业务错误")}" - - # 召回网页 - webpages = response_payload["data"]["webPages"]["value"] - if not webpages: - return "未搜索到相关网页" - - # --- 精排阶段 --- # - try: - async with httpx.AsyncClient(timeout=60) as client: - response = await client.post( - "https://api.siliconflow.cn/v1/rerank", - headers={ - "Authorization": "Bearer sk-xsnuwirjjphhfdbvznfdfjqlinfdlrnlxuhkbbqynfnbhiqz", - "Content-Type": "application/json", - }, - json={ - "model": "BAAI/bge-reranker-v2-m3", - "query": keyword, - "documents": [ - called_webpage["summary"] or called_webpage["snippet"] - for called_webpage in webpages - ], - "return_documents": True, # 返回文档内容 - "top_n": 10, # 返回结果数 - }, - ) - # 检查响应状态 - response.raise_for_status() - # 解析响应载荷 - response_payload = response.json() - - except httpx.HTTPStatusError as exception: - return ( - f"请求错误 {exception.response.status_code}: {exception.response.text}" - ) - except Exception as exception: - return f"请求异常: {str(exception)}" - - # 精排后网页 - reranked_webpages = [ - (result["index"], result["document"]["text"]) - for result in response_payload["results"] - ] - - # --- 重构搜索结果 --- # - results = [] - results.append(f"搜索内容:**{keyword}**,搜索结果:\n") - for index, summary in reranked_webpages: - # 根据重排后网页索引获取网页 - webpage = webpages[index] - # 解析网页的标题 - name = escape(webpage["name"]) - # 解析网页的URL - url = escape(webpage["url"]) - # 解析网页的网站名称 - site_name = escape(webpage["siteName"]) - # 解析网页的发布时间 - date_published = escape( - datetime.fromisoformat(webpage["datePublished"]).date().isoformat() - ) - - results.append( - f"- **{name}**({site_name}・{date_published}):{escape(summary)}" - ) - - results = "\n".join(results) - - # 新增联网搜索缓存 - async with connection_pool.acquire() as conn: - await conn.execute( - "INSERT INTO web_search_caches (keyword, results) VALUES ($1, $2)", - keyword, - results, - ) - - return results - - -instruction = """ -你是研究助手,可调用联网搜索工具。 -## 一、联网判断 -需要联网:时效类信息、新闻、声明公告、政策法规、最新数据,以及模型静态知识库无法可靠回答的问题。 -无需联网:基础常识、数学计算、代码编写与解释、用户已提供完整材料的分析任务、无时间依赖的静态问题。 - -【搜索硬约束】 -1. 最多**2轮联网搜索**,严禁发起第3轮。一轮定义:单次思考决策发起1条搜索Query;**单次思考步骤,最多只能生成1条搜索query,禁止同一思考周期并行发起多条联网搜索调用**。必须串行执行:执行1次搜索,拿到结果评估之后,才允许在后续思考中决定是否发起下一轮搜索。不允许一步同时调用多次web_search。 -2. 发起新一轮搜索前,必须评估已获取的搜索摘要,现有信息足以回答问题则立即停止调用工具。 -3. 禁止仅改写同义词、做语义几乎等价的重复搜索;若存在局部信息缺失,优先从已有结果中提取可用内容,不要直接发起新搜索。 -4. 默认只执行1次真实联网搜索;拿到搜索结果后评估证据,满足以下任意条件,必须停止搜索: -- 现有信息足以作答;官方一手资料已给出答案;多个可靠来源结论一致;继续搜索仅起到重复确认的作用。 -❌禁止以“再次确认、查找更多来源、补充更多资料”等理由发起额外搜索。 -✅仅在以下4种场景,才允许执行第2轮搜索: -①第一轮无有效搜索结果;②回答问题必需的关键事实完全缺失;③权威信源之间事实存在明显冲突;④第一轮搜索结果严重偏题。 -第二轮搜索必须瞄准明确的信息缺口,禁止全盘复刻上一轮查询。 -> 重要:第二轮搜索执行完成后,无论信息是否补齐,都必须终止搜索,不再发起任何web_search调用。 - -## 二、时间与Query规则 -时效判断严格以运行时传入的当前日期、年份、时区为准,禁止依靠模型内置记忆猜测时间。 -- 用户未指定年份:**禁止自行向搜索Query中追加年份**。 -- 用户明确给出年份:搜索Query必须完整保留用户指定的年份。 -- 若检索到网页发布时间晚于运行时当前日期,直接舍弃该结果,不采信。 - -## 三、信源优先级 -1级(最高):官网、官方文档、官方公告、一手原始资料 -2级:权威媒体、专业机构、科研机构 -3级:其他可信赖网页 -> 媒体转述不等于官方原文,若官方原文存在,优先采信官方原文,不采用媒体转述版本。 -官方资料已经可以完整回答问题时,无需再搜索其他来源做重复验证。 -自媒体、论坛、转载内容,不可作为重大事实的唯一证据。 - -## 四、最新内容校验 -查询“最新”类问题,不可仅凭网页排序判断时效性;必须核对资料的**发布时间、版本时间,结合运行时提供的当前日期综合判断**。 -当存在多份结果时,优先选用发布时间更近、信源等级更高的资料。 - -## 五、事实规范 -- 【事实】:搜索返回资料原文直接支持的内容 -- 【推论】:基于已确认事实做合理推导 -- 【推测】:证据不足前提下的主观判断 -严禁编造URL、日期、新闻事件、数据、官方声明等任何信息;证据不足时直接如实说明,不得强行得出结论。 -> 若2轮搜索结束,关键信息仍然缺失,直接告知用户:现有检索资料无法获取目标信息,不编造内容。 - -## 六、引用规范 -引用编号区分搜索轮次:S1‑1、S1‑2 代表第1轮搜索结果;S2‑1、S2‑2 代表第2轮搜索结果。 -只引用回答中实际用到的资料。 -引用格式:`[参考 S1‑1] https://xxx`,链接必须来源于 **web_search** 工具返回结果,禁止编造链接。 - -## 七、输出规则 -简单事实类问题:优先给出结论,附带关键证据与来源,回答简洁,避免冗余。 -复杂研究类问题,按「关键证据 → 分析 → 结论 → 参考来源」结构组织内容;先陈列证据再输出总结,结论不能超出现有资料可支撑的范围。 -""" - -# 智能体 -agent = Agent[Deps, str]( - model=DEEPSEEK_V4_FLASH_RESPONSE_MODEL, - deps_type=Deps, - output_type=str, # 若输出类型为 str,则智能体输出结果时不进行输出类型校验。若定义输出类型,需考虑处理相应事件 - instructions=instruction, - toolsets=[bocha_web_search], -) - - -async def run_stream_events( - deps: Any, - user_prompt: str | None, - message_history: list[ModelMessage], - usage: RunUsage, -) -> AsyncGenerator[AgentStreamEvent | AgentRunResultEvent, None]: - """ - 运行并流式输出事件 - :param user_prompt: 用户提示词 - :param message_history: 消息历史 - :param usage: 使用量 - :return: AsyncGenerator - """ - if not isinstance(deps, Deps): - deps = Deps.model_validate(deps) - - async with agent.run_stream_events( - deps=deps, - user_prompt=user_prompt, - message_history=message_history, - usage=usage, - ) as events: - async for event in events: - print(event) - yield event diff --git a/agent/application/workshop/web_retrieve.py b/agent/application/workshop/web_retrieve.py new file mode 100644 index 0000000..ea0d3ed --- /dev/null +++ b/agent/application/workshop/web_retrieve.py @@ -0,0 +1,260 @@ +# -*- coding: utf-8 -*- +""" +联网检索 +""" +from datetime import datetime +from html import escape +from typing import Any, AsyncGenerator + +from httpx import AsyncClient, HTTPStatusError +from pydantic import BaseModel, Field +from pydantic_ai import Agent, ModelMessage +from pydantic_ai.messages import AgentStreamEvent +from pydantic_ai.run import AgentRunResultEvent +from pydantic_ai.toolsets import FunctionToolset +from pydantic_ai.usage import RunUsage + +from application.workshop.database import connection_pool +from application.workshop.models import DEEPSEEK_V4_FLASH_RESPONSE_MODEL + +""" +联网检索缓存表建表SQL +CREATE TABLE IF NOT EXISTS web_retrieve_caches ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + query TEXT NOT NULL, + results TEXT NOT NULL +); +CREATE INDEX idx_web_retrieve_caches_query ON web_retrieve_caches (query); +""" + + +class Deps(BaseModel): + """ + 依赖类 + """ + + ... + + +class Args(BaseModel): + query: str = Field(..., description="查询语句") + + +# 实例化工具集 +toolset = FunctionToolset() + + +@toolset.tool_plain() +async def web_retrieve(args: Args) -> str: + """ + 联网检索: + 用于基于互联网检索实时信息、新闻、政策法规、行业报告、企业公告、最新数据。 + """ + if connection_pool is None: + return "数据库连接池未初始化" + + # 查询 + query = args.query + + # 查询联网检索缓存 + async with connection_pool.acquire() as connection: + results = await connection.fetchval( + "SELECT results FROM web_retrieve_caches WHERE query = $1", + query, + ) + # 若命中缓存则返回结果,否则先召回、重排再返回重构结果 + if results is not None: + return results + + # --- 召回阶段 --- # + try: + async with AsyncClient(timeout=60) as client: + response = await client.post( + "https://api.bocha.cn/v1/web-search", + headers={ + "Authorization": "Bearer sk-a9ed73d8b26745799cf970f84d70f512", + "Content-Type": "application/json", + }, + json={ + "query": query, + "summary": True, # 显示文本摘要 + "count": 20, # 返回结果数 + }, + ) + # 检查响应状态 + response.raise_for_status() + # 解析响应载荷 + response_payload = response.json() + + except HTTPStatusError as exception: + return f"请求失败 {exception.response.status_code}: {exception.response.text}" + + except Exception as exception: + return f"请求异常: {str(exception)}" + + if (code := response_payload.get("code")) != 200: + return f"业务失败 {code}: {response_payload.get("msg", "未知业务错误")}" + + # 召回网页 + webpages = response_payload["data"]["webPages"]["value"] + if not webpages: + return "未检索到相关结果" + + # --- 重排阶段 --- # + try: + async with AsyncClient(timeout=60) as client: + response = await client.post( + "https://api.siliconflow.cn/v1/rerank", + headers={ + "Authorization": "Bearer sk-xsnuwirjjphhfdbvznfdfjqlinfdlrnlxuhkbbqynfnbhiqz", + "Content-Type": "application/json", + }, + json={ + "model": "BAAI/bge-reranker-v2-m3", + "query": query, + "documents": [ + called_webpage["summary"] or called_webpage["snippet"] + for called_webpage in webpages + ], + "return_documents": True, # 返回文档内容 + "top_n": 10, # 返回结果数 + }, + ) + # 检查响应状态 + response.raise_for_status() + # 解析响应载荷 + response_payload = response.json() + + except HTTPStatusError as exception: + return f"请求失败 {exception.response.status_code}: {exception.response.text}" + + except Exception as exception: + return f"请求失败: {str(exception)}" + + # 重排后网页 + reranked_webpages = [ + (result["index"], result["document"]["text"]) + for result in response_payload["results"] + ] + + # --- 重构检索结果 --- # + results = [] + results.append(f"检索内容:**{query}**,检索结果:\n") + for index, summary in reranked_webpages: + # 根据重排后网页索引获取网页 + webpage = webpages[index] + # 解析网页的标题 + name = escape(webpage["name"]) + # 解析网页的URL + url = escape(webpage["url"]) + # 解析网页的网站名称 + site_name = escape(webpage["siteName"]) + # 解析网页的发布时间 + date_published = escape( + datetime.fromisoformat(webpage["datePublished"]).date().isoformat() + ) + + results.append( + f"- **{name}**({site_name}・{date_published}):{escape(summary)}" + ) + + results = "\n".join(results) + + # 创建联网检索缓存 + async with connection_pool.acquire() as connection: + await connection.execute( + "INSERT INTO web_retrieve_caches (query, results) VALUES ($1, $2)", + query, + results, + ) + + return results + + +instruction = """ +你是研究助手,可调用联网检索工具。 +## 一、联网判断 +需要联网:时效类信息、新闻、声明公告、政策法规、最新数据,以及模型静态知识库无法可靠回答的问题。 +无需联网:基础常识、数学计算、代码编写与解释、用户已提供完整材料的分析任务、无时间依赖的静态问题。 + +【检索硬约束】 +1. 最多**2轮联网检索**,严禁发起第3轮。一轮定义:单次思考决策发起1条检索Query;**单次思考步骤,最多只能生成1条检索query,禁止同一思考周期并行发起多条联网检索调用**。必须串行执行:执行1次检索,拿到结果评估之后,才允许在后续思考中决定是否发起下一轮检索。不允许一步同时调用多次web_search。 +2. 发起新一轮检索前,必须评估已获取的检索摘要,现有信息足以回答问题则立即停止调用工具。 +3. 禁止仅改写同义词、做语义几乎等价的重复检索;若存在局部信息缺失,优先从已有结果中提取可用内容,不要直接发起新检索。 +4. 默认只执行1次真实联网检索;拿到检索结果后评估证据,满足以下任意条件,必须停止检索: +- 现有信息足以作答;官方一手资料已给出答案;多个可靠来源结论一致;继续检索仅起到重复确认的作用。 +❌禁止以“再次确认、查找更多来源、补充更多资料”等理由发起额外检索。 +✅仅在以下4种场景,才允许执行第2轮检索: +①第一轮无有效检索结果;②回答问题必需的关键事实完全缺失;③权威信源之间事实存在明显冲突;④第一轮检索结果严重偏题。 +第二轮检索必须瞄准明确的信息缺口,禁止全盘复刻上一轮查询。 +> 重要:第二轮检索执行完成后,无论信息是否补齐,都必须终止检索,不再发起任何web_search调用。 + +## 二、时间与Query规则 +时效判断严格以运行时传入的当前日期、年份、时区为准,禁止依靠模型内置记忆猜测时间。 +- 用户未指定年份:**禁止自行向检索Query中追加年份**。 +- 用户明确给出年份:检索Query必须完整保留用户指定的年份。 +- 若检索到网页发布时间晚于运行时当前日期,直接舍弃该结果,不采信。 + +## 三、信源优先级 +1级(最高):官网、官方文档、官方公告、一手原始资料 +2级:权威媒体、专业机构、科研机构 +3级:其他可信赖网页 +> 媒体转述不等于官方原文,若官方原文存在,优先采信官方原文,不采用媒体转述版本。 +官方资料已经可以完整回答问题时,无需再检索其他来源做重复验证。 +自媒体、论坛、转载内容,不可作为重大事实的唯一证据。 + +## 四、最新内容校验 +查询“最新”类问题,不可仅凭网页排序判断时效性;必须核对资料的**发布时间、版本时间,结合运行时提供的当前日期综合判断**。 +当存在多份结果时,优先选用发布时间更近、信源等级更高的资料。 + +## 五、事实规范 +- 【事实】:检索返回资料原文直接支持的内容 +- 【推论】:基于已确认事实做合理推导 +- 【推测】:证据不足前提下的主观判断 +严禁编造URL、日期、新闻事件、数据、官方声明等任何信息;证据不足时直接如实说明,不得强行得出结论。 +> 若2轮检索结束,关键信息仍然缺失,直接告知用户:现有检索资料无法获取目标信息,不编造内容。 + +## 六、引用规范 +引用编号区分检索轮次:S1‑1、S1‑2 代表第1轮检索结果;S2‑1、S2‑2 代表第2轮检索结果。 +只引用回答中实际用到的资料。 +引用格式:`[参考 S1‑1] https://xxx`,链接必须来源于 **web_search** 工具返回结果,禁止编造链接。 + +## 七、输出规则 +简单事实类问题:优先给出结论,附带关键证据与来源,回答简洁,避免冗余。 +复杂研究类问题,按「关键证据 → 分析 → 结论 → 参考来源」结构组织内容;先陈列证据再输出总结,结论不能超出现有资料可支撑的范围。 +""" + +# 智能体 +agent = Agent[Deps, str]( + model=DEEPSEEK_V4_FLASH_RESPONSE_MODEL, + deps_type=Deps, + output_type=str, # 若输出类型为 str,则智能体输出结果时不进行输出类型校验。若定义输出类型,需考虑处理相应事件 + instructions=instruction, + toolsets=[toolset], +) + + +async def run_stream_events( + deps: Any, + user_prompt: str | None, + message_history: list[ModelMessage], + usage: RunUsage, +) -> AsyncGenerator[AgentStreamEvent | AgentRunResultEvent, None]: + """ + 运行并流式输出事件 + :param user_prompt: 用户提示词 + :param message_history: 消息历史 + :param usage: 使用量 + :return: AsyncGenerator + """ + if not isinstance(deps, Deps): + deps = Deps.model_validate(deps) + + async with agent.run_stream_events( + deps=deps, + user_prompt=user_prompt, + message_history=message_history, + usage=usage, + ) as events: + async for event in events: + yield event diff --git a/agent/database.db b/agent/database.db index 30d480a9d981c732af29f5b2a336f63b1a8d047c..5feab4906854f637768ef08f9e1be78ed084ee49 100644 GIT binary patch delta 45193 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 delta 6838 zcmbVQd2kbFmX|EaK!Y(PkZg_t#~d-lZTgbB+ZjT*0!#>T2$0lfvmnW>fiYkM1}5Q< zWblb?$!VZD4A@{BGk|Qz#`1}i?Cerowb`0%?H^N>N>wKG*OGR30-Kqg-K|a4?)&^*MX)V1)81>KbO&Ju~>G%*9TvFLyl-|?b_B-{FFT{-8QLj z>ZG)E2bY#kePmVA3eyVJnKRz%E-LxVMor$ldG7Kl$BL@n(|%*v=Bv#|ICaJm`vNhG zmGXH$-^t`jjFS`jL)klam+UXyT3TGB?B181&$2S3m3(ETpLV&NuH5Y6{iUhXE~nOY z$R=f!+on)h#N=apj;~hTq510j``>Z!lH_!0d%m*fs%Zago4_#Yt4E9MEGLWVvVG5} zcaA>iXgV3Y)~nt>Dr&QG?ay@o&w(CCnyo%`mJkiB4vha|C zvP%$58Gj)Og7lDvtjmQ}EV4N{8HDD{6pkFqF8!cH$t;NPEq#-g=r)_XtXcCFm>ZV|_b;sjP+w?vDq;HD*}P@ol#QFy7)!|*O) zj1#+6*z}ic3kr95q?O8n(v=%ro_*pvo&&v;$6IEe&+FxA(Ixt5S&@A->vKDK2`uc9 z=6_o3-Hz~gne$+;Bi&}3JmrsaiTr~#T@6PTsTCbZCqJ2aDh;;2r%vl!2vYvV z8hw7R^@EJ=QzOM$lb_FA4|5hpo%XeCTc5eUd+pcHWzL+H2V>9B@G~nHellNDOYha$ zr_8ZrsgCK@pg)E1#f4#hqqg{*-OeqK~?e-LUXr-{wC%RcDOnR2V z!j`dxob2|2p%@SChPa`5C+B0mtmtMG?v)gdEbVghJm#p-GOu`Pv5+eiIUny4W!KUi z+h%L`h5s&0H#Ixuu#ReWYlHPylkJ#~8LtjgHX%*!CTU%2+Bo{@6zj4-*x{5LqW1e~ z-)C0LNUNA(>z!e@GWN7zS|rW!s(s&_sX0INiJpGdo|k5ybjepXPb{wFh);;E!V?U5< z30Vr{T$8lzqoP^^WnJjlOGPc8lj%J`wh*!e$fQY%f!s(&cLTY|B(1yDf`4v_Mt@@e z$!vV~mo>*W`v-HZ-~G@h+PKZ0ljg_g8gnnJh!6*y=%w8v_)qq_IA5XU5qXXymPxJz z|H=%kWECIn;k^p&adCwnQB=UqlEt*!_)5-INQ-=-3$Vp`X|E{y+=AkCi;7_Bn&clB z&(eYy!;o{ywCqwOnit%>EEjqdhT$xx(M_hD(@A?o4#z&ECO7W|ro7W7Iz3(&BQO@z zCF3g@k%5&?o|Zg-U60r4b9+RuqOgi3vd9+w%xnJ}(`D14LTJ~2YX3Gv5EWVSNc@3m zIo3VuKYp^n4g@&uUv2Xpr9jSAvp&URmOp4qehXuJf&5%+#pE6!Th#Mp`j9sGEsPbz z*hclYWNeXE(`lREo&VVpYh|d&9t{;a_6zA&YnjDb20{LFYqYG{adi5O3;?#>I@6LN zO*>$}YMlvlRx5iaJ(x2EDh?m4U6z55NV4}nXiSvv_J2kH*a2+5pIn2T#gN@ z#>K`gmZGzarpmj0;n;9P?D|>QK5-jxMWF`Ncg)aw6Iu_#5ZwtaA$!M%%c|&W>9X$cHMW9koK)BxZ2g=Z}imK}#zcBhS3fCGpTTx^C@`8f9 zfgq@wXubspM<3NLFIZ=s?*R)Ci`)&A#ZI;xRZ$e`&<9%+fphVZO4wyoogUkj2vi#< zu6+||)caKAkMtVt&0y4T0vGh*5!j5%+ksu|-0=q##>+0A$i)Ip3We+RzB&{-12QR8 zUKj7Vg06HLXX^8f#v8`z%Gk*+;vN)=>cfrkKsl(W4>gg4=jwyy`rwtgzqy@E#;=ye z%KCFtJqk;VP*}fxULR>Tf*oWd>hDIOPLPS(%CMB{O{k(AMf#22Y80x`Z{IR59D~!M z@?L%LbV7>&j&kE2QJw*3z)HQZ9@HaD;=z+KfA?T63e_2Bnv7%RsNxptx`-kdjj9HH z@CNFvh~2oM_XUXWQB_moYzsau^$=*eKOMA(W2b5p7cLXfX1(`WGz*Pfk4HKliQk{? zPqu=xV}aKxm< zNghkRw$r_DJHgoml}1;k4uU1gN^^22WQ#}6QYdmxAB^gKC*qyQ{!|yHa@r!~v00{K z6D;%mLf31rzp-W|!#G)Cqg){Tf33r8Vg=m&KPsQ-gEgq-S}wt5s#4UbMIgV7+KnRS z0Hnr8&KhSrl4!S~9)EPpZ1E`}9Kayxi z5MlkepaEF8@)vY?besJfQM@At+j~^XuHaZ%++L=3! z9pZOz7bH+p3CPHw2^jw$LrgAIGkr({Orc8ysItPibt2wz3ZNM8EsyuspxScd#EnrE zL2>M(*v)D~)8c>u6Py^OX9oaPMrRKsbPNNdso$uJz&5|xHDEV3)QnZul=JI-1K^ew z1V+HJhQG95W8Vqc{)S-Ks^+65@|%tqY*5mB3S$PCmc_{4)%d21o|J$ zsiGW=mOtiY;-Op|A43B;uuOUIs1Mg~MU^e6asr06@O8(t{)4ZT?B24RS@HIEENmh; zQ};XuoQ#CQ$ujx;BfzV6;$$EaFRLehiPn)p|ko>50v3V zTh*AiD9CxZW;eE@$Qk2wzdq1n+zQ5Sx8Qnjwq(%V#4eEz3(DjB!B>I{p*+sc2)a|t zBk#d&wg5M15pIw&$MBpiFdiQReX9E7BQN+jt$ueCq)4N?-8de?878G0P3A_k_aj}1 z(O9hyoR3xa8d zemd}ghfr9{{w8n|{`+I+BOnNcegUQ$KV9lEz?h@D5u=V-l%j|~iA{+=2@*#);DjD- z1J;l(0IX0-!4VKN7PFgvvqXtb`^544VhUgHtkhu(br>#od#T(L)*m}IZ$7zy{Mst| z1bBY}_aC>cxM7(>#(O1NmN|uHC0`-ulm(u3D%z(`+p}8# z?`%(LlYeh}Su6NE+f;2|ZMsX#`PMd1`_1=OUz+69_Pk-GwF_TaXIo`;`O%+g%G z?fz2RUq3Of0GB67A}jLRwpVO*lSju-&rNg9mpPX8dVN0H<@E8i;Fcs>lHiRLrziqM zD9`wOqW0xc$BS9sKTF@d=>INDx6XJ1+aCVe;QLqbeZgXhK2eZ9C9OMa#*6l7%{<3( z8|4d%lQwUjm$4v2t17n7$M$8OzSJ7;xU3JKO!mRZxC_Hnr66Z z;pBTpjYm4s@F}tbA|*b21MlmqG;Z9+k0uYJwhXm&`QcgbJBK%a)D8+m=?3^>b=ldXOfPy5yLQfgHc@h#B8ajnKhG3UITw$CmgWCkjBT#P9z{#-##o+c^ z-)g9JaE%1LDGJ{UFZvsSKgoQk<{~th#hK6DOs z;?_1*Rn!+jHIVO58?}|79*Dr@;^q~IHLQ;*$mnZ=rco>YHyb_a@3HrmW@v}8Z@_y? z=Ig^v5QO;1DMz?BbP15K$#i9&ol5N@52Y#(+M(G+sQ!$yTX1X+o=4`)n@ z&C6Q6IO%2cHci+qUYrGWKLrBNjX`fgTtRVolmB7gr|ueQFd8pm@0kdJ>wj#pg5phS zDey3Npt=w?Us*e3pm=j_5W0hUHH@6wReFCI8iyoK%z(K!6ofRo0(<{Wv&fq-vwz?vrU{O> lQvFOq5#R#u1uPQTkSKmhIviz`?GL{39LopAZQIhB{{uA*wdeo< diff --git a/短视频合成自动化/caches.db b/短视频合成自动化/caches.db index 08b2556bc8301eb2d8719e041d4f7ea8b44c73cf..b4b2b6e9bcb3f74671592013cbcf06c91780da6f 100644 GIT binary patch delta 68317 zcmcG%d7Kp0_5VFpz3){BI0V66VM$x3>ZVZ~l7{x77+)(pPT)#2Km~Z0tyl=Hc^Sqwto8R-tgRd@U=-XA* zx9&aXb3W&D4y!i(T3z+R%=clOpqjxU8s;%#e(_329{C8)n=}b!@ z_IRYFCHz$4k;GN8j}oUQA4uJkIWqoO=Fa%F$^PV@QkN#GiT6^+r!UUknszd4v$y9C zPEN}fQWN86r0-6CGm}U!PQMnPkzEk~Af?A1&%B&nlX^2#j1SL7vo9nDC-=^&xxU=9 zp-~B4IWhfgnPMlpiC0|H>i_cyxf47{fRj&KxQpG9xwMwmS)-1c| zdZt%!eZOAU&f(m*i&;-6<;_L*4$d+BU1wxC*V(dvzuqZtBXV;82m6ohKc;h>s;0z- z@DO>`@EWn9+TGs&YUg-0vR8j*{Jh9B!Kc&zoSKg&-{E6vG41BO9ILd6gJ4b7e+hmcR}T+j_x=Q`UYsMQMCE zMa>zxfNT6VXD)gCAF=+4BJ#D8ZFi?A0~d4y(sf|`s(x_vx{SQE1l|-p%=0fqaTNsWPXq_)mswZ3Xh7s7ul3a z$J=8kM&@TeNIny9NiJ?Yw^Y4CZI@G7uu4V0YMM3A%kQyY+IdRClY|DZ$e@{FniGvHWcHtmcO-&o{lI zSv1SFLfJ1FRl_eEMXTy~#j5WZ+N$6~M|uPEV?*B$E@Kv)f?stFyI88ZR>d>8qG=Xt zUZvzZhNWHJSagnhi1OtZFkIg?%v!Bn@(NzbDw?KcTc%}IYK3~SqWxU#TBdf4Fr2FC z_;$&5tG?;fE0*n*OQl-5ZWm3vZsZ#*0AGEX=Y@<;3>W1NXzHQisU-YVlO4W1Rvf~s>rhaPhS?&E&epdYQU}_B0s`*Bl z&F>X!g{oO9)%n$O&04)!tC#hQniE*ID^A(tw7%mwcA;R@3njxWxkjN}Db@AU#W&AY zA8gKF(Y32Zt6X)8rc)|Ab=R^BRl8I!_+_V3GW5-jS>Iv-u;W|08y|gJ)zpDUD=|g= zC=yNTiFXr^D)W>bsS`wcm6{JHFGxNmI#;Q~TT_+zsPOLClJI@ujp3!?uJ9;zb?EbC zNi15$o=D!B+m*Y!x&CuQmGQCd*^je3lSgK^MOSCnWEW-2sUg_`s+M_AeKPY{W>e-| zWku%T%mJB1?1kjt(r-qhjVD&AV^#6Nx7E>&eJ@ZyR7U*A$!v69sGb!Lr%!JgEr#D0 z9uW>^H}}suc{TTvSiDm05Rv6-dta&IdqtPUTB(+6UfC*_%4VhRVRNhHdZD5R3${>p z>xNq}YDK$l`8>y(RV|hamSNZITEVRAvx6t$m<87<7fYooYtt;Uu&q+fE*2{#)2>vi zx*d!vbGa(NvXJUdpHVa`wq0>q%Ee-xrD$n)e0egbW}1dq@GHLM7VTQO>Q#7FhFj;! zn%WP8Q7+Hhs+SzQZu{kGsaC6&3kADca*DNTq3UQiH!tbe*#hzlT7{BdFZgz`&Qive z%qyF|Rn;yFhLws&-Kx?NY@n)rz&UVHGP*&3Cm6gHd*w2`D-hzg9IWNi;-D#0NJ+m^q zGrKKZk8X{wiY`d5PF$bZ5w)V($Xk&|BG*RFiS$M~B9WvMel7g7*m0@PQ!k{pr`DyG zq^6|?CqGI)nY=|gD>pRO8k?fbQcX3j{4voP`cCMW(4^4b>IdrMv5S+M`UCa6a6a_U z@D*J4Qu{+YE(%o{QrQb{}kA4_^BK<&fL1qUe=4RewF>Y2K zR<2eLOT3fwvL7cGhMo)E-q>+R`0ufB=3rLVLqGf1%39l%@5}r>m?6Jrx#hBB*oC@L z^Bt>>74rNF*0)-&xTe0iIm)oB4yLJ6HN0}ATyg4EMjLkBsh16-tREGOs$vu!my^`2 zf?s1_*Zg8lj$?J1bxS|EIm$83YO&8VS+}NRJC5hnJkPVOYK`?$uj>J5DR6Pq$KX0< z)vlFlPQ7Tlm@eBid^Uiq2k3!O#k%d3+=5%KmaSshvvA>49)k>A!aW_NHCXcFe$H zpB{XC=#E;xGrcjmqKB0)SIn|u+MZQ&z+g4Qc1uMb6@J9he-wNoyP%d|yX2uTuSjFb zL(yyIlvw@8EAbX-_>`5>^r-`KUT$diV`YB!>FjOU3$sUM56lkC{CDP8nJt-bWe&*{ zGD&5VDCFmMmeq3NMs-c%+scH*p$Q|AivKbGaQy1{S?Z$rEakoU*ti;dIrh`oWy)i* zZ^o*z;nDwzJ`??6^dfP|9bNmhJs7?!e1;Ma_k;mRpc{F%b(_%V zD2`Y4EmRYt65*2tAuU@tt?#%K`qh2fP2Lv}}ns%vb)OjFQ$!FQv z#d5JywvDpMzH{ne-{AJWO3^P=-J)B-&((`8blY;QiqU7-zVG_lKbm(|=Tk<}sQOqu zmjzj5kNH-`2QjepwGV=m6{o^< zp6RoXswH-#W0w4qc6Kmobb+m2!J3!6dJSWY@%PGg%XBLq7R0Y>E2w5km*g8m8tHao&Jfhsb1Rw27^QW4{su2gF7R{hdj}#l=Hn z1@Q+hwx2lSuV$P0-H_P(`_&03+=T3{Q4d-Kxa6bOoQI+_Hmc@$N@^$kXyEyY$?6}yJ zSZiW=<~?a(m8+$-Pt1)jXj=N*uE-kj=tlpEEAWd-M`pimc)7A4b@$?(% z`_osZm!`YYqnchIvE$$UKyr0*VbV!NlUm{(t6r9#4m@Vrjpwx3WJTQg-FSQdb>qIo z0NHQ$SrXXdx`2pRB+pS8xu_gTL0gV}K0(tHC7YRr&X zulu!nwPqIeV}oZ{u2u}c?$;}rdXssr08d?(QK>+fR`K*Bf>9RRq=dJvR$bs|*|DsG zhczkrMUbRj(ML5$l}ff%2Vj6M>wQJHRFSZ?VweT1Dj|gS>*g@SDO9+Wht0&V7cIl^ zS;$7wEBZy-({2w&l>js)JO=<78);z6T^BoDFsmL*(b3iiqso?5s~J_604T-8YMbme z29^962(ntx>SF6f@wsBt`SH=>!F@-!HTGT`FDXJVRoc{4mpE@VbNJNic)Q46-P@*W zA#v|_;@69na`=6}-nVUBIN0`v1VBt)p;*9{)T~mu#;sQiY%r6RSkUYYrf*nmf6+HA zHX@uY1DuDh>CKBB!(wMiB+=fOG(7feWo_iLIIlz_a#`}zsWDdEaV;+^;=on$DaoXx zexQs^FJ&E_w<b&#a2y-2X_&hyYm|K&48pViX8Q z*h@tpuU@sS5}wv~f#KR!;^Fh-zYyuGy|!qo={AOqDdnT_L*;`Ir_URd7qgyEMjIck zjyFO=JAZOpG-(Cz>2HMdYRd~y8p#fE=danwPwYyL7onGvqebRNc3!l;l$;={zfX=5 z)t8bZn|n4psyiRejt)+c`!JptCx0hCR!(J)&`K57_;=#t`v?ZHa<*T`v*KHw3P!k6 zC{+q>4KrlwzX%pdwa(+iR~K*trApl@n;=@(#E=-CS8{bG120i26Mqx|n7~@U$kO&f z!L|VaG3=7->Bk47e3OW~ zmFyS+dSGQ2K*2TJs#RRSZW1`z{NFbK+?vx^cyavJ$lA#6B(GE>vOE3h0kPy$EyuUK z92OIHCJTMZTccZ3>m(Xf55ulxlt1#MKgiu3z9M{bxUQ(-e9OzBe}ns+#%BW&6itSReiM9xFmedX3v#cr)7ka|wsz$Y_2ULLxApv!P zvogI}1u$77&@JMHYc(SGvaQF0lNAaWe^z4At+O19fC5~031cWRd9k3qEbWQ7&mESZ z6@D=Igi)*!lSzzMU~EYOk}~mL+4i~HqOU*D{3_K_6?5yk01ei^ZB+=$3q`L`ECa|( z`fcKEJu|Kk7Xi*-PM|&5NCk*G+vRkiNGOz=_HgqiiTWz6U(c=>KrL1^7#tEo?leGw zc3<<7m13z_EU@TZ%VYXsMX)Lc4+NZ5E@%O{X-Gl_|3FAj%qE8Im@}X=7l3cV$0F>G zLpbO=wOX;{7^O>eELu;e?46ke>n$LaGHd?t3hU>K! zb(Ok6wbX3x8#zBWEc^F=0a#b*RkwJ!OZm1QskN6OtH8H2

dpE%HvwYa6c`l0RPQ2pt!i z!Y2JteL~&J!`kyFm=YI@f(bBd6?jn>l<8D)TrPOkuNKX^c3LosK!Yf^Tp}8GSO(Z( zA`fhjU8xZ*7+SCB&@*R*bC(bluscQs6KR$Jw#4KWK$%sl0+Om_ARcbKSn!xN{pZ2C zZJaS?vgX%d$N+tIkqwC7_t`f*c>P*&Nn7TOzF=&TkWGdra>ZcbETSOd2jUxeCfhCO z!-7#(g+NAbjsk%;pQwRj0iEn;!ta`;FAGLF#WL6wOk9L`sFn&2VHz8&P%hRTV6=Wh zFsj57Ex6U%)N0)`OVYL*9(=J=tYRbx*|krDVPzmq706&)7K}i{G2>mSKN897bK1G5YdVh;AmFbHTWb*!2Xr9%t> zNpyp_{-E3$P4}Fe?B><@--OeZYZqIkRlb#>YDjhb#LlX9uKV z6Xfv((+@~;DczkOt;`nF3X=zlIr-kb65|uG`0Mfe;v2=%Rc#|3B^3FE@~6mkk!4Mq z36klaaKCa*_>}PU@QBbS>fwL^2?UM}O%Cm&{zd(bdXrj|!L!i}p4p8?kts8wwM{tk z3ho1s>{lFD@^-ddtI25M< z&s!_9UkfZbyk|iVB0)k-fRzP%Ty%`SU=+)+BxyvmPR!`)^Mgyeez9D3ojM_CnMk3C zrMDp$t2Jn1B7A*jFv@Z*i_oA#Py#h$ONJAJM${o)c-_|nFVC0c*;Kh7qGJ{fuFt&8u&5xLE$uhKC?XO_C#Vx2Y~x~pVBBSl zf=`Fi_OyqZqaalYMO@p&_d#qDpKvl8Fl{@;E835PQ6n%_>`V&~;ka1LB9woH4eI!q zKhr5_=ZQ~V@;k+VJN@C&bc_6q(3j05@_SN@c$qi;`iwtX{5d+XO`Pn38Gidd^>>iUo4a8F#g{iP$s#`2I7;jcAF2ea7ao@QQ)sW;P@v`m%4l)kPJe7R6Nz6Q zKPg@#$Jv(sSlqtTZ=a?nlsDCL)q~adLl?#dMgJWAb@T_(^P-1E&1gFE$H>Ext0QMc zW=Hmqgu<^hO=$X_bbtDk^z`(I)F-LuL6ZIM&yt9fzS)BXza$%9>^`?C{9iUXeUJH%h_>>4fZ{l}oZ8hTl5e#Y+=$3EEAE?S@U z&k%QBJ-$ti-Ysr>)?e0z74*pmxmCbZ4F`zxl+-hEGkGFnUrE{p&kF9d=CXEb#0z!9 zb^tK=ooWr5hyc~oE^hqfzAjS{CqKk>ZgY!y5qqF(f|&78*QiGEfv%*|nD%@B`(g3P zy>Bhq45o`+2k~>)HDU&XbyqHcx3pu#wgOr3|{jK2H6*83x`suu#L+#vsxwfs_hm-AL<&{XEATsMUbjdAyDErOC@%E$s#Xf z;u~~5_&UT{70@4{a-r@5nO$rzz8i8Eh*`6>_nV`9&vm_0onQ`fh`@jiY8s$r*Kl0N z)Fua`Y*?EbP=*wMErxeZ*-O0eP*>;L@TOK?`!>Rx27h)`EPZ9mv8-oNC=59Du*?Ky zd}Kl-uFMO+Ay-{)*PeA3`aJYv=&sQEOgwY~3$Vh%W6`O%su!q7s(NO=@~Cn{6S#dn znohr=#9Cfg-o3oCSKxrf!?%J;W3LPvFH9zTM8&S-tE@VduB6_aq7U`O_B3i$2s=+Z zQ>>87q5jgK(L&obD?c_jG5BUahLRNtk4GNV^nDA=2Z3Qh{gO&6X|FeQbHIhkaAu{X zPFPvu-bn+-i$4|ywD%EA5oeIQVcH1p$`zl9Ws#O_17KCweimE-7hLij{9xSxv129; zax;9QNX%Zn0=cC?9QEEiWjt$=P`^c=v?gDc?n-Ts z-I3d+grGVuR(>8kPB|Nj)Qn`%vIAtCkh>&mWy|FH-p+ZEUqr6U#MQpY zvh=7(uUeE@zx0)T*=_0jQ-i~=secLIli8I0IP+L`je0n#oKsRSgr_UB6FVeMgTA{Z zwJ!9$a?KvJrv4_eJn>GG5>7suS|TZ!?9NO)clXyUS1{!~5&i?Px!7$B{0vVk<2`a? zjvqE$y}j}3&Os~U{a180sTr$^srTVLNI$z61`DzmkpfYaTy>SI_APP4i-X$5tyi~> zjue7f*1}zRqMJccar8Bjyg1_O)-Or*-0279)yxlsesybycy8CA)5V{^-#Vso@=Jqy zm2l=gaQ@F<9yDfp9mRoVR|}+_NdbBV2Zk2G2I&)6pR%uC6MPdqDeI?JGSOVXO_b~c z9|Pjo$|P<*OLxT$-*4>|t6mv2J)GUixgSKbB>wWsp!-61^V`hYn7kVKt9bg=K|fd8 z#V~zJerz(x%#r0F!AHPA6kTVQ>ZCCUJ}rV#c1YdVcKvj5TR1=bSY>vQ?8;sGe`g7l zv$L+`2!^Z5&&8BgZ4(O0?D)p`Y4L;N`^7$s{XTYQ?0d1}V^d@MDu0UpHTv7=&C&Ct zM?~#tj+O9syD0;hLKH3W_V&s5glxSGAoVMA>c`W`w8WOP&Pt2P`f4E?f%s z0C7iM53IY4<4xCrDkxi62g9n8LgX>x5-L&xq6gO9#h@0+4#93ATB(p@#eSHMBbfln zD`^2^1d~qs8xcpJ!DPdfgJ3bBGWU-`x3K7!%E#iuzSqH|GGqs&k~pi$jFt=eZ5yzj z+L~Y#geGy9LoST8eWgZBq*!wu$f0tn zrp;6&fplVqI9%!hB`zdqkvNmaL-|DtT-|GD8VLt520_7Z4&4xFGPYurq zj|_bp`d#Rb(8ZE~3AJViC~v`_|1z^Vb8b_QA%m;zBIS{0fR+13w!Cr5kk&ZoSe0Cq z+qH4QkfDo|YXgMxLiV=Ub{L<4?@_I-tZcH&!M87m$I7iz<+TFhLcgByEw207PFc%Gn`1@{(>M zAqpo*8if!Fa-v{ML<5^tEo*bd()f@L@kw^bRgH(jL+%WPvun7I`(7N1E^m9|%J`6* zBV=7I;z*n&nI&upCIUjq!VMOyE~`_Y`sExr1dJuGX4c8wLl!`42FYQ_E@)W2z!Pdm zb3%sRB#n#cqymct6AYK&Kp@vDke_-gh$3w=xF)idl3ys+j;@eRmy#POky;=jux;&& z+@&q2+g^=0uLiP{lSFP3l@bgDTz?7SRMpl3b%k8`SUIi;rAel(44CJ}fi3WLm71x4 zQ>;6*ZCnqSpG;icF=R##9uCTw?M(jFAmv?iwdKuQD-i&Dgus&Z3g!~`k1VSUT7!u9 zwX;}z-D0?>cVG;P&BzL$ZLJu~el%SDM*S>Ml9r>T$F(N!Iz9Vu4 zA68y&q(2z(w_GZ_N_jAx=5Io`|76|BZ-vCg=liP~@$g6`+DNST|E@-PtNoJhMl>_> z+lsR4uFD2}OSwoJd6Bl?McSx~w9yx7?LXDVC=X8zwSu!=4k@#gv5Klbo*6G0v!?PT zoR?f%CYF9ZeP4QG_T%(vnHA}S()%fAr9O*{%ght`onx%N@T)S1m6#j;S)x--C!#Gc zOV6I&36-`1mCUJ;Imm8HO|Pyz+~o8~Sezqyz3>&%muJ^BRXb5Dw<~jl`av|So)>v5 z^R5)jNZUa^<;y>EH4zo~MDe8brI@HD{=9Qct9W*6{*1Y}j5Oqv6)|d~+0vh?3a{_l`rURe_D3+>a(0x>RH}=;`Jq5$xepNUcL` zAu@!Vfc^1H*!vp1jP_r_D1?a~(I`FwNr1uPheonxLd1aXDI403=DCPZfF3vyQW*|R zH3SZOMyke$q)06U(Iz@Td{e1dB1?^~fH(u$1j$|gAXT$$?N%}Vl`$P+_}{IzXl%PY zvp9N4INwPBZcKY@dI`>x>@4<*lc1NBS&oWSPNLbV+qNFqQ3xKqA!egYSWvANOJrDV z!rp2XTUx+e)x?Td#w^d<%pai#-Wf=Y89`|2REoT8QV})%Y@xq8raee{L9?Rl;H$%W z*T|8}vXguAjqe=W8HH8zUh@KzYR{~!tVGQDwW~%J5#HPf`#C+xFl6jV_bnLT81YY{y0G>^cTqi+sh?U@=A8m*8(Rwt(YXV z%Z5*|gyaQHsib7wdX@ccRP4A>*H#h?w2R!p>3N|lW~bQn{FpJ~V8!h2zjXXa@rYuM z6Dyy`j1N%Fb}`}kF=OE(z2V}&pBWPuhde)K6u^l$;?IxSzm24rOnf4x;{QAnw1b!# zvbk)DqE-^EAx`$jbDTf@+0-`iosck zIfW<(%EKDMbmJiFC9I6hej~I%QQ{lg{{%CS3u31hks|xv@xaJBie)6-RDy5@jff^-!3ZL>Cz_Xp_93J(3q?#b-lSF{z(hN0+b)b#QM+G` z68h^kbOM`1{yBWcuxH1-A&we}LvDY1%v{koB%5!vrp&_#SmUrGxgGGF8`5THJ6TMq zUdWd!>QV9*M2Ymmb`W5iaCd% zsg@0A?V~x9SF!PE&YHAzzet#{N+vpCD1tO6Y0VKyE%Zqu2s$nBA*DP>rZ49o%v;Q;l{aM6=75Cj?_<((rw;&wKr<7%=;uVpC&E;)gQ5W zz17~I8Z){vPVshy!inpd&wU%S^Re8wC0+Zb_{(~0R^!_dZ$vnpd7oL^=T4r~BMI-U zKv-Lm=^Y#PsY)Ul4iO@uOstHE0?ixc23pgAqZuw1ad=E#&Gz^ZzTGs)uvft?PDMMs z`AoO*q_!r#jvzY;BUT55K&;j!t%(E!Nk|>XgJ=?9RnTtuav@C1cP9TVe@5%cO04>% z_FbGE(smXT0%8P529T?yy%l^SIk*P%pYoc!7m$EH8AcRAqgiAvvw47IJY^`?GCGr? z;-!>#MzGT{>tI5I>o~YW;y}I%DJ`T$Xg=7I`i#bzX>UTa3Z_!0tVHs##EHy?O>Dr4 zVH{AElqA(UFSwhbm$Q&Fty#CFz5mVwzLa1+;K&lOQ)Hkd_IVoflg)^uvfeo&wd^29 zZwWq`T|YA~hUC0=(6m{fPVI}l-*R}%?htz2A)&j%-Qm%Z&5?5>2S*NwB*JfoACR_L znG3hNys3)}eUZkd@6kp^ZwswYy+{&ycc5>pG&LE?Tlc`7#Jfso;?d9vi5n6t!>1?a zCnh8k@jt{Lj9(Q$Bi@tQq<-8dCBo_&b&*;Q3w1!`m&$v}W1$zL7b@42StlP5r=%;k zD|UD6lGuqcKQ=7-_vq6~H0nn8iXMeVzAW?Zux*dYynA+0=Dpk{;qI?iYD7P3XhB)6`HB^A9YP$(ZuiztX}agO8iD!&|?n89Vmss66o6fx+n9s@HRw{ z1wB~eBK=M2CEgS7ujg~)*H}$)A9^GyhbqFmNG1prVO5Ylp`Qh))=DM)L2>SStEZXS zmk(FXY!R1TV0H9wKVXEoKH-fEc4L&?7?{+*%*jV{uSSnzT|9B2b!r$l+uoRRk>$m@ zi>z8OJ3A48g20;Smz`NQ5FE(RNneXLvImO=9YsV7Vd)?*X2Fx+m13VNJJfdcTZ8N5 zeq`lEc9#|FMh#tK!`WCrAEiE+n(`3Cg=um)eO>z|8TA4wdz>8tt$Lw=h*}02Xtfv! z6v8oQC_TrssAlrXrkpr^r3`=5_a|3J&Pgqa%t7v#j*L@OsS1%R6Z&~)GpUdo zEa45sMuBcXJuJO6HLZ!Lk{`)JlVHt?7k63{#Cf-++Eg_z#y-uWh|i4@s_rAMe%k5~ zr(IxyBTndQ6Uk?+dE#~X>jlqPJ>tigSYz`4=^=@omsrd5|7p^NcPUqzdJ(7o#`nT) zjVsq!y3#n{d23d91nCWO`-a8R#`4KDhKKT)1!~oiirM;h;q0@~J0tBYV1e$v-25<6a`?(^T4*7)fzLL!1W zLQ^uq(zAk!KM)6+b(P6)1~yp(D^l-iWi0GrVASkO0hTc0G}I=Hu^@ybh92c+XpWlJOdiWQYVwp=AL zXC0Im&a2kdBqCY)gU&xN-}vZNYk;yg`hml%gfgZ4Nls_29H)$H^52)JTXQGEvP?1e zR>r9dns!*tD(5t9FAnRzz;2WhQl|XVf3B7&S)xBU8Sw-|7u+E<0QZZ45@g#=xiw@Eh z^g3m|+&me033h`=D$}z*)&=N!bKm#>Z2l)=ouEn(E>QZ zjA6GOpo2{IR?+nVgHf)SWtlRD7=EXDE(jHrCO|*ON6|^b6k#b5Z;3z|8dUpJFlsvK zADgT~8RnMKJor$QVWbftJ}Bd?y4ustlfkG;hLuSo;zf3W$hyXQ#cL5#*R{vRQ%RSd zkItq_83yK-l?@R~6$S{bWKzv!l(p+bCFORC3srZtI638hUu;&~(T#B0Ehu8X;fsEf9Ud)4G@dNG#N5s1Zp!;0e$QKOk>Nqz{#4k3SZ_%y7bevu-{BLM#&`+jv;y zIGzQ&1&L6D(;;xMEhISFTJb&~=)Yt_URE`<{I4;i3>n2^8MBun7V|1`cA8JUuMh&B6*tF- z%s*$7Siek+lX0W=fR$Hco5cc^xH5afK}bQa6GL;{+>H@)w2TYJiu<>Qhl_jS=2>D> zhLem>@U9v*M~O8mr*q}u)cy7zF3w4qhvDPs^b5#su#^lIB!LNBLFXXD(F@ zW5kYx*}3r#oZ`O|=Ggpy3J`>rBn+LBm1jwEzG{e1_IjGc#pbM^YObNMk8JAd2Qgv?f$?yiT;4-%}AHFxch8*a2=@VmjglAwxUceUy$+F}v=}}_S zW$xg{j?3I_p#Z+1e<@*Ni>PW~EXV*N4wF$jkEFtycJ#q=HTZrBA0ZXbvTmBVkq2J# zkbMzb8op7{ZVE<82!cr^)9G)HeFJ#*4Rb%9g@uKKE|SYpojeof4&Zf!Du>H_KC)era38M2HB zg38+2J89!0R}&W%CXdekd&;Y!UsjGOB0opj(6qPQ25=MU1~Nz+3qh4Me6K9vCcOme z(tj$y3q|y>Q)G%Hk1IuWkalDP%FFV_8F zm>7P3cfK<_HTVQeK$4a)X5eT%GS8c`&N{I^$!o8seOHbWnRmRrcz4)D`Wf6jdw4V# z=x#`CP0NeY@QL%p?zV|kqiGXm!P%rXHStTaY5>3dc=*HzMcWv+O^tsjKHZDIIdkB| zheUO+iKB%vXyPBlH~kT9YQ#kwJ+Y(z^$AU2jcdofOHDNTZO^rc-fI*SL&4PGw$bWW z8wb76dw*>sIX0cDm_G1*u z9U`QJAVF#a0ZYML(bJa%qu?44ghS7e;U#HHWJ9GG1+$VfCx5I5q(Kcd&!VW1pLZ*L zgdl7%*_D9eMLd>WFX_PsBEJ`uL?YRf8gJ74>}eTv6J?`parFR$$<#h9CgB350p#aM zgyGRVDvBMjQnji*-@JV|P*QyWdZ@Y@?!U;LO79zo#5Y|-+uAtdnMt=E89hq*6Prrp zcXx~worTGDRr!-RqcFKsQx6YVNYt_6Q`C%FY}`_qObJ*}K}yjNGeSC@1S$ZG%K0ki z#G{jQK)UJc=g6BNF$j|-dreTO31%f-C_OsHifk&}iXJcrl^_ppL4>0s#T!v1LX=0c zkwgdu50>`(=DC1+kmTf1OnVSKd<~`v@hv43=&OolN1L&>&z#)oGpDS+t}ppps2D{_ z-kdx?=OvFw+R0qv?Zht<*X2%3EKBqzIueoiYw>$hU&Q<4BVwP#o{#-F_TAK7v13y& z#wN%1QNADjOY}F{oza`3ebK|C#b_q-r^wGE*Tkns&Q=X6#8eLrq?ir$+u_T@CxvU_ zw$MM6|58(-XG1>WyDk00+W|p&NI*t>eFp zk>yvEjMM*)3^u;vF6%#N+z4^D!~rkmKnM>j?hbKp&K=RXNp-{VaQ5StKZ+kE-8TZy z0EaEB{-8Kz?tsLKN%pu3wN8EunYgE~3oc9%dId`ZC0}G2k=;f5!E+;FQ{gu(1kO3)Eru?>9aQf+B-6p~~pIx-t5 z-T-s}G_>-Fwh>`V2~nekc0TYu`;wviFPUeDRhDDX!Ij?Ie|hgat3>Hk2k1kf)r zGlkLQSWzyJQsMy^Mg3dimxourtbEw_xJte+b+DWwzAgUEDAZV61Zn8S2_;R+cYP2u zqD4L6OQ_0*;U;_`7%ULC@+$y=!Z&ifxV?(*1m}X+z`98Uidm;bn=&8GHi(2rp&n z$>3zNfdfTplzHGZ&|^|8?Bl&rY0-Y6QqissMipVa(Gt+@fGC|N5GLh4QY}xUB3m=K zS|GqF4&l4BV=^YnNzY*Qqcy3N_xygx@fSBeAFcC;NkWMmVB%Kht@sLTDBbV|`J&;b47^2{j=T9OAc^r`( zY7->EK3<73H%s3yxQ~Yy_Kp?bI=HvJ4^G$RZmDmk9s;2_cOmZp1q~0+)-I95J)R7g z1^U8n01Y1Gy~lFBLf!>nhc8R2gtsW{d3B* z>5+%@ZEmN%)}+lNI8NL=l;eS$_u=Sn9>B4@Im5BEnQmSYXLE?7z3DuT)}|F4i*F5_FkMH?!U$ep2Y>lhR=Z)}s|5K$eviwGJ zSCM5mx*X5B(c*aajR$Z%>&9^$&%BW=P~?mo^BhmVaR|qyH}1{xv>TzWBB$PnC@FHv zjnu3}PP$R$_{}Zf=J<^*%Q>F7I>*I3Bmr0RS6P37(u19$dLFu&F@;@>=^tWZs?$n8qZqeLver_w^!S%`~wceHgp z`c?Q4e*LQkS9?V4p%cCmu!|kLJ4T3OvO})^KNsrth&x;ZAx_YsCs5w1$)m-o8&K;W zeTCL07G2*uL0lnPM~m-W-#Sy|rhCJqsX!_rR$P{521y=(Re&0VxG-~pq^(}imWU^% zH2II0wVo+*u}QUzt8Ja>AZkTcg$xOHR@S&91ChpGrlv_1!$?;xEs*4klmEJJUc7xdUwrFzt$Cqe z(b_Qr3KP2nUmW~?B2i!UlFY%nqzaT^O0P0QjeSsZFZ!%pYw=)`&&E3 zs_S?V1HMg|n@EUh@`Ba=*6D#`qsW$86zbX${mMiWwRf`Aog^~i2-IlWy`t+XK9K$U z^fonPiSPBdE)(IaIN#;haC&1S2Suu~i}Ef{-)mS~G<;uh8>ig0Z@%&AHLbcL_Lp~Z zeDMQWBy#yM*Orf8Cro1E!K1@CWIO^Ep@g+Hk+){dbWH^$-sa~|(|LN|k zvMQH)v1J~~XsO~=mJyq07uQ+`X9t9)&|hPHs8tP$xYaK!$Ws+jUR>+R(+ei3{-zyL zM|5G!YhUSssUC<#mW$gL*KQ1E6#@mXiwp^nWfE2Lf5}TB;XxCMFV${qEIYdPcp`{$ z$jXu=AbOO1B>WW|3iUo^m|7MbEfMs9;wV#!FXj6%Hl!)2kRhB$cEudvbh(Beky8LL z2~y68xbUEmFNpELHPo8hpted)`(rQ)&;pAgICzozOCf@@xH(=4Hsqq4I?QmIWX-C9n)9H-k`v1f8v4FGmS|%&dH4 z;iwE&UsouLCESkYT5wNC|fJyIc?%!`|ShvWczj@ zoJkLuxI(;soYkhrE~9{X;&o!?Rkdz$$zBuB6yJPv?>05`4>5A!#NNhjSJuu`#6ufu z`!xpcJ#l?Z27M2R*%uy=7mp5``2FC)@vP9kquU2F(cA%1hUHRL4^!`w_;rf^;LvI&!sgpvof>v~`UI5kBThL4S-R1MHcn#DxKjfJBvM%B`Td^WB8 zAX5=Iuur%i5=atgWIdqrV1!6i|5mKJveqF^X`3k9!y;@s`!@q*Mg7EiYa^R#jmW0@ z7qgZ5BJx4KZ9({FQdt{*wb>yFJ@1}wcmb@JH4x#Gn+3`7k)LC1 zkR-QF7b}QNQy&tHLW_;o8`%f7o^+T4Tq821e2qL5�y+f>CTgs))g|#N+7bY0o9; zAT(mAj3`;we%U;ifl9PcpN5)Fx(wN^QtDHo;egUu9c^>-#?YVxO|hTQ5r`C_JK0bO z|0v(15vX=< zK892a`F|c2wvGKqwH5Z78UhpHuZ6-xH{}h8rTbxe7yPq+^M!qh6)i_A(U#-|0EG#O zc&d{6LVYs+CfcRW_yaO($}UR1*aRKQj;0DiT^$$6TjQt4yW^vk>tkOekNlT%!ix=! zeyq%m?u>4Wu8A&+mZJj_?`GFT-czEH$5bt{iDnw5$VwW^&W}t`Z%M81Q{IWhWhI@g zqQkzvkbEk%U3S_GElCXteXcB5on|B-TDK>$O+y2^XlA#`wgz7n#lv3&f8_UT{`A%F zb$agozXbB*zl`MN$B1|7U5bo{QrHUOH@pj_C}ifKDan?3`qD5@X-fhXaQ?5K4w6SAhkkGnSNvhUdwLTYYU}B+F{QgZCf=OJU4(kNNA&L+Ia)m7 zajQ2S#JBpp$KMZ|-rYWelrB!jrrRMkDX5GQQ9wvzMrHpG-_)*cz?5GZYec8b`234T zxKJOUMlY@&c~I6_JJdUT?j+S&?h$x`#Z5s;fDf z$7D~Ie3L1PT}+39D=6@~I(#yv;z2VOI;7qodQNPa)7E}W?2cwjEELDw=pN%C=hq>K zKw2TwA`oE(nk(Wg4BBO)@v4Ak^i$+0()4KVXyb+1rMn}l3|MKx6ugJb51QIzVn%pK z?+AK7)2s;VfanTccbU2#2wR$}qO~VetsN)k^il=3D>URx@xCkt`=L7I`)&WJDrib* z$UHGf9WqK>8XD5wxMW^iBQ!#`NI?@r1VdJoVo(ngNb?}6IR`$NdJi4c+ne~FL@H|^ zN*TtBa0z(|trcX~WU_K3PPOaBv_t7h&g4AaXg{p&F{QbdPTy}I@|=gZjnDt5S}Aeo zp>1c20dw2hNB-whC^4?LtwYwpjTNUH(RNZ8Mz~$Pd_>y@SUN~`ZQD%RzrD=QNMw7b zP_(?TZLE~nUM2P!H6`DO9@%E1a*@?x+Qm?c3m3_^ck*jy8)d<_$X{uhin?hf^{XE( zY8yXV7T1(9!PKo&U4qbn4p^Y2D!NQcHLBXCV56lE?cu_(J6Qgck7~QB5q`Mqv%aIl z8}Odt7FlMf%*m`wEurk`Em>{|G#MpJ4znL4c?lCX(At+}zK(o2qS)lZ+^%$&WF*Og ze-10TfKb9xx5jrTZ$V`^ALkZV#%0$e-VvLob&s4An<9&rlyj1r?CwkZz8%TcYPK1M zG+Po$aMgrX{|>AqQyM!?mPI9>l;JRqdFiMno}1QvGwYFfgY<%da$9zhLO;qHCX0u< zn$`!}kHoc=?q&TCbdC^~*L|J%p)+Gl9;YPJR9Hp&NYDTPxt8bT1<6ITZBfU7A};kGGUmOWyMmKJdD;vRS3d^9{Q zcxVspJ2c<8eR}tk%19ar8D#WGEz=~7{YNNE(>A^@3KO~;S=#Ahl{uqRJdVYjPAxE5 zY9d~QAS5l3CXwtfz+9FI*U-%WQ=VO_84>Ox9H4vzE*(WWU49U}BWfgFU}!t(g4Dfi zI=rxKGKWZ<4sLXY#P_3(t5a@_unABRu*vfF$StB!qh}#Cyd+%F%HZmeFwl0kpl8KL zUELicpl{i3$b!(eBLM^57E#~RpPOsL5$nf@Y2Dquqfs<~0jZQC21Wq|ZlLD@;Td-T z$}Q{X2h)>V#+LY9clY?|R0)DU%Lefp(gbWg!3q8!^$}qBFZEsS=j-h~!GSe^&D|doROIT{pXX`3FtE zAtv}eu6T1+&&^_q-*b$(cy`ay#;^RIRmte3KYINS+5ZvKX7%j-rFX%z93+&Rl{r0^ zwZ%SfS)_Ef#9p8!vnldU_G7e@6z76R zm!qhho0%WKmo_4uk!XCRIBeDQ0|(#-He@EKH|K_?yVUb#<%zg{)%4cJ4&ID4m$QU% zO%Mm6gmH&tCllh5wuNiQOM;#7oS0d?RZemp-5*VGp{XFR3EluL)O?UdMxje$%-3EG zMnRENw!{OKp2Hwyq_GAP2Bcv0S%Z}iloqn;jU;=~`Uast31sApvV9jNQ)QqV7uU82 zC!;cyFvkhn<=7=82voG;qp0kHS3tPW8{j9*b1Q`i> z01`LS{fIIe)*`|hM36MOL(-!^+}QrT>GQ*g4tsdbM0hyslc_MaEpLV9zy%nyr#7bN z^~)8ptI{)WaCVxS<-Op~o`1qZJpQ}Q+CJivNwY`O6J_=|F=+Da`Qm}ev#%DXO`Uz( z&A%$njt$)S$uC~ay|Cva8$Vk4?cDDhS#$Qiiul!mvj=APymR@&Rfp$nG1Th;(aq|~ zii+1WP8>h0XMgccujgQK>8zgl;vui+=;)Q9&fn%<6s>;G?0;XmN32z*&AwTgHfQO+ zEYD-9BaY>V^i{neoY#16Q~uU)H_f%E^^ir^csjbs5PMRb zKt&lkMyZ~DTRu=~%&G7}*x@64pfM^vS*W1^4^mQu2`Fm63m&`v96`uiH|1CK(cKy$ z29?IN2ax(&8Vs^nsHPxm1IeL36r7bZKKd*`Wzo`sq@vWz%N!Rfd07}*(vNIj8=8(p zK7kc^BoaH&qf!?^H8za_?2FCBypc%*eR}dq?`D*_yM~NXDC?~o2<~$ARBn(MCJ}2K8 zc}xDj5F|7B7*Y~9Nmpj-@F<}n0-@Czq>NYBR*27U%hQMvQ`k7`hk32p7>;H(gfDba z!jqu=06~)2rTl|lK`>*Mr*(;Kx96`40y#14?@|)DU7Yyi{I#HsIiDSs2%p+A53~`9 z2&*uI()WAB{KAZ`GT32j^slk0>F)T(#G~oa@q=V5%hUeVm$i>8Q9w|^jCL-k_b-g4y>>2Ih==m)VHh?3Y zic~R9ACNFMsW;E+>xVA-eOa2iO@~yO0siQ_`1;YIxvaVv6k8SK*n(;qsIC&)N zL%*5qrG4Oxv0*w$2Jq$7aB2uY<;EdC`>T8-wH{w6VNO6t$_M|yqp4sS=Jg8yQjiBF z-7ay`jBr};6Ts-+_RP60?f(bR=7C8w9&FMBeUoRbRU6Sl?U3A=7-cMaqJ`OQq1)3}iq_rE*l237`h(5n_6|K4&eQYg3gWKoLX)so z^C@LmlzJgsPLB$DWKJb9Ur#R;m+W?i@2yZR8hKm(OBXFKH#1fI%NMtZ=XN_20tdlA zt3W{_GJ9&)hOWEvO53%$pQlj#QSCu0b>Xd0z@>E%$9{DGntt{ zAS+t{v0|m}7Ewe|45F#6Rs|Q1OKnMTuePG-C=eJeR_jKvsI69rmR7~8X)9{A>hFD> zdvXK|koWObsh$|5%MjN$$fzJsgwf+VJk+V@Wb~cC1IbWe>;^QNh5Iw@?-QcFt-T! zkm3_*Rb0Dzwe=sq@i%o(cH%a^9AOLDVBBJS35pydDM4}YOL;X~h2bs^oApP^+ypps z-(RV@$d8-GhWKLH|^AnD>4?O^acF*4%FOZ z1=1$Tf|RBK?}K)Ie$Wbmw+&d{f6RcUK_?*apdoGpw~BC+&h$%3=B3no;T-WF&?WWc zn#j{*xXt;T2yi1nCf%5DZ0R^7`vrImRT1m9*qv)587b-g=Jy$kepY3U_U%9s^FejL z0&WYTec+&>I0n~*GaK|-Z_0NeAwYSBTpvwti0mb)j%P!!B}^q`cDMDM{#%eNajDSN z2@58j93yEfeN~}zPs-oY+y?OOWCO|T$EMvBxgcc>K z9YK3YY|qV+%ZRbYraY&l=~(RYb&>m0S}7uO<>9GuIf5<`HTnp!A@n1-4oU0TI-UiU zgw7{521qCrfC51JJv7KX!{hIY2Jl` zGSE?K)6j3Z)u<~%Uf!tx7W98$J0;ZFhy^IN=%zVE)wCcJ*}H(Hu`EE&k#>=YoS0!4 zinnrSu~+GiMg0cv*$Tv_@3WuGByei}Z%!5{ls^_6~W~93Y#Ii<5`lbLH>05Vg zw(F3&{&yDDtD=P5hkvCb$S2T-aDopmm;(6Y#-OQe7%p^a$RnU;YqaaRq!g`4QhL7RY9z0 zcj>QrqW8UL9M2rTzx3_4mFvCCG1-;0+k$fcvwE$1Zc*@fwPs_qOT}+2%ZYVAQ#LVW zGSh5(=yD##qaP(X5n8#&Mb@e$m2IzZtpT z`i&Xg{ZWVYkQx1Q)fd)-W~4@jtzVnb^*i=j517$UuKvAszZqTr(*4$bX0$y1g>`T5 zsI}?GkKJJ1(>rWBqvk)>-DY%3*8A37W;FA&CToKk)ujcj4l@c*{I}I^MrCj8x7PQL zny(#FW&Od7R$pCXJ!eL(E3P=kde#ij|4Fm;dow!g=nt$!JH(A$&8MDIYwa*Un}1cR z^}F6t(bs)!#9)ewN{wXfd@{oS}!rfk6P}sE;ggTe;Bovo6%c4KeR3~quqHE ztz~BP{K!4lg=X~BA8)WOFrz15_{3UjMjK0-t@F+3zUv;dmY8>HSWkDQADbWEn)#}A zo*CV+VZC*(8C`wlCDu7+)OvcAb+#ETzb|Z^Wk%;c=(f%@qaR)Npml~Bo$PSxxE%n$31-DfQ}qwu1Kt<%h?{G?N?ADWS8)=KMCGdljK&sdAhXx!DW zSf`lLu}f~VeqcsJ&g`;I9+cLa`1P5ck6R1P57Ra-v`*?B)qi>BPpt)J^hv=<)_gPi zU}eCXXGZ(7*IO-S^p=02HP?)G|L`?yjv2kQ@Hf_MMy>ko>z_Gytu@R1uye4oW}4Ba zH#@CnGy3&s4_ZxTv|-yWtI>>paZIPxU`96=+-B9A(a$s2S#@S~)y8aVhKyR}iI%EGxYnmCI^6OMrQNx{2TTwHL{^@8dVn!9-%dD^& z`Bsdvs`aQqj!}0GwX9dmZxG`r~Rc17F&~sL$8D;(^W>uI`%JU7@l-^O@ z=MTSam77sd-y*BbjNW~IiB;;1>M@UdH{NBHm>=R*SOGJ_E3o`#gnhSsW`vohWl~}T zi;=ZFvHhhDt5RCItus!WWIfsY!{!uMp7liU=>NKj#i$-^WB;F<*w&^)Z0!Gi6Wipu z>M842=KD@RKK~x;mu5J2VTN_58I8R4ed`xyGE0hU*FIufPnl6@**Gh1Mx~9{Sli90XzlIRHZz*|;?J#4Gs^v<&Dv^4 zBd$!hwwRIq<&)NC$7RlR^%>MBBh{6zves08led0~b`1#%l88nt_gmpLDn37e%e%I0 zS1kTYFqDFmTF*IYTd}^JDe_(5IF2k-stUiD#tbt(ebvrAfEgdUq-C^*Wr=cljnH1UADf284Fwq zX3>#|Man(NdxPq{ri$5eD|V@!%|0CHV=4y3J_?oQqzrX#2WJt6^cmDIqrYoVEGu5& zO37az;uqw)2&$=4gPNkx!{NF)EBEuEHEP>6wG&m(7hdQ4srZ*wBUR5k{><1v-fI{k z4=r~f!Ay`jC(`sy^w^KsA5giks9mGB@0)gftjArWzhXU?CLu$Wex&3&56ZoQSKjt~ z8F&kMp!mP0=jdlq?=PFWQ9b-`j|5ls+`BAGB@^bmzDJWpxi|8PU7vZG@$}G66@Mmr zoa%0_VM*F5vt^&ub8oj@w7!Dba$Ly;pp-kmcCCu9Y??%DRXaG9C8+0~ca|Wl&!Dsn zm#cp)tGgnV(6NRI^IQ~#l3{L@dwI=`YRhRAtU$^PUig_R)_8X1fY_dG<;Uuej~#2f zWPMc6M(}#1ZhVwh!^(YKcr714@`Z{otICP(Jy4aWUlHra0!El)qKif(N%T0BdtZoP zbcHuvZTqaG_o;{g)!x~anXx_BMxCd^g0@|}KFo|`UEjmeWlNOZs5(n)C#d*sr6ZKJ zxaw84r)}zh*vF65J4=8C<{hi`J947HSpn=M^F~HO1a(EUkQ6bt`@swyUTpNrx;|cwGa#H5U1=im$FZF4j{N z7^^=zJ_tK(Iy2tB~`l^N^tmXFfUgzLm)Q}tw2g}!CX{tsbRHT{!MzO$*8Bc$^aW2j5&{6zQa z=y7rn)#G_NE6~5sz;7~WqocCcH+_}Yq-O_wpRCoEa$m@y>QvE5swY^@5%_5xMx2U%xaiDHAp5 zi2$3jut(BxRzL~aXNxM+Rs3FAh!GVd)-9gGS2P!}tSnw_+tT&*OgJ2SbvXU)Uioe1 z{-ow675}Pq!ny;J4Vhh^6YI$<$E}X_hPnt{+0X(Zl}S1pc?K9|KA>Y> zpK{+`$CWJ$i&5bHQsu&sXX?JSA}2+T1KzZ=7=z?S>KhxlrYSvT+#Dt!>w@l)M6*E^ z+APJExigr2vyX=?^B<>rR{JwzJqH5LQV=O{FlIAZz6;^dWH1sHe5!=o@?0NFF)qk# za*K4|QkN0i+d|76`Fung%r;BU1|ZDQ;ykPrrz(7^lwES?6n4pe?=H3GhSI(&J|Qwn zbw{F^#=c6h!i+QZj39K7n+8tJ}_;(el+47uB2ur;u5Dn&XHBMRm$9>II}lbuTopDjxyQ#<-F`;^xExST8^E0 zuJqWHqj_0kC1+iZl_cXp*P!&_F)QvJl#;)E{Q`bZuIqakp31#8#Pxnn6(6+J&+qtB z9D@G7%-Dysqa*ZF6ArQ;=QG=I7Ya8dR4Ez@iJvx6G$rIZ1(62BJ5;3HgPK{L<#l|} zQvc3aS8AYAA2wo0E{1tbG0{ag`DB8AnCmJw1W6_uVtb>Q^Fe#e0~mKM;3Q5<-zmsTs^P+0pw| z&rn%|HrAkLsV_tAPp#Uhy2kj@)%t0^)8xh?{&f~3v(KPZ%yx##S{1>2Jw?Aa7AFY> z)%bcVRo7D}Z>?E0mEH3+;-cNpmCIhN(N}B(AwIs|516sQMN_OK9hX#apJ$EgoHc_h zc3dS-j`ddEdEy2vp02Nm1~LTf$CH_i{g_nBUb%CpYcGXWX|LZIi{}L+@+BKcEAS;3 zI$u(>Ork~5!kNUott6RIV`mgFF3`9B)IuA_*T} z`iJ_ZlNYre!`b!E3KHphi+nDI(|88NI}PNE@I6muvK$ws)g$)+QiY4AU_Mk6Xa9E2 ze)oAE&d3uD}m zD~IExhlZwFJPFw;=j->wgsY4t)4tAIf0lkpC=yAu0jXa2_(b`U|HihXZ=xTEL>r&z zO#QD#!{f+m_$uXH!Y2Hk%T;`LkiBtXm}}&K?Eb%%ZdGgMgwB*DBUi_SXXpu~(4Pd$ zuiVczu=_I-&eOU*Wv|EfwoTQSdIMQL?zYpJhpJ2zZHOZ(!YX&^4DA27$cd_FN99h{ z^|TikcxesCdsNst-XsYz+CO5l$u3G(NvM*_t;%muY=m^R{oD{1Lc39Vho(j{)qBIj zK>1IqI!8_cxkhIlu-+2VWyG@9G^M8G{g~e~*2PUu4gHACO)35mKgB0i@+CJl@g?;= zGG@wvSkEn9ZNMd!%2S`GpZa?w)s_1ie2w_Cp#sPK`5^q7>RQmqCpf$IxRe4OmP{<` zaxRnMCe!QGN0pRNQ%Z5Poruu*1OZs~pi1#u!&KFd(p75v=~LLk66uQw9 z?n3II!^oAAx5myj2(E)T~4eoqrXT@Z`UMb7)w3i24*2J=kry^@XW}ahm zK9fy!eGeo?xohem-I?GvM`HW zPSh?pmtzKZ*LEo`6uAg0aiY!(j?{}nVZd1wU8(Ko>g!Z$^VVO&{Mjxb2}#go>h1TB z;kJ2e>U{|Z>KS6b?&reV(P*IL!E;`$pA(QklHMS^baih;MEXjRzIsDfeq~uHm2kk8 zGtFcdJ=MTn9jS4Ta@W?cQCr>+_euNm!@|co2kb9jH|WA|1Cde^3p{e@LZloN>Y?nFTGij?X_4XxWNazg>tWxoZ0^HfVs$Nm+(}Ki< z-il*Y_tWgkz1L6Cmue$*H9qR4`lHh8fh+omltkz9ir-#^Etph8;_{PP4s^3GTXlDo zXR7_j_%^Cv{d?M(Y^6pDbmR?IFzr}Za!q~ZKC7NsX6|&3;T2W5SI<;%s8?5U4BxA8 z+$-vP&RQK~a)oOG15@(a)Aanw)l8K8-O3vYJL|d4@pq8-n+8NF_pnTc3 ztUZ;j+ z{a0je!N($kFSxX7g18}E4YOvfQqS#5WUAJk7y8zBXr$(facO0)99MEVbmg90&vl(r zo3368SAMR2H6E^ks~>d8FrJHwt+N(=Bwx~}-#6*XY7G5r{L1$J%s<(M3|f*_e*i1U zeH$N+6(`s^C?H-vO_n{BBX@ZtwP`+qOMimzk@F-SEI^dp#{a4{+8j1Fj50aIM#|c4 zE8F|&=S!{xtlX~YHzs^lorBRQdv*B$_1-g4$J3D~qcYxhX?tHLoaic)HlH-<1R})I zp-DZ9O=oivv<}jrE^%nMD`EtiM@w$Lky1L(ldhj9c^fsg_IJmj;qZ9$3boxojVvU& z95uQl@PvvVdgGEkX{09aEDiowYDQXYU{^4WLo$fp1NKHbeMmoIvj4zoVL}F=_Q4BA zWx|6`QCGtEyQ^NzS1C7IhxoDA`Zy%Ntk>!PMgRw_#y}<`eFBFagyE4$iYjP}FZXsi zx0w_-whx}dY|Y|7Of!Did(l77)HdQlAzvn(u?4ITzxun~X+uQoux8f?5HDoLus zNhGN^PpUnBUD5Pii7T}wOd{u)U`A|D*7Re=v^0XSFs3C1NLKp2SzS|Eh{5`8!I>w) zfGPK8`E=nhcWfQ~nk8cti(lLnmguAr=m?jL%{){{;PBE-9L5mIrxFM{ZUGb)A&pHt z0iRm?!_iy{o2Rs@?F%Itu06#><|$Dm`FMg~r(PPtptN1qZZU0vi~A)?Lm42oh+ct_ zgVqGh%?H^C{b6?V7ueNpca`FS*%Dje2&?W#W@N_R`b}8-OpQQTSlOfWyP8&lhwUWD zML30bo$0|a4TZF-Q|xSRonmLNw2`nU(rg3zFSoZjoEO>$Dl zBt0E3T~-D7jI%0(<>E>gpSaQ6k7XIo#5pdME0VNGAw+K`RBQ)3>lhJ9FJkq$t?Gl0 zeFh!Wc5(aBOg7d<+=@>3k(%u)_gyu-cTF{G{6LU37CRchPt0BiS+{o|s~nXgyBvfO zGY-=;(%B;^okzLbOPTX^+D0F4I@vrxl-N8&nU3246lAU;~}`ZCv3Qdk^Q%8ohE z#Ch2g(JA;w;8D)X^b=Q%XoZBfH=heU%{S5*0;bx6yu51_R=Olz%b^a|U>XJ0K*RE;o9LXDX-9i|;<~GlkUR-Ds zctGAgN56a0UM%Xwp={`Fvl=GFdeWy46(cOz25yz(_{S4ngkDML&(uE%cDB7ynYi@g zRFNpmRO!S_6QBr=RW|cTjF?Q^R0YS$-R_#6u6E|ixj#%MoSUi%V1=^`mJ|guTv@TK zC82bdVLZQNvJ0Bt5mawQ^j0nEJAsSeJ_qcUIx4Ckg`NEjx|4Mn$7Ew&s07lqfaV&siiLlO&OGs`sFmRV7E|W^Y&xGZ zT#@h$C>k?aa}C+zQB$(zdT9b2+IB(vSSB0c0<>Ly#Mb6&(W?`Ns;VF+F5X!&(Wy=4 zN!)ZsSw`%G=R8O2T?f3BbsocfSdXO5A|RAXMlT~s+_b!5LX5a+cq-+OCNQbaf((-j zs=q5MeMrn|oYF64{EGGhCdMI3s^lbaVvgSJ0*8?s#Omr?kGKdRH3(|n@$0L;3A`^0JAsMF-?4t^lG2D4j)Na989Iu>zh;5a zr^KXH-K3|9^~|bw4jAxY{&Bwk$0(K-qB%;xBlI&U3zBk&hKz~{6z6cE<9%+g6{LeM zw@sG{)GhA+p;2&wHi~PBx1e6w}zxI_PfG+*r22LNC zm-$U5J=ilJ{kBg~+BXU1*po8?>3JC_OAL5+K>L78QA(aY;6(Za{k4B5o!b5CvaX78 zrD@mo8{GFFeQ6EUH_@Lc^?vD4lzJe&GhL;he@N4xyfi`f!yg0_QyqJ{tKyQB*5vgo zx}wjQf0G<8;4ikSoxha~yo07_ss39K>EOZ91P~QEwfU8b%2woyP!~h^3+f1%1c(dx z{&crP-yPB-)-wNut{8LuiYimY6g*}K^&^aMwcnT5H zaMMFGB%6W~Ck$kJgr1E4WiUG+2}5f~mKFj$9f_f=RFev&)uQ#a^WN3)nTrwjL)l!q z)@mLmedIzd&@gBdV14OK294SWYnj8~rCB{)RMFiffR?6la2&0@&fh|=gQyK^y`OR& z{C^~5klcxep=TmCWBpnFma?BO8y)-c?urcq;O3^xQCrU(K04;xQ$eRV5dTYWIwv=` zUnioJwAOv{sFJ$=)alYP(p>#iR$;|AdF_Rqh&=pkK6p3?n+O>IxMtEqFIWPH2q9Lt zKN0loK+i?nY0`<99I?}KzCj`4Kb*)s`7RoG!3?6q04nRnB#7AuP>@I$(=h}Jm~!7M z#eipP3v|fhc$reje(U;Bws@Js6TlLjpdX4W8@4P6DVB`a#yND;whD3ssMiQF9n7q_7r}DbA4w3 z_Z#qyE9I7~`mgiaz5I%7S90#5Qy_1QkxJYCMkyxY3$Lxc2PhjXfrlyZ2b1#lrIfZt zb!`f8xuwkD^4BFI!AW&5EpzNAj1ML&)|1gYGzn46N#Dlvr=+W{_DUS1XKl%Vr;$%X3$ z*5&kr5lezo=IaTis=$@J@tZ2#T#h|%5**86%IR|YVG^-heEM63y-7P|B+|+|kX`9% zlG61PiBh22-!|>IVI;W*1aq`K`xhOAiKCV0#MAQqM$q7lKhZvyEHq} zEw7~KTnO4=m`Nmr-M%}*!s=`Vkl61+I&l!2i`L#wI44-$6TzV-X%VD?Ye5qnlx!R) z6g6^DF>aiRa+5X#8|It{Xm>JPx1>Eoout zT=dEgg0H2`1+rs8yo42s!ne3ikbl{H4L2rgc*~za^rR-p!zvokgLB z2Q<)?oVH@!qtUWh>Q%%CPKQVLzg7H1=|^~5vRYYjAuDC zB9=7;1kQ1DV7hQKkw2s(2vkbM=Ful7Wl7EqMezARC9fzK2&VN1JQ*E$^gQ&*@cJdQITKu_l7v z&38!+Fo{;B3bqrHY`?CY!?vl3EQPiqW2TTy_;Oz>>xw@{322n zj#Z)pip%2FE=w~EJeI+M@gfEhJC zs*J5Vb!xsq(V8LeIZKc(O8`qGodQHp$${~gwF{P!1SSfqK*kVCBzlwv#sL-?y(Bs( zAY??KG97q33apV&nOp%?P@t@96RI-~NVvmG zdVVQ^tz>G{`|p)*#Eh1mEerhM>p9#vGnkh9CV3}gDI9QWnvkAx5@&s*2VW7gLU$Ga zoQHIvzHDeIQw5N{M`A-1TEz`SnSc(l0pjizO>5LC<7i!U&@&d5I?ou}bDragH2>nq zc`TE_eJ66a;-Me0)0+Uw#jzBW>29%B0yPmNSq!Mjc=5ZMZytWBvs9p>T;%mgC&i;K zPK#h11+acl!)I>BL;F388$qqVritrzM+3V+%(DhK$eaHqwv)Z-Kpc@rI800T-j42M z9IANEtIBxJ+oy0?E}Sw%JhZQ@a=P$q4Cr{4ZaI(dP*8u9}7R{tjkhM`(p zj~AYv#A-U=-tQ3tBd=f1dD{n5THh^S&Pd>KHTG4u#_zt^#&z7l^JKdugW^AO7a9jm z8GoaGVytJ9-xe@`^H%S*&c_}s=Ykvsxw}$HZwrc%v@5T-gEl{0`dI9w<{JORvwgaqxn;=xMl4E;>~s?Z4$MvCX3{dAX_(I zBe}No%h{dAm?4KFZW@FHP=P!L48osjB6C60V2{nF7wAfEJL z9!6qPJKw-OIFQk$61%iX<$Ea@%{7%3XUPS%uVNf-!Qw(8uY{g38cT?bQG%xGjEsk9f{6*{6x1|xngr<|pYA7~Jf<;E_VLU~r@qNY z5FqbF*Y}8C!1^d!W}^@yT7xvN0!l^8NJI>PXz;QK z%b`v}aOxr(7|*Za`Z#=Pe&&dkqj*Pw^yazz2$LlV&jF7%QnlD87-M&+OLE)1{GuGR#?)0a6@IarIGIjn!Y}wF`i8tg9F~@Ivkpf?j+CB$kPIQEDTJNr;ZOb{*c@ z_Nx#8I~)x}KH*7wcj4#?j4{`RcolL;K>g5cL5zj|Q7kbX?|EbT-I49uC|Kx+0z9V< zJcgnC+WlsjeRK%cSEilS{V#5qQ<#=o3(EV*AxY1nFw0vljk{^)PK!G_YjTDi0NtkY z$?D^O3J~{h7+ey_#r9;DYoj)^?szY=395H8A2Vr2!~vOYpI??Z$bh4Ag*m~|nGns^ zyC(ea`>{R(>m>wEE^sI1dGSW4^U4}xej`#cK+Gwh-AWpQ`)g+T)--2*bn)8dLdW9a zs+5%R?E-mZ?Qxp15ZqXY?P2QReY(QFgbn^q6;VFrbtih+Sm_Ll3?QjcSXe=PNrb%Vbqain=I%lw!c*H(`laKj zb`73}quMr=PnlJ#696+W+jcIyM{vElE)>Lwuh@Syd__lyCP64tQ<5d+Mi(mOc8lM3 zRU=16mkmcr+0fw3CIe_|15KgXR%d_ft<>coO$DE z&XQ1vNW-KEs<~Y15CU~9aFrm^#&G z%-l5pCSF+Jj=8QR4bxGAOZb+zSFTc>D~0cH1ke%2VdjGmp2TG#&|fx8vevlj{NEK5 zMZ^O4aRjBNu{40Mx;UgOIy3M3@=hL3Fu>&Elj`F+2;$DqME^t=N|#D;^IBMwJrk;Q zZGGmQcTeS+1pk}o3WjK?j)n_xaJpdy$%gw#^i!@!Wi~*Vbf?4z*ZG)iA5~Y}4DPQ; zwR3;n(t47!7+HM=eog4%0$f{`nv&mszJAU^l+9p^P~Ska2qYY8bm-t9u!blU?3<7Z z-UUoQ{=A11h(QIihVSQGI%DcLiU;fv3}genwdHj-kf0ugLB@qhc=UXYg>)_ePNr3omK2%Zj`v>Pd+XLLlg>Co85{{ZsqM{O=rl(^3`h?9)K{8J3;ur*{W~-qWa~AQ^?PT0A{M{3PGd`Eep7iTt1bZHd>276 z?LhrpX=KZ!eF8d9A;jS6^x=(acmRo-x64mh_p}#ZLbKlfMFFb&j#`a{nEC1QW2xZ@ zK6r!+qCpb5K$Vg&t8;VpecIEJ;$p0Oi$7PKy_p~FmejN$gL%JX?Hg71C1ddRG}@(8 zD6Xn*sCdOQ|6cs5u_`GU+Nu~`fC@D0d?@UjEjX*V&xd@l z6?!6Jx*b_8SkNPQUz;1qXJuCcoVdW8QxTvniNh%H$!`GQ9|h zlbrF=agBZfs9VwZ6~`$QWs?c(JH9r=WgviRr_9;68bkNOG;QT)Sr7c$90>^t0pW}e z^-sy`=)*6_c8Pe}kvozkxbAN^aBEXKj{ykKbop5e(+_ZA3%)UztxG=~?pO5ciz7jz z9Xw(RB*^bdQh@Nk_D1!hr*dM93p*h(C5t)h(vSH50{&%JB&|HjozGk9fU=XOdzz%W zY?>yiCUW{*C$pwMm4~k-;NQtEX_;I^r{@S#z2t{xaOz6pA3*`b52jrKu11*pIyRKOAqH8RIE1wd zogrvX&`CRDlUZf!DxA-MY@a~`GKRQ@qz_B*_?C4DnlT&CC~5y7xTRv%Cwu<`mN@w5 zUP8dEwgJ($6&-?Tgie*T!>_PYF+_ez2Eu@F5+x3XzqwI+L$g*6+0u4dhhTdPu)osl z$d7z12LU%LgovW(2ct{uQXn&EbN8*3)_}<2)1{)ixwCN znbJgwW}8&rXmnFTF|dTz+^D~@44)9Yc0Mb7fP-m;v(9<^4{aB82()*EAUr6gia4&c z8KylFosEdS@YY~_7fW836k_}A`Ob|n)T2h)A;-e0Auo2HX!&Q%5MJ*+ZF#q1WJ2{_cg`! z!R>vkgEXIY_d5&PmUjr8H@HpSE|6ATsp(qB)42SukDf!!SoXR zhCtqe|EC%PSCb}2h&>VtM*{R+2?rCz^hElG88uZ~2Zz@}LIXKF>*v3@-Ku zBd%3mhkzJK|MhlLI&3o~#|7N_EUNK`u@SEo-_27BbTLoUQI4$cPKZQ?E{h3& zsSpw%4q$8GBB;GzS4b@?c&04H7yOQ~`SdCeZ!B2e zd{=ULSt-_%Hqg<*Q<5Ehf(FC-jraewf`m~{_$+y*k4j!+ZEYsZ!|^0;LGKZLTdHNq zNfgt#gIbCQIswct2kGC7?TYm*nlUt0w#VOpbz0lS9RlDT>jK3Z0aM`iFbRsINKsS0 z1LxpH1qQ8`t0|vok%sN(hFOUw$rLz@i(b`6S%p2Tf8wkH3ON*?)Ih8BtMMHUV)1+6 z8xEV*p}Px_Pn2z(GG4d%hmD1yDg(1V1N)&KAh=qBAWHfE=@JO#)3f1Uyz@ z_V6eF!s7^h7f3%Ie-U^R6slp7vxE8gI22(o6+C#T+JbHVu$rBr0p%Le3ZPtdPcM5^ zZ)6VK?4!JYW_g?!_ zGs^hrT-yj2&g)aw-!{61EuTLBd;8+vzuEHPZI{?ax3J}%`R}&cM!2x$^_vQ8BV5?> zV(D<(2p6_I{fh@|BV5?>#3OFo2p6_Iv~HShgbQ0bUij2rVt(OmuP(8TZeh!{7cI1n zZehz6%Z|2Njc{Sh@(*X)M!2x$+>^)JM!2x$)K})&M!2x0<>jB*M!2x0p?0%vgbQ0D z&!^d^n_oYr&);mLTi8;xevoZ+3tRHN+4gDXSIqtFwdwW`%;=+KOYM`*Xy4Qo_ChmyBX_NRk{P|^zSmx06c*?HF7UW* zgbU}!HqEn*aN*nsU)XK8n19$YX1r~L3+Jlgzp;&Q;oP5ne48!8g<7|8ZtKtwY@=H^ zciG5kw$Uw|d)7TUHoAogg~hoiXRWY}aN*pU1&`WBxNvUGr;BVOTsXJv)IqipE}ZMm z$+eAe;oONY-e_y#LeVXpn{(3NZKGQ_ci1C8u#Ilv+>9UYw?((mQCOVYXLpNjgbU|< zYVEO&aN(T&w?1wg;lep@&%VMo!i95QzjeQDgbU}q{QeJYN4St*Kj)bxSK3CmaL$&e zyKSReIOpN&adwq_C#|qJ=bopx*_FMYZO$(?#_S3+y6N+vJ;jW!y=a|XZbqwK@YzPV zaL#i7(RM<(kY9i9%a7Yew{Xr6!_9WU{JXh3KC~U(LQz$n9$v_Ks$MGkmOlq8WX1{fYJo&Iswe z+57*{YEL#l?EY<~eY_dHcJ3a#z>Hozet|v7jD9!k9ebh~J+b)&dx9A~lyaV(Z$=&2 zci7|2=+>O5otGH3cFn%-zN77N=7(2y?Y767(ehta+hfe=ynT!8Tr*nSKFuC&Mkk%n z$IdaMnRmQxA7@6jSsUzZGYbB6pnYubsC9P9J&)U?dWW;!=iP0OG$Wh~dxRO`9@xj2 z5tiN_Zbq1C`)D)5>e|D4N8&BoL(K@s&mLk%t+;LWU^B!6vu!iNeX=bxA_%aLG9z4h zJIjo4%k4pCgg0#uG$UMLJJXDa@$3vUy1VtA1@-_lB(}2qn-Q^*?J^^R8@rzw5vkjK z&4^IjPB$ZBWjoD`2z%{RGa`7kQ_N^#dg}ok^u&E7*%RvEit;MB3Z>rx}s5wtCEnbhGub8IdZsT0b&F^1RlEW<+Vj`iB`&lCVB7BPt8l zelwypV7+ffB>1iO%!q20^{yFFZLqRpH6Jx!Adp%2Rqkvkh=lPjq|B{N3|Nqt?U+}N|i|pU^ z{=x%qVuxkL*q}dg#1c z?5$>W_o$G)#f*M&_6U2k8Qr+|O8ZGO`q`?5_7i4w`L?I*m>!A!TX11UuKl?A;o1F~ z?Z?b$(E~a5CNpZe`a}CsGn#SHDEkpJ3c7Objb`M#{(AdiGb-r+p#57j%D#H7{TpY5 z{aY~jPegZ{TtlI|)(#?*B8)c(OG*3QCYZSra&KKYg)Gu1(~cH|;cUz^xe6h>k##F3 zSr0@L0hpj4=pHSSq)81B2Oup%36ipRytJto#wV0nV0=^qE_X=avoY@^8inSWi!K51 z6+f8|ni3ZkQ|hNuL1M~H|C?wv3BlZI620H%0KP*~|ENJ@7H8ukv|ZRCRL@baaMI4- zw!2J zfoEA*46I{0Im`IXVM+_0p!CzAdj)A<@l2eR0GTy_GT@L{R+S*LI)vjk*+r`(2voon z-5ye9Az%*FFKAR%P0qn1U=iWD?=zbI-;nN=|(P}HR@xI8J3(Kv5 ztW?q#Mh+He=V_ufav1EfEHmC4uPv-kUK=VJv@cKyyn1yBNLINFiU8fW10J}eFWHC1j&rQ}pDj@4lFo@VB^c18aAw6WhK;~g-(IN-JL;vT4$ThzNHXTZ01d7{GenT$6|phB*)$qLGTbq6ITZqYo=qUd zt`%Y@+}NZozChVm-k_elkbW~gPgTDX>ssy8$k5qDUwkT|b5akZKpLQ9EG>1p9ATgp zf_dhDsD`lxGR}c6HQeDDs=8G8Xo2hVX0M3+c2Ow>#e`zUY(hAmN=Ti2CeOj$4!_&% zFj1A+JO$Fyoi*IvfV121h_AM!KB=#s)b77`d9} zZh)e+%C93Ed8q!TOhiP?M1^`Hn1iSip$SNTZG-`tk)k;Lt-L;%sBS85g4NoBnoa_% z)qfggg%CyO?#IyM;AG7qqUJUex*X@5c5Zaxr7a~gAD|k5?o#khbv9yIZo%jfXaSQ#_#6(9x z>nHY>P>>1{oz1-!Wux?QAfR_vq_57iyHZqEclbYf9e({=m|OQRJbe2?rx3k)I9eP| zvm@cswLTJsLsABZgq=KxbOn1xs6wc$fF39;;Uc2=i7vE&2_gU!u{(aiYh>*Kv2S}f zs*~Cvq5vPEPg}i3-%m0ZxsJA#9bV=_$yk~V)1%Sv2lU2_g-F4$my1Cb(4@@KpQ`#S z^gyh~o-$k<2g!}_@jUvqI1tosBcQ({0jlBHxj-}uT8>MJdL8nv0x<nV$h=z$vs6Ui&l>x-UMo@hiUBLQ|Yzy$3*#41qSzq$ncg%I8J8-kAngD9U1 z^Du`bjb4pD4~x!JM!$#Beygm}W$oiH?GTC({Be+O)D?xPKw-rV&4au?M?*wkvF$h#xeUMb(xWy}LU z*v+blsC=hiI7dPpM@UCjrB^jrz5wH#6#svWXZ{+VbFv^2iBho7HC@O5e_c})F8B4T3Q!VN)Pjp96YHw zekkZPv1S-XB&J2toMM!u;LNp^Dyq|j4*PDr(J}iQZ!h`D7ni_eK9+5mOSw=RKLlXj={Vk38e_6}|bGaVl;ib$dd_U3G zG-8mFpu`FZZ4N97&M`6^$Rol5f;P{mqY1OXgXtzHzFkJe8ntt+Fg(QUI+w(<+Shso z`6Ru``4#$Ho-6D_V*s{1HCyDM1Hdd%00+qG0W@A5bnpSaeIOj%+`47cUW@IywN4|0 zBst2i6WSbZiZ5ADUBQ@&b(9y>VDV!RRlsvc)_hc{zPIL(TXmKMpSEuX8pMxfRUn7Z z;jo3^lS8%k3b(rupE=AD0jQ=|C*)RONVq|QU^=ai)z2FByb2xHS^gVo*bV#?2&Jed*Y!* zFx?61Tn?hK8W1|}t9vug^76Y=i3eyo)9k?5Fb)YA^NBvKNH}ep5aghu07Uh=`HS>h;QlNO&^HyxeguRS zcZ`ry+ec#Z$C0wNx*-@Psgjz6A~~jzBS<8r@clK#So*A}v{hVqBq5 z72Z38w;B$4&%sU#&78Bvwf-{PDZDEwemIK(&0M@Ibh*2uUyti(Wcta-l%bY@q-+V! zEHb!s+z!*Sk|r!fL2h;a;z_vl;xoiw5?$BjQA*s0DkZTMrM$x}B^)7&)Z)WSvsnNG z9zF&3E{p@>!K`!Ba`ENk7rk^9hr{8;Cs=7*RjD(^>&2iv#KsoZ92@(48qebCM%mfR zeVh}4ZS~$&I5eUZzo$N``7}~wVu6J>NAF2uSlGh8C_>x;et-W-K_VkyzF zU9;FTi3XIVI+l{E6fY?JIM9ZWw2RSwM`8ql8p0v8B%ln^iWP%KEbvws#gRG?c<4Ui zF&j}HOor66oVCzwk2EzfUiwX5$86?Bc|o9C7;c}3^FRs%Fe8Tp+v~=S;kylL=5iVr zWfe5^=+*i+du#eqrQ?gu(q9arEFh2`)HJw8e01=p<0lybQUgH7Ls(l;`rYP_B!m}) z4=AcR4j=G_qsq_bvXep|?>ke!Fa25(a{z?{)Rst_t_dUopzjnxCquE+De;Itv+1mAWnwVD4o^N zT~72h)mS4YTu4GlSO{B&_@IOvq&N}+QiqQ(C~*N?mjE~31SLMM1&DNOBJEK{qOhU* zLt=mUuK__KNgb9)7N$@>EVTeA*J9*Hi2njOmB2Q*Y_LVuLGg7rVRz%3(b$V$U7GJ4 z=x;?8VQnIhaRM!N4}%$N2$ zsDXzyTzD>}WR_Z(baXmEADZ^DUKAM-o`n46(?^6(=eUw$l0?x{^E78kYmui&AUWRs z(^bIVUvQ|+QjT`k2ykMmAafJoL}3eY*`T-rXWzqfyF<7h@R?|`{^WqhdGXjs z5OtK<%ms__H?=@JZkk)L5F-9-%2`Bv@ZSkE=# zArd#tr7X{?3U3at1%3$}s<4mz5e<;xBcRkm%8V0;PsLMg3UJ~^Mx7Ja<@Iyd9TU{v z&s+-n-1NegqmxL|R@^E@Nn%i#gYnl=pb7VsTaJ__T6D*A4>y(hf zKuZrNgM-62!xY^s4EWat`=&iAuTayTD<3am$6Npf&ZmbbE8R5)>Z}xu!TgImgcCH@ zMeYr23B?8kD^8Rj10|BjP^fXxWkV-69$~^}U)N!pp9p4xRS;589=RKg4*M949^ybn zq$eVnPk3+D09u83AnKhCsYS?I+8Kv6sf~u9EwI4CnnUjejhR$@WM(l-K0wRUC0Y0T%dDGJVKe!Ge-38VOAa zG;!Ik5t&E{vHmBD76c5BDRdxurX+2wt=uW-lRW2_q?|(&6f~oD|0>G0B&z^uSPLP@ zp*I1g5{?du4cujdszLy7QQ~3f8&O|1-)%T&Yx`ZLY!Q13TSPZ>kWS6I6Ow#E065$! z4ndA%g{>$ok@h_>L9p65cfb&VtkW}{N0Wm(OZ2Y~jetnEv;f^9?h|TUjteoHYT|sP zL@|t*OM$E6!owLO{eUtnoap$y2vcu+eg-G)Fo{fA63{=+k`Qe4%gA&M(!oYvhp>Mz z=U(hwi0lS5JodDkbWFGq;*O7n65?w%f~8KL=}_FSY&>91oMGYoaJz`fq_sNl2wR{K zwgq{8#HsKPN@x`?8BI>bvo*Z4o=BKZTA}+NsSTR-BCsfC6LK6jO(=Ziy6F1_1)+q- z7Fc$!DN?!!8mYB2QD;S=8)L4c(u2GI37(2QayIkix(Emg@g}61O(FCPWHum!;PHjM z0kp6jd0>hd55#(0)rlV7vX+3bSOa0g<-pnq@Fegd2;lkb#R2?7!cQDUl)5+#XN4r& zA{{JlC-j!?9N#KF%jXBe<$Qipwy6k_^m{C8DqWd6E?{q79{lx^1BbToeL)wPiKX4Or=&+Bb8E)NMbjXP;6)8x_GO#(bp?@-^NAd`7VnFHC% zBGeqjvgXdfDce_G5bJ5L)0RP?Y~1MQ^RL0Y5;aMGL$&~rT&yV}Ss@GOM*|}u${UjI zb=2y0vf^J2tQ`{I>b)ZPTB2FbjV^FFj?)rmEa1jPOstR^0E#z38rONNi9S&g;*f3Cf%E07c(QGLgX_&Xpj_P(a6jbuaKJAdL2UO zhvAgSN`T38R-!-93swT%q&1EI9p52zAFg#mC$wceMS=|X2cziql8=L1h;C0PMAR(~ zX?&yzDjXVh%Sixj$a5~&&k6U9gta8m&|`z4h*trUo@Iu!QY`E@krdk=<5t(9z<0VZ z$jX9N z*pbBJGA0v^9t;6dR1iflE_I4k7yF zy0BR!X557sG13E29DD)9R}qn`#yD_oipoMfR(`xLm3^lv0pD#N$Wc~7*gas~Jt$_v z_yyii773@AYZG`q4Q*hJlKZHWW`h3GbVUosNf7b4)3swfW(o;{ORM#jG!O786FOu! za-<;fIU8_Qh<%U>T7W7z74sMo?kkVOCm+_qwa z(0wSA!*nI7fLFwwMurA`WM2t*d}#cfU^0Qi7|IahmJr^c`*5!u+(AS@#BG;s5Oy1u zip+wr(YTUCUYjN_Y_*_BEk?ruyx*q>Xw6&v&i&)K?gPSnB}*!dH}cxmD2Eep zp)!qRD=h-ZQXsm7KnRTPlAGL*=m%S=w$+At)n_BUl1q#0;i!!%Wy8JDI4Xr+O!GiO zXMmOQ^q<=2s5jK;?t(Gu_^zg-Pssdv=8rO~GDl{7(tm2k%Nh4&tj;(o!N*{wpB&J7aTiUwKV6<8lBW- z2-@eWi<)wplzmN8&hbZSy~^(){YI@%wZ!D;ri#)1GM4E-|Mskc(dzl;oD-GxKtp!F zqn7Lc^|;+7qx%iW(|;a5PX6{{{pY&2!qKXHW=?-~-Vb<#>X|wD>a~+|MrS$41wMy} zlAuLtm3}#XgRrq^L`yQ1l4L|WEJ|}VG&J#7AhePB0+!(9sdYg{r;@OB2xFzr7#RC_ zc7?`W2>!lp44@gwY&_m=BEoM{RIRh8@v(kj&gnveze`!^X zMB9SgXC9#9HD{4Ne? zkrW{gaFT_U2$c&leEe$kVyI3c#7`2JXhYc2)y2hL>ghs+MI}FxEc}id1u>rx51a)V zDKTFrF`pH)s=S#gR&nQrE>H`o(ZWo)wiTWLA$97>p%0d*!qL5H2mXOQG z&LQ3)Q!fp_qg7OfDcwep`Mwo-Mu=(u!eB3(3dAeHAyUCl=N@ zjPtHjr5~7PoF_Un2|>s>Skj#xl){n*SqUL$WxMb;WYds|40!M=-3VDlqT+wJgJi;R zbDxs(!$?t}8W*I6qxeSE%#MLs4IUr=aslpNeQ2r;mDaU}5jKBevI>M`iHR7~@ zqEL$gh;hA$MqGD+Q#}ysRNJx*L-kXk1_~=)_?UEkparKFAv;`g{+ANc15#aIt9II= zji)n%2X|~1(iO`%gn7ur!(PK}1V0p|gi#zqGLoVuF*BKvFyw#jkajBJp8by^f$+6h z!of_0%xE-3xWSIXyY*l_{eo(eDkMGwnVH`9Agk2#?UK0_SeYmiNb3YD;>VO~!9(GE zIcve0kUAfNhw&i#2^$1r2TmzUP1wWZ@iob&hrk7dAiI}P_M_y+J*d}WoGx$*A@hH_ zW(bIpyF~zY=xp_d~jumH5?9PkvISJ00v zuJ9AF8^rA>Sfkgc|t7fvJT9;lKvZ5&P(0|SM6?he9-S1^{q5z+fTHqbf~!M#C_-4~4j~wUM@k8p^AzP( z$sEwm+{+vZ=v(hC+6xkk0TR<%H}iqAvI+t)os5tG#t?VgjVu{uPA^yl-Z)5L1Pzng zW|*{0{0eEztpfzDaCR}khCOdK9w%Yne2}ng=4>V-8Yf-OyGi~X><{G?oKyU00G>XG z#pnOa>Xih2HwxNxBW8@ftYwT7=nlC60MoM71Z@gB33uL4s|;W$^nR2U$(Yq*vbLyM z2-;LyS!}zjiGbsZslz4gn-BQbISKuwx<^H+YRZ4}HVC?ocSYot0!e`E6DR~f&JU?~ zx@7Q0i62z^C~2}RGS!Ycrku529Kxs=2X2Cx$N8X(aWDj4N2uWTQ5~)J0vRI;0uo0{ z9w^(ADW^tCtRU^;wl|5IpzcfG;XPO&M`i<@%-agYl!FyO=(HLj2zXT-e2fpD4heQN zz(k9Vl9v~@eYyyeiEocLM#E5%1o-$=a7yy+05@|S1YSxS1F7{RYr!M8BMp(iEoB}a zw=y4qG|wjxQ>qKaq>PF^=(5Ax_fs0Ay(#?hig|%G&mo8wX-;+ zsQPAPNi^71394{|gTNy>i=$SI$YTKik#HC5jTT}Mg<8B*QVt3k7w@l}ZH(8x0T*q%Qe)P|8#@#Y-g$ra-q`x<}kxeZR80xCA9*l&_-+n>pWmna0M%)|@s~gW`pT z(02I-0iK@d(jw2r)PFEM0tq2t0Z?2beR)XC_rj+3izA?wqsEkyWm#Q6LDpgc3I?hpYMzz)H12nrQE zJZBZ0fZIc612TZPpdspLKm;iXMbs73o%GTwow{+3TJL3gtfP0hH$nqJ`JT{BaM0XL zOB;9o3m|)eYXC@v8hx=qc#v)(+$|vr%9S<=I-QnXN;q|}>$m`d3hN?pR8o92^Cm+= zP6@0s!n1f~=y#GdL7m!5xj{;pPNrF}3(Xw?T+lg-pl<=x7H3JQgVUhT)i>RBuT@o+ zl7Ha_0o{$lX`|a(F&;Ld9tmucxwxb#Rnr?*NEHrfcI$Ob4z}G@)!9I=;(Iw8YH zbd^D?@LpSl{IOt_bRm6D3%ztPNDH72v1tU0iXH-GJt^}8t4E|E41An46BRly&Nzi4 z@p3u8B>ccoijt@J-qOMPTWN1uUf4%GpdeDw9--n7+KIw4yE+2=n~XiZKqxl>5#rd5 z;~C@r+KG=BO+Q-f`2xsF&RXEvrU|G}qP@Hg4%UtXA!*WLAGVil2&+vGfM5vw1kOoP z7@`36#k54udOI+5WMyYiODkhT%L##r#iLEpkA{JuqQNtHLu6AxLj#4wM?-$I8uWy9 zwap39J%`Tqv+*Z8lN_`@Ma99AL3kN}vsCmNQ5pgXb(z56_0BI0Xhe07^ed0w~CJjDQ}ZG|KG>@v**bXei(n>Y^NrcPjEE zXSe|RndA(M`=576&hYqebB6yX8N=tCjG_9+?52G6)|;LQImr|-i><$^uix}sJUUqd zG!V8gS4;llDNqYv@r+l+Z+ZSUE}5KiVbuDQPR0$oaN20)+vAz3UfsikBiWGNGKViwW&G$B&ogS!Tm0rn|LD0*{eG7xPhGOhGd?#d8ae8< z%hgqTJOz0$4@jR0bka|^1biMiOCio3x{&;zh*hVbb;+d}qt#ivJu9Ng8h90!Sa-=^ z=e`38OhyDVO!65-YB88dRIxb8l(>qlnQG5&&-g^vk;1JAUiH<5+i@ENOG&+|8U-$* za5@LDYYHVlk4H|Dob-}Moj-U8=R)_p){3#Z2f5SgJE);%LYiz_xjzd4GM2qDM%aZ#@K*WRtevAQ@I!K=nK%JZdX-XlP z25feegg`#5pSUgM46$Gi_^r2>vZ9x=qhBN^1G*;DIzVFGs*=7B6!-w;xoMQnXCmW6 zPoqEyX(=UIVG7-N-NitcZ@A?$V(&fUGzwe*+mmA^U}E8XNH|Z~FhJsixVV~3D3MS= g=X$s@$2ipkNI^{v1?$F$#;1d;rD+fmqfkZvKV{t@5C8xG delta 13338 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 ZxJO(fj=w+8L28W;#_ZW*Q>y-S{V#^Vq)Pw* diff --git a/短视频合成自动化/main.py b/短视频合成自动化/main.py index 00b5693..c245f50 100644 --- a/短视频合成自动化/main.py +++ b/短视频合成自动化/main.py @@ -14,5 +14,5 @@ if __name__ == "__main__": # 批量创建草稿 drafts_manager.batch_create( - draft_counts=900, + draft_counts=400, )