1 Giới thiệu bộ dữ liệu
Bộ dữ liệu có 675 quan sát và 12 biến gồm :
School: trình độ học của trẻ (“Hauptschule”,
“Realschule” và “Gymnasium”, tương ứng với các ý nghĩa là trường cấp hai
có chương trình học phổ thông đại trà, trường cấp hai có chương trình
học phổ thông nâng cao và trường cấp hai dành cho học sinh khá,
giỏi.)
Birthyear: năm sinh của trẻ
Gender: giới tính (Có 2 biểu hiện female: nữ, male:
nam)
Kids: số con trong nhà
Parity: thứ tự sinh của người khảo sát
Income: thu nhập trong gia đình (Đơn vị EURO)
Size: qui mô gia đình (Số người trong gia đình)
State: tiểu bang sinh sống
Marital: tình trạng hôn nhân của mẹ người khảo sát
(Có 5 biểu hiện gồm “maried”: đã kết hôn, “widowed”: góa, “divorced”: li
dị, “separated”: li thân, “single”: độc thân)
Meducation: trình độ giáo dụng của người mẹ
Memployment: yếu tố quyết định mức độ việc làm của
người mẹ (Có 3 biểu hiện gồm “fulltime”: toàn thời gian, “partime”: bán
thời gian và “none”: không có việc làm)
Year: năm thực hiện khảo sát
library(magrittr)
## Warning: package 'magrittr' was built under R version 4.3.1
library(scales)
## Warning: package 'scales' was built under R version 4.3.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.1
##
## 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
library(forcats)
library(AER)
## Warning: package 'AER' was built under R version 4.3.3
## Loading required package: car
## Warning: package 'car' was built under R version 4.3.1
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## Loading required package: lmtest
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: sandwich
## Loading required package: survival
library(epitools)
## Warning: package 'epitools' was built under R version 4.3.1
##
## Attaching package: 'epitools'
## The following object is masked from 'package:survival':
##
## ratetable
1.1 Thống kê mô tả
library(readxl)
## Warning: package 'readxl' was built under R version 4.3.3
data <- read_excel("C:/Users/Dell/Downloads/GSOEP9402.xlsx")
View(data)
str(data)
## tibble [675 × 13] (S3: tbl_df/tbl/data.frame)
## $ rownames : num [1:675] 1 2 3 4 5 6 7 8 9 10 ...
## $ school : chr [1:675] "Gymnasium" "Gymnasium" "Gymnasium" "Gymnasium" ...
## $ birthyear : num [1:675] 1981 1981 1980 1984 1982 ...
## $ gender : chr [1:675] "female" "female" "female" "female" ...
## $ kids : num [1:675] 2 2 3 1 4 3 3 1 4 2 ...
## $ parity : num [1:675] 2 2 3 1 4 1 3 1 4 2 ...
## $ income : num [1:675] 35160 65748 120962 60101 34829 ...
## $ size : num [1:675] 4 3 3 3 4 5 3 3 5 4 ...
## $ state : chr [1:675] "Berlin" "Berlin" "Berlin" "Berlin" ...
## $ marital : chr [1:675] "married" "married" "married" "married" ...
## $ meducation : num [1:675] 14.5 10.5 12 10.5 10 15 15 13 15 9 ...
## $ memployment: chr [1:675] "none" "parttime" "parttime" "parttime" ...
## $ year : num [1:675] 1995 1995 1994 1998 1996 ...
head(data)
1.2 Các dạng đồ thị
School là biến thể hiện loại trường trung học cơ sở, gồm 3 biểu
hiện:
table(data$school)
##
## Gymnasium Hauptschule Realschule
## 277 199 199
round((table(data$school)/sum(table(data$school))*100),2)
##
## Gymnasium Hauptschule Realschule
## 41.04 29.48 29.48
Có 277 trường cấp 2 dành cho học sinh khá giỏi chiếm tỷ lệ
41.04%
Có 199 trường cấp 2 có chương trình học đại trà chiếm tỷ lệ
29.48%
Có 199 trường cấp 2 có chương trình học nâng cao chiếm tỷ lệ
29.48%
data %>% ggplot(map = aes(x=school, y= after_stat(count)))+geom_bar(fill = 'pink')+geom_text(aes(label=percent(after_stat(count/sum(count)),accuracy = .01)), stat = 'count', color = 'white',vjust = 4) + labs(tiltle = 'Độ thị thể hiện số lượng học sinh đang theo học tại từng loại trường THCS', x = 'Loại trường THCS', y = 'số lượng học sinh')

