21:38:47, 20 - 01 - 2024

Nhiệm vụ 2.1


Đọc dữ liệu vào R

File được sử dụng có tên là “Productivity.xls” trong Sample data

library(readxl) # Gọi package "xlsx" để sử dụng
d <- file.choose() # Gán đường dẫn file vào d
d # Tên đường dẫn file
## [1] "D:\\Rpubs\\Productivity.xls"
pro <- read_excel(d) # Lệnh đọc file excel và gán vào pro

Thông tin về dữ liệu

is.data.frame(pro) # Kiểm tra dữ liệu có phải là data frame không
## [1] TRUE

Với kết quả trên thì dữ liệu là data frame

length(pro) # Xem dữ liệu có bao nhiêu biến
## [1] 10
names(pro) # Xem tên biến
##  [1] "STATE" "YR"    "P_CAP" "HWY"   "WATER" "UTIL"  "PC"    "GSP"   "EMP"  
## [10] "UNEMP"

Chú thích:

  • STATE: Tên tiểu bang
  • YR: Năm
  • P_CAP: Vốn đầu tư công
  • HWY: Vốn đầu tư đường cao tốc
  • WATER: Vốn đầu tư nhà máy nước
  • UTIL: Vốn tiện ích
  • PC: Vốn tư nhân
  • GSP: Sản lượng của tiểu bang
  • EMP: Nhân dụng
  • UNEMP: Tỷ lệ thất nghiệp

Sau đây ta sử dụng lệnh skim từ package “skimr” để biết thêm vài thông tin chi tiết về dữ liệu

library(skimr) # Gọi ra package "skimr" 
skim(pro) # Lệnh mô tả dữ liệu
Data summary
Name pro
Number of rows 816
Number of columns 10
_______________________
Column type frequency:
character 1
numeric 9
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
STATE 0 1 4 14 0 48 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
YR 0 1 1978.00 4.90 1970.00 1974.00 1978.00 1982.00 1986.00 ▇▆▆▆▇
P_CAP 0 1 25036.66 27780.40 2627.12 7096.66 17572.46 27691.57 140217.32 ▇▁▁▁▁
HWY 0 1 10218.42 9253.60 1827.14 3857.86 7556.35 11266.55 47699.42 ▇▂▁▁▁
WATER 0 1 3618.78 4311.74 228.46 764.51 2266.49 4318.70 24592.33 ▇▁▁▁▁
UTIL 0 1 11199.45 14768.87 538.49 2488.33 7008.81 11598.47 80728.14 ▇▂▁▁▁
PC 0 1 58188.29 59770.78 4052.71 21651.39 40671.21 64796.27 375341.60 ▇▁▁▁▁
GSP 0 1 61014.32 69973.90 4354.00 16502.50 39987.00 68126.00 464550.00 ▇▁▁▁▁
EMP 0 1 1747.10 1855.99 108.30 475.02 1164.80 2114.10 11258.00 ▇▂▁▁▁
UNEMP 0 1 6.60 2.23 2.80 5.00 6.20 7.90 18.00 ▇▇▂▁▁

Ta thấy được kết quả ở bảng 1 là tên của data là pro gồm 816 quan sát và 10 biến. Ở bảng 2 thì ta biết được có 9 biến dạng số(numeric) và 1 biến dạng ký tự(character). Ở bảng 3 cho ta biết được tên của các biến ký tự là “STATE”. Ở bảng 4 cho ta biết được tên các biến dạng số lần lượt là: “YR”, “P_CAP”, “HWY”, “WATER”, “UTIL”, “PC”, “GSP”, “EMP”, “UNEMP”. Trong đó biến “YR” là biến về thời gian nên không thể phép toán không có ý nghĩa.

Ý nghĩa tên các cột của bảng 3 và bảng 4:

  • skim_variable: Tên biến
  • n_missing: Số lượng giá trị thiếu
  • complete_rate: Tỷ lệ hoàn chỉnh
  • mean: Giá trị trung bình
  • sd: Độ lệch chuẩn
  • p0: Giá trị nhỏ nhất
  • p25: Phân vị thứ nhất
  • p50: Trung vị
  • p75: Phân vị thứ 3
  • p100: Giá trị lớn nhất
  • hist: Biếu đồ histogram

Rút trích dữ liệu

Ta sẽ rút trích dữ liệu bằng 2 cách:

  • Dùng những lệnh base của R
  • Dùng những lệnh trong package “tidyverse”

Base

Ta tiến hành đổi tên để dễ thực hiện các thao tác

names(pro) <- c("TB","Năm","VCô","CT", "Nước", "Tiện","Tư","Q","ND","7")# Lệnh đổi tên biến
names(pro)
##  [1] "TB"   "Năm"  "VCô"  "CT"   "Nước" "Tiện" "Tư"   "Q"    "ND"   "7"

Bộ dữ liệu bao gồm 48 nước và được quan sát từ năm 1970 đến năm 1986

a <- table(pro$TB) # Lệnh xem các tiểu bang được quan sát
dim(a) # Lượng tiểu bang được quan sát
## [1] 48
head(a,4) # Tên 4 tiểu bang đầu được quan sát
## 
##    ALABAMA    ARIZONA   ARKANSAS CALIFORNIA 
##         17         17         17         17
b <- table(pro$Năm) # Lệnh xem thời điểm quan sát
dim(b) # Thời gian quan sát
## [1] 17

Ta chỉ cần 4 biến là “TB”, “Năm”, “VCông”, “Q”

pro4 <- pro[,c(1,2,3,8)]

Ta sẽ tạo ra 3 bộ dữ liệu bao gồm:

  • Các quan sát từ bang CALIFORNIA
  • Các quan sát trong năm 1975
  • Các quan sát của bang FLORIDA và ALABAMA từ năm 1975 tới 1985
cali <- pro4[ pro$TB== "CALIFORNIA",] # Lệnh rút ra quan sát từ CALIFORNIA
n1975 <- pro4[pro$Năm== 1975,] # Lệnh rút ra quan sát từ năm 1975
# Lệnh rút ra quan sát của của bang FLORIDA và ALABAMA từ năm 1975 tới 1985
floala <- pro4[pro4$TB== "FLORIDA" | pro4$TB=="ALABAMA" & pro4$Năm >= 1975 &pro4$Năm<=1985,] 

Ta sẽ xem qua lượng quan sát và 3 dữ liệu đầu của 3 bộ dữ liệu trên

