研究目的

分析一下新能源电动车公司招聘需求

  • 需要的人才类型
  • 按职能类别(整体上的智联)-> 类型(开发、咨询、设计……)
    • 开发类都有啥……
    • 要求的年限、学历、专业、技能(智联)
    • 有工厂的和没有工厂的肯定是不一样的(比亚迪有工厂,需求的岗位就会有一些工厂开发类的)
  • 可以根据业务流程(和汽车差不多,可能就是研发方向需求的岗位不一样,车内智能化系统)

读入数据

[1] "zh_TW.UTF-8/zh_TW.UTF-8/zh_TW.UTF-8/C/zh_TW.UTF-8/en_US.UTF-8"

简单查看一下蔚来汽车校招需求最多的岗位: 新能源汽车销售、品质工程师

'data.frame':   2292 obs. of  2 variables:
 $ Var1: Factor w/ 2292 levels ".NET开发专家 (MJ008821)",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Freq: int  1 1 1 1 1 1 1 1 1 1 ...

蔚来汽车的分析

  • 部门(组织架构)
    • 需要什么人
      • 需要什么技能
        • 需要大学的课

部门(组织架构)

  • 部门
    • 职能方向
    • 每个职能方向又有什么职位名称

这边,用智联的大表职位名称太过琐碎,不太好通过名称来对职能进行分类,用蔚来的校招的“职能支持方向”会比较好分类 👇下面主要通过职能支持方向来分类看一下


Attaching package: ‘dplyr’

The following objects are masked from ‘package:plyr’:

    arrange, count, desc, failwith, id, mutate, rename, summarise, summarize

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
'data.frame':   754 obs. of  12 variables:
 $ 蔚来官网校招.id          : num  1 2 3 4 5 6 7 8 9 10 ...
 $ 蔚来官网校招.jid         : Factor w/ 754 levels "009f063f-f39b-474c-91c8-54cfaf6d4a48",..: 276 575 142 722 367 236 453 237 165 681 ...
 $ 蔚来官网校招.职位名称    : Factor w/ 560 levels ".Net开发工程师",..: 105 534 448 207 309 224 33 78 68 37 ...
 $ 蔚来官网校招.类型        : Factor w/ 2 levels "全职","实习": 1 1 1 1 1 1 1 1 1 1 ...
 $ 蔚来官网校招.学历        : Factor w/ 4 levels "本科","博士",..: 1 1 1 1 1 1 1 2 2 2 ...
 $ 蔚来官网校招.部门        : Factor w/ 5 levels "产品设计与研发",..: 1 3 1 1 1 1 1 1 1 1 ...
 $ 蔚来官网校招.职能支持方向: Factor w/ 16 levels "产品项目方向",..: 8 13 12 12 12 6 8 8 8 8 ...
 $ 蔚来官网校招.地址        : Factor w/ 2 levels "圣何塞","蔚来11": NA NA NA NA NA NA NA NA NA NA ...
 $ 蔚来官网校招.数量        : num  0 0 0 0 0 0 0 0 0 0 ...
 $ 蔚来官网校招.城市id      : num  154891 150843 150843 150844 150844 ...
 $ 蔚来官网校招.发布时间    : POSIXct, format: "2021-10-22 13:48:07" "2021-09-30 20:49:00" "2021-09-24 23:14:14" "2021-09-24 23:12:35" ...
 $ 蔚来官网校招.职位描述    : Factor w/ 337 levels "岗位职责: 1. 开发并实现量产级别的行为规划和运动规划算法2. 结合语义地图和感知结果实时预测周边参与者行为(车辆,"| __truncated__,..: 1 325 136 221 224 273 3 60 51 74 ...

可以看到一个比较整体的组织架构:5个部门下面包含16个职能方向

  • 5个部门:产品设计与研发、工业化、管理与支持、区域公司、用户与服务
  • 16个职能方向:产品项目方向、交付运营方向 、空间运营方向、其它、三电新能源方向、设计方向、售后服务(服务代表)方向
    数字技术方向、蔚来产品专家方向、蔚来顾问方向、用户服务方向、整车研发制造方向、职能支持方向、质量管理方向、智能硬件方向、自动驾驶方向

产品设计与研发         工业化     管理与支持       区域公司     用户与服务 
           200             69              1            397             87 

            产品项目方向             交付运营方向             空间运营方向                     其它           三电新能源方向 
                       1                       66                       74                       32                       37 
                设计方向 售后服务(服务代表)方向             数字技术方向         蔚来产品专家方向             蔚来顾问方向 
                       8                       33                       82                       95                      127 
            用户服务方向         整车研发制造方向             职能支持方向             质量管理方向             智能硬件方向 
                      65                       78                        8                       14                        6 
            自动驾驶方向 
                      28 

部门 - 蔚来汽车各部门的招聘数量 - 招聘需求最大的部门是:区域公司、产品设计与研发

比较直观的可以看出各个职能包含在哪些部门下

比较细致的看各个部门中各个职能的招聘需求

职能方向

职能方向:未蔚来顾问方向

分析: - 需要什么人(包函哪些岗位) - 需要什么技能 - 需要大学的课

subset1:建立一个职能、岗位名称、数量

`summarise()` has grouped output by '蔚来官网校招.职位名称'. You can override using the `.groups` argument.

各个职能方向所所包含的职位

[1] "蔚来顾问-威海"     "蔚来顾问-威海"     "蔚来顾问-天津滨海" "蔚来顾问-天津"     "蔚来顾问-合肥"     "蔚来顾问-成都"    

职位名称:[1] “蔚来顾问-威海” “蔚来顾问-威海” “蔚来顾问-天津滨海” “蔚来顾问-天津” “蔚来顾问-合肥” “蔚来顾问-成都”

[1] "蔚来产品专家-合肥" "蔚来产品专家-成都" "蔚来产品专家-北京" "蔚来产品专家-常州" "蔚来产品专家-慈溪" "蔚来产品专家-达州"
[1] "规划算法工程师"               "车载高性能计算平台开发工程师" "高性能计算平台研究员"         "电源网络研究员"              
[5] "车载网络研究员"               "BI工程师"                    
[1] "研发流程体系工程师"     "内饰工程师"             "外饰工程师"             "智能整车控制软件工程师"
[5] "EOL工程师"              "机械工程开发工程师"    
[1] "空间运营专员-长沙" "空间运营专员-南通" "空间运营专员-合肥" "空间运营专员-东莞" "空间运营专员-西安" "空间运营专员-北京"
[1] "交付运营专员-青岛" "交付运营专员-青岛" "交付运营专员-南通" "交付运营专员-昆明" "交付运营专员-福州" "交付运营专员-嘉兴"
[1] "精益流程专员"           "数据分析工程师"         "用户发展专员-杭州/绍兴" "市场助理 - NIO Life"   
[5] "公共关系助理"           "企业传播培训生"        
[1] "电解液开发工程师"                         "电源产品安全工程师"                      
[3] "硬件开发(电力电子)工程师-博士-上海"     "硬件开发(电力电子)工程师-上海"         
[5] "硬件开发(信号电子)工程师-电驱系统-上海" "功率模块设计工程师"                      

需要什么人

解决需要什么人:职能方向和学历关系

                          
                           本科 博士 大专 硕士
  产品项目方向                1    0    0    0
  交付运营方向               66    0    0    0
  空间运营方向               74    0    0    0
  其它                       28    0    0    4
  三电新能源方向              1   11    0   25
  设计方向                    7    0    0    1
  售后服务(服务代表)方向    1    0   32    0
  数字技术方向               46    9    0   27
  蔚来产品专家方向           95    0    0    0
  蔚来顾问方向              127    0    0    0
  用户服务方向               63    0    0    2
  整车研发制造方向           40    7    0   31
  职能支持方向                7    0    0    1
  质量管理方向                6    1    0    7
  智能硬件方向                0    0    0    6
  自动驾驶方向               10    1    0   17

需要什么技能

 chr " 1. 开发并实现量产级别的行为规划和运动规划算法2. 结合语义地图和感知结果实时预测周边参与者行为(车辆,行人等);"| __truncated__
          蔚来官网校招.id          蔚来官网校招.jid     蔚来官网校招.职位名称         蔚来官网校招.类型 
                0.0000000                 0.0000000                 0.0000000                 0.0000000 
        蔚来官网校招.学历         蔚来官网校招.部门 蔚来官网校招.职能支持方向         蔚来官网校招.地址 
                0.0000000                 0.0000000                 0.0000000                 0.9946950 
        蔚来官网校招.数量       蔚来官网校招.城市id     蔚来官网校招.发布时间     蔚来官网校招.职位描述 
                0.0000000                 0.0000000                 0.0000000                 0.0000000 
                 岗位职责                  工作内容                  任职要求                    加分项 
                0.9933687                 0.5198939                 0.2625995                 0.9933687 
    蔚来官网校招.职位名称         蔚来官网校招.学历         蔚来官网校招.部门 蔚来官网校招.职能支持方向 
                        0                         0                         0                         0 
                 任职要求 
                        0 
`summarise()` has grouped output by '蔚来官网校招.职能支持方向'. You can override using the `.groups` argument.

可以用文字云大概看一下各个“职能支持方向”需要的技能方向 后续需要跟细致的筛选,各个岗位的技能需求

👀岗位的细致技能需求分析

智联招聘 - 新能源电动车整体分析

  • 整体行业
    • 哪些行业在招新能源汽车相关的岗位
    • 薪资的整体水平以及分布
  • 从车企分析(几个头部车企)
    • 各个岗位的招聘人数 - 招聘比例
    • 会不会不同的企业招聘的岗位方向会不太相同
  • 从岗位分析
    • 各个岗位的薪资情况
    • 各个岗位工作年限要求
    • 各个岗位的学历要求
  • 根据上市情况来看招聘的方向

行业分析

  • 行业地区
'data.frame':   2720 obs. of  16 variables:
 $ 智联招聘.职位名称: Factor w/ 2292 levels ".NET开发专家 (MJ008821)",..: 170 1693 380 441 340 340 1846 2285 722 721 ...
 $ 智联招聘.公司名称: Factor w/ 199 levels "安徽爱瑞特新能源专用汽车股份有限公司",..: 55 50 165 44 185 185 55 55 44 44 ...
 $ 智联招聘.公司规模: Factor w/ 7 levels "100-299人","1000-9999人",..: 3 4 2 2 2 2 3 3 2 2 ...
 $ 智联招聘.学历    : Factor w/ 9 levels "本科","博士",..: 1 4 4 1 1 1 1 1 1 1 ...
 $ 智联招聘.行业    : Factor w/ 39 levels "保险业","电力/水利/热力/燃气",..: 23 23 23 23 23 23 23 23 23 23 ...
 $ 智联招聘.公司性质: Factor w/ 10 levels "股份制企业","国企",..: 4 4 1 2 2 2 4 4 2 2 ...
 $ 智联招聘.发布时间: Factor w/ 2175 levels "2020-11-13 16:42:33",..: 1400 571 364 1 442 442 1400 1400 1 1 ...
 $ 智联招聘.薪资范围: Factor w/ 213 levels "0-0","0-1000",..: 61 69 183 11 190 190 11 11 11 11 ...
 $ 智联招聘.工作城市: Factor w/ 4 levels "北京","广州",..: 3 1 1 1 3 4 3 4 1 1 ...
 $ 智联招聘.工作类型: Factor w/ 3 levels "兼职/临时","全职",..: 2 2 2 2 2 2 2 2 2 2 ...
 $ 智联招聘.工作年限: Factor w/ 7 levels "1-3年","10年以上",..: 4 1 4 5 4 4 1 4 5 4 ...
 $ 智联招聘.职位描述: Factor w/ 2537 levels "\"1.根据公司提供的线索资源,电话/微信联系客户,挖掘客户需求,邀请客户到店租车、买车;<br>2.负责进店客户接待咨询"| __truncated__,..: 729 826 2055 790 730 730 1629 788 789 716 ...
 $ 智联招聘.城市    : Factor w/ 29 levels "北京","成都",..: 19 1 5 1 14 14 19 19 1 1 ...
 $ 智联招聘.融资情况: Factor w/ 8 levels "不需要融资","天使轮",..: 4 NA NA 4 NA NA 4 4 4 4 ...
 $ 智联招聘.招聘人数: Factor w/ 36 levels "1","10","100",..: 1 24 1 1 12 12 12 12 1 1 ...
 $ 智联招聘.公司地址: Factor w/ 758 levels "-","15号线","21号线",..: 580 612 172 100 272 272 580 580 98 98 ...
Selecting by num

薪资的整体水平

从车企分析(几个头部车企)

找出发布招聘需求最多的top10公司

  • “比亚迪”,“理想汽车”,“小鹏汽车”,“北京汽车股份有限公司”,“云度新能源汽车有限公司”,“NIO 蔚来 (上海)”,“深圳腾悦新能源汽车销售服务有限公司”,“北京新能源汽车股份有限公司”,“威马汽车科技集团”,“深圳市迪滴新能源汽车科技有限公司”

  • 而“比亚迪”,“理想汽车”,“小鹏汽车”这三家公司的招聘需求要远高于其他的公司

Selecting by Freq

`summarise()` has grouped output by '智联招聘.公司名称'. You can override using the `.groups` argument.

查看各大公司各个岗位需求人数

  • 是各个部门比较平均的需要人员,还是某些岗位有大量的需求?

下图是各个公司的各个岗位需求人数的分布箱形图: - 大部分岗位的招聘人数需求都在20一下子 - 但可以看出“理想汽车”,“小鹏汽车”,“比亚迪”右侧有一些离散的点,说明其在一些岗位上有特别大量的招聘需求

`summarise()` has grouped output by '智联招聘.公司名称'. You can override using the `.groups` argument.

整体的学历要求