- Như vậy, loại trường có số học sinh theo học nhiều nhất là trường
trung học cơ sở dành cho học sinh khá giỏi, cùng nhiều hơn hai loại
trường còn lại 78 học sinh (khoảng 11.56%). Loại trường trung học cơ sở
có chương trình đại trà và loại trung học cơ sở chương trình nâng cao
đều có cùng số người theo học là 199 người (chiếm 29.48% so với tổng
thể).
table(data$gender)
##
## female male
## 348 327
round((table(data$gender)/sum(table(data$gender))*100),2)
##
## female male
## 51.56 48.44
data |>ggplot(aes(gender))+geom_bar()
Trong 675 học sinh trung học cở được khảo sát có:
- 327 học sinh thuộc giới tính nam (48,44%)
- 348 học sinh thuộc giới tính nữ ( chiếm 51,56%) Như vậy trong tổng
số học sinh được khảo sát số học sinh có giới tính nữ nhiều hơn số học
sinh có giới tính nam 21 người (khoảng 3,12% so với tổng số học
sinh).
table(data$marital)
##
## divorced married separated single widowed
## 59 566 29 11 10
round((table(data$marital)/sum(table(data$marital))*100),2)
##
## divorced married separated single widowed
## 8.74 83.85 4.30 1.63 1.48
data %>% ggplot(map=aes(forcats::fct_infreq(marital))) + geom_bar(fill ='lightpink') + geom_text(aes(label=scales::percent(after_stat(count/sum(count)), accuracy= 0.01)), stat = 'count', color = 'darkblue', hjust = 0.5) + labs(title = 'Biểu đồ thể hiện tình trạng hôn nhân của mẹ người được khảo sát', y = 'Số lượng', x = 'Tình trạng hôn nhân') + coord_flip()

Tình trạng hôn nhân của mẹ các học sinh trung học cơ sở được khảo
sát, chia thành 5 nhóm gồm:
- Đã kết hôn có 566 người, chiếm 83,85%
- Li hôn có 59 người, chiếm 8,74%
- Ly thân có 29 người, chiếm 4,3%
- Độc thân có 11 người, chiếm 1,63%
- Góa chồng có 10 người, chiếm 1,48%
table(data$memployment)
##
## fulltime none parttime
## 89 302 284
round(table(data$memployment)/sum(table(data$memployment))*100,2)
##
## fulltime none parttime
## 13.19 44.74 42.07
data %>% ggplot(aes(x = memployment, y = after_stat(count))) + geom_bar(fill = 'salmon') + labs(title = 'Biểu đồ thể hiện tình trạng việc làm của mẹ người khảo sát')

d1 <- table(data$memployment)
d1 <- data |> group_by(memployment) |> summarise(freq = n()) |> mutate(d1, per = freq/sum(freq))
d1 %>% ggplot(aes(x = '', y = per, fill = memployment)) +
geom_bar(stat = 'identity') +
coord_polar('y')+
geom_text(aes(label = paste0(round(per*100), "%")), position = position_stack(vjust = 0.5))

