require(tidyverse)
## Loading required package: tidyverse
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.0     ✔ readr     2.1.4
## ✔ forcats   1.0.0     ✔ stringr   1.5.0
## ✔ ggplot2   3.4.1     ✔ tibble    3.1.8
## ✔ lubridate 1.9.2     ✔ tidyr     1.3.0
## ✔ purrr     1.0.1     
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(ggplot2)
library(readxl)
## Warning: package 'readxl' was built under R version 4.2.3
library(epitools)
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.2.3
library(dplyr)
library(mdscore)
## Warning: package 'mdscore' was built under R version 4.2.3
## Loading required package: MASS
## 
## Attaching package: 'MASS'
## 
## The following object is masked from 'package:dplyr':
## 
##     select
library(lmtest)
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.2.3
## 
## Attaching package: 'zoo'
## 
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric

File Rmarkdown - https://drive.google.com/file/d/1uaoGAGb18mxZpbj5DR08YK6ZJ2LCFy-0/view?usp=sharing

File dữ liệu - https://docs.google.com/spreadsheets/d/1Iwz5LDRClCws0oCr5c2hQCHEYbeVgrvevQZIG5-lKjE/edit?usp=sharing

1 Chương 1 Giới thiệu dữ liệu nghiên cứu

Dữ liệu nghiên cứu được thu thập từ trang web hệ thống dự đoán ung thư phổi trực tuyến để xem rằng những bệnh nhân mắc ung thư phổi là do chịu sự ảnh hưởng của những yếu tố nào.

setwd("C:/PTDLDT1")
data <- read_excel("tieuluan.xlsx",1)
## New names:
## • `` -> `...10`
## • `` -> `...11`
data
str(data)
## tibble [309 × 11] (S3: tbl_df/tbl/data.frame)
##  $ gender        : chr [1:309] "M" "M" "F" "M" ...
##  $ age           : num [1:309] 69 74 59 63 63 75 52 51 68 53 ...
##  $ smoking       : num [1:309] 0 1 0 1 0 0 1 1 1 1 ...
##  $ chronicdisease: num [1:309] 0 1 0 0 0 1 0 0 0 1 ...
##  $ wheezing      : num [1:309] 1 0 1 0 1 1 1 0 0 0 ...
##  $ coughing      : num [1:309] 1 0 1 0 1 1 1 0 0 0 ...
##  $ shortbreath   : num [1:309] 1 1 1 0 1 1 1 1 0 0 ...
##  $ chestpain     : num [1:309] 1 1 1 1 0 0 1 0 0 1 ...
##  $ lungcancer    : num [1:309] 1 1 0 0 0 1 1 1 0 1 ...
##  $ ...10         : logi [1:309] NA NA NA NA NA NA ...
##  $ ...11         : num [1:309] NA NA NA 172 172 NA NA NA NA NA ...
  • Mô tả dữ liệu

Bộ dữ liệu bao gồm 309 quan sát, có tất cả là 13 biến trong đó gồm 1 biến định lượng và 12 biến định tính

Biến định tính

  • gender: thể hiện giới tính gồm hai biểu hiện M(male) và F(female)

_ smoking: cho biết người khảo sát có sử dụng thuốc lá không gồm 2 biểu hiện là 0 = Không và 1 = Có

  • chronicdisease: cho biết người khảo sát có tiền sử bệnh mãn tính không gồm 2 biểu hiện là 0 = Không và 1 = Có

  • wheezing: cho biết người khảo sát có bị khò khè không, gồm 2 biểu hiện là 0 = Không và 1 = Có

  • coughing: cho biết người khảo sát có bị ho hay không, gồm 2 biểu hiện là 0 = Không và 1 = Có

  • shortbreath: cho biết người khảo sát có bị khó thở không, gồm 2 biểu hiện là 0 = Không và 1 = Có

  • chestpain: cho biết người khảo sát có bị đau ngực không, gồm 2 biểu hiện là 0 = Không và 1 = Có

  • lungcancer: cho biết người khảo sát có mắc ung thư phổi không, gồm 2 biểu hiện là 0 = Không và 1 = Có

Biến định lượng

  • age: thể hiện độ tuổi

2 Chương 2 Xác định biến phụ thuộc

  • Bệnh ung thư phổi - lungcancer

Ung thư phổi là sự tăng trưởng bất thường của các mô trong phổi. Khi cơ thể hít vào, không khí sẽ đi xuống khí quản và vào trong hai phổi, tại đó không khí lan ra qua các ống được gọi là phế quản. Hầu hết các trường hợp ung thư phổi đều bắt nguồn từ các tế bào tạo thành những ống này. Đây cũng là loại ung thư thường gặp nhất và có tỷ lệ tử vong cao nhất.

Ung thư phổi gồm hai loại chính: - Ung thư phổi không tế bào nhỏ: là loại ung thư phổi phổ biến nhất. - Ung thư phổi tế bào nhỏ: là loại ít phổ biến hơn, nhưng lan nhanh tới các phần khác của cơ thể qua đường máu.

Ung thư phổi giai đoạn sớm thường không gây ra triệu chứng. Khi ung thư tiến triển, ta có thể gặp phải các triệu chứng như: Ho trở nặng hoặc không chấm dứt, khàn tiếng, các khó khăn về hô hấp, đau ngực liên tục, ho ra máu, mệt mỏi kéo dài,…

Nguyên nhân chính gây ung thư phổi là hút thuốc lá (thuốc lá, thuốc lào hoặc xì gà), mặc dù không phải tất cả những người hút đều mắc ung thư phổi. Các chất gây hại trong khói thuốc làm tổn thương các tế bào phổi. Hít khói thuốc ‘bị động’ từ những người hút thuốc xung quanh cũng có thể gây ung thư phổi ở một số người không hút thuốc. Ngoài ra mọi người cũng có thể mắc ung thư phổi nếu: - Trên 40 tuổi: hầu hết các trường hợp được chẩn đoán mắc ung thư phổi khi đã hơn 65 tuổi. Tuy nhiên gần đây, bệnh có xu hướng xuất hiện nhiều hơn ở người trẻ tuổi. - Tiếp xúc với một số chất như radon (một chất khí phóng xạ), amiăng, asen (thạch tín), crôm, niken và ô nhiễm không khí - Bên cạnh đó bệnh nhân mắc ung thư phổi do di truyền trong gia đình.

3 Chương 3 Phương pháp và mô hình nghiên cứu

3.1 Mô hình nghiên cứu

Tác giả xây dựng mô hình với mục đích nghiên cứu sự tác động của các yếu tố đến khả năng mắc bệnh ung thư phổi. Mô hình đề xuất như sau:

\[lungcancer= β_0 + β_1gender + β_2age + β_3smoking + β_4chronicdisease + β_5wheezing + β_6coughing + β_7shortbreath + β_8chestpain\]

Trong đó

  • \(β_0\): Hằng số của mô hình

  • \(β_1 ... β_8\): Hệ số hồi quy của các biến độc lập

Trong mô hình này sẽ phân tích sự tác động của các yếu tố đến khả năng mắc bệnh ung thư phổi

  • Biến phụ thuộc là người mắc bệnh ung thư phổi: lungcancer

  • Biến độc lập là các biến: gender, age, smoking, chronicdisease, wheezing, coughing, shortbreath, chestpain.

3.2 Phương pháp nghiên cứu

3.2.1 Mô hình Logistic

\[logit(π)=log(π(x)/(1−π(x))) = α + βx\]

Đây được gọi là mô hình logistic hay mô hình logit. Từ mô hình ta có

\[π(x) = 1 / (1+e^(-α-βx))\]

Mô hình hồi quy logistic là trường hợp đặc biệt của GLM, thành phần ngẫu nhiên (thành công, thất bại) là nhị phân. Hàm liên kết logit của \(π\) là phép biến đổi \(log(π/(1−π))\), ký hiệu bởi \(logit(π)\). Các mô hình hồi quy logistic thường được gọi là logit. Logit là tham số tự nhiên của phân phối nhị thức.

3.2.2 Ước lượng hàm hồi quy cho dữ liệu nhị phân

Dữ liệu nhị phân là dữ liệu định tính chỉ nhận 2 giá trị: Đúng/Sai; Đồng ý/Không đồng ý; Có/Không; Thành công/Thất bại,…

Mô hình logit

\[logit(π)=log(π/(1−π))\]

Mô hình Logit được viết dưới dạng

\[logit(π)=log(π/(1−π))=β_0+β_1X_1+β_2X_2+⋯+β_kX_k\]

Mô hình probit

Hồi quy Probit, đôi khi còn được gọi là mô hình Probit được sử dụng để ước lượng mô hình có biến phụ thuộc dạng nhị phân.

\[probit(π) = Φ^−1(π)\]

Mô hình Probit được viết dưới dạng

\[probit(π(x)) = β_0+β_1X_1+β_2X_2+⋯+β_kX_k\]$

Mô hình cloglog

\[cloglog(π)=log(−log(1−π))\]

Mô hình cloglog được viết dưới dạng

\[cloglog(π(x)) = β_0+β_1X_1+β_2X_2+⋯+β_kX_k\]$

3.2.3 Các tiêu chí đánh giá mô hình

Để đánh giá các mô hình hồi cổ điển chúng ta thường dựa vào hệ số xác định mô hình (\(R_2\)), nhưng đối với mô các mô hình hồi quy tuyến tính tổng quát chúng ta sử dụng các tiêu chí sau:

  • AIC - Akaike Information Criterion

AIC được đề xuất bởi Akaike Hirotugu, một nhà thống kê học người Nhật. AIC là một tiêu chí được sử dụng một cách phổ biến để đánh giá một mô hình hồi quy được ước lượng bởi phương pháp Maximum Likekihood (ML). Một cách chung chung giá trị của AIC càng nhỏ thì mô hình càng tốt. AIC được tính bằng công thức sau:

\[AIC=−2ln(L)+2k\]

Với L là giá trị cực đại của hàm hợp lý (likelihood function) và k là số tham số của mô hình.

  • Deviance Deviance cũng là một tiêu chí rất phổ biến được sử dụng để đánh giá một mô hình hồi quy được ước lượng bởi phương pháp Hợp lý cực đại (ML). Một cách tổng quá, cũng giống như chỉ tiêu AIC, giá trị của Deviance càng nhỏ thì mô hình càng tốt.

  • Brier Score Là chỉ tiêu dùng để đánh giá mô hình hồi quy logistic, Brier Score được tính như sau:

\[B=(1/n) ∑(p_i−o_i)\]

Trong đó: \(p_i, o_i\) lần lượt là giá trị xác suất quan sát được, và giá trị xác suất tính ra từ mô hình.

4 Chương 4 Phân tích dữ liệu và kết quả nghiên cứu

4.1 Thống kê mô tả từng biến

4.1.1 Biến phụ thuộc (lungcancer)

Biến lungcancer

  • Bảng tần số - bảng tần suất
table(data$lungcancer)
## 
##   0   1 
##  39 270
table(data$lungcancer)/sum(table(data$lungcancer))
## 
##         0         1 
## 0.1262136 0.8737864
  • Đồ thị
data |> ggplot(aes(x = lungcancer, y = after_stat(count))) + geom_bar(fill = 'lavender') + geom_text(aes(label=scales::percent(after_stat(count/sum(count)), accuracy= 0.01)), stat = 'count', color = 'black', vjust = -0.5)+ theme_classic() + xlab('lungcancer') + ylab('Tỷ lệ')

Biến lungcancer thể hiện cho những người mắc bệnh ung thư phổi, kết quả cho thấy trong 309 người có 39 người không bị ung thư phổi (chiếm 12,62%) và 270 người bị ung thư phổi (chiếm 87,38%). Ta thấy có sự chênh lệch đáng kể khi những người mắc bệnh ung thư phổi cao gấp 6,92 lần những người không mắc bệnh ung thư phổi.

4.1.2 Biến độc lập

Biến gender

  • Bảng tần số - bảng tần suất
table(data$gender)
## 
##   F   M 
## 147 162
table(data$gender)/sum(table(data$gender))
## 
##         F         M 
## 0.4757282 0.5242718
  • Đồ thị
data |> ggplot(aes(x = gender, y = after_stat(count))) + geom_bar(fill = 'Salmon') + geom_text(aes(label=scales::percent(after_stat(count/sum(count)), accuracy= 0.01)), stat = 'count', color = 'black', vjust = -0.5)+ theme_classic() + xlab('gender') + ylab('Tỷ lệ')

Kết quả cho thấy trong 309 quan sát có 147 người là giới tính nữ (chiếm 47,57%) và 162 người là giới tính nam (chiếm 52,43%). Tỷ lệ giới tính nam cao 1,1 lần so với giới tính nữ

Biến age

  • Mã hóa biến age từ biến định lượng sang biến định tính
age1 <- data$age
age1 <- cut(data$age, breaks = c(0,62,87), labels=c("dưới 62 tuổi","trên 62 tuổi"))
  • Bảng tần số - bảng tần suất
table(age1)
## age1
## dưới 62 tuổi trên 62 tuổi 
##          157          152
table(age1)/sum(table(age1))
## age1
## dưới 62 tuổi trên 62 tuổi 
##    0.5080906    0.4919094
  • Đồ thị
data |> ggplot(aes(x = age1, y = after_stat(count))) + geom_bar(fill = 'lavender') + geom_text(aes(label=scales::percent(after_stat(count/sum(count)), accuracy= 0.01)), stat = 'count', color = 'black', vjust = -0.5)+ theme_classic() + xlab('age') + ylab('Tỷ lệ')

Kết quả cho thấy trong 309 quan sát có 152 người trên 62 tuổi (chiếm 49,19%) và 157 người dưới 62 tuổi (chiếm 50,81%). Ta thấy không có sự chênh lệch giữa những người trên 62 tuổi và những người dưới 62 tuổi. Tỷ lệ những người dưới 62 tuổi cao gấp 1,033 lần so với những người trên 62 tuổi.

Biến smoking

  • Bảng tần số - bảng tần suất
table(data$smoking)
## 
##   0   1 
## 135 174
table(data$smoking)/sum(table(data$smoking))
## 
##         0         1 
## 0.4368932 0.5631068
  • Đồ thị
data |> ggplot(aes(x = smoking, y = after_stat(count))) + geom_bar(fill = 'Salmon') + geom_text(aes(label=scales::percent(after_stat(count/sum(count)), accuracy= 0.01)), stat = 'count', color = 'black', vjust = -0.5)+ theme_classic() + xlab('smoking') + ylab('Tỷ lệ')

Kết quả cho thấy trong 309 quan sát có 135 người không sử dụng thuốc lá (chiếm 43,69%) và 174 người có sử dụng thuốc lá (chiếm 56,31%). Ta thấy tỷ lệ nhữung người hút thuốc lá cao gấp 1,29 lần so với những người không hút thuốc.

Biến chronicdisease

  • Bảng tần số - bảng tần suất
table(data$chronicdisease)
## 
##   0   1 
## 153 156
table(data$chronicdisease)/sum(table(data$chronicdisease))
## 
##         0         1 
## 0.4951456 0.5048544
  • Đồ thị
data |> ggplot(aes(x = chronicdisease, y = after_stat(count))) + geom_bar(fill = 'lightblue') + geom_text(aes(label=scales::percent(after_stat(count/sum(count)), accuracy= 0.01)), stat = 'count', color = 'black', vjust = -0.5)+ theme_classic() + xlab('chronicdisease') + ylab('Tỷ lệ')

Kết quả cho thấy trong 309 quan sát có 153 người không có tiền sử bệnh mãn tính (chiếm 49,51%) và 156 người có tiền sử bệnh mãn tính (chiếm 50,49%). Ta thấy tỷ lệ những người có bệnh mãn tính gấp 1,02 lần so với những người không có bệnh mãn tính.

Biến wheezing

  • Bảng tần số - bảng tần suất
table(data$wheezing)
## 
##   0   1 
## 137 172
table(data$wheezing)/sum(table(data$wheezing))
## 
##         0         1 
## 0.4433657 0.5566343
  • Đồ thị
data |> ggplot(aes(x = wheezing, y = after_stat(count))) + geom_bar(fill = 'lightblue') + geom_text(aes(label=scales::percent(after_stat(count/sum(count)), accuracy= 0.01)), stat = 'count', color = 'black', vjust = -0.5)+ theme_classic() + xlab('wheezing') + ylab('Tỷ lệ')

Kết quả cho thấy trong 309 quan sát có 137 người không có triệu chứng khò khè (chiếm 44,34%) và 172 người có triệu chứng khò khè (chiếm 55,66%). Ta thấy tỷ lệ những người có triệu chứng khò khè cao gấp 1,26 lần so với những người không có triệu chứng khò khè.

Biến coughing

  • Bảng tần số - bảng tần suất
table(data$coughing)
## 
##   0   1 
## 130 179
table(data$coughing)/sum(table(data$coughing))
## 
##        0        1 
## 0.420712 0.579288
  • Đồ thị
data |> ggplot(aes(x = coughing, y = after_stat(count))) + geom_bar(fill = 'brown') + geom_text(aes(label=scales::percent(after_stat(count/sum(count)), accuracy= 0.01)), stat = 'count', color = 'black', vjust = -0.5)+ theme_classic() + xlab('coughing') + ylab('Tỷ lệ')

Kết quả cho thấy trong 309 quan sát có 130 người không có triệu chứng ho (chiếm 42,07%) và 179 người có triệu chứng ho (chiếm 57,93%). Ta thấy tỷ lệ những người có triệu chứng ho cao gấp 1,38 lần so với những người không có triệu chứng ho.

Biến shortbreath

  • Bảng tần số - bảng tần suất
table(data$shortbreath)
## 
##   0   1 
## 111 198
table(data$shortbreath)/sum(table(data$shortbreath))
## 
##         0         1 
## 0.3592233 0.6407767
  • Đồ thị
data |> ggplot(aes(x = shortbreath, y = after_stat(count))) + geom_bar(fill = 'brown') + geom_text(aes(label=scales::percent(after_stat(count/sum(count)), accuracy= 0.01)), stat = 'count', color = 'black', vjust = -0.5)+ theme_classic() + xlab('shortbreath') + ylab('Tỷ lệ')

Kết quả cho thấy trong 309 quan sát có 111 người không có triệu chứng khó thở (chiếm 35,92%) và 198 người có triệu chứng khó thở (chiếm 64,08%). Ta thấy tỷ lệ những người có triệu chứng khó thở cao gấp 1,78 lần so với những người không có triệu chứng khó thở.

Biến chestpain

  • Bảng tần số - bảng tần suất
table(data$chestpain)
## 
##   0   1 
## 137 172
table(data$chestpain)/sum(table(data$chestpain))
## 
##         0         1 
## 0.4433657 0.5566343
  • Đồ thị
data |> ggplot(aes(x = chestpain, y = after_stat(count))) + geom_bar(fill = 'brown') + geom_text(aes(label=scales::percent(after_stat(count/sum(count)), accuracy= 0.01)), stat = 'count', color = 'black', vjust = -0.5)+ theme_classic() + xlab('chestpain') + ylab('Tỷ lệ')

Kết quả cho thấy trong 309 quan sát có 137 người không có triệu chứng đau ngực (chiếm 44,34%) và 172 người có triệu chứng đau ngực (chiếm 55,66%). Ta thấy tỷ lệ những người có triệu chứng đau ngực cao gấp 1,26 lần so với những người không có triệu chứng đau ngực.

4.2 Thống kê mô tả cho các cặp biến

4.2.1 Biến lungcancer và biến gender

lg <- table(data$gender,data$lungcancer)
lg
##    
##       0   1
##   F  22 125
##   M  17 145
prop.table(lg)
##    
##              0          1
##   F 0.07119741 0.40453074
##   M 0.05501618 0.46925566
ggplot(data, aes(lungcancer, fill = gender)) + geom_bar(position = 'dodge')

Từ kết quả trên cho thấy

  • Trong nhóm giới tính nữ thì có 125 người mắc ung thư phổi (chiếm 40,45%) và 22 người không mắc bệnh ung thư phổi (chiếm 7,12%).

  • Trong nhóm giới tính nam thì có 145 người mắc ung thư phổi (chiếm 46,93%) và 17 người không mắc bệnh ung thư phổi (chiếm 5,5%).

Rủi ro tương đối

RelRisk(lg)
## [1] 1.42617
epitab (lg, method = 'riskratio', rev = "c")
## $tab
##    
##       1        p0  0        p1 riskratio     lower   upper   p.value
##   F 125 0.8503401 22 0.1496599 1.0000000        NA      NA        NA
##   M 145 0.8950617 17 0.1049383 0.7011785 0.3878171 1.26774 0.3034924
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ rủi ro tương đối của những người mắc bệnh ung thư phổi theo giới tính là 0,7011785 tỷ lệ rủi ro tương đối của những người nam không mắc bệnh ung thư phổi thấp hơn những người giới tính nữ không mắc ung thư phổi khoảng 29,88%.

