1 PHẦN 1: TÌM HIểU VÀ CHUẨN BỊ DỮ LIỆU

Đọc và làm quen với dữ liệu

# Đọc file
library("csv")
## Warning: package 'csv' was built under R version 4.3.3
data <- read.csv("D:/Downloads/Supermarket Transactions.csv", header = T)

# Hiển thị cấu trúc dữ liệu
str(data)
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : chr  "F" "M" "F" "M" ...
##  $ MaritalStatus    : chr  "S" "M" "M" "M" ...
##  $ Homeowner        : chr  "Y" "Y" "N" "Y" ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ AnnualIncome     : chr  "$30K - $50K" "$70K - $90K" "$50K - $70K" "$30K - $50K" ...
##  $ City             : chr  "Los Angeles" "Los Angeles" "Bremerton" "Portland" ...
##  $ StateorProvince  : chr  "CA" "CA" "WA" "OR" ...
##  $ Country          : chr  "USA" "USA" "USA" "USA" ...
##  $ ProductFamily    : chr  "Food" "Food" "Food" "Food" ...
##  $ ProductDepartment: chr  "Snack Foods" "Produce" "Snack Foods" "Snacks" ...
##  $ ProductCategory  : chr  "Snack Foods" "Vegetables" "Snack Foods" "Candy" ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...
# Hiển thị vài dòng đầu và cuối
head(data)
##   X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 1 1   2007-12-18       7223      F             S         Y        2
## 2 2   2007-12-20       7841      M             M         Y        5
## 3 3   2007-12-21       8374      F             M         N        2
## 4 4   2007-12-21       9619      M             M         Y        3
## 5 5   2007-12-22       1900      F             S         Y        3
## 6 6   2007-12-22       6696      F             M         Y        3
##    AnnualIncome          City StateorProvince Country ProductFamily
## 1   $30K - $50K   Los Angeles              CA     USA          Food
## 2   $70K - $90K   Los Angeles              CA     USA          Food
## 3   $50K - $70K     Bremerton              WA     USA          Food
## 4   $30K - $50K      Portland              OR     USA          Food
## 5 $130K - $150K Beverly Hills              CA     USA         Drink
## 6   $10K - $30K Beverly Hills              CA     USA          Food
##   ProductDepartment      ProductCategory UnitsSold Revenue
## 1       Snack Foods          Snack Foods         5   27.38
## 2           Produce           Vegetables         5   14.90
## 3       Snack Foods          Snack Foods         3    5.52
## 4            Snacks                Candy         4    4.44
## 5         Beverages Carbonated Beverages         4   14.00
## 6              Deli          Side Dishes         3    4.37
tail(data)
##           X PurchaseDate CustomerID Gender MaritalStatus Homeowner Children
## 14054 14054   2009-12-29       2032      F             M         N        3
## 14055 14055   2009-12-29       9102      F             M         Y        2
## 14056 14056   2009-12-29       4822      F             M         Y        3
## 14057 14057   2009-12-31        250      M             S         Y        1
## 14058 14058   2009-12-31       6153      F             S         N        4
## 14059 14059   2009-12-31       3656      M             S         N        3
##       AnnualIncome        City StateorProvince Country  ProductFamily
## 14054  $10K - $30K      Yakima              WA     USA Non-Consumable
## 14055  $10K - $30K   Bremerton              WA     USA           Food
## 14056  $10K - $30K Walla Walla              WA     USA           Food
## 14057  $30K - $50K    Portland              OR     USA          Drink
## 14058  $50K - $70K     Spokane              WA     USA          Drink
## 14059  $50K - $70K    Portland              OR     USA Non-Consumable
##       ProductDepartment      ProductCategory UnitsSold Revenue
## 14054         Household       Paper Products         5   14.50
## 14055      Baking Goods         Baking Goods         3    9.64
## 14056      Frozen Foods           Vegetables         3    7.45
## 14057         Beverages Pure Juice Beverages         4    3.24
## 14058             Dairy                Dairy         2    4.00
## 14059         Household           Electrical         5   25.53
# Chuyển các biến định tính phù hợp sang factor
factor <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
                    "City", "StateorProvince", "Country",
                    "ProductFamily", "ProductDepartment", "ProductCategory")

# Kiểm tra biến nào tồn tại trong data
factor <- intersect(factor, names(data))

# Chuyển sang factor
data[factor] <- lapply(data[factor], as.factor)

# Kiểm tra lại cấu trúc
str(data)
## 'data.frame':    14059 obs. of  16 variables:
##  $ X                : int  1 2 3 4 5 6 7 8 9 10 ...
##  $ PurchaseDate     : chr  "2007-12-18" "2007-12-20" "2007-12-21" "2007-12-21" ...
##  $ CustomerID       : int  7223 7841 8374 9619 1900 6696 9673 354 1293 7938 ...
##  $ Gender           : Factor w/ 2 levels "F","M": 1 2 1 2 1 1 2 1 2 2 ...
##  $ MaritalStatus    : Factor w/ 2 levels "M","S": 2 1 1 1 2 1 2 1 1 2 ...
##  $ Homeowner        : Factor w/ 2 levels "N","Y": 2 2 1 2 2 2 2 2 2 1 ...
##  $ Children         : int  2 5 2 3 3 3 2 2 3 1 ...
##  $ AnnualIncome     : Factor w/ 8 levels "$10K - $30K",..: 5 7 6 5 3 1 5 4 1 6 ...
##  $ City             : Factor w/ 23 levels "Acapulco","Bellingham",..: 8 8 4 12 3 3 13 23 2 15 ...
##  $ StateorProvince  : Factor w/ 10 levels "BC","CA","DF",..: 2 2 8 6 2 2 6 8 8 2 ...
##  $ Country          : Factor w/ 3 levels "Canada","Mexico",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ ProductFamily    : Factor w/ 3 levels "Drink","Food",..: 2 2 2 2 1 2 2 2 3 3 ...
##  $ ProductDepartment: Factor w/ 22 levels "Alcoholic Beverages",..: 20 18 20 21 4 11 13 6 15 14 ...
##  $ ProductCategory  : Factor w/ 45 levels "Baking Goods",..: 42 45 42 7 15 41 5 13 16 35 ...
##  $ UnitsSold        : int  5 5 3 4 4 3 4 6 1 2 ...
##  $ Revenue          : num  27.38 14.9 5.52 4.44 14 ...

Giải thích các biến

Bộ dữ liệu Supermarket Transactions bao gồm thông tin giao dịch của khách hàng tại siêu thị, với 14,059 quan sát16 biến.

Dữ liệu chứa các thông tin đa dạng như:

  • Thông tin khách hàng: giới tính, tình trạng hôn nhân, thu nhập, con cái, quyền sở hữu nhà

  • Thông tin địa lý: thành phố, bang, quốc gia

  • Thông tin sản phẩm: nhóm sản phẩm, loại, doanh thu, số lượng bán

Dưới đây là mô tả chi tiết các biến có trong bộ dữ liệu:

Tên Biến Ý Nghĩa
PurchaseDate Ngày giao dịch mua hàng diễn ra (định dạng ngày/tháng/năm).
CustomerID Mã định danh duy nhất cho mỗi khách hàng.
Gender Giới tính của khách hàng: M (Nam), F (Nữ).
MaritalStatus Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn).
Homeowner Tình trạng sở hữu nhà: Y (Có), N (Không).
Children Số lượng con cái của khách hàng.
AnnualIncome Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K).
City Thành phố nơi khách hàng thực hiện giao dịch.
StateorProvince Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon).
Country Quốc gia.
ProductFamily Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng).
ProductDepartment Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v.
ProductCategory Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine.
UnitsSold Số lượng đơn vị sản phẩm đã bán trong giao dịch đó.
Revenue Doanh thu từ giao dịch (tính theo USD).

Trước khi tiến hành thống kê mô tả các biến trong bộ dữ liệu, ta tiến hành phân loại dữ liệu thành 2 nhóm bao gồm: dữ liệu định tính và dữ liệu định lượng như sau:

Phân loại biến theo kiểu dữ liệu:

Dữ liệu Định tính:

Tên Biến Ý Nghĩa
Gender Giới tính của khách hàng: M (Nam), F (Nữ).
MaritalStatus Tình trạng hôn nhân: S (Độc thân), M (Đã kết hôn).
Homeowner Tình trạng sở hữu nhà: Y (Có), N (Không).
AnnualIncome Mức thu nhập hàng năm theo khoảng (Ví dụ: $30K - $50K).
City Thành phố nơi khách hàng thực hiện giao dịch.
StateorProvince Bang hoặc tỉnh (ví dụ: CA cho California, OR cho Oregon).
Country Quốc gia.
ProductFamily Nhóm sản phẩm chính: Food (Thực phẩm), Drink (Đồ uống), Non-Consumable (Không tiêu dùng).
ProductDepartment Bộ phận sản phẩm như Snack Foods, Frozen Foods, v.v.
ProductCategory Danh mục sản phẩm cụ thể hơn, ví dụ: Candy, Beer and Wine.

Dữ liệu Định lượng:

Tên Biến Ý Nghĩa
Children Số lượng con cái của khách hàng.
UnitsSold Số lượng đơn vị sản phẩm đã bán trong giao dịch đó.
Revenue Doanh thu từ giao dịch (tính theo USD).

Kiểm tra giá trị NA

Trước khi tiến hành phân tích dữ liệu, chúng ta cần kiểm tra và xử lý các giá trị bị thiếu nhằm đảm bảo độ chính xác và tính toàn vẹn của kết quả phân tích.

sum(is.na(data))
## [1] 0
which(is.na(data))
## integer(0)

Cả hai lệnh đều trả về kết quả cho thấy không tồn tại giá trị thiếu:

  • sum(is.na(data)) trả về 0, nghĩa là không có giá trị NA nào.

  • which(is.na(data)) trả về integer(0), nghĩa là không có vị trí nào chứa NA.

Điều này cho phép chúng ta tiếp tục các bước xử lý dữ liệu và phân tích mà không cần thực hiện bước xử lý giá trị thiếu.

Tạo bộ dữ liệu chỉ có biến định tính

dataDT <- c("Gender", "MaritalStatus", "Homeowner", "AnnualIncome", 
            "City", "StateorProvince", "Country", 
            "ProductFamily", "ProductDepartment", "ProductCategory")
dataDT <- data[,dataDT] 
str(dataDT)
## 'data.frame':    14059 obs. of  10 variables:
##  $ Gender           : Factor w/ 2 levels "F","M": 1 2 1 2 1 1 2 1 2 2 ...
##  $ MaritalStatus    : Factor w/ 2 levels "M","S": 2 1 1 1 2 1 2 1 1 2 ...
##  $ Homeowner        : Factor w/ 2 levels "N","Y": 2 2 1 2 2 2 2 2 2 1 ...
##  $ AnnualIncome     : Factor w/ 8 levels "$10K - $30K",..: 5 7 6 5 3 1 5 4 1 6 ...
##  $ City             : Factor w/ 23 levels "Acapulco","Bellingham",..: 8 8 4 12 3 3 13 23 2 15 ...
##  $ StateorProvince  : Factor w/ 10 levels "BC","CA","DF",..: 2 2 8 6 2 2 6 8 8 2 ...
##  $ Country          : Factor w/ 3 levels "Canada","Mexico",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ ProductFamily    : Factor w/ 3 levels "Drink","Food",..: 2 2 2 2 1 2 2 2 3 3 ...
##  $ ProductDepartment: Factor w/ 22 levels "Alcoholic Beverages",..: 20 18 20 21 4 11 13 6 15 14 ...
##  $ ProductCategory  : Factor w/ 45 levels "Baking Goods",..: 42 45 42 7 15 41 5 13 16 35 ...

2 PHẦN 2: PHÂN TÍCH MÔ TẢ MỘT BIẾN ĐỊNH TÍNH

2.1 Biến Gender

Lập bảng tần số và tần suất

#Bảng tần số
table(dataDT$Gender)
## 
##    F    M 
## 7170 6889
#Bảng tần suất
table(dataDT$Gender)/sum(table(dataDT$Gender))
## 
##         F         M 
## 0.5099936 0.4900064

Vẽ biểu đồ cột

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Tạo bảng tần số
freq1 <- table(dataDT$Gender)

# Chuyển thành data frame
Gender <- as.data.frame(freq1)
colnames(Gender) <- c("Gender", "Count")

