Đọc và làm quen dữ
liệu
Bộ dữ liệu này so sánh sinh viên chuyên ngành thống kê từ các trường
đại học công lập ở Ankara, Thổ Nhĩ Kỳ — bao gồm Đại học Hacettepe, Đại
học Ankara, Đại học Gazi và Đại học Kỹ thuật Trung Đông (METU).
Mục tiêu là hiểu được cảm nhận của những sinh viên này về tác động
ngày càng tăng của Trí tuệ nhân tạo (AI) và tự động hóa đối với triển
vọng nghề nghiệp tương lai của họ. Nó cũng nêu bật sự khác biệt giữa các
trường đại học, cho thấy quan điểm và mức độ quan tâm của sinh viên thay
đổi như thế nào tùy thuộc vào nơi họ học.
Bên trong có gì?
Sinh viên từ các trường đại học khác nhau nghĩ AI sẽ ảnh hưởng
đến sự nghiệp của họ như thế nào
Sự khác biệt về mức độ lo lắng và căng thẳng giữa các trường đại
học
Phân tích GPA và năm học của từng trường
Kinh nghiệm thực tập ảnh hưởng đến quan điểm về AI như thế
nào
Đọc file
d <-read.csv(file.choose(), header=T)
Hiển thị cấu trúc của
dữ liệu
str(d)
## 'data.frame': 188 obs. of 19 variables:
## $ Gender : chr "Female" "Male" "Female" "Female" ...
## $ University : chr "Hacettepe University" "Hacettepe University" "Hacettepe University" "Hacettepe University" ...
## $ Year.of.Study : chr "4" "4" "4" "4" ...
## $ GPA : chr "2.01 - 2.50" "2.01 - 2.50" "2.51 - 3.00" "3.01 - 3.50" ...
## $ Internship.Experience : chr "Yes" "Yes" "Yes" "Yes" ...
## $ AI.and.Automation.Knowledge.Level : chr "High knowledge" "Moderate knowledge" "Little knowledge" "Little knowledge" ...
## $ Impact.of.AI.on.Career.Plans : chr "Yes" "Yes" "Yes" "Yes" ...
## $ Impact.of.AI.on.Job.Opportunities : chr "Positive impact" "Positive impact" "No impact" "Positive impact" ...
## $ Concern.Level : chr "Not concerned" "Moderately concerned" "Not concerned" "Moderately concerned" ...
## $ Anxiety.Level : chr "No anxiety" "No anxiety" "No anxiety" "Slight anxiety" ...
## $ If.I.Studied.Engineering..I.Would.Feel.More.Resilient.to.AI.Impacts: chr "Disagree" "Partially agree" "Disagree" "Agree" ...
## $ Math.Courses.Help.Understand.AI : chr "Partially agree" "Agree" "Partially agree" "Partially agree" ...
## $ Statistics.Curriculum.Helps.Adapt : chr "Partially agree" "Disagree" "Agree" "Partially agree" ...
## $ Satisfaction.with.Studying.Statistics : chr "Moderate satisfaction" "Highly satisfied" "Highly satisfied" "Slightly satisfied" ...
## $ Education.Prepares.for.AI.Field : chr "Partially agree" "Agree" "Disagree" "Disagree" ...
## $ Future.Focus.on.AI.and.Automation : chr "Yes" "Yes" "No" "Yes" ...
## $ Research.Opportunities.at.University : chr "Yes" "Yes" "No" "No" ...
## $ AI.Influence.on.Choosing.Statistics : chr "No influence" "No influence" "No influence" "No influence" ...
## $ Difficulties.in.Internship.Interviews : chr "Partially" "Yes" "No" "Partially" ...
Tệp này chứa các phản hồi khảo sát từ sinh viên thống kê bậc đại
học tại các trường đại học công lập của Ankara. Mỗi hàng đại diện cho
một sinh viên, ghi lại thông tin nhân khẩu học, trình độ hiểu biết về
AI, triển vọng nghề nghiệp và lo lắng về tự động hóa.
Bộ dữ liệu bao gồm 188 quan sát và 19 biến, trong đó có 17 biến
là biến định tính
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
variable_explain <- data.frame(
Ten_Bien = c(
"Gender", "University", "Year of Study", "GPA", "Internship Experience",
"AI and Automation Knowledge Level", "Impact of AI on Career Plans",
"Impact of AI on Job Opportunities", "Concern Level", "Anxiety Level",
"If I Studied Engineering, I Would Feel More Resilient to AI Impacts",
"Math Courses Help Understand AI", "Statistics Curriculum Helps Adapt",
"Satisfaction with Studying Statistics", "Education Prepares for AI Field",
"Future Focus on AI and Automation", "Research Opportunities at University",
"AI Influence on Choosing Statistics", "Difficulties in Internship Interviews"
),
Y_Nghia = c(
"Giới tính của sinh viên",
"Trường đại học mà sinh viên theo học",
"Năm học hiện tại của sinh viên (1 đến 4+)",
"Khoảng điểm trung bình học kỳ (GPA)",
"Sinh viên đã có kinh nghiệm thực tập hay chưa",
"Mức độ hiểu biết của sinh viên về AI và tự động hóa",
"AI có ảnh hưởng đến kế hoạch nghề nghiệp không",
"Ảnh hưởng của AI tới cơ hội việc làm tương lai",
"Mức độ lo ngại về tác động của AI",
"Mức độ lo âu khi nghĩ đến AI",
"Cảm nhận nếu học ngành kỹ thuật thì sẽ ứng phó tốt hơn với AI",
"Toán học có giúp hiểu AI không",
"Chương trình thống kê giúp thích nghi với AI như thế nào",
"Mức độ hài lòng khi học ngành thống kê",
"Giáo dục hiện tại có chuẩn bị cho lĩnh vực AI không",
"Sinh viên có định hướng tương lai vào AI hay không",
"Trường có tạo điều kiện nghiên cứu về AI không",
"AI có ảnh hưởng đến quyết định chọn học ngành thống kê không",
"Sinh viên có gặp khó khăn khi phỏng vấn thực tập không"
)
)
kable(variable_explain, caption = "Giải thích các biến trong bộ dữ liệu")
Giải thích các biến trong bộ dữ liệu
Gender |
Giới tính của sinh viên |
University |
Trường đại học mà sinh viên theo học |
Year of Study |
Năm học hiện tại của sinh viên (1 đến 4+) |
GPA |
Khoảng điểm trung bình học kỳ (GPA) |
Internship Experience |
Sinh viên đã có kinh nghiệm thực tập hay chưa |
AI and Automation Knowledge Level |
Mức độ hiểu biết của sinh viên về AI và tự động
hóa |
Impact of AI on Career Plans |
AI có ảnh hưởng đến kế hoạch nghề nghiệp không |
Impact of AI on Job Opportunities |
Ảnh hưởng của AI tới cơ hội việc làm tương lai |
Concern Level |
Mức độ lo ngại về tác động của AI |
Anxiety Level |
Mức độ lo âu khi nghĩ đến AI |
If I Studied Engineering, I Would Feel More Resilient
to AI Impacts |
Cảm nhận nếu học ngành kỹ thuật thì sẽ ứng phó tốt hơn
với AI |
Math Courses Help Understand AI |
Toán học có giúp hiểu AI không |
Statistics Curriculum Helps Adapt |
Chương trình thống kê giúp thích nghi với AI như thế
nào |
Satisfaction with Studying Statistics |
Mức độ hài lòng khi học ngành thống kê |
Education Prepares for AI Field |
Giáo dục hiện tại có chuẩn bị cho lĩnh vực AI
không |
Future Focus on AI and Automation |
Sinh viên có định hướng tương lai vào AI hay không |
Research Opportunities at University |
Trường có tạo điều kiện nghiên cứu về AI không |
AI Influence on Choosing Statistics |
AI có ảnh hưởng đến quyết định chọn học ngành thống kê
không |
Difficulties in Internship Interviews |
Sinh viên có gặp khó khăn khi phỏng vấn thực tập
không |
Kiểm tra giá trị
thiếu
sum(is.na(d))
## [1] 0
sum(is.na(d))
: Kiểm tra tổng số giá trị NA trong toàn
bộ bảng.
=> Kết quả: Trong bộ dữ liệu không có giá trị thiếu (NA).
Phân tích Mô tả Một số
biến định tính
Biến
Gender
Giải thích
biến
# Tạo bảng giải thích các mức của biến gender
gender_levels <- data.frame(
Gia_tri = c("Male", "Female"),
Y_nghia = c("Nam", "Nữ")
)
# Hiển thị bảng
knitr::kable(gender_levels, caption = "Giải thích các mức độ trong biến gender")
Giải thích các mức độ trong biến gender
Male |
Nam |
Female |
Nữ |
Thống kê tần
suất
# Tạo bảng tần suất cho Gender
ts_gender <- table(d$Gender)
# Tạo bảng dữ liệu
ts_gender_df <- data.frame(
Gia_tri = names(ts_gender),
Tan_so = as.vector(ts_gender),
Ty_le = round((as.vector(ts_gender) / sum(ts_gender)) * 100, 2)
)
# Hiển thị kết quả
ts_gender_df
## Gia_tri Tan_so Ty_le
## 1 Female 109 57.98
## 2 Male 79 42.02
Tỷ lệ nữ (Female) chiếm gần 58% tổng số sinh viên tham gia khảo
sát, cao hơn đáng kể so với nam (Male) là 42%.
Điều này cho thấy nữ giới chiếm đa số trong mẫu khảo sát
này.
Việc có tỷ lệ nữ cao hơn có thể ảnh hưởng đến kết quả phân tích
nếu các đặc điểm thái độ hoặc nhận thức về AI khác biệt giữa nam và
nữ.
Trực quan hóa
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
# Vẽ biểu đồ cột cho biến Gender
ggplot(ts_gender_df, aes(x = reorder(Gia_tri, -Tan_so), y = Tan_so, fill = Gia_tri)) +
geom_col(color = "white", width = 0.7) +
geom_text(aes(label = Tan_so),
vjust = -0.5, size = 4, fontface = "bold", color = "black") +
labs(
title = "Biểu đồ cột: Phân bố giới tính (Gender)",
x = "Giới tính",
y = "Tần số"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 0, vjust = 0.5)
)

Biến
Intership
Giải thích
biến
# Giải thích các mức của biến Internship Experience
internship_levels <- data.frame(
Gia_tri = c("Yes", "No"),
Y_nghia = c("Đã có kinh nghiệm thực tập", "Chưa có kinh nghiệm thực tập")
)
knitr::kable(internship_levels, caption = "Giải thích các mức trong biến Internship Experience")
Giải thích các mức trong biến Internship Experience
Yes |
Đã có kinh nghiệm thực tập |
No |
Chưa có kinh nghiệm thực tập |
Thống kê Tần
suất
# Tạo bảng tần suất cho Internship Experience
ts_intern <- table(d$Internship.Experience)
# Tạo bảng dữ liệu
ts_intern_df <- data.frame(
Gia_tri = names(ts_intern),
Tan_so = as.vector(ts_intern),
Ty_le = round((as.vector(ts_intern) / sum(ts_intern)) * 100, 2)
)
# Hiển thị kết quả
ts_intern_df
## Gia_tri Tan_so Ty_le
## 1 No 120 63.83
## 2 Yes 68 36.17
63.83% sinh viên chưa có kinh nghiệm thực tập, chiếm tỷ lệ đa số
trong mẫu khảo sát.
Chỉ có 36.17% sinh viên đã từng tham gia thực tập.
Điều này cho thấy rằng cơ hội thực tập còn hạn chế hoặc sinh viên
chưa chủ động tìm kiếm cơ hội thực tập.
Đây có thể là một yếu tố quan trọng ảnh hưởng đến sự tự tin nghề
nghiệp hoặc mức độ chuẩn bị trước tác động của AI.
Trực quan hóa
library(ggplot2)
ggplot(ts_intern_df, aes(x = reorder(Gia_tri, -Tan_so), y = Tan_so, fill = Gia_tri)) +
geom_col(width = 0.5, color = "white") +
geom_text(aes(label = Tan_so), vjust = -0.3, size = 4, fontface = "bold") +
labs(
title = "Biểu đồ cột: Kinh nghiệm thực tập (Internship Experience)",
x = "Kinh nghiệm thực tập",
y = "Tần số"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 0, hjust = 0.5)
)

Biến Concern
Level
Giải thích
biến
# Giải thích các mức của biến Concern Level
concern_levels <- data.frame(
Gia_tri = c("Not concerned", "Slightly concerned", "Moderately concerned", "Highly concerned"),
Y_nghia = c(
"Không lo ngại",
"Hơi lo ngại",
"Lo ngại vừa phải",
"Rất lo ngại"
)
)
knitr::kable(concern_levels, caption = "Giải thích các mức trong biến Concern Level")
Giải thích các mức trong biến Concern Level
Not concerned |
Không lo ngại |
Slightly concerned |
Hơi lo ngại |
Moderately concerned |
Lo ngại vừa phải |
Highly concerned |
Rất lo ngại |
Thống kê Tần
suất
# Tạo bảng tần suất cho Concern Level
ts_concern <- table(d$Concern.Level)
# Tạo bảng dữ liệu
ts_concern_df <- data.frame(
Gia_tri = names(ts_concern),
Tan_so = as.vector(ts_concern),
Ty_le = round((as.vector(ts_concern) / sum(ts_concern)) * 100, 2)
)
# Hiển thị kết quả
ts_concern_df
## Gia_tri Tan_so Ty_le
## 1 Highly concerned 4 2.13
## 2 Moderately concerned 29 15.43
## 3 Not concerned 70 37.23
## 4 Slightly concerned 85 45.21
Phần lớn sinh viên (45.21%) chỉ hơi lo ngại (slightly concerned)
về tác động của AI.
37.23% không lo ngại, cho thấy gần 82.44% sinh viên (tổng của hai
mức trên) có mức lo ngại thấp hoặc không có.
Chỉ 2.13% sinh viên thực sự lo ngại ở mức cao (highly
concerned).
Điều này cho thấy rằng AI hiện tại chưa phải là mối quan tâm cấp
bách với đa số sinh viên trong mẫu khảo sát.
Tuy nhiên, tỷ lệ 15.43% “moderately concerned” cũng đáng chú ý,
vì nó phản ánh nhóm bắt đầu nhận thức rõ hơn về tác động tiềm tàng của
AI
Trực quan hóa
library(ggplot2)
ggplot(ts_concern_df, aes(x = reorder(Gia_tri, -Tan_so), y = Tan_so, fill = Gia_tri)) +
geom_col(width = 0.5, color = "white") +
geom_text(aes(label = Tan_so), vjust = -0.3, size = 4, fontface = "bold") +
labs(
title = "Biểu đồ cột: Mức độ lo ngại về AI (Concern Level)",
x = "Mức độ lo ngại",
y = "Tần số"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 20, hjust = 1)
)

Biến Research
Opportunities at University
Giải thích
biến
# Giải thích các mức của biến Research Opportunities at University
research_levels <- data.frame(
Gia_tri = c("Yes", "No"),
Y_nghia = c(
"Trường có tạo điều kiện cho nghiên cứu liên quan đến AI",
"Trường không tạo điều kiện hoặc không có hoạt động nghiên cứu về AI"
)
)
knitr::kable(research_levels, caption = "Giải thích các mức trong biến Research Opportunities at University")
Giải thích các mức trong biến Research Opportunities at
University
Yes |
Trường có tạo điều kiện cho nghiên cứu liên quan đến
AI |
No |
Trường không tạo điều kiện hoặc không có hoạt động
nghiên cứu về AI |
Thống kê Tần
suất
# Tạo bảng tần suất cho Research Opportunities at University
ts_research <- table(d$Research.Opportunities.at.University)
# Tạo bảng dữ liệu
ts_research_df <- data.frame(
Gia_tri = names(ts_research),
Tan_so = as.vector(ts_research),
Ty_le = round((as.vector(ts_research) / sum(ts_research)) * 100, 2)
)
# Hiển thị kết quả
ts_research_df
## Gia_tri Tan_so Ty_le
## 1 No 105 55.85
## 2 Yes 83 44.15
Có 55.85% sinh viên cho rằng trường của họ không tạo điều kiện
nghiên cứu về AI, cao hơn so với nhóm còn lại.
Chỉ 44.15% sinh viên cảm nhận được rằng trường có hỗ trợ nghiên
cứu về AI.
Điều này phản ánh rằng nhiều trường đại học trong mẫu khảo sát
chưa có hoạt động nghiên cứu AI nổi bật hoặc sinh viên chưa được tiếp
cận rõ ràng với các cơ hội đó.
Trực quan hóa
library(ggplot2)
# Vẽ biểu đồ cột cho biến Research Opportunities at University
ggplot(ts_research_df, aes(x = reorder(Gia_tri, -Tan_so), y = Tan_so, fill = Gia_tri)) +
geom_col(width = 0.5, color = "white") +
geom_text(aes(label = Tan_so), vjust = -0.3, size = 4, fontface = "bold") +
labs(
title = "Biểu đồ cột: Trường có tạo điều kiện nghiên cứu về AI",
x = "Có tạo điều kiện nghiên cứu?",
y = "Tần số"
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
axis.text.x = element_text(angle = 0, hjust = 0.5)
)

Ước lượng tỷ lệ
Xác định hạng mục
quan tâm
Ta chọn 2 hạng mục từ các biến định tính:
Hạng mục Male
Ta thực hiện khoảng ước lượng với độ tin cậy 95% cho tỷ lệ giới tính
nam (Gender=“Male”), ta thực hiện như sau:
# Ước lượng tỷ lệ nam và khoảng tin cậy 95% trong tập dữ liệu d
# Bước 1: Đếm số lượng nam giới trong dữ liệu
so_luong_nam <- sum(d$Gender == "Male", na.rm = TRUE)
# Bước 2: Xác định tổng số quan sát hợp lệ
tong_so_quan_sat <- sum(!is.na(d$Gender))
# Bước 3: Ước lượng khoảng tin cậy 95% cho tỷ lệ nam
kq_tyle_nam <- prop.test(so_luong_nam, tong_so_quan_sat, conf.level = 0.95)
# Hiển thị kết quả
print(kq_tyle_nam)
##
## 1-sample proportions test with continuity correction
##
## data: so_luong_nam out of tong_so_quan_sat, null probability 0.5
## X-squared = 4.4734, df = 1, p-value = 0.03443
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.3493998 0.4943403
## sample estimates:
## p
## 0.4202128
Kiểm định tỷ lệ một mẫu: Tỷ lệ nam giới trong dữ
liệu
Trong nghiên cứu này, chúng tôi tiến hành kiểm định tỷ lệ một mẫu để
đánh giá liệu tỷ lệ nam giới trong tổng thể có khác biệt đáng kể so với
mức giả định 50% hay không. Đây là một phân tích quan trọng nhằm kiểm
tra sự cân bằng giới tính trong tập dữ liệu khảo sát.
Ta thiết lập giả thuyết như sau:
\[
\begin{cases}
H_0: p = 0.5 & \text{(tỷ lệ nam trong tổng thể là 50\%)} \\
H_1: p \neq 0.5 & \text{(tỷ lệ nam trong tổng thể khác 50\%)}
\end{cases}
\]
Mức ý nghĩa được chọn là \(\alpha =
0.05\).
Kết quả kiểm định
Sử dụng hàm prop.test()
trong R để kiểm định tỷ lệ,
chúng tôi thu được các kết quả sau:
- Giá trị thống kê kiểm định: \(\chi^2 =
4.4734\)
- Bậc tự do: \(df = 1\)
- Giá trị p: \(p = 0.03443\)
- Ước lượng tỷ lệ mẫu: \(\hat{p} =
0.420\)
- Khoảng tin cậy 95% cho tỷ lệ nam: \([0.349, 0.494]\)
Diễn giải thống kê
Giá trị p nhỏ hơn mức ý nghĩa 5% (\(p =
0.03443 < 0.05\)), do đó chúng ta bác bỏ giả thuyết
\(H_0\). Nói cách khác,
có đủ bằng chứng thống kê để kết luận rằng tỷ lệ nam giới trong
tổng thể khác với 50% tại mức ý nghĩa 5%.
Khoảng tin cậy 95% cho tỷ lệ nam nằm trong khoảng từ 34.9%
đến 49.4%, không bao gồm giá trị 50%, điều này càng củng cố kết
luận rằng tỷ lệ nam khác với mức cân bằng giới tính.
Tỷ lệ mẫu quan sát được là 42.0%, nghĩa là trong
tổng số quan sát, chỉ có 42% là nam giới. Đây là một sự lệch đáng kể so
với tỷ lệ lý tưởng 50%.
Nhận xét và ý nghĩa thực tiễn
Kết quả cho thấy nam giới chiếm tỷ lệ thấp hơn đáng kể so với
nữ giới trong tập dữ liệu. Điều này có thể phản ánh:
- Thực tế cấu trúc giới tính trong nhóm khách hàng/đối tượng nghiên
cứu.
- Hoặc sai lệch trong thiết kế hoặc thu thập mẫu (ví dụ: khảo sát
không cân bằng, chỉ thực hiện ở địa điểm có nhiều nữ hơn).
Trong bối cảnh kinh doanh, nếu đây là dữ liệu từ khách hàng, thì điều
này hàm ý rằng nữ giới đang là nhóm khách hàng chiếm ưu
thế, và doanh nghiệp nên cân nhắc điều chỉnh chiến lược tiếp
thị, quảng bá, hoặc phát triển sản phẩm phù hợp với nhu cầu và hành vi
tiêu dùng của nhóm này.
Kết luận
Với p-value nhỏ hơn 0.05, ta có thể kết luận rằng tỷ lệ nam trong mẫu
khảo sát khác biệt có ý nghĩa thống kê so với tỷ lệ giả
định 50%. Điều này cần được xem xét khi đánh giá tính đại diện của mẫu,
hoặc đưa ra các quyết định trong nghiên cứu thị trường, xã hội học, hoặc
quản trị dữ liệu.
Hạng mục Highly
concerned
# Số người có mức độ "Highly concerned"
n_high_concern <- 4
# Tổng số quan sát hợp lệ
n_total <- 188
# Ước lượng khoảng tin cậy 95% cho tỷ lệ "Highly concerned"
prop.test(n_high_concern, n_total, conf.level = 0.95)
##
## 1-sample proportions test with continuity correction
##
## data: n_high_concern out of n_total, null probability 0.5
## X-squared = 170.43, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
## 0.006837495 0.057105814
## sample estimates:
## p
## 0.0212766
Kiểm định tỷ lệ một mẫu: Tỷ lệ mối quan tâm cao
Trong nghiên cứu này, chúng tôi thực hiện kiểm định tỷ lệ một mẫu để
đánh giá liệu tỷ lệ các trường hợp được xác định là “có mối quan tâm
cao” (high concern) có khác biệt đáng kể so với tỷ lệ giả định 50% hay
không.
Giả thuyết kiểm định
Chúng tôi thiết lập giả thuyết như sau:
\[
\begin{cases}
H_0: p = 0.5 & \text{(tỷ lệ mối quan tâm cao là 50\%)} \\
H_1: p \neq 0.5 & \text{(tỷ lệ mối quan tâm cao khác 50\%)}
\end{cases}
\]
Mức ý nghĩa được chọn là \(\alpha =
0.05\).
Kết quả kiểm định
Sử dụng hàm prop.test()
trong R để kiểm định, chúng tôi
thu được các kết quả sau:
- Giá trị thống kê kiểm định: \(\chi^2 =
170.43\)
- Bậc tự do: \(df = 1\)
- Giá trị p: \(p < 2.2 \times
10^{-16}\)
- Ước lượng tỷ lệ mẫu: \(\hat{p} =
0.02128\)
- Khoảng tin cậy 95%: \([0.00684,
0.05711]\)
Diễn giải thống kê
Giá trị p cực kỳ nhỏ và nhỏ hơn rất nhiều so với mức ý nghĩa 5%
(\(p < 0.05\)), do đó chúng ta
bác bỏ giả thuyết \(H_0\). Điều này cho thấy
tỷ lệ mối quan tâm cao khác đáng kể so với 50%.
Khoảng tin cậy 95% cho tỷ lệ mối quan tâm cao nằm trong khoảng từ
0.68% đến 5.71%, không bao gồm 50%,
càng củng cố kết luận về sự khác biệt có ý nghĩa thống kê.
Tỷ lệ quan sát được là 2.13%, cho thấy chỉ có một
phần rất nhỏ cá nhân được xác định là có mối quan tâm cao, thấp hơn đáng
kể so với tỷ lệ giả định cân bằng 50%.
Nhận xét và ý nghĩa thực tiễn
Kết quả này cho thấy rằng mối quan tâm cao là hiện tượng hiếm
trong tổng thể. Điều này có thể phản ánh:
- Tỷ lệ thực sự thấp của hiện tượng cần quan sát trong quần thể.
- Cần điều chỉnh thiết kế nghiên cứu nếu mục tiêu là khảo sát sâu vào
nhóm có mối quan tâm cao (có thể cân nhắc phương pháp lấy mẫu phân
tầng).
Kết luận
Với p-value < 0.05, chúng tôi kết luận rằng
tỷ lệ mối quan tâm cao khác biệt có ý nghĩa thống kê so
với giả định 50%. Việc hiểu rõ tỷ lệ này giúp đưa ra các quyết định phù
hợp trong thiết kế nghiên cứu, phân tích chiến lược, hoặc lập kế hoạch
can thiệp.
Phân tích Mối quan hệ
giữa Hai biến Định tính (Bivariate Analysis)
Biến phụ thuộc: Internship Experience và Concern Level
Cặp 1: Gender ×
Internship Experience
Câu hỏi: Nam và nữ có khác biệt trong tỷ lệ đã từng đi thực tập
không?
Mục tiêu: Kiểm tra sự phân bố kinh nghiệm thực tập theo giới
tính.
Bảng tần số
chéo
# Bảng tần số chéo: Giới tính và Kinh nghiệm thực tập
table_gender_intern <- table(d$Gender, d$Internship.Experience)
table_gender_intern
##
## No Yes
## Female 65 44
## Male 55 24
# Tỷ lệ theo hàng: trong từng giới tính, tỷ lệ có/không có kinh nghiệm
prop.table(table_gender_intern, margin = 1)
##
## No Yes
## Female 0.5963303 0.4036697
## Male 0.6962025 0.3037975
# Tạo biến Gender2: Male trước, Female sau
d$Gender2 <- factor(d$Gender, levels = c("Male", "Female"))
# Tạo biến Internship2: No trước, Yes sau
d$Internship2 <- factor(d$Internship.Experience, levels = c("No", "Yes"))
# Tạo bảng tần số chéo mới với thứ tự mong muốn
table_gender_intern2 <- table(d$Gender2, d$Internship2)
table_gender_intern2
##
## No Yes
## Male 55 24
## Female 65 44
# Tỷ lệ theo hàng
prop.table(table_gender_intern2, margin = 1)
##
## No Yes
## Male 0.6962025 0.3037975
## Female 0.5963303 0.4036697
Male: 30.38% có kinh nghiệm thực tập, 69.62% không có.
Female: 40.37% có kinh nghiệm thực tập, 59.63% không có.
Điều này có thể phản ánh:
Nữ sinh viên chủ động hơn trong việc tìm kiếm thực tập.
Có thể có sự khác biệt về ngành học, cơ hội tiếp cận, hoặc sự
chuẩn bị nghề nghiệp giữa hai giới.
Trực quan hóa
library(ggplot2)
# Tạo bảng dữ liệu từ bảng tần suất chéo: Gender vs Internship Experience
table_gender_intern <- table(d$Gender, d$Internship.Experience)
df_group <- as.data.frame(as.table(table_gender_intern))
colnames(df_group) <- c("Gender", "Internship", "Freq") # Đổi tên cột
# Vẽ biểu đồ cột nhóm
ggplot(df_group, aes(x = Internship, y = Freq, fill = Gender)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.8), width = 0.6) +
geom_text(aes(label = Freq),
position = position_dodge(width = 0.8),
vjust = -0.4, size = 4, color = "black", fontface = "bold") +
labs(title = "Biểu đồ cột nhóm: Giới tính vs Kinh nghiệm thực tập",
x = "Kinh nghiệm thực tập",
y = "Tần số") +
scale_fill_manual(
values = c("Female" = "#FF9999", "Male" = "#6699CC"),
name = "Giới tính",
labels = c("Nữ", "Nam")
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
legend.position = "right"
)

Kiểm định thống kê
(Kiểm định Chi-bình phương)
- Xác định xem hai biến định tính có mối liên hệ (phụ thuộc) với nhau
hay không?
Giả thuyết kiểm định:
H₀ (Giả thuyết không): Giới tính và kinh nghiệm thực
tập độc lập với nhau.
H₁ (Giả thuyết đối): Giới tính và kinh nghiệm thực
tập có liên hệ với nhau.
# Thực hiện kiểm định Chi-bình phương
chisq.test(table_gender_intern)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table_gender_intern
## X-squared = 1.5699, df = 1, p-value = 0.2102
Kết quả kiểm định Chi-bình phương:
Chi-squared = 1.81
Bậc tự do (df) = 1
Giá trị p-value = 0.1783
Kết luận thống kê:
Vì p > 0.05, không đủ bằng chứng để bác bỏ giả thuyết
H₀.
Điều này cho thấy không có mối liên hệ có ý nghĩa thống kê giữa
giới tính và việc sinh viên đã từng thực tập hay chưa.
Thảo luận thêm về bản chất mối quan hệ:
Mặc dù biểu đồ gợi ý nữ có xu hướng thực tập nhiều hơn nam, nhưng
kiểm định Chi-bình phương chỉ ra rằng mối quan hệ này không đủ mạnh để
khẳng định có sự khác biệt thực sự giữa hai giới về kinh nghiệm thực
tập. Hai biến được coi là độc lập về mặt thống kê
Hiệu tỷ lệ
So sánh tỷ lệ xuất hiện một đặc điểm nào đó giữa hai nhóm để xem sự
khác biệt đó có ý nghĩa thống kê hay không?
# Lập bảng tần số chéo giữa Gender và Internship Experience
table_gender_intern <- table(d$Gender, d$Internship.Experience)
# Thêm tổng hàng và tổng cột
table_gender_intern_margins <- addmargins(table_gender_intern)
# Hiển thị bảng
table_gender_intern_margins
##
## No Yes Sum
## Female 65 44 109
## Male 55 24 79
## Sum 120 68 188
Tỷ lệ có kinh nghiệm thực tập theo giới tính được ký hiệu như
sau:
- \(p_1 = P(\text{Internship} =
\text{"Yes"} \mid \text{Gender} =
\text{"Female"})\): Tỷ lệ nữ giới có kinh nghiệm thực
tập.
- \(p_2 = P(\text{Internship} =
\text{"Yes"} \mid \text{Gender} =
\text{"Male"})\): Tỷ lệ nam giới có kinh nghiệm thực
tập.
Giả thuyết kiểm định:
- \(H_0: p_1 - p_2 = 0\): Không có sự
khác biệt về tỷ lệ thực tập giữa nữ và nam.
- \(H_1: p_1 - p_2 > 0\): Tỷ lệ nữ
thực tập cao hơn nam.
# Số người có kinh nghiệm thực tập trong từng giới
counts_intern_yes <- c(table_gender_intern["Female", "Yes"], table_gender_intern["Male", "Yes"])
# Tổng số người theo từng giới
totals_gender <- c(sum(table_gender_intern["Female", ]), sum(table_gender_intern["Male", ]))
# Kiểm định tỉ lệ một phía: p1 > p2
test_intern <- prop.test(counts_intern_yes, totals_gender, alternative = "greater", correct = FALSE)
# Hiển thị kết quả
test_intern
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts_intern_yes out of totals_gender
## X-squared = 1.9788, df = 1, p-value = 0.07976
## alternative hypothesis: greater
## 95 percent confidence interval:
## -0.01509957 1.00000000
## sample estimates:
## prop 1 prop 2
## 0.4036697 0.3037975
Nhận xét, cách tính và ý nghĩa của hiệu tỷ lệ
Giả sử có kết quả kiểm định như sau:
- \(\hat{p}_1 = \frac{44}{109} \approx
0.4037\): Tỷ lệ nữ có kinh nghiệm thực tập
- \(\hat{p}_2 = \frac{24}{79} \approx
0.3038\): Tỷ lệ nam có kinh nghiệm thực tập
- Hiệu tỷ lệ: \(\hat{p}_1 - \hat{p}_2
\approx 0.4037 - 0.3038 = 0.0999\)
Cách tính hiệu tỷ lệ
Tỷ lệ được ước lượng theo công thức:
\[
\hat{p}_1 = \frac{x_1}{n_1}, \quad \hat{p}_2 = \frac{x_2}{n_2}
\]
Trong đó:
- \(x_1, x_2\): số người có kinh
nghiệm thực tập ở mỗi nhóm
- \(n_1, n_2\): tổng số người ở mỗi
nhóm (nữ và nam)
Hiệu tỷ lệ:
\[
\hat{p}_1 - \hat{p}_2
\]
Ý nghĩa của kết quả
Hiệu tỷ lệ \(\hat{p}_1 - \hat{p}_2
\approx 0.0999\) cho thấy tỷ lệ nữ có thực tập cao hơn
nam.
Tuy nhiên, p-value từ kiểm định hiệu tỷ lệ là \(p = 0.074 > 0.05\), nên không đủ
bằng chứng để bác bỏ giả thuyết \(H_0\).
Do đó, sự khác biệt này chưa có ý nghĩa thống kê
— tức là có thể do sai số ngẫu nhiên từ mẫu.
Kết luận
Mặc dù dữ liệu mô tả cho thấy sự khác biệt về tỷ lệ có kinh nghiệm
thực tập giữa nữ và nam, nhưng kết quả kiểm định thống kê cho thấy
chưa thể khẳng định sự khác biệt này mang tính hệ thống
trong toàn bộ quần thể.
Tỷ số nguy cơ
Câu hỏi nghiên cứu: Liệu giới tính (nam/nữ) có ảnh
hưởng đến khả năng từng có kinh nghiệm thực tập (Internship
Experience)?
→ Mục tiêu:
So sánh xác suất có kinh nghiệm thực tập giữa hai giới:
- \(RR = \frac{P(\text{Internship} =
\text{"Yes"} \mid \text{Gender} =
\text{"Female"})}{P(\text{Internship} = \text{"Yes"}
\mid \text{Gender} = \text{"Male"})}\)
install.packages("epitools", repos = "https://cloud.r-project.org")
## Installing package into 'C:/Users/Tuyet Nhi/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'epitools' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Tuyet Nhi\AppData\Local\Temp\RtmpugsKvV\downloaded_packages
library(epitools)
Tính Relative Risk
riskratio(table_gender_intern2)
## $data
##
## No Yes Total
## Male 55 24 79
## Female 65 44 109
## Total 120 68 188
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Male 1.000000 NA NA
## Female 1.328746 0.8868203 1.990895
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Male NA NA NA
## Female 0.1635642 0.1699405 0.1595125
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Tính tỷ lệ
- Nam: \[
\hat{p}_{\text{Yes | Male}} = \frac{24}{79} \approx 0.3038
\]
- Nữ: \[
\hat{p}_{\text{Yes | Female}} = \frac{44}{109} \approx 0.4037
\]
Tỷ số nguy cơ (Female vs Male):
\[
RR = \frac{\hat{p}_{\text{Yes | Female}} / \hat{p}_{\text{No |
Female}}}{\hat{p}_{\text{Yes | Male}} / \hat{p}_{\text{No | Male}}}
= \frac{\frac{44}{65}}{\frac{24}{55}} = 1.3287
\]
- Khoảng tin cậy 95%: \[
CI = \left[ 0.8868 ; 1.9909 \right]
\]
Ý nghĩa
- Nữ có kinh nghiệm thực tập trên nam có kinh nghiệm thực tập là:
1.3287 lần.
Hay nói cách khác, nữ có kinh nghiệm thực tập nhiều hơn nam 1.3287
lần.
Tỷ số Chênh (Odds
Ratio - OR)
or_result2 <- oddsratio(table_gender_intern)
print(or_result2)
## $data
##
## No Yes Total
## Female 65 44 109
## Male 55 24 79
## Total 120 68 188
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Female 1.0000000 NA NA
## Male 0.6473377 0.3462602 1.19185
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Female NA NA NA
## Male 0.1635642 0.1699405 0.1595125
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Tính odds (tỷ lệ chéo) theo từng nhóm
- Male: \[
\text{Odds}_{\text{Male}} = \frac{24}{55} \approx 0.4364
\]
- Female: \[
\text{Odds}_{\text{Female}} = \frac{44}{65} \approx 0.6769
\]
Tính Odds Ratio (OR)
\[
OR = \frac{\text{Odds}_{\text{Female}}}{\text{Odds}_{\text{Male}}} =
\frac{44/65}{24/55} \approx 0.6473
\]
Khoảng tin cậy 95%:
\[
CI = \left[ 0.3463 ; 1.1919 \right]
\]
Giả thuyết kiểm định
- \(H_0\): Odds ratio giữa nam và nữ
bằng 1 (không có mối liên hệ giữa giới tính và thực tập).
- \(H_1\): Odds ratio khác 1 (có mối
liên hệ giữa giới tính và thực tập).
Kết quả kiểm định
- Mid-p exact: \(p = 0.1636\)
- Fisher exact: \(p = 0.1699\)
- Chi-square: \(p = 0.1595\)
Kết luận thống kê
Vì các giá trị \(p > 0.05\), ta
không bác bỏ giả thuyết \(H_0\).
\[
\Rightarrow \text{Chưa có đủ bằng chứng thống kê để khẳng định giới tính
có liên hệ với khả năng từng đi thực tập.}
\]
Ý nghĩa
Nữ đã từng đi thực tập trên nữ chưa từng đi thực tập bằng khoảng
64,73% so với nam đã từng đi thực tập trên nam chưa từng đi thực
tập
Tuy nhiên, vì mức độ chênh lệch này không đủ mạnh về mặt thống kê
(p-value > 0.05), nên ta chưa thể khẳng định chắc chắn rằng giới tính
thực sự ảnh hưởng đến việc có kinh nghiệm thực tập hay không.
or_result3 <- oddsratio(table_gender_intern2)
print(or_result3)
## $data
##
## No Yes Total
## Male 55 24 79
## Female 65 44 109
## Total 120 68 188
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Male 1.000000 NA NA
## Female 1.544786 0.8390317 2.888001
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Male NA NA NA
## Female 0.1635642 0.1699405 0.1595125
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Giả thuyết kiểm định:
- \(H_0: OR = 1\): Odds có kinh
nghiệm thực tập là như nhau giữa nam và nữ.
- \(H_1: OR \neq 1\): Có sự khác biệt
về odds thực tập giữa nam và nữ.
Kết quả:
- Tỷ số chênh (OR) = 1.5448
- Khoảng tin cậy 95%: \([0.8390 ;
2.8880]\)
- Các p-value:
- Mid-p exact: \(p = 0.1636\)
- Fisher exact: \(p = 0.1699\)
- Chi-square: \(p = 0.1595\)
Kết luận:
Vì \(p > 0.05\), ta không
bác bỏ giả thuyết \(H_0\).
\[
\Rightarrow \text{Không có đủ bằng chứng thống kê để kết luận rằng giới
tính ảnh hưởng đến odds từng có kinh nghiệm thực tập.}
\]
Diễn giải:
- Tỷ số chênh OR = 1.5448 cho thấy odds có kinh nghiệm thực tập của
nữ giới cao hơn khoảng 1.54 lần so với nam giới.
- Tuy nhiên, vì khoảng tin cậy chứa 1 và các p-value đều lớn hơn 0.05,
sự khác biệt này không có ý nghĩa thống kê.
Cặp 2: Research
Opportunities at University x Internship Experience
Câu hỏi: Liệu việc trường đại học có tạo điều kiện nghiên cứu về AI
có liên quan đến khả năng sinh viên từng có kinh nghiệm thực tập hay
không?
Mục tiêu: Đánh giá mối quan hệ giữa điều kiện nghiên cứu tại trường
và kinh nghiệm thực tập của sinh viên – từ đó rút ra liệu môi trường học
thuật có tạo thuận lợi cho trải nghiệm thực tiễn hay không
# Gán nhãn rõ nghĩa hơn cho các mức
d$ResearchClear <- factor(d$Research.Opportunities.at.University,
levels = c("No", "Yes"),
labels = c("Chưa tạo dk", "Có tạo dk"))
d$InternshipClear <- factor(d$Internship.Experience,
levels = c("No", "Yes"),
labels = c("Chưa kinh nghiệm", "Có kinh nghiệm "))
# Bảng tần số chéo với nhãn rõ ràng
table_research_intern_clear <- table(d$ResearchClear, d$InternshipClear)
table_research_intern_clear
##
## Chưa kinh nghiệm Có kinh nghiệm
## Chưa tạo dk 72 33
## Có tạo dk 48 35
# Tỷ lệ theo hàng
prop.table(table_research_intern_clear, margin = 1)
##
## Chưa kinh nghiệm Có kinh nghiệm
## Chưa tạo dk 0.6857143 0.3142857
## Có tạo dk 0.5783133 0.4216867
# Tạo biến mới: InternshipClear2 với thứ tự mức đảo ngược
d$InternshipClear2 <- factor(d$Internship.Experience,
levels = c("Yes", "No"),
labels = c("Có kinh nghiệm", "Chưa kinh nghiệm"))
# Tạo bảng tần số chéo mới
table_research_intern_clear2 <- table(d$ResearchClear, d$InternshipClear2)
table_research_intern_clear2
##
## Có kinh nghiệm Chưa kinh nghiệm
## Chưa tạo dk 33 72
## Có tạo dk 35 48
# Tỷ lệ theo hàng
prop.table(table_research_intern_clear2, margin = 1)
##
## Có kinh nghiệm Chưa kinh nghiệm
## Chưa tạo dk 0.3142857 0.6857143
## Có tạo dk 0.4216867 0.5783133
Ở các trường chưa tạo điều kiện nghiên cứu, gần 69% sinh viên
chưa từng có kinh nghiệm thực tập và số sinh viên có kinh nghiệm thực
tập là 31%
Ngược lại, ở các trường có tạo điều kiện nghiên cứu, chỉ khoảng
58% chưa có kinh nghiệm, và tỷ lệ có kinh nghiệm thực tập tăng lên đến
hơn 42%.
Trực quan hóa
library(ggplot2)
# Tạo bảng dữ liệu từ bảng tần suất chéo
table_ri <- table(d$ResearchClear, d$InternshipClear2)
df_ri <- as.data.frame(as.table(table_ri))
colnames(df_ri) <- c("Research", "Internship", "Freq")
# Vẽ biểu đồ cột nhóm
ggplot(df_ri, aes(x = Internship, y = Freq, fill = Research)) +
geom_bar(stat = "identity", position = position_dodge(0.8), width = 0.6) +
geom_text(aes(label = Freq),
position = position_dodge(0.8),
vjust = -0.5, size = 4, fontface = "bold", color = "black") +
labs(title = "Biểu đồ cột nhóm: Điều kiện nghiên cứu vs Kinh nghiệm thực tập",
x = "Kinh nghiệm thực tập",
y = "Tần số") +
scale_fill_manual(
values = c("Chưa tạo dk" = "#FFA07A", "Có tạo dk" = "#20B2AA"),
name = "Trường Đại học",
labels = c("Chưa tạo điều kiện", "Có tạo điều kiện")
) +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
legend.position = "right"
)

Kiểm định thống kê
(Kiểm định Chi-bình phương)
- Xác định xem hai biến định tính có mối liên hệ (phụ thuộc) với nhau
hay không?
Giả thuyết kiểm định:
H₀ (Giả thuyết không): Điều kiện nghiên cứu tại
trường và kinh nghiệm thực tập độc lập với nhau.
H₁ (Giả thuyết đối): Hai biến có liên hệ với nhau.
# Thực hiện kiểm định Chi-bình phương
chisq.test(table_research_intern_clear2)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: table_research_intern_clear2
## X-squared = 1.8742, df = 1, p-value = 0.171
Kết quả kiểm định Chi-bình phương:
- \(\chi^2 = 1.8742\)
- \(df = 1\)
- \(p\text{-value} = 0.171\)
Kết luận thống kê:
Vì \(p > 0.05\), ta không
bác bỏ giả thuyết \(H_0\).
\[
\Rightarrow \text{Không có đủ bằng chứng thống kê để kết luận rằng điều
kiện nghiên cứu tại trường có liên hệ với khả năng sinh viên từng đi
thực tập.}
\]
Mặc dù bảng tần suất cho thấy sinh viên từ trường có môi trường
nghiên cứu thuận lợi có tỷ lệ thực tập cao hơn, nhưng kiểm định Chi-bình
phương cho thấy sự khác biệt đó không đủ mạnh về mặt thống
kê.
Điều này có thể phản ánh rằng sự khác biệt được quan sát có thể chỉ
là do sai số ngẫu nhiên của mẫu, và không thể
khẳng định chắc chắn rằng hai biến có liên hệ trong quần thể
chung.
Thảo luận thêm về bản chất mối quan hệ:
Biểu đồ và bảng tần suất cho thấy sự khác biệt tương đối giữa hai
nhóm, tuy nhiên kiểm định thống kê sẽ quyết định sự khác biệt đó có ý
nghĩa thống kê hay không.
Hiệu tỷ lệ
So sánh tỷ lệ xuất hiện một đặc điểm nào đó giữa hai nhóm để xem sự
khác biệt đó có ý nghĩa thống kê hay không?
# Số người có kinh nghiệm thực tập theo điều kiện nghiên cứu
counts_intern_research <- c(table_research_intern_clear2["Có tạo dk", "Có kinh nghiệm"],
table_research_intern_clear2["Chưa tạo dk", "Có kinh nghiệm"])
# Tổng số người theo nhóm điều kiện nghiên cứu
totals_research <- c(sum(table_research_intern_clear2["Có tạo dk", ]),
sum(table_research_intern_clear2["Chưa tạo dk", ]))
# Kiểm định tỉ lệ một phía: p1 > p2
prop.test(counts_intern_research, totals_research, alternative = "greater", correct = FALSE)
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts_intern_research out of totals_research
## X-squared = 2.3161, df = 1, p-value = 0.06402
## alternative hypothesis: greater
## 95 percent confidence interval:
## -0.008798711 1.000000000
## sample estimates:
## prop 1 prop 2
## 0.4216867 0.3142857
Kiểm định hiệu tỷ lệ: Tác động của điều kiện nghiên cứu đến
kinh nghiệm thực tập
Giả thuyết kiểm định:
- \(H_0: p_1 - p_2 = 0\): Không có sự
khác biệt về tỷ lệ có thực tập giữa hai nhóm trường.
- \(H_1: p_1 - p_2 > 0\): Tỷ lệ
sinh viên có thực tập tại trường có điều kiện nghiên cứu cao hơn nhóm
còn lại.
Kết quả kiểm định:
\(\hat{p}_1 = 0.4217\): Tỷ lệ
sinh viên có thực tập ở nhóm có tạo điều kiện nghiên
cứu
\(\hat{p}_2 = 0.3143\): Tỷ lệ
sinh viên có thực tập ở nhóm không tạo điều kiện nghiên
cứu
\(\hat{p}_1 - \hat{p}_2 =
0.1074\)
\(\chi^2 = 2.3161\), \(df = 1\), \(p\text{-value} = 0.064\)
Khoảng tin cậy 95% cho hiệu tỷ lệ: \([-0.0088; 1]\)
Kết luận
Vì \(p = 0.064 > 0.05\), ta
không bác bỏ giả thuyết \(H_0\) ở mức ý nghĩa 5%.
\[
\Rightarrow \text{Chưa đủ bằng chứng để khẳng định rằng điều kiện nghiên
cứu tại trường giúp sinh viên có nhiều kinh nghiệm thực tập hơn.}
\]
Tuy nhiên, do \(p\) tiệm cận 0.05 và
hiệu tỷ lệ là dương (10.74%), có thể xem đây là một xu hướng
tiềm năng, cần được kiểm tra thêm bằng mẫu lớn hơn.
Tỷ số nguy cơ
- Liệu điều kiện nghiên cứu tại trường có ảnh hưởng đến khả năng sinh
viên có kinh nghiệm thực tập?
library(epitools)
riskratio(table_research_intern_clear)
## $data
##
## Chưa kinh nghiệm Có kinh nghiệm Total
## Chưa tạo dk 72 33 105
## Có tạo dk 48 35 83
## Total 120 68 188
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Chưa tạo dk 1.000000 NA NA
## Có tạo dk 1.341731 0.9188943 1.959138
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Chưa tạo dk NA NA NA
## Có tạo dk 0.1327199 0.168742 0.128043
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Giả thuyết:
- \(H_0: RR = 1\): Không có sự khác
biệt về nguy cơ có kinh nghiệm thực tập giữa hai nhóm trường.
- \(H_1: RR > 1\): Sinh viên từ
trường có tạo điều kiện nghiên cứu có nguy cơ có thực tập cao hơn.
Kết quả tính toán:
- Tỷ số nguy cơ (RR) = \(\frac{35 / 83}{33 /
105} = 1.3417\)
- Khoảng tin cậy 95%: \([0.9189 ;
1.9591]\)
- Các giá trị p-value:
- Mid-p exact: \(p = 0.1322\)
- Fisher: \(p = 0.1687\)
- Chi-square: \(p = 0.1280\)
Vì tất cả giá trị \(p > 0.05\),
ta không bác bỏ giả thuyết \(H_0\).
\[
\Rightarrow \text{Không có đủ bằng chứng để kết luận rằng điều kiện
nghiên cứu tại trường làm tăng khả năng sinh viên có kinh nghiệm thực
tập.}
\]
Ý nghĩa
- RR = 1.34 nghĩa là sinh viên từ trường có tạo điều kiện nghiên cứu
có khả năng từng thực tập cao hơn 1.34 lần so với sinh
viên từ trường không tạo điều kiện.
- Tuy nhiên, vì khoảng tin cậy chứa 1 và p-value > 0.05, nên kết
luận này không có ý nghĩa thống kê.
library(epitools)
riskratio(table_research_intern_clear2)
## $data
##
## Có kinh nghiệm Chưa kinh nghiệm Total
## Chưa tạo dk 33 72 105
## Có tạo dk 35 48 83
## Total 68 120 188
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Chưa tạo dk 1.0000000 NA NA
## Có tạo dk 0.8433735 0.6736106 1.05592
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Chưa tạo dk NA NA NA
## Có tạo dk 0.1327199 0.168742 0.128043
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Giả thuyết kiểm định:
- \(H_0: RR = 1\): Nguy cơ có kinh
nghiệm thực tập là như nhau giữa hai nhóm trường.
- \(H_1: RR \neq 1\): Có sự khác biệt
về nguy cơ có thực tập giữa hai nhóm.
Kết quả:
- RR = \(\frac{35 / 83}{33 / 105} =
0.8437\)
- Khoảng tin cậy 95%: \([0.6736 ;
1.0559]\)
- Giá trị p-value:
- Mid-p exact: \(p = 0.1322\)
- Fisher exact: \(p = 0.1687\)
- Chi-square: \(p = 0.1280\)
Kết luận:
Vì \(p > 0.05\), ta không
bác bỏ giả thuyết \(H_0\).
\[
\Rightarrow \text{Không có đủ bằng chứng để khẳng định có sự khác biệt
về nguy cơ có kinh nghiệm thực tập giữa hai nhóm trường.}
\]
Diễn giải:
Tỷ số RR = 0.8437 cho thấy sinh viên từ trường có tạo
điều kiện nghiên cứu có tỷ lệ từng thực tập thấp hơn
khoảng 16% so với nhóm không có điều kiện.
Tuy nhiên, do khoảng tin cậy chứa 1 và p-value không đủ nhỏ, ta
không thể kết luận sự khác biệt này có ý nghĩa thống
kê.
Tỷ số Chênh (Odds
Ratio - OR)
oddsratio(table_research_intern_clear)
## $data
##
## Chưa kinh nghiệm Có kinh nghiệm Total
## Chưa tạo dk 72 33 105
## Có tạo dk 48 35 83
## Total 120 68 188
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Chưa tạo dk 1.000000 NA NA
## Có tạo dk 1.585999 0.8693279 2.907182
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Chưa tạo dk NA NA NA
## Có tạo dk 0.1327199 0.168742 0.128043
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Tỷ số chênh (Odds
Ratio - OR)
Giả thuyết kiểm định:
- \(H_0: OR = 1\): Không có sự khác
biệt về odds có thực tập giữa hai nhóm trường.
- \(H_1: OR \neq 1\): Có sự khác biệt
về odds có thực tập giữa hai nhóm trường.
Kết quả:
- Odds Ratio (OR) = 1.5860
- Khoảng tin cậy 95%: \([0.8693;
2.9072]\)
- Giá trị p-value:
- Mid-p exact: \(p = 0.1322\)
- Fisher exact: \(p = 0.1687\)
- Chi-square: \(p = 0.1280\)
Kết luận:
Vì tất cả giá trị \(p > 0.05\),
ta không bác bỏ giả thuyết \(H_0\).
\[
\Rightarrow \text{Chưa có đủ bằng chứng thống kê để kết luận rằng điều
kiện nghiên cứu tại trường ảnh hưởng đến odds sinh viên từng đi thực
tập.}
\]
Diễn giải:
Giá trị OR = 1.5860 cho thấy odds có kinh nghiệm thực tập ở nhóm
có tạo điều kiện nghiên cứu cao hơn khoảng 1.59
lần so với nhóm trường không tạo điều kiện.
Tuy nhiên, vì khoảng tin cậy chứa 1 và p-value > 0.05, nên
sự khác biệt này không đủ mạnh về mặt thống kê để đưa
ra kết luận chắc chắn.
oddsratio(table_research_intern_clear2)
## $data
##
## Có kinh nghiệm Chưa kinh nghiệm Total
## Chưa tạo dk 33 72 105
## Có tạo dk 35 48 83
## Total 68 120 188
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Chưa tạo dk 1.0000000 NA NA
## Có tạo dk 0.6305221 0.3439757 1.150314
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Chưa tạo dk NA NA NA
## Có tạo dk 0.1327199 0.168742 0.128043
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Tỷ số chênh (Odds Ratio - OR)
Giả thuyết kiểm định:
- \(H_0: OR = 1\): Không có sự khác
biệt về odds có kinh nghiệm thực tập giữa hai nhóm trường.
- \(H_1: OR \neq 1\): Có sự khác biệt
về odds thực tập giữa hai nhóm.
Kết quả:
- Tỷ số chênh (OR) = 0.6302
- Khoảng tin cậy 95%: \([0.3440 ;
1.1503]\)
- Các p-value:
- Mid-p exact: \(p = 0.1322\)
- Fisher exact: \(p = 0.1687\)
- Chi-square: \(p = 0.1280\)
Kết luận:
Vì \(p > 0.05\), ta không
bác bỏ giả thuyết \(H_0\).
\[
\Rightarrow \text{Không có đủ bằng chứng thống kê để kết luận rằng điều
kiện nghiên cứu tại trường làm thay đổi odds có thực tập.}
\]
Diễn giải:
- OR = 0.6302 nghĩa là odds có kinh nghiệm thực tập của sinh viên từ
nhóm có tạo điều kiện nghiên cứu chỉ bằng
63.02% so với nhóm không được tạo điều
kiện.
- Tuy nhiên, do khoảng tin cậy chứa 1 và \(p
> 0.05\), sự khác biệt này không có ý nghĩa thống
kê.
Cặp 3: Gender ×
Concern Level
Câu hỏi: Mức độ lo ngại về AI có khác nhau giữa nam và nữ không?
Mục tiêu: Phân tích cảm nhận khác biệt giữa hai giới trước ảnh hưởng
của AI.
Bảng tần số
chéo
# Đổi nhãn tiếng Việt cho giới tính (không thay đổi thứ tự)
d$Gender.VN <- factor(d$Gender,
levels = c("Female", "Male"), # Nữ trước, Nam sau
labels = c("Nữ", "Nam"))
# Đổi nhãn tiếng Việt cho mức độ quan tâm
d$Concern.Level.VN <- factor(d$Concern.Level,
levels = c("Not concerned", "Slightly concerned", "Moderately concerned", "Highly concerned"),
labels = c("K quan tâm", "Hơi quan tâm", "Quan tâm vừa phải", "Rất quan tâm"))
# Tạo bảng tần số chéo với nhãn tiếng Việt và thứ tự Nữ rồi Nam
table_gender_concern <- table(d$Gender.VN, d$Concern.Level.VN)
table_gender_concern
##
## K quan tâm Hơi quan tâm Quan tâm vừa phải Rất quan tâm
## Nữ 36 54 17 2
## Nam 34 31 12 2
# Tính tỷ lệ theo hàng
prop.table(table_gender_concern, margin = 1)
##
## K quan tâm Hơi quan tâm Quan tâm vừa phải Rất quan tâm
## Nữ 0.33027523 0.49541284 0.15596330 0.01834862
## Nam 0.43037975 0.39240506 0.15189873 0.02531646
Nhận xét
Nữ giới thể hiện mức độ quan tâm cao hơn nam, đặc biệt ở mức “hơi
quan tâm” (49.54% nữ so với 39.24% nam).
Nam giới có xu hướng thờ ơ nhiều hơn, thể hiện qua tỷ lệ “không
quan tâm” cao hơn nữ (43.04% nam so với 33.03% nữ).
Cả hai giới đều hiếm khi bày tỏ sự quan tâm mạnh: chỉ 1.83% nữ và
2.53% nam chọn mức “rất quan tâm”.
Sự khác biệt giữa hai giới là rõ nhất ở hai mức đối lập: “không
quan tâm” và “hơi quan tâm”.
Trực quan hóa
# Chuẩn bị dữ liệu
df_concern_stacked <- as.data.frame(table(d$Gender.VN, d$Concern.Level.VN))
colnames(df_concern_stacked) <- c("Giới tính", "Mức độ quan tâm", "Tần số")
# Vẽ biểu đồ cột chồng có số
ggplot(df_concern_stacked, aes(x = `Giới tính`, y = `Tần số`, fill = `Mức độ quan tâm`)) +
geom_bar(stat = "identity") +
geom_text(aes(label = `Tần số`),
position = position_stack(vjust = 0.5),
size = 4, color = "black", fontface = "bold") +
labs(title = "Biểu đồ cột chồng: Mức độ quan tâm theo giới tính",
x = "Giới tính", y = "Tần số") +
scale_fill_brewer(palette = "Pastel1") +
theme_minimal(base_size = 13) +
theme(plot.title = element_text(hjust = 0.5, face = "bold"))

Kiểm định thống kê
(Kiểm định chi bình phương)
chisq.test(table_gender_concern)
## Warning in chisq.test(table_gender_concern): Chi-squared approximation may be
## incorrect
##
## Pearson's Chi-squared test
##
## data: table_gender_concern
## X-squared = 2.4171, df = 3, p-value = 0.4905
- Xác định xem hai biến định tính (giới tính và mức độ quan tâm) có
mối liên hệ (phụ thuộc) với nhau hay không.
Giả thuyết kiểm định:
- \(H_0\) (Giả
thuyết không): Giới tính và mức độ quan tâm là độc lập với nhau.
- \(H_1\) (Giả
thuyết đối): Giới tính và mức độ quan tâm có liên hệ với nhau.
Kết quả kiểm định Chi-bình phương:
- Giá trị thống kê: \(\chi^2 =
2.4171\)
- Bậc tự do: \(df = 3\)
- Giá trị p-value: \(p =
0.4905\)
Kết luận thống kê:
- Vì \(p > 0.05\), không đủ bằng
chứng để bác bỏ giả thuyết \(H_0\).
- Điều này cho thấy không có mối liên hệ có ý nghĩa thống kê giữa giới
tính và mức độ quan tâm.
Thảo luận thêm về bản chất mối quan hệ:
Mặc dù mô tả tần suất cho thấy nữ có xu hướng quan tâm nhiều hơn nam
(đặc biệt ở mức “hơi quan tâm”), nhưng kiểm định Chi-bình phương chỉ ra
rằng sự khác biệt đó không đủ lớn để có ý nghĩa thống kê. Hai biến được
coi là độc lập về mặt thống kê – tức là sự khác biệt có thể do ngẫu
nhiên trong mẫu khảo sát.
Hiệu tỷ lệ
Tỷ lệ được định nghĩa như sau:
- \(p_1 = P(\text{"Rất quan tâm"}
\mid \text{Giới tính} = \text{Nữ})\)
- \(p_2 = P(\text{"Rất quan tâm"}
\mid \text{Giới tính} = \text{Nam})\)
Giả thuyết kiểm định:
- \(H_0: p_1 - p_2 = 0\): Không có sự
khác biệt về tỷ lệ “rất quan tâm” giữa nữ và nam
- \(H_1: p_1 - p_2 > 0\): Tỷ lệ nữ
“rất quan tâm” cao hơn nam
# Lập bảng tần số chéo giữa Gender và Concern Level
table_gender_concern <- table(d$Gender.VN, d$Concern.Level.VN)
# Thêm tổng hàng và tổng cột
table_gender_concern_margins <- addmargins(table_gender_concern)
# Hiển thị bảng
table_gender_concern_margins
##
## K quan tâm Hơi quan tâm Quan tâm vừa phải Rất quan tâm Sum
## Nữ 36 54 17 2 109
## Nam 34 31 12 2 79
## Sum 70 85 29 4 188
# Số người "Rất quan tâm" trong từng giới
counts_concern_high <- c(table_gender_concern["Nữ", "Rất quan tâm"], table_gender_concern["Nam", "Rất quan tâm"])
# Tổng số người theo từng giới
totals_gender <- c(sum(table_gender_concern["Nữ", ]), sum(table_gender_concern["Nam", ]))
# Kiểm định tỉ lệ một phía: p1 > p2
test_concern <- prop.test(counts_concern_high, totals_gender, alternative = "greater", correct = FALSE)
## Warning in prop.test(counts_concern_high, totals_gender, alternative =
## "greater", : Chi-squared approximation may be incorrect
# Hiển thị kết quả
test_concern
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts_concern_high out of totals_gender
## X-squared = 0.10679, df = 1, p-value = 0.6281
## alternative hypothesis: greater
## 95 percent confidence interval:
## -0.04291441 1.00000000
## sample estimates:
## prop 1 prop 2
## 0.01834862 0.02531646
Kết quả kiểm định:
Giả sử kiểm định cho ra các kết quả sau:
Tỷ lệ nữ:
\[ \hat{p}_1 = \frac{2}{109} \approx 0.0183
\]
Tỷ lệ nam:
\[ \hat{p}_2 = \frac{2}{79} \approx 0.0253
\]
Hiệu tỷ lệ:
\[ \hat{p}_1 - \hat{p}_2 = 0.0183 - 0.0253 =
-0.0070 \]
Giá trị thống kê:
\[ \chi^2 = 0.1068, \quad df = 1
\]
Khoảng tin cậy 95%:
\[ [-0.0429,\ 1.0000] \]
Giá trị p-value:
\[ p = 0.6281 \]
Kết luận:
Vì \(p = 0.6281 > 0.05\), ta
không đủ bằng chứng để bác bỏ giả thuyết \(H_0\).
Sự khác biệt về tỷ lệ “rất quan tâm” giữa nữ và nam là không có ý nghĩa
thống kê.
Diễn giải:
Tỷ lệ nữ ở mức “rất quan tâm” thấp hơn nam, nhưng sự chênh lệch (0.7
điểm phần trăm) là rất nhỏ. Điều này cho thấy sự khác biệt có thể là do
ngẫu nhiên và không phản ánh sự khác biệt thực sự trong toàn bộ quần
thể.
Tỷ số nguy cơ
(RR)
Câu hỏi nghiên cứu:
Liệu giới tính (nam/nữ) có ảnh hưởng đến khả năng đạt mức “rất quan tâm”
hay không?
Mục tiêu:
So sánh xác suất đạt mức “rất quan tâm” giữa hai giới bằng tỷ số nguy cơ
(Relative Risk – RR).
Công thức tính:
\[
RR = \frac{P(\text{"Rất quan tâm"} \mid \text{Giới tính} =
\text{Nữ})}{P(\text{"Rất quan tâm"} \mid \text{Giới tính} =
\text{Nam})}
\]
Trong đó:
- Tử số là xác suất nữ đạt mức “rất quan tâm”
- Mẫu số là xác suất nam đạt mức “rất quan tâm”
Ý nghĩa:
- Nếu \(RR > 1\): Nữ có khả năng
“rất quan tâm” cao hơn nam
- Nếu \(RR < 1\): Nữ có khả năng
“rất quan tâm” thấp hơn nam
- Nếu \(RR = 1\): Khả năng đạt mức
“rất quan tâm” là như nhau giữa hai giới
Tính chỉ số Relative Risk:
riskratio(table_gender_concern)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $data
##
## K quan tâm Hơi quan tâm Quan tâm vừa phải Rất quan tâm Total
## Nữ 36 54 17 2 109
## Nam 34 31 12 2 79
## Total 70 85 29 4 188
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Nữ 1.0000000 NA NA
## Nam 0.7948718 0.5856797 1.078783
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Nữ NA NA NA
## Nam 0.1337546 0.4864218 0.4904677
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Tỷ số nguy cơ
(Relative Risk) – Mức “Rất quan tâm”
Tính tỷ lệ rất quan tâm:
Tỷ số nguy cơ:
\[
RR = \frac{\hat{p}_{\text{Rất quan tâm | Nữ}}}{\hat{p}_{\text{Rất quan
tâm | Nam}}}
= \frac{2/109}{2/79}
= \frac{0.0183}{0.0253} \approx 0.7949
\]
Khoảng tin cậy 95%:
\[
CI = [0.5857;\ 1.0789]
\]
Giá trị p-value:
- Mid-p exact: \(p = 0.1338\)
- Fisher exact: \(p = 0.4864\)
- Chi-square: \(p = 0.4905\)
Kết luận:
- Với \(RR = 0.7949 < 1\), nữ có
nguy cơ đạt mức “rất quan tâm” thấp hơn nam.
- Tuy nhiên, vì khoảng tin cậy chứa 1 và tất cả các p-value đều >
0.05, nên sự khác biệt này không có ý nghĩa thống
kê.
Tỷ số Chênh (Odds
Ratio - OR)
or_result3 <- oddsratio(table_gender_concern)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
print(or_result3)
## $data
##
## K quan tâm Hơi quan tâm Quan tâm vừa phải Rất quan tâm Total
## Nữ 36 54 17 2 109
## Nam 34 31 12 2 79
## Total 70 85 29 4 188
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Nữ 1.0000000 NA NA
## Nam 0.6103751 0.3179094 1.163407
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Nữ NA NA NA
## Nam 0.1337546 0.4864218 0.4904677
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Tính odds (tỷ lệ chéo) theo từng nhóm:
Tính Odds Ratio (OR):
\[
OR = \frac{\text{Odds}_{\text{Nữ}}}{\text{Odds}_{\text{Nam}}}
= \frac{2/107}{2/79}
= \frac{0.0187}{0.0260} \approx 0.6108
\]
Khoảng tin cậy 95%:
\[
CI = [0.3179 ; 1.1634]
\]
Giả thuyết kiểm định:
- \(H_0\): Odds ratio giữa nam và nữ
bằng 1 (không có mối liên hệ giữa giới tính và mức “rất quan
tâm”).
- \(H_1\): Odds ratio khác 1 (có mối
liên hệ giữa giới tính và mức “rất quan tâm”).
Kết quả kiểm định:
- Mid-p exact: \(p = 0.1338\)
- Fisher exact: \(p = 0.4864\)
- Chi-square: \(p = 0.4905\)
Kết luận thống kê:
Vì các giá trị \(p > 0.05\), ta
không bác bỏ giả thuyết \(H_0\).
\[
\Rightarrow \text{Chưa có đủ bằng chứng thống kê để khẳng định giới tính
có liên hệ với mức “rất quan tâm”.}
\]
Ý nghĩa:
- Odds nữ “rất quan tâm” trên odds nữ không “rất quan tâm” chỉ bằng
khoảng 61.08% so với tương quan tương tự ở nam.
- Tuy nhiên, do mức độ chênh lệch này không có ý nghĩa thống kê (các
p-value > 0.05), nên ta chưa thể khẳng định rằng giới tính có ảnh
hưởng rõ rệt đến khả năng đạt mức “rất quan tâm”.
Cặp 4: Concern Level
× Research Opportunities at University
Câu hỏi: Trường có tạo điều kiện nghiên cứu AI giúp sinh viên bớt lo
ngại không?
Mục tiêu: Đánh giá ảnh hưởng của môi trường học thuật đến mức độ lo
ngại về AI.
Bảng tần số
chéo
# Đổi nhãn tiếng Việt cho biến mức độ lo ngại
d$Concern.Level.VN <- factor(d$Concern.Level,
levels = c("Not concerned", "Slightly concerned", "Moderately concerned", "Highly concerned"),
labels = c("Không quan tâm", "Hơi quan tâm", "Quan tâm vừa phải", "Rất quan tâm"))
# Đổi nhãn tiếng Việt cho biến cơ hội nghiên cứu tại trường
d$Research.VN <- factor(d$Research.Opportunities,
levels = c("No", "Yes"),
labels = c("Không có", "Có"))
# Tạo bảng tần số chéo giữa Concern Level và Research Opportunities
table_concern_research <- table(d$Concern.Level.VN, d$Research.VN)
table_concern_research
##
## Không có Có
## Không quan tâm 33 37
## Hơi quan tâm 53 32
## Quan tâm vừa phải 18 11
## Rất quan tâm 1 3
# Tính tỷ lệ theo hàng
prop.table(table_concern_research, margin = 1)
##
## Không có Có
## Không quan tâm 0.4714286 0.5285714
## Hơi quan tâm 0.6235294 0.3764706
## Quan tâm vừa phải 0.6206897 0.3793103
## Rất quan tâm 0.2500000 0.7500000
Trong nhóm không quan tâm, 52.87% học tại trường có cơ hội nghiên
cứu, 47.13% học tại trường không có cơ hội nghiên cứu.
Trong nhóm hơi quan tâm, 62.35% thuộc trường không có cơ hội
nghiên cứu, chỉ 37.65% thuộc nhóm có hỗ trợ.
Với nhóm quan tâm vừa phải, tỷ lệ cũng nghiêng về phía không có
nghiên cứu (62.07%).
Nhóm rất quan tâm thì ngược lại: có tới 75% học tại trường có hỗ
trợ nghiên cứu, chỉ 25% thuộc trường không có
Trực quan hóa
library(ggplot2)
# Tạo bảng dữ liệu từ bảng tần số chéo
df_concern_research <- as.data.frame(table(d$Concern.Level.VN, d$Research.VN))
colnames(df_concern_research) <- c("Mức độ lo ngại", "Cơ hội nghiên cứu", "Tần số")
# Vẽ biểu đồ cột chồng có nhãn số
ggplot(df_concern_research, aes(x = `Mức độ lo ngại`, y = `Tần số`, fill = `Cơ hội nghiên cứu`)) +
geom_bar(stat = "identity") +
geom_text(aes(label = `Tần số`),
position = position_stack(vjust = 0.5),
size = 4, color = "black", fontface = "bold") +
labs(title = "Biểu đồ cột chồng: Mức độ lo ngại × Cơ hội nghiên cứu tại trường",
x = "Mức độ lo ngại về AI",
y = "Tần số") +
scale_fill_brewer(palette = "Pastel1") +
theme_minimal(base_size = 13) +
theme(
plot.title = element_text(hjust = 0.5, face = "bold"),
legend.title = element_text(face = "bold")
)

Kiểm định thống kê
(Kiểm định Chi-bình phương)
- Xác định xem hai biến định tính có mối liên hệ (phụ thuộc) với nhau
hay không?
Giả thuyết kiểm định:
# Thực hiện kiểm định Chi-bình phương cho Cặp 4
chisq.test(table_concern_research)
## Warning in chisq.test(table_concern_research): Chi-squared approximation may be
## incorrect
##
## Pearson's Chi-squared test
##
## data: table_concern_research
## X-squared = 5.6088, df = 3, p-value = 0.1323
Kết quả kiểm định Chi-bình phương:
- Giá trị thống kê: \(\chi^2 =
5.6088\)
- Bậc tự do: \(df = 3\)
- Giá trị p-value: \(p =
0.1323\)
Cảnh báo:
Kiểm định có cảnh báo: — có thể do tần số kỳ vọng nhỏ trong một số
ô.
Kết luận thống kê:
- Vì \(p = 0.1323 > 0.05\), ta
không bác bỏ giả thuyết \(H_0\).
- Điều này cho thấy không có bằng chứng thống kê đủ mạnh để kết luận
rằng mức độ lo ngại phụ thuộc vào việc trường có tạo điều kiện nghiên
cứu.
Diễn giải:
Mặc dù bảng mô tả tần suất cho thấy một số xu hướng (ví dụ: nhóm
“không quan tâm” chiếm nhiều ở trường có nghiên cứu), nhưng sự khác biệt
này chưa đủ lớn để có ý nghĩa thống kê.
Do đó, trong phạm vi mẫu khảo sát, mức độ lo ngại và cơ
hội nghiên cứu tại trường có thể được xem là độc
lập.
Hiệu tỷ lệ
So sánh tỷ lệ xuất hiện một đặc điểm nào đó giữa hai nhóm để xem sự
khác biệt đó có ý nghĩa thống kê hay không?
# Lập bảng tần số chéo giữa Concern Level và Research Opportunities
table_concern_research <- table(d$Concern.Level.VN, d$Research.VN)
# Thêm tổng hàng và tổng cột
table_concern_research_margins <- addmargins(table_concern_research)
# Hiển thị bảng
table_concern_research_margins
##
## Không có Có Sum
## Không quan tâm 33 37 70
## Hơi quan tâm 53 32 85
## Quan tâm vừa phải 18 11 29
## Rất quan tâm 1 3 4
## Sum 105 83 188
Tỷ lệ sinh viên đạt mức “rất quan tâm” theo điều kiện nghiên cứu được
ký hiệu như sau:
\(p_1 = P(\text{"Rất quan
tâm"} \mid \text{Research} = \text{"Không có"})\):
Tỷ lệ “rất quan tâm” trong nhóm không có cơ hội nghiên
cứu.
\(p_2 = P(\text{"Rất quan
tâm"} \mid \text{Research} = \text{"Có"})\): Tỷ lệ
“rất quan tâm” trong nhóm có cơ hội nghiên
cứu.
Giả thuyết kiểm định:
# Số sinh viên "Rất quan tâm" theo điều kiện nghiên cứu
counts_concern_high <- c(table_concern_research["Rất quan tâm", "Không có"],
table_concern_research["Rất quan tâm", "Có"])
# Tổng số sinh viên theo từng nhóm điều kiện nghiên cứu
totals_research <- c(sum(table_concern_research[, "Không có"]),
sum(table_concern_research[, "Có"]))
# Kiểm định tỉ lệ một phía: nhóm "Không có" > nhóm "Có"
test_concern <- prop.test(counts_concern_high, totals_research,
alternative = "greater", correct = FALSE)
## Warning in prop.test(counts_concern_high, totals_research, alternative =
## "greater", : Chi-squared approximation may be incorrect
# Hiển thị kết quả
test_concern
##
## 2-sample test for equality of proportions without continuity correction
##
## data: counts_concern_high out of totals_research
## X-squared = 1.5776, df = 1, p-value = 0.8954
## alternative hypothesis: greater
## 95 percent confidence interval:
## -0.06375134 1.00000000
## sample estimates:
## prop 1 prop 2
## 0.00952381 0.03614458
Nhận xét, cách tính và ý nghĩa của hiệu tỷ lệ
Giả sử có kết quả kiểm định như sau:
Tỷ lệ trong nhóm không có nghiên cứu:
\[ \hat{p}_1 = \frac{1}{108} \approx 0.0095
\]
Tỷ lệ trong nhóm có nghiên cứu:
\[ \hat{p}_2 = \frac{3}{82} \approx 0.0361
\]
Hiệu tỷ lệ:
\[ \hat{p}_1 - \hat{p}_2 = 0.0095 - 0.0361 =
-0.0266 \]
Cách tính hiệu tỷ lệ
\[
\hat{p}_1 = \frac{x_1}{n_1}, \quad \hat{p}_2 = \frac{x_2}{n_2}
\]
Trong đó:
- \(x_1, x_2\): số sinh viên “rất
quan tâm” ở mỗi nhóm
- \(n_1, n_2\): tổng số sinh viên
theo từng điều kiện nghiên cứu
Hiệu tỷ lệ:
\[
\hat{p}_1 - \hat{p}_2
\]
Kết quả kiểm định:
- Thống kê kiểm định: \(\chi^2 =
1.5776\)
- Bậc tự do: \(df = 1\)
- Giá trị p-value: \(p =
0.8954\)
Kết luận:
Vì \(p > 0.05\), ta không
bác bỏ giả thuyết \(H_0\).
Sự khác biệt về tỷ lệ “rất quan tâm” giữa hai nhóm là không có ý
nghĩa thống kê.
Diễn giải:
Mặc dù tỷ lệ “rất quan tâm” ở nhóm không có cơ hội nghiên cứu thấp
hơn nhóm có cơ hội, nhưng sự chênh lệch nhỏ này có thể do ngẫu nhiên.
Kiểm định cho thấy không có bằng chứng thống kê rõ ràng
về mối liên hệ giữa mức độ lo ngại và điều kiện nghiên cứu tại
trường.
Tỷ số nguy cơ
Câu hỏi nghiên cứu:
Liệu việc trường có tạo điều kiện nghiên cứu AI có ảnh hưởng đến khả
năng sinh viên đạt mức “rất quan tâm” về AI hay không?
Mục tiêu:
So sánh xác suất đạt mức “rất quan tâm” giữa hai nhóm sinh viên:
- Có cơ hội nghiên cứu tại trường
- Không có cơ hội nghiên cứu tại trường
Công thức tính:
\[
RR = \frac{P(\text{"Rất quan tâm"} \mid \text{Research} =
\text{"Không có"})}{P(\text{"Rất quan tâm"} \mid
\text{Research} = \text{"Có"})}
\]
Trong đó:
- Tử số: xác suất đạt mức “rất quan tâm” trong nhóm không có
cơ hội nghiên cứu
- Mẫu số: xác suất đạt mức “rất quan tâm” trong nhóm có cơ hội
nghiên cứu
Ý nghĩa:
- Nếu \(RR > 1\): Nhóm không có cơ
hội nghiên cứu có mức “rất quan tâm” cao hơn
- Nếu \(RR < 1\): Nhóm có cơ hội
nghiên cứu có mức “rất quan tâm” cao hơn
- Nếu \(RR = 1\): Hai nhóm có khả
năng “rất quan tâm” như nhau
Tính Relative Risk
riskratio(table_concern_research)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
## $data
##
## Không có Có Total
## Không quan tâm 33 37 70
## Hơi quan tâm 53 32 85
## Quan tâm vừa phải 18 11 29
## Rất quan tâm 1 3 4
## Total 105 83 188
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## Không quan tâm 1.0000000 NA NA
## Hơi quan tâm 0.7122417 0.5009814 1.012589
## Quan tâm vừa phải 0.7176142 0.4285754 1.201586
## Rất quan tâm 1.4189189 0.7728940 2.604925
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Không quan tâm NA NA NA
## Hơi quan tâm 0.0610754 0.0741027 0.05793474
## Quan tâm vừa phải 0.1860595 0.1928704 0.17624606
## Rất quan tâm 0.4507981 0.6197027 0.38742905
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Tỷ lệ rất quan tâm:
Tỷ số nguy cơ:
\[
RR = \frac{0.0095}{0.0361} \approx 0.2626
\]
Tuy nhiên, theo kết quả từ riskratio()
:
\[
RR = 1.4189
\]
Khoảng tin cậy 95%:
\[
CI = [0.7729 ; 2.6049]
\]
Kết quả kiểm định (two-sided):
- Mid-p exact: \(p = 0.4508\)
- Fisher exact: \(p = 0.6191\)
- Chi-square: \(p = 0.3874\)
Kết luận:
- Với \(RR = 1.4189 > 1\), nhóm
có cơ hội nghiên cứu có nguy cơ “rất quan tâm” cao hơn
nhóm không có.
- Tuy nhiên, do khoảng tin cậy chứa 1 và các p-value > 0.05, ta
không đủ bằng chứng để bác bỏ giả thuyết \(H_0\).
Diễn giải:
Tuy dữ liệu mô tả cho thấy tỷ lệ “rất quan tâm” cao hơn ở nhóm có cơ
hội nghiên cứu, nhưng sự khác biệt này không có ý nghĩa thống
kê.
Điều đó cho thấy việc trường có hỗ trợ nghiên cứu chưa chắc ảnh
hưởng rõ rệt đến mức độ lo ngại cao nhất của sinh viên.
Tỷ số Chênh (Odds
Ratio - OR)
or_result2 <- oddsratio(table_concern_research)
## Warning in chisq.test(xx, correct = correction): Chi-squared approximation may
## be incorrect
print(or_result2)
## $data
##
## Không có Có Total
## Không quan tâm 33 37 70
## Hơi quan tâm 53 32 85
## Quan tâm vừa phải 18 11 29
## Rất quan tâm 1 3 4
## Total 105 83 188
##
## $measure
## odds ratio with 95% C.I.
## estimate lower upper
## Không quan tâm 1.0000000 NA NA
## Hơi quan tâm 0.5413791 0.2820595 1.028831
## Quan tâm vừa phải 0.5506836 0.2199945 1.329626
## Rất quan tâm 2.4387181 0.2686004 72.435513
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## Không quan tâm NA NA NA
## Hơi quan tâm 0.0610754 0.0741027 0.05793474
## Quan tâm vừa phải 0.1860595 0.1928704 0.17624606
## Rất quan tâm 0.4507981 0.6197027 0.38742905
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Tính odds (tỷ lệ chéo) theo từng nhóm
Tính Odds Ratio (OR)
\[
OR = \frac{\text{Odds}_{\text{Có}}}{\text{Odds}_{\text{Không có}}} =
\frac{3/80}{1/104} \approx 2.4387
\]
Khoảng tin cậy 95%:
\[
CI = \left[ 0.2686 ; 72.4355 \right]
\]
Giả thuyết kiểm định
- \(H_0\): Odds ratio giữa hai nhóm
bằng 1 (không có mối liên hệ giữa điều kiện nghiên cứu và mức “rất quan
tâm”).
- \(H_1\): Odds ratio khác 1 (có mối
liên hệ giữa điều kiện nghiên cứu và mức “rất quan tâm”).
Kết quả kiểm định
- Mid-p exact: \(p = 0.4508\)
- Fisher exact: \(p = 0.6197\)
- Chi-square: \(p = 0.3874\)
Kết luận thống kê
Vì tất cả các giá trị \(p >
0.05\), ta không bác bỏ giả thuyết \(H_0\).
\[
\Rightarrow \text{Không có đủ bằng chứng thống kê để khẳng định rằng
điều kiện nghiên cứu ảnh hưởng đến odds của mức “rất quan tâm”.}
\]
Ý nghĩa
- Odds sinh viên “rất quan tâm” trong nhóm có cơ hội nghiên cứu cao
hơn khoảng 2.44 lần so với nhóm không có.
- Tuy nhiên, do khoảng tin cậy rất rộng và p-value lớn, sự khác biệt
này không có ý nghĩa thống kê và có thể là do ngẫu
nhiên.
Mô hình Logit
Mô hình Logit : Là một mô hình hồi quy dùng để dự
đoán xác suất xảy ra của một sự kiện nhị phân (chỉ có 2 trạng thái: 1/0,
Yes/No, Thành công/Thất bại).
Mục tiêu: phân tích xem việc đánh giá giới tính
(Gender) có ảnh hưởng như thế nào đến mức độ lo lắng của sinh viên trước
tác động của AI.
Biến phụ thuộc: anxiety_binary (1 = High anxiety, 0
= khác)
Biến giải thích: gender_binary (1 = nữ, 0 = nam)
\[
\log\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1 \cdot
\text{gender\_binary}
\]
Trong đó:
\[
\begin{aligned}
p & : \text{Xác suất sinh viên thuộc nhóm High anxiety} \\
\beta_0 & : \text{Hệ số chặn (intercept)} \\
\beta_1 & : \text{Hệ số của biến gender\_binary} \\
gender\_binary & : \text{Biến độc lập (0 = Nam, 1 = Nữ)}
\end{aligned}
\]
# Cài gói cần thiết
if (!require(broom)) install.packages("broom")
## Loading required package: broom
library(broom)
# Chuẩn hóa biến Gender: loại bỏ khoảng trắng, chuyển chữ thường
d$Gender <- trimws(tolower(as.character(d$Gender)))
# Tạo biến gender_binary (0 = Male, 1 = Female)
d$gender_binary <- ifelse(d$Gender == "female", 1,
ifelse(d$Gender == "male", 0, NA))
# Tạo biến phụ thuộc nhị phân: 1 nếu High anxiety, 0 nếu các mức khác
d$anxiety_binary <- ifelse(d$Anxiety.Level == "High anxiety", 1, 0)
# Kiểm tra dữ liệu hợp lệ
if (length(unique(na.omit(d$anxiety_binary))) < 2) {
stop("Biến phụ thuộc chỉ có 1 giá trị hoặc bị thiếu dữ liệu. Không thể chạy mô hình.")
}
# Chạy mô hình logistic nhị phân
model_logit <- glm(anxiety_binary ~ gender_binary,
data = d,
family = binomial(link = "logit"))
# Tóm tắt mô hình
summary(model_logit)
##
## Call:
## glm(formula = anxiety_binary ~ gender_binary, family = binomial(link = "logit"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.3308 0.3959 -5.887 3.93e-09 ***
## gender_binary -1.6489 0.8161 -2.021 0.0433 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 72.268 on 187 degrees of freedom
## Residual deviance: 67.246 on 186 degrees of freedom
## AIC: 71.246
##
## Number of Fisher Scoring iterations: 6
# Tính AIC
aic_value <- AIC(model_logit)
cat("AIC của mô hình logit: ", round(aic_value, 3), "\n")
## AIC của mô hình logit: 71.246
# Gộp kết quả thành bảng đẹp
tidy_model <- tidy(model_logit)
print(tidy_model)
## # A tibble: 2 × 5
## term estimate std.error statistic p.value
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 (Intercept) -2.33 0.396 -5.89 0.00000000393
## 2 gender_binary -1.65 0.816 -2.02 0.0433
Nhận xét
Intercept (\(\beta_0 =
-2.3308\)): Giá trị intercept đại diện cho
log-odds của việc rơi vào nhóm High anxiety
khi \(gender\_binary = 0\) (tức là
Nam).
Điều này nghĩa là với Nam giới, log-odds bị High anxiety là \(-2.3308\).
gender_binary (\(\beta_1 =
-1.6489\)): Giá trị hệ số này biểu thị sự thay đổi
log-odds khi chuyển từ Nam (\(gender\_binary = 0\)) sang
Nữ (\(gender\_binary =
1\)).
Cụ thể, log-odds bị High anxiety của Nữ giảm \(1.6489\) đơn vị so với Nam.
Hệ số \(\beta_1
(gender\_binary)\):
Với \(\beta_1 = -1.6489\), \(p = 0.0433 < 0.05\)
Điều này cho thấy biến Gender có ý nghĩa thống
kê ở mức 5%.
Nữ giới có xác suất bị High anxiety thấp hơn
đáng kể so với Nam giới.
Mô hình Logit đa
biến
Biến phụ thuộc (Anxiety Level) có 4 mức độ phân loại:
No anxiety (không lo lắng)
Slight anxiety (hơi lo lắng)
Moderate anxiety (lo lắng vừa phải)
High anxiety (lo lắng cao)
Mã hóa: 1 nếu High anxiety, 0 nếu các mức
khác
Biến giải thích (Gender) được mã hóa nhị phân:
# Cài gói cần thiết
if (!require(nnet)) install.packages("nnet")
## Loading required package: nnet
if (!require(broom)) install.packages("broom")
library(nnet)
library(broom)
# Chuẩn hóa biến Gender: loại bỏ khoảng trắng, chuyển chữ thường
d$Gender <- trimws(tolower(as.character(d$Gender)))
# Tạo biến gender_binary (0 = Male, 1 = Female)
d$gender_binary <- ifelse(d$Gender == "female", 1,
ifelse(d$Gender == "male", 0, NA))
# Kiểm tra xem có đủ cả 2 giới tính không
if (length(unique(na.omit(d$gender_binary))) < 2) {
stop("Dữ liệu chỉ có 1 nhóm giới tính hoặc bị thiếu dữ liệu. Không thể chạy mô hình.")
}
# Chạy mô hình multinom
model_multinom <- multinom(Anxiety.Level ~ gender_binary, data = d)
## # weights: 12 (6 variable)
## initial value 260.623340
## iter 10 value 217.575818
## final value 217.549503
## converged
# Tóm tắt mô hình
summary_model <- summary(model_multinom)
# Tính z-value và p-value
z_values <- summary_model$coefficients / summary_model$standard.errors
p_values <- 2 * (1 - pnorm(abs(z_values)))
# Gộp kết quả thành bảng đẹp
result_table <- as.data.frame(cbind(
Estimate = round(summary_model$coefficients, 4),
`Std. Error` = round(summary_model$standard.errors, 4),
`z value` = round(z_values, 3),
`Pr(>|z|)` = signif(p_values, 3)
))
# Hiển thị bảng kết quả
print(result_table)
## (Intercept) gender_binary (Intercept) gender_binary
## Moderate anxiety 0.4520 1.8506 0.4835 0.8853
## No anxiety 1.4553 1.4625 0.4197 0.8386
## Slight anxiety 1.4881 1.7308 0.4185 0.8337
## (Intercept) gender_binary (Intercept) gender_binary
## Moderate anxiety 0.935 2.090 0.350000 0.0366
## No anxiety 3.467 1.744 0.000526 0.0812
## Slight anxiety 3.556 2.076 0.000377 0.0379
# Tự tính Null Deviance (log-likelihood của mô hình chỉ có intercept)
model_null <- multinom(Anxiety.Level ~ 1, data = d, trace = FALSE)
# Null deviance và degrees of freedom
null_deviance <- -2 * logLik(model_null)
residual_deviance <- -2 * logLik(model_multinom)
df_null <- attr(logLik(model_null), "df")
df_residual <- attr(logLik(model_multinom), "df")
# AIC
aic_value <- AIC(model_multinom)
# Hiển thị thông tin deviance & AIC
cat("\nNull deviance: ", round(null_deviance, 3), " on ", df_null, " degrees of freedom\n")
##
## Null deviance: 441.115 on 3 degrees of freedom
cat("Residual deviance: ", round(residual_deviance, 3), " on ", df_residual, " degrees of freedom\n")
## Residual deviance: 435.099 on 6 degrees of freedom
cat("AIC: ", round(aic_value, 3), "\n")
## AIC: 447.099
cat("Number of Fisher Scoring iterations: ", model_multinom$iter, "\n")
## Number of Fisher Scoring iterations:
Nhận xét
Moderate anxiety |
0.4520 |
1.8506 |
0.0366 (*) |
No anxiety |
1.4553 |
1.4625 |
0.0812 (.) |
Slight anxiety |
1.4881 |
1.7308 |
0.0379 (*) |
Intercept (β₀k): Giá trị intercept đại diện cho log-odds của việc
rơi vào từng mức độ lo âu khi gender_binary = 0 (tức là nam).
gender_binary (β₁k): thay đổi log-odds khi chuyển từ nam
(gender_binary = 0) sang nữ (gender_binary = 1).
Hệ số β₁(gender_binary):
Với mức Moderate anxiety, β₁=2.090, p=0.0366
(<0.05). Điều này cho thấy giới tính có ảnh hưởng thống kê. Nữ giới
có khả năng rơi vào mức độ lo âu vừa phải cao hơn so với nam
giới.
Với mức Slight anxiety, β₁=2.076, p=0.0379
(<0.05). Nữ giới có rơi vào mức độ lo âu nhẹ cao hơn so với nam
giới.
Với mức No anxiety, β₁=1.744, p=0.0812
(<0.05). Ở mức này, giới tính không có khả năng ảnh hưởng thống kê
(vì p>0.05)
Bảng thông số
Null deviance |
441.115 (df=3) |
Sai số log-likelihood của mô hình chỉ có Intercept
(chưa có gender_binary). |
Mô hình gốc kém về giải thích dữ liệu. |
Residual deviance |
435.099 (df=6) |
Sai số sau khi thêm gender_binary. Giảm → mô hình cải thiện. |
Mô hình tốt hơn khi thêm biến Gender. |
Giảm deviance |
6.016 |
Hiệu số giữa Null deviance và Residual deviance. |
Gender có tác động nhưng mức giải thích nhỏ. |
AIC |
447.099 |
Chỉ số đánh giá mô hình, càng thấp càng tốt. |
Mô hình có Gender phù hợp hơn (AIC giảm). |
Fisher iterations |
10 |
Số lần lặp tối ưu để hội tụ mô hình. |
Mô hình hội tụ tốt. |
KẾT LUẬN TỔNG QUÁT
Gender có ảnh hưởng đến Anxiety Level, đặc biệt ở Slight và
Moderate anxiety.
Tuy nhiên, mức độ cải thiện của mô hình tổng thể (giảm deviance)
không quá lớn, cần thêm các biến khác (ví dụ: tuổi, năm học) để cải
thiện dự đoán.
Mô hình Probit
Mục tiêu Phân tích xem giới tính của sinh viên có
ảnh hưởng đến xác suất rơi vào từng mức độ lo lắng (Anxiety Level) hay
không
Dữ liệu
Biến phụ thuộc: anxiety_binary (1 = High anxiety, 0
= khác)
Biến giải thích: gender_binary (1 = nữ, 0 = nam)
Công thức tổng quát của mô hình Probit \[
P(Y=1 \mid Gender) = \Phi(\beta_0 + \beta_1 \cdot Gender)
\]
Trong đó:
\(P(Y=1 \mid Gender)\): Xác suất
sinh viên thuộc nhóm High anxiety theo giới
tính.
\(\Phi(.)\): Hàm phân phối tích
lũy chuẩn (CDF của phân phối chuẩn chuẩn hóa).
\(\beta_0\): Hệ số chặn
(Intercept), logit xác suất cho nhóm tham chiếu (\(Gender=0\), Nam).
\(\beta_1\): Hệ số hồi quy của
biến Gender*, phản ánh mức thay đổi về logit xác suất khi giới tính thay
đổi từ Nam (\(Gender=0\)) sang Nữ
(\(Gender=1\))
Ý nghĩa:
Nếu \(\beta_1 > 0\): Nữ giới
(\(Gender=1\)) có xác suất thuộc nhóm
High anxiety cao hơn Nam (\(Gender=0\)).
Nếu \(\beta_1 < 0\): Nữ giới
có xác suất thấp hơn Nam.
Nếu \(\beta_1 = 0\): Không có sự
khác biệt giữa hai giới.
# Tạo biến nhị phân: 1 nếu High anxiety, 0 nếu còn lại
d$anxiety_binary <- ifelse(d$Anxiety.Level == "High anxiety", 1, 0)
# Chuyển đổi Gender: 0 = nam, 1 = nữ
d$gender_binary <- ifelse(tolower(trimws(d$Gender)) == "female", 1,
ifelse(tolower(trimws(d$Gender)) == "male", 0, NA))
# Kiểm tra xem dữ liệu có đủ cả 2 nhóm không
if (length(unique(na.omit(d$gender_binary))) < 2) {
stop("Dữ liệu chỉ có 1 nhóm giới tính hoặc bị thiếu dữ liệu. Không thể chạy mô hình.")
}
# Chạy mô hình Probit
model_probit <- glm(anxiety_binary ~ gender_binary,
data = d,
family = binomial(link = "probit"))
# Xem kết quả
summary(model_probit)
##
## Call:
## glm(formula = anxiety_binary ~ gender_binary, family = binomial(link = "probit"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.3494 0.1992 -6.775 1.25e-11 ***
## gender_binary -0.7397 0.3483 -2.124 0.0337 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 72.268 on 187 degrees of freedom
## Residual deviance: 67.246 on 186 degrees of freedom
## AIC: 71.246
##
## Number of Fisher Scoring iterations: 6
Nhận xét
Intercept |
-1.3494 |
0.1992 |
-6.775 |
1.25e-11 *** |
Log-odds của Nam (gender_binary = 0) rơi vào nhóm
“High anxiety”. |
gender_binary |
-0.7397 |
0.3483 |
-2.124 |
0.0337 * |
So với Nam, Nữ có log-odds thấp hơn 0.7397 để rơi
vào “High anxiety”. |
Vì p-value < 0.05:
Thống kê mô hình
Null deviance |
72.268 |
Sai số khi không có biến giải thích. |
Mô hình gốc kém về giải thích dữ liệu. |
Residual deviance |
67.246 |
Sai số sau khi thêm biến Gender. |
Mô hình tốt hơn khi có thêm biến Gender. |
Giảm deviance |
5.022 |
Mức cải thiện khi thêm biến Gender. |
Gender có thể có ảnh hưởng (cần kiểm định). |
AIC |
71.246 |
Chỉ số so sánh mức phù hợp giữa các mô hình. |
AIC thấp → mô hình này phù hợp hơn. |
KẾT LUẬN TỔNG QUÁT
Biến Gender có ảnh hưởng đáng kể đến khả năng sinh viên rơi vào nhóm
High anxiety. Với cùng điều kiện khác, nữ giới có xác suất thấp hơn nam
giới để bị lo âu nghiêm trọng. Mô hình Probit đã phản ánh mối quan hệ
này một cách rõ ràng và có ý nghĩa thống kê.
Hàm Cloglog
(Complementary log-log link function)
Công thức
\[\begin{aligned}
\text{cloglog}(p) &= \log(-\log(1 - p)) && \text{Hàm liên
kết cloglog biến đổi xác suất } p \text{ thành dạng tuyến tính} \\\\
p &= 1 - e^{-e^{\eta}} && \text{Xác suất xảy ra sự kiện sau
khi tính toán từ } \eta \\\\
\eta &= \beta_0 + \beta_1X_1 + \dots + \beta_pX_p &&
\begin{aligned}
&\beta_0: \text{Hệ số chặn (intercept)} \\\\
&\beta_i: \text{Hệ số hồi quy của biến độc lập } X_i \\\\
&X_i: \text{Giá trị của biến độc lập thứ } i
\end{aligned}
\end{aligned}\]
So sánh với logit và probit
Logit |
\(\log\left(\tfrac{p}{1-p}\right)\) |
Xác suất thay đổi cân đối quanh 0.5. Thường dùng khi dữ liệu phân bố
đối xứng. |
Probit |
\(\Phi^{-1}(p)\) |
Sử dụng hàm phân phối tích lũy chuẩn (CDF). Phù hợp khi giả định lỗi
chuẩn. |
Cloglog |
\(\log(-\log(1 - p))\) |
Thích hợp khi mô hình hóa sự kiện hiếm, xác suất gần 0 hoặc gần 1,
và phân phối lệch phải. |
Mục tiêu: Mục tiêu là kiểm tra xem nữ giới có xác
suất bị High anxiety cao hơn nam giới hay không, và nếu có thì mức chênh
lệch là bao nhiêu (thông qua hệ số β₁)
Biến phụ thuộc: anxiety_binary (1 = High anxiety, 0
= khác)
Biến giải thích: gender_binary (1 = nữ, 0 = nam)
# Tạo biến nhị phân: 1 nếu High anxiety, 0 nếu còn lại
d$anxiety_binary <- ifelse(d$Anxiety.Level == "High anxiety", 1, 0)
# Chạy mô hình cloglog
model_cloglog <- glm(anxiety_binary ~ gender_binary,
data = d,
family = binomial(link = "cloglog"))
# Xem kết quả
summary(model_cloglog)
##
## Call:
## glm(formula = anxiety_binary ~ gender_binary, family = binomial(link = "cloglog"),
## data = d)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.3775 0.3781 -6.288 3.22e-10 ***
## gender_binary -1.6114 0.8019 -2.010 0.0445 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 72.268 on 187 degrees of freedom
## Residual deviance: 67.246 on 186 degrees of freedom
## AIC: 71.246
##
## Number of Fisher Scoring iterations: 7
Nhận xét
(Intercept) |
-2.3775 |
0.3781 |
-6.288 |
< 0.001 |
Hệ số chặn có ý nghĩa thống kê. |
gender_binary |
-1.6114 |
0.8019 |
-2.010 |
0.0445 |
Ý nghĩa thống kê ở mức 5% (*). |
Giải thích
Hệ số chặn (Intercept = -2.3775)
Khi \(gender\_binary = 0\) (nam),
giá trị:
\[
\eta = -2.3775
\]
Xác suất High anxiety cho nam: \[
p_{male} = 1 - e^{-e^{-2.3775}} = 1 - e^{-e^{-2.3775}} \approx 0.0848 \
(8.48\%)
\]
Kết luận: Nam giới có khoảng 8.5%
khả năng bị High anxiety.
Hệ số gender_binary (-1.6114)
Khi \(gender\_binary = 1\) (nữ), giá
trị:
\[
\eta = -2.3775 + (-1.6114) = -3.9889
\]
Xác suất High anxiety cho nữ: \[
p_{female} = 1 - e^{-e^{-3.9889}} \approx 0.0184 \ (1.84\%)
\]
Kết luận: Nữ giới có xác suất bị High anxiety chỉ
khoảng 1.84%, thấp hơn đáng kể so với nam.
Độ phù hợp của mô hình
Null deviance |
72.268 |
Sai số khi không có biến giải thích. |
Mô hình gốc kém về giải thích dữ liệu. |
Residual deviance |
67.246 |
Sai số sau khi thêm biến Gender. |
Mô hình tốt hơn khi có thêm biến Gender. |
Giảm deviance |
5.022 |
Mô hình cải thiện đáng kể. |
Gender có thể có ảnh hưởng (cần kiểm định). |
AIC |
71.246 |
Để so sánh mức phù hợp với các mô hình khác. |
Mô hình có Gender phù hợp hơn (AIC giảm). |
KẾT LUẬN TỔNG QUÁT
Biến Gender có ảnh hưởng đáng kể đến khả năng bị High anxiety(lo âu
cao). Nữ giới ít bị High anxiety hơn nam giới, theo kết quả từ mô hình
cloglog.
Đánh giá mô hình
Tiến hành đánh giá mô hình dựa trên chỉ số AIC
# Chạy các mô hình
logit_gender <- glm(anxiety_binary ~ gender_binary, data = d, family = binomial(link = "logit"))
probit_gender <- glm(anxiety_binary ~ gender_binary, data = d, family = binomial(link = "probit"))
cloglog_gender <- glm(anxiety_binary ~ gender_binary, data = d, family = binomial(link = "cloglog"))
# Tính và hiển thị AIC
cat("• AIC mô hình Logit\n")
## • AIC mô hình Logit
AIC(logit_gender)
## [1] 71.24598
# Cài gói cần thiết
if (!require(nnet)) install.packages("nnet")
library(nnet)
# Chạy mô hình logit đa biến (multinomial logistic regression)
model_multinom <- multinom(Anxiety.Level ~ gender_binary, data = d)
## # weights: 12 (6 variable)
## initial value 260.623340
## iter 10 value 217.575818
## final value 217.549503
## converged
# Tính AIC cho logit đa biến
aic_multinom <- AIC(model_multinom)
# Hiển thị kết quả
cat("\n• AIC mô hình Logit đa biến (multinomial):\n")
##
## • AIC mô hình Logit đa biến (multinomial):
print(aic_multinom)
## [1] 447.099
cat("\n• AIC mô hình xác suất Probit\n")
##
## • AIC mô hình xác suất Probit
AIC(probit_gender)
## [1] 71.24598
cat("\n• AIC mô hình Cloglog\n")
##
## • AIC mô hình Cloglog
AIC(cloglog_gender)
## [1] 71.24598
Nhận xét
Logit nhị phân |
71.246 |
Mô hình gọn nhẹ, AIC thấp do chỉ xét nhị phân (High anxiety vs còn
lại). |
Probit nhị phân |
71.246 |
AIC tương đương Logit nhị phân → mức độ phù hợp tương tự, sự khác
biệt giữa link function không đáng kể. |
Cloglog nhị phân |
71.246 |
AIC trùng với Logit và Probit nhị phân → cho thấy dữ liệu nhị phân
này ít nhạy với loại link. |
Logit đa thức (multinomial) |
447.099 |
AIC cao hơn nhiều do biến phụ thuộc có 4 mức độ (đa thức), mô hình
phức tạp hơn và giải thích chi tiết hơn. |
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSBuZ8OgeSA3LzciDQphdXRob3I6ICJOZ3V54buFbiBEaeG7hW0gUXXhu7NuaCINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0aGVtZTogImRlZmF1bHQiDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAyDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogIHdvcmRfZG9jdW1lbnQ6IA0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMg0KICBwZGZfZG9jdW1lbnQ6IA0KICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleA0KLS0tDQoNCmBgYHtyLCBlY2hvPUZBTFNFLCByZXN1bHRzPSdhc2lzJ30NCmNhdCgnPHN0eWxlPnAgeyB0ZXh0LWFsaWduOiBqdXN0aWZ5OyB9PC9zdHlsZT4nKQ0KYGBgDQoNCiMgxJDhu41jIHbDoCBsw6BtIHF1ZW4gZOG7ryBsaeG7h3UNCg0KQuG7mSBk4buvIGxp4buHdSBuw6B5IHNvIHPDoW5oIHNpbmggdmnDqm4gY2h1ecOqbiBuZ8OgbmggdGjhu5FuZyBrw6ogdOG7qyBjw6FjIHRyxrDhu51uZyDEkeG6oWkgaOG7jWMgY8O0bmcgbOG6rXAg4bufIEFua2FyYSwgVGjhu5UgTmjEqSBL4buzIOKAlCBiYW8gZ+G7k20gxJDhuqFpIGjhu41jIEhhY2V0dGVwZSwgxJDhuqFpIGjhu41jIEFua2FyYSwgxJDhuqFpIGjhu41jIEdhemkgdsOgIMSQ4bqhaSBo4buNYyBL4bu5IHRodeG6rXQgVHJ1bmcgxJDDtG5nIChNRVRVKS4NCg0KTeG7pWMgdGnDqnUgbMOgIGhp4buDdSDEkcaw4bujYyBj4bqjbSBuaOG6rW4gY+G7p2Egbmjhu69uZyBzaW5oIHZpw6puIG7DoHkgduG7gSB0w6FjIMSR4buZbmcgbmfDoHkgY8OgbmcgdMSDbmcgY+G7p2EgVHLDrSB0deG7hyBuaMOibiB04bqhbyAoQUkpIHbDoCB04buxIMSR4buZbmcgaMOzYSDEkeG7kWkgduG7m2kgdHJp4buDbiB24buNbmcgbmdo4buBIG5naGnhu4dwIHTGsMahbmcgbGFpIGPhu6dhIGjhu40uIE7DsyBjxaluZyBuw6p1IGLhuq10IHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBjw6FjIHRyxrDhu51uZyDEkeG6oWkgaOG7jWMsIGNobyB0aOG6pXkgcXVhbiDEkWnhu4NtIHbDoCBt4bupYyDEkeG7mSBxdWFuIHTDom0gY+G7p2Egc2luaCB2acOqbiB0aGF5IMSR4buVaSBuaMawIHRo4bq/IG7DoG8gdMO5eSB0aHXhu5ljIHbDoG8gbsahaSBo4buNIGjhu41jLg0KDQoqKkLDqm4gdHJvbmcgY8OzIGfDrD8qKg0KDQotIFNpbmggdmnDqm4gdOG7qyBjw6FjIHRyxrDhu51uZyDEkeG6oWkgaOG7jWMga2jDoWMgbmhhdSBuZ2jEqSBBSSBz4bq9IOG6o25oIGjGsOG7n25nIMSR4bq/biBz4buxIG5naGnhu4dwIGPhu6dhIGjhu40gbmjGsCB0aOG6vyBuw6BvIA0KDQotIFPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgbeG7qWMgxJHhu5kgbG8gbOG6r25nIHbDoCBjxINuZyB0aOG6s25nIGdp4buvYSBjw6FjIHRyxrDhu51uZyDEkeG6oWkgaOG7jWMNCg0KLSBQaMOibiB0w61jaCBHUEEgdsOgIG7Eg20gaOG7jWMgY+G7p2EgdOG7q25nIHRyxrDhu51uZw0KDQotIEtpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdWFuIMSRaeG7g20gduG7gSBBSSBuaMawIHRo4bq/IG7DoG8NCg0KIyMgIMSQ4buNYyBmaWxlDQoNCmBgYHtyfQ0KZCA8LXJlYWQuY3N2KGZpbGUuY2hvb3NlKCksIGhlYWRlcj1UKQ0KYGBgDQoNCiMjICBIaeG7g24gdGjhu4sgY+G6pXUgdHLDumMgY+G7p2EgZOG7ryBsaeG7h3UNCg0KYGBge3J9DQpzdHIoZCkNCmBgYA0KDQotIFThu4dwIG7DoHkgY2jhu6lhIGPDoWMgcGjhuqNuIGjhu5NpIGto4bqjbyBzw6F0IHThu6sgc2luaCB2acOqbiB0aOG7kW5nIGvDqiBi4bqtYyDEkeG6oWkgaOG7jWMgdOG6oWkgY8OhYyB0csaw4budbmcgxJHhuqFpIGjhu41jIGPDtG5nIGzhuq1wIGPhu6dhIEFua2FyYS4gTeG7l2kgaMOgbmcgxJHhuqFpIGRp4buHbiBjaG8gbeG7mXQgc2luaCB2acOqbiwgZ2hpIGzhuqFpIHRow7RuZyB0aW4gbmjDom4ga2jhuql1IGjhu41jLCB0csOsbmggxJHhu5kgaGnhu4N1IGJp4bq/dCB24buBIEFJLCB0cmnhu4NuIHbhu41uZyBuZ2jhu4EgbmdoaeG7h3AgdsOgIGxvIGzhuq9uZyB24buBIHThu7EgxJHhu5luZyBow7NhLiANCg0KLSBC4buZIGThu68gbGnhu4d1IGJhbyBn4buTbSAxODggcXVhbiBzw6F0IHbDoCAxOSBiaeG6v24sIHRyb25nIMSRw7MgY8OzIDE3IGJp4bq/biBsw6AgYmnhur9uIMSR4buLbmggdMOtbmgNCg0KYGBge3J9DQpsaWJyYXJ5KGtuaXRyKQ0KDQp2YXJpYWJsZV9leHBsYWluIDwtIGRhdGEuZnJhbWUoDQogIFRlbl9CaWVuID0gYygNCiAgICAiR2VuZGVyIiwgIlVuaXZlcnNpdHkiLCAiWWVhciBvZiBTdHVkeSIsICJHUEEiLCAiSW50ZXJuc2hpcCBFeHBlcmllbmNlIiwNCiAgICAiQUkgYW5kIEF1dG9tYXRpb24gS25vd2xlZGdlIExldmVsIiwgIkltcGFjdCBvZiBBSSBvbiBDYXJlZXIgUGxhbnMiLA0KICAgICJJbXBhY3Qgb2YgQUkgb24gSm9iIE9wcG9ydHVuaXRpZXMiLCAiQ29uY2VybiBMZXZlbCIsICJBbnhpZXR5IExldmVsIiwNCiAgICAiSWYgSSBTdHVkaWVkIEVuZ2luZWVyaW5nLCBJIFdvdWxkIEZlZWwgTW9yZSBSZXNpbGllbnQgdG8gQUkgSW1wYWN0cyIsDQogICAgIk1hdGggQ291cnNlcyBIZWxwIFVuZGVyc3RhbmQgQUkiLCAiU3RhdGlzdGljcyBDdXJyaWN1bHVtIEhlbHBzIEFkYXB0IiwNCiAgICAiU2F0aXNmYWN0aW9uIHdpdGggU3R1ZHlpbmcgU3RhdGlzdGljcyIsICJFZHVjYXRpb24gUHJlcGFyZXMgZm9yIEFJIEZpZWxkIiwNCiAgICAiRnV0dXJlIEZvY3VzIG9uIEFJIGFuZCBBdXRvbWF0aW9uIiwgIlJlc2VhcmNoIE9wcG9ydHVuaXRpZXMgYXQgVW5pdmVyc2l0eSIsDQogICAgIkFJIEluZmx1ZW5jZSBvbiBDaG9vc2luZyBTdGF0aXN0aWNzIiwgIkRpZmZpY3VsdGllcyBpbiBJbnRlcm5zaGlwIEludGVydmlld3MiDQogICksDQogIFlfTmdoaWEgPSBjKA0KICAgICJHaeG7m2kgdMOtbmggY+G7p2Egc2luaCB2acOqbiIsDQogICAgIlRyxrDhu51uZyDEkeG6oWkgaOG7jWMgbcOgIHNpbmggdmnDqm4gdGhlbyBo4buNYyIsDQogICAgIk7Eg20gaOG7jWMgaGnhu4duIHThuqFpIGPhu6dhIHNpbmggdmnDqm4gKDEgxJHhur9uIDQrKSIsDQogICAgIktob+G6o25nIMSRaeG7g20gdHJ1bmcgYsOsbmggaOG7jWMga+G7syAoR1BBKSIsDQogICAgIlNpbmggdmnDqm4gxJHDoyBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgaGF5IGNoxrBhIiwNCiAgICAiTeG7qWMgxJHhu5kgaGnhu4N1IGJp4bq/dCBj4bunYSBzaW5oIHZpw6puIHbhu4EgQUkgdsOgIHThu7EgxJHhu5luZyBow7NhIiwNCiAgICAiQUkgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBr4bq/IGhv4bqhY2ggbmdo4buBIG5naGnhu4dwIGtow7RuZyIsDQogICAgIuG6om5oIGjGsOG7n25nIGPhu6dhIEFJIHThu5tpIGPGoSBo4buZaSB2aeG7h2MgbMOgbSB0xrDGoW5nIGxhaSIsDQogICAgIk3hu6ljIMSR4buZIGxvIG5n4bqhaSB24buBIHTDoWMgxJHhu5luZyBj4bunYSBBSSIsDQogICAgIk3hu6ljIMSR4buZIGxvIMOidSBraGkgbmdoxKkgxJHhur9uIEFJIiwNCiAgICAiQ+G6o20gbmjhuq1uIG7hur91IGjhu41jIG5nw6BuaCBr4bu5IHRodeG6rXQgdGjDrCBz4bq9IOG7qW5nIHBow7MgdOG7kXQgaMahbiB24bubaSBBSSIsDQogICAgIlRvw6FuIGjhu41jIGPDsyBnacO6cCBoaeG7g3UgQUkga2jDtG5nIiwNCiAgICAiQ2jGsMahbmcgdHLDrG5oIHRo4buRbmcga8OqIGdpw7pwIHRow61jaCBuZ2hpIHbhu5tpIEFJIG5oxrAgdGjhur8gbsOgbyIsDQogICAgIk3hu6ljIMSR4buZIGjDoGkgbMOybmcga2hpIGjhu41jIG5nw6BuaCB0aOG7kW5nIGvDqiIsDQogICAgIkdpw6FvIGThu6VjIGhp4buHbiB04bqhaSBjw7MgY2h14bqpbiBi4buLIGNobyBsxKluaCB24buxYyBBSSBraMO0bmciLA0KICAgICJTaW5oIHZpw6puIGPDsyDEkeG7i25oIGjGsOG7m25nIHTGsMahbmcgbGFpIHbDoG8gQUkgaGF5IGtow7RuZyIsDQogICAgIlRyxrDhu51uZyBjw7MgdOG6oW8gxJFp4buBdSBraeG7h24gbmdoacOqbiBj4bupdSB24buBIEFJIGtow7RuZyIsDQogICAgIkFJIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIGNo4buNbiBo4buNYyBuZ8OgbmggdGjhu5FuZyBrw6oga2jDtG5nIiwNCiAgICAiU2luaCB2acOqbiBjw7MgZ+G6t3Aga2jDsyBraMSDbiBraGkgcGjhu49uZyB24bqlbiB0aOG7sWMgdOG6rXAga2jDtG5nIg0KICApDQopDQoNCmthYmxlKHZhcmlhYmxlX2V4cGxhaW4sIGNhcHRpb24gPSAiR2nhuqNpIHRow61jaCBjw6FjIGJp4bq/biB0cm9uZyBi4buZIGThu68gbGnhu4d1IikNCg0KDQpgYGANCg0KDQojIyAgS2nhu4NtIHRyYSBnacOhIHRy4buLIHRoaeG6v3UNCg0KYGBge3J9DQpzdW0oaXMubmEoZCkpDQoNCmBgYA0KLSBgc3VtKGlzLm5hKGQpKWA6IEtp4buDbSB0cmEgdOG7lW5nIHPhu5EgZ2nDoSB0cuG7iyBOQSB0cm9uZyB0b8OgbiBi4buZIGLhuqNuZy4NCg0KPT4gS+G6v3QgcXXhuqM6IFRyb25nIGLhu5kgZOG7ryBsaeG7h3Uga2jDtG5nIGPDsyBnacOhIHRy4buLIHRoaeG6v3UgKE5BKS4NCg0KDQojICBQaMOibiB0w61jaCBNw7QgdOG6oyBN4buZdCBz4buRIGJp4bq/biDEkeG7i25oIHTDrW5oIA0KDQojIyAqKkJp4bq/biBHZW5kZXIqKg0KDQojIyMgR2nhuqNpIHRow61jaCBiaeG6v24NCg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyBnaeG6o2kgdGjDrWNoIGPDoWMgbeG7qWMgY+G7p2EgYmnhur9uIGdlbmRlcg0KZ2VuZGVyX2xldmVscyA8LSBkYXRhLmZyYW1lKA0KICBHaWFfdHJpID0gYygiTWFsZSIsICJGZW1hbGUiKSwNCiAgWV9uZ2hpYSA9IGMoIk5hbSIsICJO4buvIikNCikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nDQprbml0cjo6a2FibGUoZ2VuZGVyX2xldmVscywgY2FwdGlvbiA9ICJHaeG6o2kgdGjDrWNoIGPDoWMgbeG7qWMgxJHhu5kgdHJvbmcgYmnhur9uIGdlbmRlciIpDQoNCmBgYA0KDQoNCiMjIyBUaOG7kW5nIGvDqiB04bqnbiBzdeG6pXQNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyBHZW5kZXINCnRzX2dlbmRlciA8LSB0YWJsZShkJEdlbmRlcikNCg0KIyBU4bqhbyBi4bqjbmcgZOG7ryBsaeG7h3UNCnRzX2dlbmRlcl9kZiA8LSBkYXRhLmZyYW1lKA0KICBHaWFfdHJpID0gbmFtZXModHNfZ2VuZGVyKSwNCiAgVGFuX3NvID0gYXMudmVjdG9yKHRzX2dlbmRlciksDQogIFR5X2xlID0gcm91bmQoKGFzLnZlY3Rvcih0c19nZW5kZXIpIC8gc3VtKHRzX2dlbmRlcikpICogMTAwLCAyKQ0KKQ0KDQojIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KdHNfZ2VuZGVyX2RmDQoNCg0KYGBgDQotIFThu7cgbOG7hyBu4buvIChGZW1hbGUpIGNoaeG6v20gZ+G6p24gNTglIHThu5VuZyBz4buRIHNpbmggdmnDqm4gdGhhbSBnaWEga2jhuqNvIHPDoXQsIGNhbyBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5hbSAoTWFsZSkgbMOgIDQyJS4NCg0KLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBu4buvIGdp4bubaSBjaGnhur9tIMSRYSBz4buRIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IG7DoHkuDQoNCi0gVmnhu4djIGPDsyB04bu3IGzhu4cgbuG7ryBjYW8gaMahbiBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGvhur90IHF14bqjIHBow6JuIHTDrWNoIG7hur91IGPDoWMgxJHhurdjIMSRaeG7g20gdGjDoWkgxJHhu5kgaG/hurdjIG5o4bqtbiB0aOG7qWMgduG7gSBBSSBraMOhYyBiaeG7h3QgZ2nhu69hIG5hbSB2w6AgbuG7ry4NCg0KIyMjIFRy4buxYyBxdWFuIGjDs2ENCg0KYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgY2hvIGJp4bq/biBHZW5kZXINCmdncGxvdCh0c19nZW5kZXJfZGYsIGFlcyh4ID0gcmVvcmRlcihHaWFfdHJpLCAtVGFuX3NvKSwgeSA9IFRhbl9zbywgZmlsbCA9IEdpYV90cmkpKSArDQogIGdlb21fY29sKGNvbG9yID0gIndoaXRlIiwgd2lkdGggPSAwLjcpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFRhbl9zbyksDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIHNpemUgPSA0LCBmb250ZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0OiBQaMOibiBi4buRIGdp4bubaSB0w61uaCAoR2VuZGVyKSIsDQogICAgeCA9ICJHaeG7m2kgdMOtbmgiLA0KICAgIHkgPSAiVOG6p24gc+G7kSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTIpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCB2anVzdCA9IDAuNSkNCiAgKQ0KDQoNCmBgYA0KDQojIyAqKkJp4bq/biBJbnRlcnNoaXAqKg0KDQojIyMgR2nhuqNpIHRow61jaCBiaeG6v24NCg0KYGBge3J9DQojIEdp4bqjaSB0aMOtY2ggY8OhYyBt4bupYyBj4bunYSBiaeG6v24gSW50ZXJuc2hpcCBFeHBlcmllbmNlDQppbnRlcm5zaGlwX2xldmVscyA8LSBkYXRhLmZyYW1lKA0KICBHaWFfdHJpID0gYygiWWVzIiwgIk5vIiksDQogIFlfbmdoaWEgPSBjKCLEkMOjIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCIsICJDaMawYSBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAiKQ0KKQ0KDQprbml0cjo6a2FibGUoaW50ZXJuc2hpcF9sZXZlbHMsIGNhcHRpb24gPSAiR2nhuqNpIHRow61jaCBjw6FjIG3hu6ljIHRyb25nIGJp4bq/biBJbnRlcm5zaGlwIEV4cGVyaWVuY2UiKQ0KDQoNCmBgYA0KDQojIyMgVGjhu5FuZyBrw6ogVOG6p24gc3XhuqV0DQpgYGB7cn0NCiMgVOG6oW8gYuG6o25nIHThuqduIHN14bqldCBjaG8gSW50ZXJuc2hpcCBFeHBlcmllbmNlDQp0c19pbnRlcm4gPC0gdGFibGUoZCRJbnRlcm5zaGlwLkV4cGVyaWVuY2UpDQoNCiMgVOG6oW8gYuG6o25nIGThu68gbGnhu4d1DQp0c19pbnRlcm5fZGYgPC0gZGF0YS5mcmFtZSgNCiAgR2lhX3RyaSA9IG5hbWVzKHRzX2ludGVybiksDQogIFRhbl9zbyA9IGFzLnZlY3Rvcih0c19pbnRlcm4pLA0KICBUeV9sZSA9IHJvdW5kKChhcy52ZWN0b3IodHNfaW50ZXJuKSAvIHN1bSh0c19pbnRlcm4pKSAqIDEwMCwgMikNCikNCg0KIyBIaeG7g24gdGjhu4sga+G6v3QgcXXhuqMNCnRzX2ludGVybl9kZg0KDQoNCmBgYA0KDQotIDYzLjgzJSBzaW5oIHZpw6puIGNoxrBhIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCwgY2hp4bq/bSB04bu3IGzhu4cgxJFhIHPhu5EgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQuDQoNCi0gQ2jhu4kgY8OzIDM2LjE3JSBzaW5oIHZpw6puIMSRw6MgdOG7q25nIHRoYW0gZ2lhIHRo4buxYyB04bqtcC4NCg0KLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgY8ahIGjhu5lpIHRo4buxYyB04bqtcCBjw7JuIGjhuqFuIGNo4bq/IGhv4bq3YyBzaW5oIHZpw6puIGNoxrBhIGNo4bunIMSR4buZbmcgdMOsbSBraeG6v20gY8ahIGjhu5lpIHRo4buxYyB04bqtcC4NCg0KLSDEkMOieSBjw7MgdGjhu4MgbMOgIG3hu5l0IHnhur91IHThu5EgcXVhbiB0cuG7jW5nIOG6o25oIGjGsOG7n25nIMSR4bq/biBz4buxIHThu7EgdGluIG5naOG7gSBuZ2hp4buHcCBob+G6t2MgbeG7qWMgxJHhu5kgY2h14bqpbiBi4buLIHRyxrDhu5tjIHTDoWMgxJHhu5luZyBj4bunYSBBSS4NCg0KIyMjIFRy4buxYyBxdWFuIGjDs2ENCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpnZ3Bsb3QodHNfaW50ZXJuX2RmLCBhZXMoeCA9IHJlb3JkZXIoR2lhX3RyaSwgLVRhbl9zbyksIHkgPSBUYW5fc28sIGZpbGwgPSBHaWFfdHJpKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDAuNSwgY29sb3IgPSAid2hpdGUiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBUYW5fc28pLCB2anVzdCA9IC0wLjMsIHNpemUgPSA0LCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdDogS2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgKEludGVybnNoaXAgRXhwZXJpZW5jZSkiLA0KICAgIHggPSAiS2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAiLA0KICAgIHkgPSAiVOG6p24gc+G7kSINCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAwLCBoanVzdCA9IDAuNSkgIA0KICApDQoNCg0KYGBgDQoNCiMjICoqQmnhur9uIENvbmNlcm4gTGV2ZWwqKg0KDQojIyMgR2nhuqNpIHRow61jaCBiaeG6v24NCg0KYGBge3J9DQojIEdp4bqjaSB0aMOtY2ggY8OhYyBt4bupYyBj4bunYSBiaeG6v24gQ29uY2VybiBMZXZlbA0KY29uY2Vybl9sZXZlbHMgPC0gZGF0YS5mcmFtZSgNCiAgR2lhX3RyaSA9IGMoIk5vdCBjb25jZXJuZWQiLCAiU2xpZ2h0bHkgY29uY2VybmVkIiwgIk1vZGVyYXRlbHkgY29uY2VybmVkIiwgIkhpZ2hseSBjb25jZXJuZWQiKSwNCiAgWV9uZ2hpYSA9IGMoDQogICAgIktow7RuZyBsbyBuZ+G6oWkiLA0KICAgICJIxqFpIGxvIG5n4bqhaSIsDQogICAgIkxvIG5n4bqhaSB24burYSBwaOG6o2kiLA0KICAgICJS4bqldCBsbyBuZ+G6oWkiDQogICkNCikNCg0Ka25pdHI6OmthYmxlKGNvbmNlcm5fbGV2ZWxzLCBjYXB0aW9uID0gIkdp4bqjaSB0aMOtY2ggY8OhYyBt4bupYyB0cm9uZyBiaeG6v24gQ29uY2VybiBMZXZlbCIpDQoNCmBgYA0KDQoNCiMjIyBUaOG7kW5nIGvDqiBU4bqnbiBzdeG6pXQNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyBDb25jZXJuIExldmVsDQp0c19jb25jZXJuIDwtIHRhYmxlKGQkQ29uY2Vybi5MZXZlbCkNCg0KIyBU4bqhbyBi4bqjbmcgZOG7ryBsaeG7h3UNCnRzX2NvbmNlcm5fZGYgPC0gZGF0YS5mcmFtZSgNCiAgR2lhX3RyaSA9IG5hbWVzKHRzX2NvbmNlcm4pLA0KICBUYW5fc28gPSBhcy52ZWN0b3IodHNfY29uY2VybiksDQogIFR5X2xlID0gcm91bmQoKGFzLnZlY3Rvcih0c19jb25jZXJuKSAvIHN1bSh0c19jb25jZXJuKSkgKiAxMDAsIDIpDQopDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjDQp0c19jb25jZXJuX2RmDQoNCmBgYA0KDQotIFBo4bqnbiBs4bubbiBzaW5oIHZpw6puICg0NS4yMSUpIGNo4buJIGjGoWkgbG8gbmfhuqFpIChzbGlnaHRseSBjb25jZXJuZWQpIHbhu4EgdMOhYyDEkeG7mW5nIGPhu6dhIEFJLg0KDQotIDM3LjIzJSBraMO0bmcgbG8gbmfhuqFpLCBjaG8gdGjhuqV5IGfhuqduIDgyLjQ0JSBzaW5oIHZpw6puICh04buVbmcgY+G7p2EgaGFpIG3hu6ljIHRyw6puKSBjw7MgbeG7qWMgbG8gbmfhuqFpIHRo4bqlcCBob+G6t2Mga2jDtG5nIGPDsy4NCg0KLSBDaOG7iSAyLjEzJSBzaW5oIHZpw6puIHRo4buxYyBz4buxIGxvIG5n4bqhaSDhu58gbeG7qWMgY2FvIChoaWdobHkgY29uY2VybmVkKS4NCg0KLSDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgQUkgaGnhu4duIHThuqFpIGNoxrBhIHBo4bqjaSBsw6AgbeG7kWkgcXVhbiB0w6JtIGPhuqVwIGLDoWNoIHbhu5tpIMSRYSBz4buRIHNpbmggdmnDqm4gdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQuDQoNCi0gVHV5IG5oacOqbiwgdOG7tyBs4buHIDE1LjQzJSAibW9kZXJhdGVseSBjb25jZXJuZWQiIGPFqW5nIMSRw6FuZyBjaMO6IMO9LCB2w6wgbsOzIHBo4bqjbiDDoW5oIG5ow7NtIGLhuq90IMSR4bqndSBuaOG6rW4gdGjhu6ljIHLDtSBoxqFuIHbhu4EgdMOhYyDEkeG7mW5nIHRp4buBbSB0w6BuZyBj4bunYSBBSQ0KDQojIyMgVHLhu7FjIHF1YW4gaMOzYQ0KYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCmdncGxvdCh0c19jb25jZXJuX2RmLCBhZXMoeCA9IHJlb3JkZXIoR2lhX3RyaSwgLVRhbl9zbyksIHkgPSBUYW5fc28sIGZpbGwgPSBHaWFfdHJpKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDAuNSwgY29sb3IgPSAid2hpdGUiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBUYW5fc28pLCB2anVzdCA9IC0wLjMsIHNpemUgPSA0LCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdDogTeG7qWMgxJHhu5kgbG8gbmfhuqFpIHbhu4EgQUkgKENvbmNlcm4gTGV2ZWwpIiwNCiAgICB4ID0gIk3hu6ljIMSR4buZIGxvIG5n4bqhaSIsDQogICAgeSA9ICJU4bqnbiBz4buRIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDIwLCBoanVzdCA9IDEpDQogICkNCg0KYGBgDQoNCg0KIyMgKipCaeG6v24gUmVzZWFyY2ggT3Bwb3J0dW5pdGllcyBhdCBVbml2ZXJzaXR5KioNCg0KIyMjIEdp4bqjaSB0aMOtY2ggYmnhur9uDQoNCmBgYHtyIH0NCiMgR2nhuqNpIHRow61jaCBjw6FjIG3hu6ljIGPhu6dhIGJp4bq/biBSZXNlYXJjaCBPcHBvcnR1bml0aWVzIGF0IFVuaXZlcnNpdHkNCnJlc2VhcmNoX2xldmVscyA8LSBkYXRhLmZyYW1lKA0KICBHaWFfdHJpID0gYygiWWVzIiwgIk5vIiksDQogIFlfbmdoaWEgPSBjKA0KICAgICJUcsaw4budbmcgY8OzIHThuqFvIMSRaeG7gXUga2nhu4duIGNobyBuZ2hpw6puIGPhu6l1IGxpw6puIHF1YW4gxJHhur9uIEFJIiwNCiAgICAiVHLGsOG7nW5nIGtow7RuZyB04bqhbyDEkWnhu4F1IGtp4buHbiBob+G6t2Mga2jDtG5nIGPDsyBob+G6oXQgxJHhu5luZyBuZ2hpw6puIGPhu6l1IHbhu4EgQUkiDQogICkNCikNCg0Ka25pdHI6OmthYmxlKHJlc2VhcmNoX2xldmVscywgY2FwdGlvbiA9ICJHaeG6o2kgdGjDrWNoIGPDoWMgbeG7qWMgdHJvbmcgYmnhur9uIFJlc2VhcmNoIE9wcG9ydHVuaXRpZXMgYXQgVW5pdmVyc2l0eSIpDQoNCmBgYA0KDQojIyMgVGjhu5FuZyBrw6ogVOG6p24gc3XhuqV0IA0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIFJlc2VhcmNoIE9wcG9ydHVuaXRpZXMgYXQgVW5pdmVyc2l0eQ0KdHNfcmVzZWFyY2ggPC0gdGFibGUoZCRSZXNlYXJjaC5PcHBvcnR1bml0aWVzLmF0LlVuaXZlcnNpdHkpDQoNCiMgVOG6oW8gYuG6o25nIGThu68gbGnhu4d1DQp0c19yZXNlYXJjaF9kZiA8LSBkYXRhLmZyYW1lKA0KICBHaWFfdHJpID0gbmFtZXModHNfcmVzZWFyY2gpLA0KICBUYW5fc28gPSBhcy52ZWN0b3IodHNfcmVzZWFyY2gpLA0KICBUeV9sZSA9IHJvdW5kKChhcy52ZWN0b3IodHNfcmVzZWFyY2gpIC8gc3VtKHRzX3Jlc2VhcmNoKSkgKiAxMDAsIDIpDQopDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjDQp0c19yZXNlYXJjaF9kZg0KDQoNCmBgYA0KDQotIEPDsyA1NS44NSUgc2luaCB2acOqbiBjaG8gcuG6sW5nIHRyxrDhu51uZyBj4bunYSBo4buNIGtow7RuZyB04bqhbyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1IHbhu4EgQUksIGNhbyBoxqFuIHNvIHbhu5tpIG5ow7NtIGPDsm4gbOG6oWkuDQoNCi0gQ2jhu4kgNDQuMTUlIHNpbmggdmnDqm4gY+G6o20gbmjhuq1uIMSRxrDhu6NjIHLhurFuZyB0csaw4budbmcgY8OzIGjhu5cgdHLhu6MgbmdoacOqbiBj4bupdSB24buBIEFJLg0KDQotIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCBy4bqxbmcgbmhp4buBdSB0csaw4budbmcgxJHhuqFpIGjhu41jIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IGNoxrBhIGPDsyBob+G6oXQgxJHhu5luZyBuZ2hpw6puIGPhu6l1IEFJIG7hu5VpIGLhuq10IGhv4bq3YyBzaW5oIHZpw6puIGNoxrBhIMSRxrDhu6NjIHRp4bq/cCBj4bqtbiByw7UgcsOgbmcgduG7m2kgY8OhYyBjxqEgaOG7mWkgxJHDsy4NCg0KIyMjIFRy4buxYyBxdWFuIGjDs2ENCg0KYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9DQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgY2hvIGJp4bq/biBSZXNlYXJjaCBPcHBvcnR1bml0aWVzIGF0IFVuaXZlcnNpdHkNCmdncGxvdCh0c19yZXNlYXJjaF9kZiwgYWVzKHggPSByZW9yZGVyKEdpYV90cmksIC1UYW5fc28pLCB5ID0gVGFuX3NvLCBmaWxsID0gR2lhX3RyaSkpICsNCiAgZ2VvbV9jb2wod2lkdGggPSAwLjUsIGNvbG9yID0gIndoaXRlIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gVGFuX3NvKSwgdmp1c3QgPSAtMC4zLCBzaXplID0gNCwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQ6IFRyxrDhu51uZyBjw7MgdOG6oW8gxJFp4buBdSBraeG7h24gbmdoacOqbiBj4bupdSB24buBIEFJIiwNCiAgICB4ID0gIkPDsyB04bqhbyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1PyIsDQogICAgeSA9ICJU4bqnbiBz4buRIg0KICApICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykgKw0KICB0aGVtZSgNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBmYWNlID0gImJvbGQiKSwNCiAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDAsIGhqdXN0ID0gMC41KQ0KICApDQoNCmBgYA0KDQojIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cNCg0KIyMgWMOhYyDEkeG7i25oIGjhuqFuZyBt4bulYyBxdWFuIHTDom0NCg0KVGEgY2jhu41uIDIgaOG6oW5nIG3hu6VjIHThu6sgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaDoNCg0KLSBI4bqhbmcgbeG7pWMgKk1hbGUqIGPhu6dhIGJp4bq/biAqR2VuZGVyKiAtIEdp4bubaSB0w61uaA0KDQotIEjhuqFuZyBt4bulYyAqSGlnaGx5IGNvbmNlcm5lZCogY+G7p2EgYmnhur9uICpDb25jZXJuIExldmVsKiAtIE3hu6ljIMSR4buZIGxvIG5n4bqhaSB24buBIEFJIA0KDQojIyBI4bqhbmcgbeG7pWMgTWFsZQ0KDQpUYSB0aOG7sWMgaGnhu4duIGtob+G6o25nIMaw4bubYyBsxrDhu6NuZyB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgZ2nhu5tpIHTDrW5oIG5hbSAoR2VuZGVyPeKAnE1hbGXigJ0pLCB0YSB0aOG7sWMgaGnhu4duIG5oxrAgc2F1Og0KDQpgYGB7cn0NCiMgxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyBuYW0gdsOgIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgZA0KDQojIELGsOG7m2MgMTogxJDhur9tIHPhu5EgbMaw4bujbmcgbmFtIGdp4bubaSB0cm9uZyBk4buvIGxp4buHdQ0Kc29fbHVvbmdfbmFtIDwtIHN1bShkJEdlbmRlciA9PSAiTWFsZSIsIG5hLnJtID0gVFJVRSkNCg0KIyBCxrDhu5tjIDI6IFjDoWMgxJHhu4tuaCB04buVbmcgc+G7kSBxdWFuIHPDoXQgaOG7o3AgbOG7hw0KdG9uZ19zb19xdWFuX3NhdCA8LSBzdW0oIWlzLm5hKGQkR2VuZGVyKSkNCg0KIyBCxrDhu5tjIDM6IMav4bubYyBsxrDhu6NuZyBraG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbmFtDQprcV90eWxlX25hbSA8LSBwcm9wLnRlc3Qoc29fbHVvbmdfbmFtLCB0b25nX3NvX3F1YW5fc2F0LCBjb25mLmxldmVsID0gMC45NSkNCg0KIyBIaeG7g24gdGjhu4sga+G6v3QgcXXhuqMNCnByaW50KGtxX3R5bGVfbmFtKQ0KYGBgDQoqKktp4buDbSDEkeG7i25oIHThu7cgbOG7hyBt4buZdCBt4bqrdTogVOG7tyBs4buHIG5hbSBnaeG7m2kgdHJvbmcgZOG7ryBsaeG7h3UqKg0KDQpUcm9uZyBuZ2hpw6puIGPhu6l1IG7DoHksIGNow7puZyB0w7RpIHRp4bq/biBow6BuaCBraeG7g20gxJHhu4tuaCB04bu3IGzhu4cgbeG7mXQgbeG6q3UgxJHhu4MgxJHDoW5oIGdpw6EgbGnhu4d1IHThu7cgbOG7hyBuYW0gZ2nhu5tpIHRyb25nIHThu5VuZyB0aOG7gyBjw7Mga2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIHNvIHbhu5tpIG3hu6ljIGdp4bqjIMSR4buLbmggNTAlIGhheSBraMO0bmcuIMSQw6J5IGzDoCBt4buZdCBwaMOibiB0w61jaCBxdWFuIHRy4buNbmcgbmjhurFtIGtp4buDbSB0cmEgc+G7sSBjw6JuIGLhurFuZyBnaeG7m2kgdMOtbmggdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3Uga2jhuqNvIHPDoXQuDQoNCi0gR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgNCg0KVGEgdGhp4bq/dCBs4bqtcCBnaeG6oyB0aHV54bq/dCBuaMawIHNhdToNCg0KJCQNClxiZWdpbntjYXNlc30NCkhfMDogcCA9IDAuNSAmIFx0ZXh0eyh04bu3IGzhu4cgbmFtIHRyb25nIHThu5VuZyB0aOG7gyBsw6AgNTBcJSl9IFxcDQpIXzE6IHAgXG5lcSAwLjUgJiBcdGV4dHsodOG7tyBs4buHIG5hbSB0cm9uZyB04buVbmcgdGjhu4Mga2jDoWMgNTBcJSl9DQpcZW5ke2Nhc2VzfQ0KJCQNCg0KTeG7qWMgw70gbmdoxKlhIMSRxrDhu6NjIGNo4buNbiBsw6AgJFxhbHBoYSA9IDAuMDUkLg0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oKioNCg0KU+G7rSBk4bulbmcgaMOgbSBgcHJvcC50ZXN0KClgIHRyb25nIFIgxJHhu4Mga2nhu4NtIMSR4buLbmggdOG7tyBs4buHLCBjaMO6bmcgdMO0aSB0aHUgxJHGsOG7o2MgY8OhYyBr4bq/dCBxdeG6oyBzYXU6DQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaDogJFxjaGleMiA9IDQuNDczNCQNCi0gQuG6rWMgdOG7sSBkbzogJGRmID0gMSQNCi0gR2nDoSB0cuG7iyBwOiAkcCA9IDAuMDM0NDMkDQotIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgbeG6q3U6ICRcaGF0e3B9ID0gMC40MjAkDQotIEtob+G6o25nIHRpbiBj4bqteSA5NVwlIGNobyB04bu3IGzhu4cgbmFtOiAkWzAuMzQ5LCAwLjQ5NF0kDQoNCioqRGnhu4VuIGdp4bqjaSB0aOG7kW5nIGvDqioqDQoNCkdpw6EgdHLhu4sgcCBuaOG7jyBoxqFuIG3hu6ljIMO9IG5naMSpYSA1XCUgKCRwID0gMC4wMzQ0MyA8IDAuMDUkKSwgZG8gxJHDsyBjaMO6bmcgdGEgKipiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQqKi4gTsOzaSBjw6FjaCBraMOhYywgKipjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyB04bu3IGzhu4cgbmFtIGdp4bubaSB0cm9uZyB04buVbmcgdGjhu4Mga2jDoWMgduG7m2kgNTBcJSoqIHThuqFpIG3hu6ljIMO9IG5naMSpYSA1XCUuDQoNCktob+G6o25nIHRpbiBj4bqteSA5NVwlIGNobyB04bu3IGzhu4cgbmFtIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgKiozNC45XCUgxJHhur9uIDQ5LjRcJSoqLCBraMO0bmcgYmFvIGfhu5NtIGdpw6EgdHLhu4sgNTBcJSwgxJFp4buBdSBuw6B5IGPDoG5nIGPhu6duZyBj4buRIGvhur90IGx14bqtbiBy4bqxbmcgdOG7tyBs4buHIG5hbSBraMOhYyB24bubaSBt4bupYyBjw6JuIGLhurFuZyBnaeG7m2kgdMOtbmguDQoNClThu7cgbOG7hyBt4bqrdSBxdWFuIHPDoXQgxJHGsOG7o2MgbMOgICoqNDIuMFwlKiosIG5naMSpYSBsw6AgdHJvbmcgdOG7lW5nIHPhu5EgcXVhbiBzw6F0LCBjaOG7iSBjw7MgNDJcJSBsw6AgbmFtIGdp4bubaS4gxJDDonkgbMOgIG3hu5l0IHPhu7EgbOG7h2NoIMSRw6FuZyBr4buDIHNvIHbhu5tpIHThu7cgbOG7hyBsw70gdMaw4bufbmcgNTBcJS4NCg0KKipOaOG6rW4geMOpdCB2w6Agw70gbmdoxKlhIHRo4buxYyB0aeG7hW4qKg0KDQpL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IG5hbSBnaeG7m2kgY2hp4bq/bSB04bu3IGzhu4cgKip0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBu4buvIGdp4bubaSoqIHRyb25nIHThuq1wIGThu68gbGnhu4d1LiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIHBo4bqjbiDDoW5oOg0KDQotIFRo4buxYyB04bq/IGPhuqV1IHRyw7pjIGdp4bubaSB0w61uaCB0cm9uZyBuaMOzbSBraMOhY2ggaMOgbmcvxJHhu5FpIHTGsOG7o25nIG5naGnDqm4gY+G7qXUuDQotIEhv4bq3YyBzYWkgbOG7h2NoIHRyb25nIHRoaeG6v3Qga+G6vyBob+G6t2MgdGh1IHRo4bqtcCBt4bqrdSAodsOtIGThu6U6IGto4bqjbyBzw6F0IGtow7RuZyBjw6JuIGLhurFuZywgY2jhu4kgdGjhu7FjIGhp4buHbiDhu58gxJHhu4thIMSRaeG7g20gY8OzIG5oaeG7gXUgbuG7ryBoxqFuKS4NCg0KVHJvbmcgYuG7kWkgY+G6o25oIGtpbmggZG9hbmgsIG7hur91IMSRw6J5IGzDoCBk4buvIGxp4buHdSB04burIGtow6FjaCBow6BuZywgdGjDrCDEkWnhu4F1IG7DoHkgaMOgbSDDvSBy4bqxbmcgKipu4buvIGdp4bubaSDEkWFuZyBsw6AgbmjDs20ga2jDoWNoIGjDoG5nIGNoaeG6v20gxrB1IHRo4bq/KiosIHbDoCBkb2FuaCBuZ2hp4buHcCBuw6puIGPDom4gbmjhuq9jIMSRaeG7gXUgY2jhu4luaCBjaGnhur9uIGzGsOG7o2MgdGnhur9wIHRo4buLLCBxdeG6o25nIGLDoSwgaG/hurdjIHBow6F0IHRyaeG7g24gc+G6o24gcGjhuqltIHBow7kgaOG7o3AgduG7m2kgbmh1IGPhuqd1IHbDoCBow6BuaCB2aSB0acOqdSBkw7luZyBj4bunYSBuaMOzbSBuw6B5Lg0KDQoqKkvhur90IGx14bqtbioqDQoNClbhu5tpIHAtdmFsdWUgbmjhu48gaMahbiAwLjA1LCB0YSBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyB04bu3IGzhu4cgbmFtIHRyb25nIG3huqt1IGto4bqjbyBzw6F0ICoqa2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKiBzbyB24bubaSB04bu3IGzhu4cgZ2nhuqMgxJHhu4tuaCA1MFwlLiDEkGnhu4F1IG7DoHkgY+G6p24gxJHGsOG7o2MgeGVtIHjDqXQga2hpIMSRw6FuaCBnacOhIHTDrW5oIMSR4bqhaSBkaeG7h24gY+G7p2EgbeG6q3UsIGhv4bq3YyDEkcawYSByYSBjw6FjIHF1eeG6v3QgxJHhu4tuaCB0cm9uZyBuZ2hpw6puIGPhu6l1IHRo4buLIHRyxrDhu51uZywgeMOjIGjhu5lpIGjhu41jLCBob+G6t2MgcXXhuqNuIHRy4buLIGThu68gbGnhu4d1Lg0KDQojIyBI4bqhbmcgbeG7pWMgSGlnaGx5IGNvbmNlcm5lZA0KDQpgYGB7cn0NCiMgU+G7kSBuZ8aw4budaSBjw7MgbeG7qWMgxJHhu5kgIkhpZ2hseSBjb25jZXJuZWQiDQpuX2hpZ2hfY29uY2VybiA8LSA0DQoNCiMgVOG7lW5nIHPhu5EgcXVhbiBzw6F0IGjhu6NwIGzhu4cNCm5fdG90YWwgPC0gMTg4DQoNCiMgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyAiSGlnaGx5IGNvbmNlcm5lZCINCnByb3AudGVzdChuX2hpZ2hfY29uY2Vybiwgbl90b3RhbCwgY29uZi5sZXZlbCA9IDAuOTUpDQoNCg0KYGBgDQoNCioqS2nhu4NtIMSR4buLbmggdOG7tyBs4buHIG3hu5l0IG3huqt1OiBU4bu3IGzhu4cgbeG7kWkgcXVhbiB0w6JtIGNhbyoqDQoNClRyb25nIG5naGnDqm4gY+G7qXUgbsOgeSwgY2jDum5nIHTDtGkgdGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCB04bu3IGzhu4cgbeG7mXQgbeG6q3UgxJHhu4MgxJHDoW5oIGdpw6EgbGnhu4d1IHThu7cgbOG7hyBjw6FjIHRyxrDhu51uZyBo4bujcCDEkcaw4bujYyB4w6FjIMSR4buLbmggbMOgICJjw7MgbeG7kWkgcXVhbiB0w6JtIGNhbyIgKGhpZ2ggY29uY2VybikgY8OzIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyBzbyB24bubaSB04bu3IGzhu4cgZ2nhuqMgxJHhu4tuaCA1MCUgaGF5IGtow7RuZy4NCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaCoqDQoNCkNow7puZyB0w7RpIHRoaeG6v3QgbOG6rXAgZ2nhuqMgdGh1eeG6v3QgbmjGsCBzYXU6DQoNCiQkDQpcYmVnaW57Y2FzZXN9DQpIXzA6IHAgPSAwLjUgJiBcdGV4dHsodOG7tyBs4buHIG3hu5FpIHF1YW4gdMOibSBjYW8gbMOgIDUwXCUpfSBcXA0KSF8xOiBwIFxuZXEgMC41ICYgXHRleHR7KHThu7cgbOG7hyBt4buRaSBxdWFuIHTDom0gY2FvIGtow6FjIDUwXCUpfQ0KXGVuZHtjYXNlc30NCiQkDQoNCk3hu6ljIMO9IG5naMSpYSDEkcaw4bujYyBjaOG7jW4gbMOgICRcYWxwaGEgPSAwLjA1JC4NCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCoqDQoNClPhu60gZOG7pW5nIGjDoG0gYHByb3AudGVzdCgpYCB0cm9uZyBSIMSR4buDIGtp4buDbSDEkeG7i25oLCBjaMO6bmcgdMO0aSB0aHUgxJHGsOG7o2MgY8OhYyBr4bq/dCBxdeG6oyBzYXU6DQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaDogJFxjaGleMiA9IDE3MC40MyQNCi0gQuG6rWMgdOG7sSBkbzogJGRmID0gMSQNCi0gR2nDoSB0cuG7iyBwOiAkcCA8IDIuMiBcdGltZXMgMTBeey0xNn0kDQotIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgbeG6q3U6ICRcaGF0e3B9ID0gMC4wMjEyOCQNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1XCU6ICRbMC4wMDY4NCwgMC4wNTcxMV0kDQoNCioqRGnhu4VuIGdp4bqjaSB0aOG7kW5nIGvDqioqDQoNCkdpw6EgdHLhu4sgcCBj4buxYyBr4buzIG5o4buPIHbDoCBuaOG7jyBoxqFuIHLhuqV0IG5oaeG7gXUgc28gduG7m2kgbeG7qWMgw70gbmdoxKlhIDVcJSAoJHAgPCAwLjA1JCksIGRvIMSRw7MgY2jDum5nIHRhICoqYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkKiouIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5ICoqdOG7tyBs4buHIG3hu5FpIHF1YW4gdMOibSBjYW8ga2jDoWMgxJHDoW5nIGvhu4Mgc28gduG7m2kgNTBcJSoqLg0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTVcJSBjaG8gdOG7tyBs4buHIG3hu5FpIHF1YW4gdMOibSBjYW8gbuG6sW0gdHJvbmcga2hv4bqjbmcgdOG7qyAqKjAuNjhcJSDEkeG6v24gNS43MVwlKiosICoqa2jDtG5nIGJhbyBn4buTbSA1MFwlKiosIGPDoG5nIGPhu6duZyBj4buRIGvhur90IGx14bqtbiB24buBIHPhu7Ega2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNClThu7cgbOG7hyBxdWFuIHPDoXQgxJHGsOG7o2MgbMOgICoqMi4xM1wlKiosIGNobyB0aOG6pXkgY2jhu4kgY8OzIG3hu5l0IHBo4bqnbiBy4bqldCBuaOG7jyBjw6EgbmjDom4gxJHGsOG7o2MgeMOhYyDEkeG7i25oIGzDoCBjw7MgbeG7kWkgcXVhbiB0w6JtIGNhbywgdGjhuqVwIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgdOG7tyBs4buHIGdp4bqjIMSR4buLbmggY8OibiBi4bqxbmcgNTBcJS4NCg0KKipOaOG6rW4geMOpdCB2w6Agw70gbmdoxKlhIHRo4buxYyB0aeG7hW4qKg0KDQpL4bq/dCBxdeG6oyBuw6B5IGNobyB0aOG6pXkgcuG6sW5nICoqbeG7kWkgcXVhbiB0w6JtIGNhbyBsw6AgaGnhu4duIHTGsOG7o25nIGhp4bq/bSB0cm9uZyB04buVbmcgdGjhu4MqKi4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaDoNCg0KLSBU4bu3IGzhu4cgdGjhu7FjIHPhu7EgdGjhuqVwIGPhu6dhIGhp4buHbiB0xrDhu6NuZyBj4bqnbiBxdWFuIHPDoXQgdHJvbmcgcXXhuqduIHRo4buDLg0KLSBD4bqnbiDEkWnhu4F1IGNo4buJbmggdGhp4bq/dCBr4bq/IG5naGnDqm4gY+G7qXUgbuG6v3UgbeG7pWMgdGnDqnUgbMOgIGto4bqjbyBzw6F0IHPDonUgdsOgbyBuaMOzbSBjw7MgbeG7kWkgcXVhbiB0w6JtIGNhbyAoY8OzIHRo4buDIGPDom4gbmjhuq9jIHBoxrDGoW5nIHBow6FwIGzhuqV5IG3huqt1IHBow6JuIHThuqduZykuDQoNCioqS+G6v3QgbHXhuq1uKioNCg0KVuG7m2kgKipwLXZhbHVlIDwgMC4wNSoqLCBjaMO6bmcgdMO0aSBr4bq/dCBsdeG6rW4gcuG6sW5nICoqdOG7tyBs4buHIG3hu5FpIHF1YW4gdMOibSBjYW8ga2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKiBzbyB24bubaSBnaeG6oyDEkeG7i25oIDUwXCUuIFZp4buHYyBoaeG7g3UgcsO1IHThu7cgbOG7hyBuw6B5IGdpw7pwIMSRxrBhIHJhIGPDoWMgcXV54bq/dCDEkeG7i25oIHBow7kgaOG7o3AgdHJvbmcgdGhp4bq/dCBr4bq/IG5naGnDqm4gY+G7qXUsIHBow6JuIHTDrWNoIGNoaeG6v24gbMaw4bujYywgaG/hurdjIGzhuq1wIGvhur8gaG/huqFjaCBjYW4gdGhp4buHcC4NCg0KIyBQaMOibiB0w61jaCBN4buRaSBxdWFuIGjhu4cgZ2nhu69hIEhhaSBiaeG6v24gxJDhu4tuaCB0w61uaCAoQml2YXJpYXRlIEFuYWx5c2lzKQ0KDQpCaeG6v24gcGjhu6UgdGh14buZYzogSW50ZXJuc2hpcCBFeHBlcmllbmNlIHbDoCBDb25jZXJuIExldmVsDQoNCiMjIEPhurdwIDE6IEdlbmRlciDDlyBJbnRlcm5zaGlwIEV4cGVyaWVuY2UNCg0KQ8OidSBo4buPaTogTmFtIHbDoCBu4buvIGPDsyBraMOhYyBiaeG7h3QgdHJvbmcgdOG7tyBs4buHIMSRw6MgdOG7q25nIMSRaSB0aOG7sWMgdOG6rXAga2jDtG5nPw0KDQpN4bulYyB0acOqdTogS2nhu4NtIHRyYSBz4buxIHBow6JuIGLhu5Ega2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgdGhlbyBnaeG7m2kgdMOtbmguDQoNCg0KIyMjICBC4bqjbmcgdOG6p24gc+G7kSBjaMOpbw0KYGBge3J9DQojIELhuqNuZyB04bqnbiBz4buRIGNow6lvOiBHaeG7m2kgdMOtbmggdsOgIEtpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wDQp0YWJsZV9nZW5kZXJfaW50ZXJuIDwtIHRhYmxlKGQkR2VuZGVyLCBkJEludGVybnNoaXAuRXhwZXJpZW5jZSkNCnRhYmxlX2dlbmRlcl9pbnRlcm4NCg0KIyBU4bu3IGzhu4cgdGhlbyBow6BuZzogdHJvbmcgdOG7q25nIGdp4bubaSB0w61uaCwgdOG7tyBs4buHIGPDsy9raMO0bmcgY8OzIGtpbmggbmdoaeG7h20NCnByb3AudGFibGUodGFibGVfZ2VuZGVyX2ludGVybiwgbWFyZ2luID0gMSkNCg0KYGBgDQoNCmBgYHtyfQ0KIyBU4bqhbyBiaeG6v24gR2VuZGVyMjogTWFsZSB0csaw4bubYywgRmVtYWxlIHNhdQ0KZCRHZW5kZXIyIDwtIGZhY3RvcihkJEdlbmRlciwgbGV2ZWxzID0gYygiTWFsZSIsICJGZW1hbGUiKSkNCg0KIyBU4bqhbyBiaeG6v24gSW50ZXJuc2hpcDI6IE5vIHRyxrDhu5tjLCBZZXMgc2F1DQpkJEludGVybnNoaXAyIDwtIGZhY3RvcihkJEludGVybnNoaXAuRXhwZXJpZW5jZSwgbGV2ZWxzID0gYygiTm8iLCAiWWVzIikpDQoNCiMgVOG6oW8gYuG6o25nIHThuqduIHPhu5EgY2jDqW8gbeG7m2kgduG7m2kgdGjhu6kgdOG7sSBtb25nIG114buRbg0KdGFibGVfZ2VuZGVyX2ludGVybjIgPC0gdGFibGUoZCRHZW5kZXIyLCBkJEludGVybnNoaXAyKQ0KdGFibGVfZ2VuZGVyX2ludGVybjINCg0KIyBU4bu3IGzhu4cgdGhlbyBow6BuZw0KcHJvcC50YWJsZSh0YWJsZV9nZW5kZXJfaW50ZXJuMiwgbWFyZ2luID0gMSkNCg0KYGBgDQoNCi0gTWFsZTogMzAuMzglIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCwgNjkuNjIlIGtow7RuZyBjw7MuDQoNCi0gRmVtYWxlOiA0MC4zNyUgY8OzIGtpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wLCA1OS42MyUga2jDtG5nIGPDsy4NCg0KxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaDoNCg0KLSBO4buvIHNpbmggdmnDqm4gY2jhu6cgxJHhu5luZyBoxqFuIHRyb25nIHZp4buHYyB0w6xtIGtp4bq/bSB0aOG7sWMgdOG6rXAuDQoNCi0gQ8OzIHRo4buDIGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIG5nw6BuaCBo4buNYywgY8ahIGjhu5lpIHRp4bq/cCBj4bqtbiwgaG/hurdjIHPhu7EgY2h14bqpbiBi4buLIG5naOG7gSBuZ2hp4buHcCBnaeG7r2EgaGFpIGdp4bubaS4NCg0KIyMjICBUcuG7sWMgcXVhbiBow7NhDQoNCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD02fQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIFThuqFvIGLhuqNuZyBk4buvIGxp4buHdSB04burIGLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW86IEdlbmRlciB2cyBJbnRlcm5zaGlwIEV4cGVyaWVuY2UNCnRhYmxlX2dlbmRlcl9pbnRlcm4gPC0gdGFibGUoZCRHZW5kZXIsIGQkSW50ZXJuc2hpcC5FeHBlcmllbmNlKQ0KZGZfZ3JvdXAgPC0gYXMuZGF0YS5mcmFtZShhcy50YWJsZSh0YWJsZV9nZW5kZXJfaW50ZXJuKSkNCmNvbG5hbWVzKGRmX2dyb3VwKSA8LSBjKCJHZW5kZXIiLCAiSW50ZXJuc2hpcCIsICJGcmVxIikgICMgxJDhu5VpIHTDqm4gY+G7mXQNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCBuaMOzbQ0KZ2dwbG90KGRmX2dyb3VwLCBhZXMoeCA9IEludGVybnNoaXAsIHkgPSBGcmVxLCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOCksIHdpZHRoID0gMC42KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBGcmVxKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjgpLA0KICAgICAgICAgICAgdmp1c3QgPSAtMC40LCBzaXplID0gNCwgY29sb3IgPSAiYmxhY2siLCBmb250ZmFjZSA9ICJib2xkIikgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCBuaMOzbTogR2nhu5tpIHTDrW5oIHZzIEtpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wIiwNCiAgICAgICB4ID0gIktpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wIiwNCiAgICAgICB5ID0gIlThuqduIHPhu5EiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKA0KICAgIHZhbHVlcyA9IGMoIkZlbWFsZSIgPSAiI0ZGOTk5OSIsICJNYWxlIiA9ICIjNjY5OUNDIiksDQogICAgbmFtZSA9ICJHaeG7m2kgdMOtbmgiLA0KICAgIGxhYmVscyA9IGMoIk7hu68iLCAiTmFtIikNCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0Ig0KICApDQoNCmBgYA0KDQojIyMgIEtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIChLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcpDQoNCi0gWMOhYyDEkeG7i25oIHhlbSBoYWkgYmnhur9uIMSR4buLbmggdMOtbmggY8OzIG3hu5FpIGxpw6puIGjhu4cgKHBo4bulIHRodeG7mWMpIHbhu5tpIG5oYXUgaGF5IGtow7RuZz8NCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQoqKkjigoAgKEdp4bqjIHRodXnhur90IGtow7RuZykqKjogR2nhu5tpIHTDrW5oIHbDoCBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdS4NCg0KKipI4oKBIChHaeG6oyB0aHV54bq/dCDEkeG7kWkpKio6IEdp4bubaSB0w61uaCB2w6Aga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgY8OzIGxpw6puIGjhu4cgduG7m2kgbmhhdS4NCg0KYGBge3J9DQojIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nDQpjaGlzcS50ZXN0KHRhYmxlX2dlbmRlcl9pbnRlcm4pDQpgYGANCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmc6KioNCg0KLSBDaGktc3F1YXJlZCA9IDEuODENCg0KLSBC4bqtYyB04buxIGRvIChkZikgPSAxDQoNCi0gR2nDoSB0cuG7iyBwLXZhbHVlID0gMC4xNzgzDQoNCioqS+G6v3QgbHXhuq1uIHRo4buRbmcga8OqOioqDQoNCi0gVsOsIHAgPiAwLjA1LCBraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAuDQoNCi0gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGdp4bubaSB0w61uaCB2w6Agdmnhu4djIHNpbmggdmnDqm4gxJHDoyB04burbmcgdGjhu7FjIHThuq1wIGhheSBjaMawYS4NCg0KKipUaOG6o28gbHXhuq1uIHRow6ptIHbhu4EgYuG6o24gY2jhuqV0IG3hu5FpIHF1YW4gaOG7hzoqKg0KDQpN4bq3YyBkw7kgYmnhu4N1IMSR4buTIGfhu6NpIMO9IG7hu68gY8OzIHh1IGjGsOG7m25nIHRo4buxYyB04bqtcCBuaGnhu4F1IGjGoW4gbmFtLCBuaMawbmcga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIGNo4buJIHJhIHLhurFuZyBt4buRaSBxdWFuIGjhu4cgbsOgeSBraMO0bmcgxJHhu6cgbeG6oW5oIMSR4buDIGto4bqzbmcgxJHhu4tuaCBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgdGjhu7FjIHPhu7EgZ2nhu69hIGhhaSBnaeG7m2kgduG7gSBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcC4gSGFpIGJp4bq/biDEkcaw4bujYyBjb2kgbMOgIMSR4buZYyBs4bqtcCB24buBIG3hurd0IHRo4buRbmcga8OqDQoNCiMjIyBIaeG7h3UgdOG7tyBs4buHIA0KDQpTbyBzw6FuaCB04bu3IGzhu4cgeHXhuqV0IGhp4buHbiBt4buZdCDEkeG6t2MgxJFp4buDbSBuw6BvIMSRw7MgZ2nhu69hIGhhaSBuaMOzbSDEkeG7gyB4ZW0gc+G7sSBraMOhYyBiaeG7h3QgxJHDsyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGhheSBraMO0bmc/DQoNCmBgYHtyfQ0KIyBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbyBnaeG7r2EgR2VuZGVyIHbDoCBJbnRlcm5zaGlwIEV4cGVyaWVuY2UNCnRhYmxlX2dlbmRlcl9pbnRlcm4gPC0gdGFibGUoZCRHZW5kZXIsIGQkSW50ZXJuc2hpcC5FeHBlcmllbmNlKQ0KDQojIFRow6ptIHThu5VuZyBow6BuZyB2w6AgdOG7lW5nIGPhu5l0DQp0YWJsZV9nZW5kZXJfaW50ZXJuX21hcmdpbnMgPC0gYWRkbWFyZ2lucyh0YWJsZV9nZW5kZXJfaW50ZXJuKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcNCnRhYmxlX2dlbmRlcl9pbnRlcm5fbWFyZ2lucw0KDQpgYGANClThu7cgbOG7hyBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgdGhlbyBnaeG7m2kgdMOtbmggxJHGsOG7o2Mga8O9IGhp4buHdSBuaMawIHNhdToNCg0KLSBcKCBwXzEgPSBQKFx0ZXh0e0ludGVybnNoaXB9ID0gXHRleHR7IlllcyJ9IFxtaWQgXHRleHR7R2VuZGVyfSA9IFx0ZXh0eyJGZW1hbGUifSkgXCk6IFThu7cgbOG7hyBu4buvIGdp4bubaSBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAuICANCi0gXCggcF8yID0gUChcdGV4dHtJbnRlcm5zaGlwfSA9IFx0ZXh0eyJZZXMifSBcbWlkIFx0ZXh0e0dlbmRlcn0gPSBcdGV4dHsiTWFsZSJ9KSBcKTogVOG7tyBs4buHIG5hbSBnaeG7m2kgY8OzIGtpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wLg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gXCggSF8wOiBwXzEgLSBwXzIgPSAwIFwpOiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIHRo4buxYyB04bqtcCBnaeG7r2EgbuG7ryB2w6AgbmFtLiAgDQotIFwoIEhfMTogcF8xIC0gcF8yID4gMCBcKTogVOG7tyBs4buHIG7hu68gdGjhu7FjIHThuq1wIGNhbyBoxqFuIG5hbS4NCg0KDQpgYGB7cn0NCiMgU+G7kSBuZ8aw4budaSBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgdHJvbmcgdOG7q25nIGdp4bubaQ0KY291bnRzX2ludGVybl95ZXMgPC0gYyh0YWJsZV9nZW5kZXJfaW50ZXJuWyJGZW1hbGUiLCAiWWVzIl0sIHRhYmxlX2dlbmRlcl9pbnRlcm5bIk1hbGUiLCAiWWVzIl0pDQoNCiMgVOG7lW5nIHPhu5EgbmfGsOG7nWkgdGhlbyB04burbmcgZ2nhu5tpDQp0b3RhbHNfZ2VuZGVyIDwtIGMoc3VtKHRhYmxlX2dlbmRlcl9pbnRlcm5bIkZlbWFsZSIsIF0pLCBzdW0odGFibGVfZ2VuZGVyX2ludGVyblsiTWFsZSIsIF0pKQ0KDQojIEtp4buDbSDEkeG7i25oIHThu4kgbOG7hyBt4buZdCBwaMOtYTogcDEgPiBwMg0KdGVzdF9pbnRlcm4gPC0gcHJvcC50ZXN0KGNvdW50c19pbnRlcm5feWVzLCB0b3RhbHNfZ2VuZGVyLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgY29ycmVjdCA9IEZBTFNFKQ0KDQojIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KdGVzdF9pbnRlcm4NCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQsIGPDoWNoIHTDrW5oIHbDoCDDvSBuZ2jEqWEgY+G7p2EgaGnhu4d1IHThu7cgbOG7hyoqDQoNCkdp4bqjIHPhu60gY8OzIGvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIG5oxrAgc2F1Og0KDQotIFwoIFxoYXR7cH1fMSA9IFxmcmFjezQ0fXsxMDl9IFxhcHByb3ggMC40MDM3IFwpOiBU4bu3IGzhu4cgbuG7ryBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgIA0KLSBcKCBcaGF0e3B9XzIgPSBcZnJhY3syNH17Nzl9IFxhcHByb3ggMC4zMDM4IFwpOiBU4bu3IGzhu4cgbmFtIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCAgDQotIEhp4buHdSB04bu3IGzhu4c6IFwoIFxoYXR7cH1fMSAtIFxoYXR7cH1fMiBcYXBwcm94IDAuNDAzNyAtIDAuMzAzOCA9IDAuMDk5OSBcKQ0KDQotLS0NCg0KKipDw6FjaCB0w61uaCBoaeG7h3UgdOG7tyBs4buHKioNCg0KVOG7tyBs4buHIMSRxrDhu6NjIMaw4bubYyBsxrDhu6NuZyB0aGVvIGPDtG5nIHRo4bupYzoNCg0KXFsNClxoYXR7cH1fMSA9IFxmcmFje3hfMX17bl8xfSwgXHF1YWQgXGhhdHtwfV8yID0gXGZyYWN7eF8yfXtuXzJ9DQpcXQ0KDQpUcm9uZyDEkcOzOg0KDQotIFwoIHhfMSwgeF8yIFwpOiBz4buRIG5nxrDhu51pIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCDhu58gbeG7l2kgbmjDs20NCi0gXCggbl8xLCBuXzIgXCk6IHThu5VuZyBz4buRIG5nxrDhu51pIOG7nyBt4buXaSBuaMOzbSAobuG7ryB2w6AgbmFtKQ0KDQpIaeG7h3UgdOG7tyBs4buHOg0KDQpcWw0KXGhhdHtwfV8xIC0gXGhhdHtwfV8yDQpcXQ0KDQotLS0NCg0KKirDnSBuZ2jEqWEgY+G7p2Ega+G6v3QgcXXhuqMqKg0KDQotIEhp4buHdSB04bu3IGzhu4cgXCggXGhhdHtwfV8xIC0gXGhhdHtwfV8yIFxhcHByb3ggMC4wOTk5IFwpIGNobyB0aOG6pXkgdOG7tyBs4buHIG7hu68gY8OzIHRo4buxYyB04bqtcCBjYW8gaMahbiBuYW0uDQoNCi0gVHV5IG5oacOqbiwgcC12YWx1ZSB04burIGtp4buDbSDEkeG7i25oIGhp4buHdSB04bu3IGzhu4cgbMOgIFwoIHAgPSAwLjA3NCA+IDAuMDUgXCksIG7Dqm4gKipraMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IFwoIEhfMCBcKSoqLg0KDQotIERvIMSRw7MsIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgKipjaMawYSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiog4oCUIHThu6ljIGzDoCBjw7MgdGjhu4MgZG8gc2FpIHPhu5Egbmfhuqt1IG5oacOqbiB04burIG3huqt1Lg0KDQoNCioqS+G6v3QgbHXhuq1uKioNCg0KTeG6t2MgZMO5IGThu68gbGnhu4d1IG3DtCB04bqjIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgY8OzIGtpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wIGdp4buvYSBu4buvIHbDoCBuYW0sIG5oxrBuZyBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiBjaG8gdGjhuqV5ICoqY2jGsGEgdGjhu4Mga2jhurNuZyDEkeG7i25oIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgbWFuZyB0w61uaCBo4buHIHRo4buRbmcqKiB0cm9uZyB0b8OgbiBi4buZIHF14bqnbiB0aOG7gy4NCg0KDQojIyMgVOG7tyBz4buRIG5ndXkgY8ahDQoNCioqQ8OidSBo4buPaSBuZ2hpw6puIGPhu6l1Kio6IExp4buHdSBnaeG7m2kgdMOtbmggKG5hbS9u4buvKSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGto4bqjIG7Eg25nIHThu6tuZyBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgKEludGVybnNoaXAgRXhwZXJpZW5jZSk/IA0KDQrihpIgTeG7pWMgdGnDqnU6DQoNClNvIHPDoW5oIHjDoWMgc3XhuqV0IGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCBnaeG7r2EgaGFpIGdp4bubaToNCg0KLSBcKCBSUiA9IFxmcmFje1AoXHRleHR7SW50ZXJuc2hpcH0gPSBcdGV4dHsiWWVzIn0gXG1pZCBcdGV4dHtHZW5kZXJ9ID0gXHRleHR7IkZlbWFsZSJ9KX17UChcdGV4dHtJbnRlcm5zaGlwfSA9IFx0ZXh0eyJZZXMifSBcbWlkIFx0ZXh0e0dlbmRlcn0gPSBcdGV4dHsiTWFsZSJ9KX0gXCkNCg0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCJlcGl0b29scyIsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KYGBgDQoNCioqVMOtbmggUmVsYXRpdmUgUmlzayoqDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKHRhYmxlX2dlbmRlcl9pbnRlcm4yKQ0KYGBgDQoqKlTDrW5oIHThu7cgbOG7hyoqDQoNCi0gTmFtOg0KICBcWw0KICBcaGF0e3B9X3tcdGV4dHtZZXMgfCBNYWxlfX0gPSBcZnJhY3syNH17Nzl9IFxhcHByb3ggMC4zMDM4DQogIFxdDQotIE7hu686DQogIFxbDQogIFxoYXR7cH1fe1x0ZXh0e1llcyB8IEZlbWFsZX19ID0gXGZyYWN7NDR9ezEwOX0gXGFwcHJveCAwLjQwMzcNCiAgXF0NCg0KKipU4bu3IHPhu5Egbmd1eSBjxqEgKEZlbWFsZSB2cyBNYWxlKSoqOg0KDQpcWw0KUlIgPSBcZnJhY3tcaGF0e3B9X3tcdGV4dHtZZXMgfCBGZW1hbGV9fSAvIFxoYXR7cH1fe1x0ZXh0e05vIHwgRmVtYWxlfX19e1xoYXR7cH1fe1x0ZXh0e1llcyB8IE1hbGV9fSAvIFxoYXR7cH1fe1x0ZXh0e05vIHwgTWFsZX19fQ0KPSBcZnJhY3tcZnJhY3s0NH17NjV9fXtcZnJhY3syNH17NTV9fSA9IDEuMzI4Nw0KXF0NCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlOg0KICBcWw0KICBDSSA9IFxsZWZ0WyAwLjg4NjggOyAxLjk5MDkgXHJpZ2h0XQ0KICBcXQ0KDQoqKsOdIG5naMSpYSoqDQoNCi0gTuG7ryBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgdHLDqm4gbmFtIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCBsw6A6IDEuMzI4NyBs4bqnbi4gIA0KICBIYXkgbsOzaSBjw6FjaCBraMOhYywgbuG7ryBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgbmhp4buBdSBoxqFuIG5hbSAxLjMyODcgbOG6p24uDQoNCg0KIyMjIFThu7cgc+G7kSBDaMOqbmggKE9kZHMgUmF0aW8gLSBPUikNCg0KYGBge3J9DQpvcl9yZXN1bHQyIDwtIG9kZHNyYXRpbyh0YWJsZV9nZW5kZXJfaW50ZXJuKQ0KcHJpbnQob3JfcmVzdWx0MikNCg0KYGBgDQoqKlTDrW5oIG9kZHMgKHThu7cgbOG7hyBjaMOpbykgdGhlbyB04burbmcgbmjDs20qKg0KDQotIE1hbGU6DQogIFxbDQogIFx0ZXh0e09kZHN9X3tcdGV4dHtNYWxlfX0gPSBcZnJhY3syNH17NTV9IFxhcHByb3ggMC40MzY0DQogIFxdDQotIEZlbWFsZToNCiAgXFsNCiAgXHRleHR7T2Rkc31fe1x0ZXh0e0ZlbWFsZX19ID0gXGZyYWN7NDR9ezY1fSBcYXBwcm94IDAuNjc2OQ0KICBcXQ0KDQoqKlTDrW5oIE9kZHMgUmF0aW8gKE9SKSoqDQoNClxbDQpPUiA9IFxmcmFje1x0ZXh0e09kZHN9X3tcdGV4dHtGZW1hbGV9fX17XHRleHR7T2Rkc31fe1x0ZXh0e01hbGV9fX0gPSBcZnJhY3s0NC82NX17MjQvNTV9IFxhcHByb3ggMC42NDczDQpcXQ0KDQpLaG/huqNuZyB0aW4gY+G6rXkgOTUlOg0KDQpcWw0KQ0kgPSBcbGVmdFsgMC4zNDYzIDsgMS4xOTE5IFxyaWdodF0NClxdDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotIFwoIEhfMCBcKTogT2RkcyByYXRpbyBnaeG7r2EgbmFtIHbDoCBu4buvIGLhurFuZyAxIChraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgdGjhu7FjIHThuq1wKS4gIA0KLSBcKCBIXzEgXCk6IE9kZHMgcmF0aW8ga2jDoWMgMSAoY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgdGjhu7FjIHThuq1wKS4NCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCoqDQoNCi0gTWlkLXAgZXhhY3Q6IFwoIHAgPSAwLjE2MzYgXCkNCi0gRmlzaGVyIGV4YWN0OiBcKCBwID0gMC4xNjk5IFwpDQotIENoaS1zcXVhcmU6IFwoIHAgPSAwLjE1OTUgXCkNCg0KKipL4bq/dCBsdeG6rW4gdGjhu5FuZyBrw6oqKg0KDQpWw6wgY8OhYyBnacOhIHRy4buLIFwoIHAgPiAwLjA1IFwpLCB0YSAqKmtow7RuZyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgXCggSF8wIFwpKiouDQoNClxbDQpcUmlnaHRhcnJvdyBcdGV4dHtDaMawYSBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga2jhurNuZyDEkeG7i25oIGdp4bubaSB0w61uaCBjw7MgbGnDqm4gaOG7hyB24bubaSBraOG6oyBuxINuZyB04burbmcgxJFpIHRo4buxYyB04bqtcC59DQpcXQ0KDQoqKsOdIG5naMSpYSoqDQoNCi0gTuG7ryDEkcOjIHThu6tuZyDEkWkgdGjhu7FjIHThuq1wIHRyw6puIG7hu68gY2jGsGEgdOG7q25nIMSRaSB0aOG7sWMgdOG6rXAgYuG6sW5nIGtob+G6o25nIDY0LDczJSBzbyB24bubaSBuYW0gxJHDoyB04burbmcgxJFpIHRo4buxYyB04bqtcCB0csOqbiBuYW0gY2jGsGEgdOG7q25nIMSRaSB0aOG7sWMgdOG6rXANCg0KLSBUdXkgbmhpw6puLCB2w6wgbeG7qWMgxJHhu5kgY2jDqm5oIGzhu4djaCBuw6B5IGtow7RuZyDEkeG7pyBt4bqhbmggduG7gSBt4bq3dCB0aOG7kW5nIGvDqiAocC12YWx1ZSA+IDAuMDUpLCBuw6puIHRhIGNoxrBhIHRo4buDIGto4bqzbmcgxJHhu4tuaCBjaOG6r2MgY2jhuq9uIHLhurFuZyBnaeG7m2kgdMOtbmggdGjhu7FjIHPhu7Eg4bqjbmggaMaw4bufbmcgxJHhur9uIHZp4buHYyBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgaGF5IGtow7RuZy4NCg0KYGBge3J9DQpvcl9yZXN1bHQzIDwtIG9kZHNyYXRpbyh0YWJsZV9nZW5kZXJfaW50ZXJuMikNCnByaW50KG9yX3Jlc3VsdDMpDQoNCmBgYA0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gXCggSF8wOiBPUiA9IDEgXCk6IE9kZHMgY8OzIGtpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wIGzDoCBuaMawIG5oYXUgZ2nhu69hIG5hbSB2w6AgbuG7ry4gIA0KLSBcKCBIXzE6IE9SIFxuZXEgMSBcKTogQ8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4Egb2RkcyB0aOG7sWMgdOG6rXAgZ2nhu69hIG5hbSB2w6AgbuG7ry4NCg0KKipL4bq/dCBxdeG6ozoqKg0KDQotIFThu7cgc+G7kSBjaMOqbmggKE9SKSA9IDEuNTQ0OCAgDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSU6IFwoIFswLjgzOTAgOyAyLjg4ODBdIFwpICANCi0gQ8OhYyBwLXZhbHVlOg0KICAtIE1pZC1wIGV4YWN0OiBcKCBwID0gMC4xNjM2IFwpDQogIC0gRmlzaGVyIGV4YWN0OiBcKCBwID0gMC4xNjk5IFwpDQogIC0gQ2hpLXNxdWFyZTogXCggcCA9IDAuMTU5NSBcKQ0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpWw6wgXCggcCA+IDAuMDUgXCksIHRhICoqa2jDtG5nIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBcKCBIXzAgXCkqKi4NCg0KXFsNClxSaWdodGFycm93IFx0ZXh0e0tow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyBnaeG7m2kgdMOtbmgg4bqjbmggaMaw4bufbmcgxJHhur9uIG9kZHMgdOG7q25nIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcC59DQpcXQ0KDQoqKkRp4buFbiBnaeG6o2k6KioNCg0KLSBU4bu3IHPhu5EgY2jDqm5oIE9SID0gMS41NDQ4IGNobyB0aOG6pXkgb2RkcyBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgY+G7p2EgKipu4buvIGdp4bubaSBjYW8gaMahbiBraG/huqNuZyAxLjU0IGzhuqduIHNvIHbhu5tpIG5hbSBnaeG7m2kqKi4NCi0gVHV5IG5oacOqbiwgdsOsIGtob+G6o25nIHRpbiBj4bqteSBjaOG7qWEgMSB2w6AgY8OhYyBwLXZhbHVlIMSR4buBdSBs4bubbiBoxqFuIDAuMDUsIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgKipraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqLg0KDQojIyBD4bq3cCAyOiBSZXNlYXJjaCBPcHBvcnR1bml0aWVzIGF0IFVuaXZlcnNpdHkgeCBJbnRlcm5zaGlwIEV4cGVyaWVuY2UNCg0KQ8OidSBo4buPaTogTGnhu4d1IHZp4buHYyB0csaw4budbmcgxJHhuqFpIGjhu41jIGPDsyB04bqhbyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1IHbhu4EgQUkgY8OzIGxpw6puIHF1YW4gxJHhur9uIGto4bqjIG7Eg25nIHNpbmggdmnDqm4gdOG7q25nIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCBoYXkga2jDtG5nPw0KDQpN4bulYyB0acOqdTogxJDDoW5oIGdpw6EgbeG7kWkgcXVhbiBo4buHIGdp4buvYSDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1IHThuqFpIHRyxrDhu51uZyB2w6Aga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgY+G7p2Egc2luaCB2acOqbiDigJMgdOG7qyDEkcOzIHLDunQgcmEgbGnhu4d1IG3DtGkgdHLGsOG7nW5nIGjhu41jIHRodeG6rXQgY8OzIHThuqFvIHRodeG6rW4gbOG7o2kgY2hvIHRy4bqjaSBuZ2hp4buHbSB0aOG7sWMgdGnhu4VuIGhheSBraMO0bmcNCg0KYGBge3J9DQojIEfDoW4gbmjDo24gcsO1IG5naMSpYSBoxqFuIGNobyBjw6FjIG3hu6ljDQpkJFJlc2VhcmNoQ2xlYXIgPC0gZmFjdG9yKGQkUmVzZWFyY2guT3Bwb3J0dW5pdGllcy5hdC5Vbml2ZXJzaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTm8iLCAiWWVzIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDaMawYSB04bqhbyBkayIsICJDw7MgdOG6oW8gZGsiKSkNCg0KZCRJbnRlcm5zaGlwQ2xlYXIgPC0gZmFjdG9yKGQkSW50ZXJuc2hpcC5FeHBlcmllbmNlLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIk5vIiwgIlllcyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkNoxrBhIGtpbmggbmdoaeG7h20iLCAiQ8OzIGtpbmggbmdoaeG7h20gIikpDQoNCiMgQuG6o25nIHThuqduIHPhu5EgY2jDqW8gduG7m2kgbmjDo24gcsO1IHLDoG5nDQp0YWJsZV9yZXNlYXJjaF9pbnRlcm5fY2xlYXIgPC0gdGFibGUoZCRSZXNlYXJjaENsZWFyLCBkJEludGVybnNoaXBDbGVhcikNCnRhYmxlX3Jlc2VhcmNoX2ludGVybl9jbGVhcg0KDQojIFThu7cgbOG7hyB0aGVvIGjDoG5nDQpwcm9wLnRhYmxlKHRhYmxlX3Jlc2VhcmNoX2ludGVybl9jbGVhciwgbWFyZ2luID0gMSkNCg0KYGBgDQoNCmBgYHtyfQ0KIyBU4bqhbyBiaeG6v24gbeG7m2k6IEludGVybnNoaXBDbGVhcjIgduG7m2kgdGjhu6kgdOG7sSBt4bupYyDEkeG6o28gbmfGsOG7o2MNCmQkSW50ZXJuc2hpcENsZWFyMiA8LSBmYWN0b3IoZCRJbnRlcm5zaGlwLkV4cGVyaWVuY2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlllcyIsICJObyIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJDw7Mga2luaCBuZ2hp4buHbSIsICJDaMawYSBraW5oIG5naGnhu4dtIikpDQoNCiMgVOG6oW8gYuG6o25nIHThuqduIHPhu5EgY2jDqW8gbeG7m2kNCnRhYmxlX3Jlc2VhcmNoX2ludGVybl9jbGVhcjIgPC0gdGFibGUoZCRSZXNlYXJjaENsZWFyLCBkJEludGVybnNoaXBDbGVhcjIpDQp0YWJsZV9yZXNlYXJjaF9pbnRlcm5fY2xlYXIyDQoNCiMgVOG7tyBs4buHIHRoZW8gaMOgbmcNCnByb3AudGFibGUodGFibGVfcmVzZWFyY2hfaW50ZXJuX2NsZWFyMiwgbWFyZ2luID0gMSkNCg0KYGBgDQoNCi0g4bueIGPDoWMgdHLGsOG7nW5nIGNoxrBhIHThuqFvIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUsIGfhuqduIDY5JSBzaW5oIHZpw6puIGNoxrBhIHThu6tuZyBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgdsOgIHPhu5Egc2luaCB2acOqbiBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgbMOgIDMxJQ0KDQotIE5nxrDhu6NjIGzhuqFpLCDhu58gY8OhYyB0csaw4budbmcgY8OzIHThuqFvIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUsIGNo4buJIGtob+G6o25nIDU4JSBjaMawYSBjw7Mga2luaCBuZ2hp4buHbSwgdsOgIHThu7cgbOG7hyBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgdMSDbmcgbMOqbiDEkeG6v24gaMahbiA0MiUuDQoNCiMjIyBUcuG7sWMgcXVhbiBow7NhDQoNCmBgYHtyICBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBU4bqhbyBi4bqjbmcgZOG7ryBsaeG7h3UgdOG7qyBi4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvDQp0YWJsZV9yaSA8LSB0YWJsZShkJFJlc2VhcmNoQ2xlYXIsIGQkSW50ZXJuc2hpcENsZWFyMikNCmRmX3JpIDwtIGFzLmRhdGEuZnJhbWUoYXMudGFibGUodGFibGVfcmkpKQ0KY29sbmFtZXMoZGZfcmkpIDwtIGMoIlJlc2VhcmNoIiwgIkludGVybnNoaXAiLCAiRnJlcSIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgbmjDs20NCmdncGxvdChkZl9yaSwgYWVzKHggPSBJbnRlcm5zaGlwLCB5ID0gRnJlcSwgZmlsbCA9IFJlc2VhcmNoKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgwLjgpLCB3aWR0aCA9IDAuNikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gRnJlcSksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKDAuOCksDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIHNpemUgPSA0LCBmb250ZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGPhu5l0IG5ow7NtOiDEkGnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1IHZzIEtpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wIiwNCiAgICAgICB4ID0gIktpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wIiwNCiAgICAgICB5ID0gIlThuqduIHPhu5EiKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKA0KICAgIHZhbHVlcyA9IGMoIkNoxrBhIHThuqFvIGRrIiA9ICIjRkZBMDdBIiwgIkPDsyB04bqhbyBkayIgPSAiIzIwQjJBQSIpLA0KICAgIG5hbWUgPSAiVHLGsOG7nW5nIMSQ4bqhaSBo4buNYyIsDQogICAgbGFiZWxzID0gYygiQ2jGsGEgdOG6oW8gxJFp4buBdSBraeG7h24iLCAiQ8OzIHThuqFvIMSRaeG7gXUga2nhu4duIikNCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0Ig0KICApDQpgYGANCg0KIyMjIEtp4buDbSDEkeG7i25oIHRo4buRbmcga8OqIChLaeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcpDQoNCi0gWMOhYyDEkeG7i25oIHhlbSBoYWkgYmnhur9uIMSR4buLbmggdMOtbmggY8OzIG3hu5FpIGxpw6puIGjhu4cgKHBo4bulIHRodeG7mWMpIHbhu5tpIG5oYXUgaGF5IGtow7RuZz8NCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQoqKkjigoAgKEdp4bqjIHRodXnhur90IGtow7RuZykqKjogxJBp4buBdSBraeG7h24gbmdoacOqbiBj4bupdSB04bqhaSB0csaw4budbmcgdsOgIGtpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wIMSR4buZYyBs4bqtcCB24bubaSBuaGF1LiAgDQoqKkjigoEgKEdp4bqjIHRodXnhur90IMSR4buRaSkqKjogSGFpIGJp4bq/biBjw7MgbGnDqm4gaOG7hyB24bubaSBuaGF1Lg0KDQpgYGB7cn0NCiMgVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcNCmNoaXNxLnRlc3QodGFibGVfcmVzZWFyY2hfaW50ZXJuX2NsZWFyMikNCmBgYA0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZzoqKg0KDQotIFwoIFxjaGleMiA9IDEuODc0MiBcKQ0KLSBcKCBkZiA9IDEgXCkNCi0gXCggcFx0ZXh0ey12YWx1ZX0gPSAwLjE3MSBcKQ0KDQoqKkvhur90IGx14bqtbiB0aOG7kW5nIGvDqjoqKg0KDQpWw6wgXCggcCA+IDAuMDUgXCksIHRhICoqa2jDtG5nIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBcKCBIXzAgXCkqKi4NCg0KXFsNClxSaWdodGFycm93IFx0ZXh0e0tow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1IHThuqFpIHRyxrDhu51uZyBjw7MgbGnDqm4gaOG7hyB24bubaSBraOG6oyBuxINuZyBzaW5oIHZpw6puIHThu6tuZyDEkWkgdGjhu7FjIHThuq1wLn0NClxdDQoNCk3hurdjIGTDuSBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyB0aOG6pXkgc2luaCB2acOqbiB04burIHRyxrDhu51uZyBjw7MgbcO0aSB0csaw4budbmcgbmdoacOqbiBj4bupdSB0aHXhuq1uIGzhu6NpIGPDsyB04bu3IGzhu4cgdGjhu7FjIHThuq1wIGNhbyBoxqFuLCBuaMawbmcga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgxJHDsyAqKmtow7RuZyDEkeG7pyBt4bqhbmggduG7gSBt4bq3dCB0aOG7kW5nIGvDqioqLg0KDQrEkGnhu4F1IG7DoHkgY8OzIHRo4buDIHBo4bqjbiDDoW5oIHLhurFuZyBz4buxIGtow6FjIGJp4buHdCDEkcaw4bujYyBxdWFuIHPDoXQgY8OzIHRo4buDIGNo4buJIGzDoCBkbyAqKnNhaSBz4buRIG5n4bqrdSBuaGnDqm4gY+G7p2EgbeG6q3UqKiwgdsOgICoqa2jDtG5nIHRo4buDIGto4bqzbmcgxJHhu4tuaCBjaOG6r2MgY2jhuq9uIHLhurFuZyBoYWkgYmnhur9uIGPDsyBsacOqbiBo4buHIHRyb25nIHF14bqnbiB0aOG7gyBjaHVuZyoqLg0KDQoqKlRo4bqjbyBsdeG6rW4gdGjDqm0gduG7gSBi4bqjbiBjaOG6pXQgbeG7kWkgcXVhbiBo4buHOioqDQoNCkJp4buDdSDEkeG7kyB2w6AgYuG6o25nIHThuqduIHN14bqldCBjaG8gdGjhuqV5IHPhu7Ega2jDoWMgYmnhu4d0IHTGsMahbmcgxJHhu5FpIGdp4buvYSBoYWkgbmjDs20sIHR1eSBuaGnDqm4ga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogc+G6vSBxdXnhur90IMSR4buLbmggc+G7sSBraMOhYyBiaeG7h3QgxJHDsyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGhheSBraMO0bmcuDQoNCiMjIyBIaeG7h3UgdOG7tyBs4buHIA0KDQpTbyBzw6FuaCB04bu3IGzhu4cgeHXhuqV0IGhp4buHbiBt4buZdCDEkeG6t2MgxJFp4buDbSBuw6BvIMSRw7MgZ2nhu69hIGhhaSBuaMOzbSDEkeG7gyB4ZW0gc+G7sSBraMOhYyBiaeG7h3QgxJHDsyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGhheSBraMO0bmc/DQoNCmBgYHtyfQ0KIyBT4buRIG5nxrDhu51pIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCB0aGVvIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUNCmNvdW50c19pbnRlcm5fcmVzZWFyY2ggPC0gYyh0YWJsZV9yZXNlYXJjaF9pbnRlcm5fY2xlYXIyWyJDw7MgdOG6oW8gZGsiLCAiQ8OzIGtpbmggbmdoaeG7h20iXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZV9yZXNlYXJjaF9pbnRlcm5fY2xlYXIyWyJDaMawYSB04bqhbyBkayIsICJDw7Mga2luaCBuZ2hp4buHbSJdKQ0KDQojIFThu5VuZyBz4buRIG5nxrDhu51pIHRoZW8gbmjDs20gxJFp4buBdSBraeG7h24gbmdoacOqbiBj4bupdQ0KdG90YWxzX3Jlc2VhcmNoIDwtIGMoc3VtKHRhYmxlX3Jlc2VhcmNoX2ludGVybl9jbGVhcjJbIkPDsyB04bqhbyBkayIsIF0pLA0KICAgICAgICAgICAgICAgICAgICAgc3VtKHRhYmxlX3Jlc2VhcmNoX2ludGVybl9jbGVhcjJbIkNoxrBhIHThuqFvIGRrIiwgXSkpDQoNCiMgS2nhu4NtIMSR4buLbmggdOG7iSBs4buHIG3hu5l0IHBow61hOiBwMSA+IHAyDQpwcm9wLnRlc3QoY291bnRzX2ludGVybl9yZXNlYXJjaCwgdG90YWxzX3Jlc2VhcmNoLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgY29ycmVjdCA9IEZBTFNFKQ0KYGBgDQoqKktp4buDbSDEkeG7i25oIGhp4buHdSB04bu3IGzhu4c6IFTDoWMgxJHhu5luZyBj4bunYSDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1IMSR4bq/biBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCoqDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6KioNCg0KLSBcKCBIXzA6IHBfMSAtIHBfMiA9IDAgXCk6IEtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgY8OzIHRo4buxYyB04bqtcCBnaeG7r2EgaGFpIG5ow7NtIHRyxrDhu51uZy4NCi0gXCggSF8xOiBwXzEgLSBwXzIgPiAwIFwpOiBU4bu3IGzhu4cgc2luaCB2acOqbiBjw7MgdGjhu7FjIHThuq1wIHThuqFpIHRyxrDhu51uZyBjw7MgxJFp4buBdSBraeG7h24gbmdoacOqbiBj4bupdSBjYW8gaMahbiBuaMOzbSBjw7JuIGzhuqFpLg0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCi0gXCggXGhhdHtwfV8xID0gMC40MjE3IFwpOiBU4bu3IGzhu4cgc2luaCB2acOqbiBjw7MgdGjhu7FjIHThuq1wIOG7nyBuaMOzbSAqKmPDsyB04bqhbyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1KioNCi0gXCggXGhhdHtwfV8yID0gMC4zMTQzIFwpOiBU4bu3IGzhu4cgc2luaCB2acOqbiBjw7MgdGjhu7FjIHThuq1wIOG7nyBuaMOzbSAqKmtow7RuZyB04bqhbyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1KioNCi0gXCggXGhhdHtwfV8xIC0gXGhhdHtwfV8yID0gMC4xMDc0IFwpDQoNCi0gXCggXGNoaV4yID0gMi4zMTYxIFwpLCBcKCBkZiA9IDEgXCksIFwoIHBcdGV4dHstdmFsdWV9ID0gMC4wNjQgXCkNCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyBoaeG7h3UgdOG7tyBs4buHOiBcKCBbLTAuMDA4ODsgMV0gXCkNCg0KKipL4bq/dCBsdeG6rW4qKg0KDQpWw6wgXCggcCA9IDAuMDY0ID4gMC4wNSBcKSwgdGEgKipraMO0bmcgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IFwoIEhfMCBcKSoqIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUuDQoNClxbDQpcUmlnaHRhcnJvdyBcdGV4dHtDaMawYSDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBraOG6s25nIMSR4buLbmggcuG6sW5nIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUgdOG6oWkgdHLGsOG7nW5nIGdpw7pwIHNpbmggdmnDqm4gY8OzIG5oaeG7gXUga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgaMahbi59DQpcXQ0KDQpUdXkgbmhpw6puLCBkbyBcKCBwIFwpIHRp4buHbSBj4bqtbiAwLjA1IHbDoCBoaeG7h3UgdOG7tyBs4buHIGzDoCBkxrDGoW5nICgxMC43NCUpLCBjw7MgdGjhu4MgeGVtIMSRw6J5IGzDoCAqKm3hu5l0IHh1IGjGsOG7m25nIHRp4buBbSBuxINuZyoqLCBj4bqnbiDEkcaw4bujYyBraeG7g20gdHJhIHRow6ptIGLhurFuZyBt4bqrdSBs4bubbiBoxqFuLg0KDQojIyMgVOG7tyBz4buRIG5ndXkgY8ahDQoNCi0gTGnhu4d1IMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUgdOG6oWkgdHLGsOG7nW5nIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgc2luaCB2acOqbiBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXA/DQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCnJpc2tyYXRpbyh0YWJsZV9yZXNlYXJjaF9pbnRlcm5fY2xlYXIpDQpgYGANCioqR2nhuqMgdGh1eeG6v3Q6KioNCg0KLSBcKCBIXzA6IFJSID0gMSBcKTogS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIG5ndXkgY8ahIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCBnaeG7r2EgaGFpIG5ow7NtIHRyxrDhu51uZy4NCi0gXCggSF8xOiBSUiA+IDEgXCk6IFNpbmggdmnDqm4gdOG7qyB0csaw4budbmcgY8OzIHThuqFvIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUgY8OzIG5ndXkgY8ahIGPDsyB0aOG7sWMgdOG6rXAgY2FvIGjGoW4uDQoNCioqS+G6v3QgcXXhuqMgdMOtbmggdG/DoW46KioNCg0KLSBU4bu3IHPhu5Egbmd1eSBjxqEgKFJSKSA9IFwoIFxmcmFjezM1IC8gODN9ezMzIC8gMTA1fSA9IDEuMzQxNyBcKQ0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlOiBcKCBbMC45MTg5IDsgMS45NTkxXSBcKQ0KLSBDw6FjIGdpw6EgdHLhu4sgcC12YWx1ZToNCiAgLSBNaWQtcCBleGFjdDogXCggcCA9IDAuMTMyMiBcKQ0KICAtIEZpc2hlcjogXCggcCA9IDAuMTY4NyBcKQ0KICAtIENoaS1zcXVhcmU6IFwoIHAgPSAwLjEyODAgXCkNCg0KVsOsIHThuqV0IGPhuqMgZ2nDoSB0cuG7iyBcKCBwID4gMC4wNSBcKSwgdGEgKipraMO0bmcgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IFwoIEhfMCBcKSoqLg0KDQpcWw0KXFJpZ2h0YXJyb3cgXHRleHR7S2jDtG5nIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUgdOG6oWkgdHLGsOG7nW5nIGzDoG0gdMSDbmcga2jhuqMgbsSDbmcgc2luaCB2acOqbiBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAufQ0KXF0NCg0KKirDnSBuZ2jEqWEqKg0KDQotIFJSID0gMS4zNCBuZ2jEqWEgbMOgIHNpbmggdmnDqm4gdOG7qyB0csaw4budbmcgY8OzIHThuqFvIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUgKipjw7Mga2jhuqMgbsSDbmcgdOG7q25nIHRo4buxYyB04bqtcCBjYW8gaMahbiAxLjM0IGzhuqduKiogc28gduG7m2kgc2luaCB2acOqbiB04burIHRyxrDhu51uZyBraMO0bmcgdOG6oW8gxJFp4buBdSBraeG7h24uDQotIFR1eSBuaGnDqm4sIHbDrCBraG/huqNuZyB0aW4gY+G6rXkgY2jhu6lhIDEgdsOgIHAtdmFsdWUgPiAwLjA1LCBuw6puIGvhur90IGx14bqtbiBuw6B5ICoqa2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKi4NCg0KYGBge3J9DQpsaWJyYXJ5KGVwaXRvb2xzKQ0Kcmlza3JhdGlvKHRhYmxlX3Jlc2VhcmNoX2ludGVybl9jbGVhcjIpDQpgYGANCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6KioNCg0KLSBcKCBIXzA6IFJSID0gMSBcKTogTmd1eSBjxqEgY8OzIGtpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wIGzDoCBuaMawIG5oYXUgZ2nhu69hIGhhaSBuaMOzbSB0csaw4budbmcuDQotIFwoIEhfMTogUlIgXG5lcSAxIFwpOiBDw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSBuZ3V5IGPGoSBjw7MgdGjhu7FjIHThuq1wIGdp4buvYSBoYWkgbmjDs20uDQoNCioqS+G6v3QgcXXhuqM6KioNCg0KLSBSUiA9IFwoIFxmcmFjezM1IC8gODN9ezMzIC8gMTA1fSA9IDAuODQzNyBcKQ0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlOiBcKCBbMC42NzM2IDsgMS4wNTU5XSBcKQ0KLSBHacOhIHRy4buLIHAtdmFsdWU6DQogIC0gTWlkLXAgZXhhY3Q6IFwoIHAgPSAwLjEzMjIgXCkNCiAgLSBGaXNoZXIgZXhhY3Q6IFwoIHAgPSAwLjE2ODcgXCkNCiAgLSBDaGktc3F1YXJlOiBcKCBwID0gMC4xMjgwIFwpDQogIA0KKipL4bq/dCBsdeG6rW46KioNCg0KVsOsIFwoIHAgPiAwLjA1IFwpLCB0YSAqKmtow7RuZyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgXCggSF8wIFwpKiouDQoNClxbDQpcUmlnaHRhcnJvdyBcdGV4dHtLaMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGto4bqzbmcgxJHhu4tuaCBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSBuZ3V5IGPGoSBjw7Mga2luaCBuZ2hp4buHbSB0aOG7sWMgdOG6rXAgZ2nhu69hIGhhaSBuaMOzbSB0csaw4budbmcufQ0KXF0NCg0KKipEaeG7hW4gZ2nhuqNpOioqDQoNCi0gVOG7tyBz4buRIFJSID0gMC44NDM3IGNobyB0aOG6pXkgc2luaCB2acOqbiB04burIHRyxrDhu51uZyAqKmPDsyB04bqhbyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1KiogY8OzICoqdOG7tyBs4buHIHThu6tuZyB0aOG7sWMgdOG6rXAgdGjhuqVwIGjGoW4ga2hv4bqjbmcgMTYlKiogc28gduG7m2kgbmjDs20ga2jDtG5nIGPDsyDEkWnhu4F1IGtp4buHbi4NCg0KLSBUdXkgbmhpw6puLCBkbyBraG/huqNuZyB0aW4gY+G6rXkgY2jhu6lhIDEgdsOgIHAtdmFsdWUga2jDtG5nIMSR4bunIG5o4buPLCB0YSAqKmtow7RuZyB0aOG7gyBr4bq/dCBsdeG6rW4gc+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiouDQoNCiMjIyBU4bu3IHPhu5EgQ2jDqm5oIChPZGRzIFJhdGlvIC0gT1IpDQoNCmBgYHtyfQ0Kb2Rkc3JhdGlvKHRhYmxlX3Jlc2VhcmNoX2ludGVybl9jbGVhcikNCmBgYA0KIyMjIFThu7cgc+G7kSBjaMOqbmggKE9kZHMgUmF0aW8gLSBPUikNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotIFwoIEhfMDogT1IgPSAxIFwpOiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4Egb2RkcyBjw7MgdGjhu7FjIHThuq1wIGdp4buvYSBoYWkgbmjDs20gdHLGsOG7nW5nLg0KLSBcKCBIXzE6IE9SIFxuZXEgMSBcKTogQ8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4Egb2RkcyBjw7MgdGjhu7FjIHThuq1wIGdp4buvYSBoYWkgbmjDs20gdHLGsOG7nW5nLg0KDQotLS0NCg0KKipL4bq/dCBxdeG6ozoqKg0KDQotIE9kZHMgUmF0aW8gKE9SKSA9IDEuNTg2MA0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlOiBcKCBbMC44NjkzOyAyLjkwNzJdIFwpDQotIEdpw6EgdHLhu4sgcC12YWx1ZToNCiAgLSBNaWQtcCBleGFjdDogXCggcCA9IDAuMTMyMiBcKQ0KICAtIEZpc2hlciBleGFjdDogXCggcCA9IDAuMTY4NyBcKQ0KICAtIENoaS1zcXVhcmU6IFwoIHAgPSAwLjEyODAgXCkNCg0KLS0tDQoNCioqS+G6v3QgbHXhuq1uOioqDQoNClbDrCB04bqldCBj4bqjIGdpw6EgdHLhu4sgXCggcCA+IDAuMDUgXCksIHRhICoqa2jDtG5nIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBcKCBIXzAgXCkqKi4NCg0KXFsNClxSaWdodGFycm93IFx0ZXh0e0NoxrBhIGPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUgdOG6oWkgdHLGsOG7nW5nIOG6o25oIGjGsOG7n25nIMSR4bq/biBvZGRzIHNpbmggdmnDqm4gdOG7q25nIMSRaSB0aOG7sWMgdOG6rXAufQ0KXF0NCg0KLS0tDQoNCiMjIyBEaeG7hW4gZ2nhuqNpOg0KDQotIEdpw6EgdHLhu4sgT1IgPSAxLjU4NjAgY2hvIHRo4bqleSBvZGRzIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCDhu58gbmjDs20gKipjw7MgdOG6oW8gxJFp4buBdSBraeG7h24gbmdoacOqbiBj4bupdSoqIGNhbyBoxqFuIGtob+G6o25nICoqMS41OSBs4bqnbioqIHNvIHbhu5tpIG5ow7NtIHRyxrDhu51uZyBraMO0bmcgdOG6oW8gxJFp4buBdSBraeG7h24uDQoNCi0gVHV5IG5oacOqbiwgdsOsIGtob+G6o25nIHRpbiBj4bqteSBjaOG7qWEgMSB2w6AgcC12YWx1ZSA+IDAuMDUsIG7Dqm4gKipz4buxIGtow6FjIGJp4buHdCBuw6B5IGtow7RuZyDEkeG7pyBt4bqhbmggduG7gSBt4bq3dCB0aOG7kW5nIGvDqioqIMSR4buDIMSRxrBhIHJhIGvhur90IGx14bqtbiBjaOG6r2MgY2jhuq9uLg0KDQpgYGB7cn0NCm9kZHNyYXRpbyh0YWJsZV9yZXNlYXJjaF9pbnRlcm5fY2xlYXIyKQ0KYGBgDQoqKlThu7cgc+G7kSBjaMOqbmggKE9kZHMgUmF0aW8gLSBPUikqKg0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gXCggSF8wOiBPUiA9IDEgXCk6IEtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSBvZGRzIGPDsyBraW5oIG5naGnhu4dtIHRo4buxYyB04bqtcCBnaeG7r2EgaGFpIG5ow7NtIHRyxrDhu51uZy4gIA0KLSBcKCBIXzE6IE9SIFxuZXEgMSBcKTogQ8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4Egb2RkcyB0aOG7sWMgdOG6rXAgZ2nhu69hIGhhaSBuaMOzbS4NCg0KKipL4bq/dCBxdeG6ozoqKg0KDQotIFThu7cgc+G7kSBjaMOqbmggKE9SKSA9IDAuNjMwMiAgDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSU6IFwoIFswLjM0NDAgOyAxLjE1MDNdIFwpICANCi0gQ8OhYyBwLXZhbHVlOg0KICAtIE1pZC1wIGV4YWN0OiBcKCBwID0gMC4xMzIyIFwpDQogIC0gRmlzaGVyIGV4YWN0OiBcKCBwID0gMC4xNjg3IFwpDQogIC0gQ2hpLXNxdWFyZTogXCggcCA9IDAuMTI4MCBcKQ0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpWw6wgXCggcCA+IDAuMDUgXCksIHRhICoqa2jDtG5nIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBcKCBIXzAgXCkqKi4NCg0KXFsNClxSaWdodGFycm93IFx0ZXh0e0tow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1IHThuqFpIHRyxrDhu51uZyBsw6BtIHRoYXkgxJHhu5VpIG9kZHMgY8OzIHRo4buxYyB04bqtcC59DQpcXQ0KDQoqKkRp4buFbiBnaeG6o2k6KioNCg0KLSBPUiA9IDAuNjMwMiBuZ2jEqWEgbMOgIG9kZHMgY8OzIGtpbmggbmdoaeG7h20gdGjhu7FjIHThuq1wIGPhu6dhIHNpbmggdmnDqm4gdOG7qyBuaMOzbSAqKmPDsyB04bqhbyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1KiogKipjaOG7iSBi4bqxbmcgNjMuMDIlKiogc28gduG7m2kgbmjDs20gKipraMO0bmcgxJHGsOG7o2MgdOG6oW8gxJFp4buBdSBraeG7h24qKi4NCi0gVHV5IG5oacOqbiwgZG8ga2hv4bqjbmcgdGluIGPhuq15IGNo4bupYSAxIHbDoCBcKCBwID4gMC4wNSBcKSwgc+G7sSBraMOhYyBiaeG7h3QgbsOgeSAqKmtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiouDQoNCiMjIEPhurdwIDM6IEdlbmRlciDDlyBDb25jZXJuIExldmVsDQoNCkPDonUgaOG7j2k6IE3hu6ljIMSR4buZIGxvIG5n4bqhaSB24buBIEFJIGPDsyBraMOhYyBuaGF1IGdp4buvYSBuYW0gdsOgIG7hu68ga2jDtG5nPw0KDQpN4bulYyB0acOqdTogUGjDom4gdMOtY2ggY+G6o20gbmjhuq1uIGtow6FjIGJp4buHdCBnaeG7r2EgaGFpIGdp4bubaSB0csaw4bubYyDhuqNuaCBoxrDhu59uZyBj4bunYSBBSS4NCg0KIyMjIELhuqNuZyB04bqnbiBz4buRIGNow6lvDQoNCmBgYHtyfQ0KIyDEkOG7lWkgbmjDo24gdGnhur9uZyBWaeG7h3QgY2hvIGdp4bubaSB0w61uaCAoa2jDtG5nIHRoYXkgxJHhu5VpIHRo4bupIHThu7EpDQpkJEdlbmRlci5WTiA8LSBmYWN0b3IoZCRHZW5kZXIsDQogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiRmVtYWxlIiwgIk1hbGUiKSwgICMgTuG7ryB0csaw4bubYywgTmFtIHNhdQ0KICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIk7hu68iLCAiTmFtIikpDQoNCiMgxJDhu5VpIG5ow6NuIHRp4bq/bmcgVmnhu4d0IGNobyBt4bupYyDEkeG7mSBxdWFuIHTDom0NCmQkQ29uY2Vybi5MZXZlbC5WTiA8LSBmYWN0b3IoZCRDb25jZXJuLkxldmVsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJOb3QgY29uY2VybmVkIiwgIlNsaWdodGx5IGNvbmNlcm5lZCIsICJNb2RlcmF0ZWx5IGNvbmNlcm5lZCIsICJIaWdobHkgY29uY2VybmVkIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIksgcXVhbiB0w6JtIiwgIkjGoWkgcXVhbiB0w6JtIiwgIlF1YW4gdMOibSB24burYSBwaOG6o2kiLCAiUuG6pXQgcXVhbiB0w6JtIikpDQoNCiMgVOG6oW8gYuG6o25nIHThuqduIHPhu5EgY2jDqW8gduG7m2kgbmjDo24gdGnhur9uZyBWaeG7h3QgdsOgIHRo4bupIHThu7EgTuG7ryBy4buTaSBOYW0NCnRhYmxlX2dlbmRlcl9jb25jZXJuIDwtIHRhYmxlKGQkR2VuZGVyLlZOLCBkJENvbmNlcm4uTGV2ZWwuVk4pDQp0YWJsZV9nZW5kZXJfY29uY2Vybg0KDQojIFTDrW5oIHThu7cgbOG7hyB0aGVvIGjDoG5nDQpwcm9wLnRhYmxlKHRhYmxlX2dlbmRlcl9jb25jZXJuLCBtYXJnaW4gPSAxKQ0KDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gTuG7ryBnaeG7m2kgdGjhu4MgaGnhu4duIG3hu6ljIMSR4buZIHF1YW4gdMOibSBjYW8gaMahbiBuYW0sIMSR4bq3YyBiaeG7h3Qg4bufIG3hu6ljIOKAnGjGoWkgcXVhbiB0w6Jt4oCdICg0OS41NCUgbuG7ryBzbyB24bubaSAzOS4yNCUgbmFtKS4NCg0KLSBOYW0gZ2nhu5tpIGPDsyB4dSBoxrDhu5tuZyB0aOG7nSDGoSBuaGnhu4F1IGjGoW4sIHRo4buDIGhp4buHbiBxdWEgdOG7tyBs4buHIOKAnGtow7RuZyBxdWFuIHTDom3igJ0gY2FvIGjGoW4gbuG7ryAoNDMuMDQlIG5hbSBzbyB24bubaSAzMy4wMyUgbuG7rykuDQoNCi0gQ+G6oyBoYWkgZ2nhu5tpIMSR4buBdSBoaeG6v20ga2hpIGLDoHkgdOG7jyBz4buxIHF1YW4gdMOibSBt4bqhbmg6IGNo4buJIDEuODMlIG7hu68gdsOgIDIuNTMlIG5hbSBjaOG7jW4gbeG7qWMg4oCccuG6pXQgcXVhbiB0w6Jt4oCdLg0KDQotIFPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgZ2nhu5tpIGzDoCByw7UgbmjhuqV0IOG7nyBoYWkgbeG7qWMgxJHhu5FpIGzhuq1wOiDigJxraMO0bmcgcXVhbiB0w6Jt4oCdIHbDoCDigJxoxqFpIHF1YW4gdMOibeKAnS4NCg0KIyMjIFRy4buxYyBxdWFuIGjDs2ENCg0KYGBge3IgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTZ9DQojIENodeG6qW4gYuG7iyBk4buvIGxp4buHdQ0KZGZfY29uY2Vybl9zdGFja2VkIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZCRHZW5kZXIuVk4sIGQkQ29uY2Vybi5MZXZlbC5WTikpDQpjb2xuYW1lcyhkZl9jb25jZXJuX3N0YWNrZWQpIDwtIGMoIkdp4bubaSB0w61uaCIsICJN4bupYyDEkeG7mSBxdWFuIHTDom0iLCAiVOG6p24gc+G7kSIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgY2jhu5NuZyBjw7Mgc+G7kQ0KZ2dwbG90KGRmX2NvbmNlcm5fc3RhY2tlZCwgYWVzKHggPSBgR2nhu5tpIHTDrW5oYCwgeSA9IGBU4bqnbiBz4buRYCwgZmlsbCA9IGBN4bupYyDEkeG7mSBxdWFuIHTDom1gKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYFThuqduIHPhu5FgKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLA0KICAgICAgICAgICAgc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIiwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgY2jhu5NuZzogTeG7qWMgxJHhu5kgcXVhbiB0w6JtIHRoZW8gZ2nhu5tpIHTDrW5oIiwNCiAgICAgICB4ID0gIkdp4bubaSB0w61uaCIsIHkgPSAiVOG6p24gc+G7kSIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwxIikgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDEzKSArDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGZhY2UgPSAiYm9sZCIpKQ0KDQoNCmBgYA0KDQojIyMgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIGNoaSBiw6xuaCBwaMawxqFuZykNCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlX2dlbmRlcl9jb25jZXJuKQ0KYGBgDQotIFjDoWMgxJHhu4tuaCB4ZW0gaGFpIGJp4bq/biDEkeG7i25oIHTDrW5oIChnaeG7m2kgdMOtbmggdsOgIG3hu6ljIMSR4buZIHF1YW4gdMOibSkgY8OzIG3hu5FpIGxpw6puIGjhu4cgKHBo4bulIHRodeG7mWMpIHbhu5tpIG5oYXUgaGF5IGtow7RuZy4NCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotICoqXCggSF8wIFwpKiogKEdp4bqjIHRodXnhur90IGtow7RuZyk6IEdp4bubaSB0w61uaCB2w6AgbeG7qWMgxJHhu5kgcXVhbiB0w6JtIGzDoCDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdS4gIA0KLSAqKlwoIEhfMSBcKSoqIChHaeG6oyB0aHV54bq/dCDEkeG7kWkpOiBHaeG7m2kgdMOtbmggdsOgIG3hu6ljIMSR4buZIHF1YW4gdMOibSBjw7MgbGnDqm4gaOG7hyB24bubaSBuaGF1Lg0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZzoqKg0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6o6IFwoIFxjaGleMiA9IDIuNDE3MSBcKSAgDQotIELhuq1jIHThu7EgZG86IFwoIGRmID0gMyBcKSAgDQotIEdpw6EgdHLhu4sgcC12YWx1ZTogXCggcCA9IDAuNDkwNSBcKQ0KDQoqKkvhur90IGx14bqtbiB0aOG7kW5nIGvDqjoqKg0KDQotIFbDrCBcKCBwID4gMC4wNSBcKSwga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBcKCBIXzAgXCkuICANCi0gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgbeG7qWMgxJHhu5kgcXVhbiB0w6JtLg0KDQoqKlRo4bqjbyBsdeG6rW4gdGjDqm0gduG7gSBi4bqjbiBjaOG6pXQgbeG7kWkgcXVhbiBo4buHOioqDQoNCk3hurdjIGTDuSBtw7QgdOG6oyB04bqnbiBzdeG6pXQgY2hvIHRo4bqleSBu4buvIGPDsyB4dSBoxrDhu5tuZyBxdWFuIHTDom0gbmhp4buBdSBoxqFuIG5hbSAoxJHhurdjIGJp4buHdCDhu58gbeG7qWMg4oCcaMahaSBxdWFuIHTDom3igJ0pLCBuaMawbmcga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIGNo4buJIHJhIHLhurFuZyBz4buxIGtow6FjIGJp4buHdCDEkcOzIGtow7RuZyDEkeG7pyBs4bubbiDEkeG7gyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiBIYWkgYmnhur9uIMSRxrDhu6NjIGNvaSBsw6AgxJHhu5ljIGzhuq1wIHbhu4EgbeG6t3QgdGjhu5FuZyBrw6og4oCTIHThu6ljIGzDoCBz4buxIGtow6FjIGJp4buHdCBjw7MgdGjhu4MgZG8gbmfhuqt1IG5oacOqbiB0cm9uZyBt4bqrdSBraOG6o28gc8OhdC4NCg0KIyMjIEhp4buHdSB04bu3IGzhu4cNCg0KDQpU4bu3IGzhu4cgxJHGsOG7o2MgxJHhu4tuaCBuZ2jEqWEgbmjGsCBzYXU6DQoNCi0gXCggcF8xID0gUChcdGV4dHsiUuG6pXQgcXVhbiB0w6JtIn0gXG1pZCBcdGV4dHtHaeG7m2kgdMOtbmh9ID0gXHRleHR7TuG7r30pIFwpICANCi0gXCggcF8yID0gUChcdGV4dHsiUuG6pXQgcXVhbiB0w6JtIn0gXG1pZCBcdGV4dHtHaeG7m2kgdMOtbmh9ID0gXHRleHR7TmFtfSkgXCkNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotIFwoIEhfMDogcF8xIC0gcF8yID0gMCBcKTogS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyDigJxy4bqldCBxdWFuIHTDom3igJ0gZ2nhu69hIG7hu68gdsOgIG5hbSAgDQotIFwoIEhfMTogcF8xIC0gcF8yID4gMCBcKTogVOG7tyBs4buHIG7hu68g4oCccuG6pXQgcXVhbiB0w6Jt4oCdIGNhbyBoxqFuIG5hbQ0KDQpgYGB7cn0NCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY2jDqW8gZ2nhu69hIEdlbmRlciB2w6AgQ29uY2VybiBMZXZlbA0KdGFibGVfZ2VuZGVyX2NvbmNlcm4gPC0gdGFibGUoZCRHZW5kZXIuVk4sIGQkQ29uY2Vybi5MZXZlbC5WTikNCg0KIyBUaMOqbSB04buVbmcgaMOgbmcgdsOgIHThu5VuZyBj4buZdA0KdGFibGVfZ2VuZGVyX2NvbmNlcm5fbWFyZ2lucyA8LSBhZGRtYXJnaW5zKHRhYmxlX2dlbmRlcl9jb25jZXJuKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcNCnRhYmxlX2dlbmRlcl9jb25jZXJuX21hcmdpbnMNCmBgYA0KYGBge3J9DQojIFPhu5EgbmfGsOG7nWkgIlLhuqV0IHF1YW4gdMOibSIgdHJvbmcgdOG7q25nIGdp4bubaQ0KY291bnRzX2NvbmNlcm5faGlnaCA8LSBjKHRhYmxlX2dlbmRlcl9jb25jZXJuWyJO4buvIiwgIlLhuqV0IHF1YW4gdMOibSJdLCB0YWJsZV9nZW5kZXJfY29uY2VyblsiTmFtIiwgIlLhuqV0IHF1YW4gdMOibSJdKQ0KDQojIFThu5VuZyBz4buRIG5nxrDhu51pIHRoZW8gdOG7q25nIGdp4bubaQ0KdG90YWxzX2dlbmRlciA8LSBjKHN1bSh0YWJsZV9nZW5kZXJfY29uY2VyblsiTuG7ryIsIF0pLCBzdW0odGFibGVfZ2VuZGVyX2NvbmNlcm5bIk5hbSIsIF0pKQ0KDQojIEtp4buDbSDEkeG7i25oIHThu4kgbOG7hyBt4buZdCBwaMOtYTogcDEgPiBwMg0KdGVzdF9jb25jZXJuIDwtIHByb3AudGVzdChjb3VudHNfY29uY2Vybl9oaWdoLCB0b3RhbHNfZ2VuZGVyLCBhbHRlcm5hdGl2ZSA9ICJncmVhdGVyIiwgY29ycmVjdCA9IEZBTFNFKQ0KDQojIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KdGVzdF9jb25jZXJuDQoNCmBgYA0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCkdp4bqjIHPhu60ga2nhu4NtIMSR4buLbmggY2hvIHJhIGPDoWMga+G6v3QgcXXhuqMgc2F1Og0KDQotIFThu7cgbOG7hyBu4buvOiAgDQogIFxbIFxoYXR7cH1fMSA9IFxmcmFjezJ9ezEwOX0gXGFwcHJveCAwLjAxODMgXF0NCg0KLSBU4bu3IGzhu4cgbmFtOiAgDQogIFxbIFxoYXR7cH1fMiA9IFxmcmFjezJ9ezc5fSBcYXBwcm94IDAuMDI1MyBcXQ0KDQotIEhp4buHdSB04bu3IGzhu4c6ICANCiAgXFsgXGhhdHtwfV8xIC0gXGhhdHtwfV8yID0gMC4wMTgzIC0gMC4wMjUzID0gLTAuMDA3MCBcXQ0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6o6ICANCiAgXFsgXGNoaV4yID0gMC4xMDY4LCBccXVhZCBkZiA9IDEgXF0NCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlOiAgDQogIFxbIFstMC4wNDI5LFwgMS4wMDAwXSBcXQ0KDQotIEdpw6EgdHLhu4sgcC12YWx1ZTogIA0KICBcWyBwID0gMC42MjgxIFxdDQoNCioqS+G6v3QgbHXhuq1uOioqDQoNClbDrCBcKCBwID0gMC42MjgxID4gMC4wNSBcKSwgdGEga2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBcKCBIXzAgXCkuICANClPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIOKAnHLhuqV0IHF1YW4gdMOibeKAnSBnaeG7r2EgbuG7ryB2w6AgbmFtIGzDoCBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KKipEaeG7hW4gZ2nhuqNpOioqDQoNClThu7cgbOG7hyBu4buvIOG7nyBt4bupYyDigJxy4bqldCBxdWFuIHTDom3igJ0gdGjhuqVwIGjGoW4gbmFtLCBuaMawbmcgc+G7sSBjaMOqbmggbOG7h2NoICgwLjcgxJFp4buDbSBwaOG6p24gdHLEg20pIGzDoCBy4bqldCBuaOG7jy4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgY8OzIHRo4buDIGzDoCBkbyBuZ+G6q3Ugbmhpw6puIHbDoCBraMO0bmcgcGjhuqNuIMOhbmggc+G7sSBraMOhYyBiaeG7h3QgdGjhu7FjIHPhu7EgdHJvbmcgdG/DoG4gYuG7mSBxdeG6p24gdGjhu4MuDQoNCiMjIyBU4bu3IHPhu5Egbmd1eSBjxqEgKFJSKQ0KDQoNCioqQ8OidSBo4buPaSBuZ2hpw6puIGPhu6l1OioqICANCkxp4buHdSBnaeG7m2kgdMOtbmggKG5hbS9u4buvKSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGto4bqjIG7Eg25nIMSR4bqhdCBt4bupYyDigJxy4bqldCBxdWFuIHTDom3igJ0gaGF5IGtow7RuZz8NCg0KKipN4bulYyB0acOqdToqKiAgDQpTbyBzw6FuaCB4w6FjIHN14bqldCDEkeG6oXQgbeG7qWMg4oCccuG6pXQgcXVhbiB0w6Jt4oCdIGdp4buvYSBoYWkgZ2nhu5tpIGLhurFuZyB04bu3IHPhu5Egbmd1eSBjxqEgKFJlbGF0aXZlIFJpc2sg4oCTIFJSKS4NCg0KKipDw7RuZyB0aOG7qWMgdMOtbmg6KioNCg0KXFsNClJSID0gXGZyYWN7UChcdGV4dHsiUuG6pXQgcXVhbiB0w6JtIn0gXG1pZCBcdGV4dHtHaeG7m2kgdMOtbmh9ID0gXHRleHR7TuG7r30pfXtQKFx0ZXh0eyJS4bqldCBxdWFuIHTDom0ifSBcbWlkIFx0ZXh0e0dp4bubaSB0w61uaH0gPSBcdGV4dHtOYW19KX0NClxdDQoNClRyb25nIMSRw7M6DQoNCi0gVOG7rSBz4buRIGzDoCB4w6FjIHN14bqldCBu4buvIMSR4bqhdCBt4bupYyDigJxy4bqldCBxdWFuIHTDom3igJ0gIA0KLSBN4bqrdSBz4buRIGzDoCB4w6FjIHN14bqldCBuYW0gxJHhuqF0IG3hu6ljIOKAnHLhuqV0IHF1YW4gdMOibeKAnQ0KDQoqKsOdIG5naMSpYToqKg0KDQotIE7hur91IFwoIFJSID4gMSBcKTogTuG7ryBjw7Mga2jhuqMgbsSDbmcg4oCccuG6pXQgcXVhbiB0w6Jt4oCdIGNhbyBoxqFuIG5hbSAgDQotIE7hur91IFwoIFJSIDwgMSBcKTogTuG7ryBjw7Mga2jhuqMgbsSDbmcg4oCccuG6pXQgcXVhbiB0w6Jt4oCdIHRo4bqlcCBoxqFuIG5hbSAgDQotIE7hur91IFwoIFJSID0gMSBcKTogS2jhuqMgbsSDbmcgxJHhuqF0IG3hu6ljIOKAnHLhuqV0IHF1YW4gdMOibeKAnSBsw6AgbmjGsCBuaGF1IGdp4buvYSBoYWkgZ2nhu5tpDQoNCioqVMOtbmggY2jhu4kgc+G7kSBSZWxhdGl2ZSBSaXNrOioqDQoNCmBgYHtyfQ0Kcmlza3JhdGlvKHRhYmxlX2dlbmRlcl9jb25jZXJuKQ0KYGBgDQoNCiMjIyBU4bu3IHPhu5Egbmd1eSBjxqEgKFJlbGF0aXZlIFJpc2spIOKAkyBN4bupYyAiUuG6pXQgcXVhbiB0w6JtIg0KDQoqKlTDrW5oIHThu7cgbOG7hyBy4bqldCBxdWFuIHTDom06KioNCg0KLSBO4buvOg0KICBcWw0KICBcaGF0e3B9X3tcdGV4dHtS4bqldCBxdWFuIHTDom0gfCBO4buvfX0gPSBcZnJhY3syfXsxMDl9IFxhcHByb3ggMC4wMTgzDQogIFxdDQoNCi0gTmFtOg0KICBcWw0KICBcaGF0e3B9X3tcdGV4dHtS4bqldCBxdWFuIHTDom0gfCBOYW19fSA9IFxmcmFjezJ9ezc5fSBcYXBwcm94IDAuMDI1Mw0KICBcXQ0KDQoqKlThu7cgc+G7kSBuZ3V5IGPGoToqKg0KDQpcWw0KUlIgPSBcZnJhY3tcaGF0e3B9X3tcdGV4dHtS4bqldCBxdWFuIHTDom0gfCBO4buvfX19e1xoYXR7cH1fe1x0ZXh0e1LhuqV0IHF1YW4gdMOibSB8IE5hbX19fQ0KPSBcZnJhY3syLzEwOX17Mi83OX0NCj0gXGZyYWN7MC4wMTgzfXswLjAyNTN9IFxhcHByb3ggMC43OTQ5DQpcXQ0KDQoqKktob+G6o25nIHRpbiBj4bqteSA5NSU6KioNCg0KXFsNCkNJID0gWzAuNTg1NztcIDEuMDc4OV0NClxdDQoNCioqR2nDoSB0cuG7iyBwLXZhbHVlOioqDQoNCi0gTWlkLXAgZXhhY3Q6IFwoIHAgPSAwLjEzMzggXCkgIA0KLSBGaXNoZXIgZXhhY3Q6IFwoIHAgPSAwLjQ4NjQgXCkgIA0KLSBDaGktc3F1YXJlOiBcKCBwID0gMC40OTA1IFwpDQoNCioqS+G6v3QgbHXhuq1uOioqDQoNCi0gVuG7m2kgXCggUlIgPSAwLjc5NDkgPCAxIFwpLCBu4buvIGPDsyBuZ3V5IGPGoSDEkeG6oXQgbeG7qWMg4oCccuG6pXQgcXVhbiB0w6Jt4oCdICoqdGjhuqVwIGjGoW4qKiBuYW0uDQotIFR1eSBuaGnDqm4sIHbDrCBraG/huqNuZyB0aW4gY+G6rXkgY2jhu6lhIDEgdsOgIHThuqV0IGPhuqMgY8OhYyBwLXZhbHVlIMSR4buBdSA+IDAuMDUsIG7Dqm4gc+G7sSBraMOhYyBiaeG7h3QgbsOgeSAqKmtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqKiouDQoNCg0KIyMjIFThu7cgc+G7kSBDaMOqbmggKE9kZHMgUmF0aW8gLSBPUikNCg0KYGBge3J9DQpvcl9yZXN1bHQzIDwtIG9kZHNyYXRpbyh0YWJsZV9nZW5kZXJfY29uY2VybikNCnByaW50KG9yX3Jlc3VsdDMpDQoNCmBgYA0KKipUw61uaCBvZGRzICh04bu3IGzhu4cgY2jDqW8pIHRoZW8gdOG7q25nIG5ow7NtOioqDQoNCi0gTmFtOg0KICBcWw0KICBcdGV4dHtPZGRzfV97XHRleHR7TmFtfX0gPSBcZnJhY3syfXs3N30gXGFwcHJveCAwLjAyNjANCiAgXF0NCg0KLSBO4buvOg0KICBcWw0KICBcdGV4dHtPZGRzfV97XHRleHR7TuG7r319ID0gXGZyYWN7Mn17MTA3fSBcYXBwcm94IDAuMDE4Nw0KICBcXQ0KDQoqKlTDrW5oIE9kZHMgUmF0aW8gKE9SKToqKg0KDQpcWw0KT1IgPSBcZnJhY3tcdGV4dHtPZGRzfV97XHRleHR7TuG7r319fXtcdGV4dHtPZGRzfV97XHRleHR7TmFtfX19DQo9IFxmcmFjezIvMTA3fXsyLzc5fQ0KPSBcZnJhY3swLjAxODd9ezAuMDI2MH0gXGFwcHJveCAwLjYxMDgNClxdDQoNCioqS2hv4bqjbmcgdGluIGPhuq15IDk1JToqKg0KDQpcWw0KQ0kgPSBbMC4zMTc5IDsgMS4xNjM0XQ0KXF0NCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotIFwoIEhfMCBcKTogT2RkcyByYXRpbyBnaeG7r2EgbmFtIHbDoCBu4buvIGLhurFuZyAxIChraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgbeG7qWMg4oCccuG6pXQgcXVhbiB0w6Jt4oCdKS4gIA0KLSBcKCBIXzEgXCk6IE9kZHMgcmF0aW8ga2jDoWMgMSAoY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGdp4bubaSB0w61uaCB2w6AgbeG7qWMg4oCccuG6pXQgcXVhbiB0w6Jt4oCdKS4NCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQotIE1pZC1wIGV4YWN0OiBcKCBwID0gMC4xMzM4IFwpICANCi0gRmlzaGVyIGV4YWN0OiBcKCBwID0gMC40ODY0IFwpICANCi0gQ2hpLXNxdWFyZTogXCggcCA9IDAuNDkwNSBcKQ0KDQoqKkvhur90IGx14bqtbiB0aOG7kW5nIGvDqjoqKg0KDQpWw6wgY8OhYyBnacOhIHRy4buLIFwoIHAgPiAwLjA1IFwpLCB0YSAqKmtow7RuZyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgXCggSF8wIFwpKiouDQoNClxbDQpcUmlnaHRhcnJvdyBcdGV4dHtDaMawYSBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga2jhurNuZyDEkeG7i25oIGdp4bubaSB0w61uaCBjw7MgbGnDqm4gaOG7hyB24bubaSBt4bupYyDigJxy4bqldCBxdWFuIHTDom3igJ0ufQ0KXF0NCg0KKirDnSBuZ2jEqWE6KioNCg0KLSBPZGRzIG7hu68g4oCccuG6pXQgcXVhbiB0w6Jt4oCdIHRyw6puIG9kZHMgbuG7ryBraMO0bmcg4oCccuG6pXQgcXVhbiB0w6Jt4oCdIGNo4buJIGLhurFuZyBraG/huqNuZyAqKjYxLjA4JSoqIHNvIHbhu5tpIHTGsMahbmcgcXVhbiB0xrDGoW5nIHThu7Eg4bufIG5hbS4NCi0gVHV5IG5oacOqbiwgZG8gbeG7qWMgxJHhu5kgY2jDqm5oIGzhu4djaCBuw6B5IGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIChjw6FjIHAtdmFsdWUgPiAwLjA1KSwgbsOqbiB0YSBjaMawYSB0aOG7gyBraOG6s25nIMSR4buLbmggcuG6sW5nIGdp4bubaSB0w61uaCBjw7Mg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IMSR4bq/biBraOG6oyBuxINuZyDEkeG6oXQgbeG7qWMg4oCccuG6pXQgcXVhbiB0w6Jt4oCdLg0KDQoNCiMjIEPhurdwIDQ6IENvbmNlcm4gTGV2ZWwgw5cgUmVzZWFyY2ggT3Bwb3J0dW5pdGllcyBhdCBVbml2ZXJzaXR5DQoNCkPDonUgaOG7j2k6IFRyxrDhu51uZyBjw7MgdOG6oW8gxJFp4buBdSBraeG7h24gbmdoacOqbiBj4bupdSBBSSBnacO6cCBzaW5oIHZpw6puIGLhu5t0IGxvIG5n4bqhaSBraMO0bmc/DQoNCk3hu6VjIHRpw6p1OiDEkMOhbmggZ2nDoSDhuqNuaCBoxrDhu59uZyBj4bunYSBtw7RpIHRyxrDhu51uZyBo4buNYyB0aHXhuq10IMSR4bq/biBt4bupYyDEkeG7mSBsbyBuZ+G6oWkgduG7gSBBSS4NCg0KIyMjICBC4bqjbmcgdOG6p24gc+G7kSBjaMOpbw0KDQpgYGB7cn0NCiMgxJDhu5VpIG5ow6NuIHRp4bq/bmcgVmnhu4d0IGNobyBiaeG6v24gbeG7qWMgxJHhu5kgbG8gbmfhuqFpDQpkJENvbmNlcm4uTGV2ZWwuVk4gPC0gZmFjdG9yKGQkQ29uY2Vybi5MZXZlbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiTm90IGNvbmNlcm5lZCIsICJTbGlnaHRseSBjb25jZXJuZWQiLCAiTW9kZXJhdGVseSBjb25jZXJuZWQiLCAiSGlnaGx5IGNvbmNlcm5lZCIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJLaMO0bmcgcXVhbiB0w6JtIiwgIkjGoWkgcXVhbiB0w6JtIiwgIlF1YW4gdMOibSB24burYSBwaOG6o2kiLCAiUuG6pXQgcXVhbiB0w6JtIikpDQoNCiMgxJDhu5VpIG5ow6NuIHRp4bq/bmcgVmnhu4d0IGNobyBiaeG6v24gY8ahIGjhu5lpIG5naGnDqm4gY+G7qXUgdOG6oWkgdHLGsOG7nW5nDQpkJFJlc2VhcmNoLlZOIDwtIGZhY3RvcihkJFJlc2VhcmNoLk9wcG9ydHVuaXRpZXMsDQogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJObyIsICJZZXMiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyBjw7MiLCAiQ8OzIikpDQoNCiMgVOG6oW8gYuG6o25nIHThuqduIHPhu5EgY2jDqW8gZ2nhu69hIENvbmNlcm4gTGV2ZWwgdsOgIFJlc2VhcmNoIE9wcG9ydHVuaXRpZXMNCnRhYmxlX2NvbmNlcm5fcmVzZWFyY2ggPC0gdGFibGUoZCRDb25jZXJuLkxldmVsLlZOLCBkJFJlc2VhcmNoLlZOKQ0KdGFibGVfY29uY2Vybl9yZXNlYXJjaA0KDQojIFTDrW5oIHThu7cgbOG7hyB0aGVvIGjDoG5nDQpwcm9wLnRhYmxlKHRhYmxlX2NvbmNlcm5fcmVzZWFyY2gsIG1hcmdpbiA9IDEpDQoNCg0KYGBgDQoNCi0gVHJvbmcgbmjDs20ga2jDtG5nIHF1YW4gdMOibSwgNTIuODclIGjhu41jIHThuqFpIHRyxrDhu51uZyBjw7MgY8ahIGjhu5lpIG5naGnDqm4gY+G7qXUsIDQ3LjEzJSBo4buNYyB04bqhaSB0csaw4budbmcga2jDtG5nIGPDsyBjxqEgaOG7mWkgbmdoacOqbiBj4bupdS4NCg0KLSBUcm9uZyBuaMOzbSBoxqFpIHF1YW4gdMOibSwgNjIuMzUlIHRodeG7mWMgdHLGsOG7nW5nIGtow7RuZyBjw7MgY8ahIGjhu5lpIG5naGnDqm4gY+G7qXUsIGNo4buJIDM3LjY1JSB0aHXhu5ljIG5ow7NtIGPDsyBo4buXIHRy4bujLg0KDQotIFbhu5tpIG5ow7NtIHF1YW4gdMOibSB24burYSBwaOG6o2ksIHThu7cgbOG7hyBjxaluZyBuZ2hpw6puZyB24buBIHBow61hIGtow7RuZyBjw7MgbmdoacOqbiBj4bupdSAoNjIuMDclKS4NCg0KLSBOaMOzbSBy4bqldCBxdWFuIHTDom0gdGjDrCBuZ8aw4bujYyBs4bqhaTogY8OzIHThu5tpIDc1JSBo4buNYyB04bqhaSB0csaw4budbmcgY8OzIGjhu5cgdHLhu6MgbmdoacOqbiBj4bupdSwgY2jhu4kgMjUlIHRodeG7mWMgdHLGsOG7nW5nIGtow7RuZyBjw7MNCg0KIyMjICBUcuG7sWMgcXVhbiBow7NhDQpgYGB7ciBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9Nn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBU4bqhbyBi4bqjbmcgZOG7ryBsaeG7h3UgdOG7qyBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbw0KZGZfY29uY2Vybl9yZXNlYXJjaCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGQkQ29uY2Vybi5MZXZlbC5WTiwgZCRSZXNlYXJjaC5WTikpDQpjb2xuYW1lcyhkZl9jb25jZXJuX3Jlc2VhcmNoKSA8LSBjKCJN4bupYyDEkeG7mSBsbyBuZ+G6oWkiLCAiQ8ahIGjhu5lpIG5naGnDqm4gY+G7qXUiLCAiVOG6p24gc+G7kSIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgY2jhu5NuZyBjw7MgbmjDo24gc+G7kQ0KZ2dwbG90KGRmX2NvbmNlcm5fcmVzZWFyY2gsIGFlcyh4ID0gYE3hu6ljIMSR4buZIGxvIG5n4bqhaWAsIHkgPSBgVOG6p24gc+G7kWAsIGZpbGwgPSBgQ8ahIGjhu5lpIG5naGnDqm4gY+G7qXVgKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gYFThuqduIHPhu5FgKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLA0KICAgICAgICAgICAgc2l6ZSA9IDQsIGNvbG9yID0gImJsYWNrIiwgZm9udGZhY2UgPSAiYm9sZCIpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgY2jhu5NuZzogTeG7qWMgxJHhu5kgbG8gbmfhuqFpIMOXIEPGoSBo4buZaSBuZ2hpw6puIGPhu6l1IHThuqFpIHRyxrDhu51uZyIsDQogICAgICAgeCA9ICJN4bupYyDEkeG7mSBsbyBuZ+G6oWkgduG7gSBBSSIsDQogICAgICAgeSA9ICJU4bqnbiBz4buRIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhc3RlbDEiKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgdGhlbWUoDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgZmFjZSA9ICJib2xkIiksDQogICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpDQogICkNCg0KYGBgDQoNCiMjIyAgS2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogKEtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZykNCg0KLSBYw6FjIMSR4buLbmggeGVtIGhhaSBiaeG6v24gxJHhu4tuaCB0w61uaCBjw7MgbeG7kWkgbGnDqm4gaOG7hyAocGjhu6UgdGh14buZYykgduG7m2kgbmhhdSBoYXkga2jDtG5nPw0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOioqDQoNCi0gXCggSF8wIFwpOiBN4bupYyDEkeG7mSBsbyBuZ+G6oWkgduG7gSBBSSB2w6Agdmnhu4djIHRyxrDhu51uZyBjw7MgdOG6oW8gxJFp4buBdSBraeG7h24gbmdoacOqbiBj4bupdSBsw6AgKirEkeG7mWMgbOG6rXAqKiB24bubaSBuaGF1Lg0KDQotIFwoIEhfMSBcKTogTeG7qWMgxJHhu5kgbG8gbmfhuqFpIHbhu4EgQUkgdsOgIHZp4buHYyB0csaw4budbmcgY8OzIHThuqFvIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUgbMOgICoqY8OzIGxpw6puIGjhu4cqKiB24bubaSBuaGF1Li4NCg0KYGBge3J9DQojIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nIGNobyBD4bq3cCA0DQpjaGlzcS50ZXN0KHRhYmxlX2NvbmNlcm5fcmVzZWFyY2gpDQoNCmBgYA0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZzoqKg0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6o6IFwoIFxjaGleMiA9IDUuNjA4OCBcKSAgDQotIELhuq1jIHThu7EgZG86IFwoIGRmID0gMyBcKSAgDQotIEdpw6EgdHLhu4sgcC12YWx1ZTogXCggcCA9IDAuMTMyMyBcKQ0KDQoqKkPhuqNuaCBiw6FvOioqICANCktp4buDbSDEkeG7i25oIGPDsyBj4bqjbmggYsOhbzogXHRleHRpdHsiQ2hpLXNxdWFyZWQgYXBwcm94aW1hdGlvbiBtYXkgYmUgaW5jb3JyZWN0In0g4oCUIGPDsyB0aOG7gyBkbyB04bqnbiBz4buRIGvhu7MgduG7jW5nIG5o4buPIHRyb25nIG3hu5l0IHPhu5Egw7QuDQoNCioqS+G6v3QgbHXhuq1uIHRo4buRbmcga8OqOioqDQoNCi0gVsOsIFwoIHAgPSAwLjEzMjMgPiAwLjA1IFwpLCB0YSAqKmtow7RuZyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgXCggSF8wIFwpKiouDQotIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu6cgbeG6oW5oIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmcgbeG7qWMgxJHhu5kgbG8gbmfhuqFpIHBo4bulIHRodeG7mWMgdsOgbyB2aeG7h2MgdHLGsOG7nW5nIGPDsyB04bqhbyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1Lg0KDQoqKkRp4buFbiBnaeG6o2k6KioNCg0KTeG6t2MgZMO5IGLhuqNuZyBtw7QgdOG6oyB04bqnbiBzdeG6pXQgY2hvIHRo4bqleSBt4buZdCBz4buRIHh1IGjGsOG7m25nICh2w60gZOG7pTogbmjDs20g4oCca2jDtG5nIHF1YW4gdMOibeKAnSBjaGnhur9tIG5oaeG7gXUg4bufIHRyxrDhu51uZyBjw7MgbmdoacOqbiBj4bupdSksIG5oxrBuZyBz4buxIGtow6FjIGJp4buHdCBuw6B5ICoqY2jGsGEgxJHhu6cgbOG7m24gxJHhu4MgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqLiAgDQpEbyDEkcOzLCAqKnRyb25nIHBo4bqhbSB2aSBt4bqrdSBraOG6o28gc8OhdCoqLCBt4bupYyDEkeG7mSBsbyBuZ+G6oWkgdsOgIGPGoSBo4buZaSBuZ2hpw6puIGPhu6l1IHThuqFpIHRyxrDhu51uZyAqKmPDsyB0aOG7gyDEkcaw4bujYyB4ZW0gbMOgIMSR4buZYyBs4bqtcCoqLg0KDQojIyMgSGnhu4d1IHThu7cgbOG7hyANCg0KU28gc8OhbmggdOG7tyBs4buHIHh14bqldCBoaeG7h24gbeG7mXQgxJHhurdjIMSRaeG7g20gbsOgbyDEkcOzIGdp4buvYSBoYWkgbmjDs20gxJHhu4MgeGVtIHPhu7Ega2jDoWMgYmnhu4d0IMSRw7MgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkga2jDtG5nPw0KDQpgYGB7cn0NCiMgTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY2jDqW8gZ2nhu69hIENvbmNlcm4gTGV2ZWwgdsOgIFJlc2VhcmNoIE9wcG9ydHVuaXRpZXMNCnRhYmxlX2NvbmNlcm5fcmVzZWFyY2ggPC0gdGFibGUoZCRDb25jZXJuLkxldmVsLlZOLCBkJFJlc2VhcmNoLlZOKQ0KDQojIFRow6ptIHThu5VuZyBow6BuZyB2w6AgdOG7lW5nIGPhu5l0DQp0YWJsZV9jb25jZXJuX3Jlc2VhcmNoX21hcmdpbnMgPC0gYWRkbWFyZ2lucyh0YWJsZV9jb25jZXJuX3Jlc2VhcmNoKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcNCnRhYmxlX2NvbmNlcm5fcmVzZWFyY2hfbWFyZ2lucw0KDQpgYGANCg0KVOG7tyBs4buHIHNpbmggdmnDqm4gxJHhuqF0IG3hu6ljIOKAnHLhuqV0IHF1YW4gdMOibeKAnSB0aGVvIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUgxJHGsOG7o2Mga8O9IGhp4buHdSBuaMawIHNhdToNCg0KLSBcKCBwXzEgPSBQKFx0ZXh0eyJS4bqldCBxdWFuIHTDom0ifSBcbWlkIFx0ZXh0e1Jlc2VhcmNofSA9IFx0ZXh0eyJLaMO0bmcgY8OzIn0pIFwpOiBU4bu3IGzhu4cg4oCccuG6pXQgcXVhbiB0w6Jt4oCdIHRyb25nIG5ow7NtICoqa2jDtG5nIGPDsyBjxqEgaOG7mWkgbmdoacOqbiBj4bupdSoqLiAgDQoNCi0gXCggcF8yID0gUChcdGV4dHsiUuG6pXQgcXVhbiB0w6JtIn0gXG1pZCBcdGV4dHtSZXNlYXJjaH0gPSBcdGV4dHsiQ8OzIn0pIFwpOiBU4bu3IGzhu4cg4oCccuG6pXQgcXVhbiB0w6Jt4oCdIHRyb25nIG5ow7NtICoqY8OzIGPGoSBo4buZaSBuZ2hpw6puIGPhu6l1KiouDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6KioNCg0KLSBcKCBIXzA6IHBfMSAtIHBfMiA9IDAgXCk6IEtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cg4oCccuG6pXQgcXVhbiB0w6Jt4oCdIGdp4buvYSBoYWkgbmjDs20uICANCg0KLSBcKCBIXzE6IHBfMSAtIHBfMiA+IDAgXCk6IFThu7cgbOG7hyDigJxy4bqldCBxdWFuIHTDom3igJ0gKipjYW8gaMahbioqIHRyb25nIG5ow7NtICoqa2jDtG5nIGPDsyBuZ2hpw6puIGPhu6l1KiouDQoNCg0KYGBge3J9DQojIFPhu5Egc2luaCB2acOqbiAiUuG6pXQgcXVhbiB0w6JtIiB0aGVvIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUNCmNvdW50c19jb25jZXJuX2hpZ2ggPC0gYyh0YWJsZV9jb25jZXJuX3Jlc2VhcmNoWyJS4bqldCBxdWFuIHTDom0iLCAiS2jDtG5nIGPDsyJdLA0KICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlX2NvbmNlcm5fcmVzZWFyY2hbIlLhuqV0IHF1YW4gdMOibSIsICJDw7MiXSkNCg0KIyBU4buVbmcgc+G7kSBzaW5oIHZpw6puIHRoZW8gdOG7q25nIG5ow7NtIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUNCnRvdGFsc19yZXNlYXJjaCA8LSBjKHN1bSh0YWJsZV9jb25jZXJuX3Jlc2VhcmNoWywgIktow7RuZyBjw7MiXSksDQogICAgICAgICAgICAgICAgICAgICBzdW0odGFibGVfY29uY2Vybl9yZXNlYXJjaFssICJDw7MiXSkpDQoNCiMgS2nhu4NtIMSR4buLbmggdOG7iSBs4buHIG3hu5l0IHBow61hOiBuaMOzbSAiS2jDtG5nIGPDsyIgPiBuaMOzbSAiQ8OzIg0KdGVzdF9jb25jZXJuIDwtIHByb3AudGVzdChjb3VudHNfY29uY2Vybl9oaWdoLCB0b3RhbHNfcmVzZWFyY2gsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlID0gImdyZWF0ZXIiLCBjb3JyZWN0ID0gRkFMU0UpDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjDQp0ZXN0X2NvbmNlcm4NCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQsIGPDoWNoIHTDrW5oIHbDoCDDvSBuZ2jEqWEgY+G7p2EgaGnhu4d1IHThu7cgbOG7hyoqDQoNCioqR2nhuqMgc+G7rSBjw7Mga+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggbmjGsCBzYXU6KioNCg0KLSBU4bu3IGzhu4cgdHJvbmcgbmjDs20ga2jDtG5nIGPDsyBuZ2hpw6puIGPhu6l1OiAgDQogIFxbIFxoYXR7cH1fMSA9IFxmcmFjezF9ezEwOH0gXGFwcHJveCAwLjAwOTUgXF0NCg0KLSBU4bu3IGzhu4cgdHJvbmcgbmjDs20gY8OzIG5naGnDqm4gY+G7qXU6ICANCiAgXFsgXGhhdHtwfV8yID0gXGZyYWN7M317ODJ9IFxhcHByb3ggMC4wMzYxIFxdDQoNCi0gSGnhu4d1IHThu7cgbOG7hzogIA0KICBcWyBcaGF0e3B9XzEgLSBcaGF0e3B9XzIgPSAwLjAwOTUgLSAwLjAzNjEgPSAtMC4wMjY2IFxdDQoNCi0tLQ0KDQoqKkPDoWNoIHTDrW5oIGhp4buHdSB04bu3IGzhu4cqKg0KDQpcWw0KXGhhdHtwfV8xID0gXGZyYWN7eF8xfXtuXzF9LCBccXVhZCBcaGF0e3B9XzIgPSBcZnJhY3t4XzJ9e25fMn0NClxdDQoNClRyb25nIMSRw7M6DQoNCi0gXCggeF8xLCB4XzIgXCk6IHPhu5Egc2luaCB2acOqbiAicuG6pXQgcXVhbiB0w6JtIiDhu58gbeG7l2kgbmjDs20gIA0KLSBcKCBuXzEsIG5fMiBcKTogdOG7lW5nIHPhu5Egc2luaCB2acOqbiB0aGVvIHThu6tuZyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1DQoNCkhp4buHdSB04bu3IGzhu4c6DQoNClxbDQpcaGF0e3B9XzEgLSBcaGF0e3B9XzINClxdDQoNCi0tLQ0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCi0gVGjhu5FuZyBrw6oga2nhu4NtIMSR4buLbmg6IFwoIFxjaGleMiA9IDEuNTc3NiBcKSAgDQotIELhuq1jIHThu7EgZG86IFwoIGRmID0gMSBcKSAgDQotIEdpw6EgdHLhu4sgcC12YWx1ZTogXCggcCA9IDAuODk1NCBcKQ0KDQotLS0NCg0KKipL4bq/dCBsdeG6rW46KioNCg0KVsOsIFwoIHAgPiAwLjA1IFwpLCB0YSAqKmtow7RuZyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgXCggSF8wIFwpKiouICANClPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHICJy4bqldCBxdWFuIHTDom0iIGdp4buvYSBoYWkgbmjDs20gbMOgICoqa2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqKi4NCg0KLS0tDQoNCioqRGnhu4VuIGdp4bqjaToqKg0KDQpN4bq3YyBkw7kgdOG7tyBs4buHICJy4bqldCBxdWFuIHTDom0iIOG7nyBuaMOzbSBraMO0bmcgY8OzIGPGoSBo4buZaSBuZ2hpw6puIGPhu6l1IHRo4bqlcCBoxqFuIG5ow7NtIGPDsyBjxqEgaOG7mWksIG5oxrBuZyBz4buxIGNow6puaCBs4buHY2ggbmjhu48gbsOgeSBjw7MgdGjhu4MgZG8gbmfhuqt1IG5oacOqbi4gS2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSAqKmtow7RuZyBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogcsO1IHLDoG5nKiogduG7gSBt4buRaSBsacOqbiBo4buHIGdp4buvYSBt4bupYyDEkeG7mSBsbyBuZ+G6oWkgdsOgIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUgdOG6oWkgdHLGsOG7nW5nLg0KDQoNCiMjIyBU4bu3IHPhu5Egbmd1eSBjxqENCg0KKipDw6J1IGjhu49pIG5naGnDqm4gY+G7qXU6KiogIA0KTGnhu4d1IHZp4buHYyB0csaw4budbmcgY8OzIHThuqFvIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUgQUkgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyBzaW5oIHZpw6puIMSR4bqhdCBt4bupYyAicuG6pXQgcXVhbiB0w6JtIiB24buBIEFJIGhheSBraMO0bmc/DQoNCioqTeG7pWMgdGnDqnU6KiogIA0KU28gc8OhbmggeMOhYyBzdeG6pXQgxJHhuqF0IG3hu6ljICJy4bqldCBxdWFuIHTDom0iIGdp4buvYSBoYWkgbmjDs20gc2luaCB2acOqbjoNCg0KLSBDw7MgY8ahIGjhu5lpIG5naGnDqm4gY+G7qXUgdOG6oWkgdHLGsOG7nW5nDQotIEtow7RuZyBjw7MgY8ahIGjhu5lpIG5naGnDqm4gY+G7qXUgdOG6oWkgdHLGsOG7nW5nDQoNCioqQ8O0bmcgdGjhu6ljIHTDrW5oOioqDQoNClxbDQpSUiA9IFxmcmFje1AoXHRleHR7IlLhuqV0IHF1YW4gdMOibSJ9IFxtaWQgXHRleHR7UmVzZWFyY2h9ID0gXHRleHR7Iktow7RuZyBjw7MifSl9e1AoXHRleHR7IlLhuqV0IHF1YW4gdMOibSJ9IFxtaWQgXHRleHR7UmVzZWFyY2h9ID0gXHRleHR7IkPDsyJ9KX0NClxdDQoNClRyb25nIMSRw7M6DQoNCi0gVOG7rSBz4buROiB4w6FjIHN14bqldCDEkeG6oXQgbeG7qWMg4oCccuG6pXQgcXVhbiB0w6Jt4oCdIHRyb25nIG5ow7NtICoqa2jDtG5nIGPDsyBjxqEgaOG7mWkgbmdoacOqbiBj4bupdSoqDQotIE3huqt1IHPhu5E6IHjDoWMgc3XhuqV0IMSR4bqhdCBt4bupYyDigJxy4bqldCBxdWFuIHTDom3igJ0gdHJvbmcgbmjDs20gKipjw7MgY8ahIGjhu5lpIG5naGnDqm4gY+G7qXUqKg0KDQoqKsOdIG5naMSpYToqKg0KDQotIE7hur91IFwoIFJSID4gMSBcKTogTmjDs20ga2jDtG5nIGPDsyBjxqEgaOG7mWkgbmdoacOqbiBj4bupdSBjw7MgbeG7qWMg4oCccuG6pXQgcXVhbiB0w6Jt4oCdIGNhbyBoxqFuICANCi0gTuG6v3UgXCggUlIgPCAxIFwpOiBOaMOzbSBjw7MgY8ahIGjhu5lpIG5naGnDqm4gY+G7qXUgY8OzIG3hu6ljIOKAnHLhuqV0IHF1YW4gdMOibeKAnSBjYW8gaMahbiAgDQotIE7hur91IFwoIFJSID0gMSBcKTogSGFpIG5ow7NtIGPDsyBraOG6oyBuxINuZyDigJxy4bqldCBxdWFuIHTDom3igJ0gbmjGsCBuaGF1DQoNCg0KKipUw61uaCBSZWxhdGl2ZSBSaXNrKioNCg0KYGBge3J9DQpyaXNrcmF0aW8odGFibGVfY29uY2Vybl9yZXNlYXJjaCkNCmBgYA0KDQoqKlThu7cgbOG7hyBy4bqldCBxdWFuIHTDom06KioNCg0KLSBOaMOzbSBraMO0bmcgY8OzIGPGoSBo4buZaSBuZ2hpw6puIGPhu6l1OiAgDQogIFxbIFxoYXR7cH1fe1x0ZXh0e0tow7RuZyBjw7N9fSA9IFxmcmFjezF9ezEwNX0gXGFwcHJveCAwLjAwOTUgXF0NCg0KLSBOaMOzbSBjw7MgY8ahIGjhu5lpIG5naGnDqm4gY+G7qXU6ICANCiAgXFsgXGhhdHtwfV97XHRleHR7Q8OzfX0gPSBcZnJhY3szfXs4M30gXGFwcHJveCAwLjAzNjEgXF0NCg0KKipU4bu3IHPhu5Egbmd1eSBjxqE6KioNCg0KXFsNClJSID0gXGZyYWN7MC4wMDk1fXswLjAzNjF9IFxhcHByb3ggMC4yNjI2DQpcXQ0KDQpUdXkgbmhpw6puLCB0aGVvIGvhur90IHF14bqjIHThu6sgYHJpc2tyYXRpbygpYDoNCg0KXFsNClJSID0gMS40MTg5DQpcXQ0KDQoqKktob+G6o25nIHRpbiBj4bqteSA5NSU6KioNCg0KXFsNCkNJID0gWzAuNzcyOSA7IDIuNjA0OV0NClxdDQoNCioqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggKHR3by1zaWRlZCk6KioNCg0KLSBNaWQtcCBleGFjdDogXCggcCA9IDAuNDUwOCBcKSAgDQotIEZpc2hlciBleGFjdDogXCggcCA9IDAuNjE5MSBcKSAgDQotIENoaS1zcXVhcmU6IFwoIHAgPSAwLjM4NzQgXCkNCg0KKipL4bq/dCBsdeG6rW46KioNCg0KLSBW4bubaSBcKCBSUiA9IDEuNDE4OSA+IDEgXCksIG5ow7NtICoqY8OzIGPGoSBo4buZaSBuZ2hpw6puIGPhu6l1KiogY8OzIG5ndXkgY8ahIOKAnHLhuqV0IHF1YW4gdMOibeKAnSBjYW8gaMahbiBuaMOzbSBraMO0bmcgY8OzLg0KLSBUdXkgbmhpw6puLCBkbyBraG/huqNuZyB0aW4gY+G6rXkgY2jhu6lhIDEgdsOgIGPDoWMgcC12YWx1ZSA+IDAuMDUsIHRhICoqa2jDtG5nIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBcKCBIXzAgXCkqKi4NCg0KKipEaeG7hW4gZ2nhuqNpOioqDQoNClR1eSBk4buvIGxp4buHdSBtw7QgdOG6oyBjaG8gdGjhuqV5IHThu7cgbOG7hyDigJxy4bqldCBxdWFuIHTDom3igJ0gY2FvIGjGoW4g4bufIG5ow7NtIGPDsyBjxqEgaOG7mWkgbmdoacOqbiBj4bupdSwgbmjGsG5nIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgKipraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqLiAgDQrEkGnhu4F1IMSRw7MgY2hvIHRo4bqleSB2aeG7h2MgdHLGsOG7nW5nIGPDsyBo4buXIHRy4bujIG5naGnDqm4gY+G7qXUgKipjaMawYSBjaOG6r2Mg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IMSR4bq/biBt4bupYyDEkeG7mSBsbyBuZ+G6oWkgY2FvIG5o4bqldCBj4bunYSBzaW5oIHZpw6puKiouDQoNCg0KIyMjIFThu7cgc+G7kSBDaMOqbmggKE9kZHMgUmF0aW8gLSBPUikNCg0KYGBge3J9DQpvcl9yZXN1bHQyIDwtIG9kZHNyYXRpbyh0YWJsZV9jb25jZXJuX3Jlc2VhcmNoKQ0KcHJpbnQob3JfcmVzdWx0MikNCg0KYGBgDQoqKlTDrW5oIG9kZHMgKHThu7cgbOG7hyBjaMOpbykgdGhlbyB04burbmcgbmjDs20qKg0KDQotIEtow7RuZyBjw7MgY8ahIGjhu5lpIG5naGnDqm4gY+G7qXU6ICANCiAgXFsNCiAgXHRleHR7T2Rkc31fe1x0ZXh0e0tow7RuZyBjw7N9fSA9IFxmcmFjezF9ezEwNH0gXGFwcHJveCAwLjAwOTYNCiAgXF0NCg0KLSBDw7MgY8ahIGjhu5lpIG5naGnDqm4gY+G7qXU6ICANCiAgXFsNCiAgXHRleHR7T2Rkc31fe1x0ZXh0e0PDs319ID0gXGZyYWN7M317ODB9IFxhcHByb3ggMC4wMzc1DQogIFxdDQoNCioqVMOtbmggT2RkcyBSYXRpbyAoT1IpKioNCg0KXFsNCk9SID0gXGZyYWN7XHRleHR7T2Rkc31fe1x0ZXh0e0PDs319fXtcdGV4dHtPZGRzfV97XHRleHR7S2jDtG5nIGPDs319fSA9IFxmcmFjezMvODB9ezEvMTA0fSBcYXBwcm94IDIuNDM4Nw0KXF0NCg0KKipLaG/huqNuZyB0aW4gY+G6rXkgOTUlOioqDQoNClxbDQpDSSA9IFxsZWZ0WyAwLjI2ODYgOyA3Mi40MzU1IFxyaWdodF0NClxdDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQotIFwoIEhfMCBcKTogT2RkcyByYXRpbyBnaeG7r2EgaGFpIG5ow7NtIGLhurFuZyAxIChraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIMSRaeG7gXUga2nhu4duIG5naGnDqm4gY+G7qXUgdsOgIG3hu6ljIOKAnHLhuqV0IHF1YW4gdMOibeKAnSkuICANCi0gXCggSF8xIFwpOiBPZGRzIHJhdGlvIGtow6FjIDEgKGPDsyBt4buRaSBsacOqbiBo4buHIGdp4buvYSDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1IHbDoCBt4bupYyDigJxy4bqldCBxdWFuIHTDom3igJ0pLg0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oKioNCg0KLSBNaWQtcCBleGFjdDogXCggcCA9IDAuNDUwOCBcKSAgDQotIEZpc2hlciBleGFjdDogXCggcCA9IDAuNjE5NyBcKSAgDQotIENoaS1zcXVhcmU6IFwoIHAgPSAwLjM4NzQgXCkNCg0KKipL4bq/dCBsdeG6rW4gdGjhu5FuZyBrw6oqKg0KDQpWw6wgdOG6pXQgY+G6oyBjw6FjIGdpw6EgdHLhu4sgXCggcCA+IDAuMDUgXCksIHRhICoqa2jDtG5nIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBcKCBIXzAgXCkqKi4NCg0KXFsNClxSaWdodGFycm93IFx0ZXh0e0tow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu4Mga2jhurNuZyDEkeG7i25oIHLhurFuZyDEkWnhu4F1IGtp4buHbiBuZ2hpw6puIGPhu6l1IOG6o25oIGjGsOG7n25nIMSR4bq/biBvZGRzIGPhu6dhIG3hu6ljIOKAnHLhuqV0IHF1YW4gdMOibeKAnS59DQpcXQ0KDQoqKsOdIG5naMSpYSoqDQoNCi0gT2RkcyBzaW5oIHZpw6puIOKAnHLhuqV0IHF1YW4gdMOibeKAnSB0cm9uZyBuaMOzbSBjw7MgY8ahIGjhu5lpIG5naGnDqm4gY+G7qXUgY2FvIGjGoW4ga2hv4bqjbmcgMi40NCBs4bqnbiBzbyB24bubaSBuaMOzbSBraMO0bmcgY8OzLiAgDQotIFR1eSBuaGnDqm4sIGRvIGtob+G6o25nIHRpbiBj4bqteSBy4bqldCBy4buZbmcgdsOgIHAtdmFsdWUgbOG7m24sIHPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgKipraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqioqIHbDoCBjw7MgdGjhu4MgbMOgIGRvIG5n4bqrdSBuaGnDqm4uDQoNCiMgTcO0IGjDrG5oIExvZ2l0DQoNCioqTcO0IGjDrG5oIExvZ2l0KiogOiBMw6AgbeG7mXQgbcO0IGjDrG5oIGjhu5NpIHF1eSBkw7luZyDEkeG7gyBk4buxIMSRb8OhbiB4w6FjIHN14bqldCB44bqjeSByYSBj4bunYSBt4buZdCBz4buxIGtp4buHbiBuaOG7iyBwaMOibiAoY2jhu4kgY8OzIDIgdHLhuqFuZyB0aMOhaTogMS8wLCBZZXMvTm8sIFRow6BuaCBjw7RuZy9UaOG6pXQgYuG6oWkpLg0KDQoqKk3hu6VjIHRpw6p1Kio6IHBow6JuIHTDrWNoIHhlbSB2aeG7h2MgxJHDoW5oIGdpw6EgZ2nhu5tpIHTDrW5oIChHZW5kZXIpIGPDsyDhuqNuaCBoxrDhu59uZyBuaMawIHRo4bq/IG7DoG8gxJHhur9uIG3hu6ljIMSR4buZIGxvIGzhuq9uZyBj4bunYSBzaW5oIHZpw6puIHRyxrDhu5tjIHTDoWMgxJHhu5luZyBj4bunYSBBSS4NCg0KDQoqKkJp4bq/biBwaOG7pSB0aHXhu5ljKio6IGFueGlldHlfYmluYXJ5ICgxID0gSGlnaCBhbnhpZXR5LCAwID0ga2jDoWMpDQoNCioqQmnhur9uIGdp4bqjaSB0aMOtY2gqKjogZ2VuZGVyX2JpbmFyeSAoMSA9IG7hu68sIDAgPSBuYW0pDQoNClxzZWN0aW9uKntDw7RuZyB0aOG7qWMgbcO0IGjDrG5ofQ0KDQpcWw0KXGxvZ1xsZWZ0KFxmcmFje3B9ezEtcH1ccmlnaHQpID0gXGJldGFfMCArIFxiZXRhXzEgXGNkb3QgXHRleHR7Z2VuZGVyXF9iaW5hcnl9DQpcXQ0KDQpUcm9uZyDEkcOzOg0KDQpcWw0KXGJlZ2lue2FsaWduZWR9DQpwICYgOiBcdGV4dHtYw6FjIHN14bqldCBzaW5oIHZpw6puIHRodeG7mWMgbmjDs20gSGlnaCBhbnhpZXR5fSBcXA0KXGJldGFfMCAmIDogXHRleHR7SOG7hyBz4buRIGNo4bq3biAoaW50ZXJjZXB0KX0gXFwNClxiZXRhXzEgJiA6IFx0ZXh0e0jhu4cgc+G7kSBj4bunYSBiaeG6v24gZ2VuZGVyXF9iaW5hcnl9IFxcDQpnZW5kZXJcX2JpbmFyeSAmIDogXHRleHR7Qmnhur9uIMSR4buZYyBs4bqtcCAoMCA9IE5hbSwgMSA9IE7hu68pfQ0KXGVuZHthbGlnbmVkfQ0KXF0NCmBgYHtyfQ0KIyBDw6BpIGfDs2kgY+G6p24gdGhp4bq/dA0KaWYgKCFyZXF1aXJlKGJyb29tKSkgaW5zdGFsbC5wYWNrYWdlcygiYnJvb20iKQ0KbGlicmFyeShicm9vbSkNCg0KIyBDaHXhuqluIGjDs2EgYmnhur9uIEdlbmRlcjogbG/huqFpIGLhu48ga2hv4bqjbmcgdHLhuq9uZywgY2h1eeG7g24gY2jhu68gdGjGsOG7nW5nDQpkJEdlbmRlciA8LSB0cmltd3ModG9sb3dlcihhcy5jaGFyYWN0ZXIoZCRHZW5kZXIpKSkNCg0KIyBU4bqhbyBiaeG6v24gZ2VuZGVyX2JpbmFyeSAoMCA9IE1hbGUsIDEgPSBGZW1hbGUpDQpkJGdlbmRlcl9iaW5hcnkgPC0gaWZlbHNlKGQkR2VuZGVyID09ICJmZW1hbGUiLCAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZCRHZW5kZXIgPT0gIm1hbGUiLCAwLCBOQSkpDQoNCiMgVOG6oW8gYmnhur9uIHBo4bulIHRodeG7mWMgbmjhu4sgcGjDom46IDEgbuG6v3UgSGlnaCBhbnhpZXR5LCAwIG7hur91IGPDoWMgbeG7qWMga2jDoWMNCmQkYW54aWV0eV9iaW5hcnkgPC0gaWZlbHNlKGQkQW54aWV0eS5MZXZlbCA9PSAiSGlnaCBhbnhpZXR5IiwgMSwgMCkNCg0KIyBLaeG7g20gdHJhIGThu68gbGnhu4d1IGjhu6NwIGzhu4cNCmlmIChsZW5ndGgodW5pcXVlKG5hLm9taXQoZCRhbnhpZXR5X2JpbmFyeSkpKSA8IDIpIHsNCiAgc3RvcCgiQmnhur9uIHBo4bulIHRodeG7mWMgY2jhu4kgY8OzIDEgZ2nDoSB0cuG7iyBob+G6t2MgYuG7iyB0aGnhur91IGThu68gbGnhu4d1LiBLaMO0bmcgdGjhu4MgY2jhuqF5IG3DtCBow6xuaC4iKQ0KfQ0KDQojIENo4bqheSBtw7QgaMOsbmggbG9naXN0aWMgbmjhu4sgcGjDom4NCm1vZGVsX2xvZ2l0IDwtIGdsbShhbnhpZXR5X2JpbmFyeSB+IGdlbmRlcl9iaW5hcnksDQogICAgICAgICAgICAgICAgICAgZGF0YSA9IGQsDQogICAgICAgICAgICAgICAgICAgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpKQ0KDQojIFTDs20gdOG6r3QgbcO0IGjDrG5oDQpzdW1tYXJ5KG1vZGVsX2xvZ2l0KQ0KDQojIFTDrW5oIEFJQw0KYWljX3ZhbHVlIDwtIEFJQyhtb2RlbF9sb2dpdCkNCmNhdCgiQUlDIGPhu6dhIG3DtCBow6xuaCBsb2dpdDogIiwgcm91bmQoYWljX3ZhbHVlLCAzKSwgIlxuIikNCg0KIyBH4buZcCBr4bq/dCBxdeG6oyB0aMOgbmggYuG6o25nIMSR4bq5cA0KdGlkeV9tb2RlbCA8LSB0aWR5KG1vZGVsX2xvZ2l0KQ0KcHJpbnQodGlkeV9tb2RlbCkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KLSAqKkludGVyY2VwdCAoXChcYmV0YV8wID0gLTIuMzMwOFwpKSoqOiBHacOhIHRy4buLIGludGVyY2VwdCDEkeG6oWkgZGnhu4duIGNobyAqbG9nLW9kZHMqIGPhu6dhIHZp4buHYyByxqFpIHbDoG8gbmjDs20gKipIaWdoIGFueGlldHkqKiBraGkgXChnZW5kZXJcX2JpbmFyeSA9IDBcKSAodOG7qWMgbMOgICoqTmFtKiopLiAgDQogIMSQaeG7gXUgbsOgeSBuZ2jEqWEgbMOgIHbhu5tpIE5hbSBnaeG7m2ksIGxvZy1vZGRzIGLhu4sgSGlnaCBhbnhpZXR5IGzDoCBcKC0yLjMzMDhcKS4NCg0KLSAqKmdlbmRlcl9iaW5hcnkgKFwoXGJldGFfMSA9IC0xLjY0ODlcKSkqKjogR2nDoSB0cuG7iyBo4buHIHPhu5EgbsOgeSBiaeG7g3UgdGjhu4sgc+G7sSB0aGF5IMSR4buVaSAqbG9nLW9kZHMqIGtoaSBjaHV54buDbiB04burICoqTmFtKiogKFwoZ2VuZGVyXF9iaW5hcnkgPSAwXCkpIHNhbmcgKipO4buvKiogKFwoZ2VuZGVyXF9iaW5hcnkgPSAxXCkpLiAgDQogIEPhu6UgdGjhu4MsIGxvZy1vZGRzIGLhu4sgSGlnaCBhbnhpZXR5IGPhu6dhIE7hu68gZ2nhuqNtIFwoMS42NDg5XCkgxJHGoW4gduG7iyBzbyB24bubaSBOYW0uDQoNCioqSOG7hyBz4buRIFwoXGJldGFfMSAoZ2VuZGVyXF9iaW5hcnkpXCk6KiogDQoNCi0gIFbhu5tpIFwoXGJldGFfMSA9IC0xLjY0ODlcKSwgXChwID0gMC4wNDMzIDwgMC4wNVwpDQoNCi0gIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGJp4bq/biAqKkdlbmRlcioqIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIDUlLiANCg0KLSAgTuG7ryBnaeG7m2kgY8OzIHjDoWMgc3XhuqV0IGLhu4sgKipIaWdoIGFueGlldHkqKiB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBOYW0gZ2nhu5tpLg0KDQojIE3DtCBow6xuaCBMb2dpdCDEkWEgYmnhur9uDQoNCkJp4bq/biBwaOG7pSB0aHXhu5ljIChBbnhpZXR5IExldmVsKSBjw7MgNCBt4bupYyDEkeG7mSBwaMOibiBsb+G6oWk6DQoNCi0gTm8gYW54aWV0eSAoa2jDtG5nIGxvIGzhuq9uZykNCg0KLSBTbGlnaHQgYW54aWV0eSAoaMahaSBsbyBs4bqvbmcpDQoNCi0gTW9kZXJhdGUgYW54aWV0eSAobG8gbOG6r25nIHbhu6thIHBo4bqjaSkNCg0KLSBIaWdoIGFueGlldHkgKGxvIGzhuq9uZyBjYW8pDQoNCi0gTcOjIGjDs2E6IDEgbuG6v3UgKipIaWdoIGFueGlldHkqKiwgMCBu4bq/dSBjw6FjIG3hu6ljIGtow6FjDQoNCkJp4bq/biBnaeG6o2kgdGjDrWNoIChHZW5kZXIpIMSRxrDhu6NjIG3DoyBow7NhIG5o4buLIHBow6JuOg0KDQotIGdlbmRlcl9iaW5hcnkgPSAwIG7hur91ICoqTWFsZSoqDQoNCi0gZ2VuZGVyX2JpbmFyeSA9IDEgbuG6v3UgKipGZW1hbGUqKg0KDQpgYGB7cn0NCiMgQ8OgaSBnw7NpIGPhuqduIHRoaeG6v3QNCmlmICghcmVxdWlyZShubmV0KSkgaW5zdGFsbC5wYWNrYWdlcygibm5ldCIpDQppZiAoIXJlcXVpcmUoYnJvb20pKSBpbnN0YWxsLnBhY2thZ2VzKCJicm9vbSIpDQpsaWJyYXJ5KG5uZXQpDQpsaWJyYXJ5KGJyb29tKQ0KDQojIENodeG6qW4gaMOzYSBiaeG6v24gR2VuZGVyOiBsb+G6oWkgYuG7jyBraG/huqNuZyB0cuG6r25nLCBjaHV54buDbiBjaOG7ryB0aMaw4budbmcNCmQkR2VuZGVyIDwtIHRyaW13cyh0b2xvd2VyKGFzLmNoYXJhY3RlcihkJEdlbmRlcikpKQ0KDQojIFThuqFvIGJp4bq/biBnZW5kZXJfYmluYXJ5ICgwID0gTWFsZSwgMSA9IEZlbWFsZSkNCmQkZ2VuZGVyX2JpbmFyeSA8LSBpZmVsc2UoZCRHZW5kZXIgPT0gImZlbWFsZSIsIDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShkJEdlbmRlciA9PSAibWFsZSIsIDAsIE5BKSkNCg0KIyBLaeG7g20gdHJhIHhlbSBjw7MgxJHhu6cgY+G6oyAyIGdp4bubaSB0w61uaCBraMO0bmcNCmlmIChsZW5ndGgodW5pcXVlKG5hLm9taXQoZCRnZW5kZXJfYmluYXJ5KSkpIDwgMikgew0KICBzdG9wKCJE4buvIGxp4buHdSBjaOG7iSBjw7MgMSBuaMOzbSBnaeG7m2kgdMOtbmggaG/hurdjIGLhu4sgdGhp4bq/dSBk4buvIGxp4buHdS4gS2jDtG5nIHRo4buDIGNo4bqheSBtw7QgaMOsbmguIikNCn0NCg0KIyBDaOG6oXkgbcO0IGjDrG5oIG11bHRpbm9tDQptb2RlbF9tdWx0aW5vbSA8LSBtdWx0aW5vbShBbnhpZXR5LkxldmVsIH4gZ2VuZGVyX2JpbmFyeSwgZGF0YSA9IGQpDQoNCiMgVMOzbSB04bqvdCBtw7QgaMOsbmgNCnN1bW1hcnlfbW9kZWwgPC0gc3VtbWFyeShtb2RlbF9tdWx0aW5vbSkNCg0KIyBUw61uaCB6LXZhbHVlIHbDoCBwLXZhbHVlDQp6X3ZhbHVlcyA8LSBzdW1tYXJ5X21vZGVsJGNvZWZmaWNpZW50cyAvIHN1bW1hcnlfbW9kZWwkc3RhbmRhcmQuZXJyb3JzDQpwX3ZhbHVlcyA8LSAyICogKDEgLSBwbm9ybShhYnMoel92YWx1ZXMpKSkNCg0KIyBH4buZcCBr4bq/dCBxdeG6oyB0aMOgbmggYuG6o25nIMSR4bq5cA0KcmVzdWx0X3RhYmxlIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQoDQogIEVzdGltYXRlID0gcm91bmQoc3VtbWFyeV9tb2RlbCRjb2VmZmljaWVudHMsIDQpLA0KICBgU3RkLiBFcnJvcmAgPSByb3VuZChzdW1tYXJ5X21vZGVsJHN0YW5kYXJkLmVycm9ycywgNCksDQogIGB6IHZhbHVlYCA9IHJvdW5kKHpfdmFsdWVzLCAzKSwNCiAgYFByKD58enwpYCA9IHNpZ25pZihwX3ZhbHVlcywgMykNCikpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyBr4bq/dCBxdeG6ow0KcHJpbnQocmVzdWx0X3RhYmxlKQ0KDQojIFThu7EgdMOtbmggTnVsbCBEZXZpYW5jZSAobG9nLWxpa2VsaWhvb2QgY+G7p2EgbcO0IGjDrG5oIGNo4buJIGPDsyBpbnRlcmNlcHQpDQptb2RlbF9udWxsIDwtIG11bHRpbm9tKEFueGlldHkuTGV2ZWwgfiAxLCBkYXRhID0gZCwgdHJhY2UgPSBGQUxTRSkNCg0KIyBOdWxsIGRldmlhbmNlIHbDoCBkZWdyZWVzIG9mIGZyZWVkb20NCm51bGxfZGV2aWFuY2UgPC0gLTIgKiBsb2dMaWsobW9kZWxfbnVsbCkNCnJlc2lkdWFsX2RldmlhbmNlIDwtIC0yICogbG9nTGlrKG1vZGVsX211bHRpbm9tKQ0KZGZfbnVsbCA8LSBhdHRyKGxvZ0xpayhtb2RlbF9udWxsKSwgImRmIikNCmRmX3Jlc2lkdWFsIDwtIGF0dHIobG9nTGlrKG1vZGVsX211bHRpbm9tKSwgImRmIikNCg0KIyBBSUMNCmFpY192YWx1ZSA8LSBBSUMobW9kZWxfbXVsdGlub20pDQoNCiMgSGnhu4NuIHRo4buLIHRow7RuZyB0aW4gZGV2aWFuY2UgJiBBSUMNCmNhdCgiXG5OdWxsIGRldmlhbmNlOiAiLCByb3VuZChudWxsX2RldmlhbmNlLCAzKSwgIiBvbiAiLCBkZl9udWxsLCAiIGRlZ3JlZXMgb2YgZnJlZWRvbVxuIikNCmNhdCgiUmVzaWR1YWwgZGV2aWFuY2U6ICIsIHJvdW5kKHJlc2lkdWFsX2RldmlhbmNlLCAzKSwgIiBvbiAiLCBkZl9yZXNpZHVhbCwgIiBkZWdyZWVzIG9mIGZyZWVkb21cbiIpDQpjYXQoIkFJQzogIiwgcm91bmQoYWljX3ZhbHVlLCAzKSwgIlxuIikNCmNhdCgiTnVtYmVyIG9mIEZpc2hlciBTY29yaW5nIGl0ZXJhdGlvbnM6ICIsIG1vZGVsX211bHRpbm9tJGl0ZXIsICJcbiIpDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KfCBBbnhpZXR5IExldmVsICAgIHwgSW50ZXJjZXB0ICjOsuKCgGspIHwgZ2VuZGVyXF9iaW5hcnkgKM6y4oKBaykgfCBwLXZhbHVlIGdlbmRlclxfYmluYXJ5IHwNCnwgLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8IE1vZGVyYXRlIGFueGlldHkgfCAwLjQ1MjAgICAgICAgICAgfCAxLjg1MDYgICAgICAgICAgICAgICB8IDAuMDM2NiAoXCopICAgICAgICAgICAgfA0KfCBObyBhbnhpZXR5ICAgICAgIHwgMS40NTUzICAgICAgICAgIHwgMS40NjI1ICAgICAgICAgICAgICAgfCAwLjA4MTIgKC4pICAgICAgICAgICAgIHwNCnwgU2xpZ2h0IGFueGlldHkgICB8IDEuNDg4MSAgICAgICAgICB8IDEuNzMwOCAgICAgICAgICAgICAgIHwgMC4wMzc5IChcKikgICAgICAgICAgICB8DQoNCg0KLSBJbnRlcmNlcHQgKM6y4oKAayk6IEdpw6EgdHLhu4sgaW50ZXJjZXB0IMSR4bqhaSBkaeG7h24gY2hvIGxvZy1vZGRzIGPhu6dhIHZp4buHYyByxqFpIHbDoG8gdOG7q25nIG3hu6ljIMSR4buZIGxvIMOidSBraGkgZ2VuZGVyX2JpbmFyeSA9IDAgKHThu6ljIGzDoCBuYW0pLg0KDQotIGdlbmRlcl9iaW5hcnkgKM6y4oKBayk6IHRoYXkgxJHhu5VpIGxvZy1vZGRzIGtoaSBjaHV54buDbiB04burIG5hbSAoZ2VuZGVyX2JpbmFyeSA9IDApIHNhbmcgbuG7ryAoZ2VuZGVyX2JpbmFyeSA9IDEpLg0KDQoqKkjhu4cgc+G7kSDOsuKCgShnZW5kZXJfYmluYXJ5KSoqOg0KDQorIFbhu5tpIG3hu6ljICoqTW9kZXJhdGUgYW54aWV0eSoqLCDOsuKCgT0yLjA5MCwgcD0wLjAzNjYgKDwwLjA1KS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgZ2nhu5tpIHTDrW5oIGPDsyDhuqNuaCBoxrDhu59uZyB0aOG7kW5nIGvDqi4gTuG7ryBnaeG7m2kgY8OzIGto4bqjIG7Eg25nIHLGoWkgdsOgbyBt4bupYyDEkeG7mSBsbyDDonUgduG7q2EgcGjhuqNpIGNhbyBoxqFuIHNvIHbhu5tpIG5hbSBnaeG7m2kuDQoNCisgVuG7m2kgbeG7qWMgKipTbGlnaHQgYW54aWV0eSoqLCDOsuKCgT0yLjA3NiwgcD0wLjAzNzkgKDwwLjA1KS4gTuG7ryBnaeG7m2kgY8OzIHLGoWkgdsOgbyBt4bupYyDEkeG7mSBsbyDDonUgbmjhurkgY2FvIGjGoW4gc28gduG7m2kgbmFtIGdp4bubaS4NCg0KKyBW4bubaSBt4bupYyAqKk5vIGFueGlldHkqKiwgzrLigoE9MS43NDQsIHA9MC4wODEyICg8MC4wNSkuIOG7niBt4bupYyBuw6B5LCBnaeG7m2kgdMOtbmgga2jDtG5nIGPDsyBraOG6oyBuxINuZyDhuqNuaCBoxrDhu59uZyB0aOG7kW5nIGvDqiAodsOsIHA+MC4wNSkNCg0KDQoNCioqQuG6o25nIHRow7RuZyBz4buRKioNCg0KfCBUaMO0bmcgc+G7kSAgICAgICAgICB8IEdpw6EgdHLhu4sgICAgICAgIHwgw50gbmdoxKlhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEvhur90IGx14bqtbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IC0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgTnVsbCBkZXZpYW5jZSAgICAgfCA0NDEuMTE1IChkZj0zKSB8IFNhaSBz4buRIGxvZy1saWtlbGlob29kIGPhu6dhIG3DtCBow6xuaCAqKmNo4buJIGPDsyBJbnRlcmNlcHQqKiAoY2jGsGEgY8OzIGdlbmRlclxfYmluYXJ5KS4gfCBNw7QgaMOsbmggZ+G7kWMga8OpbSB24buBIGdp4bqjaSB0aMOtY2ggZOG7ryBsaeG7h3UuICAgICAgIHwNCnwgUmVzaWR1YWwgZGV2aWFuY2UgfCA0MzUuMDk5IChkZj02KSB8IFNhaSBz4buRIHNhdSBraGkgdGjDqm0gZ2VuZGVyXF9iaW5hcnkuIEdp4bqjbSDihpIgbcO0IGjDrG5oIGPhuqNpIHRoaeG7h24uICAgICAgICAgICAgICAgICAgICB8IE3DtCBow6xuaCB04buRdCBoxqFuIGtoaSB0aMOqbSBiaeG6v24gR2VuZGVyLiAgICAgICAgfA0KfCBHaeG6o20gZGV2aWFuY2UgICAgIHwgNi4wMTYgICAgICAgICAgfCBIaeG7h3Ugc+G7kSBnaeG7r2EgTnVsbCBkZXZpYW5jZSB2w6AgUmVzaWR1YWwgZGV2aWFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBHZW5kZXIgY8OzIHTDoWMgxJHhu5luZyBuaMawbmcgbeG7qWMgZ2nhuqNpIHRow61jaCBuaOG7jy4gfA0KfCBBSUMgICAgICAgICAgICAgICB8IDQ0Ny4wOTkgICAgICAgIHwgQ2jhu4kgc+G7kSDEkcOhbmggZ2nDoSBtw7QgaMOsbmgsIGPDoG5nIHRo4bqlcCBjw6BuZyB04buRdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBNw7QgaMOsbmggY8OzIEdlbmRlciBwaMO5IGjhu6NwIGjGoW4gKEFJQyBnaeG6o20pLiAgICB8DQp8IEZpc2hlciBpdGVyYXRpb25zIHwgMTAgICAgICAgICAgICAgfCBT4buRIGzhuqduIGzhurdwIHThu5FpIMawdSDEkeG7gyBo4buZaSB04bulIG3DtCBow6xuaC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE3DtCBow6xuaCBo4buZaSB04bulIHThu5F0LiAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KDQoqKkvhur5UIExV4bqsTiBU4buUTkcgUVXDgVQqKg0KDQotIEdlbmRlciBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIEFueGlldHkgTGV2ZWwsIMSR4bq3YyBiaeG7h3Qg4bufIFNsaWdodCB2w6AgTW9kZXJhdGUgYW54aWV0eS4NCg0KLSBUdXkgbmhpw6puLCBt4bupYyDEkeG7mSBj4bqjaSB0aGnhu4duIGPhu6dhIG3DtCBow6xuaCB04buVbmcgdGjhu4MgKGdp4bqjbSBkZXZpYW5jZSkga2jDtG5nIHF1w6EgbOG7m24sIGPhuqduIHRow6ptIGPDoWMgYmnhur9uIGtow6FjICh2w60gZOG7pTogdHXhu5VpLCBuxINtIGjhu41jKSDEkeG7gyBj4bqjaSB0aGnhu4duIGThu7EgxJFvw6FuLg0KDQojIE3DtCBow6xuaCBQcm9iaXQgDQoNCioqTeG7pWMgdGnDqnUqKg0KUGjDom4gdMOtY2ggeGVtIGdp4bubaSB0w61uaCBj4bunYSBzaW5oIHZpw6puIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24geMOhYyBzdeG6pXQgcsahaSB2w6BvIHThu6tuZyBt4bupYyDEkeG7mSBsbyBs4bqvbmcgKEFueGlldHkgTGV2ZWwpIGhheSBraMO0bmcNCg0KKipE4buvIGxp4buHdSoqDQoNCioqQmnhur9uIHBo4bulIHRodeG7mWMqKjogYW54aWV0eV9iaW5hcnkgKDEgPSBIaWdoIGFueGlldHksIDAgPSBraMOhYykNCg0KKipCaeG6v24gZ2nhuqNpIHRow61jaCoqOiBnZW5kZXJfYmluYXJ5ICgxID0gbuG7rywgMCA9IG5hbSkNCg0KKipDw7RuZyB0aOG7qWMgdOG7lW5nIHF1w6F0IGPhu6dhIG3DtCBow6xuaCBQcm9iaXQqKg0KXFsNClAoWT0xIFxtaWQgR2VuZGVyKSA9IFxQaGkoXGJldGFfMCArIFxiZXRhXzEgXGNkb3QgR2VuZGVyKQ0KXF0NCg0KVHJvbmcgxJHDszoNCg0KLSBcKFAoWT0xIFxtaWQgR2VuZGVyKVwpOiBYw6FjIHN14bqldCBzaW5oIHZpw6puIHRodeG7mWMgbmjDs20gKipIaWdoIGFueGlldHkqKiB0aGVvIGdp4bubaSB0w61uaC4NCg0KLSBcKFxQaGkoLilcKTogSMOgbSBwaMOibiBwaOG7kWkgdMOtY2ggbMWpeSBjaHXhuqluIChDREYgY+G7p2EgcGjDom4gcGjhu5FpIGNodeG6qW4gY2h14bqpbiBow7NhKS4NCg0KLSBcKFxiZXRhXzBcKTogSOG7hyBz4buRIGNo4bq3biAoSW50ZXJjZXB0KSwgbG9naXQgeMOhYyBzdeG6pXQgY2hvIG5ow7NtIHRoYW0gY2hp4bq/dSAoXChHZW5kZXI9MFwpLCBOYW0pLg0KDQotIFwoXGJldGFfMVwpOiBI4buHIHPhu5EgaOG7k2kgcXV5IGPhu6dhIGJp4bq/biBHZW5kZXIqLCBwaOG6o24gw6FuaCBt4bupYyB0aGF5IMSR4buVaSB24buBIGxvZ2l0IHjDoWMgc3XhuqV0IGtoaSBnaeG7m2kgdMOtbmggdGhheSDEkeG7lWkgdOG7qyBOYW0gKFwoR2VuZGVyPTBcKSkgc2FuZyBO4buvIChcKEdlbmRlcj0xXCkpDQoNCioqw50gbmdoxKlhOioqDQoNCi0gTuG6v3UgXChcYmV0YV8xID4gMFwpOiBO4buvIGdp4bubaSAoXChHZW5kZXI9MVwpKSBjw7MgeMOhYyBzdeG6pXQgdGh14buZYyBuaMOzbSAqKkhpZ2ggYW54aWV0eSoqIGNhbyBoxqFuIE5hbSAoXChHZW5kZXI9MFwpKS4NCg0KLSBO4bq/dSBcKFxiZXRhXzEgPCAwXCk6IE7hu68gZ2nhu5tpIGPDsyB4w6FjIHN14bqldCB0aOG6pXAgaMahbiBOYW0uDQoNCi0gTuG6v3UgXChcYmV0YV8xID0gMFwpOiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgZ2nhu5tpLg0KDQoNCg0KYGBge3J9DQojIFThuqFvIGJp4bq/biBuaOG7iyBwaMOibjogMSBu4bq/dSBIaWdoIGFueGlldHksIDAgbuG6v3UgY8OybiBs4bqhaQ0KZCRhbnhpZXR5X2JpbmFyeSA8LSBpZmVsc2UoZCRBbnhpZXR5LkxldmVsID09ICJIaWdoIGFueGlldHkiLCAxLCAwKQ0KDQojIENodXnhu4NuIMSR4buVaSBHZW5kZXI6IDAgPSBuYW0sIDEgPSBu4buvDQpkJGdlbmRlcl9iaW5hcnkgPC0gaWZlbHNlKHRvbG93ZXIodHJpbXdzKGQkR2VuZGVyKSkgPT0gImZlbWFsZSIsIDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0b2xvd2VyKHRyaW13cyhkJEdlbmRlcikpID09ICJtYWxlIiwgMCwgTkEpKQ0KDQojIEtp4buDbSB0cmEgeGVtIGThu68gbGnhu4d1IGPDsyDEkeG7pyBj4bqjIDIgbmjDs20ga2jDtG5nDQppZiAobGVuZ3RoKHVuaXF1ZShuYS5vbWl0KGQkZ2VuZGVyX2JpbmFyeSkpKSA8IDIpIHsNCiAgc3RvcCgiROG7ryBsaeG7h3UgY2jhu4kgY8OzIDEgbmjDs20gZ2nhu5tpIHTDrW5oIGhv4bq3YyBi4buLIHRoaeG6v3UgZOG7ryBsaeG7h3UuIEtow7RuZyB0aOG7gyBjaOG6oXkgbcO0IGjDrG5oLiIpDQp9DQoNCiMgQ2jhuqF5IG3DtCBow6xuaCBQcm9iaXQNCm1vZGVsX3Byb2JpdCA8LSBnbG0oYW54aWV0eV9iaW5hcnkgfiBnZW5kZXJfYmluYXJ5LCANCiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGQsIA0KICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpKQ0KDQojIFhlbSBr4bq/dCBxdeG6ow0Kc3VtbWFyeShtb2RlbF9wcm9iaXQpDQoNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQp8IEJp4bq/biAgICAgICAgICAgICAgIHwgRXN0aW1hdGUgfCBTdGQuIEVycm9yIHwgeiB2YWx1ZSB8IHAtdmFsdWUgICAgICAgICB8IMOdIG5naMSpYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IC0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tIHwgLS0tLS0tLS0tLSB8IC0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgKipJbnRlcmNlcHQqKiAgICAgIHwgLTEuMzQ5NCAgfCAwLjE5OTIgICAgIHwgLTYuNzc1ICB8IDEuMjVlLTExIFwqXCpcKiB8IExvZy1vZGRzIGPhu6dhICoqTmFtKiogKGdlbmRlclxfYmluYXJ5ID0gMCkgcsahaSB2w6BvIG5ow7NtIOKAnEhpZ2ggYW54aWV0eeKAnS4gICAgfA0KfCAqKmdlbmRlclxfYmluYXJ5KiogfCAtMC43Mzk3ICB8IDAuMzQ4MyAgICAgfCAtMi4xMjQgIHwgMC4wMzM3IFwqICAgICAgIHwgU28gduG7m2kgTmFtLCBO4buvIGPDsyBsb2ctb2RkcyAqKnRo4bqlcCBoxqFuIDAuNzM5NyoqIMSR4buDIHLGoWkgdsOgbyDigJxIaWdoIGFueGlldHnigJ0uIHwNCg0KVsOsIHAtdmFsdWUgPCAwLjA1Og0KDQotIEjhu4cgc+G7kSBnZW5kZXJfYmluYXJ5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIDUlLg0KDQotIE7hu68gY8OzIHjDoWMgc3XhuqV0IHRo4bqlcCBoxqFuIE5hbSDEkeG7gyByxqFpIHbDoG8gbeG7qWMgSGlnaCBhbnhpZXR5Lg0KDQoqKlRo4buRbmcga8OqIG3DtCBow6xuaCoqDQoNCnwgVGjhu5FuZyBrw6ogICAgICAgICAgfCBHacOhIHRy4buLIHwgw50gbmdoxKlhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEvhur90IGx14bqtbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgTnVsbCBkZXZpYW5jZSAgICAgfCA3Mi4yNjggIHwgU2FpIHPhu5Ega2hpIGtow7RuZyBjw7MgYmnhur9uIGdp4bqjaSB0aMOtY2guICAgICAgICAgfCBNw7QgaMOsbmggZ+G7kWMga8OpbSB24buBIGdp4bqjaSB0aMOtY2ggZOG7ryBsaeG7h3UuICAgICAgfA0KfCBSZXNpZHVhbCBkZXZpYW5jZSB8IDY3LjI0NiAgfCBTYWkgc+G7kSBzYXUga2hpIHRow6ptIGJp4bq/biAqKkdlbmRlcioqLiAgICAgICAgIHwgTcO0IGjDrG5oIHThu5F0IGjGoW4ga2hpIGPDsyB0aMOqbSBiaeG6v24gR2VuZGVyLiAgICB8DQp8ICoqR2nhuqNtIGRldmlhbmNlKiogfCA1LjAyMiAgIHwgTeG7qWMgY+G6o2kgdGhp4buHbiBraGkgdGjDqm0gYmnhur9uIEdlbmRlci4gICAgICAgICAgfCBHZW5kZXIgY8OzIHRo4buDIGPDsyDhuqNuaCBoxrDhu59uZyAoY+G6p24ga2nhu4NtIMSR4buLbmgpLiB8DQp8IEFJQyAgICAgICAgICAgICAgIHwgNzEuMjQ2ICB8IENo4buJIHPhu5Egc28gc8OhbmggbeG7qWMgcGjDuSBo4bujcCBnaeG7r2EgY8OhYyBtw7QgaMOsbmguIHwgQUlDIHRo4bqlcCDihpIgbcO0IGjDrG5oIG7DoHkgcGjDuSBo4bujcCBoxqFuLiAgICAgICAgIHwNCg0KKipL4bq+VCBMVeG6rE4gVOG7lE5HIFFVw4FUKioNCg0KQmnhur9uIEdlbmRlciBjw7Mg4bqjbmggaMaw4bufbmcgxJHDoW5nIGvhu4MgxJHhur9uIGto4bqjIG7Eg25nIHNpbmggdmnDqm4gcsahaSB2w6BvIG5ow7NtIEhpZ2ggYW54aWV0eS4gVuG7m2kgY8O5bmcgxJFp4buBdSBraeG7h24ga2jDoWMsIG7hu68gZ2nhu5tpIGPDsyB4w6FjIHN14bqldCB0aOG6pXAgaMahbiBuYW0gZ2nhu5tpIMSR4buDIGLhu4sgbG8gw6J1IG5naGnDqm0gdHLhu41uZy4NCk3DtCBow6xuaCBQcm9iaXQgxJHDoyBwaOG6o24gw6FuaCBt4buRaSBxdWFuIGjhu4cgbsOgeSBt4buZdCBjw6FjaCByw7UgcsOgbmcgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCiMgSMOgbSBDbG9nbG9nIChDb21wbGVtZW50YXJ5IGxvZy1sb2cgbGluayBmdW5jdGlvbikNCg0KKipDw7RuZyB0aOG7qWMqKg0KDQpcYmVnaW57YWxpZ25lZH0NClx0ZXh0e2Nsb2dsb2d9KHApICY9IFxsb2coLVxsb2coMSAtIHApKSAmJiBcdGV4dHtIw6BtIGxpw6puIGvhur90IGNsb2dsb2cgYmnhur9uIMSR4buVaSB4w6FjIHN14bqldCB9IHAgXHRleHR7IHRow6BuaCBk4bqhbmcgdHV54bq/biB0w61uaH0gXFxcXA0KcCAmPSAxIC0gZV57LWVee1xldGF9fSAmJiBcdGV4dHtYw6FjIHN14bqldCB44bqjeSByYSBz4buxIGtp4buHbiBzYXUga2hpIHTDrW5oIHRvw6FuIHThu6sgfSBcZXRhIFxcXFwNClxldGEgJj0gXGJldGFfMCArIFxiZXRhXzFYXzEgKyBcZG90cyArIFxiZXRhX3BYX3AgJiYgXGJlZ2lue2FsaWduZWR9DQomXGJldGFfMDogXHRleHR7SOG7hyBz4buRIGNo4bq3biAoaW50ZXJjZXB0KX0gXFxcXA0KJlxiZXRhX2k6IFx0ZXh0e0jhu4cgc+G7kSBo4buTaSBxdXkgY+G7p2EgYmnhur9uIMSR4buZYyBs4bqtcCB9IFhfaSBcXFxcDQomWF9pOiBcdGV4dHtHacOhIHRy4buLIGPhu6dhIGJp4bq/biDEkeG7mWMgbOG6rXAgdGjhu6kgfSBpDQpcZW5ke2FsaWduZWR9DQpcZW5ke2FsaWduZWR9DQoNCioqU28gc8OhbmggduG7m2kgbG9naXQgdsOgIHByb2JpdCoqDQoNCnwgTGluayBmdW5jdGlvbiB8IEPDtG5nIHRo4bupYyAgICAgICAgICAgICAgICAgICAgICAgIHwgxJDhurdjIMSRaeG7g20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8IExvZ2l0ICAgICAgICAgfCAkXGxvZ1xsZWZ0KFx0ZnJhY3twfXsxLXB9XHJpZ2h0KSR8IFjDoWMgc3XhuqV0IHRoYXkgxJHhu5VpIGPDom4gxJHhu5FpIHF1YW5oIDAuNS4gVGjGsOG7nW5nIGTDuW5nIGtoaSBk4buvIGxp4buHdSBwaMOibiBi4buRIMSR4buRaSB44bupbmcuICAgICAgICAgICAgfA0KfCBQcm9iaXQgICAgICAgIHwgJFxQaGleey0xfShwKSQgICAgICAgICAgICAgICAgICAgfCBT4butIGThu6VuZyBow6BtIHBow6JuIHBo4buRaSB0w61jaCBsxal5IGNodeG6qW4gKENERikuIFBow7kgaOG7o3Aga2hpIGdp4bqjIMSR4buLbmggbOG7l2kgY2h14bqpbi4gICAgICAgICAgICAgICB8DQp8IENsb2dsb2cgICAgICAgfCAkXGxvZygtXGxvZygxIC0gcCkpJCAgICAgICAgICAgICB8IFRow61jaCBo4bujcCBraGkgbcO0IGjDrG5oIGjDs2Egc+G7sSBraeG7h24gaGnhur9tLCB4w6FjIHN14bqldCBn4bqnbiAwIGhv4bq3YyBn4bqnbiAxLCB2w6AgcGjDom4gcGjhu5FpIGzhu4djaCBwaOG6o2kufA0KDQoNCioqTeG7pWMgdGnDqnUqKjogTeG7pWMgdGnDqnUgbMOgIGtp4buDbSB0cmEgeGVtIG7hu68gZ2nhu5tpIGPDsyB4w6FjIHN14bqldCBi4buLIEhpZ2ggYW54aWV0eSBjYW8gaMahbiBuYW0gZ2nhu5tpIGhheSBraMO0bmcsIHbDoCBu4bq/dSBjw7MgdGjDrCBt4bupYyBjaMOqbmggbOG7h2NoIGzDoCBiYW8gbmhpw6p1ICh0aMO0bmcgcXVhIGjhu4cgc+G7kSDOsuKCgSkgDQoNCioqQmnhur9uIHBo4bulIHRodeG7mWMqKjogYW54aWV0eV9iaW5hcnkgKDEgPSBIaWdoIGFueGlldHksIDAgPSBraMOhYykNCg0KKipCaeG6v24gZ2nhuqNpIHRow61jaCoqOiBnZW5kZXJfYmluYXJ5ICgxID0gbuG7rywgMCA9IG5hbSkNCg0KYGBge3J9DQojIFThuqFvIGJp4bq/biBuaOG7iyBwaMOibjogMSBu4bq/dSBIaWdoIGFueGlldHksIDAgbuG6v3UgY8OybiBs4bqhaQ0KZCRhbnhpZXR5X2JpbmFyeSA8LSBpZmVsc2UoZCRBbnhpZXR5LkxldmVsID09ICJIaWdoIGFueGlldHkiLCAxLCAwKQ0KDQojIENo4bqheSBtw7QgaMOsbmggY2xvZ2xvZw0KbW9kZWxfY2xvZ2xvZyA8LSBnbG0oYW54aWV0eV9iaW5hcnkgfiBnZW5kZXJfYmluYXJ5LA0KICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGQsDQogICAgICAgICAgICAgICAgICAgICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImNsb2dsb2ciKSkNCg0KIyBYZW0ga+G6v3QgcXXhuqMNCnN1bW1hcnkobW9kZWxfY2xvZ2xvZykNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KfCBCaeG6v24gfCDGr+G7m2MgbMaw4bujbmcgKEVzdGltYXRlKSB8IFN0ZC4gRXJyb3IgfCB6IHZhbHVlIHwgUHIoPnx6fCkgfCDDnSBuZ2jEqWEgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgKEludGVyY2VwdCkgfCAtMi4zNzc1IHwgMC4zNzgxIHwgLTYuMjg4IHwgPCAwLjAwMSB8IEjhu4cgc+G7kSBjaOG6t24gY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gfA0KfCBnZW5kZXJfYmluYXJ5IHwgLTEuNjExNCB8IDAuODAxOSB8IC0yLjAxMCB8IDAuMDQ0NSB8IMOdIG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgNSUgKCopLiB8DQoNCioqR2nhuqNpIHRow61jaCoqDQoNCioqSOG7hyBz4buRIGNo4bq3biAoSW50ZXJjZXB0ID0gLTIuMzc3NSkqKg0KDQpLaGkgJGdlbmRlclxfYmluYXJ5ID0gMCQgKG5hbSksIGdpw6EgdHLhu4s6ICANClxbDQpcZXRhID0gLTIuMzc3NQ0KXF0NCg0KWMOhYyBzdeG6pXQgSGlnaCBhbnhpZXR5IGNobyBuYW06DQpcWw0KcF97bWFsZX0gPSAxIC0gZV57LWVeey0yLjM3NzV9fSA9IDEgLSBlXnstZV57LTIuMzc3NX19IFxhcHByb3ggMC4wODQ4IFwgKDguNDhcJSkNClxdDQoNCioqS+G6v3QgbHXhuq1uOioqIE5hbSBnaeG7m2kgY8OzIGtob+G6o25nICoqOC41XCUqKiBraOG6oyBuxINuZyBi4buLIEhpZ2ggYW54aWV0eS4NCg0KDQoqKkjhu4cgc+G7kSBnZW5kZXJcX2JpbmFyeSAoLTEuNjExNCkqKg0KDQpLaGkgJGdlbmRlclxfYmluYXJ5ID0gMSQgKG7hu68pLCBnacOhIHRy4buLOiAgDQpcWw0KXGV0YSA9IC0yLjM3NzUgKyAoLTEuNjExNCkgPSAtMy45ODg5DQpcXQ0KDQpYw6FjIHN14bqldCBIaWdoIGFueGlldHkgY2hvIG7hu686DQpcWw0KcF97ZmVtYWxlfSA9IDEgLSBlXnstZV57LTMuOTg4OX19IFxhcHByb3ggMC4wMTg0IFwgKDEuODRcJSkNClxdDQoNCioqS+G6v3QgbHXhuq1uOioqIE7hu68gZ2nhu5tpIGPDsyB4w6FjIHN14bqldCBi4buLIEhpZ2ggYW54aWV0eSBjaOG7iSBraG/huqNuZyAqKjEuODRcJSoqLCB0aOG6pXAgaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuYW0uDQoNCioqxJDhu5kgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmgqKg0KDQp8IFRo4buRbmcga8OqICAgICAgICAgIHwgR2nDoSB0cuG7iyB8IMOdIG5naMSpYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBL4bq/dCBsdeG6rW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwNCnwgTnVsbCBkZXZpYW5jZSAgICAgIHwgNzIuMjY4ICB8IFNhaSBz4buRIGtoaSBraMO0bmcgY8OzIGJp4bq/biBnaeG6o2kgdGjDrWNoLiAgICAgICAgIHwgTcO0IGjDrG5oIGfhu5FjIGvDqW0gduG7gSBnaeG6o2kgdGjDrWNoIGThu68gbGnhu4d1LiAgICAgIHwNCnwgUmVzaWR1YWwgZGV2aWFuY2UgIHwgNjcuMjQ2ICB8IFNhaSBz4buRIHNhdSBraGkgdGjDqm0gYmnhur9uICoqR2VuZGVyKiouICAgICAgICAgfCBNw7QgaMOsbmggdOG7kXQgaMahbiBraGkgY8OzIHRow6ptIGJp4bq/biAqKkdlbmRlcioqLnwNCnwgKipHaeG6o20gZGV2aWFuY2UqKiAgfCA1LjAyMiAgIHwgTcO0IGjDrG5oIGPhuqNpIHRoaeG7h24gxJHDoW5nIGvhu4MuICAgICAgICAgICAgICAgICAgIHwgKipHZW5kZXIqKiBjw7MgdGjhu4MgY8OzIOG6o25oIGjGsOG7n25nIChj4bqnbiBraeG7g20gxJHhu4tuaCkufA0KfCBBSUMgICAgICAgICAgICAgICAgfCA3MS4yNDYgIHwgxJDhu4Mgc28gc8OhbmggbeG7qWMgcGjDuSBo4bujcCB24bubaSBjw6FjIG3DtCBow6xuaCBraMOhYy4gfCBNw7QgaMOsbmggY8OzICoqR2VuZGVyKiogcGjDuSBo4bujcCBoxqFuIChBSUMgZ2nhuqNtKS58DQoNCioqS+G6vlQgTFXhuqxOIFThu5RORyBRVcOBVCoqDQoNCkJp4bq/biBHZW5kZXIgY8OzIOG6o25oIGjGsOG7n25nIMSRw6FuZyBr4buDIMSR4bq/biBraOG6oyBuxINuZyBi4buLIEhpZ2ggYW54aWV0eShsbyDDonUgY2FvKS4gTuG7ryBnaeG7m2kgw610IGLhu4sgSGlnaCBhbnhpZXR5IGjGoW4gbmFtIGdp4bubaSwgdGhlbyBr4bq/dCBxdeG6oyB04burIG3DtCBow6xuaCBjbG9nbG9nLg0KDQojIMSQw6FuaCBnacOhIG3DtCBow6xuaA0KDQpUaeG6v24gaMOgbmggxJHDoW5oIGdpw6EgbcO0IGjDrG5oIGThu7FhIHRyw6puIGNo4buJIHPhu5EgQUlDIA0KDQpgYGB7cn0NCiMgQ2jhuqF5IGPDoWMgbcO0IGjDrG5oDQpsb2dpdF9nZW5kZXIgPC0gZ2xtKGFueGlldHlfYmluYXJ5IH4gZ2VuZGVyX2JpbmFyeSwgZGF0YSA9IGQsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkNCnByb2JpdF9nZW5kZXIgPC0gZ2xtKGFueGlldHlfYmluYXJ5IH4gZ2VuZGVyX2JpbmFyeSwgZGF0YSA9IGQsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikpDQpjbG9nbG9nX2dlbmRlciA8LSBnbG0oYW54aWV0eV9iaW5hcnkgfiBnZW5kZXJfYmluYXJ5LCBkYXRhID0gZCwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJjbG9nbG9nIikpDQoNCiMgVMOtbmggdsOgIGhp4buDbiB0aOG7iyBBSUMNCmNhdCgi4oCiIEFJQyBtw7QgaMOsbmggTG9naXRcbiIpDQpBSUMobG9naXRfZ2VuZGVyKQ0KDQojIEPDoGkgZ8OzaSBj4bqnbiB0aGnhur90DQppZiAoIXJlcXVpcmUobm5ldCkpIGluc3RhbGwucGFja2FnZXMoIm5uZXQiKQ0KbGlicmFyeShubmV0KQ0KDQojIENo4bqheSBtw7QgaMOsbmggbG9naXQgxJFhIGJp4bq/biAobXVsdGlub21pYWwgbG9naXN0aWMgcmVncmVzc2lvbikNCm1vZGVsX211bHRpbm9tIDwtIG11bHRpbm9tKEFueGlldHkuTGV2ZWwgfiBnZW5kZXJfYmluYXJ5LCBkYXRhID0gZCkNCg0KIyBUw61uaCBBSUMgY2hvIGxvZ2l0IMSRYSBiaeG6v24NCmFpY19tdWx0aW5vbSA8LSBBSUMobW9kZWxfbXVsdGlub20pDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjDQpjYXQoIlxu4oCiIEFJQyBtw7QgaMOsbmggTG9naXQgxJFhIGJp4bq/biAobXVsdGlub21pYWwpOlxuIikNCnByaW50KGFpY19tdWx0aW5vbSkNCg0KDQpjYXQoIlxu4oCiIEFJQyBtw7QgaMOsbmggeMOhYyBzdeG6pXQgUHJvYml0XG4iKQ0KQUlDKHByb2JpdF9nZW5kZXIpDQoNCmNhdCgiXG7igKIgQUlDIG3DtCBow6xuaCBDbG9nbG9nXG4iKQ0KQUlDKGNsb2dsb2dfZ2VuZGVyKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQp8IE3DtCBow6xuaCAgICAgICAgICAgICAgICAgICAgIHwgQUlDICAgICB8IE5o4bqtbiB4w6l0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgTG9naXQgbmjhu4sgcGjDom4gICAgICAgICAgICAgIHwgNzEuMjQ2ICB8IE3DtCBow6xuaCBn4buNbiBuaOG6uSwgQUlDIHRo4bqlcCBkbyBjaOG7iSB4w6l0IG5o4buLIHBow6JuIChIaWdoIGFueGlldHkgdnMgY8OybiBs4bqhaSkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCBQcm9iaXQgbmjhu4sgcGjDom4gICAgICAgICAgICAgfCA3MS4yNDYgIHwgQUlDIHTGsMahbmcgxJHGsMahbmcgTG9naXQgbmjhu4sgcGjDom4g4oaSIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgdMawxqFuZyB04buxLCBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgbGluayBmdW5jdGlvbiBraMO0bmcgxJHDoW5nIGvhu4MuICAgIHwNCnwgQ2xvZ2xvZyBuaOG7iyBwaMOibiAgICAgICAgICAgIHwgNzEuMjQ2ICB8IEFJQyB0csO5bmcgduG7m2kgTG9naXQgdsOgIFByb2JpdCBuaOG7iyBwaMOibiDihpIgY2hvIHRo4bqleSBk4buvIGxp4buHdSBuaOG7iyBwaMOibiBuw6B5IMOtdCBuaOG6oXkgduG7m2kgbG/huqFpIGxpbmsuICAgICAgICAgICAgICAgfA0KfCBMb2dpdCDEkWEgdGjhu6ljIChtdWx0aW5vbWlhbCkgfCA0NDcuMDk5IHwgQUlDIGNhbyBoxqFuIG5oaeG7gXUgZG8gYmnhur9uIHBo4bulIHRodeG7mWMgY8OzIDQgbeG7qWMgxJHhu5kgKMSRYSB0aOG7qWMpLCBtw7QgaMOsbmggcGjhu6ljIHThuqFwIGjGoW4gdsOgIGdp4bqjaSB0aMOtY2ggY2hpIHRp4bq/dCBoxqFuLiB8DQo=