版权声明:本套课程材料开源,使用和分享必须遵守「创作共用许可协议 CC BY-NC-SA」(来源引用-非商业用途使用-以相同方式共享)。


R语言总体介绍

R语言在编程语言中的定位

  • 数据处理
  • 统计分析
  • 图表绘制
  • 结果报告

发展中国家的全球R包开发贡献(截至2023年10月)

  • 占全球17%开发者
  • 占全球15%软件包
  • 占全球6%下载量

Chuan-Peng et al., 2025, AMPPS

发展中国家的全球R包开发贡献(截至2023年10月)
发展中国家的全球R包开发贡献(截至2023年10月)

R语言核心优势与编程理念

为什么要「编程」(而不是菜单操作)?

  • 可再用(reusable)
  • 可复现(reproducible)
  • 可定制(modifiable)
  • 可拓展(extendable)

「函数式 + 向量化 + 管道流」编程理念⭐️

  • 一套复杂流程,应集成为一个函数(function),避免复制粘贴很多遍
    • 函数 = 一组程序的标准化流程 + 灵活的参数设置
  • 一个问题的解决方法不是唯一的,需要考虑简洁性和易读性
    • 向量化批处理 > for循环
    • 管道操作符步步拆解 > 多个函数层层嵌套

牢固掌握基础编程语法

  • 赋值、判断、循环、对象类型与转换、函数与参数

全面了解选择最优R包

  • R包使用:站在巨人肩膀上,避免“重复造轮子”
  • R包开发:你也可以批判创新,开发自己的R包

R软件和RStudio编辑器下载安装

【实践1】下载安装R软件和RStudio编辑器

