3 Thống kê Mô tả
3.1 Điều kiện tham gia quỹ
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.1
tmp <- table(d$e401k, d$p401k)
tmp
##
## Không Tham Gia Tham Gia
## Đủ 1075 2562
## Không Đủ 5638 0
ggplot(d, aes(e401k, fill = p401k)) + geom_bar(position = 'dodge')

Một điều hiển nhiên là những người lao động không đủ điều kiện tham
gia quỹ thì không tham gia quỹ hưu trí 401k. Những người này chiếm
khoảng 60% những người được khảo sát. Có một điểm đáng chú ý ở 40% những
người đủ điều kiện tham gia quỹ, số người tham gia nhiều gấp 2.5 lần số
người không tham gia. Vì sao một người lao động không đủ điều tham gia
quỹ hưu trí? Vì sao một người lao động đủ điều kiện tham gia 401k nhưng
lại không tham gia? Mục thống kê mô ta của bài tiểu luận sẽ đi tìm câu
trả lởi cho 2 câu hỏi này.
3.2 Giới tính không Ảnh hưởng đến khả năng tham gia quỹ
library(ggplot2)
tmp <- table(d$male, d$p401k)
tmp
##
## Không Tham Gia Tham Gia
## Nam 1414 482
## Nữ 5299 2080
ggplot(d, aes(male, fill = p401k)) + geom_bar(position = 'dodge')

tmp <- prop.table(tmp)
tmp
##
## Không Tham Gia Tham Gia
## Nam 0.15245283 0.05196765
## Nữ 0.57132075 0.22425876
Tử biểu đồ cột này, có thể nhận thấy rằng phần lớn những cư dân được
khảo sát là phụ nữ. Số người lao động giới tính nữ là hơn 7000 trên tổng
9275 người (chiếm ba phần tư quan sát). Số người tham gia quỹ hưu trí
401k ở cả hai giới tính đều bé hơn nhiều lần số người không tham gia.
Với giới tính nam, tỷ lệ số người tham gia quỹ chỉ bằng 1 phần 3 số
người không tham gia quỹ (nghĩa là cứ 4 người nam sẽ có một người tham
gia quỹ). Trong khi với giới tính nữ, con số này là 2 phần 5 (tức cứ 7
người sẽ có 2 người tham gia quỹ). Tóm lại tỷ lệ tham gia quỹ 401k ở
giới tính nam và nữ lần lượt là xấp xỉ 25% và 28%, không có sự khác biệt
rõ ràng giữa tỷ lệ tham gia quỹ của hai giới tính.
Khi lọc ra những quan sát Không Đủ điều kiện tham gia quỹ thì yếu tố
Giới tính cũng không ảnh hưởng đến quyết định tham gia quỹ của một người
lao động. Ở giới tính nam tỷ lệ số người tham trên số người tham gia quỹ
là 0.4394 và ở giới tính nữ là 0.4150.
library(DT)
library(readxl)
library(ggplot2)
data1 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet1")
tmp <- table(data1$male, data1$p401k)
tmp
##
## Không Tham Gia Tham Gia
## Nam 211 482
## Nữ 864 2080
ggplot(d, aes(male, fill = p401k)) + geom_bar(position = 'dodge')

tmp <- prop.table(tmp)
tmp
##
## Không Tham Gia Tham Gia
## Nam 0.05801485 0.13252681
## Nữ 0.23755843 0.57189992
3.3 Ảnh hưởng của Thu Nhập
3.3.1 Thu nhập có ảnh hưởng đến điều kiện tham gia quỹ hưu trí
library(ggplot2)
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.4.1
library(readxl)
# Đọc dữ liệu từ file Excel
d2 <- read_excel("C:/users/user/Downloads/k401ksubs - Copy.xlsx", sheet = "du")
d3 <- read_excel("C:/users/user/Downloads/k401ksubs - Copy.xlsx", sheet = "kodu")
# Vẽ biểu đồ thứ nhất
plot1 <- ggplot(data = d2, aes(x = rownames, y = inc )) +
geom_line(color = "green", size = 1) +
labs(title = "Biểu đồ Thu Nhập với người Đủ điều kiện tham gia quỹ",
x = "rownames",
y = "inc")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Vẽ biểu đồ thứ hai
plot2 <- ggplot(data = d3, aes(x = rownames, y = inc )) +
geom_line(color = "red", size = 1) +
labs(title = "Biểu đồ Thu Nhập với người Không Đủ điều kiện tham gia quỹ",
x = "rownames",
y = "inc")
# Kết hợp hai biểu đồ vào cùng một hình
grid.arrange(plot1, plot2, ncol = 1) # ncol = 1 để xếp hai biểu đồ dọc

library(ggplot2)
library(readxl)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.1
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:gridExtra':
##
## combine
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(gridExtra)
# Đọc dữ liệu từ file Excel
d2 <- read_excel("C:/users/user/Downloads/k401ksubs - Copy.xlsx", sheet = "du")
d3 <- read_excel("C:/users/user/Downloads/k401ksubs - Copy.xlsx", sheet = "kodu")
# Thêm biến nhóm để phân biệt hai nhóm dữ liệu
d2$group <- "Đủ điều kiện tham gia quỹ"
d3$group <- "Không đủ điều kiện tham gia quỹ"
# Tính phân vị cho mỗi quan sát
d2 <- d2 %>% mutate(percentile = percent_rank(inc))
d3 <- d3 %>% mutate(percentile = percent_rank(inc))
# Kết hợp dữ liệu
combined_data <- bind_rows(d2, d3)
# Vẽ biểu đồ kết hợp với phân vị làm trục hoành
plot_combined <- ggplot(data = combined_data, aes(x = percentile, y = inc, color = group, group = group)) +
geom_line(size = 1) +
labs(title = "Biểu đồ Thu Nhập của người đủ và không đủ điều kiện tham gia quỹ",
x = "Phân vị",
y = "inc") +
theme_minimal() +
scale_color_manual(values = c("green", "red"))
# Hiển thị biểu đồ
print(plot_combined)

Những công dân thực hiện khảo sát được đánh số thứ tự phân biệt. Phía
trên là biểu đồ thu nhập đã được phân nhóm đủ điều kiện và không đủ điều
kiện tham qua quỹ. Dữ liệu thu nhập được dùng đề vẽ biểu đồ đã được sắp
xếp lại theo thứ tự thấp đến cao theo thu nhập từ trái qua phải. Theo
trực giác, có thể thấy rằng đường biểu đồ thu nhập của nhóm đủ điều kiện
tham gia quỹ có cao hơn đường biểu đồ thu nhập của nhóm không đủ điều
kiện tham gia quỹ. Ví dụ ở quan sát ở tứ phân vị thứ nhất, nhóm đủ điều
kiện có thu nhập trên 25 đô la, còn nhóm không đủ điều kiện có thu nhập
dưới 25 đô la. Chênh lệch này rõ rệt ở trung vị và tứ phân vị thứ ba. Ở
quan sát thứ 1800, nhóm đủ điều kiện có thu nhập gần 50 đô la, trong khi
ở quan sát 2800 nhóm không đủ điều kiện có thu nhập dưới 30 đô la. Ở tứ
phân vị thứ 3, nhóm đủ điều kiện có thu nhập 63 đô trong khi nhóm không
đủ điều kiện có thu nhập xấp xỉ 48 đô (thấp hơn 24% ). Về mặt lo-gich,
vì điều kiện tham gia quỹ có xét đến yếu tố thu nhập, nên thu nhập có
thể tác động thuận chiều lên khả năng đủ điều kiện tham gia quỹ của một
người. Số liệu được thu thập ủng hộ lập luận này.
3.3.2 Trong nhóm người đủ điều kiện tham gia quỹ 401k, yếu tố thu
nhập có ảnh hưởng quyết định tham gia quỹ.
library(ggplot2)
library(gridExtra)
library(readxl)
# Đọc dữ liệu từ file Excel
d4 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet3")
d5 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet2")
# Vẽ biểu đồ thứ nhất
plot1 <- ggplot(data = d4, aes(x = rownames, y = inc )) +
geom_line(color = "green", size = 1) +
labs(title = "Biểu đồ Thu Nhập của người tham gia quỹ",
x = "rownames",
y = "inc")
# Vẽ biểu đồ thứ hai
plot2 <- ggplot(data = d5, aes(x = rownames, y = inc )) +
geom_line(color = "red", size = 1) +
labs(title = "Biểu đồ Thu Nhập của người Không tham gia quỹ",
x = "rownames",
y = "inc")
# Kết hợp hai biểu đồ vào cùng một hình
grid.arrange(plot1, plot2, ncol = 1) # ncol = 1 để xếp hai biểu đồ dọc

library(ggplot2)
library(readxl)
library(dplyr)
# Đọc dữ liệu từ file Excel
d4 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet3")
d5 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet4")
# Thêm biến nhóm để phân biệt hai nhóm dữ liệu
d4$group <- "Tham gia quỹ"
d5$group <- "Không tham gia quỹ"
# Tính phân vị cho mỗi quan sát
d4 <- d4 %>% mutate(percentile = percent_rank(inc))
d5 <- d5 %>% mutate(percentile = percent_rank(inc))
# Kết hợp dữ liệu
combined_data <- bind_rows(d4, d5)
# Vẽ biểu đồ kết hợp với phân vị làm trục hoành
ggplot(data = combined_data, aes(x = percentile, y = inc, color = group, group = group)) +
geom_line(size = 1) +
labs(title = "Biểu đồ Thu Nhập của người tham gia và không tham gia quỹ",
x = "Phân vị",
y = "inc") +
theme_minimal() +
scale_color_manual(values = c("green", "red"))
Một biểu hiện tương tự khi khảo sát thu nhập bằng biểu đồ phân vị của
nhóm người đã đủ điều kiện tham gia quỹ. Biểu đồ trên thể hiện, trong
nhóm người đủ điều kiện tham qua quỹ, người Tham gia quỹ sẽ có thu nhập
nhỉnh hơn người không tham gia quỹ. Tuy nhiên, khoảng cách thu nhập (thể
hiện bởi khoảng cách giữa 2 đường xanh, đỏ) ở biểu đồ tham gia quỹ thấp
hơn khoảng cách ở biểu đồ điều kiện tham gia quỹ. Điều này hàm ý rằng
Tác động của thu nhập đến điều kiện tham gia quỹ lớn hơn tác động của nó
đến quyết định tham gia quỹ.
3.4 Tình trạng hôn nhân
3.4.1 Tình trạng hôn nhân có tác động đến điều kiện tham gia quỹ hưu
trí 401k
library(ggplot2)
library(DescTools)
library(epitools)
tmp <- table(d$marr, d$e401k)
tmp
##
## Đủ Không Đủ
## Chưa Kết Hôn 1174 2271
## Đã Kết Hôn 2463 3367
addmargins(tmp)
##
## Đủ Không Đủ Sum
## Chưa Kết Hôn 1174 2271 3445
## Đã Kết Hôn 2463 3367 5830
## Sum 3637 5638 9275
RelRisk(tmp)
## [1] 0.8066461
ggplot(d, aes(marr, fill = e401k)) + geom_bar(position = 'dodge')

chisq.test(tmp)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tmp
## X-squared = 60.276, df = 1, p-value = 8.246e-15
Theo số liệu, nếu một người đã kết hôn, tỷ lệ anh ta (chị ta) đủ điều
kiện tham gia quỹ là 42%. Nếu chưa kết hôn, tỷ lệ đủ điều kiện tham gia
quỹ là 34%. Những người đủ điều kiện tham gia quỹ cũng có tỷ lệ kết hôn
cao hơn những người không đủ điều kiện tham gia (67% so với 59%). Về mặt
thống kê mô tả, có thể nói rằng một người đã kết hôn sẽ có khả năng đủ
điều kiện tham gia quỹ cao hơn những người chưa kết hôn. Relative Risk
cho ta biết rằng nếu một người chưa kết hôn, tỷ lệ anh(chị) ta tham gia
quỹ sẽ thấp hơn gần 20% so với người đã kết hôn.
Khi sử dụng thống kê suy diễn. Với kiểm định Chi-bình phương cho tính
độc lập của hai biến marr và e401k (giả thiết không: marr và e401k là
độc lập), do p-value của kiểm định gần bằng 0, có thể bác bỏ giả thiết
không và kết luận marr và e401k có liên quan với nhau.
3.4.2 Tình trạng hôn nhân có tác động đến quyết định tham gia quỹ
hưu trí 401k
library(DT)
library(readxl)
library(ggplot2)
data1 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet2")
tmp <- table(data1$marr, data1$p401k)
tmp
##
## Không Tham Gia Tham Gia
## Chưa Kết Hôn 394 780
## Đã Kết Hôn 681 1782
addmargins(tmp)
##
## Không Tham Gia Tham Gia Sum
## Chưa Kết Hôn 394 780 1174
## Đã Kết Hôn 681 1782 2463
## Sum 1075 2562 3637
RelRisk(tmp)
## [1] 1.213795
ggplot(data1, aes(marr, fill = p401k)) + geom_bar(position = 'dodge')

chisq.test(tmp)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tmp
## X-squared = 13.06, df = 1, p-value = 0.0003016
Trong nhóm người đủ điều kiện tham gia quỹ, tỷ lệ tham gia quỹ 401k ở
nhóm người kết hôn cao hơn tỷ lệ này ở nhóm người chưa kết hơn (72% so
với 66%). Những người tham gia quỹ cũng có tỷ lệ đã kết hôn cao hơn
những người không tham gia quỹ (70% so với 63%). Quan sát này làm vững
thêm luận điểm rằng những người đã kết hôn sẽ làm tăng khả năng người đó
tham gia quỹ hưu trí 401k. Relative Risk cho ta biết rằng nếu một người
đã kết hôn, tỷ lệ anh(chị) ta tham gia quỹ sẽ cao hơn 21% so với người
chưa kết hôn.
Khi sử dụng thống kê suy diễn. Với kiểm định Chi-bình phương cho tính
độc lập của hai biến marr và p401k (giả thiết không: marr và 401k là độc
lập), do p-value của kiểm định gần bằng 0, có thể bác bỏ giả thiết không
và kết luận marr và e401k có liên quan với nhau.
3.5 Độ tuổi
Có khả năng là một người có độ tuổi càng cao thì khả năng tham gia
của người đó càng thấp. Quỹ hưu trí được lập ra cho những người lao động
sẽ có khả năng lao động tạo ra giá trị kinh tế trong tương lai cho đất
nước. Hơn nữa, thời gian lao động, khoản tiền đóng góp quỹ, tiền thuế
đóng góp trong tương lai là những yếu tố để xét điều kiện tham gia quỹ
của một người thì tương quan nghịch với độ tuổi của người đó.
library(ggplot2)
library(gridExtra)
library(readxl)
# Đọc dữ liệu từ file Excel
d6 <- read_excel("C:/users/user/Downloads/k401ksubs - Co.xlsx", sheet = "e2")
d7 <- read_excel("C:/users/user/Downloads/k401ksubs - Co.xlsx", sheet = "e3")
# Vẽ biểu đồ thứ nhất
plot1 <- ggplot(data = d6, aes(x = rownames, y = age )) +
geom_line(color = "green", size = 1) +
labs(title = "Biểu đồ Độ tuổi của người đủ điều kiện tham gia quỹ",
x = "rownames",
y = "age")
# Vẽ biểu đồ thứ hai
plot2 <- ggplot(data = d7, aes(x = rownames, y = age )) +
geom_line(color = "red", size = 1) +
labs(title = "Biểu đồ Độ tuổi của người không đủ điều kiện tham gia quỹ",
x = "rownames",
y = "age")
# Kết hợp hai biểu đồ vào cùng một hình
grid.arrange(plot1, plot2, ncol = 1) # ncol = 1 để xếp hai biểu đồ dọc

