1 Nhiệm Vụ 2.1


1.1 Tóm tắt

Nhiệm vụ 2.1 tiến hành thao tác 1 số lệnh cơ bản trên dataset “bwt_co_dieu_chinh.xlsx”, là dataset thống kê các thuộc tính của phụ nữ khi mang thai ở 8 khu vực khác nhau và được ghi nhận từ năm 1925 - 2004.

1.2 Import và mô tả cơ bản dataset

  • Các cột lần lượt là:

    • id: Khu vực (có 8 khu vực).

    • year: Năm lấy số liệu.

    • bwt: Trọng lượng lúc sinh (tính bằng ounces, 1 ounce = 28.3495 gram).

    • gestation: Thời gian mang thai (tính bằng ngày).

    • parity: Số lần sinh (có hai giá trị, 1 = sinh lần đầu, 0 = không phải lần đầu).

    • age: Tuổi của mẹ.

    • height: Chiều cao của mẹ (tính bằng inches, 1 inch = 2.54 cm).

    • weight: Cân nặng của bà mẹ khi mang thai (tính bằng pounds, 1 pound = 0.453592 kg).

    • smoke: Hút thuốc lúc mang thai (1 = có, 0 = không).

library(xlsx)
h <- read.xlsx("C:/Users/Dell/Downloads/bwt_co_dieu_chinh.xlsx", sheetIndex = 1, header = 1) #đọc dữ liệu từ excel và gán vào object h

is.data.frame(h) #kiểm tra xem "h" có phải là data frame hay không, nếu đúng thì true và ngược lại
## [1] TRUE
length(h) #cho ra số cột của "h"
## [1] 9
names(h) #cho ra các tên cột của "h"
## [1] "id"        "year"      "bwt"       "gestation" "parity"    "age"      
## [7] "height"    "weight"    "smoke"
dim(h) #cho ra số hàng và số cột của "h"
## [1] 640   9
sum(is.na(h)) #tổng số ô trống của object h
## [1] 0

1.3 Thống kê mô tả

Thực hiện thống kê mô tả dataset này ta được kết quả bên dưới, ý nghĩa các cột như sau:

  • n_missing: số ô dữ liệu bị miss(trống)

  • complete_rate: tỷ lệ ô có dữ liệu

  • mean: trung bình

  • sd: độ lệch chuẩn

  • p0: giá trị nhỏ nhất

  • p25: Phân vị thứ nhất

  • p50: Phân vị thứ hai cũng chính là trung vị

  • p75: phân vị thứ ba

  • p100: giá trị lớn nhất

  • hist: biểu đồ Histogram

library(skimr)
skim(h)
Data summary
Name h
Number of rows 640
Number of columns 9
_______________________
Column type frequency:
numeric 9
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
id 0 1 4.50 2.29 1 2.75 4.5 6.25 8 ▇▃▇▃▇
year 0 1 1964.50 23.11 1925 1944.75 1964.5 1984.25 2004 ▇▇▇▇▇
bwt 0 1 118.89 18.14 55 107.75 120.0 131.00 169 ▁▂▇▆▁
gestation 0 1 279.33 15.80 181 273.00 280.0 288.00 351 ▁▁▇▅▁
parity 0 1 0.31 0.46 0 0.00 0.0 1.00 1 ▇▁▁▁▃
age 0 1 27.28 5.86 15 23.00 26.0 31.00 45 ▃▇▅▂▁
height 0 1 64.10 2.50 53 62.00 64.0 66.00 71 ▁▁▅▇▁
weight 0 1 128.22 19.49 87 115.00 126.0 137.00 217 ▃▇▃▁▁
smoke 0 1 0.40 0.49 0 0.00 0.0 1.00 1 ▇▁▁▁▆

1.4 Rút trích dữ liệu

