From fd62f2787738c48628873b9d480d75a7d6ec508d Mon Sep 17 00:00:00 2001 From: Leif <4603009@qq.com> Date: Fri, 3 Sep 2021 19:20:07 +0800 Subject: [PATCH] Upgrade document structure --- README.md | 40 +++-- README_ch.md | 54 +++--- doc/doc_ch/config.md | 14 +- doc/doc_ch/environment.md | 291 ++++++++++++++++++++++++++++++ doc/doc_ch/models_and_config.md | 0 doc/doc_ch/multi_languages.md | 4 +- doc/doc_ch/paddleOCR_overview.md | 2 + doc/doc_ch/quickstart.md | 296 ++++++++++++++++++++++++------- doc/doc_ch/training.md | 0 doc/doc_ch/whl.md | 2 +- doc/doc_en/quickstart_en.md | 209 +++++++++++++++------- doc/joinus.PNG | Bin 189233 -> 192891 bytes 12 files changed, 735 insertions(+), 177 deletions(-) create mode 100644 doc/doc_ch/environment.md create mode 100644 doc/doc_ch/models_and_config.md create mode 100644 doc/doc_ch/paddleOCR_overview.md create mode 100644 doc/doc_ch/training.md diff --git a/README.md b/README.md index 0072e481..96983d4e 100644 --- a/README.md +++ b/README.md @@ -78,25 +78,29 @@ For more model downloads (including multiple languages), please refer to [PP-OCR For a new language request, please refer to [Guideline for new language_requests](#language_requests). ## Tutorials -- [Installation](./doc/doc_en/installation_en.md) - [Quick Start](./doc/doc_en/quickstart_en.md) -- [Code Structure](./doc/doc_en/tree_en.md) -- Algorithm Introduction - - [Text Detection Algorithm](./doc/doc_en/algorithm_overview_en.md) - - [Text Recognition Algorithm](./doc/doc_en/algorithm_overview_en.md) - - [PP-OCR Pipeline](#PP-OCR-Pipeline) -- Model Training/Evaluation - - [Text Detection](./doc/doc_en/detection_en.md) - - [Text Recognition](./doc/doc_en/recognition_en.md) - - [Direction Classification](./doc/doc_en/angle_class_en.md) - - [Yml Configuration](./doc/doc_en/config_en.md) -- Inference and Deployment - - [Quick Inference Based on PIP](./doc/doc_en/whl_en.md) - - [Python Inference](./doc/doc_en/inference_en.md) - - [C++ Inference](./deploy/cpp_infer/readme_en.md) - - [Serving](./deploy/pdserving/README.md) - - [Mobile](./deploy/lite/readme_en.md) - - [Benchmark](./doc/doc_en/benchmark_en.md) +- [PaddleOCR Overview and Installation](./doc/doc_en/paddleOCR_overview.md) +- PP-OCR Industry Landing: from Training to Deployment + - [PP-OCR Model and Configuration](./doc/doc_en/models_and_config_en.md) + - [PP-OCR Model Download](./doc/doc_en/models_list_en.md) + - [Yml Configuration](./doc/doc_en/config_en.md) + - [Python Inference](./doc/doc_en/inference_en.md) + - [PP-OCR Training](./doc/doc_en/training.md) + - [Text Detection](./doc/doc_en/detection_en.md) + - [Text Recognition](./doc/doc_en/recognition_en.md) + - [Direction Classification](./doc/doc_en/angle_class_en.md) + - Inference and Deployment + - [Python Inference](./doc/doc_en/inference_en.md) + - [C++ Inference](./deploy/cpp_infer/readme_en.md) + - [Serving](./deploy/pdserving/README.md) + - [Mobile](./deploy/lite/readme_en.md) + - [Benchmark](./doc/doc_en/benchmark_en.md) +- [PP-Structure: Information Extraction](./ppstructure/README.md) + - [Layout Parser](./ppstructure/layout/README.md) + - [Table Recognition](./ppstructure/table/README.md) +- Academic Circles + - [Two-stage Algorithm](./doc/doc_en/algorithm_overview_en.md) + - [PGNet Algorithm](./doc/doc_en/algorithm_overview_en.md) - Data Annotation and Synthesis - [Semi-automatic Annotation Tool: PPOCRLabel](./PPOCRLabel/README.md) - [Data Synthesis Tool: Style-Text](./StyleText/README.md) diff --git a/README_ch.md b/README_ch.md index aec248f8..1f66613f 100755 --- a/README_ch.md +++ b/README_ch.md @@ -72,36 +72,39 @@ PaddleOCR同时支持动态图与静态图两种编程范式 更多模型下载(包括多语言),可以参考[PP-OCR v2.0 系列模型下载](./doc/doc_ch/models_list.md) ## 文档教程 -- [快速安装](./doc/doc_ch/installation.md) -- [中文OCR模型快速使用](./doc/doc_ch/quickstart.md) -- [多语言OCR模型快速使用](./doc/doc_ch/multi_languages.md) -- [代码组织结构](./doc/doc_ch/tree.md) -- 算法介绍 - - [文本检测](./doc/doc_ch/algorithm_overview.md) - - [文本识别](./doc/doc_ch/algorithm_overview.md) - - [PP-OCR Pipeline](#PP-OCR) - - [端到端PGNet算法](./doc/doc_ch/pgnet.md) -- 模型训练/评估 - - [文本检测](./doc/doc_ch/detection.md) - - [文本识别](./doc/doc_ch/recognition.md) - - [方向分类器](./doc/doc_ch/angle_class.md) - - [yml参数配置文件介绍](./doc/doc_ch/config.md) -- 预测部署 - - [基于pip安装whl包快速推理](./doc/doc_ch/whl.md) - - [基于Python脚本预测引擎推理](./doc/doc_ch/inference.md) - - [基于C++预测引擎推理](./deploy/cpp_infer/readme.md) - - [服务化部署](./deploy/pdserving/README_CN.md) - - [端侧部署](./deploy/lite/readme.md) - - [Benchmark](./doc/doc_ch/benchmark.md) -- 数据集 - - [通用中英文OCR数据集](./doc/doc_ch/datasets.md) - - [手写中文OCR数据集](./doc/doc_ch/handwritten_datasets.md) - - [垂类多语言OCR数据集](./doc/doc_ch/vertical_and_multilingual_datasets.md) +- [快速开始](./doc/doc_ch/quickstart.md) +- [PaddleOCR全景图与安装](./doc/doc_ch/paddleOCR_overview.md) +- PP-OCR产业落地:从训练到部署 + - [PP-OCR模型与配置文件](./doc/doc_ch/models_and_config.md) + - [PP-OCR模型下载](./doc/doc_ch/models_list.md) + - [配置文件内容与生成](./doc/doc_ch/config.md) + - [模型库快速使用](./doc/doc_ch/inference.md) + - [PP-OCR模型训练](./doc/doc_ch/training.md) + - [文本检测](./doc/doc_ch/detection.md) + - [文本识别](./doc/doc_ch/recognition.md) + - [方向分类器](./doc/doc_ch/angle_class.md) + - PP-OCR模型推理部署 + - [基于Python脚本预测引擎推理](./doc/doc_ch/inference.md) + - [基于C++预测引擎推理](./deploy/cpp_infer/readme.md) + - [服务化部署](./deploy/pdserving/README_CN.md) + - [端侧部署](./deploy/lite/readme.md) + - [Benchmark](./doc/doc_ch/benchmark.md) +- [PP-Structure信息提取](./ppstructure/README_ch.md) + - [版面分析](./ppstructure/layout/README_ch.md) + - [表格识别](./ppstructure/table/README_ch.md) - 数据标注与合成 - [半自动标注工具PPOCRLabel](./PPOCRLabel/README_ch.md) - [数据合成工具Style-Text](./StyleText/README_ch.md) - [其它数据标注工具](./doc/doc_ch/data_annotation.md) - [其它数据合成工具](./doc/doc_ch/data_synthesis.md) +- OCR学术圈 + - [两阶段模型介绍与下载](./doc/doc_ch/algorithm_overview.md) + - [端到端PGNet算法](./doc/doc_ch/pgnet.md) + - 模型训练 +- 数据集 + - [通用中英文OCR数据集](./doc/doc_ch/datasets.md) + - [手写中文OCR数据集](./doc/doc_ch/handwritten_datasets.md) + - [垂类多语言OCR数据集](./doc/doc_ch/vertical_and_multilingual_datasets.md) - [效果展示](#效果展示) - FAQ - [【精选】OCR精选10个问题](./doc/doc_ch/FAQ.md) @@ -111,6 +114,7 @@ PaddleOCR同时支持动态图与静态图两种编程范式 - [参考文献](./doc/doc_ch/reference.md) - [许可证书](#许可证书) - [贡献代码](#贡献代码) +- [代码组织结构](./doc/doc_ch/tree.md) diff --git a/doc/doc_ch/config.md b/doc/doc_ch/config.md index 74cd2381..9dd78580 100644 --- a/doc/doc_ch/config.md +++ b/doc/doc_ch/config.md @@ -1,4 +1,8 @@ -## 可选参数列表 +# 配置文件内容与生成 + +[toc] + +## 1. 可选参数列表 以下列表可以通过`--help`查看 @@ -8,10 +12,10 @@ | -o | ALL | 设置配置文件里的参数内容 | None | 使用-o配置相较于-c选择的配置文件具有更高的优先级。例如:`-o Global.use_gpu=false` | -## 配置文件参数介绍 +## 2. 配置文件参数介绍 以 `rec_chinese_lite_train_v2.0.yml ` 为例 -### Global +### 2.1 Global | 字段 | 用途 | 默认值 | 备注 | | :----------------------: | :---------------------: | :--------------: | :--------------------: | @@ -121,3 +125,7 @@ | batch_size_per_card | 训练时单卡batch size | 256 | \ | | drop_last | 是否丢弃因数据集样本数不能被 batch_size 整除而产生的最后一个不完整的mini-batch | True | \ | | num_workers | 用于加载数据的子进程个数,若为0即为不开启子进程,在主进程中进行数据加载 | 8 | \ | + +## 3. 多语言配置文件生成 + +【参考识别模型训练补充内容】 diff --git a/doc/doc_ch/environment.md b/doc/doc_ch/environment.md new file mode 100644 index 00000000..956d5afa --- /dev/null +++ b/doc/doc_ch/environment.md @@ -0,0 +1,291 @@ +# 零基础Python环境搭建 + +[toc] + +## Windows + +### 第1步:安装Anaconda + +- 说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包 + - Anaconda是1个常用的python包管理程序 + - 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境。 +- Anaconda下载: + - 地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D + - 大部分win10电脑均为64位操作系统,选择x86_64版本;若电脑为32位操作系统,则选择x86.exe + + + - 下载完成后,双击安装程序进入图形界面 + - 默认安装位置为C盘,建议将安装位置更改到D盘: + + + - 勾选conda加入环境变量,忽略警告: + + + +### 第2步:打开终端并创建conda环境 + +- 打开Anaconda Prompt终端:左下角Windows Start Menu -> Anaconda3 -> Anaconda Prompt启动控制台 + + + + +- 创建新的conda环境 + + ```shell + # 在命令行输入以下命令,创建名为paddle_env的环境 + # 此处为加速下载,使用清华源 + conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ # 这是一行命令 + ``` + + 该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间 + + 之后命令行中会输出提示信息,输入y并回车继续安装 + + + +- 激活刚创建的conda环境,在命令行中输入以下命令: + + ```shell + # 激活paddle_env环境 + conda activate paddle_env + # 查看当前python的位置 + where python + ``` + + + + + + + + + +以上anaconda环境和python环境安装完毕 + + + +## Mac + +### 第1步:安装Anaconda + +- 说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包 + - Anaconda是1个常用的python包管理程序 + - 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境 +- Anaconda下载: + - 地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D + + + + - 选择最下方的`Anaconda3-2021.05-MacOSX-x86_64.pkg`下载 +- 下载完成后,双击.pkg文件进入图形界面 + - 按默认设置即可,安装需要花费一段时间 +- 建议安装vscode或pycharm等代码编辑器 + +### 第2步:打开终端并创建conda环境 + +- 打开终端 + + - 同时按下command键和空格键,在聚焦搜索中输入"终端",双击进入终端 + +- **将conda加入环境变量** + + - 加入环境变量是为了让系统能识别conda命令 + + - 输入以下命令,在终端中打开`~/.bash_profile`: + + ```shell + vim ~/.bash_profile + ``` + + - 在`~/.bash_profile`中将conda添加为环境变量: + + ```shell + # 先按i进入编辑模式 + # 在第一行输入: + export PATH="~/opt/anaconda3/bin:$PATH" + # 若安装时自定义了安装位置,则将~/opt/anaconda3/bin改为自定义的安装目录下的bin文件夹 + ``` + + ```shell + # 修改后的~/.bash_profile文件应如下(其中xxx为用户名): + export PATH="~/opt/anaconda3/bin:$PATH" + # >>> conda initialize >>> + # !! Contents within this block are managed by 'conda init' !! + __conda_setup="$('/Users/xxx/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" + if [ $? -eq 0 ]; then + eval "$__conda_setup" + else + if [ -f "/Users/xxx/opt/anaconda3/etc/profile.d/conda.sh" ]; then + . "/Users/xxx/opt/anaconda3/etc/profile.d/conda.sh" + else + export PATH="/Users/xxx/opt/anaconda3/bin:$PATH" + fi + fi + unset __conda_setup + # <<< conda initialize <<< + ``` + + - 修改完成后,先按`esc`键退出编辑模式,再输入`:wq!`并回车,以保存退出 + + - 验证是否能识别conda命令: + + - 在终端中输入`source ~/.bash_profile`以更新环境变量 + - 再在终端输入`conda info --envs`,若能显示当前有base环境,则conda已加入环境变量 + +- 创建新的conda环境 + + ```shell + # 在命令行输入以下命令,创建名为paddle_env的环境 + # 此处为加速下载,使用清华源 + conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ + ``` + + - 该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间 + + - 之后命令行中会输出提示信息,输入y并回车继续安装 + + - + +- 激活刚创建的conda环境,在命令行中输入以下命令: + + ```shell + # 激活paddle_env环境 + conda activate paddle_env + # 查看当前python的位置 + where python + ``` + + + +以上anaconda环境和python环境安装完毕 + + + +## Linux + +### 第1步:安装Anaconda + +- 说明:使用paddlepaddle需要先安装python环境,这里我们选择python集成环境Anaconda工具包 + - Anaconda是1个常用的python包管理程序 + - 安装完Anaconda后,可以安装python环境,以及numpy等所需的工具包环境 + +- **下载Anaconda**: + + - 下载地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?C=M&O=D + + + + + + + + + + + + + + + + + + + - 选择适合您操作系统的版本 + - 可在终端输入`uname -m`查询系统所用的指令集 + + - 下载法1:本地下载,再将安装包传到linux服务器上 + + - 下载法2:直接使用linux命令行下载 + + ```shell + # 首先安装wget + sudo apt-get install wget # Ubuntu + sudo yum install wget # CentOS + ``` + + ```shell + # 然后使用wget从清华源上下载 + # 如要下载Anaconda3-2021.05-Linux-x86_64.sh,则下载命令如下: + wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2021.05-Linux-x86_64.sh + + # 若您要下载其他版本,需要将最后1个/后的文件名改成您希望下载的版本 + ``` + +- 安装Anaconda: + + - 在命令行输入`sh Anaconda3-2021.05-Linux-x86_64.sh` + - 若您下载的是其它版本,则将该命令的文件名替换为您下载的文件名 + - 按照安装提示安装即可 + - 查看许可时可输入q来退出 + +- **将conda加入环境变量** + + - 加入环境变量是为了让系统能识别conda命令,若您在安装时已将conda加入环境变量path,则可跳过本步 + + - 在终端中打开`~/.bashrc`: + + ```shell + # 在终端中输入以下命令: + vim ~/.bashrc + ``` + + - 在`~/.bashrc`中将conda添加为环境变量: + + ```shell + # 先按i进入编辑模式 + # 在第一行输入: + export PATH="~/anaconda3/bin:$PATH" + # 若安装时自定义了安装位置,则将~/anaconda3/bin改为自定义的安装目录下的bin文件夹 + ``` + + ```shell + # 修改后的~/.bash_profile文件应如下(其中xxx为用户名): + export PATH="~/opt/anaconda3/bin:$PATH" + # >>> conda initialize >>> + # !! Contents within this block are managed by 'conda init' !! + __conda_setup="$('/Users/xxx/opt/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" + if [ $? -eq 0 ]; then + eval "$__conda_setup" + else + if [ -f "/Users/xxx/opt/anaconda3/etc/profile.d/conda.sh" ]; then + . "/Users/xxx/opt/anaconda3/etc/profile.d/conda.sh" + else + export PATH="/Users/xxx/opt/anaconda3/bin:$PATH" + fi + fi + unset __conda_setup + # <<< conda initialize <<< + ``` + + - 修改完成后,先按`esc`键退出编辑模式,再输入`:wq!`并回车,以保存退出 + + - 验证是否能识别conda命令: + + - 在终端中输入`source ~/.bash_profile`以更新环境变量 + - 再在终端输入`conda info --envs`,若能显示当前有base环境,则conda已加入环境变量 + +### 第2步:创建conda环境 + +- 创建新的conda环境 + + ```shell + # 在命令行输入以下命令,创建名为paddle_env的环境 + # 此处为加速下载,使用清华源 + conda create --name paddle_env python=3.8 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ + ``` + + - 该命令会创建1个名为paddle_env、python版本为3.8的可执行环境,根据网络状态,需要花费一段时间 + + - 之后命令行中会输出提示信息,输入y并回车继续安装 + + + +- 激活刚创建的conda环境,在命令行中输入以下命令: + + ```shell + # 激活paddle_env环境 + conda activate paddle_env + ``` + + +以上anaconda环境和python环境安装完毕 \ No newline at end of file diff --git a/doc/doc_ch/models_and_config.md b/doc/doc_ch/models_and_config.md new file mode 100644 index 00000000..e69de29b diff --git a/doc/doc_ch/multi_languages.md b/doc/doc_ch/multi_languages.md index 1bebdb58..af9ff82e 100644 --- a/doc/doc_ch/multi_languages.md +++ b/doc/doc_ch/multi_languages.md @@ -200,9 +200,9 @@ ppocr 支持使用自己的数据进行自定义训练或finetune, 其中识别 |英文|english|en| |乌克兰文|Ukranian|uk| |法文|french|fr| |白俄罗斯文|Belarusian|be| |德文|german|german| |泰卢固文|Telugu |te| -|日文|japan|japan| | |阿巴扎文|Abaza |abq| +|日文|japan|japan| | 阿巴扎文 | Abaza | abq | |韩文|korean|korean| |泰米尔文|Tamil |ta| -|中文繁体|chinese traditional |ch_tra| |南非荷兰文 |Afrikaans |af| +|中文繁体|chinese traditional |chinese_cht| |南非荷兰文 |Afrikaans |af| |意大利文| Italian |it| |阿塞拜疆文 |Azerbaijani |az| |西班牙文|Spanish |es| |波斯尼亚文|Bosnian|bs| |葡萄牙文| Portuguese|pt| |捷克文|Czech|cs| diff --git a/doc/doc_ch/paddleOCR_overview.md b/doc/doc_ch/paddleOCR_overview.md new file mode 100644 index 00000000..9c16f8f6 --- /dev/null +++ b/doc/doc_ch/paddleOCR_overview.md @@ -0,0 +1,2 @@ +# PaddleOCR全景图与项目克隆 + diff --git a/doc/doc_ch/quickstart.md b/doc/doc_ch/quickstart.md index d9460989..26e5c35f 100644 --- a/doc/doc_ch/quickstart.md +++ b/doc/doc_ch/quickstart.md @@ -1,100 +1,268 @@ +# PaddleOCR快速开始 -# 中文OCR模型快速使用 +[TOC] -## 1.环境配置 -请先参考[快速安装](./installation.md)配置PaddleOCR运行环境。 +## 1. 轻量安装 -*注意:也可以通过 whl 包安装使用PaddleOCR,具体参考[Paddleocr Package使用说明](./whl.md)。* +### 1.0 运行环境准备 -## 2.inference模型下载 +如果您未搭建过Python环境,可以通过[零基础Python环境搭建文档](./environment.)进行环境搭建 -* 移动端和服务器端的检测与识别模型如下,更多模型下载(包括多语言),可以参考[PP-OCR v2.0 系列模型下载](../doc_ch/models_list.md) +### 1.1 安装PaddlePaddle2.0 -| 模型简介 | 模型名称 |推荐场景 | 检测模型 | 方向分类器 | 识别模型 | -| ------------ | --------------- | ----------------|---- | ---------- | -------- | -| 中英文超轻量OCR模型(8.1M) | ch_ppocr_mobile_v2.0_xx |移动端&服务器端|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_train.tar)|[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_pre.tar) | -| 中英文通用OCR模型(143M) | ch_ppocr_server_v2.0_xx |服务器端 |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_train.tar) |[推理模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_infer.tar) / [预训练模型](https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_rec_pre.tar) | +- 如果您的机器安装的是CUDA9或CUDA10,请运行以下命令安装 +```bash +python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple +``` -* windows 环境下如果没有安装wget,下载模型时可将链接复制到浏览器中下载,并解压放置在相应目录下 - -复制上表中的检测和识别的`inference模型`下载地址,并解压 +- 如果您的机器是CPU,请运行以下命令安装 +```bash +python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple ``` -mkdir inference && cd inference -# 下载检测模型并解压 -wget {url/of/detection/inference_model} && tar xf {name/of/detection/inference_model/package} -# 下载识别模型并解压 -wget {url/of/recognition/inference_model} && tar xf {name/of/recognition/inference_model/package} -# 下载方向分类器模型并解压 -wget {url/of/classification/inference_model} && tar xf {name/of/classification/inference_model/package} -cd .. + +更多的版本需求,请参照[飞桨官网安装文档](https://www.paddlepaddle.org.cn/install/quick)中的说明进行操作。 + +### 1.2 安装PaddleOCR whl包 + +```bash +pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本 ``` -以超轻量级模型为例: +- 对于Windows环境用户: + + 直接通过pip安装的shapely库可能出现`[winRrror 126] 找不到指定模块的问题`。建议从[这里](https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely)下载shapely安装包完成安装, + +- 使用**版面分析**功能时,运行以下命令**安装 Layout-Parser** + + ```bash + pip3 install -U https://paddleocr.bj.bcebos.com/whl/layoutparser-0.0.0-py3-none-any.whl + ``` + + + +## 2. 便捷使用 + +### 2.1 命令行使用 + +PaddleOCR提供了一系列测试图片,点击xx下载,然后在终端中切换到相应目录 ``` -mkdir inference && cd inference -# 下载超轻量级中文OCR模型的检测模型并解压 -wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar && tar xf ch_ppocr_mobile_v2.0_det_infer.tar -# 下载超轻量级中文OCR模型的识别模型并解压 -wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar && tar xf ch_ppocr_mobile_v2.0_rec_infer.tar -# 下载超轻量级中文OCR模型的文本方向分类器模型并解压 -wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar && tar xf ch_ppocr_mobile_v2.0_cls_infer.tar -cd .. +cd /path/to/ppocr_img ``` -解压完毕后应有如下文件结构: +如果不使用提供的测试图片,可以将下方`--image_dir`参数替换为相应的测试图片路径 + +#### 2.1.1 中英文模型 + +* 检测+方向分类器+识别全流程:设置方向分类器参数`--use_angle_cls true`后可对竖排文本进行识别。 + + ```bash + paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true + ``` + + 结果是一个list,每个item包含了文本框,文字和识别置信度 + + ```bash + [[[24.0, 36.0], [304.0, 34.0], [304.0, 72.0], [24.0, 74.0]], ['纯臻营养护发素', 0.964739]] + [[[24.0, 80.0], [172.0, 80.0], [172.0, 104.0], [24.0, 104.0]], ['产品信息/参数', 0.98069626]] + [[[24.0, 109.0], [333.0, 109.0], [333.0, 136.0], [24.0, 136.0]], ['(45元/每公斤,100公斤起订)', 0.9676722]] + ...... + ``` + +- 单独使用检测:设置`--rec`为`false` + + ```bash + paddleocr --image_dir ./imgs/11.jpg --rec false + ``` + + 结果是一个list,每个item只包含文本框 + + ```bash + [[26.0, 457.0], [137.0, 457.0], [137.0, 477.0], [26.0, 477.0]] + [[25.0, 425.0], [372.0, 425.0], [372.0, 448.0], [25.0, 448.0]] + [[128.0, 397.0], [273.0, 397.0], [273.0, 414.0], [128.0, 414.0]] + ...... + ``` + +- 单独使用识别:设置`--det`为`false` + + ```bash + paddleocr --image_dir ./imgs_words/ch/word_1.jpg --det false + ``` + + 结果是一个list,每个item只包含识别结果和识别置信度 + + ```bash + ['韩国小馆', 0.9907421] + ``` + + +更多whl包使用包括, whl包参数说明 + + +#### 2.1.2 多语言模型 + +Paddleocr目前支持80个语种,可以通过修改`--lang`参数进行切换,对于英文模型,指定`--lang=en`。 + +``` bash +paddleocr --image_dir ./imgs_en/254.jpg --lang=en ``` -├── ch_ppocr_mobile_v2.0_cls_infer -│ ├── inference.pdiparams -│ ├── inference.pdiparams.info -│ └── inference.pdmodel -├── ch_ppocr_mobile_v2.0_det_infer -│ ├── inference.pdiparams -│ ├── inference.pdiparams.info -│ └── inference.pdmodel -├── ch_ppocr_mobile_v2.0_rec_infer - ├── inference.pdiparams - ├── inference.pdiparams.info - └── inference.pdmodel + +
GtmQ6mXo%E@x^VD{H6p*X3xk-CkH!2p^uM;|@dZ#H?iEY!k8D@S~EyKLq zR`49&Dc-gA*=WY4GZtQ?@7-{HaA9VA$~HaUuf1eEYMRi!A3QbTL|b^zI7wH+a?5+k zNgE0o-+divi^li3cS@fs1}{`7hM&@p~&1$UDb!qk=wc{^*N`MKWGHqji-0?3PJYf^7+r zh>kN~fG!2?zn3Ypb+Dfj*?H}E *MF0!5Qf%!$Qy4n`0ZxK8 z?QLnPEY{w%U2Wn+`~ylya-~K0TS;%z6_ZAkAKvp?cu7X}z|zRg6qG(4P{v-{D+9eK zA`0_m-H>G_>v(FS!E`izi>5kXSv*Hq0@o6x@D6CpVO2?Hi>|c8L}B^rqG~rVAf{bT z?~W7g)dhb#KoAygRx~G0YfTRiC=;J*3ond@oNP6Y SJ(M7eWo7*7AGFuIVMjjiwNxMTA73bK zXs*E6;2|b{l!iZbl1vVpLVrEep@to8?MpgwQ=dC{z=+S0<<;aMjH>vAuG4Dny+k6G zks*#`aSXQ?&D9YFAv<`+67S1miPAZcxY6Fw64Dl|v$BP#Gx1TNWEl`|rACt_P+NcQ zr^C2J2AxPoBl&Aev%0%>g=dfc$YkE(Y{UA^R*j0CmF{}-^G?2>v`vr>0R;VE(D+AU z?jFU}?cKj6<*;Jpk+)hZ)h+TWq<3u@cc{abljd^rgLBFrlShV;y4Ot)?El6@jg~ZM zTvM~8`D<`u{fcRU9#N*{O4vxpUkgk(0zdyvuLM#<5Ls`2q2_%)0KzKLpy6@Rq@Ar| z-cQk7SJ(EA6{fREVn!W$SN_QJ6#9J=W9YmO{$hh|^5{egWzX}@?^v}gF*D1)MiGiM zK?}B>V&5UH8=>a5-u52l428i36+-t+W4QMJ7i-@gPxb%DYmdx^QT8ZXLiUzjRuVE3 zvPT>vGph*Ml$pKdSlKINmd!~-$j;u}*Xeif@BVimkNddy{PTVEeV~)i=e$3!=X~i{ z s8VL%BzpvN@zKFQwE+{l{+Ct3+w%`(K{!vk0{%$!A{$HgKlFVY+eyWntfF=)1 z=2qj!fhbM9wIA1Y;@w`k>UkQKSt(YsXE9H-@@D{P22U<*CF#JHl lA3Y^3?1lPZ-szvv|?%3$=^yZGq6b+;!_6v}u^Whb9evbVxt* zKW!HOGJ>l(R9np#C(S~QtSZnqGPS Xi$^G>Y#EMJFnqQ;S7 Cd;!)0-?x9Kj&TIr^QTJirqR zOld;rP8fC(>m6hq 3_BpL#U`{+lQ8HsFGd{k^I33T+tZK>J=v^!3|kPnM_bW;7CUzZ0^$8XnbXzSUkH z;dnPdfKHShZn!twHsinj)s0W)c|Ldh91CP)nG#(jOR2#Jt&bITha-7X!RVTfj=4EF z*_EhsAO5jeZiKpr4kfAW%V=*d2ne#|8KX94Fx?|Ynix#r3Oh}^jiakoU~B}^6GRS} z6mzmz$~^mR|AMEJ{7JRlCzj0rpa8f(Kt1@pl=kvpO#|dslj*9sxTr)=){xHaB*L?w z2YpK27OzWObF0R1g4<$t%C_vwe3Z1qsw3bV5s$y7)< zi8?o~IT0VKyy4|* zVu7};04BD!qWox0zzAv|3K6*P4mD~ESQ!5}-SdNHhJQ9v=2whK`49tF 8G$*?hie1@Ao#1ffYKP8j5 zkJcqjF7{03mwY#t*4BVH=A?TB?mYPPw7;A=F-AksYC8+WyA+SPH)z084pv(6hYu4d z?H2%!{zV&%-DiAissxA^6$yK{fzF;qn;8J!I8G+N=l@)8p9bGK(fCpr)DjDP2S~7Q zteA%)_`{e_dz(**&i70%M)y^Q)uCC&h$9#P6ySZ-1=+B03DvRfoLGQ5E**0V^+1G< ztP&9&BV+w;XmgHp6y6PNM1oA+vwH>GiN7H=X_xnL-s7m0T!AiT^8{^jj^k(f)^9m{ zV~c;u)Y r+y^{(Wi?a)hCNyN&saOR< Q5PbDW! zQE;D7=5{gOfrNL_BS8G(F%6zOi*hd&KWGly2^0{kpig1#ZfDbJo)+q6}N zV?-l9`@^Tjc4O9!{GO8IS|4@lno=VyvmOn7m(l+#{7!vu$IrL(V)9S$xu);N3>a=i zu@_SH$dl|v=0&ETzMy^{H>uy{EcVDSA#H5={gd3@8H;jcHp|9O@%vs5QlTnQNDkE; z6c*$LcD)uh3BJibJ+W%)-N4lD%0oSv5q4RvB3O*xYqjlF40=p6b~m+!^-fl1yX(_p zX*}~d3(&eI-dTsZ4I=I;=Wg63#_?)g+c5Er<41lbo-LSfm&1?T$5U4NaMCI<6nTd| zuia3mll6`ObHmKRuzgsssj;`;(R~Fi1OI5rcf0{leXVVKoXQ??(v@?>_Ntm)H+*uh z(Yg6{TNRJ%SQoBE>+TN;(w-&7V1#Bt To`GcXjGb5(k=CTIUVQ^kiIiS zXIl-flG5TN2xh@+&UT8y^CFUYnFKla@jo;>e3SGqFu%c^Q_-6cmLZT?9K?e&0ljn(ai zP>1O{3zw5|=1TRzxrRWKIQm{-1zTha=1QcE^e7Y9i2K9aWRCm5d$o2c@S3pZ_0Eve zYl8yye`_n)V~H|Tode^Xakw3%J1_7T>~H*e{MdnJQu(d%fBQd@JpS)k_b`)BCN~d- zs 8>Z=k=!uNAI*TOR6;A zde* EQoj2*1yzLIub5(bFXDmSpHl)IJ*b``MuLR&3=ny zga2dI `bHX4iX?Z(xl;(teds zrB65I=y-M#Hx{6~J>B&F$2e=`$PT{;9omxhw_)z8*7(&Co}Nt9UHqA?dS6XnnYyfS z)X!em5TOXMrRoFz=QNc H>InPvEOEJ!|AT>s(3jO zS(`;#X2GC^)0{=i{;;H 65b8q%kDI zI~Xtzp?hl^6x%^N(%$|$XiGk;$9`GjcD;tAxU8|#kK?C#-HNlEji}{C@P6zZT*>Vp z82{4GK&R;t-L?Cp(lhF$eIT$icD&xxd1s*WL6UUBm;RU19uuVEEI(-!w3hdMf2ayH zN0^geW8kf%bZYi|OzG fCq-t>2Z N+Mzx#XR6t zU%dCCngaeLWL+KRwScGM|9!loq2gzydQHJI8jgBLNm+bt4)gFI{8XcjV>h&}L8bwY zG+I#?*5SqQDV{xS3>dZ6T0PC4tFQ82x|BqPcez-)I!e~9)z-r(CaI z)l^SDXYaSqP|TmI?;>J8$pE8q!z$)d*NwnXq1E zbQ7U|i*@TSyNic1dD06a_Q!()0W#DfX#TI4ry+E}Id52&wkrooW=puBGL4CclBp@V zJR>}? nHg=0CG>za_Gq zv}%Bq|C__`7)9&$XZ~MS76JYrG^T!u2xVoIl6226_Mg4ocP8KPCs>GO{ld0c!M#QW z&XZe7H8ZOeIrp97SeG;C-5g_1!X;w0skq`3mvYXDfLQcEM%=$)o5oUd7oNd@pKVLy zmWw~K-*{d-hP}#h;Td?}0-R0Dn@K)?Hq+X2<#1RoB iL)#PEF#Ds+HM1wef9|V|j zDqtjm>HE5Pdgy_5>OPl+#R~p<;Fu*Pb~j!buQwuw_4P*rXqWu5tj^4>27ZJpgRy-) zS Ow)dmx@vGP=sHq-6I)dt!e|5&X-7_?aTv(?zc S^f)$0cc!h<6AJ4Qp3OvkatX!sGZz7C6fQn z1F;XP958;&f#IZ2WRLdK3vs&K!AKV%#od26<8#J`8Sw&2g1S~amN79&(TBDI9}m&C z2obM9=fAVEKRlOGq4kA1p4D =vySdn d-3eDqQ?dt3l{ z?Y7@h?{_;PKn5^)XT<5NPDF_a1zyTaMcjZC{-^alFCkMNqDY^aE{?pESE=IebKTJ_ zV;fLi)3)os+r)7GHxvy3E631=9CRm)xcG-=iFPy!g|;))0OUi?Y8c|&>!&-Rt0eg7 z$aD2s{NxuAp TZyq-GiWd`~ja|Phczjhe=Ku5x_59nNj4UGRKw2D3xCjEI-ansjizfp4 z4$hrs#XR$b2N>2Z8E#@&_u3V*nxU@)-OlH+`&~&OeK>mL_yXykD~q5TrMoz2JXjaV zidIbER;ze6S#gubJdiMnpCj-pmdGPgh6 BXJn%8dum54GNEVutYqvto%Q0n`?B|+)B2O?&%JhzixF;qj~)u_{9H#(=M9Sb z)H%*L>}=C+-psiNz#nZ*{skdExq|G-lsw+88+hAV&nz)sHqxUD4rjZh&+oKpM*N;U zA~Z{={Yzggz1lI;07+SCjk(S9jZO5mm&Z@h5AY}HZCSOSe0v4VJ{J+`Q0?O7B%i#+ z22rY4%gffarJfBBJS}mV(3X6Lv+oScdE{Exmh)uvk$mXDpw!kIjoIzq+v9 HV9bJrs@(S%6D~7Y@>Fb)cbEB1Ntbq#59tvT!VVBP7|ydOS?NQn~|pbdpR%8 zX72Z6zrDw34RpmcL_-gG8W(qkOyVzw6oeV(!1X;Ih_9Z_Dk}*m0bnRE=8l6i9eu2x zO 1vR+#hbH<^8-6eX;m b{u97p{oMl>?ex0!7Gt^gN}umeu{HeMYi-K6Tc8TCZ# zCmt3A<7wIq;T@5kr{dS~NKy!IHIQxo64`P8CgMDY0|AHK-O7#f^_R*8Sifo?(l9VU zhby}6C0kHddbM3pP}6tJPKYU}<;_(#SNt0ai@1`ez9*jy_ucm|^i!!bo_U`hI^T3vT_nxB|{K^v>II5zQaB{oWM;js41k6jlrDL0sb_`97661 z4$G=9KYq|6)+PczeY#T;IFeY&NThkR)ijdTU_o9)VsAR%89{)BbnQzMeIT!j?8DOJ zH=C~b{n^;`>?8XS=3ViX28)MKG$coG|G@(Yn9C9bY;8H0;HxNez>&g~(=my(+S5)A z=G}t16irS*_0dN+NBF4)_Ut*yhp(BdqOmiu{!|LyQ?2T#Feq8ctBj3}ouZF5HC}MJ z&Zd#p5llq28>_}>G# hG#-4?Zz(GR{a-_&!T&N)&wlG;=}-EK`B6B&PBD zX7vaJhHH~tSxfPqX}j!pY)?)a8uUuDS7W4D?66lj?AbR}tYX&ki#(g&c~0!7C0aJN z?3>da>9?*tMO{C6?V@iVE?tQJ$6_HFK5%y&amSlYyEmHmS}^%_{c`sl??R28r>Am> zhkBS&T+DPL7Uftsw;bCg*3}bI3Hc7&^d(Hr8OoG~W>h9pse9=LSxAf>dtd5^^Vb)L z6IR>#bjRN0V|UEee=R|$L~_HkWcrQef~}v`>f^D8L8FQUJEZqhf)j?Dc>5#A1hx>y zuj#%kY0~d=o4g+&$V}Lo7@tC
i+fMTKVa*#8 z^OO1DO0yrr+^#WCCCQ`mC~a1=+Fs<)t$B$I{7G-*pUUB4|L=?X(ifSG|Gs9Kv#ANL z{r6=UbPYS;)qh{%@18Ph{`ci{Ii{JSO18LTI$o>nGjfS>V0otw< zvKBhl+VFt5MZpK>)hOPkEbPtJRlB70)R2YOn;WgG_DQ_fp-dYSW+wPaFDLdWo;ugh zVOTmM&hZvEEk9}Rp7 Np5moB*dLh6`Y;iCQvQIW%xvVlL#)V_Pz|B{ zi*7aQ!a!)1Xb4Q4_*raX{C=TDa+5=P#V~L9tHe!2Rc7Q?jnU6w#-OQnB4vkOk&z;H z)t`~VB*yKh**evZn?C6wO9eYx6X#8vOH)_&ZibBry^<(Nwt5DS-7)*A($!mzqn{0v z@H2MB!umwntn+xVEp2s qMKsL_Ne*n^*IY3E*_n+x9q=RUMLIJWE(_E4x84C zM^3dR9;?s|#t>yR<@tRyBH^kgly_Tk&C$MIo@MsC%L^r>Bn}RoSB+WMd?M!aOB{xu z$(uY|y}c*S({F%uz{e82!qnH)Czo$NE~$~4{g}_&E>AXp7nD%@c2hBg2;v6n_1cVz z=hh3RzJlbffj*)8D8f%K7A5UjYI+m!dTGlN&-|{eQB!9OPYQSps5R?>Svgx!omi8< zLVS%Ch(%f@l48%))xrRM-Rq!t-0G27R=5O<1OBrkz+S0&h_CjFoT$|zGz&tJ)Lf!% z?PIAu1=UgKrLSK|&)M<2v_hFJaq-lG+2~M#w&QL}+vEaM5vzr }zp z4&cw@-my#L-<5D `{vQv@Htu+rn zz4mj^%?O^0zRl8`P6P2l>mabW9#KD;Z1TSO3wjUp)LU+~7tU*Elnib7x1OiEs0FUy zPbHPVyA?OKVf(d?jsT-G`mjmbv{-+j!E`}I+wLWUxtP3h;%_~>z)z{SBKkMD53h^s zGU+INvGwr7a~1r_nyP$4tBg?PmY=fHUL5qVNU1j5PU&&Uyvls$>o ?@a)$BAf8_#K)M9%pIVk@0P3BvxkT;32+P_330J!e@BJ%5T7Hs)AOL zE-@^w^XHsb;@EyMgM~_VigduWP`5np0xSI^9*Tti9SKR9s*~(u7ha0-M^|yvggp?w zeA@<`)e%!d)C!B_4XkUJIHtda-!_@$DDRiA;@rRue836K1g3{h2}1}?yHIv*%*^T5 z2~xgu6shid*LwB$?@U8lmol+LyR-x JRLG<`}xKR>^3!G&kx zuxbJJg?2u7{T>@opS)+rE3&1l*QFxKZT$6%Mk{?MD*A_#vrpOcD&g!1;K|tLP3$GW zsu~GQzsVHjwW7zH_)Ek_AA3iIrWk{>*`cP${@wWE0zNy jY;G`BK5R0$bveX_ zhc)9BSmGm>BsV=_5GiUJLmaMQ%*FLuG(ZzcC&&@xI5yS+ah3@)8?1Awe_`x!f)>L} zLtd!STQP-f>k284L(7>j0}LfNd?MIiD(;ZokZyiqM1_t$A~t@A@{wa~iyvNPQ=f&g zGkttA$EexRaQq7z2q|V|+6TMz^+4Ik>8 ~j_>Zj1N$jsHM!z@eTRBZo1$Y!l zCY6u+u`?p(fcM54enrqtP6pG^JME9gWvgBmBpyNJ9?NPbVKA%R)5;dFU?d3Prv`BS z4`9L+C=!{4&!Js-kgfOzq&0XW89JP;&V6h8#;Ai6pHp (EX#7W)y`Xaq(+Eg>N6!DLI#GcUA04Ljui#<|O7mAH8VDu_SdEro{^^OJ zL ;RNS0xq>CfQvR%njT0Ccw^BE~@w=iJ z#<30e)l~TYh`X&^Ll3Pc=L;sVSK-xsen8AL*(BdI{HV^(PCO|FyvVEsEk&&$C3;UB zDqh2HQquh)3G(FmIZ36fb2o2$5(+u|c+Jiqd&e`dYxI=`M`ADVShbr?CzXyWw&F6A z;^v7k$f9!>Q@TnjW%faRJC!W=o6E+2LxU#7K;U71Ixl_BBDGhb@oQ}oxz$S)B6F=k z{{n7L&p#5t!UUnk )cz68bf2!fP7W?a|pF zH> jm*nKW+^~U$Pg5E2fqGPT C=1tVQM()ckDzCN)efAYE=CAu;e)bXa_8rW70DRZc3@0@sEw)pq2I7^W)X3 z`*2|$E?BeU4vz-?B4 g=tRwd74b1W_ z)sa{)WJW*1XD3;B{E Vj)-oIjO8E@LZd%B!{&XMMOY`tz}_?U<8 zI&Qw79058RqRnZNaQ7<)wO Pk{Ytj$@Dlu=N&k;l} z;=YlR;7J_ E{_w6j}^3n z%)26GRVfUEGxeiBPz0gR7yRdPNe2%@z9tJ;;kl+CMc# v2|UXB{N^|E#0ftpO*^qo(>NWLyyF$i%Q@YbejVAB@6z|`TV>{ zF3HzVI24gOM2ul0_g$|kcrm`C@TMTfXVS5H@TCTuxt`}xQrr+hUj4A&rvA`<3+lx# zNiSjeA9a@D_etvU(%?~blv0&hWtb%zy*| reWX?~ zl)-{?zuwt2VHA@We^H(e`i2cUt;^5W>UgqwCOYF7F6edfDal&w#Cr;749IVDWw_># z_xfoWs#5elEG7CLUwOKXMLorsF%{LSOb?S4*8RlsO+FG-k&bq666LGZ1inGDR>bV^ z9Y!B*oTM2CA_an-j;xu-^-m+1t4&Plj>PTDRVIXotT1*?Dnw4x*8ALJwuee^ilgT9 zTihl*wQI7Jzc^ +vv!OS?%$3l$it=m3xray3r1ik)n@*opTSRr (0=L)Q7pxTIyiM%v%bd9SSh zy1(pJq<~24XKDud `TrkbYGdQq7t~E88=h%DtL>N^i-|HLlQ$9d ;l^yb-+}`)TV)lIB4!@7msI+LmaLKoKi_U+|Wy10A3#A*r zUBY|o$87O_pE?#ym&p2N?y$T$B*oHJ1!5YW xdOhr(``(4@p>cMsvA&9>obW_dAZ&}f|!kHMa&IP)5`=l^z0xH zIBR;pBCk|rG lP)2$_TbcInP!=bL9fUw zyKhFQHu`P_iS;L;R6C oz`ZOgPwh@fhHb8@;QyZ z8*=zwv>0~KlTVj2Pe<~dzmwo(>!5TV!PJeiw~r&18P1SZE=b`_{cW>WRZne~W$}5g z`OR6geT$5Xe`U |Sb&FI+8@PukwksmAX#dp@vMe&87; zPZP#GY)yE_?@2dnzM5RVd`%F!m&{EI1Ud4W prl zcLziG5Pxo3B$iqJK1&`6rs{a_!uH2r<>Y5yuTsZ}p5VMJkHc|$)AVM1vhMvo^89wf z$$jnjND(_9Jr%t%m(RpqT5L C2e<6}}|WZamfsOoke0xqrbRRdivBlV}K z%<0XXWrJ(U?bY5UseKPBPJ6uq*6%g9G598qk&d{JKVp*;kDUA|Rkl7J7Vf}^LA>$i z{({l#xgq_@0dpN1O1{V>H)Q;Tu8o|Msh@gIq)EMDObU^>#LIn=uM=yL(H=i%Rmx8L zcUAU`*yAw$c7DcD?3iY#HNH-a{`M6)TxsQvH1)M(TNJh__omIq;Pn4=VWN_Mn>J3Z z0PC~?Glrbgsm7vvSKlSa_Y hw) zocMTqI>#l6X+z$Tn%XAI$y4oLXOno S;2-0!i1>J>@$le|WkQ*{K}nn2XspT1V}VnEd->_~ znj35FBCyL#GyRo}B*_b-yQccxL-H-eV!aC$8{z3h-!3p!9pU%8KRj|IxaJ#t=fV5N zNUY_tGumJhwX8&Kx8ERGv^V*j;E73mU=MQ*<<5C;ANG*|#>cj-D5>|?TS|mfNbR3K z#S;GM!2(_Iq|AC$OnvhvD6M}RG~T2`S*nQ7u^`6PmYoBa*UY1nr~@#|p}XFL9_FdH zI*%07iQh^HANX)UfVDT_Wn*)x3|4dDTQ;iZ47FTM`SNtB_d-&mpCCoT^UBO&r?4x% zTt4Pid^~F~kj|o;RzE89+_~J==RZWqhTa{A-gbb!fEkDU+T&OSLh8)vqOexk_~npH zguj}7padzMShm#@jQBx0v2p T{BWQ3&&l@Xr;yCDKHhpv+E?CQFVgIPCS3NUu(v9>B4=>Gum(asW6&~hy`yA`OP zU cV_s)noOsGRVz*_qk_7$LmdO0!g3kHXT zIUezWsBV0|orsMAx4gt)Z)&!a5fzj{bfLGd!FDrRt?ZvZqJHNRHzE|_*-8&v4S@ck z^Z4GydryN(4d!$J QP;xICvrQFTO(h*zP1X|(s $$eK34m$|NRP>H4BW zmp{)o+~@07ONY~evfDj58_AGSeFNI8_hCCjCmNx`g@Ww_0aCrUg2 #)BjuH0mk>DJ@L(j-|X4~+0Fa5%^||D*N>WpW*GY>-W?U?f;84sRP!0l z&%IK2SWTEY?T{zcug{g=3w>s6KhO7T$Rw=aq7q2 }A#(Dn=`1S#>l34Srt zhwaj*@(mE-`{vSDh|-SMmUR1ba5B|3p%FFwyKPe=MI=DO?|2yPzAo}%n@@}nI+*^S zLhCHF2agLSTE6tR$zl%!)BRSddm|B4EGO>m?K-YrAAf|+k5LP27XN;V@*y@iH=lCP z{Tkw>IQ>2;33loh?2BD`>+m%sD9%PVMxBxmiSzK`!-)pZ7u>;2#Qhb-G7)jMRR)D} z#kj6hh*@F`_yH5O&MdjPxx2(X5u?r{Ew7_k)?HnVOKlTKORhP8RsdnuvC05&F)fD0 z+buSVVj9yl&2JODjl0^)1+OT_BF1@epFCbWU0Ph66(I%K{j1I<_g2`*5K+Aya2Zh$ zs9ia^l$jv6;HC`k1x}Va_XK=CF-g@Fad-8aht~?O#}{XKe=bjjd9Xb0A*hDvcOz3g z{_wVom0LAv)@Z*kkfNk%M_=6D|9ycsMC>o}FiwFw1buVB${!%fmcv);k_Ae%3)!%| zdp=EIs1e+yo~X2rCB>ps;<4_DU45GQ08C};;n}n)-;`e=z~_QS$v|WgWE$J4ztqOc zKZOr?b{rbV!r!(1u`vouyU?8;NPbdgco;eNA#XB)pOt<9KAzBW)1{^6u9~y9cMjo5 zplH$3E--2YGVv^GN|WlazN0T0{l00EzI6{#t>mm0QmGf9^s6gr+cbHMCLz}i|H#TF z+yF0q;8Kp-H6JKD>-sU(mR^#(ZCL9MkDBE{N}J~JFV3{Il3v$<1c#&EiB^DJ%~qP@ zQL_MWFRD2oFRVmEzxx&uo?IE5hbFwh`TQKIoEU?lWSn`N<34unBFg9O*2`lt|K`UV z>@=Lj`0o8GuT*8(;@#E_WR-5 L|(k~?Ru6${b_$(HAsoQ=g8n@XB-+I;6c-DIL&U#3C9#fFPe6L%5wS?VE zwO19-jQ982heVIZzN`?JS$q(UG*C}^tk`2hfZTP|b9+J dFg1AZFQgOfD@nVattQG}PatxiUsZ>%r zd0q3#OR}Nw-OdbTUGoPwvv!O@#VHMrr+}7 zd(d#og}X{O&LVbJygjurC#jquH92E3?Wa?2Z_9+)?ULy|$N!*x<1a>hnwne1(2n>R z2f IG(kf7eiIQtsL!>T{WbJehl{`!1~vPoWYXQZ_i;sUCPq%5@lJJ|69bowRq# zrP9EQpx@fGTiaaoO{xA6kKiD -O|*TvXoe5xmzv(@&2> zs-Etu>HSwG)-0d vl{zVnJQb zBSOCW#*;)UGz!sDdTOuNt{P#!(BR1VDIgIxvYeq0p5h07=NO9-F2IVodAfDCB?O *$#L{Ni5p)J^uV5vlquSGoLY$u)lRt~)0Y zT{~}?k)s8vW9L7b(!kK;8n!?p|H81Ykqc|n+Hrv`XeyYw>5=)BA2lfpZ^nHZ w_&= zjE_4xJ-_*S zk(MB}Id^vd`1@1I?hxVwk=*T FE;Yy3-c+zs-^#F1H8w(u>qn7M0PkwZcqd^&7JcmZOe7<_J3sFn@QKi!id z9YW8?VmoE^ox&@?c*Q3e>huN0SU?QMpH$Zf9|k=6(=_Y3?V4e1#e^2qwEcsI(0O9K z+gp*}L+}~Czv=9)`k5Ii8hM>s#d<)7nnGf5IFMfk7dI`h+Arrqg*i-TR+)}IN9;1k zD5n0IuL+8NeR`)tBhkWVO}z=Y1yTt$AvGXmS-+EgTipK588k^Bdx2cv9>VGo7LZ(s zW}^}3OV9=uLYCmg>mk*vIGDitSF<=csxiC|BDWbl2D$3sb{<)u96=_&(7wt@Wq2{- zz{iB4`&Q7leU3KA<6D)Icw5>7Gh;CpyR1>wVwejLD$uu*cL~PuJD0E-P`YjHndC zh`aw$In}qnf#YhYm --4CrGOd z9*j?(OR1CR3%F Fpq&l?q{x2`Ug`a5l zbp}3m4Kd+1{%@jNQm%NXKY6*} !4=|dAo0LXtlh|OGV`u3K%aDj%CwBQLuX^`M3O>G=T#|ep=&%@;1)9ETOUr?K zK)QEy;D9t{X=;jcqArY`0n0QXfkNq}DulstS+UStRHc2h%FJylCY_6Ct4nf$t6)O| zIQb1BiR@v|xtBNm9Wt?)Aj@G0e2)$xw;?xM#j|*yz~&at-&dd3u{yX4p!Yz386aEX z@Y0lhmk2ZIddNcM@Py9;+Wi{tSbGh-aX~#;uJ{HX`YjSZVFy)QvIRPFIohouBs6?N zLU d8M)}X|4Z!j=~Zk~Yac&qnrpQDS5i`G#I6?=GXX(T7t>i0zd)jH5? z0JThg-8=EAEq%|Vyov)>>^4ow!mDyHeZ$xcRU517T!b8tG8RQvy4_?%vl|Bbo6-&< zKPq#*)b%|z0>QU0SaN&et{gEvW#u&wjhV+9N_JMOCrxS7pB7B 0TIp=JHMs3M_tY)Zw4P^QEvlT2 z9&5;86qW=sLU@qo`KrjSq*gW-p*kx-tv6Ho )S`WTggna3^j61gtD?UB^Apo4VZWhmq;y_{0QtvFJ?no0ZJlFwqy?^8 zWEP%-T|LY{sE9fsY&gqHbU1g`UY#jkiDNNM2#34^APBVV)Dpk0c0^=$++2*nh~p*7 zOvAYstv?05a@wfYG5quX)5#gu%ORH5w$z1(&%C_>Z61FT{9Nv>T_{xry7%xhAQ&k4 z8#!e!14R+^Pz=SI&`hg1uphL6umdVBa45e-EL-AmEH*vq0b*B4LQ77cO9k&b;>i*$ zb#d8wqETC#j6)&!XP@Cw%v}$PH{#LSD*Xg>Fx4qV(T}Fe-EhT9!Gso%!(fv`T)<0* zIT&xvbJ{;%ovLv(v6P>Td_#(ffv)ZQ;MjyV1XkW=XxSNIsR920_AU_>?<{~3u#~@Z zDSx K6KysfhLFo?Kt|U%zNYr?#3)F zL30Co8z&q?RR(k(Sn^Bk3$rR+cFlm8&wMBmlCbC!6luOYckXDCc3n5b`?6hep0 g!H=k*E8_wAPm&+$2gnPPL7>ooxDG$4dyz1N^Uhkf z)u7zx1mV5 s-O;P-F{TkIJmscmaeNl8h{qjxz* zi5H dz4#E1{)oZ-Z z4=h9D50)b7c 1jMUm;R8!hRA MJtPQ3nh`*ILg z!%~*Ev63hM+`oi8Ga7#GF +jd4+ zucCZM$X#%<)#pL>hc^HR*5SC{*< =O3XBo%R;bmCL>K9F z!lCz+ r;$0#>xU?<4c=xWM>R9ZTAx{%GHyT0HxfMDkR!fpP1_?ce1N(2G&p`^d) zHa+l3X+<(N?ePO!hVZZ=vtF5?zAAIT)9}vSyE#^=lb?_RIp4j~lCOg!`up?Qc7}64 z^gTt#k kw|7V4{{8!=aPPozAzVx|jM|IW7HxL<{1y$p(X~VP8;(ou0kP9&P{af={ptNu z@!Al<2MicFc~F8Lv{{tL8dng<`OTEx`5Z)UYV>ZS%09h;hDf`r&+FBwe+V4xDRt(S z$sFlg=+7aVMsYgcwYDb%K^JxgjFMs4 $O^$U29_GZZ3n$9%&>`Y1V zNOO#eZ3 rwV4rdF)SGZ2@O@8SQJS^oef3u;ftYaEAK}{h4rozpGHq z04RYJZQ%gRLy2u=s31+8_R(A2qMQ>drV$s`Tn%)Wyj$5zI^P3#KdP%&uhw~&erT?A z z zOY^`=zc^jmg6KS^rbTxQ(GCiBp-P=^Ma@H!J2=i#MbE%jEBjUme4Mw?ne3U1^Mk!c z?-{#4mqYEVAlmz{Qxu#ef*I-7%L%=3^g=$y8}nesPx_;>*k;tjfsK4|=c8RQdlrjtP ztYv(}=yCx#90rR%%qI=R9+fxtF7N{@A?_sE+{+m?FM?)8z^s6oBsRGWf~}dS9>d~= zAw0^^ix9jrco$$9kya*LdFa?32^4*jH~flT282FAwJ-VUm8n{D=zfEniH2BRcLcO5 zqXfYh2USdM5T(aVk`?Cji`Z9{Im`38Wae$J>#MDrBKZ vF?ZRL#U{PHr~^>6z-M5ea~DO$YV(*K0U;R-F>2rm z6=%2{|1Q<>qEqx}=T*J?ree;=pK6#x_^G=@8WLMUV_(4zVTmlT=OnC7U9E!#Gko+H zpXpOuO7~;Ool8M)02GjsW6XyS?*6#;XG7)O%nTF5&ab4W1+DlcOrVJ0_33&` fwy~dTTkKl zU9>ZQHnjajgCO&?bz~$ilA>L+v0d=({uAD1o~kfDnZ@l(c*>qw^BAw>axn>`>2$u| z(b7W3rSd%}$WGw35Y?esyljH#s2DmT_{1+z?@H~gCyjFce$*K~BoY5^2uC?iHf9HD z!JM<=;lc2;cY}OxJMto3vEdXU${~N^CmsU_SCd*$^BynisLBsTXc^1+w0cn+m;}gmAvRaM4ng@kI0tDf#wnz4 _%ZD#VwS8+) zdwQaX!e=!zA ) zl0& Pr%KIQh z-x@Riu{UE%qNS*^^{JURc?@0|?tSjXx rf* ICsJEst!q=j9V4)hh9T&6DHWJ@&BO z^A_u%OtI|XlZOyo3rGzcGWFf3+0uGOx{5LK0~1FRh22$iY-IbqNW0MJk*=EXI!`i(+7n&pA-kdKPlC@AE44NxV#Y&? zBFGnuFK;-pSZpWsuU@XEIw=aS6h}p@D?E8-5{>6m0?vCQ&x)z(jdZ;M-{vSrg2m~< zTg0Qu3cDnrR2uSHjge^XaV7R*FA4L}d+^Gn%jsjOmP$MlBN0br{0JroMmKp~UGmcc zy~3oGVKEyNeV#jBJG-vGvo62BF5(#}(>$Y8pwpv6%t=3tHi$GMNpZF%$Vyi~&TOLn zvH|z#xu1X^YPFE1El?)aKRM^nmC^Mbz}oib{{Mrtw~VT)Z@>L12}wag8UzFc2?=Qs zL{eglgtQXUf`oJm7NB%UNr!YuHz=ueNeW1J*Z*3cbAHeB>i^=LF&uY{`xasEwb%My z*PQb+|1>1hG7&nar0H9UTAuJViLE)Lo%Q6bJR#+dCNW#dFIDktBuaMtbSKQ=8_u_@ zc{HdT^qk+Wm+pOZrMiU%&PzB_e;tPtMqPmlK3zIkMMwa`0?yod2c46T%$^1c)>B=W zU##8VG6lpclQd!NS;v<;mI`>;;b`Z_dlgPu%GARGe7b6xM;g1vwW^#hnHDeQ_^DSL z=2$UEh(H4!iyDz!*fXr#Sa~bO*yU@aQ`L?3{vcygAy! Z6`9xFNwxR zj}ar7DL%B~1Ul(SpMWf`uUl=Q!A{Z$&z=GDN+LAO(v%q~Kqh@$_!=8)eFETYvnS ziE)c(>EHww9UxeAciG(r*$3tUm;}(0S)BrZk>}!_dBL`aWPw?~I!Vz#+>+*}LN+#u z)UggWD(5^Kv~`8+4WE}2B3V!Lh_14Gvkx|=S&SSw>+k(}TX(~Tq22wF93^Jn!T!zC z4LH&W3#Hn%V?wGij%`N_&YU{!c-G_0X&RW`5|xl!MGIr)80Lt;_lzUSuu}~0d{VrC z>C1*Hc?GsgGF0~S2n&_8;S~$HX;(UUZ(uJAZ;~H_>wa{h%(G{*pQyH?6_>HTG5-}3 zB9nT($Z+$a>uZuKF6pdTaw4JtHMyLU@JN(6*Gn3wS)O1&><5|V-sX$VyA7w!@_(Oa ze?}1{7IOr|*3Rwa(c|#eIDa+PpG(3+YzGh%#x`l)nB8-s!GX&-KNlm^p)zkgwx`Z$ zH^l~GQMiSVz9eK^!Lk$_F1KJDNL}NvFCmAk9!S9O3k(nN&yXdDSzv2x>u|pFfuaEA zT-7bL;x!w_l4gQFKZc*@SwJl9UuwzM7!kA>&nB@9GmjYayJwY-`c);J6n@PoA193; z{Ym}Qu& *@S39$k4S(R+Z~HqwZsg5v0foX1289bJce*QZ-MJIbY6r zbHm 4h6{p*w$Wnrpup@nHW5uiAt0`>A`wrJkz}LB~ znD!kpMC){1xy1h1`a#0_!Qgg(o{;@lotL*W=As=owO0V*I*Sm0z l%)Ns^1wc(SH2st}BuzHsH1;hVA zr~Bm;Y-}*V!(?;Jr%PmozG4>bZ~7Y&&OoJ2^>6&f^vqL#nBW~a-T+XQvtl %Qxchtj5;5yW%c1g8I50i(?8G$g4v|EAN_v67= zO_}Q7Duh2ZsXNA<^pTh??9@PSYaSUHd3nR O@s`h_{0nYR*vIv39R>=8bVi&cfsFa}=Wa;u{O8)o!3$nnBvt_M zC^SCfs*l(2DZZt){f2Jdn>g6nn25iP^}#w3CL{177nkts } z=@c;FZo==S0VLGj5PC^leR27#+3jENB@ZcsA)u41ngA&&D6*T9KvN_lFi?PXX2m#d zOt3K6Mi5 y_kn1+H-mutmW=JOD6PbgCE)qz`g1v#~=f(lfkVt_5N|8qB1zOTkm-*)3)X*;) zx0YC_U445UkSk>p%rb=hMUt0Xkmn0aR=(jOlUH|D5m$hHm(r#cmS~4L&>w-T(pL zf!3Q~_{6{pE;cavA(XOzC^Fcu_ePE1c~Stko#fi(#|2FYaZ6c61-4_O3nyO7WT9-R zjh?f^cF8uR!;MDLOOIIdwVLWgc(QlxQbzm>h`-E$`r5Cm<+D48=F_nQb5#pM cA~p)%M4-dC?zDYa8L!x05@0CaH>ARscFK4ev^ek;3dH64Xl;Qo7Mb8NWI z+2{*@HwCuulRFDlT>qqYcKBah1lS6gh2Fv@&i7v_Zo$QI!HP#QOtosgKrpX0Xornj zXOFTC^5x(SkvgbPDgbIb@CDeR`*F^9H{h%*#i(j0kiK#CNX5`!b8 kcu zF+y;46|LEx27yEXx=qM!_qiCJPa{LZQJ`_wwLeHG-d6|*qsF^Z?*Vx86H@+}CFhIB zmKfN-&!Dy1Ymg9U5#{}QZUnu_$Ojc08^g!7NC|iFM+xC-F&TUCCsxmT^1^)BMvRo0 z6Qe!*KtLcohZf_4%91>dzrZvrROdN{yE+Vlv%5?EV_eTgbv}fK{;R}m3#P_#j9rpL zXJ_e2k_-jE{R|9#Xc4u?b)kx~wI+87M&8;#ZP~}MK#z;CWZ)4N&bA3I?xMy;Yk=Qc zgj~8Ofc}1v%8POyu`GiNYzs;>pmPFU&3B-1%(yID;}&$q82BPnKBPpR>=SH;eMIfC zs7jvkgA?8tXkrZqXRfM=;owk0%rDT$90;|^H1owzu<>I?7=Tv6BQ72cUMWm9FCR}G za(J*IPA1@7I403xEsNJNH~m~qye4awnX0}`*6GVDcU2a#4ZuxQgaki*l)hhWp*-}v zrD(=W8aZMHv@)#joxq*ReoL}Yf$LMjx2z2A3_o5`Lx1+2S&8xbsd~yPnqar_=w=n1 z1DLH_Rhyl <(VnQ>_7hOWA`ICY*+3{f(6JsJK+aQOk*vcuKv zd-{48;nU1$qPNEmvdXI0B+;&+;qgvTJ|ByoBgo%NpHjT>&=#IiC!L(LuA0EX^m%%_ z@PtY#(v`8Q+#s3zlEx-?K YUd=rl@POL?*5Ip(1yH>-c92>)E57L{yxP%{XIQ z{d;dBf({7-^7z9GD_?zEqZeqh)|JeW!sj}t7p;GvHjXtBjosvag|1B9Uhw1c 0(-_ceaJ1jfBsJx+SR2X7keO>lJ zeZYSvzDpb`yd?jV?`Hdk%Z`olpZ`k1`2U;t{?H}mquX`KS7cVKE>()gU`1%TFx;!Y zU`nJ{sT1=ya9<`9`Rwiz*s7CbEvxaYTf?z^H~&hrk1p2OI1a`Fp*wr`kooC{@zK$f zp^UW#WAC<_FV9~Tn6P*A&Z6S{zt5UJA&8)dT+Z{Bwb50PqSI4!jnPrt({4xgwEcD3 z$8cl19tiUkP~TyisEv_(eHcsXGlt@^qX^*PUlbg1P8g=EnLO|WuMpVat&73zHoj)5 z`$FI4-ibPXO8HVGYIKWdT&m+9_42{VrYAir=eBA|VTGI{O^MAmPe-NR^CV|oPOLEz zr_TMNW(I=68T(x)>mXy>A642}9H;1An(fUW@z1i>lw6BnkQ-lzFMoqz&^bljq};CO zR_0d@pV4=N2WQITgfdRYyf% GcZg}8oFCwnkpLfZ4}g@KOE1rA#*0Y_A^&1ai1Es6Nn ^ZhL&K~wHtRxg9Oe2WI_!Jg5JKx6ABT| z3vx~fT&ZGH3N&tEI)A! BQ9?1jvHzzW;h4eooZ1;3*7hHXCMg7ehvC55!~-(Z!^lpD6oY=r zKD&jbG0PhP!b-lr+ <_aiDnw5h~>mS<#7%xRj{=%zyPDP`vm{)ki(OT(km z>9C}d0*WS@`^zU@mZEuroD^rG$sW9G>|Z~BSc4zW9`8&yQ90UgE@mx#t$s8!9qw-w zXoFtmr~SJh*4jkwh!@byUeqpNqF)}AU `hjzG0_ACC{^k7K z!5mGYTQ=DmijN_w3o5*zpyPESmo!_BYu<<6q~ME$Q%o!k)pJm0diu{N1T}Rnjyz9A zqR_PyrCBMjNWK?U@oKMMs~Vre%uy!57-a|f(1PZgw%qc1RwOZxs*U!8sBpmu(CY?D zxE#}9odM|8r%!KqRR%Un?iAAUT&Va9at2&p)!yffA$E#4Ewg#bGLy${Qwo1D8q-&= zJb!Us>4Y9j|FW%QJc9q@1!%IzCbqonhZq9k7~N@2Tuyt&^CPSqWn5`}(O_hjzVn0# zmE(KODX#9i{C-j=Jnp4>y#UWe``zpZ5EhcTal86O$F dZC1&hmv{5M3TP>hm94QyLeE$=r zc9BH+?Q~#zzm+^=*o&7iVln>kK)m!MFt5DANe0){f0tIL=u5;h9$)`vNnXuR-0sj5 z7MgZIsv!|NS|;<_CZ4kvLpoU%oB QMPvzMNBDWDlE{m{=)3j@UUfBmq@Wb6d-)n><_t1tQ#$y(r{0fy!4vXr6ri@ zC294RdT`a8J5|I99>2JTW%*XS>`Aa8kyPZTD!Xx^WNW{D-dni5*G+g|8H@KNPZ>)! zyiH`lMVXdpuqlm8k~(jvqRq>Vg8dP88DHm`H!VU^Z=&?HE)5X$6`M4blS$vMHI7{x z?>olT)%uHhbUz;~H0bw8)zfCNh6VhE#~#Hc7U@Z6oxfHJ*l{FN!z6DYa6FRS_!K~k zg=*Jk#eS#ov#nW8{0Fg2nF$JaFMzExDF5b%cs5Z9{qBAxMl27*+vu>KfcU$D(Q>z< zv|(o*+dGYk@{ix76bB20Lfmf2iI+V4$ecB9?G9Fk&wXPaUw;gpKlV|fRD0Lj24y7X zo6sD%bj6%%^%Ue@cH6Qih=5o2v^B*aws_#EV2d6UMcBm+NClnP_IIYDtJv81*2?TG zUc0IEx1ZC_KYhzVx$`+DrU8+6S0^gTjGvoPJ(rTkJu7X7hy2Z(o14wVbD-g|MGkx* zh9@IuN|Aha6mty{P=)<|U5H{GDUab~wI0_TaH{^d?^N@h6GOTGHEH25JOuU-YW0BB z>mWKS?S2;JG!h@SDyY@0pfLKwqX=T;H2gj)+!pW}5fSwvVe|7H$qO 2+YQpPe4OgZt0!ZCPP}{*b0@pVZ7~YPq&pV@7 z6H$^-@;&|rvfb) E9yM$i$m8yrYhzOXKhevR5HVJxL0=|2@r(55C;!^ z@Q%Zb=u3cJ{2@4)@Q@kX9iFD|A*&xm?{)pFrqYSzekvHZ{Tf~__RPQxK++_JC(prT z^z_Em!Pc}t@eSOraPnRyLsaQlAqYE{5Mh$5@(<}(e4V}bHw0dUqgquVLf^kehs7aT zbSwQ`Fod4Vh7H~$1vxtl^%vwp$M8f0b#rsg&Rf?oJ_?&hl^DV`AZu@iMc3RXzP={m z9U)&{`nbiO28<+V{!A4>2&YFzIs5gAO6|+CS7kvje{(~Ck0HRV%ds7J)Mp#sk~djd z=M>OlC|(K8u|Zt@6}%FgAgB)m;_5ym`{(WpDY2x-$wFfG;q5sGup(&lN-=^T`qgmt z P^5F*Fj`em{C-Fem$7wsYirAWL*$S0e1bdz*IKT GJtrWFBc<{{yR(P5g$N%Zk2mTiSVUlj^#0uTs?Lrt8s^Jk0V^lk_C^Tq zAORxC6}6z)4%yTd1u*94;D(1-g&_3Z8vZ 7xa|B*{YwCVVcIhdskz9eLQcQ526WByY8>*(1 )~D)ro`0 &kssZmq;-AhP8a)KLKv-uU^D4yv~gxsd>x+m8+9@2HzuZ1$Ixl@-VFL)B+N zK6&_H!uVXOjGlg?(@BZ8_bq9--vuBahBx#qvXWrU(C^lXt{RnCOvlO5`GaytT^e_9 z*Z%2K=@TWmqTTu(A0TuEbTkC}-}F-%7oZ8yuC4uU9x9OG(=5D(Bg{t6LL+zE9eFT- z0uOrw;pw^lKb0DPpJhKP9X&MBAeGLla|9pGrf1nIRBf1G=R?SV4@^8lU{|n*YvH%~ z=)63n;--- PB zV$?IA#H`Zcsw@)of^A5_I3I`j_!)vEIHtj}9G!XUXjJxn-B=5qeX#3mge4YB`m)&e zhd@75rg0`4DkE}h66`qFM(obkHe!sjaH*&}B%&k9kA83@&1F$srftuwU{Nf5DNB__aI!44!LTDFh>l(lHbZ#hYR~VVPegU6)?j z8MKR}Un1r3jqn#W#``3mireKq`tZ#!_arQy;?R>EF+(CY{W*d13n0ECOrLRd9@lYG z`6gTcK`F(O)T`!-;U+bx&BO?qC{Al_uH}-&Y^N!y{VpCS|KY;lqZEG{?-Z}4(M+VX z5bYGL{NUH&A H0lg^vD-RS-6A Y`hX@E!)OM_bJk6f2^le{k_BP_K$L($3BWzv@irwiPP52Ur_Vu z;eB0}cW`g&EcrB^u5NP$)VQ}7T@zH%jMd3cv)b;Usi#O$4mT;MnLQ}#`~e63k)-i@ zT2@!h-}!c81!Ya^EpvNRk#{is-R@J4mB$6ygrXLR>E;9pVxar%B+ >du5w%~0KFcif#y2kCr@`)G>g>%Zim{3YfRJ}dO> z90Ac)3Y6q{^vJOJe1c MMKUAc>+)F#^jM-lUzK8JotX7$LR$R5# ze;d9peB~(*(ac7k W%mQt1@?e35sr6Vbr;H=B?K`^BxYJS*t=5{6znFH zESzJ}v0bu@R={$(JC*n7GzjOzCe?!71v6uMHmeK0LiJGFq+qZE$ds`bm9qH}3uy-I zK`tb*i`kybm5*7Rd`wkNQbN$o-mB0}ALv0I4OS!-Bq29SXrJqm@2f%`QQ4Eh{RSKS zk};3lB+^}?1MJy0bAYq!dVj+S_j3ekf{Gjni9u&F;=13t6aySm&ql|kh&pcq!|B@f zT}mAr?tn3gX!9Ypx`yY8p`@}q6`Ea^2Rs_)xLdm}?7`ffK$JUuXCql-s0m)E-7v`r z@2j`1sW)4jjtgmH4Gjz+0s!otwi=v|+|hf1i>`2|_=uw2j(#ku>oq{uu0Gytmd^3r zyt{( utM=yAXQX_Pg_A~s}7w5N|4+qe)f z<{n`Yt*<_-GX^K$%7a(0XpGA7pFKH|*uSu^WSMbYHo79J${rd1 3bg z-pCg;CBF@>$2E>B@`;M(9!Tta(&t+dopt&JowVW*%sUA0Z6@pi!i8FB&i@$0#7^!m zFK-GCarrr*1jJv^Uqk%%rZ)n%addbZzKA1g-lxkXB|YZJU)3c8cyO4^Mw27Vyq&Qx z5gZneJuSN;O_)z3N2@It-@U^N#W|p`Tdn#^8R+JbL-z<0L%qsv71vvMcGJc$$@HFh zN=REl=!IQ#v6`xHW1W%qh*zko{Lc8+dFXscU-;e|5;y`7!&|mO^if}R8Q*A@u=mlT z=1;?`oQc0SnJ;l*i`rqoSXG-t#|{22DB_&sBi! tv# zu&GuP=@fRy;B `T_@>_bpejGtlrW}T9&ry0S`vPTzZ0i_utFz(lcH~W>6;)l zrGVD2Vk-JTz0_p1WzU{v=7Uw(q`7gYpVOs2|9etPjv!=~_#;1(PLy7NTBE?394zVY z&1Y?SuO_&DxGCp)Q9s!3-d$935ZrE6P*8Tayr>Ah6@y0Jr{&E@84?D@PcN=wNHa31 z-JqOl+4Lv*=zkBLgYA b)_#RIFNr@cy$9Rh)l|YR8hu^`)a9XyPywjm0*70E@_mlJ3bUJM2vIiG@ zuIx>cvyRuYp>Q&a#j=$m5?)>#yV@aGf50c-Qp`8rFh8^;Nx?3HvB;hwqmpVK_V}|H zrn33e!65Il9#_MO@?2+#kA=3yYSv%naLP%?cU?SEaTzsM{9%rVuhlx=Bb+CVG!0q| zs>fvg#yp*Dx?Eh!{?<|S)6Nn9NH|qul!76@Q$6fym;hTZvK%0@5byoIdtl%yWcqmS z-0@>p5VcbOBf%202Q=nEASN%}-%d%|xM52jjK;+i_gVkqr1DD#As( T#J_wZ~P<_ z!9U^?ax}C4@ZrPs@k#;C$B+*(*p5Y%w6v|^suFKgQd06o&?ZtnRmJzNBJXh8=!lu= zwjN8!v(?F3T~QP1G^I@IJ%;p_U#W7uA|g3*% +D?4Cf`FnU&O{SI?@LWh9a}=LTI+L=!WDQ4$K+t7zkSqt86BVf_Xba^{Rf!E zR9pfqI=9Czld%sr{D7Bh*BZ+yhaNfRH#Robtr$zh98Cf)IWQ>5>Gv i@Ang=_t_gt3Jqh|xDZGA{AH76c(S??&NlY+lG6u44rn1$!~3v$1%2=#7y z3Xn$G@N0g3@*1@KROB=|T1@l=N)80$fr^-iiw2(X_1Xi2n#0-mB+|kK8L1rURKN0u zS42MllLG;(4W(GWl<_x=UxmYF8NsJ%S30Ek;K(sO%uEbn-_hlY-h$jS^@iJUHMoR! z?Hr}WxIOI}clxr2VQUcTx%v#e`#%ZaMp)qZZJ}E{5myyn-vCV(>6BV3=HHQ>i)gQM zTG`c*{1~#^QnYL`+H`hYa3O;DI3W|Uk%C@I+4~w<7|mRq)n5c5*6t%{fP