1 Mục đích nghiên cứu

Bài tiểu luận được xây dựng trên mục đích để tìm hiểu những yếu tố ảnh hưởng đến sự tham gia quỹ hưu trí 401(k) của người lao động Mỹ. Dữ liệu được thu thập từ hơn 9000 cư dân, họ có thu nhập, tình trạng hôn nhân. giới tính, độ tuổi,… đa dạng. Mô hình hồi quy tuyến tính tổng quát được áp dụng để đánh giá định lượng tác động của của biến giải thích lên với biến phụ thuộc định tính p401k (biến thể hiện tham gia quỹ hay không).

2 Mô tả số liệu

Số liệu được thu thập trên 9200 người lao động Mỹ có nghề nghiệp trong các lĩnh vực bất kỳ đến từ các tiểu bang khác nhau. Những thông tin được thu thập gồm:
+ Thu nhập (inc): Số tiền thu nhập trung bình theo giờ.
+ Tình trạng hôn nhân (marr): Đã kết hôn hoặc Chưa kết hôn + Giới tính (male): Gồm hai giới tính Nam, hoặc Nữ.
+ Độ tuổi (age): Số năm tuổi.
+ Số thành viên trong gia đình (fsize).
+ Tài sản tích lũy, tiết kiệm cho đến thời điểm khảo sát (nettffa).
+ Quỹ hưu trí đã tham gia trước đó (pira): Nếu người được khảo sát đã tham gia ít nhất một quỹ hưu trí tại thời điểm khảo sát sẽ được ghi nhận là “Đã tham gia”. “Chưa tham gia” là kết quả được ghi nhận cho những cư dân tại thời điểm khảo sát không tham gia bất kỳ quỹ hưu trí nào.
+ Điều kiện tham gia quỹ hưu trí 401(k) (e401k): Đây là điều kiện tham gia được dựa trên thông tin nhân khẩu được ban hành bởi Cục Quản lý An sinh Xã hội Hoa Kỳ (SSA). Những thông tin cơ bản của người lao động được xét đến là độ tuổi, thời gian làm việc, tiền thuế đã nộp, thơi gian và khoản tiền đã đóng góp cho quỹ. Biến này được ghi nhận ‘Đủ’ hoặc “Không Đủ” cho mỗi quan sát
+ Thực trạng tham gia quỹ của người lao động (p401k): Tham gia hoặc Không Tham Gia

library(DT)
## Warning: package 'DT' was built under R version 4.4.1
library(readxl)
## Warning: package 'readxl' was built under R version 4.4.1
d <- read_excel("C:/users/user/Downloads/k401ksubs.xlsx", sheet = "k401ksubs")
datatable(d)

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.

4 PHÂN TÍCH HỒI QUY

Trong phần 3, chúng ta biết được những biến có tác động đến điều kiện tham gia quỹ và quyết định tham gia quỹ 401(k) của người lao động Mỹ. Trong phần 4, mục tiêu của tiểu luận là tìm biến giải thích và sử dụng mô hình hồi quy phù hợp để kết luận định lượng liệu nếu một người có thu nhập thay đổ thì xác suất anh ta đủ điều kiện tham gia quỹ hay tham gia quỹ hưu trí 401(k) sẽ thay đổi như thế nào.

4.1 Mô hình logit

4.1.1 Phân tích e401k

dd <- read_excel("C:/users/user/Downloads/k401ksubs1.xlsx", sheet = "k401ksubs")
fitted <- glm(factor(e401k) ~ inc + factor(marr) + nettfa + factor(pira) , family = binomial(link = 'logit'), data = dd)

summary(fitted)
## 
## Call:
## glm(formula = factor(e401k) ~ inc + factor(marr) + nettfa + factor(pira), 
##     family = binomial(link = "logit"), data = dd)
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   -1.3442195  0.0484071 -27.769  < 2e-16 ***
## inc            0.0226405  0.0011778  19.223  < 2e-16 ***
## factor(marr)1 -0.0745137  0.0495459  -1.504    0.133    
## nettfa         0.0026283  0.0005563   4.724 2.31e-06 ***
## factor(pira)1  0.0187567  0.0567628   0.330    0.741    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 12423  on 9274  degrees of freedom
## Residual deviance: 11709  on 9270  degrees of freedom
## AIC: 11719
## 
## Number of Fisher Scoring iterations: 4
# Dự báo xác suất trên cùng dữ liệu
predicted_probabilities <- predict(fitted, type = "response")

# Thêm dự báo vào dataset gốc
dd$predicted_probabilities <- predicted_probabilities

# Xem dataset với dự báo
head(dd)