# lấy 20 dòng đầu
head(h,20)
##    id year bwt gestation parity age height weight smoke
## 1   1 1925 120       284      0  27     62    100     0
## 2   2 1925 112       267      1  22     62    138     0
## 3   3 1925 119       286      0  26     64    123     1
## 4   4 1925 124       287      0  27     62    105     1
## 5   5 1925 105       276      0  22     67    130     0
## 6   6 1925 120       289      1  31     59    102     0
## 7   7 1925  82       274      0  31     64    101     1
## 8   8 1925 111       278      0  29     65    145     1
## 9   1 1926 113       282      0  33     64    135     0
## 10  2 1926 134       297      0  27     67    170     1
## 11  3 1926  97       279      0  29     68    178     1
## 12  4 1926 125       292      0  22     65    122     0
## 13  5 1926  93       246      0  37     65    130     0
## 14  6 1926 146       280      0  23     61    145     0
## 15  7 1926 100       274      0  24     63    113     0
## 16  8 1926 103       250      0  40     59    140     0
## 17  1 1927 128       279      0  28     64    115     1
## 18  2 1927 145       308      0  35     64    110     1
## 19  3 1927  99       252      0  21     64    120     0
## 20  4 1927 110       262      0  25     66    140     0
# lấy 10 dòng cuối
tail(h,20)
##     id year bwt gestation parity age height weight smoke
## 621  5 2002 120       276      0  23     66    114     0
## 622  6 2002 129       288      0  28     59    102     0
## 623  7 2002 137       280      0  34     60    107     0
## 624  8 2002 135       289      0  25     64    127     0
## 625  1 2003 129       280      0  23     64    104     0
## 626  2 2003 158       295      1  37     70    137     0
## 627  3 2003  78       258      1  24     66    115     1
## 628  4 2003 133       292      0  30     65    112     1
## 629  5 2003 140       251      0  28     63    210     0
## 630  6 2003 114       286      1  22     64    116     1
## 631  7 2003 100       264      0  29     64    120     1
## 632  8 2003 123       277      0  24     66    122     0
## 633  1 2004 139       292      0  25     68    135     0
## 634  2 2004 112       275      1  21     68    143     1
## 635  3 2004 114       289      0  36     60    115     0
## 636  4 2004 110       277      0  25     61    130     0
## 637  5 2004 120       271      1  17     64    142     1
## 638  6 2004 110       280      0  29     62    110     1
## 639  7 2004 160       271      0  32     67    215     0
## 640  8 2004 100       281      0  24     61    115     0
# Đặt lại tên cho các cột của objec "h" để thuận tiện thao tác hơn
names(h) <- c("i","y","b","g","p","a","he","w","s")
names(h)
## [1] "i"  "y"  "b"  "g"  "p"  "a"  "he" "w"  "s"
## Gán h1 là giá trị của hàng 5 cột 6
h1 <- h[5,6]
str(h1)
##  num 22
## Gán h2 là giá trị 5 hàng đầu tiên của cột "b"
h2 <- h[1:5,3]
str(h2)
##  num [1:5] 120 112 119 124 105
## Gán h3 là giá trị các hàng 1,3,5,7 của cột "g" và "p"
h3 <- h[c(1,3,5,7),c(4,5)]
str(h3)
## 'data.frame':    4 obs. of  2 variables:
##  $ g: num  284 286 276 274
##  $ p: num  0 0 0 0
## Gán h4 là những hàng có giá trị là khu vực 5
h4 <- h[h$i==5,]
str(h4)
## 'data.frame':    80 obs. of  9 variables:
##  $ i : num  5 5 5 5 5 5 5 5 5 5 ...
##  $ y : num  1925 1926 1927 1928 1929 ...
##  $ b : num  105 93 122 133 130 104 106 120 118 140 ...
##  $ g : num  276 246 281 293 296 307 278 281 276 290 ...
##  $ p : num  0 0 0 0 1 0 0 0 1 1 ...
##  $ a : num  22 37 42 23 22 24 31 33 18 19 ...
##  $ he: num  67 65 63 64 66 59 65 63 63 67 ...
##  $ w : num  130 130 103 110 117 122 110 113 128 132 ...
##  $ s : num  0 0 1 1 1 0 1 0 0 1 ...
## Gán h5 là những hàng có năm 1930 -> 1935
h5 <- h[h$y >= 1930 & h$y <= 1935,]
str(h5)
## 'data.frame':    48 obs. of  9 variables:
##  $ i : num  1 2 3 4 5 6 7 8 1 2 ...
##  $ y : num  1930 1930 1930 1930 1930 ...
##  $ b : num  138 111 144 142 104 122 122 94 132 126 ...
##  $ g : num  244 285 304 284 307 275 275 271 245 282 ...
##  $ p : num  0 0 1 0 0 0 1 0 0 0 ...
##  $ a : num  33 29 27 39 24 30 20 36 23 33 ...
##  $ he: num  62 65 58 66 59 68 65 61 65 62 ...
##  $ w : num  178 130 102 132 122 140 127 130 140 117 ...
##  $ s : num  0 0 1 0 0 0 0 1 0 0 ...
## Gán h6 là những hàng sinh lần đầu hoặc không hút thuốc khi mang thai
h6 <- h[h$p == 1 | h$s == 0,]
str(h6)
## 'data.frame':    461 obs. of  9 variables:
##  $ i : num  1 2 5 6 1 4 5 6 7 8 ...
##  $ y : num  1925 1925 1925 1925 1926 ...
##  $ b : num  120 112 105 120 113 125 93 146 100 103 ...
##  $ g : num  284 267 276 289 282 292 246 280 274 250 ...
##  $ p : num  0 1 0 1 0 0 0 0 0 0 ...
##  $ a : num  27 22 22 31 33 22 37 23 24 40 ...
##  $ he: num  62 62 67 59 64 65 65 61 63 59 ...
##  $ w : num  100 138 130 102 135 122 130 145 113 140 ...
##  $ s : num  0 0 0 0 0 0 0 0 0 0 ...
# Rút trích dữ liệu với filter và select
k1 <- filter(h, h$he > 60 & h$w > 130) #chọn những hàng chỉ đáp ứng điều kiện cao hơn 60inch và nặng hơn 130 pound
str(k1)
##  Time-Series [1:640, 1:9] from 1 to 640: NA NA NA NA NA NA NA NA NA NA ...
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
k2 <- select(h,i,he,w) #chỉ lấy những cột khu vực, chiều cao và cân nặng trong object "h"
str(k2)
## 'data.frame':    640 obs. of  3 variables:
##  $ i : num  1 2 3 4 5 6 7 8 1 2 ...
##  $ he: num  62 62 64 62 67 59 64 65 64 67 ...
##  $ w : num  100 138 123 105 130 102 101 145 135 170 ...
k3 <- filter(h,a > 20 & w > 120) %>% select(i,a,he,w) #chỉ lấy những cột khu vực, tuổi, chiều cao, cân nặng và phải đáp ứng điều kiện có tuổi cao hơn 25 và cân nặng hơn 150 pound
str(k3)
## 'data.frame':    356 obs. of  4 variables:
##  $ i : num  2 3 5 8 1 2 3 4 5 6 ...
##  $ a : num  22 26 22 29 33 27 29 22 37 23 ...
##  $ he: num  62 64 67 65 64 67 68 65 65 61 ...
##  $ w : num  138 123 130 145 135 170 178 122 130 145 ...

1.5 Tạo thêm cột dữ liệu mới

Ta tiến hành thực hành các lệnh để thêm 1 số biến mới từ dữ liệu cũ, như kết quả bên dưới ta đã tạo ra object mới là tinh với các dữ liệu cũ của h và thêm 5 biến mới là:

  • cm: Là chiều cao với đơn vị là cm

  • kg: là cân nặng với đơn vị là kg

  • bmi: là chỉ số bmi được tính từ cm và kg

  • tieuchuan: đánh giá mức độ cân nặng phù hợp theo tiêu chuẩn bmi

## thêm cột chiều cao với đơn vị là cm, cân nặng với đơn vị là kg và cột chỉ số bmi: cột cm được tính bằng cột he nhân cho 2.54, tương tự các cột sau

tinh <- mutate(h, cm = he*2.54) 
tinh <- mutate(tinh,kg=w*0.453592) 

tinh <- mutate(tinh,bmi=kg/((cm/100)^2)) 
str(tinh)
## 'data.frame':    640 obs. of  12 variables:
##  $ i  : num  1 2 3 4 5 6 7 8 1 2 ...
##  $ y  : num  1925 1925 1925 1925 1925 ...
##  $ b  : num  120 112 119 124 105 120 82 111 113 134 ...
##  $ g  : num  284 267 286 287 276 289 274 278 282 297 ...
##  $ p  : num  0 1 0 0 0 1 0 0 0 0 ...
##  $ a  : num  27 22 26 27 22 31 31 29 33 27 ...
##  $ he : num  62 62 64 62 67 59 64 65 64 67 ...
##  $ w  : num  100 138 123 105 130 102 101 145 135 170 ...
##  $ s  : num  0 0 1 1 0 0 1 1 0 1 ...
##  $ cm : num  157 157 163 157 170 ...
##  $ kg : num  45.4 62.6 55.8 47.6 59 ...
##  $ bmi: num  18.3 25.2 21.1 19.2 20.4 ...

2 Nhiệm vụ 2.2


2.1 Tóm tắt

Nhiệm vụ 2.2 thực hành những thao tác về bộ dữ liệu Billionaires Statistics Dataset, là bộ dữ liệu thống kê về một số điểm nổi bật của các tỷ phú trên thế giới tính đến năm 2023. Chi tiết các biến trong bộ dữ liệu như sau:

  • Rank: Thứ hạng của tỷ phú xét về mức độ giàu có.

  • FinalWorth: Giá trị ròng cuối cùng của tỷ phú tính bằng đô la Mỹ.

  • personName: Tên đầy đủ của tỷ phú.

  • age: Tuổi của tỷ phú.

  • country: Quốc gia nơi tỷ phú cư trú.

  • source: Nguồn gốc sự giàu có của tỷ phú.

  • industries: Các ngành nghề gắn liền với lợi ích kinh doanh của tỷ phú.

  • countryOfCitizenship: Quốc tịch của tỷ phú.

  • selfMade: Cho biết tỷ phú có phải là người tự lập hay không (Đúng/Sai).

  • status: “D” đại diện cho tỷ phú tự thân (Người sáng lập/Doanh nhân) và “U” biểu thị tài sản được thừa kế hoặc không kiếm được.

  • gender: Giới tính của tỷ phú(M là nam, F là nữ)

  • title: Chức vụ của tỷ phú

  • life_expectancy_country: Tuổi thọ ở đất nước tỷ phú.

  • tax_revenue_country_country: Doanh thu thuế ở quốc gia của tỷ phú.

2.2 Thống kê mô tả