# Lệnh xem lượng quan sát của "cali"
dim(cali)
## [1] 17  4
# Lệnh xem 3 dữ liệu đầu của "cali"
head(cali,3)
## # A tibble: 3 × 4
##   TB           Năm     VCô      Q
##   <chr>      <dbl>   <dbl>  <dbl>
## 1 CALIFORNIA  1970 128545. 263933
## 2 CALIFORNIA  1971 132263. 265600
## 3 CALIFORNIA  1972 134452. 281159
# Lệnh xem lượng quan sát của "n1975"
dim(n1975)
## [1] 48  4
# Lệnh xem 3 dữ liệu đầu của "n1975"
head(n1975,3)
## # A tibble: 3 × 4
##   TB         Năm    VCô     Q
##   <chr>    <dbl>  <dbl> <dbl>
## 1 ALABAMA   1975 17316. 33604
## 2 ARIZONA   1975 12929. 24915
## 3 ARKANSAS  1975  8651. 19024
# Lệnh xem lượng quan sát của "floala"
dim(floala)
## [1] 28  4
# Lệnh xem 3 dữ liệu đầu của "floala"
head(floala,3)
## # A tibble: 3 × 4
##   TB        Năm    VCô     Q
##   <chr>   <dbl>  <dbl> <dbl>
## 1 ALABAMA  1975 17316. 33604
## 2 ALABAMA  1976 17733. 35764
## 3 ALABAMA  1977 18112. 37463

Ta sẽ tạo 1 biến là tốc độ để phản ánh sự tăng hoặc giảm của sản lượng giữa 2 năm liên tiếp với công thức \(Tốc độ = (SLn - SLn-1)/SLn-1\)

SLn: Là sản lượng ở năm cần tính SLn-1: Là sản lượng ở năm trước

sln <- pro[pro$Năm>= 1971 & pro$Năm<=1986,] # Lệnh tạo ra biến SLn
sln1 <- pro[pro$Năm>=1970 & pro$Năm <=1985,]# Lệnh tạo ra biến SLn-1
TĐ <- (sln$Q-sln1$Q)/sln1$Q # Lệnh tạo ra biến tốc độ

Tidyverse

Package “Tidyverse” là một package chuyên sử dụng cho việc Data manipulation nên sẽ rất phù hợp trong việc rút trích dữ liệu trong mục này. Trong package có toán tử pipe %<% là 1 công cụ giúp việc thực hiện các câu lệnh dễ dàng hơn. Ý nghĩa của toán tử pipe là tiếp đến là. Sau đây là 1 câu lệnh để ví dụ cho toán tử pipe.

library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.4.4     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
pro4.1 <- pro %>% select(TB, Năm,VCô,Q) # Lệnh chọn ra 4 biến
# Với câu lệnh trên R sẽ hiểu là chọn đối tượng pro tiếp đến là chọn biến TB, Năm, VCô, Q
names(pro4.1)

Ta sẽ tiến hành đổi tên biến cho pro để phân biệt với gói base

pro.1 <- pro %>% rename(VC = VCô, SL=Q, TN = 7 )# Lệnh đổi tên cho các cột được chỉ định
names(pro.1)
##  [1] "TB"   "Năm"  "VC"   "CT"   "Nước" "Tiện" "TN"   "SL"   "ND"   "7"

Và tiếp tục ta sẽ dùng lệnh filter để tạo ra 3 bộ dữ liệu:

  • Các quan sát từ bang CALIFORNIA
  • Các quan sát trong năm 1975
  • Các quan sát của bang FLORIDA và ALABAMA từ năm 1975 tới 1985
cali.1 <- pro4.1 %>% filter(TB == "CALIFORNIA") # Lệnh rút ra các quan sát từ bang CALIFORNIA
n1975.1 <- pro4.1 %>% filter(Năm == 1975) # Lệnh rút ra các quan sát từ năm 1975
# Lệnh rút ra quan sát của bang FLORIDA và ALABAMA từ năm 1975 tới 1985
floala.1 <- pro4.1 %>% filter(TB == "FLORIDA" | TB=="ALABAMA"& Năm>=1975 & Năm<=1985)

Sau đây ta sẽ tạo ra biến tốc độ để phản ánh sự tăng hoặc giảm của sản lượng giữa 2 năm liên tiếp với công thức \(Tốc độ = (SLn - SLn-1)/SLn-1\) và ghép vào sln. Do ta chưa đổi tên của 2 bộ dữ liệu sln và sln1 nên ta sẽ đổi tên trong câu lệnh sau

sln <- sln %>% rename(SL = Q) # Đổi tên biến Q thành SL của sln
sln1 <- sln1 %>% rename(SL =Q) # Đổi tên biến Q thành SL của sln1
sln <- sln %>% mutate(TĐ.1 = (SL - sln1$SL)*100/sln$SL)# Tạo ra biến TĐ.1 và ghép vào sln1
head(sln,3)
## # A tibble: 3 × 11
##   TB        Năm    VCô    CT  Nước  Tiện     Tư    SL    ND   `7`  TĐ.1
##   <chr>   <dbl>  <dbl> <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 ALABAMA  1971 15502. 7526. 1721. 6255. 37300. 29375 1022.   5.2  3.26
## 2 ALABAMA  1972 15972. 7765. 1765. 6442. 38670. 31303 1072.   4.7  6.16
## 3 ALABAMA  1973 16406. 7908. 1742. 6756. 40084. 33430 1136.   3.9  6.36

Nhiệm vụ 2.2

Tóm tắt

Bộ dữ liệu điều tra các yếu tố khiến một người rời bỏ công việc hiện tại để nghiên cứu nhân sự.

Giới thiệu

Bộ dữ liệu HR Analytics: Job Change Of Data Scientists là một bộ dữ liệu bảng được lấy từ website: Kaggle đây là nguồn khá phổ biến cho ai muốn thực hành với những dữ liệu đã làm sạch.

  • Sử dụng tidyverse để thực hiện Data manipulation

    • Mô tả về bộ dữ liệu.

    • Rút trích các dữ liệu theo yêu cầu

    • Tạo dữ liệu mới

Mô tả dữ liệu

  • Đọc dữ liệu
d <- file.choose() # Lệnh gán đường dẫn của dữ liệu
nv <- read.csv(d)# Lệnh đọc dữ liệu 
  • Mô tả dữ liệu
str(nv) # Lệnh mô tả cấu trúc dữ liệu
## 'data.frame':    2129 obs. of  13 variables:
##  $ enrollee_id           : int  32403 9858 31806 27385 27724 217 21465 27302 12994 16287 ...
##  $ city                  : chr  "city_41" "city_103" "city_21" "city_13" ...
##  $ city_development_index: num  0.827 0.92 0.624 0.827 0.92 0.899 0.624 0.92 0.878 0.624 ...
##  $ gender                : chr  "Male" "Female" "Male" "Male" ...
##  $ relevent_experience   : chr  "Has relevent experience" "Has relevent experience" "No relevent experience" "Has relevent experience" ...
##  $ enrolled_university   : chr  "Full time course" "no_enrollment" "no_enrollment" "no_enrollment" ...
##  $ education_level       : chr  "Graduate" "Graduate" "High School" "Masters" ...
##  $ major_discipline      : chr  "STEM" "STEM" "" "STEM" ...
##  $ experience            : chr  "9" "5" "<1" "11" ...
##  $ company_size          : chr  "<10" "" "" "10/49" ...
##  $ company_type          : chr  "" "Pvt Ltd" "Pvt Ltd" "Pvt Ltd" ...
##  $ last_new_job          : chr  "1" "1" "never" "1" ...
##  $ training_hours        : int  21 98 15 39 72 12 11 81 2 4 ...

