20181103-Configure_YUM_Repository_And_EPEL_Repository_In_CentOS7

CentOS7系统配置国内yum源和epel源

https://www.cnblogs.com/renpingsheng/p/7845096.html

1.首先进入/etc/yum.repos.d/目录下,新建一个repo_bak目录,用于保存系统中原来的repo文件

[root@bogon ~]# cd /etc/yum.repos.d/

[root@bogon yum.repos.d]# mkdir repo_bak

[root@bogon yum.repos.d]# mv *.repo repo_bak/

2.在CentOS中配置使用网易和阿里的开源镜像

到网易和阿里开源镜像站点下载系统对应版本的repo文件

[root@bogon yum.repos.d]# wget http://mirrors.aliyun.com/repo/Centos-7.repo

[root@bogon yum.repos.d]# wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

[root@bogon yum.repos.d]# ls
Centos-7.repo  CentOS-Base-163.repo  repo.bak

或者手动下载repo文件并上传到/etc/yum.repos.d/目录

网易开源镜像站

阿里开源镜像站

3.清除系统yum缓存并生成新的yum缓存

[root@bogon yum.repos.d]# ls        # 列出/etc/yum.repos.d/目录下的文件
Centos-7.repo  CentOS-Base-163.repo  repo.bak

[root@bogon yum.repos.d]# yum clean all     # 清除系统所有的yum缓存
Loaded plugins: fastestmirror, langpacks
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Cleaning repos: base extras updates
Cleaning up everything
Cleaning up list of fastest mirrors

[root@bogon yum.repos.d]# yum makecache     # 生成yum缓存
Loaded plugins: fastestmirror, langpacks
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
base                                                                                  | 3.6 kB  00:00:00     
extras                                                                                | 3.4 kB  00:00:00     
updates                                                                               | 3.4 kB  00:00:00     
(1/12): base/7/x86_64/filelists_db                                                    | 6.7 MB  00:00:02     
(2/12): base/7/x86_64/group_gz                                                        | 156 kB  00:00:02     
(3/12): base/7/x86_64/other_db                                                        | 2.5 MB  00:00:01     
(4/12): base/7/x86_64/primary_db                                                      | 5.7 MB  00:00:02     
(5/12): extras/7/x86_64/prestodelta                                                   |  51 kB  00:00:01     
(6/12): extras/7/x86_64/filelists_db                                                  | 494 kB  00:00:02     
(7/12): extras/7/x86_64/other_db                                                      |  86 kB  00:00:00     
(8/12): extras/7/x86_64/primary_db                                                    | 130 kB  00:00:01     
(9/12): updates/7/x86_64/prestodelta                                                  | 406 kB  00:00:01     
(10/12): updates/7/x86_64/filelists_db                                                | 2.1 MB  00:00:01     
(11/12): updates/7/x86_64/other_db                                                    | 354 kB  00:00:00     
(12/12): updates/7/x86_64/primary_db                                                  | 3.6 MB  00:00:01     
Determining fastest mirrors
Metadata Cache Created

4.安装epel源

[root@bogon yum.repos.d]# yum list | grep epel-release
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
epel-release.noarch                         7-9                        extras   

[root@bogon yum.repos.d]# yum install -y epel-release
Loaded plugins: fastestmirror, langpacks
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package epel-release.noarch 0:7-9 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=============================================================================================================
 Package                       Arch                    Version                 Repository               Size
=============================================================================================================
Installing:
 epel-release                  noarch                  7-9                     extras                   14 k

Transaction Summary
=============================================================================================================
Install  1 Package

Total download size: 14 k
Installed size: 24 k
Downloading packages:
epel-release-7-9.noarch.rpm                                                           |  14 kB  00:00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : epel-release-7-9.noarch                                                                   1/1 
  Verifying  : epel-release-7-9.noarch                                                                   1/1 

Installed:
  epel-release.noarch 0:7-9                                                                                  

Complete!
[root@bogon yum.repos.d]# ls            # epel源安装成功,比原来多了一个epel.repo和epel-testing.repo文件
Centos-7.repo  CentOS-Base-163.repo  epel.repo  epel-testing.repo  repo.bak

5.使用阿里开源镜像提供的epel源

[root@bogon yum.repos.d]# wget -O /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo    # 下载阿里开源镜像的epel源文件
--2018-03-08 20:22:14--  http://mirrors.aliyun.com/repo/epel-7.repo
Resolving mirrors.aliyun.com (mirrors.aliyun.com)... 183.2.199.237, 113.96.109.95, 113.96.109.93, ...
Connecting to mirrors.aliyun.com (mirrors.aliyun.com)|183.2.199.237|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1084 (1.1K) [application/octet-stream]
Saving to: ‘/etc/yum.repos.d/epel-7.repo’

100%[=================================================================================================>] 1,084       --.-K/s   in 0s      

2018-03-08 20:22:14 (130 MB/s) - ‘/etc/yum.repos.d/epel-7.repo’ saved [1084/1084]

[root@bogon yum.repos.d]# ls
CentOS7-Base-163.repo  Centos-7.repo  epel-7.repo  epel.repo  epel-testing.repo  repo_bak

6.再次清除系统yum缓存,并重新生成新的yum缓存

[root@bogon yum.repos.d]# yum clean all
Loaded plugins: fastestmirror, langpacks
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Repository epel is listed more than once in the configuration
Repository epel-debuginfo is listed more than once in the configuration
Repository epel-source is listed more than once in the configuration
Cleaning repos: base epel extras updates
Cleaning up everything
Cleaning up list of fastest mirrors