# Thêm biến nhóm để phân biệt hai nhóm dữ liệu
d6$group <- "Đủ điều kiện tham gia quỹ"
d7$group <- "Không đủ điều Tham gia quỹ"
# Tính phân vị cho mỗi quan sát
d6 <- d6 %>% mutate(percentile = percent_rank(age))
d7 <- d7 %>% mutate(percentile = percent_rank(age))
# Kết hợp dữ liệu
combined_data <- bind_rows(d6, d7)
# Vẽ biểu đồ kết hợp với phân vị làm trục hoành
plot_combined <- ggplot(data = combined_data, aes(x = percentile, y = age, color = group, group = group)) +
geom_line(size = 1) +
labs(title = "Biểu đồ Độ tuổi của người đủ điều kiện và không đủ tham gia quỹ",
x = "Phân vị",
y = "Độ tuổi") +
theme_minimal() +
scale_color_manual(values = c("green", "red"))
# Hiển thị biểu đồ
print(plot_combined)

2 đường biểu đồ dốc lên nhẹ ở độ tuổi trên 50. Điều này có nghĩa là
những người trên 50 đến 60 tuồi đủ điều kiện tham gia quỹ và tham gia
quỹ có ít hơn những người thuộc khoảng tuổi 30 đến 40 tuổi, hay 40 đến
50 tuổi. Ở trước tuổi 47, nhóm người đủ điều kiện tham gia quỹ có độ
tuổi trung bình cao hơn nhóm người không đủ điều kiện. Tuy nhiên sau
tuổi 47, nhóm người đủ điều kiện tham gia quỹ có độ tuổi trung bình thấp
hơn nhóm người không đủ điều kiện tham gia quỹ.
library(ggplot2)
library(gridExtra)
library(readxl)
# Đọc dữ liệu từ file Excel
d8 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet5")
d9 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet6")
# Vẽ biểu đồ thứ nhất
plot1 <- ggplot(data = d8, aes(x = rownames, y = age )) +
geom_line(color = "green", size = 1) +
labs(title = "Biểu đồ Độ tuổi của người tham gia quỹ",
x = "rownames",
y = "age")
# Vẽ biểu đồ thứ hai
plot2 <- ggplot(data = d9, aes(x = rownames, y = age )) +
geom_line(color = "red", size = 1) +
labs(title = "Biểu đồ Độ tuổi của người Không tham gia quỹ",
x = "rownames",
y = "age")
# Kết hợp hai biểu đồ vào cùng một hình
grid.arrange(plot1, plot2, ncol = 1) # ncol = 1 để xếp hai biểu đồ dọc

library(ggplot2)
library(readxl)
library(dplyr)
# Đọc dữ liệu từ file Excel
d8 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet5")
d9 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet6")
# Thêm biến nhóm để phân biệt hai nhóm dữ liệu
d8$group <- "Tham gia quỹ"
d9$group <- "Không tham gia quỹ"
# Tính phân vị cho mỗi quan sát
d8 <- d8 %>% mutate(percentile = percent_rank(age))
d9 <- d9 %>% mutate(percentile = percent_rank(age))
# Kết hợp dữ liệu
combined_data <- bind_rows(d8, d9)
# Vẽ biểu đồ kết hợp với phân vị làm trục hoành
ggplot(data = combined_data, aes(x = percentile, y = age, color = group, group = group)) +
geom_line(size = 1) +
labs(title = "Biểu đồ Độ Tuổi của người tham gia và không tham gia quỹ",
x = "Phân vị",
y = "inc") +
theme_minimal() +
scale_color_manual(values = c("red", "green"))

Trong nhóm người đủ điều kiện tham gia quỹ, độ tuổi của một người lao
động không ảnh hưởng đến quyết định tham gia quỹ của người đó.
3.5 Số thành viên trong gia đình
library(ggplot2)
library(gridExtra)
library(readxl)
# Đọc dữ liệu từ file Excel
d10 <- read_excel("C:/users/user/Downloads/k401ksubs - C.xlsx", sheet = "e2")
d11 <- read_excel("C:/users/user/Downloads/k401ksubs - C.xlsx", sheet = "e3")
# Vẽ biểu đồ thứ nhất
plot1 <- ggplot(data = d10, aes(x = rownames, y = fsize )) +
geom_line(color = "green", size = 1) +
labs(title = "Biểu đồ số thành viên gia đình của người đủ điều kiện tham gia quỹ",
x = "rownames",
y = "fsize")
# Vẽ biểu đồ thứ hai
plot2 <- ggplot(data = d11, aes(x = rownames, y = fsize )) +
geom_line(color = "red", size = 1) +
labs(title = "Biểu đồ Số thành viên gia đình của người không đủ điều kiện tham gia quỹ",
x = "rownames",
y = "fsize")
# Kết hợp hai biểu đồ vào cùng một hình
grid.arrange(plot1, plot2, ncol = 1) # ncol = 1 để xếp hai biểu đồ dọc

# Thêm biến nhóm để phân biệt hai nhóm dữ liệu
d10$group <- "Đủ điều kiện tham gia quỹ"
d11$group <- "Không đủ điều kiện tham gia quỹ"
# Tính phân vị cho mỗi quan sát
d10 <- d10 %>% mutate(percentile = percent_rank(fsize))
d11 <- d11 %>% mutate(percentile = percent_rank(fsize))
# Kết hợp dữ liệu
combined_data <- bind_rows(d10, d11)
# Vẽ biểu đồ kết hợp với phân vị làm trục hoành
plot_combined <- ggplot(data = combined_data, aes(x = percentile, y = fsize, color = group, group = group)) +
geom_line(size = 1) +
labs(title = "Biểu đồ số thành viên gia đình của người đủ và không đủ điều kiện tham gia quỹ",
x = "Phân vị",
y = "Số thành viên gia đình") +
theme_minimal() +
scale_color_manual(values = c("green", "red"))
# Hiển thị biểu đồ
print(plot_combined)

Số thành viên trong gia đình phân phối đồng đều và tương tự nhau ở cả
2 nhóm người đủ và không đủ điều kiện tham gia quỹ hưu trí.
Biểu hiện tương tự cũng được phát hiện khi quan sát số thành viên trong
gia đình của nhóm người tham gia quỹ và không tham gia quỹ. Như vậy yếu
tố số thành viên trong gia đình không tác động đến điều kiện và quyết
định tham gia quỹ hưu trí của một người lao động Mỹ.
library(ggplot2)
library(gridExtra)
library(readxl)
# Đọc dữ liệu từ file Excel
d12 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet7")
d13 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet8")
# Vẽ biểu đồ thứ nhất
plot1 <- ggplot(data = d12, aes(x = rownames, y = fsize )) +
geom_line(color = "green", size = 1) +
labs(title = "Biểu đồ số thành viên gia đình của người tham gia quỹ",
x = "rownames",
y = "fsize")
# Vẽ biểu đồ thứ hai
plot2 <- ggplot(data = d13, aes(x = rownames, y = fsize )) +
geom_line(color = "red", size = 1) +
labs(title = "Biểu đồ Số thành viên gia đình của người tham gia quỹ",
x = "rownames",
y = "fsize")
# Kết hợp hai biểu đồ vào cùng một hình
grid.arrange(plot1, plot2, ncol = 1) # ncol = 1 để xếp hai biểu đồ dọc

# Thêm biến nhóm để phân biệt hai nhóm dữ liệu
d12$group <- "tham gia quỹ"
d13$group <- "Không tham gia quỹ"
# Tính phân vị cho mỗi quan sát
d12 <- d12 %>% mutate(percentile = percent_rank(fsize))
d13 <- d13 %>% mutate(percentile = percent_rank(fsize))
# Kết hợp dữ liệu
combined_data <- bind_rows(d12, d13)
# Vẽ biểu đồ kết hợp với phân vị làm trục hoành
plot_combined <- ggplot(data = combined_data, aes(x = percentile, y = fsize, color = group, group = group)) +
geom_line(size = 1) +
labs(title = "Biểu đồ số thành viên gia đình của người tham gia và không tham gia quỹ",
x = "Phân vị",
y = "Số thành viên gia đình") +
theme_minimal() +
scale_color_manual(values = c("green", "red"))
# Hiển thị biểu đồ
print(plot_combined)

3.6 Tài sản tiết kiệm, tích lũy
library(ggplot2)
library(gridExtra)
library(readxl)
# Đọc dữ liệu từ file Excel
d14 <- read_excel("C:/users/user/Downloads/k401ksubs - D.xlsx", sheet = "e2")
d15 <- read_excel("C:/users/user/Downloads/k401ksubs - D.xlsx", sheet = "e3")
# Vẽ biểu đồ thứ nhất
plot1 <- ggplot(data = d14, aes(x = rownames, y = nettfa )) +
geom_line(color = "green", size = 1) +
labs(title = "Biểu đồ tài sản của nhóm người đủ điều kiện tham gia quỹ",
x = "rownames",
y = "nettfa")
# Vẽ biểu đồ thứ hai
plot2 <- ggplot(data = d15, aes(x = rownames, y = nettfa )) +
geom_line(color = "red", size = 1) +
labs(title = "Biểu đồ tài sản của nhóm người không đủ điều kiện tham gia quỹ",
x = "rownames",
y = "nettfa")
# Kết hợp hai biểu đồ vào cùng một hình
grid.arrange(plot1, plot2, ncol = 1) # ncol = 1 để xếp hai biểu đồ dọc

# Thêm biến nhóm để phân biệt hai nhóm dữ liệu
d14$group <- "Đủ điều kiện tham gia quỹ"
d15$group <- "Không đủ điều kiện tham gia quỹ"
# Tính phân vị cho mỗi quan sát
d14 <- d14 %>% mutate(percentile = percent_rank(nettfa))
d15 <- d15 %>% mutate(percentile = percent_rank(nettfa))
# Kết hợp dữ liệu
combined_data <- bind_rows(d14, d15)
# Vẽ biểu đồ kết hợp với phân vị làm trục hoành
plot_combined <- ggplot(data = combined_data, aes(x = percentile, y = nettfa, color = group, group = group)) +
geom_line(size = 1) +
labs(title = "Biểu đồ tài sản của nhóm người đủ và không đủ điều kiện tham gia quỹ",
x = "Phân vị",
y = "Tài sản (nettfa)") +
theme_minimal() +
scale_color_manual(values = c("green", "red"))
# Hiển thị biểu đồ
print(plot_combined)

Không có sự khác biệt lớn về tài sản của nhóm người tham gia quỹ và
nhóm người không tham quỹ trước tứ phân vị quan sát thứ nhất. Nhưng ở
trung vị và tứ phân vị thứ 3, sự khác biệt là rõ ràng. Ở quan sát trung
vị, người đủ tham gia quỹ có tài sản khoảng 12 nghìn đô, trong khi người
không tham gia quỹ có tài sản gần bằng không. Ở quan sát tứ phân vị thứ
3, người đủ tham gia quỹ có tài sản khoảng 36 nghìn đô, trong khi người
không tham gia quỹ có tài sản chỉ khoảng 6 nghìn đô (bằng 1 phần 6 nhóm
tham gia quỹ).
library(ggplot2)
library(gridExtra)
library(readxl)
# Đọc dữ liệu từ file Excel
d16 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet9")
d17 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet10")
# Vẽ biểu đồ thứ nhất
plot1 <- ggplot(data = d16, aes(x = rownames, y = nettfa )) +
geom_line(color = "green", size = 1) +
labs(title = "Biểu đồ tài sản của nhóm người tham gia quỹ",
x = "rownames",
y = "nettfa")
# Vẽ biểu đồ thứ hai
plot2 <- ggplot(data = d17, aes(x = rownames, y = nettfa )) +
geom_line(color = "red", size = 1) +
labs(title = "Biểu đồ tài sản của nhóm người không tham gia quỹ",
x = "rownames",
y = "nettfa")
# Kết hợp hai biểu đồ vào cùng một hình
grid.arrange(plot1, plot2, ncol = 1) # ncol = 1 để xếp hai biểu đồ dọc

# Thêm biến nhóm để phân biệt hai nhóm dữ liệu
d16$group <- "Tham gia quỹ"
d17$group <- "Không tham gia quỹ"
# Tính phân vị cho mỗi quan sát
d16 <- d16 %>% mutate(percentile = percent_rank(nettfa))
d17 <- d17 %>% mutate(percentile = percent_rank(nettfa))
# Kết hợp dữ liệu
combined_data <- bind_rows(d16, d17)
# Vẽ biểu đồ kết hợp với phân vị làm trục hoành
plot_combined <- ggplot(data = combined_data, aes(x = percentile, y = nettfa, color = group, group = group)) +
geom_line(size = 1) +
labs(title = "Biểu đồ tài sản của nhóm người tham gia và tham gia quỹ",
x = "Phân vị",
y = "Tài sản (nettfa)") +
theme_minimal() +
scale_color_manual(values = c("red", "green"))
# Hiển thị biểu đồ
print(plot_combined)

Trong nhóm người đủ điều kiện tham gia quỹ, nhóm người tham gia quỹ
cũng có tài sản tích lũy trung bình cao hơn những người không tham gia
quỹ hưu trí 401(k). Ở quan sát trung vị, trung bình người tham quỹ có
tài sản tích lớn hơn khoảng 9000 đô la Mỹ so với người không tham gia
quỹ. Con số chênh lệch này lớn lên ở mức xấp xỉ 12 nghìn đô ở quan sát
tứ phân vị ba.
Như vậy tài sản tích lũy sẽ tác động thuận chiểu lên cả tỷ lệ đủ điều
kiện tham gia và quyết định tham gia quỹ hưu trí 401(k).
3.7 Quỹ hưu trí trước đó đã tham gia
library(DT)
library(readxl)
library(ggplot2)
datan <- read_excel("C:/users/user/Downloads/ne2.xlsx", sheet = "ne2")
tmp <- table(datan$pira, datan$e401k)
tmp
##
## Đủ Không Đủ
## Chưa tham gia 2478 4438
## Đã tham gia 1159 1200
addmargins(tmp)
##
## Đủ Không Đủ Sum
## Chưa tham gia 2478 4438 6916
## Đã tham gia 1159 1200 2359
## Sum 3637 5638 9275
RelRisk(tmp)
## [1] 0.7292742
ggplot(datan, aes(pira, fill = e401k)) + geom_bar(position = 'dodge')

chisq.test(tmp)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tmp
## X-squared = 130, df = 1, p-value < 2.2e-16
Những người lao động Mỹ đã từng tham gia ít nhất một quỹ hưu trí
trước đó có tỷ lệ đủ điều kiện tham gia 401k cao hơn nhóm người chưa
từng tham gia. Tỷ lệ đủ điều kiện tham gia quỹ 401k ở nhóm ngườiđã từng
tham gia ít nhất một quỹ hưu trí trước đó là hơn 50% trong khi tỷ lệ này
ở nhóm người chưa từng tham gia quỹ hưu trí trước đó là 35%. Kiểm định
chi-bình phương cho tính độc lập có p-value gần bằng 0, vậy pira và
e401k có liên hệ với nhau
library(DT)
library(readxl)
library(ggplot2)
data1 <- read_excel("C:/users/user/Downloads/fitered.xlsx", sheet = "Sheet1")
tmp <- table(data1$pira, data1$p401k)
tmp
##
## Không Tham Gia Tham Gia
## Chưa Tham Gia 844 1634
## Đã Tham Gia 231 928
addmargins(tmp)
##
## Không Tham Gia Tham Gia Sum
## Chưa Tham Gia 844 1634 2478
## Đã Tham Gia 231 928 1159
## Sum 1075 2562 3637
RelRisk(tmp)
## [1] 1.708884
ggplot(data1, aes(pira, fill = p401k)) + geom_bar(position = 'dodge')