'data.frame':   2720 obs. of  16 variables:
 $ 智联招聘.职位名称: chr  "产品经理" "新能源汽车销售" "电器工程师" "服务管理部-备件技术管理岗" ...
 $ 智联招聘.公司名称: chr  "比亚迪" "北京中广信达汽车销售服务有限公司" "松果新能源汽车有限公司" "北京新能源汽车股份有限公司" ...
 $ 智联招聘.公司规模: chr  "10000人以上" "20-99人" "1000-9999人" "1000-9999人" ...
 $ 智联招聘.学历    : chr  "本科" "大专" "大专" "本科" ...
 $ 智联招聘.行业    : chr  "汽车制造" "汽车制造" "汽车制造" "汽车制造" ...
 $ 智联招聘.公司性质: chr  "民营" "民营" "股份制企业" "国企" ...
 $ 智联招聘.发布时间: chr  "2021-10-15 18:26:05" "2021-10-06 11:16:37" "2021-09-28 17:03:33" "2020-11-13 16:42:33" ...
 $ 智联招聘.薪资范围: chr  "15001-20000" "15001-30000" "7001-12000" "10001-15000" ...
 $ 智联招聘.工作城市: chr  "上海" "北京" "北京" "北京" ...
 $ 智联招聘.工作类型: chr  "全职" "全职" "全职" "全职" ...
 $ 智联招聘.工作年限: chr  "3-5年" "1-3年" "3-5年" "5-10年" ...
 $ 智联招聘.职位描述: chr  "<p style=\"margin-top: 0px; margin-bottom: 0px; line-height: 22px; color: rgb(102, 102, 102); font-family: Taho"| __truncated__ "<p>1、有效执行新能源汽车销售策略:</p><p>2、开发潜在目标客户,按时完成汽车销量指标;</p><p>3、按规范流程接待客"| __truncated__ "岗位职责:<div>  1.按照总布置要求,对整车电器原理进行设计工作,满足相关功能,同时进行高压或低压线束设计工作;  "| __truncated__ "<p><span style=\"font-family: 宋体\">工作职责:</span></p><p style=\"margin-top: 5px; margin-bottom: 5px;\"><fo"| __truncated__ ...
 $ 智联招聘.城市    : chr  "深圳" "北京" "德州" "北京" ...
 $ 智联招聘.融资情况: chr  "已上市" NA NA "已上市" ...
 $ 智联招聘.招聘人数: chr  "1" "5" "1" "1" ...
 $ 智联招聘.公司地址: chr  "深圳市坪山新区比亚迪路3009号" "天竺镇府前一街3号A 北京中广信达汽车销售服务有限公司" "德州(禹城)国家高新区" "北京是亦庄经济技术开发区东环中路5号" ...
'data.frame':   2719 obs. of  16 variables:
 $ 智联招聘.职位名称: chr  "产品经理" "新能源汽车销售" "电器工程师" "服务管理部-备件技术管理岗" ...
 $ 智联招聘.公司名称: chr  "比亚迪" "北京中广信达汽车销售服务有限公司" "松果新能源汽车有限公司" "北京新能源汽车股份有限公司" ...
 $ 智联招聘.公司规模: chr  "10000人以上" "20-99人" "1000-9999人" "1000-9999人" ...
 $ 智联招聘.学历    : chr  "本科" "大专" "大专" "本科" ...
 $ 智联招聘.行业    : chr  "汽车制造" "汽车制造" "汽车制造" "汽车制造" ...
 $ 智联招聘.公司性质: chr  "民营" "民营" "股份制企业" "国企" ...
 $ 智联招聘.发布时间: chr  "2021-10-15 18:26:05" "2021-10-06 11:16:37" "2021-09-28 17:03:33" "2020-11-13 16:42:33" ...
 $ 智联招聘.薪资范围: chr  "15001-20000" "15001-30000" "7001-12000" "10001-15000" ...
 $ 智联招聘.工作城市: chr  "上海" "北京" "北京" "北京" ...
 $ 智联招聘.工作类型: chr  "全职" "全职" "全职" "全职" ...
 $ 智联招聘.工作年限: chr  "3-5年" "1-3年" "3-5年" "5-10年" ...
 $ 智联招聘.职位描述: chr  "<p style=\"margin-top: 0px; margin-bottom: 0px; line-height: 22px; color: rgb(102, 102, 102); font-family: Taho"| __truncated__ "<p>1、有效执行新能源汽车销售策略:</p><p>2、开发潜在目标客户,按时完成汽车销量指标;</p><p>3、按规范流程接待客"| __truncated__ "岗位职责:<div>  1.按照总布置要求,对整车电器原理进行设计工作,满足相关功能,同时进行高压或低压线束设计工作;  "| __truncated__ "<p><span style=\"font-family: 宋体\">工作职责:</span></p><p style=\"margin-top: 5px; margin-bottom: 5px;\"><fo"| __truncated__ ...
 $ 智联招聘.城市    : chr  "深圳" "北京" "德州" "北京" ...
 $ 智联招聘.融资情况: chr  "已上市" NA NA "已上市" ...
 $ 智联招聘.招聘人数: chr  "1" "5" "1" "1" ...
 $ 智联招聘.公司地址: chr  "深圳市坪山新区比亚迪路3009号" "天竺镇府前一街3号A 北京中广信达汽车销售服务有限公司" "德州(禹城)国家高新区" "北京是亦庄经济技术开发区东环中路5号" ...

      本科       博士 初中及以下       大专       高中       硕士   学历不限  中专/中技 
      1606          3         23        542         53        116        243        133 

各家公司的工资的中位数

Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     

Attaching package: ‘ggpubr’

The following object is masked from ‘package:plyr’:

    mutate

The following objects are masked from ‘package:ggthemr’:

    rotate_x_text, rotate_y_text
font family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font databasefont family 'Heiti TC Light' not found in PostScript font database

重点分析:“理想汽车”,“小鹏汽车”,“比亚迪”

可以看到三家公司的招聘人数分布,可以重点看一下50人以上的岗位需求有哪些

`summarise()` has grouped output by '智联招聘.公司名称'. You can override using the `.groups` argument.