[root@bogon yum.repos.d]# yum makecache
Loaded plugins: fastestmirror, langpacks
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Repository epel is listed more than once in the configuration
Repository epel-debuginfo is listed more than once in the configuration
Repository epel-source is listed more than once in the configuration
base                                                                                                                | 3.6 kB  00:00:00     
epel                                                                                                                | 4.7 kB  00:00:00     
extras                                                                                                              | 3.4 kB  00:00:00     
updates                                                                                                             | 3.4 kB  00:00:00     
(1/18): base/7/x86_64/group_gz                                                                                      | 156 kB  00:00:01     
(2/18): base/7/x86_64/filelists_db                                                                                  | 6.7 MB  00:00:07     
(3/18): base/7/x86_64/primary_db                                                                                    | 5.7 MB  00:00:06     
(4/18): epel/x86_64/group_gz                                                                                        | 266 kB  00:00:01     
(5/18): epel/x86_64/updateinfo                                                                                      | 899 kB  00:00:02     
(6/18): epel/x86_64/prestodelta                                                                                     | 7.1 kB  00:00:00     
(7/18): base/7/x86_64/other_db                                                                                      | 2.5 MB  00:00:05     
(8/18): epel/x86_64/primary_db                                                                                      | 6.3 MB  00:00:04     
(9/18): extras/7/x86_64/filelists_db                                                                                | 636 kB  00:00:00     
(10/18): extras/7/x86_64/primary_db                                                                                 | 166 kB  00:00:00     
(11/18): extras/7/x86_64/other_db                                                                                   | 108 kB  00:00:00     
(12/18): extras/7/x86_64/prestodelta                                                                                | 102 kB  00:00:01     
(13/18): epel/x86_64/other_db                                                                                       | 3.0 MB  00:00:01     
(14/18): epel/x86_64/filelists_db                                                                                   |  10 MB  00:00:09     
(15/18): updates/7/x86_64/filelists_db                                                                              | 3.5 MB  00:00:02     
(16/18): updates/7/x86_64/prestodelta                                                                               | 771 kB  00:00:02     
(17/18): updates/7/x86_64/other_db                                                                                  | 621 kB  00:00:00     
(18/18): updates/7/x86_64/primary_db                                                                                | 6.0 MB  00:00:03     
Determining fastest mirrors
 * epel: mirrors.aliyun.com
Metadata Cache Created

7.查看系统可用的yum源和所有的yum源

[root@bogon yum.repos.d]# yum repolist enabled
Loaded plugins: fastestmirror, langpacks
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Repository epel is listed more than once in the configuration
Repository epel-debuginfo is listed more than once in the configuration
Repository epel-source is listed more than once in the configuration
Loading mirror speeds from cached hostfile
 * epel: mirrors.aliyun.com
repo id                                            repo name                                                                         status
base/7/x86_64                                      CentOS-7 - Base - 163.com                                                          9,591
epel/x86_64                                        Extra Packages for Enterprise Linux 7 - x86_64                                    12,382
extras/7/x86_64                                    CentOS-7 - Extras - 163.com                                                          390
updates/7/x86_64                                   CentOS-7 - Updates - 163.com                                                       1,941
repolist: 24,304

[root@bogon yum.repos.d]# yum repolist all
Loaded plugins: fastestmirror, langpacks
Repository base is listed more than once in the configuration
Repository updates is listed more than once in the configuration
Repository extras is listed more than once in the configuration
Repository centosplus is listed more than once in the configuration
Repository epel is listed more than once in the configuration
Repository epel-debuginfo is listed more than once in the configuration
Repository epel-source is listed more than once in the configuration
Loading mirror speeds from cached hostfile
 * epel: mirrors.aliyun.com
repo id                                     repo name                                                                       status
base/7/x86_64                               CentOS-7 - Base - 163.com                                                       enabled:  9,591
centosplus/7/x86_64                         CentOS-7 - Plus - 163.com                                                       disabled
contrib/7/x86_64                            CentOS-7 - Contrib - mirrors.aliyun.com                                         disabled
epel/x86_64                                 Extra Packages for Enterprise Linux 7 - x86_64                                  enabled: 12,382
epel-debuginfo/x86_64                       Extra Packages for Enterprise Linux 7 - x86_64 - Debug                          disabled
epel-source                                 Extra Packages for Enterprise Linux 7 - x86_64 - Source                         disabled
epel-testing/x86_64                         Extra Packages for Enterprise Linux 7 - Testing - x86_64                        disabled
epel-testing-debuginfo/x86_64               Extra Packages for Enterprise Linux 7 - Testing - x86_64 - Debug                disabled
epel-testing-source/x86_64                  Extra Packages for Enterprise Linux 7 - Testing - x86_64 - Source               disabled
extras/7/x86_64                             CentOS-7 - Extras - 163.com                                                     enabled:    390
updates/7/x86_64                            CentOS-7 - Updates - 163.com                                                    enabled:  1,941
repolist: 24,304

yum.conf解读

yum 配置

yum 的基础安装包包括:

yum  //RPM installer/updater yum-fastestmirror  //Yum plugin which chooses fastest repository from a mirrorlist yum-metadata-parser  //A fast metadata parser for yum

yum 可以同时配置多个资源库(Repository),简洁的配置文件(/etc/yum.conf),自动解决增加或删除rpm 包时遇到的依赖性问题,保持与RPM 数据库的一致性。   yum 的配置文件分为两部分:main 和repository

main 部分定义了全局配置选项,整个yum 配置文件应该只有一个main。常位于/etc/yum.conf 中。

repository 部分定义了每个源/服务器的具体配置,可以有一到多个。常位于/etc/yum.repo.d 目录下的各文件中。

四、配置本地yum源

1、挂载系统安装光盘

# mount /dev/cdrom /mnt/cdrom/

2、配置本地yum源

# cd /etc/yum.repos.d/

# ls

会看到四个repo 文件

yum.conf

yum.conf 文件一般位于/etc目录下,一般其中只包含main部分的配置选项。

使用以下命令查看yum.conf # cat /etc/yum.conf

[main]
cachedir=/var/cache/yum
  //yum 缓存的目录,yum 在此存储下载的rpm 包和数据库,默认设置为/var/cache/yum
keepcache=0
  //安装完成后是否保留软件包,0为不保留(默认为0),1为保留
debuglevel=2
  //Debug 信息输出等级,范围为0-10,缺省为2
logfile=/var/log/yum.log
  //yum 日志文件位置。用户可以到/var/log/yum.log 文件去查询过去所做的更新。
pkgpolicy=newest
  //包的策略。一共有两个选项,newest 和last,这个作用是如果你设置了多个repository,而同一软件在不同的repository 中同时存在,yum 应该安装哪一个,如果是newest,则yum 会安装最新的那个版本。如果是last,则yum 会将服务器id 以字母表排序,并选择最后的那个服务器上的软件安装。一般都是选newest。
distroverpkg=redhat-release
  //指定一个软件包,yum 会根据这个包判断你的发行版本,默认是redhat-release,也可以是安装的任何针对自己发行版的rpm 包。
tolerant=1
  //有1和0两个选项,表示yum 是否容忍命令行发生与软件包有关的错误,比如你要安装1,2,3三个包,而其中3此前已经安装了,如果你设为1,则yum 不会出现错误信息。默认是0。
exactarch=1
  //有1和0两个选项,设置为1,则yum 只会安装和系统架构匹配的软件包,例如,yum 不会将i686的软件包安装在适合i386的系统中。默认为1。