Kết quả từ mô hình logit như sau:
log(odds)= -1.3442 + 0.0226inc + 0.0026nettfa + 0.0187pira - 0.074marr

4.1.2 Phân tích p401k

library(readxl)
dt <- read_excel("C:/users/user/Downloads/ne.xlsx", sheet = "Sheet1")
fitted <- glm(factor(p401k) ~ inc + nettfa  + factor(pira) + factor(marr), family = binomial(link = 'logit'), data = dt)

summary(fitted)
## 
## Call:
## glm(formula = factor(p401k) ~ inc + nettfa + factor(pira) + factor(marr), 
##     family = binomial(link = "logit"), data = dt)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   0.287120   0.085902   3.342 0.000831 ***
## inc           0.004993   0.002000   2.496 0.012561 *  
## nettfa        0.012897   0.001505   8.567  < 2e-16 ***
## factor(pira)1 0.177222   0.096814   1.831 0.067168 .  
## factor(marr)1 0.060959   0.084845   0.718 0.472465    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4415.8  on 3636  degrees of freedom
## Residual deviance: 4184.9  on 3632  degrees of freedom
## AIC: 4194.9
## 
## Number of Fisher Scoring iterations: 5
# Dự báo xác suất trên cùng dữ liệu
predicted_probabilities <- predict(fitted, type = "response")

# Thêm dự báo vào dataset gốc
dt$predicted_probabilities <- predicted_probabilities

# Xem dataset với dự báo
head(dt)

Kết quả từ mô hình logit như sau:
log(odds) = 0.2871 + 0.0050inc + 0.0129nettfa + 0.1772pira + 0.0848marr

4.2 Mô hình probit

4.2.1 Phân tích e401k

library(readxl)
dd <- read_excel("C:/users/user/Downloads/k401ksubs1.xlsx", sheet = "k401ksubs")
fitted_probit <- glm(factor(e401k) ~ inc + factor(marr) + nettfa + factor(pira), family = binomial(link = 'probit'), data = dd)

summary(fitted)
## 
## Call:
## glm(formula = factor(p401k) ~ inc + nettfa + factor(pira) + factor(marr), 
##     family = binomial(link = "logit"), data = dt)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   0.287120   0.085902   3.342 0.000831 ***
## inc           0.004993   0.002000   2.496 0.012561 *  
## nettfa        0.012897   0.001505   8.567  < 2e-16 ***
## factor(pira)1 0.177222   0.096814   1.831 0.067168 .  
## factor(marr)1 0.060959   0.084845   0.718 0.472465    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4415.8  on 3636  degrees of freedom
## Residual deviance: 4184.9  on 3632  degrees of freedom
## AIC: 4194.9
## 
## Number of Fisher Scoring iterations: 5
# Dự báo xác suất trên cùng dữ liệu
predicted_probabilities_probit <- predict(fitted_probit, type = "response")

# Thêm dự báo vào dataset gốc
dd$predicted_probabilities_probit <- predicted_probabilities_probit

# Xem dataset với dự báo
head(dd)

probit(π(x))= 0.2871 + 0.0050inc + 0.0129nettfa + 0.1772pira + 0.0609marr

4.2.2 Phân tích p401k

library(readxl)
dt <- read_excel("C:/users/user/Downloads/ne.xlsx", sheet = "Sheet1")
fitted_probit <- glm(factor(p401k) ~ inc + nettfa + factor(pira) + factor(marr), family = binomial(link = 'probit'), data = dt)
## Warning: glm.fit: algorithm did not converge
summary(fitted_probit)
## 
## Call:
## glm(formula = factor(p401k) ~ inc + nettfa + factor(pira) + factor(marr), 
##     family = binomial(link = "probit"), data = dt)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)   0.1898101  0.0510420   3.719 0.000200 ***
## inc           0.0040792  0.0011455   3.561 0.000369 ***
## nettfa        0.0032060  0.0006385   5.021 5.14e-07 ***
## factor(pira)1 0.2152550  0.0558949   3.851 0.000118 ***
## factor(marr)1 0.0315086  0.0509390   0.619 0.536210    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 4415.8  on 3636  degrees of freedom
## Residual deviance: 4237.2  on 3632  degrees of freedom
## AIC: 4247.2
## 
## Number of Fisher Scoring iterations: 25
# Dự báo xác suất trên cùng dữ liệu
predicted_probabilities_probit <- predict(fitted_probit, type = "response")

# Thêm dự báo vào dataset gốc
dt$predicted_probabilities_probit <- predicted_probabilities_probit

# Xem dataset với dự báo
head(dt)

probit(π(x))= 0.1898 + 0.0040inc + 0.0032nettfa + 0.2152pira + 0.0315marr

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==