Tình trạng việc làm của người mẹ 675 học sinh được khảo sát được chia
làm 3 nhóm gồm:
- Làm việc toàn thời gian (fulltime): có 89 người, chiếm khoảng
13%.
- Làm việc bán thời gian (parttime): 284 người, chiếm khoảng 42%.
- Không có việc làm (none): 302 người, chiếm khoảng 45%
1.3 Bảng tần số - bảng tần suất
tmp <- table(data$gender,data$school)
prop.table(tmp)
##
## Gymnasium Hauptschule Realschule
## female 0.2237037 0.1422222 0.1496296
## male 0.1866667 0.1525926 0.1451852
addmargins(tmp)
##
## Gymnasium Hauptschule Realschule Sum
## female 151 96 101 348
## male 126 103 98 327
## Sum 277 199 199 675
data %>% count(school,gender) %>% group_by(school) %>% mutate(psl=n/sum(n)) %>% ggplot(aes(x=school, y = n, fill = gender)) + geom_col()+geom_text(aes(label= percent(psl, accuracy = .01)), position = position_stack(vjust = 0.5), size = 3) + ylab('số học sinh') + xlab('loại trường THCS')
Kết quả trên cho chúng ta biết số lượng học sinh ở từ loại trường học
theo giới tính, trong tổng số 675 học sinh được khảo sát
- Loại trường trung học cơ sở chương trình đại trà có 103 học sinh nam
(khoảng 15,26%), và 96 học sinh nữ (khoảng 14,22%).
- Loại trường trung học cở sở chương trình nâng cao có 98 học sinh nam
(khoảng 14,52%), và 101 học sinh nữ (14,97%)
- Loại trường trung học cở sở dành cho học sinh khá giỏi có 126 học
sinh nam (khoảng 18,67%), và 151 học sinh nữ (22,37%)
Như vậy trong loại trường trung cơ sở chương trình đại trà có tỉ lệ
học sinh nam nhiều hơn học sinh nữ 7 học sinh. Ở loại trường trung học
cơ sở chương trình nâng cao và loại trường trung học cơ sở dành cho học
sinh khá giỏi thì tỉ lệ học sinh nữ nhiều hơn học sinh nam lần lượt là 3
học sinh và 25 học sinh.
Trong phần trăm giới tính học sinh ở từng loại trường của 675 người
được khảo sát, tỉ lệ học sinh nữ ở trường trung học cơ sở dành cho học
sinh khá giỏi chiếm nhiều nhất (151 học sinh, 22,37%), tỉ lệ học sinh nữ
ở loại trường trung học cơ sở chương trình đại trà là thấp nhất (96
người, 14,22%).
1.4 Relative Risk/Risk Ratio
library(epiR)
## Warning: package 'epiR' was built under R version 4.3.3
## Package epiR 2.0.74 is loaded
## Type help(epi.about) for summary information
## Type browseVignettes(package = 'epiR') to learn how to use epiR for applied epidemiological analyses
##
school2 <- forcats::fct_collapse(data$school, "trường khá"= c("Hauptschule","Realschule"), "trường giỏi"=c("Gymnasium"))
data<- mutate(data,school2)
tmp <- table(data$gender,data$school2)
addmargins(tmp)
##
## trường giỏi trường khá Sum
## female 151 197 348
## male 126 201 327
## Sum 277 398 675
riskratio(tmp)
## $data
##
## trường giỏi trường khá Total
## female 151 197 348
## male 126 201 327
## Total 277 398 675
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## female 1.000000 NA NA
## male 1.085829 0.9574756 1.231388
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## female NA NA NA
## male 0.200976 0.2108657 0.1996713
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
epitab(tmp, method = 'riskratio',rev = 'c')
## $tab
##
## trường khá p0 trường giỏi p1 riskratio lower
## female 197 0.5660920 151 0.4339080 1.0000000 NA
## male 201 0.6146789 126 0.3853211 0.8880248 0.7402228
##
## upper p.value
## female NA NA
## male 1.065339 0.2108657
##
## $measure
## [1] "wald"
##
## $conf.level
## [1] 0.95
##
## $pvalue
## [1] "fisher.exact"
1.5 Tỷ lệ chênh (Odd Ratio)
oddsratio(tmp)
## $data
##
## trường giỏi trường khá Total
## female 151 197 348
## male 126 201 327
## Total 277 398 675
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## female 1.000000 NA NA
## male 1.222218 0.8986989 1.663859
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## female NA NA NA
## male 0.200976 0.2108657 0.1996713
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Tỉ lệ giữa xác suất học sinh trường khá và xác suất học sinh trường
giỏi trong những học sinh giới tính nam so với Tỉ lệ giữa xác suất học
sinh trường khá và xác suất học sinh trường giỏi trong những học sinh
giới tính nữ là 1,22.
Con số này cho biết tỉ lệ khả năng học sinh nam học tại trường khá
cao hơn 22% so với tỉ lệ học sinh nữ học tai loại trường này.
oddsratio(tmp,rev = 'c')
## $data
##
## trường khá trường giỏi Total
## female 197 151 348
## male 201 126 327
## Total 398 277 675
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## female 1.0000000 NA NA
## male 0.8181854 0.6010126 1.11272
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## female NA NA NA
## male 0.200976 0.2108657 0.1996713
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Tỉ lệ giữa học sinh nam học tại trường giỏi và học sinh nam học tại
trường khá so với tỉ lệ học sinh học nữ tại trường giỏi và học sinh học
nữ tại trường khá là 0,81.
Con số này cho biết, tỉ lệ học sinh nam tại trường loại giỏi ít hơn
18% so tỉ lệ học sinh nữ
1.6 Khoảng ước lượng tỷ lệ
tmp <- data[data$size > 4,]
prop.test(length(data$size), length(data$size), p = 0.35)
##
## 1-sample proportions test with continuity correction
##
## data: length(data$size) out of length(data$size), null probability 0.35
## X-squared = 1250.7, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.35
## 95 percent confidence interval:
## 0.9929454 1.0000000
## sample estimates:
## p
## 1
LS0tDQp0aXRsZTogIlBURExEVCINCmF1dGhvcjogIsSQ4bq2TkcgVEhBTkggVFLDmkMiDQpkYXRlOiAiMjAyNC0wNi0wMSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogIHBkZl9kb2N1bWVudDoNCiAgICBleHRyYV9kZXBlbmRlbmNpZXM6DQogICAgICB2aWV0bmFtOiB1dGY4DQogICAgdG9jOiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICB3b3JkX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCmdlb21ldHJ5Og0KICAgICAgLSBpbm5lcj0zY20NCiAgICAgIC0gb3V0ZXI9NGNtDQogICAgICAtIHRvcD0zY20NCiAgICAgIC0gYm90dG9tPTRjbQ0KICAgICAgLSBoZWFkc2VwPTIycHQNCiAgICAgIC0gaGVhZGhlaWdodD0xMXB0DQogICAgICAtIGZvb3Rza2lwPTMzcHQNCiAgICAgIC0gaWdub3JlaGVhZA0KICAgICAgLSBpZ25vcmVmb290DQogICAgICAtIGhlaWdodHJvdW5kZWQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KIyAqKkLDgEkgVEjhu7BDIEjDgE5IIFRV4bqmTiAzKioNCg0KIyAgKioxIEdp4bubaSB0aGnhu4d1IGLhu5kgZOG7ryBsaeG7h3UqKiANCg0KQuG7mSBk4buvIGxp4buHdSBjw7MgNjc1IHF1YW4gc8OhdCB2w6AgMTIgYmnhur9uIGfhu5NtIDogDQoNCioqU2Nob29sKio6IHRyw6xuaCDEkeG7mSBo4buNYyBj4bunYSB0cuG6uyAo4oCcSGF1cHRzY2h1bGXigJ0sIOKAnFJlYWxzY2h1bGXigJ0gdsOgIOKAnEd5bW5hc2l1beKAnSwgdMawxqFuZyDhu6luZyB24bubaSBjw6FjIMO9IG5naMSpYSBsw6AgdHLGsOG7nW5nIGPhuqVwIGhhaSBjw7MgY2jGsMahbmcgdHLDrG5oIGjhu41jIHBo4buVIHRow7RuZyDEkeG6oWkgdHLDoCwgdHLGsOG7nW5nIGPhuqVwIGhhaSBjw7MgY2jGsMahbmcgdHLDrG5oIGjhu41jIHBo4buVIHRow7RuZyBuw6JuZyBjYW8gdsOgIHRyxrDhu51uZyBj4bqlcCBoYWkgZMOgbmggY2hvIGjhu41jIHNpbmgga2jDoSwgZ2nhu49pLikNCg0KKipCaXJ0aHllYXIqKjogbsSDbSBzaW5oIGPhu6dhIHRy4bq7DQoNCioqR2VuZGVyKio6IGdp4bubaSB0w61uaCAoQ8OzIDIgYmnhu4N1IGhp4buHbiBmZW1hbGU6IG7hu68sIG1hbGU6IG5hbSkNCg0KKipLaWRzKio6IHPhu5EgY29uIHRyb25nIG5ow6ANCg0KKipQYXJpdHkqKjogdGjhu6kgdOG7sSBzaW5oIGPhu6dhIG5nxrDhu51pIGto4bqjbyBzw6F0DQoNCioqSW5jb21lKio6IHRodSBuaOG6rXAgdHJvbmcgZ2lhIMSRw6xuaCAoxJDGoW4gduG7iyBFVVJPKQ0KDQoqKlNpemUqKjogcXVpIG3DtCBnaWEgxJHDrG5oIChT4buRIG5nxrDhu51pIHRyb25nIGdpYSDEkcOsbmgpDQoNCioqU3RhdGUqKjogdGnhu4N1IGJhbmcgc2luaCBz4buRbmcNCg0KKipNYXJpdGFsKio6IHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBj4bunYSBt4bq5IG5nxrDhu51pIGto4bqjbyBzw6F0IChDw7MgNSBiaeG7g3UgaGnhu4duIGfhu5NtIOKAnG1hcmllZOKAnTogxJHDoyBr4bq/dCBow7RuLCDigJx3aWRvd2Vk4oCdOiBnw7NhLCDigJxkaXZvcmNlZOKAnTogbGkgZOG7iywg4oCcc2VwYXJhdGVk4oCdOiBsaSB0aMOibiwg4oCcc2luZ2xl4oCdOiDEkeG7mWMgdGjDom4pDQoNCioqTWVkdWNhdGlvbioqOiB0csOsbmggxJHhu5kgZ2nDoW8gZOG7pW5nIGPhu6dhIG5nxrDhu51pIG3hurkNCg0KKipNZW1wbG95bWVudCoqOiB54bq/dSB04buRIHF1eeG6v3QgxJHhu4tuaCBt4bupYyDEkeG7mSB2aeG7h2MgbMOgbSBj4bunYSBuZ8aw4budaSBt4bq5IChDw7MgMyBiaeG7g3UgaGnhu4duIGfhu5NtIOKAnGZ1bGx0aW1l4oCdOiB0b8OgbiB0aOG7nWkgZ2lhbiwg4oCccGFydGltZeKAnTogYsOhbiB0aOG7nWkgZ2lhbiB2w6Ag4oCcbm9uZeKAnToga2jDtG5nIGPDsyB2aeG7h2MgbMOgbSkNCg0KKipZZWFyKio6IG7Eg20gdGjhu7FjIGhp4buHbiBraOG6o28gc8OhdA0KDQoNCmBgYHtyfQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZm9yY2F0cykNCmxpYnJhcnkoQUVSKQ0KbGlicmFyeShlcGl0b29scykNCmBgYA0KDQojIyAqKjEuMSBUaOG7kW5nIGvDqiBtw7QgdOG6oyoqDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpkYXRhIDwtIHJlYWRfZXhjZWwoIkM6L1VzZXJzL0RlbGwvRG93bmxvYWRzL0dTT0VQOTQwMi54bHN4IikNClZpZXcoZGF0YSkNCnN0cihkYXRhKQ0KaGVhZChkYXRhKQ0KYGBgDQojIyAqKjEuMiBDw6FjIGThuqFuZyDEkeG7kyB0aOG7iyoqIA0KDQpTY2hvb2wgbMOgIGJp4bq/biB0aOG7gyBoaeG7h24gbG/huqFpIHRyxrDhu51uZyB0cnVuZyBo4buNYyBjxqEgc+G7nywgZ+G7k20gMyBiaeG7g3UgaGnhu4duOg0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkc2Nob29sKQ0Kcm91bmQoKHRhYmxlKGRhdGEkc2Nob29sKS9zdW0odGFibGUoZGF0YSRzY2hvb2wpKSoxMDApLDIpDQpgYGANCiAtIEPDsyAyNzcgdHLGsOG7nW5nIGPhuqVwIDIgZMOgbmggY2hvIGjhu41jIHNpbmgga2jDoSBnaeG7j2kgY2hp4bq/bSB04bu3IGzhu4cgNDEuMDQlDQogDQogLSBDw7MgMTk5IHRyxrDhu51uZyBj4bqlcCAyIGPDsyBjaMawxqFuZyB0csOsbmggaOG7jWMgxJHhuqFpIHRyw6AgY2hp4bq/bSB04bu3IGzhu4cgMjkuNDglDQogDQogLSBDw7MgMTk5IHRyxrDhu51uZyBj4bqlcCAyIGPDsyBjaMawxqFuZyB0csOsbmggaOG7jWMgbsOibmcgY2FvIGNoaeG6v20gdOG7tyBs4buHIDI5LjQ4JQ0KIA0KDQoNCmBgYHtyfQ0KZGF0YSAlPiUgZ2dwbG90KG1hcCA9IGFlcyh4PXNjaG9vbCwgeT0gYWZ0ZXJfc3RhdChjb3VudCkpKStnZW9tX2JhcihmaWxsID0gJ3BpbmsnKStnZW9tX3RleHQoYWVzKGxhYmVsPXBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSxhY2N1cmFjeSA9IC4wMSkpLCBzdGF0ID0gJ2NvdW50JywgY29sb3IgPSAnd2hpdGUnLHZqdXN0ID0gNCkgKyBsYWJzKHRpbHRsZSA9ICfEkOG7mSB0aOG7iyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBo4buNYyBzaW5oIMSRYW5nIHRoZW8gaOG7jWMgdOG6oWkgdOG7q25nIGxv4bqhaSB0csaw4budbmcgVEhDUycsIHggPSAnTG/huqFpIHRyxrDhu51uZyBUSENTJywgeSA9ICdz4buRIGzGsOG7o25nIGjhu41jIHNpbmgnKQ0KDQpgYGANCg0KLSBOaMawIHbhuq15LCBsb+G6oWkgdHLGsOG7nW5nIGPDsyBz4buRIGjhu41jIHNpbmggdGhlbyBo4buNYyBuaGnhu4F1IG5o4bqldCBsw6AgdHLGsOG7nW5nIHRydW5nIGjhu41jIGPGoSBz4bufIGTDoG5oIGNobyBo4buNYyBzaW5oIGtow6EgZ2nhu49pLCBjw7luZyBuaGnhu4F1IGjGoW4gaGFpIGxv4bqhaSB0csaw4budbmcgY8OybiBs4bqhaSA3OCBo4buNYyBzaW5oIChraG/huqNuZyAxMS41NiUpLiBMb+G6oWkgdHLGsOG7nW5nIHRydW5nIGjhu41jIGPGoSBz4bufIGPDsyBjaMawxqFuZyB0csOsbmggxJHhuqFpIHRyw6AgdsOgIGxv4bqhaSB0cnVuZyBo4buNYyBjxqEgc+G7nyBjaMawxqFuZyB0csOsbmggbsOibmcgY2FvIMSR4buBdSBjw7MgY8O5bmcgc+G7kSBuZ8aw4budaSB0aGVvIGjhu41jIGzDoCAxOTkgbmfGsOG7nWkgKGNoaeG6v20gMjkuNDglIHNvIHbhu5tpIHThu5VuZyB0aOG7gykuDQoNCmBgYHtyfQ0KdGFibGUoZGF0YSRnZW5kZXIpDQpyb3VuZCgodGFibGUoZGF0YSRnZW5kZXIpL3N1bSh0YWJsZShkYXRhJGdlbmRlcikpKjEwMCksMikNCmRhdGEgfD5nZ3Bsb3QoYWVzKGdlbmRlcikpK2dlb21fYmFyKCkNCg0KYGBgDQpUcm9uZyA2NzUgaOG7jWMgc2luaCB0cnVuZyBo4buNYyBj4bufIMSRxrDhu6NjIGto4bqjbyBzw6F0IGPDszoNCg0KLSAzMjcgaOG7jWMgc2luaCB0aHXhu5ljIGdp4bubaSB0w61uaCBuYW0gKDQ4LDQ0JSkNCi0gMzQ4IGjhu41jIHNpbmggdGh14buZYyBnaeG7m2kgdMOtbmggbuG7ryAoIGNoaeG6v20gNTEsNTYlKQ0KTmjGsCB24bqteSB0cm9uZyB04buVbmcgc+G7kSBo4buNYyBzaW5oIMSRxrDhu6NjIGto4bqjbyBzw6F0IHPhu5EgaOG7jWMgc2luaCBjw7MgZ2nhu5tpIHTDrW5oIG7hu68gbmhp4buBdSBoxqFuIHPhu5EgaOG7jWMgc2luaCBjw7MgZ2nhu5tpIHTDrW5oIG5hbSAyMSBuZ8aw4budaSAoa2hv4bqjbmcgMywxMiUgc28gduG7m2kgdOG7lW5nIHPhu5EgaOG7jWMgc2luaCkuDQoNCmBgYHtyfQ0KdGFibGUoZGF0YSRtYXJpdGFsKQ0Kcm91bmQoKHRhYmxlKGRhdGEkbWFyaXRhbCkvc3VtKHRhYmxlKGRhdGEkbWFyaXRhbCkpKjEwMCksMikNCmRhdGEgJT4lIGdncGxvdChtYXA9YWVzKGZvcmNhdHM6OmZjdF9pbmZyZXEobWFyaXRhbCkpKSArIGdlb21fYmFyKGZpbGwgPSdsaWdodHBpbmsnKSArIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksIGFjY3VyYWN5PSAwLjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdkYXJrYmx1ZScsIGhqdXN0ID0gMC41KSArIGxhYnModGl0bGUgPSAnQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY+G7p2EgbeG6uSBuZ8aw4budaSDEkcaw4bujYyBraOG6o28gc8OhdCcsIHkgPSAnU+G7kSBsxrDhu6NuZycsIHggPSAnVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuJykgKyBjb29yZF9mbGlwKCkNCmBgYA0KDQpUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY+G7p2EgbeG6uSBjw6FjIGjhu41jIHNpbmggdHJ1bmcgaOG7jWMgY8ahIHPhu58gxJHGsOG7o2Mga2jhuqNvIHPDoXQsIGNoaWEgdGjDoG5oIDUgbmjDs20gZ+G7k206DQoNCi0gxJDDoyBr4bq/dCBow7RuIGPDsyA1NjYgbmfGsOG7nWksIGNoaeG6v20gODMsODUlDQotIExpIGjDtG4gY8OzIDU5IG5nxrDhu51pLCBjaGnhur9tIDgsNzQlDQotIEx5IHRow6JuIGPDsyAyOSBuZ8aw4budaSwgY2hp4bq/bSA0LDMlDQotIMSQ4buZYyB0aMOibiBjw7MgMTEgbmfGsOG7nWksIGNoaeG6v20gMSw2MyUNCi0gR8OzYSBjaOG7k25nIGPDsyAxMCBuZ8aw4budaSwgY2hp4bq/bSAxLDQ4JQ0KDQoNCmBgYHtyfQ0KdGFibGUoZGF0YSRtZW1wbG95bWVudCkNCnJvdW5kKHRhYmxlKGRhdGEkbWVtcGxveW1lbnQpL3N1bSh0YWJsZShkYXRhJG1lbXBsb3ltZW50KSkqMTAwLDIpDQpkYXRhICU+JSBnZ3Bsb3QoYWVzKHggPSBtZW1wbG95bWVudCwgeSA9IGFmdGVyX3N0YXQoY291bnQpKSkgKyBnZW9tX2JhcihmaWxsID0gJ3NhbG1vbicpICsgbGFicyh0aXRsZSA9ICdCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHTDrG5oIHRy4bqhbmcgdmnhu4djIGzDoG0gY+G7p2EgbeG6uSBuZ8aw4budaSBraOG6o28gc8OhdCcpDQpkMSA8LSB0YWJsZShkYXRhJG1lbXBsb3ltZW50KQ0KZDEgPC0gZGF0YSB8PiBncm91cF9ieShtZW1wbG95bWVudCkgfD4gc3VtbWFyaXNlKGZyZXEgPSBuKCkpIHw+IG11dGF0ZShkMSwgcGVyID0gZnJlcS9zdW0oZnJlcSkpDQpkMSAlPiUgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBwZXIsIGZpbGwgPSBtZW1wbG95bWVudCkpICsNCmdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIA0KY29vcmRfcG9sYXIoJ3knKSsNCmdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQocGVyKjEwMCksICIlIikpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSkNCg0KYGBgDQoNClTDrG5oIHRy4bqhbmcgdmnhu4djIGzDoG0gY+G7p2EgbmfGsOG7nWkgbeG6uSA2NzUgaOG7jWMgc2luaCDEkcaw4bujYyBraOG6o28gc8OhdCDEkcaw4bujYyBjaGlhIGzDoG0gMyBuaMOzbSBn4buTbToNCg0KLSBMw6BtIHZp4buHYyB0b8OgbiB0aOG7nWkgZ2lhbiAoZnVsbHRpbWUpOiBjw7MgODkgbmfGsOG7nWksIGNoaeG6v20ga2hv4bqjbmcgMTMlLg0KLSBMw6BtIHZp4buHYyBiw6FuIHRo4budaSBnaWFuIChwYXJ0dGltZSk6IDI4NCBuZ8aw4budaSwgY2hp4bq/bSBraG/huqNuZyA0MiUuDQotIEtow7RuZyBjw7Mgdmnhu4djIGzDoG0gKG5vbmUpOiAzMDIgbmfGsOG7nWksIGNoaeG6v20ga2hv4bqjbmcgNDUlDQoNCiMjICoqMS4zIELhuqNuZyB04bqnbiBz4buRIC0gYuG6o25nIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KdG1wIDwtIHRhYmxlKGRhdGEkZ2VuZGVyLGRhdGEkc2Nob29sKQ0KcHJvcC50YWJsZSh0bXApDQphZGRtYXJnaW5zKHRtcCkNCmRhdGEgJT4lIGNvdW50KHNjaG9vbCxnZW5kZXIpICU+JSBncm91cF9ieShzY2hvb2wpICU+JSBtdXRhdGUocHNsPW4vc3VtKG4pKSAlPiUgZ2dwbG90KGFlcyh4PXNjaG9vbCwgeSA9IG4sIGZpbGwgPSBnZW5kZXIpKSArIGdlb21fY29sKCkrZ2VvbV90ZXh0KGFlcyhsYWJlbD0gcGVyY2VudChwc2wsIGFjY3VyYWN5ID0gLjAxKSksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBzaXplID0gMykgKyB5bGFiKCdz4buRIGjhu41jIHNpbmgnKSArIHhsYWIoJ2xv4bqhaSB0csaw4budbmcgVEhDUycpDQpgYGANCkvhur90IHF14bqjIHRyw6puIGNobyBjaMO6bmcgdGEgYmnhur90IHPhu5EgbMaw4bujbmcgaOG7jWMgc2luaCDhu58gdOG7qyBsb+G6oWkgdHLGsOG7nW5nIGjhu41jIHRoZW8gZ2nhu5tpIHTDrW5oLCB0cm9uZyB04buVbmcgc+G7kSA2NzUgaOG7jWMgc2luaCDEkcaw4bujYyBraOG6o28gc8OhdA0KDQotIExv4bqhaSB0csaw4budbmcgdHJ1bmcgaOG7jWMgY8ahIHPhu58gY2jGsMahbmcgdHLDrG5oIMSR4bqhaSB0csOgIGPDsyAxMDMgaOG7jWMgc2luaCBuYW0gKGtob+G6o25nIDE1LDI2JSksIHbDoCA5NiBo4buNYyBzaW5oIG7hu68gKGtob+G6o25nIDE0LDIyJSkuDQotIExv4bqhaSB0csaw4budbmcgdHJ1bmcgaOG7jWMgY+G7nyBz4bufIGNoxrDGoW5nIHRyw6xuaCBuw6JuZyBjYW8gY8OzIDk4IGjhu41jIHNpbmggbmFtIChraG/huqNuZyAxNCw1MiUpLCB2w6AgMTAxIGjhu41jIHNpbmggbuG7ryAoMTQsOTclKQ0KLSBMb+G6oWkgdHLGsOG7nW5nIHRydW5nIGjhu41jIGPhu58gc+G7nyBkw6BuaCBjaG8gaOG7jWMgc2luaCBraMOhIGdp4buPaSBjw7MgMTI2IGjhu41jIHNpbmggbmFtIChraG/huqNuZyAxOCw2NyUpLCB2w6AgMTUxIGjhu41jIHNpbmggbuG7ryAoMjIsMzclKQ0KDQpOaMawIHbhuq15IHRyb25nIGxv4bqhaSB0csaw4budbmcgdHJ1bmcgY8ahIHPhu58gY2jGsMahbmcgdHLDrG5oIMSR4bqhaSB0csOgIGPDsyB04buJIGzhu4cgaOG7jWMgc2luaCBuYW0gbmhp4buBdSBoxqFuIGjhu41jIHNpbmggbuG7ryA3IGjhu41jIHNpbmguIOG7niBsb+G6oWkgdHLGsOG7nW5nIHRydW5nIGjhu41jIGPGoSBz4bufIGNoxrDGoW5nIHRyw6xuaCBuw6JuZyBjYW8gdsOgIGxv4bqhaSB0csaw4budbmcgdHJ1bmcgaOG7jWMgY8ahIHPhu58gZMOgbmggY2hvIGjhu41jIHNpbmgga2jDoSBnaeG7j2kgdGjDrCB04buJIGzhu4cgaOG7jWMgc2luaCBu4buvIG5oaeG7gXUgaMahbiBo4buNYyBzaW5oIG5hbSBs4bqnbiBsxrDhu6N0IGzDoCAzIGjhu41jIHNpbmggdsOgIDI1IGjhu41jIHNpbmguDQoNClRyb25nIHBo4bqnbiB0csSDbSBnaeG7m2kgdMOtbmggaOG7jWMgc2luaCDhu58gdOG7q25nIGxv4bqhaSB0csaw4budbmcgY+G7p2EgNjc1IG5nxrDhu51pIMSRxrDhu6NjIGto4bqjbyBzw6F0LCB04buJIGzhu4cgaOG7jWMgc2luaCBu4buvIOG7nyB0csaw4budbmcgdHJ1bmcgaOG7jWMgY8ahIHPhu58gZMOgbmggY2hvIGjhu41jIHNpbmgga2jDoSBnaeG7j2kgY2hp4bq/bSBuaGnhu4F1IG5o4bqldCAoMTUxIGjhu41jIHNpbmgsIDIyLDM3JSksIHThu4kgbOG7hyBo4buNYyBzaW5oIG7hu68g4bufIGxv4bqhaSB0csaw4budbmcgdHJ1bmcgaOG7jWMgY8ahIHPhu58gY2jGsMahbmcgdHLDrG5oIMSR4bqhaSB0csOgIGzDoCB0aOG6pXAgbmjhuqV0ICg5NiBuZ8aw4budaSwgMTQsMjIlKS4NCg0KIyMgKioxLjQgUmVsYXRpdmUgUmlzay9SaXNrIFJhdGlvKioNCg0KYGBge3J9DQpsaWJyYXJ5KGVwaVIpDQpzY2hvb2wyIDwtIGZvcmNhdHM6OmZjdF9jb2xsYXBzZShkYXRhJHNjaG9vbCwgInRyxrDhu51uZyBraMOhIj0gYygiSGF1cHRzY2h1bGUiLCJSZWFsc2NodWxlIiksICJ0csaw4budbmcgZ2nhu49pIj1jKCJHeW1uYXNpdW0iKSkNCmRhdGE8LSBtdXRhdGUoZGF0YSxzY2hvb2wyKQ0KdG1wIDwtIHRhYmxlKGRhdGEkZ2VuZGVyLGRhdGEkc2Nob29sMikNCmFkZG1hcmdpbnModG1wKQ0Kcmlza3JhdGlvKHRtcCkNCmVwaXRhYih0bXAsIG1ldGhvZCA9ICdyaXNrcmF0aW8nLHJldiA9ICdjJykNCg0KYGBgDQojIyAqKjEuNSBU4bu3IGzhu4cgY2jDqm5oIChPZGQgUmF0aW8pKioNCg0KYGBge3J9DQpvZGRzcmF0aW8odG1wKQ0KYGBgDQpU4buJIGzhu4cgZ2nhu69hIHjDoWMgc3XhuqV0IGjhu41jIHNpbmggdHLGsOG7nW5nIGtow6EgdsOgIHjDoWMgc3XhuqV0IGjhu41jIHNpbmggdHLGsOG7nW5nIGdp4buPaSB0cm9uZyBuaOG7r25nIGjhu41jIHNpbmggZ2nhu5tpIHTDrW5oIG5hbSBzbyB24bubaSBU4buJIGzhu4cgZ2nhu69hIHjDoWMgc3XhuqV0IGjhu41jIHNpbmggdHLGsOG7nW5nIGtow6EgdsOgIHjDoWMgc3XhuqV0IGjhu41jIHNpbmggdHLGsOG7nW5nIGdp4buPaSB0cm9uZyBuaOG7r25nIGjhu41jIHNpbmggZ2nhu5tpIHTDrW5oIG7hu68gbMOgIDEsMjIuDQoNCkNvbiBz4buRIG7DoHkgY2hvIGJp4bq/dCB04buJIGzhu4cga2jhuqMgbsSDbmcgaOG7jWMgc2luaCBuYW0gaOG7jWMgdOG6oWkgdHLGsOG7nW5nIGtow6EgY2FvIGjGoW4gMjIlIHNvIHbhu5tpIHThu4kgbOG7hyBo4buNYyBzaW5oIG7hu68gaOG7jWMgdGFpIGxv4bqhaSB0csaw4budbmcgbsOgeS4NCg0KYGBge3J9DQpvZGRzcmF0aW8odG1wLHJldiA9ICdjJykNCmBgYA0KVOG7iSBs4buHIGdp4buvYSBo4buNYyBzaW5oIG5hbSBo4buNYyB04bqhaSB0csaw4budbmcgZ2nhu49pIHbDoCBo4buNYyBzaW5oIG5hbSBo4buNYyB04bqhaSB0csaw4budbmcga2jDoSBzbyB24bubaSB04buJIGzhu4cgaOG7jWMgc2luaCBo4buNYyBu4buvIHThuqFpIHRyxrDhu51uZyBnaeG7j2kgdsOgIGjhu41jIHNpbmggaOG7jWMgbuG7ryB04bqhaSB0csaw4budbmcga2jDoSBsw6AgMCw4MS4NCg0KQ29uIHPhu5EgbsOgeSBjaG8gYmnhur90LCB04buJIGzhu4cgaOG7jWMgc2luaCBuYW0gdOG6oWkgdHLGsOG7nW5nIGxv4bqhaSBnaeG7j2kgw610IGjGoW4gMTglIHNvIHThu4kgbOG7hyBo4buNYyBzaW5oIG7hu68NCg0KIyMgKioxLjYgS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hyoqDQoNCmBgYHtyfQ0KdG1wIDwtIGRhdGFbZGF0YSRzaXplID4gNCxdDQoNCg0KcHJvcC50ZXN0KGxlbmd0aChkYXRhJHNpemUpLCBsZW5ndGgoZGF0YSRzaXplKSwgcCA9IDAuMzUpDQoNCg0KYGBgDQoNCiMgKipCw4BJIFRI4buwQyBIw4BOSCBUVeG6pk4gNCoqDQogDQojIyAqKjEgSOG7k2kgcXV5KioNCg0KDQoNCg0K