`summarise()` has grouped output by '智联招聘.公司名称'. You can override using the `.groups` argument.
grouped_df [1,824 × 3] (S3: grouped_df/tbl_df/tbl/data.frame)
 $ 智联招聘.公司名称: Factor w/ 199 levels "安徽爱瑞特新能源专用汽车股份有限公司",..: 30 30 30 30 30 30 30 30 30 30 ...
 $ 智联招聘.职位名称: Factor w/ 2292 levels ".NET开发专家 (MJ008821)",..: 2 20 25 46 47 115 157 160 162 173 ...
 $ real             : num [1:1824] 1 1 1 8 1 1 24 29 24 21 ...
 - attr(*, "groups")= tibble [10 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ 智联招聘.公司名称: Factor w/ 199 levels "安徽爱瑞特新能源专用汽车股份有限公司",..: 30 44 55 114 153 159 173 176 185 199
  ..$ .rows            : list<int> [1:10] 
  .. ..$ : int [1:66] 1 2 3 4 5 6 7 8 9 10 ...
  .. ..$ : int [1:29] 67 68 69 70 71 72 73 74 75 76 ...
  .. ..$ : int [1:871] 96 97 98 99 100 101 102 103 104 105 ...
  .. ..$ : int [1:336] 967 968 969 970 971 972 973 974 975 976 ...
  .. ..$ : int [1:26] 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 ...
  .. ..$ : int [1:41] 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 ...
  .. ..$ : int [1:29] 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 ...
  .. ..$ : int [1:325] 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 ...
  .. ..$ : int [1:54] 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 ...
  .. ..$ : int [1:47] 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 ...
  .. ..@ ptype: int(0) 
  ..- attr(*, ".drop")= logi TRUE
'data.frame':   2134 obs. of  4 variables:
 $ 智联招聘.公司名称: Factor w/ 199 levels "安徽爱瑞特新能源专用汽车股份有限公司",..: 30 30 30 30 30 30 30 30 30 30 ...
 $ 智联招聘.职位名称: Factor w/ 2292 levels ".NET开发专家 (MJ008821)",..: 2 20 25 46 47 115 157 160 162 173 ...
 $ real             : num  1 1 1 8 1 1 24 29 24 21 ...
 $ 智联招聘.学历    : Factor w/ 9 levels "本科","博士",..: 4 1 9 1 4 1 9 1 1 1 ...

比亚迪

需求最多的还是工程师类的岗位 - “品质工程师”,“电气工程师”,“软件工程师”,“软件测试工程师”,“硬件工程师”,“测试工程师”,“高级硬件工程师” 技术类以外的主要岗位是: - “大客户经理”、“项目经理QM”

看一下需要的技能

理想汽车

  • 招聘方向和比亚迪很不一样
  • 招聘需求最大的岗位比较偏销售和产品
  • 其中“校园招聘专员”需求比较大可能是为了后续秋招、校招做保障

小鹏汽车

  • 可以看出小鹏汽车

# 小鹏汽车自动驾驶岗
xp_02 <- zl_data %>%
  filter(智联招聘.公司名称 == "小鹏汽车" & 智联招聘.职位名称 %in% c("自动驾驶-路径规划和控制算法开发高级工程师/专家",
                                                "自动驾驶-路径规划算法开发专家/高级专家",
                                                "自动驾驶-感知算法专家/高级专家(深度学习方向)"))%>%
  select(智联招聘.职位名称, 智联招聘.职位描述)%>%
  mutate(智联招聘.职位描述=as.character(智联招聘.职位描述))
xp_02

# 断词
jobtoken <- xp_01 %>% unnest_tokens(word, 智联招聘.职位描述, token=customized_tokenizer)

# 数据的清理
# 过滤特殊字元
data_select <- jobtoken %>% 
  filter(!grepl('[[:punct:]]',word)) %>% # 去标点符号
  filter(!grepl("['^0-9']",word)) %>% # 去数字
  filter(nchar(.$word)>1) 
data_select
# 算每个 职位名称 的词频
# word_count:artDate,word,count
word_count <- data_select %>%
  select(智联招聘.职位名称, word) %>%
  group_by(智联招聘.职位名称,word) %>%
  summarise(count=n()) %>%  
  filter(count>3) %>%  # 過濾出現太少次的字
  arrange(desc(count))

# 画出文字云
word_count %>%
  filter(!(word %in% c("具备","能力","优先","熟悉","要求","任职","经验",
                       "工作","负责","具有","相关","了解","div","br"))) %>%
  # filter(蔚来官网校招.职能支持方向 == "数字技术方向") %>% 
  select(word,count) %>% 
  group_by(word) %>% 
  summarise(count = sum(count)) %>%
  arrange(desc(count)) %>%
  filter(count>5) %>%   # 过滤掉出现太少的字
  wordcloud2(color='random-dark')
LS0tCnRpdGxlOiAi5paw6IO95rqQ5rG96L2mIgphdXRob3I6ICJza3llIHllIgpkYXRlOiAiMTAvMjUvMjAyMSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGhpZ2hsaWdodDogcHlnbWVudHMKICAgIHRoZW1lOiBmbGF0bHkKICAgIGNzczogc3R5bGUuY3NzCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBkZl9wcmludDogcGFnZWQKLS0tCiMjIOeglOeptuebrueahAoK5YiG5p6Q5LiA5LiL5paw6IO95rqQ55S15Yqo6L2m5YWs5Y+45oub6IGY6ZyA5rGCCgotIOmcgOimgeeahOS6uuaJjeexu+WeiwotIOaMieiBjOiDveexu+WIq++8iOaVtOS9k+S4iueahOaZuuiBlO+8iS0+IOexu+Wei++8iOW8gOWPkeOAgeWSqOivouOAgeiuvuiuoeKApuKApu+8iSAKICAtIOW8gOWPkeexu+mDveacieWVpeKApuKApgogIC0g6KaB5rGC55qE5bm06ZmQ44CB5a2m5Y6G44CB5LiT5Lia44CB5oqA6IO977yI5pm66IGU77yJCiAgLSDmnInlt6XljoLnmoTlkozmsqHmnInlt6XljoLnmoTogq/lrprmmK/kuI3kuIDmoLfnmoTvvIjmr5Tkuprov6rmnInlt6XljoLvvIzpnIDmsYLnmoTlspfkvY3lsLHkvJrmnInkuIDkupvlt6XljoLlvIDlj5HnsbvnmoTvvIkKLSDlj6/ku6XmoLnmja7kuJrliqHmtYHnqIvvvIjlkozmsb3ovablt67kuI3lpJrvvIzlj6/og73lsLHmmK/noJTlj5HmlrnlkJHpnIDmsYLnmoTlspfkvY3kuI3kuIDmoLfvvIzovablhoXmmbrog73ljJbns7vnu5/vvIkKCgojIyDor7vlhaXmlbDmja4KCmBgYHtyfQpTeXMuc2V0bG9jYWxlKGNhdGVnb3J5ID0gIkxDX0FMTCIsIGxvY2FsZSA9ICJ6aF9UVy5VVEYtOCIpICMg6YG/5YWN5Lit5paH5Lmx56CBCgojIOWcqOacgOW8gOWni+iuvue9ruS4gOS4i2dncGxvdOeahOS4u+mimOminOiJsiAtLS0tLS0tLS0tLS0tLS0tLS0gIyMjIyMjIyMjIwpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoZ2d0aGVtcikKZ2d0aGVtcignZHVzdCcpICMg6K6+572u5YW25Lit5LiA56eN5qC35byPCmBgYAoKYGBge3J9CiMg6K+75Y+W5paH5Lu2LCDkuIDkuKpFeGNlbOS4reWkmuS4qnNoZWV0CnNoZWV0cyA8LSByZWFkeGw6OmV4Y2VsX3NoZWV0cygi5paw6IO95rqQ5rG96L2m5oub6IGYLnhsc3giKSAKeCA8LSBsYXBwbHkoc2hlZXRzLCBmdW5jdGlvbihYKSByZWFkeGw6OnJlYWRfZXhjZWwoIuaWsOiDvea6kOaxvei9puaLm+iBmC54bHN4Iiwgc2hlZXQgPSBYKSkgCm5hbWVzKHgpIDwtIHNoZWV0cyAKYGBgCgpgYGB7cn0KbmlvX3NyIDwtIGRhdGEuZnJhbWUoeFsxXSkgIyDolJrmnaXlrpjnvZHnpL7mi5sKbmlvX3VyIDwtIGRhdGEuZnJhbWUoeFsyXSkgIyDolJrmnaXlrpjnvZHmoKHmi5sKbGl4aWFuZyA8LSBkYXRhLmZyYW1lKHhbM10pICMg55CG5oOz5oub6IGYCnhpYW9wZW5nX3NyIDwtIGRhdGEuZnJhbWUoeFs0XSkgIyDlsI/puY/npL7mi5sKeGlhb3BlbmdfdXIgPC0gZGF0YS5mcmFtZSh4WzVdKSAjIOWwj+m5j+agoeaLmwp3bV91ciA8LSBkYXRhLmZyYW1lKHhbNl0pICMg5aiB6ams5qCh5oubCnpoaWxpYW4gPC0gZGF0YS5mcmFtZSh4WzddKSAjIOaZuuiBlOaLm+iBmApgYGAgCgpgYGB7cn0KaGVhZCh6aGlsaWFuLDEwKQpgYGAKCueugOWNleafpeeci+S4gOS4i+iUmuadpeaxvei9puagoeaLm+mcgOaxguacgOWkmueahOWyl+S9je+8miDmlrDog73mupDmsb3ovabplIDllK7jgIHlk4HotKjlt6XnqIvluIgKCmBgYHtyfQojIOWwhuWBmuaJgOiBjOS9jeeahOenjeexu+aMieWQjeensOaUvuWFpeS4gOS4qmRhdGFmcmFtZeS4rQp0aXR0bGVfZGYgPC0gZGF0YS5mcmFtZSh0YWJsZSh6aGlsaWFuJOaZuuiBlOaLm+iBmC7ogYzkvY3lkI3np7ApKQpzdHIodGl0dGxlX2RmKQoKIyDmjInpmY3luo/mjpLliJfvvIznnIvkuIDkuIvpnIDmsYLmnIDlpJrnmoQKbGlicmFyeShwbHlyKQphcnJhbmdlKHRpdHRsZV9kZixkZXNjKEZyZXEpKSAKYGBgCgojIyDolJrmnaXmsb3ovabnmoTliIbmnpAKCi0g6YOo6Zeo77yI57uE57uH5p625p6E77yJCiAgICAtIOmcgOimgeS7gOS5iOS6ugogICAgICAgIC0g6ZyA6KaB5LuA5LmI5oqA6IO9CiAgICAgICAgICAgIC0g6ZyA6KaB5aSn5a2m55qE6K++CgojIyMg6YOo6Zeo77yI57uE57uH5p625p6E77yJCgotIOmDqOmXqAogIC0g6IGM6IO95pa55ZCRCiAgLSDmr4/kuKrogYzog73mlrnlkJHlj4jmnInku4DkuYjogYzkvY3lkI3np7AKCui/mei+ue+8jOeUqOaZuuiBlOeahOWkp+ihqOiBjOS9jeWQjeensOWkqui/h+eQkOeiju+8jOS4jeWkquWlvemAmui/h+WQjeensOadpeWvueiBjOiDvei/m+ihjOWIhuexu++8jOeUqOiUmuadpeeahOagoeaLm+eahOKAnOiBjOiDveaUr+aMgeaWueWQkeKAneS8muavlOi+g+WlveWIhuexuwrwn5GH5LiL6Z2i5Li76KaB6YCa6L+H6IGM6IO95pSv5oyB5pa55ZCR5p2l5YiG57G755yL5LiA5LiLCmBgYHtyfQojIOaKimNocui9rOS4umZhY3RvcgpsaWJyYXJ5KGRwbHlyKQphIDwtIG5pb191ciAlPiUKICBtdXRhdGVfaWYoaXMuY2hhcmFjdGVyLCBhcy5mYWN0b3IpCnN0cihhKQpgYGAKCuWPr+S7peeci+WIsOS4gOS4quavlOi+g+aVtOS9k+eahOe7hOe7h+aetuaehO+8mjXkuKrpg6jpl6jkuIvpnaLljIXlkKsxNuS4quiBjOiDveaWueWQkQoKLSA15Liq6YOo6Zeo77ya5Lqn5ZOB6K6+6K6h5LiO56CU5Y+R44CB5bel5Lia5YyW44CB566h55CG5LiO5pSv5oyB44CB5Yy65Z+f5YWs5Y+444CB55So5oi35LiO5pyN5YqhIAotIDE25Liq6IGM6IO95pa55ZCR77ya5Lqn5ZOB6aG555uu5pa55ZCR44CB5Lqk5LuY6L+Q6JCl5pa55ZCRIOOAgeepuumXtOi/kOiQpeaWueWQkeOAgeWFtuWug+OAgeS4ieeUteaWsOiDvea6kOaWueWQkeOAgeiuvuiuoeaWueWQkeOAgeWUruWQjuacjeWKoe+8iOacjeWKoeS7o+ihqO+8ieaWueWQkSAgICAgCiAg5pWw5a2X5oqA5pyv5pa55ZCR44CB6JSa5p2l5Lqn5ZOB5LiT5a625pa55ZCR44CB6JSa5p2l6aG+6Zeu5pa55ZCR44CB55So5oi35pyN5Yqh5pa55ZCR44CB5pW06L2m56CU5Y+R5Yi26YCg5pa55ZCR44CB6IGM6IO95pSv5oyB5pa55ZCR44CB6LSo6YeP566h55CG5pa55ZCR44CB5pm66IO956Gs5Lu25pa55ZCR44CB6Ieq5Yqo6am+6am25pa55ZCRIAoKYGBge3J9CiMg6YOo6ZeoIC0+IOiBjOiDveaUr+aMgQp0YWJsZShuaW9fdXIk6JSa5p2l5a6Y572R5qCh5oubLumDqOmXqCkKdGFibGUobmlvX3VyJOiUmuadpeWumOe9keagoeaLmy7ogYzog73mlK/mjIHmlrnlkJEpCmBgYAoK6YOo6ZeoCi0g6JSa5p2l5rG96L2m5ZCE6YOo6Zeo55qE5oub6IGY5pWw6YePCi0g5oub6IGY6ZyA5rGC5pyA5aSn55qE6YOo6Zeo5piv77ya5Yy65Z+f5YWs5Y+444CB5Lqn5ZOB6K6+6K6h5LiO56CU5Y+RCgpgYGB7cn0KYm1fZGYgPC0gZGF0YS5mcmFtZSh0YWJsZShuaW9fdXIk6JSa5p2l5a6Y572R5qCh5oubLumDqOmXqCkpCgpibV9kZiA8LSBibV9kZiAlPiUKICByZW5hbWUo5pWw6YePID0gRnJlcSwg6YOo6ZeoID0gVmFyMSkKCmJtX2xhYmVsIDwtIGFzLnZlY3RvcihibV9kZiTpg6jpl6gpIyMg6L2s5oiQ5ZCR6YeP77yM5ZCm5YiZ5Zu+5L6L55qE5qCH562+5Y+v6IO95LiO5a6e6ZmF6aG65bqP5LiN5LiA6Ie0CmJtX2xhYmVsIDwtIHBhc3RlKGJtX2xhYmVsLCAiKCIsIHJvdW5kKChibV9kZiTmlbDph48vc3VtKGJtX2RmJOaVsOmHjykpKjEwMCwgMiksICIlKSIsIHNlcCA9ICIiKSAj55SoIHJvdW5kKCkg5a+557uT5p6c5L+d55WZ5LiJ5L2N5bCP5pWwCgojIEJhc2ljIHBpZWNoYXJ0CmdncGxvdChibV9kZiwgYWVzKHg9IiIsIHk95pWw6YePLCBmaWxsPemDqOmXqCkpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPTEsIGNvbG9yPSJ3aGl0ZSIpICsKICBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0g5pWw6YePKSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGJyZWFrcyA9IGJtX2RmJOmDqOmXqCwgbGFiZWxzID0gYm1fbGFiZWwpKyAKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpKQoKYGBgCgpgYGB7cn0KIyMgLS0tLS0tLS0tLS0g5Lit5paH5LiA55u05pi+56S65LiN5Ye65p2lIC0tLS0tLS0tLS0tLS0tCiMg5p+l55yL5ZCE5Liq6YOo6Zeo5YyF5ZCr55qE6IGM6IO95pa55ZCRCmJtX2NoIDwtIGEgJT4lCiAgc2VsZWN0KOiUmuadpeWumOe9keagoeaLmy7pg6jpl6gs6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSklPiUgIAogIGNvdW50KOiUmuadpeWumOe9keagoeaLmy7pg6jpl6gs6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSkKCiMgIyDnlKh0cmVlbWFw5p2l5Y+v6KeG5YyW5LiA5LiLCiMgbGlicmFyeSh0cmVlbWFwKQojIHRyZWVtYXAoZHRmID0gYm1fY2gsCiMgICAgICAgICBpbmRleCA9IGMoIuiUmuadpeWumOe9keagoeaLmy7pg6jpl6giLCAi6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSIpLAojICAgICAgICAgdlNpemUgPSAibiIsCiMgICAgICAgICB2Q29sb3IgPSAi6JSa5p2l5a6Y572R5qCh5oubLumDqOmXqCIpCgpgYGAKCuavlOi+g+ebtOingueahOWPr+S7peeci+WHuuWQhOS4quiBjOiDveWMheWQq+WcqOWTquS6m+mDqOmXqOS4iwoKYGBge3J9CnRhYmxlX3RhYjEgPC0gdGFibGUoYSTolJrmnaXlrpjnvZHmoKHmi5su6IGM6IO95pSv5oyB5pa55ZCRLCBhJOiUmuadpeWumOe9keagoeaLmy7pg6jpl6gpCmhkZCA8LSBkYXRhLmZyYW1lKHRhYmxlX3RhYjEpCgojIEhlYXRtYXAKZ2dwbG90KGhkZCwgYWVzKFZhcjEsIFZhcjIsIGZpbGw9IEZyZXEpKSArCiAgZ2VvbV90aWxlKCkrCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0zMCwgaGp1c3Q9MSkpKwogIHlsYWIoIumDqOmXqCIpKwogIHhsYWIoIuiBjOiDveaUr+aMgeaWueWQkSIpCmBgYAoK5q+U6L6D57uG6Ie055qE55yL5ZCE5Liq6YOo6Zeo5Lit5ZCE5Liq6IGM6IO955qE5oub6IGY6ZyA5rGCCgpgYGB7cn0KYm1fY2gxIDwtIGJtX2NoJT4lCiAgZmlsdGVyKOiUmuadpeWumOe9keagoeaLmy7pg6jpl6ggPT0gYygi5Lqn5ZOB6K6+6K6h5LiO56CU5Y+RIiwi5Yy65Z+f5YWs5Y+4IikpCmJtX2NoMQpnZ3Bsb3QoYm1fY2gxLCBhZXMo6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSwgbikpICsgCiAgZ2VvbV9jb2woKSArIAogIGdlb21fdGV4dChhZXMobGFiZWw9biksIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIHZqdXN0PS0wLjI1KSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwLCBmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0zMCwgaGp1c3Q9MSkpKwogIGZhY2V0X3dyYXAoIH4g6JSa5p2l5a6Y572R5qCh5oubLumDqOmXqCkKYGBgCmBgYHtyfQpibV9jaDIgPC0gYm1fY2glPiUKICBmaWx0ZXIo6JSa5p2l5a6Y572R5qCh5oubLumDqOmXqCA9PSBjKCLlt6XkuJrljJYiLCLnlKjmiLfkuI7mnI3liqEiKSkKICAKZ2dwbG90KGJtX2NoMiwgYWVzKOiUmuadpeWumOe9keagoeaLmy7ogYzog73mlK/mjIHmlrnlkJEsIG4pKSArIAogIGdlb21fY29sKCkgKyAKICBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpLCB2anVzdD0tMC4yNSkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MzAsIGhqdXN0PTEpKSsKICBmYWNldF93cmFwKCB+IOiUmuadpeWumOe9keagoeaLmy7pg6jpl6gpCmBgYAoK6IGM6IO95pa55ZCRCgpgYGB7cn0KIyDnroDljZXnmoTnlLvkuKrlm74KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KGZvcmNhdHMpICMgZm9yZWNhdHMg5bqT5pivIHRpZHl2ZXJzZSDkuK3nmoTkuIDkuKrlupPvvIzkuJPpl6jnlKjkuo7lpITnkIYgUiDkuK3nmoTlm6DlrZAKCmRyYXdfZGYgPC0gZGF0YS5mcmFtZSh0YWJsZShuaW9fdXIk6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSkpCgpkcmF3X2RmICU+JQogIG11dGF0ZShWYXIxID0gZmN0X3Jlb3JkZXIoVmFyMSwgRnJlcSkpICU+JSAjIOm7mOiupO+8muS7juS4i+WIsOS4iuWNh+W6j++8m+S7juS4i+WIsOS4iumZjeW6j++8mmRlc2MoRnJlcSkKICBnZ3Bsb3QoYWVzKHggPSBWYXIxLCB5ID0gRnJlcSkpKyAKICAgIGdlb21fY29sKCkrCiAgICBjb29yZF9mbGlwKCkrCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUZyZXEpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpKSArCiAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpKSsKICAgIHlsYWIoIuaVsOmHjyIpKwogICAgeGxhYigi6IGM6IO95pSv5oyB5pa55ZCRIikKYGBgCgrogYzog73mlrnlkJHvvJrmnKrolJrmnaXpob7pl67mlrnlkJEKCuWIhuaekO+8mgotIOmcgOimgeS7gOS5iOS6uu+8iOWMheWHveWTquS6m+Wyl+S9je+8iQogICAgLSDpnIDopoHku4DkuYjmioDog70KICAgICAgICAtIOmcgOimgeWkp+WtpueahOivvgoKc3Vic2V0Me+8muW7uueri+S4gOS4quiBjOiDveOAgeWyl+S9jeWQjeensOOAgeaVsOmHjwpgYGB7cn0KIyDlu7rnq4vkuIDkuKrogYzog73jgIHlspfkvY3lkI3np7DjgIHmlbDph48Kc3Vic2V0X25pb191ciA8LSBuaW9fdXIgJT4lCiAgc2VsZWN0KGMo6JSa5p2l5a6Y572R5qCh5oubLuiBjOS9jeWQjeensCzolJrmnaXlrpjnvZHmoKHmi5su6IGM6IO95pSv5oyB5pa55ZCRKSklPiUKICBncm91cF9ieSjolJrmnaXlrpjnvZHmoKHmi5su6IGM5L2N5ZCN56ewLOiUmuadpeWumOe9keagoeaLmy7ogYzog73mlK/mjIHmlrnlkJEpJT4lCiAgc3VtbWFyaXNlKG51bT1uKCkpCmhlYWQoc3Vic2V0X25pb191cikKYGBgCgpgYGB7cn0KIyDnnIvkuIDkuIvlkITkuKrogYzog73nmoTmr4/kuKrlspfkvY3nmoTpnIDmsYLmlbDph48KZ2dwbG90KHN1YnNldF9uaW9fdXIsIGFlcyjolJrmnaXlrpjnvZHmoKHmi5su6IGM5L2N5ZCN56ewLCBudW0pKSArIAogIGdlb21fY29sKGFlcyhjb2xvdXI96JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSkpICsgCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSkrCiAgZmFjZXRfd3JhcCggfiDolJrmnaXlrpjnvZHmoKHmi5su6IGM6IO95pSv5oyB5pa55ZCRKQpgYGAKCuWQhOS4quiBjOiDveaWueWQkeaJgOaJgOWMheWQq+eahOiBjOS9jQoKYGBge3J9CiMg6JSa5p2l6aG+6Zeu5pa55ZCRCmNvbnNfZGYgPC0gbmlvX3VyICU+JQogIGZpbHRlcijolJrmnaXlrpjnvZHmoKHmi5su6IGM6IO95pSv5oyB5pa55ZCRID09ICLolJrmnaXpob7pl67mlrnlkJEiKSAKaGVhZChjb25zX2RmJOiUmuadpeWumOe9keagoeaLmy7ogYzkvY3lkI3np7ApIApgYGAK6IGM5L2N5ZCN56ew77yaWzFdICLolJrmnaXpob7pl64t5aiB5rW3IiAgICAgIuiUmuadpemhvumXri3lqIHmtbciICAgICAi6JSa5p2l6aG+6ZeuLeWkqea0pea7qOa1tyIgIuiUmuadpemhvumXri3lpKnmtKUiICAgICAi6JSa5p2l6aG+6ZeuLeWQiOiCpSIgICAgICLolJrmnaXpob7pl64t5oiQ6YO9IiAKCmBgYHtyfQojIOiUmuadpeS6p+WTgeS4k+WutuaWueWQkQpwcm9mX2RmIDwtIG5pb191ciAlPiUKICBmaWx0ZXIo6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSA9PSAi6JSa5p2l5Lqn5ZOB5LiT5a625pa55ZCRIikgCmhlYWQocHJvZl9kZiTolJrmnaXlrpjnvZHmoKHmi5su6IGM5L2N5ZCN56ewKSAKYGBgCmBgYHtyfQojIOaVsOWtl+aKgOacr+aWueWQkQpkYXRhX2RmIDwtIG5pb191ciAlPiUKICBmaWx0ZXIo6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSA9PSAi5pWw5a2X5oqA5pyv5pa55ZCRIikgCmhlYWQoZGF0YV9kZiTolJrmnaXlrpjnvZHmoKHmi5su6IGM5L2N5ZCN56ewKSAKYGBgCmBgYHtyfQojIOaVtOi9pueglOWPkeWItumAoOaWueWQkQpjYXJfZGYgPC0gbmlvX3VyICU+JQogIGZpbHRlcijolJrmnaXlrpjnvZHmoKHmi5su6IGM6IO95pSv5oyB5pa55ZCRID09ICLmlbTovabnoJTlj5HliLbpgKDmlrnlkJEiKSAKaGVhZChjYXJfZGYk6JSa5p2l5a6Y572R5qCh5oubLuiBjOS9jeWQjeensCkgCmBgYApgYGB7cn0KIyDnqbrpl7Tov5DokKXmlrnlkJEKc3BlX2RmIDwtIG5pb191ciAlPiUKICBmaWx0ZXIo6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSA9PSAi56m66Ze06L+Q6JCl5pa55ZCRIikgCmhlYWQoc3BlX2RmJOiUmuadpeWumOe9keagoeaLmy7ogYzkvY3lkI3np7ApIApgYGAKYGBge3J9CiMg5Lqk5LuY6L+Q6JCl5pa55ZCRCmpmX2RmIDwtIG5pb191ciAlPiUKICBmaWx0ZXIo6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSA9PSAi5Lqk5LuY6L+Q6JCl5pa55ZCRIikgCmhlYWQoamZfZGYk6JSa5p2l5a6Y572R5qCh5oubLuiBjOS9jeWQjeensCkgCmBgYApgYGB7cn0KIyDnlKjmiLfmnI3liqHmlrnlkJEKY2xpZW50X2RmIDwtIG5pb191ciAlPiUKICBmaWx0ZXIo6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSA9PSAi55So5oi35pyN5Yqh5pa55ZCRIikgCmhlYWQoY2xpZW50X2RmJOiUmuadpeWumOe9keagoeaLmy7ogYzkvY3lkI3np7ApIApgYGAKYGBge3J9CiMg5LiJ55S15paw6IO95rqQ5pa55ZCRCnRocmVlX2RmIDwtIG5pb191ciAlPiUKICBmaWx0ZXIo6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSA9PSAi5LiJ55S15paw6IO95rqQ5pa55ZCRIikgCmhlYWQodGhyZWVfZGYk6JSa5p2l5a6Y572R5qCh5oubLuiBjOS9jeWQjeensCkgCmBgYAoKIyMjIOmcgOimgeS7gOS5iOS6ugoK6Kej5Yaz6ZyA6KaB5LuA5LmI5Lq677ya6IGM6IO95pa55ZCR5ZKM5a2m5Y6G5YWz57O7CgpgYGB7cn0KcGVvcGxlX2xldmVsIDwtIGRhdGEuZnJhbWUodGFibGUoYSTolJrmnaXlrpjnvZHmoKHmi5su5a2m5Y6GKSkKcGVvcGxlX2xldmVsCgpwZW9wbGVfbGV2ZWwgPC0gcGVvcGxlX2xldmVsICU+JQogIHJlbmFtZSjmlbDph48gPSBGcmVxLCDlrabljoYgPSBWYXIxKQoKIyDorr7nva7nmb7liIbmr5QKcGVvcGxlX2xldmVsX2xhYmVsIDwtIGFzLnZlY3RvcihwZW9wbGVfbGV2ZWwk5a2m5Y6GKSMjIOi9rOaIkOWQkemHj++8jOWQpuWImeWbvuS+i+eahOagh+etvuWPr+iDveS4juWunumZhemhuuW6j+S4jeS4gOiHtApwZW9wbGVfbGV2ZWxfbGFiZWwgPC0gcGFzdGUocGVvcGxlX2xldmVsX2xhYmVsLCAiKCIsIHJvdW5kKChwZW9wbGVfbGV2ZWwk5pWw6YePL3N1bShwZW9wbGVfbGV2ZWwk5pWw6YePKSkqMTAwLCAyKSwgIiUpIiwgc2VwID0gIiIpICPnlKggcm91bmQoKSDlr7nnu5Pmnpzkv53nlZnkuInkvY3lsI/mlbAKCiMgQmFzaWMgcGllY2hhcnQKZ2dwbG90KHBlb3BsZV9sZXZlbCwgYWVzKHg9IiIsIHk95pWw6YePLCBmaWxsPeWtpuWOhikpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPTEsIGNvbG9yPSJ3aGl0ZSIpICsKICBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0g5pWw6YePKSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGJyZWFrcyA9IHBlb3BsZV9sZXZlbCTlrabljoYsIGxhYmVscyA9IHBlb3BsZV9sZXZlbF9sYWJlbCkrIAogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IikpCgojIOacgOWQjuWGjeadpeeUqOi/meS4quWBmuS4gOS4i+aVtOS9k+eahOiwg+iJsiAtLS0tLS0tLS0tLS0tLS0tLS0gIyMjIyMjIyMjIwpsaWJyYXJ5KGdndGhlbXIpCmdndGhlbXIoJ2R1c3QnKSAjIOiuvue9ruWFtuS4reS4gOenjeagt+W8jwojIHAwICMg5bGV56S66L+Z5Liq5Li76aKY5LiL5b6X5Yiw55qE5Zu+5b2iCmBgYApgYGB7cn0KdGFibGVfcGVvcGxlIDwtIHRhYmxlKGEk6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSwgYSTolJrmnaXlrpjnvZHmoKHmi5su5a2m5Y6GKQp0YWJsZV9wZW9wbGUKIyMgc2lkZS1ieS1zaWRlIApnZ3Bsb3QoZGF0YSA9IGEsIGFlcyh4ID0g6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSwgZmlsbCA9IOiUmuadpeWumOe9keagoeaLmy7lrabljoYpKSArIAogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikrCiAgIyBnZW9tX3RleHQoYWVzKGxhYmVsPW4pLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpLCB2anVzdD0tMC4yNSkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCwgZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IiksCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MzAsIGhqdXN0PTEpKQpgYGAKCiMjIyDpnIDopoHku4DkuYjmioDog70KYGBge3J9CiMg5rWL6K+V5LiA5LiL5a2X56ym5Liy55qE5o+Q5Y+W77yM5L6/5LqO5ZCO6Z2i5o+Q5Y+W4oCc5bKX5L2N6IGM6LSj4oCd5ZKM4oCc5bKX5L2N6KaB5rGC4oCdCmxpYnJhcnkoc3RyaW5ncikKdGV4dCA9ICLlspfkvY3ogYzotKPvvJogMS4g5byA5Y+R5bm25a6e546w6YeP5Lqn57qn5Yir55qE6KGM5Li66KeE5YiS5ZKM6L+Q5Yqo6KeE5YiS566X5rOVMi4g57uT5ZCI6K+t5LmJ5Zyw5Zu+5ZKM5oSf55+l57uT5p6c5a6e5pe26aKE5rWL5ZGo6L655Y+C5LiO6ICF6KGM5Li677yI6L2m6L6G77yM6KGM5Lq6562J77yJ77ybMy4g57uT5ZCI5aSn6KeE5qih6Lev5rWL5pWw5o2u5a6M5ZaE566X5rOV5qih5Z6L44CC5bKX5L2N6KaB5rGC77yaMS4g5Zyo55u45YWz6aKG5Z+f77yI5py65Zmo5Lq677yM6L2v5Lu25bel56iL77yM5pWw5a2m5LyY5YyW77yM55S15a2Q5LiO6K6h566X5py6562J77yJ6I635b6XQlMvTVMvUGhE77ybMi4g57K+6YCabGludXjnjq/looPkuItDKyvnvJbnqIvvvIzlhbfmnInoia/lpb3nmoRPT1Dorr7orqHkuaDmg6/vvIzmnInlnKjnm7jlhbPns7vnu5/vvIjmnLrlmajkurrvvIzml6DkurrmnLrvvIzml6DkurrovabvvInlubPlj7DkuIrlvIDlj5Ev5a6e546w55qE55u45YWz57uP6aqMIO+8mzMuIOeGn+aCieinhOWIkuaIluiAhei9qOi/ueeUn+aIkOeul+azle+8iEEqLFJSVCxSUlQq77yJ5Lul5Y+K5Yaz562W5LyY5YyW55u45YWz5qih5Z6L77yITURQLCBQT01EUOetie+8ie+8mzQg5YW35pyJ6Imv5aW955qE5pWw5a2m5Z+656GA5Y+K5LyY5YyW55u45YWz55qE55+l6K+G44CC5Yqg5YiG6aG577yaMS4g5YW35pyJUlRPU+ebuOWFs+W8gOWPkee7j+mqjO+8mzIuIOWFt+acieS7v+ecn+WZqOebuOWFs+W8gOWPkee7j+mqjO+8mzMuIOWunuaXtuWumuS9jeaIluiAheWcsOWbvuebuOWFs+e7j+mqjO+8m+a3seW6puWtpuS5oOS7peWPiuW8uuWMluWtpuS5oOebuOWFs+e7j+mqjCDjgIIiCgojIGFhIDwtIHN0cl9leHRyYWN0KHRleHQsICIo5bKX5L2N6IGM6LSjKS4qPyg/PeWyl+S9jeimgeaxgikiKSAjIOaPkOWPluKAnOWyl+S9jeiBjOi0o+KAneWIsOKAnOWyl+S9jeimgeaxguKAne+8jOS9huS4jeWMheWQq+KAnOWyl+S9jeimgeaxguKAnQojIGFhIDwtIHN0cl9leHRyYWN0KHRleHQsICIo5bKX5L2N6IGM6LSjKS4qPyjlspfkvY3opoHmsYIpIikgIyDmj5Dlj5bigJzlspfkvY3ogYzotKPigJ3liLDigJzlspfkvY3opoHmsYLigJ3vvIzkvYbljIXlkKvigJzlspfkvY3ogYzotKPigJ3lkozigJzlspfkvY3opoHmsYLigJ0KYWEgPC0gc3RyX2V4dHJhY3QodGV4dCwgIig/PD3lspfkvY3ogYzotKPvvJopLio/KD8977yaKSIpICMg5o+Q5Y+W4oCc5bKX5L2N6IGM6LSj77ya4oCd5Yiw4oCc5bKX5L2N6KaB5rGC4oCd77yM5Lit6Ze055qE5a2X56ymCnN0cihhYSkKYGBgCmBgYHtyfQp0ZXN0X2RmIDwtIG5pb191ciAlPiUKICBtdXRhdGUo5bKX5L2N6IGM6LSjID0gc3RyX2V4dHJhY3Qo6JSa5p2l5a6Y572R5qCh5oubLuiBjOS9jeaPj+i/sCwgIig/PD3lspfkvY3ogYzotKMpLio/KD895bKX5L2N6KaB5rGCKSIpKSU+JQogIG11dGF0ZSjlt6XkvZzlhoXlrrkgPSBzdHJfZXh0cmFjdCjolJrmnaXlrpjnvZHmoKHmi5su6IGM5L2N5o+P6L+wLCAiKD88PeW3peS9nOWGheWuuSkuKj8oPz3ku7vogYzopoHmsYIpIikpJT4lCiAgbXV0YXRlKOS7u+iBjOimgeaxgiA9IHN0cl9leHRyYWN0KOiUmuadpeWumOe9keagoeaLmy7ogYzkvY3mj4/ov7AsICIo5Lu76IGM6KaB5rGCKS4qIikpJT4lCiAgbXV0YXRlKOWKoOWIhumhuSA9IHN0cl9leHRyYWN0KOiUmuadpeWumOe9keagoeaLmy7ogYzkvY3mj4/ov7AsICIo5Yqg5YiG6aG5KS4qIikpCmBgYAoKYGBge3J9CiMg5p+l55yL55yL5LiA5LiLIHRlc3Qg5pWw5o2u6ZuG77yMTkHlgLznmoTmr5TkvosKYXBwbHkodGVzdF9kZiwyLGZ1bmN0aW9uKHgpe3N1bShpcy5uYSh4KSkvbnJvdyh0ZXN0X2RmKX0pCmBgYApgYGB7cn0KIyDmjJHpgInlh7rigJzku7vogYzopoHmsYLigJ3kuI3mmK9OQeeahOi/m+S4gOatpeWIhuaekApqb2JfcmVxIDwtIHRlc3RfZGYgJT4lCiAgc2VsZWN0KGMo6JSa5p2l5a6Y572R5qCh5oubLuiBjOS9jeWQjeensCzolJrmnaXlrpjnvZHmoKHmi5su5a2m5Y6GLOiUmuadpeWumOe9keagoeaLmy7pg6jpl6gs6JSa5p2l5a6Y572R5qCh5oubLuiBjOiDveaUr+aMgeaWueWQkSzku7vogYzopoHmsYIpKSU+JQogIGZpbHRlcighaXMubmEo5Lu76IGM6KaB5rGCKSkKYXBwbHkoam9iX3JlcSwyLGZ1bmN0aW9uKHgpe3N1bShpcy5uYSh4KSkvbnJvdyhqb2JfcmVxKX0pCmBgYApgYGB7cn0KIyDlr7nigJzogYzkvY3opoHmsYLigJ3kuIDmoI/ov5vooYzliIbor40KbGlicmFyeShqaWViYVIpCmhlYWQoam9iX3JlcSkKCiMg5Yqg5YWl6Ieq5a6a5LmJ55qE5a2X5YW4CmppZWJhX3Rva2VuaXplciA8LSB3b3JrZXIodXNlcj0iZGljdC91c2VyX2RpY3QudHh0Iiwgc3RvcF93b3JkID0gImRpY3Qvc3RvcF93b3Jkcy50eHQiKQoKIyDoqK3lrprmlrfoqZ5mdW5jdGlvbgpjdXN0b21pemVkX3Rva2VuaXplciA8LSBmdW5jdGlvbih0KSB7CiAgbGFwcGx5KHQsIGZ1bmN0aW9uKHgpIHsKICAgIHRva2VucyA8LSBzZWdtZW50KHgsIGppZWJhX3Rva2VuaXplcikKICAgIHRva2VucyA8LSB0b2tlbnNbbmNoYXIodG9rZW5zKT4xXQogICAgcmV0dXJuKHRva2VucykKICB9KQp9CmBgYApgYGB7cn0KIyDmlq3or40KbGlicmFyeSh0aWR5cikKbGlicmFyeSh0aWR5dGV4dCkKam9idG9rZW4gPC0gam9iX3JlcSAlPiUgdW5uZXN0X3Rva2Vucyh3b3JkLCDku7vogYzopoHmsYIsIHRva2VuPWN1c3RvbWl6ZWRfdG9rZW5pemVyKQpoZWFkKGpvYnRva2VuKQpgYGAKYGBge3J9CiMg5pWw5o2u55qE5riF55CGCiMg6L+H5ruk54m55q6K5a2X5YWDCmRhdGFfc2VsZWN0IDwtIGpvYnRva2VuICU+JSAKICBmaWx0ZXIoIWdyZXBsKCdbWzpwdW5jdDpdXScsd29yZCkpICU+JSAjIOWOu+agh+eCueespuWPtwogIGZpbHRlcighZ3JlcGwoIlsnXjAtOSddIix3b3JkKSkgJT4lICMg5Y675pWw5a2XCiAgZmlsdGVyKG5jaGFyKC4kd29yZCk+MSkgCiAgCiMg566X5q+P5LiqIOiBjOiDveaUr+aMgeaWueWQkSDnmoTor43popEKIyB3b3JkX2NvdW50OmFydERhdGUsd29yZCxjb3VudAp3b3JkX2NvdW50IDwtIGRhdGFfc2VsZWN0ICU+JQogIHNlbGVjdCjolJrmnaXlrpjnvZHmoKHmi5su6IGM6IO95pSv5oyB5pa55ZCRLHdvcmQpICU+JQogIGdyb3VwX2J5KOiUmuadpeWumOe9keagoeaLmy7ogYzog73mlK/mjIHmlrnlkJEsd29yZCkgJT4lCiAgc3VtbWFyaXNlKGNvdW50PW4oKSkgJT4lICAKICBmaWx0ZXIoY291bnQ+MykgJT4lICAjIOmBjua/vuWHuuePvuWkquWwkeasoeeahOWtlwogIGFycmFuZ2UoZGVzYyhjb3VudCkpCmBgYApgYGB7cn0Kd29yZF9jb3VudApgYGAK5Y+v5Lul55So5paH5a2X5LqR5aSn5qaC55yL5LiA5LiL5ZCE5Liq4oCc6IGM6IO95pSv5oyB5pa55ZCR4oCd6ZyA6KaB55qE5oqA6IO95pa55ZCRCuWQjue7remcgOimgei3n+e7huiHtOeahOetm+mAie+8jOWQhOS4quWyl+S9jeeahOaKgOiDvemcgOaxggpgYGB7cn0KIyBsaWJyYXJ5KHdvcmRjbG91ZDIpCiMgIyDnlLvlh7ogIuaVsOWtl+aKgOacr+aWueWQkSIg5paH5a2X5LqRCiMgd29yZF9jb3VudCAlPiUKIyAgIGZpbHRlcighKHdvcmQgJWluJSBjKCLlhbflpIciLCLog73lipsiLCLkvJjlhYgiLCLnhp/mgokiLCLopoHmsYIiLCLku7vogYwiLCLnu4/pqowiLCLlhbfmnIkiLCLnm7jlhbMiLCLkuobop6MiKSkpICU+JQojICAgZmlsdGVyKOiUmuadpeWumOe9keagoeaLmy7ogYzog73mlK/mjIHmlrnlkJEgPT0gIuaVsOWtl+aKgOacr+aWueWQkSIpICU+JSAKIyAgIHNlbGVjdCh3b3JkLGNvdW50KSAlPiUgCiMgICBncm91cF9ieSh3b3JkKSAlPiUgCiMgICBzdW1tYXJpc2UoY291bnQgPSBzdW0oY291bnQpKSAlPiUKIyAgIGFycmFuZ2UoZGVzYyhjb3VudCkpICU+JQojICAgZmlsdGVyKGNvdW50PjEwKSAlPiUgICAjIOi/h+a7pOaOieWHuueOsOWkquWwkeeahOWtlwojICAgd29yZGNsb3VkMigpCmBgYAohW10o6JSa5p2l5pWw5a2X5oqA5pyvLnBuZykKYGBge3J9CiMgIyDnlLvlh7ogIuiUmuadpeS6p+WTgeS4k+WutuaWueWQkSIg5paH5a2X5LqRCiMgd29yZF9jb3VudCAlPiUKIyAgIGZpbHRlcighKHdvcmQgJWluJSBjKCLlhbflpIciLCLog73lipsiLCLkvJjlhYgiLCLnhp/mgokiLCLopoHmsYIiLCLku7vogYwiLCLnu4/pqowiLCLlhbfmnIkiLCLnm7jlhbMiKSkpICU+JQojICAgZmlsdGVyKOiUmuadpeWumOe9keagoeaLmy7ogYzog73mlK/mjIHmlrnlkJEgPT0gIuiUmuadpeS6p+WTgeS4k+WutuaWueWQkSIpICU+JSAKIyAgIHNlbGVjdCh3b3JkLGNvdW50KSAlPiUgCiMgICBncm91cF9ieSh3b3JkKSAlPiUgCiMgICBzdW1tYXJpc2UoY291bnQgPSBzdW0oY291bnQpKSAlPiUKIyAgIGFycmFuZ2UoZGVzYyhjb3VudCkpICU+JQojICAgZmlsdGVyKGNvdW50PjEwKSAlPiUgICAjIOi/h+a7pOaOieWHuueOsOWkquWwkeeahOWtlwojICAgd29yZGNsb3VkMigpCmBgYAohW10o6JSa5p2l5Lqn5ZOBLnBuZykKCvCfkYDlspfkvY3nmoTnu4boh7TmioDog73pnIDmsYLliIbmnpAKCmBgYHtyfQojIGhlYWQoam9iX3JlcSkKIyBqb2JfcmVxJOS7u+iBjOimgeaxglsxOjMwXQpgYGAKCiMjIOaZuuiBlOaLm+iBmCAtIOaWsOiDvea6kOeUteWKqOi9puaVtOS9k+WIhuaekAoKLSDmlbTkvZPooYzkuJoKICAtIOWTquS6m+ihjOS4muWcqOaLm+aWsOiDvea6kOaxvei9puebuOWFs+eahOWyl+S9jQogIC0g6Jaq6LWE55qE5pW05L2T5rC05bmz5Lul5Y+K5YiG5biDCi0g5LuO6L2m5LyB5YiG5p6Q77yI5Yeg5Liq5aS06YOo6L2m5LyB77yJCiAgLSDlkITkuKrlspfkvY3nmoTmi5vogZjkurrmlbAgLSDmi5vogZjmr5TkvosKICAtIOS8muS4jeS8muS4jeWQjOeahOS8geS4muaLm+iBmOeahOWyl+S9jeaWueWQkeS8muS4jeWkquebuOWQjAotIOS7juWyl+S9jeWIhuaekAogIC0g5ZCE5Liq5bKX5L2N55qE6Jaq6LWE5oOF5Ya1CiAgLSDlkITkuKrlspfkvY3lt6XkvZzlubTpmZDopoHmsYIKICAtIOWQhOS4quWyl+S9jeeahOWtpuWOhuimgeaxggotIOagueaNruS4iuW4guaDheWGteadpeeci+aLm+iBmOeahOaWueWQkQoKIyMjIOihjOS4muWIhuaekAotIOihjOS4muWcsOWMugpgYGB7cn0KIyDmiopjaHLnmoTovazmjaLmiJBmYWN0b3LkvJrmr5TovoPlpb3nnIvlh7rnsbvliKvlj5jmlbDnmoTnp43nsbsKemxfZGF0YSA8LSB6aGlsaWFuJT4lCiAgbXV0YXRlX2lmKGlzLmNoYXJhY3RlciwgYXMuZmFjdG9yKQpzdHIoemxfZGF0YSkKYGBgCgpgYGB7cn0KaHlfZGF0YSA8LSB6bF9kYXRhJT4lCiAgc2VsZWN0KOaZuuiBlOaLm+iBmC7ooYzkuJopJT4lCiAgZmlsdGVyKCFpcy5uYSjmmbrogZTmi5vogZgu6KGM5LiaKSklPiUKICBncm91cF9ieSjmmbrogZTmi5vogZgu6KGM5LiaKSU+JQogIHN1bW1hcmlzZShudW0gPSBuKCkpJT4lCiAgdG9wX24oMTApCmhlYWQoaHlfZGF0YSkgIAoKaHlfZGF0YSAlPiUKICBtdXRhdGUo5pm66IGU5oub6IGYLuihjOS4miA9IGZjdF9yZW9yZGVyKOaZuuiBlOaLm+iBmC7ooYzkuJosIG51bSkpICU+JSAjIOm7mOiupO+8muS7juS4i+WIsOS4iuWNh+W6j++8m+S7juS4i+WIsOS4iumZjeW6j++8mmRlc2MoRnJlcSkKICBnZ3Bsb3QoYWVzKHggPSDmmbrogZTmi5vogZgu6KGM5LiaLCB5ID0gbnVtKSkrIAogICAgZ2VvbV9jb2woKSsKICAgIGNvb3JkX2ZsaXAoKSsKICAgIGdlb21fdGV4dChhZXMobGFiZWw9bnVtKSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC45KSwgdmp1c3Q9MS41KSArCiAgICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpKSsKICAgIHlsYWIoIuaVsOmHjyIpKwogICAgeGxhYigi5pm66IGU5oub6IGYLuihjOS4miIpCmBgYArolqrotYTnmoTmlbTkvZPmsLTlubMKYGBge3J9Cm1vbmV5X2RhdGEgPC0gemhpbGlhbiU+JQogIHNlcGFyYXRlKOaZuuiBlOaLm+iBmC7olqrotYTojIPlm7QsIGMoIuacgOS9juiWqui1hCIsIuacgOmrmOiWqui1hCIpLCItIiklPiUKICBtdXRhdGUo5pyA5L2O6Jaq6LWEID0gYXMubnVtZXJpYyjmnIDkvY7olqrotYQpKSU+JQogIG11dGF0ZSjmnIDpq5jolqrotYQgPSBhcy5udW1lcmljKOacgOmrmOiWqui1hCkpCmhlYWQobW9uZXlfZGF0YSkKCmdncGxvdChtb25leV9kYXRhLCBhZXMoeCA9IHgpKSArCiAgZ2VvbV9kZW5zaXR5KGFlcyh4PeacgOS9juiWqui1hCksZmlsbD0iIzgzZDRkMiIsc2l6ZT0wLjUsIGFscGhhPTAuNSkgKwogIGdlb21fZGVuc2l0eShhZXMoeD3mnIDpq5jolqrotYQpLGZpbGw9IiNlODhiNjYiLHNpemU9MC41LCBhbHBoYT0wLjUpICsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpKSsKICB4bGltKDAsIDc1MDAwKSsKICB4bGFiKCLolqrotYQiKQoKIyBnZ3Bsb3QobW9uZXlfZGF0YSkgKwojICAgZ2VvbV9oaXN0b2dyYW0oYWxwaGE9MC41LCBwb3NpdGlvbj0iaWRlbnRpdHkiKSArCiMgICAjIGdlb21fdGV4dChhZXMobGFiZWw9bnVtKSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC45KSwgdmp1c3Q9MS41KSArCiMgICAgIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IikpCmBgYApgYGB7cn0KaGVhZChtb25leV9kYXRhW29yZGVyKG1vbmV5X2RhdGEk5pm66IGU5oub6IGYLuaLm+iBmOS6uuaVsCxkZWNyZWFzaW5nID0gVCksXSwzMCkKYGBgCgojIyMg5LuO6L2m5LyB5YiG5p6Q77yI5Yeg5Liq5aS06YOo6L2m5LyB77yJCgpgYGB7cn0KY29tcF9kYXRhIDwtIHpsX2RhdGElPiUKICBzZWxlY3Qo5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCzmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewLOaZuuiBlOaLm+iBmC7lrabljoYs5pm66IGU5oub6IGYLuWFrOWPuOaAp+i0qCzmmbrogZTmi5vogZgu6J6N6LWE5oOF5Ya1LOaZuuiBlOaLm+iBmC7mi5vogZjkurrmlbApJT4lCiAgbXV0YXRlKOaZuuiBlOaLm+iBmC7mi5vogZjkurrmlbAgPSBhcy5udW1lcmljKOaZuuiBlOaLm+iBmC7mi5vogZjkurrmlbApKQpoZWFkKGNvbXBfZGF0YSkKaGVhZChjb21wX2RhdGFbb3JkZXIoY29tcF9kYXRhJOaZuuiBlOaLm+iBmC7mi5vogZjkurrmlbAsZGVjcmVhc2luZyA9IFQpLF0sMzApCmBgYAoK5om+5Ye65Y+R5biD5oub6IGY6ZyA5rGC5pyA5aSa55qEdG9wMTDlhazlj7gKCi0gIuavlOS6mui/qiIsIueQhuaDs+axvei9piIsIuWwj+m5j+axvei9piIsIuWMl+S6rOaxvei9puiCoeS7veaciemZkOWFrOWPuCIsIuS6keW6puaWsOiDvea6kOaxvei9puaciemZkOWFrOWPuCIsIk5JTyDolJrmnaUg77yI5LiK5rW377yJIiwi5rex5Zyz6IW+5oKm5paw6IO95rqQ5rG96L2m6ZSA5ZSu5pyN5Yqh5pyJ6ZmQ5YWs5Y+4Iiwi5YyX5Lqs5paw6IO95rqQ5rG96L2m6IKh5Lu95pyJ6ZmQ5YWs5Y+4Iiwi5aiB6ams5rG96L2m56eR5oqA6ZuG5ZuiIiwi5rex5Zyz5biC6L+q5ru05paw6IO95rqQ5rG96L2m56eR5oqA5pyJ6ZmQ5YWs5Y+4IgoKLSDogIwi5q+U5Lqa6L+qIiwi55CG5oOz5rG96L2mIiwi5bCP6bmP5rG96L2mIui/meS4ieWutuWFrOWPuOeahOaLm+iBmOmcgOaxguimgei/nOmrmOS6juWFtuS7lueahOWFrOWPuAoKYGBge3J9CiMg5aS06YOo5YmNMTDlrrbkvIHkuJrmi5vogZjmnIDlpJrnmoTlspfkvY0KIyDmlbTnkIblh7rmnaXmr4/lrrbkvIHkuJrmr4/kuKrlspfkvY3nmoTmi5vogZjkurrmlbAKYWFhYSA8LSBkYXRhLmZyYW1lKHRhYmxlKGNvbXBfZGF0YSTmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewKSkKb3JkZXJfY29tcCA8LSBhYWFhW29yZGVyKGFhYWEkRnJlcSxkZWNyZWFzaW5nID0gVCksXQoKI2hlYWQob3JkZXJfY29tcCwxMCkKb3JkZXJfY29tcCA8LW9yZGVyX2NvbXAgJT4lCiAgdG9wX24oMTApIAoKb3JkZXJfY29tcCAlPiUKICBtdXRhdGUoVmFyMSA9IGZjdF9yZW9yZGVyKFZhcjEsIGRlc2MoRnJlcSkpKSAlPiUgIyDpu5jorqTvvJrku47kuIvliLDkuIrljYfluo/vvJvku47kuIvliLDkuIrpmY3luo/vvJpkZXNjKEZyZXEpCiAgZ2dwbG90KGFlcyhWYXIxLEZyZXEpKSsKICBnZW9tX2NvbCgpKwogIGdlb21fdGV4dChhZXMobGFiZWw9RnJlcSksIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIHZqdXN0PS0wLjI1KSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwLGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpLAogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xKSkrCiAgeWxhYigi5oub6IGY5Lq65pWwIikrCiAgeGxhYigi5LyB5Lia5ZCN56ewIikKCgoKdG9wMTBfY29tcCA8LSBjKCLmr5Tkuprov6oiLCLnkIbmg7Pmsb3ovaYiLCLlsI/puY/msb3ovaYiLCLljJfkuqzmsb3ovabogqHku73mnInpmZDlhazlj7giLCLkupHluqbmlrDog73mupDmsb3ovabmnInpmZDlhazlj7giLAogICAgICAgICAgICAgICAgIk5JTyDolJrmnaUg77yI5LiK5rW377yJIiwi5rex5Zyz6IW+5oKm5paw6IO95rqQ5rG96L2m6ZSA5ZSu5pyN5Yqh5pyJ6ZmQ5YWs5Y+4Iiwi5YyX5Lqs5paw6IO95rqQ5rG96L2m6IKh5Lu95pyJ6ZmQ5YWs5Y+4IiwKICAgICAgICAgICAgICAgICLlqIHpqazmsb3ovabnp5HmioDpm4blm6IiLCLmt7HlnLPluILov6rmu7TmlrDog73mupDmsb3ovabnp5HmioDmnInpmZDlhazlj7giKQoKcGVvcF9udW0gPC0gY29tcF9kYXRhJT4lCiAgc2VsZWN0KOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7As5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCzmmbrogZTmi5vogZgu5oub6IGY5Lq65pWwKSU+JQogIGZpbHRlcijmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewICVpbiUgdG9wMTBfY29tcCklPiUKICBncm91cF9ieSjmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewLOaZuuiBlOaLm+iBmC7ogYzkvY3lkI3np7ApJT4lCiAgc3VtbWFyaXNlKHJlYWwgPSBzdW0o5pm66IGU5oub6IGYLuaLm+iBmOS6uuaVsCkpCgojIHBlb3BfbnVtCiMgc3RyKHBlb3BfbnVtW29yZGVyKHBlb3BfbnVtJHJlYWwsZGVjcmVhc2luZyA9IFQpLF0sMTApIAojIGhlYWQocGVvcF9udW1bb3JkZXIocGVvcF9udW0kcmVhbCxkZWNyZWFzaW5nID0gVCksXSwzMCkKYGBgCgrmn6XnnIvlkITlpKflhazlj7jlkITkuKrlspfkvY3pnIDmsYLkurrmlbAKCi0g5piv5ZCE5Liq6YOo6Zeo5q+U6L6D5bmz5Z2H55qE6ZyA6KaB5Lq65ZGY77yM6L+Y5piv5p+Q5Lqb5bKX5L2N5pyJ5aSn6YeP55qE6ZyA5rGC77yfCgrkuIvlm77mmK/lkITkuKrlhazlj7jnmoTlkITkuKrlspfkvY3pnIDmsYLkurrmlbDnmoTliIbluIPnrrHlvaLlm77vvJoKLSDlpKfpg6jliIblspfkvY3nmoTmi5vogZjkurrmlbDpnIDmsYLpg73lnKgyMOS4gOS4i+WtkAotIOS9huWPr+S7peeci+WHuuKAnOeQhuaDs+axvei9puKAne+8jOKAnOWwj+m5j+axvei9puKAne+8jOKAnOavlOS6mui/quKAneWPs+S+p+acieS4gOS6m+emu+aVo+eahOeCue+8jOivtOaYjuWFtuWcqOS4gOS6m+Wyl+S9jeS4iuacieeJueWIq+Wkp+mHj+eahOaLm+iBmOmcgOaxggoKYGBge3J9CiMgcGFjbWFuOjpwX2xvYWQoZHBseXIsdGliYmxlLEdHYWxseSxwbG90bHksZ2dwdWJyKQoKdG9wOF9jb21wIDwtIGMoIuavlOS6mui/qiIsIueQhuaDs+axvei9piIsIuWwj+m5j+axvei9piIsIuWMl+S6rOaxvei9puiCoeS7veaciemZkOWFrOWPuCIsIuS6keW6puaWsOiDvea6kOaxvei9puaciemZkOWFrOWPuCIsCiAgICAgICAgICAgICAgICAiTklPIOiUmuadpSDvvIjkuIrmtbfvvIkiLCLmt7HlnLPohb7mgqbmlrDog73mupDmsb3ovabplIDllK7mnI3liqHmnInpmZDlhazlj7giLCLljJfkuqzmlrDog73mupDmsb3ovabogqHku73mnInpmZDlhazlj7giKQoKcGVvcDhfbnVtIDwtIGNvbXBfZGF0YSU+JQogIG11dGF0ZSjmmbrogZTmi5vogZgu5oub6IGY5Lq65pWwID0gYXMubnVtZXJpYyjmmbrogZTmi5vogZgu5oub6IGY5Lq65pWwKSklPiUKICBzZWxlY3Qo5pm66IGU5oub6IGYLuWFrOWPuOWQjeensCzmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewLOaZuuiBlOaLm+iBmC7mi5vogZjkurrmlbApJT4lCiAgZmlsdGVyKOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7AgJWluJSB0b3A4X2NvbXApJT4lCiAgZ3JvdXBfYnko5pm66IGU5oub6IGYLuWFrOWPuOWQjeensCzmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewKSU+JQogIHN1bW1hcmlzZShyZWFsID0gc3VtKOaZuuiBlOaLm+iBmC7mi5vogZjkurrmlbApKQogICN0b3Bfbig4KQoKZ2dwbG90KHBlb3A4X251bSwgYWVzKHg9cmVhbCxmaWxsPeaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7ApKSsKICAjIGdlb21fZGVuc2l0eShhbHBoYT0wLjUpKwogIGdlb21fYm94cGxvdCgpKyAKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IiksIAogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xKSkgKwogIHhsYWIoIuaLm+iBmOaVsOmHjyIpKwogIGdndGl0bGUoIuWQhOWFrOWPuOaLm+iBmOWyl+S9jemcgOaxguaVsOmHj+WIhuW4g+WbviIpCmBgYArmlbTkvZPnmoTlrabljobopoHmsYIKYGBge3J9CiMg5pW055CG5LiA5LiL5a2m5Y6GCnpsX3Blb3BsZV9kYXRhIDwtIHpsX2RhdGElPiUKICBtdXRhdGVfaWYoaXMuZmFjdG9yLCBhcy5jaGFyYWN0ZXIpCnN0cih6bF9wZW9wbGVfZGF0YSkKIyB6bF9wZW9wbGVfZGF0YSA8LSBmaWx0ZXIoemxfZGF0YSwg5pm66IGU5oub6IGYLuWtpuWOhiAlaW4lIGMoIuS4reS4ky/kuK3mioAiLCLliJ3kuK3lj4rku6XkuIsiLCLljZrlo6siLCLlpKfkuJMiLCLlrabljobkuI3pmZAiLCLmnKznp5EiLCLnoZXlo6siLCLpq5jkuK0iKSkKciA8LSB3aXRoKHpsX3Blb3BsZV9kYXRhLCB3aGljaCjmmbrogZTmi5vogZgu5a2m5Y6GPT0i5Lit5oqAIikpCnpsX3Blb3BsZV9kYXRhIDwtIHpsX3Blb3BsZV9kYXRhWy1yLCBdCgojIHN0cih6bF9wZW9wbGVfZGF0YSkKIyB0YWJsZSh6bF9wZW9wbGVfZGF0YSTmmbrogZTmi5vogZgu5a2m5Y6GKQpgYGAKCmBgYHtyfQojIOWtpuWOhueahOimgeaxggphbGxwZW9wbGVfbGV2ZWwgPC0gZGF0YS5mcmFtZSh0YWJsZSh6bF9wZW9wbGVfZGF0YSTmmbrogZTmi5vogZgu5a2m5Y6GKSkKYWxscGVvcGxlX2xldmVsCgphbGxwZW9wbGVfbGV2ZWwgPC0gYWxscGVvcGxlX2xldmVsICU+JQogIHJlbmFtZSjmlbDph48gPSBGcmVxLCDlrabljoYgPSBWYXIxKQoKIyDorr7nva7nmb7liIbmr5QKYWxscGVvcGxlX2xldmVsX2xhYmVsIDwtIGFzLnZlY3RvcihhbGxwZW9wbGVfbGV2ZWwk5a2m5Y6GKSMjIOi9rOaIkOWQkemHj++8jOWQpuWImeWbvuS+i+eahOagh+etvuWPr+iDveS4juWunumZhemhuuW6j+S4jeS4gOiHtAphbGxwZW9wbGVfbGV2ZWxfbGFiZWwgPC0gcGFzdGUoYWxscGVvcGxlX2xldmVsX2xhYmVsLCAiKCIsIHJvdW5kKChhbGxwZW9wbGVfbGV2ZWwk5pWw6YePL3N1bShhbGxwZW9wbGVfbGV2ZWwk5pWw6YePKSkqMTAwLCAyKSwgIiUpIiwgc2VwID0gIiIpICPnlKggcm91bmQoKSDlr7nnu5Pmnpzkv53nlZnkuInkvY3lsI/mlbAKCiMgQmFzaWMgcGllY2hhcnQKZ2dwbG90KGFsbHBlb3BsZV9sZXZlbCwgYWVzKHg9IiIsIHk95pWw6YePLCBmaWxsPeWtpuWOhikpICsKICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHdpZHRoPTEsIGNvbG9yPSJ3aGl0ZSIpICsKICBjb29yZF9wb2xhcigieSIsIHN0YXJ0PTApICsKICBnZW9tX3RleHQoYWVzKGxhYmVsID0g5pWw6YePKSwKICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsKICBzY2FsZV9maWxsX2Rpc2NyZXRlKGJyZWFrcyA9IGFsbHBlb3BsZV9sZXZlbCTlrabljoYsIGxhYmVscyA9IGFsbHBlb3BsZV9sZXZlbF9sYWJlbCkrIAogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IikpCmBgYAoK5ZCE5a625YWs5Y+455qE5bel6LWE55qE5Lit5L2N5pWwCgpgYGB7cn0KbGlicmFyeShnZ3B1YnIpCmhlYWQobW9uZXlfZGF0YSkKbXAxIDwtIG1vbmV5X2RhdGElPiUKICBzZWxlY3Qo5pm66IGU5oub6IGYLuWFrOWPuOWQjeensCwg5pyA5L2O6Jaq6LWEKSU+JQogIGZpbHRlcijmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewICVpbiUgdG9wOF9jb21wKSU+JQogIGdyb3VwX2J5KOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7ApJT4lCiAgc3VtbWFyaXNlKG1lZGlhbiA9IG1lZGlhbijmnIDkvY7olqrotYQpKSU+JQogIGdncGxvdChhZXMocmVvcmRlcijmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewLCAtbWVkaWFuKSxtZWRpYW4pKSsgCiAgZ2VvbV9jb2woKSsKICBnZW9tX3RleHQoYWVzKGxhYmVsPW1lZGlhbiksIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIHZqdXN0PS0wLjI1KSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwLGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpLCAKICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSkpICsKICB5bGFiKCLolqrotYQiKSsKICB4bGFiKCLlhazlj7jlkI3np7AiKSsKICBnZ3RpdGxlKCLmnIDkvY7olqrotYTkuK3kvY3mlbAiKQoKbXAyIDwtIG1vbmV5X2RhdGElPiUKICBzZWxlY3Qo5pm66IGU5oub6IGYLuWFrOWPuOWQjeensCwg5pyA5L2O6Jaq6LWEKSU+JQogIGZpbHRlcijmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewICVpbiUgdG9wOF9jb21wKSU+JQogIGdyb3VwX2J5KOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7ApJT4lCiAgc3VtbWFyaXNlKG1lYW4gPSBtZWFuKOacgOS9juiWqui1hCkpJT4lCiAgZ2dwbG90KGFlcyhyZW9yZGVyKOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7AsIC1tZWFuKSxtZWFuKSkrIAogIGdlb21fY29sKGZpbGwgPSAiIzgzZDRkMiIpKwogIGdlb21fdGV4dChhZXMobGFiZWw9bWVhbiksIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIHZqdXN0PS0wLjI1KSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwLGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpLCAKICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSkpICsKICB5bGFiKCLolqrotYQiKSsKICB4bGFiKCLlhazlj7jlkI3np7AiKSsKICBnZ3RpdGxlKCLmnIDkvY7olqrotYTlubPlnYfmlbAiKQoKZ2dhcnJhbmdlKG1wMSxtcDIsbnJvdz0xKQpgYGAKCumHjeeCueWIhuaekO+8muKAnOeQhuaDs+axvei9puKAne+8jOKAnOWwj+m5j+axvei9puKAne+8jOKAnOavlOS6mui/quKAnQoK5Y+v5Lul55yL5Yiw5LiJ5a625YWs5Y+455qE5oub6IGY5Lq65pWw5YiG5biD77yM5Y+v5Lul6YeN54K555yL5LiA5LiLNTDkurrku6XkuIrnmoTlspfkvY3pnIDmsYLmnInlk6rkupsKYGBge3J9CnRvcDNfY29tcCA8LSBjb21wX2RhdGElPiUKICBtdXRhdGUo5pm66IGU5oub6IGYLuaLm+iBmOS6uuaVsCA9IGFzLm51bWVyaWMo5pm66IGU5oub6IGYLuaLm+iBmOS6uuaVsCkpJT4lCiAgc2VsZWN0KOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7As5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCzmmbrogZTmi5vogZgu5oub6IGY5Lq65pWwKSU+JQogIGZpbHRlcijmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewICVpbiUgYygi5q+U5Lqa6L+qIiwi55CG5oOz5rG96L2mIiwi5bCP6bmP5rG96L2mIikpJT4lCiAgZ3JvdXBfYnko5pm66IGU5oub6IGYLuWFrOWPuOWQjeensCzmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewKSU+JQogIHN1bW1hcmlzZShyZWFsID0gc3VtKOaZuuiBlOaLm+iBmC7mi5vogZjkurrmlbApKQogICN0b3Bfbig4KQoKZ2dwbG90KHRvcDNfY29tcCwgYWVzKHg9cmVhbCxmaWxsPeaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7ApKSsKICBnZW9tX2RlbnNpdHkoYWxwaGE9MC41KSsKICB0aGVtZSh0ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9MTAsZmFtaWx5ID0gIkhlaXRpIFRDIExpZ2h0IiksIAogICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LCBoanVzdD0xKSkgCgpnZ3Bsb3QodG9wM19jb21wLCBhZXMoeD1yZWFsLGZpbGw95pm66IGU5oub6IGYLuWFrOWPuOWQjeensCkpKwogIGdlb21fYm94cGxvdCgpKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCxmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSwgCiAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEpKSAKYGBgCmBgYHtyfQpsZXZlbHBlb3BfbnVtIDwtIGNvbXBfZGF0YSU+JQogIG11dGF0ZSjmmbrogZTmi5vogZgu5oub6IGY5Lq65pWwID0gYXMubnVtZXJpYyjmmbrogZTmi5vogZgu5oub6IGY5Lq65pWwKSklPiUKICBzZWxlY3Qo5pm66IGU5oub6IGYLuWFrOWPuOWQjeensCzmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewLOaZuuiBlOaLm+iBmC7mi5vogZjkurrmlbAs5pm66IGU5oub6IGYLuWtpuWOhiklPiUKICBmaWx0ZXIo5pm66IGU5oub6IGYLuWFrOWPuOWQjeensCAlaW4lIHRvcDEwX2NvbXApJT4lCiAgZ3JvdXBfYnko5pm66IGU5oub6IGYLuWFrOWPuOWQjeensCzmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewKSU+JQogIHN1bW1hcmlzZShyZWFsID0gc3VtKOaZuuiBlOaLm+iBmC7mi5vogZjkurrmlbApKQoKc3RyKGxldmVscGVvcF9udW0pCgpsZXZlbHRlc3QgPC0gY29tcF9kYXRhJT4lCiAgc2VsZWN0KOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7As5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCzmmbrogZTmi5vogZgu5a2m5Y6GKQogIAphYSA9IG1lcmdlKGxldmVscGVvcF9udW0sbGV2ZWx0ZXN0LGJ5PWMoIuaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7AiLCLmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewIikpCnN0cihhYSkKaGVhZChhYSkKYGBgCgrmr5Tkuprov6oKCumcgOaxguacgOWkmueahOi/mOaYr+W3peeoi+W4iOexu+eahOWyl+S9jQotICLlk4HotKjlt6XnqIvluIgiLCLnlLXmsJTlt6XnqIvluIgiLCLova/ku7blt6XnqIvluIgiLCLova/ku7bmtYvor5Xlt6XnqIvluIgiLCLnoazku7blt6XnqIvluIgiLCLmtYvor5Xlt6XnqIvluIgiLCLpq5jnuqfnoazku7blt6XnqIvluIgiCuaKgOacr+exu+S7peWklueahOS4u+imgeWyl+S9jeaYr++8mgotICLlpKflrqLmiLfnu4/nkIYi44CBIumhueebrue7j+eQhlFNIgoKYGBge3J9CiMg5q+U5Lqa6L+qCnBlb3BfbnVtICU+JQogICMgbXV0YXRlKOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7AgPSBmY3RfcmVvcmRlcijmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewLCByZWFsKSkgJT4lIAogIGZpbHRlcijmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewPT0i5q+U5Lqa6L+qIiAmIHJlYWwgPiA1MCklPiUKICBnZ3Bsb3QoYWVzKHJlb3JkZXIo5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCwgLXJlYWwpLHJlYWwpKSsgCiAgZ2VvbV9jb2woKSsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXJlYWwpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpLCB2anVzdD0tMC4yNSkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCxmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSwgCiAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEpKSArCiAgeWxhYigi5pWw6YePIikrCiAgeGxhYigi5bKX5L2N5ZCN56ewIikKYGBgCgrnnIvkuIDkuIvpnIDopoHnmoTmioDog70KYGBge3J9CmhlYWQoemxfZGF0YSkKYGBgCgpgYGB7cn0KIyDlt6XnqIvluIjnsbvnmoQKYnlkXzAxIDwtIHpsX2RhdGEgJT4lCiAgZmlsdGVyKOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7AgPT0gIuavlOS6mui/qiIgJiDmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewICVpbiUgYygi5ZOB6LSo5bel56iL5biIIiwi55S15rCU5bel56iL5biIIiwi6L2v5Lu25bel56iL5biIIiwi6L2v5Lu25rWL6K+V5bel56iL5biIIiwi56Gs5Lu25bel56iL5biIIiwi5rWL6K+V5bel56iL5biIIiwi6auY57qn56Gs5Lu25bel56iL5biIIikpJT4lCiAgc2VsZWN0KOaZuuiBlOaLm+iBmC7ogYzkvY3lkI3np7AsIOaZuuiBlOaLm+iBmC7ogYzkvY3mj4/ov7ApJT4lCiAgbXV0YXRlKOaZuuiBlOaLm+iBmC7ogYzkvY3mj4/ov7A9YXMuY2hhcmFjdGVyKOaZuuiBlOaLm+iBmC7ogYzkvY3mj4/ov7ApKQoKIyDmlq3or40Kam9idG9rZW4gPC0gYnlkXzAxICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsIOaZuuiBlOaLm+iBmC7ogYzkvY3mj4/ov7AsIHRva2VuPWN1c3RvbWl6ZWRfdG9rZW5pemVyKQpoZWFkKGpvYnRva2VuKQpgYGAKYGBge3J9CiMg5pWw5o2u55qE5riF55CGCiMg6L+H5ruk54m55q6K5a2X5YWDCmRhdGFfc2VsZWN0IDwtIGpvYnRva2VuICU+JSAKICBmaWx0ZXIoIWdyZXBsKCdbWzpwdW5jdDpdXScsd29yZCkpICU+JSAjIOWOu+agh+eCueespuWPtwogIGZpbHRlcighZ3JlcGwoIlsnXjAtOSddIix3b3JkKSkgJT4lICMg5Y675pWw5a2XCiAgZmlsdGVyKG5jaGFyKC4kd29yZCk+MSkgCmRhdGFfc2VsZWN0CiMg566X5q+P5LiqIOiBjOS9jeWQjeensCDnmoTor43popEKIyB3b3JkX2NvdW50OmFydERhdGUsd29yZCxjb3VudAp3b3JkX2NvdW50IDwtIGRhdGFfc2VsZWN0ICU+JQogIHNlbGVjdCjmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewLCB3b3JkKSAlPiUKICBncm91cF9ieSjmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewLHdvcmQpICU+JQogIHN1bW1hcmlzZShjb3VudD1uKCkpICU+JSAgCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcKICBhcnJhbmdlKGRlc2MoY291bnQpKQoKIyAjIOeUu+WHuuaWh+Wtl+S6kQojIHdvcmRfY291bnQgJT4lCiMgICBmaWx0ZXIoISh3b3JkICVpbiUgYygi5YW35aSHIiwi6IO95YqbIiwi5LyY5YWIIiwi54af5oKJIiwi6KaB5rGCIiwi5Lu76IGMIiwi57uP6aqMIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICLlt6XkvZwiLCLotJ/otKMiLCLlhbfmnIkiLCLnm7jlhbMiLCLkuobop6MiLCJkaXYiLCJiciIpKSkgJT4lCiMgICBzZWxlY3Qod29yZCxjb3VudCkgJT4lIAojICAgZ3JvdXBfYnkod29yZCkgJT4lIAojICAgc3VtbWFyaXNlKGNvdW50ID0gc3VtKGNvdW50KSkgJT4lCiMgICBhcnJhbmdlKGRlc2MoY291bnQpKSAlPiUKIyAgIGZpbHRlcihjb3VudD4xMCkgJT4lICAgIyDov4fmu6Tmjonlh7rnjrDlpKrlsJHnmoTlrZcKIyAgIHdvcmRjbG91ZDIoY29sb3I9J3JhbmRvbS1kYXJrJykKYGBgCiFbXSjmr5Tkuprov6rlt6XnqIvluIgucG5nKQpgYGB7cn0KIyDpnZ7lt6XnqIvluIjnsbvnmoQKYnlkXzAyIDwtIHpsX2RhdGEgJT4lCiAgZmlsdGVyKOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7AgPT0gIuavlOS6mui/qiIgJiDmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewICVpbiUgYygi5aSn5a6i5oi357uP55CGIiwi6aG555uu57uP55CGUU0iKSklPiUKICBzZWxlY3Qo5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCwg5pm66IGU5oub6IGYLuiBjOS9jeaPj+i/sCklPiUKICBtdXRhdGUo5pm66IGU5oub6IGYLuiBjOS9jeaPj+i/sD1hcy5jaGFyYWN0ZXIo5pm66IGU5oub6IGYLuiBjOS9jeaPj+i/sCkpCmJ5ZF8wMgoKIyDmlq3or40Kam9idG9rZW4gPC0gYnlkXzAyICU+JSB1bm5lc3RfdG9rZW5zKHdvcmQsIOaZuuiBlOaLm+iBmC7ogYzkvY3mj4/ov7AsIHRva2VuPWN1c3RvbWl6ZWRfdG9rZW5pemVyKQoKIyDmlbDmja7nmoTmuIXnkIYKIyDov4fmu6TnibnmrorlrZflhYMKZGF0YV9zZWxlY3QgPC0gam9idG9rZW4gJT4lIAogIGZpbHRlcighZ3JlcGwoJ1tbOnB1bmN0Ol1dJyx3b3JkKSkgJT4lICMg5Y675qCH54K556ym5Y+3CiAgZmlsdGVyKCFncmVwbCgiWydeMC05J10iLHdvcmQpKSAlPiUgIyDljrvmlbDlrZcKICBmaWx0ZXIobmNoYXIoLiR3b3JkKT4xKSAKZGF0YV9zZWxlY3QKIyDnrpfmr4/kuKog5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCDnmoTor43popEKIyB3b3JkX2NvdW50OmFydERhdGUsd29yZCxjb3VudAp3b3JkX2NvdW50IDwtIGRhdGFfc2VsZWN0ICU+JQogIHNlbGVjdCjmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewLCB3b3JkKSAlPiUKICBncm91cF9ieSjmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewLHdvcmQpICU+JQogIHN1bW1hcmlzZShjb3VudD1uKCkpICU+JSAgCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcKICBhcnJhbmdlKGRlc2MoY291bnQpKQoKIyAjIOeUu+WHuuaWh+Wtl+S6kQojIHdvcmRfY291bnQgJT4lCiMgICBmaWx0ZXIoISh3b3JkICVpbiUgYygi5YW35aSHIiwi6IO95YqbIiwi5LyY5YWIIiwi54af5oKJIiwi6KaB5rGCIiwi5Lu76IGMIiwi57uP6aqMIiwKIyAgICAgICAgICAgICAgICAgICAgICAgICLlt6XkvZwiLCLotJ/otKMiLCLlhbfmnIkiLCLnm7jlhbMiLCLkuobop6MiLCJkaXYiLCJiciIpKSkgJT4lCiMgICBzZWxlY3Qod29yZCxjb3VudCkgJT4lIAojICAgZ3JvdXBfYnkod29yZCkgJT4lIAojICAgc3VtbWFyaXNlKGNvdW50ID0gc3VtKGNvdW50KSkgJT4lCiMgICBhcnJhbmdlKGRlc2MoY291bnQpKSAlPiUKIyAgIGZpbHRlcihjb3VudD41KSAlPiUgICAjIOi/h+a7pOaOieWHuueOsOWkquWwkeeahOWtlwojICAgd29yZGNsb3VkMihjb2xvcj0ncmFuZG9tLWRhcmsnKQpgYGAKIVtdKOavlOS6mui/qumdnuW3peeoi+W4iC5wbmcpCgrnkIbmg7Pmsb3ovaYKCi0g5oub6IGY5pa55ZCR5ZKM5q+U5Lqa6L+q5b6I5LiN5LiA5qC3Ci0g5oub6IGY6ZyA5rGC5pyA5aSn55qE5bKX5L2N5q+U6L6D5YGP6ZSA5ZSu5ZKM5Lqn5ZOBCi0g5YW25Lit4oCc5qCh5Zut5oub6IGY5LiT5ZGY4oCd6ZyA5rGC5q+U6L6D5aSn5Y+v6IO95piv5Li65LqG5ZCO57ut56eL5oub44CB5qCh5oub5YGa5L+d6ZqcCgpgYGB7cn0KIyDnkIbmg7Pmsb3ovaYKcGVvcF9udW0gJT4lCiAgIyBtdXRhdGUo5pm66IGU5oub6IGYLuWFrOWPuOWQjeensCA9IGZjdF9yZW9yZGVyKOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7AsIHJlYWwpKSAlPiUgCiAgZmlsdGVyKOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7A9PSLnkIbmg7Pmsb3ovaYiICYgcmVhbCA+IDMwKSU+JQogIGdncGxvdChhZXMocmVvcmRlcijmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewLCAtcmVhbCkscmVhbCkpKyAKICBnZW9tX2NvbCgpKwogIGdlb21fdGV4dChhZXMobGFiZWw9cmVhbCksIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuOSksIHZqdXN0PS0wLjI1KSArCiAgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwLGZhbWlseSA9ICJIZWl0aSBUQyBMaWdodCIpLCAKICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT00NSwgaGp1c3Q9MSkpKwogIHlsYWIoIuaVsOmHjyIpKwogIHhsYWIoIuWyl+S9jeWQjeensCIpCmBgYApgYGB7cn0KIyDnkIbmg7Pmsb3ovabkuqflk4HnsbvnmoTlspfkvY3pnIDmsYIKbHhfMDEgPC0gemxfZGF0YSAlPiUKICBmaWx0ZXIo5pm66IGU5oub6IGYLuWFrOWPuOWQjeensCA9PSAi55CG5oOz5rG96L2mIiAmIOaZuuiBlOaLm+iBmC7ogYzkvY3lkI3np7AgJWluJSBjKCLkuqflk4HkuJPlrrbvvIjplIDllK7vvIkiLCLkuqflk4HkuJPlrrYt5YyX5LqsIikpJT4lCiAgc2VsZWN0KOaZuuiBlOaLm+iBmC7ogYzkvY3lkI3np7AsIOaZuuiBlOaLm+iBmC7ogYzkvY3mj4/ov7ApJT4lCiAgbXV0YXRlKOaZuuiBlOaLm+iBmC7ogYzkvY3mj4/ov7A9YXMuY2hhcmFjdGVyKOaZuuiBlOaLm+iBmC7ogYzkvY3mj4/ov7ApKQpseF8wMQoKIyDmlq3or40Kam9idG9rZW4gPC0gbHhfMDEgJT4lIHVubmVzdF90b2tlbnMod29yZCwg5pm66IGU5oub6IGYLuiBjOS9jeaPj+i/sCwgdG9rZW49Y3VzdG9taXplZF90b2tlbml6ZXIpCgojIOaVsOaNrueahOa4heeQhgojIOi/h+a7pOeJueauiuWtl+WFgwpkYXRhX3NlbGVjdCA8LSBqb2J0b2tlbiAlPiUgCiAgZmlsdGVyKCFncmVwbCgnW1s6cHVuY3Q6XV0nLHdvcmQpKSAlPiUgIyDljrvmoIfngrnnrKblj7cKICBmaWx0ZXIoIWdyZXBsKCJbJ14wLTknXSIsd29yZCkpICU+JSAjIOWOu+aVsOWtlwogIGZpbHRlcihuY2hhciguJHdvcmQpPjEpIApkYXRhX3NlbGVjdAojIOeul+avj+S4qiDogYzkvY3lkI3np7Ag55qE6K+N6aKRCiMgd29yZF9jb3VudDphcnREYXRlLHdvcmQsY291bnQKd29yZF9jb3VudCA8LSBkYXRhX3NlbGVjdCAlPiUKICBzZWxlY3Qo5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCwgd29yZCkgJT4lCiAgZ3JvdXBfYnko5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCx3b3JkKSAlPiUKICBzdW1tYXJpc2UoY291bnQ9bigpKSAlPiUgIAogIGZpbHRlcihjb3VudD4zKSAlPiUgICMg6YGO5r++5Ye654++5aSq5bCR5qyh55qE5a2XCiAgYXJyYW5nZShkZXNjKGNvdW50KSkKCiMgIyDnlLvlh7rmloflrZfkupEKIyB3b3JkX2NvdW50ICU+JQojICAgZmlsdGVyKCEod29yZCAlaW4lIGMoIuWFt+WkhyIsIuiDveWKmyIsIuS8mOWFiCIsIueGn+aCiSIsIuimgeaxgiIsIuS7u+iBjCIsIue7j+mqjCIsCiMgICAgICAgICAgICAgICAgICAgICAgICAi5bel5L2cIiwi6LSf6LSjIiwi5YW35pyJIiwi55u45YWzIiwi5LqG6KejIiwiZGl2IiwiYnIiKSkpICU+JQojICAgc2VsZWN0KHdvcmQsY291bnQpICU+JSAKIyAgIGdyb3VwX2J5KHdvcmQpICU+JSAKIyAgIHN1bW1hcmlzZShjb3VudCA9IHN1bShjb3VudCkpICU+JQojICAgYXJyYW5nZShkZXNjKGNvdW50KSkgJT4lCiMgICBmaWx0ZXIoY291bnQ+NSkgJT4lICAgIyDov4fmu6Tmjonlh7rnjrDlpKrlsJHnmoTlrZcKIyAgIHdvcmRjbG91ZDIoY29sb3I9J3JhbmRvbS1kYXJrJykKYGBgCiFbXSjnkIbmg7Pkuqflk4EucG5nKQoK5bCP6bmP5rG96L2mCgotIOWPr+S7peeci+WHuuWwj+m5j+axvei9pgoKYGBge3J9CiMg5bCP6bmP5rG96L2mCnBlb3BfbnVtICU+JQogICMgbXV0YXRlKOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7AgPSBmY3RfcmVvcmRlcijmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewLCByZWFsKSkgJT4lIAogIGZpbHRlcijmmbrogZTmi5vogZgu5YWs5Y+45ZCN56ewPT0i5bCP6bmP5rG96L2mIiAmIHJlYWwgPiAzMCklPiUKICBnZ3Bsb3QoYWVzKHJlb3JkZXIo5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCwgLXJlYWwpLHJlYWwpKSsgCiAgZ2VvbV9jb2woKSsKICBnZW9tX3RleHQoYWVzKGxhYmVsPXJlYWwpLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjkpLCB2anVzdD0tMC4yNSkgKwogIHRoZW1lKHRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCxmYW1pbHkgPSAiSGVpdGkgVEMgTGlnaHQiKSwgCiAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9NDUsIGhqdXN0PTEpKSsKICB5bGFiKCLmlbDph48iKSsKICB4bGFiKCLlspfkvY3lkI3np7AiKQpgYGAKYGBge3J9CiMg5bCP6bmP5rG96L2m6Zu25ZSu5bKX5L2NCnhwXzAxIDwtIHpsX2RhdGEgJT4lCiAgZmlsdGVyKOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7AgPT0gIuWwj+m5j+axvei9piIgJiDmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewICVpbiUgYygi44CQ5qCh5oub44CR5paw6Zu25ZSu5Z+56K6t55Sf77yI5YWo5Zu977yJIikpJT4lCiAgc2VsZWN0KOaZuuiBlOaLm+iBmC7ogYzkvY3lkI3np7AsIOaZuuiBlOaLm+iBmC7ogYzkvY3mj4/ov7ApJT4lCiAgbXV0YXRlKOaZuuiBlOaLm+iBmC7ogYzkvY3mj4/ov7A9YXMuY2hhcmFjdGVyKOaZuuiBlOaLm+iBmC7ogYzkvY3mj4/ov7ApKQp4cF8wMQoKIyDmlq3or40Kam9idG9rZW4gPC0geHBfMDEgJT4lIHVubmVzdF90b2tlbnMod29yZCwg5pm66IGU5oub6IGYLuiBjOS9jeaPj+i/sCwgdG9rZW49Y3VzdG9taXplZF90b2tlbml6ZXIpCgojIOaVsOaNrueahOa4heeQhgojIOi/h+a7pOeJueauiuWtl+WFgwpkYXRhX3NlbGVjdCA8LSBqb2J0b2tlbiAlPiUgCiAgZmlsdGVyKCFncmVwbCgnW1s6cHVuY3Q6XV0nLHdvcmQpKSAlPiUgIyDljrvmoIfngrnnrKblj7cKICBmaWx0ZXIoIWdyZXBsKCJbJ14wLTknXSIsd29yZCkpICU+JSAjIOWOu+aVsOWtlwogIGZpbHRlcihuY2hhciguJHdvcmQpPjEpIApkYXRhX3NlbGVjdAojIOeul+avj+S4qiDogYzkvY3lkI3np7Ag55qE6K+N6aKRCiMgd29yZF9jb3VudDphcnREYXRlLHdvcmQsY291bnQKd29yZF9jb3VudCA8LSBkYXRhX3NlbGVjdCAlPiUKICBzZWxlY3Qo5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCwgd29yZCkgJT4lCiAgZ3JvdXBfYnko5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCx3b3JkKSAlPiUKICBzdW1tYXJpc2UoY291bnQ9bigpKSAlPiUgIAogIGZpbHRlcihjb3VudD4zKSAlPiUgICMg6YGO5r++5Ye654++5aSq5bCR5qyh55qE5a2XCiAgYXJyYW5nZShkZXNjKGNvdW50KSkKCiMg55S75Ye65paH5a2X5LqRCndvcmRfY291bnQgJT4lCiAgZmlsdGVyKCEod29yZCAlaW4lIGMoIuWFt+WkhyIsIuiDveWKmyIsIuS8mOWFiCIsIueGn+aCiSIsIuimgeaxgiIsIuS7u+iBjCIsIue7j+mqjCIsCiAgICAgICAgICAgICAgICAgICAgICAgIuW3peS9nCIsIui0n+i0oyIsIuWFt+aciSIsIuebuOWFsyIsIuS6huinoyIsImRpdiIsImJyIikpKSAlPiUKICAjIGZpbHRlcijolJrmnaXlrpjnvZHmoKHmi5su6IGM6IO95pSv5oyB5pa55ZCRID09ICLmlbDlrZfmioDmnK/mlrnlkJEiKSAlPiUgCiAgc2VsZWN0KHdvcmQsY291bnQpICU+JSAKICBncm91cF9ieSh3b3JkKSAlPiUgCiAgc3VtbWFyaXNlKGNvdW50ID0gc3VtKGNvdW50KSkgJT4lCiAgYXJyYW5nZShkZXNjKGNvdW50KSkgJT4lCiAgZmlsdGVyKGNvdW50PjUpICU+JSAgICMg6L+H5ruk5o6J5Ye6546w5aSq5bCR55qE5a2XCiAgd29yZGNsb3VkMihjb2xvcj0ncmFuZG9tLWRhcmsnKQpgYGAKYGBge3J9CiMg5bCP6bmP5rG96L2m6Ieq5Yqo6am+6am25bKXCnhwXzAyIDwtIHpsX2RhdGEgJT4lCiAgZmlsdGVyKOaZuuiBlOaLm+iBmC7lhazlj7jlkI3np7AgPT0gIuWwj+m5j+axvei9piIgJiDmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewICVpbiUgYygi6Ieq5Yqo6am+6am2Lei3r+W+hOinhOWIkuWSjOaOp+WItueul+azleW8gOWPkemrmOe6p+W3peeoi+W4iC/kuJPlrrYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi6Ieq5Yqo6am+6am2Lei3r+W+hOinhOWIkueul+azleW8gOWPkeS4k+Wuti/pq5jnuqfkuJPlrrYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi6Ieq5Yqo6am+6am2LeaEn+efpeeul+azleS4k+Wuti/pq5jnuqfkuJPlrrbvvIjmt7HluqblrabkuaDmlrnlkJHvvIkiKSklPiUKICBzZWxlY3Qo5pm66IGU5oub6IGYLuiBjOS9jeWQjeensCwg5pm66IGU5oub6IGYLuiBjOS9jeaPj+i/sCklPiUKICBtdXRhdGUo5pm66IGU5oub6IGYLuiBjOS9jeaPj+i/sD1hcy5jaGFyYWN0ZXIo5pm66IGU5oub6IGYLuiBjOS9jeaPj+i/sCkpCnhwXzAyCgojIOaWreivjQpqb2J0b2tlbiA8LSB4cF8wMSAlPiUgdW5uZXN0X3Rva2Vucyh3b3JkLCDmmbrogZTmi5vogZgu6IGM5L2N5o+P6L+wLCB0b2tlbj1jdXN0b21pemVkX3Rva2VuaXplcikKCiMg5pWw5o2u55qE5riF55CGCiMg6L+H5ruk54m55q6K5a2X5YWDCmRhdGFfc2VsZWN0IDwtIGpvYnRva2VuICU+JSAKICBmaWx0ZXIoIWdyZXBsKCdbWzpwdW5jdDpdXScsd29yZCkpICU+JSAjIOWOu+agh+eCueespuWPtwogIGZpbHRlcighZ3JlcGwoIlsnXjAtOSddIix3b3JkKSkgJT4lICMg5Y675pWw5a2XCiAgZmlsdGVyKG5jaGFyKC4kd29yZCk+MSkgCmRhdGFfc2VsZWN0CiMg566X5q+P5LiqIOiBjOS9jeWQjeensCDnmoTor43popEKIyB3b3JkX2NvdW50OmFydERhdGUsd29yZCxjb3VudAp3b3JkX2NvdW50IDwtIGRhdGFfc2VsZWN0ICU+JQogIHNlbGVjdCjmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewLCB3b3JkKSAlPiUKICBncm91cF9ieSjmmbrogZTmi5vogZgu6IGM5L2N5ZCN56ewLHdvcmQpICU+JQogIHN1bW1hcmlzZShjb3VudD1uKCkpICU+JSAgCiAgZmlsdGVyKGNvdW50PjMpICU+JSAgIyDpgY7mv77lh7rnj77lpKrlsJHmrKHnmoTlrZcKICBhcnJhbmdlKGRlc2MoY291bnQpKQoKIyDnlLvlh7rmloflrZfkupEKd29yZF9jb3VudCAlPiUKICBmaWx0ZXIoISh3b3JkICVpbiUgYygi5YW35aSHIiwi6IO95YqbIiwi5LyY5YWIIiwi54af5oKJIiwi6KaB5rGCIiwi5Lu76IGMIiwi57uP6aqMIiwKICAgICAgICAgICAgICAgICAgICAgICAi5bel5L2cIiwi6LSf6LSjIiwi5YW35pyJIiwi55u45YWzIiwi5LqG6KejIiwiZGl2IiwiYnIiKSkpICU+JQogICMgZmlsdGVyKOiUmuadpeWumOe9keagoeaLmy7ogYzog73mlK/mjIHmlrnlkJEgPT0gIuaVsOWtl+aKgOacr+aWueWQkSIpICU+JSAKICBzZWxlY3Qod29yZCxjb3VudCkgJT4lIAogIGdyb3VwX2J5KHdvcmQpICU+JSAKICBzdW1tYXJpc2UoY291bnQgPSBzdW0oY291bnQpKSAlPiUKICBhcnJhbmdlKGRlc2MoY291bnQpKSAlPiUKICBmaWx0ZXIoY291bnQ+NSkgJT4lICAgIyDov4fmu6Tmjonlh7rnjrDlpKrlsJHnmoTlrZcKICB3b3JkY2xvdWQyKGNvbG9yPSdyYW5kb20tZGFyaycpCmBgYAo=