Tỷ lệ chênh

epitab(lg, method = 'oddsratio', rev='c') 
## $tab
##    
##       1       p0  0        p1 oddsratio     lower    upper   p.value
##   F 125 0.462963 22 0.5641026 1.0000000        NA       NA        NA
##   M 145 0.537037 17 0.4358974 0.6661442 0.3386251 1.310441 0.3034924
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ chênh là 0,6661 tức là tỷ lệ những người giới tính nam/nữ mắc ung thư phổi chỉ bằng 66,61% tỷ lệ những người giới tính nam/nữ không mắc ung thư phổi.

4.2.2 Biến lungcancer và biến age

la <- table(age1,data$lungcancer)
la
##               
## age1             0   1
##   dưới 62 tuổi  22 135
##   trên 62 tuổi  17 135
prop.table(la)
##               
## age1                    0          1
##   dưới 62 tuổi 0.07119741 0.43689320
##   trên 62 tuổi 0.05501618 0.43689320
ggplot(data, aes(lungcancer, fill = age)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

Từ kết quả trên cho thấy

  • Trong nhóm dưới 62 tuổi thì có 135 người mắc ung thư phổi (chiếm 43,68%) và 22 người không mắc bệnh ung thư phổi (chiếm 7,12%).

  • Trong nhóm trên 62 tuổi thì có 135 người mắc ung thư phổi (chiếm 43,68%) và 17 người không mắc bệnh ung thư phổi (chiếm 5,5%).

Rủi ro tương đối

RelRisk(la)
## [1] 1.252904
epitab (la, method = 'riskratio', rev = "c")
## $tab
##               
## age1             1        p0  0        p1 riskratio     lower    upper
##   dưới 62 tuổi 135 0.8598726 22 0.1401274 1.0000000        NA       NA
##   trên 62 tuổi 135 0.8881579 17 0.1118421 0.7981459 0.4414102 1.443186
##               
## age1             p.value
##   dưới 62 tuổi        NA
##   trên 62 tuổi 0.4961401
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ rủi ro tương đối của những người mắc bệnh ung thư phổi theo độ tuổi là 0,7981459 tức là tỷ lệ những người trên 62 tuổi không mắc bệnh ung thư phổi ít hơn tỷ lệ những người không mắc bệnh ung thư phổi có độ tuổi dưới 62 khoảng 20,19%.

Tỷ lệ chênh

epitab(la, method = 'oddsratio', rev='c') 
## $tab
##               
## age1             1  p0  0        p1 oddsratio     lower    upper   p.value
##   dưới 62 tuổi 135 0.5 22 0.5641026 1.0000000        NA       NA        NA
##   trên 62 tuổi 135 0.5 17 0.4358974 0.7727273 0.3928963 1.519758 0.4961401
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ chênh là 0,7727 tức là tỷ lệ những người trên 62 tuổi/ những người dưới 62 tuổi mắc ung thư phổi chỉ bằng 77,27% tỷ lệ những người trên 62 tuổi/ những người dưới 62 tuổi không mắc ung thư phổi.

4.2.3 Biến lungcancer và biến smoking

ls <- table(data$smoking,data$lungcancer)
ls
##    
##       0   1
##   0  20 115
##   1  19 155
prop.table(ls)
##    
##              0          1
##   0 0.06472492 0.37216828
##   1 0.06148867 0.50161812
ggplot(data, aes(lungcancer, fill = smoking)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

Từ kết quả trên cho thấy

  • Trong nhóm những người không hút thuốc thì có 115 người mắc ung thư phổi (chiếm 37,21%) và 20 người không mắc bệnh ung thư phổi (chiếm 6,47%).

  • Trong nhóm những người hút thuốc thì có 155 người mắc ung thư phổi (chiếm 50,16%) và 19 người không mắc bệnh ung thư phổi (chiếm 6,14%).

Rủi ro tương đối

RelRisk(ls)
## [1] 1.356725
epitab (ls, method = 'riskratio', rev = "c")
## $tab
##    
##       1        p0  0        p1 riskratio     lower    upper   p.value
##   0 115 0.8518519 20 0.1481481  1.000000        NA       NA        NA
##   1 155 0.8908046 19 0.1091954  0.737069 0.4101008 1.324725 0.3880947
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ rủi ro tương đối của những người mắc bệnh ung thư phổi theo liên quan đến hút thuốc lá là 0,737069 tức là tỷ lệ những người hút thuốc không mắc bệnh ung thư phổi ít hơn tỷ lệ những người không hút thuốc nhưng không mắc ung thư phổi là khoảng 26,29%.

Tỷ lệ chênh

epitab(ls, method = 'oddsratio', rev='c') 
## $tab
##    
##       1        p0  0        p1 oddsratio     lower    upper   p.value
##   0 115 0.4259259 20 0.5128205 1.0000000        NA       NA        NA
##   1 155 0.5740741 19 0.4871795 0.7048387 0.3597216 1.381061 0.3880947
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ chênh là 0,7048 tức là tỷ lệ những người có hút thuốc/ những người không hút thuốc mắc bệnh ung thư phổi chỉ bằng 70,48% tỷ lệ những người có hút thuốc/ nhữung người không hút thuốc không mắc bệnh ung thư phổi.

4.2.4 Biến lungcancer và biến chronicdisease

lc <- table(data$chronicdisease,data$lungcancer)
lc
##    
##       0   1
##   0  25 128
##   1  14 142
prop.table(lc)
##    
##              0          1
##   0 0.08090615 0.41423948
##   1 0.04530744 0.45954693
ggplot(data, aes(lungcancer, fill = chronicdisease)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

Từ kết quả trên cho thấy

  • Trong nhóm những người không có bệnh mãn tính thì có 128 người mắc ung thư phổi (chiếm 41,42%) và 25 người không mắc bệnh ung thư phổi (chiếm 8,09%).

  • Trong nhóm những người có bệnh mãn tính thì có 142 người mắc ung thư phổi (chiếm 45,95%) và 14 người không mắc bệnh ung thư phổi (chiếm 4,53%).

Rủi ro tương đối

RelRisk(lc)
## [1] 1.820728
epitab (lc, method = 'riskratio', rev = "c")
## $tab
##    
##       1        p0  0         p1 riskratio     lower    upper    p.value
##   0 128 0.8366013 25 0.16339869 1.0000000        NA       NA         NA
##   1 142 0.9102564 14 0.08974359 0.5492308 0.2969147 1.015963 0.05990277
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ rủi ro tương đối của những người mắc bệnh ung thư phổi có liên quan đến tiền sử bệnh mãn tính là 0,5492308 tức là tỷ lệ rủi ro tương đối của những người có bệnh mãn tính không mắc bệnh ung thư phổi ít hơn tỷ lệ những người không có bệnh mãn tính không mắc ung thư phổi khoảng 45,07%.

Tỷ lệ chênh

epitab(lc, method = 'oddsratio', rev='c') 
## $tab
##    
##       1        p0  0        p1 oddsratio     lower    upper    p.value
##   0 128 0.4740741 25 0.6410256 1.0000000        NA       NA         NA
##   1 142 0.5259259 14 0.3589744 0.5047887 0.2515496 1.012968 0.05990277
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ chênh là 0,5047 tức là tỷ lệ những người có bệnh mãn tính/ những người không có bệnh mãn tính mắc bệnh ung thư phổi chỉ bằng 50,47% tỷ lệ những người có bệnh mãn tính/ những người không có bệnh mãn tính không mắc bệnh ung thư phổi.

4.2.5 Biến lungcancer và biến wheezing

lw <- table(data$wheezing,data$lungcancer)
lw
##    
##       0   1
##   0  30 107
##   1   9 163
prop.table(lw)
##    
##              0          1
##   0 0.09708738 0.34627832
##   1 0.02912621 0.52750809
ggplot(data, aes(lungcancer, fill = wheezing)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

Từ kết quả trên cho thấy

  • Trong nhóm những người không có triệu chứng khò khè thì có 107 người mắc ung thư phổi (chiếm 34,63%) và 30 người không mắc bệnh ung thư phổi (chiếm 9,7%).

  • Trong nhóm những người có triệu chứng khò khè thì có 163 người mắc ung thư phổi (chiếm 52,75%) và 9 người không mắc bệnh ung thư phổi (chiếm 2,91%).

Rủi ro tương đối

RelRisk(lw)
## [1] 4.184915
epitab (lw, method = 'riskratio', rev = "c")
## $tab
##    
##       1        p0  0         p1 riskratio     lower     upper      p.value
##   0 107 0.7810219 30 0.21897810 1.0000000        NA        NA           NA
##   1 163 0.9476744  9 0.05232558 0.2389535 0.1174467 0.4861674 1.962316e-05
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ rủi ro tương đối của những người mắc bệnh ung thư phổi có liên quan đến triệu chứng khò khè là 0,5492308 tức là tỷ lệ rủi ro tương đối của những người có triệu chứng khò khè không mắc bệnh ung thư phổi ít hơn tỷ lệ những người không có triệu chứng khò khè không mắc ung thư phổi khoảng 76,1%.

Tỷ lệ chênh

epitab(lw, method = 'oddsratio', rev='c') 
## $tab
##    
##       1        p0  0        p1 oddsratio      lower     upper      p.value
##   0 107 0.3962963 30 0.7692308 1.0000000         NA        NA           NA
##   1 163 0.6037037  9 0.2307692 0.1969325 0.08993244 0.4312394 1.962316e-05
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ chênh là 0,1969 tức là tỷ lệ những người có triệu chứng khò khè/ những người không có triệu chứng khò khè mắc bệnh ung thư phổi chỉ bằng 19,69% tỷ lệ những người có bệnh triệu chứng khò khè/ những người không có triệu chứng khò khè không mắc bệnh ung thư phổi.

4.2.6 Biến lungcacer và biến coughing

lco <- table(data$coughing,data$lungcancer)
lco
##    
##       0   1
##   0  29 101
##   1  10 169
prop.table(lco)
##    
##              0          1
##   0 0.09385113 0.32686084
##   1 0.03236246 0.54692557
ggplot(data, aes(lungcancer, fill = coughing)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

Từ kết quả trên cho thấy

  • Trong nhóm những người không có triệu chứng ho thì có 101 người mắc ung thư phổi (chiếm 32,68%) và 29 người không mắc bệnh ung thư phổi (chiếm 9,38%).

  • Trong nhóm những người có triệu chứng ho thì có 169 người mắc ung thư phổi (chiếm 54,69%) và 10 người không mắc bệnh ung thư phổi (chiếm 3,23%).

Rủi ro tương đối

RelRisk(lco)
## [1] 3.993077
epitab (lco, method = 'riskratio', rev = "c")
## $tab
##    
##       1        p0  0         p1 riskratio     lower     upper    p.value
##   0 101 0.7769231 29 0.22307692 1.0000000        NA        NA         NA
##   1 169 0.9441341 10 0.05586592 0.2504334 0.1265762 0.4954873 1.8341e-05
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ rủi ro tương đối của những người mắc bệnh ung thư phổi có liên quan đến triệu chứng ho là 0,2504334 tức là tỷ lệ rủi ro tương đối của những người có triệu chứng ho không mắc bệnh ung thư phổi ít hơn tỷ lệ những người không có triệu chứng ho không mắc ung thư phổi khoảng 74,96%.

Tỷ lệ chênh

epitab(lco, method = 'oddsratio', rev='c') 
## $tab
##    
##       1        p0  0        p1 oddsratio      lower     upper    p.value
##   0 101 0.3740741 29 0.7435897 1.0000000         NA        NA         NA
##   1 169 0.6259259 10 0.2564103 0.2060804 0.09639117 0.4405915 1.8341e-05
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ chênh là 0,2060804 tức là tỷ lệ những người có triệu chứng ho/ những người không có triệu chứng ho mắc bệnh ung thư phổi chỉ bằng 20,6% tỷ lệ những người có bệnh triệu chứng ho/ những người không có triệu chứng ho không mắc bệnh ung thư phổi.

4.2.7 Biến lungcacer và biến shortbreath

lsb <- table(data$shortbreath,data$lungcancer)
lsb
##    
##       0   1
##   0  17  94
##   1  22 176
prop.table(lsb)
##    
##              0          1
##   0 0.05501618 0.30420712
##   1 0.07119741 0.56957929
ggplot(data, aes(lungcancer, fill = shortbreath)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

Từ kết quả trên cho thấy

  • Trong nhóm những người không có triệu chứng khó thở thì có 94 người mắc ung thư phổi (chiếm 30,42%) và 17 người không mắc bệnh ung thư phổi (chiếm 5,5%).

  • Trong nhóm những người có triệu chứng khó thở thì có 176 người mắc ung thư phổi (chiếm 56,96%) và 22 người không mắc bệnh ung thư phổi (chiếm 7,12%).

Rủi ro tương đối

RelRisk(lsb)
## [1] 1.378378
epitab (lsb, method = 'riskratio', rev = "c")
## $tab
##    
##       1        p0  0        p1 riskratio     lower    upper   p.value
##   0  94 0.8468468 17 0.1531532 1.0000000        NA       NA        NA
##   1 176 0.8888889 22 0.1111111 0.7254902 0.4026811 1.307079 0.2897421
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ rủi ro tương đối của những người mắc bệnh ung thư phổi có liên quan đến triệu chứng khó thở là 0,7254902 tức là tỷ lệ rủi ro tương đối của những người có triệu chứng khó thở không mắc bệnh ung thư phổi nhiều hơn tỷ lệ những người không có triệu chứng khó thở không mắc ung thư phổi khoảng 27,45%.

Tỷ lệ chênh

epitab(lsb, method = 'oddsratio', rev='c') 
## $tab
##    
##       1        p0  0        p1 oddsratio     lower    upper   p.value
##   0  94 0.3481481 17 0.4358974 1.0000000        NA       NA        NA
##   1 176 0.6518519 22 0.5641026 0.6911765 0.3499372 1.365173 0.2897421
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ chênh là 0,6911765 tức là tỷ lệ những người có triệu chứng khó thở/ những người không có triệu chứng khó thở mắc bệnh ung thư phổi chỉ bằng 69,11% tỷ lệ những người có bệnh triệu chứng khó thở/ những người không có triệu chứng khó thở không mắc bệnh ung thư phổi.

4.2.8 Biến lungcacer và biến chestpain

lp <- table(data$chestpain,data$lungcancer)
lp
##    
##       0   1
##   0  27 110
##   1  12 160
prop.table(lp)
##    
##              0          1
##   0 0.08737864 0.35598706
##   1 0.03883495 0.51779935
ggplot(data, aes(lungcancer, fill = chestpain)) + geom_bar(position = 'dodge')
## Warning: The following aesthetics were dropped during statistical transformation: fill
## ℹ This can happen when ggplot fails to infer the correct grouping structure in
##   the data.
## ℹ Did you forget to specify a `group` aesthetic or to convert a numerical
##   variable into a factor?

Từ kết quả trên cho thấy

  • Trong nhóm những người không có triệu chứng đau ngực thì có 110 người mắc ung thư phổi (chiếm 35,59%) và 27 người không mắc bệnh ung thư phổi (chiếm 8,74%).

  • Trong nhóm những người có triệu chứng khó thở thì có 160 người mắc ung thư phổi (chiếm 51,77%) và 12 người không mắc bệnh ung thư phổi (chiếm 3,88%).

Rủi ro tương đối

RelRisk(lp)
## [1] 2.824818
epitab (lp, method = 'riskratio', rev = "c")
## $tab
##    
##       1        p0  0         p1 riskratio     lower     upper      p.value
##   0 110 0.8029197 27 0.19708029 1.0000000        NA        NA           NA
##   1 160 0.9302326 12 0.06976744 0.3540052 0.1863116 0.6726347 0.0009692897
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ rủi ro tương đối của những người mắc bệnh ung thư phổi có liên quan đến triệu chứng đau ngực là 0,3540052 tức là tỷ lệ rủi ro tương đối của những người có triệu chứng đau ngực không mắc bệnh ung thư phổi ít hơn tỷ lệ những người không có triệu chứng đau ngực không mắc ung thư phổi khoảng 64,59%.

Tỷ lệ chênh

epitab(lp, method = 'oddsratio', rev='c') 
## $tab
##    
##       1        p0  0        p1 oddsratio    lower   upper      p.value
##   0 110 0.4074074 27 0.6923077 1.0000000       NA      NA           NA
##   1 160 0.5925926 12 0.3076923 0.3055556 0.148428 0.62902 0.0009692897
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

Theo kết quả trên ta thấy tỷ lệ chênh là 0,3055556 tức là tỷ lệ những người có triệu chứng đau ngực/ những người không có triệu chứng đau ngực mắc bệnh ung thư phổi chỉ bằng 30,55% tỷ lệ những người có bệnh triệu chứng đau ngực/ những người không có triệu chứng đau ngực không mắc bệnh ung thư phổi.

4.3 Thống kê suy diễn cho các biến định tính

Kiểm định tính độc lập giữa hai biến định tính

  • Biến lungcancer và biến gender

Cặp giả thuyết/ đối thuyết

\(H_0\): Hai biến lungcancer và gender độc lập

\(H_1\): Hai biến lungcancer và gender không độc lập

chisq.test(table(data$lungcancer,data$gender))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$lungcancer, data$gender)
## X-squared = 1.0215, df = 1, p-value = 0.3122

Tại mức ý nghĩa 5%, với p-vlue > 0,05 thì ta đủ cơ sở chấp nhận \(H_0\), tức là việc những người mắc bệnh ung thư phổi và giới tính là độc lập với nhau.

  • Biến lungcancer và biến age

Cặp giả thuyết/ đối thuyết

\(H_0\): Hai biến lungcancer và age độc lập

\(H_1\): Hai biến lungcancer và age không độc lập

chisq.test(table(data$lungcancer,age1))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$lungcancer, age1)
## X-squared = 0.33314, df = 1, p-value = 0.5638

Tại mức ý nghĩa 5%, với p-vlue > 0,05 thì ta đủ cơ sở chấp nhận \(H_0\), tức là việc những người mắc bệnh ung thư phổi và độ tuổi là độc lập với nhau

  • Biến lungcancer và biến smoking

Cặp giả thuyết/ đối thuyết

\(H_0\): Hai biến lungcancer và smoking độc lập

\(H_1\): Hai biến lungcancer và smoking không độc lập

chisq.test(table(data$lungcancer,data$smoking))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$lungcancer, data$smoking)
## X-squared = 0.72251, df = 1, p-value = 0.3953

Tại mức ý nghĩa 5%, với p-vlue > 0,05 thì ta đủ cơ sở chấp nhận \(H_0\), tức là việc những người mắc bệnh ung thư phổi và sử dụng thuốc lá là độc lập với nhau

  • Biến lungcancer và biến wheezing

Cặp giả thuyết/ đối thuyết

\(H_0\): Hai biến lungcancer và wheezing độc lập

\(H_1\): Hai biến lungcancer và wheezing không độc lập

chisq.test(table(data$lungcancer,data$wheezing))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$lungcancer, data$wheezing)
## X-squared = 17.723, df = 1, p-value = 2.555e-05

Tại mức ý nghĩa 5%, với p-vlue < 0,05 thì ta chưa đủ cơ sở chấp nhận \(H_0\), tức là việc những người mắc bệnh ung thư phổi và triệu chứng khò khè là không độc lập với nhau

  • Biến lungcancer và biến ccoughing

Cặp giả thuyết/ đối thuyết

\(H_0\): Hai biến lungcancer và coughing độc lập

\(H_1\): Hai biến lungcancer và coughing không độc lập

chisq.test(table(data$lungcancer,data$coughing))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$lungcancer, data$coughing)
## X-squared = 17.606, df = 1, p-value = 2.717e-05

Tại mức ý nghĩa 5%, với p-vlue < 0,05 thì ta chưa đủ cơ sở chấp nhận \(H_0\), tức là việc những người mắc bệnh ung thư phổi và triệu chứng ho là không độc lập với nhau

  • Biến lungcancer và biến shortbreath

Cặp giả thuyết/ đối thuyết

\(H_0\): Hai biến lungcancer và shortbreath độc lập

\(H_1\): Hai biến lungcancer và shortbreath không độc lập

chisq.test(table(data$lungcancer,data$shortbreath))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$lungcancer, data$shortbreath)
## X-squared = 0.7906, df = 1, p-value = 0.3739

Tại mức ý nghĩa 5%, với p-vlue > 0,05 thì ta đủ cơ sở chấp nhận \(H_0\), tức là việc những người mắc bệnh ung thư phổi và triệu chứng khó thở là độc lập với nhau

  • Biến lungcancer và biến chestpain

Cặp giả thuyết/ đối thuyết

\(H_0\): Hai biến lungcancer và chestpain độc lập

\(H_1\): Hai biến lungcancer và chestpain không độc lập

chisq.test(table(data$lungcancer,data$chestpain))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(data$lungcancer, data$chestpain)
## X-squared = 10.083, df = 1, p-value = 0.001496