chisq.test(tmp)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tmp
## X-squared = 75.032, df = 1, p-value < 2.2e-16
Biểu đồ thể hiện rõ tỷ lệ tham gia quỹ hưu trí 401(k) của nhóm người
đã và chưa từng tham gia quỹ hưu trí nào trước đó. Theo dữ liệu, nếu một
người lao động đã tham gia ít nhất một quỹ hưu trí trước đó thì tỷ lệ
anh ta tham gia quỹ hưu trí 401(k) là 80%. Nhưng nếu anh ta chưa tham
gia một quỹ hưu trí nào trước đó thì con số tỷ lệ này lên chỉ là 65%.
Relative Risk cho ta biết nếu một người đã tham quỹ hưu trí nào trước
đó, tỷ lệ anh ta tham gia 401(k) sẽ cao hơn 70%. Kiểm định chi-bình
phương cho tính độc lập có p-value gần bằng 0, vậy pira và p401k có liên
hệ với nhau
3.8 Kết luận từ thống kê mô tả
Từ thống kê mô tả ở những phân tích trước đó, có thể nói rằng những
yếu tố tác động đến điều kiện tham gia quỹ 401(k) của một người lao động
Mỹ là Thu nhập, Tình trạng hôn nhân, Tình trạng tham gia Quỹ hưu trí
trước đó và Tài sản tích lũy của người đó. Với nhóm người đủ điều kiện
tham gia quỹ hưu trí 401(k), các yếu tố tác động đến quyết định tham gia
quỹ của họ là Thu nhập, Tình trạng hôn nhân, Tài sản tích lũy và Tình
trạng tham gia Quỹ hưu trí trước đó. Trong một số nghiên cứu và khảo sát
này, người đã tham gia một quỹ hưu trí có xu hướng tham gia thêm quỹ
401(k) có thể do lợi ích của việc đa dạng hóa danh mục tiết kiệm, đầu tư
và khả năng tài chính.
LS0tDQp0aXRsZTogIlVudGl0bGVkIg0KYXV0aG9yOiAiTmjDs20gMTQiDQpkYXRlOiAiMjAyNC0wNi0yMSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IFRSVUUNCiAgICB0b2NfZmxvYXQ6IFRSVUUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQpnZW9tZXRyeToNCiAgICAgIC0gaW5uZXI9M2NtDQogICAgICAtIG91dGVyPTRjbQ0KICAgICAgLSB0b3A9M2NtDQogICAgICAtIGJvdHRvbT00Y20NCiAgICAgIC0gaGVhZHNlcD0yMnB0DQogICAgICAtIGhlYWRoZWlnaHQ9MTFwdA0KICAgICAgLSBmb290c2tpcD0zM3B0DQogICAgICAtIGlnbm9yZWhlYWQNCiAgICAgIC0gaWdub3JlZm9vdA0KICAgICAgLSBoZWlnaHRyb3VuZGVkDQplZGl0b3Jfb3B0aW9uczogDQogIG1hcmtkb3duOiANCiAgICB3cmFwOiA3Mg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCg0KIyAxIE3hu6VjIMSRw61jaCBuZ2hpw6puIGPhu6l1DQoNCkLDoGkgdGnhu4N1IGx14bqtbiDEkcaw4bujYyB4w6J5IGThu7FuZyB0csOqbiBt4bulYyDEkcOtY2ggxJHhu4MgdMOsbSBoaeG7g3Ugbmjhu69uZyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBz4buxIHRoYW0gZ2lhIHF14bu5IGjGsHUgdHLDrSA0MDEoaykgY+G7p2EgbmfGsOG7nWkgbGFvIMSR4buZbmcgTeG7uS4gROG7ryBsaeG7h3UgxJHGsOG7o2MgdGh1IHRo4bqtcCB04burIGjGoW4gOTAwMCBjxrAgZMOibiwgaOG7jSBjw7MgdGh1IG5o4bqtcCwgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLiBnaeG7m2kgdMOtbmgsIMSR4buZIHR14buVaSwuLi4gxJFhIGThuqFuZy4gTcO0IGjDrG5oIGjhu5NpIHF1eSB0dXnhur9uIHTDrW5oIHThu5VuZyBxdcOhdCDEkcaw4bujYyDDoXAgZOG7pW5nIMSR4buDIMSRw6FuaCBnacOhIMSR4buLbmggbMaw4bujbmcgdMOhYyDEkeG7mW5nIGPhu6dhIGPhu6dhIGJp4bq/biBnaeG6o2kgdGjDrWNoIGzDqm4gduG7m2kgYmnhur9uIHBo4bulIHRodeG7mWMgxJHhu4tuaCB0w61uaCBwNDAxayAoYmnhur9uIHRo4buDIGhp4buHbiB0aGFtIGdpYSBxdeG7uSBoYXkga2jDtG5nKS4gIA0KDQojIDIgTcO0IHThuqMgc+G7kSBsaeG7h3UNCg0KU+G7kSBsaeG7h3UgxJHGsOG7o2MgdGh1IHRo4bqtcCB0csOqbiA5MjAwIG5nxrDhu51pIGxhbyDEkeG7mW5nIE3hu7kgY8OzIG5naOG7gSBuZ2hp4buHcCB0cm9uZyBjw6FjIGzEqW5oIHbhu7FjIGLhuqV0IGvhu7MgxJHhur9uIHThu6sgY8OhYyB0aeG7g3UgYmFuZyBraMOhYyBuaGF1LiBOaOG7r25nIHRow7RuZyB0aW4gxJHGsOG7o2MgdGh1IHRo4bqtcCBn4buTbTogIA0KKyBUaHUgbmjhuq1wIChpbmMpOiBT4buRIHRp4buBbiB0aHUgbmjhuq1wIHRydW5nIGLDrG5oIHRoZW8gZ2nhu50uICAgIA0KKyBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gKG1hcnIpOiDEkMOjIGvhur90IGjDtG4gaG/hurdjIENoxrBhIGvhur90IGjDtG4gDQorIEdp4bubaSB0w61uaCAobWFsZSk6IEfhu5NtIGhhaSBnaeG7m2kgdMOtbmggTmFtLCBob+G6t2MgTuG7ry4gICANCisgxJDhu5kgdHXhu5VpIChhZ2UpOiBT4buRIG7Eg20gdHXhu5VpLiAgDQorIFPhu5EgdGjDoG5oIHZpw6puIHRyb25nIGdpYSDEkcOsbmggKGZzaXplKS4gIA0KKyBUw6BpIHPhuqNuIHTDrWNoIGzFqXksIHRp4bq/dCBraeG7h20gY2hvIMSR4bq/biB0aOG7nWkgxJFp4buDbSBraOG6o28gc8OhdCAobmV0dGZmYSkuICANCisgUXXhu7kgaMawdSB0csOtIMSRw6MgdGhhbSBnaWEgdHLGsOG7m2MgxJHDsyAocGlyYSk6IE7hur91IG5nxrDhu51pIMSRxrDhu6NjIGto4bqjbyBzw6F0IMSRw6MgdGhhbSBnaWEgw610IG5o4bqldCBt4buZdCBxdeG7uSBoxrB1IHRyw60gdOG6oWkgdGjhu51pIMSRaeG7g20ga2jhuqNvIHPDoXQgc+G6vSDEkcaw4bujYyBnaGkgbmjhuq1uIGzDoCAixJDDoyB0aGFtIGdpYSIuICJDaMawYSB0aGFtIGdpYSIgbMOgIGvhur90IHF14bqjIMSRxrDhu6NjIGdoaSBuaOG6rW4gY2hvIG5o4buvbmcgY8awIGTDom4gdOG6oWkgdGjhu51pIMSRaeG7g20ga2jhuqNvIHPDoXQga2jDtG5nIHRoYW0gZ2lhIGLhuqV0IGvhu7MgcXXhu7kgaMawdSB0csOtIG7DoG8uICAgDQorIMSQaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IGjGsHUgdHLDrSA0MDEoaykgKGU0MDFrKTogxJDDonkgbMOgIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIMSRxrDhu6NjIGThu7FhIHRyw6puIHRow7RuZyB0aW4gbmjDom4ga2jhuql1IMSRxrDhu6NjIGJhbiBow6BuaCBi4bufaSBD4bulYyBRdeG6o24gbMO9IEFuIHNpbmggWMOjIGjhu5lpIEhvYSBL4buzIChTU0EpLiBOaOG7r25nIHRow7RuZyB0aW4gY8ahIGLhuqNuIGPhu6dhIG5nxrDhu51pIGxhbyDEkeG7mW5nIMSRxrDhu6NjIHjDqXQgxJHhur9uIGzDoCDEkeG7mSB0deG7lWksIHRo4budaSBnaWFuIGzDoG0gdmnhu4djLCB0aeG7gW4gdGh14bq/IMSRw6MgbuG7mXAsIHRoxqFpIGdpYW4gdsOgIGtob+G6o24gdGnhu4FuIMSRw6MgxJHDs25nIGfDs3AgY2hvIHF14bu5LiBCaeG6v24gbsOgeSDEkcaw4bujYyBnaGkgbmjhuq1uICfEkOG7pycgaG/hurdjICJLaMO0bmcgxJDhu6ciIGNobyBt4buXaSBxdWFuIHPDoXQgICANCisgVGjhu7FjIHRy4bqhbmcgdGhhbSBnaWEgcXXhu7kgY+G7p2EgbmfGsOG7nWkgbGFvIMSR4buZbmcgKHA0MDFrKTogVGhhbSBnaWEgaG/hurdjIEtow7RuZyBUaGFtIEdpYSAgDQoNCmBgYHtyfQ0KbGlicmFyeShEVCkNCmxpYnJhcnkocmVhZHhsKQ0KZCA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9rNDAxa3N1YnMueGxzeCIsIHNoZWV0ID0gIms0MDFrc3VicyIpDQpkYXRhdGFibGUoZCkNCmBgYA0KDQoNCiMgMyBUaOG7kW5nIGvDqiBNw7QgdOG6oyAgDQojIyAzLjEgxJBp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kgIA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KdG1wIDwtIHRhYmxlKGQkZTQwMWssIGQkcDQwMWspDQp0bXANCg0KZ2dwbG90KGQsIGFlcyhlNDAxaywgZmlsbCA9IHA0MDFrKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpDQpgYGAgIA0KDQpN4buZdCDEkWnhu4F1IGhp4buDbiBuaGnDqm4gbMOgIG5o4buvbmcgbmfGsOG7nWkgbGFvIMSR4buZbmcga2jDtG5nIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IHRow6wga2jDtG5nIHRoYW0gZ2lhIHF14bu5IGjGsHUgdHLDrSA0MDFrLiBOaOG7r25nIG5nxrDhu51pIG7DoHkgY2hp4bq/bSBraG/huqNuZyA2MCUgbmjhu69uZyBuZ8aw4budaSDEkcaw4bujYyBraOG6o28gc8OhdC4gQ8OzIG3hu5l0IMSRaeG7g20gxJHDoW5nIGNow7ogw70g4bufIDQwJSBuaOG7r25nIG5nxrDhu51pIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5LCBz4buRIG5nxrDhu51pIHRoYW0gZ2lhIG5oaeG7gXUgZ+G6pXAgMi41IGzhuqduIHPhu5EgbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhLiBWw6wgc2FvIG3hu5l0IG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyDEkeG7pyDEkWnhu4F1IHRoYW0gZ2lhIHF14bu5IGjGsHUgdHLDrT8gVsOsIHNhbyBt4buZdCBuZ8aw4budaSBsYW8gxJHhu5luZyDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSA0MDFrIG5oxrBuZyBs4bqhaSBraMO0bmcgdGhhbSBnaWE/IE3hu6VjIHRo4buRbmcga8OqIG3DtCB0YSBj4bunYSBiw6BpIHRp4buDdSBsdeG6rW4gc+G6vSDEkWkgdMOsbSBjw6J1IHRy4bqjIGzhu59pIGNobyAyIGPDonUgaOG7j2kgbsOgeS4gIA0KDQojIyAzLjIgR2nhu5tpIHTDrW5oIGtow7RuZyDhuqJuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgdGhhbSBnaWEgcXXhu7kNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCnRtcCA8LSB0YWJsZShkJG1hbGUsIGQkcDQwMWspDQp0bXANCg0KZ2dwbG90KGQsIGFlcyhtYWxlLCBmaWxsID0gcDQwMWspKSArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2RvZGdlJykNCg0KdG1wIDwtIHByb3AudGFibGUodG1wKQ0KdG1wDQpgYGAgIA0KDQpU4butIGJp4buDdSDEkeG7kyBj4buZdCBuw6B5LCBjw7MgdGjhu4Mgbmjhuq1uIHRo4bqleSBy4bqxbmcgcGjhuqduIGzhu5tuIG5o4buvbmcgY8awIGTDom4gxJHGsOG7o2Mga2jhuqNvIHPDoXQgbMOgIHBo4bulIG7hu68uIFPhu5EgbmfGsOG7nWkgbGFvIMSR4buZbmcgZ2nhu5tpIHTDrW5oIG7hu68gbMOgIGjGoW4gNzAwMCB0csOqbiB04buVbmcgOTI3NSBuZ8aw4budaSAoY2hp4bq/bSBiYSBwaOG6p24gdMawIHF1YW4gc8OhdCkuIFPhu5EgbmfGsOG7nWkgdGhhbSBnaWEgcXXhu7kgaMawdSB0csOtIDQwMWsg4bufIGPhuqMgaGFpIGdp4bubaSB0w61uaCDEkeG7gXUgYsOpIGjGoW4gbmhp4buBdSBs4bqnbiBz4buRIG5nxrDhu51pIGtow7RuZyB0aGFtIGdpYS4gVuG7m2kgZ2nhu5tpIHTDrW5oIG5hbSwgdOG7tyBs4buHIHPhu5EgbmfGsOG7nWkgdGhhbSBnaWEgcXXhu7kgY2jhu4kgYuG6sW5nIDEgcGjhuqduIDMgc+G7kSBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgcXXhu7kgKG5naMSpYSBsw6AgY+G7qSA0IG5nxrDhu51pIG5hbSBz4bq9IGPDsyBt4buZdCBuZ8aw4budaSB0aGFtIGdpYSBxdeG7uSkuIFRyb25nIGtoaSB24bubaSBnaeG7m2kgdMOtbmggbuG7rywgY29uIHPhu5EgbsOgeSBsw6AgMiBwaOG6p24gNSAodOG7qWMgY+G7qSA3IG5nxrDhu51pIHPhur0gY8OzIDIgbmfGsOG7nWkgdGhhbSBnaWEgcXXhu7kpLiBUw7NtIGzhuqFpIHThu7cgbOG7hyB0aGFtIGdpYSBxdeG7uSA0MDFrIOG7nyBnaeG7m2kgdMOtbmggbmFtIHbDoCBu4buvIGzhuqduIGzGsOG7o3QgbMOgIHjhuqVwIHjhu4kgMjUlIHbDoCAyOCUsIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLDoG5nIGdp4buvYSB04bu3IGzhu4cgdGhhbSBnaWEgcXXhu7kgY+G7p2EgaGFpIGdp4bubaSB0w61uaC4gICAgDQoNCktoaSBs4buNYyByYSBuaOG7r25nIHF1YW4gc8OhdCBLaMO0bmcgxJDhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kgdGjDrCB54bq/dSB04buRIEdp4bubaSB0w61uaCBjxaluZyBraMO0bmcg4bqjbmggaMaw4bufbmcgxJHhur9uIHF1eeG6v3QgxJHhu4tuaCB0aGFtIGdpYSBxdeG7uSBj4bunYSBt4buZdCBuZ8aw4budaSBsYW8gxJHhu5luZy4g4bueIGdp4bubaSB0w61uaCBuYW0gdOG7tyBs4buHIHPhu5EgbmfGsOG7nWkgdGhhbSB0csOqbiBz4buRIG5nxrDhu51pIHRoYW0gZ2lhIHF14bu5IGzDoCAwLjQzOTQgdsOgIOG7nyBnaeG7m2kgdMOtbmggbuG7ryBsw6AgMC40MTUwLg0KDQpgYGB7cn0NCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZ2dwbG90MikNCg0KZGF0YTEgPC0gcmVhZF9leGNlbCgiQzovdXNlcnMvdXNlci9Eb3dubG9hZHMvZml0ZXJlZC54bHN4Iiwgc2hlZXQgPSAiU2hlZXQxIikNCg0KdG1wIDwtIHRhYmxlKGRhdGExJG1hbGUsIGRhdGExJHA0MDFrKQ0KdG1wDQoNCmdncGxvdChkLCBhZXMobWFsZSwgZmlsbCA9IHA0MDFrKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpDQoNCnRtcCA8LSBwcm9wLnRhYmxlKHRtcCkNCnRtcA0KYGBgDQoNCg0KDQojIyAzLjMg4bqibmggaMaw4bufbmcgY+G7p2EgVGh1IE5o4bqtcA0KIyMjIDMuMy4xIFRodSBuaOG6rXAgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSBoxrB1IHRyw60NCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkocmVhZHhsKQ0KDQojIMSQ4buNYyBk4buvIGxp4buHdSB04burIGZpbGUgRXhjZWwNCmQyIDwtIHJlYWRfZXhjZWwoIkM6L3VzZXJzL3VzZXIvRG93bmxvYWRzL2s0MDFrc3VicyAtIENvcHkueGxzeCIsIHNoZWV0ID0gImR1IikNCmQzIDwtIHJlYWRfZXhjZWwoIkM6L3VzZXJzL3VzZXIvRG93bmxvYWRzL2s0MDFrc3VicyAtIENvcHkueGxzeCIsIHNoZWV0ID0gImtvZHUiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRo4bupIG5o4bqldA0KcGxvdDEgPC0gZ2dwbG90KGRhdGEgPSBkMiwgYWVzKHggPSByb3duYW1lcywgeSA9IGluYyApKSArDQogIGdlb21fbGluZShjb2xvciA9ICJncmVlbiIsIHNpemUgPSAxKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIFRodSBOaOG6rXAgduG7m2kgbmfGsOG7nWkgxJDhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAicm93bmFtZXMiLA0KICAgICAgIHkgPSAiaW5jIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0aOG7qSBoYWkNCnBsb3QyIDwtIGdncGxvdChkYXRhID0gZDMsIGFlcyh4ID0gcm93bmFtZXMsIHkgPSBpbmMgKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgVGh1IE5o4bqtcCB24bubaSBuZ8aw4budaSBLaMO0bmcgxJDhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAicm93bmFtZXMiLA0KICAgICAgIHkgPSAiaW5jIikNCg0KIyBL4bq/dCBo4bujcCBoYWkgYmnhu4N1IMSR4buTIHbDoG8gY8O5bmcgbeG7mXQgaMOsbmgNCmdyaWQuYXJyYW5nZShwbG90MSwgcGxvdDIsIG5jb2wgPSAxKSAgIyBuY29sID0gMSDEkeG7gyB44bq/cCBoYWkgYmnhu4N1IMSR4buTIGThu41jDQoNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KDQojIMSQ4buNYyBk4buvIGxp4buHdSB04burIGZpbGUgRXhjZWwNCmQyIDwtIHJlYWRfZXhjZWwoIkM6L3VzZXJzL3VzZXIvRG93bmxvYWRzL2s0MDFrc3VicyAtIENvcHkueGxzeCIsIHNoZWV0ID0gImR1IikNCmQzIDwtIHJlYWRfZXhjZWwoIkM6L3VzZXJzL3VzZXIvRG93bmxvYWRzL2s0MDFrc3VicyAtIENvcHkueGxzeCIsIHNoZWV0ID0gImtvZHUiKQ0KDQojIFRow6ptIGJp4bq/biBuaMOzbSDEkeG7gyBwaMOibiBiaeG7h3QgaGFpIG5ow7NtIGThu68gbGnhu4d1DQpkMiRncm91cCA8LSAixJDhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kiDQpkMyRncm91cCA8LSAiS2jDtG5nIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5Ig0KDQojIFTDrW5oIHBow6JuIHbhu4sgY2hvIG3hu5dpIHF1YW4gc8OhdA0KZDIgPC0gZDIgJT4lIG11dGF0ZShwZXJjZW50aWxlID0gcGVyY2VudF9yYW5rKGluYykpDQpkMyA8LSBkMyAlPiUgbXV0YXRlKHBlcmNlbnRpbGUgPSBwZXJjZW50X3JhbmsoaW5jKSkNCg0KIyBL4bq/dCBo4bujcCBk4buvIGxp4buHdQ0KY29tYmluZWRfZGF0YSA8LSBiaW5kX3Jvd3MoZDIsIGQzKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGvhur90IGjhu6NwIHbhu5tpIHBow6JuIHbhu4sgbMOgbSB0cuG7pWMgaG/DoG5oDQpwbG90X2NvbWJpbmVkIDwtIGdncGxvdChkYXRhID0gY29tYmluZWRfZGF0YSwgYWVzKHggPSBwZXJjZW50aWxlLCB5ID0gaW5jLCBjb2xvciA9IGdyb3VwLCBncm91cCA9IGdyb3VwKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgVGh1IE5o4bqtcCBj4bunYSBuZ8aw4budaSDEkeG7pyB2w6Aga2jDtG5nIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IiwNCiAgICAgICB4ID0gIlBow6JuIHbhu4siLA0KICAgICAgIHkgPSAiaW5jIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JlZW4iLCAicmVkIikpDQoNCiMgSGnhu4NuIHRo4buLIGJp4buDdSDEkeG7kw0KcHJpbnQocGxvdF9jb21iaW5lZCkNCg0KYGBgICANCg0KDQpOaOG7r25nIGPDtG5nIGTDom4gdGjhu7FjIGhp4buHbiBraOG6o28gc8OhdCDEkcaw4bujYyDEkcOhbmggc+G7kSB0aOG7qSB04buxIHBow6JuIGJp4buHdC4gUGjDrWEgdHLDqm4gbMOgIGJp4buDdSDEkeG7kyB0aHUgbmjhuq1wIMSRw6MgxJHGsOG7o2MgcGjDom4gbmjDs20gxJHhu6cgxJFp4buBdSBraeG7h24gdsOgIGtow7RuZyDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIHF1YSBxdeG7uS4gROG7ryBsaeG7h3UgdGh1IG5o4bqtcCDEkcaw4bujYyBkw7luZyDEkeG7gSB24bq9IGJp4buDdSDEkeG7kyDEkcOjIMSRxrDhu6NjIHPhuq9wIHjhur9wIGzhuqFpIHRoZW8gdGjhu6kgdOG7sSB0aOG6pXAgxJHhur9uIGNhbyB0aGVvIHRodSBuaOG6rXAgdOG7qyB0csOhaSBxdWEgcGjhuqNpLiBUaGVvIHRy4buxYyBnacOhYywgY8OzIHRo4buDIHRo4bqleSBy4bqxbmcgxJHGsOG7nW5nIGJp4buDdSDEkeG7kyB0aHUgbmjhuq1wIGPhu6dhIG5ow7NtIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IGPDsyBjYW8gaMahbiDEkcaw4budbmcgYmnhu4N1IMSR4buTIHRodSBuaOG6rXAgY+G7p2EgbmjDs20ga2jDtG5nIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5LiBWw60gZOG7pSDhu58gcXVhbiBzw6F0IOG7nyB04bupIHBow6JuIHbhu4sgdGjhu6kgbmjhuqV0LCBuaMOzbSDEkeG7pyDEkWnhu4F1IGtp4buHbiBjw7MgdGh1IG5o4bqtcCB0csOqbiAyNSDEkcO0IGxhLCBjw7JuIG5ow7NtIGtow7RuZyDEkeG7pyDEkWnhu4F1IGtp4buHbiBjw7MgdGh1IG5o4bqtcCBkxrDhu5tpIDI1IMSRw7QgbGEuIENow6puaCBs4buHY2ggbsOgeSByw7UgcuG7h3Qg4bufIHRydW5nIHbhu4sgdsOgIHThu6kgcGjDom4gduG7iyB0aOG7qSBiYS4g4bueIHF1YW4gc8OhdCB0aOG7qSAxODAwLCBuaMOzbSDEkeG7pyDEkWnhu4F1IGtp4buHbiBjw7MgdGh1IG5o4bqtcCBn4bqnbiA1MCDEkcO0IGxhLCB0cm9uZyBraGkg4bufIHF1YW4gc8OhdCAyODAwIG5ow7NtIGtow7RuZyDEkeG7pyDEkWnhu4F1IGtp4buHbiBjw7MgdGh1IG5o4bqtcCBkxrDhu5tpIDMwIMSRw7QgbGEuIOG7niB04bupIHBow6JuIHbhu4sgdGjhu6kgMywgbmjDs20gxJHhu6cgxJFp4buBdSBraeG7h24gY8OzIHRodSBuaOG6rXAgNjMgxJHDtCB0cm9uZyBraGkgbmjDs20ga2jDtG5nIMSR4bunIMSRaeG7gXUga2nhu4duIGPDsyB0aHUgbmjhuq1wIHjhuqVwIHjhu4kgNDggxJHDtCAodGjhuqVwIGjGoW4gMjQlICkuIFbhu4EgbeG6t3QgbG8tZ2ljaCwgdsOsIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IGPDsyB4w6l0IMSR4bq/biB54bq/dSB04buRIHRodSBuaOG6rXAsIG7Dqm4gdGh1IG5o4bqtcCBjw7MgdGjhu4MgdMOhYyDEkeG7mW5nIHRodeG6rW4gY2hp4buBdSBsw6puIGto4bqjIG7Eg25nIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IGPhu6dhIG3hu5l0IG5nxrDhu51pLiBT4buRIGxp4buHdSDEkcaw4bujYyB0aHUgdGjhuq1wIOG7p25nIGjhu5kgbOG6rXAgbHXhuq1uIG7DoHkuICANCg0KIyMjIDMuMy4yIFRyb25nIG5ow7NtIG5nxrDhu51pIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IDQwMWssIHnhur91IHThu5EgdGh1IG5o4bqtcCBjw7Mg4bqjbmggaMaw4bufbmcgcXV54bq/dCDEkeG7i25oIHRoYW0gZ2lhIHF14bu5Lg0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkocmVhZHhsKQ0KDQojIMSQ4buNYyBk4buvIGxp4buHdSB04burIGZpbGUgRXhjZWwNCmQ0IDwtIHJlYWRfZXhjZWwoIkM6L3VzZXJzL3VzZXIvRG93bmxvYWRzL2ZpdGVyZWQueGxzeCIsIHNoZWV0ID0gIlNoZWV0MyIpDQpkNSA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9maXRlcmVkLnhsc3giLCBzaGVldCA9ICJTaGVldDIiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRo4bupIG5o4bqldA0KcGxvdDEgPC0gZ2dwbG90KGRhdGEgPSBkNCwgYWVzKHggPSByb3duYW1lcywgeSA9IGluYyApKSArDQogIGdlb21fbGluZShjb2xvciA9ICJncmVlbiIsIHNpemUgPSAxKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIFRodSBOaOG6rXAgY+G7p2EgbmfGsOG7nWkgdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAicm93bmFtZXMiLA0KICAgICAgIHkgPSAiaW5jIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0aOG7qSBoYWkNCnBsb3QyIDwtIGdncGxvdChkYXRhID0gZDUsIGFlcyh4ID0gcm93bmFtZXMsIHkgPSBpbmMgKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgVGh1IE5o4bqtcCBj4bunYSBuZ8aw4budaSBLaMO0bmcgdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAicm93bmFtZXMiLA0KICAgICAgIHkgPSAiaW5jIikNCg0KIyBL4bq/dCBo4bujcCBoYWkgYmnhu4N1IMSR4buTIHbDoG8gY8O5bmcgbeG7mXQgaMOsbmgNCmdyaWQuYXJyYW5nZShwbG90MSwgcGxvdDIsIG5jb2wgPSAxKSAgIyBuY29sID0gMSDEkeG7gyB44bq/cCBoYWkgYmnhu4N1IMSR4buTIGThu41jDQoNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShkcGx5cikNCg0KIyDEkOG7jWMgZOG7ryBsaeG7h3UgdOG7qyBmaWxlIEV4Y2VsDQpkNCA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9maXRlcmVkLnhsc3giLCBzaGVldCA9ICJTaGVldDMiKQ0KZDUgPC0gcmVhZF9leGNlbCgiQzovdXNlcnMvdXNlci9Eb3dubG9hZHMvZml0ZXJlZC54bHN4Iiwgc2hlZXQgPSAiU2hlZXQ0IikNCg0KIyBUaMOqbSBiaeG6v24gbmjDs20gxJHhu4MgcGjDom4gYmnhu4d0IGhhaSBuaMOzbSBk4buvIGxp4buHdQ0KZDQkZ3JvdXAgPC0gIlRoYW0gZ2lhIHF14bu5Ig0KZDUkZ3JvdXAgPC0gIktow7RuZyB0aGFtIGdpYSBxdeG7uSINCg0KIyBUw61uaCBwaMOibiB24buLIGNobyBt4buXaSBxdWFuIHPDoXQNCmQ0IDwtIGQ0ICU+JSBtdXRhdGUocGVyY2VudGlsZSA9IHBlcmNlbnRfcmFuayhpbmMpKQ0KZDUgPC0gZDUgJT4lIG11dGF0ZShwZXJjZW50aWxlID0gcGVyY2VudF9yYW5rKGluYykpDQoNCiMgS+G6v3QgaOG7o3AgZOG7ryBsaeG7h3UNCmNvbWJpbmVkX2RhdGEgPC0gYmluZF9yb3dzKGQ0LCBkNSkNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBr4bq/dCBo4bujcCB24bubaSBwaMOibiB24buLIGzDoG0gdHLhu6VjIGhvw6BuaA0KZ2dwbG90KGRhdGEgPSBjb21iaW5lZF9kYXRhLCBhZXMoeCA9IHBlcmNlbnRpbGUsIHkgPSBpbmMsIGNvbG9yID0gZ3JvdXAsIGdyb3VwID0gZ3JvdXApKSArDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBUaHUgTmjhuq1wIGPhu6dhIG5nxrDhu51pIHRoYW0gZ2lhIHbDoCBraMO0bmcgdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAiUGjDom4gduG7iyIsDQogICAgICAgeSA9ICJpbmMiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJncmVlbiIsICJyZWQiKSkNCg0KYGBgICAgICANCk3hu5l0IGJp4buDdSBoaeG7h24gdMawxqFuZyB04buxIGtoaSBraOG6o28gc8OhdCB0aHUgbmjhuq1wIGLhurFuZyBiaeG7g3UgxJHhu5MgcGjDom4gduG7iyBj4bunYSBuaMOzbSBuZ8aw4budaSDEkcOjIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5LiBCaeG7g3UgxJHhu5MgdHLDqm4gdGjhu4MgaGnhu4duLCB0cm9uZyBuaMOzbSBuZ8aw4budaSDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIHF1YSBxdeG7uSwgbmfGsOG7nWkgVGhhbSBnaWEgcXXhu7kgc+G6vSBjw7MgdGh1IG5o4bqtcCBuaOG7iW5oIGjGoW4gbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhIHF14bu5LiBUdXkgbmhpw6puLCBraG/huqNuZyBjw6FjaCB0aHUgbmjhuq1wICh0aOG7gyBoaeG7h24gYuG7n2kga2hv4bqjbmcgY8OhY2ggZ2nhu69hIDIgxJHGsOG7nW5nIHhhbmgsIMSR4buPKSDhu58gYmnhu4N1IMSR4buTIHRoYW0gZ2lhIHF14bu5IHRo4bqlcCBoxqFuIGtob+G6o25nIGPDoWNoIOG7nyBiaeG7g3UgxJHhu5MgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kuIMSQaeG7gXUgbsOgeSBow6BtIMO9IHLhurFuZyBUw6FjIMSR4buZbmcgY+G7p2EgdGh1IG5o4bqtcCDEkeG6v24gxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kgbOG7m24gaMahbiB0w6FjIMSR4buZbmcgY+G7p2EgbsOzIMSR4bq/biBxdXnhur90IMSR4buLbmggdGhhbSBnaWEgcXXhu7kuDQoNCiMjIDMuNCBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4NCiMjIyAzLjQuMSBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY8OzIHTDoWMgxJHhu5luZyDEkeG6v24gxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kgaMawdSB0csOtIDQwMWsgIA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KbGlicmFyeShlcGl0b29scykNCg0KdG1wIDwtIHRhYmxlKGQkbWFyciwgZCRlNDAxaykNCnRtcA0KYWRkbWFyZ2lucyh0bXApDQoNClJlbFJpc2sodG1wKQ0KDQpnZ3Bsb3QoZCwgYWVzKG1hcnIsIGZpbGwgPSBlNDAxaykpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKQ0KDQpjaGlzcS50ZXN0KHRtcCkNCg0KYGBgDQoNClRoZW8gc+G7kSBsaeG7h3UsIG7hur91IG3hu5l0IG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biwgdOG7tyBs4buHIGFuaCB0YSAoY2jhu4sgdGEpIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IGzDoCA0MiUuIE7hur91IGNoxrBhIGvhur90IGjDtG4sIHThu7cgbOG7hyDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSBsw6AgMzQlLiBOaOG7r25nIG5nxrDhu51pIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IGPFqW5nIGPDsyB04bu3IGzhu4cga+G6v3QgaMO0biBjYW8gaMahbiBuaOG7r25nIG5nxrDhu51pIGtow7RuZyDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSAoNjclIHNvIHbhu5tpIDU5JSkuIFbhu4EgbeG6t3QgdGjhu5FuZyBrw6ogbcO0IHThuqMsIGPDsyB0aOG7gyBuw7NpIHLhurFuZyBt4buZdCBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gc+G6vSBjw7Mga2jhuqMgbsSDbmcgxJHhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kgY2FvIGjGoW4gbmjhu69uZyBuZ8aw4budaSBjaMawYSBr4bq/dCBow7RuLiBSZWxhdGl2ZSBSaXNrIGNobyB0YSBiaeG6v3QgcuG6sW5nIG7hur91IG3hu5l0IG5nxrDhu51pIGNoxrBhIGvhur90IGjDtG4sIHThu7cgbOG7hyBhbmgoY2jhu4spIHRhIHRoYW0gZ2lhIHF14bu5IHPhur0gdGjhuqVwIGjGoW4gZ+G6p24gMjAlIHNvIHbhu5tpIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0bi4gIA0KS2hpIHPhu60gZOG7pW5nIHRo4buRbmcga8OqIHN1eSBkaeG7hW4uIFbhu5tpIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyBjaG8gdMOtbmggxJHhu5ljIGzhuq1wIGPhu6dhIGhhaSBiaeG6v24gbWFyciB2w6AgZTQwMWsgKGdp4bqjIHRoaeG6v3Qga2jDtG5nOiBtYXJyIHbDoCBlNDAxayBsw6AgxJHhu5ljIGzhuq1wKSwgZG8gcC12YWx1ZSBj4bunYSBraeG7g20gxJHhu4tuaCBn4bqnbiBi4bqxbmcgMCwgY8OzIHRo4buDIGLDoWMgYuG7jyBnaeG6oyB0aGnhur90IGtow7RuZyB2w6Aga+G6v3QgbHXhuq1uIG1hcnIgdsOgIGU0MDFrIGPDsyBsacOqbiBxdWFuIHbhu5tpIG5oYXUuDQoNCg0KIyMjIDMuNC4yIFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiBjw7MgdMOhYyDEkeG7mW5nIMSR4bq/biBxdXnhur90IMSR4buLbmggdGhhbSBnaWEgcXXhu7kgaMawdSB0csOtIDQwMWsgICAgDQpgYGB7cn0NCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZ2dwbG90MikNCg0KZGF0YTEgPC0gcmVhZF9leGNlbCgiQzovdXNlcnMvdXNlci9Eb3dubG9hZHMvZml0ZXJlZC54bHN4Iiwgc2hlZXQgPSAiU2hlZXQyIikNCg0KdG1wIDwtIHRhYmxlKGRhdGExJG1hcnIsIGRhdGExJHA0MDFrKQ0KdG1wDQphZGRtYXJnaW5zKHRtcCkNCg0KUmVsUmlzayh0bXApDQoNCmdncGxvdChkYXRhMSwgYWVzKG1hcnIsIGZpbGwgPSBwNDAxaykpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKQ0KDQpjaGlzcS50ZXN0KHRtcCkNCg0KYGBgDQpUcm9uZyBuaMOzbSBuZ8aw4budaSDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSwgdOG7tyBs4buHIHRoYW0gZ2lhIHF14bu5IDQwMWsg4bufIG5ow7NtIG5nxrDhu51pIGvhur90IGjDtG4gY2FvIGjGoW4gdOG7tyBs4buHIG7DoHkg4bufIG5ow7NtIG5nxrDhu51pIGNoxrBhIGvhur90IGjGoW4gKDcyJSBzbyB24bubaSA2NiUpLiBOaOG7r25nIG5nxrDhu51pIHRoYW0gZ2lhIHF14bu5IGPFqW5nIGPDsyB04bu3IGzhu4cgxJHDoyBr4bq/dCBow7RuIGNhbyBoxqFuIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhIHF14bu5ICg3MCUgc28gduG7m2kgNjMlKS4gUXVhbiBzw6F0IG7DoHkgbMOgbSB24buvbmcgdGjDqm0gbHXhuq1uIMSRaeG7g20gcuG6sW5nIG5o4buvbmcgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIHPhur0gbMOgbSB0xINuZyBraOG6oyBuxINuZyBuZ8aw4budaSDEkcOzIHRoYW0gZ2lhIHF14bu5IGjGsHUgdHLDrSA0MDFrLiBSZWxhdGl2ZSBSaXNrIGNobyB0YSBiaeG6v3QgcuG6sW5nIG7hur91IG3hu5l0IG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biwgdOG7tyBs4buHIGFuaChjaOG7iykgdGEgdGhhbSBnaWEgcXXhu7kgc+G6vSBjYW8gaMahbiAyMSUgc28gduG7m2kgbmfGsOG7nWkgY2jGsGEga+G6v3QgaMO0bi4gIA0KS2hpIHPhu60gZOG7pW5nIHRo4buRbmcga8OqIHN1eSBkaeG7hW4uIFbhu5tpIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyBjaG8gdMOtbmggxJHhu5ljIGzhuq1wIGPhu6dhIGhhaSBiaeG6v24gbWFyciB2w6AgcDQwMWsgKGdp4bqjIHRoaeG6v3Qga2jDtG5nOiBtYXJyIHbDoCA0MDFrIGzDoCDEkeG7mWMgbOG6rXApLCBkbyBwLXZhbHVlIGPhu6dhIGtp4buDbSDEkeG7i25oIGfhuqduIGLhurFuZyAwLCBjw7MgdGjhu4MgYsOhYyBi4buPIGdp4bqjIHRoaeG6v3Qga2jDtG5nIHbDoCBr4bq/dCBsdeG6rW4gbWFyciB2w6AgZTQwMWsgY8OzIGxpw6puIHF1YW4gduG7m2kgbmhhdS4NCg0KDQojIyAzLjUgxJDhu5kgdHXhu5VpDQpDw7Mga2jhuqMgbsSDbmcgbMOgIG3hu5l0IG5nxrDhu51pIGPDsyDEkeG7mSB0deG7lWkgY8OgbmcgY2FvIHRow6wga2jhuqMgbsSDbmcgdGhhbSBnaWEgY+G7p2EgbmfGsOG7nWkgxJHDsyBjw6BuZyB0aOG6pXAuIFF14bu5IGjGsHUgdHLDrSDEkcaw4bujYyBs4bqtcCByYSBjaG8gbmjhu69uZyBuZ8aw4budaSBsYW8gxJHhu5luZyBz4bq9IGPDsyBraOG6oyBuxINuZyBsYW8gxJHhu5luZyB04bqhbyByYSBnacOhIHRy4buLIGtpbmggdOG6vyB0cm9uZyB0xrDGoW5nIGxhaSBjaG8gxJHhuqV0IG7GsOG7m2MuIEjGoW4gbuG7r2EsIHRo4budaSBnaWFuIGxhbyDEkeG7mW5nLCBraG/huqNuIHRp4buBbiDEkcOzbmcgZ8OzcCBxdeG7uSwgdGnhu4FuIHRodeG6vyDEkcOzbmcgZ8OzcCB0cm9uZyB0xrDGoW5nIGxhaSBsw6Agbmjhu69uZyB54bq/dSB04buRIMSR4buDIHjDqXQgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kgY+G7p2EgbeG7mXQgbmfGsOG7nWkgdGjDrCB0xrDGoW5nIHF1YW4gbmdo4buLY2ggduG7m2kgxJHhu5kgdHXhu5VpIGPhu6dhIG5nxrDhu51pIMSRw7MuDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KHJlYWR4bCkNCg0KIyDEkOG7jWMgZOG7ryBsaeG7h3UgdOG7qyBmaWxlIEV4Y2VsDQpkNiA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9rNDAxa3N1YnMgLSBDby54bHN4Iiwgc2hlZXQgPSAiZTIiKQ0KZDcgPC0gcmVhZF9leGNlbCgiQzovdXNlcnMvdXNlci9Eb3dubG9hZHMvazQwMWtzdWJzIC0gQ28ueGxzeCIsIHNoZWV0ID0gImUzIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0aOG7qSBuaOG6pXQNCnBsb3QxIDwtIGdncGxvdChkYXRhID0gZDYsIGFlcyh4ID0gcm93bmFtZXMsIHkgPSBhZ2UgKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiZ3JlZW4iLCBzaXplID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyDEkOG7mSB0deG7lWkgY+G7p2EgbmfGsOG7nWkgxJHhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAicm93bmFtZXMiLA0KICAgICAgIHkgPSAiYWdlIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0aOG7qSBoYWkNCnBsb3QyIDwtIGdncGxvdChkYXRhID0gZDcsIGFlcyh4ID0gcm93bmFtZXMsIHkgPSBhZ2UgKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgxJDhu5kgdHXhu5VpIGPhu6dhIG5nxrDhu51pIGtow7RuZyDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSIsDQogICAgICAgeCA9ICJyb3duYW1lcyIsDQogICAgICAgeSA9ICJhZ2UiKQ0KDQojIEvhur90IGjhu6NwIGhhaSBiaeG7g3UgxJHhu5MgdsOgbyBjw7luZyBt4buZdCBow6xuaA0KZ3JpZC5hcnJhbmdlKHBsb3QxLCBwbG90MiwgbmNvbCA9IDEpICAjIG5jb2wgPSAxIMSR4buDIHjhur9wIGhhaSBiaeG7g3UgxJHhu5MgZOG7jWMNCg0KIyBUaMOqbSBiaeG6v24gbmjDs20gxJHhu4MgcGjDom4gYmnhu4d0IGhhaSBuaMOzbSBk4buvIGxp4buHdQ0KZDYkZ3JvdXAgPC0gIsSQ4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5Ig0KZDckZ3JvdXAgPC0gIktow7RuZyDEkeG7pyDEkWnhu4F1IFRoYW0gZ2lhIHF14bu5Ig0KDQojIFTDrW5oIHBow6JuIHbhu4sgY2hvIG3hu5dpIHF1YW4gc8OhdA0KZDYgPC0gZDYgJT4lIG11dGF0ZShwZXJjZW50aWxlID0gcGVyY2VudF9yYW5rKGFnZSkpDQpkNyA8LSBkNyAlPiUgbXV0YXRlKHBlcmNlbnRpbGUgPSBwZXJjZW50X3JhbmsoYWdlKSkNCg0KIyBL4bq/dCBo4bujcCBk4buvIGxp4buHdQ0KY29tYmluZWRfZGF0YSA8LSBiaW5kX3Jvd3MoZDYsIGQ3KQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGvhur90IGjhu6NwIHbhu5tpIHBow6JuIHbhu4sgbMOgbSB0cuG7pWMgaG/DoG5oDQpwbG90X2NvbWJpbmVkIDwtIGdncGxvdChkYXRhID0gY29tYmluZWRfZGF0YSwgYWVzKHggPSBwZXJjZW50aWxlLCB5ID0gYWdlLCBjb2xvciA9IGdyb3VwLCBncm91cCA9IGdyb3VwKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgxJDhu5kgdHXhu5VpIGPhu6dhIG5nxrDhu51pIMSR4bunIMSRaeG7gXUga2nhu4duIHbDoCBraMO0bmcgxJHhu6cgdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAiUGjDom4gduG7iyIsDQogICAgICAgeSA9ICLEkOG7mSB0deG7lWkiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJncmVlbiIsICJyZWQiKSkNCg0KIyBIaeG7g24gdGjhu4sgYmnhu4N1IMSR4buTDQpwcmludChwbG90X2NvbWJpbmVkKQ0KYGBgICAgDQoNCjIgxJHGsOG7nW5nIGJp4buDdSDEkeG7kyBk4buRYyBsw6puIG5o4bq5IOG7nyDEkeG7mSB0deG7lWkgdHLDqm4gNTAuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBuaOG7r25nIG5nxrDhu51pIHRyw6puIDUwIMSR4bq/biA2MCB0deG7k2kgxJHhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kgdsOgIHRoYW0gZ2lhIHF14bu5IGPDsyDDrXQgaMahbiBuaOG7r25nIG5nxrDhu51pIHRodeG7mWMga2hv4bqjbmcgdHXhu5VpIDMwIMSR4bq/biA0MCB0deG7lWksIGhheSA0MCDEkeG6v24gNTAgdHXhu5VpLiDhu54gdHLGsOG7m2MgdHXhu5VpIDQ3LCBuaMOzbSBuZ8aw4budaSDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSBjw7MgxJHhu5kgdHXhu5VpIHRydW5nIGLDrG5oIGNhbyBoxqFuIG5ow7NtIG5nxrDhu51pIGtow7RuZyDEkeG7pyDEkWnhu4F1IGtp4buHbi4gVHV5IG5oacOqbiBzYXUgdHXhu5VpIDQ3LCBuaMOzbSBuZ8aw4budaSDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSBjw7MgxJHhu5kgdHXhu5VpIHRydW5nIGLDrG5oIHRo4bqlcCBoxqFuIG5ow7NtIG5nxrDhu51pIGtow7RuZyDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uS4gICAgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkocmVhZHhsKQ0KDQojIMSQ4buNYyBk4buvIGxp4buHdSB04burIGZpbGUgRXhjZWwNCmQ4IDwtIHJlYWRfZXhjZWwoIkM6L3VzZXJzL3VzZXIvRG93bmxvYWRzL2ZpdGVyZWQueGxzeCIsIHNoZWV0ID0gIlNoZWV0NSIpDQpkOSA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9maXRlcmVkLnhsc3giLCBzaGVldCA9ICJTaGVldDYiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRo4bupIG5o4bqldA0KcGxvdDEgPC0gZ2dwbG90KGRhdGEgPSBkOCwgYWVzKHggPSByb3duYW1lcywgeSA9IGFnZSApKSArDQogIGdlb21fbGluZShjb2xvciA9ICJncmVlbiIsIHNpemUgPSAxKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIMSQ4buZIHR14buVaSBj4bunYSBuZ8aw4budaSB0aGFtIGdpYSBxdeG7uSIsDQogICAgICAgeCA9ICJyb3duYW1lcyIsDQogICAgICAgeSA9ICJhZ2UiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRo4bupIGhhaQ0KcGxvdDIgPC0gZ2dwbG90KGRhdGEgPSBkOSwgYWVzKHggPSByb3duYW1lcywgeSA9IGFnZSApKSArDQogIGdlb21fbGluZShjb2xvciA9ICJyZWQiLCBzaXplID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyDEkOG7mSB0deG7lWkgY+G7p2EgbmfGsOG7nWkgS2jDtG5nIHRoYW0gZ2lhIHF14bu5IiwNCiAgICAgICB4ID0gInJvd25hbWVzIiwNCiAgICAgICB5ID0gImFnZSIpDQoNCiMgS+G6v3QgaOG7o3AgaGFpIGJp4buDdSDEkeG7kyB2w6BvIGPDuW5nIG3hu5l0IGjDrG5oDQpncmlkLmFycmFuZ2UocGxvdDEsIHBsb3QyLCBuY29sID0gMSkgICMgbmNvbCA9IDEgxJHhu4MgeOG6v3AgaGFpIGJp4buDdSDEkeG7kyBk4buNYw0KDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZHBseXIpDQoNCiMgxJDhu41jIGThu68gbGnhu4d1IHThu6sgZmlsZSBFeGNlbA0KZDggPC0gcmVhZF9leGNlbCgiQzovdXNlcnMvdXNlci9Eb3dubG9hZHMvZml0ZXJlZC54bHN4Iiwgc2hlZXQgPSAiU2hlZXQ1IikNCmQ5IDwtIHJlYWRfZXhjZWwoIkM6L3VzZXJzL3VzZXIvRG93bmxvYWRzL2ZpdGVyZWQueGxzeCIsIHNoZWV0ID0gIlNoZWV0NiIpDQoNCiMgVGjDqm0gYmnhur9uIG5ow7NtIMSR4buDIHBow6JuIGJp4buHdCBoYWkgbmjDs20gZOG7ryBsaeG7h3UNCmQ4JGdyb3VwIDwtICJUaGFtIGdpYSBxdeG7uSINCmQ5JGdyb3VwIDwtICJLaMO0bmcgdGhhbSBnaWEgcXXhu7kiDQoNCiMgVMOtbmggcGjDom4gduG7iyBjaG8gbeG7l2kgcXVhbiBzw6F0DQpkOCA8LSBkOCAlPiUgbXV0YXRlKHBlcmNlbnRpbGUgPSBwZXJjZW50X3JhbmsoYWdlKSkNCmQ5IDwtIGQ5ICU+JSBtdXRhdGUocGVyY2VudGlsZSA9IHBlcmNlbnRfcmFuayhhZ2UpKQ0KDQojIEvhur90IGjhu6NwIGThu68gbGnhu4d1DQpjb21iaW5lZF9kYXRhIDwtIGJpbmRfcm93cyhkOCwgZDkpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5Mga+G6v3QgaOG7o3AgduG7m2kgcGjDom4gduG7iyBsw6BtIHRy4bulYyBob8OgbmgNCmdncGxvdChkYXRhID0gY29tYmluZWRfZGF0YSwgYWVzKHggPSBwZXJjZW50aWxlLCB5ID0gYWdlLCBjb2xvciA9IGdyb3VwLCBncm91cCA9IGdyb3VwKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgxJDhu5kgVHXhu5VpIGPhu6dhIG5nxrDhu51pIHRoYW0gZ2lhIHbDoCBraMO0bmcgdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAiUGjDom4gduG7iyIsDQogICAgICAgeSA9ICJpbmMiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJyZWQiLCAiZ3JlZW4iKSkNCg0KYGBgICANCiAgDQpUcm9uZyBuaMOzbSBuZ8aw4budaSDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSwgxJHhu5kgdHXhu5VpIGPhu6dhIG3hu5l0IG5nxrDhu51pIGxhbyDEkeG7mW5nIGtow7RuZyDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIHRoYW0gZ2lhIHF14bu5IGPhu6dhIG5nxrDhu51pIMSRw7MuICANCg0KIyMgMy41IFPhu5EgdGjDoG5oIHZpw6puIHRyb25nIGdpYSDEkcOsbmgNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkocmVhZHhsKQ0KDQojIMSQ4buNYyBk4buvIGxp4buHdSB04burIGZpbGUgRXhjZWwNCmQxMCA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9rNDAxa3N1YnMgLSBDLnhsc3giLCBzaGVldCA9ICJlMiIpDQpkMTEgPC0gcmVhZF9leGNlbCgiQzovdXNlcnMvdXNlci9Eb3dubG9hZHMvazQwMWtzdWJzIC0gQy54bHN4Iiwgc2hlZXQgPSAiZTMiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRo4bupIG5o4bqldA0KcGxvdDEgPC0gZ2dwbG90KGRhdGEgPSBkMTAsIGFlcyh4ID0gcm93bmFtZXMsIHkgPSBmc2l6ZSApKSArDQogIGdlb21fbGluZShjb2xvciA9ICJncmVlbiIsIHNpemUgPSAxKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHPhu5EgdGjDoG5oIHZpw6puIGdpYSDEkcOsbmggY+G7p2EgbmfGsOG7nWkgxJHhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAicm93bmFtZXMiLA0KICAgICAgIHkgPSAiZnNpemUiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRo4bupIGhhaQ0KcGxvdDIgPC0gZ2dwbG90KGRhdGEgPSBkMTEsIGFlcyh4ID0gcm93bmFtZXMsIHkgPSBmc2l6ZSApKSArDQogIGdlb21fbGluZShjb2xvciA9ICJyZWQiLCBzaXplID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBT4buRIHRow6BuaCB2acOqbiBnaWEgxJHDrG5oIGPhu6dhIG5nxrDhu51pIGtow7RuZyDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSIsDQogICAgICAgeCA9ICJyb3duYW1lcyIsDQogICAgICAgeSA9ICJmc2l6ZSIpDQoNCiMgS+G6v3QgaOG7o3AgaGFpIGJp4buDdSDEkeG7kyB2w6BvIGPDuW5nIG3hu5l0IGjDrG5oDQpncmlkLmFycmFuZ2UocGxvdDEsIHBsb3QyLCBuY29sID0gMSkgICMgbmNvbCA9IDEgxJHhu4MgeOG6v3AgaGFpIGJp4buDdSDEkeG7kyBk4buNYw0KDQojIFRow6ptIGJp4bq/biBuaMOzbSDEkeG7gyBwaMOibiBiaeG7h3QgaGFpIG5ow7NtIGThu68gbGnhu4d1DQpkMTAkZ3JvdXAgPC0gIsSQ4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5Ig0KZDExJGdyb3VwIDwtICJLaMO0bmcgxJHhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kiDQoNCiMgVMOtbmggcGjDom4gduG7iyBjaG8gbeG7l2kgcXVhbiBzw6F0DQpkMTAgPC0gZDEwICU+JSBtdXRhdGUocGVyY2VudGlsZSA9IHBlcmNlbnRfcmFuayhmc2l6ZSkpDQpkMTEgPC0gZDExICU+JSBtdXRhdGUocGVyY2VudGlsZSA9IHBlcmNlbnRfcmFuayhmc2l6ZSkpDQoNCiMgS+G6v3QgaOG7o3AgZOG7ryBsaeG7h3UNCmNvbWJpbmVkX2RhdGEgPC0gYmluZF9yb3dzKGQxMCwgZDExKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGvhur90IGjhu6NwIHbhu5tpIHBow6JuIHbhu4sgbMOgbSB0cuG7pWMgaG/DoG5oDQpwbG90X2NvbWJpbmVkIDwtIGdncGxvdChkYXRhID0gY29tYmluZWRfZGF0YSwgYWVzKHggPSBwZXJjZW50aWxlLCB5ID0gZnNpemUsIGNvbG9yID0gZ3JvdXAsIGdyb3VwID0gZ3JvdXApKSArDQogIGdlb21fbGluZShzaXplID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBz4buRIHRow6BuaCB2acOqbiBnaWEgxJHDrG5oIGPhu6dhIG5nxrDhu51pIMSR4bunIHbDoCBraMO0bmcgxJHhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAiUGjDom4gduG7iyIsDQogICAgICAgeSA9ICJT4buRIHRow6BuaCB2acOqbiBnaWEgxJHDrG5oIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiZ3JlZW4iLCAicmVkIikpDQoNCiMgSGnhu4NuIHRo4buLIGJp4buDdSDEkeG7kw0KcHJpbnQocGxvdF9jb21iaW5lZCkNCmBgYCAgIA0KDQpT4buRIHRow6BuaCB2acOqbiB0cm9uZyBnaWEgxJHDrG5oIHBow6JuIHBo4buRaSDEkeG7k25nIMSR4buBdSB2w6AgdMawxqFuZyB04buxIG5oYXUg4bufIGPhuqMgMiBuaMOzbSBuZ8aw4budaSDEkeG7pyB2w6Aga2jDtG5nIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IGjGsHUgdHLDrS4gIA0KQmnhu4N1IGhp4buHbiB0xrDGoW5nIHThu7EgY8WpbmcgxJHGsOG7o2MgcGjDoXQgaGnhu4duIGtoaSBxdWFuIHPDoXQgc+G7kSB0aMOgbmggdmnDqm4gdHJvbmcgZ2lhIMSRw6xuaCBj4bunYSBuaMOzbSBuZ8aw4budaSB0aGFtIGdpYSBxdeG7uSB2w6Aga2jDtG5nIHRoYW0gZ2lhIHF14bu5LiBOaMawIHbhuq15IHnhur91IHThu5Egc+G7kSB0aMOgbmggdmnDqm4gdHJvbmcgZ2lhIMSRw6xuaCBraMO0bmcgdMOhYyDEkeG7mW5nIMSR4bq/biDEkWnhu4F1IGtp4buHbiB2w6AgcXV54bq/dCDEkeG7i25oIHRoYW0gZ2lhIHF14bu5IGjGsHUgdHLDrSBj4bunYSBt4buZdCBuZ8aw4budaSBsYW8gxJHhu5luZyBN4bu5LiAgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KHJlYWR4bCkNCg0KIyDEkOG7jWMgZOG7ryBsaeG7h3UgdOG7qyBmaWxlIEV4Y2VsDQpkMTIgPC0gcmVhZF9leGNlbCgiQzovdXNlcnMvdXNlci9Eb3dubG9hZHMvZml0ZXJlZC54bHN4Iiwgc2hlZXQgPSAiU2hlZXQ3IikNCmQxMyA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9maXRlcmVkLnhsc3giLCBzaGVldCA9ICJTaGVldDgiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRo4bupIG5o4bqldA0KcGxvdDEgPC0gZ2dwbG90KGRhdGEgPSBkMTIsIGFlcyh4ID0gcm93bmFtZXMsIHkgPSBmc2l6ZSApKSArDQogIGdlb21fbGluZShjb2xvciA9ICJncmVlbiIsIHNpemUgPSAxKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHPhu5EgdGjDoG5oIHZpw6puIGdpYSDEkcOsbmggY+G7p2EgbmfGsOG7nWkgdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAicm93bmFtZXMiLA0KICAgICAgIHkgPSAiZnNpemUiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRo4bupIGhhaQ0KcGxvdDIgPC0gZ2dwbG90KGRhdGEgPSBkMTMsIGFlcyh4ID0gcm93bmFtZXMsIHkgPSBmc2l6ZSApKSArDQogIGdlb21fbGluZShjb2xvciA9ICJyZWQiLCBzaXplID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBT4buRIHRow6BuaCB2acOqbiBnaWEgxJHDrG5oIGPhu6dhIG5nxrDhu51pIHRoYW0gZ2lhIHF14bu5IiwNCiAgICAgICB4ID0gInJvd25hbWVzIiwNCiAgICAgICB5ID0gImZzaXplIikNCg0KIyBL4bq/dCBo4bujcCBoYWkgYmnhu4N1IMSR4buTIHbDoG8gY8O5bmcgbeG7mXQgaMOsbmgNCmdyaWQuYXJyYW5nZShwbG90MSwgcGxvdDIsIG5jb2wgPSAxKSAgIyBuY29sID0gMSDEkeG7gyB44bq/cCBoYWkgYmnhu4N1IMSR4buTIGThu41jDQoNCiMgVGjDqm0gYmnhur9uIG5ow7NtIMSR4buDIHBow6JuIGJp4buHdCBoYWkgbmjDs20gZOG7ryBsaeG7h3UNCmQxMiRncm91cCA8LSAidGhhbSBnaWEgcXXhu7kiDQpkMTMkZ3JvdXAgPC0gIktow7RuZyB0aGFtIGdpYSBxdeG7uSINCg0KIyBUw61uaCBwaMOibiB24buLIGNobyBt4buXaSBxdWFuIHPDoXQNCmQxMiA8LSBkMTIgJT4lIG11dGF0ZShwZXJjZW50aWxlID0gcGVyY2VudF9yYW5rKGZzaXplKSkNCmQxMyA8LSBkMTMgJT4lIG11dGF0ZShwZXJjZW50aWxlID0gcGVyY2VudF9yYW5rKGZzaXplKSkNCg0KIyBL4bq/dCBo4bujcCBk4buvIGxp4buHdQ0KY29tYmluZWRfZGF0YSA8LSBiaW5kX3Jvd3MoZDEyLCBkMTMpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5Mga+G6v3QgaOG7o3AgduG7m2kgcGjDom4gduG7iyBsw6BtIHRy4bulYyBob8OgbmgNCnBsb3RfY29tYmluZWQgPC0gZ2dwbG90KGRhdGEgPSBjb21iaW5lZF9kYXRhLCBhZXMoeCA9IHBlcmNlbnRpbGUsIHkgPSBmc2l6ZSwgY29sb3IgPSBncm91cCwgZ3JvdXAgPSBncm91cCkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHPhu5EgdGjDoG5oIHZpw6puIGdpYSDEkcOsbmggY+G7p2EgbmfGsOG7nWkgdGhhbSBnaWEgdsOgIGtow7RuZyB0aGFtIGdpYSBxdeG7uSIsDQogICAgICAgeCA9ICJQaMOibiB24buLIiwNCiAgICAgICB5ID0gIlPhu5EgdGjDoG5oIHZpw6puIGdpYSDEkcOsbmgiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJncmVlbiIsICJyZWQiKSkNCg0KIyBIaeG7g24gdGjhu4sgYmnhu4N1IMSR4buTDQpwcmludChwbG90X2NvbWJpbmVkKQ0KYGBgICAgDQoNCiMjIDMuNiBUw6BpIHPhuqNuIHRp4bq/dCBraeG7h20sIHTDrWNoIGzFqXkNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkocmVhZHhsKQ0KDQojIMSQ4buNYyBk4buvIGxp4buHdSB04burIGZpbGUgRXhjZWwNCmQxNCA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9rNDAxa3N1YnMgLSBELnhsc3giLCBzaGVldCA9ICJlMiIpDQpkMTUgPC0gcmVhZF9leGNlbCgiQzovdXNlcnMvdXNlci9Eb3dubG9hZHMvazQwMWtzdWJzIC0gRC54bHN4Iiwgc2hlZXQgPSAiZTMiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRo4bupIG5o4bqldA0KcGxvdDEgPC0gZ2dwbG90KGRhdGEgPSBkMTQsIGFlcyh4ID0gcm93bmFtZXMsIHkgPSBuZXR0ZmEgKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAiZ3JlZW4iLCBzaXplID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB0w6BpIHPhuqNuIGPhu6dhIG5ow7NtIG5nxrDhu51pIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IiwNCiAgICAgICB4ID0gInJvd25hbWVzIiwNCiAgICAgICB5ID0gIm5ldHRmYSIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdGjhu6kgaGFpDQpwbG90MiA8LSBnZ3Bsb3QoZGF0YSA9IGQxNSwgYWVzKHggPSByb3duYW1lcywgeSA9IG5ldHRmYSApKSArDQogIGdlb21fbGluZShjb2xvciA9ICJyZWQiLCBzaXplID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB0w6BpIHPhuqNuIGPhu6dhIG5ow7NtIG5nxrDhu51pIGtow7RuZyDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSIsDQogICAgICAgeCA9ICJyb3duYW1lcyIsDQogICAgICAgeSA9ICJuZXR0ZmEiKQ0KDQojIEvhur90IGjhu6NwIGhhaSBiaeG7g3UgxJHhu5MgdsOgbyBjw7luZyBt4buZdCBow6xuaA0KZ3JpZC5hcnJhbmdlKHBsb3QxLCBwbG90MiwgbmNvbCA9IDEpICAjIG5jb2wgPSAxIMSR4buDIHjhur9wIGhhaSBiaeG7g3UgxJHhu5MgZOG7jWMNCg0KIyBUaMOqbSBiaeG6v24gbmjDs20gxJHhu4MgcGjDom4gYmnhu4d0IGhhaSBuaMOzbSBk4buvIGxp4buHdQ0KZDE0JGdyb3VwIDwtICLEkOG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSINCmQxNSRncm91cCA8LSAiS2jDtG5nIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5Ig0KDQojIFTDrW5oIHBow6JuIHbhu4sgY2hvIG3hu5dpIHF1YW4gc8OhdA0KZDE0IDwtIGQxNCAlPiUgbXV0YXRlKHBlcmNlbnRpbGUgPSBwZXJjZW50X3JhbmsobmV0dGZhKSkNCmQxNSA8LSBkMTUgJT4lIG11dGF0ZShwZXJjZW50aWxlID0gcGVyY2VudF9yYW5rKG5ldHRmYSkpDQoNCiMgS+G6v3QgaOG7o3AgZOG7ryBsaeG7h3UNCmNvbWJpbmVkX2RhdGEgPC0gYmluZF9yb3dzKGQxNCwgZDE1KQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGvhur90IGjhu6NwIHbhu5tpIHBow6JuIHbhu4sgbMOgbSB0cuG7pWMgaG/DoG5oDQpwbG90X2NvbWJpbmVkIDwtIGdncGxvdChkYXRhID0gY29tYmluZWRfZGF0YSwgYWVzKHggPSBwZXJjZW50aWxlLCB5ID0gbmV0dGZhLCBjb2xvciA9IGdyb3VwLCBncm91cCA9IGdyb3VwKSkgKw0KICBnZW9tX2xpbmUoc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdMOgaSBz4bqjbiBj4bunYSBuaMOzbSBuZ8aw4budaSDEkeG7pyB2w6Aga2jDtG5nIMSR4bunIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IiwNCiAgICAgICB4ID0gIlBow6JuIHbhu4siLA0KICAgICAgIHkgPSAiVMOgaSBz4bqjbiAobmV0dGZhKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImdyZWVuIiwgInJlZCIpKQ0KDQojIEhp4buDbiB0aOG7iyBiaeG7g3UgxJHhu5MNCnByaW50KHBsb3RfY29tYmluZWQpDQpgYGAgICANCiAgDQpLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGzhu5tuIHbhu4EgdMOgaSBz4bqjbiBj4bunYSBuaMOzbSBuZ8aw4budaSB0aGFtIGdpYSBxdeG7uSB2w6AgbmjDs20gbmfGsOG7nWkga2jDtG5nIHRoYW0gcXXhu7kgdHLGsOG7m2MgdOG7qSBwaMOibiB24buLIHF1YW4gc8OhdCB0aOG7qSBuaOG6pXQuIE5oxrBuZyDhu58gdHJ1bmcgduG7iyB2w6AgdOG7qSBwaMOibiB24buLIHRo4bupIDMsIHPhu7Ega2jDoWMgYmnhu4d0IGzDoCByw7UgcsOgbmcuIOG7niBxdWFuIHPDoXQgdHJ1bmcgduG7iywgbmfGsOG7nWkgxJHhu6cgdGhhbSBnaWEgcXXhu7kgY8OzIHTDoGkgc+G6o24ga2hv4bqjbmcgMTIgbmdow6xuIMSRw7QsIHRyb25nIGtoaSBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgcXXhu7kgY8OzIHTDoGkgc+G6o24gZ+G6p24gYuG6sW5nIGtow7RuZy4g4bueIHF1YW4gc8OhdCB04bupIHBow6JuIHbhu4sgdGjhu6kgMywgbmfGsOG7nWkgxJHhu6cgdGhhbSBnaWEgcXXhu7kgY8OzIHTDoGkgc+G6o24ga2hv4bqjbmcgMzYgbmdow6xuIMSRw7QsIHRyb25nIGtoaSBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgcXXhu7kgY8OzIHTDoGkgc+G6o24gY2jhu4kga2hv4bqjbmcgNiBuZ2jDrG4gxJHDtCAoYuG6sW5nIDEgcGjhuqduIDYgbmjDs20gdGhhbSBnaWEgcXXhu7kpLg0KDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShncmlkRXh0cmEpDQpsaWJyYXJ5KHJlYWR4bCkNCg0KIyDEkOG7jWMgZOG7ryBsaeG7h3UgdOG7qyBmaWxlIEV4Y2VsDQpkMTYgPC0gcmVhZF9leGNlbCgiQzovdXNlcnMvdXNlci9Eb3dubG9hZHMvZml0ZXJlZC54bHN4Iiwgc2hlZXQgPSAiU2hlZXQ5IikNCmQxNyA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9maXRlcmVkLnhsc3giLCBzaGVldCA9ICJTaGVldDEwIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0aOG7qSBuaOG6pXQNCnBsb3QxIDwtIGdncGxvdChkYXRhID0gZDE2LCBhZXMoeCA9IHJvd25hbWVzLCB5ID0gbmV0dGZhICkpICsNCiAgZ2VvbV9saW5lKGNvbG9yID0gImdyZWVuIiwgc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdMOgaSBz4bqjbiBj4bunYSBuaMOzbSBuZ8aw4budaSB0aGFtIGdpYSBxdeG7uSIsDQogICAgICAgeCA9ICJyb3duYW1lcyIsDQogICAgICAgeSA9ICJuZXR0ZmEiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRo4bupIGhhaQ0KcGxvdDIgPC0gZ2dwbG90KGRhdGEgPSBkMTcsIGFlcyh4ID0gcm93bmFtZXMsIHkgPSBuZXR0ZmEgKSkgKw0KICBnZW9tX2xpbmUoY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdMOgaSBz4bqjbiBj4bunYSBuaMOzbSBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgcXXhu7kiLA0KICAgICAgIHggPSAicm93bmFtZXMiLA0KICAgICAgIHkgPSAibmV0dGZhIikNCg0KIyBL4bq/dCBo4bujcCBoYWkgYmnhu4N1IMSR4buTIHbDoG8gY8O5bmcgbeG7mXQgaMOsbmgNCmdyaWQuYXJyYW5nZShwbG90MSwgcGxvdDIsIG5jb2wgPSAxKSAgIyBuY29sID0gMSDEkeG7gyB44bq/cCBoYWkgYmnhu4N1IMSR4buTIGThu41jDQoNCiMgVGjDqm0gYmnhur9uIG5ow7NtIMSR4buDIHBow6JuIGJp4buHdCBoYWkgbmjDs20gZOG7ryBsaeG7h3UNCmQxNiRncm91cCA8LSAiVGhhbSBnaWEgcXXhu7kiDQpkMTckZ3JvdXAgPC0gIktow7RuZyB0aGFtIGdpYSBxdeG7uSINCg0KIyBUw61uaCBwaMOibiB24buLIGNobyBt4buXaSBxdWFuIHPDoXQNCmQxNiA8LSBkMTYgJT4lIG11dGF0ZShwZXJjZW50aWxlID0gcGVyY2VudF9yYW5rKG5ldHRmYSkpDQpkMTcgPC0gZDE3ICU+JSBtdXRhdGUocGVyY2VudGlsZSA9IHBlcmNlbnRfcmFuayhuZXR0ZmEpKQ0KDQojIEvhur90IGjhu6NwIGThu68gbGnhu4d1DQpjb21iaW5lZF9kYXRhIDwtIGJpbmRfcm93cyhkMTYsIGQxNykNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBr4bq/dCBo4bujcCB24bubaSBwaMOibiB24buLIGzDoG0gdHLhu6VjIGhvw6BuaA0KcGxvdF9jb21iaW5lZCA8LSBnZ3Bsb3QoZGF0YSA9IGNvbWJpbmVkX2RhdGEsIGFlcyh4ID0gcGVyY2VudGlsZSwgeSA9IG5ldHRmYSwgY29sb3IgPSBncm91cCwgZ3JvdXAgPSBncm91cCkpICsNCiAgZ2VvbV9saW5lKHNpemUgPSAxKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHTDoGkgc+G6o24gY+G7p2EgbmjDs20gbmfGsOG7nWkgdGhhbSBnaWEgdsOgIHRoYW0gZ2lhIHF14bu5IiwNCiAgICAgICB4ID0gIlBow6JuIHbhu4siLA0KICAgICAgIHkgPSAiVMOgaSBz4bqjbiAobmV0dGZhKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoInJlZCIsICJncmVlbiIpKQ0KDQojIEhp4buDbiB0aOG7iyBiaeG7g3UgxJHhu5MNCnByaW50KHBsb3RfY29tYmluZWQpDQpgYGAgICANCg0KVHJvbmcgbmjDs20gbmfGsOG7nWkgxJHhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7ksIG5ow7NtIG5nxrDhu51pIHRoYW0gZ2lhIHF14bu5IGPFqW5nIGPDsyB0w6BpIHPhuqNuIHTDrWNoIGzFqXkgdHJ1bmcgYsOsbmggY2FvIGjGoW4gbmjhu69uZyBuZ8aw4budaSBraMO0bmcgdGhhbSBnaWEgcXXhu7kgaMawdSB0csOtIDQwMShrKS4g4bueIHF1YW4gc8OhdCB0cnVuZyB24buLLCB0cnVuZyBiw6xuaCBuZ8aw4budaSB0aGFtIHF14bu5IGPDsyB0w6BpIHPhuqNuIHTDrWNoIGzhu5tuIGjGoW4ga2hv4bqjbmcgOTAwMCDEkcO0IGxhIE3hu7kgc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHRoYW0gZ2lhIHF14bu5LiBDb24gc+G7kSBjaMOqbmggbOG7h2NoIG7DoHkgbOG7m24gbMOqbiDhu58gbeG7qWMgeOG6pXAgeOG7iSAxMiBuZ2jDrG4gxJHDtCDhu58gcXVhbiBzw6F0IHThu6kgcGjDom4gduG7iyBiYS4gIA0KTmjGsCB24bqteSB0w6BpIHPhuqNuIHTDrWNoIGzFqXkgc+G6vSB0w6FjIMSR4buZbmcgdGh14bqtbiBjaGnhu4N1IGzDqm4gY+G6oyB04bu3IGzhu4cgxJHhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgdsOgIHF1eeG6v3QgxJHhu4tuaCB0aGFtIGdpYSBxdeG7uSBoxrB1IHRyw60gNDAxKGspLiAgDQoNCiMjIDMuNyBRdeG7uSBoxrB1IHRyw60gdHLGsOG7m2MgxJHDsyDEkcOjIHRoYW0gZ2lhDQoNCg0KYGBge3J9DQpsaWJyYXJ5KERUKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGdncGxvdDIpDQoNCmRhdGFuIDwtIHJlYWRfZXhjZWwoIkM6L3VzZXJzL3VzZXIvRG93bmxvYWRzL25lMi54bHN4Iiwgc2hlZXQgPSAibmUyIikNCg0KdG1wIDwtIHRhYmxlKGRhdGFuJHBpcmEsIGRhdGFuJGU0MDFrKQ0KdG1wDQphZGRtYXJnaW5zKHRtcCkNCg0KUmVsUmlzayh0bXApDQoNCmdncGxvdChkYXRhbiwgYWVzKHBpcmEsIGZpbGwgPSBlNDAxaykpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKQ0KDQpjaGlzcS50ZXN0KHRtcCkNCmBgYCAgDQoNCk5o4buvbmcgbmfGsOG7nWkgbGFvIMSR4buZbmcgTeG7uSDEkcOjIHThu6tuZyB0aGFtIGdpYSDDrXQgbmjhuqV0IG3hu5l0IHF14bu5IGjGsHUgdHLDrSB0csaw4bubYyDEkcOzIGPDsyB04bu3IGzhu4cgxJHhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgNDAxayBjYW8gaMahbiBuaMOzbSBuZ8aw4budaSBjaMawYSB04burbmcgdGhhbSBnaWEuIFThu7cgbOG7hyDEkeG7pyDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSA0MDFrIOG7nyBuaMOzbSBuZ8aw4budacSRw6MgdOG7q25nIHRoYW0gZ2lhIMOtdCBuaOG6pXQgbeG7mXQgcXXhu7kgaMawdSB0csOtIHRyxrDhu5tjIMSRw7MgbMOgIGjGoW4gNTAlIHRyb25nIGtoaSB04bu3IGzhu4cgbsOgeSDhu58gbmjDs20gbmfGsOG7nWkgY2jGsGEgdOG7q25nIHRoYW0gZ2lhIHF14bu5IGjGsHUgdHLDrSB0csaw4bubYyDEkcOzIGzDoCAzNSUuDQpLaeG7g20gxJHhu4tuaCBjaGktYsOsbmggcGjGsMahbmcgY2hvIHTDrW5oIMSR4buZYyBs4bqtcCBjw7MgcC12YWx1ZSBn4bqnbiBi4bqxbmcgMCwgduG6rXkgcGlyYSB2w6AgZTQwMWsgY8OzIGxpw6puIGjhu4cgduG7m2kgbmhhdQ0KDQpgYGB7cn0NCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoZ2dwbG90MikNCg0KZGF0YTEgPC0gcmVhZF9leGNlbCgiQzovdXNlcnMvdXNlci9Eb3dubG9hZHMvZml0ZXJlZC54bHN4Iiwgc2hlZXQgPSAiU2hlZXQxIikNCg0KdG1wIDwtIHRhYmxlKGRhdGExJHBpcmEsIGRhdGExJHA0MDFrKQ0KdG1wDQphZGRtYXJnaW5zKHRtcCkNCg0KUmVsUmlzayh0bXApDQoNCmdncGxvdChkYXRhMSwgYWVzKHBpcmEsIGZpbGwgPSBwNDAxaykpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKQ0KDQpjaGlzcS50ZXN0KHRtcCkNCmBgYCAgDQpCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHLDtSB04bu3IGzhu4cgdGhhbSBnaWEgcXXhu7kgaMawdSB0csOtIDQwMShrKSBj4bunYSBuaMOzbSBuZ8aw4budaSDEkcOjIHbDoCBjaMawYSB04burbmcgdGhhbSBnaWEgcXXhu7kgaMawdSB0csOtIG7DoG8gdHLGsOG7m2MgxJHDsy4gVGhlbyBk4buvIGxp4buHdSwgbuG6v3UgbeG7mXQgbmfGsOG7nWkgbGFvIMSR4buZbmcgxJHDoyB0aGFtIGdpYSDDrXQgbmjhuqV0IG3hu5l0IHF14bu5IGjGsHUgdHLDrSB0csaw4bubYyDEkcOzIHRow6wgdOG7tyBs4buHIGFuaCB0YSB0aGFtIGdpYSBxdeG7uSBoxrB1IHRyw60gNDAxKGspIGzDoCA4MCUuIE5oxrBuZyBu4bq/dSBhbmggdGEgY2jGsGEgdGhhbSBnaWEgbeG7mXQgcXXhu7kgaMawdSB0csOtIG7DoG8gdHLGsOG7m2MgxJHDsyB0aMOsIGNvbiBz4buRIHThu7cgbOG7hyBuw6B5IGzDqm4gY2jhu4kgbMOgIDY1JS4gUmVsYXRpdmUgUmlzayBjaG8gdGEgYmnhur90IG7hur91IG3hu5l0IG5nxrDhu51pIMSRw6MgdGhhbSBxdeG7uSBoxrB1IHRyw60gbsOgbyB0csaw4bubYyDEkcOzLCB04bu3IGzhu4cgYW5oIHRhIHRoYW0gZ2lhIDQwMShrKSBz4bq9IGNhbyBoxqFuIDcwJS4gS2nhu4NtIMSR4buLbmggY2hpLWLDrG5oIHBoxrDGoW5nIGNobyB0w61uaCDEkeG7mWMgbOG6rXAgY8OzIHAtdmFsdWUgZ+G6p24gYuG6sW5nIDAsIHbhuq15IHBpcmEgdsOgIHA0MDFrIGPDsyBsacOqbiBo4buHIHbhu5tpIG5oYXUNCg0KIyMgMy44IEvhur90IGx14bqtbiB04burIHRo4buRbmcga8OqIG3DtCB04bqjDQpU4burIHRo4buRbmcga8OqIG3DtCB04bqjIOG7nyBuaOG7r25nIHBow6JuIHTDrWNoIHRyxrDhu5tjIMSRw7MsIGPDsyB0aOG7gyBuw7NpIHLhurFuZyBuaOG7r25nIHnhur91IHThu5EgdMOhYyDEkeG7mW5nIMSR4bq/biDEkWnhu4F1IGtp4buHbiB0aGFtIGdpYSBxdeG7uSA0MDEoaykgY+G7p2EgbeG7mXQgbmfGsOG7nWkgbGFvIMSR4buZbmcgTeG7uSBsw6AgVGh1IG5o4bqtcCwgVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLCBUw6xuaCB0cuG6oW5nIHRoYW0gZ2lhIFF14bu5IGjGsHUgdHLDrSB0csaw4bubYyDEkcOzIHbDoCBUw6BpIHPhuqNuIHTDrWNoIGzFqXkgY+G7p2EgbmfGsOG7nWkgxJHDsy4gVuG7m2kgbmjDs20gbmfGsOG7nWkgxJHhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kgaMawdSB0csOtIDQwMShrKSwgY8OhYyB54bq/dSB04buRIHTDoWMgxJHhu5luZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIHRoYW0gZ2lhIHF14bu5IGPhu6dhIGjhu40gbMOgIFRodSBuaOG6rXAsIFTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiwgVMOgaSBz4bqjbiB0w61jaCBsxal5IHbDoCBUw6xuaCB0cuG6oW5nIHRoYW0gZ2lhIFF14bu5IGjGsHUgdHLDrSB0csaw4bubYyDEkcOzLiBUcm9uZyBt4buZdCBz4buRIG5naGnDqm4gY+G7qXUgdsOgIGto4bqjbyBzw6F0IG7DoHksIG5nxrDhu51pIMSRw6MgdGhhbSBnaWEgbeG7mXQgcXXhu7kgaMawdSB0csOtIGPDsyB4dSBoxrDhu5tuZyB0aGFtIGdpYSB0aMOqbSBxdeG7uSA0MDEoaykgY8OzIHRo4buDIGRvIGzhu6NpIMOtY2ggY+G7p2Egdmnhu4djIMSRYSBk4bqhbmcgaMOzYSBkYW5oIG3hu6VjIHRp4bq/dCBraeG7h20sIMSR4bqndSB0xrAgdsOgIGto4bqjIG7Eg25nIHTDoGkgY2jDrW5oLiAgDQoNCiMgNCBQSMOCTiBUw41DSCBI4buSSSBRVVkNClRyb25nIHBo4bqnbiAzLCBjaMO6bmcgdGEgYmnhur90IMSRxrDhu6NjIG5o4buvbmcgYmnhur9uIGPDsyB0w6FjIMSR4buZbmcgxJHhur9uIMSRaeG7gXUga2nhu4duIHRoYW0gZ2lhIHF14bu5IHbDoCBxdXnhur90IMSR4buLbmggdGhhbSBnaWEgcXXhu7kgNDAxKGspIGPhu6dhIG5nxrDhu51pIGxhbyDEkeG7mW5nIE3hu7kuIFRyb25nIHBo4bqnbiA0LCBt4bulYyB0acOqdSBj4bunYSB0aeG7g3UgbHXhuq1uIGzDoCB0w6xtIGJp4bq/biBnaeG6o2kgdGjDrWNoIHbDoCBz4butIGThu6VuZyBtw7QgaMOsbmggaOG7k2kgcXV5IHBow7kgaOG7o3AgxJHhu4Mga+G6v3QgbHXhuq1uIMSR4buLbmggbMaw4bujbmcgbGnhu4d1IG7hur91IG3hu5l0IG5nxrDhu51pIGPDsyB0aHUgbmjhuq1wIHRoYXkgxJHhu5UgdGjDrCB4w6FjIHN14bqldCBhbmggdGEgxJHhu6cgxJFp4buBdSBraeG7h24gdGhhbSBnaWEgcXXhu7kgaGF5IHRoYW0gZ2lhIHF14bu5IGjGsHUgdHLDrSA0MDEoaykgc+G6vSB0aGF5IMSR4buVaSBuaMawIHRo4bq/IG7DoG8uICANCg0KIyA0LjEgTcO0IGjDrG5oIGxvZ2l0DQojIyA0LjEuMSBQaMOibiB0w61jaCBlNDAxaw0KYGBge3J9DQpkZCA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9rNDAxa3N1YnMxLnhsc3giLCBzaGVldCA9ICJrNDAxa3N1YnMiKQ0KZml0dGVkIDwtIGdsbShmYWN0b3IoZTQwMWspIH4gaW5jICsgZmFjdG9yKG1hcnIpICsgbmV0dGZhICsgZmFjdG9yKHBpcmEpICwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpLCBkYXRhID0gZGQpDQoNCnN1bW1hcnkoZml0dGVkKQ0KDQojIEThu7EgYsOhbyB4w6FjIHN14bqldCB0csOqbiBjw7luZyBk4buvIGxp4buHdQ0KcHJlZGljdGVkX3Byb2JhYmlsaXRpZXMgPC0gcHJlZGljdChmaXR0ZWQsIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQojIFRow6ptIGThu7EgYsOhbyB2w6BvIGRhdGFzZXQgZ+G7kWMNCmRkJHByZWRpY3RlZF9wcm9iYWJpbGl0aWVzIDwtIHByZWRpY3RlZF9wcm9iYWJpbGl0aWVzDQoNCiMgWGVtIGRhdGFzZXQgduG7m2kgZOG7sSBiw6FvDQpoZWFkKGRkKQ0KDQpgYGAgICAgDQoNCkvhur90IHF14bqjIHThu6sgbcO0IGjDrG5oIGxvZ2l0IG5oxrAgc2F1OiAgIA0KbG9nKG9kZHMpPSAtMS4zNDQyICsgMC4wMjI2aW5jICsgMC4wMDI2bmV0dGZhICsgMC4wMTg3cGlyYSAtIDAuMDc0bWFyciAgIA0KICANCiMjIDQuMS4yIFBow6JuIHTDrWNoIHA0MDFrDQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpkdCA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9uZS54bHN4Iiwgc2hlZXQgPSAiU2hlZXQxIikNCmZpdHRlZCA8LSBnbG0oZmFjdG9yKHA0MDFrKSB+IGluYyArIG5ldHRmYSAgKyBmYWN0b3IocGlyYSkgKyBmYWN0b3IobWFyciksIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAnbG9naXQnKSwgZGF0YSA9IGR0KQ0KDQpzdW1tYXJ5KGZpdHRlZCkNCg0KIyBE4buxIGLDoW8geMOhYyBzdeG6pXQgdHLDqm4gY8O5bmcgZOG7ryBsaeG7h3UNCnByZWRpY3RlZF9wcm9iYWJpbGl0aWVzIDwtIHByZWRpY3QoZml0dGVkLCB0eXBlID0gInJlc3BvbnNlIikNCg0KIyBUaMOqbSBk4buxIGLDoW8gdsOgbyBkYXRhc2V0IGfhu5FjDQpkdCRwcmVkaWN0ZWRfcHJvYmFiaWxpdGllcyA8LSBwcmVkaWN0ZWRfcHJvYmFiaWxpdGllcw0KDQojIFhlbSBkYXRhc2V0IHbhu5tpIGThu7EgYsOhbw0KaGVhZChkdCkNCg0KYGBgICANCkvhur90IHF14bqjIHThu6sgbcO0IGjDrG5oIGxvZ2l0IG5oxrAgc2F1OiAgIA0KbG9nKG9kZHMpID0gMC4yODcxICsgMC4wMDUwaW5jICsgMC4wMTI5bmV0dGZhICsgMC4xNzcycGlyYSArIDAuMDg0OG1hcnIgICAgDQogIA0KIyA0LjIgTcO0IGjDrG5oIHByb2JpdA0KIyMgNC4yLjEgUGjDom4gdMOtY2ggZTQwMWsNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpkZCA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9rNDAxa3N1YnMxLnhsc3giLCBzaGVldCA9ICJrNDAxa3N1YnMiKQ0KZml0dGVkX3Byb2JpdCA8LSBnbG0oZmFjdG9yKGU0MDFrKSB+IGluYyArIGZhY3RvcihtYXJyKSArIG5ldHRmYSArIGZhY3RvcihwaXJhKSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdwcm9iaXQnKSwgZGF0YSA9IGRkKQ0KDQpzdW1tYXJ5KGZpdHRlZCkNCg0KIyBE4buxIGLDoW8geMOhYyBzdeG6pXQgdHLDqm4gY8O5bmcgZOG7ryBsaeG7h3UNCnByZWRpY3RlZF9wcm9iYWJpbGl0aWVzX3Byb2JpdCA8LSBwcmVkaWN0KGZpdHRlZF9wcm9iaXQsIHR5cGUgPSAicmVzcG9uc2UiKQ0KDQojIFRow6ptIGThu7EgYsOhbyB2w6BvIGRhdGFzZXQgZ+G7kWMNCmRkJHByZWRpY3RlZF9wcm9iYWJpbGl0aWVzX3Byb2JpdCA8LSBwcmVkaWN0ZWRfcHJvYmFiaWxpdGllc19wcm9iaXQNCg0KIyBYZW0gZGF0YXNldCB24bubaSBk4buxIGLDoW8NCmhlYWQoZGQpDQoNCmBgYCANCg0KcHJvYml0KM+AKHgpKT0gMC4yODcxICsgMC4wMDUwaW5jICsgMC4wMTI5bmV0dGZhICsgMC4xNzcycGlyYSArIDAuMDYwOW1hcnINCg0KIyMgNC4yLjIgUGjDom4gdMOtY2ggcDQwMWsNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpkdCA8LSByZWFkX2V4Y2VsKCJDOi91c2Vycy91c2VyL0Rvd25sb2Fkcy9uZS54bHN4Iiwgc2hlZXQgPSAiU2hlZXQxIikNCmZpdHRlZF9wcm9iaXQgPC0gZ2xtKGZhY3RvcihwNDAxaykgfiBpbmMgKyBuZXR0ZmEgKyBmYWN0b3IocGlyYSkgKyBmYWN0b3IobWFyciksIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAncHJvYml0JyksIGRhdGEgPSBkdCkNCg0Kc3VtbWFyeShmaXR0ZWRfcHJvYml0KQ0KDQojIEThu7EgYsOhbyB4w6FjIHN14bqldCB0csOqbiBjw7luZyBk4buvIGxp4buHdQ0KcHJlZGljdGVkX3Byb2JhYmlsaXRpZXNfcHJvYml0IDwtIHByZWRpY3QoZml0dGVkX3Byb2JpdCwgdHlwZSA9ICJyZXNwb25zZSIpDQoNCiMgVGjDqm0gZOG7sSBiw6FvIHbDoG8gZGF0YXNldCBn4buRYw0KZHQkcHJlZGljdGVkX3Byb2JhYmlsaXRpZXNfcHJvYml0IDwtIHByZWRpY3RlZF9wcm9iYWJpbGl0aWVzX3Byb2JpdA0KDQojIFhlbSBkYXRhc2V0IHbhu5tpIGThu7EgYsOhbw0KaGVhZChkdCkNCg0KYGBgICANCnByb2JpdCjPgCh4KSk9IDAuMTg5OCArIDAuMDA0MGluYyArIDAuMDAzMm5ldHRmYSArIDAuMjE1MnBpcmEgKyAwLjAzMTVtYXJyDQogIA==