Đầu tiên, ta gán object a là dataset Billionaires Statistics Dataset, sau đó tiến hành thực hiện lệnh thống kê object a, ta được kết quả như sau:

  • a có 2640 hàng và 14 cột

  • Có 8 biến ký tự, 1 biến logic và 5 biến định dạng số

  • Các đặc điểm nổi bật của thống kê về các biến ký tự:

    • Biến country có 38 dữ liệu bị miss chiếm tỷ lệ 0,01 và biến title bị miss 2301 dữ liệu chiếm tỷ lệ 0,87.

    • Số ký tự trong 1 ô nhiều nhất là 60 ký tự(nằm ở cột title) và ít nhất là 1 ký tự(nằm ở cột statusgender)

    • n_unique: Số lượng giá trị duy nhất riêng biệt trong mỗi biến, như ở đây ta có được biến personName có nhiều dữ liệu riêng biệt nhất với 2638 quan sát riêng biệt.

  • Biến sefMade với định dạng dữ liệu logic thống kê được 1812 giá trị true cho biết 1812 tỷ phú là tự lập và ngược lại 828 tỷ phú là không tự lập

  • Các đặc điểm nổi bật của thống kê cho dữ liệu định dạng số:

    • Các biến age, life_expectancy_country, tax_revenue_country_country có lần lượt là 65, 182, 183 dữ liệu bị miss.

    • Giá trị trung bình(các biến định tính không có giá trị nên ta không tính đến biến rank): finalWorth=4623.79, life_expectancy_country=78.12, tax_revenue_country_country=12.55, age=65.14

    • Tương tự ta biết được các giá trị độ lệch chuẩn, giá trị nhỏ nhất, trung vị, lớn nhất và biểu đồ histogram

library(xlsx)
a <- read.xlsx("C:/Users/Dell/OneDrive/UFM/R/Billionaires Statistics Dataset.xlsx", sheetIndex = 1, header = 1)
library(skimr)
skim(a)
Data summary
Name a
Number of rows 2640
Number of columns 14
_______________________
Column type frequency:
character 8
logical 1
numeric 5
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
personName 0 1.00 5 40 0 2638 0
country 38 0.99 4 24 0 78 0
source 0 1.00 2 35 0 906 0
industries 0 1.00 6 26 0 18 0
countryOfCitizenship 0 1.00 4 20 0 77 0
status 0 1.00 1 20 0 6 0
gender 0 1.00 1 1 0 2 0
title 2301 0.13 3 60 0 97 0

Variable type: logical

skim_variable n_missing complete_rate mean count
selfMade 0 1 0.69 TRU: 1812, FAL: 828

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
rank 0 1.00 1289.16 739.69 1.0 659.0 1312.0 1905.0 2540.0 ▇▇▇▇▇
finalWorth 0 1.00 4623.79 9834.24 1000.0 1500.0 2300.0 4200.0 211000.0 ▇▁▁▁▁
age 65 0.98 65.14 13.26 18.0 56.0 65.0 75.0 101.0 ▁▂▇▆▂
life_expectancy_country 182 0.93 78.12 3.73 54.3 77.0 78.5 80.9 84.2 ▁▁▁▅▇
tax_revenue_country_country 183 0.93 12.55 5.37 0.1 9.6 9.6 12.8 37.2 ▁▇▁▁▁

2.3 Xử lí dữ liệu bị thiếu

Sau khi mô tả cơ bản các thuộc tính của dataset, có xuất hiện các dữ liệu bị miss, ta có thể tiến hành xử lí các dữ liệu bị miss của các biến có định dạng số bao gồm age, life_expectancy_countrytax_revenue_country_country bằng cách thêm các giá trị trung bình của biến vào các ô dữ liệu bị miss bởi vì giá trị trung bình sẽ không làm biến động nhiều các thống kê khác của biến dữ liệu.

a$age[is.na(a$age)] <- mean(a$age,na.rm = T)

sum(is.na(a$age))
## [1] 0
a$life_expectancy_country[is.na(a$life_expectancy_country)] <- mean(a$life_expectancy_country,na.rm = T)

sum(is.na(a$life_expectancy_country))
## [1] 0
a$tax_revenue_country_country[is.na(a$tax_revenue_country_country)] <- mean(a$tax_revenue_country_country,na.rm = T)

sum(is.na(a$tax_revenue_country_country))
## [1] 0

2.4 Rút trích dữ liệu

Ta sẽ giả sử với một số ví dụ như sau: - Chỉ làm việc với các tỷ phú nằm trong top 30

  • Chọn những tỷ phú có giá trị tài sản ròng lớn hơn 60000

  • Chọn những tỷ phú trên 70 tuổi và có quốc tịch Mỹ

  • Chỉ làm việc với các biến Rank, FinalWorth, age, gender mà tài sản không phải thừa kế.

top30 <- head(a,30)
str(top30)
## 'data.frame':    30 obs. of  14 variables:
##  $ rank                       : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ finalWorth                 : num  211000 180000 114000 107000 106000 104000 94500 93000 83400 80700 ...
##  $ personName                 : chr  "Bernard Arnault & family" "Elon Musk" "Jeff Bezos" "Larry Ellison" ...
##  $ age                        : num  74 51 59 78 92 67 81 83 65 67 ...
##  $ country                    : chr  "France" "United States" "United States" "United States" ...
##  $ source                     : chr  "LVMH" "Tesla, SpaceX" "Amazon" "Oracle" ...
##  $ industries                 : chr  "Fashion & Retail" "Automotive" "Technology" "Technology" ...
##  $ countryOfCitizenship       : chr  "France" "United States" "United States" "United States" ...
##  $ selfMade                   : logi  FALSE TRUE TRUE TRUE TRUE TRUE ...
##  $ status                     : chr  "U" "D" "D" "U" ...
##  $ gender                     : chr  "M" "M" "M" "M" ...
##  $ title                      : chr  "Chairman and CEO" "CEO" "Chairman and Founder" "CTO and Founder" ...
##  $ life_expectancy_country    : num  82.5 78.5 78.5 78.5 78.5 78.5 78.5 75 69.4 78.5 ...
##  $ tax_revenue_country_country: num  24.2 9.6 9.6 9.6 9.6 9.6 9.6 13.1 11.2 9.6 ...
taisan <- a[a$finalWorth>60000,]
str(taisan)
## 'data.frame':    16 obs. of  14 variables:
##  $ rank                       : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ finalWorth                 : num  211000 180000 114000 107000 106000 104000 94500 93000 83400 80700 ...
##  $ personName                 : chr  "Bernard Arnault & family" "Elon Musk" "Jeff Bezos" "Larry Ellison" ...
##  $ age                        : num  74 51 59 78 92 67 81 83 65 67 ...
##  $ country                    : chr  "France" "United States" "United States" "United States" ...
##  $ source                     : chr  "LVMH" "Tesla, SpaceX" "Amazon" "Oracle" ...
##  $ industries                 : chr  "Fashion & Retail" "Automotive" "Technology" "Technology" ...
##  $ countryOfCitizenship       : chr  "France" "United States" "United States" "United States" ...
##  $ selfMade                   : logi  FALSE TRUE TRUE TRUE TRUE TRUE ...
##  $ status                     : chr  "U" "D" "D" "U" ...
##  $ gender                     : chr  "M" "M" "M" "M" ...
##  $ title                      : chr  "Chairman and CEO" "CEO" "Chairman and Founder" "CTO and Founder" ...
##  $ life_expectancy_country    : num  82.5 78.5 78.5 78.5 78.5 78.5 78.5 75 69.4 78.5 ...
##  $ tax_revenue_country_country: num  24.2 9.6 9.6 9.6 9.6 9.6 9.6 13.1 11.2 9.6 ...
tuoi70 <- a[a$age>70 & a$countryOfCitizenship == 'United States',]
str(tuoi70)
## 'data.frame':    322 obs. of  14 variables:
##  $ rank                       : num  4 5 7 17 19 20 21 25 31 31 ...
##  $ finalWorth                 : num  107000 106000 94500 59000 58800 57600 56700 45100 38300 38300 ...
##  $ personName                 : chr  "Larry Ellison" "Warren Buffett" "Michael Bloomberg" "Charles Koch & family" ...
##  $ age                        : num  78 92 81 87 74 78 73 85 83 87 ...
##  $ country                    : chr  "United States" "United States" "United States" "United States" ...
##  $ source                     : chr  "Oracle" "Berkshire Hathaway" "Bloomberg LP" "Koch Industries" ...
##  $ industries                 : chr  "Technology" "Finance & Investments" "Media & Entertainment" "Diversified" ...
##  $ countryOfCitizenship       : chr  "United States" "United States" "United States" "United States" ...
##  $ selfMade                   : logi  TRUE TRUE TRUE FALSE FALSE FALSE ...
##  $ status                     : chr  "U" "D" "U" "D" ...
##  $ gender                     : chr  "M" "M" "M" "M" ...
##  $ title                      : chr  "CTO and Founder" "CEO" "CEO" "Chairman and CEO" ...
##  $ life_expectancy_country    : num  78.5 78.5 78.5 78.5 78.5 78.5 78.5 78.5 78.5 78.5 ...
##  $ tax_revenue_country_country: num  9.6 9.6 9.6 9.6 9.6 9.6 9.6 9.6 9.6 9.6 ...
library(dplyr)
a1 <- filter(a, status=='D') %>% select(rank,finalWorth, age, gender)
str(a1)
## 'data.frame':    1223 obs. of  4 variables:
##  $ rank      : num  2 3 5 6 9 10 12 14 16 17 ...
##  $ finalWorth: num  180000 114000 106000 104000 83400 80700 79200 76000 64400 59000 ...
##  $ age       : num  51 59 92 67 65 67 50 49 38 87 ...
##  $ gender    : chr  "M" "M" "M" "M" ...