Tại mức ý nghĩa 5%, với p-vlue < 0,05 thì ta chưa đủ cơ sở chấp nhận \(H_0\), tức là việc những người mắc bệnh ung thư phổi và triệu chứng đau ngực là không độc lập với nhau

4.4 Khoảng ước lượng tỷ lệ

  • Ước lượng tỷ lệ cho biến lungcancer

Ước lượng tỷ lệ số người mắc bệnh ung thư phổi có phải là 87,38% không (nghĩa là chúng ta kiểm định giả thuyết \(H_{0}\): p = 0,8738)

d <- data[data$lungcancer == "Yes",]
prop.test(length(d$lungcancer),length(data$lungcancer),p= 0.8738)
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(d$lungcancer) out of length(data$lungcancer), null probability 0.8738
## X-squared = 2131.6, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.8738
## 95 percent confidence interval:
##  0.0000000 0.0153068
## sample estimates:
## p 
## 0

Dựa vào kết quả ta thấy p-value = 1 > 5%, chấp nhận \(H_{0}\). Tại mức ý nghĩa 5% số người người mắc ung thư phổi là 87,38%.

Khoảng ước lượng với độ tin cậy 95% của tỷ lệ số người mắc ung thư phổi là (0,8320969; 0,9066293)

4.5 Mô hình hồi quy Logistic

Thông qua kiểm định tính độc lập giữa các cặp biến bằng kiểm định chi bình phương, kết quả cho thấy những người mắc bệnh ung thư phổi phụ thuộc vào các triệu chứng khò khè, ho và đau ngực. Vì thế tác giả sẽ tiến hành hồi quy mô hình với biến phụ thuộc là lungcancer và các biến độc lập wheezing, coughing và chestpain.

4.5.1 Ước lượng hàm hồi quy cho dữ liệu nhị phân

  • Mô hình logit

Dạng tổng quát:

\[logit(π)=log(π/(1−π)=β_0+β_1X_1+β_2X_2+⋯+β_kX_k\]

mhlogit <- glm(data$lungcancer ~  data$wheezing + data$coughing + data$chestpain, family = binomial(link = "logit"), data = data)
summary(mhlogit)
## 
## Call:
## glm(formula = data$lungcancer ~ data$wheezing + data$coughing + 
##     data$chestpain, family = binomial(link = "logit"), data = data)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.7544   0.2134   0.3465   0.5821   0.9555  
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)   
## (Intercept)      0.5472     0.2654   2.062  0.03919 * 
## data$wheezing    1.0931     0.4332   2.523  0.01163 * 
## data$coughing    1.1422     0.4190   2.726  0.00641 **
## data$chestpain   0.9880     0.3848   2.567  0.01025 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 234.3  on 308  degrees of freedom
## Residual deviance: 198.7  on 305  degrees of freedom
## AIC: 206.7
## 
## Number of Fisher Scoring iterations: 5

Vậy nên mô hình logit được xác định như sau:

\[ logit(π) = log(π/1−π) = 0,5472 + 1,0931 wheezing + 1,1422 coughing + 0,988 chestpain\]

Kiểm định sự phù hợp của mô hình

Cặp giả thuyết/ đối thuyết

\(H_0\): Mô hình không phù hợp

\(H_1\): Mô hình phù hợp

lr_test <- anova(mhlogit, test = "Chisq")
p_value <- lr_test$Pr[2] 
p_value
## [1] 9.270249e-06

Kết quẩ cho thấy P-value < 0,05 ta bác bỏ giả thuyết \(H_0\) nên mô hình Logit là phù hợp với dữ liệu.

  • Mô hình probit

Dạng tổng quát:

\[probit(π)=Φ(1−π))=β_0+β_1X_1+β_2X_2+⋯+β_kX_k\]

mhprobit <- glm(data$lungcancer ~  data$wheezing + data$coughing + data$chestpain, family = binomial(link = "probit"), data = data)
summary(mhprobit)
## 
## Call:
## glm(formula = data$lungcancer ~ data$wheezing + data$coughing + 
##     data$chestpain, family = binomial(link = "probit"), data = data)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.7753   0.2073   0.3663   0.5976   0.9227  
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)   
## (Intercept)      0.3943     0.1578   2.498  0.01248 * 
## data$wheezing    0.5348     0.2169   2.466  0.01368 * 
## data$coughing    0.5857     0.2134   2.745  0.00606 **
## data$chestpain   0.5137     0.2008   2.558  0.01054 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 234.30  on 308  degrees of freedom
## Residual deviance: 200.13  on 305  degrees of freedom
## AIC: 208.13
## 
## Number of Fisher Scoring iterations: 5

Vậy nên mô hình probit được xác định như sau:

\[ probit(π) = Φ − 1(π) = 0,3943 + 0,5348 wheezing + 0,5857 coughing + 0,5137 chestpain\]

Kiểm định sự phù hợp của mô hình

Cặp giả thuyết/ đối thuyết

\(H_0\): Mô hình không phù hợp

\(H_1\): Mô hình phù hợp

lr_test <- anova(mhprobit, test = "Chisq")
p_value <- lr_test$Pr[2] 
p_value
## [1] 9.270249e-06

Kết quẩ cho thấy P-value < 0,05 ta bác bỏ giả thuyết \(H_0\) nên mô hình Probit là phù hợp với dữ liệu.

  • Mô hình cloglog

\[cloglog(π)=log(−log(1−π))=β_0+β_1X_1+β_2X_2+⋯+β_kX_k\]

mhcloglog <- glm(data$lungcancer ~  data$wheezing + data$coughing + data$chestpain, family = binomial(link = "cloglog"), data = data)
summary(mhcloglog)
## 
## Call:
## glm(formula = data$lungcancer ~ data$wheezing + data$coughing + 
##     data$chestpain, family = binomial(link = "cloglog"), data = data)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.7801   0.2059   0.3881   0.6067   0.8766  
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)   
## (Intercept)      0.1332     0.1453   0.917  0.35923   
## data$wheezing    0.3861     0.1661   2.324  0.02011 * 
## data$coughing    0.4452     0.1657   2.687  0.00721 **
## data$chestpain   0.3873     0.1578   2.455  0.01410 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 234.30  on 308  degrees of freedom
## Residual deviance: 202.03  on 305  degrees of freedom
## AIC: 210.03
## 
## Number of Fisher Scoring iterations: 6

Vậy nên mô hình probit được xác định như sau:

\[ cloglog(π) = log(−log(1−π)) = 0,3861 wheezing + 0,4452 coughing + 0,3873 chestpain\]

Kiểm định sự phù hợp của mô hình

Cặp giả thuyết/ đối thuyết

\(H_0\): Mô hình không phù hợp

\(H_1\): Mô hình phù hợp

lr_test <- anova(mhcloglog, test = "Chisq")
p_value <- lr_test$Pr[2] 
p_value
## [1] 9.270249e-06

Kết quẩ cho thấy P-value < 0,05 ta bác bỏ giả thuyết \(H_0\) nên mô hình cloglog là phù hợp với dữ liệu.

4.5.2 Các chỉ tiêu đánh giá mô hình

  • AIC - Akaike Information Criterion
AIC(mhlogit)
## [1] 206.7002
AIC(mhprobit)
## [1] 208.1308
AIC(mhcloglog)
## [1] 210.0317

Từ chỉ số AIC của 3 mô hình trên ta thấy mô hình logit có chỉ số AIC thấp nhất (206,7002). Vì thế đối với tiêu chí đánh giá AIC thì mô hình logit là phù hợp để xem xét sự tác động của các yếu tố đến biến phụ thuộc lungcancer hơn mô hình probit và cloglog.

  • Deviance
deviance(mhlogit)
## [1] 198.7002
deviance(mhprobit)
## [1] 200.1308
deviance(mhcloglog)
## [1] 202.0317

Từ chỉ số deviance của 3 mô hình trên ta thấy mô hình logit có chỉ số deviance thấp nhất (198,7002). Vì thế đối với tiêu chí đánh giá devience thì mô hình logit là phù hợp để xem xét sự tác động của các yếu tố đến biến phụ thuộc lungcancer hơn mô hình probit và cloglog.

  • Brier Score
BrierScore(mhlogit)
## [1] 0.09434669
BrierScore(mhprobit)
## [1] 0.09487746
BrierScore(mhcloglog)
## [1] 0.09576158

Từ chỉ số BrierScore của 3 mô hình trên ta thấy mô hình logit có chỉ số BrierScore thấp nhất (0,09434669). Vì thế đối với tiêu chí đánh giá BrierScore thì mô hình logit là phù hợp để xem xét sự tác động của các yếu tố đến biến phụ thuộc lungcancer hơn mô hình probit và cloglog.

Thông qua các tiêu chí đánh giá mô hình AIC, Deviance và BrierScore thì mô hình phù hợp nhất để xem xét tác động của các yếu tố wheezing, coughing, chestpain tới biến phụ thuộc lungcancer là mô hình hồi quy logit

4.5.3 Kết quả mô hình sau khi lựa chọn

summary(mhlogit)
## 
## Call:
## glm(formula = data$lungcancer ~ data$wheezing + data$coughing + 
##     data$chestpain, family = binomial(link = "logit"), data = data)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -2.7544   0.2134   0.3465   0.5821   0.9555  
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)   
## (Intercept)      0.5472     0.2654   2.062  0.03919 * 
## data$wheezing    1.0931     0.4332   2.523  0.01163 * 
## data$coughing    1.1422     0.4190   2.726  0.00641 **
## data$chestpain   0.9880     0.3848   2.567  0.01025 * 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 234.3  on 308  degrees of freedom
## Residual deviance: 198.7  on 305  degrees of freedom
## AIC: 206.7
## 
## Number of Fisher Scoring iterations: 5

Giải thích kết quả của mô hình Logit

  • Triệu chứng thở khò khè có tác động đến khả năng mắc bệnh ung thư phổi với hệ số β = 1,0931. Với mức ý nghĩa 5%, triệu chứng thở khò khè có tác động cùng chiều đến khả năng mắc bệnh ung thư phổi.

  • Triệu chứng ho có tác động đến khả năng mắc bệnh ung thư phổi với hệ số β = 1,1422. Với mức ý nghĩa 5%, triệu chứng ho có tác động cùng chiều đến khả năng mắc bệnh ung thư phổi.

  • Triệu chứng đau tức ngưc có tác động đến khả năng mắc bệnh ung thư phổi với hệ số β = 0,988. Với mức ý nghĩa 5%, triệu chứng đau tức ngực có tác động cùng chiều đến khả năng mắc bệnh ung thư phổi.

5 Kết luận và kiến nghị

5.1 Kết luận

Ung thư phổi là bệnh lý ác tính phổ biến nhất, chiếm khoảng một phần ba số ca tử vong do ung thư vì thế việc tìm hiểu về căn bệnh này để theo dõi sức khỏe của bản thân là thật sự cần thiết. Qua việc nghiên cứu mô hình hồi quy thông qua 3 mô hình Logit, Probit và Cloglog thì mô hình Logit là mô hình được lựa chọn là phù hợp nhất để xem xét sự tác động của các yếu tố đến khả năng mắc bệnh ung thư phổi.

Kết quả nghiên cứu cho thấy triệu chứng thở khò khè, triệu chứng ho và triệu chứng đau tức ngực có ảnh hưởng đến khả năng mắc bệnh ung thư phổi. Bên cạnh đó thì các yếu tố còn lại gồm giới tính, độ tuổi, hút thuốc, bệnh mãn tính, triệu chứng khó thở lại không có mối quan hệ nào với khả năng mắc bệnh ung thư phổi.

5.2 Kiến nghị

Từ kết quả phân tích trên thì tác giả xin đề xuất một số kiến nghị nhằm giúp cho mọi người có những biện pháp phòng tránh cũng như là giữ gìn sức khỏe cho bản thân.

Cẩn trọng trước sự ô nhiễm không khí, hãy thường xuyên vệ sinh nhà cửa, dọn dẹp thông thoáng môi trường sống. Trồng thêm nhiều cây xanh tại nhà hoặc nơi làm việc.

Duy tri lối sống lành mạnh, có một chế độ ăn uống với nhiều loại trái cây và rau quả sẽ làm tăng sức đề kháng cho cơ thể. Việc này sẽ giúp phòng ngừa, giảm thiểu các nguy cơ của ưng thư tái phát và một số bệnh mãn tính khác vẫn còn trong giai đoạn đầu.Tập thể dục thường xuyên giúp tăng cường khả năng chống trả tự nhiên của cơ thể đối với những yếu tố độc hại.

Tầm soát ung thư phổi định kỳ, để ý những dấu hiệu của ung thư phổi vì mỗi người sẽ có những dấu hiệu về ung thư phổi khác nhau. Một số bệnh nhân có dấu hiệu rõ ràng liên quan đến phổi, một số khác thì không có dấu hiệu cho đến khi ung thư di căn sang các bộ phận khác của cơ thể. Hầu hết những người bị ung thư phổi không có triệu chứng cho đến khi bệnh tiến triển. Các triệu chứng ung thư phổi có thể bao gồm: ho trong một thời gian dài mà không giảm, ho ra máu, khó thở, khò khè, cảm thấy mệt mỏi mọi lúc hoặc giảm cân mà không rõ nguyên nhân,… Một số thay đổi khác có thể xảy ra với ung thư phổi có thể bao gồm các đợt viêm phổi lặp đi lặp lại và hạch bạch huyết bị sưng hoặc một số triệu chứng có thể xảy ra với các bệnh khác. Do đó khi cảm nhận được cơ thể mình có những triệu chứng này thì hãy tiến hành kiểm tra sức khỏe và tìm ra nguyên nhân cụ thể.

5.3 Hạn chế

Trên thực tế có rất nhiều yếu tố khác ảnh hưởng đến khả năng mắc ung thư phổi như triệu chứng da vàng, trạng thái lo lắng, mệt mỏi, triệu chứng dị ứng, sử dụng rượu bia, tình trạng khó nuốt, giảm cân không rõ nguyên nhân,…nhưng tác giả chỉ chọn ra 8 yếu tố tác động đế khả năng mắc ung thư phổi bao gồm độ tuổi, giới tính, hút thuốc, bệnh mãn tính, khò khè, ho, khó thở, đau ngực. Vì thế mà kết luận mô hình sẽ khác so với thực tế đôi chút.

6 Tài liệu tham khảo

[1] T. K. Thanh, T. M. Tường & V. A. L. Duy, Giáo trình Phân tích dữ liệu định tính, 2022.

[2] “Dấu hiệu cảnh báo ung thư phổi,” Bệnh viện K - Vietnam National Cencer Hospital, 2023.

[3] “Các nguyên nhân gây Ung thư phổi mà bạn nên biết,” HoanMysaigon, 08 07 2022.

[4] “Nhóm tuổi nào có nguy cơ mắc ung thư phổi cao,” VNExpress, 13 05 2022.

[5] “Mối liên hệ giữa ung thư phổi và bệnh phổi tắc nghẽn mạn tính COPD,” Vinmec.

[6] Việt Nam, “Thuốc lá – nguyên nhân chính dẫn đến ung thư phổi,” Sở y tế Hà Nội, 06 02 2023.

