YÊU CẦU VÀ HOẠT ĐỘNG TUẦN 3: Đào sâu Suy diễn Thống
kê trong Bảng Ngẫu nhiên và Giới thiệu về Mối liên hệ Phức tạp.
A. Đọc và Chuẩn bị trước buổi học
2. Tìm hiểu về các nội dung sau của Chương 2
2.1 Cấu trúc xác suất của bảng ngẫu nhiên
Bảng ngẫu nhiên
Bảng ngẫu nhiên (contingency table) là cách tổ chức dữ liệu dùng để
trình bày số đếm (frequencies) của các tổ hợp xảy ra giữa hai hay nhiều
biến phân loại. Mỗi ô trong bảng thể hiện số quan sát tương ứng với một
kết hợp cụ thể giữa các biến.
- Ví dụ, một bảng 2 chiều giữa giới tính (nam/nữ) và tình trạng bệnh
(có/không) sẽ có 4 ô tương ứng với từng kết hợp giữa các mức của hai
biến.
Phân phối Poisson
Sẽ sử dụng khi:
Các số đếm là kết quả của các quá trình độc lập, số đếm từng ô
không bị ràng buộc tổng hàng/cột.
Không cố định tổng số quan sát.
Thường dùng trong mô hình log-linear và dữ liệu đếm theo thời
gian/không gian
Công thức:
\[
N_{ij} \sim \mathrm{Poisson}(\mu_{ij})
\]
| Ký hiệu |
Ý nghĩa |
| \(N_{ij}\) |
Số đếm ở ô hàng \(i\), cột \(j\), được sinh ra độc lập |
| \(\mu_{ij}\) |
Kỳ vọng của số đếm tại ô \((i,j)\)
– trung bình lý thuyết của phân phối Poisson |
Ý nghĩa
Mỗi ô trong bảng là một biến Poisson độc lập.
Dữ liệu thường đến từ quá trình đếm tự nhiên: tai nạn,
ca bệnh, sự kiện,…
Không cần tổng số đếm phải cố định → các ô độc lập với
nhau.
Hàm xác suất (PMF)
\[
P(N_{ij} = n_{ij}) = \frac{e^{-\mu_{ij}} \mu_{ij}^{n_{ij}}}{n_{ij}!}
\]
- Tổng xác suất liên hợp cho toàn bảng
\[
P(\{n_{ij}\}) = \prod_{i,j} \frac{e^{-\mu_{ij}}
\mu_{ij}^{n_{ij}}}{n_{ij}!}
\]
Phân phối Multinomial
\[
(N_{11}, N_{12}, \ldots, N_{rc}) \sim \mathrm{Multinomial}\left(n,
\{p_{ij}\}\right)
\]
| Ký hiệu |
Ý nghĩa |
| \(N_{ij}\) |
Số quan sát ở ô hàng \(i\), cột
\(j\) của bảng ngẫu nhiên |
| \(n\) |
Tổng số mẫu: \(n = \sum_{i=1}^{r}
\sum_{j=1}^{c} N_{ij}\) |
| \(p_{ij}\) |
Xác suất một quan sát rơi vào ô \((i,j)\), với \(\sum_{i,j} p_{ij} = 1\) |
Ý nghĩa
Phù hợp với dữ liệu dạng lựa chọn phân loại, rút mẫu có tổng cố
định.
Các ô trong bảng có phụ thuộc lẫn nhau, vì tổng \(n\) là cố định.
Mỗi mẫu quan sát rơi vào một trong các ô, với xác suất \(p_{ij}\).
Hàm xác suất (PMF)
\[
P(n_{ij}) = \frac{n!}{\prod_{i,j} n_{ij}!} \prod_{i,j} p_{ij}^{n_{ij}}
\]
Mối liên hệ giữa Poisson và Multinomial
Nếu:
Thì:
\[
(N_{ij} \mid N = n) \sim \mathrm{Multinomial}\left(n, p_{ij} =
\frac{\mu_{ij}}{\sum \mu_{ij}}\right)
\]
Diễn giải
Nếu bạn lấy các đếm Poisson rồi điều kiện hóa theo tổng
số đếm cố định, bạn thu được một phân phối Multinomial.
Tức là: Multinomial là trường hợp đặc biệt của Poisson khi
tổng được ràng buộc.
Mô hình log-tuyến tính (log-linear model)
Dùng để mô hình hóa mối liên hệ giữa các biến phân loại:
\[
\log(\mu_{ij}) = \lambda + \lambda^{(R)}_i + \lambda^{(C)}_j +
\lambda^{(RC)}_{ij}
\]
| Ký hiệu |
Ý nghĩa |
| \(\lambda\) |
Hằng số tổng quát (intercept) |
| \(\lambda^{(R)}_i\) |
Hiệu ứng biến hàng (ví dụ: giới tính) |
| \(\lambda^{(C)}_j\) |
Hiệu ứng biến cột (ví dụ: tình trạng bệnh) |
| \(\lambda^{(RC)}_{ij}\) |
Tương tác giữa hàng và cột (mức độ phụ thuộc giữa 2 biến) |
Ý nghĩa
Cho phép kiểm định độc lập (khi bỏ \(\lambda^{(RC)}_{ij}\)).
Có thể mở rộng cho bảng 3 chiều, 4 chiều,…
Thường được ước lượng bằng mô hình GLM với link log.
Tổng kết bảng so sánh
| Đặc điểm |
Multinomial |
Poisson |
| Tổng số đếm |
Cố định \(n\) |
Không cố định |
| Quan hệ giữa các ô |
Phụ thuộc |
Độc lập |
| Dữ liệu phù hợp |
Rút mẫu, khảo sát |
Dữ liệu đếm tự nhiên |
| Phân tích tương tác |
Giới hạn |
Linh hoạt với log-linear |
| Công thức mô hình |
\(\text{Multinomial}(n,
\{p_{ij}\})\) |
\(\text{Poisson}(\mu_{ij})\) |
| Khi điều kiện hóa tổng |
— |
Cho ra phân phối Multinomial |
2.2 So sánh 2 tỷ lệ trong bảng ngẫu nhiên 2x2
Giả sử một bảng 2x2 được trình bày như sau:
|
Kết quả (+) |
Kết quả (–) |
Tổng |
| Nhóm 1 |
\(a\) |
\(b\) |
\(a+b\) |
| Nhóm 2 |
\(c\) |
\(d\) |
\(c+d\) |
| Tổng |
\(a+c\) |
\(b+d\) |
\(n\) |
Đây là dạng bảng thường dùng để so sánh xác suất thành công, rủi ro,
hoặc phản hồi tích cực giữa hai nhóm.
Hiệu hai tỷ lệ
\[
\Delta p = \frac{a}{a+b} - \frac{c}{c+d}
\]
Ý nghĩa:
Là mức chênh lệch tuyệt đối giữa hai tỷ lệ thành công ở
hai nhóm.
Nếu \(\Delta p > 0\), nhóm 1
có tỷ lệ thành công cao hơn nhóm 2.
Đơn giản và dễ diễn giải, thích hợp khi tập trung vào sự khác
biệt thực tế (absolute difference), thay vì tỷ lệ tương
đối.
Tỷ số nguy cơ - Relative Risk
\[
RR = \frac{a / (a+b)}{c / (c+d)}
\]
Ý nghĩa:
Đo mức tăng (hoặc giảm) nguy cơ của nhóm 1 so với nhóm
2.
\(RR = 1\): Không có khác biệt
nguy cơ.
\(RR > 1\): Nhóm 1 có nguy cơ
cao hơn.
\(RR < 1\): Nhóm 1 có nguy cơ
thấp hơn.
Tỷ số chênh - Odds Ratio
\[
OR = \frac{a/b}{c/d} = \frac{ad}{bc}
\]
Ý nghĩa:
So sánh cơ hội xảy ra sự kiện giữa hai nhóm.
\(OR = 1\): Không có liên
hệ.
\(OR > 1\): Nhóm 1 có cơ hội
cao hơn.
\(OR < 1\): Nhóm 1 có cơ hội
thấp hơn.
Lưu ý:
2.3 Khoảng tin cậy cho các tham số đo mối liên hệ
Công thức:
Tính trên log(OR):
\[
\log(OR) \pm Z_{\alpha/2} \cdot \sqrt{ \frac{1}{a} + \frac{1}{b} +
\frac{1}{c} + \frac{1}{d} }
\]
Sau đó lấy mũ để trở lại OR:
\[
CI_{OR} = \left( e^{L},\ e^{U} \right)
\]
Trong đó:
\(L = \log(OR) - Z_{\alpha/2} \cdot
SE\)
\(U = \log(OR) + Z_{\alpha/2} \cdot
SE\)
\(SE = \sqrt{ \frac{1}{a} + \frac{1}{b}
+ \frac{1}{c} + \frac{1}{d} }\)
Với mức tin cậy 95%, \(Z_{\alpha/2} =
1.96\)
2.4 Ví dụ
Một doanh nghiệp khảo sát tỷ lệ khách hàng gửi lại đánh giá sản phẩ
(feedback)m. Kết quả:
|
Mua hàng |
Không mua |
Tổng |
| Nhóm đánh giá (Nhóm 1) |
40 |
60 |
100 |
| Nhóm không đánh giá (Nhóm 2) |
20 |
80 |
100 |
2.5 Tổng kết
| Chỉ số |
Công thức |
Ý nghĩa chính |
Ưu điểm |
Ứng dụng phổ biến |
| Hiệu tỷ lệ |
\(p_1 - p_2\) |
So sánh tuyệt đối giữa hai tỷ lệ |
Trực quan, dễ hiểu |
So sánh đơn giản |
| RR |
\(\frac{p_1}{p_2}\) |
So sánh xác suất giữa hai nhóm |
Diễn giải tự nhiên |
Nghiên cứu y học, marketing |
| OR |
\(\frac{ad}{bc}\) |
So sánh odds giữa hai nhóm |
Áp dụng linh hoạt trong hồi quy |
Hồi quy logistic, phân tích rủi ro |
3. Suy nghĩ về bộ dữ liệu “Supermarket
Transactions”
3.1 Đọc bộ dữ liệu
library(csv)
## Warning: package 'csv' was built under R version 4.3.3
data <- read.csv("C:/Users/HP/Downloads/Supermarket Transactions.csv", header = T)
3.2 Các bước thực hiện
B1: Tạo bảng chéo giữa Gender và Homeowner
table_gender_home <- table(data$Gender, data$Homeowner)
table_gender_home
##
## N Y
## F 2826 4344
## M 2789 4100
B2: Tính Odds Ratio (tỷ số chênh)
a <- table_gender_home["F", "Y"]
b <- table_gender_home["F", "N"]
c <- table_gender_home["M", "Y"]
d <- table_gender_home["M", "N"]
OR <- (a * d) / (b * c)
OR
## [1] 1.04564
B3: Tính khoảng tin cậy cho OR
log_OR <- log(OR)
SE <- sqrt(1/a + 1/b + 1/c + 1/d)
# 95% CI
z <- 1.96
CI_lower <- exp(log_OR - z * SE)
CI_upper <- exp(log_OR + z * SE)
c(CI_lower, CI_upper)
## [1] 0.9773755 1.1186731
Diễn giải
OR = 1.045 > 1 cho thấy tỷ số chênh (odds ratio) về khả năng
sở hữu nhà của Nữ cao hơn một chút so với Nam.
Nói cách khác, trong tập dữ liệu khách hàng này, là Nữ có liên
quan đến việc tăng nhẹ odds sở hữu nhà so với Nam. Cụ thể, odds sở hữu
nhà của Nữ cao hơn khoảng 4.5% so với Nam, nếu giữ các yếu tố khác không
đổi.
Tuy nhiên, mức chênh lệch này là rất nhỏ và chưa đủ để kết luận
chắc chắn về sự khác biệt giữa hai nhóm.
Khi xét đến khoảng tin cậy 95% của OR (khoảng từ ~0.977 đến
~1.118), ta thấy khoảng này chứa giá trị 1, điều đó có nghĩa là kết quả
không có ý nghĩa thống kê ở mức tin cậy 95%.
Tóm lại, mặc dù OR > 1 cho thấy xu hướng odds sở hữu nhà của
Nữ cao hơn Nam, kết luận này không có ý nghĩa thống kê. Sự khác biệt nhỏ
có thể chỉ là do ngẫu nhiên trong mẫu quan sát. Do đó, không có bằng
chứng đủ mạnh để khẳng định rằng việc là Nữ (so với Nam) làm tăng hoặc
giảm odds của việc sở hữu nhà trong bộ dữ liệu này.
=> Kết luận: Trong phạm vi dữ liệu hiện tại, giới tính không phải
là yếu tố quyết định đến việc sở hữu nhà — odds gần như tương đương nhau
giữa Nam và Nữ.
3.3 GENDER VÀ MARITALSTATUS
Tạo bảng chéo
# Tạo bảng chéo giữa Gender và MaritalStatus
table_gender_marital <- table(data$Gender, data$MaritalStatus)
addmargins(table_gender_marital) # Thêm hàng và cột tổng
##
## M S Sum
## F 3602 3568 7170
## M 3264 3625 6889
## Sum 6866 7193 14059
Tính toán Relative Risk
# Trích xuất số liệu từ bảng chéo
A <- table_gender_marital["F","S"] # nữ độc thân
B <- table_gender_marital["F","M"] # nữ kết hôn
C <- table_gender_marital["M","S"] # nam độc thân
D <- table_gender_marital["M","M"] # nam kết hôn
# Tính RR
RR <- (A/(A+B))/(C/(C+D))
RR
## [1] 0.945701
# Trong đó: A/(A+B) là tỷ lệ phụ nữ độc thân trong tổng số nữ
# Và: C/(C+D) là tỷ lệ nam giới độc thân trong tổng số nam
Ý nghĩa
- RR = 1: Không có sự khác biệt về tỷ lệ độc thân giữa hai giới
tính.
- RR > 1: Nam giới có tỷ lệ độc thân cao hơn phụ nữ.
- RR < 1: Phụ nữ có tỷ lệ độc thân cao hơn nam giới.
Nhận xét
- Tỷ lệ phụ nữ độc thân bằng khoảng 94.57% tỷ lệ nam giới độc thân.
Điều này cho thấy không có sự khác biệt lớn về tỷ lệ độc thân giữa hai
giới tính trong dữ liệu.
install.packages("epitools", repos = "https://cran.rstudio.com/")
## Installing package into 'C:/Users/HP/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\HP\AppData\Local\Temp\Rtmp6jFrrt\downloaded_packages
library(epitools)
riskratio(table_gender_marital, method="wald")
## $data
##
## M S Total
## F 3602 3568 7170
## M 3264 3625 6889
## Total 6866 7193 14059
##
## $measure
## risk ratio with 95% C.I.
## estimate lower upper
## F 1.000000 NA NA
## M 1.057417 1.023813 1.092123
##
## $p.value
## two-sided
## midp.exact fisher.exact chi.square
## F NA NA NA
## M 0.0007045092 0.0007373895 0.0007038837
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
# Chỉ định phương pháp tính khoảng tin cậy (confidence interval) cho Risk Ratio.
# "wald" là phương pháp sử dụng ước lượng Wald, giả định phân phối chuẩn, để tính khoảng tin cậy.
Nhận xét
LS0tDQp0aXRsZTogIk5oaWVtIFZ1IDMiDQphdXRob3I6ICJIaWV1IFZvIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jOiB0cnVlDQogICAgZGZfcHJpbnQ6IGthYmxlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KDQoqKlnDilUgQ+G6plUgVsOAIEhP4bqgVCDEkOG7mE5HIFRV4bqmTiAzOioqIMSQw6BvIHPDonUgU3V5IGRp4buFbiBUaOG7kW5nIGvDqiB0cm9uZyBC4bqjbmcgTmfhuqt1IG5oacOqbiB2w6AgR2nhu5tpIHRoaeG7h3UgduG7gSBN4buRaSBsacOqbiBo4buHIFBo4bupYyB04bqhcC4NCg0KDQojICoqKkEuIMSQ4buNYyB2w6AgQ2h14bqpbiBi4buLIHRyxrDhu5tjIGJ14buVaSBo4buNYyoqKg0KDQojIyAqKjIuIFTDrG0gaGnhu4N1IHbhu4EgY8OhYyBu4buZaSBkdW5nIHNhdSBj4bunYSBDaMawxqFuZyAyKioNCg0KIyMjICoqMi4xIEPhuqV1IHRyw7pjIHjDoWMgc3XhuqV0IGPhu6dhIGLhuqNuZyBuZ+G6q3Ugbmhpw6puKioNCg0KIyMjIyAqQuG6o25nIG5n4bqrdSBuaGnDqm4qDQoNCkLhuqNuZyBuZ+G6q3Ugbmhpw6puIChjb250aW5nZW5jeSB0YWJsZSkgbMOgIGPDoWNoIHThu5UgY2jhu6ljIGThu68gbGnhu4d1IGTDuW5nIMSR4buDIHRyw6xuaCBiw6B5IHPhu5EgxJHhur9tIChmcmVxdWVuY2llcykgY+G7p2EgY8OhYyB04buVIGjhu6NwIHjhuqN5IHJhIGdp4buvYSBoYWkgaGF5IG5oaeG7gXUgYmnhur9uIHBow6JuIGxv4bqhaS4gTeG7l2kgw7QgdHJvbmcgYuG6o25nIHRo4buDIGhp4buHbiBz4buRIHF1YW4gc8OhdCB0xrDGoW5nIOG7qW5nIHbhu5tpIG3hu5l0IGvhur90IGjhu6NwIGPhu6UgdGjhu4MgZ2nhu69hIGPDoWMgYmnhur9uLg0KDQotIFbDrSBk4bulLCBt4buZdCBi4bqjbmcgMiBjaGnhu4F1IGdp4buvYSBnaeG7m2kgdMOtbmggKG5hbS9u4buvKSB2w6AgdMOsbmggdHLhuqFuZyBi4buHbmggKGPDsy9raMO0bmcpIHPhur0gY8OzIDQgw7QgdMawxqFuZyDhu6luZyB24bubaSB04burbmcga+G6v3QgaOG7o3AgZ2nhu69hIGPDoWMgbeG7qWMgY+G7p2EgaGFpIGJp4bq/bi4NCg0KLS0tDQoNCiMjIyMgKlBow6JuIHBo4buRaSBQb2lzc29uKg0KDQotIFPhur0gc+G7rSBk4bulbmcga2hpOg0KDQogICAtIEPDoWMgc+G7kSDEkeG6v20gbMOgIGvhur90IHF14bqjIGPhu6dhIGPDoWMgcXXDoSB0csOsbmggxJHhu5ljIGzhuq1wLCBz4buRIMSR4bq/bSB04burbmcgw7Qga2jDtG5nIGLhu4sgcsOgbmcgYnXhu5ljIHThu5VuZyBow6BuZy9j4buZdC4NCg0KICAgLSBLaMO0bmcgY+G7kSDEkeG7i25oIHThu5VuZyBz4buRIHF1YW4gc8OhdC4NCg0KICAgLSBUaMaw4budbmcgZMO5bmcgdHJvbmcgbcO0IGjDrG5oIGxvZy1saW5lYXIgdsOgIGThu68gbGnhu4d1IMSR4bq/bSB0aGVvIHRo4budaSBnaWFuL2tow7RuZyBnaWFuDQoNCi0gQ8O0bmcgdGjhu6ljOg0KDQokJA0KTl97aWp9IFxzaW0gXG1hdGhybXtQb2lzc29ufShcbXVfe2lqfSkNCiQkDQoNCi0gKlRow6BuaCBwaOG6p246Kg0KDQp8IEvDvSBoaeG7h3UgfCDDnSBuZ2jEqWEgfA0KfC0tLS0tLS0tfC0tLS0tLS0tfA0KfCBcKE5fe2lqfVwpIHwgU+G7kSDEkeG6v20g4bufIMO0IGjDoG5nIFwoaVwpLCBj4buZdCBcKGpcKSwgxJHGsOG7o2Mgc2luaCByYSDEkeG7mWMgbOG6rXAgfA0KfCBcKFxtdV97aWp9XCkgfCBL4buzIHbhu41uZyBj4bunYSBz4buRIMSR4bq/bSB04bqhaSDDtCBcKCAoaSxqKSBcKSDigJMgdHJ1bmcgYsOsbmggbMO9IHRodXnhur90IGPhu6dhIHBow6JuIHBo4buRaSBQb2lzc29uIHwNCg0KLSDDnSBuZ2jEqWENCg0KICAgLSBN4buXaSDDtCB0cm9uZyBi4bqjbmcgbMOgIG3hu5l0ICpiaeG6v24gUG9pc3NvbiDEkeG7mWMgbOG6rXAqLg0KICAgDQogICAtIEThu68gbGnhu4d1IHRoxrDhu51uZyDEkeG6v24gdOG7qyAqcXXDoSB0csOsbmggxJHhur9tIHThu7Egbmhpw6puKjogdGFpIG7huqFuLCBjYSBi4buHbmgsIHPhu7Ega2nhu4duLC4uLg0KICAgDQogICAtIEtow7RuZyBj4bqnbiB04buVbmcgc+G7kSDEkeG6v20gcGjhuqNpIGPhu5EgxJHhu4tuaCDihpIgKmPDoWMgw7QgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUqLg0KDQotIEjDoG0geMOhYyBzdeG6pXQgKFBNRikNCg0KJCQNClAoTl97aWp9ID0gbl97aWp9KSA9IFxmcmFje2Veey1cbXVfe2lqfX0gXG11X3tpan1ee25fe2lqfX19e25fe2lqfSF9DQokJA0KDQotICpU4buVbmcgeMOhYyBzdeG6pXQgbGnDqm4gaOG7o3AgY2hvIHRvw6BuIGLhuqNuZyoNCg0KJCQNClAoXHtuX3tpan1cfSkgPSBccHJvZF97aSxqfSBcZnJhY3tlXnstXG11X3tpan19IFxtdV97aWp9XntuX3tpan19fXtuX3tpan0hfQ0KJCQNCg0KLS0tDQoNCiMjIyMgKlBow6JuIHBo4buRaSBNdWx0aW5vbWlhbCoNCg0KLSAqQ8O0bmcgdGjhu6ljKg0KDQokJA0KKE5fezExfSwgTl97MTJ9LCBcbGRvdHMsIE5fe3JjfSkgXHNpbSBcbWF0aHJte011bHRpbm9taWFsfVxsZWZ0KG4sIFx7cF97aWp9XH1ccmlnaHQpDQokJA0KDQotIFRow6BuaCBwaOG6p24NCg0KfCBLw70gaGnhu4d1IHwgw50gbmdoxKlhIHwNCnwtLS0tLS0tLXwtLS0tLS0tLXwNCnwgXChOX3tpan1cKSB8IFPhu5EgcXVhbiBzw6F0IOG7nyDDtCBow6BuZyBcKGlcKSwgY+G7mXQgXChqXCkgY+G7p2EgYuG6o25nIG5n4bqrdSBuaGnDqm4gfA0KfCBcKG5cKSB8IFThu5VuZyBz4buRIG3huqt1OiBcKG4gPSBcc3VtX3tpPTF9XntyfSBcc3VtX3tqPTF9XntjfSBOX3tpan1cKSB8DQp8IFwocF97aWp9XCkgfCBYw6FjIHN14bqldCBt4buZdCBxdWFuIHPDoXQgcsahaSB2w6BvIMO0IFwoIChpLGopIFwpLCB24bubaSBcKCBcc3VtX3tpLGp9IHBfe2lqfSA9IDEgXCkgfA0KDQotIMOdIG5naMSpYQ0KDQogICAtIFBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UgZOG6oW5nIGzhu7FhIGNo4buNbiBwaMOibiBsb+G6oWksIHLDunQgbeG6q3UgY8OzIHThu5VuZyBj4buRIMSR4buLbmguDQoNCiAgIC0gQ8OhYyDDtCB0cm9uZyBi4bqjbmcgY8OzICpwaOG7pSB0aHXhu5ljIGzhuqtuIG5oYXUqLCB2w6wgdOG7lW5nIFwoblwpIGzDoCBj4buRIMSR4buLbmguDQoNCiAgIC0gTeG7l2kgbeG6q3UgcXVhbiBzw6F0IHLGoWkgdsOgbyBt4buZdCB0cm9uZyBjw6FjIMO0LCB24bubaSB4w6FjIHN14bqldCBcKHBfe2lqfVwpLg0KDQotIEjDoG0geMOhYyBzdeG6pXQgKFBNRikNCg0KJCQNClAobl97aWp9KSA9IFxmcmFje24hfXtccHJvZF97aSxqfSBuX3tpan0hfSBccHJvZF97aSxqfSBwX3tpan1ee25fe2lqfX0NCiQkDQoNCi0tLQ0KDQojIyMjICpN4buRaSBsacOqbiBo4buHIGdp4buvYSBQb2lzc29uIHbDoCBNdWx0aW5vbWlhbCoNCg0KTuG6v3U6DQoNCi0gTeG7l2kgw7QgXCggTl97aWp9IFxzaW0gXG1hdGhybXtQb2lzc29ufShcbXVfe2lqfSkgXCkNCg0KLSBWw6AgdOG7lW5nIFwoIE4gPSBcc3VtX3tpLGp9IE5fe2lqfSA9IG4gXCkgxJHGsOG7o2MgY+G7kSDEkeG7i25oDQoNClRow6w6DQoNCiQkDQooTl97aWp9IFxtaWQgTiA9IG4pIFxzaW0gXG1hdGhybXtNdWx0aW5vbWlhbH1cbGVmdChuLCBwX3tpan0gPSBcZnJhY3tcbXVfe2lqfX17XHN1bSBcbXVfe2lqfX1ccmlnaHQpDQokJA0KDQotIERp4buFbiBnaeG6o2kNCg0KICAgLSBO4bq/dSBi4bqhbiBs4bqleSBjw6FjIMSR4bq/bSBQb2lzc29uIHLhu5NpICrEkWnhu4F1IGtp4buHbiBow7NhKiB0aGVvIHThu5VuZyBz4buRIMSR4bq/bSBj4buRIMSR4buLbmgsIGLhuqFuIHRodSDEkcaw4bujYyBt4buZdCBwaMOibiBwaOG7kWkgTXVsdGlub21pYWwuDQogICANCiAgIC0gVOG7qWMgbMOgOiAqTXVsdGlub21pYWwgbMOgIHRyxrDhu51uZyBo4bujcCDEkeG6t2MgYmnhu4d0IGPhu6dhIFBvaXNzb24ga2hpIHThu5VuZyDEkcaw4bujYyByw6BuZyBideG7mWMqLg0KDQotLS0NCg0KIyMjIyAqTcO0IGjDrG5oIGxvZy10dXnhur9uIHTDrW5oIChsb2ctbGluZWFyIG1vZGVsKSoNCg0KRMO5bmcgxJHhu4MgKm3DtCBow6xuaCBow7NhIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGPDoWMgYmnhur9uIHBow6JuIGxv4bqhaSo6DQoNCi0gTcO0IGjDrG5oIGxvZyB0dXnhur9uIHTDrW5oDQoNCiQkDQpcbG9nKFxtdV97aWp9KSA9IFxsYW1iZGEgKyBcbGFtYmRhXnsoUil9X2kgKyBcbGFtYmRhXnsoQyl9X2ogKyBcbGFtYmRhXnsoUkMpfV97aWp9DQokJA0KDQotIFRow6BuaCBwaOG6p246DQoNCnwgS8O9IGhp4buHdSB8IMOdIG5naMSpYSB8DQp8LS0tLS0tLS18LS0tLS0tLS18DQp8IFwoXGxhbWJkYVwpIHwgSOG6sW5nIHPhu5EgdOG7lW5nIHF1w6F0IChpbnRlcmNlcHQpIHwNCnwgXChcbGFtYmRhXnsoUil9X2lcKSB8IEhp4buHdSDhu6luZyBiaeG6v24gaMOgbmcgKHbDrSBk4bulOiBnaeG7m2kgdMOtbmgpIHwNCnwgXChcbGFtYmRhXnsoQyl9X2pcKSB8IEhp4buHdSDhu6luZyBiaeG6v24gY+G7mXQgKHbDrSBk4bulOiB0w6xuaCB0cuG6oW5nIGLhu4duaCkgfA0KfCBcKFxsYW1iZGFeeyhSQyl9X3tpan1cKSB8IFTGsMahbmcgdMOhYyBnaeG7r2EgaMOgbmcgdsOgIGPhu5l0ICht4bupYyDEkeG7mSBwaOG7pSB0aHXhu5ljIGdp4buvYSAyIGJp4bq/bikgfA0KDQotIMOdIG5naMSpYQ0KDQogICAtIENobyBwaMOpcCBraeG7g20gxJHhu4tuaCDEkeG7mWMgbOG6rXAgKGtoaSBi4buPIFwoIFxsYW1iZGFeeyhSQyl9X3tpan0gXCkpLg0KDQogICAtIEPDsyB0aOG7gyBt4bufIHLhu5luZyBjaG8gYuG6o25nIDMgY2hp4buBdSwgNCBjaGnhu4F1LC4uLg0KDQogICAtIFRoxrDhu51uZyDEkcaw4bujYyDGsOG7m2MgbMaw4bujbmcgYuG6sW5nIG3DtCBow6xuaCBHTE0gduG7m2kgbGluayBsb2cuDQoNCi0tLQ0KDQojIyMjIFThu5VuZyBr4bq/dCBi4bqjbmcgc28gc8OhbmgNCg0KfCDEkOG6t2MgxJFp4buDbSB8IE11bHRpbm9taWFsIHwgUG9pc3NvbiB8DQp8LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLXwNCnwgVOG7lW5nIHPhu5EgxJHhur9tIHwgQ+G7kSDEkeG7i25oIFwoblwpIHwgS2jDtG5nIGPhu5EgxJHhu4tuaCB8DQp8IFF1YW4gaOG7hyBnaeG7r2EgY8OhYyDDtCB8IFBo4bulIHRodeG7mWMgfCDEkOG7mWMgbOG6rXAgfA0KfCBE4buvIGxp4buHdSBwaMO5IGjhu6NwIHwgUsO6dCBt4bqrdSwga2jhuqNvIHPDoXQgfCBE4buvIGxp4buHdSDEkeG6v20gdOG7sSBuaGnDqm4gfA0KfCBQaMOibiB0w61jaCB0xrDGoW5nIHTDoWMgfCBHaeG7m2kgaOG6oW4gfCBMaW5oIGhv4bqhdCB24bubaSBsb2ctbGluZWFyIHwNCnwgQ8O0bmcgdGjhu6ljIG3DtCBow6xuaCB8IFwoXHRleHR7TXVsdGlub21pYWx9KG4sIFx7cF97aWp9XH0pXCkgfCBcKFx0ZXh0e1BvaXNzb259KFxtdV97aWp9KVwpIHwNCnwgS2hpIMSRaeG7gXUga2nhu4duIGjDs2EgdOG7lW5nIHwg4oCUIHwgQ2hvIHJhIHBow6JuIHBo4buRaSBNdWx0aW5vbWlhbCB8DQoNCi0tLQ0KDQojIyMgKjIuMiBTbyBzw6FuaCAyIHThu7cgbOG7hyB0cm9uZyBi4bqjbmcgbmfhuqt1IG5oacOqbiAyeDIqDQoNCkdp4bqjIHPhu60gbeG7mXQgYuG6o25nIDJ4MiDEkcaw4bujYyB0csOsbmggYsOgeSBuaMawIHNhdToNCg0KfCAgICAgICAgICAgICAgIHwgS+G6v3QgcXXhuqMgKCspIHwgS+G6v3QgcXXhuqMgKOKAkykgfCBU4buVbmcgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18DQp8IE5ow7NtIDEgICAgICAgIHwgXChhXCkgICAgICAgfCBcKGJcKSAgICAgICB8IFwoYStiXCkgIHwNCnwgTmjDs20gMiAgICAgICAgfCBcKGNcKSAgICAgICB8IFwoZFwpICAgICAgIHwgXChjK2RcKSAgfA0KfCAqKlThu5VuZyoqICAgICAgfCBcKGErY1wpICAgICB8IFwoYitkXCkgICAgIHwgXChuXCkgICAgfA0KDQrEkMOieSBsw6AgZOG6oW5nIGLhuqNuZyB0aMaw4budbmcgZMO5bmcgxJHhu4Mgc28gc8OhbmggeMOhYyBzdeG6pXQgdGjDoG5oIGPDtG5nLCBy4bunaSBybywgaG/hurdjIHBo4bqjbiBo4buTaSB0w61jaCBj4buxYyBnaeG7r2EgaGFpIG5ow7NtLg0KDQotLS0NCg0KIyMjIyAqSGnhu4d1IGhhaSB04bu3IGzhu4cqDQoNCi0gQ8O0bmcgdGjhu6ljOg0KDQpcWw0KXERlbHRhIHAgPSBcZnJhY3thfXthK2J9IC0gXGZyYWN7Y317YytkfQ0KXF0NCg0KLSDDnSBuZ2jEqWE6DQoNCiAgIC0gTMOgICpt4bupYyBjaMOqbmggbOG7h2NoIHR1eeG7h3QgxJHhu5FpKiBnaeG7r2EgaGFpIHThu7cgbOG7hyB0aMOgbmggY8O0bmcg4bufIGhhaSBuaMOzbS4NCg0KICAgLSBO4bq/dSBcKFxEZWx0YSBwID4gMFwpLCBuaMOzbSAxIGPDsyB04bu3IGzhu4cgdGjDoG5oIGPDtG5nIGNhbyBoxqFuIG5ow7NtIDIuDQoNCiAgIC0gxJDGoW4gZ2nhuqNuIHbDoCBk4buFIGRp4buFbiBnaeG6o2ksIHRow61jaCBo4bujcCBraGkgdOG6rXAgdHJ1bmcgdsOgbyBz4buxICpraMOhYyBiaeG7h3QgdGjhu7FjIHThur8qIChhYnNvbHV0ZSBkaWZmZXJlbmNlKSwgdGhheSB2w6wgdOG7tyBs4buHIHTGsMahbmcgxJHhu5FpLg0KICAgDQotLS0NCg0KIyMjIyAqVOG7tyBz4buRIG5ndXkgY8ahIC0gUmVsYXRpdmUgUmlzayoNCg0KLSBDw7RuZyB0aOG7qWM6DQoNClxbDQpSUiA9IFxmcmFje2EgLyAoYStiKX17YyAvIChjK2QpfQ0KXF0NCg0KLSDDnSBuZ2jEqWE6DQoNCiAgIC0gxJBvIG3hu6ljIHTEg25nIChob+G6t2MgZ2nhuqNtKSAqbmd1eSBjxqEqIGPhu6dhIG5ow7NtIDEgc28gduG7m2kgbmjDs20gMi4NCg0KICAgLSBcKFJSID0gMVwpOiBLaMO0bmcgY8OzIGtow6FjIGJp4buHdCBuZ3V5IGPGoS4NCiAgDQogICAtIFwoUlIgPiAxXCk6IE5ow7NtIDEgY8OzIG5ndXkgY8ahIGNhbyBoxqFuLg0KICANCiAgIC0gXChSUiA8IDFcKTogTmjDs20gMSBjw7Mgbmd1eSBjxqEgdGjhuqVwIGjGoW4uDQogICANCi0tLQ0KDQojIyMjICpU4bu3IHPhu5EgY2jDqm5oIC0gT2RkcyBSYXRpbyoNCg0KLSBDw7RuZyB0aOG7qWM6DQoNClxbDQpPUiA9IFxmcmFje2EvYn17Yy9kfSA9IFxmcmFje2FkfXtiY30NClxdDQoNCi0gw50gbmdoxKlhOg0KDQogICAtIFNvIHPDoW5oICpjxqEgaOG7mWkgeOG6o3kgcmEgc+G7sSBraeG7h24qIGdp4buvYSBoYWkgbmjDs20uDQoNCiAgIC0gXChPUiA9IDFcKTogS2jDtG5nIGPDsyBsacOqbiBo4buHLg0KICANCiAgIC0gXChPUiA+IDFcKTogTmjDs20gMSBjw7MgY8ahIGjhu5lpIGNhbyBoxqFuLg0KICANCiAgIC0gXChPUiA8IDFcKTogTmjDs20gMSBjw7MgY8ahIGjhu5lpIHRo4bqlcCBoxqFuLg0KDQotIEzGsHUgw706DQoNCiAgIC0gT1IgZ+G6p24gZ2nhu5FuZyBSUiBraGkgeMOhYyBzdeG6pXQgc+G7sSBraeG7h24gdGjhuqVwLg0KDQogICAtIE9SIHRoxrDhu51uZyDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyAqaOG7k2kgcXV5IGxvZ2lzdGljKi4NCiAgIA0KLS0tDQoNCiMjIyAqMi4zIEtob+G6o25nIHRpbiBj4bqteSBjaG8gY8OhYyB0aGFtIHPhu5EgxJFvIG3hu5FpIGxpw6puIGjhu4cqDQoNCiMjIyMgKkPDtG5nIHRo4bupYzoqDQoNClTDrW5oIHRyw6puIGxvZyhPUik6DQoNClxbDQpcbG9nKE9SKSBccG0gWl97XGFscGhhLzJ9IFxjZG90IFxzcXJ0eyBcZnJhY3sxfXthfSArIFxmcmFjezF9e2J9ICsgXGZyYWN7MX17Y30gKyBcZnJhY3sxfXtkfSB9DQpcXQ0KDQpTYXUgxJHDsyBs4bqleSBtxakgxJHhu4MgdHLhu58gbOG6oWkgT1I6DQoNClxbDQpDSV97T1J9ID0gXGxlZnQoIGVee0x9LFwgZV57VX0gXHJpZ2h0KQ0KXF0NCg0KVHJvbmcgxJHDszoNCg0KLSBcKEwgPSBcbG9nKE9SKSAtIFpfe1xhbHBoYS8yfSBcY2RvdCBTRVwpDQoNCi0gXChVID0gXGxvZyhPUikgKyBaX3tcYWxwaGEvMn0gXGNkb3QgU0VcKQ0KDQotIFwoU0UgPSBcc3FydHsgXGZyYWN7MX17YX0gKyBcZnJhY3sxfXtifSArIFxmcmFjezF9e2N9ICsgXGZyYWN7MX17ZH0gfVwpDQoNCi0gVuG7m2kgbeG7qWMgdGluIGPhuq15IDk1JSwgXChaX3tcYWxwaGEvMn0gPSAxLjk2XCkNCg0KLS0tDQoNCiMjIyAqMi40IFbDrSBk4bulKg0KDQpN4buZdCBkb2FuaCBuZ2hp4buHcCBraOG6o28gc8OhdCB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGfhu61pIGzhuqFpIMSRw6FuaCBnacOhIHPhuqNuIHBo4bqpIChmZWVkYmFjayltLiBL4bq/dCBxdeG6ozoNCg0KfCAgICAgICAgICAgICAgICAgICAgICB8IE11YSBow6BuZyB8IEtow7RuZyBtdWEgfCBU4buVbmcgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tfA0KfCBOaMOzbSDEkcOhbmggZ2nDoSAoTmjDs20gMSkgIHwgNDAgICAgICAgfCA2MCAgICAgICAgfCAxMDAgICB8DQp8IE5ow7NtIGtow7RuZyDEkcOhbmggZ2nDoSAoTmjDs20gMikgIHwgMjAgICAgICAgfCA4MCAgICAgICAgfCAxMDAgICB8DQoNCi0gVMOtbmggdG/DoW46DQoNCiAgIC0gXChSUiA9IFxmcmFjezQwLzEwMH17MjAvMTAwfSA9IDIuMFwpIOKGkiDEkMOhbmggZ2nDoSBz4bqjbiBwaOG6qW0gZ2nDunAgKnTEg25nIGfhuqVwIMSRw7RpKiB4w6FjIHN14bqldCBtdWEgaMOgbmcuDQoNCiAgIC0gXChPUiA9IFxmcmFjezQwIFxjZG90IDgwfXs2MCBcY2RvdCAyMH0gPSBcZnJhY3szMjAwfXsxMjAwfSA9IDIuNjdcKSDihpIgQ8ahIGjhu5lpIG11YSBow6BuZyBjYW8gaMahbiAqMi42NyBs4bqnbiouDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IE9SOg0KDQogICAtIFwoU0UgPSBcc3FydHsxLzQwICsgMS82MCArIDEvMjAgKyAxLzgwfSBcYXBwcm94IDAuMzI5XCkNCg0KICAgLSBcKFxsb2coT1IpIFxhcHByb3ggXGxvZygyLjY3KSA9IDAuOTgxXCkNCg0KICAgLSBcKENJX3tsb2coT1IpfSA9IDAuOTgxIFxwbSAxLjk2IFxjZG90IDAuMzI5ID0gKDAuMzM2LFwgMS42MjYpXCkNCg0KICAgLSBcKENJX3tPUn0gPSAoZV57MC4zMzZ9LFwgZV57MS42MjZ9KSA9ICgxLjQwLFwgNS4wOClcKQ0KDQogICDihpIgKk9SIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6oqLCB2w6wga2hv4bqjbmcgdGluIGPhuq15IGtow7RuZyBjaOG7qWEgMS4NCg0KLS0tDQoNCiMjIyAqMi41IFThu5VuZyBr4bq/dCoNCg0KfCBDaOG7iSBz4buRICAgICAgfCBDw7RuZyB0aOG7qWMgICAgICAgICAgICAgICAgICAgICB8IMOdIG5naMSpYSBjaMOtbmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCDGr3UgxJFp4buDbSAgICAgICAgICAgICAgICAgICAgICAgICB8IOG7qG5nIGThu6VuZyBwaOG7lSBiaeG6v24gICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCBIaeG7h3UgdOG7tyBs4buHICB8IFwocF8xIC0gcF8yXCkgICAgICAgICAgICAgICAgfCBTbyBzw6FuaCB0dXnhu4d0IMSR4buRaSBnaeG7r2EgaGFpIHThu7cgbOG7hyAgICAgICAgICAgICB8IFRy4buxYyBxdWFuLCBk4buFIGhp4buDdSAgICAgICAgICAgICAgfCBTbyBzw6FuaCDEkcahbiBnaeG6o24gICAgICAgICAgICAgICB8DQp8IFJSICAgICAgICAgIHwgXChcZnJhY3twXzF9e3BfMn1cKSAgICAgICAgICB8IFNvIHPDoW5oIHjDoWMgc3XhuqV0IGdp4buvYSBoYWkgbmjDs20gICAgICAgICAgICAgICB8IERp4buFbiBnaeG6o2kgdOG7sSBuaGnDqm4gICAgICAgICAgICAgIHwgTmdoacOqbiBj4bupdSB5IGjhu41jLCBtYXJrZXRpbmcgICAgfA0KfCBPUiAgICAgICAgICB8IFwoXGZyYWN7YWR9e2JjfVwpICAgICAgICAgICAgfCBTbyBzw6FuaCBvZGRzIGdp4buvYSBoYWkgbmjDs20gICAgICAgICAgICAgICAgICAgfCDDgXAgZOG7pW5nIGxpbmggaG/huqF0IHRyb25nIGjhu5NpIHF1eSB8IEjhu5NpIHF1eSBsb2dpc3RpYywgcGjDom4gdMOtY2ggcuG7p2kgcm8gfA0KDQotLS0NCg0KIyMgKiozLiBTdXkgbmdoxKkgduG7gSBi4buZIGThu68gbGnhu4d1IOKAnFN1cGVybWFya2V0IFRyYW5zYWN0aW9uc+KAnSoqDQoNCiMjIyAqMy4xIMSQ4buNYyBi4buZIGThu68gbGnhu4d1Kg0KDQpgYGB7cn0NCmxpYnJhcnkoY3N2KQ0KZGF0YSA8LSByZWFkLmNzdigiQzovVXNlcnMvSFAvRG93bmxvYWRzL1N1cGVybWFya2V0IFRyYW5zYWN0aW9ucy5jc3YiLCBoZWFkZXIgPSBUKQ0KYGBgDQoNCiMjIyAqMy4yIEPDoWMgYsaw4bubYyB0aOG7sWMgaGnhu4duKg0KDQojIyMjICpCMTogVOG6oW8gYuG6o25nIGNow6lvIGdp4buvYSBHZW5kZXIgdsOgIEhvbWVvd25lcioNCg0KYGBge3J9DQp0YWJsZV9nZW5kZXJfaG9tZSA8LSB0YWJsZShkYXRhJEdlbmRlciwgZGF0YSRIb21lb3duZXIpDQp0YWJsZV9nZW5kZXJfaG9tZQ0KYGBgDQojIyMjICpCMjogVMOtbmggT2RkcyBSYXRpbyAodOG7tyBz4buRIGNow6puaCkqDQoNCmBgYHtyfQ0KYSA8LSB0YWJsZV9nZW5kZXJfaG9tZVsiRiIsICJZIl0NCmIgPC0gdGFibGVfZ2VuZGVyX2hvbWVbIkYiLCAiTiJdDQpjIDwtIHRhYmxlX2dlbmRlcl9ob21lWyJNIiwgIlkiXQ0KZCA8LSB0YWJsZV9nZW5kZXJfaG9tZVsiTSIsICJOIl0NCg0KT1IgPC0gKGEgKiBkKSAvIChiICogYykNCk9SDQpgYGANCg0KIyMjIyAqQjM6IFTDrW5oIGtob+G6o25nIHRpbiBj4bqteSBjaG8gT1IqDQoNCmBgYHtyfQ0KbG9nX09SIDwtIGxvZyhPUikNClNFIDwtIHNxcnQoMS9hICsgMS9iICsgMS9jICsgMS9kKQ0KDQojIDk1JSBDSQ0KeiA8LSAxLjk2DQpDSV9sb3dlciA8LSBleHAobG9nX09SIC0geiAqIFNFKQ0KQ0lfdXBwZXIgPC0gZXhwKGxvZ19PUiArIHogKiBTRSkNCg0KYyhDSV9sb3dlciwgQ0lfdXBwZXIpDQpgYGANCg0KIyMjICpEaeG7hW4gZ2nhuqNpKg0KDQotIE9SID0gMS4wNDUgPiAxIGNobyB0aOG6pXkgdOG7tyBz4buRIGNow6puaCAob2RkcyByYXRpbykgduG7gSBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AgY+G7p2EgTuG7ryBjYW8gaMahbiBt4buZdCBjaMO6dCBzbyB24bubaSBOYW0uDQoNCi0gTsOzaSBjw6FjaCBraMOhYywgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3Uga2jDoWNoIGjDoG5nIG7DoHksIGzDoCBO4buvIGPDsyBsacOqbiBxdWFuIMSR4bq/biB2aeG7h2MgdMSDbmcgbmjhurkgb2RkcyBz4bufIGjhu691IG5ow6Agc28gduG7m2kgTmFtLiBD4bulIHRo4buDLCBvZGRzIHPhu58gaOG7r3UgbmjDoCBj4bunYSBO4buvIGNhbyBoxqFuIGtob+G6o25nIDQuNSUgc28gduG7m2kgTmFtLCBu4bq/dSBnaeG7ryBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaS4NCg0KLSBUdXkgbmhpw6puLCBt4bupYyBjaMOqbmggbOG7h2NoIG7DoHkgbMOgIHLhuqV0IG5o4buPIHbDoCBjaMawYSDEkeG7pyDEkeG7gyBr4bq/dCBsdeG6rW4gY2jhuq9jIGNo4bqvbiB24buBIHPhu7Ega2jDoWMgYmnhu4d0IGdp4buvYSBoYWkgbmjDs20uDQoNCi0gS2hpIHjDqXQgxJHhur9uIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY+G7p2EgT1IgKGtob+G6o25nIHThu6sgfjAuOTc3IMSR4bq/biB+MS4xMTgpLCB0YSB0aOG6pXkga2hv4bqjbmcgbsOgeSBjaOG7qWEgZ2nDoSB0cuG7iyAxLCDEkWnhu4F1IMSRw7MgY8OzIG5naMSpYSBsw6Aga+G6v3QgcXXhuqMga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIHRpbiBj4bqteSA5NSUuDQoNCi0gVMOzbSBs4bqhaSwgbeG6t2MgZMO5IE9SID4gMSBjaG8gdGjhuqV5IHh1IGjGsOG7m25nIG9kZHMgc+G7nyBo4buvdSBuaMOgIGPhu6dhIE7hu68gY2FvIGjGoW4gTmFtLCBr4bq/dCBsdeG6rW4gbsOgeSBraMO0bmcgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gU+G7sSBraMOhYyBiaeG7h3Qgbmjhu48gY8OzIHRo4buDIGNo4buJIGzDoCBkbyBuZ+G6q3Ugbmhpw6puIHRyb25nIG3huqt1IHF1YW4gc8OhdC4gRG8gxJHDsywga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyDEkeG7pyBt4bqhbmggxJHhu4Mga2jhurNuZyDEkeG7i25oIHLhurFuZyB2aeG7h2MgbMOgIE7hu68gKHNvIHbhu5tpIE5hbSkgbMOgbSB0xINuZyBob+G6t2MgZ2nhuqNtIG9kZHMgY+G7p2Egdmnhu4djIHPhu58gaOG7r3UgbmjDoCB0cm9uZyBi4buZIGThu68gbGnhu4d1IG7DoHkuDQoNCj0+IEvhur90IGx14bqtbjogVHJvbmcgcGjhuqFtIHZpIGThu68gbGnhu4d1IGhp4buHbiB04bqhaSwgZ2nhu5tpIHTDrW5oIGtow7RuZyBwaOG6o2kgbMOgIHnhur91IHThu5EgcXV54bq/dCDEkeG7i25oIMSR4bq/biB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIOKAlCBvZGRzIGfhuqduIG5oxrAgdMawxqFuZyDEkcawxqFuZyBuaGF1IGdp4buvYSBOYW0gdsOgIE7hu68uDQoNCi0tLQ0KDQoNCiMjICoqMy4zIEdFTkRFUiBWw4AgTUFSSVRBTFNUQVRVUyoqDQoNCiMjIyAqKlThuqFvIGLhuqNuZyBjaMOpbyoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgY2jDqW8gZ2nhu69hIEdlbmRlciB2w6AgTWFyaXRhbFN0YXR1cw0KdGFibGVfZ2VuZGVyX21hcml0YWwgPC0gdGFibGUoZGF0YSRHZW5kZXIsIGRhdGEkTWFyaXRhbFN0YXR1cykNCmFkZG1hcmdpbnModGFibGVfZ2VuZGVyX21hcml0YWwpICAjIFRow6ptIGjDoG5nIHbDoCBj4buZdCB04buVbmcNCmBgYA0KDQojIyMgKipUw61uaCB0b8OhbiBSZWxhdGl2ZSBSaXNrKioNCg0KYGBge3J9DQojIFRyw61jaCB4deG6pXQgc+G7kSBsaeG7h3UgdOG7qyBi4bqjbmcgY2jDqW8NCkEgPC0gdGFibGVfZ2VuZGVyX21hcml0YWxbIkYiLCJTIl0gIyBu4buvIMSR4buZYyB0aMOibg0KQiA8LSB0YWJsZV9nZW5kZXJfbWFyaXRhbFsiRiIsIk0iXSAjIG7hu68ga+G6v3QgaMO0bg0KQyA8LSB0YWJsZV9nZW5kZXJfbWFyaXRhbFsiTSIsIlMiXSAjIG5hbSDEkeG7mWMgdGjDom4NCkQgPC0gdGFibGVfZ2VuZGVyX21hcml0YWxbIk0iLCJNIl0gIyBuYW0ga+G6v3QgaMO0bg0KDQojIFTDrW5oIFJSDQpSUiA8LSAoQS8oQStCKSkvKEMvKEMrRCkpDQpSUg0KIyBUcm9uZyDEkcOzOiBBLyhBK0IpIGzDoCB04bu3IGzhu4cgcGjhu6UgbuG7ryDEkeG7mWMgdGjDom4gdHJvbmcgdOG7lW5nIHPhu5EgbuG7rw0KIyBWw6A6IEMvKEMrRCkgbMOgIHThu7cgbOG7hyBuYW0gZ2nhu5tpIMSR4buZYyB0aMOibiB0cm9uZyB04buVbmcgc+G7kSBuYW0NCmBgYA0KDQojIyMgKirDnSBuZ2jEqWEqKg0KDQotIFJSID0gMTogS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyDEkeG7mWMgdGjDom4gZ2nhu69hIGhhaSBnaeG7m2kgdMOtbmguDQotIFJSID4gMTogTmFtIGdp4bubaSBjw7MgdOG7tyBs4buHIMSR4buZYyB0aMOibiBjYW8gaMahbiBwaOG7pSBu4buvLg0KLSBSUiA8IDE6IFBo4bulIG7hu68gY8OzIHThu7cgbOG7hyDEkeG7mWMgdGjDom4gY2FvIGjGoW4gbmFtIGdp4bubaS4NCg0KIyMjICoqTmjhuq1uIHjDqXQqKg0KDQotIFThu7cgbOG7hyBwaOG7pSBu4buvIMSR4buZYyB0aMOibiBi4bqxbmcga2hv4bqjbmcgOTQuNTclIHThu7cgbOG7hyBuYW0gZ2nhu5tpIMSR4buZYyB0aMOibi4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBs4bubbiB24buBIHThu7cgbOG7hyDEkeG7mWMgdGjDom4gZ2nhu69hIGhhaSBnaeG7m2kgdMOtbmggdHJvbmcgZOG7ryBsaeG7h3UuIA0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoImVwaXRvb2xzIiwgcmVwb3MgPSAiaHR0cHM6Ly9jcmFuLnJzdHVkaW8uY29tLyIpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0Kcmlza3JhdGlvKHRhYmxlX2dlbmRlcl9tYXJpdGFsLCBtZXRob2Q9IndhbGQiKQ0KIyBDaOG7iSDEkeG7i25oIHBoxrDGoW5nIHBow6FwIHTDrW5oIGtob+G6o25nIHRpbiBj4bqteSAoY29uZmlkZW5jZSBpbnRlcnZhbCkgY2hvIFJpc2sgUmF0aW8uDQojICJ3YWxkIiBsw6AgcGjGsMahbmcgcGjDoXAgc+G7rSBk4bulbmcgxrDhu5tjIGzGsOG7o25nIFdhbGQsIGdp4bqjIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4sIMSR4buDIHTDrW5oIGtob+G6o25nIHRpbiBj4bqteS4NCmBgYA0KKipOaOG6rW4geMOpdCoqDQoNCi0gUmVsYXRpdmUgUmlzayAoUlIpDQoNCiAgLSBGIChGZW1hbGUpOiAxLjAwMDAwMA0KICAtIE0gKE1hbGUpOiAxLjA1NzQxNyAoQ0k6IDEuMDIzODEzIC0gMS4wOTIxMjMpDQogIA0KLSBOaOG6rW4geMOpdCB24buBIFJSOg0KDQogIC0gUlIgY+G7p2EgbmjDs20gRiAoUGjhu6UgbuG7rykgbMOgIDEgdsOsIG5ow7NtIG7DoHkgxJHGsOG7o2MgbOG6pXkgbMOgbSBuaMOzbSB0aGFtIGNoaeG6v3UuDQogIC0gUlIgY+G7p2EgbmjDs20gTSAoTmFtIGdp4bubaSkgbMOgIDEuMDU3NCwgxJFp4buBdSBuw6B5IGNobyB0aOG6pXkgbmFtIGdp4bubaSBjw7MgdOG7tyBs4buHIGvhur90IGjDtG4gKE0pIGNhbyBoxqFuIG3hu5l0IGNow7p0IHNvIHbhu5tpIHBo4bulIG7hu68sIHbhu5tpIHThu7cgbOG7hyAxLjA1NzQgbOG6p24gc28gduG7m2kgbmjDs20gcGjhu6UgbuG7ry4gU+G7sSBraMOhYyBiaeG7h3QgbsOgeSBjw7MgdGjhu4MgbMOgIGtow7RuZyBs4bubbiwgbmjGsG5nIG7DsyBjaOG7iSByYSBy4bqxbmcgbmFtIGdp4bubaSBjw7MgbeG7mXQga2jhuqMgbsSDbmcga+G6v3QgaMO0biBjYW8gaMahbiBwaOG7pSBu4buvIHRyb25nIG3huqt1IG5naGnDqm4gY+G7qXUgbsOgeS4NCiAgLSBDb25maWRlbmNlIEludGVydmFsIChDSSkgY+G7p2EgUlIgY2hvIG5ow7NtIE0gbMOgIFsxLjAyMzgsIDEuMDkyMV0sIG5naMSpYSBsw6Aga2hv4bqjbmcgdGluIGPhuq15IGPhu6dhIFJSIGtow7RuZyBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAxLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgaGFpIG5ow7NtIEYgdsOgIE0gbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdsOgIGtow7RuZyBwaOG6o2kgbmfhuqt1IG5oacOqbi4NCi0gS+G6v3QgbHXhuq1uIHbhu4EgUlI6DQoNCiAgLSBSUiBjaG8gdGjhuqV5IG5hbSBnaeG7m2kgY8OzIHh1IGjGsOG7m25nIGvhur90IGjDtG4gY2FvIGjGoW4gc28gduG7m2kgcGjhu6UgbuG7rywgduG7m2kgUlIgPSAxLjA1NzQuDQogIC0gQ29uZmlkZW5jZSBJbnRlcnZhbCBraMO0bmcgYmFvIGfhu5NtIGdpw6EgdHLhu4sgMSwgxJFp4buBdSBuw6B5IGjhu5cgdHLhu6MgY2hvIGdp4bqjIHRodXnhur90IHLhurFuZyBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgdOG7tyBs4buHIGvhur90IGjDtG4gY+G7p2EgbmFtIHbDoCBu4buvIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQogIA0KLSBwLXZhbHVlIHThu6sgY8OhYyBraeG7g20gxJHhu4tuaDoNCg0KICAtIENoaS1zcXVhcmUgdGVzdDogcC12YWx1ZSA9IDAuMDAwNzAzODgzNw0KICAtIEZpc2hlcidzIGV4YWN0IHRlc3Q6IHAtdmFsdWUgPSAwLjAwMDczNzM4OTUNCiAgLSBNaWRwb2ludCBleGFjdCB0ZXN0OiBwLXZhbHVlID0gMC4wMDA3MDQ1MDkyDQogIA0KLSBOaOG6rW4geMOpdCB24buBIHAtdmFsdWU6DQogIC0gQ8OhYyBwLXZhbHVlIHThu6sgY8OhYyBraeG7g20gxJHhu4tuaCDEkeG7gXUgbmjhu48gaMahbiBt4bupYyDDvSBuZ2jEqWEgdGjDtG5nIHRoxrDhu51uZyBsw6AgMC4wNSwgbmdoxKlhIGzDoCBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IG51bGwgaHlwb3RoZXNpcyAoZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBnaeG7r2EgbmFtIHbDoCBu4buvKS4NCiAgLSDEkGnhu4F1IG7DoHkgY2jhu4kgcmEgcuG6sW5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB04bu3IGzhu4cga+G6v3QgaMO0biDhu58gcGjhu6UgbuG7ryB2w6AgbmFtIGdp4bubaS4NCiAgDQotIFTDs20gdOG6r3QgdsOgIG5o4bqtbiB4w6l0IHThu5VuZyBxdcOhdA0KICAtIFJlbGF0aXZlIFJpc2sgKFJSKTogVOG7tyBs4buHIGvhur90IGjDtG4gY+G7p2EgbmFtIGdp4bubaSBsw6AgMS4wNTc0IGzhuqduIHNvIHbhu5tpIHBo4bulIG7hu68sIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG5hbSBnaeG7m2kgY8OzIGto4bqjIG7Eg25nIGvhur90IGjDtG4gY2FvIGjGoW4gcGjhu6UgbuG7ryB0cm9uZyBt4bqrdSBuZ2hpw6puIGPhu6l1IG7DoHkuDQogIC0gQ29uZmlkZW5jZSBJbnRlcnZhbCAoQy5JLik6IEtob+G6o25nIHRpbiBj4bqteSBbMS4wMjM4LCAxLjA5MjFdIGtow7RuZyBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAxLCDEkWnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6Agc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIHThu7cgbOG7hyBr4bq/dCBow7RuIGPhu6dhIG5hbSB2w6AgbuG7ryBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCiAgLSBwLXZhbHVlOiBDw6FjIHAtdmFsdWUgdOG7qyBDaGktc3F1YXJlLCBGaXNoZXIncyBleGFjdCB0ZXN0IHbDoCBtaWRwLmV4YWN0IMSR4buBdSBuaOG7jyBoxqFuIDAuMDUsIGNobyB0aOG6pXkgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIGdp4buvYSB04bu3IGzhu4cga+G6v3QgaMO0biBj4bunYSBuYW0gdsOgIG7hu68uDQogIA0KLSBL4bq/dCBsdeG6rW4NCiAgLSBU4bu3IGzhu4cga+G6v3QgaMO0biBnaeG7r2EgbmFtIHbDoCBu4buvIGPDsyBz4buxIGtow6FjIGJp4buHdCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiBD4bulIHRo4buDLCBuYW0gZ2nhu5tpIGPDsyB04bu3IGzhu4cga+G6v3QgaMO0biBjYW8gaMahbiBwaOG7pSBu4buvLg0KICAtIFJlbGF0aXZlIFJpc2sgY2hvIHRo4bqleSBuYW0gZ2nhu5tpIGPDsyBraOG6oyBuxINuZyBr4bq/dCBow7RuIGNhbyBoxqFuIHBo4bulIG7hu68gKHbhu5tpIFJSID0gMS4wNTc0KSwgdsOgIGvhur90IHF14bqjIG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiByw7UgcsOgbmcsIHbDrCBwLXZhbHVlIMSR4buBdSBy4bqldCBuaOG7jy4NCiAgLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGPhu6dhIFJSIGtow7RuZyBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAxLCDEkWnhu4F1IG7DoHkgY8OgbmcgY+G7p25nIGPhu5Ega+G6v3QgbHXhuq1uIHbhu4Egc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIHThu7cgbOG7hyBr4bq/dCBow7RuIGPhu6dhIGhhaSBnaeG7m2kNCg0KDQo=