From 70a091364f1f7144826f02fdb416cddaaa21d34b Mon Sep 17 00:00:00 2001 From: aries_ckt <916701291@qq.com> Date: Fri, 18 Aug 2023 11:28:27 +0800 Subject: [PATCH 01/30] fix:add sqlite db type --- pilot/openapi/api_v1/api_v1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pilot/openapi/api_v1/api_v1.py b/pilot/openapi/api_v1/api_v1.py index aa63df27f..7fedd5e11 100644 --- a/pilot/openapi/api_v1/api_v1.py +++ b/pilot/openapi/api_v1/api_v1.py @@ -118,7 +118,7 @@ async def db_connect_delete(db_name: str = None): @router.get("/v1/chat/db/support/type", response_model=Result[DbTypeInfo]) async def db_support_types(): - support_types = [DBType.Mysql, DBType.MSSQL, DBType.DuckDb] + support_types = [DBType.Mysql, DBType.MSSQL, DBType.DuckDb, DBType.SQLite] db_type_infos = [] for type in support_types: db_type_infos.append( From 0ff6fc880d893574fa150f565e43061bcbb7a040 Mon Sep 17 00:00:00 2001 From: aries_ckt <916701291@qq.com> Date: Fri, 18 Aug 2023 15:07:01 +0800 Subject: [PATCH 02/30] doc:faq and kbqa document --- docs/getting_started/application/kbqa/kbqa.md | 12 + docs/getting_started/faq/kbqa/kbqa_faq.md | 14 +- docs/getting_started/install.rst | 2 +- .../getting_started/application/kbqa/kbqa.po | 247 ++++++++++-------- .../getting_started/faq/chatdb/chatdb_faq.po | 13 +- .../getting_started/faq/kbqa/kbqa_faq.po | 67 +++-- .../getting_started/faq/llm/llm_faq.po | 27 +- .../getting_started/install/deploy/deploy.po | 4 +- pilot/vector_store/connector.py | 4 +- 9 files changed, 233 insertions(+), 157 deletions(-) diff --git a/docs/getting_started/application/kbqa/kbqa.md b/docs/getting_started/application/kbqa/kbqa.md index eb1e4acd8..88340e2c2 100644 --- a/docs/getting_started/application/kbqa/kbqa.md +++ b/docs/getting_started/application/kbqa/kbqa.md @@ -15,6 +15,18 @@ DB-GPT supports a knowledge question-answering module, which aims to create an i * Multi Vector DB ``` +```{note} +If your DB type is Sqlite, there is nothing to do to build KBQA service database schema. + +If your DB type is Mysql or other DBTYPE, you will build kbqa service database schema. + +### Mysql +$ mysql -h127.0.0.1 -uroot -paa12345678 < ./assets/schema/knowledge_management.sql + +or + +execute DBGPT/assets/schema/knowledge_management.sql +``` ## Steps to KBQA In DB-GPT diff --git a/docs/getting_started/faq/kbqa/kbqa_faq.md b/docs/getting_started/faq/kbqa/kbqa_faq.md index adf667a3c..b1835d7dc 100644 --- a/docs/getting_started/faq/kbqa/kbqa_faq.md +++ b/docs/getting_started/faq/kbqa/kbqa_faq.md @@ -47,12 +47,24 @@ Set KNOWLEDGE_SEARCH_TOP_SIZE smaller or set KNOWLEDGE_CHUNK_SIZE smaller, and r 1.shutdown dbgpt_server(ctrl c) 2.add column context for table knowledge_space + ```commandline mysql -h127.0.0.1 -uroot -paa12345678 ``` + 3.execute sql ddl + ```commandline mysql> use knowledge_management; mysql> ALTER TABLE knowledge_space ADD COLUMN context TEXT COMMENT "arguments context"; ``` -4.restart dbgpt serve \ No newline at end of file + +4.restart dbgpt serve + +##### Q5:Use Mysql, how to use DB-GPT KBQA + +build Mysql KBQA system database schema. + +```bash +$ mysql -h127.0.0.1 -uroot -paa12345678 < ./assets/schema/knowledge_management.sql +``` \ No newline at end of file diff --git a/docs/getting_started/install.rst b/docs/getting_started/install.rst index 6a188e85e..abb90ed6e 100644 --- a/docs/getting_started/install.rst +++ b/docs/getting_started/install.rst @@ -2,7 +2,7 @@ Install ================================== DB-GPT product is a Web application that you can chat database, chat knowledge, text2dashboard. -.. image:: ./assets/DB-GPT-Product.jpg +.. image:: https://github.com/eosphoros-ai/DB-GPT/assets/13723926/13d68dd5-d052-4976-9aeb-60ae13d63d02 - deploy diff --git a/docs/locales/zh_CN/LC_MESSAGES/getting_started/application/kbqa/kbqa.po b/docs/locales/zh_CN/LC_MESSAGES/getting_started/application/kbqa/kbqa.po index 577979d80..c57a1769b 100644 --- a/docs/locales/zh_CN/LC_MESSAGES/getting_started/application/kbqa/kbqa.po +++ b/docs/locales/zh_CN/LC_MESSAGES/getting_started/application/kbqa/kbqa.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: DB-GPT 👏👏 0.3.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-16 18:31+0800\n" +"POT-Creation-Date: 2023-08-18 14:11+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: zh_CN\n" @@ -20,12 +20,12 @@ msgstr "" "Generated-By: Babel 2.12.1\n" #: ../../getting_started/application/kbqa/kbqa.md:1 -#: a06d9329c98f44ffaaf6fc09ba53d97e +#: c342c2c426ca40458d0de471f729bc42 msgid "KBQA" msgstr "" #: ../../getting_started/application/kbqa/kbqa.md:3 -#: bb6943c115754b1fafb7467313100753 +#: 5bd2a6513a1f4560a94b85e28345b030 msgid "" "DB-GPT supports a knowledge question-answering module, which aims to " "create an intelligent expert in the field of databases and provide " @@ -33,76 +33,112 @@ msgid "" msgstr " DB-GPT支持知识问答模块,知识问答的初衷是打造DB领域的智能专家,为数据库从业人员解决专业的知识问题回答" #: ../../getting_started/application/kbqa/kbqa.md:5 -#: a13ac963479e4d4fbcbcc4fec7863274 +#: fb32ebbf11ec4f3f925f0dc157e5bb1e msgid "![chat_knowledge](../../../../assets/chat_knowledge.png)" msgstr "![chat_knowledge](../../../../assets/chat_knowledge.png)" #: ../../getting_started/application/kbqa/kbqa.md:5 -#: f4db3a8d04634059a74be1b2b3c948ef +#: e44acc4009154e3396ebc8c69922c4e8 msgid "chat_knowledge" msgstr "chat_knowledge" #: ../../getting_started/application/kbqa/kbqa.md:7 #: ../../getting_started/application/kbqa/kbqa.md:10 -#: 86856cce95c845eb83ed44d8713b0ef6 f787e9ad9f7444a5923fe3476ab4d287 +#: 15d2742a567f4f2bb669086523691d11 d2228fc5179440729b594c9ac0626c2c msgid "KBQA abilities" msgstr "KBQA现有能力" #: ../../getting_started/application/kbqa/kbqa.md:11 -#: df1c88b28a2d46b2b3f5fae1caec000e +#: f7d0eac20e6d46fc8090f6d8c8786306 msgid "Knowledge Space." msgstr "知识空间" #: ../../getting_started/application/kbqa/kbqa.md:12 -#: 7f6c99d0c1394f08b246daa1343c24b2 +#: efde56662dbd4d7687fff81e2983e365 msgid "Multi Source Knowledge Source Embedding." msgstr "多数据源Embedding" #: ../../getting_started/application/kbqa/kbqa.md:13 -#: 3c1274c3e65f426bbee219227f681e27 +#: 6788330bed0948b1804723540cbebe7b msgid "Embedding Argument Adjust" msgstr "Embedding参数自定义" #: ../../getting_started/application/kbqa/kbqa.md:14 -#: 52fb29f7ee8745e6b78145f5be23b8ce +#: f7b04ae3bc3949bda0c8d1153953cabf msgid "Chat Knowledge" msgstr "知识问答" #: ../../getting_started/application/kbqa/kbqa.md:15 -#: 83e427c46d844c6a9bb5954342ae7c42 +#: 7c6365cf0026441d91e1d8ad7b97ff00 msgid "Multi Vector DB" msgstr "多向量数据库管理" #: ../../getting_started/application/kbqa/kbqa.md:19 -#: 07c1e189d0f84db69b6a51cf23ede7dc +#: e03c3631efc94e339fae6493b0866c44 +msgid "" +"If your DB type is Sqlite, there is nothing to do to build KBQA service " +"database schema." +msgstr "" + +#: ../../getting_started/application/kbqa/kbqa.md:21 +#: 670b9666927f4662872b80e648b13670 +msgid "" +"If your DB type is Mysql or other DBTYPE, you will build kbqa service " +"database schema." +msgstr "" + +#: ../../getting_started/application/kbqa/kbqa.md:23 +#: f4586b306b3542b4afaf431c0f215e98 +msgid "Mysql" +msgstr "" + +#: ../../getting_started/application/kbqa/kbqa.md:24 +#: 6c8ef148ec0f429ebbde6a8b6c1686f0 +msgid "" +"$ mysql -h127.0.0.1 -uroot -paa12345678 < " +"./assets/schema/knowledge_management.sql" +msgstr "" + +#: ../../getting_started/application/kbqa/kbqa.md:26 +#: 0ac3c50d793d4b9db9a8e2df72c46ec8 +msgid "or" +msgstr "" + +#: ../../getting_started/application/kbqa/kbqa.md:28 +#: 3572f74a11a1408eb1537f91fc2492f6 +msgid "execute DBGPT/assets/schema/knowledge_management.sql" +msgstr "" + +#: ../../getting_started/application/kbqa/kbqa.md:31 +#: 5ed3fd5cd4b547d5b01be4780ec11886 msgid "Steps to KBQA In DB-GPT" msgstr "怎样一步一步使用KBQA" -#: ../../getting_started/application/kbqa/kbqa.md:21 -#: 36e4195e5c3a4bedb7d11243e5705f0a +#: ../../getting_started/application/kbqa/kbqa.md:33 +#: 5d882ed64d4d49daa2e582f67aad6f88 msgid "1.Create Knowledge Space" msgstr "1.首先创建知识空间" -#: ../../getting_started/application/kbqa/kbqa.md:22 -#: 5c92d41df2b04374a6c7ce40308f738b +#: ../../getting_started/application/kbqa/kbqa.md:34 +#: bfdb91ff12c04094964d9f8a0c9bbfac msgid "" "If you are using Knowledge Space for the first time, you need to create a" " Knowledge Space and set your name, owner, description. " "![create_space](../../../../assets/kbqa/create_space.png)" msgstr "如果你是第一次使用,先创建知识空间,指定名字,拥有者和描述信息" -#: ../../getting_started/application/kbqa/kbqa.md:22 -#: c5f6e842be384977be1bd667b1e0ab5d +#: ../../getting_started/application/kbqa/kbqa.md:34 +#: ddbcb1112d5942db987a470bb935e1e4 msgid "create_space" msgstr "create_space" -#: ../../getting_started/application/kbqa/kbqa.md:27 -#: c98434920955416ca5273892f9086bc5 +#: ../../getting_started/application/kbqa/kbqa.md:39 +#: da62c5b0796c47f0a5e482e79e70e352 msgid "2.Create Knowledge Document" msgstr "2.上传知识" -#: ../../getting_started/application/kbqa/kbqa.md:28 -#: d63f798e8270455587d1afd98c72e995 +#: ../../getting_started/application/kbqa/kbqa.md:40 +#: 89e5377735f24f1d854f85ca4a387063 msgid "" "DB-GPT now support Multi Knowledge Source, including Text, WebUrl, and " "Document(PDF, Markdown, Word, PPT, HTML and CSV). After successfully " @@ -111,208 +147,209 @@ msgid "" "into the vector database. Alternatively, you can manually synchronize the" " document. You can also click on details to view the specific document " "slicing content." -msgstr "DB-GPT支持多数据源,包括Text纯文本, WebUrl和Document(PDF, Markdown, Word, PPT, HTML and CSV)。上传文档成功后后台会自动将文档内容进行读取,切片,然后导入到向量数据库中,当然你也可以手动进行同步,你也可以点击详情查看具体的文档切片内容" +msgstr "" +"DB-GPT支持多数据源,包括Text纯文本, WebUrl和Document(PDF, Markdown, Word, PPT, HTML " +"and " +"CSV)。上传文档成功后后台会自动将文档内容进行读取,切片,然后导入到向量数据库中,当然你也可以手动进行同步,你也可以点击详情查看具体的文档切片内容" -#: ../../getting_started/application/kbqa/kbqa.md:30 -#: 18becde7bdc34e9cb7017ff7711d1634 +#: ../../getting_started/application/kbqa/kbqa.md:42 +#: afd3140206664d079047e9225be40dc1 msgid "2.1 Choose Knowledge Type:" msgstr "2.1 选择知识类型" -#: ../../getting_started/application/kbqa/kbqa.md:31 -#: 755dfd18812249e591647d233ec9253b +#: ../../getting_started/application/kbqa/kbqa.md:43 +#: 0ea63130eb5741979a9603a768b759e6 msgid "![document](../../../../assets/kbqa/document.jpg)" msgstr "![document](../../../../assets/kbqa/document.jpg)" -#: ../../getting_started/application/kbqa/kbqa.md:31 -#: 10faa2236fa84dc284f7ce6d68acc43c +#: ../../getting_started/application/kbqa/kbqa.md:43 +#: cf7aacec8463485a811a1aa06d30f050 msgid "document" msgstr "document" -#: ../../getting_started/application/kbqa/kbqa.md:33 -#: 04449bfa78b14d1cb42c1259f67531d1 +#: ../../getting_started/application/kbqa/kbqa.md:45 +#: 0db8df4eb26b4139816e586136098c9b msgid "2.2 Upload Document:" msgstr "2.2上传文档" -#: ../../getting_started/application/kbqa/kbqa.md:34 -#: de14e2d7a6c54623bfc8af2fc6e20c62 +#: ../../getting_started/application/kbqa/kbqa.md:46 +#: e4331acfd6a24a2094cbbe21fd46ac8b msgid "![upload](../../../../assets/kbqa/upload.jpg)" msgstr "![upload](../../../../assets/kbqa/upload.jpg)" -#: ../../getting_started/application/kbqa/kbqa.md:34 -#: ../../getting_started/application/kbqa/kbqa.md:38 -#: ../../getting_started/application/kbqa/kbqa.md:43 -#: ../../getting_started/application/kbqa/kbqa.md:56 -#: 0e3ab13b9d064b238fba283d6f466051 65ea0b9b43ef4c64897a6e65781129c7 -#: cb65cb968a91492d9526f47e74b179e1 f0ff29911159497fb542942b6deb6972 +#: ../../getting_started/application/kbqa/kbqa.md:46 +#: ../../getting_started/application/kbqa/kbqa.md:50 +#: ../../getting_started/application/kbqa/kbqa.md:55 +#: ../../getting_started/application/kbqa/kbqa.md:68 +#: b8e7fc9cf2ef42fa8313d5f0b0c0e0ba msgid "upload" msgstr "upload" -#: ../../getting_started/application/kbqa/kbqa.md:37 -#: 77d936d2502f41feb2721da86cc1ebb1 +#: ../../getting_started/application/kbqa/kbqa.md:49 +#: e5a87f0715a642f58cae29ce43d72648 msgid "3.Chat With Knowledge" msgstr "3.知识问答" -#: ../../getting_started/application/kbqa/kbqa.md:38 -#: ae72c3236e564949b142a945f3474425 +#: ../../getting_started/application/kbqa/kbqa.md:50 +#: cefec99c30ab4757896b328371725dd7 msgid "![upload](../../../../assets/kbqa/begin_chat.jpg)" msgstr "![upload](../../../../assets/kbqa/begin_chat.jpg)" -#: ../../getting_started/application/kbqa/kbqa.md:40 -#: b9d701985d404a9196bb896718f41e36 +#: ../../getting_started/application/kbqa/kbqa.md:52 +#: 5d870c26dfaa4916a5e17646d835c5fd msgid "4.Adjust Space arguments" msgstr "4.调整知识参数" -#: ../../getting_started/application/kbqa/kbqa.md:41 -#: 6155bbf401ef44ea8d761c83ae5ceb9a +#: ../../getting_started/application/kbqa/kbqa.md:53 +#: 56afbbc1dc144c43be0b3e5ff8c3eb55 msgid "" "Each knowledge space supports argument customization, including the " "relevant arguments for vector retrieval and the arguments for knowledge " "question-answering prompts." msgstr "每一个知识空间都支持参数自定义, 包括向量召回的相关参数以及知识问答Promp参数" -#: ../../getting_started/application/kbqa/kbqa.md:42 -#: b9ac70b5ee99435a962dcb040b5ba4fc +#: ../../getting_started/application/kbqa/kbqa.md:54 +#: 994eb05bc17148608f5efc03a12797ff msgid "4.1 Embedding" msgstr "4.1 Embedding" -#: ../../getting_started/application/kbqa/kbqa.md:43 -#: 0ca2398756924828a904921456b863b5 +#: ../../getting_started/application/kbqa/kbqa.md:55 +#: ab00c34d964a4a0ab6472a4ab68c6b9a msgid "Embedding Argument ![upload](../../../../assets/kbqa/embedding.png)" msgstr "Embedding Argument ![upload](../../../../assets/kbqa/embedding.png)" -#: ../../getting_started/application/kbqa/kbqa.md:47 -#: e8b3e973e3b940e4bbf3180b7d6057ec +#: ../../getting_started/application/kbqa/kbqa.md:59 +#: 0bdc576f5c4f4d46b84dfd3e57e2e004 msgid "Embedding arguments" msgstr "Embedding arguments" -#: ../../getting_started/application/kbqa/kbqa.md:48 -#: 1cff4790d546455abeca725ae8b53c0d +#: ../../getting_started/application/kbqa/kbqa.md:60 +#: 515ed658cf8742e1898df7b6b0ed8fec msgid "topk:the top k vectors based on similarity score." msgstr "topk:相似性检索出tok条文档" -#: ../../getting_started/application/kbqa/kbqa.md:49 -#: 525aaa02028b4900919526290b6da9ef +#: ../../getting_started/application/kbqa/kbqa.md:61 +#: b2cec278eee640c2b1dea2e52032ca16 msgid "recall_score:set a threshold score for the retrieval of similar vectors." msgstr "recall_score:向量检索相关度衡量指标分数" -#: ../../getting_started/application/kbqa/kbqa.md:50 -#: dead3b559b134e52a3cf38e29b1982e1 +#: ../../getting_started/application/kbqa/kbqa.md:62 +#: ba0a2a2ff9454a7598d2217b8aefa565 msgid "recall_type:recall type." msgstr "recall_type:召回类型" -#: ../../getting_started/application/kbqa/kbqa.md:51 -#: 7c48de3186a14fcf96ee2bc6d715bd4c +#: ../../getting_started/application/kbqa/kbqa.md:63 +#: b33b6627142d41c4a4e83b56d446c0c7 msgid "model:A model used to create vector representations of text or other data." msgstr "model:embdding模型" -#: ../../getting_started/application/kbqa/kbqa.md:52 -#: 875ba3d051b847a5b3357a4eef583c0a +#: ../../getting_started/application/kbqa/kbqa.md:64 +#: 9113a950faca4515967a905256a29e8e msgid "chunk_size:The size of the data chunks used in processing." msgstr "chunk_size:文档切片阈值大小" -#: ../../getting_started/application/kbqa/kbqa.md:53 -#: e43f2bb091594532ba69ed3e3a385cdd +#: ../../getting_started/application/kbqa/kbqa.md:65 +#: dccc04f7efae40309ecaccb33375cf9c msgid "chunk_overlap:The amount of overlap between adjacent data chunks." msgstr "chunk_overlap:文本块之间的最大重叠量。保留一些重叠可以保持文本块之间的连续性(例如使用滑动窗口)" -#: ../../getting_started/application/kbqa/kbqa.md:55 -#: e21e19688fa042a4b60860ffa6bcf119 +#: ../../getting_started/application/kbqa/kbqa.md:67 +#: 1740d538f7e7427a8f031b9e1e045f15 msgid "4.2 Prompt" msgstr "4.2 Prompt" -#: ../../getting_started/application/kbqa/kbqa.md:56 -#: 00f0bddcd9174b7a84a25b7fe6d286e9 +#: ../../getting_started/application/kbqa/kbqa.md:68 +#: a0faf9300f804cc1b99371946c1c86e0 msgid "Prompt Argument ![upload](../../../../assets/kbqa/prompt.png)" msgstr "Prompt Argument ![upload](../../../../assets/kbqa/prompt.png)" -#: ../../getting_started/application/kbqa/kbqa.md:60 -#: d5ff2b76a04949708b3c9050db647927 +#: ../../getting_started/application/kbqa/kbqa.md:72 +#: b8e6d1b4afdb4dcca99ed23107f3da0b msgid "Prompt arguments" msgstr "Prompt arguments" -#: ../../getting_started/application/kbqa/kbqa.md:61 -#: 817a8744378546a2b049f44793b4554b +#: ../../getting_started/application/kbqa/kbqa.md:73 +#: 9d3acae04dae4beb86577e58a9f0a8ed msgid "" "scene:A contextual parameter used to define the setting or environment in" " which the prompt is being used." msgstr "scene:上下文环境的场景定义" -#: ../../getting_started/application/kbqa/kbqa.md:62 -#: 5330c26a4fc34ff6ba5fea1910cfbdc0 +#: ../../getting_started/application/kbqa/kbqa.md:74 +#: f33e888dd6494330a36ee4b091aa2f3a msgid "" "template:A pre-defined structure or format for the prompt, which can help" " ensure that the AI system generates responses that are consistent with " "the desired style or tone." -msgstr "" -"template:预定义的提示结构或格式,可以帮助确保AI系统生成与所期望的风格或语气一致的回复。" +msgstr "template:预定义的提示结构或格式,可以帮助确保AI系统生成与所期望的风格或语气一致的回复。" -#: ../../getting_started/application/kbqa/kbqa.md:63 -#: a34cd8248e6b44228868c2a02e12466f +#: ../../getting_started/application/kbqa/kbqa.md:75 +#: 18337db544f4428ba32622a0d7d711f3 msgid "max_token:The maximum number of tokens or words allowed in a prompt." msgstr "max_token: prompt token最大值" -#: ../../getting_started/application/kbqa/kbqa.md:65 -#: 7da49aac293f462b9e3968fa1493dba1 +#: ../../getting_started/application/kbqa/kbqa.md:77 +#: 531a209f474246249ffaf66dec484dcc msgid "5.Change Vector Database" msgstr "5.Change Vector Database" -#: ../../getting_started/application/kbqa/kbqa.md:67 -#: 680bfb451eb040e0aa55f8faa12bb75a +#: ../../getting_started/application/kbqa/kbqa.md:79 +#: d6665f2efd73412a9dd5ac2ffd88b369 msgid "Vector Store SETTINGS" msgstr "Vector Store SETTINGS" -#: ../../getting_started/application/kbqa/kbqa.md:68 -#: 32820ae6807840119a786e92124ad209 +#: ../../getting_started/application/kbqa/kbqa.md:80 +#: 8a6f5b7af5b942928a76556425d943bd msgid "Chroma" msgstr "Chroma" -#: ../../getting_started/application/kbqa/kbqa.md:69 -#: 7573aa05bc914fc2993b2531475b3b99 +#: ../../getting_started/application/kbqa/kbqa.md:81 +#: bbde039fef3445bf84cc2ded916e6960 msgid "VECTOR_STORE_TYPE=Chroma" msgstr "VECTOR_STORE_TYPE=Chroma" -#: ../../getting_started/application/kbqa/kbqa.md:70 -#: cc2c5521ba6e417eb5b3cf96375c2a08 +#: ../../getting_started/application/kbqa/kbqa.md:82 +#: 984d7eceee8c474880174f3a3ba0df7a msgid "MILVUS" msgstr "MILVUS" -#: ../../getting_started/application/kbqa/kbqa.md:71 -#: fc5dfa54c8a24b069e2709c309e43faa +#: ../../getting_started/application/kbqa/kbqa.md:83 +#: 8dbf41b03c58457896c4a9595fcb9517 msgid "VECTOR_STORE_TYPE=Milvus" msgstr "VECTOR_STORE_TYPE=Milvus" -#: ../../getting_started/application/kbqa/kbqa.md:72 -#: 8661384f0c4a40a0b79fad94bbee1792 +#: ../../getting_started/application/kbqa/kbqa.md:84 +#: 853a391ff6fc47af90e8fbaea06ee948 msgid "MILVUS_URL=127.0.0.1" msgstr "MILVUS_URL=127.0.0.1" -#: ../../getting_started/application/kbqa/kbqa.md:73 -#: 2035d343d34f47fa9fa84eb841afa2f8 +#: ../../getting_started/application/kbqa/kbqa.md:85 +#: ef21d47a76eb495dbafb3dd0e99ae3b2 msgid "MILVUS_PORT=19530" msgstr "MILVUS_PORT=19530" -#: ../../getting_started/application/kbqa/kbqa.md:74 -#: e0d8bd8d1dfb425bb50d5c8bf4a134ab +#: ../../getting_started/application/kbqa/kbqa.md:86 +#: c06ba32595bb4572a468f8ca277c30fd msgid "MILVUS_USERNAME" msgstr "MILVUS_USERNAME" -#: ../../getting_started/application/kbqa/kbqa.md:75 -#: dec547e6b4354c71857fa7c92c08bfa6 +#: ../../getting_started/application/kbqa/kbqa.md:87 +#: f09d2171e98c4b379cb7548715b3f60f msgid "MILVUS_PASSWORD" msgstr "MILVUS_PASSWORD" -#: ../../getting_started/application/kbqa/kbqa.md:76 -#: 9ad3f325f79e49309bd3419f48015e90 +#: ../../getting_started/application/kbqa/kbqa.md:88 +#: e0f8de6b5bfb4689be9a7777796e5477 msgid "MILVUS_SECURE=" msgstr "MILVUS_SECURE=" -#: ../../getting_started/application/kbqa/kbqa.md:78 -#: f6e15bf479da496fbcdf7621bad4dda8 +#: ../../getting_started/application/kbqa/kbqa.md:90 +#: 15fee5a1d2d9404f955a27d77656b690 msgid "WEAVIATE" msgstr "WEAVIATE" -#: ../../getting_started/application/kbqa/kbqa.md:79 -#: f7838d5de0a9452486adceb3a26369ee +#: ../../getting_started/application/kbqa/kbqa.md:91 +#: 632fe609a7694d51b4b908fed5a80415 msgid "WEAVIATE_URL=https://kt-region-m8hcy0wc.weaviate.network" msgstr "WEAVIATE_URL=https://kt-region-m8hcy0wc.weaviate.networkc" diff --git a/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/chatdb/chatdb_faq.po b/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/chatdb/chatdb_faq.po index dbc03b315..b0084b477 100644 --- a/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/chatdb/chatdb_faq.po +++ b/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/chatdb/chatdb_faq.po @@ -22,7 +22,7 @@ msgstr "" #: ../../getting_started/faq/chatdb/chatdb_faq.md:1 #: ffd1abb6b8f34e53a8ed83ede845b141 msgid "Chat DB FAQ" -msgstr "" +msgstr "Chat DB FAQ" #: ../../getting_started/faq/chatdb/chatdb_faq.md:3 #: 2467f6603ab341bbb1ce17f75dc06e5e @@ -35,27 +35,28 @@ msgid "" "ChatData generates SQL from natural language and executes it. ChatDB " "involves conversing with metadata from the Database, including metadata " "about databases, tables, and fields." -msgstr "" +msgstr "ChatData 是将自然语言转换成SQL并执行获取结果,ChatDB主要是和数据库元数据信息(包括表、字段、索引信息), 用于db诊断和数据库答疑" #: ../../getting_started/faq/chatdb/chatdb_faq.md:6 #: fa3eef15697f43db963f6c875e85323b msgid "Q2: The suitable llm model currently supported for text-to-SQL is?" -msgstr "" +msgstr "Q2: 目前DB-GPT最适合text-to-SQL的开源模型是什么" #: ../../getting_started/faq/chatdb/chatdb_faq.md:7 #: 47f36a0a48c045269bcf790873d55f8c msgid "Now vicunna-13b-1.5 and llama2-70b is more suitable for text-to-SQL." -msgstr "" +msgstr "vicunna-13b-1.5 和 llama2-70b" #: ../../getting_started/faq/chatdb/chatdb_faq.md:9 #: 9f5ef9a05fac4eb3b27875171ec4e763 msgid "Q3: How to fine-tune Text-to-SQL in DB-GPT" -msgstr "" +msgstr "Q3: 我想fine-tune Text-to-SQL in DB-GPT" #: ../../getting_started/faq/chatdb/chatdb_faq.md:10 #: c9b6f6e969e04805a59d9ccabc03c0b8 msgid "" "there is another github project for Text-to-SQL fine-tune " "(https://github.com/eosphoros-ai/DB-GPT-Hub)" -msgstr "" +msgstr "参与另外一个项目 Text-to-SQL fine-tune " +"(https://github.com/eosphoros-ai/DB-GPT-Hub)" diff --git a/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/kbqa/kbqa_faq.po b/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/kbqa/kbqa_faq.po index 1b352e972..885826ddd 100644 --- a/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/kbqa/kbqa_faq.po +++ b/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/kbqa/kbqa_faq.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: DB-GPT 👏👏 0.3.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-16 18:31+0800\n" +"POT-Creation-Date: 2023-08-18 14:11+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: zh_CN\n" @@ -20,34 +20,34 @@ msgstr "" "Generated-By: Babel 2.12.1\n" #: ../../getting_started/faq/kbqa/kbqa_faq.md:1 -#: bce4fd8751dd49bb8ab89a651094cfe1 +#: 348b327c869643c8baaafaddb9e7e6d4 msgid "KBQA FAQ" -msgstr "" +msgstr "KBQA FAQ" #: ../../getting_started/faq/kbqa/kbqa_faq.md:4 -#: c9714f70a03f422fae7bdb2b3b3c8be5 +#: b2d05eeaec0b445ab3283e0e4eee028a msgid "Q1: text2vec-large-chinese not found" -msgstr "" +msgstr "Q1: text2vec-large-chinese not found" #: ../../getting_started/faq/kbqa/kbqa_faq.md:6 -#: 1c56b9081adb46b29063947659e67083 +#: d64bad7091de4b439ab80cd754b3e68f msgid "" "make sure you have download text2vec-large-chinese embedding model in " "right way" -msgstr "" +msgstr "确认下载text2vec-large-chinese模型姿势以及路径正确" #: ../../getting_started/faq/kbqa/kbqa_faq.md:18 -#: 39763bdbc6824675b293f0f219fc05bb +#: 15a4987b681241cfa6dc4fc08dbebce3 msgid "Q2:How to change Vector DB Type in DB-GPT." -msgstr "" +msgstr "怎么修改向量数据库类型" #: ../../getting_started/faq/kbqa/kbqa_faq.md:20 -#: 225cc6e5b6944ce3b675845aa93afb66 +#: 6566d91820334c8fac964fe7e012acc7 msgid "Update .env file and set VECTOR_STORE_TYPE." -msgstr "" +msgstr "怎样在.env文件设置VECTOR_STORE_TYPE" #: ../../getting_started/faq/kbqa/kbqa_faq.md:22 -#: 5ad12db4aed44f4890911b5aea9529ce +#: 124dfe106c4b4afeadf0f2bc4b146f50 msgid "" "DB-GPT currently support Chroma(Default), Milvus(>2.1), Weaviate vector " "database. If you want to change vector db, Update your .env, set your " @@ -55,44 +55,57 @@ msgid "" "Milvus(>2.1), if you set Milvus, please set MILVUS_URL and MILVUS_PORT) " "If you want to support more vector db, you can integrate yourself.[how to" " integrate](https://db-gpt.readthedocs.io/en/latest/modules/vector.html)" -msgstr "" +msgstr "DB-GPT当前支持向量数据库有Chroma(Default), Milvus(>2.1), Weaviate. 可以在在.env文件设置VECTOR_STORE_TYP,如果你想支持更多向量数据库, 参考[how to" +" integrate](https://db-gpt.readthedocs.io/en/latest/modules/vector.html)" + #: ../../getting_started/faq/kbqa/kbqa_faq.md:38 -#: f8dd19ff86244cc7be91b7ab9190baeb +#: 5da7eb1fda5d43268eda0fab9d387dbb msgid "Q3:When I use vicuna-13b, found some illegal character like this." -msgstr "" +msgstr "当使用vicuna系列模型时出现乱码。" #: ../../getting_started/faq/kbqa/kbqa_faq.md:43 -#: ec4a69476d4e4e4d92619ade829c2b39 +#: 80f9785ca43f4f8a9475556bffab28a7 msgid "" "Set KNOWLEDGE_SEARCH_TOP_SIZE smaller or set KNOWLEDGE_CHUNK_SIZE " "smaller, and reboot server." -msgstr "" +msgstr "通过在.env文件将KNOWLEDGE_SEARCH_TOP_SIZE设置更小点或者在文档界面点击参数设置,将topk设置更小点" #: ../../getting_started/faq/kbqa/kbqa_faq.md:45 -#: 5b039a860c0b4cb088d042467ad2a49c +#: 7627f9349fbb40968537866075e53541 msgid "" "Q4:space add error (pymysql.err.OperationalError) (1054, \"Unknown column" " 'knowledge_space.context' in 'field list'\")" -msgstr "" +msgstr "space add error (pymysql.err.OperationalError) (1054, \"Unknown column" +" 'knowledge_space.context' in 'field list'\")" #: ../../getting_started/faq/kbqa/kbqa_faq.md:47 -#: bafac5e248894263a77ab688922df520 +#: e4c8bc526f1744ca880fd0f5faaa18c6 msgid "1.shutdown dbgpt_server(ctrl c)" -msgstr "" +msgstr "1.终止 dbgpt_server(ctrl c)" #: ../../getting_started/faq/kbqa/kbqa_faq.md:49 -#: 8ff5ca901f684e8ebe951f8c053ab925 +#: 25762770ad7b4e52aa60c1b8a274331b msgid "2.add column context for table knowledge_space" -msgstr "" +msgstr "2.新增列 `context` for table knowledge_space" #: ../../getting_started/faq/kbqa/kbqa_faq.md:53 -#: ea9f945678aa426894f0a12013f8fe5c +#: b025ea011b704eaab5413514a00ada4a msgid "3.execute sql ddl" -msgstr "" +msgstr "3.执行ddl" #: ../../getting_started/faq/kbqa/kbqa_faq.md:58 -#: 1a7941f2f1e94d359095e92b470ee02c +#: 2c25d510b7cc4386a962be130232f39c msgid "4.restart dbgpt serve" -msgstr "" +msgstr "4.重启dbgpt server" + +#: ../../getting_started/faq/kbqa/kbqa_faq.md:60 +#: 36aedd2404e84caf90fa6565fc05ee1f +msgid "Q5:Use Mysql, how to use DB-GPT KBQA" +msgstr "Q5:当使用 Mysql数据库时, 使用DB-GPT怎么初始化 KBQA service database schema" + +#: ../../getting_started/faq/kbqa/kbqa_faq.md:61 +#: bb01d8d145f64038bbacde1f05e69be1 +msgid "build Mysql KBQA system database schema." +msgstr "构建Mysql KBQA system database schema" diff --git a/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/llm/llm_faq.po b/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/llm/llm_faq.po index 260d2dd09..4be1ae177 100644 --- a/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/llm/llm_faq.po +++ b/docs/locales/zh_CN/LC_MESSAGES/getting_started/faq/llm/llm_faq.po @@ -21,67 +21,68 @@ msgstr "" #: ../../getting_started/faq/llm/llm_faq.md:1 f79c82f385904385b08618436e600d9f msgid "LLM USE FAQ" -msgstr "" +msgstr "LLM模型使用FAQ" #: ../../getting_started/faq/llm/llm_faq.md:3 1fc802fa69224062b02403bc35084c18 msgid "Q1:how to use openai chatgpt service" -msgstr "" +msgstr "我怎么使用OPENAI服务" #: ../../getting_started/faq/llm/llm_faq.md:4 9094902d148a4cc99fe72aa0e41062ae msgid "change your LLM_MODEL" -msgstr "" +msgstr "通过在.env文件设置LLM_MODEL" #: ../../getting_started/faq/llm/llm_faq.md:9 07073eb8d9eb4988a3b035666c63d3fb msgid "set your OPENAPI KEY" -msgstr "" +msgstr "set your OPENAPI KEY" #: ../../getting_started/faq/llm/llm_faq.md:15 a71bb0d1181e47368a286b5694a00056 msgid "make sure your openapi API_KEY is available" -msgstr "" +msgstr "确认openapi API_KEY是否可用" #: ../../getting_started/faq/llm/llm_faq.md:17 789b003864824970923bac474a9ab0cd msgid "Q2 how to use MultiGPUs" -msgstr "" +msgstr "Q2 怎么使用 MultiGPUs" #: ../../getting_started/faq/llm/llm_faq.md:18 4be3dd71a8654202a210bcb11c50cc79 msgid "" "DB-GPT will use all available gpu by default. And you can modify the " "setting `CUDA_VISIBLE_DEVICES=0,1` in `.env` file to use the specific gpu" " IDs." -msgstr "" +msgstr "DB-GPT默认加载可利用的gpu,你也可以通过修改 在`.env`文件 `CUDA_VISIBLE_DEVICES=0,1`来指定gpu IDs" #: ../../getting_started/faq/llm/llm_faq.md:20 3a00c5fff666451cacda7f9af37564b9 msgid "" "Optionally, you can also specify the gpu ID to use before the starting " "command, as shown below:" -msgstr "" +msgstr "你也可以指定gpu ID启动" #: ../../getting_started/faq/llm/llm_faq.md:30 7fef386f3a3443569042e7d8b9a3ff15 msgid "" "You can modify the setting `MAX_GPU_MEMORY=xxGib` in `.env` file to " "configure the maximum memory used by each GPU." -msgstr "" +msgstr "同时你可以通过在.env文件设置`MAX_GPU_MEMORY=xxGib`修改每个GPU的最大使用内存" #: ../../getting_started/faq/llm/llm_faq.md:32 d75d440da8ab49a3944c3a456db25bee msgid "Q3 Not Enough Memory" -msgstr "" +msgstr "Q3 机器显存不够 " #: ../../getting_started/faq/llm/llm_faq.md:34 2a2cd59382e149ffb623cb3d42754dca msgid "DB-GPT supported 8-bit quantization and 4-bit quantization." -msgstr "" +msgstr "DB-GPT 支持 8-bit quantization 和 4-bit quantization." #: ../../getting_started/faq/llm/llm_faq.md:36 755131812baa4f5a99b706849459e10a msgid "" "You can modify the setting `QUANTIZE_8bit=True` or `QUANTIZE_4bit=True` " "in `.env` file to use quantization(8-bit quantization is enabled by " "default)." -msgstr "" +msgstr "你可以通过在.env文件设置`QUANTIZE_8bit=True` or `QUANTIZE_4bit=True`" #: ../../getting_started/faq/llm/llm_faq.md:38 b85424bc11134af985f687d8ee8d2c9f msgid "" "Llama-2-70b with 8-bit quantization can run with 80 GB of VRAM, and 4-bit" " quantization can run with 48 GB of VRAM." -msgstr "" +msgstr "Llama-2-70b with 8-bit quantization 可以运行在 80 GB VRAM机器, 4-bit " +"quantization可以运行在 48 GB VRAM" #: ../../getting_started/faq/llm/llm_faq.md:40 b6e4db679636492c9e4170a33fd6f638 msgid "" diff --git a/docs/locales/zh_CN/LC_MESSAGES/getting_started/install/deploy/deploy.po b/docs/locales/zh_CN/LC_MESSAGES/getting_started/install/deploy/deploy.po index 44440d3f1..bf570d9b1 100644 --- a/docs/locales/zh_CN/LC_MESSAGES/getting_started/install/deploy/deploy.po +++ b/docs/locales/zh_CN/LC_MESSAGES/getting_started/install/deploy/deploy.po @@ -389,8 +389,8 @@ msgid "" "Llama-2-70b with 8-bit quantization can run with 80 GB of VRAM, and 4-bit" " quantization can run with 48 GB of VRAM." msgstr "" -"Llama-2-70b with 8-bit quantization 可以运行在 80 GB VRAM机器, 4-bit " -"quantization 可以运行在 48 GB VRAM" +"Llama-2-70b with 8-bit quantization 可以运行在80GB VRAM机器, 4-bit " +"quantization可以运行在 48 GB VRAM" #: ../../getting_started/install/deploy/deploy.md:147 #: 9b6085c41b5c4b96ac3e917dc5002fc2 diff --git a/pilot/vector_store/connector.py b/pilot/vector_store/connector.py index eaa202e72..d95fc4821 100644 --- a/pilot/vector_store/connector.py +++ b/pilot/vector_store/connector.py @@ -1,8 +1,8 @@ from pilot.vector_store.chroma_store import ChromaStore -from pilot.vector_store.weaviate_store import WeaviateStore +# from pilot.vector_store.weaviate_store import WeaviateStore -connector = {"Chroma": ChromaStore, "Weaviate": WeaviateStore} +connector = {"Chroma": ChromaStore} try: from pilot.vector_store.milvus_store import MilvusStore From 909bb263a4b389bda5c96ac41903363074414825 Mon Sep 17 00:00:00 2001 From: FangYin Cheng Date: Fri, 18 Aug 2023 15:12:37 +0800 Subject: [PATCH 03/30] feat: Add examples and modify deploy documents --- docs/getting_started/faq/deploy/deploy_faq.md | 23 +++++-- docs/getting_started/install/deploy/deploy.md | 17 +++-- .../install/llm/llama/llama_cpp.md | 6 +- pilot/connections/rdbms/conn_sqlite.py | 4 ++ pilot/model/conversation.py | 14 ++++ scripts/examples/load_examples.bat | 68 ++++++++++++++++++ scripts/examples/load_examples.sh | 69 +++++++++++++++++++ scripts/llama_cpp_install.sh | 47 +++++++++++++ 8 files changed, 235 insertions(+), 13 deletions(-) create mode 100644 scripts/examples/load_examples.bat create mode 100755 scripts/examples/load_examples.sh create mode 100755 scripts/llama_cpp_install.sh diff --git a/docs/getting_started/faq/deploy/deploy_faq.md b/docs/getting_started/faq/deploy/deploy_faq.md index 0c3091042..42a0e6afa 100644 --- a/docs/getting_started/faq/deploy/deploy_faq.md +++ b/docs/getting_started/faq/deploy/deploy_faq.md @@ -2,26 +2,26 @@ Installation FAQ ================================== -##### Q1: execute `pip install -r requirements.txt` error, found some package cannot find correct version. +##### Q1: execute `pip install -e .` error, found some package cannot find correct version. change the pip source. ```bash # pypi -$ pip install -r requirements.txt -i https://pypi.python.org/simple +$ pip install -e . -i https://pypi.python.org/simple ``` or ```bash # tsinghua -$ pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ +$ pip install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple/ ``` or ```bash # aliyun -$ pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ +$ pip install -e . -i http://mirrors.aliyun.com/pypi/simple/ ``` ##### Q2: sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file @@ -29,5 +29,20 @@ $ pip install -r requirements.txt -i http://mirrors.aliyun.com/pypi/simple/ make sure you pull latest code or create directory with mkdir pilot/data ##### Q3: The model keeps getting killed. + your GPU VRAM size is not enough, try replace your hardware or replace other llms. +##### Q4: How to access website on the public network + +You can try to use gradio's [network](https://github.com/gradio-app/gradio/blob/main/gradio/networking.py) to achieve. +```python +import secrets +from gradio import networking +token=secrets.token_urlsafe(32) +local_port=5000 +url = networking.setup_tunnel('0.0.0.0', local_port, token) +print(f'Public url: {url}') +time.sleep(60 * 60 * 24) +``` + +Open `url` with your browser to see the website. \ No newline at end of file diff --git a/docs/getting_started/install/deploy/deploy.md b/docs/getting_started/install/deploy/deploy.md index a2595cdff..0422a5c58 100644 --- a/docs/getting_started/install/deploy/deploy.md +++ b/docs/getting_started/install/deploy/deploy.md @@ -49,7 +49,7 @@ For the entire installation process of DB-GPT, we use the miniconda3 virtual env python>=3.10 conda create -n dbgpt_env python=3.10 conda activate dbgpt_env -pip install -r requirements.txt +pip install -e . ``` Before use DB-GPT Knowledge ```bash @@ -97,15 +97,20 @@ You can configure basic parameters in the .env file, for example setting LLM_MOD ### 3. Run +**(Optional) load examples into SQLlite** +```bash +bash ./scripts/examples/load_examples.sh +``` + 1.Run db-gpt server ```bash -$ python pilot/server/dbgpt_server.py +python pilot/server/dbgpt_server.py ``` Open http://localhost:5000 with your browser to see the product. -```tip +```{tip} If you want to access an external LLM service, you need to 1.set the variables LLM_MODEL=YOUR_MODEL_NAME, MODEL_SERVER=YOUR_MODEL_SERVER(eg:http://localhost:5000) in the .env file. @@ -116,7 +121,7 @@ If you want to access an external LLM service, you need to If you want to learn about dbgpt-webui, read https://github./csunny/DB-GPT/tree/new-page-framework/datacenter ```bash -$ python pilot/server/dbgpt_server.py --light +python pilot/server/dbgpt_server.py --light ``` ### Multiple GPUs @@ -141,6 +146,4 @@ DB-GPT supported 8-bit quantization and 4-bit quantization. You can modify the setting `QUANTIZE_8bit=True` or `QUANTIZE_4bit=True` in `.env` file to use quantization(8-bit quantization is enabled by default). -Llama-2-70b with 8-bit quantization can run with 80 GB of VRAM, and 4-bit quantization can run with 48 GB of VRAM. - -Note: you need to install the latest dependencies according to [requirements.txt](https://github.com/eosphoros-ai/DB-GPT/blob/main/requirements.txt). +Llama-2-70b with 8-bit quantization can run with 80 GB of VRAM, and 4-bit quantization can run with 48 GB of VRAM. \ No newline at end of file diff --git a/docs/getting_started/install/llm/llama/llama_cpp.md b/docs/getting_started/install/llm/llama/llama_cpp.md index 7def97d2a..ebb3b8220 100644 --- a/docs/getting_started/install/llm/llama/llama_cpp.md +++ b/docs/getting_started/install/llm/llama/llama_cpp.md @@ -1,6 +1,8 @@ -### llama.cpp +llama.cpp +================================== -DB-GPT is now supported by [llama-cpp-python](https://github.com/abetlen/llama-cpp-python) through [llama.cpp](https://github.com/ggerganov/llama.cpp). + +DB-GPT already supports [llama.cpp](https://github.com/ggerganov/llama.cpp) via [llama-cpp-python](https://github.com/abetlen/llama-cpp-python). ## Running llama.cpp diff --git a/pilot/connections/rdbms/conn_sqlite.py b/pilot/connections/rdbms/conn_sqlite.py index 1740537cf..3b980b555 100644 --- a/pilot/connections/rdbms/conn_sqlite.py +++ b/pilot/connections/rdbms/conn_sqlite.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +import os from typing import Optional, Any, Iterable from sqlalchemy import create_engine, text @@ -24,6 +25,9 @@ class SQLiteConnect(RDBMSDatabase): _engine_args = engine_args or {} _engine_args["connect_args"] = {"check_same_thread": False} # _engine_args["echo"] = True + directory = os.path.dirname(file_path) + if not os.path.exists(directory): + os.makedirs(directory) return cls(create_engine("sqlite:///" + file_path, **_engine_args), **kwargs) def get_indexes(self, table_name): diff --git a/pilot/model/conversation.py b/pilot/model/conversation.py index 5ee54cfc1..355bdda19 100644 --- a/pilot/model/conversation.py +++ b/pilot/model/conversation.py @@ -335,6 +335,20 @@ register_conv_template( ) ) +# Alpaca default template +register_conv_template( + Conversation( + name="alpaca", + system_message="Below is an instruction that describes a task. Write a response that appropriately completes the request.", + roles=("### Instruction", "### Response"), + messages=(), + offset=0, + sep_style=SeparatorStyle.ADD_COLON_TWO, + sep="\n\n", + sep2="", + ) +) + # Baichuan-13B-Chat template register_conv_template( # source: https://huggingface.co/baichuan-inc/Baichuan-13B-Chat/blob/f5f47be2adbbdceb784f334d6fa1ca2c73e65097/modeling_baichuan.py#L507 diff --git a/scripts/examples/load_examples.bat b/scripts/examples/load_examples.bat new file mode 100644 index 000000000..2ecf1c507 --- /dev/null +++ b/scripts/examples/load_examples.bat @@ -0,0 +1,68 @@ +@echo off +setlocal + +:: Get script location and set working directory +for %%i in (%0) do set SCRIPT_LOCATION=%%~dpi +cd %SCRIPT_LOCATION% +cd .. +cd .. +set WORK_DIR=%CD% + +:: Check if sqlite3 is installed +where sqlite3 >nul 2>nul +if %ERRORLEVEL% neq 0 ( + echo sqlite3 not found, please install sqlite3 + exit /b 1 +) + +:: Default file paths +set DEFAULT_DB_FILE=DB-GPT\pilot\data\default_sqlite.db +set DEFAULT_SQL_FILE=DB-GPT\docker\examples\sqls\*_sqlite.sql +set DB_FILE=%WORK_DIR%\pilot\data\default_sqlite.db +set SQL_FILE= + +:argLoop +if "%1"=="" goto argDone +if "%1"=="-d" goto setDBFile +if "%1"=="--db-file" goto setDBFile +if "%1"=="-f" goto setSQLFile +if "%1"=="--sql-file" goto setSQLFile +if "%1"=="-h" goto printUsage +if "%1"=="--help" goto printUsage +goto argError + +:setDBFile +shift +set DB_FILE=%1 +shift +goto argLoop + +:setSQLFile +shift +set SQL_FILE=%1 +shift +goto argLoop + +:argError +echo Invalid argument: %1 +goto printUsage + +:printUsage +echo USAGE: %0 [--db-file sqlite db file] [--sql-file sql file path to run] +echo [-d|--db-file sqlite db file path] default: %DEFAULT_DB_FILE% +echo [-f|--sql-file sqlite file to run] default: %DEFAULT_SQL_FILE% +echo [-h|--help] Usage message +exit /b 0 + +:argDone + +if "%SQL_FILE%"=="" ( + if not exist "%WORK_DIR%\pilot\data" mkdir "%WORK_DIR%\pilot\data" + for %%f in (%WORK_DIR%\docker\examples\sqls\*_sqlite.sql) do ( + echo execute sql file: %%f + sqlite3 "%DB_FILE%" < "%%f" + ) +) else ( + echo Execute SQL file %SQL_FILE% + sqlite3 "%DB_FILE%" < "%SQL_FILE%" +) diff --git a/scripts/examples/load_examples.sh b/scripts/examples/load_examples.sh new file mode 100755 index 000000000..0a829bdac --- /dev/null +++ b/scripts/examples/load_examples.sh @@ -0,0 +1,69 @@ +#!/bin/bash +# Only support SQLite now + +SCRIPT_LOCATION=$0 +cd "$(dirname "$SCRIPT_LOCATION")" +WORK_DIR=$(pwd) +WORK_DIR="$WORK_DIR/../.." + +if ! command -v sqlite3 > /dev/null 2>&1 +then + echo "sqlite3 not found, please install sqlite3" + exit 1 +fi + +DEFAULT_DB_FILE="DB-GPT/pilot/data/default_sqlite.db" +DEFAULT_SQL_FILE="DB-GPT/docker/examples/sqls/*_sqlite.sql" +DB_FILE="$WORK_DIR/pilot/data/default_sqlite.db" +SQL_FILE="" + +usage () { + echo "USAGE: $0 [--db-file sqlite db file] [--sql-file sql file path to run]" + echo " [-d|--db-file sqlite db file path] default: ${DEFAULT_DB_FILE}" + echo " [-f|--sql-file sqlte file to run] default: ${DEFAULT_SQL_FILE}" + echo " [-h|--help] Usage message" +} + +while [[ $# -gt 0 ]]; do + key="$1" + case $key in + -d|--db-file) + DB_FILE="$2" + shift # past argument + shift # past value + ;; + -f|--sql-file) + SQL_FILE="$2" + shift + shift + ;; + -h|--help) + help="true" + shift + ;; + *) + usage + exit 1 + ;; + esac +done + +if [[ $help ]]; then + usage + exit 0 +fi + +if [ -n $SQL_FILE ];then + mkdir -p $WORK_DIR/pilot/data + for file in $WORK_DIR/docker/examples/sqls/*_sqlite.sql + do + echo "execute sql file: $file" + sqlite3 $DB_FILE < "$file" + done + +else + echo "Execute SQL file ${SQL_FILE}" + sqlite3 $DB_FILE < $SQL_FILE +fi + + diff --git a/scripts/llama_cpp_install.sh b/scripts/llama_cpp_install.sh new file mode 100755 index 000000000..685678ae4 --- /dev/null +++ b/scripts/llama_cpp_install.sh @@ -0,0 +1,47 @@ +#!/bin/bash + +# Get cuda version by torch +CUDA_VERSION=`python -c "import torch;print(torch.version.cuda.replace('.', '') if torch.cuda.is_available() else '')"` + +DEVICE="cpu" +CPU_OPT="basic" + +if [ "${CUDA_VERSION}" = "" ]; then + echo "CUDA not support, use cpu version" +else + DEVICE="cu${CUDA_VERSION//./}" + echo "CUDA version: $CUDA_VERSION, download path: $DEVICE" +fi + +echo "Checking CPU support:" +CPU_SUPPORT=$(lscpu) + +echo "$CPU_SUPPORT" | grep -q "avx " +if [ $? -eq 0 ]; then + echo "CPU supports AVX." + # CPU_OPT="AVX" + # TODO AVX will failed on my cpu +else + echo "CPU does not support AVX." +fi + +echo "$CPU_SUPPORT" | grep -q "avx2" +if [ $? -eq 0 ]; then + echo "CPU supports AVX2." + CPU_OPT="AVX2" +else + echo "CPU does not support AVX2." +fi + +echo "$CPU_SUPPORT" | grep -q "avx512" +if [ $? -eq 0 ]; then + echo "CPU supports AVX512." + CPU_OPT="AVX512" +else + echo "CPU does not support AVX512." +fi + +EXTRA_INDEX_URL="https://jllllll.github.io/llama-cpp-python-cuBLAS-wheels/$CPU_OPT/$DEVICE" + +echo "install llama-cpp-python from --extra-index-url ${EXTRA_INDEX_URL}" +python -m pip install llama-cpp-python --force-reinstall --no-cache --prefer-binary --extra-index-url=$EXTRA_INDEX_URL From efd17593ce9e947f405b109863f2d3875047e279 Mon Sep 17 00:00:00 2001 From: FangYin Cheng Date: Fri, 18 Aug 2023 17:18:01 +0800 Subject: [PATCH 04/30] fix: Fix alpaca prompt error --- pilot/model/conversation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pilot/model/conversation.py b/pilot/model/conversation.py index 355bdda19..8508881b7 100644 --- a/pilot/model/conversation.py +++ b/pilot/model/conversation.py @@ -339,7 +339,7 @@ register_conv_template( register_conv_template( Conversation( name="alpaca", - system_message="Below is an instruction that describes a task. Write a response that appropriately completes the request.", + system="Below is an instruction that describes a task. Write a response that appropriately completes the request.", roles=("### Instruction", "### Response"), messages=(), offset=0, From a76f68239e192439479641742e18898b7334840e Mon Sep 17 00:00:00 2001 From: aries_ckt <916701291@qq.com> Date: Fri, 18 Aug 2023 18:00:22 +0800 Subject: [PATCH 05/30] doc:chatdb document --- .../application/chatdb/chatdb.md | 26 +++++- .../application/chatdb/chatdb.po | 85 +++++++++++-------- 2 files changed, 71 insertions(+), 40 deletions(-) diff --git a/docs/getting_started/application/chatdb/chatdb.md b/docs/getting_started/application/chatdb/chatdb.md index 5dca2aeb0..0344c9f8e 100644 --- a/docs/getting_started/application/chatdb/chatdb.md +++ b/docs/getting_started/application/chatdb/chatdb.md @@ -1,16 +1,36 @@ ChatData & ChatDB ================================== -ChatData generates SQL from natural language and executes it. ChatDB involves conversing with metadata from the Database, including metadata about databases, tables, and fields.![db plugins demonstration](../../../../assets/chat_data/chat_data.jpg) +ChatData generates SQL from natural language and executes it. ChatDB involves conversing with metadata from the +Database, including metadata about databases, tables, and +fields.![db plugins demonstration](../../../../assets/chat_data/chat_data.jpg) + ### 1.Choose Datasource -If you are using DB-GPT for the first time, you need to add a data source and set the relevant connection information for the data source. + +If you are using DB-GPT for the first time, you need to add a data source and set the relevant connection information +for the data source. + +```{tip} +there are some example data in DB-GPT-NEW/DB-GPT/docker/examples + +you can execute sql script to generate data. +``` + #### 1.1 Datasource management + ![db plugins demonstration](../../../../assets/chat_data/db_entry.png) + #### 1.2 Connection management + ![db plugins demonstration](../../../../assets/chat_data/db_connect.png) + #### 1.3 Add Datasource + ![db plugins demonstration](../../../../assets/chat_data/add_datasource.png) + ### 2.ChatData -After successfully setting up the data source, you can start conversing with the database. You can ask it to generate SQL for you or inquire about relevant information on the database's metadata. + +After successfully setting up the data source, you can start conversing with the database. You can ask it to generate +SQL for you or inquire about relevant information on the database's metadata. ![db plugins demonstration](../../../../assets/chat_data/chatdata_eg.png) ### 3.ChatDB diff --git a/docs/locales/zh_CN/LC_MESSAGES/getting_started/application/chatdb/chatdb.po b/docs/locales/zh_CN/LC_MESSAGES/getting_started/application/chatdb/chatdb.po index 7fb225754..940f6a422 100644 --- a/docs/locales/zh_CN/LC_MESSAGES/getting_started/application/chatdb/chatdb.po +++ b/docs/locales/zh_CN/LC_MESSAGES/getting_started/application/chatdb/chatdb.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: DB-GPT 👏👏 0.3.5\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-16 18:31+0800\n" +"POT-Creation-Date: 2023-08-18 17:49+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: zh_CN\n" @@ -20,99 +20,110 @@ msgstr "" "Generated-By: Babel 2.12.1\n" #: ../../getting_started/application/chatdb/chatdb.md:1 -#: e3984d7305214fc59fc356bd2e382543 +#: 7bb2659a189b4d8ea9e24b4d7911759e msgid "ChatData & ChatDB" msgstr "ChatData & ChatDB" #: ../../getting_started/application/chatdb/chatdb.md:3 -#: e74daab738984be990aaa21ab5af7046 +#: 90784ed8f40c49e09fb91a0918b056cf msgid "" "ChatData generates SQL from natural language and executes it. ChatDB " "involves conversing with metadata from the Database, including metadata " "about databases, tables, and fields.![db plugins " "demonstration](../../../../assets/chat_data/chat_data.jpg)" -msgstr "ChatData 是会将自然语言生成SQL,并将其执行。ChatDB是与Database里面的元数据,包括库、表、字段的元数据进行对话.![db plugins " -"demonstration](../../../../assets/chat_data/chat_data.jpg)" +msgstr "" +"ChatData 是会将自然语言生成SQL,并将其执行。ChatDB是与Database里面的元数据,包括库、表、字段的元数据进行对话.![db " +"plugins demonstration](../../../../assets/chat_data/chat_data.jpg)" #: ../../getting_started/application/chatdb/chatdb.md:3 -#: ../../getting_started/application/chatdb/chatdb.md:7 -#: ../../getting_started/application/chatdb/chatdb.md:9 -#: ../../getting_started/application/chatdb/chatdb.md:11 -#: ../../getting_started/application/chatdb/chatdb.md:13 -#: ../../getting_started/application/chatdb/chatdb.md:17 -#: 109d4292c91f4ca5a6b682189f10620a 23b1865780a24ad2b765196faff15550 -#: 3c87a8907e854e5d9a61b1ef658e5935 40eefe75a51e4444b1e4b67bdddc6da9 -#: 73eee6111545418e8f9ae533a255d589 876ee62e4e404da6b5d6c5cba0259e5c +#: ../../getting_started/application/chatdb/chatdb.md:14 +#: ../../getting_started/application/chatdb/chatdb.md:16 +#: ../../getting_started/application/chatdb/chatdb.md:18 +#: ../../getting_started/application/chatdb/chatdb.md:20 +#: ../../getting_started/application/chatdb/chatdb.md:24 +#: 2af94cf92f7d4b7382aa9878a51a53f3 4858db05f4094aec93c0582546a7d76b msgid "db plugins demonstration" msgstr "db plugins demonstration" #: ../../getting_started/application/chatdb/chatdb.md:4 -#: a760078b833e434681da72c87342083f +#: 96cec2f2107a4d99a9e94aed789e2344 msgid "1.Choose Datasource" msgstr "1.Choose Datasource" #: ../../getting_started/application/chatdb/chatdb.md:5 -#: b68ac469c7d34026b1cb8b587a446737 +#: 25bd983e3b2f413c9cb2c04cc1631313 msgid "" "If you are using DB-GPT for the first time, you need to add a data source" " and set the relevant connection information for the data source." msgstr "如果你是第一次使用DB-GPT, 首先需要添加数据源,设置数据源的相关连接信息" -#: ../../getting_started/application/chatdb/chatdb.md:6 -#: 8edecf9287ce4077a984617f0a06e30c +#: ../../getting_started/application/chatdb/chatdb.md:8 +#: 32c6bcabfdd14269b0ca04f2723c4745 +msgid "there are some example data in DB-GPT-NEW/DB-GPT/docker/examples" +msgstr "在DB-GPT-NEW/DB-GPT/docker/examples有数据示例" + +#: ../../getting_started/application/chatdb/chatdb.md:10 +#: f582ded883b34b208af7ba44dd1d7a87 +msgid "you can execute sql script to generate data." +msgstr "你可以通过执行sql脚本生成测试数据" + +#: ../../getting_started/application/chatdb/chatdb.md:13 +#: 77e5025ea41b4d2997172ef847cc94c0 msgid "1.1 Datasource management" msgstr "1.1 Datasource management" -#: ../../getting_started/application/chatdb/chatdb.md:7 -#: af7b5d2f6c9b4666a3466fed05968258 +#: ../../getting_started/application/chatdb/chatdb.md:14 +#: 7a94c5d8f1d24cb28ecb933f63ea1bf0 msgid "![db plugins demonstration](../../../../assets/chat_data/db_entry.png)" msgstr "![db plugins demonstration](../../../../assets/chat_data/db_entry.png)" -#: ../../getting_started/application/chatdb/chatdb.md:8 -#: f7d49ffe448d49169713452f54b3437c +#: ../../getting_started/application/chatdb/chatdb.md:15 +#: ba5b3576317749d9bdcd6c4e2a7eee51 msgid "1.2 Connection management" msgstr "1.2 Connection管理" -#: ../../getting_started/application/chatdb/chatdb.md:9 -#: 109a8c9da05d4ec7a80ae1665b8d48bb +#: ../../getting_started/application/chatdb/chatdb.md:16 +#: 79114a69a61642c6970358629340263b msgid "![db plugins demonstration](../../../../assets/chat_data/db_connect.png)" msgstr "![db plugins demonstration](../../../../assets/chat_data/db_connect.png)" -#: ../../getting_started/application/chatdb/chatdb.md:10 -#: ac283fff85bf41efbd2cfeeda5980f9a +#: ../../getting_started/application/chatdb/chatdb.md:17 +#: baaae5e3320742ea8def1144144ec2e0 msgid "1.3 Add Datasource" msgstr "1.3 添加Datasource" -#: ../../getting_started/application/chatdb/chatdb.md:11 -#: a25dec01f4824bfe88cc801c93bb3e3b +#: ../../getting_started/application/chatdb/chatdb.md:18 +#: 68dee774bfcd4c39ab9081c911d4af26 msgid "" "![db plugins " "demonstration](../../../../assets/chat_data/add_datasource.png)" -msgstr "![db plugins " +msgstr "" +"![db plugins " "demonstration](../../../../assets/chat_data/add_datasource.png)" -#: ../../getting_started/application/chatdb/chatdb.md:12 -#: 4751d6d3744148cab130a901594f673a +#: ../../getting_started/application/chatdb/chatdb.md:19 +#: 30df69cad4fe41da8d1aefe0b8f7b963 msgid "2.ChatData" msgstr "2.ChatData" -#: ../../getting_started/application/chatdb/chatdb.md:13 -#: bad82b572ba34ffb8669f0f8ff9b0a05 +#: ../../getting_started/application/chatdb/chatdb.md:20 +#: a2f838d667b24ad9a70bb21d5f47dd55 msgid "" "After successfully setting up the data source, you can start conversing " "with the database. You can ask it to generate SQL for you or inquire " "about relevant information on the database's metadata. ![db plugins " "demonstration](../../../../assets/chat_data/chatdata_eg.png)" -msgstr "设置数据源成功后就可以和数据库进行对话了。你可以让它帮你生成SQL,也可以和问它数据库元数据的相关信息。 ![db plugins " +msgstr "" +"设置数据源成功后就可以和数据库进行对话了。你可以让它帮你生成SQL,也可以和问它数据库元数据的相关信息。 ![db plugins " "demonstration](../../../../assets/chat_data/chatdata_eg.png)" -#: ../../getting_started/application/chatdb/chatdb.md:16 -#: 0bf9c5a2f3764b36abc82102c53d3cd4 +#: ../../getting_started/application/chatdb/chatdb.md:23 +#: eaa6f5302da242c7a41346610f7234e8 msgid "3.ChatDB" msgstr "3.ChatDB" -#: ../../getting_started/application/chatdb/chatdb.md:17 -#: f06e7583c2484a959c1681b1db0acfaa +#: ../../getting_started/application/chatdb/chatdb.md:24 +#: 217eefe88eb5425fb8cb481df133157c msgid "![db plugins demonstration](../../../../assets/chat_data/chatdb_eg.png)" msgstr "![db plugins demonstration](../../../../assets/chat_data/chatdb_eg.png)" From b5f2758dc0765091c535181889a56138a6e7ec5a Mon Sep 17 00:00:00 2001 From: FangYin Cheng Date: Fri, 18 Aug 2023 17:42:16 +0800 Subject: [PATCH 06/30] fix: modify docker image CICD fix: Fix error CICD config fix: Fix docker image error fix: Reduce docker image size fix: remove other architecture fix: remove llama.cpp dependencies from base image --- .github/workflows/docker-image-publish.yml | 35 ++++++++++++++++++++ .github/workflows/python-publish.yml | 25 +------------- docker/base/Dockerfile | 38 +++++++++------------- 3 files changed, 51 insertions(+), 47 deletions(-) create mode 100644 .github/workflows/docker-image-publish.yml diff --git a/.github/workflows/docker-image-publish.yml b/.github/workflows/docker-image-publish.yml new file mode 100644 index 000000000..bbc37b57d --- /dev/null +++ b/.github/workflows/docker-image-publish.yml @@ -0,0 +1,35 @@ + +name: Push docker image + +on: + release: + types: [published] + workflow_dispatch: + +permissions: + contents: read + +jobs: + build-image: + runs-on: ubuntu-latest + # run unless event type is pull_request + if: github.event_name != 'pull_request' + steps: + - uses: actions/checkout@v3 + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + - name: Login to Docker Hub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./docker/base/Dockerfile + platforms: linux/amd64 + push: true + tags: eosphorosai/dbgpt:${{ github.ref_name }} \ No newline at end of file diff --git a/.github/workflows/python-publish.yml b/.github/workflows/python-publish.yml index 304749dfb..9d5e52d7b 100644 --- a/.github/workflows/python-publish.yml +++ b/.github/workflows/python-publish.yml @@ -35,27 +35,4 @@ jobs: uses: pypa/gh-action-pypi-publish@27b31702a0e7fc50959f5ad993c78deac1bdfc29 with: user: __token__ - password: ${{ secrets.PYPI_API_TOKEN }} - build-image: - runs-on: ubuntu-latest - needs: deploy - # run unless event type is pull_request - if: github.event_name != 'pull_request' - steps: - - uses: actions/checkout@v3 - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Login to Docker Hub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Build and push - uses: docker/build-push-action@v4 - with: - context: . - platforms: linux/amd64,linux/arm64 - push: true - tags: eosphorosai/dbgpt:${{ github.ref_name }} + password: ${{ secrets.PYPI_API_TOKEN }} \ No newline at end of file diff --git a/docker/base/Dockerfile b/docker/base/Dockerfile index 3cb063e47..e273b8bd9 100644 --- a/docker/base/Dockerfile +++ b/docker/base/Dockerfile @@ -1,4 +1,4 @@ -ARG BASE_IMAGE="nvidia/cuda:11.8.0-devel-ubuntu22.04" +ARG BASE_IMAGE="nvidia/cuda:11.8.0-runtime-ubuntu22.04" FROM ${BASE_IMAGE} ARG BASE_IMAGE @@ -11,16 +11,6 @@ ARG LANGUAGE="en" ARG PIP_INDEX_URL="https://pypi.org/simple" ENV PIP_INDEX_URL=$PIP_INDEX_URL -RUN pip3 install --upgrade pip -i $PIP_INDEX_URL \ - && (if [ "${LANGUAGE}" = "zh" ]; \ - # language is zh, download zh_core_web_sm from github - then wget https://github.com/explosion/spacy-models/releases/download/zh_core_web_sm-3.5.0/zh_core_web_sm-3.5.0-py3-none-any.whl -O /tmp/zh_core_web_sm-3.5.0-py3-none-any.whl \ - && pip3 install /tmp/zh_core_web_sm-3.5.0-py3-none-any.whl -i $PIP_INDEX_URL \ - && rm /tmp/zh_core_web_sm-3.5.0-py3-none-any.whl; \ - # not zh, download directly - else python3 -m spacy download zh_core_web_sm; \ - fi;) - RUN mkdir -p /app # COPY only requirements.txt first to leverage Docker cache @@ -30,20 +20,22 @@ COPY ./README.md /app/README.md WORKDIR /app -# RUN pip3 install --upgrade pip -i $PIP_INDEX_URL \ -# && (if [ "${BUILD_LOCAL_CODE}" = "false" ]; \ -# # if not build local code, clone latest code from git, and rename to /app, TODO: download by version, like: https://github.com/eosphoros-ai/DB-GPT/archive/refs/tags/$DBGPT_VERSION.zip -# then git clone https://github.com/eosphoros-ai/DB-GPT.git /app \ -# && cp /app/requirements.txt /tmp/requirements.txt; \ -# fi;) \ -# && pip3 install -r /tmp/requirements.txt -i $PIP_INDEX_URL --no-cache-dir \ -# && rm /tmp/requirements.txt - -RUN pip3 install -i $PIP_INDEX_URL . - # ENV CMAKE_ARGS="-DLLAMA_CUBLAS=ON -DLLAMA_AVX2=OFF -DLLAMA_F16C=OFF -DLLAMA_FMA=OFF" # ENV FORCE_CMAKE=1 -RUN pip3 install -i $PIP_INDEX_URL .[llama_cpp] \ +# Install all +# RUN pip3 install -i $PIP_INDEX_URL ".[all]" + +RUN pip3 install --upgrade pip -i $PIP_INDEX_URL \ + && pip3 install -i $PIP_INDEX_URL . \ + # && pip3 install -i $PIP_INDEX_URL ".[llama_cpp]" \ + && (if [ "${LANGUAGE}" = "zh" ]; \ + # language is zh, download zh_core_web_sm from github + then wget https://github.com/explosion/spacy-models/releases/download/zh_core_web_sm-3.5.0/zh_core_web_sm-3.5.0-py3-none-any.whl -O /tmp/zh_core_web_sm-3.5.0-py3-none-any.whl \ + && pip3 install /tmp/zh_core_web_sm-3.5.0-py3-none-any.whl -i $PIP_INDEX_URL \ + && rm /tmp/zh_core_web_sm-3.5.0-py3-none-any.whl; \ + # not zh, download directly + else python3 -m spacy download zh_core_web_sm; \ + fi;) \ && rm -rf `pip3 cache dir` ARG BUILD_LOCAL_CODE="false" From 7a210d8120e707fb3de158f42afa6f5a965495fa Mon Sep 17 00:00:00 2001 From: csunny Date: Sun, 20 Aug 2023 10:44:11 +0800 Subject: [PATCH 07/30] choros: update community + discord --- README.md | 38 ++++++++++++++++++++------------------ README.zh.md | 16 ++++++++-------- 2 files changed, 28 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index eaaf983a5..251d179dc 100644 --- a/README.md +++ b/README.md @@ -7,32 +7,34 @@

- - stars + + stars - - forks + + forks License: MIT - - Release Notes + + License: MIT - - Open Issues + + Release Notes - - Discord + + Open Issues - + + Discord + + Open in GitHub Codespaces

-[**简体中文**](README.zh.md) |[**Discord**](https://discord.gg/erwfqcMP) |[**Documents**](https://db-gpt.readthedocs.io/en/latest/)|[**Wechat**](https://github.com/csunny/DB-GPT/blob/main/README.zh.md#%E8%81%94%E7%B3%BB%E6%88%91%E4%BB%AC) - +[**简体中文**](README.zh.md) |[**Discord**](https://discord.gg/Y5rbqj4U) |[**Documents**](https://db-gpt.readthedocs.io/en/latest/)|[**Wechat**](https://github.com/eosphoros-ai/DB-GPT/blob/main/README.zh.md#%E8%81%94%E7%B3%BB%E6%88%91%E4%BB%AC)|[**Community**](https://github.com/eosphoros-ai/community)
## What is DB-GPT? @@ -57,7 +59,7 @@ DB-GPT is an experimental open-source project that uses localized GPT large mode Run on an RTX 4090 GPU. -https://github.com/csunny/DB-GPT/assets/13723926/55f31781-1d49-4757-b96e-7ef6d3dbcf80 +https://github.com/eosphoros-ai/DB-GPT/assets/13723926/55f31781-1d49-4757-b96e-7ef6d3dbcf80 J?Vz+6?sZ%KIX$KrDNel4qvw6@ zww$Veer+&wsP-Z8j1m)SL5{jZzg8Hmn}&mjdA}wHm6Xa6_b0qCV8P%Sv*R7|yN~SQRVGHWfr$9@dH((T_ewhDVuX6{ z&L22%z}6aMS}1*kK29O`57~lGI}VNeGFx#qIrA1llf3K|_h%rZai8wTE-c&#wqb~W z;N9NR)$Btk_5X17-SJrO;oo-|p+zcX6p9v6NocA&qmWQmghFK(MI_x35)x%cDw2`C zLblAvCL?%Fd@P~e|%IiAl2z97A5c%ie`@>Tc7MM6c{*oqkl!?o3kfG34Dpk|0UdTeiOL2Xmo)T3IsqG z5)Bv*>NViT_JYiq?a>V@t9(EZ3G?VkU2wmyeS~I@+q^AJ@pIC;XISrrKMTib5^Ick zFtjnjy@bbv`mz=X8vx-1yee8LEhc6c9-tbf)0)<> z5mQ6&&dtr~VRsK#I{MGER#0{ldHJ&4e0<$CW-+g*SWt5jtcQHU1qX*i7qDsJ&jJP> zyJdPG+1c6Y(k(ilsmW5D&5&zGOrbz5fMsl}ururcBimObk6d0xk2Sh9 zzy!=CU~!NQe|gy;sV3;ul0P_Khb6)i2VBPzDW*IEWdIbQO+NIe1LvIYBo_KT3fNuo-)W;UwzVKy@Z&4m^-s8|tv^4%0cqNTB~j@mMMh z6KAc^Il2H+mwUU7Li#{z>ODxyjGCY*p#hDUT-EExF-zKWC`&06kW?$+K&9`&AP8s0 zF-%{SL!ARfr2G^AMMu7^ZWKO#yb3=(F6a`v@W|6Dwg`4Y?Ll9GpgQt*Z0)=548ee# z)B=LXXpj#iEp%d`_L~f7{bpE>@)d6+=qK;@K6$ybNu_@^LS~1aNR%5}^?x+e37Ore zl3kN~d=Ui&e{1kM=f=rxKCfl3cB(^&n*9&MtK=ki^~5i+9W38Z9Ba|@9#i-i7X_xe z?bxf77k7fzG5{T2In!KSFUYotcEYQOUbZY^mF&>j*4cAY+-Am*VWUYkTpC*Wr2AFM zgts;SDY-HOZ}I4qbQ9;t189m*t%ZCpYt-W++R!(Hq%IMM zQddzWKCzU*NeN8*1o6+8zs-RNA-lac)FSu?$OCD21CfM8rHR-bDisv6Eqsn3JpX|x z!RG~MpusW#sjw*G{tM}oxD}p=5)`0sB_uVAOta!%Yb%k+3Bwug0U-9N9~MFPpiQLTmNo$sw&1pH$@4@a1-Z&(^9ZDQk*{7Q%!7ln zg1v@j1#UJE6;i(9yasM9!_8u*KM36^Is&ixP5S7LmZxK_U%wiR(JvRkmc?|QWaVvnH$_IHS7S6RD( zn)SiWPY7cwX(i_+3q=V_<}d-t@p7g5Ut|N>nEwY{8zge||AtH9jYgtD?!_6@)2}!J zLaZPcfC%le$ZqgnXvrmdpe@6Sj9%?r263ECNLYYm0E&|L zy-DB~aac?#y&Z?=EIvN|W*JEFE*$2>=2(F<9P;b5MR8Pjcem}rO(3G!FWQ{#@9RtF z4YylgMucFB!}UyVw0f|awq%RcKLhLngF5S-A7|W@gOTrpeDCd@zYyE^`1y16lrHPA z=>u;!gyb9G&2;Z71w`>i`Ni?vm`lg4K=b3=_ZJz5H3}UseD}cYaRP^gaWG&LDPTOb zmy#8>_V(n+Z=WhIDVchfXq+2iB*w|Nd$(8eO24wp_+>5*rCG4t0!zK#@fkx{IP^@` zeLj9n|C^_F?B@NCr~Y_kwt!W|Id|c&{bFM@fH918dyv^baab;gN(iKm2`pooHd#%J zfd1q6%bDCfJnjQ1C`5*aL%gUw6@#B&FaNaw?-Gb!IuebvuLOGT zMHai}#eKyufIwFhc-1(>)pZ$(%77%jPl z^z{kXW!^B}fOsg|+qakIO}7mKWMBp;JmC2Y@uqsjgxT9mzj%Ctq+CLz7oG^5Urhop za)dhojo_*gK|pqTAG}?_BQvV(f#E$s%rGrqZ@Z|>3*|gu?_Ec+C(a_YNDE*nNbm>A z&w&*aU+$uQ@W^r9U9Ly0(D)cS%RtFo&H33IE@Wh|Uv5536pQO?QmlBffL=Peg z2D1JqAxaOj*5maj;+BHr?bCBJ|0S;;eufzXL-$F`7Px~gp>{DP=}C~9F_oN))nJ>Q z==4UvN2ir-oA}0taQVN{3$wD->WR8>Qn!nYqm5go>Ho@>WdC7lYFosNKZF_vMn;jZ z9N>as<)$)G;C1Q2I@son>48rk*R)}7t`6Go;Ys?!pIGEj0@kY=2D0W1jCT>Zfgh22 zdD3G&ACS%`7Ico?AApdXo9Y|&Jmk3XBA92_qwEpyqkwGSq z;WSWF`PVU8TjDp*EZ}!`<=ple!1X3OV<@(ceJ4h9*}1qX`pNiNy7{h~7gkIpy-9jy z{m|V#u|<8}4T`5}3=zQEyz~gVhz84WVKW!kuD51oRaGt+auOFl0B->d##BQ36a4a) z1xSHHZ&@ZCLgoO#)!j1-#?>KTv%BZ66G4;%%#6Ilzbf@aoBQ6oJ#O+Ol51(sPIp#H zICJLdh=R0>_2WJfY9X_A5$3al&0Dq}C37o60=Df3#Qh?HCnaLA`Rseye=xLzFGTk9 zuOHimFBP91J1u{;>C~yi%sU9?<`!CG=1di8RR<&NQ9tuK2EQiH1O36} zx|F!h$3KoJhgfL8zUlp+flj(eWnm;;EyWS30rF>4P?SnEz^-CJrOG5sBR4-7Y+!^S zoZ2wbCy`i6lX;mKy={kmiq_b!R6~Q@oi?Ci}Rh8$T^z$(c&;xJS;#+3gdLdM4 z8DMTvrQQDbF%$l}%fZ2Mwlo%ob*RT?7Lc(K(G4(fu*c6ETJ<;L?)n?vJ8-Z~wXPdW z0k(z);yzl;{?IGxPOl9K=2%kvV~LzV`Co7JcT^B9Lg~wkv?d>05jS z4C-CrQECjZ&jaor5{a}Z{>}joXN$!OWfcHyt$+#x6R!xK0PY~m7_Nt)Rc50B-$;q3O5d8v2-!cp5ETu(wDnsV<5Mw0=<-D)^iZD;+F z(AM2oktUm%k zR8RtwNjIj1vrxvCz>Ty4Rx{Rb^NHvNED>J#=6sCgB`nhd>q7JN<%hf#Xu(r(SC=Y0;6*j7;skv1hmX&^mlHpC_>W&85S%>nL*4 zpom7FRNw@`yOo??LLp5Gnx!gx%&{1nS~9W&IMRvne)Rf}4mJct5ux0lyV7khpeUM; zk4Kyg!CD7$mr|60={TsXqyB%zEEqD6cc_NK+_|n3A{jSN&s5C`k-sZ}43S~l=G+56 zbBu$qYEcL`XcqP1!v~%5YZQuT;9u{YX)o`$tuu2$feJ=~hM%z<%PB>fVae5{21}@k zyc|1prKRb2(88U<-Ske-=V(k0ulx2eT;tw0#Z%k)oSl!c$n)lG^HtEE@XikL*S~)1 zy5PRR%Xf~3%{yGL9=+Ju`fD_2AU3(8RvO^srI)W~zL1E652^e4 z6ePyQa#EdQzOcff3WHzL)QeZ+y|EHa@%|{OF7z+$u{%vSzz}61K zy<=&aiqUE;sJb+n?aT#@%9C=e^wR(QJ9+$s0Db-m8=L)V=g(h{WX3kvX7<9jZ+E_V z`_|wO)@k2E7EAHyx%20b<9kMC5tli-V-NpvJ3GnxhK9spV60_7{RDO7<(c<&3#b_{ zhq!DdR!9G^-?lAkeHe{n?OG?@cg77kyn6R9izF=7iSSV|>m6n`bcOxWLeQf4?WfLJ-eO0yhQA*B`s&1QYgNk}YNugpEBU z{El#=l8BvL4X3;ly7BWmB$%c(rHtwiXczs*{y-JmZMctJiP8)mwpJil1)eBPLW`@Z zsU<|pD=0VX!6E5Eb02cY18>0r$Vd(RT)S=?ojP@j zWiiA`H>W%(5_?KAn|!uFwr75p22hGJf7^WVbAB1T=AJpy&2cB2uyR z(iKA{Ivu*HRGO@gFGkqqxBWZu9nvukTKQXUuqHRxjmu^ID2W zQJ>HG%cM1L!7pAXf#4`yb} zwQ40_bouZy(Ri66d~2S$s(#ONRjCdW#3J;Co|{j*jQU&Ful_i3^;UMX(3E6Llw zru3gZw04f&dF;yRh2v(={{4ynTLtlVSz@yw%c@nYvWFnOmySE{ktBdpx^*j6SqsDt z;-WYVv1JY-AAC4q0lJ2VStu0r;Rt477{Z7g;9rb&iEdtA>tDfIOpnfMd)(`@JD<{Y zhlPFQ6sDk$T1v=0Db!-zqO5%{g_$5eyij@{i&@RLZh^hymCD~RDvV+H^Az$apx8?f z!7PZ_gVf{$!i1g7SOpH)W4r<)J%%=@w;3`oR1cDUxkFeWG8$j?^XE^Nw}@(43hY0w z>ud#8R`&kOms>2Pz;kE(Wp`FgENc^BE>QaT=~F2JNS@60<#sy$iW}q*;_{TK{P;1C z?6a+V24z1{Mc7D%ZnsCz0t<~LCe@G`7&^TGg&64mG#A|~A41~ckWB=)y%wJ^AH zmkYdV1~y z3P{uBsT=uWJ6yj5^5g?iVNlQ&V%(^`6Q~qL5+>K3IB~-6*E5KyMEfET9*uNB!Z=3T z_xi{pGp}yE)f7dR_?!p3y7B@)V6@WL(Fv{kjbOeERDY$T$WX||OVqe{(PH0G=HuJf z6e;D-J>aFPsHxE-lQiTiNus*qtips+MdHR9CwO>x_{7DZ*<}em!>X9=J9pwtMcjs` zGCzNBZ|^ajL@_XC@&M#ks77KR2|gSi9zH*0nhz>O;^Oh~p&@1j1sV+i5t6)kVQgT) zIDLyc63YnVR_*UzT2iw2Wz~#~nVB#KKF@uMF#f;-qFMGbUjF7yapTSi$IF}78-fr;oPky|hU5AA#q)GVLK z)tc-cfQJDyvhMKSsJCxfP#87;mpXw84m5^J`G(Hm!8sXaJ5lr=Oy z9@^t4w^i`WYJoM(uq%9KKY{iUe{a6j)OH`aJos5^g37(*aOH790v;U_w^+T#ogS;S zq+hE94q^yKjCcB6eUAKQHa7i8WPjWT;!%Cp<(YM3fA#P77Fh`iiDMcX0WGcR=vt5o zeCf{zFE1|$mW&cL84)If*U;R33%?T$AlB7t6+PR4fbbVdNuOi6gDtJCO|AY|AJmL} z@Shd{%cj-T)suCX!5axxlaa|UEaV7B5k9%{SkLW#oFhs)>{UO&K^SehXI2c$1vtnT zxw+3%4}+x$@Z=r-aU0QT{oHmCQ*xx}YJ<<+1pc$qaZB(;b|`8*TIeWpr%%%%-|KpO zStOPJ9*EOg`!%fe-xf$2^-4{$C3(Gae0YD$g_#Fx=aG;h5N2w8yOD*KoasK%E)S+M+(QcObu zfK7d%P$5U+K&B#2*Cd&e6dB1#M0x-Z_)Iu4BNCMC&`k5C%FNbQEwYYFA9QJ~6mUiI z6$NMp_;aC);l|*c_w&xNV-(UW!CR-#W^cv^iiqqFmbm-(kO?P#1ZJ3bW%a;j-(jpv|Lt%)ZlY(a(MPWZ_iN4>y<8gKC8fFrfkNt+b%GXP?Rwc9!qiZ>#YuC39O>TDZ z6;#qoIO*fs1x!B@(LBU~**3-b`AY_nCu(v_y9zFHQEU%7aF^l)L9KZ5+0QT&iHeFU zD`z?&%>GdhPG815ckbBPV8orn+LPv23MhsI52BTCh4^murbBLSp24fhPC1%2+?sQ6 z?YK=5iV(mLV(O+^33Uk7g;s=ZYZ129KV0MP-1G_2VS1_D^Rfr;T!JivLH zHIDPOIYVtg>_mlx9yL9~B4W_0I)1{`B7j6FYdm&iKz1EQ;?k*YTbLr)I0gBbRsjyo zmn{EW1kaz{fd)RQ1EdfVZGbhN0lZJ`UAC7sp+Wm3Ib0h8q-IauM@U|(GMA{a;~M}l z=^1#N(5JgUe8@ufT=9Mo!h%_6Fl{WSf^l>_io}AIIdFaSLu9OjSHo|pfsGFDYBgEm6sODJZd+!b>HC&QFVd!JiEO%9cJ0Te?NtytgE{_V;qsdj{_sH zGPp=`Z)*tT8o`RVfSCMfV?@1;vO^JTlzcHyz_$SzjpHB7%h#yg8Xg%TE}sa~C1PHj zHxx_FB2Wo&V93_aFww3!lXin?*CmSyRTJSVi@z@POLZ7_E-&D0etUOl^be;rtLJ}{ zSFKB8(fyUTC62S|(6MY{UhG%0M4xTg|H?;}Hpof7Z9VOI)|%r(qc$$){LBS6|KH!S zo@O4v{KA^_L_YNT2U|aXP!1MgI==mX%5cQs=<4EsUsG2&ZUT(zc6IPv5Uu^XL;O-Z zaSIBH3>cjd^vy@ej~Rov&}nowT~Zx5!5^REx~q$cC9kf|R~?WI@7}$ii=IRG^R5~Q zGY%{IdBdx(RCbV!^~zd+i_r8iI+bLjrB+Xfx64dnK#K!@H!M8Z9$)pyuFs7_*Rp(S zA1GpOZf;6m_PAwjvhf+>GNK^Sk3VA^cB`;jbimSh6};^@oAb-cr#ZWI9xa5dTN
=*V5Wna^QGW;OQzTD`O@B5v`k~Sr=T*bVcM@XQVNd0;u<& z6(}N0C#F@bBTNji`Uq|GhP7*pG}SlR^|HmjeVdf}KCVO$2Fv#MBtB{1U3gkbahSl? z;O2&OZ7V>|*=C3-Rn$;bEo_c?_pTIuNSJy$d|my9-x^D>0_ohjbyyecRVRz??Kkud zKz;)Tq57?iCUn%o-`Nk3lpckF|1ho$$iFIr#S;iK6Ks9Hfv{u%@IxE{f9L}MP%XuX z75V!0S6l)~8`J=Vw3$Z`W*L5CH`ONW4IwFF?t~FqwqiqGG}k_(73n!^qFJs)o1WRr=N^J!(i={mv?N} z?aPvATX?r@p(CY~jNIT(=-?;uolZ?n1vONi8NUK#s?yI!7ZVC zmX1~n3VHYDjT2h4gufS&&V^&33;ZVAQLOyp6A|$yXu>v+M@;Sl$Ueffq47a|=hK=T z`&-G=5S!wWu6_$l>zdVN-!n~OpPRKpy}ef>nkC7xlM@9N=4zg6CMKG7K$C*191%#3 zSF{SAdEsj)`bbIAHciol$_pYm;~<>x9$w}bkwA*iVPw|F#|N>m`g`o@Ya9NXJILeO z;z))GJ~sd^1qM{3`HD}UT(Noeyw2$ndsa4#@e;Djh!y8uLy`c% zA0&cnewdw_q5<*oXd&K$pFeLmP9QZb@6)GGy&))+IAN2#c2dORmuKCGL#UDq#y%w- zgcl%}EGWc;(+-)4u~P9qvb%*OX&O2@D@jo5ReS<4GZ*)UupWiR?&Ldt69@v9k_PXC z`u4R@N?a13($Lakf$Gq<11PM;ZC4549rfaTTQUa;ZI@+*BYNcH zrIRNaVz3CW&9oObx&j;uFCrr!oP&^T88qO613@yIMuvwqY@kJo-Qs=Wj^^ntB;=eN z_xmZHTiiel8qJ`~sEjr#!);7bPOXNuhASwXvYRqXq)~?|Wj3v3q$A_5O_2(}4>4e1 z$&W7{xgX@FYh8xWKHQ1>f(?(chO)F(1qisMB_d=62YM_#)Se_#xhyMmc=*}{M(MTwoQah3fMA4XAYqruzJPDF^jsK#p^T3r~pGfo= zm!NNn%0Z{nsxS-aL?0@C<4{K|JWPD?BA*Jz{s@eFU+dAd6_^Tt#rHkLFd34C@KXa4 zl{$`YpxewI*?7*da__%}^9`5G6AxcRMO_f!&`W^skr3xwMuIZdnu%a`1}0!PCjVN+0V@=t zY2!1vl(%uihV6q=LYhg=%)ICnw}0G3>B5*$juqpb3oL0w8r9ENiKhBK%a$!e zl%MP1)bFMbe_cQhWzRrq{0%>0V2y_0B)+bz16RKzL?jUorkK8=zhc>0fdY8Qb`lUW zNFImr%mMn5prukkLlA$;TE7jOKla>N&fk5>`!EsRs&j1KY;nu%u!zWNB9MG@2uiX- zdK%suG0;g9=f^)Y2F)ScQB1KDdRaDk=*fi^CC4e6Evt3NDR~eaTdJ?SF)oW>|ps*qYTyO!nU9pFd zC8W+T7={_L08#YE&claw9N2qa^B>XPw07}|&#qQ`hTtI!2W z&!OXj&e%Cst#~pB;K-hq<{p4Av0O{`Z$nYOb(@C__gES)wA~EOf_-<8pHzq@dAmka z3ZjE-T+cK)++HBTNRo<~?!@^P9mnHSUVaK;xevoruq5Q*zJ?UMYD*onzrp8}m3cG9 zN#@U^9QgJ-6t4tHpe^3VgHPT2*6>w!yx2+`L=*IU`54WNv5G_;dx4y0_#uo#me@7= zA%fPfnV>2vuH-&=^O2;|>C-(SUTsuhl~@fXQc0YS3`5thT~qiu2RR^9miL>uI2Zia zWaJhmdl#B)#A&A#5x?T_q|prk18Y(R2a6|k?)Nuk#x;ff-1=|JOkcYqOOnl7z?|yt zwIp@fub0A2vAc8z;{DWVS5|Mg-I_&jO?R5fW%!|OP-jT3C#STAf7*BbXM?k&uP0JC zjxtBQ1msvN5YDAhA$>HPhc0WC^ZqM}hhIuv{h-l(&wIb4akLkk^BCHI!8J9jz52qB zWnVhhbT5H1F4|aa+Zc!aM!Q#1GOTH?G}(gq!H>)5-K&>0tov3IBuh)+G5D2G{r8}W zh~pZnEZ$H-d;r#F;9Q=HgpTtbr1*PEA+cD7K1Y{yFF-0DPO(wK!CUh_ojULi-vF>! zltMvXISDBUU+6^tjC3Og3I#udnEwP`9Ynj+GcYWnI6*%N7+)n}H!m-RLV;%J5!V5w z$7Hetrn6lg zjuOzwa|Gl45(wlel-sl8!p$9sBiwK_xQS;s8v1ZDGyXlwajV^i1D?dm$mwt2_9Qkz zArtv10~+H8WCi(DEoNmLC;0mjv-|~*|D$olDy)yi>4NDYO9~-@(sxvlV@-nb zmH`1KSqd(lYqOR_Pyw8#efHuy;59#%nLKVu_OdF+G*BprslXkIcl;!g0~jvZdGm@( z!jc!J51DOZcR{vR+5p%!8eYYLH-JE@z#cSF(s!`XOLV^K;iE@uzaO+3usDzI?AUJq z>0w+jL^0lz+=P@x2`MR-q^4}|4+GEb^IBR0)dxmLR{%liQIuu9>G8B_3KOWVmkTR!<`Ykal08mvTlkmQ z+rhj{Mn^sGuE(~tZom?Tk@mnLC2i1a*?uixVAnxSK}w>F>H)aMaF*<^?d$6!D-SB7 zapDIAR_l_DuPEKszlkdk?1-?z1SG#35Mpw50^5)F)R9&1WHiu>!ohCW-`A-~GO7v- z3M9se5e}W0f;GM(iJ%y(VG?g28y&r;7WO-j zJ+K2VB~AyRFm}J(Ak9-r@pf}V*H1E~mFzK{!G`6?9*TXr*l2G#%)ezz)lVjB5zcli zU01AALsol+dn7u}&9?{nlj#LPwVS}__7RnbF`dozAhdh8kr*l^PScMu!NASVpF0;gNCtY{b}$%cU)G9(d37Q<95mC_;_r>B zIFm(f6<2Z);};EiI;>1%g9=KVZ(SpOmb*JGgLM`l%` zQ;MVFa5_8=3;Q(x0YO_k28Xg)LHJ2te7pPUDHsSkM$4|E+xcfG7#w6GL&3|fXhcIq zE;n-5OBA6N*9Ldahh6njMe_ zLPjDu!R#_`ohI|o;m`w|o|X_hDCwZE`5O0r*T3@M~4sGwW-v$ zFq|hIftsJOWz!i4)SKvN{f7CUKZ86QM*y!@R?>UQ6uyOtaTx&BeL4{E8Eda*VOa_t zo9_)w*($24n)@ljv+~ESg|TsG#bd}IqD`VjfV@I!8S;=5J2`-W7|q}t;nYcc<0H3~ z6#%n%U36~lCMcu+ogLiWmq5QC$U#dm#sNZDrNw`3zh3MD6{XJ?BvTG#Sfh?y$GCK9 zDoLAPc>8a8n3ACPu5WBi ziezSCS(Cjx^Ci$y5+Afr5jR&=Qw>tu1l(Hn=Q+Qq*-;C@L*sn z4Zv1=O5RVTkZjh?u*6n@YXBkeUZKpbj3$q*Zmt7}4LENhEkd@`RwO}K4g;xigBeNC z5l!D($Z8~Q2w8(0IoMBtKLT_ON_Yf8EW*%r<^hU{ywLg(6$HZ-1^iG{4jl6Onwo)E z>`9?Pa=el@#R;g*0nMX^ikRDXfW`aQ~16JqTJ9iOPW>2#GC0 zC#Ra$16m+*>J9Kl4-H`HfG9k-)|nc?4<0a*uEwtIC&q%rh=_tnNAb8Qqv^94FEPQ8 zdCmxJfc*)Oj;!aQzT-e=Tx@^8W^KTJv)}j>-Jlxac=aB$TcDyY?k`bnCR5+yBS$E> zM`0*(8`#+LV|-7&mcR*!OJ>j$c>uC)TDc(r9M^bzRT-0j+CC!^}VLcvJ?)E#dVvGa(u!)6L1_@UV>%zwIT`s66J2)YO?-|YLb zPe`bepX;*cro)_Iao*)1@2Yn7N`hQLVML2Rf!S{o2IPq8ruEQ(y8|O#yE*G3SE4Fkx@;Q34}8CKiA7F77tQ)EFEsBpKL2f7W?tj_1&fZf56&wQ%Q;S!Ul z44r!X1-4fvxq%)^Q9bQq=ycey=C{4*OnjAG5E^HqA(VDZU3S2tqc^0rDTL72O8eI# zUocY7o}f%zXH!ZxH5qMH#4Uc^T&nK*7tLE4+fnp~VXko^jCCXEg47n-L=5&?HK{^i z$^kvs&cH6okmD+XoxXh}&yb1|QOM^b zH^}I=Z0F_z&YJs_h%M58Hc2;cBB=17rC!f%Q|BUJle~$A zNtmsshA;2kh(1aB@x?J|&_jG!)1cgnyikxg_qW>vRCh%~B7GJ9Oh%RHj4*$!-@|IT z9>oFdQNjSf&M+np1DcItIF zpbKm6SB&c}XjS?z;GiL^K0zRA+Tbm?5O@V>S-=fgNJ+RS#umc{;4G`5$2DK$26S~5 z_S2Tl>lQ+EyqMaBV{N~p{WL_^1*lLfa6btS6*5bkZwixEAO}0N8)FnG_ zrDKH`S?rsSEFC{#=q49_Hhox(M;n4uis93t=|@%O0px^+Skaa2CExFf=HC=*MFMX3 zV;troS|_sb>U=1~mf0|TOy<$8)~Fw7RMymF2D>Q4efYNDeorL)leJom5Jb0jfYSV$ zIq>{Gf@K=TIyyQ?Y$!J6aF|U%2sGL4A#y$UzBs@TvILWe7|h18e9dKIhN7Xf^Lh$lx=pC0^^T_+1SF~T^F zwisfr0`niYeqkFw4YCXPKQ*>aa-4un=O6AJeH}>U^~tvY!xM>}Su!wi^u)qOB*H;i zN5{4f)AK*axHlyRS67J$;pM^vi80$fyt*lc?ss%xRIq}Y*%r%hd z(7vs;84o$4qSu#c1Cj)!2+5#DEgXCA$Fr8>7FM(-QpS*wF9ts&d$9D7S?f&w^ZNRF zf>>$Xp?6yK)fg8TFn@dRg&UjC?R=`(B>%7vLR94o7bam2zbrARXUj0t-yrYMCL+w0Yla|DPT7dIGuPvljF*D!8xX4cQQ)t>m zx4aVm5sK8m_4Zv+4cCZ;FZReOFdmN{nOZfEXmjM_9L0F!iXi9)ACT^q>6N`Xu-(%gX35!7#&jyDpq*D9;@M}D`MRQBEz^^rwdR3J(#BT zU!uE#r037?-x6bFNCfO!H3&T>5h@eGbF@9u8WX{2F1BmpVq#q=^0qcWt4ouT_R2J! z2mNVi59q4?Rx_K546AsG5X6 zr$g6^IZ*=biEmv8fzq)DGm&h7$BdVUTUx0dVLzgXiKZ@M=fv&S`T2{kb}c++sHPoh z#C%f;64!7!8^$^!2q-tPfb&@JjjJ(uy5QY?nc}u7YYC%dR04%?H~jorP{dboDqW^_>|a!GN)z`TKj66Rlt^Qk0ENn*Ded3NvIwM+8W z^6@v8V}iGhvm$r6qCdpgTgj+OhPd+yIS`mfiuAPd4k>{}+o*H$q)V5Se{itL-neXG zrnrM{A2aFFl)8-8wSg6k z_q%?cVNF9bS+Kjy{xGH15xF?)yud=83x)(lmr-$1&Rv@y4sddkWR{F^TK#d<&4KKO5NySD$rg00W{*O-^I9(b3@d*HjkZN+IoqU zy;Eb$v@Gk`N(OJLtE<${cv<7HwAR3B#$%9Anz}dteVsgeCiL)Kd_1HdrMkXMKBJuq zh?UApRloo9FfHNmzrE+onhSMRo1`^3?1#8okNuJN1#r6*0y}wcjFr`_Tz&ODL9>g9HhB zv%m(1=;yMA=R0=pT=PBt@NO^wE5QA){c#kt+E+xOYy)1C5II!)av5|Ao%4x6GB4GCNL~MfZT{6P9{O9N`+)y5rPmaGvPri!2B2vwD+VZ zBy4!|dC(7-T>p!+kE~8R0r5pl4$2iKdoFqg83zZb$P)Am8Q;8nXRNr-qT`S)K3{^U zO3q?eO(75_N!gXelnDZI-wqBF6>aV1q(wxI>Er$6uRv|f2km5Z@{GR|}z=MCjR-ZVf4lLxH_pOlnV zN*E9=63A9PYrYE6xMWohiCwEEx+w6A+$jKFElMsD=r8TS;AeINp||u9n-fbUe<&xe|ageaiyQ?y`RcvVZ#ZFk(M(Q)|Z|5Dibb@XWzH zW5}oj4pEm}F-=Ba7m}}Z`VN8lFoad7#j8XM%{+$U_Bg}?#zD`1zDlFH5rIeGgE*00 zyLR=|XJ%vs5dAFrY0DWyJdx||1{o=MM-rR6(1t;$J@I6AyYnAua5-Pu*bhNq#-nRL zw%_BCLCZn7mlh?3VAR@TIk^5)tYDe+POlGA?wnQy}p2Z_oMNp?J8 z6$i79Q^>Ydn^Ww^dg}8)fhSKxpvXvYNXWfStyc1e5oG|Bw2IYWqzP4@8!FMBL>bVD^-sjVAK!cME>PUd<2M6G(;*4AexHy~|u&6m8benLuc4?RUG&gbB{9S@Ld0q*3e#a|N09U0Hd{~Q~M35FMq z82+M#`LG3jYs{2z#CZY98>pZECtU`bFepB)rFi~=8YU3l&;SbJBtW`FWf;i?LmF{! zeLGeW+2V!?hQS43GTB`Asm%!8*VWImP{fn42Pp}O$r*WopW;=WG=}98f6%6qSRHJ3 zO$-d9=UdCN$$ixs?faz&3T$cpv5J|&`wMXR2plICc5++SWRJwZ-_VXJ#FnmFkZg;1 z`3rM)El`G<{V4tVOWpCpUmkzK`ig6h0X_O&KK^c8cQ=4`kIl>dc2rhXVq9ftBL*O7 z$zV7B;F!Z3O6AW-=!|GzlH;G-X!?2=T{xJ-Hnt<2330pMhDoD`6JboXbif4e;?+844Z(T#u5C5^{px31F2EAw+k&Jq<|DKzm>IjCUf$z2bSx{&7XXNJUqR-$( zn>ha-74Ams)fq7ec8Fo@7gMGwmQ{2z6 zI|M%z!_EjZ@jF~>lD9sZdErB=xZ3X!93Xb~+&RO&PrWUCpY;y~S(9dyw222|uAaeQ zK|gU@M@y@Gt|dsSCi}uD10Ibxaa=1HeUGF^M#|JMS|Zr(#!qW|RV}TZZ_X4fv=zC+ z9=X_riJkaZ<#xC^K_KN4Z!M>ky?uhX+H-p8lz-qsu|m#!XN*_J12nv{GBoF~2G`Cr z{{ttEvSvvGr;Pc(xFqi=D`z`2zyJG>f}~A06`y!XM>QE79m{W3wp&AA`}|*=(q41A z*@sRn%T7S+glv4p4AawX(yU{+C1Dw;LcMl{bm&{;4NFTWfQNfafexT*<;5UYg~U4b zO9%=w0wJ-p!DonLa@8USjRLm~1hpt~5U_j@Hcd2*SRT*z%6{;LYaWPZ3I*$TSb(+A ztkJ75MyGrm=z~Sgh4hV{Xe6PT7A*x}b^xT<)G(AW`ZeLwmERCn2kX!D@KQQD#ZgW6 z%nRl!w=(dH?*YF{PnLZ)fUUom!6Rdl-ICWTW!w<|Xemz;a1p2^MNjuu#v-qew1QJ6 zR|^UX^ag8Q&^{l5@Co}nR#7}{j=eDliXW~L-8%YGn5+X14@b8PE^4yo#Oghz(5~!@ zK4@xdYnz90XGgj09waxoWInq9E_=g1qesy0GFizz-o(bv69Va1fyuj^#%t~H2NTbq zSy~K$Xc%}gski+;Dnv|-5CrU5Le(ai&u>s1aUk*?HpqB!w-~*jp#ty_(nxTc)>)L- zlU>ohGT+hOB!Ii!4zo&w=f-`EL`d(;m5nE*VAs3sg15eMTSdV;Ai_7NY#!R|0zBIq zo%(`4a(dVjJPGDwUp`>8RFs6n#(zm>27o<%^O_|Tl6;0)t=E*Dc;^oNs8mZ3gKBw$dw+VQAA$)-p5Ucu%J#fv$oR6cSjy64fuK57IQsk;IAUN^CqOlWa6CFs) zz#Ay=2?oV1B;-40akmCqC12N#C?%x5B#m**ZrHMp{GGdms(97VTu2rG4YD@Y5P4)B z0x!79YET?Ym6@2A5mxuQ?7i;9WqiVRfQejq3=hxNCX+$E&FI! z$ZW;4Nt@mq4wpr|7-O{L-PpJ)kpB8uAWJ?W-{7B(#|XzntU0youe9!z{&EkhP;~T# zSc@p7*2P4z?ET1Q3y6^TJ8(*yj;;Fl+g%c>9C&Dhc_hDq?4*=hS<*-#H}#8m7?Akk zgh5C9ecjGQp=x+q+Oz$hI9o7d1rHHZ5p+LspO;V&Sa?JCGSd4(do-Kuf-ec~<>Ej=#N443Rj6)gY&?GR z=FJ$J#>lKJPVmu<&i?qpfLH?G z8_)@$-O_4LhXt7o>FVcsp{{{duxb>`v2F}&CBaXRO=X^{@I2Rdw~{@V)jPhyM`bi} zfv8k5f;^JBp3{~^<6c48x!;GwZCq6oIe4|{%f5;ysdgiR#8JzZ04H{x>soD&H{wopm74)gf0su zwPFw_nO$1~dX&96%EdqznuVxf8cioe>+`J4ieL(RNpL62)4U7k=F# zXhX3Q)3Oz^qI|r~3L_gWykty6?q9SjMn=&0D<0kZxbMewMVJaY7GV|T$>yoj z4jS3Yk)H-u?4R(wBo#Oga#IM9$Ix zgHXR$J$f9R66yVVX=7Rfe2DpuyP*NC71qtxNI+Dxq4*+d4rGyK1|pnJYEg+3+CzGcW_RLjR zb;oB^)MKr9+O&2*OOR!yZdvSJP`&uqHruQeV)LuL&-kC(PnwnLQS+A@R_$kBMjgO4iZIvsP|HWoo+91XHbvTW6+2Jd^Zt)~G0Ixf%)jY=f1l3yYjrq-$ zqkU4hUUxFk2H%h_$N3zVa5`VDi@c{G*rR{|L_KU~_y-@t#tL$@-%~4Z*MTWL4+T2E zwic@_po75{y@#`ra=ZNtp}5iV@qGpv1`TSa$yV4IXlT#(mO=$Y4E(yGxEs)0Pd=mD z3~}@W2qz|6vAkmvZ7k?k@U3Qsxai1uuMURcn+Y^tCHLx$d+A}Cv9m!NWC=fx$5dh* zFfWo7ifH9(g0bEHKA7K&tuuu<9O;MPUu7mu_t?nMzu#8FaF#uTZGOwqkyU2yP>p2z zOg?yEQ8>Ir0g!d%p4|Dg;Kb^~Mc;)R1z})Ard)B`1LU)lxG7BiODH7u72U=TIkZ}{ z_fEZD>Qs_z2)|3VSvxKQ`F=l$q}F~PY4SdB6g(jL6K=R#kE5}&wZXNs#Lw+1#r@@q z6Gt}`aW{v4PZm~Mf!4raIyDS`P#2VQ240I9mIn~l*wXN?EhAf-VBduE2rU^IB2m#{hc<2y5ELxH7J+~+*npU^`CHW%w!KBqLeq!4 zck!xEaNYQ^0Aopkao8P3h{8cmEN!%g_0ScG<)Wn|+w1PauTIhf-54fGRuE#X9~(G4 z`-P6=OyHY{CdVWTO1M1LGlvKIh!H3 z8(6ptN|!;KA<5Sdtr&Cq71+3r$G=h7j<3ZEo2WhxZAbAV2SzCg=18Jr$OL6Tu z#zug`9m9tOT1cY~YwQZqGV+Rv`AMc@R69nMfHH?zHMlSz8TxdQ_447$+q)p-i5)`W z(uYM*eEFuA5fNQbxIMsqh+r2+lPm%WVtfrel7RY2c4QSmHb*oru>=hzKpBYZz*<7l zPoh*3LspDAnnaSI8ySaP1^GC3zG4YiANSCrH4~jnr4?Ec()&z)y8GAn935p6BX~YM zPXRrc6Y>{1DZ+b~-A_jkkMnJrUTwrl;6GaR7;NVTjxI2he$xv}J($S;26bIK2K2+) z_1OAGw$>7;Gvo*xRh>!`Tjn&_g~bW$fe)pgAHgMI1gBz}N_F4SmC{$qAMN-hBzq+cC z0tplpJM<%dg6IK&{}OP<$5Rl3B|@GnYin0r69Fh$!+DGkb3PQEOMxy0MPf5BS!4d> z15s$BRUKKo$Ejqf5Ho{#n-d+|3z(3Ir&6j<2^JX8;zHfq_z8R#a_|=JC)^gWp)MkQ z+G&dl8XklPYt})MU5F4i>buf)bo|HReF6uOI+sJ`Ujp_S7>$#A7%&WCzj=$#0KOxD zKEZ=?qf5l%OLJ}ZggQPCP_4N5)*!)|OAFf>r2DOcMF{6$hO z(m25K65jMGN%J9wOqrKH4Z3*H^Uw$OW}`EO;+s&vXHh`IA@(H(^y|6sCd0*73NugN zbvXrvl!`PZR+=;opB!YXOTrt%aO9+xb>LuX7qoBu3uNYl;yl;Eo2J2|m~}D~XH3h` zw7Q^Xh0L?8Tv?32Bw!F(f9^YYB7_?Za?xC%6V|U=r&-z5sG_UuMJzuScb)?Z0d@E=O&tO*GFV0lV`l@F zz9t_Vk39nsXi0IgRsScLOn`G;Q#}eXuoLcq5Jw=XCohxpppDm$Wb03vlN90Ut$ZE2~uXsp0PS!L~gXo@KcL0mlukERZI@=EPp94uHi zY5!H8{HTa(Wf5NY9b~k=H7Ks^dzb3AVU2Q17;^J^S6T)iL5O&BO$~2(2Lkc{@GvKl zI*-@{L>gcYIGbROg+a*JqWUXpYhYXhK&!hMuP0tNM~moLT){4Ls0m`E2X1%e#RaX^ z&~r-9lf^~&N?TDWKw+{nv=^Z=dC&(^so6--V`N}p{*2hu%F0SAwFuuh&FG|vU+a!v za*SGpd7s661f3z`w_Myj?>N`w#@=1{tD&M|;5(84BbD?WXCPI8>W`)5;KMtn9Ei#R z6%1Cr;SnX7ISeCs>Z+S7>kbP2rv(T;cq<+j6n>vB)FSGDH?P#rlzwy!O3RzRm-mZ_ ziHY9bVi0Ui5&;sFLbKS@uExblN7dZ}A@7$qpQ3~KGYxc_ddahi*vKZG2J~jY+K7)g zqDu;c7qu;!;eu*#@XMwVh9>WsV^>;0z>BJKBO9!X$jbt5Hw0y=UcC6J*+h{CAxWfX zPk(zR>0BGT)-tU+^9)ukLANWP{h3qSpD4+-Xzc_q_fNkQu`w;{+pt1&#qv^S$A83U z8PJn4S^bO7us9T*H~=8`M}mKDoi5aPUM!2q4A3E__A70h)4rg#xmB`x`q)0qhwv#<-Md~%E-)wu>xXA z(zB@}&|4qTY0zx|Xu^m`f(U>^g-F4?idY^7Y(1k;+}zxp0B?9-RW${A69DhvC1M~$ zj%{h%3}me2&ClLWXQ1+Gr;bII{QNI) zW-|KvFRo=lvT*^Pj`B_d@I$a$ZxX&$9t=YZT4L~3_dOY3&h!*xY4gu^#+4>c4>_ZD-A1@2w^-OVAL-*d)s ziXG&Z0cty29b{rXcuD6z1Nq$?EZ&^elt$nlr)^K%gMk=2V7CHh+!?DvpG+{9bM*0iSqw#mlyToi?6?skqBpe#@E`c++-TY< zYE&x8KHKeodS3gVGASwN_eKCW8rim1a#>)GHzRtGtzsWw z-^$Q~2d-r$+MRmh3`C+bX#cM5o=qdgWG-nQn{nI6gCUq6KZ@^u`eSys2ma7UbGcjP zB?dxnh$4FTRj+ZPMgoS@@K2k69SphEVTTNdhe771w-K(5Z3NL?o{t)kp+XX4-3%4* zz-F8tzucN-vr9```{{>LN3vSw0^Eo46&C1*uUJ@k&pAS62BD&lpH=peu+?FXKX)K) ziT`;rco>Ab>DHK-r*nllOfe(xwCEGGCHaIGJ&8$OCn_6iiYU!C|24#fY?ok@M?x$A@P zp9$=;<7}FJkDIFWX(y>APdhLFY@cx429e0)tvh;u$vxS+RelXTM%}n3D^AVUh5c0v zsOoq7b^OUzh>-X=xw!6s{?l~#k3Tp{&!BinR$ynLe{GM3;3S-wMc0?I;vMmIP6T)U zjs#=Q+#)_X0Xe3AdYkWu8`}cf%{kz8yia5c5D&LxTXW4cpDljDHsp zv$oMM{{4Gxpv%0bl6`lva{UX?SZ4pTO#i37_i*R>4cmaVRg|bGTQV|=>{-$vWQEMk zL?S-q|5p@A>&X?{mEW!+Sg(9pz~Fe!utUzVGY2&g;C+ ziy1~j7ttBjW=nX$VPQl#SEKJB4SNG+wnk%zkDmPa_b&WJyDdk@;oXGz!=axoWyJH{TQdnz&FEHcgoHs@+NiYP0Nq4KCh;bf$ z?Nw`@+kMf^&8>d5c=@O0-r2C=yU@Jxxe*@WeDIc0*7x`Kk4L#Oc^zbA1@GB`YkX@E#db`X=DSPVnN&BncrnWJ9(P*%yYF_!``;a6;EDw zdGH`~i;8eh|7-RI;snvYljPTa3X@|cXn|X_V zOWJbt``39A4#~(yAB!@7cXRHF?BRYB?wyiCfoeP-66ObH71(!BXS2uqRP?`mHh#Eb zk1UJ)QH?tkD(`6|C=W$H`upKBW*V^5KEBKnPr`nJ!?^#lES0H52lcWEQ@j?R6YFt& z>>b+a4j=svU59Z0`K2Kf>Y+~p$BY?#o&`PWpk|4(Dc*s$HNn3D4-Uj_hs!P2IB9-SJ2Ib8d z(5vu6i;v*No4qEv6!Nhb(aT64qSmLVgV4GZOHDecH6ULNL>q0Im9X1CyC_sZ_l`L> zU!;b8#x?sw42u|iw4axR#5_lvNSmPZQo&{>M%?tH7=7*SbI7!j=8~WTDc%aQR*b^6 zg>Hr8%{trH>zaCSXQ#8LMHjebM*byxaY4A9jdSR9Z25ryn0(7EAq*s^isF-hA05?N<>IzMy8(+@<`R z5Ykkj=C-Gm3sP29eU#}s!o{AdE<41&S3|h@@CtN=Lq6;=&%}FiDSG20-qLmc=PCsS z?jCqyav-G?%V-KGMemE~OzD>U@Yqx!7h$#P5>LrOZ9WW?5R+xVeUKB^eUyi%XoW1MC84hbpI68Hf=ZP_&ot9C^vQ z*W>S3#t$YnK{l}m`Aho(p$Z*@&*$@kUX=8XwoNi#EdZTJ_*^~Xq|rFxRfa!)3JnDR zpnK~3_Z5HxudS^Gk4d0;5l&8oU+AG+PA;ymeVfa|G-OY`7Vj7K5~w4~@axlO-P{Hx zbftKQ!9lUTR@L;5J)Qt67kftWiWNH!N>CiGCt@h-gVjKuz#&5c;?^B{j=PekW@f6$ zg?k<@FE2m)&ojz(+S0&yPQ-I_KG35d0m7^z=OO%%=W})X^+*bZFe*B2KPY^Q58zq=!EGxyq@g* zrUhZt0O6_i*Bw@Q8Tq3TiNm4K2$NMrt3!QF@J0l#qF(riUDVvuL&v9w5%d|jr(bkP z|LuSL_A429l`M=WeZkvkF#(qvYiztHiQS+L+cHMMNqqrTcA~^X%vOZX2{~qhRW>eZ zc#fUE?YxQT@T6(X?=JvoY#_XJ5{KcG=~cQua{5rFC$16@i3dbG;H5H;BKAe@6uA08 zun`-Q(JV`)M4@OCD7hR?La{=0DO-K?lRByAH1K5TXDq6%QNQD>r!`Ceg<@ENOi<#p zE!f#rpj7%IWW8iDdX^L?Td4?_;h&9Op#Ms%;$#8v^S* zYU#CWRg_6-y{M?Eqr(Nw@uL>Er8EQoh)Y4N&ENqLEkgtx3iSxA{%(S|AsT0L{1hJvP}Efl!593Z6;2I zFDB5w9l?x^!LZVGQ{@68VTaRiYVz6;;}%WGOiqVB6{rc^F3HKh#N+4a1&&H2Zp#a< zXgWDR;f{!ymJIAk1>=*LaC(Vd`Mp*)c!{(aXxZ!sk&W&h8=H5kxN$4`q`+~-wsrK@ zgnHd`EDtOBlk~RZ97cEIi_=dM#n*mkKha3@kKlbh!b-%3+qK4X;kpJP{mn*MV7s1& zm*_x{Qoee(uS5?u&D7D8azW@_RcRrNSXhu@B-^4labH+nsIn-^C$am3YYwZqgQ85b z7NG+gh;duK0rixzyd&<3{ejgdyeI}A^sVVDOaRjL{riy{V(Y$A*mq?2x&=;&xZ=*ky$ECpjhdI<^W1w_Ga0k@XIV>JOq5GBQwd-rfO`O zcKAAA{nm=z>)f?#feX2<6VHF93n_o+oEyCSoQX zUlNr}nOQccNB8vd+g@W+{Y+twUMKQ{2dh8*h;E%w58z^!ZF}u{B8fILt2#j2Js}}s z??~9QGGq4Rkqx^``!d(*r#1oHYR3X49paDC(RqQIq3FwM?d!`-#O2DDg3boDmgpIy z;#aF1o8cZ~=D!^tC{%}|vI)TK!2QE!Ba4oL7p1(kWN*fmP{f3M{Gl5N1w6Y|^ zqXV3&RMwpuDc$(aII*&b)hMlab93HQl$$uLV-TcN(z@Zw#3B~`zkm1e)ESzaH_urp ztt<}sJt{rXOuYlZh9$!GFO$5Th2h0R|NVj3UE~#IL-Ps_e90jtB~sXw`0|~G!rJ&BZ)pshGxG9`-U1Ui&iTm z;2Bw^mytE-T(+Nk%&E09`(AaV0Y8KGwdEDsOeZO0e#TK_p0UnpBSqom!pdMP31i#p z2aRk)!qW87zwaCJFN$~Ju$W88PkeGf;QTLByIs50`ntjFD_Y>56Oj0$pKS|L>Ol|y z%5L8<`yp>4Ig+yR9_%9W`XB9A-%$kNKOq>Y?E?v0fy6vDf)_I^FjkMnPE1c`r0Dm@ zIzqG2?j3^d+vB#oBRxK=eb^}#Md zc$`V3LPr4}@+TcEG72V79X@>ct(D{G>sv-}K|p@JNH7T+8X9fbth=EvA%riKr-;@T zkF6Dt6GZOe0KNfNFfSn7Yh`zzJbbNQm)dM@J)P5mLc2?rZ%E)Pt zWAF*uTf5`0qj0_WOx_M$i}yP18X6jyO+&Ueo3_@Q5_jg4eDCe`hur&3PLAN6V<+Xx z{Z5x)j<(1Nj$X*HvQV)y^)JjaJuK7jFZ>Hl^lr*T0eYxlDr0|P@%k3QDdAH-YJues z6*5&xFABptQWC-_2tO!0X}3N@B%pi0LGZlubDl*&DIWl5@5I7?lW8YjVVVT>>Eb^@ zlRHe_Z?2C?552t1pt8xJQ-v70-nX@ZxFlZz7UhvN`lLx@R(vS7!;6C`4qhoB)Zep3 zi%J!JZ(wKv^}PF)|Fno`(6OrMGej!)7uon>Rh9dwNe&VwP)>~))vyl>o+;DfMm&0C z$<&{p2eA&|(|ko{m+>)7=`<2B5hRugG1*(QTN~0S6!PA7h75trvgYX;Jwes{$5hm$ zB_-|Z(7o^f(QK-7HvHvFPkefMRAbIh5F&7b7LpgOenli3MA;KqKS)*Szw9Zw2#_r# zPfZZ_5O|#7o4MEjV{uqiLp%GAvBZn~b(LD5xaL8Odp=TD?oGm4?yU_rw27d2D(w@qU$jnco2vD0(j$!yNKjZAj~*Bo#^XE)8bc10I`W9`UaxkQ|kv+IeANt*goXsQu?*>xmvKVT9wZw-daDzdydnm?oKn zFz0eK%{|-(=<_9aX&A8`K)Er$#ovw_>Lb2$%we{(^; z0ME$=DO6fAzh*7rM+xNmc7pgkpnOkxiP*dsiB=+<{N6O1vn0P{mBSPQc@eq; zC#Ai=GB={${&oVPn_xE|w;YPLqLF9`sqVM2SidUZ1ToPw7>)#RW}+vq`Nxk}i6_i0 z9smtK!L@w56n1RvbPv~m-;!1%ryKDAZ*-mEk^7$n#>%J}+})H6f$YZ$*{%9k8y(em z=#t1}cKFQ#lF1h!71vo}KKu~I1cQiAhd>E^D*<(C{F5E*mjsYw@W*RPjsV95nVHKh&0Ez;1a6FHVuLu925F(OV^=bzTS#blTG_|P0k4%)z$Du z47KEfVv)y7T6bT7XfFtg_+du~GAjVuEOG{sUqpX5eq_#XQ-4CyxkjryfD$2& zQvYn@)RGY_sFLsA73!uob5jbdJCZfkrqx{VzS6?PgmrX%_ntkWRwfRGlB0H@aa9Uq z6T8~%r`ie1i<*G|z`TBL>nP_zVfOUnPKX&g20JJ^;VTQoV zg3(Q5`wP4Qcq;4~|GAdLF>ljI6CAbkJZpatWnVk8zpf>3d%b*=>WeW?PqR#o;YNvd&JEk@xD;AuX6lpvE6|JBglcAVJjZ_+sM@rs|iZN;0xwN zT+@yTVx8Z8P1bIo=&_DFzo?(FF+RR5c5;0otQ5N1Nf1fKl&JK(=h7hX}-Ycl&Dq?L7ngYM$ucUDe_w^{4`_))qs3UwCmy9J82G@6@J@qTry<*Y4 z$#-+Kr>RGGpO#atKf8~X;1c|9_3hr&A5wJuSXpqodS+!l*>9<^YEfKm-KaO$v)V?Y z)JG{L@{?uIrG#Ueq9^5i^K+H@$1DXRY*PH}8U2Oz`irGw7H@-&)$m-cyicYuD)_>@ zJoXZmclZNY@-WlRh&Z(jfQ`5!v>IQ>qs`+;}H-I6#d zb_2Nt0Y2oKJl;)COdNt5$D!>>%C=`VBh2i;AtY1jBs#J-4e65Vc$OfNp>PUe6-Cs{-&dg+O?|=rh(P z5P0p%6yB$BuU+t@V7a+~FI@igZ|wh^l5)An`YZXnv4Upv!=-Dzvmy73Gc&IdgxR|> zJkp)A zd&1X>My&v<5zybfCreT3sIzBT+UGqhirbFxBmj71^@Wh+Jg>-A4aqCbJ2E0U53+m;q zBaVN-2*|e+F|G@8y6&qZ%(KxpRmW61!Uzinn=iYlcNUxFcH5w#@3Jl<#FT@mgnory z>ao7G!*3caAhk_z1EiuwFb~4ul;>Iu@oMx$hDZERt>g>*UlQ%h3F!IoBh~1C2sT;S zcSKG}{CJ6T{(t}M{}$x`_d7)3_PV@Ld9_g9Ma?|l>GrURA%Z}(|&%5KD=5Up}PXw^jYyP69+dyf$Y$ksn@+yXQ_JMNa!>VqB_6m4~_zwCnK2W8gI97}4HLsc|2!~QH(45@cD z)eJ7V%%kUh8wqdza8P()lX)zmZimIjn~aPD=-I5{Fl$>M+-p(}YzK}(?o{&xvWuI< zdzhNK0OJQZqrYkP%Di<%CN4Xh3LV$TNOq&oiossG`;O3^u8+IGX~6dcRh!zp+VRCz zV)&F6_fa&1FiA?f>BdquK)hnT{?`T?C@9(mEN(c={vt>4BTU-R%Px2N>PJ%M{*|>* zlJeOVuFPE}>{}qk0N#N4Q2m~BlEBZ}KKD{a@G4-5`9@}K^FP3}43Rqy?NNg^Nz2D< zD@`yS_}dyo;2x~=Wn>g>mU?PxR6o1B`Oqf~u4ZSkFhBnza9S`4qlY%bFU|FU_lZQA z3qhuU1vLrMTs+8D4MEf;RD?S%2 zBYZi})zsBpxO{mJUU1#rqn>)PhSlqwqoXi3sfv~s&GM!8-d=K)f6(DLa_Kcx8O_Zq zFc`Q%`li4mN{OBBfVYJ++{l_+S{_wZRfX429zBfa}wQ?o6Tk2-8b_X zKC;!$&7HyCyUG7rhM}Me*m~DW5NjoUQEpDo0II-@nm0_bA>=YYDF=@`=4x?|&&(+0 z(d~ZBJg%z_-5DPUAqWBbp=?EdbP0f{^KP$|a707|2?-dEciUW0??Bc0dtYB*Mg}i@ zup~=PFK%UbPop^V6!`B$tsi`8U^7CNo}Nyu(%j5_*qc9DQk zhv&RB>$#p%59yyjfA(98oN=7#dDfv6Sp66^yAM30GNi~0!xfUBjrf_Eo0Fnv_uv{a z0pX)*UHLCzc3+C^pr6j)yLTEU^MnZ5Tp;3YXohELCZr`0nSumoPjp3ci%u@nZ;MTx z3)oKNc`!u0E4b-vGVkmdrS%xiKpU=g6yQc4e*k=g)m4=W~`I zqQq*O-@SVgv9{4D6XMFt}p7 z;#Gg;)h4jv<=||kcFO6FmDSU}*~@5XY8x_ja-zXPe(0XY*2HZhUnUBbOkQa)tDH@4 zL~Z&B3!J2(NmV^!S84_MKYvbqKA}j()fuzwV^EXu#f~`?(qs92@)cgCqk!EiZHtmETvDe0aX=XN9eeHj`m zIHHq#QcmX5rKhSd!2yJ9?cNOLDjzn!oYKm<^-23~r^f(BxhKHXY+P`)NE+=c$`lwk zi2mAL#rlDSfZHtl%YS8svI)DVuHIKxU=d15{1-4gL^(;vpB*!8&ueQ(EaXyb$F1|9 z{(%-Bund@us`f&OW~!v|-wk(Q;KOi{yk48Eafldik=^xvJ-yi+jV7m+CnGpAU+%1{xe6r$OowDZ(}#b$6b3l#@gad6YV1&Rg+ zj5tu(L65Co@S~&wZVvxB5fq^$35;$*t{#Dy1gY(Qd3NctZzuoL zi3Jl9xp*n2Z`H~Io~52mV`^^wG;2CLKX%=zZ4g)8U$|ao3z71NSmIj4vJ-Qcpkf&P zkq5rIK2};f`K~G68U`nPm~=q#)y7{EVu=F}xc4%{!2dDEKs_N(M77_S7!ZIOGT)vi z#3+OWzA!~L$E3hy>|B)k0ty<&$2nl#L1Q0@BTEn_hJB#OzCZyHQaV!BJz*E0lClRK zl+4v-_(&}J!quZ|@YR5ZLIYASLUgfyH@EwOyGLfne)v&(fAu7KJ)+WVM+|U>0D)k2 zhb)?3lR;9HeDrTXz=4xaXrvjPhdJNL)^IsB_QvA|7s*v-O zlW2W3k^4S|qTteQdf~Ft2Ua4{jW3LA?+BfMc|QnS3_;lUjt;d#umngYnL$aiZ_p*S zqR1p4LCCNV9EdM1Wd!y61w<*dV4;4w5m&kqQ7--#a^PQemBPC|N9qX;$WBR)8fuf( z^Pq)x!gck)gEybM?)-&%G)4G42vl!!iyyYml3jaRRZqN@X!2+MfEyVeP1 z1B1*@H!HJeQSHG41o`5d>7St)qKi(6i2QkGy{Z@ zfHK%&9siLKZ2c>*IrG~yZM9ytSJrtG5izLhq*eq!2^`v z5#sWE&ML>8omG2~*OuHo&b;?tvHoeg1A9P8SM1TlWN^ZS4&qW)r;tM4NxOm%2MLX{ z$k6k%ETgB1c_i4Fe_S^5v>&m7b$r-v;qNS=_vwdV{)nKi-!W?=X=Dy0A}WOpyrnqd zNtCS8(u_o1VJ|m~xgMcQk3f}o@7~3y*Wg)^)ycCqtXT1)5W(Oj>?;uVSx)nVAI1{< zW~;G_n7pv-#R%a2he-(XLjrlj8d(GeLZH^!+(6 zHqJ261IPvHqg^?ZwUW+NzlKI$=ZTApBZ&V8=Ds8VvA_!N`^vLql>aR1VAcCfB*q}E zodus8&YkABZ+q%z9^B_H$#BqBiV^A1SEZPQA3qgBICckyr~|A3`|p3(eDKbjmxa+J z>;)U}R}vo|L~YeDOG{Z@J@Ggh5TXtFIO9QtM6^6JLHJ`HL>v|fAdq`u7M*^+A#?;x z80Iy8mKcnPk4e-Yhdr6J>ngE6fab}Hkw@p(YK1>p3rmSQq4Rie`?=bK-ssp-v$9RN zlK!O3$L)l)b*5Gpi%}OXEp5VQBjlT?QJ53A!ciGg)1ovWQ&>cQ-ORu(IzBO>lB}Qk z{(aO(!LPU(5%=&>w~-J6AtTEU?2t43{PB0FGm;Ww94gX3O#}U6b0$U-${qU z&>>jgN(_sCGyY864rgd6V@5;{0fC_KKKlCRT_IZBO)sDV*1UKlQGe&c?~Xj9)c~yUbuiOBO^m8wc-v?EMN!>q{;&f0K%9E*bQ+vNi&zGF&~5) z>!s}$^p3j{d#2Y=hC+*k%QySvtgJ)WceQ*x*Epbf@V!KOFvX~9!-Cf*FwB36c)A9`FMs2wnqOFT3x9zl9$8Fa$`5|vs~V7o;n(afc$ z_89jo5?o@mCp>83+omanxmC&&wYtdF4u{tq9OVt$kFyheTx2_YyA)+&D?fK!-%`s3VkWpfblN`CE7UZu*)9?w7HV!%^R&m zy?h=PF!cCdNbn7-U7&_c02_kc1W8)>ciU>D3!KKis7~W#Z40YQs%L?I%k|IlGMoLV zW)~FDkVQkdb>j2;8nyf#13C;Nyu3r?3@GyQzv6@?SC8>^Hox_L<}$HJ2MPp3h(*Ain!QMa<{4_^yWNa?%o zt8@y-968ILVxiCN%A}rHC({qEckiYzlyNvN;;10GIO9cu^d^?_@efl(4dk1kpODZ) z35_rCI@t6uT2^Kl9nN{B%d7dVlX7*N%*;QIVAj1v2L6;qx@-r#_I=QU-<>4jga<*M z!cWAp^4)^iY0e%JU({~yCq7BJR1d&*xS1unt{7IMTH@<1mfl~(HcIonyUxB^|4w~- zkQs_+EJ92SF%c`P97{)@62&DiP3#SQ5jl+Ti-2-J_1V^ zj>wOARS%uVgs3*Alekdd7TQ2Ccg55Ss9$w#H%%ZU0Hz)oJz+{(=CmUQ0SNUqt@Ixs zLP-|xomx3SAyalo$Qb$o)QIJ01EE6At7Gy~e$;2)W93*O|HM4F)juF$kZ6lo)i=KN z#6g6v)&@0flxO5eij$L*-;O|fh;EY@%HW*lRG%*=6!So6VQM%vI7m<@wTdb;AIBC~ zL9!8%AIS%fg+l5?B5Yg;2P!;k{LJl6um35Ep+y2hLd0E^n79+Dn4peP%ehc6{7v{V zu>pJ4;cxRF*+{kMQY^0-i(*#NlA4C5rZ>p6xMPf8d*5%rr91 zbbFb2tZlf%f?jfR-je@yc_SOowR6D$9F)3&}Pq zhmjT5ZhX0UrlS2HF{P+oz7$W)o4k=Y3mW&J>4En6MQ!K*TR*_Z`yZ46TfF?4<5JX&28JpZk0?JM(Ae- z{yigjV>psv9O3^s;83VyU=T?n~mbi&Oq!P}}N>8!nNv$#2XOaF)eXX~< zJFWf^d#=OwErvC=Sz#zt-y49~zF_t^SZ4*zU$zP49WBQKz_vUJymIzyO)ULY%dEax zO$M(V?Ys5Dne$5DTRS>ZK2hLK$6goyP4+hHMIC*5vUXZ~Je(7eL44`&XCjnhIOs%Y z48l8(Cxy(p%noCCW!or*fY%v}(Zb)I$mnk#u{DGvX)PZ}xhz=5nyM_oweLf9T2Y{} zp3=ErTQAK%lMma8%}=DnR!K_Lf^C~xs_OM))|H~-OAU1WU1v;P%@B+m7h7uozTFV) zO#V!Hx!@y9x-GZcAHLO)u>wc(vW`>9#Np{88zSl^fCWc+w0D9PAW|%p&~G0Lt#SEcRC{rGcBk^{z#mp@&{Va<+ z&LL2sRSwxRb7`!EnPy2xP5KhPeK?=-rSDSrMd&*7@8A0FrIPicn%n!t$^jT}8fHo! z_h++6dfavAKw(U#t28Gs?SKU{lTPNJvZDKRrE-6b;*^_HlrOknKBi(y*{84h{}wwws7vga^lC z-YOz3btdV?#=>n$Sd+Cgfn4Vh^u`AuWCRwsk%B$m-BZUCh=-1yu(w;0QY7nIVL<`m zD}b6*Wt(0Kv=fMYiX!OYRBg9s@uU*|K}@H|lHk&0uFI3Vse?csPm&&_^%+7 znDCzNSTlD7RTr4}7AbO5m3+H;Jc_}XzA)Y zwpbzM*;bIZkC|xoN4`Z2>;S*U9O_6E5+){a=ZS)sCYVIY5{CB@hN02ExB-;KQdc? z1?9>~5fY_8Vx(jYkr5G(P6Z7!-NI!-jDh`rt7hdnZWC8HV4a^uBQN)8#!nei0byZO zDG_FH?(hW$J3bExfT4zQPj<%c&)T~k#?X9n4%HXvG0?s7A~Mns%acg&7sP6awL3J% z5{IbS(Te0VlJZ$9()CG))6=uS2&6#h(ZX zfY-LD> zZh744syDk|5qGKN_C99B%H#Lbv+71vlW8%))JH5!?tN)9!Po&2n)&rzB)yJK1*8rw^Um`?cdfs|-$R3ZuhATm-%UUX1}6mrgjvjAQJ zRCtQo#e)1%zg?j2P$eYQj^qbzij^U5BtTm*?a+&Y6A&6HtgIQDuHLtP*XURsz0cPH zQXM{$C{m}Y-PF(lzTU(1!#7;3MpE6#S#qxE`K?QRS;+a2Juu6ueh-p`4zLr|ErQ&J zxls56?&n0YxwDg|?eQ0Im7D9U%qun4p}Y&0p2jo~TBX_xzOw9a;@SlCx#E}ELt8QJ z;Qib!jJ z-RUZU`6x@j|aph(G)y-{PyZL_Ma@x zIL$<%2wVpGqCLT5LT!rMF6qHdz41VE(#G>g%0#gcw+Q%ja21yg4F^IDzAipL+eq5& z`=hzp6V+xGcJ@7x(UW)IB}|3h?XQ}}XtBh0-29$ViCVWnM+&-t0u1Iwsd$nBkdMU#1te-H93zlDzZID1*o4=N|)(0M=$cn_N|n z5-RT6^TpeBdBgadHMzIzgpc@a0WR>nve7x;NiEX1X9cIf_rZGIqJ(TK9vTv{oyBY^ z6O)tW&|-dn06<4v;Pu7E&nN{2W9ldNpP!jLk(p@%cGqd%Xrzicun_Gr&pQQgeZ);h z6xME@A+!W2;nY5Mg=OQFIj7-oFJEN1**fMC-`!p(l$Dc1`4#mW441%WQzmCH)|)xc zut<4zj>AitK@3J1l=|KZq_8Pu0A@Rf^@fxZFo7tg!$&aG{yXIeN~Z1YPv9SjD-+N# z?gkr7(+E3Hq6CkKN}MC~5E{QrRF3S&u^^ag?0kZY-kUda!ycACh;3PL*d(?MI$BlO z170v5N0J)KWEAheVTIU;xCSYf?EU*^(bNC^U&z7*Rc>P%PY;ij)a4f^0{xC#VwCB` zmxP{Z0fL_LNJ&Xa07xMC{klN~)Q*Yj4A)y2h(z$W+OsYwG~hbHm0Srr?*pzh;5Xo6 zWDggk?hvIIDD&~)h~n>q2jZ~EgtKt6>;7+;U)f2bY}GaIBtcZ7+3S6hF7mhJ2@@&E zAWv||0NEXK#nH|E+?Q`MAl~lZ8#gk0)JnmS+lvA!kFUtEndK;vFh1UneyQgOG$6d< zP%Oa5+N*>-MKBLb#HbT8C1Ojeva?I822xo`Y^&r>HN)K;=yk%&(%vhY@996 zdp}xN`|CQ>%t$)-?N$o7Eb!9Ft68qKy*;U3;58Uj^&#}RqEtzU1W*>{)-Q6BcW|~X z?3K^u!%O4Ghbe|yKLu~>wBvtrdp@!l%%P5pd=`C%3fZhx@+J9IEytOf)c4%f%_%o_ zmS9NQk5PZeP-z48Likp`(0DIPxRRo21R4?!F0TEwq^PA35EdqD=deQn->>9OS`R<$ z8=5bhT6#(si#m3Gepl)q068Q1X@eSfZ$k z_Ok1*a>7X$OvH9SHk5fvj{D5iCm3B3FHDX8hj5313X#YF_8K88f7jQ6tOt|{@}Wm{ zBZRFf^hCr>2+|HMz;Uls;bvg3XCz9Bys`p>7|D8J_oNoKHBu)Pwxs>JeYjLW1HkK? z=5wXk_fCdAo;Y0yr@M2z$&um$g&Jq!rX$eh&g-7T`#6Cfn(@TFY{a60deO8<)F;3U zqXvc|kz@qTnV&>WRfi1)5n<5G{<%gAGLWmRUHR z!1{=8cq`}CKJMY=J?*!&=7`DdZGwEbD%pZLld}ZeOAT&R=%uut>^Z5)@IhKYU?&{f zp>{<_JK@n!sCVw&yNnVF=xZt$EivopA;uOsGEIO*Zn2KCOSI4YmIAFWV5l( z&00+o;C)vM^y3No!8qI?)P2ErpwHvORdt1vh+Qf=2iBmCz*JzOf7Br@&>^EPyU86L z7DzO!(dr&bsH{CJjR+?^>#Ae7ywsI0YP)c%EI3*B%f1NuP0~KLIDjKqyW|eAWVi?< zgkD>6A_Ygg!3iV~C{d_L>*!B@Lwbc7^?1?qYX(8ABO*Cam=!+|#ung1Ncb=o;(8aR z7VlPciGAP-3=6tUbHmA_)|U8OGV<)L zfQ8$;;+a0My-)16YD zS5qol{s}qAcwHGb-4WEDBTNVKAg%p)&MO9yW+R%;B*mkhOCQtIc`W8Q0)^Yn1=MUg zy{+rWPe#(YRu@JQou55ZidEuDM@0@5VJ;F^$2M4L>=YQlW=Rqh?O8aW=Ks@%fkqwO z=WK0U@gSXnAuv^hY?aQLG97(5a9toRD{Wc;lYCk&E4JmAAh0vBy@}a+mS#( zPNaL-(<+%d$TU%fzW$?952eK`T&7GAkf8e!SwxzW&?|_^a03%^EF`hN7pRAr9dB5n zfP$hm_H|sx)WG6uh~ci6W=8(i;Ee%6Rp7+w5L5&S8eyq`s=)=oK2Rb-OC_M!EOA znOL+#cZu$<*2clsm`tJ3J4Rgf7N*(tue8!owj6|?W7|!#wA#wcVdNR) zDiw=g(NwjB9`$=x6gsKuI6h{2{(@XXU?jA4bw9bsvQqjKaDA&ZQb9PIM8efQISwBU ztJ!)j?quYexiqz1@z>KaHfF{mzv~e3(3{43^-dz^(k%FzqMB-MY5Z?24tC*(IC`lxVcIw7x@V(xg~)Tt8D2*2Ri$X84#m%PAN=XK8Hw^{(kcz7CQw z@g?*#-gbBY6-^T!6Qdy&+p)P>0+n9l5vBq%D%q*t%iBF4TJ@ErQ=ir!2hHa4ckYe& zgmUI-PV08kz&u+B?``QW!;4W3>elYeTGuzBb*AZ=nU)~!&6JHbSRt3-ElRz6@1DUs zUlXp$UM>1+72dGc`T48^2M_kfGmqHbfK%p%(TjI#aQ5u|)SL4s8)s>xVy`uu ztK%~M+0`Yw;);*h-rW2KmXtiFPjk_b{UA3ov#pFWrDI^QqWPiloiIYC7O#e3b5CC} zvU6y{qIEWe)9vdYCgZ-Hb`d<~4 z)sHhWI(mG@!$g%4&tjkV*NEuocC_zd!po-*AL8KGC?I$!q`|CrHs=bft)Wg_lS;aV zy{+xwflsu27wvp2DlVSRV1beV6O%#23$6=$o;!!*z2H(zym-sRr_IfkQcEKv8Ekn= zmy`4NyCO0nLPs>7!1^Hz!Opg6U=lvOZvt=FWq$C|anxL689NQxB<9}8vjy|qd%TC&4;xd3<8aSeW8|e{2R_C|MUCV2 z!B}bJ>uTueL?)-C9Pz6hUR=ebI3C#4SQr|f#|7LJE8T$`9e>-jk^cGf=c~P1IyTFG zzowRc{E_%QGo#_?n9K6=8Gd$?ZobdnAd|j+Z><}&?~}(9h)(yp-ZWT=zSBsnHOrpq zBYz@8zIN@k%s#*%p1Z}V8fnBP17~RO>iYZXa|kAd1Y4(8*6dei^icn{bauXhpaR;r$Qsz11)mi;Z_xX-(^;w(EJw8=7~?9 z?1J;|IBcPCT&!&9P>WYXGn=^+?Kpjub=b3uFoI)1@~apKILi~80JT8 zuAcrhVPGvg}pJG5kjnog@ruErTv>5c&v2onmy3)=>o2@s!z%0 z$;D6q#J<`eF!WZ7TZo=l!Bj!citjzvvmp3MvUld6*fJxHmsm4w^^+SyHXRn`{Ap#$ z5i4zNAz0J4*46|-onrS5ZImknpZN1eJUdhAE_L_d;lS$NS)*zj?B(A|Pmwq#zf1mc z7K;r#0VPyV@y@Nzhhy?|(=Yo&ewBy)DlKBt@^8sCT>AiT`RUnNRP3)Je$6-!USW-& z>d52@mFJ9B0@SDj;GiKZxGP%kgi%qPG-RhJNb|k`);742;nV-@?Y+)@G;MF8S#?#{ z7zOFhKZSi8jnVaBji_UU_hjrFIHbvPc;9VTS6##!B9P0xc~N+g021&-!Q+`>-asQs zROIUOO9}rVsO{bKzxt1w;c9LPL+743=}$xnp1u3rL{-(|vSt6@tM; zC@2t_E$`jC)^+Cxd1AU%hh?H_>NsKe)Z5Nl+UH^Tg{}3HDgHiHT^_+o@Uao}4~VZD z=<6q9#b1CMMA6PIwIeO@rAfoKc(B?!0(H)VR$#N6BmL*^r~O}C1VN-}^e{P*Y2 zgxboz$db5Zmpc*+9r#zLb+f=ppk+c;;CMTBK+ksZZld%5c&+b;L2~?wvdDM;85r za1>{b*~-o2-w&*AwN}0z5fkZiqII+X_t1(4_=~&Au^Vr%f0VMQ*N2uMZrYaRl+w z0slJWPDvP_b{$)DW@&id$)ZG9VdQ$Yk-0dRR$ywsW#jVeS$`;ScWvK>p&hl7I(gaI ztqZflfs5BX{sph~VG3<@9B7Fa@O09aNnl4OVfpxdeZ2^g3Ag#+ywlZ{7MFU#rQcm= zkN91@o^~C-u5{L4T;MY_LP z0{^msC}&rF1pgY{ma#aXA-Fw?SNjO+s8me^FRl+6g|aEW!CSiA!m^$&9& zb4p7y5g3Vd0t~mN&|9*d+kItO#u^)dDJ*PlTMFW7{fW+?^o31XpLy(LB(?eq6UTvDO7qw$JgMC`xoSmK3;TqRZ)Z#8kb7;BuX7cy)1^gvKO+@TV zcb({%h=_MBGCwm17R}bNyHF+UG5{ zWrphOLBm)Ez0U6L;31LYbaX{+Kfa!0iUSm#o|*ZfAcB2aIb?G&K_#~n7ra`kx`oTh zA7Fkmodf2bbd8OTkwidhrfK`MrN^5v>-qJ|D*bu)zQAg=v-w6Y+y(+~OkEB~#&zM^ z#l9scBLf|qKDu-!*c!2U#)?AihG=XPo_LxvN8YY%V6MXL&KgV<%1jj2n)MBRGt<+O zxx2(78{X;irh&)6MH0Jld|ShudSoi+L0whkZm?BB(Ml&qvZt?4lPx&^k8@_GA?`-x zkysIfbj^{JZhq-o{l9AadVl~V7)o18)p*0EG=v0!!2!UqTFt7=yQnP4GCR6khNQ&A zT99&X_bj{Bnu-X&Vx5V z=oFmxoD`LmMBefeH#F_jdSB1m$Mx?OI;N_>6P^9NxC+{YR_X_$uVbA>!Xu`osHi9o zoU6wZm$ovrxPM46WDi;vex|Q(2IhHS*1Vhz{Df>p(XATch3oLX8`80iQm)_eiHV^; zr!~%uS@IPdHms?fHhFz2_sh)>GnNFPEG|yB7I8g!(ICTjnr>rkU0+UdW5$FZ*}I9J zvp8*d!`RQ|wFWCsYmxWJzqgitePR=FDgO18>I`rmTtR1K1G(S-4h&iw>JoK|Vck)!GBEsb7&&j#>`YZscePka^F_4rPdR-t+t%NG*=Z*n#7VUDHaKq)UzB;!m!J6W3*R|X;`a|M65EO2-;)Ls zzmahL-(M5U@PEtl|80l8%i(n-B-^IsWY4Q(Y0Ca@=luWt#BA<)$jR}k?d?8{h9Du4 NyQn0aA#?N5{{wHM9`yhK literal 138908 zcmeFZ1z1#HyEnWi=s(aPGW33^7B~Jp(XAF!D00;yC9)f=W zc?t;74{>(^08>-o7ytm&035;#P=E-G0%$|{{=^0lNdWeX4h4W{cL4r-oO9s)@B(xD zmFBlQ^ab>f7|_`lus<+7@-QlS6;L&I^A7O#ck}iUR+KvqsGc%5g&*b!Uca!|FUUL~ z5ce$+_yk|PMe}q8e=34J%}i~qr)Ot=-ps)Gto|=XnDF*KJ|0kJ0Pyq*@H=mKO8APE zwJ_B@$O|Pv2j;_T@96KNYi@q_FwZ~kzw-a{V`u1B-GP4D!@T|^|JMMkle51g$oy3> zx`UIyqbG=K0RaBY(Z??U04NXXBEbPZhxitV+5Nx@g80!PcKr>%J;V;b;p$&;E}qu| zFNJehOkq zFuo6nYeB5)@K<@d{uQ>jcla}ZdwbVE@o#*ADZxsdcK7%3un+z9V zL44fF{f8qByFZ{gE|6Uff z)WuIv_jh`$y&s5vD{DLudFhaTnE!^Gv+?iw!x(S6U9<%0v;Y7T4RXJHI6D|YEa#8B za9AI(ZZOT8ZhD9GUvc~b&mY!b6r`Vb_A)#LVvrYDkc*$eA@7IrV?6yq^ow`c3paP; z!?a*Kz&-`IT{HqQ*gmjENBdv(2YG?@ID6^--X^dhXa6gQbpzu=OP!og>w_5N9k$@? zb?K1b!+h{Q0jCbj0@K22eLQ~66Oax+>g-{7NIwc%Ug_-_H zPpMCNn$n2UfKm$13)hBgz|Vr8I$%(MtHRa(;NvgxDds48DW)j~DJCht*||sh{Y@L0 z0+S#|zqO$=*uH<&7I1MePi6QixE7c@m@}Lc&I`!GmB4az;Rvu~Wss`(JBNp@@<)&S zHBWzX0Q{vleve0UoCZq6MWaI_`L`(=*Yx zn`11=L>0MHui z80Z)DTYm7v8wI#ZFo83T2M`2A07;M^1>hv00q6kwz!|^{xCmGQw%~Ym1IM`^5DcJz z+dvc$3%-pX1L;5(@CtYfyb<0HpMvAyBnk!!ehO&{bqZsOD-^C2!4y#xsT6N0 zN+_DZx%7i#hmw+#lTw0G1)Pgkls72DDB~!fQ(`D| zj82Sb#tg<%#y-ZMOf*blOu9_AOgEWQnTnXYnO2x-n8lg(nC+P(m@}9wn1`9SS=d-k zu$ZxUvc$2xXK7#-& z?Q-*R>u@`B$8ck~2f6oogn9INkUU8|WjtfNaNc9Q7QDf{nY>NBD}3yH8hnm?F?^r+ zM);xp$N10lhw;DS|H8j5AShrc;3JSG&>*lP$SJ5Jcth}!V2$9S5Sx&;kh{<$A*|4n zFo&?Nu!rzd;YMNH5&k1aM*@$$JkoXK;HbpWOGhJ*Vvdf9(2A&vxQILwsTaYC3W=JE zqD1pVN5p8vRK?uHo`|)G?TSl?TZ%`Emx(V(a7!3V+?2?Z_%6vHiIDV_%$6LGqLfmV zLP|ZC>Ny5IrhLrpSjMq#X{hu`X?N-8(!DYiGHNnjGTAc2vh=dLvO%(WvQu)La%bft z<;vuK%8SZd%O}aV$disMANM%^`uOMx))Qw=M4qTTv7vBG!BHVYVL*{V(LfQcSgyFP zB(3DEl&SPpnN8VLIa;}1nRrs=q~FPclZz^%D%Vw>sSK;KtD39EskW+7sGU+nt5vJ* zsh?C2Q2(U9rXj0=)OfG4pedp0tod4VM(e1Sz1B;uNo`^6>)J20ClN;w_K0l6w2p|5 zlg=BRd0i>p8@eBKf1Wyi%I{Rksa-vFy>PwS)3DQqr(;fc>9guz(ofePH#lnGYLI7u zGgLMVGpseDFfuVpG8#4(Fm^P4XN)_eawhytqY1sq1(S4>>9fbq`kk#bg_@o*O)>p` zPVAi5xiT}r%-Af&Y|LE3+}FIyg3`j=BEw?t{E73Z^DP(HF4$doe_`k1sf&phM=wcU z3cOT*nd$P?%kM7lTAsE{ww$~oeh?U?NB?TW5bT(`Xb{yM?l%s$(G+ril3nFG#I&+&=lvXhR}Bd0}Y zE$3wCc^560WS0e3E!Py+MK^?7s@saYo_o6c`VFHSSvPi(X2@J5*~8KU<4Ns#-Lt}r z)eGs>=q>0S;@#^b?GxoQ>8tMh*caz#;`hcM;(yJ*Jb)b(>c0d^2Hp#t3epbB2*L+n z4lW8|3GoW~5_&B3LFoKVgPS>F@G!@)dejlrZPZk_ZurXxNQ6T~Jz4~P7yaXw;jOo~ zX>TKMcSatMOpe^TV|l0YuE5<}cW3Sy-ph+(jPi>bj@F3Ix(~nae!uI1;)ApYq!_1| z_SoaGsj-AO$GGu$q6nAU5O_XGaphu^m;gygh+au%#wUFc_zg)rSy^TqnJlq zkL@0}r7ERnJ)wOP_+;|w*{9`cqG=D)2{6Z?jk>yHP8n*@BlCPE71a;A7y&rNZllL!V4O)fcH26%>mVKPzD?i7ADY zhL+;W+{z})t;%~V&Q#P_YE+g~$yMc6AF0mx%<(y~hPLKz4H36CTHU7JR?)87UeFdHbk8kTEK_dsFx4u(+ zj~QbgOC9GQ&z_K)z)YT;{5*Af>dW+n>CqX-ndMpkS;CLIa}0B-^Fs6Q78Dk$7Y!DB zmTZ=OEc+}UtVFG{tUmiG`LlRUXYC8_3hu|c-#U3CZj)y-cS~uje%pL|e8+R=U^fQO zgMYiHy4SLAxj%mpOrRn>B}x%1NhYN4WKS~L$KKEWmn?9ocSBu3Eqx;w02r(QfUO6V zA8dZp1%JhW{HDKx81j2KB>xTmO+ZXRASaS2JOV@k>=RaDi~^-k*>7#bO$ zxp48)WlK<$b98ccadmUQ;U5qf6dV$I^UmFSQPKAw#3ZLYdYt;?X^HXlEyPmzGmhX-aJUkhNc&{nr?a{D(OEld-?>H42K|&|en}3WZU?U@!_w3h<(&2BkDg zN@`l_Ul;A~7yYk`@$h2$^CE+pK)^iUa5xqC&rC-{$NYC+Gr&=|=kKybi9A7HmIkOX$JV>#t6h}mvU2pRCTBdT8;9(kH)aG%`!zn%ZLo!|FArt|y%xAXtD^9TONbpGJ~cK+XX z{?PxJ&L95wb-tzX6oM)wujS?{HVP$>b9I?FX9!glcI8VlGdA?T07qEiWUvyX^T5I` z0&hv8DLgO^i5ZmJR^7^CjSL*^{g0&iL(=t%y{uLJh^Od=47(x;o?Y^4qq~HTRPrgD#b2V~uF4&sH zAGHr)mlxeTElObY6KU1}IbL67f6W|}S@Y=W>wl;GhRE&4OP~p9|3P|c#ej0u=sQtg2hKPC}hRhZ)i}kr_IIf$DJ>~Vr^~q^7YY?9XxzSd1R zF>wp=Q<@Cqnp7TGQr1X;RR}@1Wrn~=)7brhDon|V%keD#MoAED22M?qaER*^dgb|~ znP5nLP-*WLhR)5@_ozYNr|8nM`}WM72*rfw6_`0FHan4{2~GxZW}i7VGDHU)ylL=Z zD8@6ABV526b%o+Ux#pq_M0--0Jlu z%Nhlm$;6urk5voabUh&QCgP=3Rx-aQGTUa^;ZqOG0aqFd31Z4Q^z_Tm@PMw2z_$I+ zz`Zow#EwQU$`==WYW;OOAysAM{m+wRz}cmF$6nB;{D^;2Z7b%1wsZ*X=2Ul_x2AMR zy`!t}rL=RG_61c16cn#26<++I0<$icGLXs|(n@U1qPZbR*;gad5M*#C-+I*6=1lLW zBE5h}qp$DyqI74OsTXZ8gdSKDxQm8T8s;r3%Rl?yyCO69_*^)TdCVTRX{WMjVuc3R zHL53i&E$26FNC3t+B3yhLL>%UQ0|U%^bsUHo|GXLc~j!5Ti|j0Q^qZua}_64(;vR; z5J-3?$D5KH>J>g1c%V;E`DhZ2P2T_JndIazc6SL{2rvgtZWtg7a4k()l=#xN5-oA# z&g|zee?%IUu?+JKxNczDC*l#sh{LQM1q)*J?|KR=yfRWHcex@0TGQ-f>1DOj>S z-!O51TyVYXuDqs-kCkw}F<+wGY1MA2#kH6@Qt#W$AH;Ld3sST*u=t$GvEy?aivx^R z4nZx8w)dRKfcHI#QohvFtnwate$rDDTn1uM240K|;bW8ctH;#886s6T_vG=zE^Mqz zw)2d~BIDB)#j4BhuBOEdzV%fVG*cr3T1!vj^68~`Pf=wk`fl+LY2A8yI;Vr;7^R{1 zH`PTuiY8mpsg0$YW){CEc1J&c3wSSw{3Z}M_H4*v?+Ld>9f83=8M*HvfvjNY=QA~a zk7U@PF!=_te@x3XF7lFxfb7V17t8QjFhZnZ!tSY7CLk#nrHunzLOzJ(4B-7qv^iuz zw5-mN^a`9Iuh;CNN)8@_W9vK_NVb{8957%>DOwS{!-MSyifO{2Zhg$)-=k&!t~8Q? zw&w%{87Rk)p35z-o{hm{NHpV!8Ag&28Tf8V2F^VR+6(>U_kJeiygEZMV00$W z?*kJqX~8!J-#@+E816WIvU-U3$0KXqPxAcc^)%PMwT)F}hKE^>OcusF(Q{Nj)|_>y z(ZC-}?i3C^X*~I$lx{LOX+$?J(LwivyOu}irBGR>Hxc|1BbDe#64wGrXy9ntb|S;K zg3O1)P_;|vSUOmSVOclu$m!@t3^VHdz$A7!4LXvh`F6$}n#QfjI(8+Q%6jujvhm!6 zgo2MMe-;_IWS|{X_dfS-ocR2}P{GMSjts<0CLVnDaNWd5@A}W@_H^$RuhHwwW-=Rl z-O6f+*_&z7md5rIXx^K=s-jyIcFT5N!U&J>C4_V#ONhDXKyX#>!2w;={et@E@Z4t`C=DMn4?E5LhP&Rps4T3{X{R_s17<2_@+1<;-z!$~=~MF2V+W|_7IU@5{+Aes zVP1}sKsh}@T>-&g@U>g*~hOZ9oS=m+=qmtN6oY9hHaJ(n3@dGDwlz0dHW94?q$wZ?9J?b{bu zIUPPd`ncKP*6n>uDb0trst#D~P>Gb`3d}oPcXXkuby1^b^syB`$K|FR?yOAk9d=1B zf-^*Nf7$zw`JDvLZ*y+E&14}Nuy`{=8k@y5+$7q!?`Pfw-~A8kf3v9_+SUH4z_hqY zqM69TJ7NL!A2YXr0d)Z!Iyf?rqKTvWLpXED=M^FU`wRhSBNaIZ;ysko*Dg)zsWl=S z(yntGZK}<&z8f9E713hLu)Y>6D~jza&Z1k8)jV<3XhpQFG~TD+(m9^G*+koF^O*oH zgxrzG*J2BN)PGbCGBLXa2}<<-RFXYyFGs}~GScu^M4K3n{D~(6UWjibQ|*2WLB^U5 zd4VLIqT*I*;@bH7wQ%g}HQbrSV8bcC7oQ&#m+aOGRe$*Wyrg`FODyCSuD@A`Vx?N~ zwb|R}rUj^|y~h^*#kmMuiWm1F1fWEZgB|tw&v-ITLT;|s!4S2DS&Xgc%;dwT zO=)q4$*PYPKfl~gSA|60w|HfA4c2^;p_TeP(5$n1?Hac3Im|4jtEjiQDp-J5!>xy? zz*?Go-qN5r*EJ|YZ*f2M@f&=hw=$ixSZ&gP6C@>WMncr`1?u9uR&!RUv;T{$`P=#5 zX}yl5sk}E(f!mMS&?{)&i^xIO=M|yOczm$B&;Rs^2zJ+f758cUY;^Ib>kU*VU=KCI z#~-)I(3VE$m?-+*e1-G38ot~0)q@FR=1uw>v4D~ZPuG4nUg;sUPs>{x!LselOScDPt_Q{Y^YV#lK`j@ej&vS@-g z@~zT5@wi-1%e}`}e(pnaw+do7_N>_VOmGAcS=gZsHBYntQ zZ_u(Pp>7c_E%wjov+_f@8rBkR>G3HuRw$~R#V4sFIoPKzHcww!2!0_>^CXJ;#vM#& zX2;(M#wW&MC*Q+_=un(YM9K^@U<}Ue8^m@{*nWp@lf&8GBmdmtas9#hd5XF?k=jlDamt5>SFhEa>pAf(DN?$+kJY4; zY1X0Wo~2H8)}#Gln{~bVLU%O7RB~O=XcPLeXx1a48!dQCPo(S@`B1O2(q7R7hwqkM z8_la}+z6F(+uUCbvMM_|MAVah-2M{MZx}Oi)>w}FbAB%z1AoP#+I*AAE&@LofU z^V@|BsKP1dh_h})qhp3@u!mv8LzyS-=$0}$N-7GA59s?&(U-0?m9`pOx&Cb3P7|*! zt&ux`LWn!2&MTbO2#uk0+>6<}QLZnwY3H|&w|=^jsp_XqpjKWZv)&n1N7&14v@p2jihbu0Hre6i3( z&=aWmv!vhLcKD#xROwP(wu8f+tC*3Mu1$P1*5U2>3VC9ptFT#=HT+q${&l1JRQ{x7 zDv_LU0kfd=@O!6@nMw@o(M_okID#$9*5#f|%EyrbCX7-fuZFR=Nhb^w9}q5l zuqIqB?<)w@^N<_zKT#`gP$!bImMLA4Z?$>xM_@q2#`hbS)BW^!D&Q_I7fl=4QfCr~ zigwJXvx)k6#r55D_>`P!?(L8y`IifPU7mLf)Y)2QY`^7>SarNN40~_K^F_kXwP0$~ zf0Wq7 zttSLB&>(>S(`Mj7_*vTeT-QokKF>x=VgcJFykVZrSskRS zB7M-FamxlKqedtsJDm35Tt!THQuKq3vE!4{QUb?y>o^upEbUfC-wiZ9HqG}yB2&z? z=E7u=d_ShsHgqcMZiLpr^>~a-eD)`1&F?SvZq+T^ycx)GW#RohzoM(TEGy!#cPd5+ zW`hBvo~IOFr~C-*5}$v*90y4_5yz~x+$0-#`{nXZ`WFcw!&#Lv(e*of!(|fn#GCu1 zYtoIJ7*B7nNVAgW4~t5-*c!(w zU;Ig?#cP35V}6-OM_Ohr>$9RJII6YQT`lq9>wM=jE*4cqn#rM0#20^J{S+EAAz5eM zFvru)y=?c&j#is{Bm`z$d5d9}Ycu14?sbc+$6kDezJ<}!)GirgteVP~W)jiMW(<@e zfrKV|GwN40ZwjBkY&8-QNhd55^S9HA%_yvGZIXo!E*`r*kaf%(hw0T*y3#zgH#}#! zTH+p#o-`GlI2&U;=jrQHDCMG7R?bs9FG!RwP5I%m6klQ22)wbtHsuQQqCBDZaS_FZC5*y^gjOzfW73*M{g9>AZ;Ki9A67RMOFy4Hb zoPu{O+(otxFDLJex<$Dp@hAA1sZmL!uQSnvyxG>4TB^+ZnKVgkZ4=$RSGS8nX)_FA zAQfc;uNaLq;tcx*V3uD#1+&z>6AHn)u0_4C zWkxAxZ_lDz;w};11Y?#`cARSx&56%Ryx&jP)#7$CI1SI%c_j%A`h+hfDQJ~-BvS1n zyG!Js2%h-pzj`kFt=^d z5y5R3|9tpmy^laoB@q6yAD~=$-HgE2Ksvkmmz@LeVv51;`S*E?B051kE&`3Tqjs-h zD#MGcOJ7VpQ}r>841AI+xFX8hpva>c{pk7og_Tj0hqMo0%mQd0Ntl2t8Cbq>)>P zaJ_cLOhooIHqckG1R9DH2L0(Ckv@D3$EqI(1L*>KDjV%4v@bO-0oHC1bS??JBJoP> z+y<>s8Pkab0b4S#KB9K#KTT63`B!PAf2DaojsAa6^WUc&GXdoDb;HY}C1{-{q5(Bo@e(p{WFRN?_ExMrdw?|93-%9=)cO(7oAps2{8hG@d`(n~K*6j#v)#zq{ zzcz;Q_JVej|J@h#cWeqfKO+Hqw)0vzfx2Y~T(tJnuQK}>Fy-C^%x?VOHj}9?rc+74 zFkl?8*Hc7t09p2%wC5xt;cs6F_kx?#ZibPHeOs_+z{jsd-rVeiGMxdeC0_*osYI_X z>Vw`DJs?THJzKZm_lm%nRl2 zZ;m^WpbQ>1E#O~gS(+a7oUPkek-M~o{d!ShL&`0P1W$o__vCP+##)q07Wb+WR1R>l!k$dyhSpg*)S5b-G~>PS=462ws4d_K*&&j7czL&_2fIAa9DtZMWcu*q9hgYS($yN2sSV zX6Q`xfI}wAGWF%J==JWo@Z4o>)G=n15x@Y;(@X4jo}HQnj_u$8d~kk zPu8I=s!>wusyf<{Vmey4UNH68LGb-MUc@3VuL%B-jM`KZ?fTuG*8T9GnIc~@uZZ1G zR*EYU?g;ghmX=f%UboAr5yu8VWOv{G?S5Gb>10&mc#FGObnCvAr-zvNu zN42<%Tt?858Y4K@ovfX1x;7^=oy>V}$R?J|o;;};Th;!xj4zgc@>a#<(D2Fu?)~y) z*6P$N!pWKe$H6y!Qxz^135wk4V)yfBDTibXdL{$46m^97+$P`=$3vn_&uDSgRp!_A zrpZG_zqbq`FV*yo;7fAO3DD3PsGJ- z+P-^*OpfRfDx{2^!9p4Yu(7CcO=;!LW`UkA@sReY)}xXasF~WiQ%C&#AbV{yLXl{$ z2%#(SX3d$*16vtK6}-eteQEb$!W6nYqP#x{(vyiiAxl3!5p~uaJJ>+4Opn4VHf??j z8IeDoA6&VeOlig+Lu4jCMBfm4AgGGZrK(5A?5<9)QZ=(&wNVN#Y>|o|;!5HEw%HkjdT4?Ui=2oRg!i{0wNAFhe_Spd51mXG6Wx~Pd!I7F^Ma`b`r&mn z+)0C5++y{JNpD}CWQA3z4ENYbMrk)!p&f(%1Pht`g6PJIfa z8JadK$cTYb%f`XR-{HHbq8q)V{S1W?s+HfmokDMW2YZTIRJ7>(oh)2_NTa;} z?I4VRUbm~4MW4p)HiV`a4lCzzq#vBWGFTAN#{Nl$Sw!{vdnbj$+U~Rbtc*-64eKJ; zhy|c}w>+8K^v!W_o6hE9dh@=~L)Fb#c+l7PDs_^lJ^&7kG(UBP5__!2uBn+^Np}HC znK@Mj&QaMfkABv*yA1YiabWJs*t8JyjhoTYl-0_ym&*8@nN8Rlf86?RQDY!6FZhC` zKPz2%^(^w{+{=8rkd-E4<1myuN+h<^?|?bzQWuo~1rUDefFZ=L!S*=u#a1UVe@FF$T{a0_BGvxXj* z6(1qDtR5V%q#^4!G+~hH97!6{c-p6{d4^l`eS;7Dc5`UH8D9J|k$?~kl%})dTN$<% zYb)1@up8^7F|c2vyDnrP@;Qua1?}nXdf<+-D*LE!6LRk3`xn6bR~9<#jI{yHzAR@~xtd(~r$y(%i)Tw*74us${s@*eI6D7fQW_S8f0=Vu~ z9-K>Cv6jlURMq*9!gsa(TJ_-H>m}l6BwN!iJd1;*W;NC@6K`d;SXYxo*D?2Js?_h* zRo&OAKce!iS-*Wm(UT!5sSBaLfcALK)>w(H!_XtKbaGpxS&`N%si{fsol?na#>ZP^ zho5(Fc)am{xH9@A5D1-L$vMyr4D}kvmqv1&P$GFt`%h9*X8+QCMVm6D*Y*m5_?#!r+C}Hpt zW(`$Z3~@o0PdM$6G_|1R#qIf>gqiM~_04XNR}N|5hEyL;bS@F1MXGv>9u;wgNpuj)k-d+Nqc zyJnfrnLEYrTBwF=C`V9|IK+yXO0zc?N~@P(_tyQ%`MlT;lb}rJ)IHh9s6~gQkCA6* zsBY<__SQvqjtNrXP4iJ#dr3zZYmW78dCOXPIE*K2rWn##9BW_VLDd>9w|ova!x>Hu z->;EH*J;aZ3*l|ru3flX^+?By|FvH0z^k;~YDpb`t1jeAFoE8b`Nej8k%JE0qg(Fi@P&Sr59e@G z+nT|<3>0<2=%V9E7t=&8>dUhvsM`e6h zM`SMuq1C!?;Fvff2JMQ*pS(i~@+a<~dQhWk1+tvZ37rvc-(E3NeZ?`I}RT&dYoOfRtNWQdGn2kIbnCvLGaN)Cs)R z)T*J;I<~%3vE_;76I)cUN(W3+s?f6C?j%iu3iLa(8s-CugAjq2Uw52ljK&@45}y&Y z%hWsT8=W>jjM?8u^|jYpC8jFTw6hWC!1$PhFP>RV@no`r@A~UCN$~?IlJ2n<#z=x4TVn4O&i9XD4 zf1+T>IaA5D5dfzpv=0Ve)4Mh(ul(8C(LemHso0l|Op^{pE*I6G#+?!ApfaeY)E%{3 z`36&9hj-anZX$81sPrOPirXH-4yM7*#H`<|Z*E(CnMDvNz;w2ngK1mCx%bc1|}#(ww_Ig9SEcjv|xISn)7v$bBt zKSyqSiKKxCynz3MhcW)%0}=nUEBt0l?b?H3Au8=-_^@eF^Uq(bFV3$rzl7wJrk%YY z+y)clUTv%OV6%HAR4lYoj4dw6#tLFx!yU~Ar-zTmjeSdl>(9jptyv!AiH~I)&3?V~ z=o#UwP}2727x=s;L5^}HhW^HG`spvnZTqH;xQS;y-rPc*N4R3XX)o{G9G=0i9h_R` zjkxDH)%qiOyvJ-_C3DH~a?qnNri90_)Q}J43G``{>!UlEvMDYnE+YM7% z#Dqym@uI^$8#tj}$=v7WaGmvTEXs2F-DNa8Ql+vnws%d=x!fM#`UP#>R9aD4^z5p2 zd(Rnc;EY3o;zJ*U6Ll@~I^CY&29?<<(oyu+8=z&yApM|h>Wj6+s{4Tm=(K2nrKB#M>``}P?YN_1Yi7Ku=~_!iTXk_v1;^<1lLd} zJ?5k@VNb4GYH*y}@x#jBXeU0d(OSrqAQlo_r#}Zd^{-Y3)9;LgJ}$M-P8C72vHI}5 zjPV=M2BMgy7@2*Ll#_k?PE$pzeX?B-LiB z;D+M^J;IiA!IlxoU4g=X{=d!rZ-Je$s=8$=8&W>(TYEJQGFh ze2e%QYCLPy4=jI-znn(1E)5l4S*pw*+b$NNVc%>My+L(W`UEtMGCxrJopa#(u@0Zq zjaOce(@({4vnAxdSdip7Fgx%dz*1%~u}U^(up6oFGvPv}?tEt}AL;A{v3{u&vG8KJl)$0{-#3hDDJbC-R{vC#Qvxlc2|qIc`H*t4xD2@$c{7 zCqA7_*+^V%S$|cV#Q`cyVNF7G%B2II#Y8F3@oCipS!=bs8x`i_Mp-{UJ-eOY`)t;- zDg8~!2V_d@bC>G^4+?~Zs9|C3d zOdjX31@z-RH zBY;B;*skNwXPcI1{y0j^3%)bFyVkv|BUCWX-5QI; zmmRm~#wM1^JfWFz5bO!D6t;{(*PX=3mB=TM#0KQ&kg*w`1*ff?y{u-#o?1Q4tV)y^ z$EwVx8b523e&RonY>asDE?*wwA*%58yRpa0acdPP(VMKV`OT>oykoJGSqPzO-5FD) zWf7@8s@novQ64}0S;WJyy(=fO*=RCu(&e-NbbeM8!Wr}Rz#Pw#hfLicjzgJB1(ije zs-y20F(Jc{39bf-{~ckJOgMQX;w4v8dUQebuxK$;00jdGza-Leow7uk$FW;QWd8RZmG$sB^KV zq~^q?{mR9IAmUTI@6^6=j@QG>36iia`JL2Z0t=39#}8B*oSEpB3X!(L70DX$E>}+6 zZ~r29r4`~3w*hBq4rO^O8y7zs!Gf*nM@*)vkIg;z70YR~M2jY=8D3q&-HEy?7)>>T zmE;*WrvFsv>XGW$Cc53W_Uzf<%ePCXI=7~RkC#MzT+_CiRgvz0OOx=>lu<_Q{*NiRPs#=VLVYlD~a; z?|P|0>U-}`7`>X7p*8S>_!iU8gf~M^W@K$0UA6;-IzpPx`Wk^PSTlsn8a%l$vwh$R zpfqsaQ>mEsJJXk=K@HfDJN%4~cuMifwoOwh#EP&e<2>vg$M(eP{JOMZc<^aFWb&#_ z2(tFLA^XP`5@t2xivHQns)3 zM-i#_HU*7lXZ<@-FAoqAJ$6OkYlQK^lXvk5q|gIRqIfM*!?Q7ROUWV}qisvr%c@>} zwu_O$l@ZwKW?W*YJuh4to-;+8)L5l5D0n96dCrwPkBVC4m8D{Z;Tw!*${Rx9rg9GK zEkf|r8efx#yeN+J5*hK4Q&Q|?--jwX;7rtL+~iE(EyQI|BU(!YU#t^%B4qK=_2bHT zUH55EzX6@18|P(f_To|(T8)zxCXPL<&K$%qF#3`Jrp3fJ(t{DoD6^~?`Nq$7(^`X( zi^)rKte$;(M{`qX^&6Ngy1s0!#cWjmD^BD7y*{~r(T<>3S-E}SG1}$M-%b}FT0H;r zAYcGmh51Sll~SkP&H_?yFW|KT6te%^5r{vIQ2d=oA^v?k82)=4ul@)2hy4pZwEv(W z|Bs%={(BXGzuVb))AcTi4&}H$mqEl#qM^u|BZXc4zPavCEPbLD4DgPDUAi+$khuWM zN_2yK1o%SRGOo4(g%bf#rH<<*1N5H{OwhgJ>)s^lKqk@&9YL;D{jgku!tSapXe`TU z!s3q%An;8>xQ>b9G9s%tC+N0}HYWo!?2xJdJkues`~yuC3P-#$vH|_^ME*}%! zZ{dG~@z;Ga6J|K{Q0Zw2W5=V$*fRngI{p5Kr~oGne>m~*@v!yzvs zh&}dJbbVEaLlWaJ^ob0t%IJtpA!3bodIIT%2zNkt;J>~h{x7W?I4*||pIM6@PFf^s zj>Eef(oIQ8YN(fmi!a;eoxGQ&7TPCtD(o6nXT_OGePlO zmM$hjEX$QH89o=*sJ-Q0-D^Ksb&Mf(D#>ygr(dv47L*WVB4(9Lg z=ha?<0kkA7gbUN2n)hAoj*1&%-zN%-5xU?1-HL!%S6+RcPtjD97AEQ^!r>HfyZxic zOE{DPFdxvCBS`jn=k_am^DLBFrWQD+(roj&<-`w6=DjlFG1@x%jttcQ#Dlv_^nQX4 z@;fGWBsIIH*-aB)&6KV=D<_ApE@Kx5KVykx<26&3)`lZAg5@umR=G%A-gSxlLIF$! zUTgGvJ7Oy6@GRZST^-P3l7k@w{Fv#r_9vv!tk&Ki;MmaY{-Gl@!h@f{T{AFC44_AU zJ>L&{?k#hgWGq=|9PCBC6sUzGnS2b*k$BH;Rm{>ZiDob?6n!8-&`#eEE)R&=5p(A* zWN8XhI2wt*cM+h{0e@~1AjpFgF%hMN!!`(wJhAzRyO-_0!`qot@OG$I@=A8*til%& zb5+X#1;-aMIuIS$6ff~G#Yc48P#N)7@fwl#2BGJL>jWBSx)8x_dT<&`kiFN(XMBwp z*FY?p<+Jy%5q=&1YIdS1LSsf1(~pfA!hX^t4WeO9F?f{&Nt=+zCAw5Q=x-|d#X^oM zx`@Ck^izj%?VX_E&6M$5Cnx2(7i(t(Bv}r?4bv2+cDIq)C@lnaOEg7q`GEE?@!pOp z$+k5pG<&qvzbqIvja5OoisD8=TUw}4oc5OhMa*LT?rKIv$86~0Txbr-G{e72(@_m` ziugeD#3X3hj2N(m;f51dWJ_dOcjkPROTIF|Ka}f@6B`&_?-h9lKjj6d* zQToo9IAhSe2d~X*GaGo?TK9VtvxK8GoiISy@Yd*ofibbg|VqmpcVwSqYlD?(Q-@4Z%OYHuz9{@U8N0 zbWk`sIe91Pp`Sm(apIOxQEsf9wvvEjT{>r>c*;7{)xu({)#-B1kpS@%p6o`Wkp?sm zr7WWAcvJz3D|`MV8c(L$R2(MpHU3kL0J1L30el0MX*b(-Y|M5)k_#QptP1J2MNX4} z(ZL8oiB-h(ZCu%bQV6>J<3@AREHSq8WKw92UD84ITGvW&7xD?Q2y|vL(MI%-BXIM# zS3oNQXZyNHETG;BVqM4>#FXnQ=2`6E3XGJnGr#O4_s&3NlFAo zcD8^#S(jROl_Hyw382?FAfB^(tYTzEMDEnXuu|=-iGz0WLPgyx{W+vQI~YpEbF!Q1 zs|`|N8SVKgfqE)o@p>_X_gsC|rP?Pye^SY|Xi386s?ReRNs2 zC9lL+QjbSxes@~A4XPQT*xsh;H9C%!M7Z9smPWLo0lk?*HO!rRCfcs8JATAkCff%EG&x|v6Ah~?@$+# zfwq+&(YoCt{EXL)=^C;41u?~}ZuAna5`Q9)a(GJzUDTW@ew?qhsa9K;-n;=Df{^<@ z2M#l@Sz_vw9jo=*WFiGwPpWJ>R|5NosnQgevHTl{j0d6_W>kB(y{o3O~UxXf>~lOCkOo`}{S(id%2LE6|lz4M7@ptWDouHkQu zcr-DRji)mzX572A=Sm1+-UkA82eL?aXRb)f*EKB9Y(kN_;cu_evCXbXA9SmHp(_(Q zxf1*qi$s5$0GEN>mBJYeE8eblAN1cj=FrGsJXf=gA9uWnPrk0g=|veV@NHhLu5TTj zX+OYyp?04#tEQ3OP<+J591~Tizjs6_?nC{QN3gzR)*6?Br$(7mvie+xzLI|y!zA(H z@Qyxi1W7ZQl$S*@lJV+zfBf+1xy*Q#r&sney`MkZtO_ol*?SB3(b;!$-6Rz|!no@M zv_50I+^MPZjU~4H4_HPc+UXAD@M;8~Oa}Fpq-(_LB}cOZ@2A7(Z;7$ZnN<`sOfr;Oj$cXKORP8YCR2h{?w4$s&RkJ?^DR(nXqXr(|AY8c|Hsa^;so$CbrJtO7LkuW zJ%KZ0x@A{1|9>cZudt@Nc3n6~lPm zFW2l_k2GojZoyHNHARDm_YOYOGa=RA2>e!sen8_bFCkdJ;r7M95h9)lus!mUN4Fq` z8$Ik*{#@KnDOB7o)f)66_hL(SsATnRWaIweKGy&iCOB<>ym&GQ>W7 zl6ZjQlQ27JHG-%hu@#>vve5KXd&(8MQpH@jz9$j2qZ&vIjv!Xo?2|RWN*%PBo-0} z$mW5ug1;OP(AXQJAjb89oEYnH-^vdrB8&RNWAfvbtn1P#na?vDR|{vBfzOBhkzCUG z3;MW&Jhc?3hul|3o%?MdI9Xsz&?pZqcQm!VkK4N!!|$PG}&CGnAsZ9}7M* z_zfnhH32;^9lG7@vRw?0Eo` zf4u*>`~%pO-|*}^X%415u)khGsrnUfVc2At0Hr#+ z19|cP=MupB>_1-vLh{K9pFcwFuJ$4%#wp5gXGuuI`nW;s$rba5G1Bv5!Ebs#q+f%a zQVyYg+FQQltmHi<^1Eok#{j;JxHs@Z(;bu|q4V>|hWUV*?EX97Iv(v~ov3pw(OW#H zP^Yi|!po-@UmJa$zZXR3AxjVPOw$4sVKkQRzaW`FEV$w=fE^#s9G;Lv0KGYeVh!AU z8}fG}>NoFyz2=0Ej&umDMSyFNT^mTI^IksXn=+%Z)Z*n`^yG~%!WtSM&{Macss5?I@7?X3lsr;g%z~GE^j6uz7+McFLz>9v@|3& zcJH&+8_y&0I$A%t{us3zxB`tME^($QacxQP|7?;==8b|GFB*pO1zWU_xC@yDM|X+2 z#U_zXXsn?C$wGj{5{zGiOODwaM)`-iMu{veI0p)>PkwtWn`QJ_<*U{Jl2Z>!V>!XM z^^{1Uy)sw!lYGN!yooyczh;wn^8|JdBnJ{|)fBTCnT%%boj(eH{b~Rp?2HD~Vgx^& zt&J2KiXXaFVkL1t-Oi~o_jK#nVXnYf^m1FS$6Yd!nIm>kc>Ou}0&SoZgb(irW9+*h zFc7GD#I%iZ4Pbe@r4hL=iI9>seA;+iGl_2wMemdtm#D#DH|c6Q=tB{O{I z4H&(X39758-eo4(_pPnJpqo?2+iZ?w3t#IV7eBE$qvij#FSylQGUeR0H(VG9CY^YR znx{u!3D?N$mEg7#Z(0`nEuz0&d%PNvE7-vI*?9fOilH@5Nb>!~3MvZuxMVJTWw1Lr zoe!qjJ^uSN-zVSd%Ywr0YKh_&@shhs!>!+;qF2eS;-+U&DnPlNLi@hVV88`ut|yH4 z7Kv=!n0hx|TTA(-Zb@!Z9%ld1>;LoclJ>RmOU%n+-~oNsC^Nv=Vf=_AfVPgCJ|!** zasgo{ST)C>C5Sud7?Bm7q9{td7w!^zt9tv$gA}huv9PqitY%hk4Sj4 zll#;-!{U0a*UT+f5`!nJ;>>y4&Nh2o$nW^iBt_ z`ghEqrAH|@6=)~;gyz+haMXsrdPjgR^pn|pXX#Ij@K17nm`MK-<#}L@+fK;*p+&Zm^Hj3tt6@-7*bzK2{OLg1Gkfl#(m!=2J$-I_G=dW0g7rXaITS zqvlQvP^yRGp{ek|6^pQ_@CTpBw*8Y^_G1|%J7;R19uA&kNnw90+o}%U@g@rb^`kn8 zyAlAvPo>wZsFkr2E(uN`Qoq90nph!tS zilYu4TDIia>)*M)&ZVgB`ZVBtuHIT&4X5&eHYx)WfQ&0-&+eK`& zy{>G{tjN9PxR|VbB6Z+Je}ty76ycdyxCT)|qrtC-l(q&4)YIF}AU0gmf zWPZXb-A#+y7NoIS;~^_%UFakOp)myS@1b{&K00QYx`&SIg~IJ8R?D4Proy)3oN|Yq zqc)wBCBu_@Zq4CBi@fzbT6<-|{ZZQhcj$<)LykmS6bT74*O|hOu3gU}+`NoGptaWPYWw+LCp?#*w2+T*jXPMh z5WgBx`Dhj&NCMEf7BYmwL4vI8^TOru7%!3Gbu@ord7xtDp+f%jx~Zt5Oh(Y}!uP9{ z2&5v?bD#Y;z?t2^f|+6UlA)!(I*TvM*CH|ccq^Tn*EZVoy@&xtb!2`1L=b`_8B)a^N{hN=B{?Hk5edgbZfni%&80vMTn%-b2o z=928Wp2O7*p35duLd(3uC!Dr4v-NVry>-p2iLWc}`3;mifXwv00EQbC^%wLw9f-#* zJx+n#|2rOIQu6mwJv^MY2Nf6>*Me^rcofa7rxp~tg)!JccYDbqh+!}bfZGC6FBrK? zf-~KG=4i4qDtGO{gB$lok%8>7Zj)a$T*Jjs;$}BSfISh7_===6;71I9X-R9Rd$X{a zKTs6;P%`J(%4qk-@YTehgJHpH@OUj9xJ|`ljQIG(0}CWRpmjS=fY9f zWV4V1=rZWsA(4-o-R@4-BZ&??kjDExi$m4?)(CIOGo>9{I$H%u*kQ73eB)%J->^s8 zABI6EG=Y|fl{R88fVWd7lOsg$j zTJqLGybWb+YMt=+Gifrc>d=1 zGli+5ym{1_e*LAtAng-*oRPW73eb6gP&r8KD|7?0CooL_p+9XPvpFMD>UH2?=+9?A zV`u&@Sgt{H_SehV^{Y(lSD0X<>W8S^O+2|5LjM=!t#99hWars1n;0o^y_&uo&imQ> zqG)`9ZhMVNYp?d8A3H0<6A1o}QY?hMlNtVWLQfJ8SbK$l0e5s&pE3KIS6WVA5^LW(`{bAZ$jfWV(rXx1eJ!19AsX7y#`ELHpj7s^jasBF6n~5Bk17&G zRp+8A6-PrPkk}gVL0BsA-z(_;1sUak2A=Tp&M^Lj_?q+*XT^+D%Nwfv{l#a|wE0er zbVY=na_jd`T?~cnQNE49J^W`FrV6MrMoEqzD7Q!`+@&YWqT3HxtW<9tdgK|uR@hU# zV__?x5pn0zoH(JLb!0<744_H|A^_iPf^$0Mp{(_jMexx8YZ?x?Ize@Xf2sCSt#}BVq0|h*qw8UD7;Nsgid0!CkA?JPzys`lQ^YlUFG7l-4S$CjbJ8wFo4|}i@7fZKyTB~8 ztFTqOX*GW*r-sIPd2)M6)Ax_9(PBuZtMoy6HMpZEr#=!Ohk?^mtjUS(kVy4jB!$OLm%& z`E+2_j~U|Tb(Xrx8u9SRFXn7F{d$bPgRn9c(H#dYE;ZX@ORw`pa0zjX1Z2>)Qu zORcSG%SvJb(>pgku5IVavA$Wb4g=h+-O0&FPnlz!J;lpOb%R_~_Cbq;k zQ7^c^XogfWoS_q9@MvF_I*5>6NS{Ur0C@pIlJV?Le*r!NwSehT8Q)XNU7J#8bn7_}Q(TLiNC{C}7Jf&~q;bOYBgvI;LT4jJJ9<7UoouwaLo*bG zmx5oncr3B5G6bgtLz@AvEfV`0z{pzqxSrG42%Tuf#;_6|ujcT>ZydOb@-sGN@oosa ztK}cxWCbxo1Oi|g2gv^ixG|p z)XpNXr3U~zl~AnxOJI4l_2pA^1`~EU=FMEC%k0MX9`hSn`pY#hgoLL6RTKaS%*< z2lGo(1H!7?ibMxQ)>HWsVVV0alXW+5x8W|{OwsnBom|tg^W2#OuE&#@2|9sE*0|O% z&-5OI<`hNyk(j-OkdwaFfUBp0qk?2aiSqAjV(f*qdoWevD-sodFtUFOZ=bI2qR2+B z3Jl=UjeDfdn4_0Io_ybb#2dnDlcx(ZZ>)XTRr`4CE z?qj^&Rm?B`X>PoB3B=A@I8%WbU2aHgK@xgbN3skQNh7^vS;xt-g}J5q!LVnZ&ECC> z?ac?JUzpCe@m%GTxOz`%!)(_WhfYS<@9!F~rg8zOR$naww`~(|?b~6x_v`+_rpTOB zqKCVQ=|ODH%}ZUsL0WIjFweLsyro#CD)KE-?@DSPW{@I@k$GOeWplm7T#9V6)?oUp z?BI{h1x8c4wYAJ>9S(XTKgkx0#L$LTHe$n;dA#zSm)P5;i=7nA=NDhEqGM);4p&n& z|FJ#E+3SvEw_lw??W&TmIg-AUar~(CFgJokc|dN9CfdtYK9>;nH4QdfnepZ!kM$i3 zZ)$}B1S~4s7f0Bup-EdBKg=5r8NPy1W`E>Nd8g7FVRO}K9ipjjuV7AXBLwb*uBcN# zv@^bwO>2L=8NNdGAndtKyG8!gxO;!#lSzm@Jot0#LVr+Dv zgsuwbIThUJakj3tRG<3X*u?w3`Sm}I4<7w-n?L!-H3=wDHGd)$5mS)Hks`q~gG;2O zo|EenitFh%^{uyIxm$!%Ltb-~*kjWSK^e`Fv9o&Idtm%+2qS5m7(Rs%r5NL9`T?Hz zvz7uRf8&>?qdOLEw_TT}*O!F&;eAnctXbc$T8J_JP~GGLX850GUK}k8!X@&-qNITc zb*O+@#p^)z*NWvWi934%`Ieqx3Vh|Y{{%kh+i3DY`~+HU>$oQxBrASYn%<+Qn2oe2 zMHli<9J6+@X}dBC>aCgPX-^Ki&AJD*nbrTq;sbHk1N#{0>Pat>0d|P9`wW_*$1Dy8 z!MC-~2zWmP2i>r}5r2M{fhYw=L$IY#7Wi#^_zL7D;=*PLKgAu#HV@{xU*7nviNYh@ zzK+4&YmMKTCjQ7aecaP&A)0p8t5s89lsHPwq)4vp$A0uN9w=6vYT3>=scHdQgFyf9 zON-JCACqk5I_!*Yw}Jg;auEPFfwu;72qV(7gpYC)uRS&6IG*48%_+G*SB7kLBv2;| zZ~EP!ETkWdLCfiRldWiDVD85EjSvyiq3u-7qt8j37jm(?yge4FH0O{PzoIy~Y&c|r zV#d1!c%VFb+L|xmVXMP;9mfMiG;=2+z9kv+23mE|71hvz2pL>9SDl>)x6!+jKv=;7 zBVRrW9U;CC%>J#$pk-xOZ()8Y7?v(-DNL^S_Wbj&zhS6n1jw!h z*%&t3b7H_sufqUwkFB>9IcJ1^Dtx=JIC3K&f5V9Ns6%emdVqu8#G1>i zSZlhGs(AKCFsA#xv&k9L(44brAh9DM@JRav`U!#+*{#sY0XHTIuRs$J7l5oU(2CQS z;IQf(k}i9i(ecyZiPy!*2q|}~F3o*IKOWW%y0>qa>jMF|7b220NY*FWQLhYWVUFy`QOLG2-2TM!m!YJVUudnCS)Lu+ns+3zzXslc>3Cb7wx6vVSG) z_L{?MzSiqDPF^Dh(J;lT4?a3erNPzPf_I_NCGA}Ajf^4rw1oz})ZE9`cWzlBW+)s$ zWDle$lZGP+f_+eKI20#3)FIn{I*=}wVHJ>lOWyOs#^)?ASrtoF4TtDAp)=b2v~$RA zl}=95{2-c-qKOOS_3at#*7+gglGuhvX)q@8vlY?5aX*d{nU( zp%HS{x-V=#h?q$y04GHKmYaw8a>br9cUfcT`;jc|$`PT+^50gTYgVw^b;1EPE3JL0 zBJX%A?zFPD(wD<`%?+VrE&sL2gpOJvjnMxO6bXtLr3m;^p*`q2pwnp1=>kYzVlMVL zv%ah58y1bHe?chyYCsGhGwka5f3G18VU-e=bVx2Jr6dCh-@;S6uVCpje(fdYl!ji_%W2%Pm^&$Vz zpkbDO*qPmg?A#f4rNrD;g|&}LW(^wkKx-?9L01QRkv!WC$^M$=1jY1- zu*(by*cjqvsSqX$%!gYb8FT|Acguk5JMx?%YNfXl-SVeDss%qvV-+Uffy?8YP_a*} zd5n=24i^V~zU0(|-|6N#N_9W4ZSwnVvcHfmmhKw3vjrd`ECUji_I%pvO2@mQpq-tI zt?hAF9oBZ!E>E3%cI7?&M*!d72hXn368pd;@%P9BD})@f_b1Xf@RVf}LQ+Vlcq3P~ zAWbb)hQ<<#z#vVHj(i&^Z3xsf$nQeKzo6%sc)<2*{J;Nd28X8Tn-PKH_)RYGu3~2Y zf(Ei_66ItkRTw3uhsG&Wa&&hu>sf~_oR8fhwD@XjQ~ z4OwZj+KhTu_GG`&f2tbC+7~1mU>b5(Z;Wx2bOn-d6on)%=5Vgn`B6Gi@kN$;qDlVo6AEZnI z=uOYG3}>alx&}fZ+F=|JtA>9TZ$HXm*ZzwksFWH!4 zO)YFUi^L)01V3V2wlw~N+&(*EEmpG>x(94e&-I>9kr@0XCGctzVgw1Og|3e7bP!s4 zB(9Ek%K1E_wMM;L=;qj+DlfDSq`%4V>1=88*DJeCiI)qX7h+vE0$&1|mLGzB1C`K| z#m}rl)9Th+Vnk=+Rur&yEvXj|e{q|M3_LGWKCft~$H@t*O=kipFXQh3)BynrAyP7~ z+U4S^*+hVJ5>A(2*@XR$jP1kJ$h9?ZOq~}=cge4Y2QD@tS zZSF0jCDY0FOrhtGlkUORa@`+phFlFf+kHCO)LoyqJ5J^&xe{$A;gVIPz`pSO-vqIi zpsy{N197T;pFUo39dy|^57<(M?;MtGot_LL<1vb{)fR7k?7!?4adc43>n(icMxMLh zL*^t&TzhD^-ya3!aW=EnKnkBKt|gkrNimwKsWB@FC;BG%#h7vahR?Z_nljFooxdc{ z1e0>hKS2v4yY(raWEI%{7D_QDynzXo z-$g?XCnZaMxFCs*)Cz=#OcDNYU`fBVeKL%VtS38H`;JZJhF%p*%%#OEW&?nKN@sPxrGt7xx9 z%l$&7Lh(0&Y!0Wx-$U{qEhl{RInhCsR`!d@-t_g;pZac;2HxdK&s=nfDNH%Il66^f z7d_8~4Il6q1o%Q}4R!F)X^OFH1;$Ka_~k%JWj8-YK8f9rNHDt+V=lX{J#be0D=mas zT#JbMJxc5)MUw3tXu}d}9fbJ)4kd?i1^Ed}vTh)kbV}aUn#5MdL5ws;^I;Zu2$Kq( zHZ9c5nLE9fM-<{;25cc4lEw^n6}HKPOV&UJpZNN{;gJIOov(|IfO(Df+?Tow=5>RZ&otpH&>I+2AS zveX0R@&4$e3`_w%^pb^IQ_M3PaVr+*xm#brLqJ;JELaEUO6mo>P^tMRJHyyvdrQ)0 zt(U;FoMcO1SN}=}Oa4N|Js$Ne*wWp!)&=E4kTP^+8Xc%!*IMP|{9}gKI83EIweV~A ztbq2O`7rW2v|g!q88c)<&DRqQU4bU&-%2iXaZuePW|5)--I|{-Hedd%$(<{Sx)faK z9?cIhbGr6PG9Dd-{goXEpAzk2cbUZpmnGRuYT=A@YDaI+h#PMo(}~eFR@k66*1+bM zC|MYYruy&;WJ`)9GO<{O;7`lG{4+qlw7D@(#@3vlbKP6T;_+ZKvqaP3WzsTXhG<4W zr**Q!B?%oPMWtR}Xm9;`zc&A4rBE|4KRT~=$1mJGJLqm2Q)tSJ?TQkng&0Fk+lO1@ z!Cj{vDW}Nzuwf(S2)}8YnR7S%*PbZFv96ytDqK}3j3&3=u7R!g-ycnB2UvTyGl7aq zduz65QTjhqKCc$9{%rO0D&)3E)`U z<%>24xLAo(XU?-$3*AoB?pehy&o}fGOW~ornz$nR{^HB6gxqowM{`Wh!tGwQM1`7w z1lJd5f0~wE!hp0!n1Z2hz(Y}@TqX=b@yqD}27IKw!5)p@fVzbzKWiUF}9%&XG?c>KHSxFSs)G~q4bRy)tPwa%EIj;4f;8V_j){(^_sd#LMD zF_t`D+>^B4<@#HRWCv1pU%quh)8>&bgcDbm(jpDw59KVP-P&gr`SfpkGJmbj9g#hR^W z%e`!0{VS%hmXZH_elDAK-E;vh_rzVhoB6HwNbtQ*ZQ2-;7wxsoi-9%ZULJ+#H46-R z2YfUXZx1#SYNc}(%lcsx}zlKJ&eFxy~tJ=dti*ATJQc5SL)d#Dt{L70txj_RH14cZ7_Fhj}Tv`Z^Ct zK+e}Q%lC6BejW(Tj6DjZ@YDB{h`}M1B-TURa=KspBTv1&O>d6kf4E9&$Iurcs@jd=t zx6rSWNmM}I5c3KyOUl8bV{`;M04jA729;XFi4FvP>};rSPV|g)%605+N>XvO6~5+| zqCKEXgVMg=4@^-g-5G_sz@{(^96d8o}L8A4QCHoJ`%a;}GM=yQO8+-q^q*F~J690l&loFqma7Mi2+O-^tgkG(~7Q>SYn%6vqM^scN(2i)I5|T{ia~cTFLXhq6 zU>?v(tBQP6AW8Inb>5-eso=A}lYBJ4PaC#7Kc3Y zef#SDA9V=02KBkh`bI=(b<=A}FxCRw_BzCSF>>YCXfIob&#+oSht}p@6^9;0iP^!m z&x)pWu!FLf%vq+BF-$Mun#)Y+a;~{itn8o_l<19jS&Sbn@-&IPJLbR9*w`|;;}$o< zmY~_o+CJXccfF=M^I|dQV!P{~IwERQm-vL_OMb9~7?xnm?ky2gD-szvG>oy*S+eGm zUYnktH2$)r8gz12xYVdrMu1+Z_xbnBl7!G6bTfEY9bW>VLoXw-B@)h?r;2&UHIdvcJ1)@ zzT679dB-{Dg6f>-7CD$L?K9CYx$mgkvX;K@0w)_>BFHqXD)DS}DiOp7F~=?eTfXzH zPhT9$eh!sNZ3-%tx28|OL5&7h%wv+}>Jl2iJ)pVFriZK~nORufx%8{KeS)cC!nuak zv0K%+Va@GHPN-VrntB(uKNsh?GNS$J1ISL5Ki0BHE58Lt#a>K0vn7+e@!=w{!I#@|Wjg5SZ<3=V57<3^Je+8}iD1x*D;lYo}3hl_8XG`Z5;Wbm@aiRreQ zw7J`(m@LUSi*r~Wfd51{aP2%j`3$KVZ@dB>)R&ntB~`7=M1tc6q+? ze;dmC|EHk@QMaje?Z#!KP$HC66;XRj;q7NYz347_ z?$&nlc6jr15U8Zskw0|IQx?Pv9YizdXfwY(MwJ`rAf^EiTeMe!uaze50h*YqINbhq zN8z!h6I4}bX;VnTHLZWheXokXpM zD>aj<1m3gfXCBC1HzAke2 zBTFvowk6ty61|rehZtV=teekr6;!ZnCq0BS{+wAx*DvqTuR<}&E7avaecpZn5&oPe zNYNn^$y@jam}Izz)k*n3F`XH(E2ey3PkE$ zoAaPNN~%HbD(j~d(3t~E&thh#j(K}(0>m4I$;K`B?Tap3zwy4GTY?&@T+R%>GOxa6 z%vaNlHIt81Pjg7{1Qjj4dH#)}PdX$3r#1GjmWaYd^UTJN=jS||ayN@MV7-4Xta=r( zdwN@#8nbU4d$W{WMNB|JVf%9^oEw@$&$!BIYlg*_1Lr)?#pNi9raO(HW2Q1_xGp@3HlVo1-qX-iQX{^Bn z&pw3iMCtew-43RK@4~qjGD!>xuNf}2-`Lx^{xT879>o|XNS3FKqMM*Q9b{AAB@q6_ z1K}z4f@Kcl_X{1=;lWv2zx2F`VD9+E@6w0w9vV9PGgsWpFdIe4;nVv^Niu>1E`V2` zL{%BAz-C6REyr4C$<=R6_ruq$^I6(->>s{=U#;LYH5{2Tkb(mmlbAd>p!e#9@>rL8 z@j4hs5%2m3>e-Dm8LIca(98b1x6OJO; z6OKfy=S@F;Zq+F9hzWCSpUDxizS{N%By;uIvE+J@?@HwWa8vR9fJ@1(=}EJhKy|Gq zzJ|2R9$8G>1DUt#gW0Oite8v2k{%~N-_fz&u_ROy9jNaR+%7QP{%0~(C{h;fSbnXw zrSN`_g8#`v1R=I#>g`j|1-nsGXuJLfkwy^Qb;M8hA~`#yVXF@K+THj#%3c2m@4&KI zmu~d!xXaQlk?D;KH-|+&+-P%kBhP8;-k`XzE(5g4{y+)%bv$#QWeLDm35Rg)DJd$v zNx3z?puTgFg`vD`G5Ynugh4c!n}CK*;e^2AopNcQSnV^DA%i0 zF{jcWT7DW46w}dxWzr?V03^5*Tu>MV?_q zAVN%4p>F{y6gK}aNCLr0(V9lc!m@9VD>e?Z@)zUeoL=AePuYt1^0MJ6j~D&oi8B7P z!@_V*B}8ika=##4d~`GI(2Uw5Ma`E^3gm%Z;R|HXmNcte7G0LynNMO#9h{>~O4tX- z2JH3f#{UY8fnY0^8_jwFmtGy~o_(&_-)AO`Cs!x^mE0OW`+mhG>V1Bd8FE1}3B=H2 zIQTRt(iBE7+(AigxBbQQSBOK z`>f-i$@ckk0%_SvAJHRjG`-~XT43c}k>1y-PuwORcR1M|^2Ye=zk%L8Dj{B*K>EE# zdVrZ)Ug#NO=lw+@1^w04ISgnxqTJ&h$wLXYgvZN2u>-TeEq4E81M?SFX#$Y{nO{ng zoZbP?wzeWK0%qr8G`+HJpKlj&%}epoolaL(#e12Bo*=qY7qXNOxcMVBzn!o1>^MbG zF;4#MWXbK;4$J0f-9H|-FVrH_8=eeY)8?n_!(w;iU4Ev$;d2pv-9CnXV$r?_S|ely z0~+G{exfo2NWw8vh?HkX2v3j}6sc$p*FRo(%da<-{943O)CW|m*oOt_Ge%XDuh6<5 zXi}@%c|VX&ObLo5Z#FSuWbf}S+(T;hR$|`r@vQu|M&DoQrdjBLR6-%1=vm2C+1(3R zfRl%aQw#$Kd1Kprar#Z_ZvcZnbcN`m6IAK)9zR;V|6 zL|dC8b%)-nq3FMfb~T>}>?FCmFNn41E5|quwEL5VDWTL45FbdAz>*5VF446X=Aj^C z*;e4|Jv}u+TPV=NzQ{h$#wVq#o1Hn;kbj&$TZ%i`wIXEqg9T`^aE)=jOURY;KX*Jj z)9>aVFeKSNf0y|1+@F+dsZ7+3?8z$nuZZ)A+2uyAol3F|+`6E@Qvy$Xiv#oZm$J<& zV1CuCTFTw=zo{ZWLzUgA| zRkQNQ!JR|$UBpC5ep1#%4t zVZN`Z=0MUXOCZM3^)tK1D^YSQGf8Tq)VqB;2Iaa7%TCVf@8+B=0vbyD(y|%^vlQCI zqh>>$M=AUwy~O7&O?Y;IkbR8gTHf3_srKZI^$zyoap!(50d2BURhDbysN;Kx=aStH z6!3vG<7iV$bP;-2#5J+|+!4k&~CPZnV~Nx7t03rW@7nss)3Q-RhkXxc(I7LfMvmzWOR`$ks|^+Fa4? z0N0vzS(eF#Q0jNEl3D+@b5A)-)d?3*;ROt_dny3`Zow}Kt1z@v#_?R^ zi7KezsRGMu=*mt5)(Va0)@gYJ8Vc+?SI65&@t4>gzdgo6s1^#$vky z>P6V@*oVeTT>DbaEAhfd6{^Rg#OevO-*sxPo|j%Y3Z~+(uJ(SUEFV#XA9Sz)*j?4@#rr#wmStG%qyMkN|K z0Ty3IEbt(H=qwZCGO@3ov?0VS-f&0t(CMC_+=mAWD;!$+h8M)y_O&I&8|F_R zmW-9m4bfP>tpZC%a^+=uzk+W6{ilhQTcOTof$RiJ`EviYs|^}mprPuAZg{$VVEoSl z@UxH-2z?U$EmG^sqOl2ZI>t56{Ih#?(iX4GR0k~XCHBN@1!;PUWn$3RA&)zBiKF=R zt|8=ElBy|CwaCPO@R_#htPOkGqM*>RQx%-)C$6E;m3c3Vg{+W&-n9QXpkYR+GMRr;$pKDq!$#`+_Ast~-5~|z zzE1xF=i$oh`1^d3mqh6JLIlFtSWJ3V#bPXZvmHwstat4RV4}lx7*HASRumvGyX{X; zfHCcmnnU7ADJolDUdS!IqcJ9=wHy2pew~^D@rGhh#C%e9R5d!j5s*^zdRtV(zn=T3-PT1;IJuJ|M684-{y z5W#gf{U1h@7+^r|j^;*u?^K+C%i=hEW}N*W4DEih@<|u@@F!K+&VJ*3ouM#;#MI6* z-YSBoY)F{A4`Gx)N*;blLaaI0HOY@VDO6%=!}+f=MXf{S=~Da`mjMzJr)V zHX`HTbhvFK`)2-{fmrb=^T*a!^2Ish5L=AtYxX!}xeqUG2RNh5qgX%vDIyzC_<@mv z7c}YAtfz!)*|5T8t6G;@v8HM!;?y^(jET+)`b_`x7**dM1;o4oQW3TU3}frEAyr%c ztRVbaT&%hKB44^$!)`xZ)x3wpub+Q_f3bjtV7axBri++*8cZKtQXCG-8N%pTCREptQ{=LNE?--_V&-*rJ!KIN) z&U->(?n^|>mv+5Kwh<8Zl|mp@1Mg>&bc~N*8EGP@_T5iQ4z2XM z%2x2ozs@~^=yrL&lkbk9_Ld67_MzuS5&x;&Di=uxvdf4?$K|*5bKJEVm-#sU-3 ze3`X+Xf=y9HC({mb+(3JAzZXU0}0@tFxpPhxG5s|lb&s49Nx#iSbUP!&q&@%6}#oS zAep(_|4E82^}CGd$DnVS=^xOK(i6dr)2UFp&Xdf#ts>uUeH1Nl>|Au`9TL=Xk8_-O z5PT5xCNstUC$zzn!q*S+9F3KbAQ@`*4$N>qC$>M}uyKkg@%fU!!K76G)!sWVAY5!! z-wK3yOsaD+1?--AeYxcYCmuMf_j!d>UCvBN;!c*}DzCp&v*(Os#M`S9xGQ z)P5F&&+b}rNX(NpD7UC}J8(u#1)xX$51XIGV&>)M<n+>Zq+iYkwEg_!j2hJ1;vo<@xyCokzAF z?l!6=InTJ-0M92hK;~=`M<>!0yWdjivK{j``e!u5e}|DR`9HNs0ta!7S?akfvYPP) zJWx&1((i{;Whs301CWNwL3GkEL2$*=Y5T#Y_Q{HpTOvII^#?J0OV?jnNX&eX zW{NztekF`WGt!hO7CTD*9i1{ugcU71rb$c7LLvh&1V) z&=eKvy#}OjK(JATsB|I(Lgq47Piqxv(p37WJe#> z?&nS2dtMeF8^YnWBx!vO8RvQWGX!Y#PBX5;pDiB1)rqCo14A8}VhMa73dNqJDE5SF zbOoQ~-p;yZ4 z4X{QK4ETZEZ11{`;#_&cq7$04MT?WD{BU!jAE43K_qMTlV z@m9uauU94;m=d?pc5b)ZJ2Gu&J?Hl4R`r(kY`fsMY_lI_*li9o;b%4fR1$1RiR8Sw zFi0$h_>#tfTuvB!!j@z(_0=r1d&u@Y(*`guLKx8BcUlr9 z`|K#`#ICWPcBX~eVw+*jZ)kr}@017p4}lh?q_Mwsd{$Tj3Rq5>*4!dcmY-+d3kfxN zxHa?S#^>CWd3h_M+oyZNaslIy#J$JxF~F2+oMB!zNgKCIJex^xf+~}f7HiNqcdp$c zq>i>YjD1#@7~1+9vWgMxR0s=yu<=~xWboU{ikpYq2tU)C(OsFwLA^H(cnto!D7Zv< znR~;R;8FvCe^h4Sw~0|Vh}*fL{ukz8v;8*%lsPel9aw#@7~UKE9EXALc34}toYH`- z7bM`*rg2u$u9LJA34u>)1*Z?|NXVd>0S@Sw5%b5^#%jhR_!PPYy$+#@m_1qCU&bpc z1O6$oK0QTx&QN3(i09iHy-;07VjIiCD`~;~C+c@yEa2o`r{4Lw)`U!7Cn@j$KH+** z<)>{OiD1Y!zO7ZH3@H6qAtMWMiUy;9{Eb|i?NOoJCPzIF|IaIL^{9R_ z`C9GxoXT}x-S{F4-(O_cKQza z{lVXwiL6M))ungY(UZcfZNFU^PmdSB6y2NinY&>5_z!PE_Oom86F9x!x(Cn`A$m@i zI$}=Let!k`MZE{ZhB&?nk#>~$o!H$DrOrygXetpa|*9Xq^&i|6I1~knhgboKje-G znpm}h->r7rQ`Mv?2y~VC`qwFz`rP;8iA>SPDV#oc!1@6(4ry&ErAkJK-K2mv>=R+t zd#*R?;X(KIu1~*5Js!Gt4FzZqGDSoEU`uy^v>Nkl1R?40-3GfLvKoT@rQf0I(>1?&(R`orZ0B9gN zQYI}s(JF}7+$-DJlLcWAd@>Zr&;;r@3x*nHcB8Tn#lGwUjEPTgFV$yV?DUc4Z2#N% z*T*R=dPJH(_y+6g#xPVOL>vi&r7(0U1H}9ueZo$AtG3pT13JwuFGwo%f z0zLHcvPSV#1H_c12Jm1$iC7$3WuoNbgyzt-{!jW0KhJpr9Cre%*f3h$lU?gF$AF@X`e z8;S7@!@cme^Kfa_bWM?F_76cdm2-TychK5`6Fz+HR%(qk(DX#!$BNw@du2;TwVRACFtE>uU)tHj~y*ThM6F(S=qCmk+Ypp%wdJ5l~IUkAz zYCuU=P0KclP3~X+tlqkYaFaVmQqV}WALN`JCT}&g&mKU zE}`-8pig?qg!d14(gYr<<%I6ueSbF7j{d&uGGfsQp+?bJ#GL(2xT+5k7&3gLP(J{N zDKAWH@d_3^j1I&fNrqn={(G5Q`095Ep$AaPWfChB5RwtIL&)<_4%v5$g-Hn1#{sFu z+&ffrLYaD}gPu9ZSq<-B?Aqf~o)R=9Ak~P;h$te*0k=X&-|8949l}RHgk0jC)+WXR zuXWVb<$G@D%o0{Lk^G0xw_l9H9mx`oR1Mam};#e<)8}34Mv}diW--y!L_f2(g zn)leI<34AI-IQpo>s?=pRUI0!Zjj`mUPtygXo52&&$JM4pom8x?$=>9oYp(Jx1lQ= zy$^yLJ}Negh3hG~h4dbrdTb&9T+m3$mD)oBClTsO0SongqZt(9T}A3|d{~UXwXm(9 z#VZXxcc%CvOTG>Z(Oz~7aM7+c2ody&sJ`8eOo<59nkOSc@0wg>yBgarMO7ZH+hy6y zavofdu~0LX&$gu$Q27wEAXb`CB%mJw0kut&hJ;~>%Yh(c6gTLb{UB4d#~|na@Ln5x zkE~7=^VZGdpF*?(`O1q=gM_8hNX8(?2w%qe z(&`9LoK`;Z@$!1V`ij31DDisg&A^*2Dly+&%W5AfMvpiMzkBVqvn`>p!_5MSW&qVX zh$3%8`jgmc_~_(D15|=gmB(1s^={1$FMZ@Yy!u&6GT7pI+ZPa7g#O|9kjWM9Fw@EV zE8;QL-u)IEW7(_GuxM!KTFluucE2otomu*vF;7PJVklR?0RY(iJ`g8p9Ys!C6`QGT z?(bkM9OXfpuFJS^K)fHeG4XcLE&N1|h4vqiSjiuVfM9j~IeRadb>G0e+*xtc(KT*W zCZ(t1ZrjV8g+Vs^F=_9~*KN!?6857&=Z~xCQU=oG+&$Ox(+~g`L$5rewfg%#1JNRv za|cR?-k(3GK4@(lwk`{E!@n` zRPMqTD2|ojiHA_+$Jf%0*eH|TH=$VIQwrycpBrds%^fjc{v!3+S|Asyr1h)#hJ^;w zXL7m2k)B4AsD`tXoci+Sj}7HrzCiOCGlH4?xEi(IQN?Y?Z__-VRnK+_QvQN=bzU`$Zi0O{}dr4ckS_I zhV*#lKaX;6`H4hup?;O`8es1;J~x_ZyA`kmtZ z7j*MesBYW0JW~9~%d)8CN5woAD!O}!i1*Q;+lXOQGht}IoTLTF3ptD=?fH~S%Izww z1O8Y{28?N_N2XrR2r`M|;O}8M($PF&Cl-;XDNR&!#-b}E(@2n}jPCq0)2SF)FM^CXtr^v`3k z7E&?MEcIN5RNBV}^7V>utA`nYn}3qPLo6D?upt!SW|Z5Nz?_#jz<5tIF2wF#BD-~1 zqO(PvOEO26Icn~_UQ>)6J_G&QoVg5abDNzA>ckFbN(iyMJ`Bk|P$Q@3MD7n*LF^x~&y9Ss9!?`r4PNSEE3 zV#(kU511I29-MNMHWhs&@=J&iOGT^!ix{?P8b{ap%-)4UpA!1JBVg_(wtF!w`Mo*l z^9z}1Sv~;lr5cM$WALp0#D)(*&IU*dG`icnwJbF6J_?j*Q5=}LH#pVrmc|;)|AxpF z>hX${OTIy&64}j~fX4~R{x6fKe>Sva&O8mjJ($IEYRs{Ccgqi6!!j+Aj?tOvyf z)c4_uOQ%Ut-Ymdi@kh^m406mW1NkIv5~M?=+1J9JYg0pM_vqyYrc_l*r3vY3vcvwkXK%;y^SLnF!$8& z@QLUQxiT_n%GCSL+)KVUrr%L+r7nxtT5GKa{%O88iX%e8Kfp+?N8(NObGp z?sK!s;fs&yB8abRXnH1a&-$Rw?8>e?WgeH7{P@Z4vD?m)uLmE0B;kT@=ekg_HMpU( zW5|i%jtIwP4rT%kH!+8z-7U&!D;u5QJsA3@qpihLEHL z-b{Ptecx1pIp&-}40ph9ZdRHU1x?}_bids#$+keV@rKF2k~{Hv8ydxH{bE@Jm)`y8 zLhy}XlOKL8hz-UVxJ9Y8<~!Vh1deBLQ7ZdSoRZ;AM%A2yulSwVSl{{waxZONoBr@h zP#}xoqm#v)=EVqOOn053EK+R|Gm?ftHNX&tE*uRhz6p2a#pZo(mRZn9vTxmTeC43` zL4Hd%7jhrjqt|8l9bkk(HxA=hr72LnU8o~^ar?{LCw9DU_(wi1t*IlQZL0^QRQS*@ zhGi=_!-|1jZcGgA3dM=EhUaR)11OJ(d<$Sx`jKjzhh2!`w;48nRk+;#y+>~Np^ubW z8tUaQ6Uz-)h7pLeyk611DokP|hrJ8EdYnD*NRHAgup8|knY(i}c?1+bsW%pA>H zyBjTxs=`0y>Kor{;W0BNnpzz~m01aZ>L>jAx^ufwcYBih;f3(P2@LM>^Yd~SB^ zt{lb@Um?~-c}um6Sp7pTrl{9X672^T>`JhdWT}SY)r(&++MkSbiu~pa&b2zvqm-xr zGBcqjAV8drx;w{_al4s4&lumbP zBW4il^F{_Vj>U3{@&-ZA4iK_9Mby+0@NRF7zb_@Z1m2bC)3|Dz-uCi-XhsP*KpA^` z5Fs;<;6e}eWD5CJl~M3Eb9n0WPOHV7?#8&L7M_lTVu$@Z>dGrRlQ;X}z??Y-!0=P5 z0p48&2FJ}s$-QgO79d)54?Ex~p5OHL`r`id#b%zb+ZLR^Jk!!VLs zGjZpDpFnHhZ3rc1*u*v5&fGns=blT_#bNvPek3UWbD{F~x-}lg_ zAFYi7*JOREdWN4K5hvL!rgIufcKZ%l=tj@ zcIn%TeYO+bO^>hutWoyoom3msF{Ixi<;r9qcN&<*;3kmrP|Ulas0q4&t!*58vhb4w z(rMwdBAzk+qLZn!_;c-KIv9`)$7A@q&PTMaAH2fRA1*qQw6a4ht8K|Z*O+`zs@f#v zbnUJwU$1vV8VBjG$Ob4HC1!B({m6zrKh225m08xyY`C?Z8xDIE-L>mqmh8a1tZ4Ir zcAm0QMnTvM2B5g%rv4>;7v3Ij&jjI{o$akT#xJBvPp-=I7e2Rc*g{TzL0Tb!Jx4&M zB*mBflxR^<0oW~yKVvPTeOZK_E=)hqAeu0l<>|7E7_?nKV6o_D?haC?$e>Omw8z#- z8*@PJrind|NQ$rx$hdRm%5fCW&_V8G+Df zs&_`T92QRSW=a|nSly_&}on9r;UYqvMgt!OOL7tz-NpMXfIba z&sKlYnQfc=JU6F@LTc9`P@;+n?uoci0@w$W*`*Qa2tH3?cbdycjM6H4zKQK%kNO5) z=-z2g9^Be%6Jgc_0v0bZ7RaLD#Lft@_3(`2NKJc@pY26RFTckDY=Pvzv~`%itkTHF zgv2=te-1VJ%Byi;)5hhL`;n0QqzFJbI4 zKB#5cKGDPhWV#1nTj&E4KPW}EB#)}fm1SV-?zeL*=Nzs@3+H~$OXgCji(0V<3Cwd!lFg0s~E;c0>WEPQW{bbcC7pS<0`VDpCpskbQH?qFtv2VyQ1 zqzl>xcyEwFlxCDIH)?F-=N_=>4ro@jEkIz`kn9ccO${6gl zEs(6R=9^|N{5F;#8|s~(=4mjcg@}Ud67vTjOWYenF$fJfgm|{0!msc~>Ezo}i4$1^ zQb+jkzuJT`Caa0rNdfZO5QcIE*=L`81lP;&>*Aj;0m=dWfp%EZf%&p=@e@b(tFKEh zAHm1Bi9<|*L(g!)!mNHdcU_yHN*ppF3iZ{39aA=joHK712VNI`XPoUedCr{eTKVgO zreY@Mt_WI1b5r}A())&n_yZ*+VY!gO@|BegfxDJ+x!uf#Y+ygIAE4`1?yJv0FgH?= zI20=sg1rsZyNgZDlsfCCUxs>kZuR=a*6GVb@SQY}2mLeH59l}}X30JzNIaT5)O4XPesQr`S)2k`GIo-FyUX90 ztJ(Cg*Ql;`URk&smhRy|PPF5WQx%>19YNmK@>(0` z-liNp9FbK$uVy(mDWMLrjQB||Bdq`k)Y~y?0&dbw(B{u&k z+dA}!IePfs8wA_l+UYJWKRuQ%#YF@tBGGR8ezH##wf541m|2GHnWu$TaSv{+$2c=* z$3nhz>Cr#^rXDWEI?n)JZ_;V$4-vQAG{5Bc9a&Z?V;^;vsJjbY**v}6`So#U^e}(S z(1a0CVgRSKB5`s5xDm_p0z^Ew8uTOTXxl8@*U?pM{ANi8-8{|l?@x`s-8<2D(1Ck^#gDCmF zS9nk!rWikYLUk(MS}Dnm{#ByymQjjvJsLd*r88t8!f+qbTB_jSj;-iIN0kS=Tfge} z<>Uho6aHcAWf@;6SHI{eF}xR(yvFme4YmF!PBW9QJp1mO-Dl4Se#CvgXqLbdT!zCN z20!OK?aS(s4(u<4`VUi`!t+3!2I|i@Y*JZVf_O(Sz3k5jE+?v}J@c*O(i7bb1CExT z4E_ZrxZ%cIwV#&rk6z1>^RvEu>9;k$FR6RFG3T7DRIo{X7Z{Mrpdoz#!loagI%g#7 zx~DD3kV2zVm@E6lzt#us_v?+wIkSLS_+|@P;9W?c`pmw;#Pvm*l;{vmuG*7c_Q+^- z75S}mQehG};|<1W(d|KashM%AI%CRlRjHN8vC6a{)bHe2A0?254pmsTSQfnx{w#Lh z`oMV49MM9tBySM^V?qTMbSXs0_AsuJ&c5to(PKi-Hupq+D9F7jln!1hdDU<};hfu3 zQ_nQfea(98Ob<8^#1+wQpJ1e$2#Y;@(o->B(jL&*+zJiZG53Ll_P&=9=^2dt!DWIf zSYxgvP41hLmV1%>2<-@v)9i1Oz|jDEzjPiQx zL1F`z=)p-u_Q8aAUBA2uKQi~P{?X*>?h(m=2)5ulb676qY;th?=@}XaH7VxzgO~Ej zuYk92Bu6tKX?FS>ZmKMCUfs}NZfS2SToj!8n&jiMr%ZsKFW#ARI}2zCHN?I~B}`|LAOrvOM;ZttqV{66e>r}1AVt1r;7l#A&0l-&&3 zNRi~DnCR}mO~oomap+v94N)5piG9+t2$)s?d4ir~VMaE3oRJ$I$P~#ncU!LE>elNQ zXCviLr$ceDL4ZN}I0Ds=e?`}4STp*x>Q9J4=M4TA4!RwPD-oQk?X z%D6`=Nvd@oAIvV5sFViW;IO8mFGNm&FR=J10l+7>n)Ms_8+`8m;+x0TLoZyhO zgFS^bdcwa<(8;Ba^?V>zikl_ka4@f3tF7FqLMhNY;c1w9fDm8Fs73d-?ge5L9(~KZ zpT!jbK<`u%J4pzyUubtX$49fQSvU{i-DPf^$a2^tTEDBr(wW9P=a z&q5vS)q|$Oby1NA(fo&LDic4xU5I3a0k`tTPpbRv0lkUZhc>ROtKaQ-dhQL$rHuxM zd|NacYtH)aS>KAcE&)w}x-pc?u>ENqJ#?ddDCt=7`Y4Ex(!S&TDYSA-DsLf5-zL~9 zHPUe{s6T;u%lqJ;%rOWS)lWhI3a;kFv`!=uX*Y+a%lyU)e|3D^9Q~jrg?C)^toN-S zAss9yT(O&v!dYcW_1{30OCW*>5rRV{8ibe8Zj$6YBs=Dn_A6R`y?@m|{obmM*&^fA zElbX{9a$Zn>yKzvvE2yWj`?lkacg3j2-?kyTk*ZC?IKS_NLwj;C&wGFG^ZcFG`{)` zL@rei?oKkt3`od3H?}Qk#HFxDXpE(%rj_+xA7}CNK5vYRlZ_p&$H4ih0gSItk!Wx~ zN??UDA*|tk+jOdipj?a%ONrd~*sZ)nUp+9`6uElpYDl+8%our!{(6x-Jl`42P>t4L zGZ64Bt9T!HV36OH>QKD(p2Y$pbLCEqvB()q*)!GLFDbVf=k-Z8R)87%a)jF0dPQ!n z`}f@wuOCzH{^43p!;{jve;kHWW#jK$OuEMvX@LI)b0@Z@7${zIWL%n2)=0i|Yr1@^ zGj9vnXYyX%fb9_ihN}pHpCssHiDk9eh)jy}0vIiJllLIoDTMyD;5-*t zRFoYgi5OhF@B|dU){Kd!K{xyk+zD z7?Y2fL2?@@!T~~4oPn}$P2Y3LHVIOorFHwK#L*aR#B0_zv+v6lw@$|nT6fn^{LAzW zGXy9yy{WbUW`d#DCHge6(mpsy$wkyW$p)$sFmThQ;Y*@au&zNUnTRGR-)uix41KMrR9a|PDyxX*VhtTY%rWNIS`YV^Nc!t6UA)8_wNcNj#;W|C zWYiyMT$O3+%!su1Kg}hm4vfL{AA?W-8m)h-BfKLo(k&5nGYu#m&2~C=%(FY7G{4Ongb+;zm?d)`&Dt`UO3PW5|od(8!i(9zo!C& z6QTVMaF0l*qGa_4tvUt>3Igs3Ut2MPB6Kru)j0DoqywS4+HSw}2N?W=fresfs2l6e zDB933pn>1HU?&2fD2%+1d{pAR#WPX0sq#IMvs1ZBScd`qWa-Lyg*XMEh8ibhFutJE zKO`@aY6MS;l29y?+>*Fn zYjd;V;)`PJMC60Nh(8laP8oPK;(!6HVuA4`6Jxwsl4#N4U2pT@#|*^$@uOz9CqI*IocB^f8#VD7Uv!C)T1+no%MHfPZ1M65hDzhxh z5n%Z3R42+LDStyKqf6YcJ)yNc081`G0-BLARV$d1R~|@3re)B3KN7bnP0H_orkn=Q zcXtL>B_E&MXsg?ET8Pi})I^WZ<(T~g>NrvvEq<#CsRLM-cJ^2#PP+#a^XxFLOP=zP zn;WYB^Vh1S_|(LpjelTZsRg&F9;#4&cv9jS&p+72D_ba{y)rg-U3ni<8nM$0yjLZd zhM|qa7j)ibM4v_m%jF+?>t{E;<$}BUiWPPzV^A%vJ-Wcw29_?V-C*ZKwIaE-Xf6k{1 zzm(${{3_7fqFvP^TU;u&-35$FVmxR_3Ye(1vtb4nG%(>#oam6uS+Li5tT(D?_pQJr z-8n7tLnIRq>K{?im31)jCU=U5IHi?pib;km!lGclKm;0AZBMXq$=1v6z&=;4IvTym z@?lbExTik;$nu6df@g;2{uE zO43S?Ds9HSUN~BHdyEUaDtCAI#Ayjbys?%F<~HI)O!W;w_|O+;GzyxF#?0Guw6i^n zEt03S^F&@qpBt9266Yv9QD&Tvq?*BnC~FlFtTq5@Q>W83q}(2mG^#Sh>4o(IS#^1@YsC|@kXbA6H^fdh+0%6Hv-_(O`sJ0SKXGlg(W_fWpzw%Y7q zuJ$NK!R@8b*QC@1^X?J()_-`V_JMK*1T-q-KuRgGWx2QO+`KZH(+c{`aNXil;e}5w ztCj|}?GB~-7hV7nJRxb>Q;6?K;1>?4K_E>+K-$r}Z_sJT-eEEJ> zYf{vr&3V}4v77K&%$ZKMk1l@2+C*|wRa?fy(9P!Jr{WuzD;z_k-w?Tlb$3(fhx9h^ zBkm>4hW-A)#w1IG*kB8GqN8f0A~nkS0V*_7h-fc;ZTjO2+4KqPol0G%8AUNb8>~%8 z2e!xHCgt?s&rkRDvxU^|Mk!+Pre9(>zK(qAJhEu`_?Je)TNU63mT!gp9*l?!R3> zwCdeGXBj8(nt^a0v=iI4_d}LC2A^+ zYeQSH@0ts(&JVra`FckozGs90P(J(Wmz~J>r@>y6oDurBNVT1!3n<*OogNe&U)}AJR&bvptseCMQDB~FAmCc;A?XYJh z6{9OGN6-3~>Cxd*QTJL?eS(1kURiW`SG4Obc|8QG!IuwFJMworu;^)(t@>*{5t2r_ z{XhR;a=&jKpdz*-li?4z;v+9%>Q^I$RBRKn?a2U+HRFT)Bus!%_eZpFbGu3shSS zuHE*GFJ%GX2da@k$y}mX^RC6$Z%$pNKvq9AEiGK9{uTPUkTda^R_OTUfl*P^g7ZKg6)RD~tLhrcG~?q=Z)-fU%+cw(&l2s7m*PwF;<!4t?(xBxgF8*wBZB>=t zf;bm}B==4k$w2W=v&}Y0RuBJM)?wxMdMNBJyfQ`>J~RM#`T&;W}}e|V{NSoh)b{nG@*?Aj~?Ui zC>ESyVeFZozE)_>)#hCePGfHSj?tP5<_;ZrM6;q}02q=mEdX&6#hcdM^0_aNDA$ux@+APAd>9V_)DtbTr*5%vAKMv$d?(k{+-ni5m?utWVk=I& z>nW~O9m&M_StZ^0;QiR=p4|O6J~fPaR7-fTp!oPiN-@b9GHThtQ?g3$~i3e=wP$j!k>nx-(fn- zsw?+<&?;O^0~3IxT(;bwCn?}2N^omu_X^_~RpB4}e!WNfj$L5$ta9_P`Z^QO{3p0Y zmF6tYk&R_6Kw7}PFfqosktXpV@xcZ+8d~_QFX)e+#MYOtT^C`YV!wX3kcn_{@<=y$ z5*b@h&_D_KJ*#*Z0`-0#Xwd1qnQ_;rTOvaIJR<=Eg)G~U?~~T{7x73ois_IRwywU$ z`I=x}wn=cKL8i?8hgL5+I2yiNFjYcx+i2_0{YoqO@8tadt{R!5dA?7%%=CYFow9@w z>vubV9sSz=$OEd}?y88S{!}eYn)nQBQyEDDC`kTp5;+58WT%(^W7XyZ`LrF>wkg2A zF`#N$_BV8v%ob7 zXg|C&nJH2I4E?F!KhxFCo$G7li#6YRxvxIfZ2P-Z(DVvxvtw{jzwI*YPcDIxB0#gg^uWf-4H_FW9W*lkiv^1HW?A-w_m`|n@#0u|FXKr&`P7-S-6baY09 z0Kjcv*(AZb-C4&c+jRsFNq73%BpTSGJ9Y>Im*PE#@&m| zY@!70;E|cWMCh`0iBanZF=lTd{Cn=ZZtCz6!(REpnWyU^Y0rutRW{5c=2rnAXd1?E z5=24u2sy0!xn@*d%WLW`GrziS@?`fYk0o|$C*xdwG1ar-U#4THgGCx|Yd?nB08E4p zSPqF6Cst5$@a|da0k@V-Lodc)m;XwMBq<7KjlWPkrC5B!9z$a%A@>)dR7-fo+?o@y z^Yj7rAHjTX&G&K*wXdo6xw02(jHb8?n%`jL3$0>t7|KP+05T4Bo@Phl!f!YwJz3)% z|A5{7>1k9VV=VD72d2wwiDgw3Q9u=m42eeq4zryN`#w|(xcO3k9Zh}V5s(E6;da5^ zTXFuJBl|dC`xei(^60*7_9-cp?N$gNNT%^8x=^0iB4)K0k(_nS)a6qZOJzs?>0--8 zC7qvFxbC8$mkv6q+g%(z2Kcm@xp1M}AxOO@*%zQFfte$i$?u7n6eH<9t#*q{n7~m{ zN3Ye6W;s{^yOxmPCs#ss^^mRNUtApypr6 zhfJY7SzZ^O<^h|WDzFeh+th|I7Lli6x1EXe1Lg6kWKr_n!fC>WPiySHQD}_k?d@yD zj`%+246FBFmAv6ddMVOZBAlE^M;(tr#QX{?-oD#&?Oa?`y=NK1iF)f-74%E*fQLc3 za?5_y;(%$G1g2b79zsR~>GTNB2v1{RO~0bt-#+KMAFhAxl1+ZXl46B5yFpak{f_hdR9&{TzmaEoq`SJtm=e!d070nJ8=9XA!GGqPNnX_F+cXKF7-kMKZ<762)+c zs&xV%-u{JVy^wIe$tTj;S4Qt<-{naA3VaXL%?=KiGPdD(tkYA!0-;>iCJ0c$lwV|z zMVi7oNZfB#YN76+#%L_iJ5=IpM^0Gy{i@IJc&fcKSoK5mn0`Tsw-1Hkf{S3^aiirP z>_p;+pUCBwnppc{tXs*s1f)vl#Z(q*M>_|;OW`l$gz;udW$*mIOi_Qy0Mv1Ik^rLG zGsXZU@_rA#o-4v_=$XJ=duHN6;3JKn{u^oq-l<+Z<&Ct_yD6mRM}rZ}nzY`h6MCd& z8Zh)`lp_6=#TZ{7BSwq$W(-toBV69YxbF2;y17pJxJ4!kj&b}G9>m@1$DS3ErTfv; zis7y+D~EV_znB%`$|ygeL8;fUh_CAYPunNsrCaRT^~&4FeT4rB)H@fwvRx46840ku z?*KZtf0@J?UtOK{n{YPDJWzyCtCfLaK-guaOHD2;gJ-lo9+@4giD<)Eg09)$PH~#E z1@ttY^;ihmml(c}!J)V)i9@1-sUN;Mt3h1s4T5biaV(GZfAjSb-(>DE{0RaCZ)Hf} zpPXe(76!%EQ}AX}nsRfRxL0I)}9P))D|z$wQ~H5~+y*z_uV zI?@51vFEp6>?T(AXW6RiQs1YcKNdQJ=LCwV5{&7!ro?z9gr;>ZWzl@vcYz`G^VzGK z{M$p17F`2->>EeKj8;hERt~41ZW7hhrx}9?4f>lWlU#7~Y;--R3;U!*L<|%NE-xu8N04Yso@JqB$Z@lHumnhDFN)Dh8b4SJH-Bw=O%K z`G*v9)s4^h;1Hm#SRp0~m4{%NSo&f5Z#$(ikA>#HkAi%Q^&<{tW2S~=`^THDSUS4y z+q?HkM}xB=t(bHJ9zbmLp5&X%kPOf|X-N;xyPWTss4^nw*dQ10{QU5Z_$OSkiJ|@X zH6q~PiUW^McQh^IEBAXJ@am0>c9L8bAR-uc*LK zo<~-$ElJ1>_~zS1l*N6oBQ6)p-1(e&-(W`=WIuV>`vP1J6aG&D-gM>z>Prd z{?-Lv$jB2cygFpdT&DkmL2{N_&!>V(_(P2NAh!X+lRwb_ zk;m3CHnRJ+ISwH~5j?!{iG)e4KaNR#5cmOW9qb-{IsVe^OP0D~Cd0q$f2fnG^iquP zngn9hNSTO=GYBh%wy#ikV@792w{^D_CFq@v0(ay-IA!&4gZw@up@jnYt2JP#M1!Qj)!#S1ExtHI7cM(fpf&-)kmn2AbNTI zCz7BLRaJxc44(2ioXohz=97gf`0SNq|3#mJ;bCR?%O>*?1LVqh{a;?JFk`~iet&Ge z!_diMm8=Hc`s;16GAUef~mPXeV~&U`^%nBw;6F z(pd?9PX&(}UT(D<%V4;HnZjGko|9IBHt96L{Zx0o=cfj#Us~<2YI*qSUDn|3&7s$z z1L6&omCcf9_Uf2-oGz+FJ#678IR&@rL&s zSoLqh`Z(e?@bH^;hU1V)nC6Ar4RGSgmx{Iu&Ga~ngOUEM&Z=|YSyGR>ri|tIVt_;a zIFrU3r3m>!D^{~g|rNfb&a9}WSMq(b$ zSBsc)9W23#RkN>X)?5?Vnl09jn`rRPm1lC0-Ta4M zjsDA7L)*bz{~Qns=?aT92vygP`jq14{CS?Helfm229~V^r&_dT9M|((7>o~U<`1hy z=Wxv!uzw)^KDsX*p8_ZNSq;_wwH!5@jv=N=iY z1d^jK|K%`xc(}?t0q!Uoa10TW8R-OWduJ@*o=nPC?jYq$W} z&eo33&J3mk#KsswHF2OC^NKc-;q2w(NclLy6Su#oa*)kMAT4Y7HavmXEB4J5VPPh~ z90T?S$0C~$;U^Yry(mcNPrBph*I=nQb zhoMwfjD|g2qM)eGOBApzy$m7k&p7R7)hw*(QreO+;~=h;f6T zrKpm^jY-?(B<(&e581BSx|;VbZrxr-@1JD9u8Cv{y07+)knxH|7)7+kFu|2bhp7nZ zCAjHS^Z2u)nMr%-NmiCb} ztJ$mS=Xy>hT@T3$$ytf~m^1_a$H0b|N`8_^-X_9gS>p|K`PC?vw~OsmT$iueJ!xgz z>{!P8=Z^3RTnuei6<37Y0oQ;pK%POK`uTrR_FhpO)jJ3x;*<-B(4c}*~f4;%z+cB0E2jJ{eR{L73u+CDVdD>h`9a#=Tg%ah_BVrRbLgaBS~on(Qp zUz6?iXZBoWZ(y_HH2vb4VHxEA?5w=*2vYQ;tf;Gda`x^B9D@C*gZ)dM@)0~UO1E_i z%u^i0{Pz|Cdfotz8ILt5=wDs>t<`aH%DFXuohjyV!5ZJ>wIx0YbmT&t|6Eg-6DKJa z2!<5s7T2#!xj&)2?|y_UeOmitV$nj{YfkF9>J>^^%(f9TGf|CLN6q@5uI!vQh|zf* z##i#2vj%!}Ysz1$2_lQLgAL0SXgz$=qIJcUIQTp70m}w(79-dU*`d6|(5WC!7LvU& zp4MX6=6gZ)@q+!rlDS}vi)5s5g=)&XZ(`bGUKCOMJG<8d@eLjt&N2NKi$Qs2&kOFQ z-PqR=_0>OujMw0T$qMihL%~V7V08+*O6>-1k+2o}r)>Z^QZf7_SYGkx?VTU5-mT|R zz8i^o`7c@#?Wno>LU_&BfjukClMV74zh1s|X>No_TGp=^i+&a4&g&g3d{Uqp`5?_) zEEb2vBZyFZEHE##48DUei&eJ(k{EkieV6!OH69|n(q1X>T#0$+w%nb5Ypc-`p<4W+ zkwu5O6v)m&Ql)A0pt>eNa8om%)eo1$kG*;MUEtA_Po{M6jkX>CLK{pQ>Sx*}*l zU1edConiFaL86l$Ae4(vlbm?D9QL5G&TJ9p?aMJ8$MR@ssfdm)J#ad-a1MZJY3&j4 z@|c<~Fc&Eoqa39Uq$qi->>k;%`d|1#us8Mg+x{B0b|%DChmL>W?4EIWFL0RMfvJ-0 zv4Fo4c0FsLKzOqKMwokuv!rlRrIs?gl_=`@ttzDLyY)oZM4-+CZU#oW2^iOxJw zux!t;g$T!`5uakRVP0)XyLG~2${$vKzQ<;pN4Uk z?AQgz1|{jPbgw)(a%o7mw^F^CWFgk_uJLszsGE+GPW`UW2I#B)1>eQP7^UGy{VP?uq+tb5RtU@l!G1?D>B(SoALpANy2sgz12ijr|B7!-h0XebQIct~uyZF-5 zYH1N;>#ZltC+)F5>@FliT5Gvvx*n$xMVy-L3l#M!u}-{&-7BJzIC0ULve#OB#O-tk z)~ZMIpPT5UYOTRpE#}%!)f%3b^#dwHRR%wiX;|6CRxVF7 z1$YY3j(3OvOBLpBe^yjPJNOeYiEj!;cR#l8@($F9U$ok)HH)Y>sSA-vXL)o*7YR3} zjcFEKK#>m6Y#=eVM|jHVWdSEyXPNs};zf6cgjA?|`$FgRO6s z>CY}Flc$}vcZYJ!VAETKUsApVHlI7-Ll4%jTt2!T+P9trXVF0^hVF;sXLApeH6WWX?xv5yeSOBMRPyg^B{!m?SgM)Ig6v zQ0-+?<0%GMG5c;qF;x(Qz2owZ^@82sh>eB~&yw_44zWC$OBSvg5NZyM4gT{4INl2* zU=ORH;GWubpNj*dcQx#og1(tDHpOSukBbV(mN`>)LORYejnleEZsq+H@t{MOqb06H3M(~^b+ zH7+kL*gKfF>b2Bv4oTK?)H0w`&!YcqmQfRF=iwtA%A|+oUc?n%JP{=YO>nvqAk!d_ zEMaL9)NprS^y}*nH}9T3wy6P7>z$Jd<)FG6cn8%<-0bogiJPl=+?)AudwIg zMw#eEBfwXPc`;IHgV?_|+W?7I_8$nvooqhz33g*jLBsn-(aMmw?-%J8y(jnDwdF+% z<#qcuQ?HuQHTg`h;;pS>z#JXCv~gXVSh&FUOwRejfVEwViUe<~OqG`>TK6*L)A@3w zQ<7D$hON_H0c>!llsRRRyuh0d9w_HSQb;MxVB%#GvvmR6-nWuKlLXd=5saRpZpq)vcZLwYOwRVrxR<}Hoo)FZ``y$1I6!c{_#+=_|84>c z!aqdB6fzl#Q^fI~JGk(hacj62NA}&X<7e0`vVC0|Q%3`YE7ZOE6{*)V9nfio{fNlS zob$zm;LcM-+@z4YcYg5g_`mKF*L@2%Rj#I{(^(7o&f~^zQAz)RZf=nI+@2LFlGc+_ zlKkySsabs&?WZV7@*x z(w{4yZ-6X8B71I~r2b9dm8?*?%4%_W?1vzhE{EpViVq8&{bNan(S8=z*Yu#~UHS@? z@%})w!|Yg_0h}%)4e$qTB^?oRd?A19dBLKDj71H~9wtKu=ylDE{=c1P*#81#3Vx(t zh`;>tZ2aXuI`Qdy#{X|53;ihop^69w(rxl7;Q!tE-i{~L&{$W%*z+{de{@SWfOH@$ zh*-+uk;MJq+qeOyvJ6jU4YE1uKSUe_pu6 z9ofFl@d4Lxj^^v#9t!|B$gjCb&sO_|d+l_ht2%m{PR=e4KEGkS!94#h!bq@-S?n@> zl+Qk(2?UR(r_yQD(@$oG%f|2QFfOv!2%pMx>73s03ko`aaLGL-WN4w+m5lxsdYPVB z0Z=B%axi8R79ZT}q)jSY>%wq65({-SRFnDDYkq;tZt=EerBe2@kir0;EqcK|7$eyO z%GSNg49qZ6grJ;j8x@|yGLZ|pVXm3x3{UMJy9J%!8#OtR_LEM|m;b{_V=X4DLG>`R zU8~&CRmWM1ammUhlxF_=Z{dc8mx>qo8>i%TyBg{<^v;?~(K(+t|1%c5`i-+QCm-sB2-a)ezhhoA z2?oZNontW|QA1f$X%8kdjf!;t{99h5feGVr!BToVcjyiF>GgHG$0;B1W(*<9xJA4g zAXJ(i2r&dv^zGkGidZ(Zvj!>W?MnCc(9JP}F87C=)I0_r1`pT;{AxcU-tclG;2f>^ zeZzF}kw>8^D$DA9j_rGv5XqkR1J2iEtDj%7X7E6CS#~hO6iFZgeOF^4+aJW9y|4Z4 z0{gc&kM2}STQfdl3Ql{|)qiFH34i7y=6%XU02*5@;6ni5%+UZI*ub<`xZ`~}6moa^ znbtyOla07<$51L^hWT6(;^OS|$b zNaxQG!%Vs(#7b|`Oy#I|QtyKQ`w$0l#*3hO2>u>w-X4(8j)lJ}P$l`Uy`Ru^41qC=#|*AEJF&Q8 zGCghVKRSAZ`$!nZzi0RLtwsCEXLVc+voRin1#6PdKWrw31f`hDRSG7^PVm0fdiQX| zGn6QFpo_*S>{tJ3UZxNEV`atczVZ7D8?M>o8|Dmr2GFieR9?@3-M$9kcH@CrmWZ+S z7AX8e`fBfipS7Wy3q%J_tg@uuOTWU#uk{C?4^h|D92!}kNbGeF6u)W{AO*UO`6#BA zuJ(Hd^+^PX1`OVt@W zgx~~y8ERRjw_Qj}Ym4`8ud;OV{KcpFcj@Tp7)8&Aj3D%NF&!DzUUqJYqp5bwmco|< zyNgp>PC9p2n$!{T2;K$`nU{)eeG47=r5~Le8)r|rI<=?=%l$j;Cz$5zkB@aq=gti2 z=x>(BZ(_J^sx~}n#Ywv#e(@+j+wHh)f|Cx^tv~ElVW2(_`I5h4s%qAk-y)rtajgF1 z@>#RZ93DFXk0C)lb5S^->_T<>nBFJ?_&)Gs3r8y^t~mfPoY_r3HWmekMf0rht!Qxy zUFj(jNd0ASg&mzJ2uPch;w7r=j;`MtXnndpdS*3&rsrcjy2D|zY25%2UD$`UBG70LR6u~1J;2!aJ^O}EC`EYDy^;FRdE;!43b%%RD0i= zDRbs&Huv?fXS%mKUU=hUF)`6)PzVN+08{&Xwo%xm2I20<=4bfudryCOlaStnz!g*o z;_2$VK&O*F^+Wqb%(8Xw%9Xm7*{5xpP<85y&Cv<7mQ3YzmiUi9zKj}4uV*-%?Ct)O zGg0$^-k#~C7p|Q0@Oy`4u;aH!_NxjkFL5Se+A-Wr=4Nl6hSnNS({MmMGZ#_FRU+LVeQl9+anaGBJ_OK?MkoFcK5c8-8g93Ch{Ow`* zEr5}G{F>KzLSy9m4?$ebR#d~Q`gWCu0&5BPxnjlmBTLzThc@RD#Btm3%CDD;Nq4Mt z_wBuR-#TF&GCJ-jYc-nd_~a;AfT4!m@Lp8CVH?>57KD#!0-QG!?Xm%Dq(5yo?X8b- z=|G)iUrv1Y-m(57x=oX=Qz|F76I_efn-3#9z;59cXQOVA5I4sgyess$LtfSPXlw$! zqezAB8*Rg)YFw%T@qbfjtW|ixcJ)yNqnywlgz@L@`f6w8B9wdQSG7V(-V$s6LWql@ zYtlQxr8)8Ue^!CN(bbA>g$9(@yf6hoHTmGVXQ+76i!5&MER~fXCt;Cs)$ih5jkzxy zKkGhye$~NP4&kCa4=7RnVn{B^QBei_V9qQ@GQH!nV1E&{oM@%?^9c4cKPD^p-_)zM(TAVeVxH0gw(97Q1^;25J~3^IR5OTQWOlh38b(F8mp$kl13a$mrFILjl0?RyCq^FOe zNWrHaZD7yjVav>YX+`PkVe;HNv1s%ACV>%#K(QMU4j);eqoy5O#h#vYu~k`{pnd`N zK>eYl-G(nS7_KVO1mtv@JkwU%DTPdyo%2Qk+%^NWGCe>Kf7TY_sh%|{)4ii6GH5vL zW-$3yHnq*P1#`FW`SUvfE^5PpTueJ>O;&+%k(2=kafdwV$y(PZFKh3B1^x2iAZ-t) z6;DCF0$aMjsiMiRcMo0GE+u$k5ebGY_>{K=wtq%k?58UC@0vYK)DloJmf-kxr(ZwW z^d6+85Gk-{gYPhKU(4MaaH!m#=C zlB!QP$L>!QCmY;wX#O5aRlC z(~32WxWykzRX#bcFT|f+xA-E>C$S}1v$=Fu+rX50M_Xfg6?Tu5TfQCJqnnk04Erut z{5a{|LUeCtzk2_)irTv?Z6-{5Hq421YMtl@T#Ek(>&Aa8$^Xlhn{FPuH%~%QVry@i>v}{Uc5iJV;0-#3NPynigD1v&`|Av`%h4PVJ(Wn+k_q) zSPehb>H~}J>aGhHR2l3DR?0TU2u?1np`E0g-e)I|^fd+3iw2^|djB$&SSfcK36u_n z*&y_a0Ku>Pqa8IFGb1rW6n7fPc-_#F)|7{SgM)l91X57J9?H=xBC%a7bcBwgVvljX z_E+EPLOdpG-50;#(NY-_Q#;l;tpY9~D#@1Mf(3OOgkcy_{VCi~Cri^_twKrSn+2-u{>-}`x z&ya>1-{n^s5@f^b0+S(354L7tEa4G?8wfiP&fkiz{xfHM)WzD`N_NY!YQ1lMZ=;&) z$`?`hh5 zD8V5X_Zr{mKZn33r9{){p{QQr+jbq1{s@`LRpj?gx0dGUPpb1(9qZKYZwx`Q)n{tj z;Y{$})2$xx0yBoWCnXjnps~t6@0nwm5+Y4}-g&82YtoU?Joq4mJ48A{Ko;R6HizOu zJh2Dzj*vmK;qXfo>lw;51$`;c3e(p??8-0sy>}CW8Xcah-&ASHW*rI~2=zQeIM_2S zg&qJ@{$iIY01l?s*O(OwPYAi<^-8yQsJzmQP?nmdnk^*da>+IzGNr#`mb67aPjZI< z;gVcHdL?jw3qgx-5gZ#kriQD$623StawrL2df1rxIKID52=08ZW81)+z8mqap^y>f zHO2{*T1)BU@V@Q~=?P6PRw`n+n(*!0*o8}HQtuWEJd(+h_|mzrzexO#ZlXgKa3fqL zxnuLyFhmqa?CHM2Gd;b8E_Q#Hjf97}Ke#X7*i!gtXe0Y{JuRGxIg_>uj6IrqK=bam z@O~xugZsZ~Qr^0^$FBwH6n#*hpSff$6fYQ%zojz*cehypoex@#2R9z{*D%1ONkiDG z>!;_Od_32dcU>T0R2TinaFy%}MEISjX3~T`Xoi4qU->v&gTu~1 z(@a@1?gFbsj`Pk0dOhTE7qiZ1<}L&yMSDes)Q7fWDWRO&d*=|do+{yzWr5k&bU?_2 z_|@NSFA91&y{KK(T9m6n$8onj4n2fs?KM0os12O{|$b&IQ#-jwg;Xnu^)OYjtX zD0A%w~#l2NwL&+Z#q?b#%VB98c#J8~&a(Usy*!~^Oz16Aja28J> zL$gEYw=jbf-y~d;lss(Q6uU>5>#A5W_DaS2zq@FAonb)a8olUK6dZ8YJ_98Tlfjn3 z0px4YQnT5fBsKexN5k|cjk!N{y53!cWMs3se1{F=18J-e(VTIG%r|3akV8turjMR6r?|4WWlCQqJMCdQaK929Sh)#>D;{DDTSSXhSLZ!CD! zk|~m%R*FDfw2^2Nzhf_?Kh9*#oa}*vRDfAqLB1n&hM1ku~2RM_{dGTZ2!FDBI#cH5k&h^$2&)ospMdvoF z;Zi)=>N;@$nZhSetFjh?6zzL*ZZ5t(R8m$FzkNRTCI4g@_~03;Xffe{fucK(Q{3P8 zfoT-m{e9K=<3OyWF5oTZ+O3ah*w=ppmfed%X*c?B$kQ1yOGJ)cI74YC9nn~0$&a9l zN=h%Ok^_C3M6}p~Bi0>#jjKw(WVsB0RKCWz>y{E1w zb^d2EJ?9S;a@oIkMF_vU$jR;1nBxL5UtdfpPv=#S4Np6G($a!v&%q-Ww21a3d-5%k zlOOR5)~yS%b_=27DD=I>2SkOfA&6BtW`yM!y@@6y@@Y2G43vE;hG(kC^XzjQivh z{qB9wF@22&iHr^t$+zlnWy*DbNz@Vujjp`6WO}j|BJ+?(S?ay4RN8UPa?N5anztqv3>JIRb! z>#Jd`-WEvyQcw8IJ?s`->163GDaZH_6CxyJM3N6)`@PhCw0N=mY z{x;2|6HHjHH{{${piF|XPvem>M_gLf=&z%jeizDC6)qgwr(RQ`f#8EucGPzOfyvYG zD&+=JHzg8q818Lr5G|F!hMiW#AmriTp}?z=T-x?7WVD4jHI$4<@j6u2RI?)yU7lVcyOvt9gH-o~8TRcj{kKAA#P4 zt!B3|!T*zY(i7jtfx9`gKRtS1Fl9pIf2JJ``Q_PQWg~z&%)x^4+G>mfMF?FZzN335 z&RNJ8_taITS193|<&Rqty?OLq`Zl|>dwO^a%xrJU{D}o&4)dFG`@Y0T!b zYo@$VBWqcR@1}ds^~L-;ojq0!$Qr~D7>rtkazBXc0FwgHs5s%Ti*wMFhXTBrjwiu#&j~|; z63%G-64g0_(Ai}K-fEQ|;IdKIP(W~WGiewDIuCL3=B}En=lbDS#=m|0umMm9Xik1P z`=$Gf*wwFB-CvWzwB8Q!i4I+uCn;zR5of55Z%kWbZP5Pc%lpXDaB~Ysl-$cLmwc;G zV6XC^TUqp^CJN#6;NQ@Dn0#wD6x1^o=cE|2|7Vx=()9juZe;mrji97l^^?QIw^42v zQrfcxH@{oc}CzWRJ=3Exu_eV0_6A=yZN_#tc_M>dD4{R_4 zn=*H@b_Ko&5esr;!#2eq;~sb}u+M(lTNOHZ+!N@}9*|u<1C#vw^EtCvZ3e_2xIDkP zhttI1vvvYN3Amy|@Q+m|ud=Rq^E%CWsVsWAVcIMZGD^a<0+1MFu=YMpIbzYj|ol5zT`}QVCy+{-57Yf;ndEqK)t>2|=sRf3Y zYj7EW=#sr=fRh_ZDd6n*E?gVGiiw#BIc*jf(S0STYw0(hJ!2 zy1}uA3ZxV)_<|?=N~E3IaOF+~Pz5IGF1!D$0vr45R7BpG{4V%@nbbpLoyCu>xdTFr z$OUi@u-+*)$>_6-DdXtdaqMnNRZK3_SlRXb7{SZid_ze3>Y4f!rzwp89)V!e15kmr zJ~_Yw2r?ThwM?yw2OG(&IDU{T(pH8mnoWp&JvF5Tuz&6GC z`vo~#JWO6V^g#3c-dwcI*))CQayZ^FQGC;);>qJd z*)TQ9Fyk+a-f2C4t^3U<6+Q?43K8BfcrL}?b?HY3MkdQ2#`c0mX`0YhHg5<&6u@W+ zPiqF2{A3NQa9mQb?thW~G4m0dWWmGmLH)>o8|(X!h!q1;7(S(^^(2m_;N78JpJ8Va zR69M%5G@@Rl6Sk~R;lfEK9M(TDR%-%wPqQ=^vwyg*x*FK@98fHGa{UCDibibL=r24 z139y~mr^!{e|1K=Lf6L7O1?~EeZhiFsvzau80Xs^D0}vq=0lbI%^8eA5S+tU^ znHo&q{x|)9wy^x?d+mq*E|5RAB6OAe-2)6voSGf}fsy%k}) z9e+Efxb#YG1v$#-lC7?tIn?R|lv*5P{Rgpe*u|Q+zl%beW{Kv$;^}@v_H0>=?(SO8 z(QOwc7}w1H#-U&9k@^0uYa0AxDN@+NbAWPwiaF|K;dyBN{mIWwfPCcD>U{x$N8ao& z94Z`cR|yYlz7ZT091W>1B+B94agM-YhXc?hDWA3%?#*ZfFn;fUyAYK-d1&06_L+AP z8`Sy!J)MsnbFkh+K@1z|cR2!p6%7M8bFu=(m6V3&;Ka~PSNmxURUfmpsPFn_*`$bixtqC}GuRqG zoQw51*SuyN;vR$WgDiM=JINEkNiVJV-yZu5S}-hR47qt;xkVh>FnOf)_LJ|m3qB9A zN7cN+9T} zyd#*yMHscG>$k=Ccn-3M1wt%=T1#EsDoJ>?55au{SdcCR$4DnwaC{m0Vk<(BW_rk7 z`8+m7LAq=C`!%86$*(du$-@wmG5NkJ*_mW@I|KXK+WW+if7(6P#!wXbAYxSh?WBEx zvy6(Kxm0mTbeBk|sPo@hoH1FJ;sfC7d)7cbpm>yEG2t?Sv7>b+IMOI)=;hjz3%phd zP$d<)JXMZH8%ToIQR%pR)Qtt`sX80O=Cw*~Sp~-+$U|Wf%Tf+x%L`X+hA>_vn=!S64|0kIY@I zFMo{~Ufgo=IdG%C0aiO&v~duNA`L{bw!)3^L%dXszBDF&QGgG4xuvzowq(m5Nj-C{ zd=NO>d^`r&=tHSR`j%xdbv&Z?AV~$*su=moV2*PPp%4U%}SHkvk)jdCP#g6$5 zE986Eu4CCi4HNuVBk-v+cY247y*-to)dYRnsVH3<_@wb!(@pVSb%7b|Zz37Z&KE2@ z(!Vjf;f{NPu34y?dQ7@{3Y@P=0uOmf*xM1kU7tiW8mIGgnwsAOFBpuMW~9FqxGM1# zNYErAfdd3;PFA8Q#bWG8f1r8hUyPh*$}BY9)udC}&57Bkf`p{v$k|%T4AuJtK-FxK z%*j^JinWtSiWt`Ft(_+73C4==x83clM#YV}jYKl+s)a&FP}kvj?b6xEbe6GOq*da3 z;HUU_7uFASJDOtZp*yRPSc}Yg86-ca*M^@ox0}PrWf|M72xg%ziL-lppzI6oVu)LE zMiLP!X=4W3pQTRkw3Fn>4k_~(n_S|XxAUAFncgz^U*&;5isn}nR<$ki3zc)fsqD_? zl;8mo3(mV5KI(MN|2%x0dt3Ke@fz8rt`@?+Xem?DK2Cq(`f-_Uf+QD1Zm`_%JbL>k z0K8J4OZ3UKN5$Knt)WQy9Qfq$|Avn$nyVz#Yco=+wf@o<04aY`6ft1SAVLM0k9HVbFOS%1VpezJP2$jDB?Dkgq z6$@fZOvV>_WRgA~T=3~@jB|_23pek7jCMXx$9JgF*E<``n#g zY5u>8)E|RLM6te9j#tL+S_+b4=z|zPd<)C3t>=2Paa7zR`r<5?fhF92=aq7)myMlI zr5MgF{nC^14|C;GbJ%#HOIgwCY$*VX$rS&+h|RDz#NS;=)`K%Zvj21Hc^$uI@GaW3 zKHr+9Y-b101VyOGbi;E&ERX-uPCy!8`%{h4t7>n?$~RF7oUGo5Bpz7X)7E965WL6Skj?amGE_d5WT)flbQ zAwU68%{@cMavH&SVxhn5?29c}|Alk*4C#O%WT>-qjBoo`G|@&7U{dCT8V~l2F`$LA zUibw9{~OHUOU^yPXH7XG9||7GNxz{CUU%UMV%8T`E*ksp1fN7O!9^S%Q}@fQ$EjjcY<@s#89)^?6D`OijJ*D*WyUDMgf%cBq@s=XVEUu|Q9H2o3 zIqdQ|=ae7q)&pQp8Vh`Uf$=}O7=0V}5>nkH|JC7IY^JxZNkF67C@Iew%OL)}{u-zs z$#s{CJ?yZ?f5*Qilr_HWAIHk>SxJ<+V~=kF4}8%em?bqIfCYkgH5 z_Ss9bwL14=#Qu*5IYLaV=2Ff-Iz=Ol05|*tAhfm#?5Uh2&fZS)2c+8s0U#p7 z;C?rUoc+D}#_>d++i#{uZ?o~}JmhgRid0x+?hcA7uxQi% z!;}8KZr-neuT|}v!qcTsRuX>txZC)@7KUQ@EDBEtwhu(#P?#uBP*g1a)eb)2+6bCw zGKLsVJ1UqUkmdTClQf7^z#~IGMAzjSxC})Wzt!7fcxj+?3}c|maYtTeQut+(-&3B? zzA9}gvJ6cA%8_~WK#d$*z)Y>$qNcuN`!0*|i}oxTK`(|VDkMiuT8d>nj$}949Rq2H zf6Y3)BU0OMwGj+#aM8txhS{F~=;(eU&QlB!rAcZg^%iWVIbE(f+ESKj5xr~i)pS3A z!!P07RvQJ7q(#^}!n{cLK2vTNVs3dwJ`O7+-%^xB^w2sjP>#H{g`ZZ>o5IU7KQi5z$(Z` z;~>uIGAY`#bk%XU^?Q4+g5CO&GoQhx@Pkf4esaN+(|rXWEoTv!DO94`Bp*9VA2QSF*l%6rMvKPgVw* zNB0s8s*r=KU!&OB2`$WY^ojIu283!ZkrL3us8}!;;8i-My=-g2&y)n04y!wVH6x}s z+}`1oP;m$k>3bbZzDVm1oy9q>jRg1c(-fQVze=>e%9;unG`|-Or}y!_7u4b)HcHA@-tKHqu*Z zLjzl3Fe}nL(7 ztaj3SPl6wUFB0P|rfYdcs4xF(zrsew2=u3;337o6_U@>&W`sk5tnCsQw<4_3T<LiZlvMe9R^Z69 zX}8Q?5XU)J8Wy8TkhV~Px_ETA42&d(-+`fsozx_x|GW~m2bdoBjzcq7dn*Dr+8>R0 z5zM_@R)mDjjqXc3aLvm~dC>6=!21^5do3ZvT)bf+zTzQroMIt8YqCN-l+x$w&kQu^ zg2t|nv_k_4ZiAK;u%7Laj(kro>(`L$qQ> z#Cdt52<@EPn*V};G0A+b4HYl0JK1jaNzC(}Z)HPZ>0p+nzg+TlK;ualVU$=S{d#{j z4aMq9F%2fzbY*sMHYblc<=RbUSQR+iU9J({RH1LCORu=dfQO37%~=Hg$-)j$coufi z13eaFZ#7XoybfV{RfcnmhN-?rwDI{aXeZ&YqV8FeYGhW)>ja=7OeR z$|wpAGcx#%nuUU&9-E9=4Dy%Xtr+SOKHy(7`&S|SKpgO2Z~0U&Q@f7k$AHMoI%gZjksU_vL_EtFfe~%XUJSIT@{rbP!$%h5iOj?3~#Q~wohV;;v;0QA+GI9_4 zob*J|&ORexUEMIWT#_UAhYRT&>pI>N?#J$)S6G6$Rlr41#)Zl5B{}nUiSt{ites6Y zSE_x{^lZW>zDwS|s-kaG@OtA|16?or!{PM?b%ch?7c^CG_Ky^qO&J%uS~nJDzgCWa z3iZ(ZtN=!ie)KmZzob3M*h3FQYEqlK787T;{Cf~UrZkS1V6|5Lo&fH#-hMvk{i-U& z6Tp3{I_lf{WNbm|>R2HHEG%=7887-uW8D*^q5G zFT22bdR1&8<3*(4tT#kz>Zyg= z;jlKX{1s#vQH&sfvj=q^NEzXSW0cjKk@=9pg8%3qwbW*scsGS5nle_+U2bA}@JQiv zG)VbO4tQ?0w-DJm*&)jYW`aK3^wjtKI{Zarvm)TB)GyJSenrt2BTiuV@{4Q>4fk|D zXQfIJtcfL7qRKco^RlA6VZ_#$v z>8mzHpsmXdzKkS0$LrjFv>};k`XJsc&Ydm4M|7Q23lGTW%7{^fniPr~{=n+BPz?eDg#rLMhkM^p20F7cGkIzc zRlLup?izF1nb|98Z`54jr-jOTp0hJ&6$+ib1q3K6LU?Mr&J^Wld`@Y~hmH{gIP*Ge zt?D_|;IzV?h-HEUJmG(Yf1fnQ;zR$V>-K&%fu5%5xOpQ212vW+e)d53zcIMQeO91Z zqXqjl^LwAm?;z%7(OEbnvOI0_bhc-i_r|!sarus+c=9Q3YuYVhM8RpTIR0j~v*(TM zPi~9rnkJ#=jh@Bw9N=up2JmT6Ll%yE4HRpr-GN6Yf68H8-l%L1bgas;w;yFFwbIo3 zFgUtR$JPW&hIIx4nz@(f}gw&>jH`C zKUIJ2G;2BQ>%_9RUy>@4@WSuD&W#>k#B>7R5<*|cl4U}oRQMIG;f!`Xku~1HE`1FBZ57RwU2BB1CavDVYdnTrwXml($0+q zi&d@HE!~Vl=T|X!Ek6F5Umc<&BqX^7far4|4gNi2F`;FB%G|@BWHRHNPm`AOY|_8) z-Ro^z7rA{_aPffjAn#al&`L7unlGW4gtzugrw_G0+}%vr5@4(n~zMud3zj zF0`AxazH!Rgl(bm4&#^gS<6cHa_l{yQI>x^pchDYBWoKS`RWX0Cz1mo2-+C@61CQa zngtWo7eS}6nWaKQm(|Owj}xMrGZ~`TY+W0Ze_@vhQBMm!98ToY>CGPL6wZTaBDSb! zDU6(qAO@wk3WA=i3+{Kxo{?dHpFt!-Yr$KtWmiW*vQta zRi8h^nyJEwLi__O0hkcUqKE<%){4o1EQ^KOf^2HnO7Ceoqfmn3{w8DI)uZ%UZ3OP* zB{1a`e4_illTC3cMLwF`mbb4hdSZyennxO|^ud1sA(mjje6`L;uMl*!t1E22yg#25 zd(~ysO_b(bUQo>GYEL0Q)ZVDMiNKT}ShloeD%ShLw{|yIW!0gXAz~j2LkWllJ)+D6Ag4)5=wKn0 ze}R5IxB<-kEqUassy;F9yTrQ$2*p4DF>ZKx=`qrYB;cI6Kw$E2kTKW^L|_a zaj7xEbh_$9=}-E^S!20-5&Rwz-?RY>#;qLk({OnwyAoX9%zgfc`9iGsABI1PjL>0T zvgt+Df%hJk(0J^4}I*?o?jo*@}- zs7dW;7b+$V5G@H5yM`yZrggL_Bm$F+8Hp?x&yBeYtQY!G8B%#@KwD)XfBF)rhqEa! zCpv`TW34IS{A>2T;)d34{&Zm7`3kw#4-u7`(Y-FxqRsL@a%fLm4rao25kL*?l_In) zd;M^px*;d7Bld_tVc*3 z%0oFy7}YJ;&goucznkRcr}XI1B8$yCK&V&V%Hx&cxJFv?UXjS&3T zN}KQlPIy|JzkAK1V%5k`?j_d7{YNi~O5GS6v1LM-N^ii_d62Yl(oJ5Cp7IbDebgG0 zeyZPO!O@jFl+Ib-7Om#9ayKs^Jfuq$G!m~Z=D8FME*^^wpe@7_Z{iQPV>@?00;j8p zp919oM~|Qu5*ZJJqajkGhXDi2%d_7R+V0Fc;FM$Rsm-4ZV0eK*w$l0wKqk8cDB#`+bI5Op}IbPIg?{E;ET3 zwyP%xl~j#jOQyf69=ydpcG6I-J{Obf@_e-^@4g(U7*%_VHa9?gf{&%h|H9uVK}~}J zI=Ksi*q?w?T^}X}Yy@7~3tmh-%`cocR9*~%3wz0ZGDnxyTXA`J4t;&yd}kKC!29~! zmj=fI+t#C7?wehI`m~6bXHZ^LHKH?qr4S9gzocg;x9S8YJdbvC{~y}kE2^nJjQRvY z5Rodq1*NI<-U3mPCLk)WR3R$Tn@9@+2}S801?d(L5irs_p;sZ&C6o|?AUzQYfs}X7 zJF{litXVVP`o4>~$R#A}Bk zL!xl@+nJ7JW;+CqVGo zM|uBY!EraR{#vNl{}wdef@A;)c#qK-J5n)mz8{)sE|K(cNiL~T--j3& ze)(nyfAPvM#s0wW8#?*1v6Qf94I ze)>LAIoGiYIwKyvzZn`d9tGGZnNc7K(LonoXe^YF5l3RTfk)mTmCDnC5<8G}X^UO- zpg{v7R2{x}3^(kgRf0o;h2UtW9Jnsw1myKiQN4;fOkAB4;O5@(%( z5-bdC@LGj#V}sC#erkv>gR&RLW0xsg)R-W6u71RQoOF9`KW%pM|le^GA2P$W+>AXMQ2 z3wn7W!Zlyd@fy8ICxX@0bSbH+=R9X(xtd?lSZH79%>SVW8zFn)f-#Nb>V2mIC|8_C z#G+d)-OJa`B7OUxL+Rpoyx>x={6S{VHpi^cX;!1P z@l|X3)_9R^rfwR>#BDGTZR!2t||(B@Z@tMq{?qBMQFgf-yh&2DnFRjA^f3e;`{M-kTZFcMW7 zkhSp)r4^VS=<)_2qR55qoyA!vOYo3wB2U4mrD^x~EreIwGcliQt<~`39!XD~lNyM^ z6S#()7A{wEI7Ny+jjFQ)Vu_mjLk09eNg>7Fe@-#ILdd5A<0)5P{U|ZNl=P9!cgjro zLEE$HK0kqd{V;xG3QRJiD}?c2y)?oe2oQ3xd{cZ z9W|(a6o;pXRvfL)e!P6!PUPiYaMPdgE4Sw6+WFqU&gTDfeZ-Ojo8lr$pjWP;xwqi_ zKh`KF<<-kQZaxC5B~Oo)q|(B)_}t!JC}ETW+cZB0MNyvukBm5~7wuCAhjx!Rpto+= zf$%On^dETVoK#OPnJQScIXt|g_JQ~M1dDz_Ezy76Mc8`uL&$O{fJtjehGW+zYL${I7d?+jptid9T=U4Cl(+BW zy#F%b5pjls-dMgy2)Cyi=68W*TjxNT&BOeDm75-K{%K%j zzZOTemwxubZesvm1p~6%-s1zrsN!>Qen^ahg8RHicyQ7|?!Fznc)!H0iA+8r_xp>C znSie_RF_)$`>gr@13>owgAM$DE@PfCD6aH2EqoHS`X!(|@?rz|E|!zI+4hBq=U6zc zB5_Qnd118R=%XC}kg22paQg7$v(Md< zN3Ttu@;<8gZul^3c;`9@*t6Di4L~q?w`uv27rk)Gu}!D5#h=nET_fZY{c6&_2k!Hj z`B@szKV#TaVmlJpFf#1*DQefP=+VzSMkH;O8c08?M_lY5p`lPe7GtJ;3Qn+gK z_|S?jg9Jwuj-m$t0pbH2P*i{%EMxMeH7f)~+4N7%{%XO1q7t=uOf30n(H$NF+hqYM z$d$lYY+@HPE&IQzV={p6CC2&iv+Fq;*4g3;ISov{}H;#=&{;Ny#!s+hqG| z!ddGUDSnqsPz{0&wOVP1;M9alc#9#1}@q(j+aVyNyOUz0slqKAm#f*7X3}1AYb!T&T8t}%sk#WSs zHGusU4`q8l_r7bYA;luaWbXd-u9y2Ui-7h;<0g~WV{)TXLW@V}vY%8N+UKFYkCoVr zIIV+f?btm$^I2P4QQ)K?(zIai_rvy~UoVH*OZw+~fEm@0qA8t?h(8b^L-7@{ zAv#E^k=LWOb0QZtT#PL5C3>72k<9uwx}Mg_6;R#93t!Ym388$foYn;U0$yRTiM|Nj z#pcPC6^zB>a9$@Di=fR>@i~6maOyYk(qGB!+tW!_B{wMEFfLLd?K52;2I;vNsohMN ztM~cf{1CIKgbWDH#+3C<zQTHx zrKhu${Z_6D^e`<6yf*CrGy6JoNKQ&v7UckluMXBCOPdm2Y9^4cu3d3U=q*Sqdl8;H zyfV&LUsm@}X(6p8T`TSG{#&u87dYoq0Yk$`s}@?7;dyUA0uVY|=LN8hoP30z)@$cs z{bKoAJR@66_?<%1#G6OU_Inn4ygki94AiT%Vu%-F!Ge@QhOTkg^@N@d)>gT=7+2Vv zR$i}N+HHFLOe93<@}ITLF8ffhM8Xyq`D$K>PK!ZI-+_&Y|C2 z$Sm{B(#Xedsy-PA-4o(yc@qOF#&Uw)0tq{7pjTazm_^0)6`@(*##=EX58hN)nD+_@ zOR8G(>N3o41?({al_eOFR?3O(&V_QBBu}mUTyE?y$itW@R9K|FKid&mFDbm-jTT0Z zoL*r%s=yym`30=gpsYaRWz#$k^Lq-Ge6~58cm!!UH=|e2pXfAbe)3F>8aD1jbpY<# z8Z^-eCzk{l1;y`FEW`3F3-4s_db|IVvB&mnc!z6YHl0!5gt{qK6h!`)0cr({1A@US zz*lkdC<#~sj{g4f2QShfX>HAjTc!JBU|6d82FJ(Tv(NQ1RlLeH(t*sQ9s{5+3MN3P z3W9_N^Ky2sy~`q`pLZ0gD2*KMsKwZ)Z*~@Iq8teIz!V`6&_9CW;i5)_W#t2~dbyKV zt&7&D`&S+3F7cZEpcQ?aV07aRLVwqrUjizFhOmK@jD@cOa;uP}H|vDS#5;!$ieCo( zLc^)!r05t#cpT^M1=mivC^-oD(4RV-a8Amium~KDwx9IbDWyH)l}d&di!f*66ziqD ztUv3UQpu4Y^g#)bZ`ykXM4KLwfPNsy*PrdLvx`>2>_%5}yt%8be2dAx(3u;HEoV%1 z2IcW%RZc0QmA?BnPrvC8?))AO%{ob@rvdI)NCsei{cF9D(^GJ#kYL*1_E*F?<%VB` zmrVAebD8Dh(|h2_+kAi5)aeu3^pK;I&Gvas`Kr$x4bu-t4|sG{>sw{mx+l1VhgPp@ zuowdf6@ZfRj?0~Vk%(Ud?H=H(5E79F9e=*^g@AX)j#Op}5o zAn50-C`wP-Pw!~Gk<4YoBE^DgAaIA4MOuDS8*1u8V1B;J5b}n zZjXuL6_0mcm30D1lmVVcxKW+c|%n*nqV%>#3%@r|A@ z`}_jMngX8P{$(luyjCL)ta2}Fi7^(Di7dAW0F%OaoH1rUteIHTe!O|=rhC?GojaU4 z>>byA@;p(0O>h96hyfrGvMZe%jne3gS4CZ$&GKL0xDc6$x8&vvV=l_J3OBX@Pd}VE z)>hM~zipx4s_^~$b91?D^Ut5p>=#zJY@eom&H2>t(cbw+GG67nvO+4qpmemFnK0OH z4$6;u3=An&Q858@De~cs=7t{)O|SgjlSym^>VemcK*QA^-ek^|H~?l<4p$Dmt2!UzBh_qL#3hu@Eo-mzaff!BYAJ98(Ltm$n^K zn?N2-_6P6sE!ZQHic{JYTz@h6kANRVBfv+b+;X6Rr_(+MBN>(=&ASLQY#$xBYQBuZ zmwnwV9;8f!s-EO8)vmwU>0!7y5b1S*xV=-K7#q+xr)efcv_5N?{XtoYs z=W#`V(9B1IKg=o40n;CPj!R0Ixihe^WsgoV;jrw89-B`Dba$unDiy)`YG5u0M-JBL z^0PiiH~zAyFwW2{{gh!Ka-voAl{486I9eP_aTUEFPO3U0ey8#wEZ}yWWjb*COJ_Rv zUrxg)*S88Y2r$wD)3N8bP_@TEvT=d_bh^7?=I`rw@2aqy+?g_E<*z5ylb(|oh)ul| z8?pn=35XZ53Qi7xta@2Go&D_hukVVUUzdwjzdIsMF`>Ev5;`(^%{pb;%jZLJR86gW z-3k4^R1f)_|%% zd5+388qH?Kw#NTZAA&+BAYw4lfl?0Y1H@{n*jC+^$i~~@X03X^mH1l@g8FPWt-|)) zW|GMiWfB*yrbCW$g$!ufGgAIK?LC?9*ZOuVzI$N9RGL?SG1vC`Kk?vA$(Wvrn>LkfW4h!Z+`4(9yu=`MEZ<#lm4E4>24gug`y)v zemDlgi}19@?A#^}^#Ul$N<>5j%;nfJ$1=yxtk!>??b)$ni1d||#$HLNVtqRiBo7D7 z5=01(kh;+n3PU}r9Pyyn zIvL7Czv$$tWhl}$^DAC+4&SAn?d)JsU3-#s3tU_~`cS}R%ysfr;78J*T3{RVAX07) zE=1Lz3ke__znkM;U{lN`{W@ZQlJV=)zYJIJ^Cuc^y!Iav61}1O--?N`iBIgGX{BoLpNQr$U>$yT3e3S3 zI~4z9I)vvlcsz>Kl$9-*beHjhlj#AQoZLHPau=_+-b5DBspkbU0a)vXL?{MWl}w;R z(G5!jL88W-2e?DAvuNLqc1SX`-g*cU+h*0&Ni^!!cH}IL&|bimxF=11!q_YC7XyH( z=qPz~ml&)D%u3|yrR!!dEh7^`EW~g1a!y}qD3<*xS|qR-{VcF(>Za*I>0TufL3*7+ zikw|1CiE;qIXyF>UKf|KX)idg_bWD@lS>R&y_ImBbNP~VCX)o9K2siolCObFg}XR` z8u1~7Gd@c>vBtP+x#^RK{Y+inM`eI+H4*2?UY)0$)ocfSCvOv9@`{dN%npA~O^3bT@8C(T#I5Wqu{#&osBi{q?%uvoo^aXPKjuT-cUpzTV#O zqJY%i9%wYS{ve*tPwu-;JiAi!zVRg7SF#~{VPJgy*u1g4Eh&cmitXql9zf39a1amT zZH&5R5OkYRf{gm~J^of}eD9i>Ghe2?+2?FT-%cgd$d{t+bM$ORsi5wrSg!EI|6kMP>0(; z(9EOv?bnSOvnIbicpZCAN^*X$V)q^;0uFd3m=PYuthmyC_B4}4hbfOPFJ=LESh2s- z)8g}O%^#zK(r=J7PXvj`K|Q;END5tpxDuZ|Q~`^#>+EWFm{Is3pHy&bh4GOnYthAV zNiK#+0dgzxK4$+AhmJe4=2`sNk{<5s_q0T3IsTXJQ)U+V34?P-{HLrG0r;$hC@qOA z-4GNRK=_36tMb+ktveBzn`C?E`SH=1LYVq>yKA@@=Jn76ms;R+&eJ|o`3Whj2ZsJFc zx$%XqsXkjVS#!>n4Zdq3!PIPdthq?h?ixXL{cr1_qQA*mG#a>J`rsfNqT!V!$W=%t<4}63DGmwz^XilIV zhvtU4P$oDN6bbx~HqsCXX{~hJ-nB*b#7v4I=L%(sGp2!VNXKAIU!puqUxIi#0toX1 zbpA=IybrQEYkTglCQR0$UXclxp!HOO?YqU#W5F$qQ6mrEbB81b z#+iB3&yiZ>gfgguS3$+AMhpFMt7OL;im!=d&-%Xfr$)C5uV2yJfw257<)@01v4n#` zx&fi9zQPORkE)pHX*iiPf2sbl?&jC34YTXGf7WNX155PC9K?^f^c;zHB72V>DxqP^ zU0^3L!b@6J*k0hDm2RMs#siw5*F$_cw=;XoS4_@-d6(T^#K5p#dIQ>mAlwVUMD#%T zyObP8hxI-&1!`2Dw2%(dh))%y`mKM?4to-|0W}GRyV~#10q^A&%Y8K zToxzRR9i;}F4r=I>40c~clrSALn-MQ`FOSF41NHvL`Hn|JT>@GWfd0WrtoYqH8ghD zghBe1@c#9Ebqb1dlRkHvk%DqZirQE71c1DZ9{%u`)Xu{^RP`e5gb4I$V;?K=<7Zp z{5+MfkmOBHAb`e=C1~k7mw^VDE`|HmdT+d2jfJt=4 z9evF+1F~79T&7*;f|bvEW71wmziw%&EwO)lwWsd`zm61Zfqx2NdQCfV7tzpRfOEF9 zsb3n|bo`0dhWgIU8FP6lZ37bO+?TyALQ9A0cpXdsxQHC1(Ta2&`IBj@UWqAE* zaL;eApBFIlVSRK#z#!yb(%0K&yip${a+1dXrX!E@GbcNLnte=(`ro6PP;vl~L$i@E zO@{vC?2K1e%&#kY*kCa`ce!vhS*>=G%s-A6%hbC=r%r}`GhH-Fi!`)+i0*}p1J(X{mp^H*)P0BSi z&P6JI`DulaOkPk@@JOn7jb{^jdiE!YJ=+_^9SI>~U)JC|h(L_8qQHvXpKOao^O{L) zPNSpo-8+mr;;mc8(G@_pu`&m_`4;g4v0-v6Y;OKe;&pd>89Paj)Jz@ZPoP?-pT9wH z!q4y0)}SxxY(E+)et@A-ydK);!{6cK6V5TsJL!CT{acE6T2T(V9IhlCAfJf8|Gl4q z^}h9WR=7{YT$eD_gs@R6Tfe4!e!I>2rJK>xvV%3VWNYt+sqw?wZm~blSnu8G4wMo< z4LgmXAWFUI*#HIKVLK04_>=0(jR2g0FVS=gnw3@e1q_@r!66_BMKM5;{>F_@7UGJRBP3j z`F!@ixco9m@jJ5y+<&mw^_q30ZN_d6@HgiGZ!{Nug3e10#5)z=Q4F||yrw%Pe^J5L zWzFHAk5!Lizq0CV*1)e)&57c9sQ_oBYM||jIe$s(7cBH=3kNj^AqG|fl0H60fx@ZXS(&%LNygjEgl&7@iVUat!d9S(*oNb@ z4yablXP7fmx-NsF{~+m6SG1D@V0!s@zlS~XI9g~`Wqm#w#)=E*MjCOj4k$Ty zV^mdR zUF=Ll68H0%5?T3{^$ep-13c*r?Oo(WiWF>ma1JY`aAd&i=RPrhDP{M*@Ecs1YnK*g ztVKr>54xjv4zVi}fyXW&NSOeQS|eIKqRXc zt<3N;3|MAz$hMb^nNMNnJlf)RH^;qJEU#socT35Adhx*P5!jV)I&gC@kAKeeN_A7YWWsKQ_*SCq4eJav|E(QdyE#-co5y19j0J96S4LO1nWqWY%6m zk+QZqlp86+^H-hfwc-5=rC*7R*QK*cikOzm%#(-~^z%6ci@{Pxur*=+Heo2ybzT#& z06Ba9_DG)ebItuTTQk;>@_hdudrp72uPb{Agl+h7A8nr&4oQ;}r=!w9b7lW8jBp?l z`u{uXiuLaa(83)2%aEf_M*PbV2&L&c&tvlWi2%o}12HK6f2WFzOo~YT`#%>m%`l<6 zl}u0V(51lXqqd-W!{XIKw2--AqFp_vL-esiV;V*x$r z#dBEMgzj&>h^Q+}r;0Q{G82%o0L2~b?yP38z?ui1V|*|IS^S-|$y?1+s8Zgd4;`T! z7u!KsS6HQ_gP;?W>ETJ)G9D&!{(`9`)+chry}PdDz`bO80_w3fW|8DWcB3f3w0k7< ziH+%LU$=(tQ=F?O$2%=gU-j2!+p38M`@a+`(b>BWLUZs>!n#Ok8=`;n=dJOsx$V;p zd$Y4Q(tf$y#Kr1JC2x8%kx~FC3dNbqNai5~^c%8~YuB`Ygjf{ABgm{jzwT$7$uu^- zL0 z$*ft1fq#+MuhJjrSX4mi!t)_gJ~;(nY%!qj2tznc2J6eq z&rcsX%N1HjG`&5CfA#5J(!3XJMhxUlT?UTvw8$W`50QfZnzx32^&(~a)Ufy+X6xYD z4=Y~@oRa^iXGwY=2|02yCU>IbSL3qgGky)o-Qm#c=Rd;ksuQ8z*s~}vE-n~l&F~$@ zJ;saUZ_vcI5lF6kQ?|yF%&Jz=w@i)Z62)dG7b}Nqn6k2l!80*5#z;?EE6N?h2PEW( zuc0}~U#*PH2yf^}tqMJ_<4Ib+vTr|kbDlJtRNBdKnte2zK^mqRkrDyt zUx%pA`F&?wJ9fS_&uR(TR6!tdX?#$pYR&HrWdUSQg=?- z0G62#dLeE|&!bO2ignP|acWBf49I69lbF%Jwn#w&tyyu#qp!f}7Qqa2f_r-u2jE=d zgSbPv$@1NB_4>J^#jRbd&IVPhjuSgJsiFpN7H)0nj5~i%qU$M+@D)Vee`KHO!4eh% zBn4_aAF`;?+}I=%@>e(Xjo5zp9zOLflbqsWw9m=LCP;EA;;yLFvk}&kEAPKS$_jxr z%`4E|V&!hH4t>@X_b7L3F3rqZ5jVo?B~4_`uLG5H@MB_lVZ;Wi(BBMSBW~R(B$pae z$#g11dyNVJJe;_p-L2J9W-@x<;FHe_i4w(qKU6((UZVFj-`?yjKC2NVz16VOK zx{qiXyd3m!=3uXRsLon;W82(yrDM;pT1{Vs22^^n&**blM)+AEnmY0#(WYPRcU#9P zZQ!pLNp!3{SJAG? zooN~GB-)-vnqsJZR<6estM|wjv0F%a2;^0<=HW$QrNGy10j$P2TdNi{GA%g<3xl6f z!0)O(e#t=3|CB0W@oah6PZp#E0LVfi@-(q;K;jbdp8|N^+PJHA+q8_I)~Qh-M`uOm zLERPc9|6J=Pu^cj5T1Yl%qw8(nk;dFJWVl&!N1ug?a zAwlbD$c_;FVyTGz(8p~Er22C}b`NkpSs~&q&ggC&e!xdAC zlc+oW)de`Els;)S3k)Nl6JB2jq-`T-)Xdq_P2~zsrb#m7_p9i*(uTZO9S9-|v06i( zCrs?H?EW3s!@aU3wsgq}lMP`^8O3fCGGB0tCkYXcV-1Dq({NrQvfqi^(8<~D!shR8 z5}dT&lqDs7trn!qAok2kb{OJl2!^kqfU_|PY)8o5?CX+knW?7guC+8;ncy@Qe`aH5 z75rjv41o1!@LK>6%X`8rVyWuXaJPY_Pd0gY_q04uW27biP&_wlGe)^efRayphww!#I1K+Qhwc&-wQIT-(Ic!c%^;e%aB8Jwa@(|d^JxwR6n@Z+EdGvF5YK$cS9yffiY)u`qBeUecy~UnZ{a-;5iwnL-6Y{LqVWBsX#+ zMU~tRj1o}-TJ=aDjta#N_6qEERSsIm{8pIn^0;A=4Uwz=xq< z=pjmGC2v2@J4>w-%=v+rX#Jdi9bbbmM{q)XGZuVIXxUWFRcDJqlFE*j;f2QOeFaPP zJi#ol9ll!b%aY9n=XORm!N4(kZ|1J*&V{Mxi4HHGp7DCgZ3d3uflhktKKSqcL~%mg zxmaMzgK*8-$)g%A(elp5?5oXHo!{#?2BfYHWW8R$m<5f&@*PFV^@A>UI3s^6fGlSk z({66h#tI!W&vO!sU!G~buOrE`beBU+ZAhUo)zhBqMk$m~p`fm+@A^dWDQEtrM%Yo)!a=XPhv_yR;HSNxgtS zMVF|Kw{83an;NrfAj&1aYyb9UwfO9KoBa)Ty)^~=xakgB_xFNiMlvARD?l_H^gtF4 zEQ$Mt#JGo1XPn(5*!)Cy!|ZPKv#Sk5CO^Ec6dk(2D$a&1Km{nLz?lF@>@9CYT{0Ao znTRK8*^UIQTd}?+m?o*@Tr)dU?{|{<_=9s1%aQfMDl zvLXG{+)^*9LoHMM0c!4JYSzeRXA~f_VeTU12pOx$6mS>u{;HrFhjxD; z0@w`Y5WODmU=0+PNqWe|3%yd6fSf1l<0$LclGCv6a;obuw0CDUeI8ZMKeSf~bcTtp zgSmjg8qVG|?E>WYyd4t%+gv-EwK=*Z)L%0!)H4WwbdL4#+mG+n{F$*Y&Zt;_Qit9L zID))j8G;AtEdknZooL6qbt+JBTorh&Px^c8_Tbur=vbP=TQ+Iuo*OzN40wJD2ho(& z0iYYun4DE)>fZwq2j?wA(YSv0&o1ZOulffl+Uh^*AIfR{FXP2U-4P@NMBOPbxb}m@ z=&a;y^kArCd_Jzm!oKuwi@;%_8eV*)O zNeDte-e`rxD6{~AxdS=lwb)cA!vGuj9uG|(h3&E?-@}u0X1tRsy;cI{fJHj!? z+Fnv5gx2IdP%)1HhU7@rxK4PMofMQ>~*>t`)ppo<65JPm1H=dS$kfyMuY z7XOc5^is%bG0@}1>l0XM1Bky{VNmbY`2h&Qn(IUz&4Bp7(xI+Ret`Th1|xgSHzKTE zc*&g`T}*seO-17)A^# z_3=MJchu*i#WSJcBQ&cV(iJ+nxywqlBfTJ?cJo)4xdtV!5jNgb_hRz9n!4H>Vpr9- z1uw+kdK0Irs`e;r6yMDMgFaRQqGid@-bS(^@CJ|`YZ&I5`DZJHK+!zojB4?xaMS!Z z`py2jLO=uPS;VE~0TlgBq$5kPgi6Wa=0Mx>VD8<8v8d++p+WBcsamU#sT?ic zf4_!iyhpA8gg2L06y0qIqozaG6?>TD&O_%HTk173uk$W1IW4~Jrd(IJ80hPox)B44 zJEHt|vQ!c`doox&B_Plwk(Hzm-eH2aCd)?-HGAu@GiE|2hi^s`25*+M3?nC?n8rxH z(gtWo4sP>jLV}G=mhWI;{Vv?`Ec4ALCtC4KhAu#IO(c^X6QDY?a5+OpQIw4+F4Q}7 z*Z~RQ_$fcuoAE0o^BUJ!2Yf_sn|+0^$#^3U+nA&yep?)s2Z)jn1gP4?iaoaSZRiC} z1AW`NxW2i}W$RDi=Ql{@ZEc|((heq%MTd%bpIt`_fr?Iq2V}#Cg07=~Sd(Q-le#2e z7NktQ=Kf-%J5#$XX)iJ#dI#{`tr-J5g?6+&cplTO%bXfB&$^6StpbpQ#`q`;+y|=K zTtl(<#;Bsx9=hCuV{j&`1{@>b*AilWJNCKms)yVkQK6loqajCY_|W^KcM4H<6y6<) z3qK&<5XNmF#81h0w?W^jvcv&7s@U*6s^A{GzWJZ8GV+ZXCOyManiNeyZ0txY3R(78 z&77p(!*!bPMk30VS2P<3s(Zx^HDBL3R8wUWz)S4?WKI2xCnk`t)f0>lfP@E&fW*n4 zOO5XuTh#n1Di`iT-V_nD4Lo@kfaol`T;zFT!0u7Smf=~VQe5?plygJYlj*O1 zUp?$?h5OSI9rEqoFcWmopxCG~GA||MC*5X4qmq>U(uNAug%fX=AE$EL`9D`N4h1oN zB&=gaxqlX~JA*W&4co$n8LJbPb5gQ%LkE;kMWM;_e-|mHWCTgC4(OL7 zB5?8`W~1N|P`h4mQ`Xkny5-}`*wJ7K|38$QtNU`v%m}pyv>WgVlrYLIjfn&$NR+NY z`C%@zyOFw2+g=qNVv_o67vrASIbGb)h_@QZd+h$i3^1!9aLAuiTnoK^H#D%!3Q4%! zOp9M$E3g)d>^~=O|5JP%Ew`_r-f|0ft;!VzqNSff(2k+v(W$&GOh18V24u5FR=tOW z+_ED<2mq%wD}R&{UI$buBm5{N!qx1%!!9$KPo=a~Gm#*E`)|#8H z<4YNPE_3aBi_m>F7S*CuyLa%R|DGB&0X+U6%t2D5<|pgVRHM25J;&{}IhIn(%mI>J z;^;pe!iV5a)D?h?bGQK_SRuLK6M7Z9hcf8?Vo2}&i{Enr{EK$!Bl~lTS>dkQ3@tA0 zfid%4KEx_gv^CcNaeD1C%+g6VzU$H~y<35la?iW@dAQ3Rbk5j9v;T@}dTewpWtO5( zwWk#YqccFDBZ~t*nD^k={kgvzbp<|!W=~qv^{wg}l)f{4e%-a!Dw&c(>k(52jRRJM=Q#py)E(Kc0DmmN>K;nIx$36F|CBt>9Z+VrS zGcFkQb5&>NexhQu8Opjc4E`YnsLy4fsa+Sz+CwWkt>ogWExlVgTXSP>hE>ukmHpLj z_UnZVyyyKH)>l1rkX=Z)68(D}eF+nm2*Jq`#Mhi5u1i5xB9(z)^Lofa*%Dw{c}aumRBfuQ@+S|gh^+}cYYq4ye5D!DXr3#Dwl*rrTu1niZGBoGbAH@5u|d@y`A+|E6Yn zDeY|g5B{EqMP~w`uS@H0NnB{7m4TUnb*yh0;c)w!()_&zl8LD3qrCAGt%JqmmI?VI zIr{m)kMN08yY9}jbb+6+C({oDxEJH~G;HrZq`h`r%2)G?jw(zIM+?iF9GX1&b8BoPfK|$WX`fXxor|BwM#o|W5FTh=`pAmPB>2)AigO#Y zJmwWUvC_Lg7m@oE)f{#uOZ9Q$n-QtBcQmfUh1FYA>%``SX{SFEMVMFbS`QO>!VSGo zO59wMtM z8pGk~}av{MM634c1Kybv}dxWYc&AQuu2@b$R9L#&Fq;s&C*58G1AY>XiU&XWMxB4MMPl`J zN0w15sDgC$p%)DF9K>Tp3bY;(k8*>ucmlFb>-fJljw|x0=EapIOi$p3=JyIU=~vDv zCU&f>Qow2ejTo??3I0Pa#dBEq`H5}`77V`EEWA}NrS<2b{;hk@TAW`#dh{qTdG#}s zoac7LUB;enDV_4uRGODsr#i5g{)y;OY6t+FTlaw#=+!QHN0|44ZH8@{D}6D2a?{Dx zzdbanLi!Rg$_jq|T>mcXS`@q%(Q`G@i%`{5qE6gH_bn(Ic93DsO@Yd$L zhLcj)-@CCEF=4u9$ja~NBYD_{`JuuH3W#O=(~Y2aN_l)ld(Ao|z#9GLSd|vdo|+WO z35tvL`GcgN7j+|S^pWysed&TuTe+v;Pyyi#Q~Ud~?w-wt0*v2OnJ?~ST~FVnpO0C? z#;>T;-v8}1#g$Zi+MZJ(hfav*|7}jTx56wfYl)b3*#?T5X0u5?@<_daCd+0db&0~P zNhzfd$i<(%+8!j3#CJpIMGB3@*nZ$saP4X^F9dh)?SjH~0w|jQWWuMi*@E6c+&ZpD4$#ciJA7q~zFOlWt58e>pC?!v& z^Cp8J>Dz>C*6-5S*wFV`!StKKxmtXRy2Wt=>yp;!kNVk*)fu!aaHJ z^LBeKE@<^Mvcyd6&|y%t&fkwEL!jHVL16M){2Nt2m_-QaGsXGk#rrl^YBml}eymT% z)d;LW)t@ynrat~2E+?rqInRH>M0l=vCLpEcT*APUiyzFtdc~3-u3q;O*?{PeFAwFq zF1LeS4PT$l&;}nJ%&(ML`ZIPN2%{~Zh5+}66nvq8Yd5DNl4S-6k_e0Q3(=lwFkAIG z*FfGsFMj*y(lsH5D3tqQ7@n-{UP1dx)u+gKVe5|5l_NzfU}{(!XB`ebXG28;|Bj7d zp0^S_8v+JRCE@QloAF_T$_t@8q_E}vK)e%kL~-HfdULvwx;&GW`>dfjaG{B zbd>{Ortp6@c#q~10ld}!WYq5<>8mQX_Fu~k?7QiA(zfc7e7$0=Q z*yD|{t8H11erqPu;wKLuKVx7zi8tUtSOCUoAG+8aYg`ggs}-TGBOn*l=>!Z>Y~o+{hb*-_V+yH}PM zWO)#Dx#7#Gc@O7#hBK>Im`+k2X{);ALnct=%0M6jn3mu1n4(GM>UWVPIM)EOBQKsM z7v~X;HPhTj7G1ZZ&#>Wz7%p(0eTMyp-p!)uP|aw0U=SW52D>)qFdt&BsU8%jKGykN z@L0v9Lx({j@N;j>w84ntDsfk~de2;L^l^*geh8J5f;k zSDP)_9*@P#|IQIUFG`*lkal6%Jdh|W?NiR^68S+DC8CD9E)vFD8m5Ayg6=jnywo@U z)pNG5%&T=wwKrO=KW7QRM1WssznI^}Qh7h(?0PalzY*M;kR%t8Nvi2*hb0H2Guv~7 z<;3^FS#O8C!Mnk7?v3!XaR$Yv|l~MVPky zHu<;q)54hI*Mh8p0P+69u{E7YN!Ad|$7}-LkY;jrm zTFkMFh4nUz#1F|1e*c^+e(5K>{5xDU;d{(WgdqJae4HB&Xb{f)Ww&M_`%m=U zZzM_=q@@Zp{cv0ob%Hs5M+XSmulF?+hE*=da^57KYyroh9$B9-v^vxeWyM4)O@1W& z@qY32&$4lV^h@>Xa{h1o{ZDzz(zy&zs6#$Um>cr?>d2e+o8qn8S3Lbn>q-d^Q1PYb zz-K>3>X+h>@fuK0XP1ZG@`1E0uK-WCG~P2MPZq!U_sB7)Z}Oj%Qna^3I8l`Ak-C#$ zn*ffLj40&Rx8=TPjPYg?IHt0gmTRWW5~}3+5Q+#{su#tF@+xJ5$*pm`n{Cjiq{JC? zeEnT_VmmdOd|RzZ@WC+a1{15)Wt0hI^%JDtt{WW(Vd>CbL&qEPH4^q~l{)zg&3*r* zk^VR?jgH<31;I5X@sjDBY@^br+N2RO4@KR}QLgXGE?6Abd0x?OsDPz3a!#NL6ER+~ zG&&X{I^r+o_lm`-G*6g0q&kCq#iIwhaL|jW+dv`7kRG_$kH&VVDkh(xPd_mWOZ(xo z;zr${zhCfOu*n)+Q)2{86y=PooN*8yhV%zb@6Zts56F%y20jBKN;zNj4T_id8tzv< zH#C<%*Do>Tr6X0L@niaTki#I?n!!~Q*xkV2QSzr?8WM>2LoMWWBkJwaBcV8DCWqgr zgIP~<9Gy+2dnWs9-;IQy)8$B2G03>*%(ce_WD}0Lu+s{u;cK7^WQmFS`;$~ic#y{n znYW{|v1f?G&SjU9+?cb^`To^7F>G=l3R%x5^EcHjlDmdAdh>B#H{?Z~r&i-Ycq!KaLj+MT#Iu?*s)zrHb?x zQE4L5lq#UoL7G%0B!JSJfPmD9fS{DnyM&HP@6sWFNKYtXAR+%9@1DE&WzU{_ANGNB zcp8S8-+b$*z?_qQj}xBZbwJZ3b!2zmrMkwpDK(h$>yV(sN7ZuEGW4SF8$MF5e0+Z^ zqF05{81dEwO5}x8ooD(l&G>fkPDhj2R=(RAPn6jPZ}$^btxMB0bG!Dk9Gwjs+l|_# zlqfME*x_=YJ8iVQYVc)^VS#~u!SOV@YMH0}$?<-q1NSqT^Y zVa~0&t)VzOuD|I^&X0qZM*HqCbFVuP?!F55(;@tYTFy6wB3GAN)Lgf9xOZ5dMnE$* z^zwDj!9h#76NwMFvi2OC zr#}<1Sm`uTf4jZ#JLflq^RVhY4i3)i(XikVs4+R@RfO**X6|0sA`1?^dvEoes=Yp7 zHXz3JO*n(Q=;Qk6T9%qJH`LA0^|mMN0ua#Ay(0yAHgTKl#o$l-oYa(m65wDSq;3Xi zalxw|OWm1mHvt6mWxdZjh2<%a_Be0(c@7M4@Vqii<^DOO>i?=-vi>o=orc%IF8z{}#Z4zlxj_SL}X+y5{aELI=L@Z6VI%>u4>8 z(N(d2iqi6(@w|07b@0kp$+Ad+)WC`V0>j!^SBwkCDqIFe(ie5<4Cmx&oN5 z0BUOT!S00C*oDHIf4JUh_t<1ZLn3wTx=>*Fem)$9xCAc99s-6Pg0S(7C!^9AR{LM> z{Y{Zm7}E{?;3(p0q&qyIBorTOaC!8=a4O!976@@aQ$PO%e!|F^U`@Pp$F@4OBR$K+ zoh%h)_&t)RC~4OW`J$!K;hBS&S0?+j_c}IBrx8JhBz6qJ8DIv*y*;C_sK`9lS{wll zix#SRT|R3t=pkA@kys}1qZb(2s1kUcpZ}Zm0w=63=1DNfbYAX%}%S0zn|=Cu6r2Z7tsGZBG{oJtSxT2XQwH1;3yOjH5LFmMt4j zI?``@P*vB|@wJD&OG8-l$o>9T->x}(QoLA4iLeIpZ-SoEA?F!o7>7ak$F(?ED$9eI`1Ej$hePkhI(RYz`Tv8+^kP>se!1F=;C^*4hrXiV>81FS zT%4QQFMC`14*fC(hzy$?Kcg5xK3rmKqaqJvz^YJ@bqnV0WS(r3><)#746AqbW(mQB zhVd!OBKMRp#zG%bTM(Md-VpR3Qxe`Zt~9iTI-ctjU*fIJ_z8jQ9G#fYc7T|9hxE)+ zk6jH-0@jc#2-Y=A#)JeS2{Xs4s_rwB1&u+g59h@{w#OJn*nHaX;d$YHI{VcmI667~ zhQRIfDd8h_O6MaK@d}CRpV+r_ELT?4Texz$p2uqLtKQ#>bJn(H3JPNp^@$uGRr;*TfGS6VEvA0Ljf$9n&ucX(PqpBNgd3$uZ%0Rlut z8}clM{YW2m0r1>-INl2T{JjDtnOl}_r07oJ0?o z1of4CmQhjZ_PQgr)0IT|TB)9^hdYvgG9RZrQtPvi$J-f!oiF(!NfMY`l@^rlQD>6A zoGaBiGF#N0@?34^sqSwbqem=0IjbU!4ihOM6BsHG&PWSJ>9+j#@pj_tU*LVbB8dY?d;uW>)n&(C+db{q@4R6>OEcQk$4Cbi~zwEhr?ZokAw8VFn!r?PTg8NO?oZZ{YX!;FhyL?N(TS)pq`tO zf|_l%?H@v|3@!yoE<@=7rjr#+q@N*^n_@d-4swu?t4+w?nYZPt8%t z4kH8={3;;qgClIO7)CwAt<5%X=?6#_X0XN~g?e=Zp3xmblf#2(g&5%xM0S9o6J)r9 zWF9Jj3oC#oB!-pf2aUHMw7xKFsLBg^pC+_Yn4k$Eb*=B~ zb=5k^^GN-kd4232UpVItVad)W5pP{c;<@sWIKi5H5j1-tAaGtgbN*;Rx`WJ*Bew_^ zI11FBd8C!+c9kU&CuuHddp~CN&0);3S3W=jHLN|>CBX0J}k&*8PGP66RZc&{Ebb&y?mMDbXiN1#D%%RS+1f2E}C z6OEg6#nWEM(rH8~75{oLe`uod0*L}%-Dsp0K;9mn&O<`IH0?&GcacN^@&JM!U@igT zI>`(*BX!s11vu&Uo~1nY5tu6W@KQR>iRX4e%=@qMa3bBkey@T!E83mWRTO)WetW&u zqw)gRMUUM1R}UTaI7ZDy*F3s6XajsvR>}`t$X+g=V^jX=F8uHOFmHn9i%TfL9`nDJ zj}@2TreHD$zw1=B|Fx!kQ4Zow|4)6B&kVu2y+7_bIC$HIndZ2^vRMFh?S6FGOt7-a z_rx@M9l2~+hZNu`T@5e?nUm+yT#y*5o$QMcNa)EHW| z*IJ9AeC?=r;Z`^kv*{iFh2kVqVDaDLu5??GiSnaVzHSfU)=ZCqSI%!vH3=RsbK;+^ zZ79nVSBZ4we&|I~F!3g64YDYv((lGQ=Vst7S@-?HFGj5p_2!81S*%j%3~TB^$|Joa z{^1?4rJ-Ip&utSWQQ@2u;g9@%%Yi8U#67GFI2ImrjeM1S>Uif7gjSjA&yb!v*Ul}X ztc$Gz*x`y{TQK}Uzh0_Ys)?j?;r5A{!Yw*<@mqQ?CYC_D69pZKM?u)E8?xYf#F!`o zzk-LhA5YgM?Pf|<_$S!h@+jZpymixZQO}**qFgM3euhqBfPvLesomC`@a#Ms=9I*5 z1=m6Hx^St~1O@kIwZ%BtlDD8zLw&zk(0hVHgNFhG?Ws0U@Z#cst-x8a==3%GM*PvZ zf9W31R=P1X_|!3Zqi=v z{3$#F!n0-UEv(i&TYB;*&LlQxf+-+Qy!#iSFh!QwyzMUQGOdt4H7YqzsQQ#9u#hyf zz}@hRRx(u8Ik|;+0nv+M0Pz}LQ5vGaS9~Jz$)vp3?o1g);!eJX&G+wJgCg;~Iw|*H zA`N_+YpHfu$)o8i;L}8bo>s#v==LR!?L59Q58iR8ow^jrw0Ba>0a}_eGID ziKOunsW@ZfN4aPq7zzCaCS)_v=;)^6M$H_Vn>S z(;|33%x>l?HnZW>^)+g&ka>Pt4kdM!!?8j^2_nX!ENVLWB)ya)*V$_yr3zw)97BIfq?FkQbJ*8u zic#^eit*4GQ$s8Jx?oI*30UpzpuknXhPG>!^`jMg^@G7mfkC!%306;hu4^6YLn@T1 zN`7b*fc>}Rd8P&vd8h%#v z?NDbX$O5@545(16sj8LJ;}8|Bd7kPf>pG7E%lqn{^-41n3e&UrSb({Q3{Q;BIC+kZac*B>J(wVUe@>+-Zu z#IyKH+C+Gv;5*(E!?z&f*N&I01Xsnux)rfbVht*fikq&)wmO))eTBswN6#N6G2 zh=Yg(@Hzd4(Vn@E36G^N_2pNWu7FTuoDur> z93ceYz{!sH*)hOX6_QKaYTTWMygVzOGxPD$y$Jh`b>9cQZ3s;;kYii$pk*$?)fWNA}W z>dq@y_;${|+9HdM$rY!4;%Z38WeO|#9f~}eFRtSGak719_-`Nx$a+s^0+;rV_`n#y z$5UCvt|^}dYrb+XFrfPto`Eyq8(sz5H!on@Sz1kh>yKhZihjN?WhBv)6A*U+PD;<{3T9e)LHD*3*om z)q^6c> zl_1ZUUX5$n@cbjbJ%`Q|_aJ%53V>mEocuC?n z&D}mo;7?WX{b1~+!$A4o+LPX48cWS@7Ju8=>v8+PCCiS3=S)zu>4ydir=QZUrC#Fx zE${=96YlNyZ)rn#iaY-g0#5Cdcoj)v8nV@KI#YhYn7ibgKU3JXd29JD^@*zYhn22$ zjBD>z*HTPZpgTn?#Nk==YGh=d8a|;+g##0nE9G%K7cE^eXBzIBv#@Z5^`Y>s7czaJ zk6yi|{j`@fgr3{zGy_M`uEDvAD^3O9Tv_Z~70hKH`txO0Sm`YB-DphL$;^1^cDE+S zj~jX&Y^1^i;IJ_Sj6B+03uCJjFg13EGS7q1n+Xtx;gGJp>yc)Qy}|n8TT0G#ZzZZ? z+Pxd#Gc$bmAA}X=j^P1J`&5>q>vmxeaC>Pb!i!s8zCnjJYLzJ2Eu%5n&z%Zi)f@=z z=xCS+=Ixo?jy*oOYXlCNK1MUw*A&zq40Di@=L>kU6z*p+OLlvf6n#id9r6ifR*m^_ z&ICjenMjn=7&kl0AZxR_iG8_T!#h*bo}U^g(VkY8a;N1c9JhzXhe|H=r+mG7K-< z1e2#W%nAJtQzN1Q!83P=GoUUlZDnx9i5DFY4Dimpa9QAW6&MZk{Z+ZUlto%;0*3LC zhu!syvMu4wQM4GcN_o=R&Mf1MYC zfHf3E1B!~g74*Qy>Icx$`^GM6U!Y>jiL>G7ZQaq+(f1(M5p&SW>77Xs&FzE-DTh&QJlXowwPxc9 zts6!yImkl0j+ZM1SHS;bhUexTDTQhk4ccGTMq+z zf&=-P9xJ*79KZ?@I*a zyR}y9*Q9&Ck{^=X9XCY0+-9P?njiWZPj z_N-J&c9paJH=8-@1QKSi;Dguz;)MUCpv#UIaSKp1^bqdUP@VP@7Yj`OG=8jFs%xdk zWb;ewYQ-P*N4K{O#MAuzG3R#=Jg+|pK7BaoV49!^D_$>7AJ;p>OwdqA9&IA>q;@k;Knhi+)vYpl2)?D${IYhL#0eP*! zuUfumuu)U3DJ1Oq1x+#PyalD<--^r3;V_q_ghNopl3~6g*|~7RjWNBNE>9;`_wy5} zC((9`drE7|jN|q?KbrSr)b3&9x+m21zuCA=>xPS@?>Xmba*Kx3yicuV)#d5cQyMg` zZfhOezcL|rx>noV@C@J2#-7aW=lDFFxe+~&iGkuCErkjSo_{8@!PUk@CO?BjN~YSg zcLo9ID=LoF!(8cqWXydP_>`A@!u3i~9LVJy7^IdNgw)c37L+so?vjeVpvN`M=W@Rq z)xPJ?B@gIkQrDbZ2yAZ;a^hL~8$Ry(9$=OobHUaK18T}LlLg@>Q^)FFx)XIuyK9#F zqG?k%yd79-<9ie%Aj!j2jns%dkcwDk4nqF#EptqFgHox~X9`WvkCs2AgeWg{sPnZ!?~3DxIGw79S_OwRSS6fsNV*yhU}8R6W%$(w_3JR9(6kZtJ~i0g}K zeT{ZIQ|oxLgO=AXjdP;YG7FD&41}hyz-BN#d9tH$WnXBt z9E@Rc%gDCAAYgCWEZsn*rPo0wcL*ax$CVnY#6j8?Z1vmy53-Hkgsm#>#H^GH6U^}* z2c$drx)Xv}gr`@^;$b(}?U@Gz1t$kRNyEMPm-bXHMzpw9D(K+rm1w1{H-7(+j74HE z?#5p4(WR|pH@JtqVmMofEYnNL^SB zbZ2_iiyb75(YMqAbJ%mHCG*kb)tajGNsrxh?{1yTLA*xam`O*&{2b^mu*xJ)plZds z3>iC?lPH4@O~&N(6+U#iGgSN_O-m79afc2K%m<1b%M(M0vT&C30yRzIt)N>+%t;w- z(D6ETZuz=+D?yY}ZEVQ8z4cf2d4c>;CVm+*|1*0mXvqu`ZwvAfBX-n&(s6H4iFGqUQOnu65)z;^ZTjE8OUoH!wGymRJ4mZq<_YAH)cgw$a$wm|T?Q>Y$pt79g7W zF(*Y&WO`e1=U=DOGukE(R{}Md^VCoeQf%%S*XT;_us)%G?kigH$N2+)Q+)lcb|HWC z05Ud@9@N`&$4mFXm=V)p^$lp(seV`83O|gOu5& zXc%p)0k)hEn-Sg0;pYFd4AD^_-`u@_p}aLR@OIyIsZPhI7oJkD)oU;8vXSXeR=g6x zhM6p5Nz%seVZJ>LdOc&q zcu%^P=t&l5g1IG6`M#D978T8VC~L+4xG*8R`y%?=gH<8MBMuNiM3^`)hF`&=Sb*_6 z`0f#R4T*H+x*LVHHM!0y95XxzU&2-mVh&0Y9$#4fA~R08w3`cxu?G`efua8(mq@q1 zF1XcSDxO;`%m`DPyq$4@KK|x=1#fSa)w!8~Uhb(DjWLdI$vz2g+#WI? zQhWVB-qrIJWD<;_jdPQHb4qj!?oZPqI#I*m>q|d&CGrW2toB#pup;d%e*45nw5jBu zNEXltQF^w9fU2F4_lgbV<%*U|xOk*f()VTN;RW=^uw`pINl9{GvPIS1R|SnG8iT-B zoGIa5{dpMPgw`kaEcDC7W++!89*-#z^DdM#81oWceY(K#k zD8=((lR8k5C^ik5dEm=*_eoaSEd!|}M`wbt$IA@XY8{uWmb_Yb-o8E!QrS@XSs73Tjef01zA23ZB>7C}{&>fXM6uH7k)yve5|e>Ot|6y$vkjY090eY+$w-w@bq{z zZaglz%B8(f0CjIkq+IP!RAkKVk{+D!ot7Ua*?`5gchbz+;mUrT8acm{H-o!FLnaZPY(C!X-0d)~{qxlQhXk-DC1XJyrZmf(u7X!uHU!-EDiN7?stcf8i? zh>}0_F28;i{V5^yk#9dsjsyS2rSp7{QzQ`NPH@M6U(CmM_3}=rD1`Z{)n~|BGl0^V z?|#_77rE+@RO2e>y1cx{LyNb^((cv}jo_xZh^0_?;A)J&01fHpyme7-T2-1+ILCT8 zb#jIfE5q}uL#HwTP55*Et<__>bU!NZI(}`snX}l7pkHE;8~@6He!1YO4&`tp|E)vW zE};~9>OXwWn;f7SWbuktL&vF_H~e|IereBV0Uhpo&Ogt+HthQk`rrNNRqOOwk~du* zCb4#{=yaprYOvrzi-&X1xhHt3B-fJWZpnmNS)03}6i+@&{c4H2aNt8yZa-5wTvptb zKsud1Z#>VJ&Kd~vC~}t{DP!l>syOtNsv>+ULKqNF>``tc3*7$hPvR4Bw?MFCf-A1h zl*tLGj9AQR3FIcH^Eujli}4=enRdgKiOd&p3$y#uoyVT1Af1MJfh2+}&bHhckM3y} zs4p+hOzG{|HJO@pa1wla*TV7r_5UEq)D+4M4$|)S)Uad4mV%e~qmieBJjsccznU&& z&mYSlVZvY@`?Efg&V*tgf@1ISCwfnBQg2G6np*dQM^M5a%RR;^Z+nw>sS`2gKl|_BNj2dP`l|n?uL3OK(onu_3#xKVmLx z&BjKz+~I!)5nq>vy2H4@zlGv&eGbCC8WJ56#G(w{v%gf;BWnxpibbm_-tdkcJsqHu z789$w8mi7l=)sHi!a%@a_5@pp9ozA)j>)8-H5bbGd%Ex|Jg2{fg?1cg_w@&%q3bal z5{4a1EMSt*2Aax?qsgK{;fLK;@x~G?{Q>I(KGIiMf*wCj@%}^!N@*K}G!fNFSMeAU zyDv5)hNOdk+vnTy^>4buTtz{3SeBN=s1~mlS2DX>zD51yPcadPDvc&z@c3Xx^Un)* z+UUiSirx88jKf&YRwCtT|Jp*I^ICNGoVV4Txx;pD;rwswyc%lfaTwha1Me{13vtuVz}N zDSzgApjTw^J5J%Tq5M0eE0K2ccJ5yBIgI>?6qRxzEJRK6z@kF!Kb6^RRKlX<1juyl z@v+bnok-uA@(|6P?3xA((wbuUW#qv5H;l71@8%#bOBEGQmYC!-!w;o? zx$7lb{~zRT`lgt8Angn`itSzvOO0pmDnNckQasN`x`LGqYPF%ujv6S%J|+a3omJ*_ z?y2(Kx7Lq{IfTtD$6jCe5j-*$5~2|feT39Px_J()~PdYoh^{+F><4CkYj8G61@}OJ~CG)TG}i zYi?&}S4PX15cI-hG@YqQgp#7yTW56x?84maX4$Y_k5R}H_3mnlIKu=!%*x@9Bq(JeqZ;$`7gb8_c`4FmLA7I)q*euleX|DMFu-G^6^td)G7 z?@qP(!g}DR!={Uv7iu7rhPoC6SmKyVe`{zS!$|nN`C@6qQ;6oG zwZQ8>wN9pCZsTP35n@(}IA zP=tK&*{B(M7tw|Eb+CTjki06nT@|}=^sN?RUP+QY|DzEw)XERdu}>}p z@?WM{i(j6e0y%>ncHk4}(AE$G`g)*T@IdwY@`4%5OsRtEh%AqpSa}PqOb_qp{2x!& za*l`YXz+lsR}owha>6yi7+~I=5U|~?g8uNHes3vQ!g%eQ(DKc2JrK35x25-mqz9r}q3V*}MqS>M8Z`Wp8ARQl{o-qT8a_x_|(oRb91m5$9j632+V7Mj|cg z>b)MQ7w3&Xham*0aQ|V|Nj33sJl;7AWdfeL7n_`@+QImDb$c%Co6#O*4mJ_!&0X5)TF{i^S|-#C0~Q%PK^ z2O_js7^V8E3$jLGr->MbUPdS*!1lAR3quRGs-AToYHW7;u1M-w=h|DA25ONULfV3l z<99JqsQO#5c>mRQORA&%=}UmXc0{<<2+^)U{tOTDkx? z22l+wVo_@M%HalhXu>lOSC8~zixish+oG-Ljhk~lm!;Icf2#E4UgbDt!3}pN2OVNz z5%5cDe`cjGZ`G^#{wnaj-{4y)+PUUXK?=)5q#dm{^hzgT>NmQXso`uu)oO7g*fE>Q z$B=v6K`B(B-;TFt`)EJ@$^@Na>6Lm7LPGFfV80A)Z?U@=wA6uN*>jw9#9xamZa=gT zK{{s<_LM$1npEd}d|JBO%cK(P?nAq44}OS?fDMjq85*M@8D!l(+e6OJmrwsKtri)n z)!Y&}Q?uS3Psh4Pt6u4wlhnJcyT)&R#6k=r2?59XAk^gAG|3s?eAqLqkSUdS!uvE! z3RPS*ocWsZMzi&OOFErohl_e9j|D&Rk`e4QSA4?_7@70sF|%ESWW3nBVw_Y1p4O~& zq@p|`XKGN9buQwfeE>xDhH+%SK$mJws-0Sr@gl~Nd==SoQ_hPD&Vgs{p=-M`Z@UB_ z?>0^G&eR_17P(v7dyhsQW_}PTq}1$vjm7ZN2`!I-a%k88cYdhO;NU3@+#qxBw?j`j z{)3DcErgW5{U&u z{|~KuTivZ4OWaDALcJkS)DjaCJmIy{psr-(nNFAVr5P9L=btUlW2gRL#{!#mCoaEB z_O7bA7IaOPN#mLO?PWBH-F&sUJt?x;xf4UXnRRI@xsWf_OLVuqJA-Q1^m|wM=zMP> zy~s;Pm1q3euQD=lVWKB_+>Wwrzl}FYr#t=U^Dl0SeH)ea*|LMGKW~exc+MVhz6|); zOLOZ$I#x};JZQK(t2hp><3spvZrPN+x8?CI&*AV^phqc4z{p_|hnY@D)rCCRe)9d< z30L(`wRezDt?`!8RAE0iAG_TV-x~%&xxy0|cS-5)tX4tss4lZbXx<_v?_@<`+8;AS zxNc_&!{F$XR;sJU3GE3%;v5v2ARyq}@+(UA&&TC48eV_Qo%1eYtNaHpr)N%G`Jw1^DFD z|Nggdw%x8Kg|q^qV1z!dOdRhT2?||04?B_bUC?)_qElOH<-Mx!CCt65X8ys&4rc;- zZ)yTXSXkU;YnKe(jF_FB9ZyN8+U%X=u4fK1rDljw2_!L0jCGfi6)52rP__q zvJL!TMN-9IZ#T@d?;f&?y5-ocCI9I&m2YJUH+$m_6$P|a{~$Xal()e&@l>6%@Hefv z^TGbj>hlP=s=z?NPwtPWE#%2eh8h;q{b!66LkJn*3O>8%KL`XNyt%|ix}09)*6cPA zBe3Hk!C2Efs^qAX(6%jjj|$aWR0aKJ*ARdv8i78wC!PB-f>(h|S8T4SLCZwq$5EFl zg1Eb|7VkqFiZn-7ZKAhNLp}Wuz`PIB;Jhn_zq#LKj<|_uWK(=sXCa@f{-UZr#_Vj) zJJNhMGbAi}_R)Cbnlncx@d4sD1`H2w?lu?uu>yG+jK@-SRSnQOL!7v z518+YAA#dHP>IVF8k&Ivwz0cWF>?C3_Z~Ln^~ha+$ru@2f{khYyYQPjIW3y%y$S&a ze#93{dt~7+a1sdGbUHQd*}ZhR>1OJ=^34`dVHm=;9;2||4wG^xOcQ2O3BO0%AX`=- z8(qJH_RcukZ#ynxRA_<|zn1vtHXY4omilL#h-OwA6^AFH`R?}XNr_0D{&&0OzE0`O zBoo+Wp~>N>@+qvoW^pa$lf{y|KQ}ZqPW(4!F*kzGkf_5YJbFYr4&3|LCH<3c5pV-t zZs2;we-*53n^?R2CDRHwy+=!FJ8K(QKd&X~K0ITwL*+1gt(#~PCcsUg(bDWUBn>7E z+H+Yzawj1S6vGNZXA^v(X$fRo-{9$&Z8?06MfF$N_Rd6}7b`z@B^A&NdV5e!ZrnkYkpc}2?xCEelN{F3`{?sbE&$~-$7NTzHTTLY&kt^xYzDoo*?iUEKNO*QnBLp{v4mi7m<=YAB9{QN7vpfcPM6M_YmoNg^dqiC8&R-_U>%-zOUXVvkOn z2AmTo-vIV}OcsBwB6D3OyGMT_T~!Box6HCMKYCt$>J=bOdU+#8{wBB3Br`A;y4}k0R{u#@dW)*!>P64--JjA>wE*I@syuwnzXzl0 zGe4*3fANtUVx<${(Es60!My`PN2?*17j#yZ5?k*rU$V6*#^4t71Ha6xQP&zu7M8PB zb6$Lq0y-}(gTw_2A_I}u4O++C2e!>IAi6_M9_(A*reibzLH1C-D#+qS#@Q zKA2#V;E1s{$!$BHE7c=wlXbf)(+~3|cdrq7JDdjaFP}8BMl$Z{$-WO1lwqfVk=VUf zk5D`>fcdF6P(nAaTo&u>d5Tw6NTS}@dYc_=aOuzIN)1n?-djCSel^4NTg`EO1dQP< zs@+T)pZW-8hUz*SsB{BmYd}THM0aB!t{Dn(@dx|#j1DH04Z@*|?nE=h0IHU&2NQ$3 z2>#c`K)GYZ91!kdVQnawAn?9gp?+Jge7$q+mxIz!Fs4{Kg@B( zUA5k#7?3f%`q{A?VK0#LcHX&o9#!w$X*UPMo+ouJMWNW_Q8d>w(LjQvq^Wiy;c~;S zt6Gd?*Hek4sw;`lsGU=~gh)k*o1i?NAn2eQ^$CaRYuOFFKk;YWzh8G}Y-0F^b)BV@ zy(_Cr0VAsEO60!b)5pKfG)U(S8Z3wjQxdbgG!$-AiN6*TT;^(4W2uvWuee5ja7>Hs zbhM?4URa!?{f9s>6b#XzbNaQ!0-_p8a9Tqe1=T9A2%XB_0qt66=Np@wV}G-V<&nOA zP!#_`(};>j;*9=jfW=mhX>f0)ThU|+{6QBR@~5Xau+%)&RH>zyb&m;+*RRWVi&VWc zL{GanJQq7m7`2;8>Pf7=jD+87vlcPbfA0lDvnM#gqDD&yd|P+=E>EJAir# z$ut!!!e&tHlCmvpDV4KT_Pkz^`SORM5V}j1&f#}9?NV%_kI^IN!Q_js#QQ;SSBjQ8 zx3dK(85njYYcoBc*W}o63qr5_=4^E7s&;VhZy&nD|KiTM2$-&i2@Nghsjcc?U12;g zC2B26P!Et0?nfsQRF>B*XZGiB8@8WwLY7@j?a=OnAQ*nb!^snElsM2?gqab@TD&Bz zU8B#Z70h5MlDH^xuu7>7M(jSxyxi^T5zKNCtd=VZ!S)+2G+rhL-TAJllXO3Pvs_Hk z-HV-a0eW@$z5^YthS_}lE_yhR+4y}h6a;`ydW9l!4;Oq1p@9Bp_;XYr&Sf8a%SYA< zBAQf2BSR*U~wQhzKrn>Az{MAL8nLaxvw{*sdhU zfG!BjbEH2WL`0H%nlpBLu)|^Xc{g!VrOQ#H^4|@gw8jx%EfRMlUH3(UKO=fgWXioA z9l1rQHbZZ0DSibk@nRk3&`abi0BU7-{g>_VO75dWgV!S*mR4g<(T%k4`8>Vf_@S$j z4$Qv|jm}F+;uSzOjH_#DuXtLj+fW2MWjo)KZIie~Trz5>T&nGiIB|(5btn|CU ztgLNW7s;0zQ_0+BPnzmu*A3GxW8aHH68he|?;?R~IuROjK?OZ|N`~(=l(h+=Tazd34BBIdFNFI;v?P1xt#tgDrOZ@$#G zhU%GCbEZK^)DM;i0^TbPml}_iI$5^eaZ7}+(1xd3!lb8FUhEB_7e>Ikr1I0P1ZkpS zKT+)W3H2pH*dMR?N8m}gWHp80LriWHor3=9oJ4$oE**{PXsG$}^*n-7M<9Ih>d%*w zin6M5JE(7x#T(b4ztI*tJiTwm&&!^8(b`5dZ8rY$SSL`TggtPBYXby?3C((Ihz^&NiaBcZAJ0Tt%5}s` z$~z)SP`u*5Ot=w?xE=(p+t;R#kw(a@=!jOyJ^T2YHgcV|V?Kqi|k0?eVS<)qGysccS(t zs^JP~8K;03EM4|*6qKyDktRwp92xFXQMXwyFyyXvvJFscYyK4cy^LA@6acN)A>CdF zD{?M>X&P9B{e+~(C{x&_0~_5PAet@kdjRd)t`JTo{;e4e0v@yv;suJpZ!ZJ_=f|U? z%Zo=__57U~M~f0#FU)wdU>EV9yi2c^3Vin&_Oa7}gTgQ1tANpHu!0)NIjGAX#|pUh zlID~V*L}(#R5vRv8HeMYg+M?C$Ei)>R-lzev18fq%Tf|xrF*r@o0*N)LfFFE**PCkVVIj7(8xUM|kXg0g(z)g7S_pC{nQZ`RbS7=THVLFUM5T3S+&1 z>x#R2*nKLuf4*w09a0IU7W!YFe%>T}6`mdBi5MSX+2ecven5Exbnd*lwyH$BP6fGm z12moE{zNtVe{-LDAc7OdT9E%wVUPcz$M_%Qz!?cd=i>}|M}oQN!&@1Z);fbf3Q zUaO=>2tKM;5$8UAt4}07>u%@!*%~P;VTt}5X<=khy6>T0tw>R%(`7zF8t|}8mN~8# zdM+J_soZscT!SMd2bV9g*4JOw^SMPOqH{6hCDR5~*kUN`24)2;SSewDeeh!ECyxI? zeoP>{@-(QCBdb_L;$HuMkmS<7I%z;w^Lxb0A z{-4)7J_GNM8B5N_Z?8y4wTW*kymB3JuWaFSwNSk$@o4lxb|_zHGPn3M&!?;uN)YIe zz#dEl_(_W6`JMvytJf#xZ7x1%kCe4iW|`1qFVUqgOs;NDq3Gz~p=LHZ&xE;2^C9{* zZcKtp-g1Sm#~Bv2oW4DX>JN0)5@8>DL>v@!UTN~%e-Ducld`Q5rp_Ls^4BVm93hWz zHKP5i-GoIZf<{v4_&17?ZqF2En*Luy_sn zDx4o@)mE_~@!IF+u*TPy(6frw-!A-Sl`P=j16?s8q&+|jSJMOKB@6#WF{*KUOq)*^ zx#YWlW%L%h?<%k`X%Siyk9gul{wqe=Rta8v2w8s$J}p6c-2<90WX~)- zRq1;jKp!`JSdP6yXVxzS_t^X~oQ&w5?Msw{&YE}dqPr59q*;R^#WN$mzdNCvQcl|~ zvJ8AUf9*%V0$5~-LC7WK+5aGX{}L~~EA*0@4_5)V&LQCicK72A=A zVh#0_*ODQxpv9jy3B|jsin|%$KxDE4-J=hq5{sDq(`{QHrBEPxkfi?5QEOHt7(N(Q zsdvQv6RHT;0wYC2&^93+RO|~9>s(@%e0dzA+A}Lv>d0r8iI{%vsv)`C<`8{7MF&#l zNn31nW=+83Pj)rS$b%~2k)>KeWUdTS2FJ1Zhj^729aUXu)P8tZIG!|i!Q_=sUT#;D zyZz~Zkb*oJ?_lJ6Ep|Vlyx)bI=QnJ?b%~b??tf8P5E15dl;SdtQ=x9o$pV+BVM=vL7xvU({38KuQmQZm5_n zpZ)zutBpCUf3~$k(707H{V~yiWQxh)>J}@XC zBcYXIyEpKGoh(7Cohp)#-JxOc4JwPTfcg!P@bj2&Tk(uo`choKV`-*1K`RP{~v^O?W+eg z`Vr=vfY!@6`I1)REB1Vt$#BBIiX3P=f6x`c!xy`zHCLKTrNy-4Uq1Qd`iB{V641TaKM z;+o&L>Oa;Vd%gcU*eClSCoq#SM`oVqx$o<~iivv0iF$@sdFJVZ)c0g1#wo`?u>xb2 zTH(L>$lQXab3iop033g1y8F`%OPfRxRWggHdYJeecaB8`5mvOZ$l&grgYZ9n-qa^W zDQUlpRJ>Kvg$>KN;rKnvqV^!F;wd*Ln#)&oJP_oYM~@6gcFmdMuH(7ylZxqO47SCqXG~p;jftrXZ>yTueYn|ic03h6hO{+0WeIK0bEZB%&VqtEt5F<_4Zc3aTAtXpNljU z`?#Z7i-oJdW$ghi!rbb8$}7lqtjM$Bo>WpY^xV9jm*jn0mA3xJ0sc;pQ&Iy{^_T9x zm_p(FPtCVc4S`AZDSU3C;FzBBqM6WW^`|)td}l3Qw`n}sn*qsRpZ-P*oGB3qQ$iuf z9J@TpETC0;3L}>p^oq@A-S~XnPl2?b`8u9~v7IyghsQqY(7QVFi^zpqhaI&uK*#aG!}UU;EBDoS$e6%*GTZJ zzVs&e{8XR?+=0LGSzI1W;}akJCD^|%$Dx@5A+->|#QJRFOOkAG8Chx^=PzXCkKWxe z{N21^+?et0;=nuA$#bzqJqML}k=mEvTT4>%_b^_J2pB$W=Oi%vq8G_n9LP&^oW^lZ zCgl!Z5Ab~HdEtO{?QOVw_(GHp7&u%mdChfoF#UoPT9>+NgS_E*MKHVZ2O~c(o#E#a z?DCxF^&J#L7jkFFp%TQdfAKJ?V>rnwq(}mI1^K4%SBDTmIk5JvzYnlgCOG>F>RRzY zN)(J_Jg>|;*}uKep+YG{d3XsR7c{}qNO~7h`WT~0uZCeOTs$mzM0+UNCaCc2&A4;i z8j`iUn!b9DjYw}7>%Os=hR;w~?L&C3B39-@WYVBxR8Q41qom_=8n77*LG}k8Q!?2W znCJ6uV;ITTS4Q|uCRF+xxs6?#pe`&PJ|f-pig&*#5~_>2rL5es1F>v%B6vy5MYes>Ac->i!3jxV{VE0u(oN8JKw2GjyY( zUySw1pLauoL!o;0#% zJ{$LpJaH<{eG0$X-VARD7du?LBV@*zc2785Zv1+Wn!phz35tL4*>{zr8wyCLn(_3F z8H*Bir;?ejh=bTBo~y&0alW1ELe0nfUjH&9O*u!3Sz#~1S0J<-B1{bQG7Um{5W62Q zHL31PCwvi!bF!m&v%An9m`Y9XSARE+f#UCY%}HQkJ)vN%X9_CcYG$X=2<7S#7~vB;0JaF<~DD4vM@v*{)FKW-mPT^uV9((gxf(wu|kPi|~N>`g3*x!@*^0 zgAJR~aUfBQFn}u{Fmxhi2-Q6vT3xjI(`1tm+e$i3as}t30WIpZ4D(!^4|B%70{qWU zJ(7rt3hDx?9=6*=D8i;hx8KSSdj1#GD>zjrvQc=>&Im3%3_ov1$$eSdl<~xpO8S|z z`D&mA)uquMcxvPVrl~p_i-xfQ`^EWREERT|OLlOk(w28cF<%q)hb}x0yZrNDQ(d4- zqLo1*+E^5!)^o;FT;pz6gB^54$)-d9e0`wr?`o3MPwCee>o z-y#wi*aCJ&JOrr$G#5^pjeYNU;9$lmkS=W@_KBtkX7elLk9o_B$tkWs}5)5WVLdxrV#1(vySL5>bRMTGhne1g|xWmfouRk#|*yTh`xQZ}B4a>I)D~cb%ZUJE%EWmm)%_p{9)xoP~2={UMM(>|iz8#HMir>^A>SXnoibk>5zO z2X%+e%Ri)4zQ=cd#`lT}#q=2a*E+PoGv8Dth9vOb1ks!WIg~+;c=`ZjZY+fiJ-r(w z@rVQ~(8I#G^kkPCYnpRxZYdf$X_~g)*ELC1YIexs0n3DrpK;!4!YKe1gB}+8(gdrm z)%ocw1m^DdW_)u}fW2t#js)McEeCOK&eT`@vS~Z@!lv_)*C~yVC-~@rE-JJZZ|o|# z*Yw_sHh%$@{VLc;v(Jrxu~01W%W!jI+OEb2s5?3ZRbLwJ-XVmzPD;RIjK3>m*n;ww z?!D}*NSJDFNoI=BUEySXl9sdI^Z3Ky??0;mS@wMP0JL6+q_=V$jTE)E+J@oNe>F93 zPvaDtTk6}4#KN4!86{s|smoaA9`G?rK8Dz=a*(-gR*$>TXBNo1(+%<*+mCpsc>~7S zqJ9o9FmyC0Pl?kJzg>dNKH$cL`6ixmgTF`; zYYAz%p?g7ZZh-U3U3SS`Zxdu3au!&!z$mC0<2>TF)4#-`oXeow_<3ATUS51^>cp_G zqkyg^oLSO&Ggsoqb@fM5A_D^$puJfB0N|a&`0QR7^L!_7s|8u|QQ?$vE#ffP%~FXc z<;$JCYl;ibQtDljmr}lHN}qoa`+tgj`0xM!H`D-B^8YOQVVdml{}vSZAGJp`d#E}F za!yk>>{JMV2-Njp)6Tv7e=c=g1u#RPL7~3-j1vEUxa2SBKU@PsowvN$m|Q%)D<6Yd zPJwd!i|_(Sf)!yS^F7S=X1a+><0o52k?7mOAGfP4)FoMc`VCY_M|XvEsBb6(odx%3 zenH=WkPHCxEE@tG`?q9FfF1?0L=JengxAN2qz&}uDyPlNm_z~)gv{}FJcxQ(M~V!Y z*5O9zO;d$P?}|cAdzzkGeZ@EaT9Xd)gNRfVUmIj#NCljvA*e2O=-LRG_Gl7%)B&Ui zVLZ)%*|i5j{lx7nRC=}g7ax_W>o4e%*E0Bh!Cz3x@p&53Ay70u25f99y-sOdmrl%0!|X7hILT+s&jZLm)ps$Nlxp&Q1`EdAxY=2MvsGwwCt~y7%?#DgsmeN zz>PZDr`C%>TBqQi`=l4s-EpB`4=WB#E)pUGnLqM8&{c>`HyXSC@Gr=7Y_6^w+F+4L zR;eOs>357@J(3adn8$6%D>`SGtbOd>D|i4>w2{&VfzVO4x+&h293A=Vcb4qoKGfuZv?C?m7P%x|fN`KFLa1C&$EbN{2FP4!yFMw9LlQ&HamW>m+OY z{+Lfd9k0T5N$J=G!QY3L={7a|8mosB-S%7r`DC)elNAmI*ShVK(K504xv8IlLlVE2 zUx1jN8Zzgn>(Zsb2r0XjfIZ8ZRlNp6Ot^}OB8+qKeePpnNwiCQ=H89>s*go#0wRL@ z^>y7rKH#(dm9QQdKZFHqLTeoAb${Idr{eZpzxd5e-!6Zlfiuh8?=0zrMGdPLpz}@G zz=0)R>Zmm)8e)tG@b4a8!O9IZ_tH?s*7OcbXn`Fl`ukd1V)~VSbrA1bWEkr5RVo|8 zoAL$_X`mA^Jnc-VQkOjNbp8CNQHOa*MqTC5OU=3{SKdqW&Hg(%=XCZd0J;7>n59F3 zET7#;<;TCT^9WHbDzyvFL_bTunB2dil>r*KnrPMNAxtxBdgt1G=PslcB^K&t8jU>H zPS{LpXOTk}Z2kIVdsp7wSwZIUneTeu2Q;rD5AZK0J0vO5D7O^GAn{YIS{#B!HYVn1 z-aN!#%YLT5X8vQebBK?|TONk1@3n^`Qx#xH4vRwbQyEF6D>2cC%M~_mqT&s_ zWwJ}NQ;dh=weABlZI9VO_P(Ps+g`vV@C{)<9{S8n=;A;p02R9sPnKf##6#K|>TE(R z_X_4Fj6N-o@?JZ|Oh&J!w!f+Ta;c4kJ2e_RRW%Z$p!cU1VQg*;XPga2vfW&Sy!ttTvDbGl;j6j30{9q<>EMlT;NGNg3P&HgC>t7(*7~i2mzN!-%J!h2 z!2OsxhC7sZWT8?Ld|AH$D*^;91j+g{0+C(c-vBx&CIEernlzc)#x`!!+uX6i#3@l$-br z|Lj!>VEO3z*`wG}r9H6G*p&z`U{PP<%nB+N%TvFhl*;lHlbeLxHvSoSzdeK7^KjuS zPAGKk>e?Hr7J;r~o(mFQSgFK|q$mPIFI6XR(rO56cmLQN?jMSk2-f=QzM@5smjKSn=hby|8ls8zNgJ~zz{+9xyVY?( zxbHc#G9jgh8~>`e<6_%5!o+VnQ_yWb_@15exgOb~hTd-}suE`{FCfke&|a~mOEIRP zk=Mu}k*lbI?4N4OQF~>m&5Wk}tIDa(j&muuI9BJ+I9P>Nqqpcqn@VA`7vn!s@I)QgX zoAzIJ(2)a4-+c*covp;&5Nwk5c+hTGqZ;q9v&Y(-9OV!BjXYiYPF?+`^ey`_OLzdk zjuz!2{U%soqsvxI>`kNw(p-Gz3}~9*v8YxS@_KmAtvJJSsbSz{o5q3)p|EU!){JT?dg8J@|A} zx;v1EK95gw0^aY9J*i9T^-!CG`~`_g2Rzu&4LsNUvkw{W0<2rps1q0tj2%k|)Hy$O zH=)|a+Vc&a5z)afeb!hxDwnnGOiMQHam-#M`Q}xiPwBeT!PkV-h7$@9m&=pR&Ua^u ziYlCKQhR2#|FrE;H8{_{Yuz0uQA$5Ud;ade4y)Z6c z7}3pkV<>Q5rrRmU?&>F-fpzs;UJ8?lWp6_j;&i`!5~`kwQl!Id?*=|oy({nT^rP=h z+?2bVebA9S7~W$dqXZ0POCKUxHN;uXsK4vrwjLo7$HDShLs6^eGD)!r>iRA=It zc#r5>Q**j5%crV-1l% z4?ocf(_{!}(-bSGZ00}Lt*&U0pMew0#vyF-y`cu3&wEx#SI?G80@{{a1RZol)h#Y$!7OO@IRHyzPz1B=x81pllMbI(!R+qQ*kHGdR?=vZ^E z%L*I3L@k%;fbp14ZHX1`Am;5*14I0ppx{rINlTICdfs8VF?sL%7C!d*K3Qa+F^%KD zAZ<)ZC{HPJ2vr|lz1*xL;kv}}TPB5l0q7fC4E(~c5lf8Yc#J(IyuLEpDlR88R_6vm zL}_-Yw?HYsP(*1`4`KBt5OpS19Av&61$=FOm5MUWxZlzZxtc?AF>{WoZz8s)%%Y#Z z4C{Pz(RUnkRg97jbxWC}wIdkxRx=}X0-GlND-B0QiKDX;t$gyEy=b>QDWCIEsh=Vg zi=D-$x6!+%r@Ex+9-wf4SuY~9JRMIqf)@=0a=~UUmd<(_Hm40GjOATsq;E{;jJ^(f zl|{fr!0_hsF)#+QY#AV=)M1@^`s2y8O8F4i^zMPA^Sw!_)`OWL$(zdhdP0b1Nyo?D zmtT*GP%?mmauDzqM$^Hew2+Wxtu_kGaH`tgfoIK!|NWPqt8yi_XANS>UwVa)R;7wa zrogh){f=N*m5`sHa%nLmh7mw%wr?lW)TUfU9cA8@}tAGU4yiyrxyY)vS^ z^rGSchH#{-JJCBR)1qUtD16?xH`BMhi$9r(rpBlLg^wLW_x|kRDzv{GzOxk7alVZ} z-waTC?=?IgZW(Jd)tTC3ehmsU|p*sz5d;y(uGcZETET&(GP` z%=f*BFm@Wp(HF+C7{nZ&Kdat9kv6y%0^VIewGBGP0>PIpYU_BUaSddcxiF>Pl(|g6rk%~@+ zq+Hr6Z^N!fbmxNU09!0-7p9>p0&rP@o(rnGPsmI8;MPdJ(9jrv;mJB*67FaA23Pyz zX!c;XoaDC}`5d;CItcgaE$RC)i2cmgS+m+I~@PfvK#%rB)d& zLxI3CECNc4aUGl0BBqi&fM>!*R&1X17dp+J4~3dWpNx#GWPEWcJri^>L;dT$!Ex>j zAo`*1wdr|Oy)zEwi$4W$_FKSHlutGNej;-M|Zjm;P@i$ZR2Hwu=T@HUp3Z)DziM%Lv2m+X8{Pqebfj zh?g@NF+l4|&p_bAF%S~EM43rG9}xl=JYXdgD{i9!dss8c*0+=tV46_bmjp zclKa$O8}xuM}`xsyDPO;_QU;8cYpypp!9#BT2T{PxaoMmyT+#YxzXpD;k?`7$v)`J zpHR5h9CY9nNxr)*7;n*Medp1l%(s2W{EvDW87q4OMVnsPjkoWdofyNShO`Os<*$9w zO__ZuDT2qlJy;L!J~X{N`P}JHVj@jzdTU<9+*dL?W%wCUFgHx>kSAz5X2ifK_($-LN5{!c8?X zLwGZiw1P#?DiKrh;HXljQiP{3}WZtYunVQshVfb2(Q)G8rlI+=gM8><)%ip;4W3WUriz5&aU11Rko3g?yT4D8dBlGL;Jsc zhK@DX#?RFQQ7`90%x<0khjbC}#3q>=L%s9AX1X|9^r7%~fy10X5GZD-Sj>rETXn-V z_)V9Tzkrv}KTtK%E&%#ojz1b+FEKg_>=$r z8i222g7}{ofvD0pWz~DP<(n~kDeJHv*Z#er%?{Ip4a^4&Gf>~$#W;GvdKv{YK4agJ zp&!P$>WSQ2(-T8pQa7S)LW0G878IMr62qQ@7=AhN;L&7ADG^{Y6hf5&b({*B!n zeq&f2BlAR3@77{==}S?+%q=#ekibyB%M!Y_V?*uyuk;F^Els()>cy&e1(v2|_Uad( zG{$YDMI@$k(nx_E3A)31g80&Si1WwyQOgw3L%Yf1NB#{pP3hYK4+NfZ_Ez-L45?Rg z@RD^1`(aK^O@yWB-%z&UpbGq@5@(g{+aGit_}`st77&=vdG>EpY!vCsz%m0)Mznxn zV>)@{@>^E$U`moY(w65d@pj#u7~~NA?sjjF^h@?qmUQg|DsvzqyBj7#*27N#>A1Mx z+WPxODG!{vT>~>rCF~n&lGO`a<1ZIK7JJ%f?n1|!ZU_SNQTy|>K9S(3#w2jRb#iX# z$N5>?uSp*7Z5n>AMPnB&`MyN4Z;CZb%H358dttGI!iAjL2Wf7suJ9IxF7NZX1lS7` zsY~4;IPY};o=u(Y@^+Vqq8D?IvfXFx|(~v(s@ttYn$>fWd zo4XdO-*2(SFsJj+~$CL(DG{jIQ5rJhz|=7*obZuX|)quUzAGoR<(gkR*z5I2dRDecf_ zrm?8A#rUSMb`#Z>a@+0J2a9)J_^;7lsBcZ)un264mz?8O%$HH(eXP3b!{fnhNWM9Z zWFb4?JJRGZSQyRD$=yt@$csNVG6TIl^V5>Xht6Hk!5eKh!cUke0KDi9Wew^fx)46U z$qa*dxSUYKed&CE1|c_Cq?6XP=+f=fITp*}Uml%u_{9MTz+IpuX@h?ujkBBmi~M*@oTuFH zeNLCmM*&3e?6i;Z=Fffy<^v5p63d5*ji77A5s1F~%|O|*dNxfB>Wz5@C0%CNCE)9pIU=c|q|g39 z0u}oVCBrd#&`9W$63=C+w=}GbYpdu{43kPZ>9_XN)BAB&TzkRKn14PnT(2Dv*vy(5 zZ)aK!_3Sw{zlq-~`e1dYXRN6{%kmQ@$m^Db1O{Sp^~;yrHC-atv0*KzO~B}KgHr6r z5d*FxcW`3xG4a1!mVfMRs0qr&_?B5?A0$R8b~Caoe8~$IZCF4KK^tJvWVJv-{OC?6 zRT1;*5rJ4&DLqjylrZ5Xn(x3wKlqZHb!%PZ*J@(2sro@RNopFG2BdFtk(jA;q#~^I zca_-R@bWayn)Vipc&8M&jEx>ZOJt(s;t)}Y#{orK%6v7^4SycZ$Jf6onXNB+k+9fM zz4i4ZbfFtNaPQ!y0Y&uk?P~`^PN|oLq7?(5Ru8Qz-z?nV|1l@Np?U?(Afl^5yV=G8Am6;dO`f0j2zo`R%vU-XKMZM; zt{*OKX|y=m2KWz00(OXLYq9RXG?of0!TGdd7tQ|>^tM_78RDZu8KpYi$=r` zvX#iuJzoA|m;Utyx^T<#luQk?COnilO5zDTH3bMTNuP-&s!7;vFLr=&Zt7JGvwN3m z6yb8ofvuj)L@?vcZ2`{bN;$%3BqdWitGP&~eLAc^zW|hf z2gJ)k24brW4O%^-oCH`>19TV2Cv0k^7Mc~Gs-it)7f!kN)!s1Ir78{eGaws|8E~ho zEMQ=Y^mDWTk1?J69kg4Yp!Gbd)b6@>|F!Y%f}+oeD#zU zW8F=Q4AZi|D{l!J+b}85zi!Rt*2FfaU9o{sd<5CcJ zZ-%#_CpLaoIUC(*D^OXSpo%yAFup6tLN_!3Nu@`YkZ(|$kTk#04bX6edAa>|z>BlF zE0m{SLUwY+PiF6X+z7EqWPBDSC!*V^_3o*dlh3O*;ekH%{3g+P8tTFknRn$|yPglK zfMjiF^;>JQrZq{nzralvOIfHbu5O6loJoq>YQ~Git72SH^Tu5nNO6);xf_+0;2Bp! zLiI6~+bwLjD$l)mi~ZEvILp|4dE+*MGQ$v7nv*Is0(AwGq|v(+0<&qfQjnPnydIyK zSdTfkbhh3yW%lZQr!eyA;zQ{S9IToIo6I*3aIRZmXsb%k~x5lv%D@Tw#sRuYIU4Fw}?Kq5`zk22;T7 zl{!qljQ5JZ^rLjrKdyc<0VjB=)QR~IAKtb$*b`Tfh)6qk7HiDeuXyW%?E=8bhnupI zmWYmoj#s5Y9Q}TNnwsF*Pc$F~K3*L&e>5-uDzE4vB#`&tMABa|y&hluV=~ za#U0W9~0SbCVL#KGIH&@$5X$Znc_ny$1nBiH&RosI@TU4L}?jwK0u?bl1d=s=K`6USLUREHs{Mm@#f8 zS6L3TiJXJ~h+~E{Xbs2tp`~iX!%lc#8(MG9+*f^i+Qzxiu zg#E5l<9$w7!SK2RQ6Zzm6rPeC-pUIJUTcM_JFBoOIB^ zyevIF+_$dm2?!W~5|a&h#6kh=i*Axs_MUu+gsXsC=fzaOhfpi0L44 z0_znJ-Pa_h zZd}<=Sm%*rFi-Y2Bm*;)2w(DZ0O@5}4XDLp;^&H71@#N^7iI>$8xL*6y^kN&U3ncY ziBRlaQe9+M>KgF?ihDzp3pfg0&(I67Z{aYe-xgDTI0+-w3EPJHsV~o57fn89G706J zQ4CnkWBS+_*#Z<2^xTw+4qoJhQjqxkO8QbgQp9+pCF6iT+}Q5zjgM@*y(!Y^hO~5# zU!_8o+!oRAVcXN+wpt%nG-bZZt<_^zPH)+adPw)GYnl1SG?3hZW_>%|o29amKH=Ce zhg%D47DjYDt$GnqRwJ5ns)f+~-ob79Mt1>m+sDQK!#kVB84MWn-zeL25iBy}YFQ|l(0?isHtn?Dz zd0aAN#{ATAkhT>aP-frU8|VWlKVG|A*!|hnK6}tNbBoXrd;I#;D^|tX3YSd2j3lqj z)S)JKr%%1kVu+SOhCdX6PN~Ghl-qW_$s7z5i!mxkx`ghJM619>{ruiQZ zAI&NRQ!;lC_0Hk{^a3f1uLoN1@BeDO6?FfZW$XV=o0#E9I4V;CjJ|d>=@hTt-_Ee$ z{eU}u_&%wKF1eXL<~CIp!hszz?$l8Mn*QYa$CV#~fNasp%E*IgxW*%w9{<(ntOVE( zi|(cQQsPrm_6i(z&S>?sd{5v-i?N!iD(uAG`b`gBAW>?*hvnetm2T#A{!MVMZ5m3|mxm@7l|fRHoLBNH#wKBXG46|LTKL{2W% zNiQR;@NdCHq1wNo)p`sb_>&ri2h9W!S@s5iTl~gwXbdbSnp1!U0cigIf-po3`9%up zF~>XuHLh}>0vw#cJAY7QQ9b6!uS-Xd5SRagBHO@JEd#QO+U^Lz;&ARpk+lB(`84El z@C*yF)84elX6Y2*;sX-C@)K1`QU@QYba`p_=kk6GQYBek<+G|xOl!Ov7h~QA)~MGh z^NJO1Sf7yq16?w_7}_Ae`$eCl56uKj8zw#fb(d2du^4yxS>GPbhk(O9!L(<>W?s(f zY6GKu75}U7Pm8m~Z^lkPdTT&@b-__f_(vRnG^YS&3vcdUP=SdVs!ORu4T!`7q+orT zm_8Fv?Xwf+v6jVYcM>#POuiTKe5nc+y33$ZosEHGQUIHWB@q=&oFIbBdh2Sf z)zj@<`s~gaCyb4iLYccZUK`p8y^dj}{f1UR|%j z17n*7w=;{Vi*ltc(Uz-{eHbkXhtz9|G;8tBy_k70(FKSaKt&*Bzms8X8?ROpV4MRV z>`Us`WtYsFBD9<|QbM@CcLbEpX+Q+2fzN%C2P#8>zLM@Qh~O1Y<~}tKvgn1L`^};) zV-OFRO_U!S;;`w)R-7zaN4YoaZPR4*VY{KaZU;hYrWiJ0C{=0fhj_#EQtUuf`}e5 zj)L~L;SeAN-kPFEb_S6rnZ1SKti3<+S;71Mrb_#%X) zvf{--)+X4;VP#$YCtEL|MZqnNH4`{bT;B4qvc9^6vE^7+v4XuS z+uNZ|y2$Hwf5NJ_EC9gg^Qlab8qp8PCTurZH4X_i*Ter#s$5T*^%T6W%)6c5&+~L{ z)=45-?BozOVzD#*=P$?_1UdpoOVgnYF`uBgq*Ik3KENmw`jTvhCDr51Z%vRB+RR=3 z`kdHz7Y0~lJV&21jRtS3kau^U{I&~xFsVEvnK6gm4(5Erer?onwYEzb^&2SmD9J#y z##gEUkTS(q7?jda6&zQQRWo&|cHi5Vt=xO`cyHV@TA#hIE+;IIyGteMl#~2|k^_OB zLR>ZFVWvhl9&zpn_mXkMQ*1}awZ$t%ly|{K#o|$qNrl3C9Cr6zZ~upFtPGDaZGDdP1pSO7lKpGK%aEHv*HVP&ncel7tF` z-JQg$o7V3$yz24r@$P#Zw|+%2pv;}4N9XsyV@2CZTX^(x=y7j3EWUNzMQP`9F(q|~ zZhW8j{r(v2r~bOP(_KaZvid%B`3?Ad2M1XPKhVo!8mA-m9ibH%80;WP`>?I4-nGbb zonct%(?0Wyu)B&%iIK2-2vNXMKxG~|g%R~X-3N?2CQN@+l2t@=Lw)?c*ebi~8nd*z zydY5y2rYv)hjRmTj;uc}F}>^Hqtrm3&3geg(SW@|3&GKBOE5FKK0ydR0rzb*P6&RV z?g9kbjq={ybfHW1jjs+lb)b$&5JzhXyB)G|eljrHg)Mm`u}Ow&Y4}5zUoGgn*H9e) z8XKl3=arp&l#UK^aM&wZdk&N+oL*-n`RgFWY6C zuFoN@OI`))twMwW2}TfF<%_OD3cz0=G3>d8v2uIL(?$hc^#_J!n+C6+^Mq?z;zrpy z&fCfXyIR*>Dqx^V0%UiBU@TG$Hs|`{>RBMax5LReD9^^qA+ZhfB{GDj zd6|8U+2ZV|67c~67DE-Fez!kEXi6#8d=^!*ea7b9delz`bD-{u$4bu)94Sl7G1GPMG$zqB|E(Z&OC&lQV) z`LIQ8(ybN1y%s{yiNl%%X#0B(j&DX23hR^S{4x=#dk@$o(-0M%9f~wFx2b~1$J7oC z>_ycR@OOD!%Bd6eYlk+;2)?q!NE%(T#!wf(d)`s7vE{0nTQpD}4eZUQPZC;42MJGk z;U-RD)R84_l+zL)iJ{Y8rE$t1_ppAwp&_2BM=cFSw`UBwT^_sYSvrTw8=F>c0leg` zZ96Y14M1Zs;M>#;a`34O^(#=j)}3uxDF^cn=#+%67}b;9$47s)v^3XVD@OFxJefHY z=po`84jZ`yJ^2gT#QZr)+1kPK;W$sPL3fKPw^Z%b@sr1y_UAIDSQtHVYprVBmVeB8 zWmDhj#qpmhq0vj90i|ZFUltDRLC*^jUB3b2_Z0RZt$PGNv+cRSNLjzFUFxvko?JnV zrDTe@cm<+UU+?knu@_Vi!hGp;JT*&482Jrcr;~On6y$qr64*RGsK}Vo&CM;i;(|Sh zU4f!`wZoi^V_A-XD`kMERGx1Z)#-4IK{V$5<%K(WGR7^bL#!O)tZN@LXhoa1l8=7v z?rn^{q8+ZsX`OFmJh3>6JY_=!0o&7MAe2w-27oQKs}*jaxCcfYjGr9L&8-;`%N&Pq z$uK;9_&S1Su%D^YYnFEPc(YJ_JQIw#RsECE%M)mLt%Y*+gFVn+niV=G zJimLWujtyVF7xT8Y*1_fMl{B^+_-eu-JYq0%izq{>aWtIIlCbBoq-pBvZ>581imf|Kg!k4ybs3a zg=wrWdg8#Cr|x7jeoGX*p2ia^K&##l-{Bx#RO^FAVmRE97iP(K2$xb;=7;|%|B*4A(zpYvM#4Dk$Jv}tkXd0#DRn$M^%BcCbQ4v#eV;yaMO6T9~+mD%^!K$ zqPjdwHGwIa3~{L^pVjD}2W=fR()FU$!49p5h?I+8n@2}V1J}()=)PUET6LL84C`S4 z>%qPkB7!M7Fe)<(G~T>FPgIZýK8P^)_&R#-!F9&I8ks5N<8SP0O2s789v*<(t z43Ah8D^-kajW3z*u?sOF(DA-dNZtsQ3#xizC5Y93sMu}A;<1*v#_If`G=Gea64`Mf zNPfi&r?r9-Af1q1vs5Yqw=VWb403KXq^lp)mMaYNFwiC*!kmGv%@pMVi^K>*WS8w2 zR+5`rDMWOrFNFHAo$$w}-7WH6(VYzKOl^%{GOJ@GDS*Gx&b?echwesRAVq$db=6c> zSStVN#-29cdtiOLc0c{j6{k^Ps+3oxUOnTL46bL`#e5(mNo?rX6tk>K7wXn_VD!hVe-|47u8HU$m>ef9iqTa|pisjY<7p&_1jd_^whCVYK8xd|;0tM-Q6E zCGWzI{^llG(Kr6|3u*Hu^&fX}G~Qu#`82UV=hfB8{vtwyveY$#J z>#~5C*(`kR9pd_Mh98ZQTHiOPPJN{LxW2i&LY-lWPx|eo zx0@mnEh!tRv-Ve!a9u3K+2>Kewr?_e^YcRn6^b^(lTrwEq8JeG6OuDaf>wJ1o3dh} zCm?h)7nYmXMo&~f8ZVOk4D7*#2EAc>udhA zMx6h-#MuADRQ{hOvi!pl|Ns4mp-j>EyMT~F=|5OSq``QAJxFVS{A39L%}(S0g0{x@ zIwrd+ISZkGC;xx*@PGUxIOYf(s{?Ar^Yo`y1~d^{7jwPJZ0;u1DEmepq`f-4%nzAH zTYPuQ9zfT9)MtEkpX7@)_FTu*si^iF1Tb9#B?px4s^@d4Od!EO?aAstsFJpJm6dtf z!SpW`KCM@kzV&p{9|RR51~gV1f+?W_gaqnkC^Jc7g-*Br#J`l7SD4W6)xf!N)semO zyrW$3>4HT&$rUNpQ{f`0G7!_Qv0}>nWvbS=2sY&C=@fB;_D>$tQ`CYENVd;$2rvTu z0k33+$+jb?QpVX$_0-O9)eVj_1?>a%v$3Nu&Mpn@^gRK1T{O!Nrq0%0ASir3NX}ln zmT3Jam^*l8K6k-m2WAo^bfX4nS%3()MbYup0jE-uSMRmXcN&)ChTVy;UWNA?4Q&Tk zYh+AKQw8qJd}n>SO68W9ADN@ehSnWCz}U5HiZHFkgZ^xaB?7x&*3nWdm97B~(K(+n zx3z~_5&wo$aaH>OlQWK3DdOMe^P)Q(2|4cb60k?G{@A5*1xc9J7~6@DFP+}7Ns#sw zy4UiKE?qfEJpEq8d3wlmrS9+{>cq6F#av97yx+W;gR9SqiH>3A^u?!-f(@_ddFL-X z*N{7Po)8N=!YR439(!bS?D^JksR#JIkDZ2XVNbwc4BV6ZQ)U-Or}kk4Yr7kDFY)~q zUqtjk!~AnS+WY~~w0sV98GHxKxIqBeWDD2@lxq8!Mu-8T@bgPHBBv=XNYs%CjYs|^GVZ@V&dl=q}KIfAc4%cf@a+r zUy_Ptd&zg8(x&erS5?9}Bb*SYyhKt%{0v?Gn=u%JBtFx1;X!x2zr~&ir1DKQ2G@qK9@t z&s&k%^03=H>5Co+w@3ikpIt>Q@ISgHe$bQC$mE51)+{2N!cHBbinV+F9KllDrussZ z=C^)%3Rj=%IDiaSwOu&PZ<4eMZmm=*^pWcGq70Y~G1P)h%`yS5T!$>F3Cm(f zFQ2laMV{sc#bhxqk1VoK);?Qj1V@ zknmcfO3;2XM5q!0B|HR-L{*NMLP`gD;zb63?X-xP3Ou^c@3S-=zDU;cdMTK+M2zXH zG=22yo*I43>p~k>iH9c9!Jozt<|939akLED9CK%(yx{n(hT}v*CeP|AftB=cdrcww zy0TwyF5@`EGz11Uc63GMjqQiBKzlVHI|pz%zsF}l&+j%)h&HmXvV7@Cp-C#VQ`WAdl7*z-p`A} z7Wrra~G zRE5bUgYWB4<>ZQDzY;z?l3;Fu)X=J{kNVgJ#vo`);Zz2~exgH18pBKLp50##AY0ir z94{=V3N%RDGT?RsyZdQE7V3(Qq0;cyP|!V^{td5x@!THrAsS>oL+vX#3ycQylIeV#V|G51+AexM`Le;5MHthFfIOgqo>uz@MNN)?6oMDRq6Q&IcHY zA;vaKDS5&T?NM@KuJUU7|GMOAucN5Cy3P#FE~e{rL`IKfM6l^qJ9*eqrkbt#nz-eA zF74)s_x8&OjfYPKUXv@6DpOrJ51bpM1=OnnGa9UMO0qpIp(AD0*v3c&#=4ab*9<-4 zt(_m@0zkIPmv7%(w_pH)C&S!?(40V82s1)NDzc(7`ZM;|`;LxDIk9BybwNXiWX6{t z0n@^evcWMQU@@SUZQ#%-L5p59zl~4>^X3{C=A`(Ve&K7L#p&Mg5kLaqOwj68?T`YZ zR4!NQ{VUkT79NOlvw3h(n7;Caro?dIOWWk-EA5`L18zr9U?c4QQ4`8w5_uiJ^pdPT z?Ec9$E3pyg(vlRrco@7nCNHM(i&6Wm3+-wOh$Lk}O2Q6<&$`HS!L~&oCyw?>P$oTO zJResWe2Ebj^|8&Vt-s%HdYt+OYStIJgfGCXfGAZe;Fu1&6tJWZyy8Q(Sb|~1nQ8kU>Gk}xN0t`Yg-Vov6@VHho`%J#wLB!f` zS_YsXxE)VnnyCD}B#>m@gW;<}NGr3HyLJp;%w0qaPw_FcTwmjVt6&>eEWF3S(1FtC z_&Icx&k$k;(?x!J)YzE0NN?kkaY6p&QKrX7KHsKy8S4E;1Lo-=S-;tAOlnNy{(@*O z*jRSk{#pbpR`sz+K)wp(IHZTXnoisZ(~&Ri=$=NZ46lqOXjVtLA89KG-H^2ofhR#` zdN;623PyIhuLtdtEm;ZO;b96TPC(ki5eKJOt*CqB#2-TDbjIh zLPP{9(u)E@q=*6nN@z-nfYbyG1SwKORgfY@1f&@Y7=cJ2bWnnzQp7+A9T5T;qQH1R z=bUrPx_8YPXU&{-&sy{2`;~9K>&x1Ezk9#$e)jXc{ip->!9No?2U@MeyNd6=ZHYW$ z&XoMzB3FKxb&6Qa&j163wJ>EnSZgz?S#s3D*?-6nr@Hmr*9~9TJ2k5Da5&M#-4Dsy z+Oi#p-e2p0GG&Ak>8jzE>u0OMiKVIih=lC3Y*?>-Yqf1uq_17?%Ao{lPS6*-I@Jfk zTUeXH3A+aMY#R$Q5~?H%u>;%CX|izuI?d^#LsP~jJbx^{Jj*4z3bopj4kD(N~KBr5$2lj+}BH283HfUH>x+G>BPOmMe!yV_HFQ2g#5A2)6e4PJC527qTGF1G zD6xIVFTNznq=uMH|+&(l*85gf=`r-i}Q=yjo)_Y{2iL2|Ae9t z=gd4#7c^&vO0Q`)jU{63|(QX@0Oaey*q~1^Ft>mXBql5J!hn z;qAKGu(x`$3*q=}=`o8cN1d_Y^n?%&>Xdpx?_Lw;LAT<rli6fkGgqwzp!$9yp$d3268|FbBwQ!H|kyk*pR;c^`T z&;6*!_gb0s7>2;oO%?*ipD(VG+cD8a5I;5Q64V)L#<)*hBerM_91e(Bk}|tocPflRr@)@Xz`P3I`?AM%l?vQnHnI26DO9O z<0m1B;(Sk6BUak<6SXdNmQa_PGOlwm&Qyk74iJZ2 z94IBnRSfAmw{Zns8o|vdts)p1C@%!Gt332ZL_fy6&N5ZYiQ z(&Z+7i%3iU@%Zd!sYlnNvwQ{@I$v9CPkJ1|N-2A#@3gmw?g~V7>DXdcDWq?pGeqVE zHPrMojJkXE&fVtV%gP_uKw^eRL~#7G8`e?_So==Q(@m_JG7Tc&mDitN{gRd9;GJp6 z5J|KbQt;TBb~}S^4N5JQlO^D$FztJBiOx{WehW|WySq;E*VopZdeZ6(dN1s!lL?ld z4738d5k4h>7?3z3kE+Dp5mYiMQu$HgRvSe=`tU<+Y1Jho#z&8&)5+VhH+8D7MdtF4 z5ZiHaUj^IXLfcxaS8hK@W1i+tHoYD`P&cScAelOxx@;?Dt$fgWI@_)5AnWYnVb(W4 zA7;+M=&h^y-We7U1|YqFm6}lC4br>fO!$egR+#bUD-ZR z_THgqZntf=Q>Ys?^s%glokCEwp%nil;1zEe0Q9SwZK3%@9W%e2>3?49F#*(hwAA5sRYBRWRB^i_jbgFMyw1->;9l1%d<=s zmN~W^L>l15-v>@pgNgAJ^<<~vWpSV!FC3fgXN>6xWK(8UQc8mk>!b%{6xd&h1^_1L?AQR496e(=?;NMby4u)f!xflADSvPo&rDDJ;FV z2w;U@a)yZ-o~c;Yy8_~B2_QC1+FEg=jRu4L<0p6s@*!+1Ayc%9h}<_yITE8sh3(e^ zTT*Vej6w8b^45U;>Mh!y_Dac_37@oL9cxu_W?oplGG)4V#*DG>?)+M}nM-k)KNxMz+_O42#f?kT zQ7&0J*G<+$J#-u|%X^u^fw#Tdw66Mk!@Z}?Bc5?$v4MB`ts6ZNzB(x> zF_b9XVQYZSXO0xf@eVD&THbbc3!a$aN+iA&J|rDl73dNt*?p){`NUUoWq~-lV2ilq zszCmvQnGN!Ixc?9ZYYHNNCzV}$5t%_uc9q>!OHd=?h zKON1YIZIGa0&Q-s@cc~vYFy7KqrxGJjoFo9d>L*2RXu_uHDi`flrqsh=KEvE4Z47U z25U~QFBNXwvIf7-k>JteN4+O~Wz**kUbYQc;Tk=9m#@(yJ>lWw-Q&ycTv76xn1z*pHt1M^*wHS<~?QWGmby8V5s`dP{gEzVt;4*KMVSO+3 z7NJW*l(AWMh-k)RQxoTtPoEorPN@7&I2$k>nv}PhT)zTYv_XtHR|k?hDHm?$ zhv*V&Dxptf6#OplTh!nlm5O;rAh#8Xgg})ffayz${1XeewvI|w;o1zhWEn!c>)8g$ zP7p`HfICrKJ|swY<|RJIMs=wF-)Yp1SfBe&`l!u`S))%Q^HrL1Wns(S-r=3NdzPDyY9AQ~dPGbH z4W&$GM1*Y4$JEg>3?z&ZMZEV`<+_MsJ}RT8HS>8LZ$IBGxpJ{;+_CS_zLL&sy#@*q z4Ky{op(%Y*QGBRY?F1=8+cqEmc6quE_QHX>*OjX;{uoD4qtQN zO6C1l)%_0Mc6LYPI1l#tiVwTi=g-KMTSge*jsSsk?-_H3dM8pH1)p+qa2C@zHRSp< zPx0}WSJI(477r0dM#B@87TP16+A29MxE4aqNktzBU|VxWm0PIQP8&3zck2y;uE^j6 zEA~c(Eje2O#YII7A*76nq|T)hWRP5gmr(bhY->PuCEr4@)Q-;dS_9eeAD$``Rk9iJsU9Xtr47A7!dx#+o%ZXXqI2?&d|}W zrg$eS_a%E%c*fmlIZUh?iXr!bX?d*C($D;JZHj{SL#_j#wNWAR6K7)ix5R1&I~A=f zwHvTn_?M@p*Ymz8JX{pcF0H1(9{2#c`@@;QwU^7%DG{TIvX#~Vq1CTGfA6r7x0NTN z^#4KBZO`5;4**|Kn4Uru>px~NmF=+mzx@z>7U=hNokTa5&Dl?j*MHvZ!0^l$u@kHW zNh=VPsd01Npl_}5_9i1aC?G=T@sUjB+|&(tfiH*2P=N~w1nw4^6Pssj;Of!tRN`(7 zX`ZR+S~8!_Xq0_i?v-Wc_4<%Qw)eEe0;?CV<{9u6A-~VPh~Y-7v}UN`D%@-!cm*== z+0N}d=jg<-a>>Ti^Ob9~hNwCa&lGO3# z9VG~31U^+`Ed^lk>B^l=*I+F?AxcvVe^155Z!1s1vEm|`@3h|z1c#MB%0>;E6;sZ> zseUAL5$b#7m>26bC-j5fz6D{+3hG3{uvXkH4V4iuUh>to&W8i$(gxBg>E_3TL~_`h zsv}O43OSfys)T^j&ERFLcKcyGW0f4{_vD_mpUT=%{qSzkg|^JfOoL*`EiYWTjz=T7 z9UcRt>nRG5jp*#jRY&iJ?G*90`Xl-1D-Oak2OapMz~GFYkAkykYnJ7|xr$p9#OD_b zaVg*LG~hqFxBrt&?U%)V$D!-DP5u5*yLN&6We4#Q5PD@aPCK%f(c#o*rBwjB3L4;# zbPcq5fBpu*X&9}Vqv9Sv(wY`g3PJ~K4P&S)Nkm?>dSkx!&G2uagvtGvP)M`aGjA0Y`GeSA_pZZs9dco@zQ*^6^+pC< zm4fdSaV6hl&%)c_yyrK4^(hBrGW139Sk@jU45Lj1bQ4gF3jB7Y&(fSY- zbxlCs1I^z>^sdjA=VM=+J|re|A>O7poX7B>zC@v+czrd%oTCwLQ63i*cBC;RM!VJT z<(acO&yV(2L^+A(fq)i^D4<``8i3*?Q;}`jPW6Mv6O6c>Wv21-rpCQ9<@<$hOW7_D z-zY>1tTrAl2Ji%b_ybv3|9Q_u5!0Or!i?L016k&TFdlNFf%$AU0Gyr$R3SSZn2iM_ z+{djJKpgxKGX9SbsQ-_B_`g6He}}L99~3C%35D7pXy9LStRFT0UpfDOVekIR z`G4j7e^IplS|tDIZ$BFOzYTc#ryZaF%K1NP;9q<*yHhmaQ1<`F_a)qh!@9 zg@eq$`-$_$-OB3&yS}rg*=*ilhEbyaO&0%UfE=@(JNIArhBklG_xlF=@Arn#Q;z!I GM*jncpmO~H From e058511b4e251a5b296299fa1ea4be73f9c5f6d1 Mon Sep 17 00:00:00 2001 From: csunny Date: Wed, 23 Aug 2023 17:02:54 +0800 Subject: [PATCH 23/30] pylint: lint code format --- pilot/model/adapter.py | 1 + pilot/model/llm_out/gpt4all_llm.py | 2 +- pilot/server/chat_adapter.py | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pilot/model/adapter.py b/pilot/model/adapter.py index 31684d6a7..05f9ffdcb 100644 --- a/pilot/model/adapter.py +++ b/pilot/model/adapter.py @@ -232,6 +232,7 @@ class GorillaAdapter(BaseLLMAdaper): ) return model, tokenizer + class StarCoderAdapter(BaseLLMAdaper): pass diff --git a/pilot/model/llm_out/gpt4all_llm.py b/pilot/model/llm_out/gpt4all_llm.py index 4954a9933..3ea6b8206 100644 --- a/pilot/model/llm_out/gpt4all_llm.py +++ b/pilot/model/llm_out/gpt4all_llm.py @@ -1,10 +1,10 @@ #!/usr/bin/env python3 # -*- coding:utf-8 -*- + def gpt4all_generate_stream(model, tokenizer, params, device, max_position_embeddings): stop = params.get("stop", "###") prompt = params["prompt"] role, query = prompt.split(stop)[0].split(":") print(f"gpt4all, role: {role}, query: {query}") yield model.generate(prompt=query, streaming=True) - diff --git a/pilot/server/chat_adapter.py b/pilot/server/chat_adapter.py index d2af0733e..0bc53e8fd 100644 --- a/pilot/server/chat_adapter.py +++ b/pilot/server/chat_adapter.py @@ -191,6 +191,7 @@ class GorillaChatAdapter(BaseChatAdpter): return generate_stream + class GPT4AllChatAdapter(BaseChatAdpter): def match(self, model_path: str): return "gptj-6b" in model_path @@ -199,7 +200,7 @@ class GPT4AllChatAdapter(BaseChatAdpter): from pilot.model.llm_out.gpt4all_llm import gpt4all_generate_stream return gpt4all_generate_stream - + class Llama2ChatAdapter(BaseChatAdpter): def match(self, model_path: str): From 034460fc43746d8116bc8f7ae52b1c67bf1d5e81 Mon Sep 17 00:00:00 2001 From: aries_ckt <916701291@qq.com> Date: Wed, 23 Aug 2023 17:04:53 +0800 Subject: [PATCH 24/30] doc:getting started --- docs/getting_started/getting_started.md | 261 +---- .../getting_started/getting_started.po | 955 +++++++++--------- 2 files changed, 519 insertions(+), 697 deletions(-) diff --git a/docs/getting_started/getting_started.md b/docs/getting_started/getting_started.md index 228f9cfd1..4d0b3b5b6 100644 --- a/docs/getting_started/getting_started.md +++ b/docs/getting_started/getting_started.md @@ -1,249 +1,38 @@ # Quickstart Guide -This tutorial gives you a quick walkthrough about use DB-GPT with you environment and data. +#### Welcome to DB-GPT! -## Installation +DB-GPT is an experimental open-source project that uses localized GPT large models to interact with your data and +environment. With this solution, you can be assured that there is no risk of data leakage, and your data is 100% private +and secure. -To get started, install DB-GPT with the following steps. +Our vision is to make it easier and more convenient to build applications around databases and llm. -### 1. Hardware Requirements -As our project has the ability to achieve ChatGPT performance of over 85%, there are certain hardware requirements. However, overall, the project can be deployed and used on consumer-grade graphics cards. The specific hardware requirements for deployment are as follows: +## What can I do with DB-GPT? -| GPU | VRAM Size | Performance | -| --------- | --------- | ------------------------------------------- | -| RTX 4090 | 24 GB | Smooth conversation inference | -| RTX 3090 | 24 GB | Smooth conversation inference, better than V100 | -| V100 | 16 GB | Conversation inference possible, noticeable stutter | +- Chat Data with your Datasource. +- Private domain knowledge question answering. +- Quickly provide private LLM Model deployment. -### 2. Install +## Usage with DB-GPT. -We use [Chroma embedding database](https://github.com/chroma-core/chroma) as the default for our vector database and use SQLite as the default for our database, so there is no need for special installation. If you choose to connect to other databases, you can follow our tutorial for installation and configuration. -For the entire installation process of DB-GPT, we use the miniconda3 virtual environment. Create a virtual environment and install the Python dependencies. +- Follow DB-GPT + application [install tutorial](https://db-gpt.readthedocs.io/en/latest/getting_started/install/deploy/deploy.html). +- Follow + DB-GPT [application usage](https://db-gpt.readthedocs.io/en/latest/getting_started/application/chatdb/chatdb.html). -```bash -python>=3.10 -conda create -n dbgpt_env python=3.10 -conda activate dbgpt_env -pip install -r requirements.txt -``` -Before use DB-GPT Knowledge Management -```bash -python -m spacy download zh_core_web_sm -``` +If you encounter any issues while using DB-GPT (whether it's during installation or usage), you can refer to +the [FAQ](https://db-gpt.readthedocs.io/en/latest/getting_started/faq/deploy/deploy_faq.html) section for assistance. -Once the environment is installed, we have to create a new folder "models" in the DB-GPT project, and then we can put all the models downloaded from huggingface in this directory +## 🗺️ Ecosystem -```{tip} -Notice make sure you have install git-lfs -``` +- Github: https://github.com/eosphoros-ai/DB-GPT +- PyPi: + - DB-GPT: https://pypi.org/simple/db-gpt. -```bash -git clone https://huggingface.co/lmsys/vicuna-13b-v1.5 -git clone https://huggingface.co/Tribbiani/vicuna-13b -git clone https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2 -git clone https://huggingface.co/GanymedeNil/text2vec-large-chinese -git clone https://huggingface.co/THUDM/chatglm2-6b -``` +## Associated projects -The model files are large and will take a long time to download. During the download, let's configure the .env file, which needs to be copied and created from the .env.template - -```{tip} -cp .env.template .env -``` - -You can configure basic parameters in the .env file, for example setting LLM_MODEL to the model to be used - -([Vicuna-v1.5](https://huggingface.co/lmsys/vicuna-13b-v1.5) based on llama-2 has been released, we recommend you set `LLM_MODEL=vicuna-13b-v1.5` to try this model) - -### 3. Run -You can refer to this document to obtain the Vicuna weights: [Vicuna](https://github.com/lm-sys/FastChat/blob/main/README.md#model-weights) . - -If you have difficulty with this step, you can also directly use the model from [this link](https://huggingface.co/Tribbiani/vicuna-7b) as a replacement. - -set .env configuration set your vector store type, eg:VECTOR_STORE_TYPE=Chroma, now we support Chroma and Milvus(version > 2.1) - - -1.Run db-gpt server - -```bash -$ python pilot/server/dbgpt_server.py -``` -Open http://localhost:5000 with your browser to see the product. - -If you want to access an external LLM service, you need to 1.set the variables LLM_MODEL=YOUR_MODEL_NAME MODEL_SERVER=YOUR_MODEL_SERVER(eg:http://localhost:5000) in the .env file. -2.execute dbgpt_server.py in light mode - -If you want to learn about dbgpt-webui, read https://github./csunny/DB-GPT/tree/new-page-framework/datacenter - -```bash -$ python pilot/server/dbgpt_server.py --light -``` - -### 4. Docker (Experimental) - -#### 4.1 Building Docker image - -```bash -$ bash docker/build_all_images.sh -``` - -Review images by listing them: - -```bash -$ docker images|grep "eosphorosai/dbgpt" -``` - -Output should look something like the following: - -``` -eosphorosai/dbgpt-allinone latest 349d49726588 27 seconds ago 15.1GB -eosphorosai/dbgpt latest eb3cdc5b4ead About a minute ago 14.5GB -``` - -`eosphorosai/dbgpt` is the base image, which contains the project's base dependencies and a sqlite database. `eosphorosai/dbgpt-allinone` build from `eosphorosai/dbgpt`, which contains a mysql database. - -You can pass some parameters to docker/build_all_images.sh. -```bash -$ bash docker/build_all_images.sh \ ---base-image nvidia/cuda:11.8.0-devel-ubuntu22.04 \ ---pip-index-url https://pypi.tuna.tsinghua.edu.cn/simple \ ---language zh -``` - -You can execute the command `bash docker/build_all_images.sh --help` to see more usage. - -#### 4.2. Run all in one docker container - -**Run with local model and SQLite database** - -```bash -$ docker run --gpus all -d \ - -p 5000:5000 \ - -e LOCAL_DB_TYPE=sqlite \ - -e LOCAL_DB_PATH=data/default_sqlite.db \ - -e LLM_MODEL=vicuna-13b \ - -e LANGUAGE=zh \ - -v /data/models:/app/models \ - --name dbgpt \ - eosphorosai/dbgpt -``` - -Open http://localhost:5000 with your browser to see the product. - - -- `-e LLM_MODEL=vicuna-13b`, means we use vicuna-13b as llm model, see /pilot/configs/model_config.LLM_MODEL_CONFIG -- `-v /data/models:/app/models`, means we mount the local model file directory `/data/models` to the docker container directory `/app/models`, please replace it with your model file directory. - -You can see log with command: - -```bash -$ docker logs dbgpt -f -``` - -**Run with local model and MySQL database** - -```bash -$ docker run --gpus all -d -p 3306:3306 \ - -p 5000:5000 \ - -e LOCAL_DB_HOST=127.0.0.1 \ - -e LOCAL_DB_PASSWORD=aa123456 \ - -e MYSQL_ROOT_PASSWORD=aa123456 \ - -e LLM_MODEL=vicuna-13b \ - -e LANGUAGE=zh \ - -v /data/models:/app/models \ - --name dbgpt \ - eosphorosai/dbgpt-allinone -``` - -**Run with openai interface** - -```bash -$ PROXY_API_KEY="You api key" -$ PROXY_SERVER_URL="https://api.openai.com/v1/chat/completions" -$ docker run --gpus all -d -p 3306:3306 \ - -p 5000:5000 \ - -e LOCAL_DB_HOST=127.0.0.1 \ - -e LOCAL_DB_PASSWORD=aa123456 \ - -e MYSQL_ROOT_PASSWORD=aa123456 \ - -e LLM_MODEL=proxyllm \ - -e PROXY_API_KEY=$PROXY_API_KEY \ - -e PROXY_SERVER_URL=$PROXY_SERVER_URL \ - -e LANGUAGE=zh \ - -v /data/models/text2vec-large-chinese:/app/models/text2vec-large-chinese \ - --name dbgpt \ - eosphorosai/dbgpt-allinone -``` - -- `-e LLM_MODEL=proxyllm`, means we use proxy llm(openai interface, fastchat interface...) -- `-v /data/models/text2vec-large-chinese:/app/models/text2vec-large-chinese`, means we mount the local text2vec model to the docker container. - -#### 4.3. Run with docker compose - -```bash -$ docker compose up -d -``` - -Output should look something like the following: -``` -[+] Building 0.0s (0/0) -[+] Running 2/2 - ✔ Container db-gpt-db-1 Started 0.4s - ✔ Container db-gpt-webserver-1 Started -``` - -You can see log with command: - -```bash -$ docker logs db-gpt-webserver-1 -f -``` - -Open http://localhost:5000 with your browser to see the product. - -You can open docker-compose.yml in the project root directory to see more details. - - -### 5. Multiple GPUs - -DB-GPT will use all available gpu by default. And you can modify the setting `CUDA_VISIBLE_DEVICES=0,1` in `.env` file to use the specific gpu IDs. - -Optionally, you can also specify the gpu ID to use before the starting command, as shown below: - -````shell -# Specify 1 gpu -CUDA_VISIBLE_DEVICES=0 python3 pilot/server/dbgpt_server.py - -# Specify 4 gpus -CUDA_VISIBLE_DEVICES=3,4,5,6 python3 pilot/server/dbgpt_server.py -```` - -You can modify the setting `MAX_GPU_MEMORY=xxGib` in `.env` file to configure the maximum memory used by each GPU. - -### 6. Not Enough Memory - -DB-GPT supported 8-bit quantization and 4-bit quantization. - -You can modify the setting `QUANTIZE_8bit=True` or `QUANTIZE_4bit=True` in `.env` file to use quantization(8-bit quantization is enabled by default). - -Llama-2-70b with 8-bit quantization can run with 80 GB of VRAM, and 4-bit quantization can run with 48 GB of VRAM. - -Note: you need to install the latest dependencies according to [requirements.txt](https://github.com/eosphoros-ai/DB-GPT/blob/main/requirements.txt). - - -Here are some of the VRAM size usage of the models we tested in some common scenarios. - -| Model | Quantize | VRAM Size | -| --------- | --------- | --------- | -| vicuna-7b-v1.5 | 4-bit | 8 GB | -| vicuna-7b-v1.5 | 8-bit | 12 GB | -| vicuna-13b-v1.5 | 4-bit | 12 GB | -| vicuna-13b-v1.5 | 8-bit | 20 GB | -| llama-2-7b | 4-bit | 8 GB | -| llama-2-7b | 8-bit | 12 GB | -| llama-2-13b | 4-bit | 12 GB | -| llama-2-13b | 8-bit | 20 GB | -| llama-2-70b | 4-bit | 48 GB | -| llama-2-70b | 8-bit | 80 GB | -| baichuan-7b | 4-bit | 8 GB | -| baichuan-7b | 8-bit | 12 GB | -| baichuan-13b | 4-bit | 12 GB | -| baichuan-13b | 8-bit | 20 GB | \ No newline at end of file +- 🧪 DB-GPT-Hub: https://github.com/eosphoros-ai/DB-GPT-Hub | an experimental project to implement Text-to-SQL parsing + using LLMs +- 🏡 DB-GPT-Web: https://github.com/eosphoros-ai/DB-GPT-Web | Web application for DB-GPT. +- 🚀 DB-GPT-Plugins: https://github.com/eosphoros-ai/DB-GPT-Web | DB-GPT Plugins Repo, Which support AutoGPT plugin. \ No newline at end of file diff --git a/docs/locales/zh_CN/LC_MESSAGES/getting_started/getting_started.po b/docs/locales/zh_CN/LC_MESSAGES/getting_started/getting_started.po index f7bd2cfff..024349a9b 100644 --- a/docs/locales/zh_CN/LC_MESSAGES/getting_started/getting_started.po +++ b/docs/locales/zh_CN/LC_MESSAGES/getting_started/getting_started.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: DB-GPT 0.3.0\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-08-16 18:31+0800\n" +"POT-Creation-Date: 2023-08-23 17:00+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language: zh_CN\n" @@ -19,492 +19,117 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.12.1\n" -#: ../../getting_started/getting_started.md:1 70e40ad608d54bcfae6faf0437c09b6f +#: ../../getting_started/getting_started.md:1 f5e3f55f96de414183847de3e1eb0a75 msgid "Quickstart Guide" msgstr "使用指南" -#: ../../getting_started/getting_started.md:3 c22ff099d6e940f7938dcea0e2265f11 +#: ../../getting_started/getting_started.md:3 39ac3167d0044868b9d9efca953e73c5 +msgid "Welcome to DB-GPT!" +msgstr "欢迎来到DB-GPT!" + +#: ../../getting_started/getting_started.md:5 bdc699f3da554c6eb46eba0636fe7bda msgid "" -"This tutorial gives you a quick walkthrough about use DB-GPT with you " -"environment and data." -msgstr "本教程为您提供了关于如何使用DB-GPT的使用指南。" +"DB-GPT is an experimental open-source project that uses localized GPT " +"large models to interact with your data and environment. With this " +"solution, you can be assured that there is no risk of data leakage, and " +"your data is 100% private and secure." +msgstr "" +"随着大模型的发布迭代,大模型变得越来越智能,在使用大模型的过程当中,遇到极大的数据安全与隐私挑战。在利用大模型能力的过程中我们的私密数据跟环境需要掌握自己的手里,完全可控,避免任何的数据隐私泄露以及安全风险。基于此" +",我们发起了DB-GPT项目,为所有以数据库为基础的场景,构建一套完整的私有大模型解决方案。 " +"此方案因为支持本地部署,所以不仅仅可以应用于独立私有环境,而且还可以根据业务模块独立部署隔离,让大模型的能力绝对私有、安全、可控。" -#: ../../getting_started/getting_started.md:5 dc717e76b3194a85ac5b9e8a4479b197 -msgid "Installation" -msgstr "安装" - -#: ../../getting_started/getting_started.md:7 a1d30c3d01b94310b89fae16ac581157 -msgid "To get started, install DB-GPT with the following steps." -msgstr "请按照以下步骤安装DB-GPT" - -#: ../../getting_started/getting_started.md:9 bab013745cb24538ac568b97045b72cc -msgid "1. Hardware Requirements" -msgstr "1. 硬件要求" - -#: ../../getting_started/getting_started.md:10 7dd84870db394338a5c7e63b171207e0 +#: ../../getting_started/getting_started.md:7 7d1a79640331431e85d5c54075dca1fd msgid "" -"As our project has the ability to achieve ChatGPT performance of over " -"85%, there are certain hardware requirements. However, overall, the " -"project can be deployed and used on consumer-grade graphics cards. The " -"specific hardware requirements for deployment are as follows:" -msgstr "由于我们的项目有能力达到85%以上的ChatGPT性能,所以对硬件有一定的要求。但总体来说,我们在消费级的显卡上即可完成项目的部署使用,具体部署的硬件说明如下:" +"Our vision is to make it easier and more convenient to build applications" +" around databases and llm." +msgstr "我们的愿景是让围绕数据库构建大模型应用更简单,更方便。" -#: ../../getting_started/getting_started.md 055d07f830c54303a0b5596601c58870 -msgid "GPU" -msgstr "GPU" +#: ../../getting_started/getting_started.md:9 f400d65e13e0405d8aea576c02a7b02a +msgid "What can I do with DB-GPT?" +msgstr "通过DB-GPT我能做什么" -#: ../../getting_started/getting_started.md -#: ../../getting_started/getting_started.md:50 7323cee42940438b8a0752d3c2355e59 -#: e3fc2c10f81b4fe2ac0bfd9fe78feed9 -msgid "VRAM Size" -msgstr "显存大小" +#: ../../getting_started/getting_started.md:10 2b161262a21b474ca7c191ed0f9ab6b0 +msgid "Chat Data with your Datasource." +msgstr "和自己的数据聊天,进行数据分析" -#: ../../getting_started/getting_started.md 68831daf63f14dcd92088dd6c866f110 -msgid "Performance" -msgstr "显存大小" +#: ../../getting_started/getting_started.md:11 0f1322f19cea45768b5bde4448dfea5e +msgid "Private domain knowledge question answering." +msgstr "私有领域的知识问答" -#: ../../getting_started/getting_started.md 8a7197a5e92c40a9ba160b43656983d2 -msgid "RTX 4090" -msgstr "RTX 4090" +#: ../../getting_started/getting_started.md:12 9dc0e76f46c64304aabb80fcf4a2a3f2 +msgid "Quickly provide private LLM Model deployment." +msgstr "快速构建私有大模型部署" -#: ../../getting_started/getting_started.md 69b2bfdec17e43fbb57f47e3e10a5f5a -#: 81d0c2444bbb4a2fb834a628689e4b68 -msgid "24 GB" -msgstr "24 GB" +#: ../../getting_started/getting_started.md:14 ad5daeae9621455ba447735fd55648cc +msgid "Usage with DB-GPT." +msgstr "DB-GPT使用姿势." -#: ../../getting_started/getting_started.md 49b65b0eaffb41d78a1227bcc3e836e0 -msgid "Smooth conversation inference" -msgstr "可以流畅的进行对话推理,无卡顿" +#: ../../getting_started/getting_started.md:15 870d82fd402444aab3028764607ff468 +msgid "" +"Follow DB-GPT application [install tutorial](https://db-" +"gpt.readthedocs.io/en/latest/getting_started/install/deploy/deploy.html)." +msgstr "" +"先安装部署应用[安装教程](https://db-" +"gpt.readthedocs.io/en/latest/getting_started/install/deploy/deploy.html)." -#: ../../getting_started/getting_started.md 527def44c8b24e4bbe589d110bd43e91 -msgid "RTX 3090" -msgstr "RTX 3090" - -#: ../../getting_started/getting_started.md ad9666e0521c4ef0ad19c2e224daecda -msgid "Smooth conversation inference, better than V100" -msgstr "可以流畅进行对话推理,有卡顿感,但好于V100" - -#: ../../getting_started/getting_started.md c090521969f042398236f6d04b017295 -msgid "V100" -msgstr "V100" - -#: ../../getting_started/getting_started.md 60605e0de3fc494cbb7199cef8f831ad -msgid "16 GB" -msgstr "16 GB" - -#: ../../getting_started/getting_started.md b82747aee44e444984565aab0faa2a64 -msgid "Conversation inference possible, noticeable stutter" -msgstr "可以进行对话推理,有明显卡顿" - -#: ../../getting_started/getting_started.md:18 b9df8ec7b2c34233b28db81f3c90f8c7 -msgid "2. Install" -msgstr "2. 安装" - -#: ../../getting_started/getting_started.md:20 bd0f0159a49b4493ab387e124fef15fa +#: ../../getting_started/getting_started.md:16 c7806bcd1b9a43eda8a86402f9903dfe #, fuzzy msgid "" -"We use [Chroma embedding database](https://github.com/chroma-core/chroma)" -" as the default for our vector database and use SQLite as the default for" -" our database, so there is no need for special installation. If you " -"choose to connect to other databases, you can follow our tutorial for " -"installation and configuration. For the entire installation process of " -"DB-GPT, we use the miniconda3 virtual environment. Create a virtual " -"environment and install the Python dependencies." +"Follow DB-GPT [application usage](https://db-" +"gpt.readthedocs.io/en/latest/getting_started/application/chatdb/chatdb.html)." msgstr "" -"向量数据库我们默认使用的是Chroma内存数据库,所以无需特殊安装,如果有需要连接其他的同学,可以按照我们的教程进行安装配置。整个DB-" -"GPT的安装过程,我们使用的是miniconda3的虚拟环境。创建虚拟环境,并安装python依赖包" +"先安装部署应用[安装教程](https://db-" +"gpt.readthedocs.io/en/latest/getting_started/install/deploy/deploy.html)." -#: ../../getting_started/getting_started.md:29 bc8f2ee7894b4cad858d5e2cfbee10a9 -msgid "Before use DB-GPT Knowledge Management" -msgstr "使用知识库管理功能之前" - -#: ../../getting_started/getting_started.md:34 03e1652f724946ec8d01a97811883b5f +#: ../../getting_started/getting_started.md:18 5dd30b81ed39476f871ed31edd01c043 msgid "" -"Once the environment is installed, we have to create a new folder " -"\"models\" in the DB-GPT project, and then we can put all the models " -"downloaded from huggingface in this directory" +"If you encounter any issues while using DB-GPT (whether it's during " +"installation or usage), you can refer to the [FAQ](https://db-" +"gpt.readthedocs.io/en/latest/getting_started/faq/deploy/deploy_faq.html) " +"section for assistance." msgstr "" -"环境安装完成后,我们必须在DB-" -"GPT项目中创建一个新文件夹\"models\",然后我们可以把从huggingface下载的所有模型放到这个目录下。" +"如果你在使用DB-GPT过程中遇到什么问题(无论是安装还是使用),可以查看[FAQ](https://db-" +"gpt.readthedocs.io/en/latest/getting_started/faq/deploy/deploy_faq.html)\"" -#: ../../getting_started/getting_started.md:37 e26a827f1d5b4d2cbf92b42bce461082 -#, fuzzy -msgid "Notice make sure you have install git-lfs" -msgstr "确保你已经安装了git-lfs" +#: ../../getting_started/getting_started.md:21 c6202be38f3641098eedca1ef31665b3 +msgid "🗺️ 生态" +msgstr "🗺️ 生态" -#: ../../getting_started/getting_started.md:48 af91349fe332472ca7a2e592a0c582f7 +#: ../../getting_started/getting_started.md:23 d55c843f8a044e099e61a86ef5a70eaf +msgid "Github: https://github.com/eosphoros-ai/DB-GPT" +msgstr "Github: https://github.com/eosphoros-ai/DB-GPT" + +#: ../../getting_started/getting_started.md:24 7e279ce6cce346ecb3e58537f2d8ca24 +msgid "PyPi:" +msgstr "PyPi:" + +#: ../../getting_started/getting_started.md:25 ca92a6bc95c94996b4e672be7ee43f1b +msgid "DB-GPT: https://pypi.org/simple/db-gpt." +msgstr "DB-GPT: https://pypi.org/simple/db-gpt." + +#: ../../getting_started/getting_started.md:27 cc44973d1a78434fa3dfe511618b08d9 +msgid "Associated projects" +msgstr "关联的项目" + +#: ../../getting_started/getting_started.md:30 93b80349645943b38d16afd80ee076da msgid "" -"The model files are large and will take a long time to download. During " -"the download, let's configure the .env file, which needs to be copied and" -" created from the .env.template" -msgstr "模型文件很大,需要很长时间才能下载。在下载过程中,让我们配置.env文件,它需要从。env.template中复制和创建。" +"🧪 DB-GPT-Hub: https://github.com/eosphoros-ai/DB-GPT-Hub | an " +"experimental project to implement Text-to-SQL parsing using LLMs" +msgstr "🧪 DB-GPT-Hub: https://github.com/eosphoros-ai/DB-GPT-Hub | 基于开源大模型的Text-to-SQL实验性项目" -#: ../../getting_started/getting_started.md:51 84d2d93130034c2f94f4d0bebcc2b0d2 -msgid "cp .env.template .env" -msgstr "cp .env.template .env" - -#: ../../getting_started/getting_started.md:54 b3adfec002354f00baba9c43a1a3e381 +#: ../../getting_started/getting_started.md:31 2c061d9eee624a4b994bb6af3361591b msgid "" -"You can configure basic parameters in the .env file, for example setting " -"LLM_MODEL to the model to be used" -msgstr "您可以在.env文件中配置基本参数,例如将LLM_MODEL设置为要使用的模型。" +"🏡 DB-GPT-Web: https://github.com/eosphoros-ai/DB-GPT-Web | Web " +"application for DB-GPT." +msgstr "🏡 DB-GPT-Web: https://github.com/eosphoros-ai/DB-GPT-Web | Web " +"应用 for DB-GPT." -#: ../../getting_started/getting_started.md:56 1b11268133c0440cb3c26981f5d0c1fe +#: ../../getting_started/getting_started.md:32 6564f208ecd04a3fae6dd5f12cfbad12 msgid "" -"([Vicuna-v1.5](https://huggingface.co/lmsys/vicuna-13b-v1.5) based on " -"llama-2 has been released, we recommend you set `LLM_MODEL=vicuna-" -"13b-v1.5` to try this model)" -msgstr "" - -#: ../../getting_started/getting_started.md:58 511d47f08bab42e0bd3f34df58c5a822 -msgid "3. Run" -msgstr "3. 运行" - -#: ../../getting_started/getting_started.md:59 eba1922d852b4d548370884987237c09 -msgid "" -"You can refer to this document to obtain the Vicuna weights: " -"[Vicuna](https://github.com/lm-sys/FastChat/blob/main/README.md#model-" -"weights) ." -msgstr "" -"关于基础模型, 可以根据[Vicuna](https://github.com/lm-" -"sys/FastChat/blob/main/README.md#model-weights) 合成教程进行合成。" - -#: ../../getting_started/getting_started.md:61 bb51e0506f4e44c3a4daf1d0fbd5a4ef -msgid "" -"If you have difficulty with this step, you can also directly use the " -"model from [this link](https://huggingface.co/Tribbiani/vicuna-7b) as a " -"replacement." -msgstr "" -"如果此步有困难的同学,也可以直接使用[此链接](https://huggingface.co/Tribbiani/vicuna-" -"7b)上的模型进行替代。" - -#: ../../getting_started/getting_started.md:63 0d532891bd754e78a6390fcc97d0f59d -msgid "" -"set .env configuration set your vector store type, " -"eg:VECTOR_STORE_TYPE=Chroma, now we support Chroma and Milvus(version > " -"2.1)" -msgstr "" -"在.env文件设置向量数据库环境变量,eg:VECTOR_STORE_TYPE=Chroma, 目前我们支持了 Chroma and " -"Milvus(version >2.1) " - -#: ../../getting_started/getting_started.md:66 8beb3199650e4d2b8f567d0de20e2cb6 -#, fuzzy -msgid "1.Run db-gpt server" -msgstr "运行模型服务" - -#: ../../getting_started/getting_started.md:71 -#: ../../getting_started/getting_started.md:131 -#: ../../getting_started/getting_started.md:200 -#: 41984cf5289f4cefbead6b84fb011e92 5c3eb807af36425a8b0620705fc9c4e9 -#: 7c420ffa305d4eb1a052b25101e80011 -#, fuzzy -msgid "Open http://localhost:5000 with your browser to see the product." -msgstr "打开浏览器访问http://localhost:5000" - -#: ../../getting_started/getting_started.md:73 802ca13fbe0542a19258d40c08da509e -msgid "" -"If you want to access an external LLM service, you need to 1.set the " -"variables LLM_MODEL=YOUR_MODEL_NAME " -"MODEL_SERVER=YOUR_MODEL_SERVER(eg:http://localhost:5000) in the .env " -"file. 2.execute dbgpt_server.py in light mode" -msgstr "如果你想访问外部的大模型服务,1.需要在.env文件设置模型名和外部模型服务地址。2.使用light模式启动服务" - -#: ../../getting_started/getting_started.md:76 7808d30d1642422fbed42f1929e37343 -#, fuzzy -msgid "" -"If you want to learn about dbgpt-webui, read https://github./csunny/DB-" -"GPT/tree/new-page-framework/datacenter" -msgstr "" -"如果你想了解DB-GPT前端服务,访问https://github.com/csunny/DB-GPT/tree/new-page-" -"framework/datacenter" - -#: ../../getting_started/getting_started.md:82 094ed036720c406c904c8a9ca6e7b8ae -msgid "4. Docker (Experimental)" -msgstr "4. Docker (Experimental)" - -#: ../../getting_started/getting_started.md:84 9428d68d1eef42c28bf33d9bd7022c85 -msgid "4.1 Building Docker image" -msgstr "4.1 Building Docker image" - -#: ../../getting_started/getting_started.md:90 16bfb175a85c455e847c3cafe2d94ce1 -msgid "Review images by listing them:" -msgstr "Review images by listing them:" - -#: ../../getting_started/getting_started.md:96 -#: ../../getting_started/getting_started.md:186 -#: 46438a8f73f344ca84f5c77c8fe7434b eaca8cbd8bdd4c03863ef5ea218218b1 -msgid "Output should look something like the following:" -msgstr "Output should look something like the following:" - -#: ../../getting_started/getting_started.md:103 -#: 47d72ad65ce0455ca0d85580eb0db619 -msgid "" -"`eosphorosai/dbgpt` is the base image, which contains the project's base " -"dependencies and a sqlite database. `eosphorosai/dbgpt-allinone` build " -"from `eosphorosai/dbgpt`, which contains a mysql database." -msgstr "" - -#: ../../getting_started/getting_started.md:105 -#: 980f39c088564de288cab120a4004d53 -msgid "You can pass some parameters to docker/build_all_images.sh." -msgstr "You can pass some parameters to docker/build_all_images.sh." - -#: ../../getting_started/getting_started.md:113 -#: fad33767622f4b639881c4124bdc92cc -msgid "" -"You can execute the command `bash docker/build_all_images.sh --help` to " -"see more usage." -msgstr "" -"You can execute the command `bash docker/build_all_images.sh --help` to " -"see more usage." - -#: ../../getting_started/getting_started.md:115 -#: 878bb7ecfbe74a96bf42adef951bec44 -msgid "4.2. Run all in one docker container" -msgstr "4.2. Run all in one docker container" - -#: ../../getting_started/getting_started.md:117 -#: 2e8279c88e814e8db5dc16d4b05c62e1 -#, fuzzy -msgid "**Run with local model and SQLite database**" -msgstr "**Run with local model**" - -#: ../../getting_started/getting_started.md:134 -#: fb87d01dc56c48ac937b537dcc29627c -msgid "" -"`-e LLM_MODEL=vicuna-13b`, means we use vicuna-13b as llm model, see " -"/pilot/configs/model_config.LLM_MODEL_CONFIG" -msgstr "" -"`-e LLM_MODEL=vicuna-13b`, means we use vicuna-13b as llm model, see " -"/pilot/configs/model_config.LLM_MODEL_CONFIG" - -#: ../../getting_started/getting_started.md:135 -#: b2517db39b0b473ab4f302a925d86879 -msgid "" -"`-v /data/models:/app/models`, means we mount the local model file " -"directory `/data/models` to the docker container directory `/app/models`," -" please replace it with your model file directory." -msgstr "" -"`-v /data/models:/app/models`, means we mount the local model file " -"directory `/data/models` to the docker container directory `/app/models`," -" please replace it with your model file directory." - -#: ../../getting_started/getting_started.md:137 -#: ../../getting_started/getting_started.md:194 -#: 140b925a0e5b4daeb6880fef503d6aac 67636495385943e3b81af74b5433c74b -msgid "You can see log with command:" -msgstr "You can see log with command:" - -#: ../../getting_started/getting_started.md:143 -#: 4ba6f304021746f6aa63fe196e752092 -#, fuzzy -msgid "**Run with local model and MySQL database**" -msgstr "**Run with local model**" - -#: ../../getting_started/getting_started.md:158 -#: 4f2fc76b150b4f248356418cf0183c83 -msgid "**Run with openai interface**" -msgstr "**Run with openai interface**" - -#: ../../getting_started/getting_started.md:177 -#: ed6edd5016444324a98200f054c7d2a5 -msgid "" -"`-e LLM_MODEL=proxyllm`, means we use proxy llm(openai interface, " -"fastchat interface...)" -msgstr "" -"`-e LLM_MODEL=proxyllm`, means we use proxy llm(openai interface, " -"fastchat interface...)" - -#: ../../getting_started/getting_started.md:178 -#: 7bc17c46292f43c488dcec172c835d49 -msgid "" -"`-v /data/models/text2vec-large-chinese:/app/models/text2vec-large-" -"chinese`, means we mount the local text2vec model to the docker " -"container." -msgstr "" -"`-v /data/models/text2vec-large-chinese:/app/models/text2vec-large-" -"chinese`, means we mount the local text2vec model to the docker " -"container." - -#: ../../getting_started/getting_started.md:180 -#: 257860df855843eb85383478d2e8baca -msgid "4.3. Run with docker compose" -msgstr "" - -#: ../../getting_started/getting_started.md:202 -#: 143be856423e412c8605488c0e50d2dc -msgid "" -"You can open docker-compose.yml in the project root directory to see more" -" details." -msgstr "" -"You can open docker-compose.yml in the project root directory to see more" -" details." - -#: ../../getting_started/getting_started.md:205 -#: 0dd3dc0d7a7f4565a041ab5855808fd3 -msgid "5. Multiple GPUs" -msgstr "5. Multiple GPUs" - -#: ../../getting_started/getting_started.md:207 -#: 65b1d32a91634c069a80269c44728727 -msgid "" -"DB-GPT will use all available gpu by default. And you can modify the " -"setting `CUDA_VISIBLE_DEVICES=0,1` in `.env` file to use the specific gpu" -" IDs." -msgstr "" -"DB-GPT will use all available gpu by default. And you can modify the " -"setting `CUDA_VISIBLE_DEVICES=0,1` in `.env` file to use the specific gpu" -" IDs." - -#: ../../getting_started/getting_started.md:209 -#: 1ef71b0a976640319211a245943d99d5 -msgid "" -"Optionally, you can also specify the gpu ID to use before the starting " -"command, as shown below:" -msgstr "" -"Optionally, you can also specify the gpu ID to use before the starting " -"command, as shown below:" - -#: ../../getting_started/getting_started.md:219 -#: efbc9ca4b8f44b219460577b691d2c0a -msgid "" -"You can modify the setting `MAX_GPU_MEMORY=xxGib` in `.env` file to " -"configure the maximum memory used by each GPU." -msgstr "" - -#: ../../getting_started/getting_started.md:221 -#: c80f5e6d2a6042ad9ac0ef320cc6d987 -msgid "6. Not Enough Memory" -msgstr "" - -#: ../../getting_started/getting_started.md:223 -#: b8151a333f804489ad6a2b59e739a8ed -msgid "DB-GPT supported 8-bit quantization and 4-bit quantization." -msgstr "" - -#: ../../getting_started/getting_started.md:225 -#: be32dacd8bb84a19985417bd1b78db0f -msgid "" -"You can modify the setting `QUANTIZE_8bit=True` or `QUANTIZE_4bit=True` " -"in `.env` file to use quantization(8-bit quantization is enabled by " -"default)." -msgstr "" - -#: ../../getting_started/getting_started.md:227 -#: 247509e1392e4b4a8d8cdc59f2f94d37 -msgid "" -"Llama-2-70b with 8-bit quantization can run with 80 GB of VRAM, and 4-bit" -" quantization can run with 48 GB of VRAM." -msgstr "" -"Llama-2-70b with 8-bit quantization can run with 80 GB of VRAM, and 4-bit" -" quantization can run with 48 GB of VRAM." - -#: ../../getting_started/getting_started.md:229 -#: 4e8def991b8a491c83c29214e5f80669 -msgid "" -"Note: you need to install the latest dependencies according to " -"[requirements.txt](https://github.com/eosphoros-ai/DB-" -"GPT/blob/main/requirements.txt)." -msgstr "" -"Note: you need to install the latest dependencies according to " -"[requirements.txt](https://github.com/eosphoros-ai/DB-" -"GPT/blob/main/requirements.txt)." - -#: ../../getting_started/getting_started.md:232 -#: 85f7bb08aa714f5db6db00d905dd9dc8 -msgid "" -"Here are some of the VRAM size usage of the models we tested in some " -"common scenarios." -msgstr "" -"Here are some of the VRAM size usage of the models we tested in some " -"common scenarios." - -#: ../../getting_started/getting_started.md:50 165d0902ed064bbaa8b0bbe84befe139 -msgid "Model" -msgstr "Model" - -#: ../../getting_started/getting_started.md:50 d077bca9cada4a9b89037ef5ab494c26 -msgid "Quantize" -msgstr "Quantize" - -#: ../../getting_started/getting_started.md:50 42723863614e42b1aa6c664bfd197474 -#: b71ce0c19de7471787cbbc09d6137a4b -msgid "vicuna-7b-v1.5" -msgstr "vicuna-7b-v1.5" - -#: ../../getting_started/getting_started.md:50 2654d358528a48e38bec445644ffd20a -#: 2ad34cd14f54422491464967331d83fc 3b42a055e72847ec99d8d131fa9f5f84 -#: 6641e98d9bed44ee853fe7a11263a88b a69801bc92f143aa9e0818886ef6eade -#: daa418b33705484ba944b0d92981a501 fc26bd1dace2432ca64b99ca16c2c80f -msgid "4-bit" -msgstr "4-bit" - -#: ../../getting_started/getting_started.md:50 1688f8a0972c4026abf69b5186d92137 -#: 683de09d524a4084bcdad1a184206f87 74586e40b480444591dc884e7f3f683f -#, fuzzy -msgid "8 GB" -msgstr "24 GB" - -#: ../../getting_started/getting_started.md:50 13aa8cac7a784ad1a1b58b166be99711 -#: 32633a38c1f44aac92f9647ee7867cd1 3b7fea4236174e2bb33894fd8234eddb -#: 3b8104af560e41f285d9c433e19f6cb7 5862f0c57e2c411dada47fe71f6a74bd -#: 6425f53f197742c8b3153a79cf4a220a d1fa83af3a884714a72f7a0af5f3be23 -msgid "8-bit" -msgstr "8-bit" - -#: ../../getting_started/getting_started.md:50 107ed4fb15c44cb5bb7020a8092f7341 -#: 1d1791894226418ea623abdecd3107ba 1fdc42ef874f4022be31df7696e6a5de -#: 718c49ddac8e4086a75cdbba166dc3cb 99404c8333974ae7a1e68885f4471b32 -#: da59674e4418488583cf4865545ad752 -#, fuzzy -msgid "12 GB" -msgstr "24 GB" - -#: ../../getting_started/getting_started.md:50 79bf82a6dc9f4c22af779be4b1d2d13c -#: b5bde8f01fc343baa567806fd53070dc -msgid "vicuna-13b-v1.5" -msgstr "vicuna-13b-v1.5" - -#: ../../getting_started/getting_started.md:50 362720115dd64143a214b3b9d3069512 -#: e0545557159b44dea0522a1848170216 e3c6ab8f25bc4adbae3b3087716a1efe -#, fuzzy -msgid "20 GB" -msgstr "24 GB" - -#: ../../getting_started/getting_started.md:50 295fd7d6e6c846748a1f2c82f8c79ba0 -#: 55efa8e8e4e74efc865df87fcfade84d -msgid "llama-2-7b" -msgstr "llama-2-7b" - -#: ../../getting_started/getting_started.md:50 15b1e541bdac43fda1dcccf2aaeaa40f -#: 5785954810bc45369ed1745f5c503c9c -msgid "llama-2-13b" -msgstr "llama-2-13b" - -#: ../../getting_started/getting_started.md:50 185892d421684c1b903c04ea9b6653d7 -#: d7970a5fe574434798d72427436c82d5 -msgid "llama-2-70b" -msgstr "llama-2-70b" - -#: ../../getting_started/getting_started.md:50 f732a7f73a504bd1b56b42dab1114d04 -#, fuzzy -msgid "48 GB" -msgstr "24 GB" - -#: ../../getting_started/getting_started.md:50 04642b0dd4bc4563a45c6d15fa1d8f07 -#, fuzzy -msgid "80 GB" -msgstr "24 GB" - -#: ../../getting_started/getting_started.md:50 b9c4d8b71b1e4185bab24a857433f884 -#: fc1b1927cc344e2e91bb7047c79ad227 -msgid "baichuan-7b" -msgstr "" - -#: ../../getting_started/getting_started.md:50 c92417b527a04d82ac9caa837884113c -#: dc17ae982c154b988433a0c623301bcb -msgid "baichuan-13b" -msgstr "baichuan-13b" +"🚀 DB-GPT-Plugins: https://github.com/eosphoros-ai/DB-GPT-Web | DB-GPT " +"Plugins Repo, Which support AutoGPT plugin." +msgstr "🚀 DB-GPT-Plugins: https://github.com/eosphoros-ai/DB-GPT-Web | DB-GPT " +"Plugins Repo, Which support AutoGPT plugin." #~ msgid "4.2. Run with docker compose" #~ msgstr "4.2. Run with docker compose" @@ -519,3 +144,411 @@ msgstr "baichuan-13b" #~ msgid "prepare server sql script" #~ msgstr "准备db-gpt server sql脚本" +#~ msgid "" +#~ "This tutorial gives you a quick " +#~ "walkthrough about use DB-GPT with " +#~ "you environment and data." +#~ msgstr "本教程为您提供了关于如何使用DB-GPT的使用指南。" + +#~ msgid "Installation" +#~ msgstr "安装" + +#~ msgid "To get started, install DB-GPT with the following steps." +#~ msgstr "请按照以下步骤安装DB-GPT" + +#~ msgid "1. Hardware Requirements" +#~ msgstr "1. 硬件要求" + +#~ msgid "" +#~ "As our project has the ability to" +#~ " achieve ChatGPT performance of over " +#~ "85%, there are certain hardware " +#~ "requirements. However, overall, the project" +#~ " can be deployed and used on " +#~ "consumer-grade graphics cards. The specific" +#~ " hardware requirements for deployment are" +#~ " as follows:" +#~ msgstr "由于我们的项目有能力达到85%以上的ChatGPT性能,所以对硬件有一定的要求。但总体来说,我们在消费级的显卡上即可完成项目的部署使用,具体部署的硬件说明如下:" + +#~ msgid "GPU" +#~ msgstr "GPU" + +#~ msgid "VRAM Size" +#~ msgstr "显存大小" + +#~ msgid "Performance" +#~ msgstr "显存大小" + +#~ msgid "RTX 4090" +#~ msgstr "RTX 4090" + +#~ msgid "24 GB" +#~ msgstr "24 GB" + +#~ msgid "Smooth conversation inference" +#~ msgstr "可以流畅的进行对话推理,无卡顿" + +#~ msgid "RTX 3090" +#~ msgstr "RTX 3090" + +#~ msgid "Smooth conversation inference, better than V100" +#~ msgstr "可以流畅进行对话推理,有卡顿感,但好于V100" + +#~ msgid "V100" +#~ msgstr "V100" + +#~ msgid "16 GB" +#~ msgstr "16 GB" + +#~ msgid "Conversation inference possible, noticeable stutter" +#~ msgstr "可以进行对话推理,有明显卡顿" + +#~ msgid "2. Install" +#~ msgstr "2. 安装" + +#~ msgid "" +#~ "We use [Chroma embedding " +#~ "database](https://github.com/chroma-core/chroma) as " +#~ "the default for our vector database " +#~ "and use SQLite as the default for" +#~ " our database, so there is no " +#~ "need for special installation. If you" +#~ " choose to connect to other " +#~ "databases, you can follow our tutorial" +#~ " for installation and configuration. For" +#~ " the entire installation process of " +#~ "DB-GPT, we use the miniconda3 virtual" +#~ " environment. Create a virtual environment" +#~ " and install the Python dependencies." +#~ msgstr "" +#~ "向量数据库我们默认使用的是Chroma内存数据库,所以无需特殊安装,如果有需要连接其他的同学,可以按照我们的教程进行安装配置" +#~ "。整个DB-GPT的安装过程,我们使用的是miniconda3的虚拟环境。创建虚拟环境,并安装python依赖包" + +#~ msgid "Before use DB-GPT Knowledge Management" +#~ msgstr "使用知识库管理功能之前" + +#~ msgid "" +#~ "Once the environment is installed, we" +#~ " have to create a new folder " +#~ "\"models\" in the DB-GPT project, " +#~ "and then we can put all the " +#~ "models downloaded from huggingface in " +#~ "this directory" +#~ msgstr "" +#~ "环境安装完成后,我们必须在DB-" +#~ "GPT项目中创建一个新文件夹\"models\",然后我们可以把从huggingface下载的所有模型放到这个目录下。" + +#~ msgid "Notice make sure you have install git-lfs" +#~ msgstr "确保你已经安装了git-lfs" + +#~ msgid "" +#~ "The model files are large and will" +#~ " take a long time to download. " +#~ "During the download, let's configure the" +#~ " .env file, which needs to be " +#~ "copied and created from the " +#~ ".env.template" +#~ msgstr "模型文件很大,需要很长时间才能下载。在下载过程中,让我们配置.env文件,它需要从。env.template中复制和创建。" + +#~ msgid "cp .env.template .env" +#~ msgstr "cp .env.template .env" + +#~ msgid "" +#~ "You can configure basic parameters in" +#~ " the .env file, for example setting" +#~ " LLM_MODEL to the model to be " +#~ "used" +#~ msgstr "您可以在.env文件中配置基本参数,例如将LLM_MODEL设置为要使用的模型。" + +#~ msgid "" +#~ "([Vicuna-v1.5](https://huggingface.co/lmsys/vicuna-13b-v1.5) " +#~ "based on llama-2 has been released, " +#~ "we recommend you set `LLM_MODEL=vicuna-" +#~ "13b-v1.5` to try this model)" +#~ msgstr "" + +#~ msgid "3. Run" +#~ msgstr "3. 运行" + +#~ msgid "" +#~ "You can refer to this document to" +#~ " obtain the Vicuna weights: " +#~ "[Vicuna](https://github.com/lm-sys/FastChat/blob/main/README.md" +#~ "#model-weights) ." +#~ msgstr "" +#~ "关于基础模型, 可以根据[Vicuna](https://github.com/lm-" +#~ "sys/FastChat/blob/main/README.md#model-weights) 合成教程进行合成。" + +#~ msgid "" +#~ "If you have difficulty with this " +#~ "step, you can also directly use " +#~ "the model from [this " +#~ "link](https://huggingface.co/Tribbiani/vicuna-7b) as " +#~ "a replacement." +#~ msgstr "" +#~ "如果此步有困难的同学,也可以直接使用[此链接](https://huggingface.co/Tribbiani/vicuna-" +#~ "7b)上的模型进行替代。" + +#~ msgid "" +#~ "set .env configuration set your vector" +#~ " store type, eg:VECTOR_STORE_TYPE=Chroma, now " +#~ "we support Chroma and Milvus(version >" +#~ " 2.1)" +#~ msgstr "" +#~ "在.env文件设置向量数据库环境变量,eg:VECTOR_STORE_TYPE=Chroma, 目前我们支持了 " +#~ "Chroma and Milvus(version >2.1) " + +#~ msgid "1.Run db-gpt server" +#~ msgstr "运行模型服务" + +#~ msgid "Open http://localhost:5000 with your browser to see the product." +#~ msgstr "打开浏览器访问http://localhost:5000" + +#~ msgid "" +#~ "If you want to access an external" +#~ " LLM service, you need to 1.set " +#~ "the variables LLM_MODEL=YOUR_MODEL_NAME " +#~ "MODEL_SERVER=YOUR_MODEL_SERVER(eg:http://localhost:5000) in " +#~ "the .env file. 2.execute dbgpt_server.py " +#~ "in light mode" +#~ msgstr "如果你想访问外部的大模型服务,1.需要在.env文件设置模型名和外部模型服务地址。2.使用light模式启动服务" + +#~ msgid "" +#~ "If you want to learn about " +#~ "dbgpt-webui, read https://github./csunny/DB-" +#~ "GPT/tree/new-page-framework/datacenter" +#~ msgstr "" +#~ "如果你想了解DB-GPT前端服务,访问https://github.com/csunny/DB-GPT/tree" +#~ "/new-page-framework/datacenter" + +#~ msgid "4. Docker (Experimental)" +#~ msgstr "4. Docker (Experimental)" + +#~ msgid "4.1 Building Docker image" +#~ msgstr "4.1 Building Docker image" + +#~ msgid "Review images by listing them:" +#~ msgstr "Review images by listing them:" + +#~ msgid "Output should look something like the following:" +#~ msgstr "Output should look something like the following:" + +#~ msgid "" +#~ "`eosphorosai/dbgpt` is the base image, " +#~ "which contains the project's base " +#~ "dependencies and a sqlite database. " +#~ "`eosphorosai/dbgpt-allinone` build from " +#~ "`eosphorosai/dbgpt`, which contains a mysql" +#~ " database." +#~ msgstr "" + +#~ msgid "You can pass some parameters to docker/build_all_images.sh." +#~ msgstr "You can pass some parameters to docker/build_all_images.sh." + +#~ msgid "" +#~ "You can execute the command `bash " +#~ "docker/build_all_images.sh --help` to see more" +#~ " usage." +#~ msgstr "" +#~ "You can execute the command `bash " +#~ "docker/build_all_images.sh --help` to see more" +#~ " usage." + +#~ msgid "4.2. Run all in one docker container" +#~ msgstr "4.2. Run all in one docker container" + +#~ msgid "**Run with local model and SQLite database**" +#~ msgstr "**Run with local model**" + +#~ msgid "" +#~ "`-e LLM_MODEL=vicuna-13b`, means we use" +#~ " vicuna-13b as llm model, see " +#~ "/pilot/configs/model_config.LLM_MODEL_CONFIG" +#~ msgstr "" +#~ "`-e LLM_MODEL=vicuna-13b`, means we use" +#~ " vicuna-13b as llm model, see " +#~ "/pilot/configs/model_config.LLM_MODEL_CONFIG" + +#~ msgid "" +#~ "`-v /data/models:/app/models`, means we mount" +#~ " the local model file directory " +#~ "`/data/models` to the docker container " +#~ "directory `/app/models`, please replace it " +#~ "with your model file directory." +#~ msgstr "" +#~ "`-v /data/models:/app/models`, means we mount" +#~ " the local model file directory " +#~ "`/data/models` to the docker container " +#~ "directory `/app/models`, please replace it " +#~ "with your model file directory." + +#~ msgid "You can see log with command:" +#~ msgstr "You can see log with command:" + +#~ msgid "**Run with local model and MySQL database**" +#~ msgstr "**Run with local model**" + +#~ msgid "**Run with openai interface**" +#~ msgstr "**Run with openai interface**" + +#~ msgid "" +#~ "`-e LLM_MODEL=proxyllm`, means we use " +#~ "proxy llm(openai interface, fastchat " +#~ "interface...)" +#~ msgstr "" +#~ "`-e LLM_MODEL=proxyllm`, means we use " +#~ "proxy llm(openai interface, fastchat " +#~ "interface...)" + +#~ msgid "" +#~ "`-v /data/models/text2vec-large-chinese:/app/models" +#~ "/text2vec-large-chinese`, means we mount" +#~ " the local text2vec model to the " +#~ "docker container." +#~ msgstr "" +#~ "`-v /data/models/text2vec-large-chinese:/app/models" +#~ "/text2vec-large-chinese`, means we mount" +#~ " the local text2vec model to the " +#~ "docker container." + +#~ msgid "4.3. Run with docker compose" +#~ msgstr "" + +#~ msgid "" +#~ "You can open docker-compose.yml in " +#~ "the project root directory to see " +#~ "more details." +#~ msgstr "" +#~ "You can open docker-compose.yml in " +#~ "the project root directory to see " +#~ "more details." + +#~ msgid "5. Multiple GPUs" +#~ msgstr "5. Multiple GPUs" + +#~ msgid "" +#~ "DB-GPT will use all available gpu" +#~ " by default. And you can modify " +#~ "the setting `CUDA_VISIBLE_DEVICES=0,1` in " +#~ "`.env` file to use the specific " +#~ "gpu IDs." +#~ msgstr "" +#~ "DB-GPT will use all available gpu" +#~ " by default. And you can modify " +#~ "the setting `CUDA_VISIBLE_DEVICES=0,1` in " +#~ "`.env` file to use the specific " +#~ "gpu IDs." + +#~ msgid "" +#~ "Optionally, you can also specify the " +#~ "gpu ID to use before the starting" +#~ " command, as shown below:" +#~ msgstr "" +#~ "Optionally, you can also specify the " +#~ "gpu ID to use before the starting" +#~ " command, as shown below:" + +#~ msgid "" +#~ "You can modify the setting " +#~ "`MAX_GPU_MEMORY=xxGib` in `.env` file to " +#~ "configure the maximum memory used by " +#~ "each GPU." +#~ msgstr "" + +#~ msgid "6. Not Enough Memory" +#~ msgstr "" + +#~ msgid "DB-GPT supported 8-bit quantization and 4-bit quantization." +#~ msgstr "" + +#~ msgid "" +#~ "You can modify the setting " +#~ "`QUANTIZE_8bit=True` or `QUANTIZE_4bit=True` in " +#~ "`.env` file to use quantization(8-bit " +#~ "quantization is enabled by default)." +#~ msgstr "" + +#~ msgid "" +#~ "Llama-2-70b with 8-bit quantization can " +#~ "run with 80 GB of VRAM, and " +#~ "4-bit quantization can run with 48 " +#~ "GB of VRAM." +#~ msgstr "" +#~ "Llama-2-70b with 8-bit quantization can " +#~ "run with 80 GB of VRAM, and " +#~ "4-bit quantization can run with 48 " +#~ "GB of VRAM." + +#~ msgid "" +#~ "Note: you need to install the " +#~ "latest dependencies according to " +#~ "[requirements.txt](https://github.com/eosphoros-ai/DB-" +#~ "GPT/blob/main/requirements.txt)." +#~ msgstr "" +#~ "Note: you need to install the " +#~ "latest dependencies according to " +#~ "[requirements.txt](https://github.com/eosphoros-ai/DB-" +#~ "GPT/blob/main/requirements.txt)." + +#~ msgid "" +#~ "Here are some of the VRAM size " +#~ "usage of the models we tested in" +#~ " some common scenarios." +#~ msgstr "" +#~ "Here are some of the VRAM size " +#~ "usage of the models we tested in" +#~ " some common scenarios." + +#~ msgid "Model" +#~ msgstr "Model" + +#~ msgid "Quantize" +#~ msgstr "Quantize" + +#~ msgid "vicuna-7b-v1.5" +#~ msgstr "vicuna-7b-v1.5" + +#~ msgid "4-bit" +#~ msgstr "4-bit" + +#~ msgid "8 GB" +#~ msgstr "24 GB" + +#~ msgid "8-bit" +#~ msgstr "8-bit" + +#~ msgid "12 GB" +#~ msgstr "24 GB" + +#~ msgid "vicuna-13b-v1.5" +#~ msgstr "vicuna-13b-v1.5" + +#~ msgid "20 GB" +#~ msgstr "24 GB" + +#~ msgid "llama-2-7b" +#~ msgstr "llama-2-7b" + +#~ msgid "llama-2-13b" +#~ msgstr "llama-2-13b" + +#~ msgid "llama-2-70b" +#~ msgstr "llama-2-70b" + +#~ msgid "48 GB" +#~ msgstr "24 GB" + +#~ msgid "80 GB" +#~ msgstr "24 GB" + +#~ msgid "baichuan-7b" +#~ msgstr "" + +#~ msgid "baichuan-13b" +#~ msgstr "baichuan-13b" + +#~ msgid "" +#~ "[应用使用教程](https://db-" +#~ "gpt.readthedocs.io/en/latest/getting_started/application/chatdb/chatdb.html)." +#~ msgstr "" + From 4df7609c9b5e0e8bf114bac7405636ad5367677a Mon Sep 17 00:00:00 2001 From: aries_ckt <916701291@qq.com> Date: Wed, 23 Aug 2023 17:09:38 +0800 Subject: [PATCH 25/30] feat:bge embedding model env --- .env.template | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.env.template b/.env.template index 69152e7fa..64d3b2f67 100644 --- a/.env.template +++ b/.env.template @@ -50,6 +50,9 @@ QUANTIZE_8bit=True #** EMBEDDING SETTINGS **# #*******************************************************************# EMBEDDING_MODEL=text2vec +#EMBEDDING_MODEL=m3e-large +#EMBEDDING_MODEL=bge-large-en +#EMBEDDING_MODEL=bge-large-zh KNOWLEDGE_CHUNK_SIZE=500 KNOWLEDGE_SEARCH_TOP_SIZE=5 ## EMBEDDING_TOKENIZER - Tokenizer to use for chunking large inputs From d231f9f89bfc0c828822076c70e18ebf81395e79 Mon Sep 17 00:00:00 2001 From: aries_ckt <916701291@qq.com> Date: Wed, 23 Aug 2023 17:33:57 +0800 Subject: [PATCH 26/30] doc:version update --- docs/conf.py | 2 +- setup.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index 522813fd7..1fc61dc1e 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -14,7 +14,7 @@ project = "DB-GPT" copyright = "2023, csunny" author = "csunny" -version = "👏👏 0.3.5" +version = "👏👏 0.3.6" html_title = project + " " + version # -- General configuration --------------------------------------------------- diff --git a/setup.py b/setup.py index 5136f4fb8..3c4d16db9 100644 --- a/setup.py +++ b/setup.py @@ -159,11 +159,11 @@ all_requires() setuptools.setup( name="db-gpt", packages=find_packages(exclude=("tests", "*.tests", "*.tests.*", "examples")), - version="0.3.5", + version="0.3.6", author="csunny", author_email="cfqcsunny@gmail.com", description="DB-GPT is an experimental open-source project that uses localized GPT large models to interact with your data and environment." - " With this solution, you can be assured that there is no risk of data leakage, and your data is 100% private and secure.", + " With this solution, you can be assured that there is no risk of data leakage, and your data is 100% private and secure.", long_description=long_description, long_description_content_type="text/markdown", install_requires=parse_requirements("requirements.txt"), From 4e3527e9d719bfd005eb4d1f9068617b1a4cf8b2 Mon Sep 17 00:00:00 2001 From: aries_ckt <916701291@qq.com> Date: Wed, 23 Aug 2023 18:17:50 +0800 Subject: [PATCH 27/30] style:fmt --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 3c4d16db9..141f59fa4 100644 --- a/setup.py +++ b/setup.py @@ -163,7 +163,7 @@ setuptools.setup( author="csunny", author_email="cfqcsunny@gmail.com", description="DB-GPT is an experimental open-source project that uses localized GPT large models to interact with your data and environment." - " With this solution, you can be assured that there is no risk of data leakage, and your data is 100% private and secure.", + " With this solution, you can be assured that there is no risk of data leakage, and your data is 100% private and secure.", long_description=long_description, long_description_content_type="text/markdown", install_requires=parse_requirements("requirements.txt"), From 95fce1bab261636389fe3619b8ffc4794f4b469f Mon Sep 17 00:00:00 2001 From: FangYin Cheng Date: Wed, 23 Aug 2023 10:56:37 +0800 Subject: [PATCH 28/30] fix: Fix docker build error --- docker/base/build_image.sh | 4 ++-- setup.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docker/base/build_image.sh b/docker/base/build_image.sh index 101dfebad..03a3185c4 100755 --- a/docker/base/build_image.sh +++ b/docker/base/build_image.sh @@ -4,7 +4,7 @@ SCRIPT_LOCATION=$0 cd "$(dirname "$SCRIPT_LOCATION")" WORK_DIR=$(pwd) -BASE_IMAGE="nvidia/cuda:11.8.0-devel-ubuntu22.04" +BASE_IMAGE="nvidia/cuda:11.8.0-runtime-ubuntu22.04" IMAGE_NAME="eosphorosai/dbgpt" # zh: https://pypi.tuna.tsinghua.edu.cn/simple PIP_INDEX_URL="https://pypi.org/simple" @@ -14,7 +14,7 @@ BUILD_LOCAL_CODE="false" LOAD_EXAMPLES="true" usage () { - echo "USAGE: $0 [--base-image nvidia/cuda:11.8.0-devel-ubuntu22.04] [--image-name db-gpt]" + echo "USAGE: $0 [--base-image nvidia/cuda:11.8.0-runtime-ubuntu22.04] [--image-name db-gpt]" echo " [-b|--base-image base image name] Base image name" echo " [-n|--image-name image name] Current image name, default: db-gpt" echo " [-i|--pip-index-url pip index url] Pip index url, default: https://pypi.org/simple" diff --git a/setup.py b/setup.py index b12c35dfa..a9ee31213 100644 --- a/setup.py +++ b/setup.py @@ -216,8 +216,8 @@ def torch_requires( cuda_version = get_cuda_version() if not cuda_version: torch_pkgs = [ - f"torch=={torch_version}+cpu", - f"torchvision=={torchvision_version}+cpu", + f"torch=={torch_version}", + f"torchvision=={torchvision_version}", f"torchaudio=={torchaudio_version}", ] else: From bbfad9084591ed56e4eea0f440b3092ee16b4d04 Mon Sep 17 00:00:00 2001 From: FangYin Cheng Date: Wed, 23 Aug 2023 14:57:56 +0800 Subject: [PATCH 29/30] feat(CICD): Add latest tag for docker image --- .github/workflows/docker-image-publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker-image-publish.yml b/.github/workflows/docker-image-publish.yml index bbc37b57d..c2d36bf0e 100644 --- a/.github/workflows/docker-image-publish.yml +++ b/.github/workflows/docker-image-publish.yml @@ -32,4 +32,4 @@ jobs: file: ./docker/base/Dockerfile platforms: linux/amd64 push: true - tags: eosphorosai/dbgpt:${{ github.ref_name }} \ No newline at end of file + tags: eosphorosai/dbgpt:${{ github.ref_name }},eosphorosai/dbgpt:latest \ No newline at end of file From 57153692150a4f7f3d98dfcffe73915c87e7db65 Mon Sep 17 00:00:00 2001 From: FangYin Cheng Date: Wed, 23 Aug 2023 16:08:04 +0800 Subject: [PATCH 30/30] doc: Modify docker install document --- docs/getting_started/install/docker/docker.md | 68 ++++++++++++++----- 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/docs/getting_started/install/docker/docker.md b/docs/getting_started/install/docker/docker.md index 07aae5349..377ad0297 100644 --- a/docs/getting_started/install/docker/docker.md +++ b/docs/getting_started/install/docker/docker.md @@ -3,46 +3,82 @@ Docker Install ### Docker (Experimental) -#### 1. Building Docker image +#### 1. Preparing docker images + +**Pull docker image from the [Eosphoros AI Docker Hub](https://hub.docker.com/u/eosphorosai)** ```bash -$ bash docker/build_all_images.sh +docker pull eosphorosai/dbgpt:latest +``` + +**(Optional) Building Docker image** + +```bash +bash docker/build_all_images.sh ``` Review images by listing them: ```bash -$ docker images|grep db-gpt +docker images|grep "eosphorosai/dbgpt" ``` Output should look something like the following: ``` -db-gpt-allinone latest e1ffd20b85ac 45 minutes ago 14.5GB -db-gpt latest e36fb0cca5d9 3 hours ago 14GB +eosphorosai/dbgpt-allinone latest 349d49726588 27 seconds ago 15.1GB +eosphorosai/dbgpt latest eb3cdc5b4ead About a minute ago 14.5GB ``` +`eosphorosai/dbgpt` is the base image, which contains the project's base dependencies and a sqlite database. `eosphorosai/dbgpt-allinone` build from `eosphorosai/dbgpt`, which contains a mysql database. + You can pass some parameters to docker/build_all_images.sh. ```bash -$ bash docker/build_all_images.sh \ ---base-image nvidia/cuda:11.8.0-devel-ubuntu22.04 \ +bash docker/build_all_images.sh \ +--base-image nvidia/cuda:11.8.0-runtime-ubuntu22.04 \ --pip-index-url https://pypi.tuna.tsinghua.edu.cn/simple \ --language zh ``` You can execute the command `bash docker/build_all_images.sh --help` to see more usage. -#### 2. Run all in one docker container +#### 2. Run docker container -**Run with local model** +**Run with local model and SQLite database** ```bash -$ docker run --gpus "device=0" -d -p 3306:3306 \ +docker run --gpus all -d \ + -p 5000:5000 \ + -e LOCAL_DB_TYPE=sqlite \ + -e LOCAL_DB_PATH=data/default_sqlite.db \ + -e LLM_MODEL=vicuna-13b-v1.5 \ + -e LANGUAGE=zh \ + -v /data/models:/app/models \ + --name dbgpt \ + eosphorosai/dbgpt +``` + +Open http://localhost:5000 with your browser to see the product. + + +- `-e LLM_MODEL=vicuna-13b-v1.5`, means we use vicuna-13b-v1.5 as llm model, see /pilot/configs/model_config.LLM_MODEL_CONFIG +- `-v /data/models:/app/models`, means we mount the local model file directory `/data/models` to the docker container directory `/app/models`, please replace it with your model file directory. + +You can see log with command: + +```bash +docker logs dbgpt -f +``` + +**Run with local model and MySQL database** + +```bash +docker run --gpus all -d -p 3306:3306 \ -p 5000:5000 \ -e LOCAL_DB_HOST=127.0.0.1 \ -e LOCAL_DB_PASSWORD=aa123456 \ -e MYSQL_ROOT_PASSWORD=aa123456 \ - -e LLM_MODEL=vicuna-13b \ + -e LLM_MODEL=vicuna-13b-v1.5 \ -e LANGUAGE=zh \ -v /data/models:/app/models \ --name db-gpt-allinone \ @@ -52,21 +88,21 @@ $ docker run --gpus "device=0" -d -p 3306:3306 \ Open http://localhost:5000 with your browser to see the product. -- `-e LLM_MODEL=vicuna-13b`, means we use vicuna-13b as llm model, see /pilot/configs/model_config.LLM_MODEL_CONFIG +- `-e LLM_MODEL=vicuna-13b-v1.5`, means we use vicuna-13b-v1.5 as llm model, see /pilot/configs/model_config.LLM_MODEL_CONFIG - `-v /data/models:/app/models`, means we mount the local model file directory `/data/models` to the docker container directory `/app/models`, please replace it with your model file directory. You can see log with command: ```bash -$ docker logs db-gpt-allinone -f +docker logs db-gpt-allinone -f ``` **Run with openai interface** ```bash -$ PROXY_API_KEY="You api key" -$ PROXY_SERVER_URL="https://api.openai.com/v1/chat/completions" -$ docker run --gpus "device=0" -d -p 3306:3306 \ +PROXY_API_KEY="You api key" +PROXY_SERVER_URL="https://api.openai.com/v1/chat/completions" +docker run --gpus all -d -p 3306:3306 \ -p 5000:5000 \ -e LOCAL_DB_HOST=127.0.0.1 \ -e LOCAL_DB_PASSWORD=aa123456 \