LS0tDQp0aXRsZTogIlBIw4JOIFTDjUNIIFPhu7AgVMOBQyDEkOG7mE5HIEPhu6ZBIEPDgUMgWeG6vlUgVOG7kCDEkOG6vk4gS0jhuqIgTsSCTkcgVU5HIFRIxq8gUEjhu5RJIg0KYXV0aG9yOiAiVHJp4buHdSBOZ3V54buFbiBNYWkgVGhpIg0KZGF0ZTogIjIwMjMtMDctMjkiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogdHJ1ZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUgDQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiBmYWxzZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgd29yZF9kb2N1bWVudDogZGVmYXVsdA0KICANCi0tLQ0KDQpgYGB7cn0NCnJlcXVpcmUodGlkeXZlcnNlKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KbGlicmFyeShEZXNjVG9vbHMpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShtZHNjb3JlKQ0KbGlicmFyeShsbXRlc3QpDQpgYGANCg0KRmlsZSBSbWFya2Rvd24gLSBodHRwczovL2RyaXZlLmdvb2dsZS5jb20vZmlsZS9kLzF1YW9HQUdiMThteFpwYmo1RFIwOFlLNlpKMkxDRnktMC92aWV3P3VzcD1zaGFyaW5nDQoNCkZpbGUgZOG7ryBsaeG7h3UgLSBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xSXd6NUxEUkNsQ3dzMG9DcjVjMmhRQ0hFWWJlVmdydmV2UVpJRzUtbEtqRS9lZGl0P3VzcD1zaGFyaW5nDQoNCg0KIyBDaMawxqFuZyAxIEdp4bubaSB0aGnhu4d1IGThu68gbGnhu4d1IG5naGnDqm4gY+G7qXUNCg0KROG7ryBsaeG7h3UgbmdoacOqbiBj4bupdSDEkcaw4bujYyB0aHUgdGjhuq1wIHThu6sgdHJhbmcgd2ViIGjhu4cgdGjhu5FuZyBk4buxIMSRb8OhbiB1bmcgdGjGsCBwaOG7lWkgdHLhu7FjIHR1eeG6v24gxJHhu4MgeGVtIHLhurFuZyBuaOG7r25nIGLhu4duaCBuaMOibiBt4bqvYyB1bmcgdGjGsCBwaOG7lWkgbMOgIGRvIGNo4buLdSBz4buxIOG6o25oIGjGsOG7n25nIGPhu6dhIG5o4buvbmcgeeG6v3UgdOG7kSBuw6BvLg0KDQpgYGB7cn0NCnNldHdkKCJDOi9QVERMRFQxIikNCmRhdGEgPC0gcmVhZF9leGNlbCgidGlldWx1YW4ueGxzeCIsMSkNCmRhdGENCnN0cihkYXRhKQ0KYGBgDQoNCi0gKipNw7QgdOG6oyBk4buvIGxp4buHdSoqDQoNCkLhu5kgZOG7ryBsaeG7h3UgYmFvIGfhu5NtIDMwOSBxdWFuIHPDoXQsIGPDsyB04bqldCBj4bqjIGzDoCAxMyBiaeG6v24gdHJvbmcgxJHDsyBn4buTbSAxIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIHbDoCAxMiBiaeG6v24gxJHhu4tuaCB0w61uaA0KDQoqQmnhur9uIMSR4buLbmggdMOtbmgqDQoNCi0gZ2VuZGVyOiB0aOG7gyBoaeG7h24gZ2nhu5tpIHTDrW5oIGfhu5NtIGhhaSBiaeG7g3UgaGnhu4duIE0obWFsZSkgdsOgIEYoZmVtYWxlKQ0KDQpfIHNtb2tpbmc6IGNobyBiaeG6v3QgbmfGsOG7nWkga2jhuqNvIHPDoXQgY8OzIHPhu60gZOG7pW5nIHRodeG7kWMgbMOhIGtow7RuZyBn4buTbSAyIGJp4buDdSBoaeG7h24gbMOgIDAgPSBLaMO0bmcgdsOgIDEgPSBDw7MNCg0KLSBjaHJvbmljZGlzZWFzZTogY2hvIGJp4bq/dCBuZ8aw4budaSBraOG6o28gc8OhdCBjw7MgdGnhu4FuIHPhu60gYuG7h25oIG3Do24gdMOtbmgga2jDtG5nIGfhu5NtIDIgYmnhu4N1IGhp4buHbiBsw6AgIDAgPSBLaMO0bmcgdsOgIDEgPSBDw7MNCg0KLSB3aGVlemluZzogY2hvIGJp4bq/dCBuZ8aw4budaSBraOG6o28gc8OhdCBjw7MgYuG7iyBraMOyIGtow6gga2jDtG5nLCBn4buTbSAyIGJp4buDdSBoaeG7h24gbMOgIDAgPSBLaMO0bmcgdsOgIDEgPSBDw7MNCg0KLSBjb3VnaGluZzogY2hvIGJp4bq/dCBuZ8aw4budaSBraOG6o28gc8OhdCBjw7MgYuG7iyBobyBoYXkga2jDtG5nLCBn4buTbSAyIGJp4buDdSBoaeG7h24gbMOgIDAgPSBLaMO0bmcgdsOgIDEgPSBDw7MNCg0KLSBzaG9ydGJyZWF0aDogY2hvIGJp4bq/dCBuZ8aw4budaSBraOG6o28gc8OhdCBjw7MgYuG7iyBraMOzIHRo4bufIGtow7RuZywgZ+G7k20gMiBiaeG7g3UgaGnhu4duIGzDoCAwID0gS2jDtG5nIHbDoCAxID0gQ8OzDQoNCi0gY2hlc3RwYWluOiBjaG8gYmnhur90IG5nxrDhu51pIGto4bqjbyBzw6F0IGPDsyBi4buLIMSRYXUgbmfhu7FjIGtow7RuZywgZ+G7k20gMiBiaeG7g3UgaGnhu4duIGzDoCAwID0gS2jDtG5nIHbDoCAxID0gQ8OzDQoNCi0gbHVuZ2NhbmNlcjogY2hvIGJp4bq/dCBuZ8aw4budaSBraOG6o28gc8OhdCBjw7MgbeG6r2MgdW5nIHRoxrAgcGjhu5VpIGtow7RuZywgZ+G7k20gMiBiaeG7g3UgaGnhu4duIGzDoCAwID0gS2jDtG5nIHbDoCAxID0gQ8OzDQoNCipCaeG6v24gxJHhu4tuaCBsxrDhu6NuZyoNCg0KLSBhZ2U6IHRo4buDIGhp4buHbiDEkeG7mSB0deG7lWkNCg0KIyBDaMawxqFuZyAyIFjDoWMgxJHhu4tuaCBiaeG6v24gcGjhu6UgdGh14buZYw0KDQotICoqQuG7h25oIHVuZyB0aMawIHBo4buVaSAtIGx1bmdjYW5jZXIqKg0KDQpVbmcgdGjGsCBwaOG7lWkgbMOgIHPhu7EgdMSDbmcgdHLGsOG7n25nIGLhuqV0IHRoxrDhu51uZyBj4bunYSBjw6FjIG3DtCB0cm9uZyBwaOG7lWkuIEtoaSBjxqEgdGjhu4MgaMOtdCB2w6BvLCBraMO0bmcga2jDrSBz4bq9IMSRaSB4deG7kW5nIGtow60gcXXhuqNuIHbDoCB2w6BvIHRyb25nIGhhaSBwaOG7lWksIHThuqFpIMSRw7Mga2jDtG5nIGtow60gbGFuIHJhIHF1YSBjw6FjIOG7kW5nIMSRxrDhu6NjIGfhu41pIGzDoCBwaOG6vyBxdeG6o24uIEjhuqd1IGjhur90IGPDoWMgdHLGsOG7nW5nIGjhu6NwIHVuZyB0aMawIHBo4buVaSDEkeG7gXUgYuG6r3Qgbmd14buTbiB04burIGPDoWMgdOG6vyBiw6BvIHThuqFvIHRow6BuaCBuaOG7r25nIOG7kW5nIG7DoHkuIMSQw6J5IGPFqW5nIGzDoCBsb+G6oWkgdW5nIHRoxrAgdGjGsOG7nW5nIGfhurdwIG5o4bqldCB2w6AgY8OzIHThu7cgbOG7hyB04butIHZvbmcgY2FvIG5o4bqldC4NCg0KVW5nIHRoxrAgcGjhu5VpIGfhu5NtIGhhaSBsb+G6oWkgY2jDrW5oOg0KLSBVbmcgdGjGsCBwaOG7lWkga2jDtG5nIHThur8gYsOgbyBuaOG7jzogbMOgIGxv4bqhaSB1bmcgdGjGsCBwaOG7lWkgcGjhu5UgYmnhur9uIG5o4bqldC4NCi0gVW5nIHRoxrAgcGjhu5VpIHThur8gYsOgbyBuaOG7jzogbMOgIGxv4bqhaSDDrXQgcGjhu5UgYmnhur9uIGjGoW4sIG5oxrBuZyBsYW4gbmhhbmggdOG7m2kgY8OhYyBwaOG6p24ga2jDoWMgY+G7p2EgY8ahIHRo4buDIHF1YSDEkcaw4budbmcgbcOhdS4NCg0KVW5nIHRoxrAgcGjhu5VpIGdpYWkgxJFv4bqhbiBz4bubbSB0aMaw4budbmcga2jDtG5nIGfDonkgcmEgdHJp4buHdSBjaOG7qW5nLiBLaGkgdW5nIHRoxrAgdGnhur9uIHRyaeG7g24sIHRhIGPDsyB0aOG7gyBn4bq3cCBwaOG6o2kgY8OhYyB0cmnhu4d1IGNo4bupbmcgbmjGsDogSG8gdHLhu58gbuG6t25nIGhv4bq3YyBraMO0bmcgY2jhuqVtIGThu6l0LCBraMOgbiB0aeG6v25nLCBjw6FjIGtow7Mga2jEg24gduG7gSBow7QgaOG6pXAsIMSRYXUgbmfhu7FjIGxpw6puIHThu6VjLCBobyByYSBtw6F1LCBt4buHdCBt4buPaSBrw6lvIGTDoGksLi4uDQoNCk5ndXnDqm4gbmjDom4gY2jDrW5oIGfDonkgdW5nIHRoxrAgcGjhu5VpIGzDoCBow7p0IHRodeG7kWMgbMOhICh0aHXhu5FjIGzDoSwgdGh14buRYyBsw6BvIGhv4bq3YyB4w6wgZ8OgKSwgbeG6t2MgZMO5IGtow7RuZyBwaOG6o2kgdOG6pXQgY+G6oyBuaOG7r25nIG5nxrDhu51pIGjDunQgxJHhu4F1IG3huq9jIHVuZyB0aMawIHBo4buVaS4gQ8OhYyBjaOG6pXQgZ8OieSBo4bqhaSB0cm9uZyBraMOzaSB0aHXhu5FjIGzDoG0gdOG7lW4gdGjGsMahbmcgY8OhYyB04bq/IGLDoG8gcGjhu5VpLiBIw610IGtow7NpIHRodeG7kWMg4oCYYuG7iyDEkeG7mW5n4oCZIHThu6sgbmjhu69uZyBuZ8aw4budaSBow7p0IHRodeG7kWMgeHVuZyBxdWFuaCBjxaluZyBjw7MgdGjhu4MgZ8OieSB1bmcgdGjGsCBwaOG7lWkg4bufIG3hu5l0IHPhu5EgbmfGsOG7nWkga2jDtG5nIGjDunQgdGh14buRYy4gTmdvw6BpIHJhIG3hu41pIG5nxrDhu51pIGPFqW5nIGPDsyB0aOG7gyBt4bqvYyB1bmcgdGjGsCBwaOG7lWkgbuG6v3U6IA0KLSBUcsOqbiA0MCB0deG7lWk6IGjhuqd1IGjhur90IGPDoWMgdHLGsOG7nW5nIGjhu6NwIMSRxrDhu6NjIGNo4bqpbiDEkW/DoW4gbeG6r2MgdW5nIHRoxrAgcGjhu5VpIGtoaSDEkcOjIGjGoW4gNjUgdHXhu5VpLiBUdXkgbmhpw6puIGfhuqduIMSRw6J5LCBi4buHbmggY8OzIHh1IGjGsOG7m25nIHh14bqldCBoaeG7h24gbmhp4buBdSBoxqFuIOG7nyBuZ8aw4budaSB0cuG6uyB0deG7lWkuDQotIFRp4bq/cCB4w7pjIHbhu5tpIG3hu5l0IHPhu5EgY2jhuqV0IG5oxrAgcmFkb24gKG3hu5l0IGNo4bqldCBraMOtIHBow7NuZyB44bqhKSwgYW1pxINuZywgYXNlbiAodGjhuqFjaCB0w61uKSwgY3LDtG0sIG5pa2VuIHbDoCDDtCBuaGnhu4VtIGtow7RuZyBraMOtDQotIELDqm4gY+G6oW5oIMSRw7MgYuG7h25oIG5ow6JuIG3huq9jIHVuZyB0aMawIHBo4buVaSBkbyBkaSB0cnV54buBbiB0cm9uZyBnaWEgxJHDrG5oLg0KDQojIENoxrDGoW5nIDMgUGjGsMahbmcgcGjDoXAgdsOgIG3DtCBow6xuaCBuZ2hpw6puIGPhu6l1IA0KDQojIyBNw7QgaMOsbmggbmdoacOqbiBj4bupdSANCg0KVMOhYyBnaeG6oyB4w6J5IGThu7FuZyBtw7QgaMOsbmggduG7m2kgbeG7pWMgxJHDrWNoIG5naGnDqm4gY+G7qXUgc+G7sSB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyB54bq/dSB04buRIMSR4bq/biBraOG6oyBuxINuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpLiBNw7QgaMOsbmggxJHhu4EgeHXhuqV0IG5oxrAgc2F1Og0KDQokJGx1bmdjYW5jZXI9IM6yXzAgKyDOsl8xZ2VuZGVyICsgzrJfMmFnZSArIM6yXzNzbW9raW5nICsgzrJfNGNocm9uaWNkaXNlYXNlICsgzrJfNXdoZWV6aW5nICsgzrJfNmNvdWdoaW5nICsgzrJfN3Nob3J0YnJlYXRoICsgzrJfOGNoZXN0cGFpbiQkDQoNClRyb25nIMSRw7MgDQoNCi0gJM6yXzAkOiBI4bqxbmcgc+G7kSBj4bunYSBtw7QgaMOsbmggDQoNCi0gJM6yXzEgLi4uIM6yXzgkOiBI4buHIHPhu5EgaOG7k2kgcXV5IGPhu6dhIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcCANCg0KVHJvbmcgbcO0IGjDrG5oIG7DoHkgc+G6vSBwaMOibiB0w61jaCBz4buxIHTDoWMgxJHhu5luZyBj4bunYSBjw6FjIHnhur91IHThu5EgxJHhur9uIGto4bqjIG7Eg25nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgDQoNCi0gQmnhur9uIHBo4bulIHRodeG7mWMgbMOgIG5nxrDhu51pIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWk6IGx1bmdjYW5jZXINCg0KLSBCaeG6v24gxJHhu5ljIGzhuq1wIGzDoCBjw6FjIGJp4bq/bjogZ2VuZGVyLCBhZ2UsIHNtb2tpbmcsIGNocm9uaWNkaXNlYXNlLCB3aGVlemluZywgY291Z2hpbmcsIHNob3J0YnJlYXRoLCBjaGVzdHBhaW4uDQoNCiMjIFBoxrDGoW5nIHBow6FwIG5naGnDqm4gY+G7qXUgDQoNCiMjIyBNw7QgaMOsbmggTG9naXN0aWMNCg0KJCRsb2dpdCjPgCk9bG9nKM+AKHgpLygx4oiSz4AoeCkpKSA9IM6xICsgzrJ4JCQgDQoNCsSQw6J5IMSRxrDhu6NjIGfhu41pIGzDoCBtw7QgaMOsbmggbG9naXN0aWMgaGF5IG3DtCBow6xuaCBsb2dpdC4gVOG7qyBtw7QgaMOsbmggdGEgY8OzDQoNCiQkz4AoeCkgPSAxIC8gKDErZV4oLc6xLc6yeCkpJCQNCg0KTcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyBsw6AgdHLGsOG7nW5nIGjhu6NwIMSR4bq3YyBiaeG7h3QgY+G7p2EgR0xNLCB0aMOgbmggcGjhuqduIG5n4bqrdSBuaGnDqm4gKHRow6BuaCBjw7RuZywgdGjhuqV0IGLhuqFpKSBsw6Agbmjhu4sgcGjDom4uIEjDoG0gbGnDqm4ga+G6v3QgbG9naXQgY+G7p2EgJM+AJCBsw6AgcGjDqXAgYmnhur9uIMSR4buVaSAkbG9nKM+ALygx4oiSz4ApKSQsIGvDvSBoaeG7h3UgYuG7n2kgJGxvZ2l0KM+AKSQuIEPDoWMgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYyB0aMaw4budbmcgxJHGsOG7o2MgZ+G7jWkgbMOgIGxvZ2l0LiBMb2dpdCBsw6AgdGhhbSBz4buRIHThu7Egbmhpw6puIGPhu6dhIHBow6JuIHBo4buRaSBuaOG7iyB0aOG7qWMuDQoNCiMjIyDGr+G7m2MgbMaw4bujbmcgaMOgbSBo4buTaSBxdXkgY2hvIGThu68gbGnhu4d1IG5o4buLIHBow6JuIA0KDQpE4buvIGxp4buHdSBuaOG7iyBwaMOibiBsw6AgZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaCBjaOG7iSBuaOG6rW4gMiBnacOhIHRy4buLOiDEkMO6bmcvU2FpOyDEkOG7k25nIMO9L0tow7RuZyDEkeG7k25nIMO9OyBDw7MvS2jDtG5nOyBUaMOgbmggY8O0bmcvVGjhuqV0IGLhuqFpLC4uLg0KDQoqKk3DtCBow6xuaCBsb2dpdCoqDQoNCiQkbG9naXQoz4ApPWxvZyjPgC8oMeKIks+AKSkkJA0KDQpNw7QgaMOsbmggTG9naXQgxJHGsOG7o2Mgdmnhur90IGTGsOG7m2kgZOG6oW5nDQoNCiQkbG9naXQoz4ApPWxvZyjPgC8oMeKIks+AKSk9zrJfMCvOsl8xWF8xK86yXzJYXzIr4ouvK86yX2tYX2skJA0KDQoqKk3DtCBow6xuaCBwcm9iaXQqKg0KDQpI4buTaSBxdXkgUHJvYml0LCDEkcO0aSBraGkgY8OybiDEkcaw4bujYyBn4buNaSBsw6AgbcO0IGjDrG5oIFByb2JpdCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyDGsOG7m2MgbMaw4bujbmcgbcO0IGjDrG5oIGPDsyBiaeG6v24gcGjhu6UgdGh14buZYyBk4bqhbmcgbmjhu4sgcGjDom4uDQogDQokJHByb2JpdCjPgCkgPSDOpl7iiJIxKM+AKSQkDQoNCk3DtCBow6xuaCBQcm9iaXQgxJHGsOG7o2Mgdmnhur90IGTGsOG7m2kgZOG6oW5nDQoNCiQkcHJvYml0KM+AKHgpKSA9IM6yXzArzrJfMVhfMSvOsl8yWF8yK+KLryvOsl9rWF9rJCQkDQoNCioqTcO0IGjDrG5oIGNsb2dsb2cqKg0KDQokJGNsb2dsb2coz4ApPWxvZyjiiJJsb2coMeKIks+AKSkkJA0KDQpNw7QgaMOsbmggY2xvZ2xvZyDEkcaw4bujYyB2aeG6v3QgZMaw4bubaSBk4bqhbmcNCg0KJCRjbG9nbG9nKM+AKHgpKSA9IM6yXzArzrJfMVhfMSvOsl8yWF8yK+KLryvOsl9rWF9rJCQkDQoNCiMjIyBDw6FjIHRpw6p1IGNow60gxJHDoW5oIGdpw6EgbcO0IGjDrG5oDQoNCsSQ4buDIMSRw6FuaCBnacOhIGPDoWMgbcO0IGjDrG5oIGjhu5NpIGPhu5UgxJFp4buDbiBjaMO6bmcgdGEgdGjGsOG7nW5nIGThu7FhIHbDoG8gaOG7hyBz4buRIHjDoWMgxJHhu4tuaCBtw7QgaMOsbmggKCRSXzIkKSwgbmjGsG5nIMSR4buRaSB24bubaSBtw7QgY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggdOG7lW5nIHF1w6F0IGNow7puZyB0YSBz4butIGThu6VuZyBjw6FjIHRpw6p1IGNow60gc2F1Og0KDQotIEFJQyAtIEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24NCg0KQUlDIMSRxrDhu6NjIMSR4buBIHh14bqldCBi4bufaSBBa2Fpa2UgSGlyb3R1Z3UsIG3hu5l0IG5ow6AgdGjhu5FuZyBrw6ogaOG7jWMgbmfGsOG7nWkgTmjhuq10LiBBSUMgbMOgIG3hu5l0IHRpw6p1IGNow60gxJHGsOG7o2Mgc+G7rSBk4bulbmcgbeG7mXQgY8OhY2ggcGjhu5UgYmnhur9uIMSR4buDIMSRw6FuaCBnacOhIG3hu5l0IG3DtCBow6xuaCBo4buTaSBxdXkgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGLhu59pIHBoxrDGoW5nIHBow6FwIE1heGltdW0gTGlrZWtpaG9vZCAoTUwpLiBN4buZdCBjw6FjaCBjaHVuZyBjaHVuZyBnacOhIHRy4buLIGPhu6dhIEFJQyBjw6BuZyBuaOG7jyB0aMOsIG3DtCBow6xuaCBjw6BuZyB04buRdC4gQUlDIMSRxrDhu6NjIHTDrW5oIGLhurFuZyBjw7RuZyB0aOG7qWMgc2F1Og0KDQokJEFJQz3iiJIybG4oTCkrMmskJA0KDQpW4bubaSBMIGzDoCBnacOhIHRy4buLIGPhu7FjIMSR4bqhaSBj4bunYSBow6BtIGjhu6NwIGzDvSAobGlrZWxpaG9vZCBmdW5jdGlvbikgdsOgIGsgbMOgIHPhu5EgdGhhbSBz4buRIGPhu6dhIG3DtCBow6xuaC4NCg0KLSBEZXZpYW5jZQ0KRGV2aWFuY2UgY8WpbmcgbMOgIG3hu5l0IHRpw6p1IGNow60gcuG6pXQgcGjhu5UgYmnhur9uIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIMSRw6FuaCBnacOhIG3hu5l0IG3DtCBow6xuaCBo4buTaSBxdXkgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIGLhu59pIHBoxrDGoW5nIHBow6FwIEjhu6NwIGzDvSBj4buxYyDEkeG6oWkgKE1MKS4gTeG7mXQgY8OhY2ggdOG7lW5nIHF1w6EsIGPFqW5nIGdp4buRbmcgbmjGsCBjaOG7iSB0acOqdSBBSUMsIGdpw6EgdHLhu4sgY+G7p2EgRGV2aWFuY2UgY8Ogbmcgbmjhu48gdGjDrCBtw7QgaMOsbmggY8OgbmcgdOG7kXQuDQoNCi0gIEJyaWVyIFNjb3JlDQpMw6AgY2jhu4kgdGnDqnUgZMO5bmcgxJHhu4MgxJHDoW5oIGdpw6EgbcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpc3RpYywgQnJpZXIgU2NvcmUgxJHGsOG7o2MgdMOtbmggbmjGsCBzYXU6DQoNCiQkQj0oMS9uKSDiiJEocF9p4oiSb19pKSQkDQoNClRyb25nIMSRw7M6ICRwX2ksIG9faSQgbOG6p24gbMaw4bujdCBsw6AgZ2nDoSB0cuG7iyB4w6FjIHN14bqldCBxdWFuIHPDoXQgxJHGsOG7o2MsIHbDoCBnacOhIHRy4buLIHjDoWMgc3XhuqV0IHTDrW5oIHJhIHThu6sgbcO0IGjDrG5oLg0KDQojIENoxrDGoW5nIDQgUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdsOgIGvhur90IHF14bqjIG5naGnDqm4gY+G7qXUgDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIHThu6tuZyBiaeG6v24NCg0KIyMjIEJp4bq/biBwaOG7pSB0aHXhu5ljIChsdW5nY2FuY2VyKQ0KDQoqKkJp4bq/biBsdW5nY2FuY2VyKioNCg0KLSBC4bqjbmcgdOG6p24gc+G7kSAtIGLhuqNuZyB04bqnbiBzdeG6pXQNCg0KYGBge3J9DQp0YWJsZShkYXRhJGx1bmdjYW5jZXIpDQp0YWJsZShkYXRhJGx1bmdjYW5jZXIpL3N1bSh0YWJsZShkYXRhJGx1bmdjYW5jZXIpKQ0KYGBgDQoNCi0gxJDhu5MgdGjhu4sgDQoNCmBgYHtyfQ0KZGF0YSB8PiBnZ3Bsb3QoYWVzKHggPSBsdW5nY2FuY2VyLCB5ID0gYWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGwgPSAnbGF2ZW5kZXInKSArIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksIGFjY3VyYWN5PSAwLjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLTAuNSkrIHRoZW1lX2NsYXNzaWMoKSArIHhsYWIoJ2x1bmdjYW5jZXInKSArIHlsYWIoJ1Thu7cgbOG7hycpDQpgYGANCg0KQmnhur9uIGx1bmdjYW5jZXIgdGjhu4MgaGnhu4duIGNobyBuaOG7r25nIG5nxrDhu51pIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWksIGvhur90IHF14bqjIGNobyB0aOG6pXkgdHJvbmcgMzA5IG5nxrDhu51pIGPDsyAzOSBuZ8aw4budaSBraMO0bmcgYuG7iyB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gMTIsNjIlKSB2w6AgMjcwIG5nxrDhu51pIGLhu4sgdW5nIHRoxrAgcGjhu5VpIChjaGnhur9tICA4NywzOCUpLiBUYSB0aOG6pXkgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCDEkcOhbmcga+G7gyBraGkgbmjhu69uZyBuZ8aw4budaSBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIGNhbyBn4bqlcCA2LDkyIGzhuqduIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkuIA0KDQojIyMgQmnhur9uIMSR4buZYyBs4bqtcA0KDQoqKkJp4bq/biBnZW5kZXIqKg0KDQotIELhuqNuZyB04bqnbiBz4buRIC0gYuG6o25nIHThuqduIHN14bqldA0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkZ2VuZGVyKQ0KdGFibGUoZGF0YSRnZW5kZXIpL3N1bSh0YWJsZShkYXRhJGdlbmRlcikpDQpgYGANCg0KLSDEkOG7kyB0aOG7iyANCg0KYGBge3J9DQpkYXRhIHw+IGdncGxvdChhZXMoeCA9IGdlbmRlciwgeSA9IGFmdGVyX3N0YXQoY291bnQpKSkgKyBnZW9tX2JhcihmaWxsID0gJ1NhbG1vbicpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSwgYWNjdXJhY3k9IDAuMDEpKSwgc3RhdCA9ICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtMC41KSsgdGhlbWVfY2xhc3NpYygpICsgeGxhYignZ2VuZGVyJykgKyB5bGFiKCdU4bu3IGzhu4cnKQ0KYGBgDQoNCkvhur90IHF14bqjIGNobyB0aOG6pXkgdHJvbmcgMzA5IHF1YW4gc8OhdCBjw7MgMTQ3IG5nxrDhu51pIGzDoCBnaeG7m2kgdMOtbmggbuG7ryAoY2hp4bq/bSA0Nyw1NyUpIHbDoCAxNjIgbmfGsOG7nWkgbMOgIGdp4bubaSB0w61uaCBuYW0gKGNoaeG6v20gIDUyLDQzJSkuIFThu7cgbOG7hyBnaeG7m2kgdMOtbmggbmFtIGNhbyAxLDEgbOG6p24gc28gduG7m2kgZ2nhu5tpIHTDrW5oIG7hu68gDQoNCioqQmnhur9uIGFnZSoqDQoNCi0gTcOjIGjDs2EgYmnhur9uIGFnZSB04burIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIHNhbmcgYmnhur9uIMSR4buLbmggdMOtbmgNCg0KYGBge3J9DQphZ2UxIDwtIGRhdGEkYWdlDQphZ2UxIDwtIGN1dChkYXRhJGFnZSwgYnJlYWtzID0gYygwLDYyLDg3KSwgbGFiZWxzPWMoImTGsOG7m2kgNjIgdHXhu5VpIiwidHLDqm4gNjIgdHXhu5VpIikpDQpgYGANCg0KLSBC4bqjbmcgdOG6p24gc+G7kSAtIGLhuqNuZyB04bqnbiBzdeG6pXQNCg0KYGBge3J9DQp0YWJsZShhZ2UxKQ0KdGFibGUoYWdlMSkvc3VtKHRhYmxlKGFnZTEpKQ0KYGBgDQotIMSQ4buTIHRo4buLIA0KDQpgYGB7cn0NCmRhdGEgfD4gZ2dwbG90KGFlcyh4ID0gYWdlMSwgeSA9IGFmdGVyX3N0YXQoY291bnQpKSkgKyBnZW9tX2JhcihmaWxsID0gJ2xhdmVuZGVyJykgKyBnZW9tX3RleHQoYWVzKGxhYmVsPXNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpLCBhY2N1cmFjeT0gMC4wMSkpLCBzdGF0ID0gJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLCB2anVzdCA9IC0wLjUpKyB0aGVtZV9jbGFzc2ljKCkgKyB4bGFiKCdhZ2UnKSArIHlsYWIoJ1Thu7cgbOG7hycpDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSB0cm9uZyAzMDkgcXVhbiBzw6F0IGPDsyAxNTIgbmfGsOG7nWkgdHLDqm4gNjIgdHXhu5VpIChjaGnhur9tIDQ5LDE5JSkgdsOgIDE1NyBuZ8aw4budaSBkxrDhu5tpIDYyIHR14buVaSAoY2hp4bq/bSA1MCw4MSUpLiBUYSB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGNow6puaCBs4buHY2ggZ2nhu69hIG5o4buvbmcgbmfGsOG7nWkgdHLDqm4gNjIgdHXhu5VpIHbDoCBuaOG7r25nIG5nxrDhu51pIGTGsOG7m2kgNjIgdHXhu5VpLiBU4bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBkxrDhu5tpIDYyIHR14buVaSAgY2FvIGfhuqVwIDEsMDMzIGzhuqduIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgdHLDqm4gNjIgdHXhu5VpLg0KDQoqKkJp4bq/biBzbW9raW5nKioNCg0KLSBC4bqjbmcgdOG6p24gc+G7kSAtIGLhuqNuZyB04bqnbiBzdeG6pXQgDQoNCmBgYHtyfQ0KdGFibGUoZGF0YSRzbW9raW5nKQ0KdGFibGUoZGF0YSRzbW9raW5nKS9zdW0odGFibGUoZGF0YSRzbW9raW5nKSkNCmBgYA0KDQotIMSQ4buTIHRo4buLIA0KDQpgYGB7cn0NCmRhdGEgfD4gZ2dwbG90KGFlcyh4ID0gc21va2luZywgeSA9IGFmdGVyX3N0YXQoY291bnQpKSkgKyBnZW9tX2JhcihmaWxsID0gJ1NhbG1vbicpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSwgYWNjdXJhY3k9IDAuMDEpKSwgc3RhdCA9ICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtMC41KSsgdGhlbWVfY2xhc3NpYygpICsgeGxhYignc21va2luZycpICsgeWxhYignVOG7tyBs4buHJykNCmBgYA0KDQpL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IHRyb25nIDMwOSBxdWFuIHPDoXQgY8OzIDEzNSBuZ8aw4budaSBraMO0bmcgc+G7rSBk4bulbmcgdGh14buRYyBsw6EgKGNoaeG6v20gNDMsNjklKSB2w6AgMTc0IG5nxrDhu51pIGPDsyBz4butIGThu6VuZyB0aHXhu5FjIGzDoSAoY2hp4bq/bSA1NiwzMSUpLiBUYSB0aOG6pXkgdOG7tyBs4buHIG5o4buvdW5nIG5nxrDhu51pIGjDunQgdGh14buRYyBsw6EgY2FvIGfhuqVwIDEsMjkgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgaMO6dCB0aHXhu5FjLg0KDQoqKkJp4bq/biBjaHJvbmljZGlzZWFzZSoqDQoNCi0gQuG6o25nIHThuqduIHPhu5EgLSBi4bqjbmcgdOG6p24gc3XhuqV0DQoNCmBgYHtyfQ0KdGFibGUoZGF0YSRjaHJvbmljZGlzZWFzZSkNCnRhYmxlKGRhdGEkY2hyb25pY2Rpc2Vhc2UpL3N1bSh0YWJsZShkYXRhJGNocm9uaWNkaXNlYXNlKSkNCmBgYA0KDQotIMSQ4buTIHRo4buLIA0KDQpgYGB7cn0NCmRhdGEgfD4gZ2dwbG90KGFlcyh4ID0gY2hyb25pY2Rpc2Vhc2UsIHkgPSBhZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbCA9ICdsaWdodGJsdWUnKSArIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksIGFjY3VyYWN5PSAwLjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLTAuNSkrIHRoZW1lX2NsYXNzaWMoKSArIHhsYWIoJ2Nocm9uaWNkaXNlYXNlJykgKyB5bGFiKCdU4bu3IGzhu4cnKQ0KYGBgDQoNCkvhur90IHF14bqjIGNobyB0aOG6pXkgdHJvbmcgMzA5IHF1YW4gc8OhdCBjw7MgMTUzIG5nxrDhu51pIGtow7RuZyBjw7MgdGnhu4FuIHPhu60gYuG7h25oIG3Do24gdMOtbmggKGNoaeG6v20gNDksNTElKSB2w6AgMTU2IG5nxrDhu51pIGPDsyB0aeG7gW4gc+G7rSBi4buHbmggbcOjbiB0w61uaCAoY2hp4bq/bSA1MCw0OSUpLiBUYSB0aOG6pXkgdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIGLhu4duaCBtw6NuIHTDrW5oIGfhuqVwIDEsMDIgbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8OzIGLhu4duaCBtw6NuIHTDrW5oLg0KDQoqKkJp4bq/biB3aGVlemluZyoqDQoNCi0gQuG6o25nIHThuqduIHPhu5EgLSBi4bqjbmcgdOG6p24gc3XhuqV0DQoNCmBgYHtyfQ0KdGFibGUoZGF0YSR3aGVlemluZykNCnRhYmxlKGRhdGEkd2hlZXppbmcpL3N1bSh0YWJsZShkYXRhJHdoZWV6aW5nKSkNCmBgYA0KDQotIMSQ4buTIHRo4buLIA0KDQpgYGB7cn0NCmRhdGEgfD4gZ2dwbG90KGFlcyh4ID0gd2hlZXppbmcsIHkgPSBhZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbCA9ICdsaWdodGJsdWUnKSArIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksIGFjY3VyYWN5PSAwLjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLTAuNSkrIHRoZW1lX2NsYXNzaWMoKSArIHhsYWIoJ3doZWV6aW5nJykgKyB5bGFiKCdU4bu3IGzhu4cnKQ0KYGBgDQoNCkvhur90IHF14bqjIGNobyB0aOG6pXkgdHJvbmcgMzA5IHF1YW4gc8OhdCBjw7MgMTM3IG5nxrDhu51pIGtow7RuZyBjw7MgdHJp4buHdSBjaOG7qW5nIGtow7Iga2jDqCAoY2hp4bq/bSA0NCwzNCUpIHbDoCAxNzIgbmfGsOG7nWkgY8OzIHRyaeG7h3UgY2jhu6luZyBraMOyIGtow6ggKGNoaeG6v20gNTUsNjYlKS4gVGEgdGjhuqV5IHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyB0cmnhu4d1IGNo4bupbmcga2jDsiBraMOoIGNhbyBn4bqlcCAxLDI2IGzhuqduIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGPDsyB0cmnhu4d1IGNo4bupbmcga2jDsiBraMOoLg0KDQoqKkJp4bq/biBjb3VnaGluZyoqDQoNCi0gQuG6o25nIHThuqduIHPhu5EgLSBi4bqjbmcgdOG6p24gc3XhuqV0DQoNCmBgYHtyfQ0KdGFibGUoZGF0YSRjb3VnaGluZykNCnRhYmxlKGRhdGEkY291Z2hpbmcpL3N1bSh0YWJsZShkYXRhJGNvdWdoaW5nKSkNCmBgYA0KDQotIMSQ4buTIHRo4buLIA0KDQpgYGB7cn0NCmRhdGEgfD4gZ2dwbG90KGFlcyh4ID0gY291Z2hpbmcsIHkgPSBhZnRlcl9zdGF0KGNvdW50KSkpICsgZ2VvbV9iYXIoZmlsbCA9ICdicm93bicpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbD1zY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSwgYWNjdXJhY3k9IDAuMDEpKSwgc3RhdCA9ICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJywgdmp1c3QgPSAtMC41KSsgdGhlbWVfY2xhc3NpYygpICsgeGxhYignY291Z2hpbmcnKSArIHlsYWIoJ1Thu7cgbOG7hycpDQpgYGANCg0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSB0cm9uZyAzMDkgcXVhbiBzw6F0IGPDsyAxMzAgbmfGsOG7nWkga2jDtG5nIGPDsyB0cmnhu4d1IGNo4bupbmcgaG8gKGNoaeG6v20gNDIsMDclKSB2w6AgMTc5IG5nxrDhu51pIGPDsyB0cmnhu4d1IGNo4bupbmcgaG8gKGNoaeG6v20gNTcsOTMlKS4gVGEgdGjhuqV5IHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyB0cmnhu4d1IGNo4bupbmcgaG8gY2FvIGfhuqVwIDEsMzggbOG6p24gc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8OzIHRyaeG7h3UgY2jhu6luZyBoby4NCg0KKipCaeG6v24gc2hvcnRicmVhdGgqKg0KDQotIELhuqNuZyB04bqnbiBz4buRIC0gYuG6o25nIHThuqduIHN14bqldA0KDQpgYGB7cn0NCnRhYmxlKGRhdGEkc2hvcnRicmVhdGgpDQp0YWJsZShkYXRhJHNob3J0YnJlYXRoKS9zdW0odGFibGUoZGF0YSRzaG9ydGJyZWF0aCkpDQpgYGANCg0KLSDEkOG7kyB0aOG7iyANCg0KYGBge3J9DQpkYXRhIHw+IGdncGxvdChhZXMoeCA9IHNob3J0YnJlYXRoLCB5ID0gYWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGwgPSAnYnJvd24nKSArIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksIGFjY3VyYWN5PSAwLjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLTAuNSkrIHRoZW1lX2NsYXNzaWMoKSArIHhsYWIoJ3Nob3J0YnJlYXRoJykgKyB5bGFiKCdU4bu3IGzhu4cnKQ0KYGBgDQoNCkvhur90IHF14bqjIGNobyB0aOG6pXkgdHJvbmcgMzA5IHF1YW4gc8OhdCBjw7MgMTExIG5nxrDhu51pIGtow7RuZyBjw7MgdHJp4buHdSBjaOG7qW5nIGtow7MgdGjhu58gKGNoaeG6v20gMzUsOTIlKSB2w6AgMTk4IG5nxrDhu51pIGPDsyB0cmnhu4d1IGNo4bupbmcga2jDsyB0aOG7nyAoY2hp4bq/bSA2NCwwOCUpLiBUYSB0aOG6pXkgdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIHRyaeG7h3UgY2jhu6luZyBraMOzIHRo4bufIGNhbyBn4bqlcCAxLDc4IGzhuqduIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGPDsyB0cmnhu4d1IGNo4bupbmcga2jDsyB0aOG7ny4NCg0KKipCaeG6v24gY2hlc3RwYWluKiogDQoNCi0gQuG6o25nIHThuqduIHPhu5EgLSBi4bqjbmcgdOG6p24gc3XhuqV0DQoNCmBgYHtyfQ0KdGFibGUoZGF0YSRjaGVzdHBhaW4pDQp0YWJsZShkYXRhJGNoZXN0cGFpbikvc3VtKHRhYmxlKGRhdGEkY2hlc3RwYWluKSkNCmBgYA0KDQotIMSQ4buTIHRo4buLIA0KDQpgYGB7cn0NCmRhdGEgfD4gZ2dwbG90KGFlcyh4ID0gY2hlc3RwYWluLCB5ID0gYWZ0ZXJfc3RhdChjb3VudCkpKSArIGdlb21fYmFyKGZpbGwgPSAnYnJvd24nKSArIGdlb21fdGV4dChhZXMobGFiZWw9c2NhbGVzOjpwZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksIGFjY3VyYWN5PSAwLjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdibGFjaycsIHZqdXN0ID0gLTAuNSkrIHRoZW1lX2NsYXNzaWMoKSArIHhsYWIoJ2NoZXN0cGFpbicpICsgeWxhYignVOG7tyBs4buHJykNCmBgYA0KDQpL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IHRyb25nIDMwOSBxdWFuIHPDoXQgY8OzIDEzNyBuZ8aw4budaSBraMO0bmcgY8OzIHRyaeG7h3UgY2jhu6luZyDEkWF1IG5n4buxYyAoY2hp4bq/bSA0NCwzNCUpIHbDoCAxNzIgbmfGsOG7nWkgY8OzIHRyaeG7h3UgY2jhu6luZyDEkWF1IG5n4buxYyAoY2hp4bq/bSA1NSw2NiUpLiBUYSB0aOG6pXkgdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIHRyaeG7h3UgY2jhu6luZyDEkWF1IG5n4buxYyBjYW8gZ+G6pXAgMSwyNiBs4bqnbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBjw7MgdHJp4buHdSBjaOG7qW5nIMSRYXUgbmfhu7FjLg0KDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIGNobyBjw6FjIGPhurdwIGJp4bq/bg0KDQojIyMgQmnhur9uIGx1bmdjYW5jZXIgdsOgIGJp4bq/biBnZW5kZXINCg0KYGBge3J9DQpsZyA8LSB0YWJsZShkYXRhJGdlbmRlcixkYXRhJGx1bmdjYW5jZXIpDQpsZw0KcHJvcC50YWJsZShsZykNCmdncGxvdChkYXRhLCBhZXMobHVuZ2NhbmNlciwgZmlsbCA9IGdlbmRlcikpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKQ0KYGBgDQoNClThu6sga+G6v3QgcXXhuqMgdHLDqm4gY2hvIHRo4bqleQ0KDQotICBUcm9uZyBuaMOzbSBnaeG7m2kgdMOtbmggbuG7ryB0aMOsIGPDsyAxMjUgbmfGsOG7nWkgbeG6r2MgdW5nIHRoxrAgcGjhu5VpIChjaGnhur9tIDQwLDQ1JSkgdsOgIDIyIG5nxrDhu51pIGtow7RuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIChjaGnhur9tIDcsMTIlKS4NCg0KLSBUcm9uZyBuaMOzbSBnaeG7m2kgdMOtbmggbmFtIHRow6wgY8OzIDE0NSBuZ8aw4budaSBt4bqvYyB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gNDYsOTMlKSB2w6AgMTcgbmfGsOG7nWkga2jDtG5nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gNSw1JSkuDQoNCioqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkqKg0KDQpgYGB7cn0NClJlbFJpc2sobGcpDQpgYGANCg0KYGBge3J9DQplcGl0YWIgKGxnLCBtZXRob2QgPSAncmlza3JhdGlvJywgcmV2ID0gImMiKQ0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IHThu7cgbOG7hyBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBj4bunYSBuaOG7r25nIG5nxrDhu51pIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgdGhlbyBnaeG7m2kgdMOtbmggbMOgICAwLDcwMTE3ODUgdOG7tyBs4buHIHLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIGPhu6dhIG5o4buvbmcgbmfGsOG7nWkgbmFtIGtow7RuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIHRo4bqlcCBoxqFuIG5o4buvbmcgbmfGsOG7nWkgZ2nhu5tpIHTDrW5oIG7hu68ga2jDtG5nIG3huq9jIHVuZyB0aMawIHBo4buVaSBraG/huqNuZyAyOSw4OCUuDQoNCioqVOG7tyBs4buHIGNow6puaCoqDQoNCmBgYHtyfQ0KZXBpdGFiKGxnLCBtZXRob2QgPSAnb2Rkc3JhdGlvJywgcmV2PSdjJykgDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0csOqbiB0YSB0aOG6pXkgdOG7tyBs4buHIGNow6puaCBsw6AgMCw2NjYxIHThu6ljIGzDoCB04bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBnaeG7m2kgdMOtbmggbmFtL27hu68gbeG6r2MgdW5nIHRoxrAgcGjhu5VpIGNo4buJIGLhurFuZyA2Niw2MSUgdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgZ2nhu5tpIHTDrW5oIG5hbS9u4buvIGtow7RuZyBt4bqvYyB1bmcgdGjGsCBwaOG7lWkuDQoNCiMjIyBCaeG6v24gbHVuZ2NhbmNlciB2w6AgYmnhur9uIGFnZQ0KDQpgYGB7cn0NCmxhIDwtIHRhYmxlKGFnZTEsZGF0YSRsdW5nY2FuY2VyKQ0KbGENCnByb3AudGFibGUobGEpDQpnZ3Bsb3QoZGF0YSwgYWVzKGx1bmdjYW5jZXIsIGZpbGwgPSBhZ2UpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2RvZGdlJykNCmBgYA0KDQpU4burIGvhur90IHF14bqjIHRyw6puIGNobyB0aOG6pXkNCg0KLSAgVHJvbmcgbmjDs20gZMaw4bubaSA2MiB0deG7lWkgdGjDrCBjw7MgMTM1IG5nxrDhu51pIG3huq9jIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSA0Myw2OCUpIHbDoCAyMiBuZ8aw4budaSBraMO0bmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSA3LDEyJSkuDQoNCi0gVHJvbmcgbmjDs20gdHLDqm4gNjIgdHXhu5VpIHRow6wgY8OzIDEzNSBuZ8aw4budaSBt4bqvYyB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gNDMsNjglKSB2w6AgMTcgbmfGsOG7nWkga2jDtG5nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gNSw1JSkuDQoNCioqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkqKg0KDQpgYGB7cn0NClJlbFJpc2sobGEpDQpgYGANCg0KYGBge3J9DQplcGl0YWIgKGxhLCBtZXRob2QgPSAncmlza3JhdGlvJywgcmV2ID0gImMiKQ0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IHThu7cgbOG7hyBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBj4bunYSBuaOG7r25nIG5nxrDhu51pIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgdGhlbyDEkeG7mSB0deG7lWkgbMOgIDAsNzk4MTQ1OSB04bupYyBsw6AgdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgdHLDqm4gNjIgdHXhu5VpIGtow7RuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIMOtdCBoxqFuIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIGPDsyDEkeG7mSB0deG7lWkgZMaw4bubaSA2MiBraG/huqNuZyAyMCwxOSUuDQoNCioqVOG7tyBs4buHIGNow6puaCoqDQoNCmBgYHtyfQ0KZXBpdGFiKGxhLCBtZXRob2QgPSAnb2Rkc3JhdGlvJywgcmV2PSdjJykgDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0csOqbiB0YSB0aOG6pXkgdOG7tyBs4buHIGNow6puaCBsw6AgMCw3NzI3IHThu6ljIGzDoCB04bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSB0csOqbiA2MiB0deG7lWkvIG5o4buvbmcgbmfGsOG7nWkgZMaw4bubaSA2MiB0deG7lWkgbeG6r2MgdW5nIHRoxrAgcGjhu5VpIGNo4buJIGLhurFuZyA3NywyNyUgdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgdHLDqm4gNjIgdHXhu5VpLyBuaOG7r25nIG5nxrDhu51pIGTGsOG7m2kgNjIgdHXhu5VpIGtow7RuZyBt4bqvYyB1bmcgdGjGsCBwaOG7lWkuDQoNCiMjIyBCaeG6v24gbHVuZ2NhbmNlciB2w6AgYmnhur9uIHNtb2tpbmcNCg0KYGBge3J9DQpscyA8LSB0YWJsZShkYXRhJHNtb2tpbmcsZGF0YSRsdW5nY2FuY2VyKQ0KbHMNCnByb3AudGFibGUobHMpDQpnZ3Bsb3QoZGF0YSwgYWVzKGx1bmdjYW5jZXIsIGZpbGwgPSBzbW9raW5nKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpDQpgYGANCg0KVOG7qyBr4bq/dCBxdeG6oyB0csOqbiBjaG8gdGjhuqV5DQoNCi0gIFRyb25nIG5ow7NtIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGjDunQgdGh14buRYyB0aMOsIGPDsyAxMTUgbmfGsOG7nWkgbeG6r2MgdW5nIHRoxrAgcGjhu5VpIChjaGnhur9tIDM3LDIxJSkgdsOgIDIwIG5nxrDhu51pIGtow7RuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIChjaGnhur9tIDYsNDclKS4NCg0KLSBUcm9uZyBuaMOzbSBuaOG7r25nIG5nxrDhu51pIGjDunQgdGh14buRYyB0aMOsIGPDsyAxNTUgbmfGsOG7nWkgbeG6r2MgdW5nIHRoxrAgcGjhu5VpIChjaGnhur9tIDUwLDE2JSkgdsOgIDE5IG5nxrDhu51pIGtow7RuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIChjaGnhur9tIDYsMTQlKS4NCg0KKipS4bunaSBybyB0xrDGoW5nIMSR4buRaSoqDQoNCmBgYHtyfQ0KUmVsUmlzayhscykNCmBgYA0KDQpgYGB7cn0NCmVwaXRhYiAobHMsIG1ldGhvZCA9ICdyaXNrcmF0aW8nLCByZXYgPSAiYyIpDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0csOqbiB0YSB0aOG6pXkgdOG7tyBs4buHIHLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIGPhu6dhIG5o4buvbmcgbmfGsOG7nWkgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSB0aGVvIGxpw6puIHF1YW4gxJHhur9uIGjDunQgdGh14buRYyBsw6EgbMOgIDAsNzM3MDY5IHThu6ljIGzDoCB04bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBow7p0IHRodeG7kWMga2jDtG5nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgw610IGjGoW4gdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGjDunQgdGh14buRYyBuaMawbmcga2jDtG5nIG3huq9jIHVuZyB0aMawIHBo4buVaSBsw6Aga2hv4bqjbmcgMjYsMjklLg0KDQoqKlThu7cgbOG7hyBjaMOqbmgqKg0KDQpgYGB7cn0NCmVwaXRhYihscywgbWV0aG9kID0gJ29kZHNyYXRpbycsIHJldj0nYycpIA0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IHThu7cgbOG7hyBjaMOqbmggbMOgIDAsNzA0OCB04bupYyBsw6AgdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIGjDunQgdGh14buRYy8gbmjhu69uZyBuZ8aw4budaSBraMO0bmcgaMO6dCB0aHXhu5FjIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgY2jhu4kgYuG6sW5nIDcwLDQ4JSB04bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBjw7MgaMO6dCB0aHXhu5FjLyBuaOG7r3VuZyBuZ8aw4budaSBraMO0bmcgaMO6dCB0aHXhu5FjIGtow7RuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpLiAgDQoNCiMjIyBCaeG6v24gbHVuZ2NhbmNlciB2w6AgYmnhur9uIGNocm9uaWNkaXNlYXNlIA0KDQpgYGB7cn0NCmxjIDwtIHRhYmxlKGRhdGEkY2hyb25pY2Rpc2Vhc2UsZGF0YSRsdW5nY2FuY2VyKQ0KbGMNCnByb3AudGFibGUobGMpDQpnZ3Bsb3QoZGF0YSwgYWVzKGx1bmdjYW5jZXIsIGZpbGwgPSBjaHJvbmljZGlzZWFzZSkpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKQ0KYGBgDQoNClThu6sga+G6v3QgcXXhuqMgdHLDqm4gY2hvIHRo4bqleQ0KDQotICBUcm9uZyBuaMOzbSBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBjw7MgYuG7h25oIG3Do24gdMOtbmggdGjDrCBjw7MgMTI4IG5nxrDhu51pIG3huq9jIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSA0MSw0MiUpIHbDoCAyNSBuZ8aw4budaSBraMO0bmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSA4LDA5JSkuDQoNCi0gVHJvbmcgbmjDs20gbmjhu69uZyBuZ8aw4budaSBjw7MgYuG7h25oIG3Do24gdMOtbmggdGjDrCBjw7MgMTQyIG5nxrDhu51pIG3huq9jIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSA0NSw5NSUpIHbDoCAxNCBuZ8aw4budaSBraMO0bmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSA0LDUzJSkuDQoNCioqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkqKg0KDQpgYGB7cn0NClJlbFJpc2sobGMpDQpgYGANCg0KYGBge3J9DQplcGl0YWIgKGxjLCBtZXRob2QgPSAncmlza3JhdGlvJywgcmV2ID0gImMiKQ0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IHThu7cgbOG7hyBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBj4bunYSBuaOG7r25nIG5nxrDhu51pIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgY8OzIGxpw6puIHF1YW4gxJHhur9uIHRp4buBbiBz4butIGLhu4duaCBtw6NuIHTDrW5oIGzDoCAwLDU0OTIzMDggdOG7qWMgbMOgIHThu7cgbOG7hyBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBj4bunYSBuaOG7r25nIG5nxrDhu51pIGPDsyBi4buHbmggbcOjbiB0w61uaCBraMO0bmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSDDrXQgaMahbiB04bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8OzIGLhu4duaCBtw6NuIHTDrW5oIGtow7RuZyBt4bqvYyB1bmcgdGjGsCBwaOG7lWkga2hv4bqjbmcgNDUsMDclLg0KDQoqKlThu7cgbOG7hyBjaMOqbmgqKg0KDQpgYGB7cn0NCmVwaXRhYihsYywgbWV0aG9kID0gJ29kZHNyYXRpbycsIHJldj0nYycpIA0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IHThu7cgbOG7hyBjaMOqbmggbMOgIDAsNTA0NyB04bupYyBsw6AgdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIGLhu4duaCBtw6NuIHTDrW5oLyBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBjw7MgYuG7h25oIG3Do24gdMOtbmggbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSBjaOG7iSBi4bqxbmcgNTAsNDclIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyBi4buHbmggbcOjbiB0w61uaC8gbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8OzIGLhu4duaCBtw6NuIHTDrW5oIGtow7RuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpLiANCg0KIyMjIEJp4bq/biBsdW5nY2FuY2VyIHbDoCBiaeG6v24gd2hlZXppbmcNCg0KYGBge3J9DQpsdyA8LSB0YWJsZShkYXRhJHdoZWV6aW5nLGRhdGEkbHVuZ2NhbmNlcikNCmx3DQpwcm9wLnRhYmxlKGx3KQ0KZ2dwbG90KGRhdGEsIGFlcyhsdW5nY2FuY2VyLCBmaWxsID0gd2hlZXppbmcpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2RvZGdlJykNCmBgYA0KDQpU4burIGvhur90IHF14bqjIHRyw6puIGNobyB0aOG6pXkNCg0KLSAgVHJvbmcgbmjDs20gbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8OzIHRyaeG7h3UgY2jhu6luZyBraMOyIGtow6ggdGjDrCBjw7MgMTA3IG5nxrDhu51pIG3huq9jIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSAzNCw2MyUpIHbDoCAzMCBuZ8aw4budaSBraMO0bmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSA5LDclKS4NCg0KLSBUcm9uZyBuaMOzbSBuaOG7r25nIG5nxrDhu51pIGPDsyB0cmnhu4d1IGNo4bupbmcga2jDsiBraMOoIHRow6wgY8OzIDE2MyBuZ8aw4budaSBt4bqvYyB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gNTIsNzUlKSB2w6AgOSBuZ8aw4budaSBraMO0bmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSAyLDkxJSkuDQoNCioqUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkqKg0KDQpgYGB7cn0NClJlbFJpc2sobHcpDQpgYGANCg0KYGBge3J9DQplcGl0YWIgKGx3LCBtZXRob2QgPSAncmlza3JhdGlvJywgcmV2ID0gImMiKQ0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IHThu7cgbOG7hyBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBj4bunYSBuaOG7r25nIG5nxrDhu51pIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgY8OzIGxpw6puIHF1YW4gxJHhur9uIHRyaeG7h3UgY2jhu6luZyBraMOyIGtow6ggbMOgIDAsNTQ5MjMwOCB04bupYyBsw6AgdOG7tyBs4buHIHLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIGPhu6dhIG5o4buvbmcgbmfGsOG7nWkgY8OzIHRyaeG7h3UgY2jhu6luZyBraMOyIGtow6gga2jDtG5nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgw610IGjGoW4gdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGPDsyB0cmnhu4d1IGNo4bupbmcga2jDsiBraMOoIGtow7RuZyBt4bqvYyB1bmcgdGjGsCBwaOG7lWkga2hv4bqjbmcgNzYsMSUuDQoNCioqVOG7tyBs4buHIGNow6puaCoqDQoNCmBgYHtyfQ0KZXBpdGFiKGx3LCBtZXRob2QgPSAnb2Rkc3JhdGlvJywgcmV2PSdjJykgDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0csOqbiB0YSB0aOG6pXkgdOG7tyBs4buHIGNow6puaCBsw6AgMCwxOTY5IHThu6ljIGzDoCB04bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBjw7MgdHJp4buHdSBjaOG7qW5nIGtow7Iga2jDqC8gbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8OzIHRyaeG7h3UgY2jhu6luZyBraMOyIGtow6ggbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSBjaOG7iSBi4bqxbmcgMTksNjklIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyBi4buHbmggdHJp4buHdSBjaOG7qW5nIGtow7Iga2jDqC8gbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8OzIHRyaeG7h3UgY2jhu6luZyBraMOyIGtow6gga2jDtG5nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkuIA0KDQojIyMgQmnhur9uIGx1bmdjYWNlciB2w6AgYmnhur9uIGNvdWdoaW5nDQoNCmBgYHtyfQ0KbGNvIDwtIHRhYmxlKGRhdGEkY291Z2hpbmcsZGF0YSRsdW5nY2FuY2VyKQ0KbGNvDQpwcm9wLnRhYmxlKGxjbykNCmdncGxvdChkYXRhLCBhZXMobHVuZ2NhbmNlciwgZmlsbCA9IGNvdWdoaW5nKSkgKyBnZW9tX2Jhcihwb3NpdGlvbiA9ICdkb2RnZScpDQpgYGANCg0KVOG7qyBr4bq/dCBxdeG6oyB0csOqbiBjaG8gdGjhuqV5DQoNCi0gIFRyb25nIG5ow7NtIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGPDsyB0cmnhu4d1IGNo4bupbmcgaG8gdGjDrCBjw7MgMTAxIG5nxrDhu51pIG3huq9jIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSAzMiw2OCUpIHbDoCAyOSBuZ8aw4budaSBraMO0bmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSA5LDM4JSkuDQoNCi0gVHJvbmcgbmjDs20gbmjhu69uZyBuZ8aw4budaSBjw7MgdHJp4buHdSBjaOG7qW5nIGhvIHRow6wgY8OzIDE2OSBuZ8aw4budaSBt4bqvYyB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gNTQsNjklKSB2w6AgMTAgbmfGsOG7nWkga2jDtG5nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gMywyMyUpLg0KDQoqKlLhu6dpIHJvIHTGsMahbmcgxJHhu5FpKioNCg0KYGBge3J9DQpSZWxSaXNrKGxjbykNCmBgYA0KDQpgYGB7cn0NCmVwaXRhYiAobGNvLCBtZXRob2QgPSAncmlza3JhdGlvJywgcmV2ID0gImMiKQ0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IHThu7cgbOG7hyBy4bunaSBybyB0xrDGoW5nIMSR4buRaSBj4bunYSBuaOG7r25nIG5nxrDhu51pIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgY8OzIGxpw6puIHF1YW4gxJHhur9uIHRyaeG7h3UgY2jhu6luZyBobyBsw6AgMCwyNTA0MzM0IHThu6ljIGzDoCB04bu3IGzhu4cgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgY+G7p2Egbmjhu69uZyBuZ8aw4budaSBjw7MgdHJp4buHdSBjaOG7qW5nIGhvIGtow7RuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIMOtdCBoxqFuIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBjw7MgdHJp4buHdSBjaOG7qW5nIGhvIGtow7RuZyBt4bqvYyB1bmcgdGjGsCBwaOG7lWkga2hv4bqjbmcgNzQsOTYlLg0KDQoqKlThu7cgbOG7hyBjaMOqbmgqKg0KDQpgYGB7cn0NCmVwaXRhYihsY28sIG1ldGhvZCA9ICdvZGRzcmF0aW8nLCByZXY9J2MnKSANCmBgYA0KDQpUaGVvIGvhur90IHF14bqjIHRyw6puIHRhIHRo4bqleSB04bu3IGzhu4cgY2jDqm5oIGzDoCAwLDIwNjA4MDQgdOG7qWMgbMOgIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyB0cmnhu4d1IGNo4bupbmcgaG8vIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGPDsyB0cmnhu4d1IGNo4bupbmcgaG8gbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSBjaOG7iSBi4bqxbmcgMjAsNiUgdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIGLhu4duaCB0cmnhu4d1IGNo4bupbmcgaG8vIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGPDsyB0cmnhu4d1IGNo4bupbmcgaG8ga2jDtG5nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkuDQoNCiMjIyBCaeG6v24gbHVuZ2NhY2VyIHbDoCBiaeG6v24gc2hvcnRicmVhdGgNCg0KYGBge3J9DQpsc2IgPC0gdGFibGUoZGF0YSRzaG9ydGJyZWF0aCxkYXRhJGx1bmdjYW5jZXIpDQpsc2INCnByb3AudGFibGUobHNiKQ0KZ2dwbG90KGRhdGEsIGFlcyhsdW5nY2FuY2VyLCBmaWxsID0gc2hvcnRicmVhdGgpKSArIGdlb21fYmFyKHBvc2l0aW9uID0gJ2RvZGdlJykNCmBgYA0KDQpU4burIGvhur90IHF14bqjIHRyw6puIGNobyB0aOG6pXkNCg0KLSAgVHJvbmcgbmjDs20gbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8OzIHRyaeG7h3UgY2jhu6luZyBraMOzIHRo4bufIHRow6wgY8OzIDk0IG5nxrDhu51pIG3huq9jIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSAzMCw0MiUpIHbDoCAxNyBuZ8aw4budaSBraMO0bmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSAoY2hp4bq/bSA1LDUlKS4NCg0KLSBUcm9uZyBuaMOzbSBuaOG7r25nIG5nxrDhu51pIGPDsyB0cmnhu4d1IGNo4bupbmcga2jDsyB0aOG7nyB0aMOsIGPDsyAxNzYgbmfGsOG7nWkgbeG6r2MgdW5nIHRoxrAgcGjhu5VpIChjaGnhur9tIDU2LDk2JSkgdsOgIDIyIG5nxrDhu51pIGtow7RuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIChjaGnhur9tIDcsMTIlKS4NCg0KKipS4bunaSBybyB0xrDGoW5nIMSR4buRaSoqDQoNCmBgYHtyfQ0KUmVsUmlzayhsc2IpDQpgYGANCg0KYGBge3J9DQplcGl0YWIgKGxzYiwgbWV0aG9kID0gJ3Jpc2tyYXRpbycsIHJldiA9ICJjIikNCmBgYA0KDQpUaGVvIGvhur90IHF14bqjIHRyw6puIHRhIHRo4bqleSB04bu3IGzhu4cgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgY+G7p2Egbmjhu69uZyBuZ8aw4budaSBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIGPDsyBsacOqbiBxdWFuIMSR4bq/biB0cmnhu4d1IGNo4bupbmcga2jDsyB0aOG7nyBsw6AgMCw3MjU0OTAyIHThu6ljIGzDoCB04bu3IGzhu4cgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgY+G7p2Egbmjhu69uZyBuZ8aw4budaSBjw7MgdHJp4buHdSBjaOG7qW5nIGtow7MgdGjhu58ga2jDtG5nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgbmhp4buBdSBoxqFuIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBjw7MgdHJp4buHdSBjaOG7qW5nIGtow7MgdGjhu58ga2jDtG5nIG3huq9jIHVuZyB0aMawIHBo4buVaSBraG/huqNuZyAyNyw0NSUuDQoNCioqVOG7tyBs4buHIGNow6puaCoqDQoNCmBgYHtyfQ0KZXBpdGFiKGxzYiwgbWV0aG9kID0gJ29kZHNyYXRpbycsIHJldj0nYycpIA0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdHLDqm4gdGEgdGjhuqV5IHThu7cgbOG7hyBjaMOqbmggbMOgIDAsNjkxMTc2NSB04bupYyBsw6AgdOG7tyBs4buHIG5o4buvbmcgbmfGsOG7nWkgY8OzIHRyaeG7h3UgY2jhu6luZyBraMOzIHRo4bufLyBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBjw7MgdHJp4buHdSBjaOG7qW5nIGtow7MgdGjhu58gbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSBjaOG7iSBi4bqxbmcgNjksMTElIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyBi4buHbmggdHJp4buHdSBjaOG7qW5nIGtow7MgdGjhu58vIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGPDsyB0cmnhu4d1IGNo4bupbmcga2jDsyB0aOG7nyBraMO0bmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaS4NCg0KIyMjIEJp4bq/biBsdW5nY2FjZXIgdsOgIGJp4bq/biBjaGVzdHBhaW4NCg0KYGBge3J9DQpscCA8LSB0YWJsZShkYXRhJGNoZXN0cGFpbixkYXRhJGx1bmdjYW5jZXIpDQpscA0KcHJvcC50YWJsZShscCkNCmdncGxvdChkYXRhLCBhZXMobHVuZ2NhbmNlciwgZmlsbCA9IGNoZXN0cGFpbikpICsgZ2VvbV9iYXIocG9zaXRpb24gPSAnZG9kZ2UnKQ0KYGBgDQoNClThu6sga+G6v3QgcXXhuqMgdHLDqm4gY2hvIHRo4bqleQ0KDQotICBUcm9uZyBuaMOzbSBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBjw7MgdHJp4buHdSBjaOG7qW5nIMSRYXUgbmfhu7FjIHRow6wgY8OzIDExMCBuZ8aw4budaSBt4bqvYyB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gMzUsNTklKSB2w6AgMjcgbmfGsOG7nWkga2jDtG5nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gOCw3NCUpLg0KDQotIFRyb25nIG5ow7NtIG5o4buvbmcgbmfGsOG7nWkgY8OzIHRyaeG7h3UgY2jhu6luZyBraMOzIHRo4bufIHRow6wgY8OzIDE2MCBuZ8aw4budaSBt4bqvYyB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gNTEsNzclKSB2w6AgMTIgbmfGsOG7nWkga2jDtG5nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgKGNoaeG6v20gMyw4OCUpLg0KDQoqKlLhu6dpIHJvIHTGsMahbmcgxJHhu5FpKioNCg0KYGBge3J9DQpSZWxSaXNrKGxwKQ0KYGBgDQoNCmBgYHtyfQ0KZXBpdGFiIChscCwgbWV0aG9kID0gJ3Jpc2tyYXRpbycsIHJldiA9ICJjIikNCmBgYA0KDQpUaGVvIGvhur90IHF14bqjIHRyw6puIHRhIHRo4bqleSB04bu3IGzhu4cgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgY+G7p2Egbmjhu69uZyBuZ8aw4budaSBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIGPDsyBsacOqbiBxdWFuIMSR4bq/biB0cmnhu4d1IGNo4bupbmcgxJFhdSBuZ+G7sWMgbMOgIDAsMzU0MDA1MiB04bupYyBsw6AgdOG7tyBs4buHIHLhu6dpIHJvIHTGsMahbmcgxJHhu5FpIGPhu6dhIG5o4buvbmcgbmfGsOG7nWkgY8OzIHRyaeG7h3UgY2jhu6luZyDEkWF1IG5n4buxYyBraMO0bmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSDDrXQgaMahbiB04bu3IGzhu4cgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgY8OzIHRyaeG7h3UgY2jhu6luZyDEkWF1IG5n4buxYyBraMO0bmcgbeG6r2MgdW5nIHRoxrAgcGjhu5VpIGtob+G6o25nIDY0LDU5JS4NCg0KKipU4bu3IGzhu4cgY2jDqm5oKioNCg0KYGBge3J9DQplcGl0YWIobHAsIG1ldGhvZCA9ICdvZGRzcmF0aW8nLCByZXY9J2MnKSANCmBgYA0KDQpUaGVvIGvhur90IHF14bqjIHRyw6puIHRhIHRo4bqleSB04bu3IGzhu4cgY2jDqm5oIGzDoCAwLDMwNTU1NTYgdOG7qWMgbMOgIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyB0cmnhu4d1IGNo4bupbmcgxJFhdSBuZ+G7sWMvIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIGPDsyB0cmnhu4d1IGNo4bupbmcgxJFhdSBuZ+G7sWMgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSBjaOG7iSBi4bqxbmcgMzAsNTUlIHThu7cgbOG7hyBuaOG7r25nIG5nxrDhu51pIGPDsyBi4buHbmggdHJp4buHdSBjaOG7qW5nIMSRYXUgbmfhu7FjLyBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBjw7MgdHJp4buHdSBjaOG7qW5nIMSRYXUgbmfhu7FjIGtow7RuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpLg0KDQojIyBUaOG7kW5nIGvDqiBzdXkgZGnhu4VuIGNobyBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oDQoNCktp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCBnaeG7r2EgaGFpIGJp4bq/biDEkeG7i25oIHTDrW5oDQoNCi0gKipCaeG6v24gbHVuZ2NhbmNlciB2w6AgYmnhur9uIGdlbmRlcioqDQoNCkPhurdwIGdp4bqjIHRodXnhur90LyDEkeG7kWkgdGh1eeG6v3QNCg0KICAkSF8wJDogSGFpIGJp4bq/biBsdW5nY2FuY2VyIHbDoCBnZW5kZXIgxJHhu5ljIGzhuq1wDQogIA0KICAkSF8xJDogSGFpIGJp4bq/biBsdW5nY2FuY2VyIHbDoCBnZW5kZXIga2jDtG5nIMSR4buZYyBs4bqtcCANCiAgDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoZGF0YSRsdW5nY2FuY2VyLGRhdGEkZ2VuZGVyKSkNCg0KYGBgDQoNClThuqFpIG3hu6ljIMO9IG5naMSpYSA1JSwgduG7m2kgcC12bHVlID4gMCwwNSB0aMOsIHRhIMSR4bunIGPGoSBz4bufIGNo4bqlcCBuaOG6rW4gJEhfMCQsIHThu6ljIGzDoCB2aeG7h2Mgbmjhu69uZyBuZ8aw4budaSBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIHbDoCBnaeG7m2kgdMOtbmggbMOgIMSR4buZYyBs4bqtcCB24bubaSBuaGF1LiANCg0KLSAqKkJp4bq/biBsdW5nY2FuY2VyIHbDoCBiaeG6v24gYWdlKioNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QvIMSR4buRaSB0aHV54bq/dA0KDQogICRIXzAkOiBIYWkgYmnhur9uIGx1bmdjYW5jZXIgdsOgIGFnZSDEkeG7mWMgbOG6rXANCiAgDQogICRIXzEkOiBIYWkgYmnhur9uIGx1bmdjYW5jZXIgdsOgIGFnZSBraMO0bmcgxJHhu5ljIGzhuq1wIA0KICANCmBgYHtyfQ0KY2hpc3EudGVzdCh0YWJsZShkYXRhJGx1bmdjYW5jZXIsYWdlMSkpDQoNCmBgYA0KDQpU4bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUsIHbhu5tpIHAtdmx1ZSA+IDAsMDUgdGjDrCB0YSDEkeG7pyBjxqEgc+G7nyBjaOG6pXAgbmjhuq1uICRIXzAkLCB04bupYyBsw6Agdmnhu4djIG5o4buvbmcgbmfGsOG7nWkgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSB2w6AgxJHhu5kgdHXhu5VpIGzDoCDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdQ0KDQotICoqQmnhur9uIGx1bmdjYW5jZXIgdsOgIGJp4bq/biBzbW9raW5nKiogDQoNCkPhurdwIGdp4bqjIHRodXnhur90LyDEkeG7kWkgdGh1eeG6v3QNCg0KICAkSF8wJDogSGFpIGJp4bq/biBsdW5nY2FuY2VyIHbDoCBzbW9raW5nIMSR4buZYyBs4bqtcA0KICANCiAgJEhfMSQ6IEhhaSBiaeG6v24gbHVuZ2NhbmNlciB2w6Agc21va2luZyBraMO0bmcgxJHhu5ljIGzhuq1wIA0KICANCmBgYHtyfQ0KY2hpc3EudGVzdCh0YWJsZShkYXRhJGx1bmdjYW5jZXIsZGF0YSRzbW9raW5nKSkNCg0KYGBgDQoNClThuqFpIG3hu6ljIMO9IG5naMSpYSA1JSwgduG7m2kgcC12bHVlID4gMCwwNSB0aMOsIHRhIMSR4bunIGPGoSBz4bufIGNo4bqlcCBuaOG6rW4gJEhfMCQsIHThu6ljIGzDoCB2aeG7h2Mgbmjhu69uZyBuZ8aw4budaSBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIHbDoCBz4butIGThu6VuZyB0aHXhu5FjIGzDoSBsw6AgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUNCg0KLSAqKkJp4bq/biBsdW5nY2FuY2VyIHbDoCBiaeG6v24gd2hlZXppbmcqKg0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dC8gxJHhu5FpIHRodXnhur90DQoNCiAgJEhfMCQ6IEhhaSBiaeG6v24gbHVuZ2NhbmNlciB2w6Agd2hlZXppbmcgxJHhu5ljIGzhuq1wDQogIA0KICAkSF8xJDogSGFpIGJp4bq/biBsdW5nY2FuY2VyIHbDoCB3aGVlemluZyBraMO0bmcgxJHhu5ljIGzhuq1wIA0KICANCmBgYHtyfQ0KY2hpc3EudGVzdCh0YWJsZShkYXRhJGx1bmdjYW5jZXIsZGF0YSR3aGVlemluZykpDQoNCmBgYA0KDQpU4bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUsIHbhu5tpIHAtdmx1ZSA8IDAsMDUgdGjDrCB0YSBjaMawYSDEkeG7pyBjxqEgc+G7nyBjaOG6pXAgbmjhuq1uICRIXzAkLCB04bupYyBsw6Agdmnhu4djIG5o4buvbmcgbmfGsOG7nWkgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSB2w6AgdHJp4buHdSBjaOG7qW5nIGtow7Iga2jDqCBsw6Aga2jDtG5nIMSR4buZYyBs4bqtcCB24bubaSBuaGF1DQoNCi0gKipCaeG6v24gbHVuZ2NhbmNlciB2w6AgYmnhur9uIGNjb3VnaGluZyoqDQoNCkPhurdwIGdp4bqjIHRodXnhur90LyDEkeG7kWkgdGh1eeG6v3QNCg0KICAkSF8wJDogSGFpIGJp4bq/biBsdW5nY2FuY2VyIHbDoCBjb3VnaGluZyDEkeG7mWMgbOG6rXANCiAgDQogICRIXzEkOiBIYWkgYmnhur9uIGx1bmdjYW5jZXIgdsOgIGNvdWdoaW5nIGtow7RuZyDEkeG7mWMgbOG6rXAgDQogIA0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKGRhdGEkbHVuZ2NhbmNlcixkYXRhJGNvdWdoaW5nKSkNCmBgYA0KDQpU4bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUsIHbhu5tpIHAtdmx1ZSA8IDAsMDUgdGjDrCB0YSBjaMawYSDEkeG7pyBjxqEgc+G7nyBjaOG6pXAgbmjhuq1uICRIXzAkLCB04bupYyBsw6Agdmnhu4djIG5o4buvbmcgbmfGsOG7nWkgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSB2w6AgdHJp4buHdSBjaOG7qW5nIGhvIGzDoCBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUNCg0KLSAqKkJp4bq/biBsdW5nY2FuY2VyIHbDoCBiaeG6v24gc2hvcnRicmVhdGgqKg0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dC8gxJHhu5FpIHRodXnhur90DQoNCiAgJEhfMCQ6IEhhaSBiaeG6v24gbHVuZ2NhbmNlciB2w6Agc2hvcnRicmVhdGggxJHhu5ljIGzhuq1wDQogIA0KICAkSF8xJDogSGFpIGJp4bq/biBsdW5nY2FuY2VyIHbDoCBzaG9ydGJyZWF0aCBraMO0bmcgxJHhu5ljIGzhuq1wIA0KICANCmBgYHtyfQ0KY2hpc3EudGVzdCh0YWJsZShkYXRhJGx1bmdjYW5jZXIsZGF0YSRzaG9ydGJyZWF0aCkpDQoNCmBgYA0KDQpU4bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUsIHbhu5tpIHAtdmx1ZSA+IDAsMDUgdGjDrCB0YSDEkeG7pyBjxqEgc+G7nyBjaOG6pXAgbmjhuq1uICRIXzAkLCB04bupYyBsw6Agdmnhu4djIG5o4buvbmcgbmfGsOG7nWkgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSB2w6AgdHJp4buHdSBjaOG7qW5nIGtow7MgdGjhu58gbMOgIMSR4buZYyBs4bqtcCB24bubaSBuaGF1DQoNCi0gKipCaeG6v24gbHVuZ2NhbmNlciB2w6AgYmnhur9uIGNoZXN0cGFpbioqDQoNCkPhurdwIGdp4bqjIHRodXnhur90LyDEkeG7kWkgdGh1eeG6v3QNCg0KICAkSF8wJDogSGFpIGJp4bq/biBsdW5nY2FuY2VyIHbDoCBjaGVzdHBhaW4gxJHhu5ljIGzhuq1wDQogIA0KICAkSF8xJDogSGFpIGJp4bq/biBsdW5nY2FuY2VyIHbDoCBjaGVzdHBhaW4ga2jDtG5nIMSR4buZYyBs4bqtcCANCiAgDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoZGF0YSRsdW5nY2FuY2VyLGRhdGEkY2hlc3RwYWluKSkNCmBgYA0KDQpU4bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUsIHbhu5tpIHAtdmx1ZSA8IDAsMDUgdGjDrCB0YSBjaMawYSDEkeG7pyBjxqEgc+G7nyBjaOG6pXAgbmjhuq1uICRIXzAkLCB04bupYyBsw6Agdmnhu4djIG5o4buvbmcgbmfGsOG7nWkgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSB2w6AgdHJp4buHdSBjaOG7qW5nIMSRYXUgbmfhu7FjIGzDoCBraMO0bmcgxJHhu5ljIGzhuq1wIHbhu5tpIG5oYXUNCg0KIyMgS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hyANCg0KLSAqKsav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgY2hvIGJp4bq/biBsdW5nY2FuY2VyKioNCg0Kxq/hu5tjIGzGsOG7o25nIHThu7cgbOG7hyBz4buRIG5nxrDhu51pIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgY8OzIHBo4bqjaSBsw6AgODcsMzglIGtow7RuZyAobmdoxKlhIGzDoCBjaMO6bmcgdGEga2nhu4NtIMSR4buLbmggZ2nhuqMgdGh1eeG6v3QgJEhfezB9JDogcCA9IDAsODczOCkNCg0KYGBge3J9DQpkIDwtIGRhdGFbZGF0YSRsdW5nY2FuY2VyID09ICJZZXMiLF0NCnByb3AudGVzdChsZW5ndGgoZCRsdW5nY2FuY2VyKSxsZW5ndGgoZGF0YSRsdW5nY2FuY2VyKSxwPSAwLjg3MzgpDQpgYGANCg0KROG7sWEgdsOgbyBr4bq/dCBxdeG6oyB0YSB0aOG6pXkgcC12YWx1ZSA9IDEgPiA1JSwgY2jhuqVwIG5o4bqtbiAkSF97MH0kLiBU4bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUgc+G7kSBuZ8aw4budaSBuZ8aw4budaSBt4bqvYyB1bmcgdGjGsCBwaOG7lWkgbMOgIDg3LDM4JS4NCg0KS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUgY+G7p2EgdOG7tyBs4buHIHPhu5EgbmfGsOG7nWkgbeG6r2MgdW5nIHRoxrAgcGjhu5VpIGzDoCAoMCw4MzIwOTY5OyAwLDkwNjYyOTMpDQoNCiMjIE3DtCBow6xuaCBo4buTaSBxdXkgTG9naXN0aWMNCg0KVGjDtG5nIHF1YSBraeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgZ2nhu69hIGPDoWMgY+G6t3AgYmnhur9uIGLhurFuZyBraeG7g20gxJHhu4tuaCBjaGkgYsOsbmggcGjGsMahbmcsIGvhur90IHF14bqjIGNobyB0aOG6pXkgbmjhu69uZyBuZ8aw4budaSBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpIHBo4bulIHRodeG7mWMgdsOgbyBjw6FjIHRyaeG7h3UgY2jhu6luZyBraMOyIGtow6gsIGhvIHbDoCDEkWF1IG5n4buxYy4gVsOsIHRo4bq/IHTDoWMgZ2nhuqMgc+G6vSB0aeG6v24gaMOgbmggaOG7k2kgcXV5IG3DtCBow6xuaCB24bubaSBiaeG6v24gcGjhu6UgdGh14buZYyBsw6AgbHVuZ2NhbmNlciB2w6AgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIHdoZWV6aW5nLCBjb3VnaGluZyB2w6AgY2hlc3RwYWluLg0KDQojIyMgxq/hu5tjIGzGsOG7o25nIGjDoG0gaOG7k2kgcXV5IGNobyBk4buvIGxp4buHdSBuaOG7iyBwaMOibg0KDQotICoqTcO0IGjDrG5oIGxvZ2l0KioNCg0KROG6oW5nIHThu5VuZyBxdcOhdDoNCg0KJCRsb2dpdCjPgCk9bG9nKM+ALygx4oiSz4ApPc6yXzArzrJfMVhfMSvOsl8yWF8yK+KLryvOsl9rWF9rJCQNCg0KYGBge3J9DQptaGxvZ2l0IDwtIGdsbShkYXRhJGx1bmdjYW5jZXIgfiAgZGF0YSR3aGVlemluZyArIGRhdGEkY291Z2hpbmcgKyBkYXRhJGNoZXN0cGFpbiwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJsb2dpdCIpLCBkYXRhID0gZGF0YSkNCnN1bW1hcnkobWhsb2dpdCkNCg0KYGBgDQoNClbhuq15IG7Dqm4gbcO0IGjDrG5oIGxvZ2l0IMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBuaMawIHNhdToNCg0KJCQgbG9naXQoz4ApID0gbG9nKM+ALzHiiJLPgCkgPSAwLDU0NzIgKyAxLDA5MzEgd2hlZXppbmcgKyAxLDE0MjIgY291Z2hpbmcgKyAwLDk4OCBjaGVzdHBhaW4kJA0KDQoqS2nhu4NtIMSR4buLbmggc+G7sSBwaMO5IGjhu6NwIGPhu6dhIG3DtCBow6xuaCoNCg0KQ+G6t3AgZ2nhuqMgdGh1eeG6v3QvIMSR4buRaSB0aHV54bq/dA0KDQokSF8wJDogTcO0IGjDrG5oIGtow7RuZyBwaMO5IGjhu6NwDQoNCiRIXzEkOiBNw7QgaMOsbmggcGjDuSBo4bujcA0KDQpgYGB7cn0NCmxyX3Rlc3QgPC0gYW5vdmEobWhsb2dpdCwgdGVzdCA9ICJDaGlzcSIpDQpwX3ZhbHVlIDwtIGxyX3Rlc3QkUHJbMl0gDQpwX3ZhbHVlDQpgYGANCg0KS+G6v3QgcXXhuqkgY2hvIHRo4bqleSBQLXZhbHVlIDwgMCwwNSB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQgbsOqbiBtw7QgaMOsbmggTG9naXQgbMOgIHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UuIA0KDQotICoqTcO0IGjDrG5oIHByb2JpdCoqDQoNCkThuqFuZyB04buVbmcgcXXDoXQ6DQoNCiQkcHJvYml0KM+AKT3Opigx4oiSz4ApKT3Osl8wK86yXzFYXzErzrJfMlhfMivii68rzrJfa1hfayQkDQoNCmBgYHtyfQ0KbWhwcm9iaXQgPC0gZ2xtKGRhdGEkbHVuZ2NhbmNlciB+ICBkYXRhJHdoZWV6aW5nICsgZGF0YSRjb3VnaGluZyArIGRhdGEkY2hlc3RwYWluLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpLCBkYXRhID0gZGF0YSkNCnN1bW1hcnkobWhwcm9iaXQpDQpgYGANCg0KVuG6rXkgbsOqbiBtw7QgaMOsbmggcHJvYml0IMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBuaMawIHNhdToNCg0KJCQgcHJvYml0KM+AKSA9IM6mIOKIkiAxKM+AKSAgPSAwLDM5NDMgKyAwLDUzNDggd2hlZXppbmcgKyAwLDU4NTcgY291Z2hpbmcgKyAwLDUxMzcgY2hlc3RwYWluJCQNCg0KKktp4buDbSDEkeG7i25oIHPhu7EgcGjDuSBo4bujcCBj4bunYSBtw7QgaMOsbmgqDQoNCkPhurdwIGdp4bqjIHRodXnhur90LyDEkeG7kWkgdGh1eeG6v3QNCg0KJEhfMCQ6IE3DtCBow6xuaCBraMO0bmcgcGjDuSBo4bujcA0KDQokSF8xJDogTcO0IGjDrG5oIHBow7kgaOG7o3ANCg0KYGBge3J9DQpscl90ZXN0IDwtIGFub3ZhKG1ocHJvYml0LCB0ZXN0ID0gIkNoaXNxIikNCnBfdmFsdWUgPC0gbHJfdGVzdCRQclsyXSANCnBfdmFsdWUNCmBgYA0KDQpL4bq/dCBxdeG6qSBjaG8gdGjhuqV5IFAtdmFsdWUgPCAwLDA1IHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCAkSF8wJCBuw6puIG3DtCBow6xuaCBQcm9iaXQgbMOgIHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UuDQoNCi0gKipNw7QgaMOsbmggY2xvZ2xvZyoqDQoNCiQkY2xvZ2xvZyjPgCk9bG9nKOKIkmxvZygx4oiSz4ApKT3Osl8wK86yXzFYXzErzrJfMlhfMivii68rzrJfa1hfayQkDQoNCmBgYHtyfQ0KbWhjbG9nbG9nIDwtIGdsbShkYXRhJGx1bmdjYW5jZXIgfiAgZGF0YSR3aGVlemluZyArIGRhdGEkY291Z2hpbmcgKyBkYXRhJGNoZXN0cGFpbiwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICJjbG9nbG9nIiksIGRhdGEgPSBkYXRhKQ0Kc3VtbWFyeShtaGNsb2dsb2cpDQpgYGANCg0KVuG6rXkgbsOqbiBtw7QgaMOsbmggcHJvYml0IMSRxrDhu6NjIHjDoWMgxJHhu4tuaCBuaMawIHNhdToNCg0KJCQgY2xvZ2xvZyjPgCkgPSBsb2co4oiSbG9nKDHiiJLPgCkpID0gMCwzODYxIHdoZWV6aW5nICsgMCw0NDUyIGNvdWdoaW5nICsgMCwzODczIGNoZXN0cGFpbiQkDQoNCipLaeG7g20gxJHhu4tuaCBz4buxIHBow7kgaOG7o3AgY+G7p2EgbcO0IGjDrG5oKg0KDQpD4bq3cCBnaeG6oyB0aHV54bq/dC8gxJHhu5FpIHRodXnhur90DQoNCiRIXzAkOiBNw7QgaMOsbmgga2jDtG5nIHBow7kgaOG7o3ANCg0KJEhfMSQ6IE3DtCBow6xuaCBwaMO5IGjhu6NwDQoNCmBgYHtyfQ0KbHJfdGVzdCA8LSBhbm92YShtaGNsb2dsb2csIHRlc3QgPSAiQ2hpc3EiKQ0KcF92YWx1ZSA8LSBscl90ZXN0JFByWzJdIA0KcF92YWx1ZQ0KYGBgDQoNCkvhur90IHF14bqpIGNobyB0aOG6pXkgUC12YWx1ZSA8IDAsMDUgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkIG7Dqm4gbcO0IGjDrG5oIGNsb2dsb2cgbMOgIHBow7kgaOG7o3AgduG7m2kgZOG7ryBsaeG7h3UuDQoNCiMjIyBDw6FjIGNo4buJIHRpw6p1IMSRw6FuaCBnacOhIG3DtCBow6xuaA0KDQotIEFJQyAtIEFrYWlrZSBJbmZvcm1hdGlvbiBDcml0ZXJpb24NCg0KYGBge3J9DQpBSUMobWhsb2dpdCkNCkFJQyhtaHByb2JpdCkNCkFJQyhtaGNsb2dsb2cpDQpgYGANCg0KVOG7qyBjaOG7iSBz4buRIEFJQyBj4bunYSAzIG3DtCBow6xuaCB0csOqbiB0YSB0aOG6pXkgbcO0IGjDrG5oIGxvZ2l0IGPDsyBjaOG7iSBz4buRIEFJQyB0aOG6pXAgbmjhuqV0ICgyMDYsNzAwMikuIFbDrCB0aOG6vyDEkeG7kWkgduG7m2kgdGnDqnUgY2jDrSDEkcOhbmggZ2nDoSBBSUMgdGjDrCBtw7QgaMOsbmggbG9naXQgbMOgIHBow7kgaOG7o3AgxJHhu4MgeGVtIHjDqXQgc+G7sSB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyB54bq/dSB04buRIMSR4bq/biBiaeG6v24gcGjhu6UgdGh14buZYyBsdW5nY2FuY2VyIGjGoW4gbcO0IGjDrG5oIHByb2JpdCB2w6AgY2xvZ2xvZy4NCg0KLSBEZXZpYW5jZQ0KDQpgYGB7cn0NCmRldmlhbmNlKG1obG9naXQpDQpkZXZpYW5jZShtaHByb2JpdCkNCmRldmlhbmNlKG1oY2xvZ2xvZykNCmBgYA0KDQpU4burIGNo4buJIHPhu5EgZGV2aWFuY2UgY+G7p2EgMyBtw7QgaMOsbmggdHLDqm4gdGEgdGjhuqV5IG3DtCBow6xuaCBsb2dpdCBjw7MgY2jhu4kgc+G7kSBkZXZpYW5jZSB0aOG6pXAgbmjhuqV0ICgxOTgsNzAwMikuIFbDrCB0aOG6vyDEkeG7kWkgduG7m2kgdGnDqnUgY2jDrSDEkcOhbmggZ2nDoSBkZXZpZW5jZSB0aMOsIG3DtCBow6xuaCBsb2dpdCBsw6AgcGjDuSBo4bujcCDEkeG7gyB4ZW0geMOpdCBz4buxIHTDoWMgxJHhu5luZyBj4bunYSBjw6FjIHnhur91IHThu5EgxJHhur9uIGJp4bq/biBwaOG7pSB0aHXhu5ljIGx1bmdjYW5jZXIgaMahbiBtw7QgaMOsbmggcHJvYml0IHbDoCBjbG9nbG9nLg0KDQotIEJyaWVyIFNjb3JlDQoNCmBgYHtyfQ0KQnJpZXJTY29yZShtaGxvZ2l0KQ0KQnJpZXJTY29yZShtaHByb2JpdCkNCkJyaWVyU2NvcmUobWhjbG9nbG9nKQ0KYGBgDQoNClThu6sgY2jhu4kgc+G7kSBCcmllclNjb3JlIGPhu6dhIDMgbcO0IGjDrG5oIHRyw6puIHRhIHRo4bqleSBtw7QgaMOsbmggbG9naXQgY8OzIGNo4buJIHPhu5EgQnJpZXJTY29yZSB0aOG6pXAgbmjhuqV0ICgwLDA5NDM0NjY5KS4gVsOsIHRo4bq/IMSR4buRaSB24bubaSB0acOqdSBjaMOtIMSRw6FuaCBnacOhIEJyaWVyU2NvcmUgdGjDrCBtw7QgaMOsbmggbG9naXQgbMOgIHBow7kgaOG7o3AgxJHhu4MgeGVtIHjDqXQgc+G7sSB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyB54bq/dSB04buRIMSR4bq/biBiaeG6v24gcGjhu6UgdGh14buZYyBsdW5nY2FuY2VyIGjGoW4gbcO0IGjDrG5oIHByb2JpdCB2w6AgY2xvZ2xvZy4NCg0KKipUaMO0bmcgcXVhIGPDoWMgdGnDqnUgY2jDrSDEkcOhbmggZ2nDoSBtw7QgaMOsbmggQUlDLCBEZXZpYW5jZSB2w6AgQnJpZXJTY29yZSB0aMOsIG3DtCBow6xuaCBwaMO5IGjhu6NwIG5o4bqldCDEkeG7gyB4ZW0geMOpdCB0w6FjIMSR4buZbmcgY+G7p2EgY8OhYyB54bq/dSB04buRIHdoZWV6aW5nLCBjb3VnaGluZywgY2hlc3RwYWluIHThu5tpIGJp4bq/biBwaOG7pSB0aHXhu5ljIGx1bmdjYW5jZXIgbMOgIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXQqKg0KDQojIyMgS+G6v3QgcXXhuqMgbcO0IGjDrG5oIHNhdSBraGkgbOG7sWEgY2jhu41uDQoNCmBgYHtyfQ0Kc3VtbWFyeShtaGxvZ2l0KQ0KYGBgDQoNCioqR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6oyBj4bunYSBtw7QgaMOsbmggTG9naXQqKg0KDQotIFRyaeG7h3UgY2jhu6luZyB0aOG7nyBraMOyIGtow6ggY8OzIHTDoWMgxJHhu5luZyDEkeG6v24ga2jhuqMgbsSDbmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSB24bubaSBo4buHIHPhu5EgzrIgPSAxLDA5MzEuIFbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgdHJp4buHdSBjaOG7qW5nIHRo4bufIGtow7Iga2jDqCBjw7MgdMOhYyDEkeG7mW5nIGPDuW5nIGNoaeG7gXUgxJHhur9uIGto4bqjIG7Eg25nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkuDQoNCi0gVHJp4buHdSBjaOG7qW5nIGhvIGPDsyB0w6FjIMSR4buZbmcgxJHhur9uIGto4bqjIG7Eg25nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkgduG7m2kgaOG7hyBz4buRIM6yID0gMSwxNDIyLiBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIHRyaeG7h3UgY2jhu6luZyBobyBjw7MgdMOhYyDEkeG7mW5nIGPDuW5nIGNoaeG7gXUgxJHhur9uIGto4bqjIG7Eg25nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkuDQoNCi0gVHJp4buHdSBjaOG7qW5nIMSRYXUgdOG7qWMgbmfGsGMgY8OzIHTDoWMgxJHhu5luZyDEkeG6v24ga2jhuqMgbsSDbmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaSB24bubaSBo4buHIHPhu5EgzrIgPSAwLDk4OC4gVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCB0cmnhu4d1IGNo4bupbmcgxJFhdSB04bupYyBuZ+G7sWMgY8OzIHTDoWMgxJHhu5luZyBjw7luZyBjaGnhu4F1IMSR4bq/biBraOG6oyBuxINuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpLg0KDQojIEvhur90IGx14bqtbiB2w6Aga2nhur9uIG5naOG7iyANCg0KIyMgS+G6v3QgbHXhuq1uDQoNClVuZyB0aMawIHBo4buVaSBsw6AgYuG7h25oIGzDvSDDoWMgdMOtbmggcGjhu5UgYmnhur9uIG5o4bqldCwgY2hp4bq/bSBraG/huqNuZyBt4buZdCBwaOG6p24gYmEgc+G7kSBjYSB04butIHZvbmcgZG8gdW5nIHRoxrAgdsOsIHRo4bq/IHZp4buHYyB0w6xtIGhp4buDdSB24buBIGPEg24gYuG7h25oIG7DoHkgxJHhu4MgdGhlbyBkw7VpIHPhu6ljIGto4buPZSBj4bunYSBi4bqjbiB0aMOibiBsw6AgdGjhuq10IHPhu7EgY+G6p24gdGhp4bq/dC4gUXVhIHZp4buHYyBuZ2hpw6puIGPhu6l1IG3DtCBow6xuaCBo4buTaSBxdXkgdGjDtG5nIHF1YSAzIG3DtCBow6xuaCBMb2dpdCwgUHJvYml0IHbDoCBDbG9nbG9nIHRow6wgbcO0IGjDrG5oIExvZ2l0IGzDoCBtw7QgaMOsbmggxJHGsOG7o2MgbOG7sWEgY2jhu41uIGzDoCBwaMO5IGjhu6NwIG5o4bqldCDEkeG7gyB4ZW0geMOpdCBz4buxIHTDoWMgxJHhu5luZyBj4bunYSBjw6FjIHnhur91IHThu5EgxJHhur9uIGto4bqjIG7Eg25nIG3huq9jIGLhu4duaCB1bmcgdGjGsCBwaOG7lWkuIA0KDQpL4bq/dCBxdeG6oyBuZ2hpw6puIGPhu6l1IGNobyB0aOG6pXkgdHJp4buHdSBjaOG7qW5nIHRo4bufIGtow7Iga2jDqCwgdHJp4buHdSBjaOG7qW5nIGhvIHbDoCB0cmnhu4d1IGNo4bupbmcgxJFhdSB04bupYyBuZ+G7sWMgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyBt4bqvYyBi4buHbmggdW5nIHRoxrAgcGjhu5VpLiBCw6puIGPhuqFuaCDEkcOzIHRow6wgY8OhYyB54bq/dSB04buRIGPDsm4gbOG6oWkgZ+G7k20gZ2nhu5tpIHTDrW5oLCDEkeG7mSB0deG7lWksIGjDunQgdGh14buRYywgYuG7h25oIG3Do24gdMOtbmgsIHRyaeG7h3UgY2jhu6luZyBraMOzIHRo4bufIGzhuqFpIGtow7RuZyBjw7MgbeG7kWkgcXVhbiBo4buHIG7DoG8gduG7m2kga2jhuqMgbsSDbmcgbeG6r2MgYuG7h25oIHVuZyB0aMawIHBo4buVaS4NCg0KIyMgS2nhur9uIG5naOG7iw0KDQpU4burIGvhur90IHF14bqjIHBow6JuIHTDrWNoIHRyw6puIHRow6wgdMOhYyBnaeG6oyB4aW4gxJHhu4EgeHXhuqV0IG3hu5l0IHPhu5Ega2nhur9uIG5naOG7iyBuaOG6sW0gZ2nDunAgY2hvIG3hu41pIG5nxrDhu51pIGPDsyBuaOG7r25nIGJp4buHbiBwaMOhcCBwaMOybmcgdHLDoW5oIGPFqW5nIG5oxrAgbMOgIGdp4buvIGfDrG4gc+G7qWMga2jhu49lIGNobyBi4bqjbiB0aMOibi4NCg0KICBD4bqpbiB0cuG7jW5nIHRyxrDhu5tjIHPhu7Egw7Qgbmhp4buFbSBraMO0bmcga2jDrSwgaMOjeSB0aMaw4budbmcgeHV5w6puIHbhu4cgc2luaCBuaMOgIGPhu61hLCBk4buNbiBk4bq5cCB0aMO0bmcgdGhvw6FuZyBtw7RpIHRyxrDhu51uZyBz4buRbmcuIFRy4buTbmcgdGjDqm0gbmhp4buBdSBjw6J5IHhhbmggdOG6oWkgbmjDoCBob+G6t2MgbsahaSBsw6BtIHZp4buHYy4NCg0KICBEdXkgdHJpIGzhu5FpIHPhu5FuZyBsw6BuaCBt4bqhbmgsIGPDsyBt4buZdCBjaOG6vyDEkeG7mSDEg24gdeG7kW5nIHbhu5tpIG5oaeG7gXUgbG/huqFpIHRyw6FpIGPDonkgdsOgIHJhdSBxdeG6oyBz4bq9IGzDoG0gdMSDbmcgc+G7qWMgxJHhu4Ega2jDoW5nIGNobyBjxqEgdGjhu4MuIFZp4buHYyBuw6B5IHPhur0gZ2nDunAgcGjDsm5nIG5n4burYSwgZ2nhuqNtIHRoaeG7g3UgY8OhYyBuZ3V5IGPGoSBj4bunYSDGsG5nIHRoxrAgdMOhaSBwaMOhdCB2w6AgbeG7mXQgc+G7kSBi4buHbmggbcOjbiB0w61uaCBraMOhYyB24bqrbiBjw7JuIHRyb25nIGdpYWkgxJFv4bqhbiDEkeG6p3UuVOG6rXAgdGjhu4MgZOG7pWMgdGjGsOG7nW5nIHh1ecOqbiBnacO6cCB0xINuZyBjxrDhu51uZyBraOG6oyBuxINuZyBjaOG7kW5nIHRy4bqjIHThu7Egbmhpw6puIGPhu6dhIGPGoSB0aOG7gyDEkeG7kWkgduG7m2kgbmjhu69uZyB54bq/dSB04buRIMSR4buZYyBo4bqhaS4gDQoNCiAgVOG6p20gc2/DoXQgdW5nIHRoxrAgcGjhu5VpIMSR4buLbmgga+G7sywgxJHhu4Mgw70gbmjhu69uZyBk4bqldSBoaeG7h3UgY+G7p2EgdW5nIHRoxrAgcGjhu5VpIHbDrCBt4buXaSBuZ8aw4budaSBz4bq9IGPDsyBuaOG7r25nIGThuqV1IGhp4buHdSB24buBIHVuZyB0aMawIHBo4buVaSBraMOhYyBuaGF1LiBN4buZdCBz4buRIGLhu4duaCBuaMOibiBjw7MgZOG6pXUgaGnhu4d1IHLDtSByw6BuZyBsacOqbiBxdWFuIMSR4bq/biBwaOG7lWksIG3hu5l0IHPhu5Ega2jDoWMgdGjDrCBraMO0bmcgY8OzIGThuqV1IGhp4buHdSBjaG8gxJHhur9uIGtoaSB1bmcgdGjGsCBkaSBjxINuIHNhbmcgY8OhYyBi4buZIHBo4bqtbiBraMOhYyBj4bunYSBjxqEgdGjhu4MuIEjhuqd1IGjhur90IG5o4buvbmcgbmfGsOG7nWkgYuG7iyB1bmcgdGjGsCBwaOG7lWkga2jDtG5nIGPDsyB0cmnhu4d1IGNo4bupbmcgY2hvIMSR4bq/biBraGkgYuG7h25oIHRp4bq/biB0cmnhu4NuLiBDw6FjIHRyaeG7h3UgY2jhu6luZyB1bmcgdGjGsCBwaOG7lWkgY8OzIHRo4buDIGJhbyBn4buTbTogaG8gdHJvbmcgbeG7mXQgdGjhu51pIGdpYW4gZMOgaSBtw6Aga2jDtG5nIGdp4bqjbSwgaG8gcmEgbcOhdSwga2jDsyB0aOG7nywga2jDsiBraMOoLCBj4bqjbSB0aOG6pXkgbeG7h3QgbeG7j2kgbeG7jWkgbMO6YyBob+G6t2MgZ2nhuqNtIGPDom4gbcOgIGtow7RuZyByw7Ugbmd1ecOqbiBuaMOibiwuLi4gTeG7mXQgc+G7kSB0aGF5IMSR4buVaSBraMOhYyBjw7MgdGjhu4MgeOG6o3kgcmEgduG7m2kgdW5nIHRoxrAgcGjhu5VpIGPDsyB0aOG7gyBiYW8gZ+G7k20gY8OhYyDEkeG7o3QgdmnDqm0gcGjhu5VpIGzhurdwIMSRaSBs4bq3cCBs4bqhaSB2w6AgaOG6oWNoIGLhuqFjaCBodXnhur90IGLhu4sgc8awbmcgaG/hurdjIG3hu5l0IHPhu5EgdHJp4buHdSBjaOG7qW5nIGPDsyB0aOG7gyB44bqjeSByYSB24bubaSBjw6FjIGLhu4duaCBraMOhYy4gRG8gxJHDsyBraGkgY+G6o20gbmjhuq1uIMSRxrDhu6NjIGPGoSB0aOG7gyBtw6xuaCBjw7Mgbmjhu69uZyB0cmnhu4d1IGNo4bupbmcgbsOgeSB0aMOsIGjDo3kgdGnhur9uIGjDoG5oIGtp4buDbSB0cmEgc+G7qWMga2jhu49lIHbDoCB0w6xtIHJhIG5ndXnDqm4gbmjDom4gY+G7pSB0aOG7gy4NCg0KIyMgSOG6oW4gY2jhur8NCg0KVHLDqm4gdGjhu7FjIHThur8gY8OzIHLhuqV0IG5oaeG7gXUgeeG6v3UgdOG7kSBraMOhYyDhuqNuaCBoxrDhu59uZyDEkeG6v24ga2jhuqMgbsSDbmcgbeG6r2MgdW5nIHRoxrAgcGjhu5VpIG5oxrAgdHJp4buHdSBjaOG7qW5nIGRhIHbDoG5nLCB0cuG6oW5nIHRow6FpIGxvIGzhuq9uZywgbeG7h3QgbeG7j2ksIHRyaeG7h3UgY2jhu6luZyBk4buLIOG7qW5nLCBz4butIGThu6VuZyByxrDhu6N1IGJpYSwgdMOsbmggdHLhuqFuZyBraMOzIG514buRdCwgZ2nhuqNtIGPDom4ga2jDtG5nIHLDtSBuZ3V5w6puIG5ow6JuLC4uLm5oxrBuZyB0w6FjIGdp4bqjIGNo4buJIGNo4buNbiByYSA4IHnhur91IHThu5EgdMOhYyDEkeG7mW5nIMSR4bq/IGto4bqjIG7Eg25nIG3huq9jIHVuZyB0aMawIHBo4buVaSBiYW8gZ+G7k20gxJHhu5kgdHXhu5VpLCBnaeG7m2kgdMOtbmgsIGjDunQgdGh14buRYywgYuG7h25oIG3Do24gdMOtbmgsIGtow7Iga2jDqCwgaG8sIGtow7MgdGjhu58sIMSRYXUgbmfhu7FjLiBWw6wgdGjhur8gbcOgIGvhur90IGx14bqtbiBtw7QgaMOsbmggc+G6vSBraMOhYyBzbyB24bubaSB0aOG7sWMgdOG6vyDEkcO0aSBjaMO6dC4NCg0KIyBUw6BpIGxp4buHdSB0aGFtIGto4bqjbw0KDQpbMV0gCVQuIEsuIFRoYW5oLCBULiBNLiBUxrDhu51uZyAmIFYuIEEuIEwuIER1eSwgR2nDoW8gdHLDrG5oIFBow6JuIHTDrWNoIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmgsIDIwMjIuIA0KDQpbMl0gCSJE4bqldSBoaeG7h3UgY+G6o25oIGLDoW8gdW5nIHRoxrAgcGjhu5VpLCIgQuG7h25oIHZp4buHbiBLIC0gVmlldG5hbSBOYXRpb25hbCBDZW5jZXIgSG9zcGl0YWwsIDIwMjMuIA0KDQpbM10gCSJDw6FjIG5ndXnDqm4gbmjDom4gZ8OieSBVbmcgdGjGsCBwaOG7lWkgbcOgIGLhuqFuIG7Dqm4gYmnhur90LCIgSG9hbk15c2FpZ29uLCAwOCAwNyAyMDIyLiANCg0KWzRdIAkiTmjDs20gdHXhu5VpIG7DoG8gY8OzIG5ndXkgY8ahIG3huq9jIHVuZyB0aMawIHBo4buVaSBjYW8sIiBWTkV4cHJlc3MsIDEzIDA1IDIwMjIuIA0KDQpbNV0gCSJN4buRaSBsacOqbiBo4buHIGdp4buvYSB1bmcgdGjGsCBwaOG7lWkgdsOgIGLhu4duaCBwaOG7lWkgdOG6r2Mgbmdo4bq9biBt4bqhbiB0w61uaCBDT1BELCIgVmlubWVjLiANCg0KWzZdIAlWaeG7h3QgTmFtLCAiVGh14buRYyBsw6Eg4oCTIG5ndXnDqm4gbmjDom4gY2jDrW5oIGThuqtuIMSR4bq/biB1bmcgdGjGsCBwaOG7lWksIiBT4bufIHkgdOG6vyBIw6AgTuG7mWksIDA2IDAyIDIwMjMuIA0KDQoNCg0KDQoNCg0KDQoNCg0K