2.5 Tạo dữ liệu mới.

Ta sẽ tạo thêm các biến mới cho dataset và gán nó thành object b:

  • Thêm cột minus_age với dữ liệu là cột age trừ cho life_expectancy_country.

  • Thêm cột sosanh để so sánh dữ liệu giữa cột age và cột life_expectancy_country, nếu cột age lớn hơn thì sẽ hiện dữ liệu là “lớn hơn” ngược lại thì là “nhỏ hơn” và “bằng nhau”

b <- mutate(a,minus_age=age-life_expectancy_country) %>% mutate(sosanh=case_when(a$age > a$life_expectancy_country ~ 'lớn hơn',a$age < a$life_expectancy_country ~ 'nhỏ hơn',a$age == a$life_expectancy_country ~ 'bằng nhau'))

str(b)
## 'data.frame':    2640 obs. of  16 variables:
##  $ rank                       : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ finalWorth                 : num  211000 180000 114000 107000 106000 104000 94500 93000 83400 80700 ...
##  $ personName                 : chr  "Bernard Arnault & family" "Elon Musk" "Jeff Bezos" "Larry Ellison" ...
##  $ age                        : num  74 51 59 78 92 67 81 83 65 67 ...
##  $ country                    : chr  "France" "United States" "United States" "United States" ...
##  $ source                     : chr  "LVMH" "Tesla, SpaceX" "Amazon" "Oracle" ...
##  $ industries                 : chr  "Fashion & Retail" "Automotive" "Technology" "Technology" ...
##  $ countryOfCitizenship       : chr  "France" "United States" "United States" "United States" ...
##  $ selfMade                   : logi  FALSE TRUE TRUE TRUE TRUE TRUE ...
##  $ status                     : chr  "U" "D" "D" "U" ...
##  $ gender                     : chr  "M" "M" "M" "M" ...
##  $ title                      : chr  "Chairman and CEO" "CEO" "Chairman and Founder" "CTO and Founder" ...
##  $ life_expectancy_country    : num  82.5 78.5 78.5 78.5 78.5 78.5 78.5 75 69.4 78.5 ...
##  $ tax_revenue_country_country: num  24.2 9.6 9.6 9.6 9.6 9.6 9.6 13.1 11.2 9.6 ...
##  $ minus_age                  : num  -8.5 -27.5 -19.5 -0.5 13.5 ...
##  $ sosanh                     : chr  "nhỏ hơn" "nhỏ hơn" "nhỏ hơn" "nhỏ hơn" ...
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSAyIg0KYXV0aG9yOiAiVsO1IEhvw6BuZyBUw61uaCINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgIHRvYzogdHJ1ZQ0KICAgICBudW1iZXJfc2VjdGlvbjogdHJ1ZQ0KICAgICB0b2NfZGVwdGg6IDINCiAgICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB0cnVlDQogICAgICBzbW9vdGhfc2Nyb2xsOiBmYWxzZQ0KICAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgIGNvZGVfZm9sZGluZzogc2hvdyANCiAgcGRmX2RvY3VtZW50OiANCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgTmhp4buHbSBW4bulIDIuMQ0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KIyMgVMOzbSB04bqvdA0KDQpOaGnhu4dtIHbhu6UgMi4xIHRp4bq/biBow6BuaCB0aGFvIHTDoWMgMSBz4buRIGzhu4duaCBjxqEgYuG6o24gdHLDqm4gZGF0YXNldCAiYnd0X2NvX2RpZXVfY2hpbmgueGxzeCIsIGzDoCBkYXRhc2V0IHRo4buRbmcga8OqIGPDoWMgdGh14buZYyB0w61uaCBj4bunYSBwaOG7pSBu4buvIGtoaSBtYW5nIHRoYWkg4bufIDgga2h1IHbhu7FjIGtow6FjIG5oYXUgdsOgIMSRxrDhu6NjIGdoaSBuaOG6rW4gdOG7qyBuxINtIDE5MjUgLSAyMDA0Lg0KDQojIyBJbXBvcnQgdsOgIG3DtCB04bqjIGPGoSBi4bqjbiBkYXRhc2V0DQoNCi0gICBDw6FjIGPhu5l0IGzhuqduIGzGsOG7o3QgbMOgOg0KDQogICAgLSAgIGlkOiBLaHUgduG7sWMgKGPDsyA4IGtodSB24buxYykuDQoNCiAgICAtICAgeWVhcjogTsSDbSBs4bqleSBz4buRIGxp4buHdS4NCg0KICAgIC0gICBid3Q6IFRy4buNbmcgbMaw4bujbmcgbMO6YyBzaW5oICh0w61uaCBi4bqxbmcgb3VuY2VzLCAxIG91bmNlID0gMjguMzQ5NSBncmFtKS4NCg0KICAgIC0gICBnZXN0YXRpb246IFRo4budaSBnaWFuIG1hbmcgdGhhaSAodMOtbmggYuG6sW5nIG5nw6B5KS4NCg0KICAgIC0gICBwYXJpdHk6IFPhu5EgbOG6p24gc2luaCAoY8OzIGhhaSBnacOhIHRy4buLLCAxID0gc2luaCBs4bqnbiDEkeG6p3UsIDAgPSBraMO0bmcgcGjhuqNpIGzhuqduIMSR4bqndSkuDQoNCiAgICAtICAgYWdlOiBUdeG7lWkgY+G7p2EgbeG6uS4NCg0KICAgIC0gICBoZWlnaHQ6IENoaeG7gXUgY2FvIGPhu6dhIG3hurkgKHTDrW5oIGLhurFuZyBpbmNoZXMsIDEgaW5jaCA9IDIuNTQgY20pLg0KDQogICAgLSAgIHdlaWdodDogQ8OibiBu4bq3bmcgY+G7p2EgYsOgIG3hurkga2hpIG1hbmcgdGhhaSAodMOtbmggYuG6sW5nIHBvdW5kcywgMSBwb3VuZCA9IDAuNDUzNTkyIGtnKS4NCg0KICAgIC0gICBzbW9rZTogSMO6dCB0aHXhu5FjIGzDumMgbWFuZyB0aGFpICgxID0gY8OzLCAwID0ga2jDtG5nKS4NCg0KYGBge3IgbWVzc2FnZT1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh4bHN4KQ0KaCA8LSByZWFkLnhsc3goIkM6L1VzZXJzL0RlbGwvRG93bmxvYWRzL2J3dF9jb19kaWV1X2NoaW5oLnhsc3giLCBzaGVldEluZGV4ID0gMSwgaGVhZGVyID0gMSkgI8SR4buNYyBk4buvIGxp4buHdSB04burIGV4Y2VsIHbDoCBnw6FuIHbDoG8gb2JqZWN0IGgNCg0KaXMuZGF0YS5mcmFtZShoKSAja2nhu4NtIHRyYSB4ZW0gImgiIGPDsyBwaOG6o2kgbMOgIGRhdGEgZnJhbWUgaGF5IGtow7RuZywgbuG6v3UgxJHDum5nIHRow6wgdHJ1ZSB2w6AgbmfGsOG7o2MgbOG6oWkNCg0KbGVuZ3RoKGgpICNjaG8gcmEgc+G7kSBj4buZdCBj4bunYSAiaCINCg0KbmFtZXMoaCkgI2NobyByYSBjw6FjIHTDqm4gY+G7mXQgY+G7p2EgImgiDQoNCmRpbShoKSAjY2hvIHJhIHPhu5EgaMOgbmcgdsOgIHPhu5EgY+G7mXQgY+G7p2EgImgiDQoNCnN1bShpcy5uYShoKSkgI3Thu5VuZyBz4buRIMO0IHRy4buRbmcgY+G7p2Egb2JqZWN0IGgNCmBgYA0KDQojIyBUaOG7kW5nIGvDqiBtw7QgdOG6ow0KDQpUaOG7sWMgaGnhu4duIHRo4buRbmcga8OqIG3DtCB04bqjIGRhdGFzZXQgbsOgeSB0YSDEkcaw4bujYyBr4bq/dCBxdeG6oyBiw6puIGTGsOG7m2ksIMO9IG5naMSpYSBjw6FjIGPhu5l0IG5oxrAgc2F1Og0KDQotICAgbl9taXNzaW5nOiBz4buRIMO0IGThu68gbGnhu4d1IGLhu4sgbWlzcyh0cuG7kW5nKQ0KDQotICAgY29tcGxldGVfcmF0ZTogdOG7tyBs4buHIMO0IGPDsyBk4buvIGxp4buHdQ0KDQotICAgbWVhbjogdHJ1bmcgYsOsbmgNCg0KLSAgIHNkOiDEkeG7mSBs4buHY2ggY2h14bqpbg0KDQotICAgcDA6IGdpw6EgdHLhu4sgbmjhu48gbmjhuqV0DQoNCi0gICBwMjU6IFBow6JuIHbhu4sgdGjhu6kgbmjhuqV0DQoNCi0gICBwNTA6IFBow6JuIHbhu4sgdGjhu6kgaGFpIGPFqW5nIGNow61uaCBsw6AgdHJ1bmcgduG7iw0KDQotICAgcDc1OiBwaMOibiB24buLIHRo4bupIGJhDQoNCi0gICBwMTAwOiBnacOhIHRy4buLIGzhu5tuIG5o4bqldA0KDQotICAgaGlzdDogYmnhu4N1IMSR4buTIEhpc3RvZ3JhbQ0KDQpgYGB7ciBtZXNzYWdlPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHNraW1yKQ0Kc2tpbShoKQ0KYGBgDQoNCiMjIFLDunQgdHLDrWNoIGThu68gbGnhu4d1DQoNCmBgYHtyIHdhcm5pbmc9RkFMU0V9DQojIGzhuqV5IDIwIGTDsm5nIMSR4bqndQ0KaGVhZChoLDIwKQ0KDQojIGzhuqV5IDEwIGTDsm5nIGN14buRaQ0KdGFpbChoLDIwKQ0KDQojIMSQ4bq3dCBs4bqhaSB0w6puIGNobyBjw6FjIGPhu5l0IGPhu6dhIG9iamVjICJoIiDEkeG7gyB0aHXhuq1uIHRp4buHbiB0aGFvIHTDoWMgaMahbg0KbmFtZXMoaCkgPC0gYygiaSIsInkiLCJiIiwiZyIsInAiLCJhIiwiaGUiLCJ3IiwicyIpDQpuYW1lcyhoKQ0KDQojIyBHw6FuIGgxIGzDoCBnacOhIHRy4buLIGPhu6dhIGjDoG5nIDUgY+G7mXQgNg0KaDEgPC0gaFs1LDZdDQpzdHIoaDEpDQoNCiMjIEfDoW4gaDIgbMOgIGdpw6EgdHLhu4sgNSBow6BuZyDEkeG6p3UgdGnDqm4gY+G7p2EgY+G7mXQgImIiDQpoMiA8LSBoWzE6NSwzXQ0Kc3RyKGgyKQ0KDQojIyBHw6FuIGgzIGzDoCBnacOhIHRy4buLIGPDoWMgaMOgbmcgMSwzLDUsNyBj4bunYSBj4buZdCAiZyIgdsOgICJwIg0KaDMgPC0gaFtjKDEsMyw1LDcpLGMoNCw1KV0NCnN0cihoMykNCg0KIyMgR8OhbiBoNCBsw6Agbmjhu69uZyBow6BuZyBjw7MgZ2nDoSB0cuG7iyBsw6Aga2h1IHbhu7FjIDUNCmg0IDwtIGhbaCRpPT01LF0NCnN0cihoNCkNCg0KIyMgR8OhbiBoNSBsw6Agbmjhu69uZyBow6BuZyBjw7MgbsSDbSAxOTMwIC0+IDE5MzUNCmg1IDwtIGhbaCR5ID49IDE5MzAgJiBoJHkgPD0gMTkzNSxdDQpzdHIoaDUpDQoNCiMjIEfDoW4gaDYgbMOgIG5o4buvbmcgaMOgbmcgc2luaCBs4bqnbiDEkeG6p3UgaG/hurdjIGtow7RuZyBow7p0IHRodeG7kWMga2hpIG1hbmcgdGhhaQ0KaDYgPC0gaFtoJHAgPT0gMSB8IGgkcyA9PSAwLF0NCnN0cihoNikNCg0KIyBSw7p0IHRyw61jaCBk4buvIGxp4buHdSB24bubaSBmaWx0ZXIgdsOgIHNlbGVjdA0KazEgPC0gZmlsdGVyKGgsIGgkaGUgPiA2MCAmIGgkdyA+IDEzMCkgI2No4buNbiBuaOG7r25nIGjDoG5nIGNo4buJIMSRw6FwIOG7qW5nIMSRaeG7gXUga2nhu4duIGNhbyBoxqFuIDYwaW5jaCB2w6AgbuG6t25nIGjGoW4gMTMwIHBvdW5kDQpzdHIoazEpDQoNCmxpYnJhcnkoZHBseXIpDQprMiA8LSBzZWxlY3QoaCxpLGhlLHcpICNjaOG7iSBs4bqleSBuaOG7r25nIGPhu5l0IGtodSB24buxYywgY2hp4buBdSBjYW8gdsOgIGPDom4gbuG6t25nIHRyb25nIG9iamVjdCAiaCINCnN0cihrMikNCg0KazMgPC0gZmlsdGVyKGgsYSA+IDIwICYgdyA+IDEyMCkgJT4lIHNlbGVjdChpLGEsaGUsdykgI2No4buJIGzhuqV5IG5o4buvbmcgY+G7mXQga2h1IHbhu7FjLCB0deG7lWksIGNoaeG7gXUgY2FvLCBjw6JuIG7hurduZyB2w6AgcGjhuqNpIMSRw6FwIOG7qW5nIMSRaeG7gXUga2nhu4duIGPDsyB0deG7lWkgY2FvIGjGoW4gMjUgdsOgIGPDom4gbuG6t25nIGjGoW4gMTUwIHBvdW5kDQpzdHIoazMpDQpgYGANCg0KIyMgVOG6oW8gdGjDqm0gY+G7mXQgZOG7ryBsaeG7h3UgbeG7m2kNCg0KVGEgdGnhur9uIGjDoG5oIHRo4buxYyBow6BuaCBjw6FjIGzhu4duaCDEkeG7gyB0aMOqbSAxIHPhu5EgYmnhur9uIG3hu5tpIHThu6sgZOG7ryBsaeG7h3UgY8WpLCBuaMawIGvhur90IHF14bqjIGLDqm4gZMaw4bubaSB0YSDEkcOjIHThuqFvIHJhIG9iamVjdCBt4bubaSBsw6AgKip0aW5oKiogduG7m2kgY8OhYyBk4buvIGxp4buHdSBjxakgY+G7p2EgKipoKiogdsOgIHRow6ptIDUgYmnhur9uIG3hu5tpIGzDoDogDQoNCi0gY206IEzDoCBjaGnhu4F1IGNhbyB24bubaSDEkcahbiB24buLIGzDoCBjbSANCg0KLSBrZzogbMOgIGPDom4gbuG6t25nIHbhu5tpIMSRxqFuIHbhu4sgbMOgIGtnIA0KDQotIGJtaTogbMOgIGNo4buJIHPhu5EgYm1pIMSRxrDhu6NjIHTDrW5oIHThu6sgY20gdsOgIGtnIA0KDQotIHRpZXVjaHVhbjogxJHDoW5oIGdpw6EgbeG7qWMgxJHhu5kgY8OibiBu4bq3bmcgcGjDuSBo4bujcCB0aGVvIHRpw6p1IGNodeG6qW4gYm1pDQoNCmBgYHtyfQ0KDQojIyB0aMOqbSBj4buZdCBjaGnhu4F1IGNhbyB24bubaSDEkcahbiB24buLIGzDoCBjbSwgY8OibiBu4bq3bmcgduG7m2kgxJHGoW4gduG7iyBsw6Aga2cgdsOgIGPhu5l0IGNo4buJIHPhu5EgYm1pOiBj4buZdCBjbSDEkcaw4bujYyB0w61uaCBi4bqxbmcgY+G7mXQgaGUgbmjDom4gY2hvIDIuNTQsIHTGsMahbmcgdOG7sSBjw6FjIGPhu5l0IHNhdQ0KDQp0aW5oIDwtIG11dGF0ZShoLCBjbSA9IGhlKjIuNTQpIA0KdGluaCA8LSBtdXRhdGUodGluaCxrZz13KjAuNDUzNTkyKSANCg0KdGluaCA8LSBtdXRhdGUodGluaCxibWk9a2cvKChjbS8xMDApXjIpKSANCnN0cih0aW5oKQ0KDQpgYGANCg0KDQojIE5oaeG7h20gduG7pSAyLjINCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiMjIFTDs20gdOG6r3QNCg0KTmhp4buHbSB24bulIDIuMiB0aOG7sWMgaMOgbmggbmjhu69uZyB0aGFvIHTDoWMgduG7gSBi4buZIGThu68gbGnhu4d1ICoqQmlsbGlvbmFpcmVzIFN0YXRpc3RpY3MgRGF0YXNldCoqLCBsw6AgYuG7mSBk4buvIGxp4buHdSB0aOG7kW5nIGvDqiB24buBIG3hu5l0IHPhu5EgxJFp4buDbSBu4buVaSBi4bqtdCBj4bunYSBjw6FjIHThu7cgcGjDuiB0csOqbiB0aOG6vyBnaeG7m2kgdMOtbmggxJHhur9uIG7Eg20gMjAyMy4gQ2hpIHRp4bq/dCBjw6FjIGJp4bq/biB0cm9uZyBi4buZIGThu68gbGnhu4d1IG5oxrAgc2F1Og0KDQotICAgUmFuazogVGjhu6kgaOG6oW5nIGPhu6dhIHThu7cgcGjDuiB4w6l0IHbhu4EgbeG7qWMgxJHhu5kgZ2nDoHUgY8OzLg0KDQotICAgRmluYWxXb3J0aDogR2nDoSB0cuG7iyByw7JuZyBjdeG7kWkgY8O5bmcgY+G7p2EgdOG7tyBwaMO6IHTDrW5oIGLhurFuZyDEkcO0IGxhIE3hu7kuDQoNCi0gICBwZXJzb25OYW1lOiBUw6puIMSR4bqneSDEkeG7pyBj4bunYSB04bu3IHBow7ouDQoNCi0gICBhZ2U6IFR14buVaSBj4bunYSB04bu3IHBow7ouDQoNCi0gICBjb3VudHJ5OiBRdeG7kWMgZ2lhIG7GoWkgdOG7tyBwaMO6IGPGsCB0csO6Lg0KDQotICAgc291cmNlOiBOZ3Xhu5NuIGfhu5FjIHPhu7EgZ2nDoHUgY8OzIGPhu6dhIHThu7cgcGjDui4NCg0KLSAgIGluZHVzdHJpZXM6IEPDoWMgbmfDoG5oIG5naOG7gSBn4bqvbiBsaeG7gW4gduG7m2kgbOG7o2kgw61jaCBraW5oIGRvYW5oIGPhu6dhIHThu7cgcGjDui4NCg0KLSAgIGNvdW50cnlPZkNpdGl6ZW5zaGlwOiBRdeG7kWMgdOG7i2NoIGPhu6dhIHThu7cgcGjDui4NCg0KLSAgIHNlbGZNYWRlOiBDaG8gYmnhur90IHThu7cgcGjDuiBjw7MgcGjhuqNpIGzDoCBuZ8aw4budaSB04buxIGzhuq1wIGhheSBraMO0bmcgKMSQw7puZy9TYWkpLg0KDQotICAgc3RhdHVzOiAiRCIgxJHhuqFpIGRp4buHbiBjaG8gdOG7tyBwaMO6IHThu7EgdGjDom4gKE5nxrDhu51pIHPDoW5nIGzhuq1wL0RvYW5oIG5ow6JuKSB2w6AgIlUiIGJp4buDdSB0aOG7iyB0w6BpIHPhuqNuIMSRxrDhu6NjIHRo4burYSBr4bq/IGhv4bq3YyBraMO0bmcga2nhur9tIMSRxrDhu6NjLg0KDQotICAgZ2VuZGVyOiBHaeG7m2kgdMOtbmggY+G7p2EgdOG7tyBwaMO6KE0gbMOgIG5hbSwgRiBsw6AgbuG7rykNCg0KLSAgIHRpdGxlOiBDaOG7qWMgduG7pSBj4bunYSB04bu3IHBow7oNCg0KLSAgIGxpZmVfZXhwZWN0YW5jeV9jb3VudHJ5OiBUdeG7lWkgdGjhu40g4bufIMSR4bqldCBuxrDhu5tjIHThu7cgcGjDui4NCg0KLSAgIHRheF9yZXZlbnVlX2NvdW50cnlfY291bnRyeTogRG9hbmggdGh1IHRodeG6vyDhu58gcXXhu5FjIGdpYSBj4bunYSB04bu3IHBow7ouDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjDQrEkOG6p3UgdGnDqm4sIHRhIGfDoW4gb2JqZWN0ICoqYSoqIGzDoCBkYXRhc2V0ICoqQmlsbGlvbmFpcmVzIFN0YXRpc3RpY3MgRGF0YXNldCoqLCBzYXUgxJHDsyB0aeG6v24gaMOgbmggdGjhu7FjIGhp4buHbiBs4buHbmggdGjhu5FuZyBrw6ogb2JqZWN0ICoqYSoqLCB0YSDEkcaw4bujYyBr4bq/dCBxdeG6oyBuaMawIHNhdToNCg0KLSAqKmEqKiBjw7MgMjY0MCBow6BuZyB2w6AgMTQgY+G7mXQNCg0KLSBDw7MgOCBiaeG6v24ga8O9IHThu7EsIDEgYmnhur9uIGxvZ2ljIHbDoCA1IGJp4bq/biDEkeG7i25oIGThuqFuZyBz4buRDQoNCi0gQ8OhYyDEkeG6t2MgxJFp4buDbSBu4buVaSBi4bqtdCBj4bunYSB0aOG7kW5nIGvDqiB24buBIGPDoWMgYmnhur9uIGvDvSB04buxOg0KDQogICAgLSBCaeG6v24gKipjb3VudHJ5KiogY8OzIDM4IGThu68gbGnhu4d1IGLhu4sgbWlzcyBjaGnhur9tIHThu7cgbOG7hyAwLDAxIHbDoCBiaeG6v24gKip0aXRsZSoqIGLhu4sgbWlzcyAyMzAxIGThu68gbGnhu4d1IGNoaeG6v20gdOG7tyBs4buHIDAsODcuDQogICAgDQogICAgLSBT4buRIGvDvSB04buxIHRyb25nIDEgw7Qgbmhp4buBdSBuaOG6pXQgbMOgIDYwIGvDvSB04buxKG7hurFtIOG7nyBj4buZdCAqKnRpdGxlKiopIHbDoCDDrXQgbmjhuqV0IGzDoCAxIGvDvSB04buxKG7hurFtIOG7nyBj4buZdCAqKnN0YXR1cyoqIHbDoCAqKmdlbmRlcioqKQ0KICAgIA0KICAgIC0gbl91bmlxdWU6IFPhu5EgbMaw4bujbmcgZ2nDoSB0cuG7iyBkdXkgbmjhuqV0IHJpw6puZyBiaeG7h3QgdHJvbmcgbeG7l2kgYmnhur9uLCBuaMawIOG7nyDEkcOieSB0YSBjw7MgxJHGsOG7o2MgYmnhur9uICoqcGVyc29uTmFtZSoqIGPDsyBuaGnhu4F1IGThu68gbGnhu4d1IHJpw6puZyBiaeG7h3QgbmjhuqV0IHbhu5tpIDI2MzggcXVhbiBzw6F0IHJpw6puZyBiaeG7h3QuDQogICAgDQotIEJp4bq/biAqKnNlZk1hZGUqKiB24bubaSDEkeG7i25oIGThuqFuZyBk4buvIGxp4buHdSBsb2dpYyB0aOG7kW5nIGvDqiDEkcaw4bujYyAxODEyIGdpw6EgdHLhu4sgKip0cnVlKiogY2hvIGJp4bq/dCAxODEyIHThu7cgcGjDuiBsw6AgdOG7sSBs4bqtcCB2w6AgbmfGsOG7o2MgbOG6oWkgODI4IHThu7cgcGjDuiBsw6Aga2jDtG5nIHThu7EgbOG6rXANCg0KLSBDw6FjIMSR4bq3YyDEkWnhu4NtIG7hu5VpIGLhuq10IGPhu6dhIHRo4buRbmcga8OqIGNobyBk4buvIGxp4buHdSDEkeG7i25oIGThuqFuZyBz4buROg0KDQogICAgLSBDw6FjIGJp4bq/biAqKmFnZSoqLCAqKmxpZmVfZXhwZWN0YW5jeV9jb3VudHJ5KiosICoqdGF4X3JldmVudWVfY291bnRyeV9jb3VudHJ5KiogY8OzIGzhuqduIGzGsOG7o3QgbMOgIDY1LCAxODIsIDE4MyBk4buvIGxp4buHdSBi4buLIG1pc3MuDQogICAgDQogICAgLSBHacOhIHRy4buLIHRydW5nIGLDrG5oKGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgga2jDtG5nIGPDsyBnacOhIHRy4buLIG7Dqm4gdGEga2jDtG5nIHTDrW5oIMSR4bq/biBiaeG6v24gKipyYW5rKiopOiBmaW5hbFdvcnRoPTQ2MjMuNzksIGxpZmVfZXhwZWN0YW5jeV9jb3VudHJ5PTc4LjEyLCB0YXhfcmV2ZW51ZV9jb3VudHJ5X2NvdW50cnk9MTIuNTUsIGFnZT02NS4xNA0KICAgIA0KICAgIC0gVMawxqFuZyB04buxIHRhIGJp4bq/dCDEkcaw4bujYyBjw6FjIGdpw6EgdHLhu4sgxJHhu5kgbOG7h2NoIGNodeG6qW4sIGdpw6EgdHLhu4sgbmjhu48gbmjhuqV0LCB0cnVuZyB24buLLCBs4bubbiBuaOG6pXQgdsOgIGJp4buDdSDEkeG7kyBoaXN0b2dyYW0NCiAgICANCg0KDQpgYGB7cn0NCmxpYnJhcnkoeGxzeCkNCmEgPC0gcmVhZC54bHN4KCJDOi9Vc2Vycy9EZWxsL09uZURyaXZlL1VGTS9SL0JpbGxpb25haXJlcyBTdGF0aXN0aWNzIERhdGFzZXQueGxzeCIsIHNoZWV0SW5kZXggPSAxLCBoZWFkZXIgPSAxKQ0KbGlicmFyeShza2ltcikNCnNraW0oYSkNCmBgYA0KDQojIyBY4butIGzDrSBk4buvIGxp4buHdSBi4buLIHRoaeG6v3UNCg0KU2F1IGtoaSBtw7QgdOG6oyBjxqEgYuG6o24gY8OhYyB0aHXhu5ljIHTDrW5oIGPhu6dhIGRhdGFzZXQsIGPDsyB4deG6pXQgaGnhu4duIGPDoWMgZOG7ryBsaeG7h3UgYuG7iyBtaXNzLCB0YSBjw7MgdGjhu4MgdGnhur9uIGjDoG5oIHjhu60gbMOtIGPDoWMgZOG7ryBsaeG7h3UgYuG7iyBtaXNzIGPhu6dhIGPDoWMgYmnhur9uIGPDsyDEkeG7i25oIGThuqFuZyBz4buRIGJhbyBn4buTbSAqKmFnZSoqLCAqKmxpZmVfZXhwZWN0YW5jeV9jb3VudHJ5KiogdsOgICoqdGF4X3JldmVudWVfY291bnRyeV9jb3VudHJ5KiogYuG6sW5nIGPDoWNoIHRow6ptIGPDoWMgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBiaeG6v24gdsOgbyBjw6FjIMO0IGThu68gbGnhu4d1IGLhu4sgbWlzcyBi4bufaSB2w6wgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBz4bq9IGtow7RuZyBsw6BtIGJp4bq/biDEkeG7mW5nIG5oaeG7gXUgY8OhYyB0aOG7kW5nIGvDqiBraMOhYyBj4bunYSBiaeG6v24gZOG7ryBsaeG7h3UuDQoNCmBgYHtyfQ0KYSRhZ2VbaXMubmEoYSRhZ2UpXSA8LSBtZWFuKGEkYWdlLG5hLnJtID0gVCkNCg0Kc3VtKGlzLm5hKGEkYWdlKSkNCg0KYSRsaWZlX2V4cGVjdGFuY3lfY291bnRyeVtpcy5uYShhJGxpZmVfZXhwZWN0YW5jeV9jb3VudHJ5KV0gPC0gbWVhbihhJGxpZmVfZXhwZWN0YW5jeV9jb3VudHJ5LG5hLnJtID0gVCkNCg0Kc3VtKGlzLm5hKGEkbGlmZV9leHBlY3RhbmN5X2NvdW50cnkpKQ0KDQphJHRheF9yZXZlbnVlX2NvdW50cnlfY291bnRyeVtpcy5uYShhJHRheF9yZXZlbnVlX2NvdW50cnlfY291bnRyeSldIDwtIG1lYW4oYSR0YXhfcmV2ZW51ZV9jb3VudHJ5X2NvdW50cnksbmEucm0gPSBUKQ0KDQpzdW0oaXMubmEoYSR0YXhfcmV2ZW51ZV9jb3VudHJ5X2NvdW50cnkpKQ0KYGBgDQojIyBSw7p0IHRyw61jaCBk4buvIGxp4buHdQ0KVGEgc+G6vSBnaeG6oyBz4butIHbhu5tpIG3hu5l0IHPhu5EgdsOtIGThu6UgbmjGsCBzYXU6DQotIENo4buJIGzDoG0gdmnhu4djIHbhu5tpIGPDoWMgdOG7tyBwaMO6IG7hurFtIHRyb25nIHRvcCAzMA0KDQotIENo4buNbiBuaOG7r25nIHThu7cgcGjDuiBjw7MgZ2nDoSB0cuG7iyB0w6BpIHPhuqNuIHLDsm5nIGzhu5tuIGjGoW4gNjAwMDANCg0KLSBDaOG7jW4gbmjhu69uZyB04bu3IHBow7ogdHLDqm4gNzAgdHXhu5VpIHbDoCBjw7MgcXXhu5FjIHThu4tjaCBN4bu5DQoNCi0gQ2jhu4kgbMOgbSB2aeG7h2MgduG7m2kgY8OhYyBiaeG6v24gKipSYW5rKiosICoqRmluYWxXb3J0aCoqLCAqKmFnZSoqLCAqKmdlbmRlcioqIG3DoCB0w6BpIHPhuqNuIGtow7RuZyBwaOG6o2kgdGjhu6thIGvhur8uDQoNCmBgYHtyfQ0KdG9wMzAgPC0gaGVhZChhLDMwKQ0Kc3RyKHRvcDMwKQ0KDQp0YWlzYW4gPC0gYVthJGZpbmFsV29ydGg+NjAwMDAsXQ0Kc3RyKHRhaXNhbikNCg0KdHVvaTcwIDwtIGFbYSRhZ2U+NzAgJiBhJGNvdW50cnlPZkNpdGl6ZW5zaGlwID09ICdVbml0ZWQgU3RhdGVzJyxdDQpzdHIodHVvaTcwKQ0KDQpsaWJyYXJ5KGRwbHlyKQ0KYTEgPC0gZmlsdGVyKGEsIHN0YXR1cz09J0QnKSAlPiUgc2VsZWN0KHJhbmssZmluYWxXb3J0aCwgYWdlLCBnZW5kZXIpDQpzdHIoYTEpDQoNCmBgYA0KIyMgVOG6oW8gZOG7ryBsaeG7h3UgbeG7m2kuDQpUYSBz4bq9IHThuqFvIHRow6ptIGPDoWMgYmnhur9uIG3hu5tpIGNobyBkYXRhc2V0IHbDoCBnw6FuIG7DsyB0aMOgbmggb2JqZWN0ICoqYioqOg0KDQotIFRow6ptIGPhu5l0ICoqbWludXNfYWdlKiogduG7m2kgZOG7ryBsaeG7h3UgbMOgIGPhu5l0ICoqYWdlKiogdHLhu6sgY2hvICoqbGlmZV9leHBlY3RhbmN5X2NvdW50cnkqKi4NCg0KLSBUaMOqbSBj4buZdCAqKnNvc2FuaCoqIMSR4buDIHNvIHPDoW5oIGThu68gbGnhu4d1IGdp4buvYSBj4buZdCAqKmFnZSoqIHbDoCBj4buZdCAqKmxpZmVfZXhwZWN0YW5jeV9jb3VudHJ5KiosIG7hur91IGPhu5l0ICoqYWdlKiogbOG7m24gaMahbiB0aMOsIHPhur0gaGnhu4duIGThu68gbGnhu4d1IGzDoCAibOG7m24gaMahbiIgbmfGsOG7o2MgbOG6oWkgdGjDrCBsw6AgIm5o4buPIGjGoW4iIHbDoCAiYuG6sW5nIG5oYXUiDQoNCmBgYHtyfQ0KYiA8LSBtdXRhdGUoYSxtaW51c19hZ2U9YWdlLWxpZmVfZXhwZWN0YW5jeV9jb3VudHJ5KSAlPiUgbXV0YXRlKHNvc2FuaD1jYXNlX3doZW4oYSRhZ2UgPiBhJGxpZmVfZXhwZWN0YW5jeV9jb3VudHJ5IH4gJ2zhu5tuIGjGoW4nLGEkYWdlIDwgYSRsaWZlX2V4cGVjdGFuY3lfY291bnRyeSB+ICduaOG7jyBoxqFuJyxhJGFnZSA9PSBhJGxpZmVfZXhwZWN0YW5jeV9jb3VudHJ5IH4gJ2LhurFuZyBuaGF1JykpDQoNCnN0cihiKQ0KYGBgDQoNCg0KDQo=