retries=6
  //网络连接发生错误后的重试次数,如果设为0,则会无限重试。默认值为6.
obsoletes=1
  //这是一个update 的参数,具体请参阅yum(8),简单的说就是相当于upgrade,允许更新陈旧的RPM包。
plugins=1
  //是否启用插件,默认1为允许,0表示不允许。我们一般会用yum-fastestmirror这个插件。
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=16&ref=http://bugs.centos.org/bug_report_page.php?category=yum

# Note: yum-RHN-plugin doesn't honor this.
metadata_expire=1h

installonly_limit = 5

# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d

除了上述之外,还有一些可以添加的选项,如:

  exclude=selinux*  // 排除某些软件在升级名单之外,可以用通配符,列表中各个项目要用空格隔开,这个对于安装了诸如美化包,中文补丁的朋友特别有用。   gpgcheck=1  // 有1和0两个选择,分别代表是否是否进行gpg(GNU Private Guard) 校验,以确定rpm 包的来源是有效和安全的。这个选项如果设置在[main]部分,则对每个repository 都有效。默认值为0。

LS0tCnRpdGxlOiAiMjAxODExMDMtQ29uZmlndXJlX1lVTV9SZXBvc2l0b3J5X0FuZF9FUEVMX1JlcG9zaXRvcnlfSW5fQ2VudE9TNyIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICBjc3M6IHJtZF90aGVtZS5jc3MKICAgIGhpZ2hsaWdodDogbW9ub2Nocm9tZQogICAgdGhlbWU6IHBhcGVyCiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiA0CiAgaHRtbF9kb2N1bWVudDoKICAgIGRmX3ByaW50OiBwYWdlZAogICAgdG9jOiB5ZXMKICAgIHRvY19kZXB0aDogJzQnCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgojIDIwMTgxMTAzLUNvbmZpZ3VyZV9ZVU1fUmVwb3NpdG9yeV9BbmRfRVBFTF9SZXBvc2l0b3J5X0luX0NlbnRPUzcKCiMgW0NlbnRPUzfns7vnu5/phY3nva7lm73lhoV5dW3mupDlkoxlcGVs5rqQXShodHRwczovL3d3dy5jbmJsb2dzLmNvbS9yZW5waW5nc2hlbmcvcC83ODQ1MDk2Lmh0bWwpCgo+IGh0dHBzOi8vd3d3LmNuYmxvZ3MuY29tL3JlbnBpbmdzaGVuZy9wLzc4NDUwOTYuaHRtbAoKIyMjIDEu6aaW5YWI6L+b5YWlYC9ldGMveXVtLnJlcG9zLmQvYOebruW9leS4i++8jOaWsOW7uuS4gOS4qnJlcG9fYmFr55uu5b2V77yM55So5LqO5L+d5a2Y57O757uf5Lit5Y6f5p2l55qEcmVwb+aWh+S7tgoKYGBge2Jhc2h9Cltyb290QGJvZ29uIH5dIyBjZCAvZXRjL3l1bS5yZXBvcy5kLwoKW3Jvb3RAYm9nb24geXVtLnJlcG9zLmRdIyBta2RpciByZXBvX2JhawoKW3Jvb3RAYm9nb24geXVtLnJlcG9zLmRdIyBtdiAqLnJlcG8gcmVwb19iYWsvCmBgYAoKIyMjIDIu5ZyoQ2VudE9T5Lit6YWN572u5L2/55So572R5piT5ZKM6Zi/6YeM55qE5byA5rqQ6ZWc5YOPCgrliLDnvZHmmJPlkozpmL/ph4zlvIDmupDplZzlg4/nq5nngrnkuIvovb3ns7vnu5/lr7nlupTniYjmnKznmoRyZXBv5paH5Lu2CgpgYGB7YmFzaH0KW3Jvb3RAYm9nb24geXVtLnJlcG9zLmRdIyB3Z2V0IGh0dHA6Ly9taXJyb3JzLmFsaXl1bi5jb20vcmVwby9DZW50b3MtNy5yZXBvCgpbcm9vdEBib2dvbiB5dW0ucmVwb3MuZF0jIHdnZXQgaHR0cDovL21pcnJvcnMuMTYzLmNvbS8uaGVscC9DZW50T1M3LUJhc2UtMTYzLnJlcG8KCltyb290QGJvZ29uIHl1bS5yZXBvcy5kXSMgbHMKQ2VudG9zLTcucmVwbyAgQ2VudE9TLUJhc2UtMTYzLnJlcG8gIHJlcG8uYmFrCmBgYAoK5oiW6ICF5omL5Yqo5LiL6L29cmVwb+aWh+S7tuW5tuS4iuS8oOWIsGAvZXRjL3l1bS5yZXBvcy5kL2Dnm67lvZUKClvnvZHmmJPlvIDmupDplZzlg4/nq5ldKGh0dHA6Ly9taXJyb3JzLjE2My5jb20vLmhlbHAvY2VudG9zLmh0bWwpCgpb6Zi/6YeM5byA5rqQ6ZWc5YOP56uZXShodHRwczovL29wc3guYWxpYmFiYS5jb20vbWlycm9yP2xhbmc9emgtY24pCgojIyMgMy7muIXpmaTns7vnu595dW3nvJPlrZjlubbnlJ/miJDmlrDnmoR5dW3nvJPlrZgKCmBgYHtiYXNofQpbcm9vdEBib2dvbiB5dW0ucmVwb3MuZF0jIGxzICAgICAgICAjIOWIl+WHui9ldGMveXVtLnJlcG9zLmQv55uu5b2V5LiL55qE5paH5Lu2CkNlbnRvcy03LnJlcG8gIENlbnRPUy1CYXNlLTE2My5yZXBvICByZXBvLmJhawoKW3Jvb3RAYm9nb24geXVtLnJlcG9zLmRdIyB5dW0gY2xlYW4gYWxsICAgICAjIOa4hemZpOezu+e7n+aJgOacieeahHl1bee8k+WtmApMb2FkZWQgcGx1Z2luczogZmFzdGVzdG1pcnJvciwgbGFuZ3BhY2tzClJlcG9zaXRvcnkgYmFzZSBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KUmVwb3NpdG9yeSB1cGRhdGVzIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IGV4dHJhcyBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KUmVwb3NpdG9yeSBjZW50b3NwbHVzIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpDbGVhbmluZyByZXBvczogYmFzZSBleHRyYXMgdXBkYXRlcwpDbGVhbmluZyB1cCBldmVyeXRoaW5nCkNsZWFuaW5nIHVwIGxpc3Qgb2YgZmFzdGVzdCBtaXJyb3JzCgpbcm9vdEBib2dvbiB5dW0ucmVwb3MuZF0jIHl1bSBtYWtlY2FjaGUgICAgICMg55Sf5oiQeXVt57yT5a2YCkxvYWRlZCBwbHVnaW5zOiBmYXN0ZXN0bWlycm9yLCBsYW5ncGFja3MKUmVwb3NpdG9yeSBiYXNlIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IHVwZGF0ZXMgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgZXh0cmFzIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IGNlbnRvc3BsdXMgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uCmJhc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLjYga0IgIDAwOjAwOjAwICAgICAKZXh0cmFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMuNCBrQiAgMDA6MDA6MDAgICAgIAp1cGRhdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMy40IGtCICAwMDowMDowMCAgICAgCigxLzEyKTogYmFzZS83L3g4Nl82NC9maWxlbGlzdHNfZGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA2LjcgTUIgIDAwOjAwOjAyICAgICAKKDIvMTIpOiBiYXNlLzcveDg2XzY0L2dyb3VwX2d6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDE1NiBrQiAgMDA6MDA6MDIgICAgIAooMy8xMik6IGJhc2UvNy94ODZfNjQvb3RoZXJfZGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMi41IE1CICAwMDowMDowMSAgICAgCig0LzEyKTogYmFzZS83L3g4Nl82NC9wcmltYXJ5X2RiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA1LjcgTUIgIDAwOjAwOjAyICAgICAKKDUvMTIpOiBleHRyYXMvNy94ODZfNjQvcHJlc3RvZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA1MSBrQiAgMDA6MDA6MDEgICAgIAooNi8xMik6IGV4dHJhcy83L3g4Nl82NC9maWxlbGlzdHNfZGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNDk0IGtCICAwMDowMDowMiAgICAgCig3LzEyKTogZXh0cmFzLzcveDg2XzY0L290aGVyX2RiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgODYga0IgIDAwOjAwOjAwICAgICAKKDgvMTIpOiBleHRyYXMvNy94ODZfNjQvcHJpbWFyeV9kYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEzMCBrQiAgMDA6MDA6MDEgICAgIAooOS8xMik6IHVwZGF0ZXMvNy94ODZfNjQvcHJlc3RvZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNDA2IGtCICAwMDowMDowMSAgICAgCigxMC8xMik6IHVwZGF0ZXMvNy94ODZfNjQvZmlsZWxpc3RzX2RiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyLjEgTUIgIDAwOjAwOjAxICAgICAKKDExLzEyKTogdXBkYXRlcy83L3g4Nl82NC9vdGhlcl9kYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDM1NCBrQiAgMDA6MDA6MDAgICAgIAooMTIvMTIpOiB1cGRhdGVzLzcveDg2XzY0L3ByaW1hcnlfZGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMy42IE1CICAwMDowMDowMSAgICAgCkRldGVybWluaW5nIGZhc3Rlc3QgbWlycm9ycwpNZXRhZGF0YSBDYWNoZSBDcmVhdGVkCmBgYAoKIyMjIDQu5a6J6KOFZXBlbOa6kAoKYGBge2Jhc2h9Cltyb290QGJvZ29uIHl1bS5yZXBvcy5kXSMgeXVtIGxpc3QgfCBncmVwIGVwZWwtcmVsZWFzZQpSZXBvc2l0b3J5IGJhc2UgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgdXBkYXRlcyBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KUmVwb3NpdG9yeSBleHRyYXMgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgY2VudG9zcGx1cyBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KZXBlbC1yZWxlYXNlLm5vYXJjaCAgICAgICAgICAgICAgICAgICAgICAgICA3LTkgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMgICAKCltyb290QGJvZ29uIHl1bS5yZXBvcy5kXSMgeXVtIGluc3RhbGwgLXkgZXBlbC1yZWxlYXNlCkxvYWRlZCBwbHVnaW5zOiBmYXN0ZXN0bWlycm9yLCBsYW5ncGFja3MKUmVwb3NpdG9yeSBiYXNlIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IHVwZGF0ZXMgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgZXh0cmFzIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IGNlbnRvc3BsdXMgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uCkxvYWRpbmcgbWlycm9yIHNwZWVkcyBmcm9tIGNhY2hlZCBob3N0ZmlsZQpSZXNvbHZpbmcgRGVwZW5kZW5jaWVzCi0tPiBSdW5uaW5nIHRyYW5zYWN0aW9uIGNoZWNrCi0tLT4gUGFja2FnZSBlcGVsLXJlbGVhc2Uubm9hcmNoIDA6Ny05IHdpbGwgYmUgaW5zdGFsbGVkCi0tPiBGaW5pc2hlZCBEZXBlbmRlbmN5IFJlc29sdXRpb24KCkRlcGVuZGVuY2llcyBSZXNvbHZlZAoKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogUGFja2FnZSAgICAgICAgICAgICAgICAgICAgICAgQXJjaCAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAgICAgICAgICAgICAgICAgUmVwb3NpdG9yeSAgICAgICAgICAgICAgIFNpemUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJbnN0YWxsaW5nOgogZXBlbC1yZWxlYXNlICAgICAgICAgICAgICAgICAgbm9hcmNoICAgICAgICAgICAgICAgICAgNy05ICAgICAgICAgICAgICAgICAgICAgZXh0cmFzICAgICAgICAgICAgICAgICAgIDE0IGsKClRyYW5zYWN0aW9uIFN1bW1hcnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpJbnN0YWxsICAxIFBhY2thZ2UKClRvdGFsIGRvd25sb2FkIHNpemU6IDE0IGsKSW5zdGFsbGVkIHNpemU6IDI0IGsKRG93bmxvYWRpbmcgcGFja2FnZXM6CmVwZWwtcmVsZWFzZS03LTkubm9hcmNoLnJwbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgMTQga0IgIDAwOjAwOjAwICAgICAKUnVubmluZyB0cmFuc2FjdGlvbiBjaGVjawpSdW5uaW5nIHRyYW5zYWN0aW9uIHRlc3QKVHJhbnNhY3Rpb24gdGVzdCBzdWNjZWVkZWQKUnVubmluZyB0cmFuc2FjdGlvbgogIEluc3RhbGxpbmcgOiBlcGVsLXJlbGVhc2UtNy05Lm5vYXJjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLzEgCiAgVmVyaWZ5aW5nICA6IGVwZWwtcmVsZWFzZS03LTkubm9hcmNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEvMSAKCkluc3RhbGxlZDoKICBlcGVsLXJlbGVhc2Uubm9hcmNoIDA6Ny05ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKQ29tcGxldGUhCltyb290QGJvZ29uIHl1bS5yZXBvcy5kXSMgbHMgICAgICAgICAgICAjIGVwZWzmupDlronoo4XmiJDlip/vvIzmr5Tljp/mnaXlpJrkuobkuIDkuKplcGVsLnJlcG/lkoxlcGVsLXRlc3RpbmcucmVwb+aWh+S7tgpDZW50b3MtNy5yZXBvICBDZW50T1MtQmFzZS0xNjMucmVwbyAgZXBlbC5yZXBvICBlcGVsLXRlc3RpbmcucmVwbyAgcmVwby5iYWsKYGBgCgojIyMgNS7kvb/nlKjpmL/ph4zlvIDmupDplZzlg4/mj5DkvpvnmoRlcGVs5rqQCgpgYGB7YmFzaH0KW3Jvb3RAYm9nb24geXVtLnJlcG9zLmRdIyB3Z2V0IC1PIC9ldGMveXVtLnJlcG9zLmQvZXBlbC03LnJlcG8gaHR0cDovL21pcnJvcnMuYWxpeXVuLmNvbS9yZXBvL2VwZWwtNy5yZXBvICAgICMg5LiL6L296Zi/6YeM5byA5rqQ6ZWc5YOP55qEZXBlbOa6kOaWh+S7tgotLTIwMTgtMDMtMDggMjA6MjI6MTQtLSAgaHR0cDovL21pcnJvcnMuYWxpeXVuLmNvbS9yZXBvL2VwZWwtNy5yZXBvClJlc29sdmluZyBtaXJyb3JzLmFsaXl1bi5jb20gKG1pcnJvcnMuYWxpeXVuLmNvbSkuLi4gMTgzLjIuMTk5LjIzNywgMTEzLjk2LjEwOS45NSwgMTEzLjk2LjEwOS45MywgLi4uCkNvbm5lY3RpbmcgdG8gbWlycm9ycy5hbGl5dW4uY29tIChtaXJyb3JzLmFsaXl1bi5jb20pfDE4My4yLjE5OS4yMzd8OjgwLi4uIGNvbm5lY3RlZC4KSFRUUCByZXF1ZXN0IHNlbnQsIGF3YWl0aW5nIHJlc3BvbnNlLi4uIDIwMCBPSwpMZW5ndGg6IDEwODQgKDEuMUspIFthcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1dClNhdmluZyB0bzog4oCYL2V0Yy95dW0ucmVwb3MuZC9lcGVsLTcucmVwb+KAmQoKMTAwJVs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Pl0gMSwwODQgICAgICAgLS0uLUsvcyAgIGluIDBzICAgICAgCgoyMDE4LTAzLTA4IDIwOjIyOjE0ICgxMzAgTUIvcykgLSDigJgvZXRjL3l1bS5yZXBvcy5kL2VwZWwtNy5yZXBv4oCZIHNhdmVkIFsxMDg0LzEwODRdCgpbcm9vdEBib2dvbiB5dW0ucmVwb3MuZF0jIGxzCkNlbnRPUzctQmFzZS0xNjMucmVwbyAgQ2VudG9zLTcucmVwbyAgZXBlbC03LnJlcG8gIGVwZWwucmVwbyAgZXBlbC10ZXN0aW5nLnJlcG8gIHJlcG9fYmFrCmBgYAoKIyMjIDYu5YaN5qyh5riF6Zmk57O757ufeXVt57yT5a2Y77yM5bm26YeN5paw55Sf5oiQ5paw55qEeXVt57yT5a2YCgpgYGB7YmFzaH0KW3Jvb3RAYm9nb24geXVtLnJlcG9zLmRdIyB5dW0gY2xlYW4gYWxsCkxvYWRlZCBwbHVnaW5zOiBmYXN0ZXN0bWlycm9yLCBsYW5ncGFja3MKUmVwb3NpdG9yeSBiYXNlIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IHVwZGF0ZXMgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgZXh0cmFzIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IGNlbnRvc3BsdXMgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgZXBlbCBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KUmVwb3NpdG9yeSBlcGVsLWRlYnVnaW5mbyBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KUmVwb3NpdG9yeSBlcGVsLXNvdXJjZSBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KQ2xlYW5pbmcgcmVwb3M6IGJhc2UgZXBlbCBleHRyYXMgdXBkYXRlcwpDbGVhbmluZyB1cCBldmVyeXRoaW5nCkNsZWFuaW5nIHVwIGxpc3Qgb2YgZmFzdGVzdCBtaXJyb3JzCgpbcm9vdEBib2dvbiB5dW0ucmVwb3MuZF0jIHl1bSBtYWtlY2FjaGUKTG9hZGVkIHBsdWdpbnM6IGZhc3Rlc3RtaXJyb3IsIGxhbmdwYWNrcwpSZXBvc2l0b3J5IGJhc2UgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgdXBkYXRlcyBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KUmVwb3NpdG9yeSBleHRyYXMgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgY2VudG9zcGx1cyBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KUmVwb3NpdG9yeSBlcGVsIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IGVwZWwtZGVidWdpbmZvIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IGVwZWwtc291cmNlIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpiYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMy42IGtCICAwMDowMDowMCAgICAgCmVwZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0Ljcga0IgIDAwOjAwOjAwICAgICAKZXh0cmFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMuNCBrQiAgMDA6MDA6MDAgICAgIAp1cGRhdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMy40IGtCICAwMDowMDowMCAgICAgCigxLzE4KTogYmFzZS83L3g4Nl82NC9ncm91cF9neiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNTYga0IgIDAwOjAwOjAxICAgICAKKDIvMTgpOiBiYXNlLzcveDg2XzY0L2ZpbGVsaXN0c19kYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDYuNyBNQiAgMDA6MDA6MDcgICAgIAooMy8xOCk6IGJhc2UvNy94ODZfNjQvcHJpbWFyeV9kYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNS43IE1CICAwMDowMDowNiAgICAgCig0LzE4KTogZXBlbC94ODZfNjQvZ3JvdXBfZ3ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyNjYga0IgIDAwOjAwOjAxICAgICAKKDUvMTgpOiBlcGVsL3g4Nl82NC91cGRhdGVpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDg5OSBrQiAgMDA6MDA6MDIgICAgIAooNi8xOCk6IGVwZWwveDg2XzY0L3ByZXN0b2RlbHRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNy4xIGtCICAwMDowMDowMCAgICAgCig3LzE4KTogYmFzZS83L3g4Nl82NC9vdGhlcl9kYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyLjUgTUIgIDAwOjAwOjA1ICAgICAKKDgvMTgpOiBlcGVsL3g4Nl82NC9wcmltYXJ5X2RiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDYuMyBNQiAgMDA6MDA6MDQgICAgIAooOS8xOCk6IGV4dHJhcy83L3g4Nl82NC9maWxlbGlzdHNfZGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNjM2IGtCICAwMDowMDowMCAgICAgCigxMC8xOCk6IGV4dHJhcy83L3g4Nl82NC9wcmltYXJ5X2RiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxNjYga0IgIDAwOjAwOjAwICAgICAKKDExLzE4KTogZXh0cmFzLzcveDg2XzY0L290aGVyX2RiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEwOCBrQiAgMDA6MDA6MDAgICAgIAooMTIvMTgpOiBleHRyYXMvNy94ODZfNjQvcHJlc3RvZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMTAyIGtCICAwMDowMDowMSAgICAgCigxMy8xOCk6IGVwZWwveDg2XzY0L290aGVyX2RiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAzLjAgTUIgIDAwOjAwOjAxICAgICAKKDE0LzE4KTogZXBlbC94ODZfNjQvZmlsZWxpc3RzX2RiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAxMCBNQiAgMDA6MDA6MDkgICAgIAooMTUvMTgpOiB1cGRhdGVzLzcveDg2XzY0L2ZpbGVsaXN0c19kYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMy41IE1CICAwMDowMDowMiAgICAgCigxNi8xOCk6IHVwZGF0ZXMvNy94ODZfNjQvcHJlc3RvZGVsdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3NzEga0IgIDAwOjAwOjAyICAgICAKKDE3LzE4KTogdXBkYXRlcy83L3g4Nl82NC9vdGhlcl9kYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDYyMSBrQiAgMDA6MDA6MDAgICAgIAooMTgvMTgpOiB1cGRhdGVzLzcveDg2XzY0L3ByaW1hcnlfZGIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNi4wIE1CICAwMDowMDowMyAgICAgCkRldGVybWluaW5nIGZhc3Rlc3QgbWlycm9ycwogKiBlcGVsOiBtaXJyb3JzLmFsaXl1bi5jb20KTWV0YWRhdGEgQ2FjaGUgQ3JlYXRlZApgYGAKCiMjIyA3Luafpeeci+ezu+e7n+WPr+eUqOeahHl1bea6kOWSjOaJgOacieeahHl1bea6kAoKYGBge2Jhc2h9Cltyb290QGJvZ29uIHl1bS5yZXBvcy5kXSMgeXVtIHJlcG9saXN0IGVuYWJsZWQKTG9hZGVkIHBsdWdpbnM6IGZhc3Rlc3RtaXJyb3IsIGxhbmdwYWNrcwpSZXBvc2l0b3J5IGJhc2UgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgdXBkYXRlcyBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KUmVwb3NpdG9yeSBleHRyYXMgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgY2VudG9zcGx1cyBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KUmVwb3NpdG9yeSBlcGVsIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IGVwZWwtZGVidWdpbmZvIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IGVwZWwtc291cmNlIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpMb2FkaW5nIG1pcnJvciBzcGVlZHMgZnJvbSBjYWNoZWQgaG9zdGZpbGUKICogZXBlbDogbWlycm9ycy5hbGl5dW4uY29tCnJlcG8gaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG8gbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMKYmFzZS83L3g4Nl82NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VudE9TLTcgLSBCYXNlIC0gMTYzLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5LDU5MQplcGVsL3g4Nl82NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYSBQYWNrYWdlcyBmb3IgRW50ZXJwcmlzZSBMaW51eCA3IC0geDg2XzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsMzgyCmV4dHJhcy83L3g4Nl82NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbnRPUy03IC0gRXh0cmFzIC0gMTYzLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzOTAKdXBkYXRlcy83L3g4Nl82NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VudE9TLTcgLSBVcGRhdGVzIC0gMTYzLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLDk0MQpyZXBvbGlzdDogMjQsMzA0Cgpbcm9vdEBib2dvbiB5dW0ucmVwb3MuZF0jIHl1bSByZXBvbGlzdCBhbGwKTG9hZGVkIHBsdWdpbnM6IGZhc3Rlc3RtaXJyb3IsIGxhbmdwYWNrcwpSZXBvc2l0b3J5IGJhc2UgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgdXBkYXRlcyBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KUmVwb3NpdG9yeSBleHRyYXMgaXMgbGlzdGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBjb25maWd1cmF0aW9uClJlcG9zaXRvcnkgY2VudG9zcGx1cyBpcyBsaXN0ZWQgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGNvbmZpZ3VyYXRpb24KUmVwb3NpdG9yeSBlcGVsIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IGVwZWwtZGVidWdpbmZvIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpSZXBvc2l0b3J5IGVwZWwtc291cmNlIGlzIGxpc3RlZCBtb3JlIHRoYW4gb25jZSBpbiB0aGUgY29uZmlndXJhdGlvbgpMb2FkaW5nIG1pcnJvciBzcGVlZHMgZnJvbSBjYWNoZWQgaG9zdGZpbGUKICogZXBlbDogbWlycm9ycy5hbGl5dW4uY29tCnJlcG8gaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbyBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMKYmFzZS83L3g4Nl82NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZW50T1MtNyAtIEJhc2UgLSAxNjMuY29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6ICA5LDU5MQpjZW50b3NwbHVzLzcveDg2XzY0ICAgICAgICAgICAgICAgICAgICAgICAgIENlbnRPUy03IC0gUGx1cyAtIDE2My5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQKY29udHJpYi83L3g4Nl82NCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZW50T1MtNyAtIENvbnRyaWIgLSBtaXJyb3JzLmFsaXl1bi5jb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkCmVwZWwveDg2XzY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmEgUGFja2FnZXMgZm9yIEVudGVycHJpc2UgTGludXggNyAtIHg4Nl82NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiAxMiwzODIKZXBlbC1kZWJ1Z2luZm8veDg2XzY0ICAgICAgICAgICAgICAgICAgICAgICBFeHRyYSBQYWNrYWdlcyBmb3IgRW50ZXJwcmlzZSBMaW51eCA3IC0geDg2XzY0IC0gRGVidWcgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkCmVwZWwtc291cmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmEgUGFja2FnZXMgZm9yIEVudGVycHJpc2UgTGludXggNyAtIHg4Nl82NCAtIFNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZAplcGVsLXRlc3RpbmcveDg2XzY0ICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhIFBhY2thZ2VzIGZvciBFbnRlcnByaXNlIExpbnV4IDcgLSBUZXN0aW5nIC0geDg2XzY0ICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQKZXBlbC10ZXN0aW5nLWRlYnVnaW5mby94ODZfNjQgICAgICAgICAgICAgICBFeHRyYSBQYWNrYWdlcyBmb3IgRW50ZXJwcmlzZSBMaW51eCA3IC0gVGVzdGluZyAtIHg4Nl82NCAtIERlYnVnICAgICAgICAgICAgICAgIGRpc2FibGVkCmVwZWwtdGVzdGluZy1zb3VyY2UveDg2XzY0ICAgICAgICAgICAgICAgICAgRXh0cmEgUGFja2FnZXMgZm9yIEVudGVycHJpc2UgTGludXggNyAtIFRlc3RpbmcgLSB4ODZfNjQgLSBTb3VyY2UgICAgICAgICAgICAgICBkaXNhYmxlZApleHRyYXMvNy94ODZfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENlbnRPUy03IC0gRXh0cmFzIC0gMTYzLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogICAgMzkwCnVwZGF0ZXMvNy94ODZfNjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2VudE9TLTcgLSBVcGRhdGVzIC0gMTYzLmNvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiAgMSw5NDEKcmVwb2xpc3Q6IDI0LDMwNApgYGAKCiMgeXVtLmNvbmbop6Por7sKCiMjIHl1bSDphY3nva4KCnl1bSDnmoTln7rnoYDlronoo4XljIXljIXmi6zvvJoKCnl1beOAgOOAgC8vUlBNIGluc3RhbGxlci91cGRhdGVyCnl1bS1mYXN0ZXN0bWlycm9y44CA44CALy9ZdW0gcGx1Z2luIHdoaWNoIGNob29zZXMgZmFzdGVzdCByZXBvc2l0b3J5IGZyb20gYSBtaXJyb3JsaXN0Cnl1bS1tZXRhZGF0YS1wYXJzZXLjgIDjgIAvL0EgZmFzdCBtZXRhZGF0YSBwYXJzZXIgZm9yIHl1bQoKeXVtIOWPr+S7peWQjOaXtumFjee9ruWkmuS4qui1hOa6kOW6kyhSZXBvc2l0b3J5Ke+8jOeugOa0geeahOmFjee9ruaWh+S7tu+8iC9ldGMveXVtLmNvbmbvvInvvIzoh6rliqjop6PlhrPlop7liqDmiJbliKDpmaRycG0g5YyF5pe26YGH5Yiw55qE5L6d6LWW5oCn6Zeu6aKY77yM5L+d5oyB5LiOUlBNIOaVsOaNruW6k+eahOS4gOiHtOaAp+OAggrjgIAKeXVtIOeahOmFjee9ruaWh+S7tuWIhuS4uuS4pOmDqOWIhu+8mm1haW4g5ZKMcmVwb3NpdG9yeQoKbWFpbiDpg6jliIblrprkuYnkuoblhajlsYDphY3nva7pgInpobnvvIzmlbTkuKp5dW0g6YWN572u5paH5Lu25bqU6K+l5Y+q5pyJ5LiA5LiqbWFpbuOAguW4uOS9jeS6ji9ldGMveXVtLmNvbmYg5Lit44CCCgpyZXBvc2l0b3J5IOmDqOWIhuWumuS5ieS6huavj+S4qua6kC/mnI3liqHlmajnmoTlhbfkvZPphY3nva7vvIzlj6/ku6XmnInkuIDliLDlpJrkuKrjgILluLjkvY3kuo4vZXRjL3l1bS5yZXBvLmQg55uu5b2V5LiL55qE5ZCE5paH5Lu25Lit44CCCgojIyDlm5vjgIHphY3nva7mnKzlnLB5dW3mupAKCjHjgIHmjILovb3ns7vnu5/lronoo4XlhYnnm5gKCmAjIG1vdW50IC9kZXYvY2Ryb20gL21udC9jZHJvbS9gCgoy44CB6YWN572u5pys5ZyweXVt5rqQCgpgIyBjZCAvZXRjL3l1bS5yZXBvcy5kL2AKCmAjIGxzYAoK5Lya55yL5Yiw5Zub5LiqcmVwbyDmlofku7YKCiMjIHl1bS5jb25mIAp5dW0uY29uZiDmlofku7bkuIDoiKzkvY3kuo4vZXRj55uu5b2V5LiL77yM5LiA6Iis5YW25Lit5Y+q5YyF5ZCrbWFpbumDqOWIhueahOmFjee9rumAiemhueOAggoK5L2/55So5Lul5LiL5ZG95Luk5p+l55yLeXVtLmNvbmYgYCMgY2F0IC9ldGMveXVtLmNvbmZgCgpgYGAKW21haW5dCmNhY2hlZGlyPS92YXIvY2FjaGUveXVtCuOAgOOAgC8veXVtIOe8k+WtmOeahOebruW9le+8jHl1bSDlnKjmraTlrZjlgqjkuIvovb3nmoRycG0g5YyF5ZKM5pWw5o2u5bqT77yM6buY6K6k6K6+572u5Li6L3Zhci9jYWNoZS95dW0Ka2VlcGNhY2hlPTAK44CA44CALy/lronoo4XlrozmiJDlkI7mmK/lkKbkv53nlZnova/ku7bljIXvvIww5Li65LiN5L+d55WZ77yI6buY6K6k5Li6MO+8ie+8jDHkuLrkv53nlZkKZGVidWdsZXZlbD0yCuOAgOOAgC8vRGVidWcg5L+h5oGv6L6T5Ye6562J57qn77yM6IyD5Zu05Li6MC0xMO+8jOe8uuecgeS4ujIKbG9nZmlsZT0vdmFyL2xvZy95dW0ubG9nCuOAgOOAgC8veXVtIOaXpeW/l+aWh+S7tuS9jee9ruOAgueUqOaIt+WPr+S7peWIsC92YXIvbG9nL3l1bS5sb2cg5paH5Lu25Y675p+l6K+i6L+H5Y675omA5YGa55qE5pu05paw44CCCnBrZ3BvbGljeT1uZXdlc3QK44CA44CALy/ljIXnmoTnrZbnlaXjgILkuIDlhbHmnInkuKTkuKrpgInpobnvvIxuZXdlc3Qg5ZKMbGFzdO+8jOi/meS4quS9nOeUqOaYr+WmguaenOS9oOiuvue9ruS6huWkmuS4qnJlcG9zaXRvcnnvvIzogIzlkIzkuIDova/ku7blnKjkuI3lkIznmoRyZXBvc2l0b3J5IOS4reWQjOaXtuWtmOWcqO+8jHl1bSDlupTor6Xlronoo4Xlk6rkuIDkuKrvvIzlpoLmnpzmmK9uZXdlc3TvvIzliJl5dW0g5Lya5a6J6KOF5pyA5paw55qE6YKj5Liq54mI5pys44CC5aaC5p6c5pivbGFzdO+8jOWImXl1bSDkvJrlsIbmnI3liqHlmahpZCDku6XlrZfmr43ooajmjpLluo/vvIzlubbpgInmi6nmnIDlkI7nmoTpgqPkuKrmnI3liqHlmajkuIrnmoTova/ku7blronoo4XjgILkuIDoiKzpg73mmK/pgIluZXdlc3TjgIIKZGlzdHJvdmVycGtnPXJlZGhhdC1yZWxlYXNlCuOAgOOAgC8v5oyH5a6a5LiA5Liq6L2v5Lu25YyF77yMeXVtIOS8muagueaNrui/meS4quWMheWIpOaWreS9oOeahOWPkeihjOeJiOacrO+8jOm7mOiupOaYr3JlZGhhdC1yZWxlYXNl77yM5Lmf5Y+v5Lul5piv5a6J6KOF55qE5Lu75L2V6ZKI5a+56Ieq5bex5Y+R6KGM54mI55qEcnBtIOWMheOAggp0b2xlcmFudD0xCuOAgOOAgC8v5pyJMeWSjDDkuKTkuKrpgInpobnvvIzooajnpLp5dW0g5piv5ZCm5a655b+N5ZG95Luk6KGM5Y+R55Sf5LiO6L2v5Lu25YyF5pyJ5YWz55qE6ZSZ6K+v77yM5q+U5aaC5L2g6KaB5a6J6KOFMSwyLDPkuInkuKrljIXvvIzogIzlhbbkuK0z5q2k5YmN5bey57uP5a6J6KOF5LqG77yM5aaC5p6c5L2g6K6+5Li6MSzliJl5dW0g5LiN5Lya5Ye6546w6ZSZ6K+v5L+h5oGv44CC6buY6K6k5pivMOOAggpleGFjdGFyY2g9MQrjgIDjgIAvL+aciTHlkoww5Lik5Liq6YCJ6aG577yM6K6+572u5Li6Me+8jOWImXl1bSDlj6rkvJrlronoo4Xlkozns7vnu5/mnrbmnoTljLnphY3nmoTova/ku7bljIXvvIzkvovlpoLvvIx5dW0g5LiN5Lya5bCGaTY4NueahOi9r+S7tuWMheWuieijheWcqOmAguWQiGkzODbnmoTns7vnu5/kuK3jgILpu5jorqTkuLox44CCCnJldHJpZXM9NgrjgIDjgIAvL+e9kee7nOi/nuaOpeWPkeeUn+mUmeivr+WQjueahOmHjeivleasoeaVsO+8jOWmguaenOiuvuS4ujDvvIzliJnkvJrml6DpmZDph43or5XjgILpu5jorqTlgLzkuLo2LgpvYnNvbGV0ZXM9MQrjgIDjgIAvL+i/meaYr+S4gOS4qnVwZGF0ZSDnmoTlj4LmlbDvvIzlhbfkvZPor7flj4LpmIV5dW0oOCnvvIznroDljZXnmoTor7TlsLHmmK/nm7jlvZPkuo51cGdyYWRl77yM5YWB6K645pu05paw6ZmI5pen55qEUlBN5YyF44CCCnBsdWdpbnM9MQrjgIDjgIAvL+aYr+WQpuWQr+eUqOaPkuS7tu+8jOm7mOiupDHkuLrlhYHorrjvvIww6KGo56S65LiN5YWB6K6444CC5oiR5Lus5LiA6Iis5Lya55SoeXVtLWZhc3Rlc3RtaXJyb3Lov5nkuKrmj5Lku7bjgIIKYnVndHJhY2tlcl91cmw9aHR0cDovL2J1Z3MuY2VudG9zLm9yZy9zZXRfcHJvamVjdC5waHA/cHJvamVjdF9pZD0xNiZyZWY9aHR0cDovL2J1Z3MuY2VudG9zLm9yZy9idWdfcmVwb3J0X3BhZ2UucGhwP2NhdGVnb3J5PXl1bQoKIyBOb3RlOiB5dW0tUkhOLXBsdWdpbiBkb2Vzbid0IGhvbm9yIHRoaXMuCm1ldGFkYXRhX2V4cGlyZT0xaAoKaW5zdGFsbG9ubHlfbGltaXQgPSA1CgojIFBVVCBZT1VSIFJFUE9TIEhFUkUgT1IgSU4gc2VwYXJhdGUgZmlsZXMgbmFtZWQgZmlsZS5yZXBvCiMgaW4gL2V0Yy95dW0ucmVwb3MuZApgYGAKCumZpOS6huS4iui/sOS5i+Wklu+8jOi/mOacieS4gOS6m+WPr+S7pea3u+WKoOeahOmAiemhue+8jOWmgu+8mgoK44CA44CAZXhjbHVkZT1zZWxpbnV4KuOAgOOAgC8vIOaOkumZpOafkOS6m+i9r+S7tuWcqOWNh+e6p+WQjeWNleS5i+Wklu+8jOWPr+S7peeUqOmAmumFjeespu+8jOWIl+ihqOS4reWQhOS4qumhueebruimgeeUqOepuuagvOmalOW8gO+8jOi/meS4quWvueS6juWuieijheS6huivuOWmgue+juWMluWMhe+8jOS4reaWh+ihpeS4geeahOaci+WPi+eJueWIq+acieeUqOOAggrjgIDjgIBncGdjaGVjaz0x44CA44CALy8g5pyJMeWSjDDkuKTkuKrpgInmi6nvvIzliIbliKvku6PooajmmK/lkKbmmK/lkKbov5vooYxncGcoR05VIFByaXZhdGUgR3VhcmQpIOagoemqjO+8jOS7peehruWumnJwbSDljIXnmoTmnaXmupDmmK/mnInmlYjlkozlronlhajnmoTjgILov5nkuKrpgInpobnlpoLmnpzorr7nva7lnKhbbWFpbl3pg6jliIbvvIzliJnlr7nmr4/kuKpyZXBvc2l0b3J5IOmDveacieaViOOAgum7mOiupOWAvOS4ujDjgIIK