“R是笔记本🗒️,RStudio是笔记本💻。”

  • R最新版(https://cran.r-project.org/
  • RStudio最新版(https://posit.co/download/rstudio-desktop/
    • 选择适配版本,一路安装即可
    • 所有代码的编写和运行,都将在RStudio里完成~!⭐️
    • 简介:“RStudio is an Integrated Development Environment (IDE) [集成开发环境] for R and Python. It includes a console, syntax-highlighting editor that supports direct code execution, and tools for plotting, history, debugging, and workspace management. RStudio is available in open source and commercial editions and runs on the desktop (Windows, Mac, and Linux).”
    • 特色:“RStudio具有非常强大的功能,能够极大地提升数据分析和可视化的工作效率。它支持语法高亮、自动补齐、多标签视图、文件管理、图形窗口、扩展包管理、集成帮助查看器、代码格式化、版本控制、交互式调试以及其他功能。”
  • Rtools本地编译工具(https://cran.r-project.org/bin/windows/Rtools/
    • 用于从源代码本地编译R包
    • 仅Windows用户、R包开发时需要安装,务必装在C盘

RStudio编辑器设置

【实践2】设置RStudio界面

  • RStudio最上排“Tools”菜单 → “Global Options”菜单
    • “Code”—“Display”—“Syntax”
      • 勾选所有(语法高亮显示)
    • “Console”—“Display”
      • 勾选“Show syntax highlighting in console input”(语法高亮显示)
    • “Appearance”
      • Editor font:选择字体“Consolas”(内置)或“Maple Mono SC NF”(需额外安装)
      • Editor theme:选择主题配色“Tomorrow Night Bright”(对比醒目,深色护眼)
    • “Pane Layout”
      • 左上角:Source(代码/脚本文件)
      • 左下角:Console(控制台/命令行/运行结果/临时代码)
      • 右上角:Environment(运行环境与变量)、Files(文件夹)、Plots(作图结果)、Packages(R包管理)、Help(帮助文档)、Viewer(浏览器)
      • 右下角:Build(R包开发)、VCS(Git版本控制)
    • “R Markdown”
      • 取消勾选“Show output inline for all R Markdown documents”(所有结果均输出到Console)

  • Environment(环境窗口)可以帮助你查看:
    • 变量是否成功创建?
    • 数据是否成功导入?
    • 环境变量类型大小?

【探索发现】试试看这些代码

## R可以当计算器
1 + 1
[1] 2
pi  # 圆周率
[1] 3.142
sqrt(2)
[1] 1.414
(sqrt(5) - 1) / 2  # 黄金分割率
[1] 0.618

R包安装与管理

【探索发现】官方平台(CRAN)现在一共发布了多少个R程序包?

【探索发现】现有R包能覆盖哪些学科领域和统计方法?

【实践3】下载安装R程序包

安装/更新R包的两种方式:

  1. 点菜单
    • RStudio编辑器 → 右上方“Packages”窗口 → “Install”和“Update”
    • 进入“Install”菜单,输入R包名称(如:tidyverse),即可安装
  2. 写代码
    • CRAN正式版R包:install.packages("pkgname")
    • GitHub开发版R包:devtools::install_github("username/pkgname")

tidyversebruceR是两个综合R包,国内多所高校(包括北大)在本科及研究生R语言教学中均有使用。

CRAN-Version CRAN-Downloads

  • tidyverse开发者:Hadley Wickham(首发于2016年)
    • 综合工具箱:数据处理与可视化功能集合

CRAN-Version CRAN-Downloads

  • bruceR开发者:Han Wu Shuang Bao(首发于2021年)
    • 综合工具箱:统计分析与结果汇报功能集合(面向心理学与社会科学)
## 复制下面的代码,粘贴到RStudio的Console中,运行
install.packages("tidyverse")
install.packages("bruceR", dep=TRUE)
# 参数 dependencies=TRUE 安装所有依赖包

【探索发现】安装遇到报错怎么办?

  • 阅读报错信息
    • package ‘XXX’ is not available for this version of R
      • 这个包可能只存在于GitHub平台?
      • 是不是拼写错了?
  • 重启RStudio
    • 重启软件“包治百病”
  • 手动卸载重装R包
    • 能确保解除当前R包占用
  • 更新R软件和所有R包
    • 及时更新是一种好习惯
  • 检查网络连接,换一个镜像
    • “Tools”菜单 → “Global Options”菜单 → “Packages” → “Change” → 选一个国内镜像
  • 实在不行,等一两天再安装
    • R包在CRAN平台更新后,最初一两天安装时都需要暂时本地编译,等官方编译完成、发布编译版本后,用户才能快捷安装,所以你可能恰好遇到了刚刚更新的R包,不要心急,慢慢解决

【实践4】加载本地R包

## Load R packages
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.6
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.1     ✔ tibble    3.3.1
✔ lubridate 1.9.4     ✔ tidyr     1.3.2
✔ purrr     1.2.1     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(bruceR)

bruceR (v2026.1)
Broadly Useful Convenient and Efficient R functions

Packages also loaded:
✔ dplyr         ✔ data.table
✔ tidyr         ✔ emmeans
✔ stringr       ✔ lmerTest
✔ forcats       ✔ effectsize
✔ ggplot2       ✔ performance
✔ cowplot       ✔ interactions

Main functions of `bruceR`:
cc()            Describe()  TTEST()
add()           Freq()      MANOVA()
.mean()         Corr()      EMMEANS()
set.wd()        Alpha()     PROCESS()
import()        EFA()       model_summary()
print_table()   CFA()       lavaan_summary()

For full functionality, please install all dependencies:
install.packages("bruceR", dep=TRUE)

Online documentation:
https://psychbruce.github.io/bruceR

To use this package in publications, please cite:
Bao, H. W. S. (2021). bruceR: Broadly useful convenient and efficient R functions (Version 2026.1) [Computer software]. https://doi.org/10.32614/CRAN.package.bruceR

【作业1】R软件安装与配置

请在平台提交截图:

  • 你设置好的RStudio编辑器布局截图,其中包括【实践4】的代码和成功运行结果

R编程环境

总体建议:为每个项目单独建立一个“R Project”,使用“R Markdown”文档格式写代码。

  • R Markdown(兼具代码呈现与运行结果报告)⭐️
    • .Rmd文档格式
  • R Script(仅能保存R代码,没有运行结果)
    • .R文档格式
  • R Console(仅能临时在命令行运行,无法保存代码)
    • 没有文档,RStudio中的Console

(1)R Project(项目)

【实践5】为《R语言》课程学习建立一个独立的项目环境

  • RStudio最上排“File”菜单 → “New Project”菜单
    • “New Directory” → “New Project” → 起一个项目名称 (如“Project_R_Course”) → “Browse”选择存储该项目的上级目录 → “Create Project”

(2)R Console(命令行)

【探索发现】R语言赋值符号问题:一定要用箭头,不能用等号吗?

## R的两种赋值符号
x <- 1
x = 1

很多人推荐用<-而不建议用=,理由是所谓“容易引起歧义”、“以后就知道好处了”……

是真的吗?有逻辑吗?No!

  • 可以永远只用=赋值,完全没问题!
    • 与其他编程语言保持一致
  • 提高可读性:等号=前后加空格,逗号,后加空格
    • 可读性低:
      • x=c(1,2,3,4,5,6)
      • x=c(1.2,3.4,5.6)
    • 可读性高:
      • x = c(1, 2, 3, 4, 5, 6)
      • x = c(1.2, 3.4, 5.6)

【实践6】逐行运行代码,体会写法差异

小贴士:逐行运行代码的快捷键是Ctrl + Enter(Command + Return)哦~!

## 把123赋值给x
x=123
x = 123   # 推荐写法(与其他编程语言保持一致)
x<-123
x <- 123  # 教科书式写法(也是AI味儿的写法)

print(x)  # 查看对象
[1] 123
cat(x)    # 连接并打印对象里的字符(文本输出)
123
## 把-1赋值给x
x=-1
x = -1   # 推荐写法(与其他编程语言保持一致)
x<--1
x <- -1  # 教科书式写法(也是AI味儿的写法)

print(x)  # 查看对象
[1] -1
cat(x)    # 连接并打印对象里的字符(文本输出)
-1

【知识点】为什么会“找不到对象”?

“万物皆对象,万事皆函数。” —— John Chambers(R语言创始人之一)

  • R里的一切,都是对象!
    • 只要你把一个东西“存起来”,它就变成了一个对象
    • 你在R里做的所有事情,本质上都是在操作“对象”
  • “找不到对象”,是因为对象还没“出生”,后面所有相关代码都无法运行
    • 遇到报错,不要心慌,仔细阅读,逐一排查,追本溯源!
## 如果对象还没有赋值,不在运行环境中,就会找不到对象!
ecnu
错误: 找不到对象'ecnu'
Error: object 'ecnu' not found
ecnu = "华东师范大学"
ecnu
[1] "华东师范大学"
  • ecnu是一个对象
  • "ecnu"是对象名
  • "华东师范大学"是对象的值
## 如果函数所在的R包还没有加载,就会提示没有这个函数!
ecnu()
错误于ecnu(): 没有"ecnu"这个函数
Error in ecnu() : could not find function "ecnu"
ecnu = function() { cat("华东师范大学") }
ecnu()
华东师范大学

【探索发现】为什么R语言cat()函数名称叫“cat”?

为什么R语言cat()函数名称叫“cat”?🐱🐈😸🐈‍⬛

  • AI回答:R语言中的cat()函数之所以叫这个名字,是因为它源自Unix/Linux系统中的一个经典命令,其含义是“concatenate and print”(连接并打印)
    • 词源和历史
      • Unix命令cat:在操作系统中,cat命令最初的核心功能是读取一个或多个文件,将它们连接(concatenate)起来,然后输出(打印)到标准输出(通常是终端屏幕),例如cat file1.txt file2.txt会将两个文件的内容连续显示出来
      • R的继承:R语言诞生于Unix环境(贝尔实验室),其设计深受Unix哲学和已有工具的影响,许多R的基础函数名都直接借鉴了Unix命令或C语言函数,cat()就是其中之一
    • R中cat()的核心功能
      • 连接(concatenate):将多个对象(字符串、数字、变量值)连接成一个连续的输出流
      • 打印(print):将这个连接后的结果直接输出到控制台或指定文件,不加任何额外的装饰(比如索引号[1]或引号)
## 比较print()和cat()有什么不同
print(c("Hello", "World"))   # 字符串向量
[1] "Hello" "World"
cat("Hello", "World", "\n")  # 拼接字符串(\n表示换行)
Hello World 

(3)R Script(脚本文件)

  • 新建一个R Script脚本文件(.R
    • “File” → “New File” → “R Script”(也有快捷键:Ctrl + Shift + N)
    • 保存(快捷键:Ctrl + S)并取一个文档名

【知识点】R包与R函数的调用方式

【实践7】调用R包函数

set.wd()  # 如果不加载R包,就无法直接使用里面的函数
错误于set.wd(): 没有"set.wd"这个函数
library(bruceR)  # 加载R包
set.wd()  # 调用R函数(已载入环境)
✔ Set working directory to "D:/RStudio/RCourse"
x = set.wd()  # 调用R函数并将结果赋值给x
✔ Set working directory to "D:/RStudio/RCourse"
x
[1] "D:/RStudio/RCourse"
bruceR::set.wd()  # 明确调用R包函数(函数重名才用到)
✔ Set working directory to "D:/RStudio/RCourse"
bruceR:::p.trans(0)  # 调用R包隐藏函数(一般情况用不到)
[1] "<.001"

试试这些代码:

set.wd()  # set working directory to the path of the currently opened file
set.wd("~/")  # set working directory to the home path
set.wd("../")  # set working directory to the parent path
set.wd(ask=TRUE)  # select a folder with the prompt of a dialog

【实践8】查询函数的帮助文档

## 1. help(函数名)
help(set.wd)

## 2. ?函数名
?set.wd

## 3. ?包名::函数名
?bruceR::set.wd

## 4. 将光标移至函数名中的任意位置,按F1(或Fn + F1)
set.wd()

【知识点】RStudio常用快捷键

RStudio常用快捷键
功能 Windows & Linux Mac
自动补全代码 Tab Tab
运行当前代码行(Run) Ctrl + Enter Command + Return
注释当前代码行(Comment) Ctrl + Shift + C Shift + Command + C
移动当前代码行(上/下) Alt + ↑/↓ Option + ↑/↓
复制当前代码行(上/下) Alt + Shift + ↑/↓ Option + Command + ↑/↓
缩进当前代码行(Indent) Ctrl + I Command + I
删除当前代码行(Delete) Ctrl + D Command + D
快捷输入管道操作符%>% Ctrl + Shift + M Shift + Command + M
撤销(Undo) Ctrl + Z Command + Z
重做(Redo) Ctrl + Shift + Z Shift + Command + Z
保存文件(Save) Ctrl + S Command + S
清空Console Ctrl + L Ctrl + L

(4)R Markdown(综合文档)

  • 新建一个R Markdown综合文档(.Rmd
    • “File” → “New File” → “R Markdown” → 输入文档标题、作者姓名等信息

【探索发现】为什么要使用R Markdown?

  • 融合文字、代码、结果、图表,适用于研究论文补充材料(HTML文档)
    • Markdown语法
    • R、Python等编程语言
    • LaTeX数学公式
    • HTML脚本
    • CSS样式
    • ……
  • 辅助提高程序的结构性、逻辑性、简洁性,减少bug
  • 无需手动运行,每次“Knit”(自动运行渲染)都重新完整运行一遍
  • 高效率(自动整理结果)、可复现(完整记录所有处理步骤)、动态交互呈现

【知识点】Markdown语法基础

# 一级标题

## 二级标题

### 三级标题

#### 四级标题

普通文字,**粗体文字**,*斜体文字*,***粗斜体文字***,上标^2^,下标~2~

段内代码`mean(1:5)`用反引号

-   无序列表A
    -   无序列表A1
        -   无序列表A1-1
        -   无序列表A1-2
    -   无序列表A2
-   无序列表B
-   无序列表C

1.  有序列表01
2.  有序列表02
3.  有序列表03

普通文字,粗体文字斜体文字粗斜体文字,上标2,下标2

段内代码mean(1:5)用反引号

  • 无序列表A
    • 无序列表A1
      • 无序列表A1-1
      • 无序列表A1-2
    • 无序列表A2
  • 无序列表B
  • 无序列表C
  1. 有序列表01
  2. 有序列表02
  3. 有序列表03

以上都可以通过RStudio编辑器的“Visual”所见即所得模式快捷设置

【知识点】R Markdown代码块设置

eval 运行代码

{r, eval=TRUE} 运行代码

print(123)  # 运行代码
[1] 123

{r, eval=FALSE} 不运行代码

print(123)  # 不运行代码
echo 显示代码

{r, echo=TRUE} 显示代码

print(123)  # 显示代码
[1] 123

{r, echo=FALSE} 不显示代码(但运行)

[1] 123
results 显示结果

{r, results=TRUE} 显示结果

print(123)  # 显示结果
[1] 123

{r, results=FALSE} 不显示结果(但运行)

print(123)  # 不显示结果(但运行)
include 显示代码+显示结果

{r, include=TRUE} 显示代码+显示结果

print(123)  # 显示代码+显示结果
[1] 123

{r, include=FALSE} 不显示代码+不显示结果(但运行)

【实践9】设置Rmd文档属性

请在自己新建的R Markdown文档开头,替换修改以下属性信息,并删掉注释。

---
title: "标题"
subtitle: "副标题"
author: "你的姓名+学号"
date: "`r Sys.Date()`"     # 自动获取当前日期
output:
  html_document:           # HTML输出文档设置
    toc: true              # 生成目录
    toc_depth: 3           # 目录最多显示到3级标题
    toc_float:             # 目录浮动
      collapsed: false     # 目录展开
    code_download: true    # 显示下载代码按钮
    anchor_sections: true  # 节标题定位标
    highlight: pygments    # 代码高亮配色方案(建议用pygments)
    theme: default         # 页面整体主题方案
---

主题方案:

  • default, cerulean, cosmo, darkly, flatly, journal, lumen, paper, readable, sandstone, simplex, spacelab, united, yeti

【作业2】建立R Markdown模板

作业要求:

  • 将Rmd文档属性设置为你的信息(标题、副标题、姓名、学号、日期等),自选任意一种你喜欢的主题方案
  • 修改Rmd新建文档中自带的R代码块例子,体现代码块参数evalechoresultsinclude的不同设定分别会得到什么结果,并用多级标题分块整理这4个参数对应的效果
  • Knit运行渲染(快捷键:Ctrl + Shift + K)得到HTML网页结果

平台提交:

  • 运行得到的HTML网页,及其关键部分截图
Knit按钮(运行所有代码并渲染得到HTML网页,比如你现在正在看的这个网页就是这样来的)
Knit按钮(运行所有代码并渲染得到HTML网页,比如你现在正在看的这个网页就是这样来的)
LS0tDQp0aXRsZTogIuOAilLor63oqIDjgIvnrKwx56ug77ya5Z+656GA5YWl6ZeoIg0Kc3VidGl0bGU6IDxhIGhyZWY9Imh0dHBzOi8vcHN5Y2hicnVjZS5naXRodWIuaW8vUkNvdXJzZS8iPui/lOWbnuivvueoi+S4u+mhtTwvYT4NCmF1dGhvcjogIuaOiOivvuaVmeW4iO+8muWMheWvkuWQtOmcnCINCiMgZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGFuY2hvcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICBjc3M6IFJtZENTUy5jc3MNCi0tLQ0KDQpgYGB7PWh0bWx9DQo8cCBzdHlsZT0iZm9udC1zaXplOiAxMnB4Ij7niYjmnYPlo7DmmI7vvJrmnKzlpZfor77nqIvmnZDmlpnlvIDmupDvvIzkvb/nlKjlkozliIbkuqvlv4XpobvpgbXlrojjgIzliJvkvZzlhbHnlKjorrjlj6/ljY/orq4gQ0MgQlktTkMtU0HjgI3vvIjmnaXmupDlvJXnlKgt6Z2e5ZWG5Lia55So6YCU5L2/55SoLeS7peebuOWQjOaWueW8j+WFseS6q++8ieOAgjxpbWcgc3JjPSJpbWcvQ0MtQlktTkMtU0EuanBnIiB3aWR0aD0iMTIwcHgiIGhlaWdodD0iNDJweCIgc3R5bGU9ImZsb2F0OiByaWdodCIgLz48L3A+DQpgYGANCg0KYGBge3IgQ29uZmlnLCBpbmNsdWRlPUZBTFNFfQ0Kb3B0aW9ucygNCiAga25pdHIua2FibGUuTkEgPSAiIiwNCiAgZGlnaXRzID0gNA0KKQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KA0KICBjb21tZW50ID0gIiIsDQogIGZpZy53aWR0aCA9IDYsDQogIGZpZy5oZWlnaHQgPSA0LA0KICBkcGkgPSAzMDANCikNCmBgYA0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyBDaGFwMDHvvJrln7rnoYDlhaXpl6gNCg0KIyMjIyDmnKznq6DopoHngrnnm67lvZUNCg0KLSAgIFvjgJDlrp7ot7Ux44CR5LiL6L295a6J6KOFUui9r+S7tuWSjFJTdHVkaW/nvJbovpHlmahdKCPlrp7ot7Ux5LiL6L295a6J6KOFcui9r+S7tuWSjHJzdHVkaW/nvJbovpHlmagpDQotICAgW+OAkOWunui3tTLjgJHorr7nva5SU3R1ZGlv55WM6Z2iXSgj5a6e6Le1Muiuvue9rnJzdHVkaW/nlYzpnaIpDQotICAgW+OAkOaOoue0ouWPkeeOsOOAkeivleivleeci+i/meS6m+S7o+eggV0oI+aOoue0ouWPkeeOsOivleivleeci+i/meS6m+S7o+eggSkNCi0gICBb44CQ5o6i57Si5Y+R546w44CR5a6Y5pa55bmz5Y+w77yIQ1JBTu+8ieeOsOWcqOS4gOWFseWPkeW4g+S6huWkmuWwkeS4qlLnqIvluo/ljIXvvJ9dKCPmjqLntKLlj5HnjrDlrpjmlrnlubPlj7BjcmFu546w5Zyo5LiA5YWx5Y+R5biD5LqG5aSa5bCR5Liqcueoi+W6j+WMhSkNCi0gICBb44CQ5o6i57Si5Y+R546w44CR546w5pyJUuWMheiDveimhuebluWTquS6m+WtpuenkemihuWfn+WSjOe7n+iuoeaWueazle+8n10oI+aOoue0ouWPkeeOsOeOsOaciXLljIXog73opobnm5blk6rkupvlrabnp5Hpoobln5/lkoznu5/orqHmlrnms5UpDQotICAgW+OAkOWunui3tTPjgJHkuIvovb3lronoo4VS56iL5bqP5YyFXSgj5a6e6Le1M+S4i+i9veWuieijhXLnqIvluo/ljIUp77yI6YeN54K577yJDQotICAgW+OAkOaOoue0ouWPkeeOsOOAkeWuieijhemBh+WIsOaKpemUmeaAjuS5iOWKnu+8n10oI+aOoue0ouWPkeeOsOWuieijhemBh+WIsOaKpemUmeaAjuS5iOWKnikNCi0gICBb44CQ5a6e6Le1NOOAkeWKoOi9veacrOWcsFLljIVdKCPlrp7ot7U05Yqg6L295pys5ZywcuWMhSkNCi0gICBb44CQ5a6e6Le1NeOAkeS4uuOAilLor63oqIDjgIvor77nqIvlrabkuaDlu7rnq4vkuIDkuKrni6znq4vnmoTpobnnm67njq/looNdKCPlrp7ot7U15Li6cuivreiogOivvueoi+WtpuS5oOW7uueri+S4gOS4queLrOeri+eahOmhueebrueOr+WigykNCi0gICBb44CQ5o6i57Si5Y+R546w44CRUuivreiogOi1i+WAvOespuWPt+mXrumimO+8muS4gOWumuimgeeUqOeureWktO+8jOS4jeiDveeUqOetieWPt+WQl++8n10oI+aOoue0ouWPkeeOsHLor63oqIDotYvlgLznrKblj7fpl67popjkuIDlrpropoHnlKjnrq3lpLTkuI3og73nlKjnrYnlj7flkJcpDQotICAgW+OAkOWunui3tTbjgJHpgJDooYzov5DooYzku6PnoIHvvIzkvZPkvJrlhpnms5Xlt67lvIJdKCPlrp7ot7U26YCQ6KGM6L+Q6KGM5Luj56CB5L2T5Lya5YaZ5rOV5beu5byCKQ0KLSAgIFvjgJDnn6Xor4bngrnjgJHkuLrku4DkuYjkvJrigJzmib7kuI3liLDlr7nosaHigJ3vvJ9dKCPnn6Xor4bngrnkuLrku4DkuYjkvJrmib7kuI3liLDlr7nosaEpDQotICAgW+OAkOaOoue0ouWPkeeOsOOAkeS4uuS7gOS5iFLor63oqIBjYXQoKeWHveaVsOWQjeensOWPq+KAnGNhdOKAne+8n10oI+aOoue0ouWPkeeOsOS4uuS7gOS5iHLor63oqIBjYXTlh73mlbDlkI3np7Dlj6tjYXQpDQotICAgW+OAkOefpeivhueCueOAkVLljIXkuI5S5Ye95pWw55qE6LCD55So5pa55byPXSgj55+l6K+G54K5cuWMheS4jnLlh73mlbDnmoTosIPnlKjmlrnlvI8pDQotICAgW+OAkOWunui3tTfjgJHosIPnlKhS5YyF5Ye95pWwXSgj5a6e6Le1N+iwg+eUqHLljIXlh73mlbApDQotICAgW+OAkOWunui3tTjjgJHmn6Xor6Llh73mlbDnmoTluK7liqnmlofmoaNdKCPlrp7ot7U45p+l6K+i5Ye95pWw55qE5biu5Yqp5paH5qGjKe+8iOmHjeeCue+8iQ0KLSAgIFvjgJDnn6Xor4bngrnjgJFSU3R1ZGlv5bi455So5b+r5o236ZSuXSgj55+l6K+G54K5cnN0dWRpb+W4uOeUqOW/q+aNt+mUrinvvIjph43ngrnvvIkNCi0gICBb44CQ5o6i57Si5Y+R546w44CR5Li65LuA5LmI6KaB5L2/55SoUiBNYXJrZG93bu+8n10oI+aOoue0ouWPkeeOsOS4uuS7gOS5iOimgeS9v+eUqHItbWFya2Rvd24pDQotICAgW+OAkOefpeivhueCueOAkU1hcmtkb3du6K+t5rOV5Z+656GAXSgj55+l6K+G54K5bWFya2Rvd27or63ms5Xln7rnoYApDQotICAgW+OAkOefpeivhueCueOAkVIgTWFya2Rvd27ku6PnoIHlnZforr7nva5dKCPnn6Xor4bngrlyLW1hcmtkb3du5Luj56CB5Z2X6K6+572uKQ0KLSAgIFvjgJDlrp7ot7U544CR6K6+572uUm1k5paH5qGj5bGe5oCnXSgj5a6e6Le1Oeiuvue9rnJtZOaWh+aho+WxnuaApynvvIjph43ngrnvvIkNCg0KIyBS6K+t6KiA5oC75L2T5LuL57uNDQoNCiFbXShpbWcvUHJvZ3JhbW1pbmcuanBnKQ0KDQojIyMjIFLor63oqIDlnKjnvJbnqIvor63oqIDkuK3nmoTlrprkvY0NCg0KLSAgIOaVsOaNruWkhOeQhg0KLSAgIOe7n+iuoeWIhuaekA0KLSAgIOWbvuihqOe7mOWItg0KLSAgIOe7k+aenOaKpeWRig0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC0yNDQwMTc0NDEucG5nKQ0KDQoqKuWPkeWxleS4reWbveWutueahOWFqOeQg1LljIXlvIDlj5HotKHnjK7vvIjmiKroh7MyMDIz5bm0MTDmnIjvvIkqKg0KDQotICAg5Y2g5YWo55CDMTcl5byA5Y+R6ICFDQotICAg5Y2g5YWo55CDMTUl6L2v5Lu25YyFDQotICAg5Y2g5YWo55CDNiXkuIvovb3ph48NCg0K77yIW0NodWFuLVBlbmcgZXQgYWwuLCAyMDI1LCBBTVBQU10oaHR0cHM6Ly9kb2kub3JnLzEwLjExNzcvMjUxNTI0NTkyNTEzNTc1NjUpey51cml977yJDQoNCiFb5Y+R5bGV5Lit5Zu95a6255qE5YWo55CDUuWMheW8gOWPkei0oeeMru+8iOaIquiHszIwMjPlubQxMOaciO+8iV0oaW1nL0ZpZy5DUkFOLnBrZ3MucG5nKQ0KDQojIFLor63oqIDmoLjlv4PkvJjlir/kuI7nvJbnqIvnkIblv7UNCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtNDE4OTcyNzI2Ny5wbmcpDQoNCioq5Li65LuA5LmI6KaB44CM57yW56iL44CN77yI6ICM5LiN5piv6I+c5Y2V5pON5L2c77yJ77yfKioNCg0KLSAgIOWPr+WGjeeUqO+8iHJldXNhYmxl77yJDQotICAg5Y+v5aSN546w77yIcmVwcm9kdWNpYmxl77yJDQotICAg5Y+v5a6a5Yi277yIbW9kaWZpYWJsZe+8iQ0KLSAgIOWPr+aLk+Wxle+8iGV4dGVuZGFibGXvvIkNCg0KKirjgIzlh73mlbDlvI8gKyDlkJHph4/ljJYgKyDnrqHpgZPmtYHjgI3nvJbnqIvnkIblv7XirZDvuI8qKg0KDQotICAg5LiA5aWX5aSN5p2C5rWB56iL77yM5bqU6ZuG5oiQ5Li65LiA5Liq5Ye95pWw77yIZnVuY3Rpb27vvInvvIzpgb/lhY3lpI3liLbnspjotLTlvojlpJrpgY0NCiAgICAtICAg5Ye95pWwID0g5LiA57uE56iL5bqP55qE5qCH5YeG5YyW5rWB56iLICsg54G15rS755qE5Y+C5pWw6K6+572uDQotICAg5LiA5Liq6Zeu6aKY55qE6Kej5Yaz5pa55rOV5LiN5piv5ZSv5LiA55qE77yM6ZyA6KaB6ICD6JmR566A5rSB5oCn5ZKM5piT6K+75oCnDQogICAgLSAgIOWQkemHj+WMluaJueWkhOeQhiBcPiBmb3Llvqrnjq8NCiAgICAtICAg566h6YGT5pON5L2c56ym5q2l5q2l5ouG6KejIFw+IOWkmuS4quWHveaVsOWxguWxguW1jOWllw0KDQoqKueJouWbuuaOjOaPoeWfuuehgOe8lueoi+ivreazlSoqDQoNCi0gICDotYvlgLzjgIHliKTmlq3jgIHlvqrnjq/jgIHlr7nosaHnsbvlnovkuI7ovazmjaLjgIHlh73mlbDkuI7lj4LmlbANCg0KKirlhajpnaLkuobop6PpgInmi6nmnIDkvJhS5YyFKioNCg0KLSAgIFLljIXkvb/nlKjvvJrnq5nlnKjlt6jkurrogqnohoDkuIrvvIzpgb/lhY3igJzph43lpI3pgKDova7lrZDigJ0NCi0gICBS5YyF5byA5Y+R77ya5L2g5Lmf5Y+v5Lul5om55Yik5Yib5paw77yM5byA5Y+R6Ieq5bex55qEUuWMhQ0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC0xMDQ3MzY2NDUxLnBuZykNCg0KIyBS6L2v5Lu25ZKMUlN0dWRpb+e8lui+keWZqOS4i+i9veWuieijhQ0KDQojIyMjIOOAkOWunui3tTHjgJHkuIvovb3lronoo4VS6L2v5Lu25ZKMUlN0dWRpb+e8lui+keWZqCB7I+Wunui3tTHkuIvovb3lronoo4Vy6L2v5Lu25ZKMcnN0dWRpb+e8lui+keWZqH0NCg0KPiDigJxS5piv56yU6K6w5pys8J+Xku+4j++8jFJTdHVkaW/mmK/nrJTorrDmnKzwn5K744CC4oCdDQoNCi0gICBS5pyA5paw54mI77yIPGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnLz7vvIkNCiAgICAtICAgW0Rvd25sb2FkIFIgZm9yIFdpbmRvd3NdKGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL2Jpbi93aW5kb3dzLykg4oaSIFtpbnN0YWxsIFIgZm9yIHRoZSBmaXJzdCB0aW1lXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy9iaW4vd2luZG93cy9iYXNlLyl7LnVyaX0g4oaSIERvd25sb2FkIFIteC54LnggZm9yIFdpbmRvd3MNCiAgICAtICAgW0Rvd25sb2FkIFIgZm9yIG1hY09TXShodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy9iaW4vbWFjb3N4Lykg4oaSIOmAieaLqeacgOaWsOeJiOacrOS4i+i9veWuieijhQ0KICAgIC0gICDmiJHku6zlubbkuI3nm7TmjqXkvb/nlKhS6Ieq5bim6L2v5Lu255WM6Z2i4oCcUkd1aeKAne+8jOWboOS4uuWunuWcqOWkqueugOmZi+S6huKApuKApg0KLSAgIFJTdHVkaW/mnIDmlrDniYjvvIg8aHR0cHM6Ly9wb3NpdC5jby9kb3dubG9hZC9yc3R1ZGlvLWRlc2t0b3AvPu+8iQ0KICAgIC0gICDpgInmi6npgILphY3niYjmnKzvvIzkuIDot6/lronoo4XljbPlj68NCiAgICAtICAg5omA5pyJ5Luj56CB55qE57yW5YaZ5ZKM6L+Q6KGM77yM6YO95bCG5ZyoUlN0dWRpb+mHjOWujOaIkFx+77yB4q2Q77iPDQogICAgLSAgIOeugOS7i++8muKAnFJTdHVkaW8gaXMgYW4gKipJbnRlZ3JhdGVkIERldmVsb3BtZW50IEVudmlyb25tZW50IChJREUpKiogW+mbhuaIkOW8gOWPkeeOr+Wig10gZm9yIFIgYW5kIFB5dGhvbi4gSXQgaW5jbHVkZXMgYSBjb25zb2xlLCBzeW50YXgtaGlnaGxpZ2h0aW5nIGVkaXRvciB0aGF0IHN1cHBvcnRzIGRpcmVjdCBjb2RlIGV4ZWN1dGlvbiwgYW5kIHRvb2xzIGZvciBwbG90dGluZywgaGlzdG9yeSwgZGVidWdnaW5nLCBhbmQgd29ya3NwYWNlIG1hbmFnZW1lbnQuIFJTdHVkaW8gaXMgYXZhaWxhYmxlIGluIG9wZW4gc291cmNlIGFuZCBjb21tZXJjaWFsIGVkaXRpb25zIGFuZCBydW5zIG9uIHRoZSBkZXNrdG9wIChXaW5kb3dzLCBNYWMsIGFuZCBMaW51eCku4oCdDQogICAgLSAgIOeJueiJsu+8muKAnFJTdHVkaW/lhbfmnInpnZ7luLjlvLrlpKfnmoTlip/og73vvIzog73lpJ/mnoHlpKflnLDmj5DljYfmlbDmja7liIbmnpDlkozlj6/op4bljJbnmoTlt6XkvZzmlYjnjofjgILlroPmlK/mjIHor63ms5Xpq5jkuq7jgIHoh6rliqjooaXpvZDjgIHlpJrmoIfnrb7op4blm77jgIHmlofku7bnrqHnkIbjgIHlm77lvaLnqpflj6PjgIHmianlsZXljIXnrqHnkIbjgIHpm4bmiJDluK7liqnmn6XnnIvlmajjgIHku6PnoIHmoLzlvI/ljJbjgIHniYjmnKzmjqfliLbjgIHkuqTkupLlvI/osIPor5Xku6Xlj4rlhbbku5blip/og73jgILigJ0NCi0gICBSdG9vbHPmnKzlnLDnvJbor5Hlt6XlhbfvvIg8aHR0cHM6Ly9jcmFuLnItcHJvamVjdC5vcmcvYmluL3dpbmRvd3MvUnRvb2xzLz7vvIkNCiAgICAtICAg55So5LqO5LuO5rqQ5Luj56CB5pys5Zyw57yW6K+RUuWMhQ0KICAgIC0gICDku4VXaW5kb3dz55So5oi344CBUuWMheW8gOWPkeaXtumcgOimgeWuieijhe+8jOWKoeW/heijheWcqEPnm5gNCg0KIyBSU3R1ZGlv57yW6L6R5Zmo6K6+572uDQoNCiMjIyMg44CQ5a6e6Le1MuOAkeiuvue9rlJTdHVkaW/nlYzpnaIgeyPlrp7ot7Uy6K6+572ucnN0dWRpb+eVjOmdon0NCg0KLSAgICoqUlN0dWRpb+acgOS4iuaOkuKAnFRvb2xz4oCd6I+c5Y2VIOKGkiDigJxHbG9iYWwgT3B0aW9uc+KAneiPnOWNlSoqDQogICAgLSAgICoq4oCcQ29kZeKAneKAlOKAnERpc3BsYXnigJ3igJTigJxTeW50YXjigJ0qKg0KICAgICAgICAtICAg5Yu+6YCJ5omA5pyJ77yI6K+t5rOV6auY5Lqu5pi+56S677yJDQogICAgLSAgICoq4oCcQ29uc29sZeKAneKAlOKAnERpc3BsYXnigJ0qKg0KICAgICAgICAtICAg5Yu+6YCJ4oCcU2hvdyBzeW50YXggaGlnaGxpZ2h0aW5nIGluIGNvbnNvbGUgaW5wdXTigJ3vvIjor63ms5Xpq5jkuq7mmL7npLrvvIkNCiAgICAtICAgKirigJxBcHBlYXJhbmNl4oCdKioNCiAgICAgICAgLSAgIEVkaXRvciBmb25077ya6YCJ5oup5a2X5L2T4oCcQ29uc29sYXPigJ3vvIjlhoXnva7vvInmiJbigJxNYXBsZSBNb25vIFNDIE5G4oCd77yI6ZyA6aKd5aSW5a6J6KOF77yJDQogICAgICAgIC0gICBFZGl0b3IgdGhlbWXvvJrpgInmi6nkuLvpopjphY3oibLigJxUb21vcnJvdyBOaWdodCBCcmlnaHTigJ3vvIjlr7nmr5TphpLnm67vvIzmt7HoibLmiqTnnLzvvIkNCiAgICAtICAgKirigJxQYW5lIExheW91dOKAnSoqDQogICAgICAgIC0gICDlt6bkuIrop5LvvJpTb3VyY2XvvIjku6PnoIEv6ISa5pys5paH5Lu277yJDQogICAgICAgIC0gICDlt6bkuIvop5LvvJpDb25zb2xl77yI5o6n5Yi25Y+wL+WRveS7pOihjC/ov5DooYznu5Pmnpwv5Li05pe25Luj56CB77yJDQogICAgICAgIC0gICDlj7PkuIrop5LvvJpFbnZpcm9ubWVudO+8iOi/kOihjOeOr+Wig+S4juWPmOmHj++8ieOAgUZpbGVz77yI5paH5Lu25aS577yJ44CBUGxvdHPvvIjkvZzlm77nu5PmnpzvvInjgIFQYWNrYWdlc++8iFLljIXnrqHnkIbvvInjgIFIZWxw77yI5biu5Yqp5paH5qGj77yJ44CBVmlld2Vy77yI5rWP6KeI5Zmo77yJDQogICAgICAgIC0gICDlj7PkuIvop5LvvJpCdWlsZO+8iFLljIXlvIDlj5HvvInjgIFWQ1PvvIhHaXTniYjmnKzmjqfliLbvvIkNCiAgICAtICAgKirigJxSIE1hcmtkb3du4oCdKioNCiAgICAgICAgLSAgIOWPlua2iOWLvumAieKAnFNob3cgb3V0cHV0IGlubGluZSBmb3IgYWxsIFIgTWFya2Rvd24gZG9jdW1lbnRz4oCd77yI5omA5pyJ57uT5p6c5Z2H6L6T5Ye65YiwQ29uc29sZe+8iQ0KDQohW10oaW1nL1JTdHVkaW8tUGFuZS1MYXlvdXQucG5nKQ0KDQotICAgRW52aXJvbm1lbnTvvIjnjq/looPnqpflj6PvvInlj6/ku6XluK7liqnkvaDmn6XnnIvvvJoNCiAgICAtICAg5Y+Y6YeP5piv5ZCm5oiQ5Yqf5Yib5bu677yfDQogICAgLSAgIOaVsOaNruaYr+WQpuaIkOWKn+WvvOWFpe+8nw0KICAgIC0gICDnjq/looPlj5jph4/nsbvlnovlpKflsI/vvJ8NCg0KIyMjIyDjgJDmjqLntKLlj5HnjrDjgJHor5Xor5XnnIvov5nkupvku6PnoIEgeyPmjqLntKLlj5HnjrDor5Xor5XnnIvov5nkupvku6PnoIF9DQoNCmBgYHtyfQ0KIyMgUuWPr+S7peW9k+iuoeeul+WZqA0KMSArIDENCnBpICAjIOWchuWRqOeOhw0Kc3FydCgyKQ0KKHNxcnQoNSkgLSAxKSAvIDIgICMg6buE6YeR5YiG5Ymy546HDQpgYGANCg0KIyBS5YyF5a6J6KOF5LiO566h55CGDQoNCiMjIyMg44CQ5o6i57Si5Y+R546w44CR5a6Y5pa55bmz5Y+w77yIQ1JBTu+8ieeOsOWcqOS4gOWFseWPkeW4g+S6huWkmuWwkeS4qlLnqIvluo/ljIXvvJ8geyPmjqLntKLlj5HnjrDlrpjmlrnlubPlj7BjcmFu546w5Zyo5LiA5YWx5Y+R5biD5LqG5aSa5bCR5Liqcueoi+W6j+WMhX0NCg0KLSAgIOeCueWHu+eci+eci+WunuaXtue7n+iuoe+8mjxodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvcGFja2FnZXMvaW5kZXguaHRtbD4NCg0KIyMjIyDjgJDmjqLntKLlj5HnjrDjgJHnjrDmnIlS5YyF6IO96KaG55uW5ZOq5Lqb5a2m56eR6aKG5Z+f5ZKM57uf6K6h5pa55rOV77yfIHsj5o6i57Si5Y+R546w546w5pyJcuWMheiDveimhuebluWTquS6m+WtpuenkemihuWfn+WSjOe7n+iuoeaWueazlX0NCg0KLSAgIOeCueWHu+eci+eci+S4u+mimOebruW9le+8mjxodHRwczovL2NyYW4uci1wcm9qZWN0Lm9yZy93ZWIvdmlld3MvPg0KDQojIyMjIOOAkOWunui3tTPjgJHkuIvovb3lronoo4VS56iL5bqP5YyFIHsj5a6e6Le1M+S4i+i9veWuieijhXLnqIvluo/ljIV9DQoNCuWuieijhS/mm7TmlrBS5YyF55qE5Lik56eN5pa55byP77yaDQoNCjEuICDngrnoj5zljZUNCiAgICAtICAgUlN0dWRpb+e8lui+keWZqCDihpIg5Y+z5LiK5pa54oCcUGFja2FnZXPigJ3nqpflj6Mg4oaSIOKAnEluc3RhbGzigJ3lkozigJxVcGRhdGXigJ0NCiAgICAtICAg6L+b5YWl4oCcSW5zdGFsbOKAneiPnOWNle+8jOi+k+WFpVLljIXlkI3np7DvvIjlpoLvvJpgdGlkeXZlcnNlYO+8ie+8jOWNs+WPr+WuieijhQ0KMi4gIOWGmeS7o+eggQ0KICAgIC0gICBDUkFO5q2j5byP54mIUuWMhe+8mmBpbnN0YWxsLnBhY2thZ2VzKCJwa2duYW1lIilgDQogICAgLSAgIEdpdEh1YuW8gOWPkeeJiFLljIXvvJpgZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJ1c2VybmFtZS9wa2duYW1lIilgDQoNCmB0aWR5dmVyc2Vg5ZKMYGJydWNlUmDmmK/kuKTkuKrnu7zlkIhS5YyF77yM5Zu95YaF5aSa5omA6auY5qCh77yI5YyF5ous5YyX5aSn77yJ5Zyo5pys56eR5Y+K56CU56m255SfUuivreiogOaVmeWtpuS4reWdh+acieS9v+eUqOOAgg0KDQpbIVtdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvUl9wYWNrYWdlLXRpZHl2ZXJzZS1wdXJwbGUpXShodHRwczovL3RpZHl2ZXJzZS5vcmcvKSBbIVtDUkFOLVZlcnNpb25dKGh0dHBzOi8vd3d3LnItcGtnLm9yZy9iYWRnZXMvdmVyc2lvbi90aWR5dmVyc2U/Y29sb3I9Ymx1ZSldKGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9dGlkeXZlcnNlKSBbIVtDUkFOLURvd25sb2Fkc10oaHR0cHM6Ly9jcmFubG9ncy5yLXBrZy5vcmcvYmFkZ2VzL2dyYW5kLXRvdGFsL3RpZHl2ZXJzZSldKGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9dGlkeXZlcnNlKQ0KDQotICAgYHRpZHl2ZXJzZWDlvIDlj5HogIXvvJpIYWRsZXkgV2lja2hhbe+8iOmmluWPkeS6jjIwMTblubTvvIkNCiAgICAtICAg57u85ZCI5bel5YW3566x77yaKirmlbDmja7lpITnkIbkuI7lj6/op4bljJYqKuWKn+iDvembhuWQiA0KDQpbIVtdKGh0dHBzOi8vaW1nLnNoaWVsZHMuaW8vYmFkZ2UvUl9wYWNrYWdlLWJydWNlUi1wdXJwbGUpXShodHRwczovL3BzeWNoYnJ1Y2UuZ2l0aHViLmlvL2JydWNlUi8pIFshW0NSQU4tVmVyc2lvbl0oaHR0cHM6Ly93d3cuci1wa2cub3JnL2JhZGdlcy92ZXJzaW9uL2JydWNlUj9jb2xvcj1ibHVlKV0oaHR0cHM6Ly9DUkFOLlItcHJvamVjdC5vcmcvcGFja2FnZT1icnVjZVIpIFshW0NSQU4tRG93bmxvYWRzXShodHRwczovL2NyYW5sb2dzLnItcGtnLm9yZy9iYWRnZXMvZ3JhbmQtdG90YWwvYnJ1Y2VSKV0oaHR0cHM6Ly9DUkFOLlItcHJvamVjdC5vcmcvcGFja2FnZT1icnVjZVIpDQoNCi0gICBgYnJ1Y2VSYOW8gOWPkeiAhe+8mkhhbiBXdSBTaHVhbmcgQmFv77yI6aaW5Y+R5LqOMjAyMeW5tO+8iQ0KICAgIC0gICDnu7zlkIjlt6XlhbfnrrHvvJoqKue7n+iuoeWIhuaekOS4jue7k+aenOaxh+aKpSoq5Yqf6IO96ZuG5ZCI77yI6Z2i5ZCR5b+D55CG5a2m5LiO56S+5Lya56eR5a2m77yJDQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KIyMg5aSN5Yi25LiL6Z2i55qE5Luj56CB77yM57KY6LS05YiwUlN0dWRpb+eahENvbnNvbGXkuK3vvIzov5DooYwNCmluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIpDQppbnN0YWxsLnBhY2thZ2VzKCJicnVjZVIiLCBkZXA9VFJVRSkNCiMg5Y+C5pWwIGRlcGVuZGVuY2llcz1UUlVFIOWuieijheaJgOacieS+nei1luWMhQ0KYGBgDQoNCiMjIyMg44CQ5o6i57Si5Y+R546w44CR5a6J6KOF6YGH5Yiw5oql6ZSZ5oCO5LmI5Yqe77yfIHsj5o6i57Si5Y+R546w5a6J6KOF6YGH5Yiw5oql6ZSZ5oCO5LmI5YqefQ0KDQotICAg6ZiF6K+75oql6ZSZ5L+h5oGvDQogICAgLSAgIGBwYWNrYWdlIOKAmFhYWOKAmSBpcyBub3QgYXZhaWxhYmxlIGZvciB0aGlzIHZlcnNpb24gb2YgUmANCiAgICAgICAgLSAgIOi/meS4quWMheWPr+iDveWPquWtmOWcqOS6jkdpdEh1YuW5s+WPsO+8nw0KICAgICAgICAtICAg5piv5LiN5piv5ou85YaZ6ZSZ5LqG77yfDQotICAg6YeN5ZCvUlN0dWRpbw0KICAgIC0gICDph43lkK/ova/ku7bigJzljIXmsrvnmb7nl4XigJ0NCi0gICDmiYvliqjljbjovb3ph43oo4VS5YyFDQogICAgLSAgIOiDveehruS/neino+mZpOW9k+WJjVLljIXljaDnlKgNCi0gICDmm7TmlrBS6L2v5Lu25ZKM5omA5pyJUuWMhQ0KICAgIC0gICDlj4rml7bmm7TmlrDmmK/kuIDnp43lpb3kuaDmg68NCi0gICDmo4Dmn6XnvZHnu5zov57mjqXvvIzmjaLkuIDkuKrplZzlg48NCiAgICAtICAg4oCcVG9vbHPigJ3oj5zljZUg4oaSIOKAnEdsb2JhbCBPcHRpb25z4oCd6I+c5Y2VIOKGkiDigJxQYWNrYWdlc+KAnSDihpIg4oCcQ2hhbmdl4oCdIOKGkiDpgInkuIDkuKrlm73lhoXplZzlg48NCi0gICDlrp7lnKjkuI3ooYzvvIznrYnkuIDkuKTlpKnlho3lronoo4UNCiAgICAtICAgUuWMheWcqENSQU7lubPlj7Dmm7TmlrDlkI7vvIzmnIDliJ3kuIDkuKTlpKnlronoo4Xml7bpg73pnIDopoHmmoLml7bmnKzlnLDnvJbor5HvvIznrYnlrpjmlrnnvJbor5HlrozmiJDjgIHlj5HluIPnvJbor5HniYjmnKzlkI7vvIznlKjmiLfmiY3og73lv6vmjbflronoo4XvvIzmiYDku6XkvaDlj6/og73mgbDlpb3pgYfliLDkuobliJrliJrmm7TmlrDnmoRS5YyF77yM5LiN6KaB5b+D5oCl77yM5oWi5oWi6Kej5YazDQoNCiMjIyMg44CQ5a6e6Le1NOOAkeWKoOi9veacrOWcsFLljIUgeyPlrp7ot7U05Yqg6L295pys5ZywcuWMhX0NCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQojIyBMb2FkIFIgcGFja2FnZXMNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShicnVjZVIpDQpgYGANCg0KIyDjgJDkvZzkuJox44CRUui9r+S7tuWuieijheS4jumFjee9rg0KDQror7flnKjlubPlj7Dmj5DkuqTmiKrlm77vvJoNCg0KLSAgIOS9oOiuvue9ruWlveeahFJTdHVkaW/nvJbovpHlmajluIPlsYDmiKrlm77vvIzlhbbkuK3ljIXmi6zjgJDlrp7ot7U044CR55qE5Luj56CB5ZKM5oiQ5Yqf6L+Q6KGM57uT5p6cDQoNCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQojIFLnvJbnqIvnjq/looMNCg0KKirmgLvkvZPlu7rorq7vvJrkuLrmr4/kuKrpobnnm67ljZXni6zlu7rnq4vkuIDkuKrigJxSIFByb2plY3TigJ3vvIzkvb/nlKjigJxSIE1hcmtkb3du4oCd5paH5qGj5qC85byP5YaZ5Luj56CB44CCKioNCg0KLSAgICoqUiBNYXJrZG93bu+8iOWFvOWFt+S7o+eggeWRiOeOsOS4jui/kOihjOe7k+aenOaKpeWRiu+8ieKtkO+4jyoqDQogICAgLSAgIGAuUm1kYOaWh+aho+agvOW8jw0KLSAgIFIgU2NyaXB077yI5LuF6IO95L+d5a2YUuS7o+egge+8jOayoeaciei/kOihjOe7k+aenO+8iQ0KICAgIC0gICBgLlJg5paH5qGj5qC85byPDQotICAgUiBDb25zb2xl77yI5LuF6IO95Li05pe25Zyo5ZG95Luk6KGM6L+Q6KGM77yM5peg5rOV5L+d5a2Y5Luj56CB77yJDQogICAgLSAgIOayoeacieaWh+aho++8jFJTdHVkaW/kuK3nmoRDb25zb2xlDQoNCiMjIO+8iDHvvIlSIFByb2plY3TvvIjpobnnm67vvIkNCg0KIyMjIyDjgJDlrp7ot7U144CR5Li644CKUuivreiogOOAi+ivvueoi+WtpuS5oOW7uueri+S4gOS4queLrOeri+eahOmhueebrueOr+WigyB7I+Wunui3tTXkuLpy6K+t6KiA6K++56iL5a2m5Lmg5bu656uL5LiA5Liq54us56uL55qE6aG555uu546v5aKDfQ0KDQotICAgUlN0dWRpb+acgOS4iuaOkuKAnEZpbGXigJ3oj5zljZUg4oaSIOKAnE5ldyBQcm9qZWN04oCd6I+c5Y2VDQogICAgLSAgIOKAnE5ldyBEaXJlY3RvcnnigJ0g4oaSIOKAnE5ldyBQcm9qZWN04oCdIOKGkiDotbfkuIDkuKrpobnnm67lkI3np7AgKOWmguKAnFByb2plY3RfUl9Db3Vyc2XigJ0pIOKGkiDigJxCcm93c2XigJ3pgInmi6nlrZjlgqjor6Xpobnnm67nmoTkuIrnuqfnm67lvZUg4oaSIOKAnENyZWF0ZSBQcm9qZWN04oCdDQoNCiMjIO+8iDLvvIlSIENvbnNvbGXvvIjlkb3ku6TooYzvvIkNCg0KIyMjIyDjgJDmjqLntKLlj5HnjrDjgJFS6K+t6KiA6LWL5YC856ym5Y+36Zeu6aKY77ya5LiA5a6a6KaB55So566t5aS077yM5LiN6IO955So562J5Y+35ZCX77yfIHsj5o6i57Si5Y+R546wcuivreiogOi1i+WAvOespuWPt+mXrumimOS4gOWumuimgeeUqOeureWktOS4jeiDveeUqOetieWPt+WQl30NCg0KYGBge3J9DQojIyBS55qE5Lik56eN6LWL5YC856ym5Y+3DQp4IDwtIDENCnggPSAxDQpgYGANCg0K5b6I5aSa5Lq65o6o6I2Q55SoYDwtYOiAjOS4jeW7uuiurueUqGA9YO+8jOeQhueUseaYr+aJgOiwk+KAnOWuueaYk+W8lei1t+atp+S5ieKAneOAgeKAnOS7peWQjuWwseefpemBk+WlveWkhOS6huKAneKApuKApg0KDQrmmK/nnJ/nmoTlkJfvvJ/mnInpgLvovpHlkJfvvJ9Ob++8gQ0KDQotICAg5Y+v5Lul5rC46L+c5Y+q55SoYD1g6LWL5YC877yM5a6M5YWo5rKh6Zeu6aKY77yBDQogICAgLSAgIOS4juWFtuS7lue8lueoi+ivreiogOS/neaMgeS4gOiHtA0KLSAgIOaPkOmrmOWPr+ivu+aAp++8muetieWPt2A9YOWJjeWQjuWKoOepuuagvO+8jOmAl+WPt2AsYOWQjuWKoOepuuagvA0KICAgIC0gICDlj6/or7vmgKfkvY7vvJoNCiAgICAgICAgLSAgIGB4PWMoMSwyLDMsNCw1LDYpYA0KICAgICAgICAtICAgYHg9YygxLjIsMy40LDUuNilgDQogICAgLSAgIOWPr+ivu+aAp+mrmO+8mg0KICAgICAgICAtICAgYHggPSBjKDEsIDIsIDMsIDQsIDUsIDYpYA0KICAgICAgICAtICAgYHggPSBjKDEuMiwgMy40LCA1LjYpYA0KDQojIyMjIOOAkOWunui3tTbjgJHpgJDooYzov5DooYzku6PnoIHvvIzkvZPkvJrlhpnms5Xlt67lvIIgeyPlrp7ot7U26YCQ6KGM6L+Q6KGM5Luj56CB5L2T5Lya5YaZ5rOV5beu5byCfQ0KDQrlsI/otLTlo6vvvJrpgJDooYzov5DooYzku6PnoIHnmoTlv6vmjbfplK7mmK9DdHJsICsgRW50ZXLvvIhDb21tYW5kICsgUmV0dXJu77yJ5ZOmXH7vvIENCg0KYGBge3J9DQojIyDmiooxMjPotYvlgLznu5l4DQp4PTEyMw0KeCA9IDEyMyAgICMg5o6o6I2Q5YaZ5rOV77yI5LiO5YW25LuW57yW56iL6K+t6KiA5L+d5oyB5LiA6Ie077yJDQp4PC0xMjMNCnggPC0gMTIzICAjIOaVmeenkeS5puW8j+WGmeazle+8iOS5n+aYr0FJ5ZGz5YS/55qE5YaZ5rOV77yJDQoNCnByaW50KHgpICAjIOafpeeci+WvueixoQ0KY2F0KHgpICAgICMg6L+e5o6l5bm25omT5Y2w5a+56LGh6YeM55qE5a2X56ym77yI5paH5pys6L6T5Ye677yJDQpgYGANCg0KYGBge3J9DQojIyDmiootMei1i+WAvOe7mXgNCng9LTENCnggPSAtMSAgICMg5o6o6I2Q5YaZ5rOV77yI5LiO5YW25LuW57yW56iL6K+t6KiA5L+d5oyB5LiA6Ie077yJDQp4PC0tMQ0KeCA8LSAtMSAgIyDmlZnnp5HkuablvI/lhpnms5XvvIjkuZ/mmK9BSeWRs+WEv+eahOWGmeazle+8iQ0KDQpwcmludCh4KSAgIyDmn6XnnIvlr7nosaENCmNhdCh4KSAgICAjIOi/nuaOpeW5tuaJk+WNsOWvueixoemHjOeahOWtl+espu+8iOaWh+acrOi+k+WHuu+8iQ0KYGBgDQoNCiMjIyMg44CQ55+l6K+G54K544CR5Li65LuA5LmI5Lya4oCc5om+5LiN5Yiw5a+56LGh4oCd77yfIHsj55+l6K+G54K55Li65LuA5LmI5Lya5om+5LiN5Yiw5a+56LGhfQ0KDQo+IOKAnOS4h+eJqeeahuWvueixoe+8jOS4h+S6i+eahuWHveaVsOOAguKAnSDigJTigJQgSm9obiBDaGFtYmVyc++8iFLor63oqIDliJvlp4vkurrkuYvkuIDvvIkNCg0KLSAgICoqUumHjOeahOS4gOWIh++8jOmDveaYr+Wvueixoe+8gSoqDQogICAgLSAgIOWPquimgeS9oOaKiuS4gOS4quS4nOilv+KAnOWtmOi1t+adpeKAne+8jOWug+WwseWPmOaIkOS6huS4gOS4quWvueixoQ0KICAgIC0gICDkvaDlnKhS6YeM5YGa55qE5omA5pyJ5LqL5oOF77yM5pys6LSo5LiK6YO95piv5Zyo5pON5L2c4oCc5a+56LGh4oCdDQotICAg4oCc5om+5LiN5Yiw5a+56LGh4oCd77yM5piv5Zug5Li65a+56LGh6L+Y5rKh4oCc5Ye655Sf4oCd77yM5ZCO6Z2i5omA5pyJ55u45YWz5Luj56CB6YO95peg5rOV6L+Q6KGMDQogICAgLSAgIOmBh+WIsOaKpemUme+8jOS4jeimgeW/g+aFjO+8jOS7lOe7humYheivu++8jOmAkOS4gOaOkuafpe+8jOi/veacrOa6r+a6kO+8gQ0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMjIOWmguaenOWvueixoei/mOayoeaciei1i+WAvO+8jOS4jeWcqOi/kOihjOeOr+Wig+S4re+8jOWwseS8muaJvuS4jeWIsOWvueixoe+8gQ0KZWNudQ0KYGBgDQoNCmBgYCAgICAgICAgIA0K6ZSZ6K+vOiDmib7kuI3liLDlr7nosaEnZWNudScNCkVycm9yOiBvYmplY3QgJ2VjbnUnIG5vdCBmb3VuZA0KYGBgDQoNCmBgYHtyfQ0KZWNudSA9ICLljY7kuJzluIjojIPlpKflraYiDQplY251DQpgYGANCg0KLSAgIGBlY251YOaYr+S4gOS4quWvueixoQ0KLSAgIGAiZWNudSJg5piv5a+56LGh5ZCNDQotICAgYCLljY7kuJzluIjojIPlpKflraYiYOaYr+WvueixoeeahOWAvA0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCiMjIOWmguaenOWHveaVsOaJgOWcqOeahFLljIXov5jmsqHmnInliqDovb3vvIzlsLHkvJrmj5DnpLrmsqHmnInov5nkuKrlh73mlbDvvIENCmVjbnUoKQ0KYGBgDQoNCmBgYCAgICAgICAgIA0K6ZSZ6K+v5LqOZWNudSgpOiDmsqHmnIkiZWNudSLov5nkuKrlh73mlbANCkVycm9yIGluIGVjbnUoKSA6IGNvdWxkIG5vdCBmaW5kIGZ1bmN0aW9uICJlY251Ig0KYGBgDQoNCmBgYHtyfQ0KZWNudSA9IGZ1bmN0aW9uKCkgeyBjYXQoIuWNjuS4nOW4iOiMg+Wkp+WtpiIpIH0NCmVjbnUoKQ0KYGBgDQoNCiMjIyMg44CQ5o6i57Si5Y+R546w44CR5Li65LuA5LmIUuivreiogGNhdCgp5Ye95pWw5ZCN56ew5Y+r4oCcY2F04oCd77yfIHsj5o6i57Si5Y+R546w5Li65LuA5LmIcuivreiogGNhdOWHveaVsOWQjeensOWPq2NhdH0NCg0K5Li65LuA5LmIUuivreiogGBjYXQoKWDlh73mlbDlkI3np7Dlj6vigJxjYXTigJ3vvJ/wn5Cx8J+QiPCfmLjwn5CI4oCN4qybDQoNCi0gICBBSeWbnuetlO+8mlLor63oqIDkuK3nmoRgY2F0KClg5Ye95pWw5LmL5omA5Lul5Y+r6L+Z5Liq5ZCN5a2X77yM5piv5Zug5Li65a6D5rqQ6IeqVW5peC9MaW51eOezu+e7n+S4reeahOS4gOS4que7j+WFuOWRveS7pO+8jOWFtuWQq+S5ieaYryoq4oCcY29uY2F0ZW5hdGUgYW5kIHByaW504oCd77yI6L+e5o6l5bm25omT5Y2w77yJKioNCiAgICAtICAg6K+N5rqQ5ZKM5Y6G5Y+yDQogICAgICAgIC0gICBVbml45ZG95LukYGNhdGDvvJrlnKjmk43kvZzns7vnu5/kuK3vvIxjYXTlkb3ku6TmnIDliJ3nmoTmoLjlv4Plip/og73mmK/or7vlj5bkuIDkuKrmiJblpJrkuKrmlofku7bvvIzlsIblroPku6zov57mjqXvvIhjb25jYXRlbmF0Ze+8iei1t+adpe+8jOeEtuWQjui+k+WHuu+8iOaJk+WNsO+8ieWIsOagh+WHhui+k+WHuu+8iOmAmuW4uOaYr+e7iOerr+Wxj+W5le+8ie+8jOS+i+WmgmBjYXQgZmlsZTEudHh0IGZpbGUyLnR4dGDkvJrlsIbkuKTkuKrmlofku7bnmoTlhoXlrrnov57nu63mmL7npLrlh7rmnaUNCiAgICAgICAgLSAgIFLnmoTnu6fmib/vvJpS6K+t6KiA6K+e55Sf5LqOVW5peOeOr+Wig++8iOi0neWwlOWunumqjOWupO+8ie+8jOWFtuiuvuiuoea3seWPl1VuaXjlk7Llrablkozlt7LmnInlt6XlhbfnmoTlvbHlk43vvIzorrjlpJpS55qE5Z+656GA5Ye95pWw5ZCN6YO955u05o6l5YCf6Ym05LqGVW5peOWRveS7pOaIlkPor63oqIDlh73mlbDvvIxgY2F0KClg5bCx5piv5YW25Lit5LmL5LiADQogICAgLSAgIFLkuK1gY2F0KClg55qE5qC45b+D5Yqf6IO9DQogICAgICAgIC0gICAqKui/nuaOpe+8iGNvbmNhdGVuYXRl77yJKirvvJrlsIblpJrkuKrlr7nosaHvvIjlrZfnrKbkuLLjgIHmlbDlrZfjgIHlj5jph4/lgLzvvInov57mjqXmiJDkuIDkuKrov57nu63nmoTovpPlh7rmtYENCiAgICAgICAgLSAgICoq5omT5Y2w77yIcHJpbnTvvIkqKu+8muWwhui/meS4qui/nuaOpeWQjueahOe7k+aenOebtOaOpei+k+WHuuWIsOaOp+WItuWPsOaIluaMh+WumuaWh+S7tu+8jOS4jeWKoOS7u+S9lemineWklueahOijhemlsO+8iOavlOWmgue0ouW8leWPt2BbMV1g5oiW5byV5Y+377yJDQoNCmBgYHtyfQ0KIyMg5q+U6L6DcHJpbnQoKeWSjGNhdCgp5pyJ5LuA5LmI5LiN5ZCMDQpwcmludChjKCJIZWxsbyIsICJXb3JsZCIpKSAgICMg5a2X56ym5Liy5ZCR6YePDQpjYXQoIkhlbGxvIiwgIldvcmxkIiwgIlxuIikgICMg5ou85o6l5a2X56ym5Liy77yIXG7ooajnpLrmjaLooYzvvIkNCmBgYA0KDQojIyDvvIgz77yJUiBTY3JpcHTvvIjohJrmnKzmlofku7bvvIkNCg0KLSAgIOaWsOW7uuS4gOS4qlIgU2NyaXB06ISa5pys5paH5Lu277yIYC5SYO+8iQ0KICAgIC0gICDigJxGaWxl4oCdIOKGkiDigJxOZXcgRmlsZeKAnSDihpIg4oCcUiBTY3JpcHTigJ3vvIjkuZ/mnInlv6vmjbfplK7vvJpDdHJsICsgU2hpZnQgKyBO77yJDQogICAgLSAgIOS/neWtmO+8iOW/q+aNt+mUru+8mkN0cmwgKyBT77yJ5bm25Y+W5LiA5Liq5paH5qGj5ZCNDQoNCiMjIyMg44CQ55+l6K+G54K544CRUuWMheS4jlLlh73mlbDnmoTosIPnlKjmlrnlvI8geyPnn6Xor4bngrly5YyF5LiOcuWHveaVsOeahOiwg+eUqOaWueW8j30NCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMjQ1MTQ5MzI2LnBuZykNCg0KIyMjIyDjgJDlrp7ot7U344CR6LCD55SoUuWMheWHveaVsCB7I+Wunui3tTfosIPnlKhy5YyF5Ye95pWwfQ0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCnNldC53ZCgpICAjIOWmguaenOS4jeWKoOi9vVLljIXvvIzlsLHml6Dms5Xnm7TmjqXkvb/nlKjph4zpnaLnmoTlh73mlbANCmBgYA0KDQpgYGAgICAgICAgICANCumUmeivr+S6jnNldC53ZCgpOiDmsqHmnIkic2V0LndkIui/meS4quWHveaVsA0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShicnVjZVIpICAjIOWKoOi9vVLljIUNCnNldC53ZCgpICAjIOiwg+eUqFLlh73mlbDvvIjlt7Lovb3lhaXnjq/looPvvIkNCg0KeCA9IHNldC53ZCgpICAjIOiwg+eUqFLlh73mlbDlubblsIbnu5PmnpzotYvlgLznu5l4DQp4DQoNCmJydWNlUjo6c2V0LndkKCkgICMg5piO56Gu6LCD55SoUuWMheWHveaVsO+8iOWHveaVsOmHjeWQjeaJjeeUqOWIsO+8iQ0KDQpicnVjZVI6OjpwLnRyYW5zKDApICAjIOiwg+eUqFLljIXpmpDol4/lh73mlbDvvIjkuIDoiKzmg4XlhrXnlKjkuI3liLDvvIkNCmBgYA0KDQror5Xor5Xov5nkupvku6PnoIHvvJoNCg0KYGBge3IsIGV2YWw9RkFMU0V9DQpzZXQud2QoKSAgIyBzZXQgd29ya2luZyBkaXJlY3RvcnkgdG8gdGhlIHBhdGggb2YgdGhlIGN1cnJlbnRseSBvcGVuZWQgZmlsZQ0Kc2V0LndkKCJ+LyIpICAjIHNldCB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgaG9tZSBwYXRoDQpzZXQud2QoIi4uLyIpICAjIHNldCB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgcGFyZW50IHBhdGgNCnNldC53ZChhc2s9VFJVRSkgICMgc2VsZWN0IGEgZm9sZGVyIHdpdGggdGhlIHByb21wdCBvZiBhIGRpYWxvZw0KYGBgDQoNCiMjIyMg44CQ5a6e6Le1OOOAkeafpeivouWHveaVsOeahOW4ruWKqeaWh+ahoyB7I+Wunui3tTjmn6Xor6Llh73mlbDnmoTluK7liqnmlofmoaN9DQoNCmBgYHtyLCBldmFsPUZBTFNFfQ0KIyMgMS4gaGVscCjlh73mlbDlkI0pDQpoZWxwKHNldC53ZCkNCg0KIyMgMi4gP+WHveaVsOWQjQ0KP3NldC53ZA0KDQojIyAzLiA/5YyF5ZCNOjrlh73mlbDlkI0NCj9icnVjZVI6OnNldC53ZA0KDQojIyA0LiDlsIblhYnmoIfnp7voh7Plh73mlbDlkI3kuK3nmoTku7vmhI/kvY3nva7vvIzmjIlGMSjmiJZGbiArIEYxKQ0Kc2V0LndkKCkNCmBgYA0KDQojIyMjIOOAkOefpeivhueCueOAkVJTdHVkaW/luLjnlKjlv6vmjbfplK4geyPnn6Xor4bngrlyc3R1ZGlv5bi455So5b+r5o236ZSufQ0KDQp8IOWKn+iDvSAgICAgICAgICAgICAgICAgICAgICAgIHwgV2luZG93cyAmIExpbnV4ICAgfCBNYWMgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwg6Ieq5YqoKirooaXlhagqKuS7o+eggSAgICAgICAgICAgIHwgVGFiICAgICAgICAgICAgICAgfCBUYWIgICAgICAgICAgICAgICAgICAgIHwNCnwgKirov5DooYwqKuW9k+WJjeS7o+eggeihjChSdW4pICAgICB8IEN0cmwgKyBFbnRlciAgICAgIHwgQ29tbWFuZCArIFJldHVybiAgICAgICB8DQp8ICoq5rOo6YeKKirlvZPliY3ku6PnoIHooYwoQ29tbWVudCkgfCBDdHJsICsgU2hpZnQgKyBDICB8IFNoaWZ0ICsgQ29tbWFuZCArIEMgICAgfA0KfCAqKuenu+WKqCoq5b2T5YmN5Luj56CB6KGMKOS4ii/kuIspICAgfCBBbHQgKyDihpEv4oaTICAgICAgICAgfCBPcHRpb24gKyDihpEv4oaTICAgICAgICAgICB8DQp8ICoq5aSN5Yi2KirlvZPliY3ku6PnoIHooYwo5LiKL+S4iykgICB8IEFsdCArIFNoaWZ0ICsg4oaRL+KGkyB8IE9wdGlvbiArIENvbW1hbmQgKyDihpEv4oaTIHwNCnwgKirnvKnov5sqKuW9k+WJjeS7o+eggeihjChJbmRlbnQpICB8IEN0cmwgKyBJICAgICAgICAgIHwgQ29tbWFuZCArIEkgICAgICAgICAgICB8DQp8ICoq5Yig6ZmkKirlvZPliY3ku6PnoIHooYwoRGVsZXRlKSAgfCBDdHJsICsgRCAgICAgICAgICB8IENvbW1hbmQgKyBEICAgICAgICAgICAgfA0KfCDlv6vmjbfovpPlhaUqKueuoemBk+aTjeS9nOespioqYCU+JWAgfCBDdHJsICsgU2hpZnQgKyBNICB8IFNoaWZ0ICsgQ29tbWFuZCArIE0gICAgfA0KfCDmkqTplIAoVW5kbykgICAgICAgICAgICAgICAgICB8IEN0cmwgKyBaICAgICAgICAgIHwgQ29tbWFuZCArIFogICAgICAgICAgICB8DQp8IOmHjeWBmihSZWRvKSAgICAgICAgICAgICAgICAgIHwgQ3RybCArIFNoaWZ0ICsgWiAgfCBTaGlmdCArIENvbW1hbmQgKyBaICAgIHwNCnwg5L+d5a2Y5paH5Lu2KFNhdmUpICAgICAgICAgICAgICB8IEN0cmwgKyBTICAgICAgICAgIHwgQ29tbWFuZCArIFMgICAgICAgICAgICB8DQp8IOa4heepukNvbnNvbGUgICAgICAgICAgICAgICAgIHwgQ3RybCArIEwgICAgICAgICAgfCBDdHJsICsgTCAgICAgICAgICAgICAgIHwNCg0KOiBSU3R1ZGlv5bi455So5b+r5o236ZSuDQoNCiMjIO+8iDTvvIlSIE1hcmtkb3du77yI57u85ZCI5paH5qGj77yJDQoNCi0gICDmlrDlu7rkuIDkuKpSIE1hcmtkb3du57u85ZCI5paH5qGj77yIYC5SbWRg77yJDQogICAgLSAgIOKAnEZpbGXigJ0g4oaSIOKAnE5ldyBGaWxl4oCdIOKGkiDigJxSIE1hcmtkb3du4oCdIOKGkiDovpPlhaXmlofmoaPmoIfpopjjgIHkvZzogIXlp5PlkI3nrYnkv6Hmga8NCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMjMyNTQ2Nzk5MC5wbmcpDQoNCiMjIyMg44CQ5o6i57Si5Y+R546w44CR5Li65LuA5LmI6KaB5L2/55SoUiBNYXJrZG93bu+8nyB7I+aOoue0ouWPkeeOsOS4uuS7gOS5iOimgeS9v+eUqHItbWFya2Rvd259DQoNCi0gICDono3lkIjmloflrZfjgIHku6PnoIHjgIHnu5PmnpzjgIHlm77ooajvvIzpgILnlKjkuo7noJTnqbborrrmlofooaXlhYXmnZDmlpnvvIhIVE1M5paH5qGj77yJDQogICAgLSAgIE1hcmtkb3du6K+t5rOVDQogICAgLSAgIFLjgIFQeXRob27nrYnnvJbnqIvor63oqIANCiAgICAtICAgTGFUZVjmlbDlrablhazlvI8NCiAgICAtICAgSFRNTOiEmuacrA0KICAgIC0gICBDU1PmoLflvI8NCiAgICAtICAg4oCm4oCmDQotICAg6L6F5Yqp5o+Q6auY56iL5bqP55qE57uT5p6E5oCn44CB6YC76L6R5oCn44CB566A5rSB5oCn77yM5YeP5bCRYnVnDQotICAg5peg6ZyA5omL5Yqo6L+Q6KGM77yM5q+P5qyh4oCcS25pdOKAne+8iOiHquWKqOi/kOihjOa4suafk++8iemDvemHjeaWsOWujOaVtOi/kOihjOS4gOmBjQ0KLSAgIOmrmOaViOeOh++8iOiHquWKqOaVtOeQhue7k+aenO+8ieOAgeWPr+WkjeeOsO+8iOWujOaVtOiusOW9leaJgOacieWkhOeQhuatpemqpO+8ieOAgeWKqOaAgeS6pOS6kuWRiOeOsA0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC00MDcxNzE0NTcyLnBuZykNCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMjg5Njg3NTcxNC5wbmcpDQoNCiFbXShpbWFnZXMvY2xpcGJvYXJkLTI5ODI5MzQwNDYucG5nKQ0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC02NjQyNzY3NTgucG5nKQ0KDQohW10oaW1hZ2VzL2NsaXBib2FyZC0xMjMwMTg1OTAxLnBuZykNCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMTM1MTU0OTk3Mi5wbmcpDQoNCiMjIyMg44CQ55+l6K+G54K544CRTWFya2Rvd27or63ms5Xln7rnoYAgeyPnn6Xor4bngrltYXJrZG93buivreazleWfuuehgH0NCg0KYGBgICAgICAgICAgDQojIOS4gOe6p+agh+mimA0KDQojIyDkuoznuqfmoIfpopgNCg0KIyMjIOS4iee6p+agh+mimA0KDQojIyMjIOWbm+e6p+agh+mimA0KDQrmma7pgJrmloflrZfvvIwqKueyl+S9k+aWh+Wtlyoq77yMKuaWnOS9k+aWh+WtlyrvvIwqKirnspfmlpzkvZPmloflrZcqKirvvIzkuIrmoIdeMl7vvIzkuIvmoId+Mn4NCg0K5q615YaF5Luj56CBYG1lYW4oMTo1KWDnlKjlj43lvJXlj7cNCg0KLSAgIOaXoOW6j+WIl+ihqEENCiAgICAtICAg5peg5bqP5YiX6KGoQTENCiAgICAgICAgLSAgIOaXoOW6j+WIl+ihqEExLTENCiAgICAgICAgLSAgIOaXoOW6j+WIl+ihqEExLTINCiAgICAtICAg5peg5bqP5YiX6KGoQTINCi0gICDml6Dluo/liJfooahCDQotICAg5peg5bqP5YiX6KGoQw0KDQoxLiAg5pyJ5bqP5YiX6KGoMDENCjIuICDmnInluo/liJfooagwMg0KMy4gIOacieW6j+WIl+ihqDAzDQpgYGANCg0K5pmu6YCa5paH5a2X77yMKirnspfkvZPmloflrZcqKu+8jCrmlpzkvZPmloflrZcq77yMKioq57KX5pac5L2T5paH5a2XKioq77yM5LiK5qCHXjJe77yM5LiL5qCHfjJ+DQoNCuauteWGheS7o+eggWBtZWFuKDE6NSlg55So5Y+N5byV5Y+3DQoNCi0gICDml6Dluo/liJfooahBDQogICAgLSAgIOaXoOW6j+WIl+ihqEExDQogICAgICAgIC0gICDml6Dluo/liJfooahBMS0xDQogICAgICAgIC0gICDml6Dluo/liJfooahBMS0yDQogICAgLSAgIOaXoOW6j+WIl+ihqEEyDQotICAg5peg5bqP5YiX6KGoQg0KLSAgIOaXoOW6j+WIl+ihqEMNCg0KMS4gIOacieW6j+WIl+ihqDAxDQoyLiAg5pyJ5bqP5YiX6KGoMDINCjMuICDmnInluo/liJfooagwMw0KDQo+IOS7peS4iumDveWPr+S7pemAmui/h1JTdHVkaW/nvJbovpHlmajnmoTigJxWaXN1YWzigJ3miYDop4HljbPmiYDlvpfmqKHlvI/lv6vmjbforr7nva4NCg0KIyMjIyDjgJDnn6Xor4bngrnjgJFSIE1hcmtkb3du5Luj56CB5Z2X6K6+572uIHsj55+l6K+G54K5ci1tYXJrZG93buS7o+eggeWdl+iuvue9riAudGFic2V0IC50YWJzZXQtZmFkZSAudGFibGUtcGlsbH0NCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMTE3Mzg4MjQ5NC5wbmcpDQoNCiMjIyMjICoqZXZhbCDov5DooYzku6PnoIEqKg0KDQpge3IsIGV2YWw9VFJVRX1gIOi/kOihjOS7o+eggQ0KDQpgYGB7ciwgZXZhbD1UUlVFfQ0KcHJpbnQoMTIzKSAgIyDov5DooYzku6PnoIENCmBgYA0KDQpge3IsIGV2YWw9RkFMU0V9YCDkuI3ov5DooYzku6PnoIENCg0KYGBge3IsIGV2YWw9RkFMU0V9DQpwcmludCgxMjMpICAjIOS4jei/kOihjOS7o+eggQ0KYGBgDQoNCiMjIyMjICoqZWNobyDmmL7npLrku6PnoIEqKg0KDQpge3IsIGVjaG89VFJVRX1gIOaYvuekuuS7o+eggQ0KDQpgYGB7ciwgZWNobz1UUlVFfQ0KcHJpbnQoMTIzKSAgIyDmmL7npLrku6PnoIENCmBgYA0KDQpge3IsIGVjaG89RkFMU0V9YCDkuI3mmL7npLrku6PnoIHvvIjkvYbov5DooYzvvIkNCg0KYGBge3IsIGVjaG89RkFMU0V9DQpwcmludCgxMjMpICAjIOS4jeaYvuekuuS7o+egge+8iOS9hui/kOihjO+8iQ0KYGBgDQoNCiMjIyMjICoqcmVzdWx0cyDmmL7npLrnu5PmnpwqKg0KDQpge3IsIHJlc3VsdHM9VFJVRX1gIOaYvuekuue7k+aenA0KDQpgYGB7ciwgcmVzdWx0cz1UUlVFfQ0KcHJpbnQoMTIzKSAgIyDmmL7npLrnu5PmnpwNCmBgYA0KDQpge3IsIHJlc3VsdHM9RkFMU0V9YCDkuI3mmL7npLrnu5PmnpzvvIjkvYbov5DooYzvvIkNCg0KYGBge3IsIHJlc3VsdHM9RkFMU0V9DQpwcmludCgxMjMpICAjIOS4jeaYvuekuue7k+aenO+8iOS9hui/kOihjO+8iQ0KYGBgDQoNCiMjIyMjICoqaW5jbHVkZSDmmL7npLrku6PnoIEr5pi+56S657uT5p6cKioNCg0KYHtyLCBpbmNsdWRlPVRSVUV9YCDmmL7npLrku6PnoIEr5pi+56S657uT5p6cDQoNCmBgYHtyLCBpbmNsdWRlPVRSVUV9DQpwcmludCgxMjMpICAjIOaYvuekuuS7o+eggSvmmL7npLrnu5PmnpwNCmBgYA0KDQpge3IsIGluY2x1ZGU9RkFMU0V9YCDkuI3mmL7npLrku6PnoIEr5LiN5pi+56S657uT5p6c77yI5L2G6L+Q6KGM77yJDQoNCmBgYHtyLCBpbmNsdWRlPUZBTFNFfQ0KcHJpbnQoMTIzKSAgIyDkuI3mmL7npLrku6PnoIEr5LiN5pi+56S657uT5p6c77yI5L2G6L+Q6KGM77yJDQpgYGANCg0KIyMjIyDjgJDlrp7ot7U544CR6K6+572uUm1k5paH5qGj5bGe5oCnIHsj5a6e6Le1Oeiuvue9rnJtZOaWh+aho+WxnuaAp30NCg0K6K+35Zyo6Ieq5bex5paw5bu655qEUiBNYXJrZG93buaWh+aho+W8gOWktO+8jOabv+aNouS/ruaUueS7peS4i+WxnuaAp+S/oeaBr++8jOW5tuWIoOaOieazqOmHiuOAgg0KDQpgYGB7ciwgZXZhbD1GQUxTRX0NCi0tLQ0KdGl0bGU6ICLmoIfpopgiDQpzdWJ0aXRsZTogIuWJr+agh+mimCINCmF1dGhvcjogIuS9oOeahOWnk+WQjSvlrablj7ciDQpkYXRlOiAiYHIgU3lzLkRhdGUoKWAiICAgICAjIOiHquWKqOiOt+WPluW9k+WJjeaXpeacnw0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiAgICAgICAgICAgIyBIVE1M6L6T5Ye65paH5qGj6K6+572uDQogICAgdG9jOiB0cnVlICAgICAgICAgICAgICAjIOeUn+aIkOebruW9lQ0KICAgIHRvY19kZXB0aDogMyAgICAgICAgICAgIyDnm67lvZXmnIDlpJrmmL7npLrliLAz57qn5qCH6aKYDQogICAgdG9jX2Zsb2F0OiAgICAgICAgICAgICAjIOebruW9lea1ruWKqA0KICAgICAgY29sbGFwc2VkOiBmYWxzZSAgICAgIyDnm67lvZXlsZXlvIANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlICAgICMg5pi+56S65LiL6L295Luj56CB5oyJ6ZKuDQogICAgYW5jaG9yX3NlY3Rpb25zOiB0cnVlICAjIOiKguagh+mimOWumuS9jeaghw0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMgICAgIyDku6PnoIHpq5jkuq7phY3oibLmlrnmoYgo5bu66K6u55SocHlnbWVudHMpDQogICAgdGhlbWU6IGRlZmF1bHQgICAgICAgICAjIOmhtemdouaVtOS9k+S4u+mimOaWueahiA0KLS0tDQpgYGANCg0K5Li76aKY5pa55qGI77yaDQoNCi0gICBkZWZhdWx0LCBjZXJ1bGVhbiwgY29zbW8sIGRhcmtseSwgZmxhdGx5LCBqb3VybmFsLCBsdW1lbiwgcGFwZXIsIHJlYWRhYmxlLCBzYW5kc3RvbmUsIHNpbXBsZXgsIHNwYWNlbGFiLCB1bml0ZWQsIHlldGkNCg0KIVtdKGltYWdlcy9jbGlwYm9hcmQtMjA5MzM4OTEwMy5wbmcpDQoNCiMg44CQ5L2c5LiaMuOAkeW7uueri1IgTWFya2Rvd27mqKHmnb8NCg0K5L2c5Lia6KaB5rGC77yaDQoNCi0gICDlsIZSbWTmlofmoaPlsZ7mgKforr7nva7kuLrkvaDnmoTkv6Hmga/vvIjmoIfpopjjgIHlia/moIfpopjjgIHlp5PlkI3jgIHlrablj7fjgIHml6XmnJ/nrYnvvInvvIzoh6rpgInku7vmhI/kuIDnp43kvaDllpzmrKLnmoTkuLvpopjmlrnmoYgNCi0gICDkv67mlLlSbWTmlrDlu7rmlofmoaPkuK3oh6rluKbnmoRS5Luj56CB5Z2X5L6L5a2Q77yM5L2T546w5Luj56CB5Z2X5Y+C5pWwYGV2YWxg44CBYGVjaG9g44CBYHJlc3VsdHNg44CBYGluY2x1ZGVg55qE5LiN5ZCM6K6+5a6a5YiG5Yir5Lya5b6X5Yiw5LuA5LmI57uT5p6c77yM5bm255So5aSa57qn5qCH6aKY5YiG5Z2X5pW055CG6L+ZNOS4quWPguaVsOWvueW6lOeahOaViOaenA0KLSAgIEtuaXTov5DooYzmuLLmn5PvvIjlv6vmjbfplK7vvJpDdHJsICsgU2hpZnQgKyBL77yJ5b6X5YiwSFRNTOe9kemhtee7k+aenA0KDQrlubPlj7Dmj5DkuqTvvJoNCg0KLSAgIOi/kOihjOW+l+WIsOeahEhUTUznvZHpobXvvIzlj4rlhbblhbPplK7pg6jliIbmiKrlm74NCg0KIVtLbml05oyJ6ZKu77yI6L+Q6KGM5omA5pyJ5Luj56CB5bm25riy5p+T5b6X5YiwSFRNTOe9kemhte+8jOavlOWmguS9oOeOsOWcqOato+WcqOeci+eahOi/meS4que9kemhteWwseaYr+i/meagt+adpeeahO+8iV0oaW1hZ2VzL2NsaXBib2FyZC0xMTM1NjA0MDg3LnBuZykNCg==