Theo như kết quả cho ta biết được:

  • Cấu trúc của dữ liệu là data frame

  • Dữ liệu bao gồm 2129 quan sát và 13 biến

  • Có 10 biến là ký tự

  • Có 3 biến ở dạng số

  • Ý nghĩa tên biến:

    • enrollee_id : ID của ứng viên
    • city: Mã thành phố
    • city_ development _index : Chỉ số phát triển của thành phố (tỷ lệ)
    • gender: Giới tính của ứng viên
    • relevent_experience: Kinh nghiệm liên quan của ứng viên
    • enrolled_university: Loại khóa học Đại học đã đăng kí nếu có
    • education_level: Trình độ học vấn của ứng viên
    • major_discipline : Trình độ học vấn chuyên nghành của ứng viên
    • experience: Tổng số năm kinh nghiệm của ứng viên
    • company_size: Số lượng nhân viên trong công ty của chủ lao động hiện tại
    • company_type : Loại nhà tuyển dụng hiện tại
    • last_new_job: Sự khác biệt về số năm giữa công việc trước đây và công việc hiện tại
    • training_hours: Số giờ đào tạo đã hoàn thành

Ta sẽ xem bộ dữ liệu này có giá trị thiếu hay không

sum(is.na(nv))
## [1] 0

Như kết quả trên cho thấy đc bộ dữ liệu không có giá trị thiếu nên không cần xử lý gì thêm ## Rút trích dữ liệu Ta sẽ chọn ra 7 biến đó chính là “enrollee_id”, “city”, “gender”, “education_level”, “major_discipline”, “experience”,“training_hours”. Và ta tạo ra những bộ dữ liệu nhỏ bao gồm:

  • Các quan sát là nam
  • Các quan sát chỉ ở trình độ đại học
  • Các quan sát có trên 10 năm kinh nghiệm
  • Các quan sát có trên 100 giờ đào tạo
  • Các quan sát có trình độ cấp 3 và có trên 5 năm kinh nghiệm
library(tidyverse)# Gọi package tidyverse
# Lệnh chọn ra các biến cần thiết
nv1 <- nv %>% select(enrollee_id,city,gender,education_level,major_discipline,experience,training_hours)
# Lệnh rút ra các quan sát là nam
nam <- nv1 %>% filter(gender == "Male")
# Lệnh rút ra các quan sát chỉ là trình độ đại học                      
đh <- nv1 %>%  filter(education_level == "Graduate")
# Lệnh rút ra các quan sát trên 10 năm kinh nghiệm
kn10 <- nv1 %>% filter(experience >=10 | experience == ">20")
# Lệnh rút ra các quan sát trên 100 giờ đào tạo
h100 <- nv1 %>%  filter(training_hours >= 100)
# Lệnh rút ra các quan sát có trình độ cấp 3 và có trên 5 năm kinh nghiệm
e3e5 <- nv1 %>%
                filter( education_level == "High School") %>%
                filter(experience >=5 | experience == ">20")

Sau đây ta sẽ xem thử lượng quan sát của các bộ dữ liệu và xem qua các dữ liệu

# Lượng quan sát của "nam"
dim(nam)
## [1] 1460    7
# Xem 3 dữ liệu đầu của "nam"
head(nam,3)
##   enrollee_id    city gender education_level major_discipline experience
## 1       32403 city_41   Male        Graduate             STEM          9
## 2       31806 city_21   Male     High School                          <1
## 3       27385 city_13   Male         Masters             STEM         11
##   training_hours
## 1             21
## 2             15
## 3             39
# Lượng quan sát của "đh"
dim(đh)
## [1] 1269    7
# Xem 3 dữ liệu đầu của "đh"
head(đh,3)
##   enrollee_id     city gender education_level major_discipline experience
## 1       32403  city_41   Male        Graduate             STEM          9
## 2        9858 city_103 Female        Graduate             STEM          5
## 3       27724 city_103   Male        Graduate             STEM        >20
##   training_hours
## 1             21
## 2             98
## 3             72
# Lượng quan sát của "kn10"
dim(kn10)
## [1] 1994    7
# Xem 3 dữ liệu đầu của "kn10"
head(kn10,3)
##   enrollee_id     city gender education_level major_discipline experience
## 1       32403  city_41   Male        Graduate             STEM          9
## 2        9858 city_103 Female        Graduate             STEM          5
## 3       27385  city_13   Male         Masters             STEM         11
##   training_hours
## 1             21
## 2             98
## 3             39
# Lượng quan sát của "h100"
dim(h100)
## [1] 434   7
# Xem 3 dữ liệu đầu của "h100"
head(h100, 3)
##   enrollee_id     city gender education_level major_discipline experience
## 1       10856 city_103   Male         Masters            Other        >20
## 2       24372  city_98                Masters             STEM          4
## 3       24914  city_21               Graduate             STEM         13
##   training_hours
## 1            196
## 2            134
## 3            125
# Lượng dữ liệu của "e3e5" 
dim(e3e5)
## [1] 88  7
# Xem 3 dữ liệu của "e3e5"

Tạo dữ liệu mới

Ta sẽ tạo ra 1 biến mới là tiền thưởng cuối năm của các nhân viên với công thức như sau \(thưởng = (20*số giờ đào tạo)*(1+ chỉ số phát triển)\)