# Vẽ biểu đồ cột
ggplot(Gender, aes(x = Gender, y = Count, fill = Gender)) +
  geom_col(color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") +
  scale_fill_manual(values = c("M" = "#ADD8E6", "F" = "#CD5C5C")) +
  labs(
    title = "Gender")+
  theme_minimal()+
  theme(plot.title = element_text(hjust = 0.5)) 

Vẽ biểu đồ tròn

# Vẽ biểu đồ tròn
pie(freq1,
    labels = paste0(names(freq1), " (", round(100 * freq1 / sum(freq1), 1), "%)"),
    col = c("#CD5C5C", "#ADD8E6"),  
    main = "Gender")

Nhận xét:

  • Dựa vào bảng tần số và tần suất, có thể thấy rằng trong bộ dữ liệu hiện tại có 7170 khách hàng là nữ và 6889 khách hàng là nam.
    Tỷ lệ tương ứng là khoảng 51% nữ và 49% nam.

  • Kết quả này cho thấy giới tính nữ chiếm tỷ trọng nhỉnh hơn trong tập khách hàng được khảo sát (dựa trên biểu đồ tròn).Đồng thời, biểu đồ cột minh họa trực quan cho thấy sự chênh lệch không quá lớn giữa hai giới, nhưng nữ vẫn chiếm ưu thế nhẹ về mặt số lượng.

2.2 Biến MaritalStatus

Lập bảng tần số và tần suất

#Bảng tần số
table(dataDT$MaritalStatus)
## 
##    M    S 
## 6866 7193
#Bảng tần suất
table(dataDT$MaritalStatus)/sum(table(dataDT$MaritalStatus))
## 
##         M         S 
## 0.4883704 0.5116296

Vẽ biểu đồ cột

# Tạo bảng tần số
freq2 <- table(dataDT$MaritalStatus)

# Chuyển thành data frame
MaritalStatus <- as.data.frame(freq2)
colnames(MaritalStatus) <- c("MaritalStatus", "Count")

# Vẽ biểu đồ cột
ggplot(MaritalStatus, aes(x = MaritalStatus, y = Count, fill = MaritalStatus)) +
  geom_col(color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") +
  scale_fill_manual(values = c("S" = "#FFD700", "M" = "#DCDCDC")) +
  labs(
    title = "MaritalStatus"
  ) +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Vẽ biểu đồ tròn

# Vẽ biểu đồ tròn
pie(freq2,
    labels = paste0(names(freq2), " (", round(100 * freq2 / sum(freq2), 1), "%)"),
    col = c("#FFD700", "#DCDCDC"),  
    main = "MaritalStatus")

Nhận xét:

  • Dựa vào bảng tần số và tần suất, ta thấy trong tập dữ liệu có 7193 khách hàng thuộc nhóm độc thân (Single) và 6866 khách hàng thuộc nhóm đã kết hôn (Married).
    Tỷ lệ tương ứng là 51.16% độc thân và 48.84% đã kết hôn.

  • Biểu đồ cột minh họa rõ ràng rằng số lượng khách hàng độc thân nhỉnh hơn một chút so với nhóm đã kết hôn. Biểu đồ tròn cũng cho thấy sự phân bố khá cân bằng giữa hai nhóm tình trạng hôn nhân.
    Điều này cho thấy dữ liệu có tính đại diện tốt cho cả hai nhóm, tránh được tình trạng thiên lệch mẫu trong nghiên cứu.

2.3 Biến Homeowner

Lập bảng tần số và tần suất

#Bảng tần số
table(dataDT$Homeowner)
## 
##    N    Y 
## 5615 8444
#Bảng tần suất
table(dataDT$Homeowner)/sum(table(dataDT$Homeowner))
## 
##         N         Y 
## 0.3993883 0.6006117

Vẽ biểu đồ cột

# Tạo bảng tần số
freq3 <- table(dataDT$Homeowner)

# Chuyển thành data frame
homeowner <- as.data.frame(freq3)
colnames(homeowner) <- c("Homeowner", "Count")

# Vẽ biểu đồ cột
ggplot(homeowner, aes(x = Homeowner, y = Count, fill = Homeowner)) +
  geom_col(color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") +
  scale_fill_manual(values = c("N" = "#FDB462", "Y" = "#E6E6FA")) +
  labs(
    title = "Homeowner") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5))

Vẽ biểu đồ tròn

# Vẽ biểu đồ tròn
pie(freq3,
    labels = paste0(names(freq3), " (", round(100 * freq3 / sum(freq3), 1), "%)"),
    col = c("#FDB462", "#E6E6FA"),  # màu tùy chọn
    main = "Homeowner")

Nhận xét:

  • Dựa trên bảng tần số, có 5615 khách hàng chưa có nhà và 8444 khách hàng đã có nhà. Xét về tỷ lệ, nhóm chưa có nhà chiếm khoảng 39.94%, trong khi nhóm đã có nhà chiếm 60.06%.

  • Biểu đồ cột thể hiện rõ rằng phần lớn khách hàng trong dữ liệu thuộc nhóm đã có nhà, cho thấy khả năng tài chính tương đối ổn định hoặc thuộc nhóm khách hàng trung niên trở lên. Biểu đồ tròn bổ sung góc nhìn trực quan, cho thấy sự chênh lệch rõ rệt giữa hai nhóm, tuy chưa đến mức áp đảo tuyệt đối.

2.4 Biến AnnualIncome

Lập bảng tần số và tần suất

#Bảng tần số
table(dataDT$AnnualIncome)
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##          3090           643           760           273          4601 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##          2370          1709           613
#Bảng tần suất
table(dataDT$AnnualIncome)/sum(table(dataDT$AnnualIncome))
## 
##   $10K - $30K $110K - $130K $130K - $150K       $150K +   $30K - $50K 
##    0.21978804    0.04573583    0.05405790    0.01941817    0.32726367 
##   $50K - $70K   $70K - $90K  $90K - $110K 
##    0.16857529    0.12155914    0.04360196

Vẽ đồ thị

# Tạo bảng tần số
freq4 <- table(dataDT$AnnualIncome)

# Chuyển thành data frame
AnnualIncome <- as.data.frame(freq4)
colnames(AnnualIncome) <- c("AnnualIncome", "Count")

# Vẽ biểu đồ cột
ggplot(AnnualIncome, aes(x = AnnualIncome, y = Count)) +
  geom_col(fill = "#FF8C00", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") 

Nhận xét

  • Dựa vào bảng tần số, nhóm thu nhập phổ biến nhất là từ 30K – 50K USD/năm, với 4601 người, chiếm khoảng 32.73% theo bảng tần suất. Theo sau là nhóm 10K – 30K USD/năm với 3090 người (~21.98%).

  • Ngược lại, các nhóm thu nhập cao như $150K+ hoặc $110K – $130K chiếm tỷ trọng rất nhỏ trong bộ dữ liệu (chỉ khoảng NA% và 4.57%), cho thấy nhóm khách hàng chính nằm trong phân khúc thu nhập trung bình.

  • Biểu đồ cột giúp hình dung rõ sự phân bố thu nhập, cho thấy phân khúc dưới 90K chiếm phần lớn, đặc biệt là 2 nhóm 30K – 50K và 10K – 30K.

2.5 Biến City

Lập bảng tần số và tần suất

#Bảng tần số
table(dataDT$City)
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##           383           143           811           834           452 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##            75           845           926           654           194 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##           464           876          1386           621           866 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##           130           922           875          1257           633 
##      Victoria   Walla Walla        Yakima 
##           176           160           376
#Bảng tần suất
table(dataDT$City)/sum(table(data$City))
## 
##      Acapulco    Bellingham Beverly Hills     Bremerton       Camacho 
##   0.027242336   0.010171420   0.057685468   0.059321431   0.032150224 
##   Guadalajara       Hidalgo   Los Angeles        Merida   Mexico City 
##   0.005334661   0.060103848   0.065865282   0.046518245   0.013798990 
##       Orizaba      Portland         Salem    San Andres     San Diego 
##   0.033003770   0.062308841   0.098584537   0.044170994   0.061597553 
## San Francisco       Seattle       Spokane        Tacoma     Vancouver 
##   0.009246746   0.065580767   0.062237712   0.089408920   0.045024539 
##      Victoria   Walla Walla        Yakima 
##   0.012518671   0.011380610   0.026744434

Vẽ biểu đồ cột

library(patchwork)
## Warning: package 'patchwork' was built under R version 4.3.3
# Bảng tần suất -> data frame
freq5 <- as.data.frame(table(dataDT$City))
colnames(freq5) <- c("City", "Count")

# Sắp xếp giảm dần
freq5 <- freq5[order(-freq5$Count), ]

# Chia đôi danh sách thành phố
n <- nrow(freq5)
mid <- ceiling(n / 2)

# Dữ liệu cho biểu đồ thứ nhất (nửa trên theo tần suất)
top <- head(freq5, mid)

plot1 <- ggplot(top, aes(x = City, y = Count)) +
  geom_col(fill = "#FAFAD2", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Dữ liệu cho biểu đồ thứ hai (nửa dưới theo tần suất)
bottom <- tail(freq5, n - mid)

plot2 <- ggplot(bottom, aes(x = City, y = Count)) +
  geom_col(fill = "#FAFAD2", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Ghép hai biểu đồ
plot1 + plot2

Nhận xét

  • Dựa vào bảng tần số, thành phố xuất hiện phổ biến nhất là Salem với 1386 người, chiếm khoảng 9.86% theo bảng tần suất.
    Theo sau là Tacoma và Portland với lần lượt 1257 người (~8.94%) và 876 người (~6.23%).

  • Ngược lại, các thành phố như Guadalajara hoặc Victoria có số lượng rất ít, chỉ lần lượt 75 và 176 người, chiếm chưa đến 0.53% và 1.25% trong toàn bộ dữ liệu.

  • Biểu đồ cột giúp trực quan hóa sự phân bố thành phố, cho thấy một số thành phố như Salem, Tacoma và Portland chiếm tỷ lệ vượt trội, trong khi phần lớn các thành phố còn lại có tần suất thấp. Điều này cho thấy dữ liệu tập trung vào một số khu vực địa lý nhất định thay vì phân bố đồng đều.

2.6 Biến StateorProvince

Lập bảng tần số và tần suất

#Bảng tần số
table(dataDT$StateorProvince)
## 
##        BC        CA        DF  Guerrero   Jalisco        OR  Veracruz        WA 
##       809      2733       815       383        75      2262       464      4567 
##   Yucatan Zacatecas 
##       654      1297
#Bảng tần suất
table(dataDT$StateorProvince)/sum(table(dataDT$StateorProvince))
## 
##          BC          CA          DF    Guerrero     Jalisco          OR 
## 0.057543211 0.194395049 0.057969984 0.027242336 0.005334661 0.160893378 
##    Veracruz          WA     Yucatan   Zacatecas 
## 0.033003770 0.324845295 0.046518245 0.092254072

Vẽ biểu đồ cột

# Tạo bảng tần số
freq6 <- table(dataDT$StateorProvince)

# Chuyển thành data frame
StateorProvince <- as.data.frame(freq6)
colnames(StateorProvince) <- c("StateorProvince", "Count")

# Vẽ biểu đồ cột
ggplot(StateorProvince, aes(x = StateorProvince, y = Count)) +
  geom_col(fill = "#98FB98", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") 

Nhận xét

  • Dựa trên bảng tần số, tiểu bang có số lượng khách hàng lớn nhất là WA (Washington) với 4567 người, chiếm khoảng 32.48% toàn bộ dữ liệu.

  • Theo sau là CA (California) với 2733 khách hàng (~19.44%) và BC (British Columbia) với 809 người (~5.75%).Ngược lại, một số tiểu bang như Jalisco, Veracruz và Guerrero có số lượng khách hàng rất thấp, dưới 5% mỗi nhóm.

  • Biểu đồ cột cho thấy sự phân bố không đều giữa các tiểu bang, trong đó WA và CA chiếm phần lớn dữ liệu. Điều này cho thấy hai tiểu bang này có thể là thị trường chính hoặc có mạng lưới phân phối mạnh hơn trong tập dữ liệu này.

2.7 Biến Country

Lập bảng tần số và tần suất

#Bảng tần số
table(dataDT$Country)
## 
## Canada Mexico    USA 
##    809   3688   9562
#Bảng tần suất
table(dataDT$Country)/sum(table(dataDT$Country))
## 
##     Canada     Mexico        USA 
## 0.05754321 0.26232307 0.68013372

Vẽ biểu đồ cột

# Tạo bảng tần số
freq7 <- table(dataDT$Country)

# Chuyển thành data frame
Country <- as.data.frame(freq7)
colnames(Country) <- c("Country", "Count")

# Vẽ biểu đồ cột
ggplot(Country, aes(x = Country, y = Count)) +
  geom_col(fill = "#FFC0CB", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") 

Vẽ biểu đồ tròn

# Vẽ biểu đồ tròn
pie(freq7,
    labels = paste0(names(freq7), " (", round(100 * freq7 / sum(freq7), 1), "%)"),
    col = c("#FFC0CB", "#ADD8E6", "#BA55D3"),  
    main = "Country")

Nhận xét

  • Dựa vào bảng tần số, phần lớn khách hàng trong dữ liệu đến từ USA với 9562 người, chiếm khoảng 68.01% tổng số quan sát. Theo sau là Mexico với 3688 người (~26.23%), và Canada chỉ có 809 người (~5.75%).

  • Biểu đồ cột thể hiện rõ rằng USA là quốc gia chiếm ưu thế trong tập dữ liệu, với số lượng khách hàng vượt trội so với Mexico và Canada. Biểu đồ tròn bổ sung góc nhìn trực quan, cho thấy phần hình tròn đại diện cho USA lớn gấp nhiều lần hai nhóm còn lại. Điều này cho thấy rằng tập dữ liệu chủ yếu tập trung vào thị trường Mỹ, trong khi Mexico và Canada đóng vai trò nhỏ hơn trong phân phối khách hàng.

2.8 Biến Product Family

Lập bảng tần số và tần suất

#Bảng tần số
table(dataDT$ProductFamily)
## 
##          Drink           Food Non-Consumable 
##           1250          10153           2656
#Bảng tần suất
table(dataDT$ProductFamily)/sum(table(dataDT$ProductFamily))
## 
##          Drink           Food Non-Consumable 
##     0.08891102     0.72217085     0.18891813

Vẽ biểu đồ cột

# Tạo bảng tần số
freq8 <- table(dataDT$ProductFamily)

# Chuyển thành data frame
ProductFamily <- as.data.frame(freq8)
colnames(ProductFamily) <- c("ProductFamily", "Count")

# Vẽ biểu đồ cột
ggplot(ProductFamily, aes(x = ProductFamily, y = Count)) +
  geom_col(fill = "#ADD8E6", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black") 

Vẽ biểu đồ tròn

# Vẽ biểu đồ tròn
pie(freq8,
    labels = paste0(names(freq8), " (", round(100 * freq8 / sum(freq8), 1), "%)"),
    col = c("#FFC0CB", "#ADD8E6", "#BA55D3"),  
    main = "ProductFamily")

Nhận xét

  • Dựa vào bảng tần số, phần lớn sản phẩm trong dữ liệu thuộc nhóm Food với 10153 sản phẩm, chiếm khoảng 72.22% tổng số quan sát.
    Theo sau là nhóm Non-Consumable với 2656 sản phẩm (~18.89%), và Drink chỉ có 1250 sản phẩm (~8.89%).

  • Biểu đồ cột thể hiện rõ rằng Food là nhóm sản phẩm chiếm ưu thế trong tập dữ liệu, với số lượng vượt trội so với hai nhóm còn lại.Biểu đồ tròn bổ sung góc nhìn trực quan, cho thấy phần hình tròn đại diện cho Food lớn hơn nhiều so với Non-Consumable và Drink. Điều này cho thấy rằng tập dữ liệu tập trung nhiều nhất vào sản phẩm thực phẩm, trong khi các nhóm sản phẩm không tiêu dùng và đồ uống chiếm tỷ trọng nhỏ hơn trong phân phối sản phẩm.

2.9 Biến Product Department

Lập bảng tần số và tần suất

#Bảng tần số
table(dataDT$ProductDepartment)
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##                 356                 425                1072                 680 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##                 188                 977                 109                  59 
##            Checkout               Dairy                Deli                Eggs 
##                  82                 903                 699                 198 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##                1382                 893                1420                  89 
##         Periodicals             Produce             Seafood         Snack Foods 
##                 202                1994                 102                1600 
##              Snacks       Starchy Foods 
##                 352                 277
#Bảng tần suất
table(dataDT$ProductDepartment)/sum(table(dataDT$ProductDepartment))
## 
## Alcoholic Beverages         Baked Goods        Baking Goods           Beverages 
##         0.025321858         0.030229746         0.076250089         0.048367594 
##     Breakfast Foods        Canned Foods     Canned Products            Carousel 
##         0.013372217         0.069492852         0.007753041         0.004196600 
##            Checkout               Dairy                Deli                Eggs 
##         0.005832563         0.064229319         0.049719041         0.014083505 
##        Frozen Foods  Health and Hygiene           Household                Meat 
##         0.098300021         0.063518031         0.101002916         0.006330464 
##         Periodicals             Produce             Seafood         Snack Foods 
##         0.014368020         0.141830856         0.007255139         0.113806103 
##              Snacks       Starchy Foods 
##         0.025037343         0.019702682

Vẽ biều đồ cột

# Bảng tần suất -> data frame
freq9 <- as.data.frame(table(dataDT$ProductDepartment))
colnames(freq9) <- c("ProductDepartment", "Count")

# Sắp xếp giảm dần
freq9 <- freq9[order(-freq9$Count), ]

# Chia đôi danh sách thành phố
n1 <- nrow(freq9)
mid1 <- ceiling(n1 / 2)

# Dữ liệu cho biểu đồ thứ nhất (nửa trên theo tần suất)
top1 <- head(freq9, mid1)

plot11 <- ggplot(top1, aes(x = ProductDepartment, y = Count)) +
  geom_col(fill = "#708090", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Dữ liệu cho biểu đồ thứ hai (nửa dưới theo tần suất)
bottom1 <- tail(freq9, n1 - mid1)

plot22 <- ggplot(bottom1, aes(x = ProductDepartment, y = Count)) +
  geom_col(fill = "#708090", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 8))

# Ghép hai biểu đồ
plot11 + plot22

Nhận xét

  • Dựa vào bảng tần số, nhóm sản phẩm phổ biến nhất là Produce với 1994 sản phẩm, chiếm khoảng 14.18% tổng số quan sát. Theo sau là các nhóm Snack Foods (1600, ~11.38%), Household (1420), và Frozen Foods (1382).

  • Ngược lại, các nhóm ít xuất hiện nhất trong dữ liệu gồm Carousel (59 sản phẩm), Checkout (82), và Eggs (198).

  • Biểu đồ cột bên trái thể hiện rõ sự áp đảo của nhóm Produce, vượt trội hẳn về số lượng so với các nhóm còn lại. Biểu đồ cột bên phải bổ sung thêm các nhóm có tần số thấp hơn, cho thấy mức độ phân tán rộng giữa các nhóm sản phẩm.

  • Tổng thể, dữ liệu nghiêng mạnh về các mặt hàng thực phẩm tươi sống và ăn nhẹ, trong khi các nhóm như sản phẩm đặc biệt (Carousel, Checkout) chiếm tỷ trọng rất nhỏ. Điều này phản ánh cơ cấu hàng hóa tập trung vào các mặt hàng tiêu dùng phổ biến.

##Biến Product Category

Lập bảng tần số và tần suất

#Bảng tần số
table(dataDT$ProductCategory)
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##                  484                  365                  356 
##                Bread      Breakfast Foods              Candles 
##                  425                  417                   45 
##                Candy     Canned Anchovies         Canned Clams 
##                  352                   44                   53 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##                   35                   40                   38 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##                  404                   87                  154 
##    Cleaning Supplies        Cold Remedies                Dairy 
##                  189                   93                  903 
##        Decongestants               Drinks                 Eggs 
##                   85                  135                  198 
##           Electrical      Frozen Desserts       Frozen Entrees 
##                  355                  323                  118 
##                Fruit             Hardware        Hot Beverages 
##                  765                  129                  226 
##              Hygiene     Jams and Jellies     Kitchen Products 
##                  197                  588                  217 
##            Magazines                 Meat        Miscellaneous 
##                  202                  761                   42 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##                   48                  192                  345 
##                Pizza     Plastic Products Pure Juice Beverages 
##                  194                  141                  165 
##              Seafood          Side Dishes          Snack Foods 
##                  102                  153                 1600 
##            Specialty        Starchy Foods           Vegetables 
##                  289                  277                 1728
#Bảng tần suất
table(dataDT$ProductCategory)/sum(table(dataDT$ProductCategory))
## 
##         Baking Goods    Bathroom Products        Beer and Wine 
##          0.034426346          0.025962017          0.025321858 
##                Bread      Breakfast Foods              Candles 
##          0.030229746          0.029660716          0.003200797 
##                Candy     Canned Anchovies         Canned Clams 
##          0.025037343          0.003129668          0.003769827 
##       Canned Oysters      Canned Sardines        Canned Shrimp 
##          0.002489508          0.002845153          0.002702895 
##          Canned Soup          Canned Tuna Carbonated Beverages 
##          0.028736041          0.006188207          0.010953837 
##    Cleaning Supplies        Cold Remedies                Dairy 
##          0.013443346          0.006614980          0.064229319 
##        Decongestants               Drinks                 Eggs 
##          0.006045949          0.009602390          0.014083505 
##           Electrical      Frozen Desserts       Frozen Entrees 
##          0.025250729          0.022974607          0.008393200 
##                Fruit             Hardware        Hot Beverages 
##          0.054413543          0.009175617          0.016075112 
##              Hygiene     Jams and Jellies     Kitchen Products 
##          0.014012376          0.041823743          0.015434953 
##            Magazines                 Meat        Miscellaneous 
##          0.014368020          0.054129028          0.002987410 
##  Packaged Vegetables       Pain Relievers       Paper Products 
##          0.003414183          0.013656732          0.024539441 
##                Pizza     Plastic Products Pure Juice Beverages 
##          0.013798990          0.010029163          0.011736254 
##              Seafood          Side Dishes          Snack Foods 
##          0.007255139          0.010882709          0.113806103 
##            Specialty        Starchy Foods           Vegetables 
##          0.020556227          0.019702682          0.122910591

Vẽ biều đồ cột

# Bảng tần suất -> data frame
freq10 <- as.data.frame(table(dataDT$ProductCategory))
colnames(freq10) <- c("ProductCategory", "Count")

# Sắp xếp giảm dần
freq10 <- freq10[order(-freq10$Count), ]

# Chia đôi danh sách thành phố
n2 <- nrow(freq10)
mid2 <- ceiling(n2 / 2)

# Dữ liệu cho biểu đồ thứ nhất (nửa trên theo tần suất)
top2 <- head(freq10, mid2)

plot12 <- ggplot(top2, aes(x = ProductCategory, y = Count)) +
  geom_col(fill = "#F4A460", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6))

# Dữ liệu cho biểu đồ thứ hai (nửa dưới theo tần suất)
bottom2 <- tail(freq10, n2 - mid2)

plot21 <- ggplot(bottom2, aes(x = ProductCategory, y = Count)) +
  geom_col(fill = "#F4A460", color = "black") +
  geom_text(aes(label = Count), vjust = -0.5, color = "black", size = 2.5) +
  theme_bw() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1, size = 6))

# Ghép hai biểu đồ
plot12 + plot21

Nhận xét

  • Dựa vào bảng tần số, nhóm sản phẩm phổ biến nhất là Vegetables với 1728 sản phẩm, chiếm khoảng 12.29% tổng số quan sát. Theo sau là Snack Foods với 1600 sản phẩm (~11.38%), Fruit (765), và Meat (761). Ngược lại, các nhóm ít phổ biến nhất gồm Canned Oysters (35), Canned Sardines (40), và Candy (352), mỗi nhóm có chưa đến 50 quan sát, chiếm tỷ lệ rất nhỏ trong tổng thể dữ liệu.

  • Biểu đồ cột bên trái cho thấy sự phân bố không đồng đều, nổi bật nhất là hai nhóm Vegetables và Snack Foods với số lượng vượt trội so với các nhóm khác. Biểu đồ cột bên phải cung cấp thêm góc nhìn chi tiết hơn về các nhóm có tần suất thấp, cho thấy sự đa dạng nhưng phân tán nhỏ lẻ giữa nhiều danh mục.

  • Tổng quan, dữ liệu tập trung chủ yếu vào các mặt hàng rau củ, đồ ăn nhẹ và thực phẩm tươi sống, phản ánh xu hướng tiêu dùng chính. Những nhóm còn lại tuy nhiều về chủng loại nhưng chiếm tỷ trọng không lớn trong tập dữ liệu.


3 Phần 3: Ước lượng Khoảng và Kiểm định Giả thuyết cho Tỷ lệ

3.1 Biến Country

x <- table(dataDT$Country)
prop.test(c(x[["Canada"]],x[["Mexico"]]), c(sum(x), sum(x)), correct = TRUE)
## 
##  2-sample test for equality of proportions with continuity correction
## 
## data:  c(x[["Canada"]], x[["Mexico"]]) out of c(sum(x), sum(x))
## X-squared = 2192.5, df = 1, p-value < 2.2e-16
## alternative hypothesis: two.sided
## 95 percent confidence interval:
##  -0.2130785 -0.1964812
## sample estimates:
##     prop 1     prop 2 
## 0.05754321 0.26232307

3.2 Biến Gender

Mục tiêu

Thực hiện kiểm định để xác định xem tỷ lệ nữ trong tập dữ liệu có khác biệt so với 50% hay không.

Dữ liệu và biến quan tâm

  • Biến quan tâm: Gender

  • Hạng mục quan tâm: "F" (Female)

Tính toán tỷ lệ mẫu

# Số lượng nữ trong dữ liệu
sumF <- sum(dataDT$Gender == "F")

# Tổng số cá thể trong dữ liệu
sumGender <- length(dataDT$Gender)

Thực hiện kiểm định tỷ lệ 1 mẫu

Giả thuyết kiểm định:

  • Giả thuyết H0: Tỷ lệ nữ bằng 0.5

  • Giả thuyết H1: Tỷ lệ nữ khác 0.5

# Kiểm định tỷ lệ 1 mẫu với giả thuyết p = 0.5
prop.test(x = sumF, n = sumGender, p = 0.5, conf.level = 0.95, correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sumF out of sumGender, null probability 0.5
## X-squared = 5.5765, df = 1, p-value = 0.0182
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5016931 0.5182886
## sample estimates:
##         p 
## 0.5099936

Kết quả kiểm định:

  • Giá trị thống kê Chi-squared: 5.5765

  • Bậc tự do (df): 1

  • p-value: 0.0182

  • Khoảng tin cậy 95% cho tỷ lệ nữ: (0.5017, 0.5183)

  • Ước lượng tỷ lệ nữ từ mẫu: 0.50999 (tức ~51%)

Kết luận:

Với mức ý nghĩa 5%, vì p-value = 0.0182 < 0.05, ta bác bỏ giả thuyết H0.Kết luận rằng tỷ lệ nữ trong tập dữ liệu khác 50% một cách có ý nghĩa thống kê.

3.3 Biến MaritalStatus

Mục tiêu

Thực hiện kiểm định để xác định xem tỷ lệ khách hàng đã kết hôn (Married) trong tập dữ liệu có khác biệt so với 50% hay không.

Dữ liệu và biến quan tâm

  • Biến quan tâm: MaritalStatus

  • Hạng mục quan tâm: "M" (Married)

Tính toán tỷ lệ mẫu

# Số lượng khách hàng đã kết hôn trong dữ liệu
sumM <- sum(dataDT$MaritalStatus == "M")

# Tổng số khách hàng trong dữ liệu
sumMarital <- length(dataDT$MaritalStatus)

Kiểm định tỷ lệ 1 mẫu

Giả thuyết kiểm định:

  • H0: Tỷ lệ khách hàng đã kết hôn bằng 0.5

  • H1: Tỷ lệ khách hàng đã kết hôn khác 0.5

# Kiểm định tỷ lệ 1 mẫu với giả thuyết p = 0.5
prop.test(x = sumM, n = sumMarital, p = 0.5, conf.level = 0.95, correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sumM out of sumMarital, null probability 0.5
## X-squared = 7.5593, df = 1, p-value = 0.00597
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4800765 0.4966708
## sample estimates:
##         p 
## 0.4883704

Kết quả kiểm định:

  • Giá trị thống kê Chi-squared: 7.5593

  • Bậc tự do (df): 1

  • p-value: 0.006

  • Khoảng tin cậy 95% cho tỷ lệ đã kết hôn: (0.4801, 0.4967)

  • Ước lượng tỷ lệ đã kết hôn từ mẫu: 0.48837 (tức ~48.84%)

Kết luận:

Với mức ý nghĩa 5% (α = 0.05), vì p-value = 0.00597 < 0.05, ta bác bỏ giả thuyết H0. Điều này cho thấy rằng tỷ lệ khách hàng đã kết hôn trong tập dữ liệu khác 50% một cách có ý nghĩa thống kê. Cụ thể, tỷ lệ kết hôn trong mẫu là khoảng 48.84%, thấp hơn 50%.

3.4 Biến Homeowner

Mục tiêu

Thực hiện kiểm định để xác định xem tỷ lệ khách hàng có nhà (Homeowner = “Y”) có khác biệt so với 50% hay không.

Dữ liệu và biến quan tâm

  • Biến quan tâm: Homeowner

  • Hạng mục quan tâm: "Y" (Có nhà)

Tính toán tỷ lệ mẫu

# Số lượng khách hàng có nhà
sumY <- sum(dataDT$Homeowner == "Y")

# Tổng số khách hàng
sumHomeowner <- length(dataDT$Homeowner)

Kiểm định tỷ lệ 1 mẫu

Giả thuyết kiểm định:

  • H0: Tỷ lệ khách hàng có nhà bằng 0.5

  • H1: Tỷ lệ khách hàng có nhà khác 0.5

# Kiểm định tỷ lệ 1 mẫu với giả thuyết p = 0.5
prop.test(x = sumY, n = sumHomeowner, p = 0.5, conf.level = 0.95, correct = TRUE)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sumY out of sumHomeowner, null probability 0.5
## X-squared = 568.86, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.5924537 0.6087145
## sample estimates:
##         p 
## 0.6006117

Kết quả kiểm định:

  • Giá trị thống kê Chi-squared là 568.86, với 1 bậc tự do.

  • Giá trị p-value < 2.2e-16, rất nhỏ hơn nhiều so với mức ý nghĩa thông thường 0.05.

  • Khoảng tin cậy 95% cho tỷ lệ khách hàng có nhà là (0.5925, 0.6087).

  • Ước lượng tỷ lệ khách hàng có nhà trong mẫu là 0.6006 (tức khoảng 60.06%).

Kết luận

Với mức ý nghĩa 5% (α = 0.05), vì p-value < 2.2e-16 < 0.05, ta bác bỏ giả thuyết H0.Điều này cho thấy rằng tỷ lệ khách hàng sở hữu nhà trong tập dữ liệu khác 50% một cách có ý nghĩa thống kê.Cụ thể, tỷ lệ sở hữu nhà trong mẫu là khoảng 60.06%, cao hơn 50%.


4 PHẦN 4: PHÂN TÍCH MỐI QUAN HỆ GIỮA HAI BIẾN ĐỊNH TÍNH

4.1 Ôn lại kiến thức

4.1.1 Ý nghĩa của kiểm định Chi-bình phương về tính độc lập

Kiểm định Chi-bình phương (Chi-square test of independence) là một phương pháp thống kê dùng để xác định xem hai biến định tính (phân loại) có quan hệ với nhau hay không, hay nói cách khác là chúng có độc lập với nhau hay không trong tổng thể.

Giả thuyết kiểm định

  • H₀ (Giả thuyết không): Hai biến X và Y độc lập với nhau.

  • H₁ (Giả thuyết đối): Hai biến X và Y có mối liên hệ, tức là không độc lập.

Giá trị kiểm định

Phép kiểm định sử dụng phân phối Chi-bình phương (χ²) với công thức:

\[ \chi^2 = \sum_{i,j} \frac{(n_{ij} - \hat{\mu}_{ij})^2}{\hat{\mu}_{ij}} \]

Trong đó:

  • \(n_{ij}\): là tần số quan sát tại ô hàng \(i\), cột \(j\) trong bảng chéo.
  • \(\hat{\mu}_{ij}\): là tần số kỳ vọng tại ô \(i,j\), tính theo công thức:
    \[ \hat{\mu}_{ij} = \frac{n_{i+} \cdot n_{+j}}{n} \]
  • \(n_{i+}\): tổng hàng \(i\);
  • \(n_{+j}\): tổng cột \(j\);
  • \(n\): tổng tất cả các quan sát trong bảng.

Diễn giải kết quả

Sau khi chạy kiểm định trong R bằng hàm chisq.test(), kết quả trả về bao gồm:

  • Giá trị thống kê Chi-bình phương (X-squared)

  • Bậc tự do (degrees of freedom – df)

  • Giá trị p (p-value)

Cách diễn giải:

  • Nếu p-value < 0.05 → bác bỏ giả thuyết H₀ → hai biến có mối liên hệ, không độc lập.

  • Nếu p-value ≥ 0.05 → không bác bỏ H₀ → chưa có bằng chứng thống kê đủ mạnh để khẳng định hai biến có quan hệ → có thể độc lập.

4.1.2 Relative Risk (Rủi ro tương đối)

Relative Risk (RR) hay Rủi ro tương đối là một chỉ số thống kê dùng để so sánh xác suất xảy ra sự kiện (hoặc “rủi ro”) giữa hai nhóm. Đây là chỉ số quan trọng trong các nghiên cứu so sánh như y tế, xã hội học, và khoa học hành vi.

Giả sử ta có hai nhóm so sánh, thì:

\[ RR = \frac{\pi_1}{\pi_2} \]

Trong đó: - \(\pi_1\): Xác suất xảy ra sự kiện ở nhóm thứ nhất (nhóm khảo sát)

  • \(\pi_2\): Xác suất xảy ra sự kiện ở nhóm thứ hai (nhóm đối chứng)

4.1.3 Odd (Tỷ lệ cược)

Odd là tỷ số giữa xác suất sự kiện xảy ra với xác suất sự kiện không xảy ra.
Công thức tính:

\[ \text{Odd} = \frac{P(\text{sự kiện xảy ra})}{1 - P(\text{sự kiện xảy ra})} \]

Ví dụ, nếu xác suất một người sở hữu nhà là 0.75, thì odd là:

\[ \frac{0.75}{1 - 0.75} = \frac{0.75}{0.25} = 3 \]

Điều này có nghĩa là “tỷ lệ cược” sự kiện xảy ra là 3:1.


4.1.4 Odds Ratio (Tỷ số Odd)

Odds Ratio (OR) dùng để so sánh odd giữa hai nhóm khác nhau.

Công thức tổng quát:

\[ \text{OR} = \frac{\text{Odd của nhóm 1}}{\text{Odd của nhóm 2}} = \frac{\frac{P_1}{1 - P_1}}{\frac{P_2}{1 - P_2}} \]

  • OR > 1: odds của nhóm 1 cao hơn nhóm 2.
  • OR < 1: odds của nhóm 1 thấp hơn nhóm 2.
  • OR = 1: odds của hai nhóm bằng nhau.

4.1.5 Cấu trúc xác suất của bảng ngẫu nhiên

Bảng ngẫu nhiên (random table) thường được sử dụng trong thống kê để biểu diễn dữ liệu phân loại hoặc đếm theo các nhóm khác nhau. Cấu trúc xác suất của bảng này được mô tả qua các phân phối xác suất có thể sinh ra dữ liệu đó. Hai phân phối phổ biến nhất dùng để mô hình hóa bảng ngẫu nhiên là:

Phân phối Poisson (Poisson Distribution)

Phân phối Poisson mô tả số lượng sự kiện xảy ra trong một khoảng thời gian hoặc không gian cố định, với giả định các sự kiện xảy ra độc lập và với tỉ lệ trung bình cố định.

  • Định nghĩa: Biến ngẫu nhiên \(X\) có phân phối Poisson với tham số \(\lambda > 0\) nếu xác suất \(X\) nhận giá trị \(k\)

\[ P(X = k) = \frac{e^{-\lambda} \lambda^{k}}{k!}, \quad k = 0, 1, 2, \dots \]

  • Ý nghĩa tham số: \(\lambda\) là số sự kiện trung bình xảy ra trong khoảng quan sát.

  • Ứng dụng: Thường dùng để mô tả số lượng sự kiện hiếm gặp như số cuộc gọi điện thoại trong 1 giờ, số khách hàng đến cửa hàng trong 1 ngày, hay số lỗi phát sinh trên một sản phẩm.

Phân phối Đa thức (Multinomial Distribution)

Phân phối Đa thức là sự mở rộng của phân phối Nhị thức (Binomial), mô tả số lần các kết quả khác nhau xảy ra trong một chuỗi các phép thử độc lập, mỗi phép thử có nhiều hơn hai kết quả có thể.

  • Định nghĩa: Cho một phép thử với \(n\) lần lặp lại độc lập, mỗi lần có \(k\) kết quả có thể xảy ra với xác suất \(p_1, p_2, \dots, p_k\) (thỏa mãn \(\sum_{i=1}^k p_i = 1\)), thì vector biến ngẫu nhiên

\[ (X_1, X_2, \dots, X_k) \]

là số lần kết quả thứ \(i\) xảy ra, có phân phối Đa thức với xác suất:

\[ P(X_1 = x_1, \dots, X_k = x_k) = \frac{n!}{x_1! x_2! \cdots x_k!} p_1^{x_1} p_2^{x_2} \cdots p_k^{x_k} \]

với điều kiện \(\sum_{i=1}^k x_i = n\).

  • Ứng dụng: Mô hình hóa bảng tần số trong các bảng phân loại có nhiều nhóm như kết quả khảo sát, phân bổ khách hàng theo loại sản phẩm, hoặc số lượng sản phẩm bán ra trong các danh mục khác nhau.

Tóm lại, cấu trúc xác suất của bảng ngẫu nhiên thường được xây dựng dựa trên phân phối Poisson khi quan tâm đến số lượng sự kiện xảy ra trên các ô bảng (đếm số lượng) hoặc phân phối Đa thức khi quan tâm đến phân phối tỉ lệ của các nhóm trong tổng số các phép thử.

4.2 Cặp biến: MaritalStatus và Homeowner

4.2.1 Thống kê mô tả cặp biến MaritalStatus và Homeowner

Bảng tần số chéo

marital_homeowner <- table(dataDT$MaritalStatus, dataDT$Homeowner)
marital_homeowner
##    
##        N    Y
##   M 1719 5147
##   S 3896 3297

Nhận xét

  • Khách hàng đã kết hôn (M): Có tới 5147 người sở hữu nhà ở, chiếm phần lớn trong nhóm này, trong khi chỉ có 1719 người không sở hữu nhà.

  • Khách hàng độc thân (S): Ngược lại, nhóm này có xu hướng không sở hữu nhà ở cao hơn với 3896 người, trong khi số người sở hữu nhà chỉ là 3297 người.

  • So sánh giữa hai nhóm:

    • Nhóm đã kết hôn có tỷ lệ sở hữu nhà ở cao hơn đáng kể so với nhóm độc thân.

    • Nhóm độc thân có số lượng không sở hữu nhà ở vượt trội, cho thấy xu hướng chưa ổn định về tài chính hoặc cuộc sống gia đình.

Bảng tần suất chéo

prop.table(marital_homeowner)
##    
##             N         Y
##   M 0.1222704 0.3661000
##   S 0.2771179 0.2345117

Nhận xét

  • Nhóm khách hàng đã kết hôn sở hữu nhà chiếm tỷ trọng lớn nhất trong toàn bộ dữ liệu (36.61%), cho thấy đây là nhóm có xu hướng ổn định về tài chính và chỗ ở.

  • Khách hàng độc thân không sở hữu nhà cũng chiếm tỷ trọng khá lớn (27.71%), phản ánh phần nào sự chưa ổn định về tài sản hoặc giai đoạn đầu trong chu kỳ sống cá nhân.

Nhìn chung, dữ liệu cho thấy mối liên hệ đáng chú ý giữa tình trạng hôn nhân và quyền sở hữu nhà ở, trong đó việc đã kết hôn thường đi kèm với tỷ lệ sở hữu nhà cao hơn.

Vẽ đồ thị

library(ggplot2)
library(dplyr)
# Chuyển đổi dữ liệu sang dạng data frame
df_marital_homeowner <- as.data.frame(marital_homeowner)
colnames(df_marital_homeowner) <- c("MaritalStatus", "Homeowner", "Count")

# Vẽ biểu đồ cột nhóm
ggplot(df_marital_homeowner, aes(x = Homeowner, y = Count, fill = MaritalStatus)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Số lượng khách hàng theo Homeowner và Marital Status", 
       x = "Tình trạng sở hữu nhà", y = "Số lượng") +
  theme_minimal()+
   theme(plot.title = element_text(hjust = 0.5))

Nhận xét

  • Khác biệt giữa hai nhóm hôn nhân: Khách hàng đã kết hôn (M) có số lượng sở hữu nhà (Y) vượt trội (hơn 5000 người), trong khi khách hàng độc thân (S) lại chủ yếu thuộc nhóm không sở hữu nhà (N), với khoảng 3900 người.

  • Xu hướng ổn định tài chính khi kết hôn: Nhóm đã kết hôn có tỷ lệ sở hữu nhà cao, phản ánh sự ổn định về tài chính hoặc nhu cầu ổn định nơi ở cho gia đình. Ngược lại, nhóm độc thân có tỷ lệ không sở hữu nhà cao hơn, có thể do ưu tiên linh hoạt, chưa ổn định cuộc sống.

  • Sự chênh lệch trong nhóm không sở hữu nhà: Trong nhóm không sở hữu nhà (N), số lượng khách hàng độc thân gần gấp đôi so với khách hàng đã kết hôn.

  • Mối liên hệ tiềm năng: Biểu đồ cho thấy tình trạng hôn nhân có thể liên quan đến việc sở hữu nhà – người đã kết hôn có xu hướng sở hữu nhà nhiều hơn.

Kết luận: Biểu đồ gợi ý rằng tình trạng hôn nhân có thể ảnh hưởng đến quyền sở hữu nhà. Tuy nhiên, để xác định mối liên hệ này có ý nghĩa thống kê hay không, cần thực hiện thêm kiểm định Chi-bình phương.

4.2.2 Kiểm định thống kê

Giả thuyết kiểm định::

  • H0: Hai biến MaritalStatus và Homeowner độc lập

  • H1: Hai biến MaritalStatus và Homeowner có mối liên hệ

Thực hiện kiểm định Chi- bình phương

chisq_result1 <- chisq.test(marital_homeowner)
chisq_result1
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  marital_homeowner
## X-squared = 1241.2, df = 1, p-value < 2.2e-16

Kết quả kiểm định:

  • Giá trị thống kê Chi-bình phương: X-squared = 1241.2

  • Bậc tự do: df = 1

  • Giá trị p: p-value < 2.2e-16

Kết luận:

Vì giá trị p rất nhỏ (p < 0.05), ta bác bỏ giả thuyết không H0. Điều này cho thấy có mối liên hệ có ý nghĩa thống kê giữa tình trạng hôn nhân và tình trạng sở hữu nhà.

Thảo luận thêm

Kết quả kiểm định củng cố cho nhận định trước đó từ biểu đồ: khách hàng đã kết hôn có xu hướng sở hữu nhà nhiều hơn so với khách hàng độc thân. Mối quan hệ này có thể phản ánh các yếu tố kinh tế – xã hội như:

  • Những người đã kết hôn thường có nhu cầu ổn định nơi ở và khả năng tài chính cao hơn (do thu nhập hộ gia đình gộp lại).

  • Người độc thân có thể ưu tiên tính linh hoạt, hoặc đang trong giai đoạn chưa ổn định sự nghiệp hay thu nhập.

4.2.3 Tính Relative Risk

library(epitools)
marital_homeowner <- table(dataDT$MaritalStatus, dataDT$Homeowner)
addmargins(marital_homeowner)
##      
##           N     Y   Sum
##   M    1719  5147  6866
##   S    3896  3297  7193
##   Sum  5615  8444 14059
riskratio(marital_homeowner)
## $data
##        
##            N    Y Total
##   M     1719 5147  6866
##   S     3896 3297  7193
##   Total 5615 8444 14059
## 
## $measure
##    risk ratio with 95% C.I.
##      estimate     lower     upper
##   M 1.0000000        NA        NA
##   S 0.6114466 0.5942071 0.6291862
## 
## $p.value
##    two-sided
##     midp.exact  fisher.exact    chi.square
##   M         NA            NA            NA
##   S          0 1.822183e-277 3.663022e-272
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
epitab(marital_homeowner, method = 'riskratio', rev = 'c')
## $tab
##    
##        Y        p0    N        p1 riskratio    lower    upper       p.value
##   M 5147 0.7496359 1719 0.2503641    1.0000       NA       NA            NA
##   S 3297 0.4583623 3896 0.5416377    2.1634 2.065887 2.265515 1.822183e-277
## 
## $measure
## [1] "wald"
## 
## $conf.level
## [1] 0.95
## 
## $pvalue
## [1] "fisher.exact"

4.2.4 Tính odd và oddratio

odd_M <- marital_homeowner["M", "Y"] / marital_homeowner["M", "N"]
odd_S <- marital_homeowner["S", "Y"] / marital_homeowner["S", "N"]

cat("Odd nhóm M:", odd_M, "\n")
## Odd nhóm M: 2.994183
cat("Odd nhóm S:", odd_S, "\n")
## Odd nhóm S: 0.8462526
odds_ratio <- odd_S / odd_M
cat("Odds ratio (S so với M):", odds_ratio, "\n")
## Odds ratio (S so với M): 0.2826322
# Hoặc dùng hàm epitools để tính Odds Ratio cùng khoảng tin cậy
library(epitools)
result <- oddsratio(marital_homeowner, method="wald")
print(result)
## $data
##        
##            N    Y Total
##   M     1719 5147  6866
##   S     3896 3297  7193
##   Total 5615 8444 14059
## 
## $measure
##    odds ratio with 95% C.I.
##      estimate     lower     upper
##   M 1.0000000        NA        NA
##   S 0.2826322 0.2630929 0.3036227
## 
## $p.value
##    two-sided
##     midp.exact  fisher.exact    chi.square
##   M         NA            NA            NA
##   S          0 1.822183e-277 3.663022e-272
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

4.3 Cặp biến: Gender và ProductFamily

4.3.1 Thống kê mô tả cặp biến Gender và ProductFamily

Bảng tần số chéo

gender_family <- table(dataDT$Gender, dataDT$ProductFamily)
gender_family
##    
##     Drink Food Non-Consumable
##   F   669 5149           1352
##   M   581 5004           1304

Nhận xét

Cả nam và nữ đều có xu hướng tiêu dùng tương tự nhau, trong đó nhóm sản phẩm Food là được lựa chọn nhiều nhất.

  • Khách hàng nữ (F) mua 5149 sản phẩm thuộc nhóm Food, cao nhất trong ba nhóm, tiếp theo là Non-Consumable (1352) và thấp nhất là Drink (669).

  • Khách hàng nam (M) cũng có xu hướng tương tự với 5004 lượt mua Food, tiếp đến là Non-Consumable (1304) và Drink (581).

Nhìn chung, nhóm Food chiếm tỷ lệ lớn nhất ở cả hai giới, cho thấy đây là nhóm sản phẩm phổ biến nhất. Trong khi đó, nhóm Drink có số lượt mua thấp nhất, phản ánh mức độ quan tâm hoặc nhu cầu tiêu dùng thấp hơn đối với loại sản phẩm này. Sự khác biệt nhỏ giữa hai giới cho thấy hành vi lựa chọn sản phẩm theo giới tính có thể tồn tại một số khác biệt nhẹ, cần được kiểm chứng bằng phân tích thống kê tiếp theo.

Bảng tần suất chéo

prop.table(gender_family)
##    
##          Drink       Food Non-Consumable
##   F 0.04758518 0.36624226     0.09616616
##   M 0.04132584 0.35592859     0.09275197

Nhận xét

Kết quả trong bảng tần suất chéo cho thấy:

  • Trong tổng số khách hàng mua hàng, khoảng 4.76% là khách hàng nữ (F) mua sản phẩm nhóm Drink, và khoảng 4.13% là khách hàng nam (M) mua nhóm này.

  • Nhóm sản phẩm Food là nhóm được mua nhiều nhất, chiếm khoảng 36.62% tổng số giao dịch từ nữ và 35.59% từ nam.

  • Nhóm Non-Consumable chiếm khoảng 9.62% tổng số giao dịch từ nữ và 9.28% từ nam.

Như vậy, nhóm sản phẩm Food chiếm tỷ lệ lớn nhất trong tổng thể số lượt mua của cả hai giới, phản ánh sự phổ biến và nhu cầu cao đối với nhóm sản phẩm này. Mức độ mua hàng của nam và nữ ở các nhóm sản phẩm có sự tương đồng khá lớn, cho thấy hành vi tiêu dùng giữa hai giới trong các nhóm sản phẩm này tương đối đồng đều. Tuy nhiên, nhóm Drink có tỷ lệ thấp nhất trong tổng thể lượt mua, cho thấy nhóm sản phẩm này ít được lựa chọn hơn.

Vẽ đồ thị

# Chuyển đổi dữ liệu sang dạng data frame
df_gender_family <- as.data.frame(gender_family)
colnames(df_gender_family) <- c("Gender", "ProductFamily", "Count")

# Vẽ biểu đồ cột nhóm
ggplot(df_gender_family, aes(x = ProductFamily, y = Count, fill = Gender)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Số lượt mua theo ProductFamily và Gender", 
       x = "Product Family", y = "Số lượt mua") +
  theme_minimal()

Nhận xét

  • Xu hướng tiêu dùng tương đồng: Biểu đồ cho thấy cả nam và nữ đều có xu hướng tiêu dùng tương tự nhau. Ở mỗi nhóm sản phẩm, chiều cao cột của hai giới gần bằng nhau, cho thấy mức độ mua sắm giữa hai giới không chênh lệch đáng kể.

  • Nhóm sản phẩm Food được ưa chuộng nhất: Đây là nhóm sản phẩm có số lượt mua cao vượt trội so với hai nhóm còn lại ở cả nam và nữ. Điều này phản ánh nhu cầu tiêu dùng thực phẩm là chủ yếu trong tổng thể các giao dịch.

  • Drink là nhóm ít được mua nhất: Số lượt mua nhóm Drink thấp nhất ở cả hai giới, điều này có thể cho thấy mức độ ưu tiên thấp hơn của khách hàng đối với đồ uống trong danh sách tiêu dùng.

Sự khác biệt giới tính nhỏ: Trong từng nhóm sản phẩm, nữ có số lượt mua nhỉnh hơn nam một chút, nhưng không đáng kể. Điều này gợi ý rằng giới tính không phải là yếu tố chi phối mạnh hành vi tiêu dùng theo nhóm sản phẩm, mặc dù có thể có những xu hướng nhỏ.

Kết luận: Biểu đồ trực quan hỗ trợ kết luận rằng hai biến định tính “Giới tính” và “Nhóm sản phẩm” có mối quan hệ tương đối ổn định và tương đồng, không có sự khác biệt lớn giữa nam và nữ trong hành vi chọn loại sản phẩm. Tuy nhiên, để khẳng định mối liên kết có ý nghĩa thống kê hay không, cần thực hiện thêm các kiểm định như kiểm định Chi-bình phương (Chi-square test).

4.3.2 Kiểm định thống kê

Giả thuyết kiểm định:

  • H0: Hai biến Gender và ProductFamily độc lập

  • H1: Hai biến Gender và ProductFamily có mối liên hệ

Thực hiện kiểm định Chi- bình phương

chisq_result2 <- chisq.test(gender_family)
chisq_result2
## 
##  Pearson's Chi-squared test
## 
## data:  gender_family
## X-squared = 3.5185, df = 2, p-value = 0.1722

Kết quả kiểm định:

  • Giá trị thống kê Chi-bình phương: X-squared = 3.5185

  • Bậc tự do: df = 2

  • Giá trị p: p-value = 0.1722 Kết luận

  • Với mức ý nghĩa α = 0.05, ta không đủ bằng chứng để bác bỏ giả thuyết không vì giá trị p = 0.1722 > 0.05.

  • Điều này có nghĩa là chưa có đủ bằng chứng thống kê để khẳng định rằng giới tính có ảnh hưởng đến loại sản phẩm được chọn. Nói cách khác, hai biến GenderProductFamily có thể được xem là độc lập trong dữ liệu này.

Thảo luận thêm

Mặc dù kiểm định thống kê không phát hiện mối quan hệ có ý nghĩa giữa hai biến, nhưng qua bảng tần suất chéo và biểu đồ minh họa, ta vẫn có thể quan sát được một số xu hướng nhỏ như:

  • Cả namnữ đều chọn nhóm sản phẩm Food nhiều nhất, tiếp theo là Non-Consumable, và ít nhất là Drink.

  • Số lượt mua giữa nam và nữ ở từng nhóm sản phẩm có sự chênh lệch nhẹ, tuy nhiên, mức độ khác biệt này chưa đủ lớn để trở nên có ý nghĩa thống kê.

Do đó, mặc dù kết quả kiểm định cho thấy tính độc lập giữa hai biến, nhưng việc khám phá xu hướng hành vi tiêu dùng theo giới tính vẫn có thể hữu ích khi phân tích sâu hơn hoặc mở rộng mẫu dữ liệu trong các nghiên cứu tiếp theo.

4.4 Cặp biến: Homeowner và AnnualIncome

4.4.1 Thống kê mô tả cặp biến Homeowner và AnnualIncome

Bảng tần số chéo

home_income <- table(dataDT$Homeowner, dataDT$AnnualIncome)
home_income
##    
##     $10K - $30K $110K - $130K $130K - $150K $150K + $30K - $50K $50K - $70K
##   N        1359           119           136      48        2087        1063
##   Y        1731           524           624     225        2514        1307
##    
##     $70K - $90K $90K - $110K
##   N         686          117
##   Y        1023          496

Nhận xét:

Kết quả thể hiện số lượng người sở hữu nhà (Homeowner = Y) và không sở hữu nhà (Homeowner = N) theo các nhóm thu nhập hằng năm. Từ đó, ta có thể rút ra một số nhận xét quan trọng:

  • Nhóm thu nhập $10K – $30K là nhóm có số lượng cá nhân khá lớn. Đáng chú ý, số người sở hữu nhà (1.731) vượt qua số người không sở hữu (1.359), điều này cho thấy rằng ở nhóm thu nhập thấp nhất, việc sở hữu nhà có thể đến từ các yếu tố phi thu nhập như hỗ trợ từ gia đình hoặc chi phí nhà ở thấp.

  • Nhóm $30K – $50K có sự chênh lệch đáng kể với 2.514 người sở hữu nhà so với 2.087 người không sở hữu, cho thấy khi thu nhập tăng lên mức trung bình thấp, khả năng sở hữu nhà tăng đáng kể, có thể nhờ tích lũy tài chính hoặc khả năng tiếp cận tín dụng.

  • Ở nhóm thu nhập $50K – $70K, xu hướng tiếp tục được duy trì với 1.307 người sở hữu1.063 người không sở hữu, cho thấy thu nhập từ mức trung bình trở lên đã bắt đầu giúp đa số cá nhân sở hữu nhà.

  • Nhóm thu nhập $70K – $90K cho thấy tỷ lệ sở hữu nhà tiếp tục tăng mạnh, với 1.023 người sở hữu so với 686 người không sở hữu, tương đương khoảng 60% cá nhân trong nhóm này đã sở hữu nhà.

  • Ở mức $90K – $110K, xu hướng sở hữu nhà trở nên rõ rệt, khi có tới 496 người sở hữu nhà và chỉ 117 người không sở hữu, tương đương tỷ lệ sở hữu nhà khoảng 80%.

  • Trong nhóm $110K – $130K, có tới 524 người sở hữu nhà so với 119 người không sở hữu, cho thấy thu nhập cao hơn tiếp tục gia tăng xác suất sở hữu bất động sản.

  • Nhóm $130K – $150K thể hiện tỷ lệ sở hữu nhà vượt trội với 624 người có nhàchỉ 136 người không có, phản ánh rằng tại mức thu nhập này, việc sở hữu nhà đã trở thành chuẩn mực phổ biến.

  • Cuối cùng, nhóm thu nhập trên $150K225 người sở hữu nhà và chỉ 48 người không sở hữu, tương đương tỷ lệ sở hữu trên 82%, cho thấy rằng ở mức thu nhập rất cao, việc sở hữu nhà gần như là mặc định.

Kết luận: Từ những phân tích trên, có thể thấy rằng mức thu nhập hằng năm có mối quan hệ thuận chiều với tỷ lệ sở hữu nhà. Khi thu nhập tăng, khả năng sở hữu bất động sản tăng lên rõ rệt. Tuy nhiên, việc một số nhóm thu nhập thấp vẫn có tỷ lệ sở hữu nhà cao cũng gợi ý rằng các yếu tố ngoài thu nhập như thừa kế, giá nhà ở thấp hoặc các chương trình hỗ trợ nhà ở có thể đóng vai trò quan trọng.

Bảng tần suất chéo

prop.table(home_income)
##    
##     $10K - $30K $110K - $130K $130K - $150K     $150K + $30K - $50K $50K - $70K
##   N 0.096664059   0.008464329   0.009673519 0.003414183 0.148445835 0.075609930
##   Y 0.123123978   0.037271499   0.044384380 0.016003983 0.178817839 0.092965360
##    
##     $70K - $90K $90K - $110K
##   N 0.048794367  0.008322071
##   Y 0.072764777  0.035279892

Nhận xét

Bảng tỷ lệ phần trăm tổng thể cho thấy xu hướng rất rõ ràng về mối quan hệ giữa thu nhập và quyền sở hữu nhà ở. Cụ thể:

  • Ở nhóm thu nhập $10K – $30K, tỷ lệ người sở hữu nhà chiếm 12.31%, cao hơn so với 9.66% người không sở hữu. Điều này cho thấy rằng ngay cả ở mức thu nhập thấp nhất, vẫn có một bộ phận lớn người dân có khả năng sở hữu nhà, có thể nhờ các yếu tố hỗ trợ như tài sản thừa kế hoặc chi phí nhà ở thấp.

  • Khi thu nhập tăng lên nhóm $30K – $50K, tỷ lệ người sở hữu nhà tăng lên 17.88%, vượt khá xa so với 14.84% người không sở hữu. Đây có thể là giai đoạn nhiều người bắt đầu có khả năng tích lũy hoặc tiếp cận các khoản vay mua nhà.

  • Nhóm thu nhập $50K – $70K tiếp tục phản ánh xu hướng này, với 9.30% người sở hữu nhà so với 7.50% người không sở hữu.

  • Ở các nhóm thu nhập trung bình cao như $70K – $90K và $90K – $110K, chênh lệch trở nên rõ rệt hơn. Tỷ lệ người sở hữu nhà lần lượt là 7.28%3.53%, so với tỷ lệ không sở hữu chỉ là 4.87%0.83%. Đây là minh chứng rõ ràng cho việc thu nhập cao giúp nâng cao khả năng sở hữu nhà.

  • Từ mức thu nhập $110K – $130K trở đi, khoảng cách giữa hai nhóm tăng mạnh. Người sở hữu nhà chiếm 3.73%, cao gấp hơn 4 lần so với 0.84% người không sở hữu.

  • Với nhóm $130K – $150K, tỷ lệ người sở hữu nhà lên tới 4.44%, trong khi không sở hữu nhà chỉ chiếm 0.97%. Điều này cho thấy rằng ở mức thu nhập này, việc sở hữu nhà gần như trở thành chuẩn mực phổ biến.

  • Cuối cùng, nhóm thu nhập trên $150K có tỷ lệ người sở hữu nhà là 1.60%, cao gấp gần 5 lần so với 0.34% người không sở hữu. Tức là, tại mức thu nhập rất cao, quyền sở hữu nhà gần như là mặc định*.

Nhìn chung, dữ liệu phản ánh một mối quan hệ thuận chiều rất rõ ràng giữa thu nhập hằng năm và tỷ lệ sở hữu nhà. Khi thu nhập tăng lên, khả năng sở hữu bất động sản cũng tăng theo một cách đáng kể. Tuy nhiên, cũng cần lưu ý rằng ở nhóm thu nhập thấp, tỷ lệ sở hữu nhà vẫn không hề nhỏ. Điều này cho thấy rằng thu nhập không phải là yếu tố duy nhất quyết định, và các yếu tố khác như thừa kế, giá bất động sản vùng, hay hỗ trợ chính sách nhà ở cũng có thể đóng vai trò quan trọng.

Vẽ đồ thị

# Chuyển bảng tần suất chéo sang data frame
df_home_income <- as.data.frame(home_income)
colnames(df_home_income) <- c("Homeowner", "AnnualIncome", "Count")

# Vẽ biểu đồ cột nhóm
ggplot(df_home_income, aes(x = AnnualIncome, y = Count, fill = Homeowner)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(title = "Số lượng người sở hữu và không sở hữu nhà theo nhóm thu nhập",
       x = "Nhóm thu nhập hằng năm",
       y = "Số lượng cá nhân") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:

  • Tỷ lệ sở hữu nhà tăng theo thu nhập: Biểu đồ cho thấy xu hướng rất rõ ràng: khi nhóm thu nhập tăng, số lượng người sở hữu nhà (Y) cũng tăng đáng kể, đặc biệt rõ ràng ở nhóm $30K – $50K$50K – $70K.

  • Nhóm thu nhập $30K – $50K chiếm ưu thế rõ rệt: Đây là nhóm có số lượng người sở hữu nhà cao nhất trong toàn bộ biểu đồ, vượt trội hơn hẳn so với nhóm không sở hữu trong cùng phân khúc. Điều này cho thấy đây có thể là mức thu nhập trung bình phổ biến, đủ để người dân bắt đầu tiếp cận thị trường bất động sản.

  • Người thu nhập thấp vẫn có khả năng sở hữu nhà: Ở nhóm thu nhập $10K – $30K, số lượng người sở hữu nhà vẫn cao hơn người không sở hữu. Điều này có thể phản ánh sự hỗ trợ từ các yếu tố khác như tài sản thừa kế, nhà giá rẻ vùng nông thôn hoặc hỗ trợ xã hội.

  • Tỷ lệ không sở hữu nhà giảm ở các nhóm thu nhập cao: Từ nhóm $70K – $90K trở đi, số người không sở hữu nhà (N) giảm mạnh, trong khi người sở hữu nhà vẫn duy trì số lượng ổn định. Điều này phản ánh rằng thu nhập cao gắn liền với khả năng sở hữu nhà gần như mặc định.

  • Chênh lệch rõ rệt giữa hai nhóm sở hữu: Ở các nhóm thu nhập cao hơn ($90K – $110K, $110K – $130K và trên $150K), số người sở hữu nhà tuy có xu hướng giảm nhẹ về số tuyệt đối, nhưng vẫn vượt xa số người không sở hữu, cho thấy mức độ phổ biến của việc sở hữu nhà ở nhóm thu nhập cao.

Kết luận:Biểu đồ cho thấy mối quan hệ thuận chiều mạnh mẽ giữa thu nhập hằng năm và khả năng sở hữu nhà. Càng có thu nhập cao, người dân càng có xu hướng sở hữu nhà nhiều hơn. Tuy nhiên, sự hiện diện đáng kể của chủ sở hữu nhà trong nhóm thu nhập thấp cũng cho thấy thu nhập không phải yếu tố duy nhất, và cần xét thêm đến các yếu tố khác như chính sách nhà ở, môi trường sống, hoặc hỗ trợ tài chính từ gia đình. Để khẳng định rõ ràng hơn về mối liên hệ này, có thể cần thực hiện thêm kiểm định thống kê (như Chi-squared test).

4.4.2 Kiểm định thống kê

Giả thuyết kiểm định

  • H0: Hai biến Homeowner và AnnualIncome độc lập
  • H1: Hai biến Homeowner và AnnualIncome có mối liên hệ

Thực hiện kiểm định Chi-bình phương

chisq_result3<- chisq.test(home_income)
chisq_result3
## 
##  Pearson's Chi-squared test
## 
## data:  home_income
## X-squared = 546.37, df = 7, p-value < 2.2e-16

Kết quả kiểm định:

  • Giá trị thống kê Chi-bình phương: X-squared = 546.37

  • Bậc tự do: df = 7

  • Giá trị p: p-value < 2.2e-16

Kết luận:

Với giá trị p rất nhỏ (p < 0.05), ta bác bỏ giả thuyết không H0. Điều này cho thấy có mối liên hệ có ý nghĩa thống kê giữa thu nhập hằng năm và việc sở hữu nhà.

Thảo luận thêm:

  • Kết quả kiểm định này củng cố các nhận xét mô tả và trực quan hóa trước đó:

    • Thu nhập hằng năm là yếu tố quan trọng ảnh hưởng đến khả năng sở hữu nhà.

    • Mức thu nhập càng cao thì tỷ lệ sở hữu nhà càng lớn, phản ánh xu hướng tích lũy tài sản hoặc khả năng tiếp cận các nguồn tài chính mua nhà thuận lợi hơn.

    • Tỷ lệ sở hữu nhà trong các nhóm thu nhập thấp vẫn không nhỏ, cho thấy ngoài thu nhập còn có các yếu tố hỗ trợ như thừa kế, chính sách nhà ở, hoặc điều kiện thị trường bất động sản vùng miền.

  • Để hiểu rõ hơn về mối quan hệ này, có thể tiếp tục nghiên cứu bằng các mô hình hồi quy đa biến hoặc phân tích sâu hơn.


5 Phần 5. Tổng kết và Thảo luận

Tóm tắt những phát hiện chính

Qua các phân tích định tính, ta rút ra được những hiểu biết quan trọng về đặc điểm khách hàng và hành vi mua sắm như sau:

  • Mối quan hệ giữa tình trạng hôn nhân và việc sở hữu nhà (MaritalStatus – Homeowner):
    Kết quả kiểm định Chi-bình phương cho thấy có sự khác biệt đáng kể giữa các nhóm tình trạng hôn nhân về tỷ lệ sở hữu nhà. Điều này cho thấy nhóm khách hàng đã kết hôn có xu hướng sở hữu nhà cao hơn so với những người độc thân hoặc chưa kết hôn, phản ánh đặc điểm tài chính và ổn định hơn của nhóm này.

  • Mối quan hệ giữa việc sở hữu nhà và thu nhập hàng năm (Homeowner – AnnualIncome):
    Khách hàng sở hữu nhà thường có mức thu nhập cao hơn so với khách hàng thuê nhà hoặc chưa sở hữu. Mối quan hệ này phản ánh mức độ khả năng tài chính và sự ổn định của khách hàng, có thể ảnh hưởng đến khả năng chi tiêu và lựa chọn sản phẩm cao cấp hơn.

Những phát hiện này cung cấp một cái nhìn toàn diện về các nhóm khách hàng chính dựa trên các đặc điểm định tính, giúp doanh nghiệp nắm bắt được phân khúc khách hàng, nhu cầu và xu hướng tiêu dùng để từ đó tối ưu hóa chiến lược kinh doanh.

Hạn chế của phân tích

  • Chất lượng dữ liệu: Dữ liệu có thể chưa được làm sạch hoàn toàn hoặc thiếu thông tin chi tiết về các nhóm con, dẫn đến việc kết quả phân tích có thể bị ảnh hưởng bởi các giá trị thiếu hoặc không đầy đủ.

  • Giới hạn phân tích biến định tính: Việc chỉ tập trung phân tích các biến định tính mà không kết hợp các biến định lượng (như tuổi, số lần mua hàng, chi tiêu trung bình…) có thể làm giảm độ sâu và tính toàn diện của phân tích hành vi khách hàng.

  • Kích thước mẫu không đồng đều: Một số hạng mục con trong các biến định tính có thể có số lượng mẫu rất nhỏ, ảnh hưởng đến độ tin cậy của kết quả kiểm định và khả năng tổng quát hóa.

  • Không xem xét yếu tố thời gian: Phân tích tĩnh, không theo dõi biến đổi hành vi theo thời gian có thể bỏ lỡ các xu hướng thay đổi trong hành vi khách hàng.

Đề xuất

  • Chiến lược marketing theo phân khúc: Dựa trên sự khác biệt về sở thích sản phẩm theo giới tính và tình trạng hôn nhân, doanh nghiệp nên phát triển các chiến dịch marketing được cá nhân hóa, nhắm đúng nhóm khách hàng mục tiêu.

  • Phân loại sản phẩm phù hợp: Cần tập trung phát triển các dòng sản phẩm phù hợp với từng nhóm khách hàng đặc trưng, ví dụ sản phẩm cao cấp cho nhóm khách hàng thu nhập cao và sở hữu nhà, sản phẩm giá cả phải chăng hơn cho nhóm khách hàng thu nhập thấp.

  • Nhắm mục tiêu khách hàng ổn định tài chính: Khách hàng sở hữu nhà và có thu nhập cao là nhóm khách hàng tiềm năng để phát triển các chương trình chăm sóc và khuyến mãi đặc biệt nhằm tăng tỷ lệ giữ chân và giá trị vòng đời khách hàng.

Câu hỏi mở / Hướng nghiên cứu tiếp theo

  • Phân tích kết hợp biến định tính và định lượng: Liệu việc tích hợp các biến định lượng như tuổi, số lần mua hàng, chi tiêu trung bình sẽ giúp hiểu rõ hơn về hành vi và giá trị khách hàng?

  • Phân tích hành vi theo thời gian: Có những xu hướng thay đổi nào trong sở thích sản phẩm hoặc đặc điểm khách hàng theo thời gian (ví dụ theo mùa hoặc theo năm)?

  • Tác động của các yếu tố xã hội khác: Liệu các yếu tố như vùng địa lý, trình độ học vấn, nghề nghiệp có ảnh hưởng như thế nào đến hành vi mua sắm của khách hàng?

  • Ứng dụng mô hình dự đoán: Có thể xây dựng các mô hình dự đoán hành vi khách hàng dựa trên các đặc điểm định tính và định lượng đã phân tích để tối ưu hóa chiến lược marketing và bán hàng?

LS0tDQp0aXRsZTogIk5oaWVtdnUyIg0KYXV0aG9yOiAiVHLhu4tuaCBUaOG7iyBUaHUgSMOgIg0KZGF0ZTogIjIwMjUtMDUtMjQiDQpvdXRwdXQ6DQogaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNQ0KICAgIHRvY19mbG9hdDoNCiAgICAgIGNvbGxhcHNlZDogeWVzDQogICAgICBzbW9vdGhfc2Nyb2xsOiB5ZXMNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojICoqUEjhuqZOIDE6IFTDjE0gSEnhu4NVIFbDgCBDSFXhuqhOIELhu4ogROG7riBMSeG7hlUqKg0KDQoqKsSQ4buNYyB2w6AgbMOgbSBxdWVuIHbhu5tpIGThu68gbGnhu4d1KioNCg0KYGBge3J9DQojIMSQ4buNYyBmaWxlDQpsaWJyYXJ5KCJjc3YiKQ0KZGF0YSA8LSByZWFkLmNzdigiRDovRG93bmxvYWRzL1N1cGVybWFya2V0IFRyYW5zYWN0aW9ucy5jc3YiLCBoZWFkZXIgPSBUKQ0KDQojIEhp4buDbiB0aOG7iyBj4bqldSB0csO6YyBk4buvIGxp4buHdQ0Kc3RyKGRhdGEpDQoNCiMgSGnhu4NuIHRo4buLIHbDoGkgZMOybmcgxJHhuqd1IHbDoCBjdeG7kWkNCmhlYWQoZGF0YSkNCnRhaWwoZGF0YSkNCg0KIyBDaHV54buDbiBjw6FjIGJp4bq/biDEkeG7i25oIHTDrW5oIHBow7kgaOG7o3Agc2FuZyBmYWN0b3INCmZhY3RvciA8LSBjKCJHZW5kZXIiLCAiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLCAiQW5udWFsSW5jb21lIiwNCiAgICAgICAgICAgICAgICAgICAgIkNpdHkiLCAiU3RhdGVvclByb3ZpbmNlIiwgIkNvdW50cnkiLA0KICAgICAgICAgICAgICAgICAgICAiUHJvZHVjdEZhbWlseSIsICJQcm9kdWN0RGVwYXJ0bWVudCIsICJQcm9kdWN0Q2F0ZWdvcnkiKQ0KDQojIEtp4buDbSB0cmEgYmnhur9uIG7DoG8gdOG7k24gdOG6oWkgdHJvbmcgZGF0YQ0KZmFjdG9yIDwtIGludGVyc2VjdChmYWN0b3IsIG5hbWVzKGRhdGEpKQ0KDQojIENodXnhu4NuIHNhbmcgZmFjdG9yDQpkYXRhW2ZhY3Rvcl0gPC0gbGFwcGx5KGRhdGFbZmFjdG9yXSwgYXMuZmFjdG9yKQ0KDQojIEtp4buDbSB0cmEgbOG6oWkgY+G6pXUgdHLDumMNCnN0cihkYXRhKQ0KYGBgDQoNCioqR2nhuqNpIHRow61jaCBjw6FjIGJp4bq/bioqDQoNCkLhu5kgZOG7ryBsaeG7h3UgKipTdXBlcm1hcmtldCBUcmFuc2FjdGlvbnMqKiBiYW8gZ+G7k20gdGjDtG5nIHRpbiBnaWFvIGThu4tjaCBj4bunYSBraMOhY2ggaMOgbmcgdOG6oWkgc2nDqnUgdGjhu4ssIHbhu5tpICoqMTQsMDU5IHF1YW4gc8OhdCoqIHbDoCAqKjE2IGJp4bq/bioqLiANCg0KROG7ryBsaeG7h3UgY2jhu6lhIGPDoWMgdGjDtG5nIHRpbiDEkWEgZOG6oW5nIG5oxrA6DQoNCi0gVGjDtG5nIHRpbiBraMOhY2ggaMOgbmc6IGdp4bubaSB0w61uaCwgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuLCB0aHUgbmjhuq1wLCBjb24gY8OhaSwgcXV54buBbiBz4bufIGjhu691IG5ow6ANCg0KLSBUaMO0bmcgdGluIMSR4buLYSBsw706IHRow6BuaCBwaOG7kSwgYmFuZywgcXXhu5FjIGdpYQ0KDQotIFRow7RuZyB0aW4gc+G6o24gcGjhuqltOiBuaMOzbSBz4bqjbiBwaOG6qW0sIGxv4bqhaSwgZG9hbmggdGh1LCBz4buRIGzGsOG7o25nIGLDoW4NCg0KRMaw4bubaSDEkcOieSBsw6AgbcO0IHThuqMgY2hpIHRp4bq/dCBjw6FjIGJp4bq/biBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdToNCg0KfCAgICAqKlTDqm4gQmnhur9uKiogICAgICAgICAgIHwgICAgKirDnSBOZ2jEqWEqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqUHVyY2hhc2VEYXRlKiogICAgICAgICB8IE5nw6B5IGdpYW8gZOG7i2NoIG11YSBow6BuZyBkaeG7hW4gcmEgKMSR4buLbmggZOG6oW5nIG5nw6B5L3Row6FuZy9uxINtKS4gICAgICAgICAgICAgICAgIHwNCnwgKipDdXN0b21lcklEKiogICAgICAgICAgfCBNw6MgxJHhu4tuaCBkYW5oIGR1eSBuaOG6pXQgY2hvIG3hu5dpIGtow6FjaCBow6BuZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkdlbmRlcioqICAgICAgICAgICAgICAgfCBHaeG7m2kgdMOtbmggY+G7p2Ega2jDoWNoIGjDoG5nOiAqKk0qKiAoTmFtKSwgKipGKiogKE7hu68pLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipNYXJpdGFsU3RhdHVzKiogICAgICAgIHwgVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuOiAqKlMqKiAoxJDhu5ljIHRow6JuKSwgKipNKiogKMSQw6Mga+G6v3QgaMO0bikuICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipIb21lb3duZXIqKiAgICAgICAgICAgIHwgVMOsbmggdHLhuqFuZyBz4bufIGjhu691IG5ow6A6ICoqWSoqIChDw7MpLCAqKk4qKiAoS2jDtG5nKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkNoaWxkcmVuKiogICAgICAgICAgICAgfCBT4buRIGzGsOG7o25nIGNvbiBjw6FpIGPhu6dhIGtow6FjaCBow6BuZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipBbm51YWxJbmNvbWUqKiAgICAgICAgIHwgTeG7qWMgdGh1IG5o4bqtcCBow6BuZyBuxINtIHRoZW8ga2hv4bqjbmcgKFbDrSBk4bulOiAqKiQzMEsgLSAkNTBLKiopLiAgICAgICAgICAgICAgICAgIHwNCnwgKipDaXR5KiogICAgICAgICAgICAgICAgIHwgVGjDoG5oIHBo4buRIG7GoWkga2jDoWNoIGjDoG5nIHRo4buxYyBoaeG7h24gZ2lhbyBk4buLY2guICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipTdGF0ZW9yUHJvdmluY2UqKiAgICAgIHwgQmFuZyBob+G6t2MgdOG7iW5oICh2w60gZOG7pTogKipDQSoqIGNobyBDYWxpZm9ybmlhLCAqKk9SKiogY2hvIE9yZWdvbikuICAgICAgICAgICAgICAgfA0KfCAqKkNvdW50cnkqKiAgICAgICAgICAgICAgfCBRdeG7kWMgZ2lhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlByb2R1Y3RGYW1pbHkqKiAgICAgICAgfCBOaMOzbSBz4bqjbiBwaOG6qW0gY2jDrW5oOiAqKkZvb2QqKiAoVGjhu7FjIHBo4bqpbSksICoqRHJpbmsqKiAoxJDhu5MgdeG7kW5nKSwgKipOb24tQ29uc3VtYWJsZSoqIChLaMO0bmcgdGnDqnUgZMO5bmcpLiB8DQp8ICoqUHJvZHVjdERlcGFydG1lbnQqKiAgICB8IELhu5kgcGjhuq1uIHPhuqNuIHBo4bqpbSBuaMawICoqU25hY2sgRm9vZHMqKiwgKipGcm96ZW4gRm9vZHMqKiwgdi52LiAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlByb2R1Y3RDYXRlZ29yeSoqICAgICAgfCBEYW5oIG3hu6VjIHPhuqNuIHBo4bqpbSBj4bulIHRo4buDIGjGoW4sIHbDrSBk4bulOiAqKkNhbmR5KiosICoqQmVlciBhbmQgV2luZSoqLiAgICAgICAgICAgICAgfA0KfCAqKlVuaXRzU29sZCoqICAgICAgICAgICAgfCBT4buRIGzGsOG7o25nIMSRxqFuIHbhu4sgc+G6o24gcGjhuqltIMSRw6MgYsOhbiB0cm9uZyBnaWFvIGThu4tjaCDEkcOzLiAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqUmV2ZW51ZSoqICAgICAgICAgICAgICB8IERvYW5oIHRodSB04burIGdpYW8gZOG7i2NoICh0w61uaCB0aGVvIFVTRCkuICAgfA0KDQoNClRyxrDhu5tjIGtoaSB0aeG6v24gaMOgbmggdGjhu5FuZyBrw6ogbcO0IHThuqMgY8OhYyBiaeG6v24gdHJvbmcgYuG7mSBk4buvIGxp4buHdSwgdGEgdGnhur9uIGjDoG5oIHBow6JuIGxv4bqhaSBk4buvIGxp4buHdSB0aMOgbmggMiBuaMOzbSBiYW8gZ+G7k206IGThu68gbGnhu4d1IMSR4buLbmggdMOtbmggdsOgIGThu68gbGnhu4d1IMSR4buLbmggbMaw4bujbmcgbmjGsCBzYXU6DQoNCioqUGjDom4gbG/huqFpIGJp4bq/biB0aGVvIGtp4buDdSBk4buvIGxp4buHdToqKg0KDQoqKkThu68gbGnhu4d1IMSQ4buLbmggdMOtbmg6KioNCg0KfCAgICAqKlTDqm4gQmnhur9uKiogICAgICAgICAgIHwgICAgKirDnSBOZ2jEqWEqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18DQp8ICoqR2VuZGVyKiogICAgICAgICAgICAgICB8IEdp4bubaSB0w61uaCBj4bunYSBraMOhY2ggaMOgbmc6ICoqTSoqIChOYW0pLCAqKkYqKiAoTuG7rykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKk1hcml0YWxTdGF0dXMqKiAgICAgICAgfCBUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom46ICoqUyoqICjEkOG7mWMgdGjDom4pLCAqKk0qKiAoxJDDoyBr4bq/dCBow7RuKS4gICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkhvbWVvd25lcioqICAgICAgICAgICAgfCBUw6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoDogKipZKiogKEPDsyksICoqTioqIChLaMO0bmcpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqQW5udWFsSW5jb21lKiogICAgICAgICB8IE3hu6ljIHRodSBuaOG6rXAgaMOgbmcgbsSDbSB0aGVvIGtob+G6o25nIChWw60gZOG7pTogKiokMzBLIC0gJDUwSyoqKS4gICAgICAgICAgICAgICAgICB8DQp8ICoqQ2l0eSoqICAgICAgICAgICAgICAgICB8IFRow6BuaCBwaOG7kSBuxqFpIGtow6FjaCBow6BuZyB0aOG7sWMgaGnhu4duIGdpYW8gZOG7i2NoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqU3RhdGVvclByb3ZpbmNlKiogICAgICB8IEJhbmcgaG/hurdjIHThu4luaCAodsOtIGThu6U6ICoqQ0EqKiBjaG8gQ2FsaWZvcm5pYSwgKipPUioqIGNobyBPcmVnb24pLiAgICAgICAgICAgICAgIHwNCnwgKipDb3VudHJ5KiogICAgICAgICAgICAgIHwgUXXhu5FjIGdpYS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipQcm9kdWN0RmFtaWx5KiogICAgICAgIHwgTmjDs20gc+G6o24gcGjhuqltIGNow61uaDogKipGb29kKiogKFRo4buxYyBwaOG6qW0pLCAqKkRyaW5rKiogKMSQ4buTIHXhu5FuZyksICoqTm9uLUNvbnN1bWFibGUqKiAoS2jDtG5nIHRpw6p1IGTDuW5nKS4gfA0KfCAqKlByb2R1Y3REZXBhcnRtZW50KiogICAgfCBC4buZIHBo4bqtbiBz4bqjbiBwaOG6qW0gbmjGsCAqKlNuYWNrIEZvb2RzKiosICoqRnJvemVuIEZvb2RzKiosIHYudi4gICAgICAgICAgICAgICAgICAgIHwNCnwgKipQcm9kdWN0Q2F0ZWdvcnkqKiAgICAgIHwgRGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY+G7pSB0aOG7gyBoxqFuLCB2w60gZOG7pTogKipDYW5keSoqLCAqKkJlZXIgYW5kIFdpbmUqKi4gICAgICAgICAgICAgIHwNCg0KKipE4buvIGxp4buHdSDEkOG7i25oIGzGsOG7o25nOioqDQoNCnwgICAgKipUw6puIEJp4bq/bioqICAgICAgICAgICB8ICAgICoqw50gTmdoxKlhKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KfCAqKkNoaWxkcmVuKiogICAgICAgICAgICAgfCBT4buRIGzGsOG7o25nIGNvbiBjw6FpIGPhu6dhIGtow6FjaCBow6BuZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipVbml0c1NvbGQqKiAgICAgICAgICAgIHwgU+G7kSBsxrDhu6NuZyDEkcahbiB24buLIHPhuqNuIHBo4bqpbSDEkcOjIGLDoW4gdHJvbmcgZ2lhbyBk4buLY2ggxJHDsy4gICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKlJldmVudWUqKiAgICAgICAgICAgICAgfCBEb2FuaCB0aHUgdOG7qyBnaWFvIGThu4tjaCAodMOtbmggdGhlbyBVU0QpLiAgIHwNCg0KKipLaeG7g20gdHJhIGdpw6EgdHLhu4sgTkEqKg0KDQpUcsaw4bubYyBraGkgdGnhur9uIGjDoG5oIHBow6JuIHTDrWNoIGThu68gbGnhu4d1LCBjaMO6bmcgdGEgY+G6p24ga2nhu4NtIHRyYSB2w6AgeOG7rSBsw70gY8OhYyBnacOhIHRy4buLIGLhu4sgdGhp4bq/dSBuaOG6sW0gxJHhuqNtIGLhuqNvIMSR4buZIGNow61uaCB4w6FjIHbDoCB0w61uaCB0b8OgbiB24bq5biBj4bunYSBr4bq/dCBxdeG6oyBwaMOibiB0w61jaC4NCg0KYGBge3J9DQpzdW0oaXMubmEoZGF0YSkpDQp3aGljaChpcy5uYShkYXRhKSkNCmBgYA0KQ+G6oyBoYWkgbOG7h25oIMSR4buBdSB0cuG6oyB24buBIGvhur90IHF14bqjIGNobyB0aOG6pXkga2jDtG5nIHThu5NuIHThuqFpIGdpw6EgdHLhu4sgdGhp4bq/dToNCg0KLSAqKnN1bShpcy5uYShkYXRhKSkqKiB0cuG6oyB24buBIDAsIG5naMSpYSBsw6Aga2jDtG5nIGPDsyBnacOhIHRy4buLIE5BIG7DoG8uDQoNCi0gKip3aGljaChpcy5uYShkYXRhKSkqKiB0cuG6oyB24buBIGludGVnZXIoMCksIG5naMSpYSBsw6Aga2jDtG5nIGPDsyB24buLIHRyw60gbsOgbyBjaOG7qWEgTkEuDQoNCsSQaeG7gXUgbsOgeSBjaG8gcGjDqXAgY2jDum5nIHRhIHRp4bq/cCB04bulYyBjw6FjIGLGsOG7m2MgeOG7rSBsw70gZOG7ryBsaeG7h3UgdsOgIHBow6JuIHTDrWNoIG3DoCBraMO0bmcgY+G6p24gdGjhu7FjIGhp4buHbiBixrDhu5tjIHjhu60gbMO9IGdpw6EgdHLhu4sgdGhp4bq/dS4NCg0KKipU4bqhbyBi4buZIGThu68gbGnhu4d1IGNo4buJIGPDsyBiaeG6v24gxJHhu4tuaCB0w61uaCoqDQoNCmBgYHtyfQ0KZGF0YURUIDwtIGMoIkdlbmRlciIsICJNYXJpdGFsU3RhdHVzIiwgIkhvbWVvd25lciIsICJBbm51YWxJbmNvbWUiLCANCiAgICAgICAgICAgICJDaXR5IiwgIlN0YXRlb3JQcm92aW5jZSIsICJDb3VudHJ5IiwgDQogICAgICAgICAgICAiUHJvZHVjdEZhbWlseSIsICJQcm9kdWN0RGVwYXJ0bWVudCIsICJQcm9kdWN0Q2F0ZWdvcnkiKQ0KZGF0YURUIDwtIGRhdGFbLGRhdGFEVF0gDQpzdHIoZGF0YURUKQ0KYGBgDQotLS0NCg0KIyAqKlBI4bqmTiAyOiBQSMOCTiBUw41DSCBNw5QgVOG6oiBN4buYVCBCSeG6vk4gxJDhu4pOSCBUw41OSCoqDQoNCiMjICoqQmnhur9uIEdlbmRlcioqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YURUJEdlbmRlcikNCiNC4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZShkYXRhRFQkR2VuZGVyKS9zdW0odGFibGUoZGF0YURUJEdlbmRlcikpDQpgYGANCg0KKipW4bq9IGJp4buDdSDEkeG7kyBj4buZdCoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCg0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kQ0KZnJlcTEgPC0gdGFibGUoZGF0YURUJEdlbmRlcikNCg0KIyBDaHV54buDbiB0aMOgbmggZGF0YSBmcmFtZQ0KR2VuZGVyIDwtIGFzLmRhdGEuZnJhbWUoZnJlcTEpDQpjb2xuYW1lcyhHZW5kZXIpIDwtIGMoIkdlbmRlciIsICJDb3VudCIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQNCmdncGxvdChHZW5kZXIsIGFlcyh4ID0gR2VuZGVyLCB5ID0gQ291bnQsIGZpbGwgPSBHZW5kZXIpKSArDQogIGdlb21fY29sKGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJNIiA9ICIjQUREOEU2IiwgIkYiID0gIiNDRDVDNUMiKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIkdlbmRlciIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSANCmBgYA0KDQoqKlbhur0gYmnhu4N1IMSR4buTIHRyw7JuKioNCmBgYHtyfQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KcGllKGZyZXExLA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyhmcmVxMSksICIgKCIsIHJvdW5kKDEwMCAqIGZyZXExIC8gc3VtKGZyZXExKSwgMSksICIlKSIpLA0KICAgIGNvbCA9IGMoIiNDRDVDNUMiLCAiI0FERDhFNiIpLCAgDQogICAgbWFpbiA9ICJHZW5kZXIiKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSBE4buxYSB2w6BvIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQsIGPDsyB0aOG7gyB0aOG6pXkgcuG6sW5nIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgaGnhu4duIHThuqFpIGPDsyBgciB0YWJsZShkYXRhRFQkR2VuZGVyKVsxXWAga2jDoWNoIGjDoG5nIGzDoCBu4buvIHbDoCBgciB0YWJsZShkYXRhRFQkR2VuZGVyKVsyXWAga2jDoWNoIGjDoG5nIGzDoCBuYW0uICANClThu7cgbOG7hyB0xrDGoW5nIOG7qW5nIGzDoCBraG/huqNuZyBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkR2VuZGVyKVsxXSAvIG5yb3coZGF0YURUKSwgMilgJSBu4buvIHbDoCBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkR2VuZGVyKVsyXSAvIG5yb3coZGF0YURUKSwgMilgJSBuYW0uDQoNCi0gS+G6v3QgcXXhuqMgbsOgeSBjaG8gdGjhuqV5IGdp4bubaSB0w61uaCBu4buvIGNoaeG6v20gdOG7tyB0cuG7jW5nIG5o4buJbmggaMahbiB0cm9uZyB04bqtcCBraMOhY2ggaMOgbmcgxJHGsOG7o2Mga2jhuqNvIHPDoXQgKGThu7FhIHRyw6puIGJp4buDdSDEkeG7kyB0csOybikuxJDhu5NuZyB0aOG7nWksIGJp4buDdSDEkeG7kyBj4buZdCBtaW5oIGjhu41hIHRy4buxYyBxdWFuIGNobyB0aOG6pXkgc+G7sSBjaMOqbmggbOG7h2NoIGtow7RuZyBxdcOhIGzhu5tuIGdp4buvYSBoYWkgZ2nhu5tpLCBuaMawbmcgbuG7ryB24bqrbiBjaGnhur9tIMawdSB0aOG6vyBuaOG6uSB24buBIG3hurd0IHPhu5EgbMaw4bujbmcuDQoNCiMjICoqQmnhur9uIE1hcml0YWxTdGF0dXMqKg0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojQuG6o25nIHThuqduIHPhu5ENCnRhYmxlKGRhdGFEVCRNYXJpdGFsU3RhdHVzKQ0KI0LhuqNuZyB04bqnbiBzdeG6pXQNCnRhYmxlKGRhdGFEVCRNYXJpdGFsU3RhdHVzKS9zdW0odGFibGUoZGF0YURUJE1hcml0YWxTdGF0dXMpKQ0KYGBgDQoNCioqVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQqKg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRDQpmcmVxMiA8LSB0YWJsZShkYXRhRFQkTWFyaXRhbFN0YXR1cykNCg0KIyBDaHV54buDbiB0aMOgbmggZGF0YSBmcmFtZQ0KTWFyaXRhbFN0YXR1cyA8LSBhcy5kYXRhLmZyYW1lKGZyZXEyKQ0KY29sbmFtZXMoTWFyaXRhbFN0YXR1cykgPC0gYygiTWFyaXRhbFN0YXR1cyIsICJDb3VudCIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQNCmdncGxvdChNYXJpdGFsU3RhdHVzLCBhZXMoeCA9IE1hcml0YWxTdGF0dXMsIHkgPSBDb3VudCwgZmlsbCA9IE1hcml0YWxTdGF0dXMpKSArDQogIGdlb21fY29sKGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJTIiA9ICIjRkZENzAwIiwgIk0iID0gIiNEQ0RDREMiKSkgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gIk1hcml0YWxTdGF0dXMiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoqKlbhur0gYmnhu4N1IMSR4buTIHRyw7JuKioNCmBgYHtyfQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KcGllKGZyZXEyLA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyhmcmVxMiksICIgKCIsIHJvdW5kKDEwMCAqIGZyZXEyIC8gc3VtKGZyZXEyKSwgMSksICIlKSIpLA0KICAgIGNvbCA9IGMoIiNGRkQ3MDAiLCAiI0RDRENEQyIpLCAgDQogICAgbWFpbiA9ICJNYXJpdGFsU3RhdHVzIikNCmBgYA0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCi0gROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0LCB0YSB0aOG6pXkgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgY8OzIGByIHRhYmxlKGRhdGFEVCRNYXJpdGFsU3RhdHVzKVsiUyJdYCBraMOhY2ggaMOgbmcgdGh14buZYyBuaMOzbSDEkeG7mWMgdGjDom4gKFNpbmdsZSkgdsOgIGByIHRhYmxlKGRhdGFEVCRNYXJpdGFsU3RhdHVzKVsiTSJdYCBraMOhY2ggaMOgbmcgdGh14buZYyBuaMOzbSDEkcOjIGvhur90IGjDtG4gKE1hcnJpZWQpLiAgDQpU4bu3IGzhu4cgdMawxqFuZyDhu6luZyBsw6AgYHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJE1hcml0YWxTdGF0dXMpWyJTIl0gLyBucm93KGRhdGFEVCksIDIpYCUgxJHhu5ljIHRow6JuIHbDoCBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkTWFyaXRhbFN0YXR1cylbIk0iXSAvIG5yb3coZGF0YURUKSwgMilgJSDEkcOjIGvhur90IGjDtG4uDQoNCi0gQmnhu4N1IMSR4buTIGPhu5l0IG1pbmggaOG7jWEgcsO1IHLDoG5nIHLhurFuZyBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyDEkeG7mWMgdGjDom4gbmjhu4luaCBoxqFuIG3hu5l0IGNow7p0IHNvIHbhu5tpIG5ow7NtIMSRw6Mga+G6v3QgaMO0bi4gQmnhu4N1IMSR4buTIHRyw7JuIGPFqW5nIGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buRIGtow6EgY8OibiBi4bqxbmcgZ2nhu69hIGhhaSBuaMOzbSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4uICANCsSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGThu68gbGnhu4d1IGPDsyB0w61uaCDEkeG6oWkgZGnhu4duIHThu5F0IGNobyBj4bqjIGhhaSBuaMOzbSwgdHLDoW5oIMSRxrDhu6NjIHTDrG5oIHRy4bqhbmcgdGhpw6puIGzhu4djaCBt4bqrdSB0cm9uZyBuZ2hpw6puIGPhu6l1Lg0KDQojIyAqKkJp4bq/biBIb21lb3duZXIqKg0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojQuG6o25nIHThuqduIHPhu5ENCnRhYmxlKGRhdGFEVCRIb21lb3duZXIpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YURUJEhvbWVvd25lcikvc3VtKHRhYmxlKGRhdGFEVCRIb21lb3duZXIpKQ0KYGBgDQoNCioqVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQqKg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRDQpmcmVxMyA8LSB0YWJsZShkYXRhRFQkSG9tZW93bmVyKQ0KDQojIENodXnhu4NuIHRow6BuaCBkYXRhIGZyYW1lDQpob21lb3duZXIgPC0gYXMuZGF0YS5mcmFtZShmcmVxMykNCmNvbG5hbWVzKGhvbWVvd25lcikgPC0gYygiSG9tZW93bmVyIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdA0KZ2dwbG90KGhvbWVvd25lciwgYWVzKHggPSBIb21lb3duZXIsIHkgPSBDb3VudCwgZmlsbCA9IEhvbWVvd25lcikpICsNCiAgZ2VvbV9jb2woY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIk4iID0gIiNGREI0NjIiLCAiWSIgPSAiI0U2RTZGQSIpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiSG9tZW93bmVyIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQoNCioqVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4qKg0KYGBge3J9DQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUoZnJlcTMsDQogICAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKGZyZXEzKSwgIiAoIiwgcm91bmQoMTAwICogZnJlcTMgLyBzdW0oZnJlcTMpLCAxKSwgIiUpIiksDQogICAgY29sID0gYygiI0ZEQjQ2MiIsICIjRTZFNkZBIiksICAjIG3DoHUgdMO5eSBjaOG7jW4NCiAgICBtYWluID0gIkhvbWVvd25lciIpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotIEThu7FhIHRyw6puIGLhuqNuZyB04bqnbiBz4buRLCBjw7MgYHIgc3VtKGRhdGFEVCRIb21lb3duZXIgPT0gIk4iKWAga2jDoWNoIGjDoG5nIGNoxrBhIGPDsyBuaMOgIHbDoCBgciBzdW0oZGF0YURUJEhvbWVvd25lciA9PSAiWSIpYCBraMOhY2ggaMOgbmcgxJHDoyBjw7MgbmjDoC4gWMOpdCB24buBIHThu7cgbOG7hywgbmjDs20gY2jGsGEgY8OzIG5ow6AgY2hp4bq/bSBraG/huqNuZyBgciByb3VuZCgxMDAgKiBzdW0oZGF0YURUJEhvbWVvd25lciA9PSAiTiIpIC8gbnJvdyhkYXRhRFQpLCAyKWAlLCB0cm9uZyBraGkgbmjDs20gxJHDoyBjw7MgbmjDoCBjaGnhur9tIGByIHJvdW5kKDEwMCAqIHN1bShkYXRhRFQkSG9tZW93bmVyID09ICJZIikgLyBucm93KGRhdGFEVCksIDIpYCUuDQoNCi0gQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiByw7UgcuG6sW5nIHBo4bqnbiBs4bubbiBraMOhY2ggaMOgbmcgdHJvbmcgZOG7ryBsaeG7h3UgdGh14buZYyBuaMOzbSDEkcOjIGPDsyBuaMOgLCBjaG8gdGjhuqV5IGto4bqjIG7Eg25nIHTDoGkgY2jDrW5oIHTGsMahbmcgxJHhu5FpIOG7lW4gxJHhu4tuaCBob+G6t2MgdGh14buZYyBuaMOzbSBraMOhY2ggaMOgbmcgdHJ1bmcgbmnDqm4gdHLhu58gbMOqbi4gQmnhu4N1IMSR4buTIHRyw7JuIGLhu5Ugc3VuZyBnw7NjIG5ow6xuIHRy4buxYyBxdWFuLCBjaG8gdGjhuqV5IHPhu7EgY2jDqm5oIGzhu4djaCByw7UgcuG7h3QgZ2nhu69hIGhhaSBuaMOzbSwgdHV5IGNoxrBhIMSR4bq/biBt4bupYyDDoXAgxJHhuqNvIHR1eeG7h3QgxJHhu5FpLg0KDQojIyAqKkJp4bq/biBBbm51YWxJbmNvbWUqKg0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojQuG6o25nIHThuqduIHPhu5ENCnRhYmxlKGRhdGFEVCRBbm51YWxJbmNvbWUpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YURUJEFubnVhbEluY29tZSkvc3VtKHRhYmxlKGRhdGFEVCRBbm51YWxJbmNvbWUpKQ0KYGBgDQoNCioqVuG6vSDEkeG7kyB0aOG7iyoqDQpgYGB7cn0NCiMgVOG6oW8gYuG6o25nIHThuqduIHPhu5ENCmZyZXE0IDwtIHRhYmxlKGRhdGFEVCRBbm51YWxJbmNvbWUpDQoNCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUNCkFubnVhbEluY29tZSA8LSBhcy5kYXRhLmZyYW1lKGZyZXE0KQ0KY29sbmFtZXMoQW5udWFsSW5jb21lKSA8LSBjKCJBbm51YWxJbmNvbWUiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0DQpnZ3Bsb3QoQW5udWFsSW5jb21lLCBhZXMoeCA9IEFubnVhbEluY29tZSwgeSA9IENvdW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiNGRjhDMDAiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIpIA0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EsIG5ow7NtIHRodSBuaOG6rXAgcGjhu5UgYmnhur9uIG5o4bqldCBsw6AgdOG7qyAzMEsg4oCTIDUwSyBVU0QvbsSDbSwgduG7m2kgYHIgdGFibGUoZGF0YURUJEFubnVhbEluY29tZSlbIiQzMEsgLSAkNTBLIl1gIG5nxrDhu51pLCBjaGnhur9tIGtob+G6o25nIGByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRBbm51YWxJbmNvbWUpWyIkMzBLIC0gJDUwSyJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlIHRoZW8gYuG6o25nIHThuqduIHN14bqldC4gVGhlbyBzYXUgbMOgIG5ow7NtIDEwSyDigJMgMzBLIFVTRC9uxINtIHbhu5tpIGByIHRhYmxlKGRhdGFEVCRBbm51YWxJbmNvbWUpWyIkMTBLIC0gJDMwSyJdYCBuZ8aw4budaSAofmByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRBbm51YWxJbmNvbWUpWyIkMTBLIC0gJDMwSyJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlKS4NCg0KLSBOZ8aw4bujYyBs4bqhaSwgY8OhYyBuaMOzbSB0aHUgbmjhuq1wIGNhbyBuaMawICQxNTBLKyBob+G6t2MgJDExMEsg4oCTICQxMzBLIGNoaeG6v20gdOG7tyB0cuG7jW5nIHLhuqV0IG5o4buPIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UgKGNo4buJIGtob+G6o25nIGByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRBbm51YWxJbmNvbWUpWyIkMTUwSysiXSAvIG5yb3coZGF0YURUKSwgMilgJSB2w6AgYHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJEFubnVhbEluY29tZSlbIiQxMTBLIC0gJDEzMEsiXSAvIG5yb3coZGF0YURUKSwgMilgJSksIGNobyB0aOG6pXkgbmjDs20ga2jDoWNoIGjDoG5nIGNow61uaCBu4bqxbSB0cm9uZyBwaMOibiBraMO6YyB0aHUgbmjhuq1wIHRydW5nIGLDrG5oLg0KDQotIEJp4buDdSDEkeG7kyBj4buZdCBnacO6cCBow6xuaCBkdW5nIHLDtSBz4buxIHBow6JuIGLhu5EgdGh1IG5o4bqtcCwgY2hvIHRo4bqleSBwaMOibiBraMO6YyBkxrDhu5tpIDkwSyBjaGnhur9tIHBo4bqnbiBs4bubbiwgxJHhurdjIGJp4buHdCBsw6AgMiBuaMOzbSAzMEsg4oCTIDUwSyB2w6AgMTBLIOKAkyAzMEsuDQoNCg0KIyMgKipCaeG6v24gQ2l0eSoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0LhuqNuZyB04bqnbiBz4buRDQp0YWJsZShkYXRhRFQkQ2l0eSkNCiNC4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZShkYXRhRFQkQ2l0eSkvc3VtKHRhYmxlKGRhdGEkQ2l0eSkpDQpgYGANCg0KKipW4bq9IGJp4buDdSDEkeG7kyBj4buZdCoqDQoNCmBgYHtyfQ0KbGlicmFyeShwYXRjaHdvcmspDQoNCiMgQuG6o25nIHThuqduIHN14bqldCAtPiBkYXRhIGZyYW1lDQpmcmVxNSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRhdGFEVCRDaXR5KSkNCmNvbG5hbWVzKGZyZXE1KSA8LSBjKCJDaXR5IiwgIkNvdW50IikNCg0KIyBT4bqvcCB44bq/cCBnaeG6o20gZOG6p24NCmZyZXE1IDwtIGZyZXE1W29yZGVyKC1mcmVxNSRDb3VudCksIF0NCg0KIyBDaGlhIMSRw7RpIGRhbmggc8OhY2ggdGjDoG5oIHBo4buRDQpuIDwtIG5yb3coZnJlcTUpDQptaWQgPC0gY2VpbGluZyhuIC8gMikNCg0KIyBE4buvIGxp4buHdSBjaG8gYmnhu4N1IMSR4buTIHRo4bupIG5o4bqldCAobuG7rWEgdHLDqm4gdGhlbyB04bqnbiBzdeG6pXQpDQp0b3AgPC0gaGVhZChmcmVxNSwgbWlkKQ0KDQpwbG90MSA8LSBnZ3Bsb3QodG9wLCBhZXMoeCA9IENpdHksIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjRkFGQUQyIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41KSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSA4KSkNCg0KIyBE4buvIGxp4buHdSBjaG8gYmnhu4N1IMSR4buTIHRo4bupIGhhaSAobuG7rWEgZMaw4bubaSB0aGVvIHThuqduIHN14bqldCkNCmJvdHRvbSA8LSB0YWlsKGZyZXE1LCBuIC0gbWlkKQ0KDQpwbG90MiA8LSBnZ3Bsb3QoYm90dG9tLCBhZXMoeCA9IENpdHksIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjRkFGQUQyIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41KSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSA4KSkNCg0KIyBHaMOpcCBoYWkgYmnhu4N1IMSR4buTDQpwbG90MSArIHBsb3QyDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSwgdGjDoG5oIHBo4buRIHh14bqldCBoaeG7h24gcGjhu5UgYmnhur9uIG5o4bqldCBsw6AgU2FsZW0gduG7m2kgYHIgdGFibGUoZGF0YURUJENpdHkpWyJTYWxlbSJdYCBuZ8aw4budaSwgY2hp4bq/bSBraG/huqNuZyBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkQ2l0eSlbIlNhbGVtIl0gLyBucm93KGRhdGFEVCksIDIpYCUgdGhlbyBi4bqjbmcgdOG6p24gc3XhuqV0LiAgDQpUaGVvIHNhdSBsw6AgVGFjb21hIHbDoCBQb3J0bGFuZCB24bubaSBs4bqnbiBsxrDhu6N0IGByIHRhYmxlKGRhdGFEVCRDaXR5KVsiVGFjb21hIl1gIG5nxrDhu51pICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJENpdHkpWyJUYWNvbWEiXSAvIG5yb3coZGF0YURUKSwgMilgJSkgdsOgIGByIHRhYmxlKGRhdGFEVCRDaXR5KVsiUG9ydGxhbmQiXWAgbmfGsOG7nWkgKH5gciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkQ2l0eSlbIlBvcnRsYW5kIl0gLyBucm93KGRhdGFEVCksIDIpYCUpLg0KDQotIE5nxrDhu6NjIGzhuqFpLCBjw6FjIHRow6BuaCBwaOG7kSBuaMawIEd1YWRhbGFqYXJhIGhv4bq3YyBWaWN0b3JpYSBjw7Mgc+G7kSBsxrDhu6NuZyBy4bqldCDDrXQsIGNo4buJIGzhuqduIGzGsOG7o3QgYHIgdGFibGUoZGF0YURUJENpdHkpWyJHdWFkYWxhamFyYSJdYCB2w6AgYHIgdGFibGUoZGF0YURUJENpdHkpWyJWaWN0b3JpYSJdYCBuZ8aw4budaSwgY2hp4bq/bSBjaMawYSDEkeG6v24gYHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJENpdHkpWyJHdWFkYWxhamFyYSJdIC8gbnJvdyhkYXRhRFQpLCAyKWAlIHbDoCBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkQ2l0eSlbIlZpY3RvcmlhIl0gLyBucm93KGRhdGFEVCksIDIpYCUgdHJvbmcgdG/DoG4gYuG7mSBk4buvIGxp4buHdS4NCg0KLSBCaeG7g3UgxJHhu5MgY+G7mXQgZ2nDunAgdHLhu7FjIHF1YW4gaMOzYSBz4buxIHBow6JuIGLhu5EgdGjDoG5oIHBo4buRLCBjaG8gdGjhuqV5IG3hu5l0IHPhu5EgdGjDoG5oIHBo4buRIG5oxrAgU2FsZW0sIFRhY29tYSB2w6AgUG9ydGxhbmQgY2hp4bq/bSB04bu3IGzhu4cgdsaw4bujdCB0cuG7mWksIHRyb25nIGtoaSBwaOG6p24gbOG7m24gY8OhYyB0aMOgbmggcGjhu5EgY8OybiBs4bqhaSBjw7MgdOG6p24gc3XhuqV0IHRo4bqlcC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgZOG7ryBsaeG7h3UgdOG6rXAgdHJ1bmcgdsOgbyBt4buZdCBz4buRIGtodSB24buxYyDEkeG7i2EgbMO9IG5o4bqldCDEkeG7i25oIHRoYXkgdsOsIHBow6JuIGLhu5EgxJHhu5NuZyDEkeG7gXUuDQoNCiMjICoqQmnhur9uIFN0YXRlb3JQcm92aW5jZSoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0LhuqNuZyB04bqnbiBz4buRDQp0YWJsZShkYXRhRFQkU3RhdGVvclByb3ZpbmNlKQ0KI0LhuqNuZyB04bqnbiBzdeG6pXQNCnRhYmxlKGRhdGFEVCRTdGF0ZW9yUHJvdmluY2UpL3N1bSh0YWJsZShkYXRhRFQkU3RhdGVvclByb3ZpbmNlKSkNCmBgYA0KDQoqKlbhur0gYmnhu4N1IMSR4buTIGPhu5l0KioNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kQ0KZnJlcTYgPC0gdGFibGUoZGF0YURUJFN0YXRlb3JQcm92aW5jZSkNCg0KIyBDaHV54buDbiB0aMOgbmggZGF0YSBmcmFtZQ0KU3RhdGVvclByb3ZpbmNlIDwtIGFzLmRhdGEuZnJhbWUoZnJlcTYpDQpjb2xuYW1lcyhTdGF0ZW9yUHJvdmluY2UpIDwtIGMoIlN0YXRlb3JQcm92aW5jZSIsICJDb3VudCIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQNCmdncGxvdChTdGF0ZW9yUHJvdmluY2UsIGFlcyh4ID0gU3RhdGVvclByb3ZpbmNlLCB5ID0gQ291bnQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiIzk4RkI5OCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIikgDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gROG7sWEgdHLDqm4gYuG6o25nIHThuqduIHPhu5EsIHRp4buDdSBiYW5nIGPDsyBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBs4bubbiBuaOG6pXQgbMOgIFdBIChXYXNoaW5ndG9uKSB24bubaSBgciB0YWJsZShkYXRhRFQkU3RhdGVvclByb3ZpbmNlKVsiV0EiXWAgbmfGsOG7nWksIGNoaeG6v20ga2hv4bqjbmcgYHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJFN0YXRlb3JQcm92aW5jZSlbIldBIl0gLyBucm93KGRhdGFEVCksIDIpYCUgdG/DoG4gYuG7mSBk4buvIGxp4buHdS4gDQoNCi0gVGhlbyBzYXUgbMOgIENBIChDYWxpZm9ybmlhKSB24bubaSBgciB0YWJsZShkYXRhRFQkU3RhdGVvclByb3ZpbmNlKVsiQ0EiXWAga2jDoWNoIGjDoG5nICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJFN0YXRlb3JQcm92aW5jZSlbIkNBIl0gLyBucm93KGRhdGFEVCksIDIpYCUpIHbDoCBCQyAoQnJpdGlzaCBDb2x1bWJpYSkgduG7m2kgYHIgdGFibGUoZGF0YURUJFN0YXRlb3JQcm92aW5jZSlbIkJDIl1gIG5nxrDhu51pICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJFN0YXRlb3JQcm92aW5jZSlbIkJDIl0gLyBucm93KGRhdGFEVCksIDIpYCUpLk5nxrDhu6NjIGzhuqFpLCBt4buZdCBz4buRIHRp4buDdSBiYW5nIG5oxrAgSmFsaXNjbywgVmVyYWNydXogdsOgIEd1ZXJyZXJvIGPDsyBz4buRIGzGsOG7o25nIGtow6FjaCBow6BuZyBy4bqldCB0aOG6pXAsIGTGsOG7m2kgNSUgbeG7l2kgbmjDs20uDQoNCi0gQmnhu4N1IMSR4buTIGPhu5l0IGNobyB0aOG6pXkgc+G7sSBwaMOibiBi4buRIGtow7RuZyDEkeG7gXUgZ2nhu69hIGPDoWMgdGnhu4N1IGJhbmcsIHRyb25nIMSRw7MgV0EgdsOgIENBIGNoaeG6v20gcGjhuqduIGzhu5tuIGThu68gbGnhu4d1LiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBoYWkgdGnhu4N1IGJhbmcgbsOgeSBjw7MgdGjhu4MgbMOgIHRo4buLIHRyxrDhu51uZyBjaMOtbmggaG/hurdjIGPDsyBt4bqhbmcgbMaw4bubaSBwaMOibiBwaOG7kWkgbeG6oW5oIGjGoW4gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgbsOgeS4NCg0KIyMgKipCaeG6v24gQ291bnRyeSoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KI0LhuqNuZyB04bqnbiBz4buRDQp0YWJsZShkYXRhRFQkQ291bnRyeSkNCiNC4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZShkYXRhRFQkQ291bnRyeSkvc3VtKHRhYmxlKGRhdGFEVCRDb3VudHJ5KSkNCmBgYA0KDQoqKlbhur0gYmnhu4N1IMSR4buTIGPhu5l0KioNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kQ0KZnJlcTcgPC0gdGFibGUoZGF0YURUJENvdW50cnkpDQoNCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUNCkNvdW50cnkgPC0gYXMuZGF0YS5mcmFtZShmcmVxNykNCmNvbG5hbWVzKENvdW50cnkpIDwtIGMoIkNvdW50cnkiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0DQpnZ3Bsb3QoQ291bnRyeSwgYWVzKHggPSBDb3VudHJ5LCB5ID0gQ291bnQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0ZGQzBDQiIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIikgDQpgYGANCg0KKipW4bq9IGJp4buDdSDEkeG7kyB0csOybioqDQoNCmBgYHtyfQ0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KcGllKGZyZXE3LA0KICAgIGxhYmVscyA9IHBhc3RlMChuYW1lcyhmcmVxNyksICIgKCIsIHJvdW5kKDEwMCAqIGZyZXE3IC8gc3VtKGZyZXE3KSwgMSksICIlKSIpLA0KICAgIGNvbCA9IGMoIiNGRkMwQ0IiLCAiI0FERDhFNiIsICIjQkE1NUQzIiksICANCiAgICBtYWluID0gIkNvdW50cnkiKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EsIHBo4bqnbiBs4bubbiBraMOhY2ggaMOgbmcgdHJvbmcgZOG7ryBsaeG7h3UgxJHhur9uIHThu6sgVVNBIHbhu5tpIGByIHRhYmxlKGRhdGFEVCRDb3VudHJ5KVsiVVNBIl1gIG5nxrDhu51pLCBjaGnhur9tIGtob+G6o25nIGByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRDb3VudHJ5KVsiVVNBIl0gLyBucm93KGRhdGFEVCksIDIpYCUgdOG7lW5nIHPhu5EgcXVhbiBzw6F0LiBUaGVvIHNhdSBsw6AgTWV4aWNvIHbhu5tpIGByIHRhYmxlKGRhdGFEVCRDb3VudHJ5KVsiTWV4aWNvIl1gIG5nxrDhu51pICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJENvdW50cnkpWyJNZXhpY28iXSAvIG5yb3coZGF0YURUKSwgMilgJSksIHbDoCBDYW5hZGEgY2jhu4kgY8OzIGByIHRhYmxlKGRhdGFEVCRDb3VudHJ5KVsiQ2FuYWRhIl1gIG5nxrDhu51pICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJENvdW50cnkpWyJDYW5hZGEiXSAvIG5yb3coZGF0YURUKSwgMilgJSkuDQoNCi0gQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiByw7UgcuG6sW5nIFVTQSBsw6AgcXXhu5FjIGdpYSBjaGnhur9tIMawdSB0aOG6vyB0cm9uZyB04bqtcCBk4buvIGxp4buHdSwgduG7m2kgc+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgdsaw4bujdCB0cuG7mWkgc28gduG7m2kgTWV4aWNvIHbDoCBDYW5hZGEuIEJp4buDdSDEkeG7kyB0csOybiBi4buVIHN1bmcgZ8OzYyBuaMOsbiB0cuG7sWMgcXVhbiwgY2hvIHRo4bqleSBwaOG6p24gaMOsbmggdHLDsm4gxJHhuqFpIGRp4buHbiBjaG8gVVNBIGzhu5tuIGfhuqVwIG5oaeG7gXUgbOG6p24gaGFpIG5ow7NtIGPDsm4gbOG6oWkuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyB04bqtcCBk4buvIGxp4buHdSBjaOG7pyB54bq/dSB04bqtcCB0cnVuZyB2w6BvIHRo4buLIHRyxrDhu51uZyBN4bu5LCB0cm9uZyBraGkgTWV4aWNvIHbDoCBDYW5hZGEgxJHDs25nIHZhaSB0csOyIG5o4buPIGjGoW4gdHJvbmcgcGjDom4gcGjhu5FpIGtow6FjaCBow6BuZy4NCg0KIyMgKipCaeG6v24gUHJvZHVjdCBGYW1pbHkqKg0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCiNC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YURUJFByb2R1Y3RGYW1pbHkpDQojQuG6o25nIHThuqduIHN14bqldA0KdGFibGUoZGF0YURUJFByb2R1Y3RGYW1pbHkpL3N1bSh0YWJsZShkYXRhRFQkUHJvZHVjdEZhbWlseSkpDQpgYGANCg0KDQoqKlbhur0gYmnhu4N1IMSR4buTIGPhu5l0KioNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kQ0KZnJlcTggPC0gdGFibGUoZGF0YURUJFByb2R1Y3RGYW1pbHkpDQoNCiMgQ2h1eeG7g24gdGjDoG5oIGRhdGEgZnJhbWUNClByb2R1Y3RGYW1pbHkgPC0gYXMuZGF0YS5mcmFtZShmcmVxOCkNCmNvbG5hbWVzKFByb2R1Y3RGYW1pbHkpIDwtIGMoIlByb2R1Y3RGYW1pbHkiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0DQpnZ3Bsb3QoUHJvZHVjdEZhbWlseSwgYWVzKHggPSBQcm9kdWN0RmFtaWx5LCB5ID0gQ291bnQpKSArDQogIGdlb21fY29sKGZpbGwgPSAiI0FERDhFNiIsIGNvbG9yID0gImJsYWNrIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gQ291bnQpLCB2anVzdCA9IC0wLjUsIGNvbG9yID0gImJsYWNrIikgDQpgYGANCg0KDQoqKlbhur0gYmnhu4N1IMSR4buTIHRyw7JuKioNCg0KYGBge3J9DQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUoZnJlcTgsDQogICAgbGFiZWxzID0gcGFzdGUwKG5hbWVzKGZyZXE4KSwgIiAoIiwgcm91bmQoMTAwICogZnJlcTggLyBzdW0oZnJlcTgpLCAxKSwgIiUpIiksDQogICAgY29sID0gYygiI0ZGQzBDQiIsICIjQUREOEU2IiwgIiNCQTU1RDMiKSwgIA0KICAgIG1haW4gPSAiUHJvZHVjdEZhbWlseSIpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gROG7sWEgdsOgbyBi4bqjbmcgdOG6p24gc+G7kSwgcGjhuqduIGzhu5tuIHPhuqNuIHBo4bqpbSB0cm9uZyBk4buvIGxp4buHdSB0aHXhu5ljIG5ow7NtIEZvb2QgduG7m2kgYHIgdGFibGUoZGF0YURUJFByb2R1Y3RGYW1pbHkpWyJGb29kIl1gIHPhuqNuIHBo4bqpbSwgY2hp4bq/bSBraG/huqNuZyBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkUHJvZHVjdEZhbWlseSlbIkZvb2QiXSAvIHN1bSh0YWJsZShkYXRhRFQkUHJvZHVjdEZhbWlseSkpLCAyKWAlIHThu5VuZyBz4buRIHF1YW4gc8OhdC4gIA0KVGhlbyBzYXUgbMOgIG5ow7NtIE5vbi1Db25zdW1hYmxlIHbhu5tpIGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0RmFtaWx5KVsiTm9uLUNvbnN1bWFibGUiXWAgc+G6o24gcGjhuqltICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJFByb2R1Y3RGYW1pbHkpWyJOb24tQ29uc3VtYWJsZSJdIC8gc3VtKHRhYmxlKGRhdGFEVCRQcm9kdWN0RmFtaWx5KSksIDIpYCUpLCB2w6AgRHJpbmsgY2jhu4kgY8OzIGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0RmFtaWx5KVsiRHJpbmsiXWAgc+G6o24gcGjhuqltICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJFByb2R1Y3RGYW1pbHkpWyJEcmluayJdIC8gc3VtKHRhYmxlKGRhdGFEVCRQcm9kdWN0RmFtaWx5KSksIDIpYCUpLg0KDQotIEJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gcsO1IHLhurFuZyBGb29kIGzDoCBuaMOzbSBz4bqjbiBwaOG6qW0gY2hp4bq/bSDGsHUgdGjhur8gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UsIHbhu5tpIHPhu5EgbMaw4bujbmcgdsaw4bujdCB0cuG7mWkgc28gduG7m2kgaGFpIG5ow7NtIGPDsm4gbOG6oWkuQmnhu4N1IMSR4buTIHRyw7JuIGLhu5Ugc3VuZyBnw7NjIG5ow6xuIHRy4buxYyBxdWFuLCBjaG8gdGjhuqV5IHBo4bqnbiBow6xuaCB0csOybiDEkeG6oWkgZGnhu4duIGNobyBGb29kIGzhu5tuIGjGoW4gbmhp4buBdSBzbyB24bubaSBOb24tQ29uc3VtYWJsZSB2w6AgRHJpbmsuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyB04bqtcCBk4buvIGxp4buHdSB04bqtcCB0cnVuZyBuaGnhu4F1IG5o4bqldCB2w6BvIHPhuqNuIHBo4bqpbSB0aOG7sWMgcGjhuqltLCB0cm9uZyBraGkgY8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0ga2jDtG5nIHRpw6p1IGTDuW5nIHbDoCDEkeG7kyB14buRbmcgY2hp4bq/bSB04bu3IHRy4buNbmcgbmjhu48gaMahbiB0cm9uZyBwaMOibiBwaOG7kWkgc+G6o24gcGjhuqltLg0KDQojIyAqKkJp4bq/biBQcm9kdWN0IERlcGFydG1lbnQqKg0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCiNC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YURUJFByb2R1Y3REZXBhcnRtZW50KQ0KI0LhuqNuZyB04bqnbiBzdeG6pXQNCnRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudCkvc3VtKHRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudCkpDQpgYGANCg0KKipW4bq9IGJp4buBdSDEkeG7kyBj4buZdCoqDQoNCmBgYHtyfQ0KDQojIELhuqNuZyB04bqnbiBzdeG6pXQgLT4gZGF0YSBmcmFtZQ0KZnJlcTkgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXRhRFQkUHJvZHVjdERlcGFydG1lbnQpKQ0KY29sbmFtZXMoZnJlcTkpIDwtIGMoIlByb2R1Y3REZXBhcnRtZW50IiwgIkNvdW50IikNCg0KIyBT4bqvcCB44bq/cCBnaeG6o20gZOG6p24NCmZyZXE5IDwtIGZyZXE5W29yZGVyKC1mcmVxOSRDb3VudCksIF0NCg0KIyBDaGlhIMSRw7RpIGRhbmggc8OhY2ggdGjDoG5oIHBo4buRDQpuMSA8LSBucm93KGZyZXE5KQ0KbWlkMSA8LSBjZWlsaW5nKG4xIC8gMikNCg0KIyBE4buvIGxp4buHdSBjaG8gYmnhu4N1IMSR4buTIHRo4bupIG5o4bqldCAobuG7rWEgdHLDqm4gdGhlbyB04bqnbiBzdeG6pXQpDQp0b3AxIDwtIGhlYWQoZnJlcTksIG1pZDEpDQoNCnBsb3QxMSA8LSBnZ3Bsb3QodG9wMSwgYWVzKHggPSBQcm9kdWN0RGVwYXJ0bWVudCwgeSA9IENvdW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiM3MDgwOTAiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDgpKQ0KDQojIEThu68gbGnhu4d1IGNobyBiaeG7g3UgxJHhu5MgdGjhu6kgaGFpIChu4butYSBkxrDhu5tpIHRoZW8gdOG6p24gc3XhuqV0KQ0KYm90dG9tMSA8LSB0YWlsKGZyZXE5LCBuMSAtIG1pZDEpDQoNCnBsb3QyMiA8LSBnZ3Bsb3QoYm90dG9tMSwgYWVzKHggPSBQcm9kdWN0RGVwYXJ0bWVudCwgeSA9IENvdW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiM3MDgwOTAiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDgpKQ0KDQojIEdow6lwIGhhaSBiaeG7g3UgxJHhu5MNCnBsb3QxMSArIHBsb3QyMg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EsIG5ow7NtIHPhuqNuIHBo4bqpbSBwaOG7lSBiaeG6v24gbmjhuqV0IGzDoCBQcm9kdWNlIHbhu5tpIGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudClbIlByb2R1Y2UiXWAgc+G6o24gcGjhuqltLCBjaGnhur9tIGtob+G6o25nIGByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudClbIlByb2R1Y2UiXSAvIHN1bSh0YWJsZShkYXRhRFQkUHJvZHVjdERlcGFydG1lbnQpKSwgMilgJSB04buVbmcgc+G7kSBxdWFuIHPDoXQuIFRoZW8gc2F1IGzDoCBjw6FjIG5ow7NtIFNuYWNrIEZvb2RzIChgciB0YWJsZShkYXRhRFQkUHJvZHVjdERlcGFydG1lbnQpWyJTbmFjayBGb29kcyJdYCwgfmByIHJvdW5kKDEwMCAqIHRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudClbIlNuYWNrIEZvb2RzIl0gLyBzdW0odGFibGUoZGF0YURUJFByb2R1Y3REZXBhcnRtZW50KSksIDIpYCUpLCBIb3VzZWhvbGQgKGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudClbIkhvdXNlaG9sZCJdYCksIHbDoCBGcm96ZW4gRm9vZHMgKGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0RGVwYXJ0bWVudClbIkZyb3plbiBGb29kcyJdYCkuDQoNCi0gTmfGsOG7o2MgbOG6oWksIGPDoWMgbmjDs20gw610IHh14bqldCBoaeG7h24gbmjhuqV0IHRyb25nIGThu68gbGnhu4d1IGfhu5NtIENhcm91c2VsIChgciB0YWJsZShkYXRhRFQkUHJvZHVjdERlcGFydG1lbnQpWyJDYXJvdXNlbCJdYCBz4bqjbiBwaOG6qW0pLCBDaGVja291dCAoYHIgdGFibGUoZGF0YURUJFByb2R1Y3REZXBhcnRtZW50KVsiQ2hlY2tvdXQiXWApLCB2w6AgRWdncyAoYHIgdGFibGUoZGF0YURUJFByb2R1Y3REZXBhcnRtZW50KVsiRWdncyJdYCkuDQoNCi0gQmnhu4N1IMSR4buTIGPhu5l0IGLDqm4gdHLDoWkgdGjhu4MgaGnhu4duIHLDtSBz4buxIMOhcCDEkeG6o28gY+G7p2EgbmjDs20gUHJvZHVjZSwgdsaw4bujdCB0cuG7mWkgaOG6s24gduG7gSBz4buRIGzGsOG7o25nIHNvIHbhu5tpIGPDoWMgbmjDs20gY8OybiBs4bqhaS4gQmnhu4N1IMSR4buTIGPhu5l0IGLDqm4gcGjhuqNpIGLhu5Ugc3VuZyB0aMOqbSBjw6FjIG5ow7NtIGPDsyB04bqnbiBz4buRIHRo4bqlcCBoxqFuLCBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIHBow6JuIHTDoW4gcuG7mW5nIGdp4buvYSBjw6FjIG5ow7NtIHPhuqNuIHBo4bqpbS4gIA0KDQotIFThu5VuZyB0aOG7gywgZOG7ryBsaeG7h3UgbmdoacOqbmcgbeG6oW5oIHbhu4EgY8OhYyBt4bq3dCBow6BuZyB0aOG7sWMgcGjhuqltIHTGsMahaSBz4buRbmcgdsOgIMSDbiBuaOG6uSwgdHJvbmcga2hpIGPDoWMgbmjDs20gbmjGsCBz4bqjbiBwaOG6qW0gxJHhurdjIGJp4buHdCAoQ2Fyb3VzZWwsIENoZWNrb3V0KSBjaGnhur9tIHThu7cgdHLhu41uZyBy4bqldCBuaOG7jy4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIGPGoSBj4bqldSBow6BuZyBow7NhIHThuq1wIHRydW5nIHbDoG8gY8OhYyBt4bq3dCBow6BuZyB0acOqdSBkw7luZyBwaOG7lSBiaeG6v24uDQoNCiMjKipCaeG6v24gUHJvZHVjdCBDYXRlZ29yeSoqDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQpgYGB7cn0NCiNC4bqjbmcgdOG6p24gc+G7kQ0KdGFibGUoZGF0YURUJFByb2R1Y3RDYXRlZ29yeSkNCiNC4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZShkYXRhRFQkUHJvZHVjdENhdGVnb3J5KS9zdW0odGFibGUoZGF0YURUJFByb2R1Y3RDYXRlZ29yeSkpDQpgYGANCg0KKipW4bq9IGJp4buBdSDEkeG7kyBj4buZdCoqDQoNCmBgYHtyfQ0KDQojIELhuqNuZyB04bqnbiBzdeG6pXQgLT4gZGF0YSBmcmFtZQ0KZnJlcTEwIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGF0YURUJFByb2R1Y3RDYXRlZ29yeSkpDQpjb2xuYW1lcyhmcmVxMTApIDwtIGMoIlByb2R1Y3RDYXRlZ29yeSIsICJDb3VudCIpDQoNCiMgU+G6r3AgeOG6v3AgZ2nhuqNtIGThuqduDQpmcmVxMTAgPC0gZnJlcTEwW29yZGVyKC1mcmVxMTAkQ291bnQpLCBdDQoNCiMgQ2hpYSDEkcO0aSBkYW5oIHPDoWNoIHRow6BuaCBwaOG7kQ0KbjIgPC0gbnJvdyhmcmVxMTApDQptaWQyIDwtIGNlaWxpbmcobjIgLyAyKQ0KDQojIEThu68gbGnhu4d1IGNobyBiaeG7g3UgxJHhu5MgdGjhu6kgbmjhuqV0IChu4butYSB0csOqbiB0aGVvIHThuqduIHN14bqldCkNCnRvcDIgPC0gaGVhZChmcmVxMTAsIG1pZDIpDQoNCnBsb3QxMiA8LSBnZ3Bsb3QodG9wMiwgYWVzKHggPSBQcm9kdWN0Q2F0ZWdvcnksIHkgPSBDb3VudCkpICsNCiAgZ2VvbV9jb2woZmlsbCA9ICIjRjRBNDYwIiwgY29sb3IgPSAiYmxhY2siKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBDb3VudCksIHZqdXN0ID0gLTAuNSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMi41KSArDQogIHRoZW1lX2J3KCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHNpemUgPSA2KSkNCg0KIyBE4buvIGxp4buHdSBjaG8gYmnhu4N1IMSR4buTIHRo4bupIGhhaSAobuG7rWEgZMaw4bubaSB0aGVvIHThuqduIHN14bqldCkNCmJvdHRvbTIgPC0gdGFpbChmcmVxMTAsIG4yIC0gbWlkMikNCg0KcGxvdDIxIDwtIGdncGxvdChib3R0b20yLCBhZXMoeCA9IFByb2R1Y3RDYXRlZ29yeSwgeSA9IENvdW50KSkgKw0KICBnZW9tX2NvbChmaWxsID0gIiNGNEE0NjAiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IENvdW50KSwgdmp1c3QgPSAtMC41LCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAyLjUpICsNCiAgdGhlbWVfYncoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgc2l6ZSA9IDYpKQ0KDQojIEdow6lwIGhhaSBiaeG7g3UgxJHhu5MNCnBsb3QxMiArIHBsb3QyMQ0KDQpgYGANCioqTmjhuq1uIHjDqXQqKg0KDQotIEThu7FhIHbDoG8gYuG6o25nIHThuqduIHPhu5EsIG5ow7NtIHPhuqNuIHBo4bqpbSBwaOG7lSBiaeG6v24gbmjhuqV0IGzDoCBWZWdldGFibGVzIHbhu5tpIGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0Q2F0ZWdvcnkpWyJWZWdldGFibGVzIl1gIHPhuqNuIHBo4bqpbSwgY2hp4bq/bSBraG/huqNuZyBgciByb3VuZCgxMDAgKiB0YWJsZShkYXRhRFQkUHJvZHVjdENhdGVnb3J5KVsiVmVnZXRhYmxlcyJdIC8gc3VtKHRhYmxlKGRhdGFEVCRQcm9kdWN0Q2F0ZWdvcnkpKSwgMilgJSB04buVbmcgc+G7kSBxdWFuIHPDoXQuIFRoZW8gc2F1IGzDoCBTbmFjayBGb29kcyB24bubaSBgciB0YWJsZShkYXRhRFQkUHJvZHVjdENhdGVnb3J5KVsiU25hY2sgRm9vZHMiXWAgc+G6o24gcGjhuqltICh+YHIgcm91bmQoMTAwICogdGFibGUoZGF0YURUJFByb2R1Y3RDYXRlZ29yeSlbIlNuYWNrIEZvb2RzIl0gLyBzdW0odGFibGUoZGF0YURUJFByb2R1Y3RDYXRlZ29yeSkpLCAyKWAlKSwgRnJ1aXQgKGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0Q2F0ZWdvcnkpWyJGcnVpdCJdYCksIHbDoCBNZWF0IChgciB0YWJsZShkYXRhRFQkUHJvZHVjdENhdGVnb3J5KVsiTWVhdCJdYCkuIE5nxrDhu6NjIGzhuqFpLCBjw6FjIG5ow7NtIMOtdCBwaOG7lSBiaeG6v24gbmjhuqV0IGfhu5NtIENhbm5lZCBPeXN0ZXJzIChgciB0YWJsZShkYXRhRFQkUHJvZHVjdENhdGVnb3J5KVsiQ2FubmVkIE95c3RlcnMiXWApLCBDYW5uZWQgU2FyZGluZXMgKGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0Q2F0ZWdvcnkpWyJDYW5uZWQgU2FyZGluZXMiXWApLCB2w6AgQ2FuZHkgKGByIHRhYmxlKGRhdGFEVCRQcm9kdWN0Q2F0ZWdvcnkpWyJDYW5keSJdYCksIG3hu5dpIG5ow7NtIGPDsyBjaMawYSDEkeG6v24gNTAgcXVhbiBzw6F0LCBjaGnhur9tIHThu7cgbOG7hyBy4bqldCBuaOG7jyB0cm9uZyB04buVbmcgdGjhu4MgZOG7ryBsaeG7h3UuDQoNCi0gQmnhu4N1IMSR4buTIGPhu5l0IGLDqm4gdHLDoWkgY2hvIHRo4bqleSBz4buxIHBow6JuIGLhu5Ega2jDtG5nIMSR4buTbmcgxJHhu4F1LCBu4buVaSBi4bqtdCBuaOG6pXQgbMOgIGhhaSBuaMOzbSBWZWdldGFibGVzIHbDoCBTbmFjayBGb29kcyB24bubaSBz4buRIGzGsOG7o25nIHbGsOG7o3QgdHLhu5lpIHNvIHbhu5tpIGPDoWMgbmjDs20ga2jDoWMuIEJp4buDdSDEkeG7kyBj4buZdCBiw6puIHBo4bqjaSBjdW5nIGPhuqVwIHRow6ptIGfDs2MgbmjDrG4gY2hpIHRp4bq/dCBoxqFuIHbhu4EgY8OhYyBuaMOzbSBjw7MgdOG6p24gc3XhuqV0IHRo4bqlcCwgY2hvIHRo4bqleSBz4buxIMSRYSBk4bqhbmcgbmjGsG5nIHBow6JuIHTDoW4gbmjhu48gbOG6uyBnaeG7r2Egbmhp4buBdSBkYW5oIG3hu6VjLiANCg0KLSBU4buVbmcgcXVhbiwgZOG7ryBsaeG7h3UgdOG6rXAgdHJ1bmcgY2jhu6cgeeG6v3UgdsOgbyBjw6FjIG3hurd0IGjDoG5nIHJhdSBj4bunLCDEkeG7kyDEg24gbmjhurkgdsOgIHRo4buxYyBwaOG6qW0gdMawxqFpIHPhu5FuZywgcGjhuqNuIMOhbmggeHUgaMaw4bubbmcgdGnDqnUgZMO5bmcgY2jDrW5oLiBOaOG7r25nIG5ow7NtIGPDsm4gbOG6oWkgdHV5IG5oaeG7gXUgduG7gSBjaOG7p25nIGxv4bqhaSBuaMawbmcgY2hp4bq/bSB04bu3IHRy4buNbmcga2jDtG5nIGzhu5tuIHRyb25nIHThuq1wIGThu68gbGnhu4d1Lg0KDQotLS0NCg0KIyAqKlBo4bqnbiAzOiDGr+G7m2MgbMaw4bujbmcgS2hv4bqjbmcgdsOgIEtp4buDbSDEkeG7i25oIEdp4bqjIHRodXnhur90IGNobyBU4bu3IGzhu4cqKg0KDQojIyAqKkJp4bq/biBDb3VudHJ5KioNCg0KYGBge3J9DQp4IDwtIHRhYmxlKGRhdGFEVCRDb3VudHJ5KQ0KcHJvcC50ZXN0KGMoeFtbIkNhbmFkYSJdXSx4W1siTWV4aWNvIl1dKSwgYyhzdW0oeCksIHN1bSh4KSksIGNvcnJlY3QgPSBUUlVFKQ0KYGBgDQoNCiMjICoqQmnhur9uIEdlbmRlcioqDQoNCioqTeG7pWMgdGnDqnUqKg0KDQpUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIMSR4buDIHjDoWMgxJHhu4tuaCB4ZW0gKip04bu3IGzhu4cgbuG7ryB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBjw7Mga2jDoWMgYmnhu4d0IHNvIHbhu5tpIDUwJSBoYXkga2jDtG5nKiouDQoNCioqROG7ryBsaeG7h3UgdsOgIGJp4bq/biBxdWFuIHTDom0qKg0KDQotIEJp4bq/biBxdWFuIHTDom06IGBHZW5kZXJgDQoNCi0gSOG6oW5nIG3hu6VjIHF1YW4gdMOibTogYCJGImAgKEZlbWFsZSkNCg0KKipUw61uaCB0b8OhbiB04bu3IGzhu4cgbeG6q3UqKg0KDQpgYGB7cn0NCiMgU+G7kSBsxrDhu6NuZyBu4buvIHRyb25nIGThu68gbGnhu4d1DQpzdW1GIDwtIHN1bShkYXRhRFQkR2VuZGVyID09ICJGIikNCg0KIyBU4buVbmcgc+G7kSBjw6EgdGjhu4MgdHJvbmcgZOG7ryBsaeG7h3UNCnN1bUdlbmRlciA8LSBsZW5ndGgoZGF0YURUJEdlbmRlcikNCmBgYA0KDQoqKlRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggdOG7tyBs4buHIDEgbeG6q3UqKg0KDQpHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoNCg0KLSAqKkdp4bqjIHRodXnhur90IEgwOioqIFThu7cgbOG7hyBu4buvIGLhurFuZyAwLjUNCg0KLSAqKkdp4bqjIHRodXnhur90IEgxOioqIFThu7cgbOG7hyBu4buvIGtow6FjIDAuNSANCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIHThu7cgbOG7hyAxIG3huqt1IHbhu5tpIGdp4bqjIHRodXnhur90IHAgPSAwLjUNCnByb3AudGVzdCh4ID0gc3VtRiwgbiA9IHN1bUdlbmRlciwgcCA9IDAuNSwgY29uZi5sZXZlbCA9IDAuOTUsIGNvcnJlY3QgPSBUUlVFKQ0KYGBgDQoNCioqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkOiA1LjU3NjUNCg0KLSBC4bqtYyB04buxIGRvIChkZik6IDENCg0KLSBwLXZhbHVlOiAwLjAxODINCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgbuG7rzogKDAuNTAxNywgMC41MTgzKQ0KDQotIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgbuG7ryB04burIG3huqt1OiAwLjUwOTk5ICh04bupYyB+NTElKQ0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIHbDrCBwLXZhbHVlID0gMC4wMTgyIDwgMC4wNSwgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEgwLkvhur90IGx14bqtbiBy4bqxbmcgdOG7tyBs4buHIG7hu68gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3Uga2jDoWMgNTAlIG3hu5l0IGPDoWNoIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCiMjICoqQmnhur9uIE1hcml0YWxTdGF0dXMqKg0KDQoqKk3hu6VjIHRpw6p1KioNCg0KVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCDEkeG7gyB4w6FjIMSR4buLbmggeGVtICoqdOG7tyBs4buHIGtow6FjaCBow6BuZyDEkcOjIGvhur90IGjDtG4gKE1hcnJpZWQpIHRyb25nIHThuq1wIGThu68gbGnhu4d1IGPDsyBraMOhYyBiaeG7h3Qgc28gduG7m2kgNTAlIGhheSBraMO0bmcqKi4NCg0KKipE4buvIGxp4buHdSB2w6AgYmnhur9uIHF1YW4gdMOibSoqDQoNCi0gQmnhur9uIHF1YW4gdMOibTogYE1hcml0YWxTdGF0dXNgDQoNCi0gSOG6oW5nIG3hu6VjIHF1YW4gdMOibTogYCJNImAgKE1hcnJpZWQpDQoNCioqVMOtbmggdG/DoW4gdOG7tyBs4buHIG3huqt1KioNCg0KYGBge3J9DQojIFPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIMSRw6Mga+G6v3QgaMO0biB0cm9uZyBk4buvIGxp4buHdQ0Kc3VtTSA8LSBzdW0oZGF0YURUJE1hcml0YWxTdGF0dXMgPT0gIk0iKQ0KDQojIFThu5VuZyBz4buRIGtow6FjaCBow6BuZyB0cm9uZyBk4buvIGxp4buHdQ0Kc3VtTWFyaXRhbCA8LSBsZW5ndGgoZGF0YURUJE1hcml0YWxTdGF0dXMpDQpgYGANCg0KKipLaeG7g20gxJHhu4tuaCB04bu3IGzhu4cgMSBt4bqrdSoqDQoNCkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oOg0KDQotICoqSDA6KiogVOG7tyBs4buHIGtow6FjaCBow6BuZyDEkcOjIGvhur90IGjDtG4gYuG6sW5nIDAuNQ0KDQotICoqSDE6KiogVOG7tyBs4buHIGtow6FjaCBow6BuZyDEkcOjIGvhur90IGjDtG4ga2jDoWMgMC41IA0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggdOG7tyBs4buHIDEgbeG6q3UgduG7m2kgZ2nhuqMgdGh1eeG6v3QgcCA9IDAuNQ0KcHJvcC50ZXN0KHggPSBzdW1NLCBuID0gc3VtTWFyaXRhbCwgcCA9IDAuNSwgY29uZi5sZXZlbCA9IDAuOTUsIGNvcnJlY3QgPSBUUlVFKQ0KYGBgDQoNCioqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1zcXVhcmVkOiBgciByb3VuZChwcm9wLnRlc3Qoc3VtTSwgc3VtTWFyaXRhbCwgcCA9IDAuNSwgY29ycmVjdCA9IFRSVUUpJHN0YXRpc3RpYywgNClgDQoNCi0gQuG6rWMgdOG7sSBkbyAoZGYpOiAxDQoNCi0gcC12YWx1ZTogYHIgcm91bmQocHJvcC50ZXN0KHN1bU0sIHN1bU1hcml0YWwsIHAgPSAwLjUsIGNvcnJlY3QgPSBUUlVFKSRwLnZhbHVlLCA0KWANCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlIGNobyB04bu3IGzhu4cgxJHDoyBr4bq/dCBow7RuOiBgciBwYXN0ZTAoIigiLCANCiAgICByb3VuZChwcm9wLnRlc3Qoc3VtTSwgc3VtTWFyaXRhbCwgcCA9IDAuNSwgY29ycmVjdCA9IFRSVUUpJGNvbmYuaW50WzFdLCA0KSwgIiwgIiwgDQogICAgcm91bmQocHJvcC50ZXN0KHN1bU0sIHN1bU1hcml0YWwsIHAgPSAwLjUsIGNvcnJlY3QgPSBUUlVFKSRjb25mLmludFsyXSwgNCksICIpIilgDQogICAgDQotIMav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cgxJHDoyBr4bq/dCBow7RuIHThu6sgbeG6q3U6IGByIHJvdW5kKHByb3AudGVzdChzdW1NLCBzdW1NYXJpdGFsLCBwID0gMC41LCBjb3JyZWN0ID0gVFJVRSkkZXN0aW1hdGUsIDUpYCAodOG7qWMgfmByIHJvdW5kKDEwMCAqIHN1bU0gLyBzdW1NYXJpdGFsLCAyKWAlKQ0KDQoqKkvhur90IGx14bqtbjoqKg0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUgKM6xID0gMC4wNSksIHbDrCBwLXZhbHVlID0gMC4wMDU5NyA8IDAuMDUsIHRhIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBIMC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgxJHDoyBr4bq/dCBow7RuIHRyb25nIHThuq1wIGThu68gbGnhu4d1IGtow6FjIDUwJSBt4buZdCBjw6FjaCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiBD4bulIHRo4buDLCB04bu3IGzhu4cga+G6v3QgaMO0biB0cm9uZyBt4bqrdSBsw6Aga2hv4bqjbmcgNDguODQlLCB0aOG6pXAgaMahbiA1MCUuDQoNCiMjICoqQmnhur9uIEhvbWVvd25lcioqDQoNCioqTeG7pWMgdGnDqnUqKg0KDQpUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIMSR4buDIHjDoWMgxJHhu4tuaCB4ZW0gKip04bu3IGzhu4cga2jDoWNoIGjDoG5nIGPDsyBuaMOgIChIb21lb3duZXIgPSAiWSIpIGPDsyBraMOhYyBiaeG7h3Qgc28gduG7m2kgNTAlIGhheSBraMO0bmcqKi4NCg0KKipE4buvIGxp4buHdSB2w6AgYmnhur9uIHF1YW4gdMOibSoqDQoNCi0gQmnhur9uIHF1YW4gdMOibTogYEhvbWVvd25lcmAgIA0KDQotIEjhuqFuZyBt4bulYyBxdWFuIHTDom06IGAiWSJgIChDw7MgbmjDoCkNCg0KKipUw61uaCB0b8OhbiB04bu3IGzhu4cgbeG6q3UqKg0KDQpgYGB7cn0NCiMgU+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgY8OzIG5ow6ANCnN1bVkgPC0gc3VtKGRhdGFEVCRIb21lb3duZXIgPT0gIlkiKQ0KDQojIFThu5VuZyBz4buRIGtow6FjaCBow6BuZw0Kc3VtSG9tZW93bmVyIDwtIGxlbmd0aChkYXRhRFQkSG9tZW93bmVyKQ0KYGBgDQoNCioqS2nhu4NtIMSR4buLbmggdOG7tyBs4buHIDEgbeG6q3UqKg0KDQpHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoNCg0KLSAqKkgwOioqIFThu7cgbOG7hyBraMOhY2ggaMOgbmcgY8OzIG5ow6AgYuG6sW5nIDAuNQ0KDQotICoqSDE6KiogVOG7tyBs4buHIGtow6FjaCBow6BuZyBjw7MgbmjDoCBraMOhYyAwLjUgDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCB04bu3IGzhu4cgMSBt4bqrdSB24bubaSBnaeG6oyB0aHV54bq/dCBwID0gMC41DQpwcm9wLnRlc3QoeCA9IHN1bVksIG4gPSBzdW1Ib21lb3duZXIsIHAgPSAwLjUsIGNvbmYubGV2ZWwgPSAwLjk1LCBjb3JyZWN0ID0gVFJVRSkNCmBgYA0KDQoqKkvhur90IHF14bqjIGtp4buDbSDEkeG7i25oOioqDQoNCi0gR2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBDaGktc3F1YXJlZCBsw6AgNTY4Ljg2LCB24bubaSAxIGLhuq1jIHThu7EgZG8uDQoNCi0gR2nDoSB0cuG7iyBwLXZhbHVlIDwgMi4yZS0xNiwgcuG6pXQgbmjhu48gaMahbiBuaGnhu4F1IHNvIHbhu5tpIG3hu6ljIMO9IG5naMSpYSB0aMO0bmcgdGjGsOG7nW5nIDAuMDUuDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIGtow6FjaCBow6BuZyBjw7MgbmjDoCBsw6AgKDAuNTkyNSwgMC42MDg3KS4NCg0KLSDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIGtow6FjaCBow6BuZyBjw7MgbmjDoCB0cm9uZyBt4bqrdSBsw6AgMC42MDA2ICh04bupYyBraG/huqNuZyA2MC4wNiUpLg0KDQoqKkvhur90IGx14bqtbioqDQoNClbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSAozrEgPSAwLjA1KSwgdsOsIHAtdmFsdWUgPCAyLjJlLTE2IDwgMC4wNSwgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEgwLsSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyB04bu3IGzhu4cga2jDoWNoIGjDoG5nIHPhu58gaOG7r3UgbmjDoCB0cm9uZyB04bqtcCBk4buvIGxp4buHdSBraMOhYyA1MCUgbeG7mXQgY8OhY2ggY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi5D4bulIHRo4buDLCB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIHRyb25nIG3huqt1IGzDoCBraG/huqNuZyA2MC4wNiUsIGNhbyBoxqFuIDUwJS4NCg0KLS0tDQoNCiMgKipQSOG6pk4gNDogUEjDgk4gVMONQ0ggTeG7kEkgUVVBTiBI4buGIEdJ4buuQSBIQUkgQknhur5OIMSQ4buKTkggVMONTkgqKg0KDQojIyAqKsOUbiBs4bqhaSBraeG6v24gdGjhu6ljKioNCg0KIyMjICoqw50gbmdoxKlhIGPhu6dhIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyB24buBIHTDrW5oIMSR4buZYyBs4bqtcCoqDQoNCktp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyAoQ2hpLXNxdWFyZSB0ZXN0IG9mIGluZGVwZW5kZW5jZSkgbMOgIG3hu5l0IHBoxrDGoW5nIHBow6FwIHRo4buRbmcga8OqIGTDuW5nIMSR4buDIHjDoWMgxJHhu4tuaCB4ZW0gaGFpIGJp4bq/biDEkeG7i25oIHTDrW5oIChwaMOibiBsb+G6oWkpIGPDsyBxdWFuIGjhu4cgduG7m2kgbmhhdSBoYXkga2jDtG5nLCBoYXkgbsOzaSBjw6FjaCBraMOhYyBsw6AgY2jDum5nIGPDsyDEkeG7mWMgbOG6rXAgduG7m2kgbmhhdSBoYXkga2jDtG5nIHRyb25nIHThu5VuZyB0aOG7gy4NCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaCoqDQoNCi0gKipI4oKAIChHaeG6oyB0aHV54bq/dCBraMO0bmcpOioqIEhhaSBiaeG6v24gWCB2w6AgWSAqKsSR4buZYyBs4bqtcCoqIHbhu5tpIG5oYXUuICANCg0KLSAqKkjigoEgKEdp4bqjIHRodXnhur90IMSR4buRaSk6KiogSGFpIGJp4bq/biBYIHbDoCBZICoqY8OzIG3hu5FpIGxpw6puIGjhu4cqKiwgdOG7qWMgbMOgICoqa2jDtG5nIMSR4buZYyBs4bqtcCoqLg0KDQoqKkdpw6EgdHLhu4sga2nhu4NtIMSR4buLbmgqKg0KDQpQaMOpcCBraeG7g20gxJHhu4tuaCBz4butIGThu6VuZyBwaMOibiBwaOG7kWkgQ2hpLWLDrG5oIHBoxrDGoW5nICjPh8KyKSB24bubaSBjw7RuZyB0aOG7qWM6DQoNClxbDQpcY2hpXjIgPSBcc3VtX3tpLGp9IFxmcmFjeyhuX3tpan0gLSBcaGF0e1xtdX1fe2lqfSleMn17XGhhdHtcbXV9X3tpan19DQpcXQ0KDQpUcm9uZyDEkcOzOg0KDQotIFwoIG5fe2lqfSBcKTogbMOgIHThuqduIHPhu5EgcXVhbiBzw6F0IHThuqFpIMO0IGjDoG5nIFwoIGkgXCksIGPhu5l0IFwoIGogXCkgdHJvbmcgYuG6o25nIGNow6lvLiAgDQotIFwoIFxoYXR7XG11fV97aWp9IFwpOiBsw6AgdOG6p24gc+G7kSBr4buzIHbhu41uZyB04bqhaSDDtCBcKCBpLGogXCksIHTDrW5oIHRoZW8gY8O0bmcgdGjhu6ljOiAgDQpcWw0KXGhhdHtcbXV9X3tpan0gPSBcZnJhY3tuX3tpK30gXGNkb3Qgbl97K2p9fXtufQ0KXF0gIA0KLSBcKCBuX3tpK30gXCk6IHThu5VuZyBow6BuZyBcKCBpIFwpOyAgDQotIFwoIG5feytqfSBcKTogdOG7lW5nIGPhu5l0IFwoIGogXCk7ICANCi0gXCggbiBcKTogdOG7lW5nIHThuqV0IGPhuqMgY8OhYyBxdWFuIHPDoXQgdHJvbmcgYuG6o25nLg0KDQoqKkRp4buFbiBnaeG6o2kga+G6v3QgcXXhuqMqKg0KDQpTYXUga2hpIGNo4bqheSBraeG7g20gxJHhu4tuaCB0cm9uZyBSIGLhurFuZyBow6BtIGBjaGlzcS50ZXN0KClgLCBr4bq/dCBxdeG6oyB0cuG6oyB24buBIGJhbyBn4buTbToNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1iw6xuaCBwaMawxqFuZyAoYFgtc3F1YXJlZGApDQoNCi0gQuG6rWMgdOG7sSBkbyAoZGVncmVlcyBvZiBmcmVlZG9tIOKAkyBkZikNCg0KLSBHacOhIHRy4buLIHAgKGBwLXZhbHVlYCkNCg0KKipDw6FjaCBkaeG7hW4gZ2nhuqNpOioqDQoNCi0gTuG6v3UgKipwLXZhbHVlIDwgMC4wNSoqIOKGkiBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCDihpIgKipoYWkgYmnhur9uIGPDsyBt4buRaSBsacOqbiBo4buHKiosIGtow7RuZyDEkeG7mWMgbOG6rXAuDQoNCi0gTuG6v3UgKipwLXZhbHVlIOKJpSAwLjA1Kiog4oaSIGtow7RuZyBiw6FjIGLhu48gSOKCgCDihpIgKipjaMawYSBjw7MgYuG6sW5nIGNo4bupbmcgdGjhu5FuZyBrw6ogxJHhu6cgbeG6oW5oKiogxJHhu4Mga2jhurNuZyDEkeG7i25oIGhhaSBiaeG6v24gY8OzIHF1YW4gaOG7hyDihpIgY8OzIHRo4buDIMSR4buZYyBs4bqtcC4NCg0KIyMjICoqUmVsYXRpdmUgUmlzayAoUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkpKioNCg0KKipSZWxhdGl2ZSBSaXNrIChSUikqKiBoYXkgKipS4bunaSBybyB0xrDGoW5nIMSR4buRaSoqIGzDoCBt4buZdCBjaOG7iSBz4buRIHRo4buRbmcga8OqIGTDuW5nIMSR4buDIHNvIHPDoW5oIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHPhu7Ega2nhu4duIChob+G6t2Mg4oCccuG7p2kgcm/igJ0pIGdp4buvYSBoYWkgbmjDs20uIMSQw6J5IGzDoCBjaOG7iSBz4buRIHF1YW4gdHLhu41uZyB0cm9uZyBjw6FjIG5naGnDqm4gY+G7qXUgc28gc8OhbmggbmjGsCB5IHThur8sIHjDoyBo4buZaSBo4buNYywgdsOgIGtob2EgaOG7jWMgaMOgbmggdmkuDQoNCkdp4bqjIHPhu60gdGEgY8OzIGhhaSBuaMOzbSBzbyBzw6FuaCwgdGjDrDoNCg0KXFsNClJSID0gXGZyYWN7XHBpXzF9e1xwaV8yfQ0KXF0NCg0KVHJvbmcgxJHDszoNCi0gXCggXHBpXzEgXCk6IFjDoWMgc3XhuqV0IHjhuqN5IHJhIHPhu7Ega2nhu4duIOG7nyBuaMOzbSB0aOG7qSBuaOG6pXQgKG5ow7NtIGto4bqjbyBzw6F0KQ0KDQotIFwoIFxwaV8yIFwpOiBYw6FjIHN14bqldCB44bqjeSByYSBz4buxIGtp4buHbiDhu58gbmjDs20gdGjhu6kgaGFpIChuaMOzbSDEkeG7kWkgY2jhu6luZykNCg0KIyMjICoqT2RkIChU4bu3IGzhu4cgY8aw4bujYykqKg0KDQoqKk9kZCoqIGzDoCB04bu3IHPhu5EgZ2nhu69hIHjDoWMgc3XhuqV0IHPhu7Ega2nhu4duIHjhuqN5IHJhIHbhu5tpIHjDoWMgc3XhuqV0IHPhu7Ega2nhu4duIGtow7RuZyB44bqjeSByYS4gIA0KQ8O0bmcgdGjhu6ljIHTDrW5oOg0KDQpcWw0KXHRleHR7T2RkfSA9IFxmcmFje1AoXHRleHR7c+G7sSBraeG7h24geOG6o3kgcmF9KX17MSAtIFAoXHRleHR7c+G7sSBraeG7h24geOG6o3kgcmF9KX0NClxdDQoNClbDrSBk4bulLCBu4bq/dSB4w6FjIHN14bqldCBt4buZdCBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgbMOgIDAuNzUsIHRow6wgb2RkIGzDoDoNCg0KXFsNClxmcmFjezAuNzV9ezEgLSAwLjc1fSA9IFxmcmFjezAuNzV9ezAuMjV9ID0gMw0KXF0NCg0KxJBp4buBdSBuw6B5IGPDsyBuZ2jEqWEgbMOgIOKAnHThu7cgbOG7hyBjxrDhu6Nj4oCdIHPhu7Ega2nhu4duIHjhuqN5IHJhIGzDoCAzOjEuDQoNCi0tLQ0KDQojIyMgKipPZGRzIFJhdGlvIChU4bu3IHPhu5EgT2RkKSoqDQoNCioqT2RkcyBSYXRpbyAoT1IpKiogZMO5bmcgxJHhu4Mgc28gc8Ohbmggb2RkIGdp4buvYSBoYWkgbmjDs20ga2jDoWMgbmhhdS4gIA0KDQpDw7RuZyB0aOG7qWMgdOG7lW5nIHF1w6F0Og0KDQpcWw0KXHRleHR7T1J9ID0gXGZyYWN7XHRleHR7T2RkIGPhu6dhIG5ow7NtIDF9fXtcdGV4dHtPZGQgY+G7p2EgbmjDs20gMn19ID0gXGZyYWN7XGZyYWN7UF8xfXsxIC0gUF8xfX17XGZyYWN7UF8yfXsxIC0gUF8yfX0NClxdDQoNCi0gT1IgPiAxOiBvZGRzIGPhu6dhIG5ow7NtIDEgY2FvIGjGoW4gbmjDs20gMi4NCi0gT1IgPCAxOiBvZGRzIGPhu6dhIG5ow7NtIDEgdGjhuqVwIGjGoW4gbmjDs20gMi4NCi0gT1IgPSAxOiBvZGRzIGPhu6dhIGhhaSBuaMOzbSBi4bqxbmcgbmhhdS4NCg0KIyMjICoqQ+G6pXUgdHLDumMgeMOhYyBzdeG6pXQgY+G7p2EgYuG6o25nIG5n4bqrdSBuaGnDqm4qKg0KDQpC4bqjbmcgbmfhuqt1IG5oacOqbiAocmFuZG9tIHRhYmxlKSB0aMaw4budbmcgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgdGjhu5FuZyBrw6ogxJHhu4MgYmnhu4N1IGRp4buFbiBk4buvIGxp4buHdSBwaMOibiBsb+G6oWkgaG/hurdjIMSR4bq/bSB0aGVvIGPDoWMgbmjDs20ga2jDoWMgbmhhdS4gQ+G6pXUgdHLDumMgeMOhYyBzdeG6pXQgY+G7p2EgYuG6o25nIG7DoHkgxJHGsOG7o2MgbcO0IHThuqMgcXVhIGPDoWMgcGjDom4gcGjhu5FpIHjDoWMgc3XhuqV0IGPDsyB0aOG7gyBzaW5oIHJhIGThu68gbGnhu4d1IMSRw7MuIEhhaSBwaMOibiBwaOG7kWkgcGjhu5UgYmnhur9uIG5o4bqldCBkw7luZyDEkeG7gyBtw7QgaMOsbmggaMOzYSBi4bqjbmcgbmfhuqt1IG5oacOqbiBsw6A6DQoNCioqUGjDom4gcGjhu5FpIFBvaXNzb24gKFBvaXNzb24gRGlzdHJpYnV0aW9uKSoqDQoNClBow6JuIHBo4buRaSBQb2lzc29uIG3DtCB04bqjIHPhu5EgbMaw4bujbmcgc+G7sSBraeG7h24geOG6o3kgcmEgdHJvbmcgbeG7mXQga2hv4bqjbmcgdGjhu51pIGdpYW4gaG/hurdjIGtow7RuZyBnaWFuIGPhu5EgxJHhu4tuaCwgduG7m2kgZ2nhuqMgxJHhu4tuaCBjw6FjIHPhu7Ega2nhu4duIHjhuqN5IHJhIMSR4buZYyBs4bqtcCB2w6AgduG7m2kgdOG7iSBs4buHIHRydW5nIGLDrG5oIGPhu5EgxJHhu4tuaC4NCg0KLSDEkOG7i25oIG5naMSpYTogQmnhur9uIG5n4bqrdSBuaGnDqm4gXCggWCBcKSBjw7MgcGjDom4gcGjhu5FpIFBvaXNzb24gduG7m2kgdGhhbSBz4buRIFwoXGxhbWJkYSA+IDBcKSBu4bq/dSB4w6FjIHN14bqldCBcKCBYIFwpIG5o4bqtbiBnacOhIHRy4buLIFwoIGsgXCkgbMOgDQoNClxbDQpQKFggPSBrKSA9IFxmcmFje2Veey1cbGFtYmRhfSBcbGFtYmRhXntrfX17ayF9LCBccXVhZCBrID0gMCwgMSwgMiwgXGRvdHMNClxdDQoNCi0gw50gbmdoxKlhIHRoYW0gc+G7kTogXChcbGFtYmRhXCkgbMOgIHPhu5Egc+G7sSBraeG7h24gdHJ1bmcgYsOsbmggeOG6o3kgcmEgdHJvbmcga2hv4bqjbmcgcXVhbiBzw6F0Lg0KDQotIOG7qG5nIGThu6VuZzogVGjGsOG7nW5nIGTDuW5nIMSR4buDIG3DtCB04bqjIHPhu5EgbMaw4bujbmcgc+G7sSBraeG7h24gaGnhur9tIGfhurdwIG5oxrAgc+G7kSBjdeG7mWMgZ+G7jWkgxJFp4buHbiB0aG/huqFpIHRyb25nIDEgZ2nhu50sIHPhu5Ega2jDoWNoIGjDoG5nIMSR4bq/biBj4butYSBow6BuZyB0cm9uZyAxIG5nw6B5LCBoYXkgc+G7kSBs4buXaSBwaMOhdCBzaW5oIHRyw6puIG3hu5l0IHPhuqNuIHBo4bqpbS4NCg0KKipQaMOibiBwaOG7kWkgxJBhIHRo4bupYyAoTXVsdGlub21pYWwgRGlzdHJpYnV0aW9uKSoqDQoNClBow6JuIHBo4buRaSDEkGEgdGjhu6ljIGzDoCBz4buxIG3hu58gcuG7mW5nIGPhu6dhIHBow6JuIHBo4buRaSBOaOG7iyB0aOG7qWMgKEJpbm9taWFsKSwgbcO0IHThuqMgc+G7kSBs4bqnbiBjw6FjIGvhur90IHF14bqjIGtow6FjIG5oYXUgeOG6o3kgcmEgdHJvbmcgbeG7mXQgY2h14buXaSBjw6FjIHBow6lwIHRo4butIMSR4buZYyBs4bqtcCwgbeG7l2kgcGjDqXAgdGjhu60gY8OzIG5oaeG7gXUgaMahbiBoYWkga+G6v3QgcXXhuqMgY8OzIHRo4buDLg0KDQotIMSQ4buLbmggbmdoxKlhOiBDaG8gbeG7mXQgcGjDqXAgdGjhu60gduG7m2kgXCggbiBcKSBs4bqnbiBs4bq3cCBs4bqhaSDEkeG7mWMgbOG6rXAsIG3hu5dpIGzhuqduIGPDsyBcKCBrIFwpIGvhur90IHF14bqjIGPDsyB0aOG7gyB44bqjeSByYSB24bubaSB4w6FjIHN14bqldCBcKCBwXzEsIHBfMiwgXGRvdHMsIHBfayBcKSAodGjhu49hIG3Do24gXChcc3VtX3tpPTF9XmsgcF9pID0gMVwpKSwgdGjDrCB2ZWN0b3IgYmnhur9uIG5n4bqrdSBuaGnDqm4NCg0KXFsNCihYXzEsIFhfMiwgXGRvdHMsIFhfaykNClxdDQoNCmzDoCBz4buRIGzhuqduIGvhur90IHF14bqjIHRo4bupIFwoIGkgXCkgeOG6o3kgcmEsIGPDsyBwaMOibiBwaOG7kWkgxJBhIHRo4bupYyB24bubaSB4w6FjIHN14bqldDoNCg0KXFsNClAoWF8xID0geF8xLCBcZG90cywgWF9rID0geF9rKSA9IFxmcmFje24hfXt4XzEhIHhfMiEgXGNkb3RzIHhfayF9IHBfMV57eF8xfSBwXzJee3hfMn0gXGNkb3RzIHBfa157eF9rfQ0KXF0NCg0KduG7m2kgxJFp4buBdSBraeG7h24gXChcc3VtX3tpPTF9XmsgeF9pID0gblwpLg0KDQotIOG7qG5nIGThu6VuZzogTcO0IGjDrG5oIGjDs2EgYuG6o25nIHThuqduIHPhu5EgdHJvbmcgY8OhYyBi4bqjbmcgcGjDom4gbG/huqFpIGPDsyBuaGnhu4F1IG5ow7NtIG5oxrAga+G6v3QgcXXhuqMga2jhuqNvIHPDoXQsIHBow6JuIGLhu5Uga2jDoWNoIGjDoG5nIHRoZW8gbG/huqFpIHPhuqNuIHBo4bqpbSwgaG/hurdjIHPhu5EgbMaw4bujbmcgc+G6o24gcGjhuqltIGLDoW4gcmEgdHJvbmcgY8OhYyBkYW5oIG3hu6VjIGtow6FjIG5oYXUuDQoNCioqVMOzbSBs4bqhaSwqKiBj4bqldSB0csO6YyB4w6FjIHN14bqldCBj4bunYSBi4bqjbmcgbmfhuqt1IG5oacOqbiB0aMaw4budbmcgxJHGsOG7o2MgeMOieSBk4buxbmcgZOG7sWEgdHLDqm4gcGjDom4gcGjhu5FpIFBvaXNzb24ga2hpIHF1YW4gdMOibSDEkeG6v24gc+G7kSBsxrDhu6NuZyBz4buxIGtp4buHbiB44bqjeSByYSB0csOqbiBjw6FjIMO0IGLhuqNuZyAoxJHhur9tIHPhu5EgbMaw4bujbmcpIGhv4bq3YyBwaMOibiBwaOG7kWkgxJBhIHRo4bupYyBraGkgcXVhbiB0w6JtIMSR4bq/biBwaMOibiBwaOG7kWkgdOG7iSBs4buHIGPhu6dhIGPDoWMgbmjDs20gdHJvbmcgdOG7lW5nIHPhu5EgY8OhYyBwaMOpcCB0aOG7rS4NCg0KIyMgKipD4bq3cCBiaeG6v246IE1hcml0YWxTdGF0dXMgdsOgIEhvbWVvd25lcioqDQoNCiMjIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGPhurdwIGJp4bq/biBNYXJpdGFsU3RhdHVzIHbDoCBIb21lb3duZXIqKg0KDQoqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvKioNCmBgYHtyfQ0KbWFyaXRhbF9ob21lb3duZXIgPC0gdGFibGUoZGF0YURUJE1hcml0YWxTdGF0dXMsIGRhdGFEVCRIb21lb3duZXIpDQptYXJpdGFsX2hvbWVvd25lcg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotICoqS2jDoWNoIGjDoG5nIMSRw6Mga+G6v3QgaMO0biAoTSkqKjogQ8OzIHThu5tpIDUxNDcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIOG7nywgY2hp4bq/bSBwaOG6p24gbOG7m24gdHJvbmcgbmjDs20gbsOgeSwgdHJvbmcga2hpIGNo4buJIGPDsyAxNzE5IG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AuDQoNCi0gKipLaMOhY2ggaMOgbmcgxJHhu5ljIHRow6JuIChTKSoqOiBOZ8aw4bujYyBs4bqhaSwgbmjDs20gbsOgeSBjw7MgeHUgaMaw4bubbmcga2jDtG5nIHPhu58gaOG7r3UgbmjDoCDhu58gY2FvIGjGoW4gduG7m2kgMzg5NiBuZ8aw4budaSwgdHJvbmcga2hpIHPhu5EgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGNo4buJIGzDoCAzMjk3IG5nxrDhu51pLg0KDQotICoqU28gc8OhbmggZ2nhu69hIGhhaSBuaMOzbSoqOg0KDQogIC0gTmjDs20gxJHDoyBr4bq/dCBow7RuIGPDsyB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIOG7nyBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuaMOzbSDEkeG7mWMgdGjDom4uDQoNCiAgLSBOaMOzbSDEkeG7mWMgdGjDom4gY8OzIHPhu5EgbMaw4bujbmcga2jDtG5nIHPhu58gaOG7r3UgbmjDoCDhu58gdsaw4bujdCB0cuG7mWksIGNobyB0aOG6pXkgeHUgaMaw4bubbmcgY2jGsGEg4buVbiDEkeG7i25oIHbhu4EgdMOgaSBjaMOtbmggaG/hurdjIGN14buZYyBz4buRbmcgZ2lhIMSRw6xuaC4NCg0KKipC4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvKioNCg0KYGBge3J9DQpwcm9wLnRhYmxlKG1hcml0YWxfaG9tZW93bmVyKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotIE5ow7NtIGtow6FjaCBow6BuZyDEkcOjIGvhur90IGjDtG4gc+G7nyBo4buvdSBuaMOgIGNoaeG6v20gdOG7tyB0cuG7jW5nIGzhu5tuIG5o4bqldCB0cm9uZyB0b8OgbiBi4buZIGThu68gbGnhu4d1ICgzNi42MSUpLCBjaG8gdGjhuqV5IMSRw6J5IGzDoCBuaMOzbSBjw7MgeHUgaMaw4bubbmcg4buVbiDEkeG7i25oIHbhu4EgdMOgaSBjaMOtbmggdsOgIGNo4buXIOG7ny4NCg0KLSBLaMOhY2ggaMOgbmcgxJHhu5ljIHRow6JuIGtow7RuZyBz4bufIGjhu691IG5ow6AgY8WpbmcgY2hp4bq/bSB04bu3IHRy4buNbmcga2jDoSBs4bubbiAoMjcuNzElKSwgcGjhuqNuIMOhbmggcGjhuqduIG7DoG8gc+G7sSBjaMawYSDhu5VuIMSR4buLbmggduG7gSB0w6BpIHPhuqNuIGhv4bq3YyBnaWFpIMSRb+G6oW4gxJHhuqd1IHRyb25nIGNodSBr4buzIHPhu5FuZyBjw6EgbmjDom4uDQoNCk5ow6xuIGNodW5nLCBk4buvIGxp4buHdSBjaG8gdGjhuqV5IG3hu5FpIGxpw6puIGjhu4cgxJHDoW5nIGNow7ogw70gZ2nhu69hIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiB2w6AgcXV54buBbiBz4bufIGjhu691IG5ow6Ag4bufLCB0cm9uZyDEkcOzIHZp4buHYyDEkcOjIGvhur90IGjDtG4gdGjGsOG7nW5nIMSRaSBrw6htIHbhu5tpIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY2FvIGjGoW4uDQoNCioqVuG6vSDEkeG7kyB0aOG7iyoqDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShkcGx5cikNCiMgQ2h1eeG7g24gxJHhu5VpIGThu68gbGnhu4d1IHNhbmcgZOG6oW5nIGRhdGEgZnJhbWUNCmRmX21hcml0YWxfaG9tZW93bmVyIDwtIGFzLmRhdGEuZnJhbWUobWFyaXRhbF9ob21lb3duZXIpDQpjb2xuYW1lcyhkZl9tYXJpdGFsX2hvbWVvd25lcikgPC0gYygiTWFyaXRhbFN0YXR1cyIsICJIb21lb3duZXIiLCAiQ291bnQiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IG5ow7NtDQpnZ3Bsb3QoZGZfbWFyaXRhbF9ob21lb3duZXIsIGFlcyh4ID0gSG9tZW93bmVyLCB5ID0gQ291bnQsIGZpbGwgPSBNYXJpdGFsU3RhdHVzKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiU+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgdGhlbyBIb21lb3duZXIgdsOgIE1hcml0YWwgU3RhdHVzIiwgDQogICAgICAgeCA9ICJUw6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoCIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gKipLaMOhYyBiaeG7h3QgZ2nhu69hIGhhaSBuaMOzbSBow7RuIG5ow6JuKio6IEtow6FjaCBow6BuZyDEkcOjIGvhur90IGjDtG4gKGBNYCkgY8OzIHPhu5EgbMaw4bujbmcgc+G7nyBo4buvdSBuaMOgIChgWWApIHbGsOG7o3QgdHLhu5lpIChoxqFuIDUwMDAgbmfGsOG7nWkpLCB0cm9uZyBraGkga2jDoWNoIGjDoG5nIMSR4buZYyB0aMOibiAoYFNgKSBs4bqhaSBjaOG7pyB54bq/dSB0aHXhu5ljIG5ow7NtIGtow7RuZyBz4bufIGjhu691IG5ow6AgKGBOYCksIHbhu5tpIGtob+G6o25nIDM5MDAgbmfGsOG7nWkuDQoNCi0gKipYdSBoxrDhu5tuZyDhu5VuIMSR4buLbmggdMOgaSBjaMOtbmgga2hpIGvhur90IGjDtG4qKjogTmjDs20gxJHDoyBr4bq/dCBow7RuIGPDsyB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIGNhbywgcGjhuqNuIMOhbmggc+G7sSDhu5VuIMSR4buLbmggduG7gSB0w6BpIGNow61uaCBob+G6t2Mgbmh1IGPhuqd1IOG7lW4gxJHhu4tuaCBuxqFpIOG7nyBjaG8gZ2lhIMSRw6xuaC4gTmfGsOG7o2MgbOG6oWksIG5ow7NtIMSR4buZYyB0aMOibiBjw7MgdOG7tyBs4buHIGtow7RuZyBz4bufIGjhu691IG5ow6AgY2FvIGjGoW4sIGPDsyB0aOG7gyBkbyDGsHUgdGnDqm4gbGluaCBob+G6oXQsIGNoxrBhIOG7lW4gxJHhu4tuaCBjdeG7mWMgc+G7kW5nLg0KDQotICoqU+G7sSBjaMOqbmggbOG7h2NoIHRyb25nIG5ow7NtIGtow7RuZyBz4bufIGjhu691IG5ow6AqKjogVHJvbmcgbmjDs20ga2jDtG5nIHPhu58gaOG7r3UgbmjDoCAoYE5gKSwgc+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgxJHhu5ljIHRow6JuIGfhuqduIGfhuqVwIMSRw7RpIHNvIHbhu5tpIGtow6FjaCBow6BuZyDEkcOjIGvhur90IGjDtG4uDQoNCi0gKipN4buRaSBsacOqbiBo4buHIHRp4buBbSBuxINuZyoqOiBCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY8OzIHRo4buDIGxpw6puIHF1YW4gxJHhur9uIHZp4buHYyBz4bufIGjhu691IG5ow6Ag4oCTIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biBjw7MgeHUgaMaw4bubbmcgc+G7nyBo4buvdSBuaMOgIG5oaeG7gXUgaMahbi4NCg0KKipL4bq/dCBsdeG6rW4qKjogQmnhu4N1IMSR4buTIGfhu6NpIMO9IHLhurFuZyB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdXnhu4FuIHPhu58gaOG7r3UgbmjDoC4gVHV5IG5oacOqbiwgxJHhu4MgeMOhYyDEkeG7i25oIG3hu5FpIGxpw6puIGjhu4cgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGhheSBraMO0bmcsIGPhuqduIHRo4buxYyBoaeG7h24gdGjDqm0ga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oIHBoxrDGoW5nLg0KDQojIyMgKipLaeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqioqDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmg6OioqDQoNCi0gKipIMDoqKiBIYWkgYmnhur9uIE1hcml0YWxTdGF0dXMgdsOgIEhvbWVvd25lciDEkeG7mWMgbOG6rXANCg0KLSAqKkgxOioqIEhhaSBiaeG6v24gTWFyaXRhbFN0YXR1cyB2w6AgSG9tZW93bmVyIGPDsyBt4buRaSBsacOqbiBo4buHDQoNCioqVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBDaGktIGLDrG5oIHBoxrDGoW5nKioNCg0KYGBge3J9DQpjaGlzcV9yZXN1bHQxIDwtIGNoaXNxLnRlc3QobWFyaXRhbF9ob21lb3duZXIpDQpjaGlzcV9yZXN1bHQxDQpgYGANCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLWLDrG5oIHBoxrDGoW5nOiBYLXNxdWFyZWQgPSAxMjQxLjINCg0KLSBC4bqtYyB04buxIGRvOiBkZiA9IDENCg0KLSBHacOhIHRy4buLIHA6IHAtdmFsdWUgPCAyLjJlLTE2DQoNCioqS+G6v3QgbHXhuq1uOioqDQoNClbDrCBnacOhIHRy4buLIHAgcuG6pXQgbmjhu48gKHAgPCAwLjA1KSwgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IGtow7RuZyBIMC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgY8OzIG3hu5FpIGxpw6puIGjhu4cgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbDoCB0w6xuaCB0cuG6oW5nIHPhu58gaOG7r3UgbmjDoC4NCg0KKipUaOG6o28gbHXhuq1uIHRow6ptKioNCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY+G7p25nIGPhu5EgY2hvIG5o4bqtbiDEkeG7i25oIHRyxrDhu5tjIMSRw7MgdOG7qyBiaeG7g3UgxJHhu5M6IGtow6FjaCBow6BuZyDEkcOjIGvhur90IGjDtG4gY8OzIHh1IGjGsOG7m25nIHPhu58gaOG7r3UgbmjDoCBuaGnhu4F1IGjGoW4gc28gduG7m2kga2jDoWNoIGjDoG5nIMSR4buZYyB0aMOibi4gTeG7kWkgcXVhbiBo4buHIG7DoHkgY8OzIHRo4buDIHBo4bqjbiDDoW5oIGPDoWMgeeG6v3UgdOG7kSBraW5oIHThur8g4oCTIHjDoyBo4buZaSBuaMawOg0KDQotIE5o4buvbmcgbmfGsOG7nWkgxJHDoyBr4bq/dCBow7RuIHRoxrDhu51uZyBjw7Mgbmh1IGPhuqd1IOG7lW4gxJHhu4tuaCBuxqFpIOG7nyB2w6Aga2jhuqMgbsSDbmcgdMOgaSBjaMOtbmggY2FvIGjGoW4gKGRvIHRodSBuaOG6rXAgaOG7mSBnaWEgxJHDrG5oIGfhu5lwIGzhuqFpKS4NCg0KLSBOZ8aw4budaSDEkeG7mWMgdGjDom4gY8OzIHRo4buDIMawdSB0acOqbiB0w61uaCBsaW5oIGhv4bqhdCwgaG/hurdjIMSRYW5nIHRyb25nIGdpYWkgxJFv4bqhbiBjaMawYSDhu5VuIMSR4buLbmggc+G7sSBuZ2hp4buHcCBoYXkgdGh1IG5o4bqtcC4NCg0KIyMjICoqVMOtbmggUmVsYXRpdmUgUmlzayoqDQoNCmBgYHtyfQ0KbGlicmFyeShlcGl0b29scykNCm1hcml0YWxfaG9tZW93bmVyIDwtIHRhYmxlKGRhdGFEVCRNYXJpdGFsU3RhdHVzLCBkYXRhRFQkSG9tZW93bmVyKQ0KYWRkbWFyZ2lucyhtYXJpdGFsX2hvbWVvd25lcikNCnJpc2tyYXRpbyhtYXJpdGFsX2hvbWVvd25lcikNCmVwaXRhYihtYXJpdGFsX2hvbWVvd25lciwgbWV0aG9kID0gJ3Jpc2tyYXRpbycsIHJldiA9ICdjJykNCmBgYA0KIyMjICoqVMOtbmggb2RkIHbDoCBvZGRyYXRpbyoqDQoNCmBgYHtyfQ0Kb2RkX00gPC0gbWFyaXRhbF9ob21lb3duZXJbIk0iLCAiWSJdIC8gbWFyaXRhbF9ob21lb3duZXJbIk0iLCAiTiJdDQpvZGRfUyA8LSBtYXJpdGFsX2hvbWVvd25lclsiUyIsICJZIl0gLyBtYXJpdGFsX2hvbWVvd25lclsiUyIsICJOIl0NCg0KY2F0KCJPZGQgbmjDs20gTToiLCBvZGRfTSwgIlxuIikNCmNhdCgiT2RkIG5ow7NtIFM6Iiwgb2RkX1MsICJcbiIpDQoNCm9kZHNfcmF0aW8gPC0gb2RkX1MgLyBvZGRfTQ0KY2F0KCJPZGRzIHJhdGlvIChTIHNvIHbhu5tpIE0pOiIsIG9kZHNfcmF0aW8sICJcbiIpDQoNCiMgSG/hurdjIGTDuW5nIGjDoG0gZXBpdG9vbHMgxJHhu4MgdMOtbmggT2RkcyBSYXRpbyBjw7luZyBraG/huqNuZyB0aW4gY+G6rXkNCmxpYnJhcnkoZXBpdG9vbHMpDQpyZXN1bHQgPC0gb2Rkc3JhdGlvKG1hcml0YWxfaG9tZW93bmVyLCBtZXRob2Q9IndhbGQiKQ0KcHJpbnQocmVzdWx0KQ0KYGBgDQoNCg0KIyMgKipD4bq3cCBiaeG6v246IEdlbmRlciB2w6AgUHJvZHVjdEZhbWlseSoqDQoNCiMjIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGPhurdwIGJp4bq/biBHZW5kZXIgdsOgIFByb2R1Y3RGYW1pbHkqKg0KDQoqKkLhuqNuZyB04bqnbiBz4buRIGNow6lvKioNCmBgYHtyfQ0KZ2VuZGVyX2ZhbWlseSA8LSB0YWJsZShkYXRhRFQkR2VuZGVyLCBkYXRhRFQkUHJvZHVjdEZhbWlseSkNCmdlbmRlcl9mYW1pbHkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KQ+G6oyBuYW0gdsOgIG7hu68gxJHhu4F1IGPDsyB4dSBoxrDhu5tuZyB0acOqdSBkw7luZyB0xrDGoW5nIHThu7EgbmhhdSwgdHJvbmcgxJHDsyBuaMOzbSBz4bqjbiBwaOG6qW0gRm9vZCBsw6AgxJHGsOG7o2MgbOG7sWEgY2jhu41uIG5oaeG7gXUgbmjhuqV0Lg0KDQotIEtow6FjaCBow6BuZyBu4buvIChGKSBtdWEgNTE0OSBz4bqjbiBwaOG6qW0gdGh14buZYyBuaMOzbSBGb29kLCBjYW8gbmjhuqV0IHRyb25nIGJhIG5ow7NtLCB0aeG6v3AgdGhlbyBsw6AgTm9uLUNvbnN1bWFibGUgKDEzNTIpIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBEcmluayAoNjY5KS4NCg0KLSBLaMOhY2ggaMOgbmcgbmFtIChNKSBjxaluZyBjw7MgeHUgaMaw4bubbmcgdMawxqFuZyB04buxIHbhu5tpIDUwMDQgbMaw4bujdCBtdWEgRm9vZCwgdGnhur9wIMSR4bq/biBsw6AgTm9uLUNvbnN1bWFibGUgKDEzMDQpIHbDoCBEcmluayAoNTgxKS4NCg0KTmjDrG4gY2h1bmcsIG5ow7NtIEZvb2QgY2hp4bq/bSB04bu3IGzhu4cgbOG7m24gbmjhuqV0IOG7nyBj4bqjIGhhaSBnaeG7m2ksIGNobyB0aOG6pXkgxJHDonkgbMOgIG5ow7NtIHPhuqNuIHBo4bqpbSBwaOG7lSBiaeG6v24gbmjhuqV0LiBUcm9uZyBraGkgxJHDsywgbmjDs20gRHJpbmsgY8OzIHPhu5EgbMaw4bujdCBtdWEgdGjhuqVwIG5o4bqldCwgcGjhuqNuIMOhbmggbeG7qWMgxJHhu5kgcXVhbiB0w6JtIGhv4bq3YyBuaHUgY+G6p3UgdGnDqnUgZMO5bmcgdGjhuqVwIGjGoW4gxJHhu5FpIHbhu5tpIGxv4bqhaSBz4bqjbiBwaOG6qW0gbsOgeS4gU+G7sSBraMOhYyBiaeG7h3Qgbmjhu48gZ2nhu69hIGhhaSBnaeG7m2kgY2hvIHRo4bqleSBow6BuaCB2aSBs4buxYSBjaOG7jW4gc+G6o24gcGjhuqltIHRoZW8gZ2nhu5tpIHTDrW5oIGPDsyB0aOG7gyB04buTbiB04bqhaSBt4buZdCBz4buRIGtow6FjIGJp4buHdCBuaOG6uSwgY+G6p24gxJHGsOG7o2Mga2nhu4NtIGNo4bupbmcgYuG6sW5nIHBow6JuIHTDrWNoIHRo4buRbmcga8OqIHRp4bq/cCB0aGVvLg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qKg0KDQpgYGB7cn0NCnByb3AudGFibGUoZ2VuZGVyX2ZhbWlseSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KS+G6v3QgcXXhuqMgdHJvbmcgYuG6o25nIHThuqduIHN14bqldCBjaMOpbyBjaG8gdGjhuqV5Og0KDQotIFRyb25nIHThu5VuZyBz4buRIGtow6FjaCBow6BuZyBtdWEgaMOgbmcsIGtob+G6o25nIDQuNzYlIGzDoCBraMOhY2ggaMOgbmcgbuG7ryAoRikgbXVhIHPhuqNuIHBo4bqpbSBuaMOzbSBEcmluaywgdsOgIGtob+G6o25nIDQuMTMlIGzDoCBraMOhY2ggaMOgbmcgbmFtIChNKSBtdWEgbmjDs20gbsOgeS4NCg0KLSBOaMOzbSBz4bqjbiBwaOG6qW0gRm9vZCBsw6AgbmjDs20gxJHGsOG7o2MgbXVhIG5oaeG7gXUgbmjhuqV0LCBjaGnhur9tIGtob+G6o25nIDM2LjYyJSB04buVbmcgc+G7kSBnaWFvIGThu4tjaCB04burIG7hu68gdsOgIDM1LjU5JSB04burIG5hbS4NCg0KLSBOaMOzbSBOb24tQ29uc3VtYWJsZSBjaGnhur9tIGtob+G6o25nIDkuNjIlIHThu5VuZyBz4buRIGdpYW8gZOG7i2NoIHThu6sgbuG7ryB2w6AgOS4yOCUgdOG7qyBuYW0uDQoNCk5oxrAgduG6rXksIG5ow7NtIHPhuqNuIHBo4bqpbSBGb29kIGNoaeG6v20gdOG7tyBs4buHIGzhu5tuIG5o4bqldCB0cm9uZyB04buVbmcgdGjhu4Mgc+G7kSBsxrDhu6N0IG11YSBj4bunYSBj4bqjIGhhaSBnaeG7m2ksIHBo4bqjbiDDoW5oIHPhu7EgcGjhu5UgYmnhur9uIHbDoCBuaHUgY+G6p3UgY2FvIMSR4buRaSB24bubaSBuaMOzbSBz4bqjbiBwaOG6qW0gbsOgeS4gTeG7qWMgxJHhu5kgbXVhIGjDoG5nIGPhu6dhIG5hbSB2w6AgbuG7ryDhu58gY8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0gY8OzIHPhu7EgdMawxqFuZyDEkeG7k25nIGtow6EgbOG7m24sIGNobyB0aOG6pXkgaMOgbmggdmkgdGnDqnUgZMO5bmcgZ2nhu69hIGhhaSBnaeG7m2kgdHJvbmcgY8OhYyBuaMOzbSBz4bqjbiBwaOG6qW0gbsOgeSB0xrDGoW5nIMSR4buRaSDEkeG7k25nIMSR4buBdS4gVHV5IG5oacOqbiwgbmjDs20gRHJpbmsgY8OzIHThu7cgbOG7hyB0aOG6pXAgbmjhuqV0IHRyb25nIHThu5VuZyB0aOG7gyBsxrDhu6N0IG11YSwgY2hvIHRo4bqleSBuaMOzbSBz4bqjbiBwaOG6qW0gbsOgeSDDrXQgxJHGsOG7o2MgbOG7sWEgY2jhu41uIGjGoW4uDQoNCioqVuG6vSDEkeG7kyB0aOG7iyoqDQpgYGB7cn0NCg0KIyBDaHV54buDbiDEkeG7lWkgZOG7ryBsaeG7h3Ugc2FuZyBk4bqhbmcgZGF0YSBmcmFtZQ0KZGZfZ2VuZGVyX2ZhbWlseSA8LSBhcy5kYXRhLmZyYW1lKGdlbmRlcl9mYW1pbHkpDQpjb2xuYW1lcyhkZl9nZW5kZXJfZmFtaWx5KSA8LSBjKCJHZW5kZXIiLCAiUHJvZHVjdEZhbWlseSIsICJDb3VudCIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgbmjDs20NCmdncGxvdChkZl9nZW5kZXJfZmFtaWx5LCBhZXMoeCA9IFByb2R1Y3RGYW1pbHksIHkgPSBDb3VudCwgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBsYWJzKHRpdGxlID0gIlPhu5EgbMaw4bujdCBtdWEgdGhlbyBQcm9kdWN0RmFtaWx5IHbDoCBHZW5kZXIiLCANCiAgICAgICB4ID0gIlByb2R1Y3QgRmFtaWx5IiwgeSA9ICJT4buRIGzGsOG7o3QgbXVhIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQotICoqWHUgaMaw4bubbmcgdGnDqnUgZMO5bmcgdMawxqFuZyDEkeG7k25nKio6IEJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IGPhuqMgbmFtIHbDoCBu4buvIMSR4buBdSBjw7MgeHUgaMaw4bubbmcgdGnDqnUgZMO5bmcgdMawxqFuZyB04buxIG5oYXUuIOG7niBt4buXaSBuaMOzbSBz4bqjbiBwaOG6qW0sIGNoaeG7gXUgY2FvIGPhu5l0IGPhu6dhIGhhaSBnaeG7m2kgZ+G6p24gYuG6sW5nIG5oYXUsIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgbXVhIHPhuq9tIGdp4buvYSBoYWkgZ2nhu5tpIGtow7RuZyBjaMOqbmggbOG7h2NoIMSRw6FuZyBr4buDLg0KDQotICoqTmjDs20gc+G6o24gcGjhuqltIEZvb2QgxJHGsOG7o2MgxrBhIGNodeG7mW5nIG5o4bqldCoqOiDEkMOieSBsw6AgbmjDs20gc+G6o24gcGjhuqltIGPDsyBz4buRIGzGsOG7o3QgbXVhIGNhbyB2xrDhu6N0IHRy4buZaSBzbyB24bubaSBoYWkgbmjDs20gY8OybiBs4bqhaSDhu58gY+G6oyBuYW0gdsOgIG7hu68uIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCBuaHUgY+G6p3UgdGnDqnUgZMO5bmcgdGjhu7FjIHBo4bqpbSBsw6AgY2jhu6cgeeG6v3UgdHJvbmcgdOG7lW5nIHRo4buDIGPDoWMgZ2lhbyBk4buLY2guDQoNCi0gKipEcmluayBsw6AgbmjDs20gw610IMSRxrDhu6NjIG11YSBuaOG6pXQqKjogU+G7kSBsxrDhu6N0IG11YSBuaMOzbSBEcmluayB0aOG6pXAgbmjhuqV0IOG7nyBj4bqjIGhhaSBnaeG7m2ksIMSRaeG7gXUgbsOgeSBjw7MgdGjhu4MgY2hvIHRo4bqleSBt4bupYyDEkeG7mSDGsHUgdGnDqm4gdGjhuqVwIGjGoW4gY+G7p2Ega2jDoWNoIGjDoG5nIMSR4buRaSB24bubaSDEkeG7kyB14buRbmcgdHJvbmcgZGFuaCBzw6FjaCB0acOqdSBkw7luZy4NCg0KKipT4buxIGtow6FjIGJp4buHdCBnaeG7m2kgdMOtbmggbmjhu48qKjogVHJvbmcgdOG7q25nIG5ow7NtIHPhuqNuIHBo4bqpbSwgbuG7ryBjw7Mgc+G7kSBsxrDhu6N0IG11YSBuaOG7iW5oIGjGoW4gbmFtIG3hu5l0IGNow7p0LCBuaMawbmcga2jDtG5nIMSRw6FuZyBr4buDLiDEkGnhu4F1IG7DoHkgZ+G7o2kgw70gcuG6sW5nIGdp4bubaSB0w61uaCBraMO0bmcgcGjhuqNpIGzDoCB54bq/dSB04buRIGNoaSBwaOG7kWkgbeG6oW5oIGjDoG5oIHZpIHRpw6p1IGTDuW5nIHRoZW8gbmjDs20gc+G6o24gcGjhuqltLCBt4bq3YyBkw7kgY8OzIHRo4buDIGPDsyBuaOG7r25nIHh1IGjGsOG7m25nIG5o4buPLg0KDQoqKkvhur90IGx14bqtbioqOiBCaeG7g3UgxJHhu5MgdHLhu7FjIHF1YW4gaOG7lyB0cuG7oyBr4bq/dCBsdeG6rW4gcuG6sW5nIGhhaSBiaeG6v24gxJHhu4tuaCB0w61uaCAiR2nhu5tpIHTDrW5oIiB2w6AgIk5ow7NtIHPhuqNuIHBo4bqpbSIgY8OzIG3hu5FpIHF1YW4gaOG7hyB0xrDGoW5nIMSR4buRaSDhu5VuIMSR4buLbmggdsOgIHTGsMahbmcgxJHhu5NuZywga2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCBs4bubbiBnaeG7r2EgbmFtIHbDoCBu4buvIHRyb25nIGjDoG5oIHZpIGNo4buNbiBsb+G6oWkgc+G6o24gcGjhuqltLiBUdXkgbmhpw6puLCDEkeG7gyBraOG6s25nIMSR4buLbmggbeG7kWkgbGnDqm4ga+G6v3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBoYXkga2jDtG5nLCBj4bqnbiB0aOG7sWMgaGnhu4duIHRow6ptIGPDoWMga2nhu4NtIMSR4buLbmggbmjGsCBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgKENoaS1zcXVhcmUgdGVzdCkuDQoNCiMjIyAqKktp4buDbSDEkeG7i25oIHRo4buRbmcga8OqKioNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaDoqKg0KDQotICoqSDA6KiogSGFpIGJp4bq/biBHZW5kZXIgdsOgIFByb2R1Y3RGYW1pbHkgxJHhu5ljIGzhuq1wDQoNCi0gKipIMToqKiBIYWkgYmnhur9uIEdlbmRlciB2w6AgUHJvZHVjdEZhbWlseSBjw7MgbeG7kWkgbGnDqm4gaOG7hw0KDQoqKlRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpLSBiw6xuaCBwaMawxqFuZyoqDQoNCmBgYHtyfQ0KY2hpc3FfcmVzdWx0MiA8LSBjaGlzcS50ZXN0KGdlbmRlcl9mYW1pbHkpDQpjaGlzcV9yZXN1bHQyDQpgYGANCioqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KLSBHacOhIHRy4buLIHRo4buRbmcga8OqIENoaS1iw6xuaCBwaMawxqFuZzogWC1zcXVhcmVkID0gMy41MTg1DQoNCi0gQuG6rWMgdOG7sSBkbzogZGYgPSAyDQoNCi0gR2nDoSB0cuG7iyBwOiBwLXZhbHVlID0gMC4xNzIyDQoqKkvhur90IGx14bqtbioqDQoNCi0gVuG7m2kgbeG7qWMgw70gbmdoxKlhICoqzrEgPSAwLjA1KiosIHRhIGtow7RuZyDEkeG7pyBi4bqxbmcgY2jhu6luZyDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIHbDrCBnacOhIHRy4buLICoqcCA9IDAuMTcyMiA+IDAuMDUqKi4NCg0KLSDEkGnhu4F1IG7DoHkgY8OzIG5naMSpYSBsw6AgY2jGsGEgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIMSR4buDIGto4bqzbmcgxJHhu4tuaCBy4bqxbmcgZ2nhu5tpIHTDrW5oIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gbG/huqFpIHPhuqNuIHBo4bqpbSDEkcaw4bujYyBjaOG7jW4uIE7Ds2kgY8OhY2gga2jDoWMsIGhhaSBiaeG6v24gKkdlbmRlciogdsOgICpQcm9kdWN0RmFtaWx5KiBjw7MgdGjhu4MgxJHGsOG7o2MgeGVtIGzDoCAqKsSR4buZYyBs4bqtcCoqIHRyb25nIGThu68gbGnhu4d1IG7DoHkuDQoNCioqVGjhuqNvIGx14bqtbiB0aMOqbSoqDQoNCk3hurdjIGTDuSBraeG7g20gxJHhu4tuaCB0aOG7kW5nIGvDqiBraMO0bmcgcGjDoXQgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBjw7Mgw70gbmdoxKlhIGdp4buvYSBoYWkgYmnhur9uLCBuaMawbmcgcXVhIGLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8gdsOgIGJp4buDdSDEkeG7kyBtaW5oIGjhu41hLCB0YSB24bqrbiBjw7MgdGjhu4MgcXVhbiBzw6F0IMSRxrDhu6NjIG3hu5l0IHPhu5EgeHUgaMaw4bubbmcgbmjhu48gbmjGsDoNCg0KLSBD4bqjICoqbmFtKiogdsOgICoqbuG7ryoqIMSR4buBdSBjaOG7jW4gbmjDs20gc+G6o24gcGjhuqltICoqRm9vZCoqIG5oaeG7gXUgbmjhuqV0LCB0aeG6v3AgdGhlbyBsw6AgKipOb24tQ29uc3VtYWJsZSoqLCB2w6Agw610IG5o4bqldCBsw6AgKipEcmluayoqLg0KDQotIFPhu5EgbMaw4bujdCBtdWEgZ2nhu69hIG5hbSB2w6AgbuG7ryDhu58gdOG7q25nIG5ow7NtIHPhuqNuIHBo4bqpbSBjw7Mgc+G7sSBjaMOqbmggbOG7h2NoIG5o4bq5LCB0dXkgbmhpw6puLCBt4bupYyDEkeG7mSBraMOhYyBiaeG7h3QgbsOgeSBjaMawYSDEkeG7pyBs4bubbiDEkeG7gyB0cuG7nyBuw6puIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouDQoNCkRvIMSRw7MsIG3hurdjIGTDuSBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHTDrW5oIMSR4buZYyBs4bqtcCBnaeG7r2EgaGFpIGJp4bq/biwgbmjGsG5nIHZp4buHYyBraMOhbSBwaMOhIHh1IGjGsOG7m25nIGjDoG5oIHZpIHRpw6p1IGTDuW5nIHRoZW8gZ2nhu5tpIHTDrW5oIHbhuqtuIGPDsyB0aOG7gyBo4buvdSDDrWNoIGtoaSBwaMOibiB0w61jaCBzw6J1IGjGoW4gaG/hurdjIG3hu58gcuG7mW5nIG3huqt1IGThu68gbGnhu4d1IHRyb25nIGPDoWMgbmdoacOqbiBj4bupdSB0aeG6v3AgdGhlby4NCg0KIyMgKipD4bq3cCBiaeG6v246IEhvbWVvd25lciB2w6AgQW5udWFsSW5jb21lKioNCg0KIyMjICoqVGjhu5FuZyBrw6ogbcO0IHThuqMgY+G6t3AgYmnhur9uIEhvbWVvd25lciB2w6AgQW5udWFsSW5jb21lKioNCg0KKipC4bqjbmcgdOG6p24gc+G7kSBjaMOpbyoqDQpgYGB7cn0NCmhvbWVfaW5jb21lIDwtIHRhYmxlKGRhdGFEVCRIb21lb3duZXIsIGRhdGFEVCRBbm51YWxJbmNvbWUpDQpob21lX2luY29tZQ0KYGBgDQoqKk5o4bqtbiB4w6l0OioqDQoNCkvhur90IHF14bqjIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCAoSG9tZW93bmVyID0gWSkgdsOgIGtow7RuZyBz4bufIGjhu691IG5ow6AgKEhvbWVvd25lciA9IE4pIHRoZW8gY8OhYyBuaMOzbSB0aHUgbmjhuq1wIGjhurFuZyBuxINtLiBU4burIMSRw7MsIHRhIGPDsyB0aOG7gyByw7p0IHJhIG3hu5l0IHPhu5Egbmjhuq1uIHjDqXQgcXVhbiB0cuG7jW5nOg0KDQotIE5ow7NtIHRodSBuaOG6rXAgKiokMTBLIOKAkyAkMzBLKiogbMOgIG5ow7NtIGPDsyBz4buRIGzGsOG7o25nIGPDoSBuaMOibiBraMOhIGzhu5tuLiDEkMOhbmcgY2jDuiDDvSwgc+G7kSBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgKDEuNzMxKSB2xrDhu6N0IHF1YSBz4buRIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691ICgxLjM1OSksIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyDhu58gbmjDs20gdGh1IG5o4bqtcCB0aOG6pXAgbmjhuqV0LCB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIGPDsyB0aOG7gyDEkeG6v24gdOG7qyBjw6FjIHnhur91IHThu5EgcGhpIHRodSBuaOG6rXAgbmjGsCBo4buXIHRy4bujIHThu6sgZ2lhIMSRw6xuaCBob+G6t2MgY2hpIHBow60gbmjDoCDhu58gdGjhuqVwLg0KDQotIE5ow7NtICoqJDMwSyDigJMgJDUwSyoqIGPDsyBz4buxIGNow6puaCBs4buHY2ggxJHDoW5nIGvhu4MgduG7m2kgKioyLjUxNCBuZ8aw4budaSBz4bufIGjhu691IG5ow6AqKiBzbyB24bubaSAqKjIuMDg3IG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691KiosIGNobyB0aOG6pXkga2hpIHRodSBuaOG6rXAgdMSDbmcgbMOqbiBt4bupYyB0cnVuZyBiw6xuaCB0aOG6pXAsIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCB0xINuZyDEkcOhbmcga+G7gywgY8OzIHRo4buDIG5o4budIHTDrWNoIGzFqXkgdMOgaSBjaMOtbmggaG/hurdjIGto4bqjIG7Eg25nIHRp4bq/cCBj4bqtbiB0w61uIGThu6VuZy4NCg0KLSDhu54gbmjDs20gdGh1IG5o4bqtcCAqKiQ1MEsg4oCTICQ3MEsqKiwgeHUgaMaw4bubbmcgdGnhur9wIHThu6VjIMSRxrDhu6NjIGR1eSB0csOsIHbhu5tpICoqMS4zMDcgbmfGsOG7nWkgc+G7nyBo4buvdSoqIHbDoCAqKjEuMDYzIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691KiosIGNobyB0aOG6pXkgdGh1IG5o4bqtcCB04burIG3hu6ljIHRydW5nIGLDrG5oIHRy4bufIGzDqm4gxJHDoyBi4bqvdCDEkeG6p3UgZ2nDunAgxJFhIHPhu5EgY8OhIG5ow6JuIHPhu58gaOG7r3UgbmjDoC4NCg0KLSBOaMOzbSB0aHUgbmjhuq1wICoqJDcwSyDigJMgJDkwSyoqIGNobyB0aOG6pXkgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCB0aeG6v3AgdOG7pWMgdMSDbmcgbeG6oW5oLCB24bubaSAqKjEuMDIzIG5nxrDhu51pIHPhu58gaOG7r3UqKiBzbyB24bubaSAqKjY4NiBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdSoqLCB0xrDGoW5nIMSRxrDGoW5nIGtob+G6o25nIDYwJSBjw6EgbmjDom4gdHJvbmcgbmjDs20gbsOgeSDEkcOjIHPhu58gaOG7r3UgbmjDoC4NCg0KLSDhu54gbeG7qWMgKiokOTBLIOKAkyAkMTEwSyoqLCB4dSBoxrDhu5tuZyBz4bufIGjhu691IG5ow6AgdHLhu58gbsOqbiByw7UgcuG7h3QsIGtoaSBjw7MgdOG7m2kgKio0OTYgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgKiogdsOgIGNo4buJICoqMTE3IG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691KiosIHTGsMahbmcgxJHGsMahbmcgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCBraG/huqNuZyA4MCUuDQoNCi0gVHJvbmcgbmjDs20gKiokMTEwSyDigJMgJDEzMEsqKiwgY8OzIHThu5tpICoqNTI0IG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCoqIHNvIHbhu5tpICoqMTE5IG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691KiosIGNobyB0aOG6pXkgdGh1IG5o4bqtcCBjYW8gaMahbiB0aeG6v3AgdOG7pWMgZ2lhIHTEg25nIHjDoWMgc3XhuqV0IHPhu58gaOG7r3UgYuG6pXQgxJHhu5luZyBz4bqjbi4NCg0KLSBOaMOzbSAqKiQxMzBLIOKAkyAkMTUwSyoqIHRo4buDIGhp4buHbiB04bu3IGzhu4cgc+G7nyBo4buvdSBuaMOgIHbGsOG7o3QgdHLhu5lpIHbhu5tpICoqNjI0IG5nxrDhu51pIGPDsyBuaMOgKiogdsOgICoqY2jhu4kgMTM2IG5nxrDhu51pIGtow7RuZyBjw7MqKiwgcGjhuqNuIMOhbmggcuG6sW5nIHThuqFpIG3hu6ljIHRodSBuaOG6rXAgbsOgeSwgKip2aeG7h2Mgc+G7nyBo4buvdSBuaMOgIMSRw6MgdHLhu58gdGjDoG5oIGNodeG6qW4gbeG7sWMgcGjhu5UgYmnhur9uKiouDQoNCi0gQ3Xhu5FpIGPDuW5nLCBuaMOzbSB0aHUgbmjhuq1wICoqdHLDqm4gJDE1MEsqKiBjw7MgKioyMjUgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgKiogdsOgIGNo4buJICoqNDggbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UqKiwgdMawxqFuZyDEkcawxqFuZyB04bu3IGzhu4cgc+G7nyBo4buvdSB0csOqbiA4MiUsIGNobyB0aOG6pXkgcuG6sW5nIOG7nyBt4bupYyB0aHUgbmjhuq1wIHLhuqV0IGNhbywgdmnhu4djIHPhu58gaOG7r3UgbmjDoCBn4bqnbiBuaMawIGzDoCBt4bq3YyDEkeG7i25oLg0KDQoqKkvhur90IGx14bqtbjoqKiBU4burIG5o4buvbmcgcGjDom4gdMOtY2ggdHLDqm4sIGPDsyB0aOG7gyB0aOG6pXkgcuG6sW5nIG3hu6ljIHRodSBuaOG6rXAgaOG6sW5nIG7Eg20gY8OzIG3hu5FpIHF1YW4gaOG7hyB0aHXhuq1uIGNoaeG7gXUgduG7m2kgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoC4gS2hpIHRodSBuaOG6rXAgdMSDbmcsIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgYuG6pXQgxJHhu5luZyBz4bqjbiB0xINuZyBsw6puIHLDtSBy4buHdC4gVHV5IG5oacOqbiwgdmnhu4djIG3hu5l0IHPhu5EgbmjDs20gdGh1IG5o4bqtcCB0aOG6pXAgduG6q24gY8OzIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY2FvIGPFqW5nIGfhu6NpIMO9IHLhurFuZyBjw6FjIHnhur91IHThu5Egbmdvw6BpIHRodSBuaOG6rXAgIG5oxrAgdGjhu6thIGvhur8sIGdpw6EgbmjDoCDhu58gdGjhuqVwIGhv4bq3YyBjw6FjIGNoxrDGoW5nIHRyw6xuaCBo4buXIHRy4bujIG5ow6Ag4bufIGPDsyB0aOG7gyDEkcOzbmcgdmFpIHRyw7IgcXVhbiB0cuG7jW5nLg0KDQoqKkLhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qKg0KDQpgYGB7cn0NCnByb3AudGFibGUoaG9tZV9pbmNvbWUpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCkLhuqNuZyB04bu3IGzhu4cgcGjhuqduIHRyxINtIHThu5VuZyB0aOG7gyBjaG8gdGjhuqV5IHh1IGjGsOG7m25nIHLhuqV0IHLDtSByw6BuZyB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgdGh1IG5o4bqtcCB2w6AgcXV54buBbiBz4bufIGjhu691IG5ow6Ag4bufLiBD4bulIHRo4buDOg0KDQotIOG7niBuaMOzbSB0aHUgbmjhuq1wIFwkMTBLIOKAkyBcJDMwSywgdOG7tyBs4buHIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBjaGnhur9tICoqMTIuMzElKiosIGNhbyBoxqFuIHNvIHbhu5tpICoqOS42NiUqKiBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcuG6sW5nIG5nYXkgY+G6oyDhu58gbeG7qWMgdGh1IG5o4bqtcCB0aOG6pXAgbmjhuqV0LCB24bqrbiBjw7MgbeG7mXQgYuG7mSBwaOG6rW4gbOG7m24gbmfGsOG7nWkgZMOibiBjw7Mga2jhuqMgbsSDbmcgc+G7nyBo4buvdSBuaMOgLCBjw7MgdGjhu4Mgbmjhu50gY8OhYyB54bq/dSB04buRIGjhu5cgdHLhu6MgbmjGsCB0w6BpIHPhuqNuIHRo4burYSBr4bq/IGhv4bq3YyBjaGkgcGjDrSBuaMOgIOG7nyB0aOG6pXAuDQoNCi0gS2hpIHRodSBuaOG6rXAgdMSDbmcgbMOqbiBuaMOzbSBcJDMwSyDigJMgXCQ1MEssIHThu7cgbOG7hyBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgdMSDbmcgbMOqbiAqKjE3Ljg4JSoqLCB2xrDhu6N0IGtow6EgeGEgc28gduG7m2kgKioxNC44NCUqKiBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdS4gxJDDonkgY8OzIHRo4buDIGzDoCBnaWFpIMSRb+G6oW4gbmhp4buBdSBuZ8aw4budaSBi4bqvdCDEkeG6p3UgY8OzIGto4bqjIG7Eg25nIHTDrWNoIGzFqXkgaG/hurdjIHRp4bq/cCBj4bqtbiBjw6FjIGtob+G6o24gdmF5IG11YSBuaMOgLg0KDQotIE5ow7NtIHRodSBuaOG6rXAgXCQ1MEsg4oCTIFwkNzBLIHRp4bq/cCB04bulYyBwaOG6o24gw6FuaCB4dSBoxrDhu5tuZyBuw6B5LCB24bubaSAqKjkuMzAlKiogbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIHNvIHbhu5tpICoqNy41MCUqKiBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdS4NCg0KLSDhu54gY8OhYyBuaMOzbSB0aHUgbmjhuq1wIHRydW5nIGLDrG5oIGNhbyBuaMawIFwkNzBLIOKAkyBcJDkwSyB2w6AgXCQ5MEsg4oCTIFwkMTEwSywgY2jDqm5oIGzhu4djaCB0cuG7nyBuw6puIHLDtSBy4buHdCBoxqFuLiBU4bu3IGzhu4cgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGzhuqduIGzGsOG7o3QgbMOgICoqNy4yOCUqKiB2w6AgKiozLjUzJSoqLCBzbyB24bubaSB04bu3IGzhu4cga2jDtG5nIHPhu58gaOG7r3UgY2jhu4kgbMOgICoqNC44NyUqKiB2w6AgKiowLjgzJSoqLiDEkMOieSBsw6AgbWluaCBjaOG7qW5nIHLDtSByw6BuZyBjaG8gdmnhu4djIHRodSBuaOG6rXAgY2FvIGdpw7pwIG7Dom5nIGNhbyBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6AuDQoNCi0gVOG7qyBt4bupYyB0aHUgbmjhuq1wIFwkMTEwSyDigJMgXCQxMzBLIHRy4bufIMSRaSwga2hv4bqjbmcgY8OhY2ggZ2nhu69hIGhhaSBuaMOzbSB0xINuZyBt4bqhbmguIE5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBjaGnhur9tICoqMy43MyUqKiwgY2FvIGfhuqVwIGjGoW4gNCBs4bqnbiBzbyB24bubaSAqKjAuODQlKiogbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UuDQoNCi0gVuG7m2kgbmjDs20gXCQxMzBLIOKAkyBcJDE1MEssIHThu7cgbOG7hyBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgbMOqbiB04bubaSAqKjQuNDQlKiosIHRyb25nIGtoaSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIGNo4buJIGNoaeG6v20gKiowLjk3JSoqLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcg4bufIG3hu6ljIHRodSBuaOG6rXAgbsOgeSwgdmnhu4djIHPhu58gaOG7r3UgbmjDoCBn4bqnbiBuaMawIHRy4bufIHRow6BuaCBjaHXhuqluIG3hu7FjIHBo4buVIGJp4bq/bi4NCg0KLSBDdeG7kWkgY8O5bmcsIG5ow7NtIHRodSBuaOG6rXAgKip0csOqbiBcJDE1MEsqKiBjw7MgdOG7tyBs4buHIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCBsw6AgKioxLjYwJSoqLCBjYW8gZ+G6pXAgZ+G6p24gNSBs4bqnbiBzbyB24bubaSAqKjAuMzQlKiogbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UuIFThu6ljIGzDoCwgdOG6oWkgbeG7qWMgdGh1IG5o4bqtcCBy4bqldCBjYW8sIHF1eeG7gW4gc+G7nyBo4buvdSBuaMOgIGfhuqduIG5oxrAgbMOgIG3hurdjIMSR4buLbmgqLg0KDQpOaMOsbiBjaHVuZywgZOG7ryBsaeG7h3UgcGjhuqNuIMOhbmggbeG7mXQgbeG7kWkgcXVhbiBo4buHIHRodeG6rW4gY2hp4buBdSBy4bqldCByw7UgcsOgbmcgZ2nhu69hIHRodSBuaOG6rXAgaOG6sW5nIG7Eg20gdsOgIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AuIEtoaSB0aHUgbmjhuq1wIHTEg25nIGzDqm4sIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgYuG6pXQgxJHhu5luZyBz4bqjbiBjxaluZyB0xINuZyB0aGVvIG3hu5l0IGPDoWNoIMSRw6FuZyBr4buDLiBUdXkgbmhpw6puLCBjxaluZyBj4bqnbiBsxrB1IMO9IHLhurFuZyDhu58gbmjDs20gdGh1IG5o4bqtcCB0aOG6pXAsIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgduG6q24ga2jDtG5nIGjhu4Egbmjhu48uIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyB0aHUgbmjhuq1wIGtow7RuZyBwaOG6o2kgbMOgIHnhur91IHThu5EgZHV5IG5o4bqldCBxdXnhur90IMSR4buLbmgsIHbDoCBjw6FjIHnhur91IHThu5Ega2jDoWMgbmjGsCB0aOG7q2Ega+G6vywgZ2nDoSBi4bqldCDEkeG7mW5nIHPhuqNuIHbDuW5nLCBoYXkgaOG7lyB0cuG7oyBjaMOtbmggc8OhY2ggbmjDoCDhu58gY8WpbmcgY8OzIHRo4buDIMSRw7NuZyB2YWkgdHLDsiBxdWFuIHRy4buNbmcuDQoNCioqVuG6vSDEkeG7kyB0aOG7iyoqDQoNCmBgYHtyfQ0KIyBDaHV54buDbiBi4bqjbmcgdOG6p24gc3XhuqV0IGNow6lvIHNhbmcgZGF0YSBmcmFtZQ0KZGZfaG9tZV9pbmNvbWUgPC0gYXMuZGF0YS5mcmFtZShob21lX2luY29tZSkNCmNvbG5hbWVzKGRmX2hvbWVfaW5jb21lKSA8LSBjKCJIb21lb3duZXIiLCAiQW5udWFsSW5jb21lIiwgIkNvdW50IikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCBuaMOzbQ0KZ2dwbG90KGRmX2hvbWVfaW5jb21lLCBhZXMoeCA9IEFubnVhbEluY29tZSwgeSA9IENvdW50LCBmaWxsID0gSG9tZW93bmVyKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGxhYnModGl0bGUgPSAiU+G7kSBsxrDhu6NuZyBuZ8aw4budaSBz4bufIGjhu691IHbDoCBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHRoZW8gbmjDs20gdGh1IG5o4bqtcCIsDQogICAgICAgeCA9ICJOaMOzbSB0aHUgbmjhuq1wIGjhurFuZyBuxINtIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmcgY8OhIG5ow6JuIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSAqKlThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgdMSDbmcgdGhlbyB0aHUgbmjhuq1wOioqIEJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IHh1IGjGsOG7m25nIHLhuqV0IHLDtSByw6BuZzoga2hpIG5ow7NtIHRodSBuaOG6rXAgdMSDbmcsIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIChZKSBjxaluZyB0xINuZyDEkcOhbmcga+G7gywgxJHhurdjIGJp4buHdCByw7UgcsOgbmcg4bufIG5ow7NtIGAkMzBLIOKAkyAkNTBLYCB2w6AgYCQ1MEsg4oCTICQ3MEtgLg0KDQotICoqTmjDs20gdGh1IG5o4bqtcCAkMzBLIOKAkyAkNTBLIGNoaeG6v20gxrB1IHRo4bq/IHLDtSBy4buHdDoqKiDEkMOieSBsw6AgbmjDs20gY8OzIHPhu5EgbMaw4bujbmcgbmfGsOG7nWkgc+G7nyBo4buvdSBuaMOgIGNhbyBuaOG6pXQgdHJvbmcgdG/DoG4gYuG7mSBiaeG7g3UgxJHhu5MsIHbGsOG7o3QgdHLhu5lpIGjGoW4gaOG6s24gc28gduG7m2kgbmjDs20ga2jDtG5nIHPhu58gaOG7r3UgdHJvbmcgY8O5bmcgcGjDom4ga2jDumMuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IMSRw6J5IGPDsyB0aOG7gyBsw6AgbeG7qWMgdGh1IG5o4bqtcCB0cnVuZyBiw6xuaCBwaOG7lSBiaeG6v24sIMSR4bunIMSR4buDIG5nxrDhu51pIGTDom4gYuG6r3QgxJHhuqd1IHRp4bq/cCBj4bqtbiB0aOG7iyB0csaw4budbmcgYuG6pXQgxJHhu5luZyBz4bqjbi4NCg0KLSAqKk5nxrDhu51pIHRodSBuaOG6rXAgdGjhuqVwIHbhuqtuIGPDsyBraOG6oyBuxINuZyBz4bufIGjhu691IG5ow6A6Kiog4bueIG5ow7NtIHRodSBuaOG6rXAgYCQxMEsg4oCTICQzMEtgLCBz4buRIGzGsOG7o25nIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCB24bqrbiBjYW8gaMahbiBuZ8aw4budaSBraMO0bmcgc+G7nyBo4buvdS4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBwaOG6o24gw6FuaCBz4buxIGjhu5cgdHLhu6MgdOG7qyBjw6FjIHnhur91IHThu5Ega2jDoWMgbmjGsCB0w6BpIHPhuqNuIHRo4burYSBr4bq/LCBuaMOgIGdpw6EgcuG6uyB2w7luZyBuw7RuZyB0aMO0biBob+G6t2MgaOG7lyB0cuG7oyB4w6MgaOG7mWkuDQoNCi0gKipU4bu3IGzhu4cga2jDtG5nIHPhu58gaOG7r3UgbmjDoCBnaeG6o20g4bufIGPDoWMgbmjDs20gdGh1IG5o4bqtcCBjYW86KiogVOG7qyBuaMOzbSBgJDcwSyDigJMgJDkwS2AgdHLhu58gxJFpLCBz4buRIG5nxrDhu51pIGtow7RuZyBz4bufIGjhu691IG5ow6AgKE4pIGdp4bqjbSBt4bqhbmgsIHRyb25nIGtoaSBuZ8aw4budaSBz4bufIGjhu691IG5ow6AgduG6q24gZHV5IHRyw6wgc+G7kSBsxrDhu6NuZyDhu5VuIMSR4buLbmguIMSQaeG7gXUgbsOgeSBwaOG6o24gw6FuaCBy4bqxbmcgdGh1IG5o4bqtcCBjYW8gZ+G6r24gbGnhu4FuIHbhu5tpIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoCBn4bqnbiBuaMawIG3hurdjIMSR4buLbmguDQoNCi0gKipDaMOqbmggbOG7h2NoIHLDtSBy4buHdCBnaeG7r2EgaGFpIG5ow7NtIHPhu58gaOG7r3U6Kiog4bueIGPDoWMgbmjDs20gdGh1IG5o4bqtcCBjYW8gaMahbiAoYCQ5MEsg4oCTICQxMTBLYCwgYCQxMTBLIOKAkyAkMTMwS2AgdsOgIHRyw6puIGAkMTUwS2ApLCBz4buRIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCB0dXkgY8OzIHh1IGjGsOG7m25nIGdp4bqjbSBuaOG6uSB24buBIHPhu5EgdHV54buHdCDEkeG7kWksIG5oxrBuZyB24bqrbiB2xrDhu6N0IHhhIHPhu5EgbmfGsOG7nWkga2jDtG5nIHPhu58gaOG7r3UsIGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgcGjhu5UgYmnhur9uIGPhu6dhIHZp4buHYyBz4bufIGjhu691IG5ow6Ag4bufIG5ow7NtIHRodSBuaOG6rXAgY2FvLg0KDQoqKkvhur90IGx14bqtbjoqKkJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IG3hu5FpIHF1YW4gaOG7hyB0aHXhuq1uIGNoaeG7gXUgbeG6oW5oIG3hur0gZ2nhu69hIHRodSBuaOG6rXAgaOG6sW5nIG7Eg20gdsOgIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoC4gQ8OgbmcgY8OzIHRodSBuaOG6rXAgY2FvLCBuZ8aw4budaSBkw6JuIGPDoG5nIGPDsyB4dSBoxrDhu5tuZyBz4bufIGjhu691IG5ow6Agbmhp4buBdSBoxqFuLiBUdXkgbmhpw6puLCBz4buxIGhp4buHbiBkaeG7h24gxJHDoW5nIGvhu4MgY+G7p2EgY2jhu6cgc+G7nyBo4buvdSBuaMOgIHRyb25nIG5ow7NtIHRodSBuaOG6rXAgdGjhuqVwIGPFqW5nIGNobyB0aOG6pXkgdGh1IG5o4bqtcCBraMO0bmcgcGjhuqNpIHnhur91IHThu5EgZHV5IG5o4bqldCwgdsOgIGPhuqduIHjDqXQgdGjDqm0gxJHhur9uIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBuaMawIGNow61uaCBzw6FjaCBuaMOgIOG7nywgbcO0aSB0csaw4budbmcgc+G7kW5nLCBob+G6t2MgaOG7lyB0cuG7oyB0w6BpIGNow61uaCB04burIGdpYSDEkcOsbmguIMSQ4buDIGto4bqzbmcgxJHhu4tuaCByw7UgcsOgbmcgaMahbiB24buBIG3hu5FpIGxpw6puIGjhu4cgbsOgeSwgY8OzIHRo4buDIGPhuqduIHRo4buxYyBoaeG7h24gdGjDqm0ga2nhu4NtIMSR4buLbmggdGjhu5FuZyBrw6ogKG5oxrAgQ2hpLXNxdWFyZWQgdGVzdCkuDQoNCiMjIyAqKktp4buDbSDEkeG7i25oIHRo4buRbmcga8OqKioNCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaCoqDQoNCi0gKipIMDoqKiBIYWkgYmnhur9uIEhvbWVvd25lciB2w6AgQW5udWFsSW5jb21lIMSR4buZYyBs4bqtcA0KLSAqKkgxOioqIEhhaSBiaeG6v24gSG9tZW93bmVyIHbDoCBBbm51YWxJbmNvbWUgY8OzIG3hu5FpIGxpw6puIGjhu4cNCg0KKipUaOG7sWMgaGnhu4duIGtp4buDbSDEkeG7i25oIENoaS1iw6xuaCBwaMawxqFuZyoqDQoNCmBgYHtyfQ0KY2hpc3FfcmVzdWx0MzwtIGNoaXNxLnRlc3QoaG9tZV9pbmNvbWUpDQpjaGlzcV9yZXN1bHQzDQpgYGANCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQotIEdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogQ2hpLWLDrG5oIHBoxrDGoW5nOiBYLXNxdWFyZWQgPSA1NDYuMzcgIA0KDQotIELhuq1jIHThu7EgZG86IGRmID0gNyAgDQoNCi0gR2nDoSB0cuG7iyBwOiBwLXZhbHVlIDwgMi4yZS0xNiAgDQoNCioqS+G6v3QgbHXhuq1uOioqDQoNClbhu5tpIGdpw6EgdHLhu4sgcCBy4bqldCBuaOG7jyAocCA8IDAuMDUpLCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3Qga2jDtG5nIEgwLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSB0aHUgbmjhuq1wIGjhurFuZyBuxINtIHbDoCB2aeG7h2Mgc+G7nyBo4buvdSBuaMOgLg0KDQoqKlRo4bqjbyBsdeG6rW4gdGjDqm06KioNCg0KLSBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBuw6B5IGPhu6duZyBj4buRIGPDoWMgbmjhuq1uIHjDqXQgbcO0IHThuqMgdsOgIHRy4buxYyBxdWFuIGjDs2EgdHLGsOG7m2MgxJHDszogIA0KDQogIC0gVGh1IG5o4bqtcCBo4bqxbmcgbsSDbSBsw6AgeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcg4bqjbmggaMaw4bufbmcgxJHhur9uIGto4bqjIG7Eg25nIHPhu58gaOG7r3UgbmjDoC4gIA0KICANCiAgLSBN4bupYyB0aHUgbmjhuq1wIGPDoG5nIGNhbyB0aMOsIHThu7cgbOG7hyBz4bufIGjhu691IG5ow6AgY8OgbmcgbOG7m24sIHBo4bqjbiDDoW5oIHh1IGjGsOG7m25nIHTDrWNoIGzFqXkgdMOgaSBz4bqjbiBob+G6t2Mga2jhuqMgbsSDbmcgdGnhur9wIGPhuq1uIGPDoWMgbmd14buTbiB0w6BpIGNow61uaCBtdWEgbmjDoCB0aHXhuq1uIGzhu6NpIGjGoW4uICANCiAgDQogIC0gVOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoCB0cm9uZyBjw6FjIG5ow7NtIHRodSBuaOG6rXAgdGjhuqVwIHbhuqtuIGtow7RuZyBuaOG7jywgY2hvIHRo4bqleSBuZ2/DoGkgdGh1IG5o4bqtcCBjw7JuIGPDsyBjw6FjIHnhur91IHThu5EgaOG7lyB0cuG7oyBuaMawIHRo4burYSBr4bq/LCBjaMOtbmggc8OhY2ggbmjDoCDhu58sIGhv4bq3YyDEkWnhu4F1IGtp4buHbiB0aOG7iyB0csaw4budbmcgYuG6pXQgxJHhu5luZyBz4bqjbiB2w7luZyBtaeG7gW4uDQoNCi0gxJDhu4MgaGnhu4N1IHLDtSBoxqFuIHbhu4EgbeG7kWkgcXVhbiBo4buHIG7DoHksIGPDsyB0aOG7gyB0aeG6v3AgdOG7pWMgbmdoacOqbiBj4bupdSBi4bqxbmcgY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IMSRYSBiaeG6v24gaG/hurdjIHBow6JuIHTDrWNoIHPDonUgaMahbi4NCg0KLS0tDQoNCiMgKipQaOG6p24gNS4gVOG7lW5nIGvhur90IHbDoCBUaOG6o28gbHXhuq1uKioNCg0KKipUw7NtIHThuq90IG5o4buvbmcgcGjDoXQgaGnhu4duIGNow61uaCoqDQoNClF1YSBjw6FjIHBow6JuIHTDrWNoIMSR4buLbmggdMOtbmgsIHRhIHLDunQgcmEgxJHGsOG7o2Mgbmjhu69uZyBoaeG7g3UgYmnhur90IHF1YW4gdHLhu41uZyB24buBIMSR4bq3YyDEkWnhu4NtIGtow6FjaCBow6BuZyB2w6AgaMOgbmggdmkgbXVhIHPhuq9tIG5oxrAgc2F1Og0KDQotICoqTeG7kWkgcXVhbiBo4buHIGdp4buvYSB0w6xuaCB0cuG6oW5nIGjDtG4gbmjDom4gdsOgIHZp4buHYyBz4bufIGjhu691IG5ow6AgKE1hcml0YWxTdGF0dXMg4oCTIEhvbWVvd25lcik6KiogIA0KICBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBDaGktYsOsbmggcGjGsMahbmcgY2hvIHRo4bqleSBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgZ2nhu69hIGPDoWMgbmjDs20gdMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIHbhu4EgdOG7tyBs4buHIHPhu58gaOG7r3UgbmjDoC4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbmjDs20ga2jDoWNoIGjDoG5nIMSRw6Mga+G6v3QgaMO0biBjw7MgeHUgaMaw4bubbmcgc+G7nyBo4buvdSBuaMOgIGNhbyBoxqFuIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkgxJHhu5ljIHRow6JuIGhv4bq3YyBjaMawYSBr4bq/dCBow7RuLCBwaOG6o24gw6FuaCDEkeG6t2MgxJFp4buDbSB0w6BpIGNow61uaCB2w6Ag4buVbiDEkeG7i25oIGjGoW4gY+G7p2EgbmjDs20gbsOgeS4NCg0KLSAqKk3hu5FpIHF1YW4gaOG7hyBnaeG7r2Egdmnhu4djIHPhu58gaOG7r3UgbmjDoCB2w6AgdGh1IG5o4bqtcCBow6BuZyBuxINtIChIb21lb3duZXIg4oCTIEFubnVhbEluY29tZSk6KiogIA0KICBLaMOhY2ggaMOgbmcgc+G7nyBo4buvdSBuaMOgIHRoxrDhu51uZyBjw7MgbeG7qWMgdGh1IG5o4bqtcCBjYW8gaMahbiBzbyB24bubaSBraMOhY2ggaMOgbmcgdGh1w6ogbmjDoCBob+G6t2MgY2jGsGEgc+G7nyBo4buvdS4gTeG7kWkgcXVhbiBo4buHIG7DoHkgcGjhuqNuIMOhbmggbeG7qWMgxJHhu5kga2jhuqMgbsSDbmcgdMOgaSBjaMOtbmggdsOgIHPhu7Eg4buVbiDEkeG7i25oIGPhu6dhIGtow6FjaCBow6BuZywgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyBjaGkgdGnDqnUgdsOgIGzhu7FhIGNo4buNbiBz4bqjbiBwaOG6qW0gY2FvIGPhuqVwIGjGoW4uDQoNCk5o4buvbmcgcGjDoXQgaGnhu4duIG7DoHkgY3VuZyBj4bqlcCBt4buZdCBjw6FpIG5ow6xuIHRvw6BuIGRp4buHbiB24buBIGPDoWMgbmjDs20ga2jDoWNoIGjDoG5nIGNow61uaCBk4buxYSB0csOqbiBjw6FjIMSR4bq3YyDEkWnhu4NtIMSR4buLbmggdMOtbmgsIGdpw7pwIGRvYW5oIG5naGnhu4dwIG7huq9tIGLhuq90IMSRxrDhu6NjIHBow6JuIGtow7pjIGtow6FjaCBow6BuZywgbmh1IGPhuqd1IHbDoCB4dSBoxrDhu5tuZyB0acOqdSBkw7luZyDEkeG7gyB04burIMSRw7MgdOG7kWkgxrB1IGjDs2EgY2hp4bq/biBsxrDhu6NjIGtpbmggZG9hbmguDQoNCioqSOG6oW4gY2jhur8gY+G7p2EgcGjDom4gdMOtY2gqKg0KDQotIENo4bqldCBsxrDhu6NuZyBk4buvIGxp4buHdTogROG7ryBsaeG7h3UgY8OzIHRo4buDIGNoxrBhIMSRxrDhu6NjIGzDoG0gc+G6oWNoIGhvw6BuIHRvw6BuIGhv4bq3YyB0aGnhur91IHRow7RuZyB0aW4gY2hpIHRp4bq/dCB24buBIGPDoWMgbmjDs20gY29uLCBk4bqrbiDEkeG6v24gdmnhu4djIGvhur90IHF14bqjIHBow6JuIHTDrWNoIGPDsyB0aOG7gyBi4buLIOG6o25oIGjGsOG7n25nIGLhu59pIGPDoWMgZ2nDoSB0cuG7iyB0aGnhur91IGhv4bq3YyBraMO0bmcgxJHhuqd5IMSR4bunLg0KDQotIEdp4bubaSBo4bqhbiBwaMOibiB0w61jaCBiaeG6v24gxJHhu4tuaCB0w61uaDogVmnhu4djIGNo4buJIHThuq1wIHRydW5nIHBow6JuIHTDrWNoIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggbcOgIGtow7RuZyBr4bq/dCBo4bujcCBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIChuaMawIHR14buVaSwgc+G7kSBs4bqnbiBtdWEgaMOgbmcsIGNoaSB0acOqdSB0cnVuZyBiw6xuaC4uLikgY8OzIHRo4buDIGzDoG0gZ2nhuqNtIMSR4buZIHPDonUgdsOgIHTDrW5oIHRvw6BuIGRp4buHbiBj4bunYSBwaMOibiB0w61jaCBow6BuaCB2aSBraMOhY2ggaMOgbmcuDQoNCi0gS8OtY2ggdGjGsOG7m2MgbeG6q3Uga2jDtG5nIMSR4buTbmcgxJHhu4F1OiBN4buZdCBz4buRIGjhuqFuZyBt4bulYyBjb24gdHJvbmcgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBjw7MgdGjhu4MgY8OzIHPhu5EgbMaw4bujbmcgbeG6q3UgcuG6pXQgbmjhu48sIOG6o25oIGjGsOG7n25nIMSR4bq/biDEkeG7mSB0aW4gY+G6rXkgY+G7p2Ega+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggdsOgIGto4bqjIG7Eg25nIHThu5VuZyBxdcOhdCBow7NhLg0KDQotIEtow7RuZyB4ZW0geMOpdCB54bq/dSB04buRIHRo4budaSBnaWFuOiBQaMOibiB0w61jaCB0xKluaCwga2jDtG5nIHRoZW8gZMO1aSBiaeG6v24gxJHhu5VpIGjDoG5oIHZpIHRoZW8gdGjhu51pIGdpYW4gY8OzIHRo4buDIGLhu48gbOG7oSBjw6FjIHh1IGjGsOG7m25nIHRoYXkgxJHhu5VpIHRyb25nIGjDoG5oIHZpIGtow6FjaCBow6BuZy4NCg0KKirEkOG7gSB4deG6pXQqKg0KDQotIENoaeG6v24gbMaw4bujYyBtYXJrZXRpbmcgdGhlbyBwaMOibiBraMO6YzogROG7sWEgdHLDqm4gc+G7sSBraMOhYyBiaeG7h3QgduG7gSBz4bufIHRow61jaCBz4bqjbiBwaOG6qW0gdGhlbyBnaeG7m2kgdMOtbmggdsOgIHTDrG5oIHRy4bqhbmcgaMO0biBuaMOibiwgZG9hbmggbmdoaeG7h3AgbsOqbiBwaMOhdCB0cmnhu4NuIGPDoWMgY2hp4bq/biBk4buLY2ggbWFya2V0aW5nIMSRxrDhu6NjIGPDoSBuaMOibiBow7NhLCBuaOG6r20gxJHDum5nIG5ow7NtIGtow6FjaCBow6BuZyBt4bulYyB0acOqdS4NCg0KLSBQaMOibiBsb+G6oWkgc+G6o24gcGjhuqltIHBow7kgaOG7o3A6IEPhuqduIHThuq1wIHRydW5nIHBow6F0IHRyaeG7g24gY8OhYyBkw7JuZyBz4bqjbiBwaOG6qW0gcGjDuSBo4bujcCB24bubaSB04burbmcgbmjDs20ga2jDoWNoIGjDoG5nIMSR4bq3YyB0csawbmcsIHbDrSBk4bulIHPhuqNuIHBo4bqpbSBjYW8gY+G6pXAgY2hvIG5ow7NtIGtow6FjaCBow6BuZyB0aHUgbmjhuq1wIGNhbyB2w6Agc+G7nyBo4buvdSBuaMOgLCBz4bqjbiBwaOG6qW0gZ2nDoSBj4bqjIHBo4bqjaSBjaMSDbmcgaMahbiBjaG8gbmjDs20ga2jDoWNoIGjDoG5nIHRodSBuaOG6rXAgdGjhuqVwLg0KDQotIE5o4bqvbSBt4bulYyB0acOqdSBraMOhY2ggaMOgbmcg4buVbiDEkeG7i25oIHTDoGkgY2jDrW5oOiBLaMOhY2ggaMOgbmcgc+G7nyBo4buvdSBuaMOgIHbDoCBjw7MgdGh1IG5o4bqtcCBjYW8gbMOgIG5ow7NtIGtow6FjaCBow6BuZyB0aeG7gW0gbsSDbmcgxJHhu4MgcGjDoXQgdHJp4buDbiBjw6FjIGNoxrDGoW5nIHRyw6xuaCBjaMSDbSBzw7NjIHbDoCBraHV54bq/biBtw6NpIMSR4bq3YyBiaeG7h3QgbmjhurFtIHTEg25nIHThu7cgbOG7hyBnaeG7ryBjaMOibiB2w6AgZ2nDoSB0cuG7iyB2w7JuZyDEkeG7nWkga2jDoWNoIGjDoG5nLg0KDQoqKkPDonUgaOG7j2kgbeG7nyAvIEjGsOG7m25nIG5naGnDqm4gY+G7qXUgdGnhur9wIHRoZW8qKg0KDQotIFBow6JuIHTDrWNoIGvhur90IGjhu6NwIGJp4bq/biDEkeG7i25oIHTDrW5oIHbDoCDEkeG7i25oIGzGsOG7o25nOiBMaeG7h3Ugdmnhu4djIHTDrWNoIGjhu6NwIGPDoWMgYmnhur9uIMSR4buLbmggbMaw4bujbmcgbmjGsCB0deG7lWksIHPhu5EgbOG6p24gbXVhIGjDoG5nLCBjaGkgdGnDqnUgdHJ1bmcgYsOsbmggc+G6vSBnacO6cCBoaeG7g3UgcsO1IGjGoW4gduG7gSBow6BuaCB2aSB2w6AgZ2nDoSB0cuG7iyBraMOhY2ggaMOgbmc/DQoNCi0gUGjDom4gdMOtY2ggaMOgbmggdmkgdGhlbyB0aOG7nWkgZ2lhbjogQ8OzIG5o4buvbmcgeHUgaMaw4bubbmcgdGhheSDEkeG7lWkgbsOgbyB0cm9uZyBz4bufIHRow61jaCBz4bqjbiBwaOG6qW0gaG/hurdjIMSR4bq3YyDEkWnhu4NtIGtow6FjaCBow6BuZyB0aGVvIHRo4budaSBnaWFuICh2w60gZOG7pSB0aGVvIG3DuWEgaG/hurdjIHRoZW8gbsSDbSk/DQoNCi0gVMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSB4w6MgaOG7mWkga2jDoWM6IExp4buHdSBjw6FjIHnhur91IHThu5EgbmjGsCB2w7luZyDEkeG7i2EgbMO9LCB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4sIG5naOG7gSBuZ2hp4buHcCBjw7Mg4bqjbmggaMaw4bufbmcgbmjGsCB0aOG6vyBuw6BvIMSR4bq/biBow6BuaCB2aSBtdWEgc+G6r20gY+G7p2Ega2jDoWNoIGjDoG5nPw0KDQotIOG7qG5nIGThu6VuZyBtw7QgaMOsbmggZOG7sSDEkW/DoW46IEPDsyB0aOG7gyB4w6J5IGThu7FuZyBjw6FjIG3DtCBow6xuaCBk4buxIMSRb8OhbiBow6BuaCB2aSBraMOhY2ggaMOgbmcgZOG7sWEgdHLDqm4gY8OhYyDEkeG6t2MgxJFp4buDbSDEkeG7i25oIHTDrW5oIHbDoCDEkeG7i25oIGzGsOG7o25nIMSRw6MgcGjDom4gdMOtY2ggxJHhu4MgdOG7kWkgxrB1IGjDs2EgY2hp4bq/biBsxrDhu6NjIG1hcmtldGluZyB2w6AgYsOhbiBow6BuZz8NCg==