# Lệnh tạo ra biến mới và ghép vào nv
nv <- nv %>% mutate(Thưởng = (20*training_hours)*(1+ city_development_index)) 
# Xem 3 dữ liệu đầu của "Thưởng"
head(nv$Thưởng)
## [1]  767.34 3763.20  487.20 1425.06 2764.80  455.76
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAyIg0KYXV0aG9yOiAiTMO9IFbEqW5oIE5naGkiDQpkYXRlOiAiMjAyNC0wMS0xNiINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUcnVlDQogICAgdG9jX2Zsb2F0OiBUcnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KICB3b3JkX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCmByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYA0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGAgDQoNCiMgKipOaGnhu4dtIHbhu6UgMi4xKioNCg0KKioqDQoNCiMjIMSQ4buNYyBk4buvIGxp4buHdSB2w6BvIFINCg0KRmlsZSDEkcaw4bujYyBz4butIGThu6VuZyBjw7MgdMOqbiBsw6AgIlByb2R1Y3Rpdml0eS54bHMiIHRyb25nIFtTYW1wbGUgZGF0YV0oaHR0cHM6Ly9kcml2ZS5nb29nbGUuY29tL2RyaXZlL2ZvbGRlcnMvMUtHd3ZpLUJpUnA5VWlTNjlCdnhKS292U1NuR0FZX29pKQ0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZWFkeGwpICMgR+G7jWkgcGFja2FnZSAieGxzeCIgxJHhu4Mgc+G7rSBk4bulbmcNCmQgPC0gZmlsZS5jaG9vc2UoKSAjIEfDoW4gxJHGsOG7nW5nIGThuqtuIGZpbGUgdsOgbyBkDQpkICMgVMOqbiDEkcaw4budbmcgZOG6q24gZmlsZQ0KcHJvIDwtIHJlYWRfZXhjZWwoZCkgIyBM4buHbmggxJHhu41jIGZpbGUgZXhjZWwgdsOgIGfDoW4gdsOgbyBwcm8NCmBgYA0KIyMgVGjDtG5nIHRpbiB24buBIGThu68gbGnhu4d1DQpgYGB7cn0NCmlzLmRhdGEuZnJhbWUocHJvKSAjIEtp4buDbSB0cmEgZOG7ryBsaeG7h3UgY8OzIHBo4bqjaSBsw6AgZGF0YSBmcmFtZSBraMO0bmcNCmBgYA0KVuG7m2kga+G6v3QgcXXhuqMgdHLDqm4gdGjDrCBk4buvIGxp4buHdSBsw6AgZGF0YSBmcmFtZQ0KYGBge3J9DQpsZW5ndGgocHJvKSAjIFhlbSBk4buvIGxp4buHdSBjw7MgYmFvIG5oacOqdSBiaeG6v24NCm5hbWVzKHBybykgIyBYZW0gdMOqbiBiaeG6v24NCmBgYA0KQ2jDuiB0aMOtY2g6IA0KDQoqICoqU1RBVEUqKjogVMOqbiB0aeG7g3UgYmFuZw0KKiAqKllSKio6IE7Eg20NCiogKipQX0NBUCoqOiBW4buRbiDEkeG6p3UgdMawIGPDtG5nDQoqICoqSFdZKio6IFbhu5FuIMSR4bqndSB0xrAgxJHGsOG7nW5nIGNhbyB04buRYw0KKiAqKldBVEVSKio6IFbhu5FuIMSR4bqndSB0xrAgbmjDoCBtw6F5IG7GsOG7m2MNCiogKipVVElMKio6IFbhu5FuIHRp4buHbiDDrWNoDQoqICoqUEMqKjogVuG7kW4gdMawIG5ow6JuDQoqICoqR1NQKio6IFPhuqNuIGzGsOG7o25nIGPhu6dhIHRp4buDdSBiYW5nDQoqICoqRU1QKio6IE5ow6JuIGThu6VuZw0KKiAqKlVORU1QKio6IFThu7cgbOG7hyB0aOG6pXQgbmdoaeG7h3ANCg0KU2F1IMSRw6J5IHRhIHPhu60gZOG7pW5nIGzhu4duaCBza2ltIHThu6sgcGFja2FnZSAic2tpbXIiIMSR4buDIGJp4bq/dCB0aMOqbSB2w6BpIHRow7RuZyB0aW4gY2hpIHRp4bq/dCB24buBIGThu68gbGnhu4d1DQoNCmBgYHtyIHBhZ2VkLnByaW50PVRSVUV9DQpsaWJyYXJ5KHNraW1yKSAjIEfhu41pIHJhIHBhY2thZ2UgInNraW1yIiANCnNraW0ocHJvKSAjIEzhu4duaCBtw7QgdOG6oyBk4buvIGxp4buHdQ0KYGBgDQoNClRhIHRo4bqleSDEkcaw4bujYyBr4bq/dCBxdeG6oyDhu58gYuG6o25nIDEgbMOgIHTDqm4gY+G7p2EgZGF0YSBsw6AgcHJvIGfhu5NtIDgxNiBxdWFuIHPDoXQgdsOgIDEwIGJp4bq/bi4g4bueIGLhuqNuZyAyIHRow6wgdGEgYmnhur90IMSRxrDhu6NjIGPDsyA5IGJp4bq/biBk4bqhbmcgc+G7kShudW1lcmljKSB2w6AgMSBiaeG6v24gZOG6oW5nIGvDvSB04buxKGNoYXJhY3RlcikuIOG7niBi4bqjbmcgMyBjaG8gdGEgYmnhur90IMSRxrDhu6NjIHTDqm4gY+G7p2EgY8OhYyBiaeG6v24ga8O9IHThu7EgbMOgICJTVEFURSIuIOG7niBi4bqjbmcgNCBjaG8gdGEgYmnhur90IMSRxrDhu6NjIHTDqm4gY8OhYyBiaeG6v24gZOG6oW5nIHPhu5EgbOG6p24gbMaw4bujdCBsw6A6ICJZUiIsICJQX0NBUCIsICJIV1kiLCAiV0FURVIiLCAiVVRJTCIsICJQQyIsICJHU1AiLCAiRU1QIiwgIlVORU1QIi4gVHJvbmcgxJHDsyBiaeG6v24gIllSIiBsw6AgYmnhur9uIHbhu4EgdGjhu51pIGdpYW4gbsOqbiBraMO0bmcgdGjhu4MgcGjDqXAgdG/DoW4ga2jDtG5nIGPDsyDDvSBuZ2jEqWEuDQoNCsOdIG5naMSpYSB0w6puIGPDoWMgY+G7mXQgY+G7p2EgYuG6o25nIDMgdsOgIGLhuqNuZyA0Og0KDQoqIHNraW1fdmFyaWFibGU6IFTDqm4gYmnhur9uDQoqIG5fbWlzc2luZzogU+G7kSBsxrDhu6NuZyBnacOhIHRy4buLIHRoaeG6v3UNCiogY29tcGxldGVfcmF0ZTogVOG7tyBs4buHIGhvw6BuIGNo4buJbmgNCiogbWVhbjogR2nDoSB0cuG7iyB0cnVuZyBiw6xuaA0KKiBzZDogxJDhu5kgbOG7h2NoIGNodeG6qW4NCiogcDA6IEdpw6EgdHLhu4sgbmjhu48gbmjhuqV0DQoqIHAyNTogUGjDom4gduG7iyB0aOG7qSBuaOG6pXQNCiogcDUwOiBUcnVuZyB24buLIA0KKiBwNzU6IFBow6JuIHbhu4sgdGjhu6kgMw0KKiBwMTAwOiBHacOhIHRy4buLIGzhu5tuIG5o4bqldA0KKiBoaXN0OiBCaeG6v3UgxJHhu5MgaGlzdG9ncmFtDQoNCiMjIFLDunQgdHLDrWNoIGThu68gbGnhu4d1ICB7LnRhYnNldCAudGFic2V0LXBpbGxzfQ0KVGEgc+G6vSByw7p0IHRyw61jaCBk4buvIGxp4buHdSBi4bqxbmcgMiBjw6FjaDoNCg0KKiBEw7luZyBuaOG7r25nIGzhu4duaCBiYXNlIGPhu6dhIFINCiogRMO5bmcgbmjhu69uZyBs4buHbmggdHJvbmcgcGFja2FnZSAidGlkeXZlcnNlIg0KDQojIyMgQmFzZQ0KVGEgdGnhur9uIGjDoG5oIMSR4buVaSB0w6puIMSR4buDIGThu4UgdGjhu7FjIGhp4buHbiBjw6FjIHRoYW8gdMOhYw0KYGBge3J9DQpuYW1lcyhwcm8pIDwtIGMoIlRCIiwiTsSDbSIsIlZDw7QiLCJDVCIsICJOxrDhu5tjIiwgIlRp4buHbiIsIlTGsCIsIlEiLCJORCIsIjciKSMgTOG7h25oIMSR4buVaSB0w6puIGJp4bq/bg0KbmFtZXMocHJvKQ0KYGBgDQpC4buZIGThu68gbGnhu4d1IGJhbyBn4buTbSA0OCBuxrDhu5tjIHbDoCDEkcaw4bujYyBxdWFuIHPDoXQgdOG7qyBuxINtIDE5NzAgxJHhur9uIG7Eg20gMTk4Ng0KYGBge3J9DQphIDwtIHRhYmxlKHBybyRUQikgIyBM4buHbmggeGVtIGPDoWMgdGnhu4N1IGJhbmcgxJHGsOG7o2MgcXVhbiBzw6F0DQpkaW0oYSkgIyBMxrDhu6NuZyB0aeG7g3UgYmFuZyDEkcaw4bujYyBxdWFuIHPDoXQNCmhlYWQoYSw0KSAjIFTDqm4gNCB0aeG7g3UgYmFuZyDEkeG6p3UgxJHGsOG7o2MgcXVhbiBzw6F0DQpiIDwtIHRhYmxlKHBybyROxINtKSAjIEzhu4duaCB4ZW0gdGjhu51pIMSRaeG7g20gcXVhbiBzw6F0DQpkaW0oYikgIyBUaOG7nWkgZ2lhbiBxdWFuIHPDoXQNCmBgYA0KVGEgY2jhu4kgY+G6p24gNCBiaeG6v24gbMOgICJUQiIsICJOxINtIiwgIlZDw7RuZyIsICJRIg0KYGBge3J9DQpwcm80IDwtIHByb1ssYygxLDIsMyw4KV0NCmBgYA0KVGEgc+G6vSB04bqhbyByYSAzIGLhu5kgZOG7ryBsaeG7h3UgYmFvIGfhu5NtOg0KDQoqIEPDoWMgcXVhbiBzw6F0IHThu6sgYmFuZyBDQUxJRk9STklBDQoqIEPDoWMgcXVhbiBzw6F0IHRyb25nIG7Eg20gMTk3NQ0KKiBDw6FjIHF1YW4gc8OhdCBj4bunYSBiYW5nIEZMT1JJREEgdsOgIEFMQUJBTUEgdOG7qyBuxINtIDE5NzUgdOG7m2kgMTk4NQ0KDQpgYGB7cn0NCmNhbGkgPC0gcHJvNFsgcHJvJFRCPT0gIkNBTElGT1JOSUEiLF0gIyBM4buHbmggcsO6dCByYSBxdWFuIHPDoXQgdOG7qyBDQUxJRk9STklBDQpuMTk3NSA8LSBwcm80W3BybyROxINtPT0gMTk3NSxdICMgTOG7h25oIHLDunQgcmEgcXVhbiBzw6F0IHThu6sgbsSDbSAxOTc1DQojIEzhu4duaCByw7p0IHJhIHF1YW4gc8OhdCBj4bunYSBj4bunYSBiYW5nIEZMT1JJREEgdsOgIEFMQUJBTUEgdOG7qyBuxINtIDE5NzUgdOG7m2kgMTk4NQ0KZmxvYWxhIDwtIHBybzRbcHJvNCRUQj09ICJGTE9SSURBIiB8IHBybzQkVEI9PSJBTEFCQU1BIiAmIHBybzQkTsSDbSA+PSAxOTc1ICZwcm80JE7Eg208PTE5ODUsXSANCmBgYA0KVGEgc+G6vSB4ZW0gcXVhIGzGsOG7o25nIHF1YW4gc8OhdCB2w6AgMyBk4buvIGxp4buHdSDEkeG6p3UgY+G7p2EgMyBi4buZIGThu68gbGnhu4d1IHRyw6puDQpgYGB7cn0NCiMgTOG7h25oIHhlbSBsxrDhu6NuZyBxdWFuIHPDoXQgY+G7p2EgImNhbGkiDQpkaW0oY2FsaSkNCiMgTOG7h25oIHhlbSAzIGThu68gbGnhu4d1IMSR4bqndSBj4bunYSAiY2FsaSINCmhlYWQoY2FsaSwzKQ0KIyBM4buHbmggeGVtIGzGsOG7o25nIHF1YW4gc8OhdCBj4bunYSAibjE5NzUiDQpkaW0objE5NzUpDQojIEzhu4duaCB4ZW0gMyBk4buvIGxp4buHdSDEkeG6p3UgY+G7p2EgIm4xOTc1Ig0KaGVhZChuMTk3NSwzKQ0KIyBM4buHbmggeGVtIGzGsOG7o25nIHF1YW4gc8OhdCBj4bunYSAiZmxvYWxhIg0KZGltKGZsb2FsYSkNCiMgTOG7h25oIHhlbSAzIGThu68gbGnhu4d1IMSR4bqndSBj4bunYSAiZmxvYWxhIg0KaGVhZChmbG9hbGEsMykNCmBgYA0KDQpUYSBz4bq9IHThuqFvIDEgYmnhur9uIGzDoCB04buRYyDEkeG7mSDEkeG7gyBwaOG6o24gw6FuaCBz4buxIHTEg25nIGhv4bq3YyBnaeG6o20gY+G7p2Egc+G6o24gbMaw4bujbmcgZ2nhu69hIDIgbsSDbSBsacOqbiB0aeG6v3AgduG7m2kgY8O0bmcgdGjhu6ljICRU4buRYyDEkeG7mSA9IChTTG4gLSBTTG4tMSkvU0xuLTEkDQoNCipTTG46IEzDoCBz4bqjbiBsxrDhu6NuZyDhu58gbsSDbSBj4bqnbiB0w61uaCANCipTTG4tMTogTMOgIHPhuqNuIGzGsOG7o25nIOG7nyBuxINtIHRyxrDhu5tjDQpgYGB7cn0NCnNsbiA8LSBwcm9bcHJvJE7Eg20+PSAxOTcxICYgcHJvJE7Eg208PTE5ODYsXSAjIEzhu4duaCB04bqhbyByYSBiaeG6v24gU0xuDQpzbG4xIDwtIHByb1twcm8kTsSDbT49MTk3MCAmIHBybyROxINtIDw9MTk4NSxdIyBM4buHbmggdOG6oW8gcmEgYmnhur9uIFNMbi0xDQpUxJAgPC0gKHNsbiRRLXNsbjEkUSkvc2xuMSRRICMgTOG7h25oIHThuqFvIHJhIGJp4bq/biB04buRYyDEkeG7mQ0KYGBgDQojIyMgVGlkeXZlcnNlDQpQYWNrYWdlICJUaWR5dmVyc2UiIGzDoCBt4buZdCBwYWNrYWdlIGNodXnDqm4gc+G7rSBk4bulbmcgY2hvIHZp4buHYyBEYXRhIG1hbmlwdWxhdGlvbiBuw6puIHPhur0gcuG6pXQgcGjDuSBo4bujcCB0cm9uZyB2aeG7h2MgcsO6dCB0csOtY2ggZOG7ryBsaeG7h3UgdHJvbmcgbeG7pWMgbsOgeS4gVHJvbmcgcGFja2FnZSBjw7MgdG/DoW4gdOG7rSBwaXBlICU8JSBsw6AgMSBjw7RuZyBj4bulIGdpw7pwIHZp4buHYyB0aOG7sWMgaGnhu4duIGPDoWMgY8OidSBs4buHbmggZOG7hSBkw6BuZyBoxqFuLiDDnSBuZ2jEqWEgY+G7p2EgdG/DoW4gdOG7rSBwaXBlIGzDoCAqKnRp4bq/cCDEkeG6v24gbMOgKiouIFNhdSDEkcOieSBsw6AgMSBjw6J1IGzhu4duaCDEkeG7gyB2w60gZOG7pSBjaG8gdG/DoW4gdOG7rSBwaXBlLg0KYGBge3IgcmVzdWx0cz0naGlkZSd9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCnBybzQuMSA8LSBwcm8gJT4lIHNlbGVjdChUQiwgTsSDbSxWQ8O0LFEpICMgTOG7h25oIGNo4buNbiByYSA0IGJp4bq/bg0KIyBW4bubaSBjw6J1IGzhu4duaCB0csOqbiBSIHPhur0gaGnhu4N1IGzDoCBjaOG7jW4gxJHhu5FpIHTGsOG7o25nIHBybyB0aeG6v3AgxJHhur9uIGzDoCBjaOG7jW4gYmnhur9uIFRCLCBOxINtLCBWQ8O0LCBRDQpuYW1lcyhwcm80LjEpDQpgYGANClRhIHPhur0gdGnhur9uIGjDoG5oIMSR4buVaSB0w6puIGJp4bq/biBjaG8gcHJvIMSR4buDIHBow6JuIGJp4buHdCB24bubaSBnw7NpIGJhc2UNCmBgYHtyfQ0KcHJvLjEgPC0gcHJvICU+JSByZW5hbWUoVkMgPSBWQ8O0LCBTTD1RLCBUTiA9IDcgKSMgTOG7h25oIMSR4buVaSB0w6puIGNobyBjw6FjIGPhu5l0IMSRxrDhu6NjIGNo4buJIMSR4buLbmgNCm5hbWVzKHByby4xKQ0KYGBgDQpWw6AgdGnhur9wIHThu6VjIHRhIHPhur0gZMO5bmcgbOG7h25oIGZpbHRlciDEkeG7gyB04bqhbyByYSAzIGLhu5kgZOG7ryBsaeG7h3U6DQogDQoqIEPDoWMgcXVhbiBzw6F0IHThu6sgYmFuZyBDQUxJRk9STklBDQoqIEPDoWMgcXVhbiBzw6F0IHRyb25nIG7Eg20gMTk3NQ0KKiBDw6FjIHF1YW4gc8OhdCBj4bunYSBiYW5nIEZMT1JJREEgdsOgIEFMQUJBTUEgdOG7qyBuxINtIDE5NzUgdOG7m2kgMTk4NQ0KYGBge3J9DQpjYWxpLjEgPC0gcHJvNC4xICU+JSBmaWx0ZXIoVEIgPT0gIkNBTElGT1JOSUEiKSAjIEzhu4duaCByw7p0IHJhIGPDoWMgcXVhbiBzw6F0IHThu6sgYmFuZyBDQUxJRk9STklBDQpuMTk3NS4xIDwtIHBybzQuMSAlPiUgZmlsdGVyKE7Eg20gPT0gMTk3NSkgIyBM4buHbmggcsO6dCByYSBjw6FjIHF1YW4gc8OhdCB04burIG7Eg20gMTk3NQ0KIyBM4buHbmggcsO6dCByYSBxdWFuIHPDoXQgY+G7p2EgYmFuZyBGTE9SSURBIHbDoCBBTEFCQU1BIHThu6sgbsSDbSAxOTc1IHThu5tpIDE5ODUNCmZsb2FsYS4xIDwtIHBybzQuMSAlPiUgZmlsdGVyKFRCID09ICJGTE9SSURBIiB8IFRCPT0iQUxBQkFNQSImIE7Eg20+PTE5NzUgJiBOxINtPD0xOTg1KQ0KYGBgDQpTYXUgxJHDonkgdGEgc+G6vSB04bqhbyByYSBiaeG6v24gdOG7kWMgxJHhu5kgxJHhu4MgcGjhuqNuIMOhbmggc+G7sSB0xINuZyBob+G6t2MgZ2nhuqNtIGPhu6dhIHPhuqNuIGzGsOG7o25nIGdp4buvYSAyIG7Eg20gbGnDqm4gdGnhur9wIHbhu5tpIGPDtG5nIHRo4bupYyAkVOG7kWMgxJHhu5kgPSAoU0xuIC0gU0xuLTEpL1NMbi0xJCB2w6AgZ2jDqXAgdsOgbyBzbG4uIERvIHRhIGNoxrBhIMSR4buVaSB0w6puIGPhu6dhIDIgYuG7mSBk4buvIGxp4buHdSBzbG4gdsOgIHNsbjEgbsOqbiB0YSBz4bq9IMSR4buVaSB0w6puIHRyb25nIGPDonUgbOG7h25oIHNhdQ0KYGBge3J9DQpzbG4gPC0gc2xuICU+JSByZW5hbWUoU0wgPSBRKSAjIMSQ4buVaSB0w6puIGJp4bq/biBRIHRow6BuaCBTTCBj4bunYSBzbG4NCnNsbjEgPC0gc2xuMSAlPiUgcmVuYW1lKFNMID1RKSAjIMSQ4buVaSB0w6puIGJp4bq/biBRIHRow6BuaCBTTCBj4bunYSBzbG4xDQpzbG4gPC0gc2xuICU+JSBtdXRhdGUoVMSQLjEgPSAoU0wgLSBzbG4xJFNMKSoxMDAvc2xuJFNMKSMgVOG6oW8gcmEgYmnhur9uIFTEkC4xIHbDoCBnaMOpcCB2w6BvIHNsbjENCmhlYWQoc2xuLDMpDQpgYGANCiMgKipOaGnhu4dtIHbhu6UgMi4yKioNCg0KIyMgVMOzbSB04bqvdA0KQuG7mSBk4buvIGxp4buHdSDEkWnhu4F1IHRyYSBjw6FjIHnhur91IHThu5Ega2hp4bq/biBt4buZdCBuZ8aw4budaSBy4budaSBi4buPIGPDtG5nIHZp4buHYyBoaeG7h24gdOG6oWkgxJHhu4MgbmdoacOqbiBj4bupdSBuaMOibiBz4buxLiANCg0KIyMgR2nhu5tpIHRoaeG7h3UNCkLhu5kgZOG7ryBsaeG7h3UgSFIgQW5hbHl0aWNzOiBKb2IgQ2hhbmdlIE9mIERhdGEgU2NpZW50aXN0cyBsw6AgbeG7mXQgYuG7mSBk4buvIGxp4buHdSBi4bqjbmcgxJHGsOG7o2MgbOG6pXkgdOG7qyB3ZWJzaXRlOiBbS2FnZ2xlXShodHRwczovL3d3dy5rYWdnbGUuY29tL2RhdGFzZXRzL2FyYXNobmljL2hyLWFuYWx5dGljcy1qb2ItY2hhbmdlLW9mLWRhdGEtc2NpZW50aXN0cz9yZXNvdXJjZT1kb3dubG9hZCkgxJHDonkgbMOgIG5ndeG7k24ga2jDoSBwaOG7lSBiaeG6v24gY2hvIGFpIG114buRbiB0aOG7sWMgaMOgbmggduG7m2kgbmjhu69uZyBk4buvIGxp4buHdSDEkcOjIGzDoG0gc+G6oWNoLiANCg0KKiBT4butIGThu6VuZyB0aWR5dmVyc2UgxJHhu4MgdGjhu7FjIGhp4buHbiBEYXRhIG1hbmlwdWxhdGlvbg0KDQogICAgKiBNw7QgdOG6oyB24buBIGLhu5kgZOG7ryBsaeG7h3UuDQogICAgDQogICAgKiBSw7p0IHRyw61jaCBjw6FjIGThu68gbGnhu4d1IHRoZW8gecOqdSBj4bqndSANCiAgICANCiAgICAqIFThuqFvIGThu68gbGnhu4d1IG3hu5tpIA0KIA0KIyMgTcO0IHThuqMgZOG7ryBsaeG7h3UgDQoNCiogxJDhu41jIGThu68gbGnhu4d1IA0KYGBge3J9DQpkIDwtIGZpbGUuY2hvb3NlKCkgIyBM4buHbmggZ8OhbiDEkcaw4budbmcgZOG6q24gY+G7p2EgZOG7ryBsaeG7h3UNCm52IDwtIHJlYWQuY3N2KGQpIyBM4buHbmggxJHhu41jIGThu68gbGnhu4d1IA0KYGBgDQoqIE3DtCB04bqjIGThu68gbGnhu4d1IA0KYGBge3J9DQpzdHIobnYpICMgTOG7h25oIG3DtCB04bqjIGPhuqV1IHRyw7pjIGThu68gbGnhu4d1DQpgYGANCg0KVGhlbyBuaMawIGvhur90IHF14bqjIGNobyB0YSBiaeG6v3QgxJHGsOG7o2M6DQoNCiogQ+G6pXUgdHLDumMgY+G7p2EgZOG7ryBsaeG7h3UgbMOgIGRhdGEgZnJhbWUgDQoqIEThu68gbGnhu4d1IGJhbyBn4buTbSAyMTI5IHF1YW4gc8OhdCB2w6AgMTMgYmnhur9uDQoqIEPDsyAxMCBiaeG6v24gbMOgIGvDvSB04buxDQoqIEPDsyAzIGJp4bq/biDhu58gZOG6oW5nIHPhu5ENCiogw50gbmdoxKlhIHTDqm4gYmnhur9uOg0KDQogICogZW5yb2xsZWVfaWQgOiBJRCBj4bunYSDhu6luZyB2acOqbg0KICAqIGNpdHk6ICBNw6MgdGjDoG5oIHBo4buRDQogICogY2l0eV8gZGV2ZWxvcG1lbnQgX2luZGV4IDogQ2jhu4kgc+G7kSBwaMOhdCB0cmnhu4NuIGPhu6dhIHRow6BuaCBwaOG7kSAodOG7tyBs4buHKQ0KICAqIGdlbmRlcjogR2nhu5tpIHTDrW5oIGPhu6dhIOG7qW5nIHZpw6puDQogICogcmVsZXZlbnRfZXhwZXJpZW5jZTogS2luaCBuZ2hp4buHbSBsacOqbiBxdWFuIGPhu6dhIOG7qW5nIHZpw6puDQogICogZW5yb2xsZWRfdW5pdmVyc2l0eTogTG/huqFpIGtow7NhIGjhu41jIMSQ4bqhaSBo4buNYyDEkcOjIMSRxINuZyBrw60gbuG6v3UgY8OzDQogICogZWR1Y2F0aW9uX2xldmVsOiBUcsOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2Eg4bupbmcgdmnDqm4NCiAgKiBtYWpvcl9kaXNjaXBsaW5lIDogVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGNodXnDqm4gbmdow6BuaCBj4bunYSDhu6luZyB2acOqbg0KICAqIGV4cGVyaWVuY2U6IFThu5VuZyBz4buRIG7Eg20ga2luaCBuZ2hp4buHbSBj4bunYSDhu6luZyB2acOqbg0KICAqIGNvbXBhbnlfc2l6ZTogU+G7kSBsxrDhu6NuZyBuaMOibiB2acOqbiB0cm9uZyBjw7RuZyB0eSBj4bunYSBjaOG7pyBsYW8gxJHhu5luZyBoaeG7h24gdOG6oWkgDQogICogY29tcGFueV90eXBlIDogTG/huqFpIG5ow6AgdHV54buDbiBk4bulbmcgaGnhu4duIHThuqFpDQogICogbGFzdF9uZXdfam9iOiBT4buxIGtow6FjIGJp4buHdCB24buBIHPhu5EgbsSDbSBnaeG7r2EgY8O0bmcgdmnhu4djIHRyxrDhu5tjIMSRw6J5IHbDoCBjw7RuZyB2aeG7h2MgaGnhu4duIHThuqFpDQogICogdHJhaW5pbmdfaG91cnM6IFPhu5EgZ2nhu50gxJHDoG8gdOG6oW8gxJHDoyBob8OgbiB0aMOgbmgNCiAgDQpUYSBz4bq9IHhlbSBi4buZIGThu68gbGnhu4d1IG7DoHkgY8OzIGdpw6EgdHLhu4sgdGhp4bq/dSBoYXkga2jDtG5nDQpgYGB7cn0NCnN1bShpcy5uYShudikpDQpgYGANCk5oxrAga+G6v3QgcXXhuqMgdHLDqm4gY2hvIHRo4bqleSDEkWMgYuG7mSBk4buvIGxp4buHdSBraMO0bmcgY8OzIGdpw6EgdHLhu4sgdGhp4bq/dSBuw6puIGtow7RuZyBj4bqnbiB44butIGzDvSBnw6wgdGjDqm0NCiMjIFLDunQgdHLDrWNoIGThu68gbGnhu4d1IA0KVGEgc+G6vSBjaOG7jW4gcmEgNyBiaeG6v24gxJHDsyBjaMOtbmggbMOgICJlbnJvbGxlZV9pZCIsICJjaXR5IiwgImdlbmRlciIsICJlZHVjYXRpb25fbGV2ZWwiLCAibWFqb3JfZGlzY2lwbGluZSIsICJleHBlcmllbmNlIiwidHJhaW5pbmdfaG91cnMiLiBWw6AgdGEgdOG6oW8gcmEgbmjhu69uZyBi4buZIGThu68gbGnhu4d1IG5o4buPIGJhbyBn4buTbToNCg0KKiBDw6FjIHF1YW4gc8OhdCBsw6AgbmFtDQoqIEPDoWMgcXVhbiBzw6F0IGNo4buJIOG7nyB0csOsbmggxJHhu5kgxJHhuqFpIGjhu41jIA0KKiBDw6FjIHF1YW4gc8OhdCBjw7MgdHLDqm4gMTAgbsSDbSBraW5oIG5naGnhu4dtDQoqIEPDoWMgcXVhbiBzw6F0IGPDsyB0csOqbiAxMDAgZ2nhu50gxJHDoG8gdOG6oW8NCiogQ8OhYyBxdWFuIHPDoXQgY8OzIHRyw6xuaCDEkeG7mSBj4bqlcCAzIHbDoCBjw7MgdHLDqm4gNSBuxINtIGtpbmggbmdoaeG7h20NCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpIyBH4buNaSBwYWNrYWdlIHRpZHl2ZXJzZQ0KIyBM4buHbmggY2jhu41uIHJhIGPDoWMgYmnhur9uIGPhuqduIHRoaeG6v3QNCm52MSA8LSBudiAlPiUgc2VsZWN0KGVucm9sbGVlX2lkLGNpdHksZ2VuZGVyLGVkdWNhdGlvbl9sZXZlbCxtYWpvcl9kaXNjaXBsaW5lLGV4cGVyaWVuY2UsdHJhaW5pbmdfaG91cnMpDQojIEzhu4duaCByw7p0IHJhIGPDoWMgcXVhbiBzw6F0IGzDoCBuYW0NCm5hbSA8LSBudjEgJT4lIGZpbHRlcihnZW5kZXIgPT0gIk1hbGUiKQ0KIyBM4buHbmggcsO6dCByYSBjw6FjIHF1YW4gc8OhdCBjaOG7iSBsw6AgdHLDrG5oIMSR4buZIMSR4bqhaSBo4buNYyAgICAgICAgICAgICAgICAgICAgICANCsSRaCA8LSBudjEgJT4lICBmaWx0ZXIoZWR1Y2F0aW9uX2xldmVsID09ICJHcmFkdWF0ZSIpDQojIEzhu4duaCByw7p0IHJhIGPDoWMgcXVhbiBzw6F0IHRyw6puIDEwIG7Eg20ga2luaCBuZ2hp4buHbQ0Ka24xMCA8LSBudjEgJT4lIGZpbHRlcihleHBlcmllbmNlID49MTAgfCBleHBlcmllbmNlID09ICI+MjAiKQ0KIyBM4buHbmggcsO6dCByYSBjw6FjIHF1YW4gc8OhdCB0csOqbiAxMDAgZ2nhu50gxJHDoG8gdOG6oW8NCmgxMDAgPC0gbnYxICU+JSAgZmlsdGVyKHRyYWluaW5nX2hvdXJzID49IDEwMCkNCiMgTOG7h25oIHLDunQgcmEgY8OhYyBxdWFuIHPDoXQgY8OzIHRyw6xuaCDEkeG7mSBj4bqlcCAzIHbDoCBjw7MgdHLDqm4gNSBuxINtIGtpbmggbmdoaeG7h20NCmUzZTUgPC0gbnYxICU+JQ0KICAgICAgICAgICAgICAgIGZpbHRlciggZWR1Y2F0aW9uX2xldmVsID09ICJIaWdoIFNjaG9vbCIpICU+JQ0KICAgICAgICAgICAgICAgIGZpbHRlcihleHBlcmllbmNlID49NSB8IGV4cGVyaWVuY2UgPT0gIj4yMCIpDQpgYGANClNhdSDEkcOieSB0YSBz4bq9IHhlbSB0aOG7rSBsxrDhu6NuZyBxdWFuIHPDoXQgY+G7p2EgY8OhYyBi4buZIGThu68gbGnhu4d1IHbDoCB4ZW0gcXVhIGPDoWMgZOG7ryBsaeG7h3UNCg0KYGBge3J9DQojIEzGsOG7o25nIHF1YW4gc8OhdCBj4bunYSAibmFtIg0KZGltKG5hbSkNCiMgWGVtIDMgZOG7ryBsaeG7h3UgxJHhuqd1IGPhu6dhICJuYW0iDQpoZWFkKG5hbSwzKQ0KIyBMxrDhu6NuZyBxdWFuIHPDoXQgY+G7p2EgIsSRaCINCmRpbSjEkWgpDQojIFhlbSAzIGThu68gbGnhu4d1IMSR4bqndSBj4bunYSAixJFoIg0KaGVhZCjEkWgsMykNCiMgTMaw4bujbmcgcXVhbiBzw6F0IGPhu6dhICJrbjEwIg0KZGltKGtuMTApDQojIFhlbSAzIGThu68gbGnhu4d1IMSR4bqndSBj4bunYSAia24xMCINCmhlYWQoa24xMCwzKQ0KIyBMxrDhu6NuZyBxdWFuIHPDoXQgY+G7p2EgImgxMDAiDQpkaW0oaDEwMCkNCiMgWGVtIDMgZOG7ryBsaeG7h3UgxJHhuqd1IGPhu6dhICJoMTAwIg0KaGVhZChoMTAwLCAzKQ0KIyBMxrDhu6NuZyBk4buvIGxp4buHdSBj4bunYSAiZTNlNSIgDQpkaW0oZTNlNSkNCiMgWGVtIDMgZOG7ryBsaeG7h3UgY+G7p2EgImUzZTUiDQpgYGANCiMjIFThuqFvIGThu68gbGnhu4d1IG3hu5tpIA0KVGEgc+G6vSB04bqhbyByYSAxIGJp4bq/biBt4bubaSBsw6AgdGnhu4FuIHRoxrDhu59uZyBjdeG7kWkgbsSDbSBj4bunYSBjw6FjIG5ow6JuIHZpw6puIHbhu5tpIGPDtG5nIHRo4bupYyBuaMawIHNhdSAkdGjGsOG7n25nID0gKDIwKnPhu5EgZ2nhu50gxJHDoG8gdOG6oW8pKigxKyBjaOG7iSBz4buRIHBow6F0IHRyaeG7g24pJA0KYGBge3J9DQojIEzhu4duaCB04bqhbyByYSBiaeG6v24gbeG7m2kgdsOgIGdow6lwIHbDoG8gbnYNCm52IDwtIG52ICU+JSBtdXRhdGUoVGjGsOG7n25nID0gKDIwKnRyYWluaW5nX2hvdXJzKSooMSsgY2l0eV9kZXZlbG9wbWVudF9pbmRleCkpIA0KIyBYZW0gMyBk4buvIGxp4buHdSDEkeG6p3UgY+G7p2EgIlRoxrDhu59uZyINCmhlYWQobnYkVGjGsOG7n25nKQ0KYGBgDQoNCg0KDQoNCg0K