1 Mục tiêu bài nghiên cứu

Mục đích của nghiên cứu này là phân tích sự lựa chọn hạng vé bao gồm hạng thương gia và hạng phổ thông của khách hàng khi đặt vé máy bay trên trang web EaseMy Trip. Bằng cách thu thập và phân tích các thông tin liên quan đến giá vé, tên chuyến bay, nơi khởi hành, điểm đến, thời gian khởi hành, và các yếu tố khác. Nghiên cứu nhằm đưa ra các thông tin hữu ích giúp cải thiện dịch vụ của EaseMy Trip và có thể áp dụng cho các doanh nghiệp khác trong ngành du lịch và hàng không.

library(tidyverse)
library(readxl)
library(DT)
library(DescTools)
library(epitools)
library(scales)
library(car)
library(glmnet)
library(caret)
library(pROC)
data <- read.csv("D:/Phantichdulieudinhtinh/Easymytrip.csv")
df <- data
str(df)
## 'data.frame':    300153 obs. of  12 variables:
##  $ X               : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ airline         : chr  "SpiceJet" "SpiceJet" "AirAsia" "Vistara" ...
##  $ flight          : chr  "SG-8709" "SG-8157" "I5-764" "UK-995" ...
##  $ source_city     : chr  "Delhi" "Delhi" "Delhi" "Delhi" ...
##  $ departure_time  : chr  "Evening" "Early_Morning" "Early_Morning" "Morning" ...
##  $ stops           : chr  "zero" "zero" "zero" "zero" ...
##  $ arrival_time    : chr  "Night" "Morning" "Early_Morning" "Afternoon" ...
##  $ destination_city: chr  "Mumbai" "Mumbai" "Mumbai" "Mumbai" ...
##  $ class           : chr  "Economy" "Economy" "Economy" "Economy" ...
##  $ duration        : num  2.17 2.33 2.17 2.25 2.33 2.33 2.08 2.17 2.17 2.25 ...
##  $ days_left       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ price           : int  5953 5953 5956 5955 5955 5955 6060 6060 5954 5954 ...
head(df,6)
##   X  airline  flight source_city departure_time stops  arrival_time
## 1 0 SpiceJet SG-8709       Delhi        Evening  zero         Night
## 2 1 SpiceJet SG-8157       Delhi  Early_Morning  zero       Morning
## 3 2  AirAsia  I5-764       Delhi  Early_Morning  zero Early_Morning
## 4 3  Vistara  UK-995       Delhi        Morning  zero     Afternoon
## 5 4  Vistara  UK-963       Delhi        Morning  zero       Morning
## 6 5  Vistara  UK-945       Delhi        Morning  zero     Afternoon
##   destination_city   class duration days_left price
## 1           Mumbai Economy     2.17         1  5953
## 2           Mumbai Economy     2.33         1  5953
## 3           Mumbai Economy     2.17         1  5956
## 4           Mumbai Economy     2.25         1  5955
## 5           Mumbai Economy     2.33         1  5955
## 6           Mumbai Economy     2.33         1  5955

2 Mô tả bộ dữ liệu:

‘EaseMy Trip’ là một nền tảng internet để đặt vé máy bay. Dữ liệu được thu thập chia thành 2 nhóm vé: một nhóm dành cho vé hạng phổ thông và nhóm còn lại dành cho vé hạng thương gia. Tổng cộng có 300153 thông tin đặt vé máy bay riêng biệt được trích xuất từ trang web. Dữ liệu được thu thập trong 50 ngày, từ ngày 11 tháng 2 đến ngày 31 tháng 3 năm 2022.

Biến định lượng

  • Duration: Khoảng thời gian chuyến bay di chuyển (được tính bằng giờ)

  • Days Left: Chênh lệch giữa thời gian bay và thời gian đặt vé

  • Price: Giá vé

Biến định tính

  • Airline: Tên của hãng hàng không, gồm có 6 hãng hàng không

  • Flight: Mã chuyến bay

  • Source City: Thành phố nơi chuyến bay cất cánh

  • Departure Time: Khoảng thời gian chuyến bay khởi hành

  • Stops: Số điểm dừng chân.

  • Arrival Time: Khoảng thời gian chuyến bay hạ cánh

  • Destination City: Thành phố nơi chuyến bay hạ cánh

  • Class: Hạng ghế mà khách hàng lựa chọn. Có 2 hạng ghế là hạng phổ thông và hạng thương gia

3 Đặt vấn đề

Trong ngành hàng không, chúng ta cần phải hiểu rõ hành vi và nhu cầu của khách hàng để có thể tối ưu hoá các dịch vụ, nâng cao doanh thu và trải nghiệm của khách hàng. Một trong những yếu tố quan trọng trong ngành hàng không là dự đoán được xác suất khách hàng chọn hạng vé thương gia để kịp thời đưa ra các chương trình đáp ứng cho nhu cầu của họ.

  • Biến phụ thuộc (biến được giải thích): Class (Gồm 2 biểu hiện: Business và Economy)

  • Biến giải thích:

Source City: Kinh tế thị trường ở các thành phố có thể ảnh hưởng đến xác suất chọn hạng vé thương gia của khách hàng, ở những thành phố có nền kinh tế phát triển thì dự đoán nhu cầu chọn hạng vé thương gia của khách hàng có thể lớn hơn so với những thành phố có nền kinh tế ít phát triển.

Airline: Mỗi hãng hàng không có chất lượng dịch vụ và giá cả khách nhau. Ví dụ, những hãng hàng không mang thương hiệu lớn thì tỷ lệ chọn vé hạng thương gia sẽ cao hơn.

Price: Theo dự đoán thì mức giá là một yếu tố quan trọng ảnh hưởng đến lựa chọn hạng vé của khách hàng. Từng phân khúc khách hàng sẽ lựa chọn hạng vé phù hợp với nhu cầu và khả năng chi trả của họ.

Stop_ans: Giả thiết số điểm dừng của chuyến bay cũng có ảnh hưởng đến hành vi lựa chọn hạng vé của khách hàng. Những khách hàng chọn hạng vé thương gia thường sẽ chú trọng vào dịch vụ của chuyến bay hơn so với khách hàng chọn hạng vé phổ thông. Những chuyến bay có điểm dừng thường gây ra những rắc rối về việc chuyển hành lý và mất thời gian hơn, nên dự đoán xác suất chọn hạng vé thương gia ở những chuyến bay không có điểm dừng sẽ cao hơn so với những chuyến bay có điểm dừng.

Day_left: Thời gian đặt vé trước chuyến bay cũng có thể ảnh hưởng đến lựa chọn hạng vé của khách hàng. Đối với những chuyến bay có thời gian đặt vé sớm, thì sẽ có nhiều lựa chọn về giá cả, dịch vụ hoặc hạng ghế. Nhưng đối với những chuyến bay đặt quá gần ngày bay thì sẽ có những hạn chế, ví dụ như hết vé hạng phổ thông.

Duration: Thời gian bay cũng là một trong những yếu tố quan trọng ảnh hưởng tới hành vi lựa chọn hạng vé của khách hàng. Đối với những chuyến bay dài thì khách hàng sẽ có xu hướng lựa chọn hạng vé thương gia để đảm bảo về dịch vụ và sự thoải mái.

4 Xử lý dữ liệu

Phân tổ giá của mỗi chuyến bay thành 2 biểu hiện: Thấp và Cao

  • Dựa vào giá trị trung bình của giá trong mẫu được chọn. Giá thấp hơn 20890 được gán với biểu hiện “Thấp”, giá cao 20890 được gán với biểu hiện “Cao”.
str(df)
## 'data.frame':    300153 obs. of  12 variables:
##  $ X               : int  0 1 2 3 4 5 6 7 8 9 ...
##  $ airline         : chr  "SpiceJet" "SpiceJet" "AirAsia" "Vistara" ...
##  $ flight          : chr  "SG-8709" "SG-8157" "I5-764" "UK-995" ...
##  $ source_city     : chr  "Delhi" "Delhi" "Delhi" "Delhi" ...
##  $ departure_time  : chr  "Evening" "Early_Morning" "Early_Morning" "Morning" ...
##  $ stops           : chr  "zero" "zero" "zero" "zero" ...
##  $ arrival_time    : chr  "Night" "Morning" "Early_Morning" "Afternoon" ...
##  $ destination_city: chr  "Mumbai" "Mumbai" "Mumbai" "Mumbai" ...
##  $ class           : chr  "Economy" "Economy" "Economy" "Economy" ...
##  $ duration        : num  2.17 2.33 2.17 2.25 2.33 2.33 2.08 2.17 2.17 2.25 ...
##  $ days_left       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ price           : int  5953 5953 5956 5955 5955 5955 6060 6060 5954 5954 ...
summary(df$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1105    4783    7425   20890   42521  123071
df$price_level <- cut(df$price, breaks = c(0, 20890, 123071), labels = c("Thap", "Cao"))
str(df$price_level)
##  Factor w/ 2 levels "Thap","Cao": 1 1 1 1 1 1 1 1 1 1 ...

Phân tổ thời gian đặt vé trước chuyến bay thành 2 biểu hiện “sớm”,“Muộn”

  • Dựa vào giá trị trung bình của thời gian đặt vé trước chuyến bay của mẫu được chọn. Thời gian thấp hơn 26 ngày được gán với biểu hiện “Muộn”, thời gian cao hơn 26 ngày được gán với biểu hiện “Sớm”.
df$dayleft_level <- cut(df$days_left, breaks = c(0, 26, 50), labels = c("Muộn", "Sớm"))
str(df$dayleft_level)
##  Factor w/ 2 levels "Muộn","Sớm": 1 1 1 1 1 1 1 1 1 1 ...
summary(df$dayleft_level)
##   Muộn    Sớm 
## 152712 147441

Phân tổ thời gian di chuyển của chuyến bay thành 2 biểu hiện “Cao”,“Thấp”

  • Dựa vào giá trị trung bình của thời gian bay. Thời gian thấp hơn 12.22 tiếng được gán với biểu hiện “Thấp”, thời gian cao hơn 12.22 tiếng ngày được gán với biểu hiện “Cao”.
df$duration_level <- cut(df$duration, breaks = c(0, 12.22, 50), labels = c("Thấp", "Cao"))
str(df$duration_level)
##  Factor w/ 2 levels "Thấp","Cao": 1 1 1 1 1 1 1 1 1 1 ...
summary(df$duration_level)
##   Thấp    Cao 
## 166999 133154

5 Thống kê mô tả 1 biến

Trong phần này, chúng tôi thực hiện thống kê mô tả cho dữ liệu bao gồm dữ liệu định tính và dữ liệu định lượng. Đối với dữ liệu định tính, thực hiện lập bảng tần số, bảng tần suất và vẽ đồ thị. Đối với dữ liệu định lượng, thực hiện thống kê các đặc trưng đo lường.

5.1 Thống kê mô tả biến định tính

5.1.1 Thống kê mô tả biến class

Đầu tiên, thực hiện thống kê mô tả cho biến Class thể hiện hạng vé mà khách hàng lựa chọn. Bao gồm hai biểu hiện là hạng ghế phổ thông và hạng ghế thương gia. Đây cũng chính là biến được giải thích trong bài nghiên cứu.

tmp <- table(df$class)
addmargins(tmp)
## 
## Business  Economy      Sum 
##    93487   206666   300153
round((table(df$class)/sum(table(df$class))*100),2)
## 
## Business  Economy 
##    31.15    68.85
df %>% ggplot(map = aes(x=fct_infreq(class), y= after_stat(count)))+geom_bar(fill = 'skyblue')+geom_text(aes(label=percent(after_stat(count/sum(count)),accuracy = .01)), stat = 'count', color = 'black',vjust = 2) + labs(x = 'Hạng ghế',y="số lượng", title="Phân chia số lượng vé theo từng hạng ghế")+theme_minimal()

Trong số 300153 vé máy bay:

  • Số người đặt hạng ghế phổ thông có 206666 vé, chiếm 68,85%

  • Số người đặt hạng ghế thương gia có 93487 vé, chiếm 31,15%

Như vậy, số người đặt vé hạng ghế phổ thông nhiều hơn 113179 (Khoảng 37,71%) so với số người sở hữu vé là hạng ghế thương gia.

5.1.2 Thống kê mô tả biến airline

Biến airline là biến đại diện cho các hãng hàng không. Có 6 hãng hàng không trong bài nghiên cứu này.

tmp1 <- table(df$airline)
addmargins(tmp1)
## 
## Air_India   AirAsia  GO_FIRST    Indigo  SpiceJet   Vistara       Sum 
##     80892     16098     23173     43120      9011    127859    300153
round((table(df$airline)/sum(table(df$airline))*100),2)
## 
## Air_India   AirAsia  GO_FIRST    Indigo  SpiceJet   Vistara 
##     26.95      5.36      7.72     14.37      3.00     42.60
df %>% ggplot(map = aes(x=fct_infreq(airline), y= after_stat(count)))+geom_bar(fill = 'salmon')+geom_text(aes(label=percent(after_stat(count/sum(count)),accuracy = .01)), stat = 'count', color = 'black',vjust = 1) + labs(x = 'Hãng hàng không',y="số lượng", title="Phân chia số lượng vé theo từng hãng hàng không")+theme_minimal()

Thống kê cho thấy trong số 300153 vé máy bay được bán ra sắp xếp theo thứ tự tăng dần, ta có thể thấy rằng hãng hàng không Vistara chiếm tỷ lệ cao nhất và hãng Spicejet chiếm tỷ lệ thấp nhất cụ thể như sau:

  • Hãng hàng không Vistara có 127859 vé chiếm tỷ lệ là 42.6%

  • Hãng hàng không Air_India có 80892 vé chiếm tỷ lệ là 26.95%

  • Hãng hàng không Indigo có 43120 vé chiếm tỷ lệ là 14.37%

  • Hãng hàng không GO_FIRST có 23173 vé chiếm tỷ lệ là 7.72%

  • Hãng hàng không AirAsia có 16098 vé chiếm tỷ lệ là 5.36%

  • Hãng hàng không SpiceJet có 9011 vé chiếm tỷ lệ là 3%

5.1.3 Thống kê mô tả biến source_city

source_frequency <- table(df$source_city)
addmargins(source_frequency)
## 
## Bangalore   Chennai     Delhi Hyderabad   Kolkata    Mumbai       Sum 
##     52061     38700     61343     40806     46347     60896    300153
round((table(df$source_city)/sum(table(df$source_city))*100),2)
## 
## Bangalore   Chennai     Delhi Hyderabad   Kolkata    Mumbai 
##     17.34     12.89     20.44     13.60     15.44     20.29
df %>% ggplot(map = aes(x=fct_infreq(source_city), y=after_stat(count)))+geom_bar(fill='skyblue')+geom_text(aes(label=percent(after_stat(count/sum(count)),accuracy = .01)), stat = 'count', color = 'black',vjust = 2) + labs(x = 'Thành phố khởi hành', y = 'Số lượng', title = "Số lượng chuyến bay tương ứng với từng thành phố mà chuyến bay khởi hành")+theme_minimal()

Trong số 300153 thông tin về điểm khởi hành của các chuyến bay, thành phố có chuyến bay khởi hành nhiều nhất là Delhi và thành phố có chuyến bay khỏi hành ít nhất là Chennai, cụ thể như sau:

  • Số lượng chuyến bay ở Delhi là 52061, chiếm 20,44% tổng chuyến bay.

  • Số lượng chuyến bay ở Mumbai là 60896 , chiếm 20,29% tổng số chuyến bay

  • Số lượng chuyến bay ở Bangalore là 52061 , chiếm 17,34% tổng số chuyến bay

  • Số lượng chuyến bay ở Kolkata là 46347 , chiếm 15,44% tổng số chuyến bay

  • Số lượng chuyến bay ở Hyderabad là 40806, chiếm 13,60% tổng số chuyến bay

  • Số lượng chuyến bay ở Chennai là 38700, chiếm 12,89% tổng số chuyến bay.

Nhận xét: Qua biểu đồ này, chúng ta có thể thấy rõ ràng rằng Delhi và Mumbai là hai trung tâm hàng không lớn nhất, trong khi các thành phố khác như Bangalore, Kolkata, Hyderabad, và Chennai có số lượng chuyến bay ít hơn đáng kể.

5.1.4 Thống kê mô tả biến stops

df$stops <- factor(df$stops, levels =c("zero","one","two_or_more"))

stops_frequency <- table(df$stops)
addmargins(stops_frequency)
## 
##        zero         one two_or_more         Sum 
##       36004      250863       13286      300153
round((table(df$stops)/sum(table(df$stops))*100),2)
## 
##        zero         one two_or_more 
##       12.00       83.58        4.43
df %>% ggplot(map = aes(x=stops, y=after_stat(count)))+geom_bar(fill='violet')+geom_text(aes(label=percent(after_stat(count/sum(count)),accuracy = .01)), stat = 'count', color = 'black',vjust = 1.2) + labs(x = 'Số điểm dừng', y = 'Số lượng', title = "Số lượng chuyến bay tương ứng với số điểm dừng")+theme_minimal()

Trong tổng số 300153 thông tin về số điểm dừng của các chuyến bay

  • Đa số khách hàng lựa chọn chuyến bay có 1 điểm dừng và nó chiếm tới 83,58% so với tổng 300153 chuyến bay.

  • Số chuyến bay có 0 điểm dừng chiếm 12%.

  • Số chuyến bay có 2 hoặc nhiều hơn 2 điểm dừng chỉ chiếm 4,43%.

Nhận xét: Đa số hành khách ưu tiên lựa chọn chuyến có 1 điểm dừng. Điều này có thể do các lý do như, chuyến bay dài nên cần phải có điểm dừng để hành khách mua thêm những thứ cần thiết hoặc khách hàng cần nghỉ ngơi giữa chuyến bay, nhưng để tiết kiệm thời gian, giảm thiểu rủi ro mất hành lý và hạn chế phiền toái khi chuyển giữa các chuyến bay thì khách hàng đa số chọn những chuyến bay có 1 điểm dừng thay vì những chuyến bay có 2 điểm dừng hoặc nhiều hơn. Có 12% khách hàng lựa chọn chuyến bay có 0 điểm dừng, có thể vì chuyến bay đó có thời gian di chuyển ngắn.Rất ít hành khách chọn chuyến bay có 2 hoặc nhiều hơn 2 điểm dừng. Những chuyến bay này thường kéo dài thời gian di chuyển, có thể gây mệt mỏi cho hành khách và tăng khả năng gặp sự cố.

5.2 Thống kê mô tả biến định lượng

5.2.1 Biến Price

Biến Price là biến thể hiện cho giá vé máy bay mà khách hàng đã mua, là một biến định lượng. Để mô tả cho biến này, ta thực hiện tính toán các đặc trưng đo lường:

summary(df$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1105    4783    7425   20890   42521  123071
var(df$price)
## [1] 515188643
sd(df$price)
## [1] 22697.77
ggplot(df, aes(x = price)) +
  geom_density(fill = "skyblue", color = "blue", alpha = 0.5) +
  labs(x = "Giá vé máy bay", y="Mật độ", title="Biểu đồ phân phối của giá vé")+theme_minimal()

Từ kết quả trên, ta nhận thấy rằng:

  • Giá vé thấp nhất là 1105 ngàn đồng, giá vé cao nhất là 123071 ngàn đồng. Có khoảng cách giữa vé thấp nhất và vé cao nhất là rất lớn, cho thấy có sự đa dạng rất lớn trong giá vé.

  • Có 25% giá vé thấp hơn giá 4783 ngàn đồng, có 50% giá vé thấp hơn giá trị 7425 ngàn đồng, có 75% giá vé thấp hơn 42521 ngàn đồng. Phân phối giá vé lệch, phần lớn giá vé nằm dưới mức 42521 ngàn đồng.

  • Mức trung bình của giá vé là 20890 ngàn đồng, cao hơn giá trị trung vị. Điều này cho thấy rằng có một số giá trị rất cao kéo giá trị trung bình lên.

  • Nhìn vào phương sai của dữ liệu, Phương sai lớn cho thấy sự biến thiên lớn trong dữ liệu. Độ lệch chuẩn cao cũng phán ánh sự phân tán lớn xung quanh giá trị trung bình.

5.2.2 Biến Days Left

summary(df$days_left)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       1      15      26      26      38      49
var(df$days_left)
## [1] 183.9008
sd(df$days_left)
## [1] 13.561

Trong 300513 người trong khảo sát cho biết thông tin về khoảng thời gian từ lúc đặt vé đén lúc đặt vé đến lúc bay như sau:

  • Thời gian từ lúc đặt vé đến khi bay của các hành khách ngắn nhất là một ngày và dài nhất là 49 ngày.

  • Thời gian đặt vé trước ngày bay trung bình từ các hành khách khảo sát được là 26 ngày.

  • 25% người trong nhóm trên đặt vé trước ngày bay 15 ngày

  • 50% người trong nhóm khảo sát đặt vé trước ngày bay 26 ngày

  • 75% người trong nhóm đặt vé trước ngày bay 38 ngày

  • Độ lệch chuẩn của biến days-left là 13.561 cho biết mức đọ phân tán của thời gian từ ngày đặt vé đến ngày bay trong nhóm người khảo sát được so với giá trị trung bình là 13.561 ngày.

ggplot(df, aes(x = days_left)) +
  geom_density(fill = "skyblue", color = "blue", alpha = 0.5) +
  labs(x = "thời gian đặt vé trước chuyến bay",y="Mật độ", title="Biểu đồ phân phối của thời gian đặt vé trước chuyến bay")+theme_minimal()

Nhận xét

  • Hình dạng phân bố: Mật độ phân bố có xu hướng gần như đều từ khoảng ngày thứ 10 đến ngày thứ 45 trước ngày bay. Điều này cho thấy nhiều người có xu hướng đặt vé trong khoảng thời gian này.

  • Đặt vé sớm: Số người đặt vé bắt đầu tăng mạnh từ khoảng [1;10] ngày cho thấy Có rất ít người đặt vé gần ngày bay.

  • Phân bố ổn định: Trong khoảng từ 10 ngày đến 45 ngày trước ngày bay, mật độ phân bố ổn định, cho thấy nhiều người có xu hướng đặt vé trong giai đoạn này, có thể do đây là khoảng thời gian tối ưu về giá cả

  • Giảm mạnh sau ngày 45: Số người đặt vé giảm dần sau khoảng 45 ngày trước ngày bay. Có thể vì việc đặt vé quá xa trước ngày bay ít phổ biến hoặc ít người có kế hoạch cụ thể xa đến vậy.

5.2.3 Biến Duration

summary(df$duration)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.83    6.83   11.25   12.22   16.17   49.83
var(df$duration)
## [1] 51.72482
sd(df$duration)
## [1] 7.191997

Trong bộ dữ liệu khảo sát được ta có thông tin về thời gian bay như sau:

  • Chuyến bay ngắn nhất kéo dài 0.83 giờ tương đương với khoảng 50 phút

  • chuyến bay dài nhất kéo dài 49.83 giờ tương đương với khoảng 2 ngày 1 giờ 50 phút

  • 25% chuyến bay kéo dài trong 6.83 giờ

  • 50% chuyến bay kéo dài trng 11.25 giờ

  • 75% chuyến bay kéo dài trong 16.17 giờ

  • Thời gian bay trung bình khảo sát được là 12.22 giờ

ggplot(df, aes(x = duration)) +
  geom_density(fill = "skyblue", color = "blue", alpha = 0.5) +
  labs(x = "thời gian bay")+theme_minimal()

Nhận xét

  • Đỉnh cao ngay sát gần 0: Có một đỉnh rất cao ở khoảng thời gian ngắn nhất, cho thấy rằng phần lớn các chuyến bay kéo dài rất ngắn, có thể là các chuyến bay nội địa hoặc các chuyến bay chỉ kéo dài khoảng 2-3 giờ.

  • Giảm dần sau đỉnh đầu tiên: Sau đỉnh cao ban đầu, mật độ giảm dần nhưng vẫn có những đỉnh cao khác trong khoảng từ 6 đến 12 giờ. Điều này có thể biểu hiện cho các chuyến bay nội địa dài hơn hoặc các chuyến bay quốc tế ngắn.

  • Đỉnh nhỏ khoảng từ 14 đến 20 giờ: Có một đỉnh nhỏ từ khoảng thời gian 14 đến 20 giờ, cho thấy có một số chuyến bay kéo dài trong khoảng thời gian này, có thể là các chuyến bay quốc tế dài.

  • Giảm mạnh sau 20 giờ: Sau khoảng 20 giờ, mật độ giảm đáng kể, cho thấy rất ít chuyến bay kéo dài hơn 20 giờ. Điều này hợp lý vì hầu hết các chuyến bay quốc tế dài nhất thường không kéo dài hơn khoảng thời gian này.

  • Gần như không có chuyến bay kéo dài hơn 30 giờ: Từ khoảng 30 giờ trở đi, mật độ giảm xuống gần bằng 0, cho thấy rất ít hoặc không có chuyến bay nào kéo dài hơn khoảng thời gian này. Điều này có thể bao gồm các chuyến bay có nhiều điểm dừng hoặc các hành trình đặc biệt.

=> Tóm lại, biểu đồ này cho thấy hầu hết các chuyến bay kéo dài dưới 10 giờ, với phần lớn các chuyến bay rất ngắn. Có một số ít chuyến bay kéo dài từ 10 đến 20 giờ, và rất hiếm có chuyến bay kéo dài hơn 20 giờ.

6 Thống kê mô tả 2 biến

6.1 Biến Class và biến airline

addmargins(table(df$class, df$airline))
##           
##            Air_India AirAsia GO_FIRST Indigo SpiceJet Vistara    Sum
##   Business     32898       0        0      0        0   60589  93487
##   Economy      47994   16098    23173  43120     9011   67270 206666
##   Sum          80892   16098    23173  43120     9011  127859 300153
prop.table(table(df$class, df$airline))
##           
##             Air_India    AirAsia   GO_FIRST     Indigo   SpiceJet    Vistara
##   Business 0.10960410 0.00000000 0.00000000 0.00000000 0.00000000 0.20186038
##   Economy  0.15989845 0.05363265 0.07720396 0.14366007 0.03002136 0.22411903
prop.table(table(df$class, df$airline),margin = 2)
##           
##            Air_India   AirAsia  GO_FIRST    Indigo  SpiceJet   Vistara
##   Business 0.4066904 0.0000000 0.0000000 0.0000000 0.0000000 0.4738736
##   Economy  0.5933096 1.0000000 1.0000000 1.0000000 1.0000000 0.5261264
df %>% ggplot(aes(x = fct_infreq(airline), fill = class)) +
  geom_bar(position = "dodge") +
  geom_text(aes(label = scales::percent(after_stat(count / sum(count)), accuracy = 0.01)), 
            stat = "count", 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, 
            color = 'black') +
  scale_fill_manual(values = c("Economy" = "skyblue", "Business" = "brown")) + labs( fill = 'Hạng vé',title = "Số lượng chuyến bay có quá cảnh ở các hạng vé") + theme_minimal()

Nhìn vào bảng và đồ thị số lượng chuyến bay của các hãng hàng không theo hạng ghế, chúng ta có thể đưa ra một số nhận xét:

  • Vistara: Chiếm tỉ lệ cao nhất trong hạng Business (chiếm 20.19% trên tổng số vé) và cũng có tỉ lệ cao nhất trong hạng Economy (22.41%). Điều này cho thấy Vistara có sự phân phối đều hơn giữa hai hạng ghế so với các đối thủ khác.

  • Air_India: Chiếm tỉ lệ cao thứ hai trong hạng Business (10.96% trên tổng số vé), nhưng chỉ chiếm tỉ lệ cao thứ hai trong hạng Economy (15.99%).

  • AirAsia và GO_FIRST, Indigo và SpiceJet: Không được khách hàng ưa chuộng cho hạng Business, chỉ có trong hạng Economy. Điều này có thể cho thấy các hãng này chủ yếu cung cấp dịch vụ Economy và ít được người dùng chọn lựa trong hạng ghế cao cấp hơn.

6.2 Biến Class và source_city

class_source <- table(df$class,df$source_city)
addmargins(class_source)
##           
##            Bangalore Chennai  Delhi Hyderabad Kolkata Mumbai    Sum
##   Business     16441   12529  18316     12870   13473  19858  93487
##   Economy      35620   26171  43027     27936   32874  41038 206666
##   Sum          52061   38700  61343     40806   46347  60896 300153
df %>% ggplot(aes(x = fct_infreq(source_city), fill = class)) +
  geom_bar(position = "dodge") +
  geom_text(aes(label = scales::percent(after_stat(count / sum(count)), accuracy = 0.01)), 
            stat = "count", 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, 
            color = 'black') +
  scale_fill_manual(values = c("Economy" = "skyblue", "Business" = "brown")) + labs(x = 'Thành phố', y = 'Số lượng', fill = 'Hạng vé',
       title = "Số lượng chuyến bay tương ứng với hạng vé và thành phố xuất phát") + theme_minimal()

Trong tổng số 300153 quan sát

  • Đối với 61343 chuyến bay khởi hành ở Delhi, có 18316 hành khách chọn hạng vé thương gia, chiếm 6,1% so với tổng chuyến bay

  • Đối với 60896 chuyến bay khởi hành ở Mumbai, có 19858 hàng khách chọn hạng vé thương gia, chiếm 6,62% so với tổng chuyến bay

  • Đối với 52061 chuyến bay khởi hành ở Bangalore, có 16441 hành khách chọn hạng vé thương gia,chiếm 5,48% so với tổng chuyến bay

  • Đối với 46347 chuyến bay khởi hành ở Kolkata, có 13473 hành khách chọn hạng vé thương gia, chiếm 4,49% so với tổng chuyến bay

  • Đối với 40806 chuyến bay khởi hành ở Hyderabad, có 12870 hành khách chọn hạng vé thương gia, chiếm 4,29% so với tổng chuyến bay

  • Đối với 38700 chuyến bay khởi hành ở Chennai, có 12529 hành khách chọn hạng vé thương gia,chiếm 4,17% so với tổng chuyến bay

Nhận xét: Nhìn vào kết quả trên ta thấy, mặc dù Delhi là thành phố có nhiều chuyến bay khởi hành nhất, tuy nhiên Mumbai là thành phố có nhiều hành khách chọn hạng vé thương gia nhất (chiếm 6,62% so với tổng chuyến bay). Số liệu trên cho thấy sự khác biệt rõ rệt trong hành vi chọn hạng vé của hành khách tại các thành phố khác nhau. Các thành phố lớn như Delhi và Mumbai có tỷ lệ hành khách chọn hạng vé thương gia cao hơn so với các thành phố nhỏ hơn.

6.3 Biến Class và duration

df %>% ggplot(aes(x = class , y = duration)) +
   geom_boxplot(fill = "lightblue", color = "steelblue") +
  labs(x = "Hạng vé", y = "Thời gian của chuyến bay", title = "Sự phân bố thời gian của chuyến bay theo từng hạng vé") +
  theme_minimal()

Nhận xét: Nhìn vào đồ thị ta thấy, đối với hạng ghế thương gia, khoảng thời gian di chuyển của chuyến bay chủ yếu giao động từ khoảng 8-18h. Đối với hạng ghế phổ thông, khoảng thời gian di chuyển của chuyến bay chủ yếu giao động ở khoảng 2h-16h. Ta nhận ra khoảng thời gian di chuyển của chuyến bay đối với hạng ghế thương gia phân bổ ở khoảng cao hơn so với thời gian di chuyển của chuyến bay đối với hạng ghế phổ thông. Điều này nguyên nhân có thể do đối với các chuyến bay càng dài thì khách hàng sẽ có xu hướng chọn hạng ghế thương gia. Ở cả 2 hạng ghế thương gia và hạng ghế phổ thông đều có xuất hiện một số chuyến bay có khoảng thời gian di chuyển cao (giao động từ 30h - 50h).

6.4 Biến class và stops_ans

df$stop_ans <- ifelse(df$stops == "zero", "no", "yes")
addmargins(table(df$stop_ans,df$class))
##      
##       Business Economy    Sum
##   no      8102   27902  36004
##   yes    85385  178764 264149
##   Sum    93487  206666 300153
prop.table(table(df$stop_ans,df$class),margin=2)*100
##      
##        Business   Economy
##   no   8.666446 13.501011
##   yes 91.333554 86.498989
prop.table(table(df$stop_ans,df$class))*100
##      
##        Business   Economy
##   no   2.699290  9.295926
##   yes 28.447159 59.557626

Trong bộ dữ liệu thu thập được ta một số thông tin về việc quá cảnh ở các hành khách như sau:

  • Có 93487 hành khách có vé hạng thương gia chiếm khoảng hơn 31% số lượng hành khách trong tập dữ liệu. Trong đó có đến hơn 91.33% số hành khách có vé hạng thương gia có chuyến bay quá cảnh tại ít nhất một điểm dừng,chiếm khoảng 28,44% trên tổng số hành khách. Những hành khách ở hạng vé này nhưng không quá cảnh chỉ chiếm 8.66% lượng hành khách ở cùng hạng vé.
  • Có đến 206666 hành khách có chuyến bay hạng phổ thông, trong đó có khoảng 86.5% hành khách ở hạng vé này có quá cảnh tại ít nhất một điểm dừng và chiếm khoảng 59.56% trên tổng hành khách có trong danh sách. Ngoài ra số hành khách không quá cảnh ở hạng vé này chiếm khoảng 9.3% lượng khách hàng trong bộ dữ liệu.

=> Đa phần là những hành khách có các chuyến bay quá cảnh, trong đó các hành khách có quá cảnh ở hạng phổ thông phổ biến hơn cả.

df %>% ggplot(aes(x = fct_infreq(stop_ans), fill = class)) +
  geom_bar(position = "dodge") +
  geom_text(aes(label = scales::percent(after_stat(count / sum(count)), accuracy = 0.01)), 
            stat = "count", 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, 
            color = 'black') +
  scale_fill_manual(values = c("Economy" = "skyblue", "Business" = "brown")) + labs( fill = 'Hạng vé',title = "Số lượng chuyến bay có quá cảnh ở các hạng vé") + theme_minimal()

Nhận xét

  • Chuyến bay có quá cảnh phổ biến hơn: Tỷ lệ chuyến bay có quá cảnh cao hơn tỷ lệ chuyến bay không quá cảnh ở cả hai hạng vé.
  • Hạng vé phổ thông phổ biến hơn: Số lượng chuyến bay hạng phổ thông cao hơn nhiều so với số lượng chuyến bay hạng thương gia.
  • Việc chênh lệch trong số lượng hành khách ở hạng thương gia và hạng phổ thông cũng như có quá cảnh và không quá cảnh có thể giải thích bằng nhu cầu về vé giá rẻ ở khách hàng.

6.4.1 Relative Risk

df$stop_ans <- factor(df$stop_ans, levels = c("yes", "no"))   
cls <- table(df$stop_ans,df$class)
RelRisk(cls)
## [1] 1.436452
addmargins(cls)
##      
##       Business Economy    Sum
##   yes    85385  178764 264149
##   no      8102   27902  36004
##   Sum    93487  206666 300153

Với RR = 1.436452, cho thấy rằng xác suất chọn hạng vé thương gia ở những chuyến bay có quá cảnh gấp 1.436452 lần xác suất chọn hạng vé thương gia ở những chuyến bay không có quá cảnh.

6.4.2 OddRatio

OddsRatio(cls)
## [1] 1.644919

OR = 1.644919 cho thấy rằng Odds của những chuyến bay có quá cảnh gấp 1.644919 lần odds của những chuyến bay không có quá cảnh. Điều này có thể phản ánh xu hướng của khách hàng khi họ đặt vé, có thể do các yếu tố như sự thoải mái hơn trong hành trình có quá cảnh với những chuyến bay này thường co thời gian bay dài. (Trong đó odds là xác suất của hạng vé thương gia trên xác suất của hạng vé phổ phông)

6.5 Biến class và day_left

day<- cut(df$days_left,breaks = c(0,10.5,30.5,50),label=c('trễ','vừa','sớm'))
df<-df%>%mutate(df,day)
addmargins(table(df$class,df$day))
##           
##               trễ    vừa    sớm    Sum
##   Business  16394  39754  37339  93487
##   Economy   32973  89371  84322 206666
##   Sum       49367 129125 121661 300153
prop.table(table(df$class,df$day))*100
##           
##                  trễ       vừa       sớm
##   Business  5.461881 13.244579 12.439989
##   Economy  10.985397 29.775148 28.093006
df %>% na.omit() %>% count(class, day) %>% group_by(class) %>% mutate(pvi = n/sum(n)) %>% ggplot(aes(x=class,y=n,fill= day))+geom_col(position = 'dodge') + geom_text(aes(label = percent(pvi,accuracy = .01)), position = position_dodge(1), vjust = -0.5,color = 'black') + theme_classic()

Biến day_lesft được chia thành 3 nhóm gồm nhóm có thời gian đặt vé từ trễ (1-10 ngày), vừa(10-30 ngày), sớm (30-49 ngày).

Từ đó bảng tần số và đồ thị vừa lập được ta có một số nhận xét sau:

  • Trong nhóm gồm 93221 người có vé hạng thương gia , chỉ có 16128 người đặt vé trễ tức từ 1-10 ngày trước ngày bay chiếm khoảng 17.3% số hành khách ở hạng vẽ thương gia và chỉ khoảng 5,41% trên tổng số người trong bộ dữ liệu. Những hành khách có thời gian đặt vé ở khoảng vừa và sớm có tỷ lệ xấp xỉ nhau ở khoảng hơn 40% và chiếm phần lớn trong nhóm vé này.
  • Trong nhóm vé hạng phổ thông gồm 205005 người, trong đó 31312 người (15.27%) trong nhóm này đặt vé trễ. Còn ở hai phân nhóm vừa và sớm còn lại có tỷ lệ xấp xỉ nhau và đều trên 40%.
  • Tỷ lệ ở ở ba phân nhóm “trễ, vừa, sớm” ở hai hạng vé có sự tương đồng rõ rệt

6.6 Biến Class và biến Price

Đầu tiên để thực hiện được lập bảng tần số giữa để chỉ ra mối liên hệ giữa hạng ghế và giá vé, trước tiên phải tiến hành phân tổ giá và gán vào biến mới có tên là price_level.

summary(df$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1105    4783    7425   20890   42521  123071
df$price_level <- cut(df$price, breaks = c(0, 20890, 123071), labels = c("Thap", "Cao"))
addmargins(table(df$price_level, df$class))
##       
##        Business Economy    Sum
##   Thap     1400  205235 206635
##   Cao     92087    1431  93518
##   Sum     93487  206666 300153
prop.table(table(df$price_level, df$class), margin = 2) * 100
##       
##          Business    Economy
##   Thap  1.4975344 99.3075784
##   Cao  98.5024656  0.6924216
summary(df$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1105    4783    7425   20890   42521  123071
df$price_level <- cut(df$price, breaks = c(0, 20890, 123071), labels = c("Thap", "Cao"))
addmargins(table(df$price_level, df$class))
##       
##        Business Economy    Sum
##   Thap     1400  205235 206635
##   Cao     92087    1431  93518
##   Sum     93487  206666 300153
prop.table(table(df$price_level, df$class), margin = 2) * 100
##       
##          Business    Economy
##   Thap  1.4975344 99.3075784
##   Cao  98.5024656  0.6924216
df %>% ggplot(aes(x = fct_infreq(price_level), fill = class)) +
  geom_bar(position = "dodge") +
  geom_text(aes(label = scales::percent(after_stat(count / sum(count)), accuracy = 0.01)), 
            stat = "count", 
            position = position_dodge(width = 0.9), 
            vjust = -0.5, 
            color = 'black') +
  scale_fill_manual(values = c("Economy" = "skyblue", "Business" = "brown")) + labs(fill = 'Hạng vé',title = "Số lượng chuyến bay theo từng mức giá vé") + theme_minimal() + xlab("Mức giá vé") + ylab("Số lượng")

Nhận xét:

  • Trong tất cả các vé hạng phổ thông, đa phần các vé máy bay có giá thấp, có 205235 vé có giá thấp chiếm 99.31%, trong khi đó hạng phổ thông có giá vé cao chỉ có 1431 chiếm 0.69%.

  • Trong 94487 hạng vé có ghế là thương gia, đa phần các vé máy banh có giá cao, có 93487 vé có giá trị cao chiếm 98.5%, trong khi đó hạng thương gia mà có vé rẻ chỉ có 1400 vé, chiếm 1.5%.

7 Thống kê suy diễn

7.1 Kiểm định tính độc lập cho 2 biến định tính

7.1.1 Kiểm định tính độc lập cho biến Class và Airline

Giả thuyết:

  • \(H_0\): Hai biến Class và Airline độc lập

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

chisq.test(table(df$class,df$airline))
## 
##  Pearson's Chi-squared test
## 
## data:  table(df$class, df$airline)
## X-squared = 60493, df = 5, p-value < 2.2e-16

Kết quả: p-value < 2.2e-16 nhỏ hơn rất nhiều so với mức ý nghĩa \(\alpha(5\%)\). Nên ta bác bỏ giả thuyết \(H_0\).

Với mức ý nghĩa 5%, sự lựa chọn các hãng hàng không có ảnh hưởng đến quyết định chọn hạng vé máy bay của khách hàng.

7.1.2 Kiểm định tính độc lập cho biến Class và Source_City

Giả thuyết:

  • \(H_0\): Hai biến Class và Source_City độc lập

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

chisq.test(table(df$class,df$source_city))
## 
##  Pearson's Chi-squared test
## 
## data:  table(df$class, df$source_city)
## X-squared = 236.19, df = 5, p-value < 2.2e-16

Kết quả: p-value < 2.2e-16 nhỏ hơn rất nhiều so với mức ý nghĩa \(\alpha(5\%)\). Nên ta bác bỏ giả thuyết \(H_0\).

Với mức ý nghĩa 5%, thành phố nơi chuyến bay cất cánh có tác động đến quyết định chọn hạng vé máy bay của khách hàng.

7.1.3 Kiểm định tính độc lập cho biến Class và Stops_ans

Giả thuyết:

  • \(H_0\): Hai biến Class và Stops_ans độc lập

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

chisq.test(table(df$class,df$stop_ans))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(df$class, df$stop_ans)
## X-squared = 1424.7, df = 1, p-value < 2.2e-16

Kết quả p-value < 2.2e-16 nhỏ hơn rất nhiều so với mức ý nghĩa \(\alpha(5\%)\). Nên ta bác bỏ \(H_0\).

Vì vậy với mức ý nghĩa 5%, ta kết luận số điểm dừng của chuyến bay có ảnh hưởng đến quyết định lựa chọn hạng ghế của khách hàng.

7.1.4 Kiểm định tính độc lập cho biến Class và Price_level

Giả thuyết:

  • \(H_0\): Hai biến Class và Price_level độc lập

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

chisq.test(table(df$class,df$price_level))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(df$class, df$price_level)
## X-squared = 287094, df = 1, p-value < 2.2e-16

Kết quả p-value < 2.2e-16, nhỏ hơn rất nhiều so với mức ý nghĩa \(\alpha(5%)\). Nên ta bác bỏ \(H_0\)

Vậy ta kết luận là sự lựa chọn hạng ghế của khách hàng có liên quan đến mức giá vé của chuyến bay.

7.1.5 Kiểm định tính độc lập cho biến Class và Dayleft_level

Giả thuyết:

  • \(H_0\): Hai biến Class và Dayleft_level độc lập

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

chisq.test(table(df$class,df$dayleft_level))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(df$class, df$dayleft_level)
## X-squared = 23.064, df = 1, p-value = 1.567e-06

Kết quả p-value = 1.567e-06 < \(\alpha(5\%)\) . Nên ta bác bỏ H0. Vậy ta kết luận, với mức ý nghĩa 5% sự lựa chọn hạng ghế của khách hàng có liên quan đến thời gian đặt vé của chuyến bay.

7.1.6 Kiểm định tính độc lập cho biến Class và Duration_level

Giả thuyết:

  • \(H_0\): Hai biến Class và Duration_level độc lập

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

chisq.test(table(df$class,df$duration_level))
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  table(df$class, df$duration_level)
## X-squared = 7999.8, df = 1, p-value < 2.2e-16

Kết quả p-value < 2.2e-16 nhỏ hơn rất nhiều so với mức ý nghĩa \(\alpha(5\%)\). Nên ta bác bỏ H0. Vậy với mức ý nghĩa 5%, sự lựa chọn hạng ghế của khách hàng có bị ảnh hưởng bởi thời gian bay của chuyến bay.

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

Ước lượng tỷ lệ khách hàng chọn hạng vé thương gia và hạng vé phổ thông

Business <- df[df$class == 'Business',]
prop.test(length(Business$class), length(df$class))
## 
##  1-sample proportions test with continuity correction
## 
## data:  length(Business$class) out of length(df$class), null probability 0.5
## X-squared = 42676, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.3098085 0.3131253
## sample estimates:
##         p 
## 0.3114645

Với độ tin cậy 95%, ta có tỷ lệ khách hàng chọn hạng vé thương gia nằm trong khoảng 30.9% cho đến 31.31%. Tỷ lệ khách hàng chọn hạng vé phổ thông nằm trong khoảng còn lại.

9 Mô hình hồi quy

9.1 Mô hình hồi quy Logistic

9.1.1 Mô hình hồi quy Logistic đơn biến

Hồi quy biến Class và Airline

classairline <- glm(factor(class, levels = c("Economy","Business")) ~ airline, family = binomial(link = 'logit'), data = df)
summary(classairline)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     airline, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##                   Estimate Std. Error z value Pr(>|z|)    
## (Intercept)      -0.377664   0.007158 -52.763   <2e-16 ***
## airlineAirAsia  -18.188404  51.408787  -0.354    0.723    
## airlineGO_FIRST -18.188404  42.848161  -0.424    0.671    
## airlineIndigo   -18.188404  31.411158  -0.579    0.563    
## airlineSpiceJet -18.188404  68.712670  -0.265    0.791    
## airlineVistara    0.273063   0.009089  30.045   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance: 286207  on 300147  degrees of freedom
## AIC: 286219
## 
## Number of Fisher Scoring iterations: 17

Phương trình hồi quy Logistic của Class và Airline có dạng:

\[ log(odds) = -0.377664 - 18.188404.AirAsia -18.188404.Gofrist -18.188404.Indigo -18.188404.SpiceJet +0.273063.Vistara \]

Giải thích kết quả:

  • Giá trị P-value đối với hãng hàng không mang nhãn hiệu AirAsia, GOFIRST, Indigo, SpiceJet rất lớn nên các hãng hàng không này không có ý nghĩa thống kê trong mô hình.

  • Odds của hãng hàng không Vistara bằng 1.31 lần đối với odds của hãng hàng không India

Đối với chuyến bay mang nhãn hiện là Vistara

  • odds = \(e^{-0.377664+0.273063} = 0.9\)

-> tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.9 , tức là xác suất khách hàng chọn hạng vé thương gia bé hơn xác suất hành khách chọn hạng vé phổ thông 10% (\(1 +0.9 =0.1\))

  • Xác suất khách hàng chọn hạng vé thương gia là 47,4% (tính ra từ phương trình odds = \(\frac{\pi}{1-\pi}\))

Đối với chuyến bay mang nhãn hiệu là India

  • odds = \(e^{-0.377664} = 0.685\)

-> tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.685 , tức là xác suất khách hàng chọn hạng vé thương gia bé hơn xác suất hành khách chọn hạng vé phổ thông 31.5% (\(1- -0.685 =0.315\))

  • Xác suất khách hàng chọn hạng vé thương gia là 40,65% (tính ra từ phương trình odds = \(\frac{\pi}{1-\pi}\))

Hãng hàng không Vistara có tỷ lệ khách hàng chọn hạng vé hạng thương gia nhiều hơn so với hãng hàng không India

Hệ số AIC của mô hình này = 286219

Hồi quy biến Class và Source_city

classsource <- glm(factor(class,levels = c("Economy","Business")) ~ source_city, family = binomial(link = 'logit'), data = df)
unique(df$source_city)
## [1] "Delhi"     "Mumbai"    "Bangalore" "Kolkata"   "Hyderabad" "Chennai"
summary(classsource)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     source_city, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##                       Estimate Std. Error z value Pr(>|z|)    
## (Intercept)          -0.773129   0.009429 -81.999  < 2e-16 ***
## source_cityChennai    0.036523   0.014385   2.539 0.011117 *  
## source_cityDelhi     -0.080924   0.012913  -6.267 3.68e-10 ***
## source_cityHyderabad -0.001888   0.014227  -0.133 0.894417    
## source_cityKolkata   -0.118865   0.013912  -8.544  < 2e-16 ***
## source_cityMumbai     0.047238   0.012792   3.693 0.000222 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance: 372113  on 300147  degrees of freedom
## AIC: 372125
## 
## Number of Fisher Scoring iterations: 4

Phương trình hồi quy Logistic của Class và Source_city có dạng:

\[ log(odds) = -0.773129 +0.036523.Chennai -0.080924.Delhi -0.001888.Hyderabad -0.118865.Kolkata +0.047238.Mumbai \]

Giải thích kết quả:

  • Giá trị p_value của Hyderabad lớn hơn mức ý nghĩa 0.05 nên biểu hiện này không có ý nghĩa thống kê trong mô hình này.

  • Odds của Chennai bằng 1.037 lần odds của Bangalore

  • Odds của Delhi bằng 0.92 lần odds của Bangalore

  • Odds của Kolkata bằng 0.8879 lần odds của Bangalore

  • Odds của Mumbai bằng 1.048 lần odds của Bangalore

Đối với thành phố Bangalore

  • odds = \(e^{-0.773129} = 0.4615\)

  • tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.4615

  • Xác suất khách hàng chọn hạng vé thương gia là 31,57%

Đối với thành phố Chennai

  • odds = \(e^{-0.773129 +0.036523} = 0.4787\)

  • tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.4787

  • Xác suất khách hàng chọn hạng vé thương gia là 32.37%

Đối với thành phố Delhi

  • odds = \(e^{-0.773129-0.080924} = 0.4256\)

  • tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.4256

  • Xác suất khách hàng chọn hạng vé thương gia là 29,85%

Đối với thành phố Kolkata

  • odds = \(e^{-0.773129-0.118865} = 0.4098\)

  • tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.4098

  • Xác suất khách hàng chọn hạng vé thương gia là 29,06%

Đối với thành phố Mumbai

  • odds = \(e^{-0.773129-0.047238} = 0.4402\)

  • tỷ lệ chênh giữa xác suất chọn hạng ghế thương gia và xác suất chọn hạng ghế phổ thông là 0.4402

  • Xác suất khách hàng chọn hạng vé thương gia là 30,56%

Đối với thành phố Bangalore

  • odds = \(e^{-0.773129} = 0.4615\)

Thành phố Chennai có xác suất chọn hạng vé thương gia là lớn nhất (32.37%), tiếp đến là thành phố bangalore với xác suất là 31,57%, thứ 3 là thành phố Mumabai với xác suất là 30,56%, thành phố helhi có xác suất 29,85% và cuối cùng là thành phố Kolkata có xác suất là 29,06%. Giữa những thành phố này có sự chênh lệch trong xác suất chọn hạng vé thương gia, tuy nhiên sự chênh lệch này không đáng kể

Hệ số AIC của mô hình này = 372125

Hồi quy biến Class và Price_level

classprice <- glm(factor(class,levels = c("Economy","Business")) ~ price_level, family = binomial(link = 'logit'), data = df)
summary(classprice)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     price_level, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)    -4.98768    0.02681  -186.0   <2e-16 ***
## price_levelCao  9.15204    0.03780   242.1   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance:  31578  on 300151  degrees of freedom
## AIC: 31582
## 
## Number of Fisher Scoring iterations: 7

Kết quả hồi quy mô hình logistic trên cho ta thấy mối quan hệ giữa biến Class và Price_level.

Phương trình hồi quy Logistic của Class và Price_levels có dạng:

\[ log(odds) = -4.98768 + 9.15204.Cao \]

  • Odds của mức giá cao bằng 9433.6 lần so với odds của mức giá thấp.

Đối với chuyến bay có mức giá cao

  • odds = \(e^{-4.98768 + 9.15204} = 64.35\)

  • Xác suất khách hàng chọn hạng vé thương gia là 98,46%.

Đối với chuyến bay có mức giá thấp

  • odds = \(e^{-4.98768} = 6,82.10^{-3}\)

  • Xác suất khách hàng chọn vé thương gia là 1.54%

Đối với những chuyến bay có mức giá cao, hầu như đều rơi vào hạng vé thương gia. Xác suất vé đó là vé hạng thương gia đối với mức giá cao là 98,46%.

Mô hình này có hệ số AIC là 31582

Hồi quy biến Class và Stop_ans

classstopans <- glm(factor(class,levels = c("Economy","Business")) ~ stop_ans, family = binomial(link = 'logit'), data = df)
summary(classstopans)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     stop_ans, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.73890    0.00416 -177.62   <2e-16 ***
## stop_ansno  -0.49769    0.01329  -37.45   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance: 370848  on 300151  degrees of freedom
## AIC: 370852
## 
## Number of Fisher Scoring iterations: 4

Kết quả hồi quy mô hình logistic trên cho ta thấy mối quan hệ giữa biến Class và Stops_ans.

Phương trình hồi quy Logistic của Class và Stop_ans có dạng:

\[ log(odds) = -1.23659 + 0.49769.Yes \] - Odds của chuyến bay có điểm dừng bằng 1.64 lần odds của chuyến bay không có điểm dừng

Đối với chuyến bay có điểm dừng

  • odds = \(e^{-1.23659 + 0.49769} = 0,4776\)

  • Tỷ lệ giữa xác suất khách chọn hạng ghế thương gia và xác suất khách hàng chọn hạng ghế phổ thông là 0,4776.

  • Xác suất khách hàng chọn hạng vé thương gia là 32,32%.

Đối với chuyến bay không có điểm dừng

  • odds = \(e^{-1.23659} = 0,29\)

  • Tỷ lệ giữa xác suất khách hàng chọn ghế thương gia và xác suất khách hàng chọn hạng ghế phổ thông là 0,29

  • Xác suất khách hàng chọn vé thương gia là 22,48%

Xác suất chọn hạng vé thương gia của những chuyến bay có điểm dừng (32,32%) cao hơn những chuyến bay không có điểm dừng (22,48%)

Hệ số AIC của mô hình này là 370852

Hồi quy biến Class và day_left

classdayleft <- glm(factor(class,levels = c("Economy","Business")) ~ days_left, family = binomial(link = 'logit'), data = df)
summary(classdayleft)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     days_left, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -0.7394429  0.0084874 -87.123  < 2e-16 ***
## days_left   -0.0020761  0.0002907  -7.143 9.14e-13 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance: 372299  on 300151  degrees of freedom
## AIC: 372303
## 
## Number of Fisher Scoring iterations: 4

Kết quả hồi quy mô hình logistic trên cho ta thấy mối quan hệ giữa biến Class và days_left

Phương trình hồi quy Logistic của Class và day_left có dạng:

\[ log(odds) = -0.7394429 -0.0020761.daysleft \]

  • \(\beta = -0.0020761\) thể hiện sự giảm xác suất “chọn hạng vé thương gia” đối với “số ngày đặt vé trước chuyến bay” cao hơn

  • Kết quả này thể hiện: Khi số ngày đặt vé trước chuyến bay tăng lên 1 ngày, thì xác suất “khách hàng chọn ghế hạng thương gia” giảm xuống

  • Khi daysleft = 0 thì, \(odds = e^{-0.7394429} = 0.4773798\)

  • Ví dụ: Khi daysleft = 2 thì \(odds = e^{-0.7394429 -0.0020761*2= 0.4754017}\), nghĩa là tỷ lệ giữa xác suất “khách hàng chọn hạng vé thương gia” và “khách hàng chọn hạng vé phổ thông” là 0.4754017. Xác suất khách hàng chọn hạng vé thương gia là 32,22%

Hệ số AIC của mô hình = 372303

Hồi quy biến Class và Duration

classduration <- glm(factor(class,levels = c("Economy","Business")) ~ duration, family = binomial(link = 'logit'), data = df)
summary(classduration)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     duration, family = binomial(link = "logit"), data = df)
## 
## Coefficients:
##               Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -1.3103180  0.0081039 -161.69   <2e-16 ***
## duration     0.0410424  0.0005453   75.27   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 372350  on 300152  degrees of freedom
## Residual deviance: 366650  on 300151  degrees of freedom
## AIC: 366654
## 
## Number of Fisher Scoring iterations: 4

Phương trình hồi quy Logistic của Class và Duration có dạng:

\[ log(odds) = -1.3103180 +0.0410424.duration \]

  • \(\beta = 0.0410424\) thể hiện sự gia tăng xác suất chọn hạng vé thương gia đối với “thời gian bay” cao hơn

  • Kết quả này thể hiện: Khi thời gian bay tăng lên 1 giờ, thì xác suất “khách hàng chọn ghế hạng thương gia” tăng lên

  • Khi duration = 0 thì, \(odds = e^{-1.3103180}=0.2697343\)

  • Ví dụ: Khi duration = 1 thì \(odds = e^{-1.3103180+0.0410424} = 0.2810351\), nghĩa là tỷ lệ giữa xác suất “khách hàng chọn hạng vé thương gia” và “khách hàng chọn hạng vé phổ thông” là 0.2810351. Xác suất khách hàng chọn hạng vé thương gia là 21,94%

Hệ số AIC của mô hình = 366654

9.1.2 Mô hình Logistic đa biến

Trước khi chạy mô hình hồi quy đa biến, để khắc phục hiện tượng đa cộng tuyến giữa các biến độc lập trong mô hình, chúng tôi thực hiện biện pháp xoá bỏ các yếu tố ngoại lai có trong biến price. Sau khi xoá bỏ các yếu tố đó, thực hiện chia tập dữ liệu thành hai phần: phần thứ nhất để huấn luyện mô hình, phần thứ hai dùng để dự báo và kiểm tra mô hình có hoạt động hiệu quả không. Các biến được sử dụng trong mô hình là: Class, Price, Stops, Day_left, Duration. Trong đó, Class là biến phụ thuộc và các biến còn lại là biến độc lập.

Xử lý outliers

summary(df$price)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1105    4783    7425   20890   42521  123071
z_scores <- scale(df$price)
outliers <- which(abs(z_scores) > 3)
outliers # id (indices) của ouliers 
##   [1] 206788 206879 210743 210744 215855 215856 215857 215858 215859 215860
##  [11] 215910 216021 216022 216023 216024 216025 216026 216088 216089 216090
##  [21] 216091 216092 216093 216094 216095 216096 216097 216161 216162 216163
##  [31] 216164 216165 216166 216167 216168 216242 216243 216308 216309 216441
##  [41] 216442 216796 216797 216927 216928 216929 217072 217073 217140 217141
##  [51] 217279 217280 217409 217477 217478 217618 217619 217817 217818 218779
##  [61] 218780 219138 219139 219183 219184 219233 221883 221884 221885 221972
##  [71] 221973 222023 222024 222095 222294 222423 222765 222837 222893 223095
##  [81] 223332 223728 225007 225356 230077 230078 230079 230080 230081 230082
##  [91] 230083 230084 230085 230086 230087 230088 230089 230090 230091 230092
## [101] 230093 230146 230147 230148 230149 230150 230151 230152 230153 230154
## [111] 230155 230156 230157 230158 230159 230160 230161 230162 230233 230234
## [121] 230235 230317 230318 230319 230320 230406 230490 230491 230492 230493
## [131] 230494 230585 230759 230760 230761 230762 230763 230764 231110 231286
## [141] 231287 231288 231289 231290 231380 231728 231908 231909 232524 232525
## [151] 232526 232527 232528 234179 234180 234181 234227 234228 234229 234230
## [161] 234231 234232 234233 234288 234289 234290 234291 234422 234423 234573
## [171] 234822 234823 235584 235585 235586 237009 237010 237350 238127 238128
## [181] 241493 241546 241547 241548 241549 241595 241596 241597 241598 241599
## [191] 241600 241877 241878 241879 241880 244142 244362 244853 244952 244953
## [201] 248654 248726 248727 248728 248729 248730 248804 248805 248962 248963
## [211] 248964 248965 248966 248967 248968 248969 249057 249058 249142 249143
## [221] 249144 249761 250207 250295 250296 250829 250918 252517 252883 252986
## [231] 253049 253050 253051 253657 253991 254194 254527 254528 254597 255183
## [241] 255184 255185 255186 261072 261290 261330 261331 261370 261371 261372
## [251] 261373 261374 261375 261376 261377 261378 261497 261498 261499 261500
## [261] 261557 261558 261559 261618 261619 261733 261734 261735 262028 262081
## [271] 262082 262083 262137 262193 262194 262195 262196 262197 262310 262481
## [281] 262701 262759 262817 262818 262923 263537 263647 263648 263753 264012
## [291] 264013 264014 264015 264052 264053 264122 264183 264184 264185 264186
## [301] 264187 264188 264189 264190 264191 264192 264193 264194 264195 264267
## [311] 264268 264269 264411 264412 264487 264561 265015 265664 265665 265666
## [321] 265667 265668 266018 266087 266447 266448 266449 266450 266804 266805
## [331] 266806 266807 267370 267371 267372 267373 267410 267529 267530 267531
## [341] 267592 267782 268216 269091 269092 269471 270367 270368 270416 270417
## [351] 270418 270461 270462 270463 270464 270465 270513 270562 270563 270564
## [361] 270612 270613 270658 270659 270708 270756 270757 270808 270809 270856
## [371] 270857 270900 270901 270950 270951 270998 270999 271000 271050 271051
## [381] 271098 271099 271147 271148 271149 271194 271195 271242 271243 271292
## [391] 271293 271341 271392 271393 271394 271395 271441 271442 271489 271490
## [401] 271536 271537 271584 271585 271635 271636 271687 271688 271689 271736
## [411] 271737 271782 271783 271784 271835 271836 271837 271889 271890 271939
## [421] 271940 271992 271993 272043 272044 272099 272100 272152 272153 272204
## [431] 272205 272250 272251 272298 272299 272348 272349 272401 272402 272454
## [441] 272455 272502 272503 272553 272554 272606 272607 272756 274404 277289
## [451] 277290 277341 277342 277343 277344 277345 277346 278305 280350 280351
## [461] 280352 280353 280392 280393 280394 280676 280737 281898 281899 283079
## [471] 283438 283439 283533 284174 284440 284549 284550 284755 284756 284919
## [481] 285181 285284 285445 286274 286377 286742 286793 287044 287143 287241
## [491] 287624 287665 287808 288344 288632 290393 290394 290395 290396 290397
## [501] 290439 290440 290441 290442 290443 290444 290445 290446 290503 290504
## [511] 290559 290560 290561 290562 290563 290564 290565 290566 290567 290568
## [521] 290569 290685 290686 290687 290688 290689 290690 290691 290692 290820
## [531] 290821 290879 290880 290881 290882 290883 290884 290885 290886 290887
## [541] 291012 291013 291014 291015 291016 291017 291018 291082 291083 291084
## [551] 291543 291544 291545 291546 291547 291548 291812 291813 291814 292743
## [561] 292744 292745 293296 293297 293298 293299 293344 293345 293346 293347
## [571] 293472 293473 293474 293475 293636 293691 295963 295964 295999 296000
## [581] 296001 296002 296081 296082 296170 296171 296262 296263 296312 296404
## [591] 296405 296455 296774 298130 298920 298970 299018 299019 299408 299459
## [601] 299701 300069
df_cleaned <- df %>% filter(!row_number() %in% outliers)
boxplot(df_cleaned$price)

summary(outliers)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  206788  232526  264188  258606  277328  300069

Mô hình hồi quy đa biến bao gồm:

  • Biến phụ thuộc: Class
  • Biến độc lập: price_level, stop_ans,day_left, duration

Hồi quy biến Class, Price_level, Duration, Stop_ans, Day_left

set.seed(123)  # Trả về giá trị cố định sau mỗi lần lấy mẫu

train_index <- createDataPartition(df_cleaned$class, p = 0.8, list = FALSE, times = 1)

# Tạo tập train và test từ chỉ số đã chọn
train_data <- df_cleaned[train_index, ]
test_data <- df_cleaned[-train_index, ]
classalllogistic1 <- glm(factor(class,levels = c("Economy","Business")) ~  price + stops + duration +days_left, family = binomial(link = 'logit'), data = train_data)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(classalllogistic1)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     price + stops + duration + days_left, family = binomial(link = "logit"), 
##     data = train_data)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)      -1.417e+01  3.538e-01  -40.05   <2e-16 ***
## price             8.029e-04  1.868e-05   42.98   <2e-16 ***
## stopsone         -6.621e+00  2.403e-01  -27.55   <2e-16 ***
## stopstwo_or_more -9.181e+00  4.553e-01  -20.17   <2e-16 ***
## duration         -1.961e-01  1.221e-02  -16.05   <2e-16 ***
## days_left         1.421e-01  6.341e-03   22.41   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 296754.7  on 239640  degrees of freedom
## Residual deviance:   1741.8  on 239635  degrees of freedom
## AIC: 1753.8
## 
## Number of Fisher Scoring iterations: 12

\[ log(odds) = (-1,417e+01) + (8,029e-04).price - 6,621e.stopsone -9,181e.stopstwoormore -(1,961e-01).duration +(1,421e-01).daysleft \]

Giải thích kết quả

  • Trong trường hợp các yếu tố khác không đổi, giá trị \(\beta_1 =(8,029e-04)\) thể hiện khi giá vé máy bay tăng lên 1000 đồng thì odds tăng lên 1.000803 lần.

  • Trong trường hợp các yếu tố khác không đổi, giá trị \(\beta_2 = - 6,621e\) thể hiện xác suất chọn vé hạng thương gia của những chuyến bay có một điểm dừng bé hơn những chuyến bay không có điểm dừng. Odds của những chuyến bay có 1 điểm dừng bằng 0.001332098 lần odds của những chuyến bay không điểm dừng

  • Trong trường hợp các yếu tố khác không đổi, giá trị \(\beta_3 = -9,181e\) thể hiện xác suất chọn vé hạng thương gia của những chuyến bay có “lớn hơn hoặc bằng 2” điểm dừng bé hơn những chuyến bay không có điểm dừng. Odds của những chuyến bay có “lớn hơn hoặc bằng 2” điểm dừng bằng 0.0001029775 lần odds của những chuyến bay không điểm dừng

  • Trong trường hợp các yếu tố khác không đổi, giá trị \(\beta_4 = -(1,961e-01)\) thể hiện: khi thời gian bay tăng lên 1 giờ thì odds giảm 0.82193 lần

  • Trong trường hợp các yếu tố khác không đổi, giá trị \(\beta_5 = 1.421e-01\) thể hiện: khi thời gian đặt vé trước chuyến bay tăng lên một ngày thì odds tăng lên 1.152692 lần.

Khoảng tin cậy cho hệ số hồi quy

confint(classalllogistic1)
## Waiting for profiling to be done...
##                          2.5 %        97.5 %
## (Intercept)      -1.488758e+01 -1.349944e+01
## price             7.675913e-04  8.408958e-04
## stopsone         -7.104581e+00 -6.161869e+00
## stopstwo_or_more -1.009982e+01 -8.315310e+00
## duration         -2.202149e-01 -1.723210e-01
## days_left         1.299964e-01  1.548736e-01
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến Price là [-1.488758e+01;-1.349944e+01]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biểu hiện stopsone trong biến stops là [7.675913e-04;-6.161869e+00]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến stopstwo_or_more là [-1.009982e+01;-8.315310e+00]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến duration là [-2.202149e-01;-1.723210e-01]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến days_left là [1.299964e-01;1.548736e-01]

9.2 Mô hình Probit đa biến

classallprobit1 <- glm(factor(class,levels = c("Economy","Business")) ~  price + stops + duration +days_left, family = binomial(link = 'probit'), data = train_data)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
summary(classallprobit1)
## 
## Call:
## glm(formula = factor(class, levels = c("Economy", "Business")) ~ 
##     price + stops + duration + days_left, family = binomial(link = "probit"), 
##     data = train_data)
## 
## Coefficients:
##                    Estimate Std. Error z value Pr(>|z|)    
## (Intercept)      -6.950e+00  1.577e-01  -44.07   <2e-16 ***
## price             3.932e-04  8.032e-06   48.95   <2e-16 ***
## stopsone         -3.360e+00  1.127e-01  -29.81   <2e-16 ***
## stopstwo_or_more -4.415e+00  2.107e-01  -20.95   <2e-16 ***
## duration         -9.133e-02  5.964e-03  -15.31   <2e-16 ***
## days_left         6.921e-02  2.889e-03   23.96   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 296754.7  on 239640  degrees of freedom
## Residual deviance:   1746.9  on 239635  degrees of freedom
## AIC: 1758.9
## 
## Number of Fisher Scoring iterations: 14

Phương trình hồi quy: \[Probit(P(y = \text{Business})) = -7.069 + 3.988 \times 10^{-4} \cdot \text{price} - 0.09135 \cdot \text{duration} - 3.419 \cdot \text{stops}_{\text{one}} - 4.458 \cdot \text{stops}_{\text{two_or_more}} + 0.07081 \cdot \text{days_left}\]

Hay viết các khác: \[\pi(y=Business)=\Phi(-7.069 + 3.988 \times 10^{-4} \cdot \text{price} - 0.09135 \cdot \text{duration} - 3.419 \cdot \text{stops}_{\text{one}} - 4.458 \cdot \text{stops}_{\text{two_or_more}} + 0.07081 \cdot \text{days_left})\]

Đối với chuyến bay không có điểm dừng

\[\pi(y=Business)=\Phi(-7.069 + 3.988 \times 10^{-4} \cdot \text{price} - 0.09135 \cdot \text{duration} + 0.07081 \cdot \text{days_left})\] Đối với chuyến bay có một điểm dừng

\[\pi(y=Business)=\Phi(-7.069 + 3.988 \times 10^{-4} \cdot \text{price} - 0.09135 \cdot \text{duration} - 3.419+ 0.07081 \cdot \text{days_left})\] Đối với chuyến bay có hai hoặc nhiều hơn hai điểm dừng

\[\pi(y=Business)=\Phi(-7.069 + 3.988 \times 10^{-4} \cdot \text{price} - 0.09135 \cdot \text{duration} - 4.458 + 0.07081 \cdot \text{days_left})\]

Như vậy, đối với chuyến bay không có điểm dừng thì xác xuất chọn vé máy bay hạng thương gia sẽ cao hơn là chuyến bay có một điểm dừng, xác suất chọn vé máy bay hạn thương gia có một điểm dừng nhiều hơn xác suất chọn vé máy bay có hai hoặc nhiều hơn hai điểm dừng.

Giá vé càng cao thì xác suất để chuyến bay là hạng thương gia càng lớn (hệ số 3.988.10^{-4})

Thời gian chuyến bay dài hơn, thì xác suất chọn vé máy bay là thương gia lại giảm xuống.(hệ số −0.09135)

Số ngày còn lại trước chuyến bay càng ít thì xác suất chọn vé hạng thương gia giảm.(hệ số 0.07081)

Khoảng tin cậy cho hệ số hồi quy

confint(classallprobit1)
## Waiting for profiling to be done...
##                          2.5 %        97.5 %
## (Intercept)      -7.2658406663 -6.6503689026
## price             0.0003780374  0.0004091837
## stopsone         -3.5826624383 -3.1437958687
## stopstwo_or_more -4.8285430804 -4.0225180056
## duration         -0.1029539022 -0.0798413676
## days_left         0.0636160057  0.0750291676
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến Price là [0.0003780374;0.0004091837]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biểu hiện stopsone trong biến stops là [-3.5826624383 -3.1437958687]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến stopstwo_or_more là [-4.8285430804;-4.0225180056]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến duration là [-0.1029539022;-0.0798413676]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến days_left là [0.0636160057;0.0750291676]

9.3 Mô hình xác suất tuyến tính đa biến

9.3.1 Mô hình LPM đa biến

df_cleaned <-df_cleaned %>% mutate(classc = if_else(class =='Economy',0,1))
set.seed(123) 

train_index_lpm <- createDataPartition(df_cleaned$class, p = 0.8, list = FALSE, times = 1)


# Tạo tập train và test từ chỉ số đã chọn
train_data_lpm <- df_cleaned[train_index_lpm, ]
test_data_lpm <- df_cleaned[-train_index_lpm, ]

lpm <- glm(classc ~ price + stops + airline + duration +days_left, data=train_data_lpm)

summary(lpm)
## 
## Call:
## glm(formula = classc ~ price + stops + airline + duration + days_left, 
##     data = train_data_lpm)
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)       4.370e-02  1.220e-03   35.81   <2e-16 ***
## price             1.973e-05  1.470e-08 1342.05   <2e-16 ***
## stopsone         -1.511e-01  1.048e-03 -144.09   <2e-16 ***
## stopstwo_or_more -2.288e-01  1.731e-03 -132.15   <2e-16 ***
## airlineAirAsia   -4.195e-02  1.424e-03  -29.46   <2e-16 ***
## airlineGO_FIRST  -7.984e-02  1.241e-03  -64.32   <2e-16 ***
## airlineIndigo    -9.300e-02  1.065e-03  -87.31   <2e-16 ***
## airlineSpiceJet  -9.769e-02  1.765e-03  -55.36   <2e-16 ***
## airlineVistara   -6.910e-02  7.210e-04  -95.84   <2e-16 ***
## duration         -1.423e-03  5.177e-05  -27.49   <2e-16 ***
## days_left         2.496e-03  2.130e-05  117.20   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for gaussian family taken to be 0.0196968)
## 
##     Null deviance: 51266.5  on 239640  degrees of freedom
## Residual deviance:  4719.9  on 239630  degrees of freedom
## AIC: -261057
## 
## Number of Fisher Scoring iterations: 2

Ta có phương trình kết quả ước lượng phương trình xác suất tuyến tính :

\[ \hat{\pi}= 0.0437 +1.973.10^{-5}.Price-0.1511.Stopsone-0.2288.\text{stopstwo_or_more}-0.04195.airlineAirAsia-0.07984.\text{airlineGO_FIRST}-0.093.airlineIndigo-0.09769.airlineSpiceJet-0.0691.airlineVistara+0.002496\text{days_left}-0.001423duration\]

Trong biến về các hãng bay, ta có biến tham chiếu là hãng Air_India ta có ý nghĩa các hệ số của từng biến giả như sau:

  • Hệ số của airlineAirAsia: -0.04195 giải thích rằng Khách hàng bay hãng AirAsia có xác suất chọn vé business thấp hơn 0.04195 (4.195%) so với khách hàng bay hãng Air_India

  • Hệ số của airlineGO_FIRST: -0.07984 giải thích rằng Khách hàng bay hãng GO_FIRST có xác suất chọn vé business thấp hơn 0.07984 (7.984%) so với khách hàng bay hãng Air_India.

  • Hệ số của airlineIndigo:-0.093 giải thích rằng Khách hàng bay hãng Indigo có xác suất chọn vé business thấp hơn 0.093 (9.3%) so với khách hàng bay hãng Air_India.

  • Hệ số của airlineSpiceJet:-0.09769 giải thích rằng Khách hàng bay hãng SpiceJet có xác suất chọn vé business thấp hơn 0.09769 (9.769%) so với khách hàng bay hãng Air_India.

  • Hệ số của airlineVistara: -0.0691 giải thích rằng Khách hàng bay hãng Vistara có xác suất chọn vé business thấp hơn 0.0691 (6.91%) so với khách hàng bay hãng Air_India.

Trong biến Stop tức chuyến bay có quá cảnh, ta có biến tham chiếu là “no” tức là chuyến bay không có quá cảnh ta có ý nghĩa các hệ số của từng biến giả như sau:

  • Đối với hệ số của biến stopsone : -0.1511 giải thích rằng xác suất chọn vé hạng thương gia của những chuyến bay có một điểm dừng bé hơn 15.11% so với xác suất chọn vé hạng thương gia của những chuyến bay không có điểm dừng.

  • Đối với hệ số của biến stopstwo_or_more : -0.2288 giải thích rằng xác suất chọn vé hạng thương gia của những chuyến bay có từ hai điểm quá cảnh bé hơn 22.88% so với xác suất chọn vé hạng thương gia của những chuyến bay không có điểm dừng.

  • Đối với hệ số của biến price : \(1.973*10^{-5}\) cho thấy rằng nếu giá vé tăng thêm 1 ngàn đồng , xác suất chọn vé hạng thương gia tăng 0.001973%

  • Đối với hệ số của biến days_left: 0.002496, cho thấy rằng nếu thời gian đặt vé trước chuyến bay tăng thêm 1 ngày , xác suất chọn vé hạng thương gia tăng 0.2496%

  • Đối với hệ số của biến duration: -0.001423 cho thấy rằng nếu thời gian bay tăng thêm 1 giờ, xác suất chọn vé hạng thương gia giảm 0.1423%

Khoảng tin cậy cho hệ số hồi quy

confint(lpm)
## Waiting for profiling to be done...
##                          2.5 %        97.5 %
## (Intercept)       4.131208e-02  4.609556e-02
## price             1.970163e-05  1.975926e-05
## stopsone         -1.531083e-01 -1.489988e-01
## stopstwo_or_more -2.321483e-01 -2.253627e-01
## airlineAirAsia   -4.473587e-02 -3.915422e-02
## airlineGO_FIRST  -8.227807e-02 -7.741183e-02
## airlineIndigo    -9.509114e-02 -9.091550e-02
## airlineSpiceJet  -1.011520e-01 -9.423499e-02
## airlineVistara   -7.051728e-02 -6.769086e-02
## duration         -1.524650e-03 -1.321716e-03
## days_left         2.454439e-03  2.537931e-03
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến Price là [0.00001970163, 0.00001975926]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến stopsone là [-0.1531083, -0.1489988]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến stopstwo_or_more là [-0.2321483, -0.2253627]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến airlineAirAsia là [-0.04473587, -0.03915422]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến airlineGO_FIRST là [-0.08227807, -0.07741183]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến airlineIndigo là [-0.09509114, -0.09091550]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến airlineSpiceJet là [-0.1011520, -0.09423499]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến airlineVistara là [-0.07051728, -0.06769086]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến duration là [-0.001524650, -0.001321716]
  • Với mức ý nghĩa 5%, khoảng tin cậy cho hệ số của biến days_left là [0.002454439, 0.002537931]

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

9.4.1 Chỉ số AIC

Mô hình Logistic đa biến: 1753.8 Mô hình Probit đa biến: 1758.9 Mô hình LPM đa biến: -261057 Dựa theo chỉ số AIC của mô hình thì mô hình LPM là mô hình tốt nhất

9.4.2 Đánh giá mô hình: Ma trận nhầm lẫn

Trong phần này chúng tôi sử dụng đường cong ROC để xác định ngưỡng tối ưu để phân loại hai hạng vé từ mô hình dự đoán. Sau đó lập ma trận nhầm lẫn của giá trị dự đoán và giá trị thực tế của ba mô hình hồi quy.

Mô hình Logistic

predictlogit <- predict.glm(classalllogistic1, newdata = test_data, type="response")

# Tạo đối tượng ROC
roc_curve <- roc(test_data$class, predictlogit)
## Setting levels: control = Business, case = Economy
## Setting direction: controls > cases
# Vẽ đường cong ROC
plot(roc_curve, main="ROC Curve", col="blue")

# Tính toán AUC

auc_value <- auc(roc_curve)
auc_value #Một trong những chỉ số đánh giá mô hình 
## Area under the curve: 1
# Tính toán ngưỡng tối ưu dựa trên Youden's J statistic

coords <- coords(roc_curve, "best", ret = "threshold")
optimal_threshold <- coords$threshold
optimal_threshold
## [1] 0.3159721
predictedlogit <- ifelse(predictlogit >  0.3159721, "Business", "Economy")

# Tạo confusion matrix để đánh giá hiệu suất
confusion_matrix <- table(Predicted = predictedlogit, Actual = test_data$class)
addmargins(confusion_matrix)
##           Actual
## Predicted  Business Economy   Sum
##   Business    18562      45 18607
##   Economy        15   41288 41303
##   Sum         18577   41333 59910
confusionMatrix(table(Predicted = predictedlogit, Actual = test_data$class))
## Confusion Matrix and Statistics
## 
##           Actual
## Predicted  Business Economy
##   Business    18562      45
##   Economy        15   41288
##                                           
##                Accuracy : 0.999           
##                  95% CI : (0.9987, 0.9992)
##     No Information Rate : 0.6899          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9977          
##                                           
##  Mcnemar's Test P-Value : 0.0001812       
##                                           
##             Sensitivity : 0.9992          
##             Specificity : 0.9989          
##          Pos Pred Value : 0.9976          
##          Neg Pred Value : 0.9996          
##              Prevalence : 0.3101          
##          Detection Rate : 0.3098          
##    Detection Prevalence : 0.3106          
##       Balanced Accuracy : 0.9991          
##                                           
##        'Positive' Class : Business        
## 
  • Giá trị Accuracy = \(\frac{\mathrm{18562+41288} }{59910}=99.9%\)
  • Giá trị Sensitivity = \(\frac{\mathrm{18562} }{18577}=99.9%\)
  • Giá trị Specificity = \(\frac{41288}{41333}=99.89%\)

Mô hình Probit

predictprobit <- predict.glm(classallprobit1, newdata = test_data, type="response")

# Tạo đối tượng ROC
roc_curve_probit <- roc(test_data$class, predictprobit)
## Setting levels: control = Business, case = Economy
## Setting direction: controls > cases
# Vẽ đường cong ROC
plot(roc_curve_probit, main="ROC Curve Probit", col="blue")

# Tính toán AUC

auc_value_probit <- auc(roc_curve_probit)
auc_value_probit #Một trong những chỉ số đánh giá mô hình 
## Area under the curve: 1
# Tính toán ngưỡng tối ưu dựa trên Youden's J statistic

coords_probit <- coords(roc_curve_probit, "best", ret = "threshold")
optimal_threshold_probit <- coords$threshold
optimal_threshold_probit
## [1] 0.3159721
predictedprobit <- ifelse(predictprobit >  0.3159721, "Business", "Economy")

# Tạo confusion matrix để đánh giá hiệu suất
confusion_matrix_probit <- table(Predicted = predictedprobit, Actual = test_data$class)
addmargins(confusion_matrix_probit)
##           Actual
## Predicted  Business Economy   Sum
##   Business    18561      46 18607
##   Economy        16   41287 41303
##   Sum         18577   41333 59910
confusionMatrix(table(Predicted = predictedprobit, Actual = test_data$class))
## Confusion Matrix and Statistics
## 
##           Actual
## Predicted  Business Economy
##   Business    18561      46
##   Economy        16   41287
##                                           
##                Accuracy : 0.999           
##                  95% CI : (0.9987, 0.9992)
##     No Information Rate : 0.6899          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9976          
##                                           
##  Mcnemar's Test P-Value : 0.0002305       
##                                           
##             Sensitivity : 0.9991          
##             Specificity : 0.9989          
##          Pos Pred Value : 0.9975          
##          Neg Pred Value : 0.9996          
##              Prevalence : 0.3101          
##          Detection Rate : 0.3098          
##    Detection Prevalence : 0.3106          
##       Balanced Accuracy : 0.9990          
##                                           
##        'Positive' Class : Business        
## 

Mô hình LPM

predictlpm <- predict.glm(lpm, newdata = test_data, type="response")
# Tạo đối tượng ROC
roc_curve_lpm <- roc(test_data$class, predictlpm)
## Setting levels: control = Business, case = Economy
## Setting direction: controls > cases
# Vẽ đường cong ROC
plot(roc_curve_lpm, main="ROC Curve LPM", col="blue")

# Tính toán AUC

auc_value_lpm <- auc(roc_curve_lpm)
auc_value_lpm #Một trong những chỉ số đánh giá mô hình 
## Area under the curve: 1
# Tính toán ngưỡng tối ưu dựa trên Youden's J statistic

coords_lpm <- coords(roc_curve_lpm, "best", ret = "threshold")
optimal_threshold_lpm <- coords$threshold
optimal_threshold_lpm
## [1] 0.3159721
predictedlpm <- ifelse(predictlpm >  0.3159721, "Business", "Economy")

# Tạo confusion matrix để đánh giá hiệu suất
confusion_matrix_lpm <- table(Predicted = predictedlpm, Actual = test_data$class)
addmargins(confusion_matrix_lpm)
##           Actual
## Predicted  Business Economy   Sum
##   Business    18576     123 18699
##   Economy         1   41210 41211
##   Sum         18577   41333 59910
confusionMatrix(table(Predicted = predictedlpm, Actual = test_data$class))
## Confusion Matrix and Statistics
## 
##           Actual
## Predicted  Business Economy
##   Business    18576     123
##   Economy         1   41210
##                                           
##                Accuracy : 0.9979          
##                  95% CI : (0.9975, 0.9983)
##     No Information Rate : 0.6899          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.9952          
##                                           
##  Mcnemar's Test P-Value : < 2.2e-16       
##                                           
##             Sensitivity : 0.9999          
##             Specificity : 0.9970          
##          Pos Pred Value : 0.9934          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.3101          
##          Detection Rate : 0.3101          
##    Detection Prevalence : 0.3121          
##       Balanced Accuracy : 0.9985          
##                                           
##        'Positive' Class : Business        
## 
  • Giá trị Accuracy = \(\frac{\mathrm{18576+41210} }{59910}=99.79%\)
  • Giá trị Sensitivity = \(\frac{\mathrm{18576} }{18577}=99.99%\)
  • Giá trị Specificity = \(\frac{ 41210}{41333}=99.7%\)

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

10.1 Kết luận

Bài nghiên cứu đã xác định được các yếu tố ảnh hưởng đến hành vi lựa chọn hạng vé của khách hàng. Từ mô hình phân tích đơn biến của từng yếu tố để xác định sự ảnh hưởng của từng yếu tố đến xác suất chọn hạng vé thương gia của khách hàng, ta thấy được có hai yếu tố ảnh hưởng tích cực đến xác suất này là khoảng thời gian di chuyển của chuyến bay và giá vé. Có hai yếu tố ảnh hưởng tiêu cực là thời gian đặt vé trước chuyến bay, số điểm dừng chân của chuyến bay. Tuy nhiên, khi phân tích đa biến để xem sự ảnh hưởng lẫn nhau của các yếu tố độc lập có ảnh hưởng trực tiếp đến kết quả cuối cùng về xác suất lựa chọn hạng vé thương gia của khách hàng hay không, ta thu được kết quả có sự khác biệt khá quan trọng trong kết quả của mô hình. Kết quả từ mô hình Logistic và Probit đa biến cho thấy có bốn yếu tố chính ảnh hưởng đến xác suất lựa chọn hạng vé: giá vé, số điểm dừng của chuyến bay, thời gian di chuyển, và thời gian đặt vé trước chuyến bay. Giá vé và thời gian đặt vé trước chuyến bay có ảnh hưởng tích cực đến xác suất lựa chọn hạng vé thương gia. Ngược lại, số điểm dừng và thời gian di chuyển của chuyến bay lại có ảnh hưởng tiêu cực đến xác suất lựa chọn hạng vé thương gia của khách hàng. Kết quả từ mô hình xác suất tuyến tính cho thấy có năm yếu tố ảnh hưởng đến xác suất chọn hạng vé, bao gồm giá vé, số điểm dừng của chuyến bay, thời gian di chuyển, thời gian đặt vé trước chuyến bay, và hãng hàng không. Tương tự như các mô hình Logistic và Probit, giá vé và thời gian đặt vé trước chuyến bay có ảnh hưởng tích cực đến xác suất chọn hạng vé thương gia, trong khi các yếu tố còn lại có ảnh hưởng tiêu cực đến xác suất chọn hạng vé thương gia của khách hàng. Từ các chỉ số được rút ra từ ma trận nhầm lẫn của mô hình cho thấy rằng cả 3 mô hình Logistic, Probit và mô hình xác suất tuyến tính đều hoạt động rất tốt. Kết quả dự báo thể hiện đúng hơn 99% kết quả thực tế.

10.2 Kiến nghị

Từ kết luận từ bài nghiên cứu về các yếu tố ảnh hưởng đến hành vi lựa chọn hạng vé của khách hàng, tác giả có một số khuyến nghị cho các hãng hàng không nhằm tối ưu hóa việc tiếp cận và thu hút khách hàng trong việc lựa chọn các hạng vé khác nhau. Trước hết, hãng hàng không nên thiết kế các gói giá vé hấp dẫn, đặc biệt là vào các thời điểm có nhu cầu cao hoặc trong các chiến dịch khuyến mãi, các chương trình giảm giá đặc biệt sẽ giúp thu hút thêm nhiều khách hàng đặc biệt là khách hàng ở vé hạng phổ thông. Thứ hai, các hãng hàng không cần tăng cường quản lý số điểm dừng chân của chuyến bay. Việc giảm số điểm dừng chân cho các chuyến bay sẽ tăng khả năng lựa chọn hạng vé thương gia của khách hàng. Việc tối ưu hóa thời gian di chuyển của chuyến bay là một yếu tố quan trọng. Cải thiện lộ trình bay để giảm thời gian di chuyển hoặc chọn các đường bay trực tiếp sẽ giúp tiết kiệm thời gian cho hành khách hạng thương gia. Quảng bá các chuyến bay có thời gian di chuyển ngắn hơn cũng là một cách thu hút khách hàng có nhu cầu di chuyển nhanh chóng. Thứ ba, các hãng hàng không nên quản lý thời gian đặt vé trước chuyến bay một cách hiệu quả. Khuyến khích khách hàng đặt vé sớm thông qua các chương trình giảm giá hoặc ưu đãi đặc biệt cho những ai đặt vé trước một khoảng thời gian dài sẽ giúp tăng lượng vé bán ra. Đồng thời, tạo ra các gói khuyến mãi cho khách hàng đặt vé vào phút cuối, đảm bảo rằng các gói này vẫn mang lại lợi ích cho việc chọn hạng vé thương gia. Thứ tư, cải thiện chất lượng dịch vụ và xây dựng thương hiệu hãng hàng không là một chiến lược không thể thiếu. Hãng hàng không cần đảm bảo cung cấp dịch vụ xuất sắc ở mọi khía cạnh, từ dịch vụ trên máy bay đến dịch vụ khách hàng trước và sau chuyến bay. Xây dựng và duy trì một thương hiệu mạnh mẽ, nhấn mạnh vào chất lượng dịch vụ hạng thương gia và những lợi ích mà khách hàng có thể nhận được khi lựa chọn hạng vé này sẽ giúp tăng cường lòng tin và sự hài lòng của khách hàng. Việc nâng cao trải nghiệm khách hàng bằng cách tạo ra các trải nghiệm độc đáo và đáng nhớ như bữa ăn cao cấp, chỗ ngồi rộng rãi và thoải mái, dịch vụ giải trí cao cấp và dịch vụ hỗ trợ đặc biệt sẽ giúp các hãng bay để lại dấu ấn với khách hàng. Thu thập phản hồi của khách hàng thường xuyên để liên tục cải thiện và tùy chỉnh dịch vụ theo nhu cầu và mong muốn của họ là điều cần thiết. Cuối cùng, chiến lược tiếp thị và truyền thông hiệu quả sẽ đóng vai trò quan trọng trong việc thu hút khách hàng chọn hạng vé thương gia. Sử dụng các kênh truyền thông xã hội và các chiến dịch quảng cáo để quảng bá các yếu tố tích cực như giá vé hấp dẫn, thời gian đặt vé linh hoạt và các dịch vụ cao cấp sẽ giúp tiếp cận đúng đối tượng khách hàng mục tiêu. Tạo nội dung tiếp thị nhắm mục tiêu đến nhóm khách hàng có nhu cầu cao về dịch vụ hạng thương gia như doanh nhân, người có thu nhập cao hoặc những người yêu thích du lịch cao cấp cũng là một chiến lược đáng lưu ý. Bằng cách thực hiện những khuyến nghị này, các hãng hàng không có thể cải thiện sự hài lòng của khách hàng và tăng khả năng khách hàng chọn hạng vé thương gia, từ đó tối ưu hóa doanh thu và nâng cao vị thế cạnh tranh trên thị trường.

LS0tDQp0aXRsZTogIlBow6JuIHTDrWNoIHPhu7EgbOG7sWEgY2jhu41uIGjhuqFuZyB2w6kgY+G7p2Ega2jDoWNoIGjDoG5nIHRyw6puIG7hu4FuIHThuqNuZyBFYXNlTXkgVHJpcCINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjoNCiAgICB0b2M6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICBjc3M6ICJ0aWV1bHVhbi5jc3MiDQogICAgY29kZV9mb2xkaW5nOiBzaG93DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgKipN4bulYyB0acOqdSBiw6BpIG5naGnDqm4gY+G7qXUqKg0KDQpN4bulYyDEkcOtY2ggY+G7p2EgbmdoacOqbiBj4bupdSBuw6B5IGzDoCBwaMOibiB0w61jaCBz4buxIGzhu7FhIGNo4buNbiBo4bqhbmcgdsOpIGJhbyBn4buTbSBo4bqhbmcgdGjGsMahbmcgZ2lhIHbDoCBo4bqhbmcgcGjhu5UgdGjDtG5nIGPhu6dhIGtow6FjaCBow6BuZyBraGkgxJHhurd0IHbDqSBtw6F5IGJheSB0csOqbiB0cmFuZyB3ZWIgRWFzZU15IFRyaXAuIELhurFuZyBjw6FjaCB0aHUgdGjhuq1wIHbDoCBwaMOibiB0w61jaCBjw6FjIHRow7RuZyB0aW4gbGnDqm4gcXVhbiDEkeG6v24gZ2nDoSB2w6ksIHTDqm4gY2h1eeG6v24gYmF5LCBuxqFpIGto4bufaSBow6BuaCwgxJFp4buDbSDEkeG6v24sIHRo4budaSBnaWFuIGto4bufaSBow6BuaCwgdsOgIGPDoWMgeeG6v3UgdOG7kSBraMOhYy4gTmdoacOqbiBj4bupdSBuaOG6sW0gxJHGsGEgcmEgY8OhYyB0aMO0bmcgdGluIGjhu691IMOtY2ggZ2nDunAgY+G6o2kgdGhp4buHbiBk4buLY2ggduG7pSBj4bunYSBFYXNlTXkgVHJpcCB2w6AgY8OzIHRo4buDIMOhcCBk4bulbmcgY2hvIGPDoWMgZG9hbmggbmdoaeG7h3Aga2jDoWMgdHJvbmcgbmfDoG5oIGR1IGzhu4tjaCB2w6AgaMOgbmcga2jDtG5nLg0KDQpgYGB7cix3YXJuaW5nPUZBTFNFLG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoRGVzY1Rvb2xzKQ0KbGlicmFyeShlcGl0b29scykNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGdsbW5ldCkNCmxpYnJhcnkoY2FyZXQpDQpsaWJyYXJ5KHBST0MpDQpkYXRhIDwtIHJlYWQuY3N2KCJEOi9QaGFudGljaGR1bGlldWRpbmh0aW5oL0Vhc3lteXRyaXAuY3N2IikNCmRmIDwtIGRhdGENCnN0cihkZikNCmhlYWQoZGYsNikNCg0KYGBgDQoNCiMgKipNw7QgdOG6oyBi4buZIGThu68gbGnhu4d1Kio6DQoNCidFYXNlTXkgVHJpcCcgbMOgIG3hu5l0IG7hu4FuIHThuqNuZyBpbnRlcm5ldCDEkeG7gyDEkeG6t3QgdsOpIG3DoXkgYmF5LiBE4buvIGxp4buHdSDEkcaw4bujYyB0aHUgdGjhuq1wIGNoaWEgdGjDoG5oIDIgbmjDs20gdsOpOiBt4buZdCBuaMOzbSBkw6BuaCBjaG8gdsOpIGjhuqFuZyBwaOG7lSB0aMO0bmcgdsOgIG5ow7NtIGPDsm4gbOG6oWkgZMOgbmggY2hvIHbDqSBo4bqhbmcgdGjGsMahbmcgZ2lhLiBU4buVbmcgY+G7mW5nIGPDsyAzMDAxNTMgdGjDtG5nIHRpbiDEkeG6t3QgdsOpIG3DoXkgYmF5IHJpw6puZyBiaeG7h3QgxJHGsOG7o2MgdHLDrWNoIHh14bqldCB04burIHRyYW5nIHdlYi4gROG7ryBsaeG7h3UgxJHGsOG7o2MgdGh1IHRo4bqtcCB0cm9uZyA1MCBuZ8OgeSwgdOG7qyBuZ8OgeSAxMSB0aMOhbmcgMiDEkeG6v24gbmfDoHkgMzEgdGjDoW5nIDMgbsSDbSAyMDIyLg0KDQpfQmnhur9uIMSR4buLbmggbMaw4bujbmdfDQoNCi0gRHVyYXRpb246IEtob+G6o25nIHRo4budaSBnaWFuIGNodXnhur9uIGJheSBkaSBjaHV54buDbiAoxJHGsOG7o2MgdMOtbmggYuG6sW5nIGdp4budKQ0KDQotIERheXMgTGVmdDogQ2jDqm5oIGzhu4djaCBnaeG7r2EgdGjhu51pIGdpYW4gYmF5IHbDoCB0aOG7nWkgZ2lhbiDEkeG6t3QgdsOpDQoNCi0gUHJpY2U6IEdpw6EgdsOpDQoNCl9CaeG6v24gxJHhu4tuaCB0w61uaF8NCg0KLSBBaXJsaW5lOiBUw6puIGPhu6dhIGjDo25nIGjDoG5nIGtow7RuZywgZ+G7k20gY8OzIDYgaMOjbmcgaMOgbmcga2jDtG5nDQoNCi0gRmxpZ2h0OiBNw6MgY2h1eeG6v24gYmF5DQoNCi0gU291cmNlIENpdHk6IFRow6BuaCBwaOG7kSBuxqFpIGNodXnhur9uIGJheSBj4bqldCBjw6FuaA0KDQotIERlcGFydHVyZSBUaW1lOiBLaG/huqNuZyB0aOG7nWkgZ2lhbiBjaHV54bq/biBiYXkga2jhu59pIGjDoG5oDQoNCi0gU3RvcHM6IFPhu5EgxJFp4buDbSBk4burbmcgY2jDom4uDQoNCi0gQXJyaXZhbCBUaW1lOiBLaG/huqNuZyB0aOG7nWkgZ2lhbiBjaHV54bq/biBiYXkgaOG6oSBjw6FuaA0KDQotIERlc3RpbmF0aW9uIENpdHk6IFRow6BuaCBwaOG7kSBuxqFpIGNodXnhur9uIGJheSBo4bqhIGPDoW5oDQoNCi0gQ2xhc3M6IEjhuqFuZyBnaOG6vyBtw6Aga2jDoWNoIGjDoG5nIGzhu7FhIGNo4buNbi4gQ8OzIDIgaOG6oW5nIGdo4bq/IGzDoCBo4bqhbmcgcGjhu5UgdGjDtG5nIHbDoCBo4bqhbmcgdGjGsMahbmcgZ2lhDQoNCg0KDQoNCiMgKirEkOG6t3QgduG6pW4gxJHhu4EqKg0KDQpUcm9uZyBuZ8OgbmggaMOgbmcga2jDtG5nLCBjaMO6bmcgdGEgY+G6p24gcGjhuqNpIGhp4buDdSByw7UgaMOgbmggdmkgdsOgIG5odSBj4bqndSBj4bunYSBraMOhY2ggaMOgbmcgxJHhu4MgY8OzIHRo4buDIHThu5FpIMawdSBob8OhIGPDoWMgZOG7i2NoIHbhu6UsIG7Dom5nIGNhbyBkb2FuaCB0aHUgdsOgIHRy4bqjaSBuZ2hp4buHbSBj4bunYSBraMOhY2ggaMOgbmcuIE3hu5l0IHRyb25nIG5o4buvbmcgeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcgdHJvbmcgbmfDoG5oIGjDoG5nIGtow7RuZyBsw6AgZOG7sSDEkW/DoW4gxJHGsOG7o2MgeMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSDEkeG7gyBr4buLcCB0aOG7nWkgxJHGsGEgcmEgY8OhYyBjaMawxqFuZyB0csOsbmggxJHDoXAg4bupbmcgY2hvIG5odSBj4bqndSBj4bunYSBo4buNLg0KDQotIEJp4bq/biBwaOG7pSB0aHXhu5ljIChiaeG6v24gxJHGsOG7o2MgZ2nhuqNpIHRow61jaCk6IENsYXNzIChH4buTbSAyIGJp4buDdSBoaeG7h246IEJ1c2luZXNzIHbDoCBFY29ub215KQ0KDQotIEJp4bq/biBnaeG6o2kgdGjDrWNoOiANCg0KKipTb3VyY2UgQ2l0eSoqOiBLaW5oIHThur8gdGjhu4sgdHLGsOG7nW5nIOG7nyBjw6FjIHRow6BuaCBwaOG7kSBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHjDoWMgc3XhuqV0IGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBj4bunYSBraMOhY2ggaMOgbmcsIOG7nyBuaOG7r25nIHRow6BuaCBwaOG7kSBjw7MgbuG7gW4ga2luaCB04bq/IHBow6F0IHRyaeG7g24gdGjDrCBk4buxIMSRb8OhbiBuaHUgY+G6p3UgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGPhu6dhIGtow6FjaCBow6BuZyBjw7MgdGjhu4MgbOG7m24gaMahbiBzbyB24bubaSBuaOG7r25nIHRow6BuaCBwaOG7kSBjw7MgbuG7gW4ga2luaCB04bq/IMOtdCBwaMOhdCB0cmnhu4NuLg0KDQoqKkFpcmxpbmUqKjogTeG7l2kgaMOjbmcgaMOgbmcga2jDtG5nIGPDsyBjaOG6pXQgbMaw4bujbmcgZOG7i2NoIHbhu6UgdsOgIGdpw6EgY+G6oyBraMOhY2ggbmhhdS4gVsOtIGThu6UsIG5o4buvbmcgaMOjbmcgaMOgbmcga2jDtG5nIG1hbmcgdGjGsMahbmcgaGnhu4d1IGzhu5tuIHRow6wgdOG7tyBs4buHIGNo4buNbiB2w6kgaOG6oW5nIHRoxrDGoW5nIGdpYSBz4bq9IGNhbyBoxqFuLg0KDQoqKlByaWNlKio6IFRoZW8gZOG7sSDEkW/DoW4gdGjDrCBt4bupYyBnacOhIGzDoCBt4buZdCB54bq/dSB04buRIHF1YW4gdHLhu41uZyDhuqNuaCBoxrDhu59uZyDEkeG6v24gbOG7sWEgY2jhu41uIGjhuqFuZyB2w6kgY+G7p2Ega2jDoWNoIGjDoG5nLiBU4burbmcgcGjDom4ga2jDumMga2jDoWNoIGjDoG5nIHPhur0gbOG7sWEgY2jhu41uIGjhuqFuZyB2w6kgcGjDuSBo4bujcCB24bubaSBuaHUgY+G6p3UgdsOgIGto4bqjIG7Eg25nIGNoaSB0cuG6oyBj4bunYSBo4buNLg0KDQoqKlN0b3BfYW5zKio6IEdp4bqjIHRoaeG6v3Qgc+G7kSDEkWnhu4NtIGThu6tuZyBj4bunYSBjaHV54bq/biBiYXkgY8WpbmcgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBow6BuaCB2aSBs4buxYSBjaOG7jW4gaOG6oW5nIHbDqSBj4bunYSBraMOhY2ggaMOgbmcuIE5o4buvbmcga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSB0aMaw4budbmcgc+G6vSBjaMO6IHRy4buNbmcgdsOgbyBk4buLY2ggduG7pSBj4bunYSBjaHV54bq/biBiYXkgaMahbiBzbyB24bubaSBraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyB2w6kgcGjhu5UgdGjDtG5nLiBOaOG7r25nIGNodXnhur9uIGJheSBjw7MgxJFp4buDbSBk4burbmcgdGjGsOG7nW5nIGfDonkgcmEgbmjhu69uZyBy4bqvYyBy4buRaSB24buBIHZp4buHYyBjaHV54buDbiBow6BuaCBsw70gdsOgIG3huqV0IHRo4budaSBnaWFuIGjGoW4sIG7Dqm4gZOG7sSDEkW/DoW4geMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIOG7nyBuaOG7r25nIGNodXnhur9uIGJheSBraMO0bmcgY8OzIMSRaeG7g20gZOG7q25nIHPhur0gY2FvIGjGoW4gc28gduG7m2kgbmjhu69uZyBjaHV54bq/biBiYXkgY8OzIMSRaeG7g20gZOG7q25nLg0KDQoqKkRheV9sZWZ0Kio6IFRo4budaSBnaWFuIMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5IGPFqW5nIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24gbOG7sWEgY2jhu41uIGjhuqFuZyB2w6kgY+G7p2Ega2jDoWNoIGjDoG5nLiDEkOG7kWkgduG7m2kgbmjhu69uZyBjaHV54bq/biBiYXkgY8OzIHRo4budaSBnaWFuIMSR4bq3dCB2w6kgc+G7m20sIHRow6wgc+G6vSBjw7Mgbmhp4buBdSBs4buxYSBjaOG7jW4gduG7gSBnacOhIGPhuqMsIGThu4tjaCB24bulIGhv4bq3YyBo4bqhbmcgZ2jhur8uIE5oxrBuZyDEkeG7kWkgduG7m2kgbmjhu69uZyBjaHV54bq/biBiYXkgxJHhurd0IHF1w6EgZ+G6p24gbmfDoHkgYmF5IHRow6wgc+G6vSBjw7Mgbmjhu69uZyBo4bqhbiBjaOG6vywgdsOtIGThu6UgbmjGsCBo4bq/dCB2w6kgaOG6oW5nIHBo4buVIHRow7RuZy4NCg0KKipEdXJhdGlvbioqOiBUaOG7nWkgZ2lhbiBiYXkgY8WpbmcgbMOgIG3hu5l0IHRyb25nIG5o4buvbmcgeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcg4bqjbmggaMaw4bufbmcgdOG7m2kgaMOgbmggdmkgbOG7sWEgY2jhu41uIGjhuqFuZyB2w6kgY+G7p2Ega2jDoWNoIGjDoG5nLiDEkOG7kWkgduG7m2kgbmjhu69uZyBjaHV54bq/biBiYXkgZMOgaSB0aMOsIGtow6FjaCBow6BuZyBz4bq9IGPDsyB4dSBoxrDhu5tuZyBs4buxYSBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgxJHhu4MgxJHhuqNtIGLhuqNvIHbhu4EgZOG7i2NoIHbhu6UgdsOgIHPhu7EgdGhv4bqjaSBtw6FpLg0KDQoNCiMgKipY4butIGzDvSBk4buvIGxp4buHdSoqDQoNCg0KKipQaMOibiB04buVIGdpw6EgY+G7p2EgbeG7l2kgY2h1eeG6v24gYmF5IHRow6BuaCAyIGJp4buDdSBoaeG7h246IFRo4bqlcCB2w6AgQ2FvKioNCg0KLSBE4buxYSB2w6BvIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgZ2nDoSB0cm9uZyBt4bqrdSDEkcaw4bujYyBjaOG7jW4uIEdpw6EgdGjhuqVwIGjGoW4gMjA4OTAgxJHGsOG7o2MgZ8OhbiB24bubaSBiaeG7g3UgaGnhu4duICJUaOG6pXAiLCBnacOhIGNhbyAyMDg5MCDEkcaw4bujYyBnw6FuIHbhu5tpIGJp4buDdSBoaeG7h24gIkNhbyIuDQoNCmBgYHtyfQ0Kc3RyKGRmKQ0Kc3VtbWFyeShkZiRwcmljZSkNCmRmJHByaWNlX2xldmVsIDwtIGN1dChkZiRwcmljZSwgYnJlYWtzID0gYygwLCAyMDg5MCwgMTIzMDcxKSwgbGFiZWxzID0gYygiVGhhcCIsICJDYW8iKSkNCnN0cihkZiRwcmljZV9sZXZlbCkNCmBgYA0KDQoqKlBow6JuIHThu5UgdGjhu51pIGdpYW4gxJHhurd0IHbDqSB0csaw4bubYyBjaHV54bq/biBiYXkgdGjDoG5oIDIgYmnhu4N1IGhp4buHbiAic+G7m20iLCJNdeG7mW4iKioNCg0KLSBE4buxYSB2w6BvIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY+G7p2EgdGjhu51pIGdpYW4gxJHhurd0IHbDqSB0csaw4bubYyBjaHV54bq/biBiYXkgY+G7p2EgbeG6q3UgxJHGsOG7o2MgY2jhu41uLiBUaOG7nWkgZ2lhbiB0aOG6pXAgaMahbiAyNiBuZ8OgeSAgxJHGsOG7o2MgZ8OhbiB24bubaSBiaeG7g3UgaGnhu4duICJNdeG7mW4iLCB0aOG7nWkgZ2lhbiBjYW8gaMahbiAyNiBuZ8OgeSDEkcaw4bujYyBnw6FuIHbhu5tpIGJp4buDdSBoaeG7h24gIlPhu5ttIi4NCg0KYGBge3J9DQpkZiRkYXlsZWZ0X2xldmVsIDwtIGN1dChkZiRkYXlzX2xlZnQsIGJyZWFrcyA9IGMoMCwgMjYsIDUwKSwgbGFiZWxzID0gYygiTXXhu5luIiwgIlPhu5ttIikpDQpzdHIoZGYkZGF5bGVmdF9sZXZlbCkNCnN1bW1hcnkoZGYkZGF5bGVmdF9sZXZlbCkNCg0KYGBgDQoqKlBow6JuIHThu5UgdGjhu51pIGdpYW4gZGkgY2h1eeG7g24gY+G7p2EgY2h1eeG6v24gYmF5IHRow6BuaCAyIGJp4buDdSBoaeG7h24gIkNhbyIsIlRo4bqlcCIqKg0KDQotIEThu7FhIHbDoG8gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSB0aOG7nWkgZ2lhbiBiYXkuIFRo4budaSBnaWFuIHRo4bqlcCBoxqFuIDEyLjIyIHRp4bq/bmcgxJHGsOG7o2MgZ8OhbiB24bubaSBiaeG7g3UgaGnhu4duICJUaOG6pXAiLCB0aOG7nWkgZ2lhbiBjYW8gaMahbiAxMi4yMiB0aeG6v25nIG5nw6B5IMSRxrDhu6NjIGfDoW4gduG7m2kgYmnhu4N1IGhp4buHbiAiQ2FvIi4NCg0KYGBge3J9DQpkZiRkdXJhdGlvbl9sZXZlbCA8LSBjdXQoZGYkZHVyYXRpb24sIGJyZWFrcyA9IGMoMCwgMTIuMjIsIDUwKSwgbGFiZWxzID0gYygiVGjhuqVwIiwgIkNhbyIpKQ0Kc3RyKGRmJGR1cmF0aW9uX2xldmVsKQ0Kc3VtbWFyeShkZiRkdXJhdGlvbl9sZXZlbCkNCmBgYA0KDQoNCiMgKipUaOG7kW5nIGvDqiBtw7QgdOG6oyAxIGJp4bq/bioqDQoNClRyb25nIHBo4bqnbiBuw6B5LCBjaMO6bmcgdMO0aSB0aOG7sWMgaGnhu4duIHRo4buRbmcga8OqIG3DtCB04bqjIGNobyBk4buvIGxp4buHdSBiYW8gZ+G7k20gZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaCB2w6AgZOG7ryBsaeG7h3UgxJHhu4tuaCBsxrDhu6NuZy4gxJDhu5FpIHbhu5tpIGThu68gbGnhu4d1IMSR4buLbmggdMOtbmgsIHRo4buxYyBoaeG7h24gbOG6rXAgYuG6o25nIHThuqduIHPhu5EsIGLhuqNuZyB04bqnbiBzdeG6pXQgdsOgIHbhur0gxJHhu5MgdGjhu4suIMSQ4buRaSB24bubaSBk4buvIGxp4buHdSDEkeG7i25oIGzGsOG7o25nLCB0aOG7sWMgaGnhu4duIHRo4buRbmcga8OqIGPDoWMgxJHhurdjIHRyxrBuZyDEkW8gbMaw4budbmcuDQoNCiMjICoqVGjhu5FuZyBrw6ogbcO0IHThuqMgYmnhur9uIMSR4buLbmggdMOtbmgqKg0KDQojIyMgKipUaOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gY2xhc3MqKg0KDQrEkOG6p3UgdGnDqm4sIHRo4buxYyBoaeG7h24gdGjhu5FuZyBrw6ogbcO0IHThuqMgY2hvIGJp4bq/biBDbGFzcyB0aOG7gyBoaeG7h24gaOG6oW5nIHbDqSBtw6Aga2jDoWNoIGjDoG5nIGzhu7FhIGNo4buNbi4gQmFvIGfhu5NtIGhhaSBiaeG7g3UgaGnhu4duIGzDoCBo4bqhbmcgZ2jhur8gcGjhu5UgdGjDtG5nIHbDoCBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhLiDEkMOieSBjxaluZyBjaMOtbmggbMOgIGJp4bq/biDEkcaw4bujYyBnaeG6o2kgdGjDrWNoIHRyb25nIGLDoGkgbmdoacOqbiBj4bupdS4NCg0KYGBge3J9DQp0bXAgPC0gdGFibGUoZGYkY2xhc3MpDQphZGRtYXJnaW5zKHRtcCkNCnJvdW5kKCh0YWJsZShkZiRjbGFzcykvc3VtKHRhYmxlKGRmJGNsYXNzKSkqMTAwKSwyKQ0KZGYgJT4lIGdncGxvdChtYXAgPSBhZXMoeD1mY3RfaW5mcmVxKGNsYXNzKSwgeT0gYWZ0ZXJfc3RhdChjb3VudCkpKStnZW9tX2JhcihmaWxsID0gJ3NreWJsdWUnKStnZW9tX3RleHQoYWVzKGxhYmVsPXBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudC9zdW0oY291bnQpKSxhY2N1cmFjeSA9IC4wMSkpLCBzdGF0ID0gJ2NvdW50JywgY29sb3IgPSAnYmxhY2snLHZqdXN0ID0gMikgKyBsYWJzKHggPSAnSOG6oW5nIGdo4bq/Jyx5PSJz4buRIGzGsOG7o25nIiwgdGl0bGU9IlBow6JuIGNoaWEgc+G7kSBsxrDhu6NuZyB2w6kgdGhlbyB04burbmcgaOG6oW5nIGdo4bq/IikrdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KVHJvbmcgc+G7kSAzMDAxNTMgdsOpIG3DoXkgYmF5Og0KDQotIFPhu5EgbmfGsOG7nWkgxJHhurd0IGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgY8OzIDIwNjY2NiB2w6ksIGNoaeG6v20gNjgsODUlDQoNCi0gU+G7kSBuZ8aw4budaSDEkeG6t3QgaOG6oW5nIGdo4bq/IHRoxrDGoW5nIGdpYSBjw7MgOTM0ODcgdsOpLCBjaGnhur9tIDMxLDE1JQ0KDQpOaMawIHbhuq15LCBz4buRIG5nxrDhu51pIMSR4bq3dCB2w6kgaOG6oW5nIGdo4bq/IHBo4buVIHRow7RuZyBuaGnhu4F1IGjGoW4gMTEzMTc5IChLaG/huqNuZyAzNyw3MSUpIHNvIHbhu5tpIHPhu5EgbmfGsOG7nWkgc+G7nyBo4buvdSB2w6kgbMOgIGjhuqFuZyBnaOG6vyB0aMawxqFuZyBnaWEuDQoNCiMjIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biBhaXJsaW5lKioNCg0KQmnhur9uIGFpcmxpbmUgbMOgIGJp4bq/biDEkeG6oWkgZGnhu4duIGNobyBjw6FjIGjDo25nIGjDoG5nIGtow7RuZy4gQ8OzIDYgaMOjbmcgaMOgbmcga2jDtG5nIHRyb25nIGLDoGkgbmdoacOqbiBj4bupdSBuw6B5Lg0KDQpgYGB7cn0NCnRtcDEgPC0gdGFibGUoZGYkYWlybGluZSkNCmFkZG1hcmdpbnModG1wMSkNCmBgYA0KDQoNCmBgYHtyfQ0Kcm91bmQoKHRhYmxlKGRmJGFpcmxpbmUpL3N1bSh0YWJsZShkZiRhaXJsaW5lKSkqMTAwKSwyKQ0KZGYgJT4lIGdncGxvdChtYXAgPSBhZXMoeD1mY3RfaW5mcmVxKGFpcmxpbmUpLCB5PSBhZnRlcl9zdGF0KGNvdW50KSkpK2dlb21fYmFyKGZpbGwgPSAnc2FsbW9uJykrZ2VvbV90ZXh0KGFlcyhsYWJlbD1wZXJjZW50KGFmdGVyX3N0YXQoY291bnQvc3VtKGNvdW50KSksYWNjdXJhY3kgPSAuMDEpKSwgc3RhdCA9ICdjb3VudCcsIGNvbG9yID0gJ2JsYWNrJyx2anVzdCA9IDEpICsgbGFicyh4ID0gJ0jDo25nIGjDoG5nIGtow7RuZycseT0ic+G7kSBsxrDhu6NuZyIsIHRpdGxlPSJQaMOibiBjaGlhIHPhu5EgbMaw4bujbmcgdsOpIHRoZW8gdOG7q25nIGjDo25nIGjDoG5nIGtow7RuZyIpK3RoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KVGjhu5FuZyBrw6ogY2hvIHRo4bqleSB0cm9uZyBz4buRIDMwMDE1MyB2w6kgbcOheSBiYXkgxJHGsOG7o2MgYsOhbiByYSBz4bqvcCB44bq/cCB0aGVvIHRo4bupIHThu7EgdMSDbmcgZOG6p24sIHRhIGPDsyB0aOG7gyB0aOG6pXkgcuG6sW5nIGjDo25nIGjDoG5nIGtow7RuZyBWaXN0YXJhIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgdsOgIGjDo25nIFNwaWNlamV0IGNoaeG6v20gdOG7tyBs4buHIHRo4bqlcCBuaOG6pXQgY+G7pSB0aOG7gyBuaMawIHNhdToNCg0KLSBIw6NuZyBow6BuZyBraMO0bmcgVmlzdGFyYSBjw7MgMTI3ODU5IHbDqSBjaGnhur9tIHThu7cgbOG7hyBsw6AgNDIuNiUNCg0KLSBIw6NuZyBow6BuZyBraMO0bmcgQWlyX0luZGlhIGPDsyA4MDg5MiB2w6kgY2hp4bq/bSB04bu3IGzhu4cgbMOgIDI2Ljk1JQ0KDQotIEjDo25nIGjDoG5nIGtow7RuZyBJbmRpZ28gY8OzIDQzMTIwIHbDqSBjaGnhur9tIHThu7cgbOG7hyBsw6AgMTQuMzclDQoNCi0gSMOjbmcgaMOgbmcga2jDtG5nIEdPX0ZJUlNUIGPDsyAyMzE3MyB2w6kgY2hp4bq/bSB04bu3IGzhu4cgbMOgIDcuNzIlDQoNCi0gSMOjbmcgaMOgbmcga2jDtG5nIEFpckFzaWEgY8OzIDE2MDk4IHbDqSBjaGnhur9tIHThu7cgbOG7hyBsw6AgNS4zNiUNCg0KLSBIw6NuZyBow6BuZyBraMO0bmcgU3BpY2VKZXQgY8OzIDkwMTEgdsOpIGNoaeG6v20gdOG7tyBs4buHIGzDoCAzJQ0KDQojIyMgKipUaOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gc291cmNlX2NpdHkgKioNCg0KYGBge3J9DQpzb3VyY2VfZnJlcXVlbmN5IDwtIHRhYmxlKGRmJHNvdXJjZV9jaXR5KQ0KYWRkbWFyZ2lucyhzb3VyY2VfZnJlcXVlbmN5KQ0Kcm91bmQoKHRhYmxlKGRmJHNvdXJjZV9jaXR5KS9zdW0odGFibGUoZGYkc291cmNlX2NpdHkpKSoxMDApLDIpDQpkZiAlPiUgZ2dwbG90KG1hcCA9IGFlcyh4PWZjdF9pbmZyZXEoc291cmNlX2NpdHkpLCB5PWFmdGVyX3N0YXQoY291bnQpKSkrZ2VvbV9iYXIoZmlsbD0nc2t5Ymx1ZScpK2dlb21fdGV4dChhZXMobGFiZWw9cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpLGFjY3VyYWN5ID0gLjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdibGFjaycsdmp1c3QgPSAyKSArIGxhYnMoeCA9ICdUaMOgbmggcGjhu5Ega2jhu59pIGjDoG5oJywgeSA9ICdT4buRIGzGsOG7o25nJywgdGl0bGUgPSAiU+G7kSBsxrDhu6NuZyBjaHV54bq/biBiYXkgdMawxqFuZyDhu6luZyB24bubaSB04burbmcgdGjDoG5oIHBo4buRIG3DoCBjaHV54bq/biBiYXkga2jhu59pIGjDoG5oIikrdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KVHJvbmcgc+G7kSAzMDAxNTMgdGjDtG5nIHRpbiB24buBIMSRaeG7g20ga2jhu59pIGjDoG5oIGPhu6dhIGPDoWMgY2h1eeG6v24gYmF5LCB0aMOgbmggcGjhu5EgY8OzIGNodXnhur9uIGJheSBraOG7n2kgaMOgbmggbmhp4buBdSBuaOG6pXQgbMOgIERlbGhpIHbDoCB0aMOgbmggcGjhu5EgY8OzIGNodXnhur9uIGJheSBraOG7j2kgaMOgbmggw610IG5o4bqldCBsw6AgQ2hlbm5haSwgY+G7pSB0aOG7gyBuaMawIHNhdToNCg0KLSBT4buRIGzGsOG7o25nIGNodXnhur9uIGJheSDhu58gRGVsaGkgbMOgIDUyMDYxLCBjaGnhur9tIDIwLDQ0JSB04buVbmcgY2h1eeG6v24gYmF5Lg0KDQotIFPhu5EgbMaw4bujbmcgY2h1eeG6v24gYmF5IOG7nyBNdW1iYWkgbMOgIDYwODk2ICwgY2hp4bq/bSAyMCwyOSUgdOG7lW5nIHPhu5EgY2h1eeG6v24gYmF5DQoNCi0gU+G7kSBsxrDhu6NuZyBjaHV54bq/biBiYXkg4bufIEJhbmdhbG9yZSBsw6AgIDUyMDYxICwgY2hp4bq/bSAxNywzNCUgdOG7lW5nIHPhu5EgY2h1eeG6v24gYmF5DQoNCi0gU+G7kSBsxrDhu6NuZyBjaHV54bq/biBiYXkg4bufIEtvbGthdGEgbMOgIDQ2MzQ3ICwgY2hp4bq/bSAxNSw0NCUgdOG7lW5nIHPhu5EgY2h1eeG6v24gYmF5DQoNCi0gU+G7kSBsxrDhu6NuZyBjaHV54bq/biBiYXkg4bufIEh5ZGVyYWJhZCBsw6AgNDA4MDYsIGNoaeG6v20gMTMsNjAlIHThu5VuZyBz4buRIGNodXnhur9uIGJheQ0KDQotIFPhu5EgbMaw4bujbmcgY2h1eeG6v24gYmF5IOG7nyBDaGVubmFpIGzDoCAzODcwMCwgY2hp4bq/bSAxMiw4OSUgdOG7lW5nIHPhu5EgY2h1eeG6v24gYmF5Lg0KDQpOaOG6rW4geMOpdDogUXVhIGJp4buDdSDEkeG7kyBuw6B5LCBjaMO6bmcgdGEgY8OzIHRo4buDIHRo4bqleSByw7UgcsOgbmcgcuG6sW5nIERlbGhpIHbDoCBNdW1iYWkgbMOgIGhhaSB0cnVuZyB0w6JtIGjDoG5nIGtow7RuZyBs4bubbiBuaOG6pXQsIHRyb25nIGtoaSBjw6FjIHRow6BuaCBwaOG7kSBraMOhYyBuaMawIEJhbmdhbG9yZSwgS29sa2F0YSwgSHlkZXJhYmFkLCB2w6AgQ2hlbm5haSBjw7Mgc+G7kSBsxrDhu6NuZyBjaHV54bq/biBiYXkgw610IGjGoW4gxJHDoW5nIGvhu4MuDQoNCiMjIyAqKlRo4buRbmcga8OqIG3DtCB04bqjIGJp4bq/biBzdG9wcyoqDQoNCmBgYHtyfQ0KZGYkc3RvcHMgPC0gZmFjdG9yKGRmJHN0b3BzLCBsZXZlbHMgPWMoInplcm8iLCJvbmUiLCJ0d29fb3JfbW9yZSIpKQ0KDQpzdG9wc19mcmVxdWVuY3kgPC0gdGFibGUoZGYkc3RvcHMpDQphZGRtYXJnaW5zKHN0b3BzX2ZyZXF1ZW5jeSkNCnJvdW5kKCh0YWJsZShkZiRzdG9wcykvc3VtKHRhYmxlKGRmJHN0b3BzKSkqMTAwKSwyKQ0KZGYgJT4lIGdncGxvdChtYXAgPSBhZXMoeD1zdG9wcywgeT1hZnRlcl9zdGF0KGNvdW50KSkpK2dlb21fYmFyKGZpbGw9J3Zpb2xldCcpK2dlb21fdGV4dChhZXMobGFiZWw9cGVyY2VudChhZnRlcl9zdGF0KGNvdW50L3N1bShjb3VudCkpLGFjY3VyYWN5ID0gLjAxKSksIHN0YXQgPSAnY291bnQnLCBjb2xvciA9ICdibGFjaycsdmp1c3QgPSAxLjIpICsgbGFicyh4ID0gJ1Phu5EgxJFp4buDbSBk4burbmcnLCB5ID0gJ1Phu5EgbMaw4bujbmcnLCB0aXRsZSA9ICJT4buRIGzGsOG7o25nIGNodXnhur9uIGJheSB0xrDGoW5nIOG7qW5nIHbhu5tpIHPhu5EgxJFp4buDbSBk4burbmciKSt0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoNClRyb25nIHThu5VuZyBz4buRIDMwMDE1MyB0aMO0bmcgdGluIHbhu4Egc+G7kSDEkWnhu4NtIGThu6tuZyBj4bunYSBjw6FjIGNodXnhur9uIGJheQ0KDQotIMSQYSBz4buRIGtow6FjaCBow6BuZyBs4buxYSBjaOG7jW4gY2h1eeG6v24gYmF5IGPDsyAxIMSRaeG7g20gZOG7q25nIHbDoCBuw7MgY2hp4bq/bSB04bubaSA4Myw1OCUgc28gduG7m2kgdOG7lW5nIDMwMDE1MyBjaHV54bq/biBiYXkuDQoNCi0gU+G7kSBjaHV54bq/biBiYXkgY8OzIDAgxJFp4buDbSBk4burbmcgY2hp4bq/bSAxMiUuDQoNCi0gU+G7kSBjaHV54bq/biBiYXkgY8OzIDIgaG/hurdjIG5oaeG7gXUgaMahbiAyIMSRaeG7g20gZOG7q25nIGNo4buJIGNoaeG6v20gNCw0MyUuDQoNCk5o4bqtbiB4w6l0OiDEkGEgc+G7kSBow6BuaCBraMOhY2ggxrB1IHRpw6puIGzhu7FhIGNo4buNbiBjaHV54bq/biBjw7MgMSDEkWnhu4NtIGThu6tuZy4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBkbyBjw6FjIGzDvSBkbyBuaMawLCBjaHV54bq/biBiYXkgZMOgaSBuw6puIGPhuqduIHBo4bqjaSBjw7MgxJFp4buDbSBk4burbmcgxJHhu4MgaMOgbmgga2jDoWNoIG11YSB0aMOqbSBuaOG7r25nIHRo4bupIGPhuqduIHRoaeG6v3QgaG/hurdjIGtow6FjaCBow6BuZyBj4bqnbiBuZ2jhu4kgbmfGoWkgZ2nhu69hIGNodXnhur9uIGJheSwgbmjGsG5nIMSR4buDIHRp4bq/dCBraeG7h20gdGjhu51pIGdpYW4sIGdp4bqjbSB0aGnhu4N1IHLhu6dpIHJvIG3huqV0IGjDoG5oIGzDvSB2w6AgaOG6oW4gY2jhur8gcGhp4buBbiB0b8OhaSBraGkgY2h1eeG7g24gZ2nhu69hIGPDoWMgY2h1eeG6v24gYmF5IHRow6wga2jDoWNoIGjDoG5nIMSRYSBz4buRIGNo4buNbiBuaOG7r25nIGNodXnhur9uIGJheSBjw7MgMSDEkWnhu4NtIGThu6tuZyB0aGF5IHbDrCBuaOG7r25nIGNodXnhur9uIGJheSBjw7MgMiDEkWnhu4NtIGThu6tuZyBob+G6t2Mgbmhp4buBdSBoxqFuLiBDw7MgMTIlIGtow6FjaCBow6BuZyBs4buxYSBjaOG7jW4gY2h1eeG6v24gYmF5IGPDsyAwIMSRaeG7g20gZOG7q25nLCBjw7MgdGjhu4MgdsOsIGNodXnhur9uIGJheSDEkcOzIGPDsyB0aOG7nWkgZ2lhbiBkaSBjaHV54buDbiBuZ+G6r24uUuG6pXQgw610IGjDoG5oIGtow6FjaCBjaOG7jW4gY2h1eeG6v24gYmF5IGPDsyAyIGhv4bq3YyBuaGnhu4F1IGjGoW4gMiDEkWnhu4NtIGThu6tuZy4gTmjhu69uZyBjaHV54bq/biBiYXkgbsOgeSB0aMaw4budbmcga8OpbyBkw6BpIHRo4budaSBnaWFuIGRpIGNodXnhu4NuLCBjw7MgdGjhu4MgZ8OieSBt4buHdCBt4buPaSBjaG8gaMOgbmgga2jDoWNoIHbDoCB0xINuZyBraOG6oyBuxINuZyBn4bq3cCBz4buxIGPhu5EuICANCg0KIyMgKipUaOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyoqDQoNCiMjIyAqKkJp4bq/biBQcmljZSoqDQoNCkJp4bq/biBQcmljZSBsw6AgYmnhur9uIHRo4buDIGhp4buHbiBjaG8gZ2nDoSB2w6kgbcOheSBiYXkgbcOgIGtow6FjaCBow6BuZyDEkcOjIG11YSwgbMOgIG3hu5l0IGJp4bq/biDEkeG7i25oIGzGsOG7o25nLiDEkOG7gyBtw7QgdOG6oyBjaG8gYmnhur9uIG7DoHksIHRhIHRo4buxYyBoaeG7h24gdMOtbmggdG/DoW4gY8OhYyDEkeG6t2MgdHLGsG5nIMSRbyBsxrDhu51uZzoNCg0KYGBge3J9DQpzdW1tYXJ5KGRmJHByaWNlKQ0KdmFyKGRmJHByaWNlKQ0Kc2QoZGYkcHJpY2UpDQpnZ3Bsb3QoZGYsIGFlcyh4ID0gcHJpY2UpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gInNreWJsdWUiLCBjb2xvciA9ICJibHVlIiwgYWxwaGEgPSAwLjUpICsNCiAgbGFicyh4ID0gIkdpw6EgdsOpIG3DoXkgYmF5IiwgeT0iTeG6rXQgxJHhu5kiLCB0aXRsZT0iQmnhu4N1IMSR4buTIHBow6JuIHBo4buRaSBj4bunYSBnacOhIHbDqSIpK3RoZW1lX21pbmltYWwoKQ0KYGBgDQoNClThu6sga+G6v3QgcXXhuqMgdHLDqm4sIHRhIG5o4bqtbiB0aOG6pXkgcuG6sW5nOg0KDQotIEdpw6EgdsOpIHRo4bqlcCBuaOG6pXQgbMOgIDExMDUgbmfDoG4gxJHhu5NuZywgZ2nDoSB2w6kgY2FvIG5o4bqldCBsw6AgMTIzMDcxIG5nw6BuIMSR4buTbmcuIEPDsyBraG/huqNuZyBjw6FjaCBnaeG7r2EgdsOpIHRo4bqlcCBuaOG6pXQgdsOgIHbDqSBjYW8gbmjhuqV0IGzDoCBy4bqldCBs4bubbiwgY2hvIHRo4bqleSBjw7Mgc+G7sSDEkWEgZOG6oW5nIHLhuqV0IGzhu5tuIHRyb25nIGdpw6EgdsOpLg0KDQotIEPDsyAyNSUgZ2nDoSB2w6kgdGjhuqVwIGjGoW4gZ2nDoSA0NzgzIG5nw6BuIMSR4buTbmcsIGPDsyA1MCUgZ2nDoSB2w6kgdGjhuqVwIGjGoW4gZ2nDoSB0cuG7iyA3NDI1IG5nw6BuIMSR4buTbmcsIGPDsyA3NSUgZ2nDoSB2w6kgdGjhuqVwIGjGoW4gNDI1MjEgbmfDoG4gxJHhu5NuZy4gUGjDom4gcGjhu5FpIGdpw6EgdsOpIGzhu4djaCwgcGjhuqduIGzhu5tuIGdpw6EgdsOpIG7hurFtIGTGsOG7m2kgbeG7qWMgNDI1MjEgbmfDoG4gxJHhu5NuZy4NCg0KLSBN4bupYyB0cnVuZyBiw6xuaCBj4bunYSBnacOhIHbDqSBsw6AgMjA4OTAgbmfDoG4gxJHhu5NuZywgY2FvIGjGoW4gZ2nDoSB0cuG7iyB0cnVuZyB24buLLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgY8OzIG3hu5l0IHPhu5EgZ2nDoSB0cuG7iyBy4bqldCBjYW8ga8OpbyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGzDqm4uDQoNCi0gTmjDrG4gdsOgbyBwaMawxqFuZyBzYWkgY+G7p2EgZOG7ryBsaeG7h3UsIFBoxrDGoW5nIHNhaSBs4bubbiBjaG8gdGjhuqV5IHPhu7EgYmnhur9uIHRoacOqbiBs4bubbiB0cm9uZyBk4buvIGxp4buHdS4gxJDhu5kgbOG7h2NoIGNodeG6qW4gY2FvIGPFqW5nIHBow6FuIMOhbmggc+G7sSBwaMOibiB0w6FuIGzhu5tuIHh1bmcgcXVhbmggZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaC4NCg0KIyMjICoqQmnhur9uIERheXMgTGVmdCoqDQoNCmBgYHtyfQ0Kc3VtbWFyeShkZiRkYXlzX2xlZnQpDQp2YXIoZGYkZGF5c19sZWZ0KQ0Kc2QoZGYkZGF5c19sZWZ0KQ0KYGBgDQoNClRyb25nIDMwMDUxMyBuZ8aw4budaSB0cm9uZyBraOG6o28gc8OhdCBjaG8gYmnhur90IHRow7RuZyB0aW4gduG7gSBraG/huqNuZyB0aOG7nWkgZ2lhbiB04burIGzDumMgxJHhurd0IHbDqSDEkcOpbiBsw7pjIMSR4bq3dCB2w6kgxJHhur9uIGzDumMgYmF5IG5oxrAgc2F1Og0KIA0KLSBUaOG7nWkgZ2lhbiB04burIGzDumMgxJHhurd0IHbDqSDEkeG6v24ga2hpIGJheSBj4bunYSBjw6FjIGjDoG5oIGtow6FjaCBuZ+G6r24gbmjhuqV0IGzDoCBt4buZdCBuZ8OgeSB2w6AgZMOgaSBuaOG6pXQgbMOgIDQ5IG5nw6B5Lg0KDQotIFRo4budaSBnaWFuIMSR4bq3dCB2w6kgdHLGsOG7m2MgbmfDoHkgYmF5IHRydW5nIGLDrG5oIHThu6sgY8OhYyBow6BuaCBraMOhY2gga2jhuqNvIHPDoXQgxJHGsOG7o2MgbMOgIDI2IG5nw6B5Lg0KDQotIDI1JSBuZ8aw4budaSB0cm9uZyBuaMOzbSB0csOqbiDEkeG6t3QgdsOpIHRyxrDhu5tjIG5nw6B5IGJheSAxNSBuZ8OgeSANCg0KLSA1MCUgbmfGsOG7nWkgdHJvbmcgbmjDs20ga2jhuqNvIHPDoXQgxJHhurd0IHbDqSB0csaw4bubYyBuZ8OgeSBiYXkgMjYgbmfDoHkNCg0KLSA3NSUgbmfGsOG7nWkgdHJvbmcgbmjDs20gxJHhurd0IHbDqSB0csaw4bubYyBuZ8OgeSBiYXkgMzggbmfDoHkNCg0KLSDEkOG7mSBs4buHY2ggY2h14bqpbiBj4bunYSBiaeG6v24gZGF5cy1sZWZ0IGzDoCAxMy41NjEgY2hvIGJp4bq/dCBt4bupYyDEkeG7jSBwaMOibiB0w6FuIGPhu6dhIHRo4budaSBnaWFuIHThu6sgbmfDoHkgxJHhurd0IHbDqSDEkeG6v24gbmfDoHkgYmF5IHRyb25nIG5ow7NtIG5nxrDhu51pIGto4bqjbyBzw6F0IMSRxrDhu6NjIHNvIHbhu5tpIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggbMOgIDEzLjU2MSBuZ8OgeS4NCiANCmBgYHtyfQ0KZ2dwbG90KGRmLCBhZXMoeCA9IGRheXNfbGVmdCkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAic2t5Ymx1ZSIsIGNvbG9yID0gImJsdWUiLCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHggPSAidGjhu51pIGdpYW4gxJHhurd0IHbDqSB0csaw4bubYyBjaHV54bq/biBiYXkiLHk9Ik3huq10IMSR4buZIiwgdGl0bGU9IkJp4buDdSDEkeG7kyBwaMOibiBwaOG7kWkgY+G7p2EgdGjhu51pIGdpYW4gxJHhurd0IHbDqSB0csaw4bubYyBjaHV54bq/biBiYXkiKSt0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KLSBIw6xuaCBk4bqhbmcgcGjDom4gYuG7kTogTeG6rXQgxJHhu5kgcGjDom4gYuG7kSBjw7MgeHUgaMaw4bubbmcgZ+G6p24gbmjGsCDEkeG7gXUgdOG7qyBraG/huqNuZyBuZ8OgeSB0aOG7qSAxMCDEkeG6v24gbmfDoHkgdGjhu6kgNDUgdHLGsOG7m2MgbmfDoHkgYmF5LiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBuaGnhu4F1IG5nxrDhu51pIGPDsyB4dSBoxrDhu5tuZyDEkeG6t3QgdsOpIHRyb25nIGtob+G6o25nIHRo4budaSBnaWFuIG7DoHkuDQoNCi0gxJDhurd0IHbDqSBz4bubbTogU+G7kSBuZ8aw4budaSDEkeG6t3QgdsOpIGLhuq90IMSR4bqndSB0xINuZyBt4bqhbmggdOG7qyBraG/huqNuZyBbMTsxMF0gbmfDoHkgY2hvIHRo4bqleSBDw7MgcuG6pXQgw610IG5nxrDhu51pIMSR4bq3dCB2w6kgZ+G6p24gbmfDoHkgYmF5Lg0KDQotIFBow6JuIGLhu5Eg4buVbiDEkeG7i25oOiBUcm9uZyBraG/huqNuZyB04burIDEwIG5nw6B5IMSR4bq/biA0NSBuZ8OgeSB0csaw4bubYyBuZ8OgeSBiYXksIG3huq10IMSR4buZIHBow6JuIGLhu5Eg4buVbiDEkeG7i25oLCBjaG8gdGjhuqV5IG5oaeG7gXUgbmfGsOG7nWkgY8OzIHh1IGjGsOG7m25nIMSR4bq3dCB2w6kgdHJvbmcgZ2lhaSDEkW/huqFuIG7DoHksIGPDsyB0aOG7gyBkbyDEkcOieSBsw6Aga2hv4bqjbmcgdGjhu51pIGdpYW4gdOG7kWkgxrB1IHbhu4EgZ2nDoSBj4bqjIA0KDQotIEdp4bqjbSBt4bqhbmggc2F1IG5nw6B5IDQ1OiBT4buRIG5nxrDhu51pIMSR4bq3dCB2w6kgZ2nhuqNtIGThuqduIHNhdSBraG/huqNuZyA0NSBuZ8OgeSB0csaw4bubYyBuZ8OgeSBiYXkuIEPDsyB0aOG7gyB2w6wgdmnhu4djIMSR4bq3dCB2w6kgcXXDoSB4YSB0csaw4bubYyBuZ8OgeSBiYXkgw610IHBo4buVIGJp4bq/biBob+G6t2Mgw610IG5nxrDhu51pIGPDsyBr4bq/IGhv4bqhY2ggY+G7pSB0aOG7gyB4YSDEkeG6v24gduG6rXkuDQoNCiMjIyAqKkJp4bq/biBEdXJhdGlvbioqDQogDQpgYGB7cn0NCnN1bW1hcnkoZGYkZHVyYXRpb24pDQp2YXIoZGYkZHVyYXRpb24pDQpzZChkZiRkdXJhdGlvbikNCmBgYA0KVHJvbmcgYuG7mSBk4buvIGxp4buHdSBraOG6o28gc8OhdCDEkcaw4bujYyB0YSBjw7MgdGjDtG5nIHRpbiB24buBIHRo4budaSBnaWFuIGJheSBuaMawIHNhdToNCg0KLSBDaHV54bq/biBiYXkgbmfhuq9uIG5o4bqldCBrw6lvIGTDoGkgMC44MyBnaeG7nSB0xrDGoW5nIMSRxrDGoW5nIHbhu5tpIGtob+G6o25nIDUwIHBow7p0IA0KIA0KLSBjaHV54bq/biBiYXkgZMOgaSBuaOG6pXQga8OpbyBkw6BpIDQ5LjgzIGdp4budIHTGsMahbmcgxJHGsMahbmcgduG7m2kga2hv4bqjbmcgMiBuZ8OgeSAxIGdp4budIDUwIHBow7p0DQogDQotIDI1JSBjaHV54bq/biBiYXkga8OpbyBkw6BpIHRyb25nIDYuODMgZ2nhu50NCiANCi0gNTAlIGNodXnhur9uIGJheSBrw6lvIGTDoGkgdHJuZyAxMS4yNSBnaeG7nQ0KIA0KLSA3NSUgY2h1eeG6v24gYmF5IGvDqW8gZMOgaSB0cm9uZyAxNi4xNyBnaeG7nQ0KIA0KLSBUaOG7nWkgZ2lhbiBiYXkgdHJ1bmcgYsOsbmgga2jhuqNvIHPDoXQgxJHGsOG7o2MgbMOgIDEyLjIyIGdp4budDQogDQpgYGB7cn0NCmdncGxvdChkZiwgYWVzKHggPSBkdXJhdGlvbikpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAic2t5Ymx1ZSIsIGNvbG9yID0gImJsdWUiLCBhbHBoYSA9IDAuNSkgKw0KICBsYWJzKHggPSAidGjhu51pIGdpYW4gYmF5IikrdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KIA0KKipOaOG6rW4geMOpdCoqDQoNCi0gxJDhu4luaCBjYW8gbmdheSBzw6F0IGfhuqduIDA6IEPDsyBt4buZdCDEkeG7iW5oIHLhuqV0IGNhbyDhu58ga2hv4bqjbmcgdGjhu51pIGdpYW4gbmfhuq9uIG5o4bqldCwgY2hvIHRo4bqleSBy4bqxbmcgcGjhuqduIGzhu5tuIGPDoWMgY2h1eeG6v24gYmF5IGvDqW8gZMOgaSBy4bqldCBuZ+G6r24sIGPDsyB0aOG7gyBsw6AgY8OhYyBjaHV54bq/biBiYXkgbuG7mWkgxJHhu4thIGhv4bq3YyBjw6FjIGNodXnhur9uIGJheSBjaOG7iSBrw6lvIGTDoGkga2hv4bqjbmcgMi0zIGdp4budLg0KDQotIEdp4bqjbSBk4bqnbiBzYXUgxJHhu4luaCDEkeG6p3UgdGnDqm46IFNhdSDEkeG7iW5oIGNhbyBiYW4gxJHhuqd1LCBt4bqtdCDEkeG7mSBnaeG6o20gZOG6p24gbmjGsG5nIHbhuqtuIGPDsyBuaOG7r25nIMSR4buJbmggY2FvIGtow6FjIHRyb25nIGtob+G6o25nIHThu6sgNiDEkeG6v24gMTIgZ2nhu50uIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgYmnhu4N1IGhp4buHbiBjaG8gY8OhYyBjaHV54bq/biBiYXkgbuG7mWkgxJHhu4thIGTDoGkgaMahbiBob+G6t2MgY8OhYyBjaHV54bq/biBiYXkgcXXhu5FjIHThur8gbmfhuq9uLg0KDQotIMSQ4buJbmggbmjhu48ga2hv4bqjbmcgdOG7qyAxNCDEkeG6v24gMjAgZ2nhu506IEPDsyBt4buZdCDEkeG7iW5oIG5o4buPIHThu6sga2hv4bqjbmcgdGjhu51pIGdpYW4gMTQgxJHhur9uIDIwIGdp4budLCBjaG8gdGjhuqV5IGPDsyBt4buZdCBz4buRIGNodXnhur9uIGJheSBrw6lvIGTDoGkgdHJvbmcga2hv4bqjbmcgdGjhu51pIGdpYW4gbsOgeSwgY8OzIHRo4buDIGzDoCBjw6FjIGNodXnhur9uIGJheSBxdeG7kWMgdOG6vyBkw6BpLg0KDQotIEdp4bqjbSBt4bqhbmggc2F1IDIwIGdp4budOiBTYXUga2hv4bqjbmcgMjAgZ2nhu50sIG3huq10IMSR4buZIGdp4bqjbSDEkcOhbmcga+G7gywgY2hvIHRo4bqleSBy4bqldCDDrXQgY2h1eeG6v24gYmF5IGvDqW8gZMOgaSBoxqFuIDIwIGdp4budLiDEkGnhu4F1IG7DoHkgaOG7o3AgbMO9IHbDrCBo4bqndSBo4bq/dCBjw6FjIGNodXnhur9uIGJheSBxdeG7kWMgdOG6vyBkw6BpIG5o4bqldCB0aMaw4budbmcga2jDtG5nIGvDqW8gZMOgaSBoxqFuIGtob+G6o25nIHRo4budaSBnaWFuIG7DoHkuDQoNCi0gR+G6p24gbmjGsCBraMO0bmcgY8OzIGNodXnhur9uIGJheSBrw6lvIGTDoGkgaMahbiAzMCBnaeG7nTogVOG7qyBraG/huqNuZyAzMCBnaeG7nSB0cuG7nyDEkWksIG3huq10IMSR4buZIGdp4bqjbSB4deG7kW5nIGfhuqduIGLhurFuZyAwLCBjaG8gdGjhuqV5IHLhuqV0IMOtdCBob+G6t2Mga2jDtG5nIGPDsyBjaHV54bq/biBiYXkgbsOgbyBrw6lvIGTDoGkgaMahbiBraG/huqNuZyB0aOG7nWkgZ2lhbiBuw6B5LiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIGJhbyBn4buTbSBjw6FjIGNodXnhur9uIGJheSBjw7Mgbmhp4buBdSDEkWnhu4NtIGThu6tuZyBob+G6t2MgY8OhYyBow6BuaCB0csOsbmggxJHhurdjIGJp4buHdC4NCg0KPT4gVMOzbSBs4bqhaSwgYmnhu4N1IMSR4buTIG7DoHkgY2hvIHRo4bqleSBo4bqndSBo4bq/dCBjw6FjIGNodXnhur9uIGJheSBrw6lvIGTDoGkgZMaw4bubaSAxMCBnaeG7nSwgduG7m2kgcGjhuqduIGzhu5tuIGPDoWMgY2h1eeG6v24gYmF5IHLhuqV0IG5n4bqvbi4gQ8OzIG3hu5l0IHPhu5Egw610IGNodXnhur9uIGJheSBrw6lvIGTDoGkgdOG7qyAxMCDEkeG6v24gMjAgZ2nhu50sIHbDoCBy4bqldCBoaeG6v20gY8OzIGNodXnhur9uIGJheSBrw6lvIGTDoGkgaMahbiAyMCBnaeG7nS4NCg0KDQojICoqVGjhu5FuZyBrw6ogbcO0IHThuqMgMiBiaeG6v24qKg0KDQojIyAqKkJp4bq/biBDbGFzcyB2w6AgYmnhur9uIGFpcmxpbmUqKg0KDQpgYGB7cn0NCmFkZG1hcmdpbnModGFibGUoZGYkY2xhc3MsIGRmJGFpcmxpbmUpKQ0KDQpwcm9wLnRhYmxlKHRhYmxlKGRmJGNsYXNzLCBkZiRhaXJsaW5lKSkNCg0KcHJvcC50YWJsZSh0YWJsZShkZiRjbGFzcywgZGYkYWlybGluZSksbWFyZ2luID0gMikNCg0KYGBgDQoNCmBgYHtyfQ0KZGYgJT4lIGdncGxvdChhZXMoeCA9IGZjdF9pbmZyZXEoYWlybGluZSksIGZpbGwgPSBjbGFzcykpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudCAvIHN1bShjb3VudCkpLCBhY2N1cmFjeSA9IDAuMDEpKSwgDQogICAgICAgICAgICBzdGF0ID0gImNvdW50IiwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIA0KICAgICAgICAgICAgY29sb3IgPSAnYmxhY2snKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkVjb25vbXkiID0gInNreWJsdWUiLCAiQnVzaW5lc3MiID0gImJyb3duIikpICsgbGFicyggZmlsbCA9ICdI4bqhbmcgdsOpJyx0aXRsZSA9ICJT4buRIGzGsOG7o25nIGNodXnhur9uIGJheSBjw7MgcXXDoSBj4bqjbmgg4bufIGPDoWMgaOG6oW5nIHbDqSIpICsgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KTmjDrG4gdsOgbyBi4bqjbmcgdsOgIMSR4buTIHRo4buLIHPhu5EgbMaw4bujbmcgY2h1eeG6v24gYmF5IGPhu6dhIGPDoWMgaMOjbmcgaMOgbmcga2jDtG5nIHRoZW8gaOG6oW5nIGdo4bq/LCBjaMO6bmcgdGEgY8OzIHRo4buDIMSRxrBhIHJhIG3hu5l0IHPhu5Egbmjhuq1uIHjDqXQ6DQoNCi0gVmlzdGFyYTogQ2hp4bq/bSB04buJIGzhu4cgY2FvIG5o4bqldCB0cm9uZyBo4bqhbmcgQnVzaW5lc3MgKGNoaeG6v20gMjAuMTklIHRyw6puIHThu5VuZyBz4buRIHbDqSkgdsOgIGPFqW5nIGPDsyB04buJIGzhu4cgY2FvIG5o4bqldCB0cm9uZyBo4bqhbmcgRWNvbm9teSAoMjIuNDElKS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgVmlzdGFyYSBjw7Mgc+G7sSBwaMOibiBwaOG7kWkgxJHhu4F1IGjGoW4gZ2nhu69hIGhhaSBo4bqhbmcgZ2jhur8gc28gduG7m2kgY8OhYyDEkeG7kWkgdGjhu6cga2jDoWMuDQoNCi0gQWlyX0luZGlhOiBDaGnhur9tIHThu4kgbOG7hyBjYW8gdGjhu6kgaGFpIHRyb25nIGjhuqFuZyBCdXNpbmVzcyAoMTAuOTYlIHRyw6puIHThu5VuZyBz4buRIHbDqSksIG5oxrBuZyBjaOG7iSBjaGnhur9tIHThu4kgbOG7hyBjYW8gdGjhu6kgaGFpIHRyb25nIGjhuqFuZyBFY29ub215ICgxNS45OSUpLg0KDQotIEFpckFzaWEgdsOgIEdPX0ZJUlNULCBJbmRpZ28gdsOgIFNwaWNlSmV0OiBLaMO0bmcgxJHGsOG7o2Mga2jDoWNoIGjDoG5nIMawYSBjaHXhu5luZyBjaG8gaOG6oW5nIEJ1c2luZXNzLCBjaOG7iSBjw7MgdHJvbmcgaOG6oW5nIEVjb25vbXkuIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgY2hvIHRo4bqleSBjw6FjIGjDo25nIG7DoHkgY2jhu6cgeeG6v3UgY3VuZyBj4bqlcCBk4buLY2ggduG7pSBFY29ub215IHbDoCDDrXQgxJHGsOG7o2MgbmfGsOG7nWkgZMO5bmcgY2jhu41uIGzhu7FhIHRyb25nIGjhuqFuZyBnaOG6vyBjYW8gY+G6pXAgaMahbi4NCg0KDQojIyAqKkJp4bq/biBDbGFzcyB2w6Agc291cmNlX2NpdHkqKg0KDQpgYGB7cn0NCmNsYXNzX3NvdXJjZSA8LSB0YWJsZShkZiRjbGFzcyxkZiRzb3VyY2VfY2l0eSkNCmFkZG1hcmdpbnMoY2xhc3Nfc291cmNlKQ0KDQpkZiAlPiUgZ2dwbG90KGFlcyh4ID0gZmN0X2luZnJlcShzb3VyY2VfY2l0eSksIGZpbGwgPSBjbGFzcykpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudCAvIHN1bShjb3VudCkpLCBhY2N1cmFjeSA9IDAuMDEpKSwgDQogICAgICAgICAgICBzdGF0ID0gImNvdW50IiwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIA0KICAgICAgICAgICAgY29sb3IgPSAnYmxhY2snKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkVjb25vbXkiID0gInNreWJsdWUiLCAiQnVzaW5lc3MiID0gImJyb3duIikpICsgbGFicyh4ID0gJ1Row6BuaCBwaOG7kScsIHkgPSAnU+G7kSBsxrDhu6NuZycsIGZpbGwgPSAnSOG6oW5nIHbDqScsDQogICAgICAgdGl0bGUgPSAiU+G7kSBsxrDhu6NuZyBjaHV54bq/biBiYXkgdMawxqFuZyDhu6luZyB24bubaSBo4bqhbmcgdsOpIHbDoCB0aMOgbmggcGjhu5EgeHXhuqV0IHBow6F0IikgKyB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNClRyb25nIHThu5VuZyBz4buRIDMwMDE1MyBxdWFuIHPDoXQNCg0KLSDEkOG7kWkgduG7m2kgNjEzNDMgY2h1eeG6v24gYmF5IGto4bufaSBow6BuaCDhu58gRGVsaGksIGPDsyAxODMxNiBow6BuaCBraMOhY2ggY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhLCBjaGnhur9tIDYsMSUgc28gduG7m2kgdOG7lW5nIGNodXnhur9uIGJheQ0KDQotIMSQ4buRaSB24bubaSA2MDg5NiBjaHV54bq/biBiYXkga2jhu59pIGjDoG5oIOG7nyBNdW1iYWksIGPDsyAxOTg1OCBow6BuZyBraMOhY2ggY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhLCBjaGnhur9tIDYsNjIlIHNvIHbhu5tpIHThu5VuZyBjaHV54bq/biBiYXkNCg0KLSDEkOG7kWkgduG7m2kgNTIwNjEgY2h1eeG6v24gYmF5IGto4bufaSBow6BuaCDhu58gQmFuZ2Fsb3JlLCBjw7MgMTY0NDEgaMOgbmgga2jDoWNoIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSxjaGnhur9tIDUsNDglIHNvIHbhu5tpIHThu5VuZyBjaHV54bq/biBiYXkNCg0KLSDEkOG7kWkgduG7m2kgNDYzNDcgY2h1eeG6v24gYmF5IGto4bufaSBow6BuaCDhu58gS29sa2F0YSwgY8OzIDEzNDczIGjDoG5oIGtow6FjaCBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEsIGNoaeG6v20gNCw0OSUgc28gduG7m2kgdOG7lW5nIGNodXnhur9uIGJheQ0KDQotIMSQ4buRaSB24bubaSA0MDgwNiBjaHV54bq/biBiYXkga2jhu59pIGjDoG5oIOG7nyBIeWRlcmFiYWQsIGPDsyAxMjg3MCBow6BuaCBraMOhY2ggY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhLCBjaGnhur9tIDQsMjklIHNvIHbhu5tpIHThu5VuZyBjaHV54bq/biBiYXkNCg0KLSDEkOG7kWkgduG7m2kgMzg3MDAgY2h1eeG6v24gYmF5IGto4bufaSBow6BuaCDhu58gQ2hlbm5haSwgY8OzIDEyNTI5IGjDoG5oIGtow6FjaCBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEsY2hp4bq/bSA0LDE3JSBzbyB24bubaSB04buVbmcgY2h1eeG6v24gYmF5DQoNCk5o4bqtbiB4w6l0OiBOaMOsbiB2w6BvIGvhur90IHF14bqjIHRyw6puIHRhIHRo4bqleSwgbeG6t2MgZMO5IERlbGhpIGzDoCB0aMOgbmggcGjhu5EgY8OzIG5oaeG7gXUgY2h1eeG6v24gYmF5IGto4bufaSBow6BuaCBuaOG6pXQsIHR1eSBuaGnDqm4gTXVtYmFpIGzDoCB0aMOgbmggcGjhu5EgY8OzIG5oaeG7gXUgaMOgbmgga2jDoWNoIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBuaOG6pXQgKGNoaeG6v20gNiw2MiUgc28gduG7m2kgdOG7lW5nIGNodXnhur9uIGJheSkuIFPhu5EgbGnhu4d1IHRyw6puIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgcsO1IHLhu4d0IHRyb25nIGjDoG5oIHZpIGNo4buNbiBo4bqhbmcgdsOpIGPhu6dhIGjDoG5oIGtow6FjaCB04bqhaSBjw6FjIHRow6BuaCBwaOG7kSBraMOhYyBuaGF1LiBDw6FjIHRow6BuaCBwaOG7kSBs4bubbiBuaMawIERlbGhpIHbDoCBNdW1iYWkgY8OzIHThu7cgbOG7hyBow6BuaCBraMOhY2ggY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGNhbyBoxqFuIHNvIHbhu5tpIGPDoWMgdGjDoG5oIHBo4buRIG5o4buPIGjGoW4uIA0KDQojIyAqKkJp4bq/biBDbGFzcyB2w6AgZHVyYXRpb24gKioNCg0KYGBge3J9DQpkZiAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhc3MgLCB5ID0gZHVyYXRpb24pKSArDQogICBnZW9tX2JveHBsb3QoZmlsbCA9ICJsaWdodGJsdWUiLCBjb2xvciA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnMoeCA9ICJI4bqhbmcgdsOpIiwgeSA9ICJUaOG7nWkgZ2lhbiBj4bunYSBjaHV54bq/biBiYXkiLCB0aXRsZSA9ICJT4buxIHBow6JuIGLhu5EgdGjhu51pIGdpYW4gY+G7p2EgY2h1eeG6v24gYmF5IHRoZW8gdOG7q25nIGjhuqFuZyB2w6kiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCg0KTmjhuq1uIHjDqXQ6IE5ow6xuIHbDoG8gxJHhu5MgdGjhu4sgdGEgdGjhuqV5LCDEkeG7kWkgduG7m2kgaOG6oW5nIGdo4bq/IHRoxrDGoW5nIGdpYSwga2hv4bqjbmcgdGjhu51pIGdpYW4gZGkgY2h1eeG7g24gY+G7p2EgY2h1eeG6v24gYmF5IGNo4bunIHnhur91IGdpYW8gxJHhu5luZyB04burIGtob+G6o25nIDgtMThoLiDEkOG7kWkgduG7m2kgaOG6oW5nIGdo4bq/IHBo4buVIHRow7RuZywga2hv4bqjbmcgdGjhu51pIGdpYW4gZGkgY2h1eeG7g24gY+G7p2EgY2h1eeG6v24gYmF5IGNo4bunIHnhur91IGdpYW8gxJHhu5luZyDhu58ga2hv4bqjbmcgMmgtMTZoLiBUYSBuaOG6rW4gcmEga2hv4bqjbmcgdGjhu51pIGdpYW4gZGkgY2h1eeG7g24gY+G7p2EgY2h1eeG6v24gYmF5IMSR4buRaSB24bubaSBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhIHBow6JuIGLhu5Ug4bufIGtob+G6o25nIGNhbyBoxqFuIHNvIHbhu5tpIHRo4budaSBnaWFuIGRpIGNodXnhu4NuIGPhu6dhIGNodXnhur9uIGJheSDEkeG7kWkgduG7m2kgaOG6oW5nIGdo4bq/IHBo4buVIHRow7RuZy4gxJBp4buBdSBuw6B5IG5ndXnDqm4gbmjDom4gY8OzIHRo4buDIGRvIMSR4buRaSB24bubaSBjw6FjIGNodXnhur9uIGJheSBjw6BuZyBkw6BpIHRow6wga2jDoWNoIGjDoG5nIHPhur0gY8OzIHh1IGjGsOG7m25nIGNo4buNbiBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhLiDhu54gY+G6oyAyIGjhuqFuZyBnaOG6vyB0aMawxqFuZyBnaWEgdsOgIGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgxJHhu4F1IGPDsyB4deG6pXQgaGnhu4duIG3hu5l0IHPhu5EgY2h1eeG6v24gYmF5IGPDsyBraG/huqNuZyB0aOG7nWkgZ2lhbiBkaSBjaHV54buDbiBjYW8gKGdpYW8gxJHhu5luZyB04burIDMwaCAtIDUwaCkuDQoNCiMjICoqQmnhur9uIGNsYXNzIHbDoCBzdG9wc19hbnMqKg0KDQpgYGB7cn0NCmRmJHN0b3BfYW5zIDwtIGlmZWxzZShkZiRzdG9wcyA9PSAiemVybyIsICJubyIsICJ5ZXMiKQ0KYWRkbWFyZ2lucyh0YWJsZShkZiRzdG9wX2FucyxkZiRjbGFzcykpDQpwcm9wLnRhYmxlKHRhYmxlKGRmJHN0b3BfYW5zLGRmJGNsYXNzKSxtYXJnaW49MikqMTAwDQpwcm9wLnRhYmxlKHRhYmxlKGRmJHN0b3BfYW5zLGRmJGNsYXNzKSkqMTAwDQpgYGANCiBUcm9uZyBi4buZIGThu68gbGnhu4d1IHRodSB0aOG6rXAgxJHGsOG7o2MgdGEgbeG7mXQgc+G7kSB0aMO0bmcgdGluIHbhu4Egdmnhu4djIHF1w6EgY+G6o25oIOG7nyBjw6FjIGjDoG5oIGtow6FjaCBuaMawIHNhdToNCiANCi0gQ8OzIDkzNDg3IGjDoG5oIGtow6FjaCBjw7MgdsOpIGjhuqFuZyB0aMawxqFuZyBnaWEgY2hp4bq/bSBraG/huqNuZyBoxqFuIDMxJSBz4buRIGzGsOG7o25nIGjDoG5oIGtow6FjaCB0cm9uZyB04bqtcCBk4buvIGxp4buHdS4gVHJvbmcgxJHDsyBjw7MgxJHhur9uIGjGoW4gOTEuMzMlIHPhu5EgaMOgbmgga2jDoWNoIGPDsyB2w6kgaOG6oW5nIHRoxrDGoW5nIGdpYSBjw7MgY2h1eeG6v24gYmF5IHF1w6EgY+G6o25oIHThuqFpIMOtdCBuaOG6pXQgbeG7mXQgxJFp4buDbSBk4burbmcsY2hp4bq/bSBraG/huqNuZyAyOCw0NCUgdHLDqm4gdOG7lW5nIHPhu5EgaMOgbmgga2jDoWNoLiBOaOG7r25nIGjDoG5oIGtow6FjaCDhu58gaOG6oW5nIHbDqSBuw6B5IG5oxrBuZyBraMO0bmcgcXXDoSBj4bqjbmggY2jhu4kgY2hp4bq/bSA4LjY2JSBsxrDhu6NuZyBow6BuaCBraMOhY2gg4bufIGPDuW5nIGjhuqFuZyB2w6kuDQotIEPDsyDEkeG6v24gMjA2NjY2IGjDoG5oIGtow6FjaCBjw7MgY2h1eeG6v24gYmF5IGjhuqFuZyBwaOG7lSB0aMO0bmcsIHRyb25nIMSRw7MgY8OzIGtob+G6o25nIDg2LjUlIGjDoG5oIGtow6FjaCDhu58gaOG6oW5nIHbDqSBuw6B5IGPDsyBxdcOhIGPhuqNuaCB04bqhaSDDrXQgbmjhuqV0IG3hu5l0IMSRaeG7g20gZOG7q25nIHbDoCBjaGnhur9tIGtob+G6o25nIDU5LjU2JSB0csOqbiB04buVbmcgaMOgbmgga2jDoWNoIGPDsyB0cm9uZyBkYW5oIHPDoWNoLiBOZ2/DoGkgcmEgc+G7kSBow6BuaCBraMOhY2gga2jDtG5nIHF1w6EgY+G6o25oIOG7nyBo4bqhbmcgdsOpIG7DoHkgY2hp4bq/bSBraG/huqNuZyA5LjMlIGzGsOG7o25nIGtow6FjaCBow6BuZyB0cm9uZyBi4buZIGThu68gbGnhu4d1Lg0KDQo9PiDEkGEgcGjhuqduIGzDoCBuaOG7r25nIGjDoG5oIGtow6FjaCBjw7MgY8OhYyBjaHV54bq/biBiYXkgcXXDoSBj4bqjbmgsIHRyb25nIMSRw7MgY8OhYyBow6BuaCBraMOhY2ggY8OzIHF1w6EgY+G6o25oIOG7nyBo4bqhbmcgcGjhu5UgdGjDtG5nIHBo4buVIGJp4bq/biBoxqFuIGPhuqMuDQoNCg0KDQpgYGB7cn0NCmRmICU+JSBnZ3Bsb3QoYWVzKHggPSBmY3RfaW5mcmVxKHN0b3BfYW5zKSwgZmlsbCA9IGNsYXNzKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHNjYWxlczo6cGVyY2VudChhZnRlcl9zdGF0KGNvdW50IC8gc3VtKGNvdW50KSksIGFjY3VyYWN5ID0gMC4wMSkpLCANCiAgICAgICAgICAgIHN0YXQgPSAiY291bnQiLCANCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTAuNSwgDQogICAgICAgICAgICBjb2xvciA9ICdibGFjaycpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiRWNvbm9teSIgPSAic2t5Ymx1ZSIsICJCdXNpbmVzcyIgPSAiYnJvd24iKSkgKyBsYWJzKCBmaWxsID0gJ0jhuqFuZyB2w6knLHRpdGxlID0gIlPhu5EgbMaw4bujbmcgY2h1eeG6v24gYmF5IGPDsyBxdcOhIGPhuqNuaCDhu58gY8OhYyBo4bqhbmcgdsOpIikgKyB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQoNCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gQ2h1eeG6v24gYmF5IGPDsyBxdcOhIGPhuqNuaCBwaOG7lSBiaeG6v24gaMahbjogVOG7tyBs4buHIGNodXnhur9uIGJheSBjw7MgcXXDoSBj4bqjbmggY2FvIGjGoW4gdOG7tyBs4buHIGNodXnhur9uIGJheSBraMO0bmcgcXXDoSBj4bqjbmgg4bufIGPhuqMgaGFpIGjhuqFuZyB2w6kuDQotIEjhuqFuZyB2w6kgcGjhu5UgdGjDtG5nIHBo4buVIGJp4bq/biBoxqFuOiBT4buRIGzGsOG7o25nIGNodXnhur9uIGJheSBo4bqhbmcgcGjhu5UgdGjDtG5nIGNhbyBoxqFuIG5oaeG7gXUgc28gduG7m2kgc+G7kSBsxrDhu6NuZyBjaHV54bq/biBiYXkgaOG6oW5nIHRoxrDGoW5nIGdpYS4NCi0gVmnhu4djIGNow6puaCBs4buHY2ggdHJvbmcgc+G7kSBsxrDhu6NuZyBow6BuaCBraMOhY2gg4bufIGjhuqFuZyB0aMawxqFuZyBnaWEgdsOgIGjhuqFuZyBwaOG7lSB0aMO0bmcgY8WpbmcgbmjGsCBjw7MgcXXDoSBj4bqjbmggdsOgIGtow7RuZyBxdcOhIGPhuqNuaCBjw7MgdGjhu4MgZ2nhuqNpIHRow61jaCBi4bqxbmcgbmh1IGPhuqd1IHbhu4EgdsOpIGdpw6EgcuG6uyDhu58ga2jDoWNoIGjDoG5nLg0KIA0KIyMjIFJlbGF0aXZlIFJpc2sgDQogDQpgYGB7cn0NCg0KZGYkc3RvcF9hbnMgPC0gZmFjdG9yKGRmJHN0b3BfYW5zLCBsZXZlbHMgPSBjKCJ5ZXMiLCAibm8iKSkgICANCmNscyA8LSB0YWJsZShkZiRzdG9wX2FucyxkZiRjbGFzcykNClJlbFJpc2soY2xzKQ0KYWRkbWFyZ2lucyhjbHMpDQpgYGANCg0KVuG7m2kgUlIgPSAxLjQzNjQ1MiwgY2hvIHRo4bqleSBy4bqxbmcgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIOG7nyBuaOG7r25nIGNodXnhur9uIGJheSBjw7MgcXXDoSBj4bqjbmggZ+G6pXAgMS40MzY0NTIgbOG6p24geMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIOG7nyBuaOG7r25nIGNodXnhur9uIGJheSBraMO0bmcgY8OzIHF1w6EgY+G6o25oLg0KDQojIyMgT2RkUmF0aW8NCmBgYHtyfQ0KDQpPZGRzUmF0aW8oY2xzKQ0KDQpgYGANCiANCk9SID0gMS42NDQ5MTkgY2hvIHRo4bqleSBy4bqxbmcgT2RkcyBj4bunYSBuaOG7r25nIGNodXnhur9uIGJheSBjw7MgcXXDoSBj4bqjbmggZ+G6pXAgMS42NDQ5MTkgbOG6p24gb2RkcyBj4bunYSBuaOG7r25nIGNodXnhur9uIGJheSBraMO0bmcgY8OzIHF1w6EgY+G6o25oLiDEkGnhu4F1IG7DoHkgY8OzIHRo4buDIHBo4bqjbiDDoW5oIHh1IGjGsOG7m25nIGPhu6dhIGtow6FjaCBow6BuZyBraGkgaOG7jSDEkeG6t3QgdsOpLCBjw7MgdGjhu4MgZG8gY8OhYyB54bq/dSB04buRIG5oxrAgc+G7sSB0aG/huqNpIG3DoWkgaMahbiB0cm9uZyBow6BuaCB0csOsbmggY8OzIHF1w6EgY+G6o25oIHbhu5tpIG5o4buvbmcgY2h1eeG6v24gYmF5IG7DoHkgdGjGsOG7nW5nIGNvIHRo4budaSBnaWFuIGJheSBkw6BpLg0KKFRyb25nIMSRw7Mgb2RkcyBsw6AgeMOhYyBzdeG6pXQgY+G7p2EgaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgdHLDqm4geMOhYyBzdeG6pXQgY+G7p2EgaOG6oW5nIHbDqSBwaOG7lSBwaMO0bmcpDQoNCiMjICoqQmnhur9uIGNsYXNzIHbDoCBkYXlfbGVmdCoqDQoNCmBgYHtyfQ0KZGF5PC0gY3V0KGRmJGRheXNfbGVmdCxicmVha3MgPSBjKDAsMTAuNSwzMC41LDUwKSxsYWJlbD1jKCd0cuG7hScsJ3bhu6thJywnc+G7m20nKSkNCmRmPC1kZiU+JW11dGF0ZShkZixkYXkpDQphZGRtYXJnaW5zKHRhYmxlKGRmJGNsYXNzLGRmJGRheSkpDQpwcm9wLnRhYmxlKHRhYmxlKGRmJGNsYXNzLGRmJGRheSkpKjEwMA0KYGBgDQoNCmBgYHtyfQ0KZGYgJT4lIG5hLm9taXQoKSAlPiUgY291bnQoY2xhc3MsIGRheSkgJT4lIGdyb3VwX2J5KGNsYXNzKSAlPiUgbXV0YXRlKHB2aSA9IG4vc3VtKG4pKSAlPiUgZ2dwbG90KGFlcyh4PWNsYXNzLHk9bixmaWxsPSBkYXkpKStnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocHZpLGFjY3VyYWN5ID0gLjAxKSksIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoMSksIHZqdXN0ID0gLTAuNSxjb2xvciA9ICdibGFjaycpICsgdGhlbWVfY2xhc3NpYygpDQoNCmBgYA0KDQpCaeG6v24gZGF5X2xlc2Z0IMSRxrDhu6NjIGNoaWEgdGjDoG5oIDMgbmjDs20gZ+G7k20gbmjDs20gY8OzIHRo4budaSBnaWFuIMSR4bq3dCB2w6kgdOG7qyB0cuG7hSAoMS0xMCBuZ8OgeSksIHbhu6thKDEwLTMwIG5nw6B5KSwgc+G7m20gKDMwLTQ5IG5nw6B5KS4NCiANClThu6sgxJHDsyBi4bqjbmcgdOG6p24gc+G7kSB2w6AgxJHhu5MgdGjhu4sgduG7q2EgbOG6rXAgxJHGsOG7o2MgdGEgY8OzIG3hu5l0IHPhu5Egbmjhuq1uIHjDqXQgc2F1Og0KDQotIFRyb25nIG5ow7NtIGfhu5NtIDkzMjIxIG5nxrDhu51pIGPDsyB2w6kgaOG6oW5nIHRoxrDGoW5nIGdpYSAsIGNo4buJIGPDsyAxNjEyOCBuZ8aw4budaSDEkeG6t3QgdsOpIHRy4buFIHThu6ljIHThu6sgMS0xMCBuZ8OgeSB0csaw4bubYyBuZ8OgeSBiYXkgY2hp4bq/bSBraG/huqNuZyAxNy4zJSBz4buRIGjDoG5oIGtow6FjaCDhu58gaOG6oW5nIHbhur0gdGjGsMahbmcgZ2lhIHbDoCBjaOG7iSBraG/huqNuZyA1LDQxJSB0csOqbiB04buVbmcgc+G7kSBuZ8aw4budaSB0cm9uZyBi4buZIGThu68gbGnhu4d1LiBOaOG7r25nIGjDoG5oIGtow6FjaCBjw7MgdGjhu51pIGdpYW4gxJHhurd0IHbDqSDhu58ga2hv4bqjbmcgduG7q2EgdsOgIHPhu5ttIGPDsyB04bu3IGzhu4cgeOG6pXAgeOG7iSBuaGF1IOG7nyBraG/huqNuZyBoxqFuIDQwJSB2w6AgY2hp4bq/bSBwaOG6p24gbOG7m24gdHJvbmcgbmjDs20gdsOpIG7DoHkuDQotIFRyb25nIG5ow7NtIHbDqSBo4bqhbmcgcGjhu5UgdGjDtG5nIGfhu5NtIDIwNTAwNSBuZ8aw4budaSwgdHJvbmcgxJHDsyAzMTMxMiBuZ8aw4budaSAoMTUuMjclKSB0cm9uZyBuaMOzbSBuw6B5IMSR4bq3dCB2w6kgdHLhu4UuIEPDsm4g4bufIGhhaSBwaMOibiBuaMOzbSB24burYSB2w6Agc+G7m20gY8OybiBs4bqhaSBjw7MgdOG7tyBs4buHIHjhuqVwIHjhu4kgbmhhdSB2w6AgxJHhu4F1IHRyw6puIDQwJS4NCi0gVOG7tyBs4buHIOG7nyDhu58gYmEgcGjDom4gbmjDs20gInRy4buFLCB24burYSwgc+G7m20iIOG7nyBoYWkgaOG6oW5nIHbDqSBjw7Mgc+G7sSB0xrDGoW5nIMSR4buTbmcgcsO1IHLhu4d0DQoNCg0KIyMgKipCaeG6v24gQ2xhc3MgdsOgIGJp4bq/biBQcmljZSoqDQoNCsSQ4bqndSB0acOqbiDEkeG7gyB0aOG7sWMgaGnhu4duIMSRxrDhu6NjIGzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGdp4buvYSDEkeG7gyBjaOG7iSByYSBt4buRaSBsacOqbiBo4buHIGdp4buvYSBo4bqhbmcgZ2jhur8gdsOgIGdpw6EgdsOpLCB0csaw4bubYyB0acOqbiBwaOG6o2kgdGnhur9uIGjDoG5oIHBow6JuIHThu5UgZ2nDoSB2w6AgZ8OhbiB2w6BvIGJp4bq/biBt4bubaSBjw7MgdMOqbiBsw6AgcHJpY2VfbGV2ZWwuDQoNCmBgYHtyfQ0Kc3VtbWFyeShkZiRwcmljZSkNCmRmJHByaWNlX2xldmVsIDwtIGN1dChkZiRwcmljZSwgYnJlYWtzID0gYygwLCAyMDg5MCwgMTIzMDcxKSwgbGFiZWxzID0gYygiVGhhcCIsICJDYW8iKSkNCmFkZG1hcmdpbnModGFibGUoZGYkcHJpY2VfbGV2ZWwsIGRmJGNsYXNzKSkNCnByb3AudGFibGUodGFibGUoZGYkcHJpY2VfbGV2ZWwsIGRmJGNsYXNzKSwgbWFyZ2luID0gMikgKiAxMDANCmBgYA0KDQoNCmBgYHtyfQ0Kc3VtbWFyeShkZiRwcmljZSkNCmRmJHByaWNlX2xldmVsIDwtIGN1dChkZiRwcmljZSwgYnJlYWtzID0gYygwLCAyMDg5MCwgMTIzMDcxKSwgbGFiZWxzID0gYygiVGhhcCIsICJDYW8iKSkNCmFkZG1hcmdpbnModGFibGUoZGYkcHJpY2VfbGV2ZWwsIGRmJGNsYXNzKSkNCnByb3AudGFibGUodGFibGUoZGYkcHJpY2VfbGV2ZWwsIGRmJGNsYXNzKSwgbWFyZ2luID0gMikgKiAxMDANCg0KDQpkZiAlPiUgZ2dwbG90KGFlcyh4ID0gZmN0X2luZnJlcShwcmljZV9sZXZlbCksIGZpbGwgPSBjbGFzcykpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQoYWZ0ZXJfc3RhdChjb3VudCAvIHN1bShjb3VudCkpLCBhY2N1cmFjeSA9IDAuMDEpKSwgDQogICAgICAgICAgICBzdGF0ID0gImNvdW50IiwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgDQogICAgICAgICAgICB2anVzdCA9IC0wLjUsIA0KICAgICAgICAgICAgY29sb3IgPSAnYmxhY2snKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIkVjb25vbXkiID0gInNreWJsdWUiLCAiQnVzaW5lc3MiID0gImJyb3duIikpICsgbGFicyhmaWxsID0gJ0jhuqFuZyB2w6knLHRpdGxlID0gIlPhu5EgbMaw4bujbmcgY2h1eeG6v24gYmF5IHRoZW8gdOG7q25nIG3hu6ljIGdpw6EgdsOpIikgKyB0aGVtZV9taW5pbWFsKCkgKyB4bGFiKCJN4bupYyBnacOhIHbDqSIpICsgeWxhYigiU+G7kSBsxrDhu6NuZyIpDQpgYGANCg0KTmjhuq1uIHjDqXQ6DQoNCi0gVHJvbmcgdOG6pXQgY+G6oyBjw6FjIHbDqSBo4bqhbmcgcGjhu5UgdGjDtG5nLCDEkWEgcGjhuqduIGPDoWMgdsOpIG3DoXkgYmF5IGPDsyBnacOhIHRo4bqlcCwgY8OzIDIwNTIzNSB2w6kgY8OzIGdpw6EgdGjhuqVwIGNoaeG6v20gOTkuMzElLCB0cm9uZyBraGkgxJHDsyBo4bqhbmcgcGjhu5UgdGjDtG5nIGPDsyBnacOhIHbDqSBjYW8gY2jhu4kgY8OzIDE0MzEgY2hp4bq/bSAwLjY5JS4NCg0KLSBUcm9uZyA5NDQ4NyBo4bqhbmcgdsOpIGPDsyBnaOG6vyBsw6AgdGjGsMahbmcgZ2lhLCDEkWEgcGjhuqduIGPDoWMgdsOpIG3DoXkgYmFuaCBjw7MgZ2nDoSBjYW8sIGPDsyA5MzQ4NyB2w6kgY8OzIGdpw6EgdHLhu4sgY2FvIGNoaeG6v20gOTguNSUsIHRyb25nIGtoaSDEkcOzIGjhuqFuZyB0aMawxqFuZyBnaWEgbcOgIGPDsyB2w6kgcuG6uyBjaOG7iSBjw7MgMTQwMCB2w6ksIGNoaeG6v20gMS41JS4NCg0KIyAqKlRo4buRbmcga8OqIHN1eSBkaeG7hW4qKg0KDQojIyAqKktp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCBjaG8gMiBiaeG6v24gxJHhu4tuaCB0w61uaCoqDQoNCiMjIyAqKktp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCBjaG8gYmnhur9uIENsYXNzIHbDoCBBaXJsaW5lKioNCg0KR2nhuqMgdGh1eeG6v3Q6DQoNCi0gJEhfMCQ6IEhhaSBiaeG6v24gQ2xhc3MgdsOgIEFpcmxpbmUgxJHhu5ljIGzhuq1wDQoNCi0gJEhfMSQ6IEhhaSBiaeG6v24gQ2xhc3MgdsOgIEFpcmxpbmUga2jDtG5nIMSR4buZYyBs4bqtcA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoZGYkY2xhc3MsZGYkYWlybGluZSkpDQpgYGANCg0KS+G6v3QgcXXhuqM6IHAtdmFsdWUgPCAyLjJlLTE2IG5o4buPIGjGoW4gcuG6pXQgbmhp4buBdSBzbyB24bubaSBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYSg1XCUpJC4gTsOqbiB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgJEhfMCQuDQoNClbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgc+G7sSBs4buxYSBjaOG7jW4gY8OhYyBow6NuZyBow6BuZyBraMO0bmcgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBxdXnhur90IMSR4buLbmggY2jhu41uIGjhuqFuZyB2w6kgbcOheSBiYXkgY+G7p2Ega2jDoWNoIGjDoG5nLg0KDQojIyMgKipLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgY2hvIGJp4bq/biBDbGFzcyB2w6AgU291cmNlX0NpdHkqKg0KDQpHaeG6oyB0aHV54bq/dDoNCg0KLSAkSF8wJDogSGFpIGJp4bq/biBDbGFzcyB2w6AgU291cmNlX0NpdHkgxJHhu5ljIGzhuq1wDQoNCi0gJEhfMSQ6IEhhaSBiaeG6v24gQ2xhc3MgdsOgIFNvdXJjZV9DaXR5IGtow7RuZyDEkeG7mWMgbOG6rXANCg0KDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoZGYkY2xhc3MsZGYkc291cmNlX2NpdHkpKQ0KYGBgDQoNCkvhur90IHF14bqjOiBwLXZhbHVlIDwgMi4yZS0xNiBuaOG7jyBoxqFuIHLhuqV0IG5oaeG7gXUgc28gduG7m2kgbeG7qWMgw70gbmdoxKlhICRcYWxwaGEoNVwlKSQuIE7Dqm4gdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90ICRIXzAkLg0KDQpW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIHRow6BuaCBwaOG7kSBuxqFpIGNodXnhur9uIGJheSBj4bqldCBjw6FuaCBjw7MgdMOhYyDEkeG7mW5nIMSR4bq/biBxdXnhur90IMSR4buLbmggY2jhu41uIGjhuqFuZyB2w6kgbcOheSBiYXkgY+G7p2Ega2jDoWNoIGjDoG5nLg0KDQoNCiMjIyAqKktp4buDbSDEkeG7i25oIHTDrW5oIMSR4buZYyBs4bqtcCBjaG8gYmnhur9uIENsYXNzIHbDoCBTdG9wc19hbnMqKg0KDQpHaeG6oyB0aHV54bq/dDoNCg0KLSAkSF8wJDogSGFpIGJp4bq/biBDbGFzcyB2w6AgU3RvcHNfYW5zIMSR4buZYyBs4bqtcA0KDQotICRIXzEkOiBIYWkgYmnhur9uIENsYXNzIHbDoCBTdG9wc19hbnMga2jDtG5nIMSR4buZYyBs4bqtcA0KDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoZGYkY2xhc3MsZGYkc3RvcF9hbnMpKQ0KDQpgYGANCg0KS+G6v3QgcXXhuqMgcC12YWx1ZSA8IDIuMmUtMTYgbmjhu48gaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhKDVcJSkkLiBOw6puIHRhIGLDoWMgYuG7jyAkSF8wJC4NCg0KVsOsIHbhuq15IHbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgdGEga+G6v3QgbHXhuq1uIHPhu5EgxJFp4buDbSBk4burbmcgY+G7p2EgY2h1eeG6v24gYmF5IGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gcXV54bq/dCDEkeG7i25oIGzhu7FhIGNo4buNbiBo4bqhbmcgZ2jhur8gY+G7p2Ega2jDoWNoIGjDoG5nLg0KDQojIyMgKipLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgY2hvIGJp4bq/biBDbGFzcyB2w6AgUHJpY2VfbGV2ZWwqKg0KDQpHaeG6oyB0aHV54bq/dDoNCg0KLSAkSF8wJDogSGFpIGJp4bq/biBDbGFzcyB2w6AgUHJpY2VfbGV2ZWwgxJHhu5ljIGzhuq1wDQoNCi0gJEhfMSQ6IEhhaSBiaeG6v24gQ2xhc3MgdsOgIFByaWNlX2xldmVsIGtow7RuZyDEkeG7mWMgbOG6rXANCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKGRmJGNsYXNzLGRmJHByaWNlX2xldmVsKSkNCmBgYA0KDQpL4bq/dCBxdeG6oyBwLXZhbHVlIDwgMi4yZS0xNiwgbmjhu48gaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIG3hu6ljIMO9IG5naMSpYSAkXGFscGhhKDUlKSQuIE7Dqm4gdGEgYsOhYyBi4buPICRIXzAkDQoNClbhuq15IHRhIGvhur90IGx14bqtbiBsw6Agc+G7sSBs4buxYSBjaOG7jW4gaOG6oW5nIGdo4bq/IGPhu6dhIGtow6FjaCBow6BuZyBjw7MgbGnDqm4gcXVhbiDEkeG6v24gbeG7qWMgZ2nDoSB2w6kgY+G7p2EgY2h1eeG6v24gYmF5Lg0KDQojIyMgKipLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgY2hvIGJp4bq/biBDbGFzcyB2w6AgRGF5bGVmdF9sZXZlbCoqDQoNCkdp4bqjIHRodXnhur90Og0KDQotICRIXzAkOiBIYWkgYmnhur9uIENsYXNzIHbDoCBEYXlsZWZ0X2xldmVsIMSR4buZYyBs4bqtcA0KDQotICRIXzEkOiBIYWkgYmnhur9uIENsYXNzIHbDoCBEYXlsZWZ0X2xldmVsIGtow7RuZyDEkeG7mWMgbOG6rXANCg0KYGBge3J9DQpjaGlzcS50ZXN0KHRhYmxlKGRmJGNsYXNzLGRmJGRheWxlZnRfbGV2ZWwpKQ0KYGBgDQpL4bq/dCBxdeG6oyBwLXZhbHVlID0gMS41NjdlLTA2IDwgJFxhbHBoYSg1XCUpJCAuIE7Dqm4gdGEgYsOhYyBi4buPIEgwLiBW4bqteSB0YSBr4bq/dCBsdeG6rW4sIHbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSBz4buxIGzhu7FhIGNo4buNbiBo4bqhbmcgZ2jhur8gY+G7p2Ega2jDoWNoIGjDoG5nIGPDsyBsacOqbiBxdWFuIMSR4bq/biB0aOG7nWkgZ2lhbiDEkeG6t3QgdsOpIGPhu6dhIGNodXnhur9uIGJheS4NCg0KDQojIyMgKipLaeG7g20gxJHhu4tuaCB0w61uaCDEkeG7mWMgbOG6rXAgY2hvIGJp4bq/biBDbGFzcyB2w6AgRHVyYXRpb25fbGV2ZWwqKg0KDQpHaeG6oyB0aHV54bq/dDoNCg0KLSAkSF8wJDogSGFpIGJp4bq/biBDbGFzcyB2w6AgRHVyYXRpb25fbGV2ZWwgxJHhu5ljIGzhuq1wDQoNCi0gJEhfMSQ6IEhhaSBiaeG6v24gQ2xhc3MgdsOgIER1cmF0aW9uX2xldmVsIGtow7RuZyDEkeG7mWMgbOG6rXANCg0KDQpgYGB7cn0NCmNoaXNxLnRlc3QodGFibGUoZGYkY2xhc3MsZGYkZHVyYXRpb25fbGV2ZWwpKQ0KYGBgDQoNCkvhur90IHF14bqjIHAtdmFsdWUgPCAyLjJlLTE2IG5o4buPIGjGoW4gcuG6pXQgbmhp4buBdSBzbyB24bubaSBt4bupYyDDvSBuZ2jEqWEgJFxhbHBoYSg1XCUpJC4gTsOqbiB0YSBiw6FjIGLhu48gSDAuIFbhuq15IHbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwgc+G7sSBs4buxYSBjaOG7jW4gaOG6oW5nIGdo4bq/IGPhu6dhIGtow6FjaCBow6BuZyBjw7MgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSB0aOG7nWkgZ2lhbiBiYXkgY+G7p2EgY2h1eeG6v24gYmF5Lg0KDQojICoqS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIHThu7cgbOG7hyAqKg0KDQoqKsav4bubYyBsxrDhu6NuZyB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSB2w6AgaOG6oW5nIHbDqSBwaOG7lSB0aMO0bmcqKg0KDQpgYGB7cn0NCg0KQnVzaW5lc3MgPC0gZGZbZGYkY2xhc3MgPT0gJ0J1c2luZXNzJyxdDQpwcm9wLnRlc3QobGVuZ3RoKEJ1c2luZXNzJGNsYXNzKSwgbGVuZ3RoKGRmJGNsYXNzKSkNCg0KYGBgDQoNClbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUsIHRhIGPDsyB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBu4bqxbSB0cm9uZyBraG/huqNuZyAzMC45JSBjaG8gxJHhur9uIDMxLjMxJS4gVOG7tyBs4buHIGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSBwaOG7lSB0aMO0bmcgbuG6sW0gdHJvbmcga2hv4bqjbmcgY8OybiBs4bqhaS4NCg0KDQojICoqTcO0IGjDrG5oIGjhu5NpIHF1eSoqDQoNCiMjICoqTcO0IGjDrG5oIGjhu5NpIHF1eSBMb2dpc3RpYyoqDQoNCiMjIyAqKk3DtCBow6xuaCBo4buTaSBxdXkgTG9naXN0aWMgxJHGoW4gYmnhur9uKioNCg0KKipI4buTaSBxdXkgYmnhur9uIENsYXNzIHbDoCBBaXJsaW5lICoqDQoNCg0KYGBge3J9DQpjbGFzc2FpcmxpbmUgPC0gZ2xtKGZhY3RvcihjbGFzcywgbGV2ZWxzID0gYygiRWNvbm9teSIsIkJ1c2luZXNzIikpIH4gYWlybGluZSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpLCBkYXRhID0gZGYpDQpzdW1tYXJ5KGNsYXNzYWlybGluZSkNCg0KYGBgDQpQaMawxqFuZyB0csOsbmggaOG7k2kgcXV5IExvZ2lzdGljIGPhu6dhIENsYXNzIHbDoCBBaXJsaW5lIGPDsyBk4bqhbmc6DQoNCiQkDQpsb2cob2RkcykgPSAtMC4zNzc2NjQgLSAxOC4xODg0MDQuQWlyQXNpYSAtMTguMTg4NDA0LkdvZnJpc3QgLTE4LjE4ODQwNC5JbmRpZ28gLTE4LjE4ODQwNC5TcGljZUpldCArMC4yNzMwNjMuVmlzdGFyYQ0KJCQNCg0KR2nhuqNpIHRow61jaCBr4bq/dCBxdeG6ozogDQoNCi0gR2nDoSB0cuG7iyBQLXZhbHVlIMSR4buRaSB24bubaSBow6NuZyBow6BuZyBraMO0bmcgbWFuZyBuaMOjbiBoaeG7h3UgQWlyQXNpYSwgR09GSVJTVCwgSW5kaWdvLCBTcGljZUpldCBy4bqldCBs4bubbiBuw6puIGPDoWMgaMOjbmcgaMOgbmcga2jDtG5nIG7DoHkga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdHJvbmcgbcO0IGjDrG5oLg0KDQotIE9kZHMgY+G7p2EgaMOjbmcgaMOgbmcga2jDtG5nIFZpc3RhcmEgYuG6sW5nIDEuMzEgbOG6p24gxJHhu5FpIHbhu5tpIG9kZHMgY+G7p2EgaMOjbmcgaMOgbmcga2jDtG5nIEluZGlhDQoNCioqxJDhu5FpIHbhu5tpIGNodXnhur9uIGJheSBtYW5nIG5ow6NuIGhp4buHbiBsw6AgVmlzdGFyYSAqKg0KDQotIG9kZHMgPSAkZV57LTAuMzc3NjY0KzAuMjczMDYzfSA9IDAuOSQNCg0KLT4gdOG7tyBs4buHIGNow6puaCBnaeG7r2EgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyB0aMawxqFuZyBnaWEgdsOgIHjDoWMgc3XhuqV0IGNo4buNbiBo4bqhbmcgZ2jhur8gcGjhu5UgdGjDtG5nIGzDoCAwLjkgLCB04bupYyBsw6AgeMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBiw6kgaMahbiB4w6FjIHN14bqldCBow6BuaCBraMOhY2ggY2jhu41uIGjhuqFuZyB2w6kgcGjhu5UgdGjDtG5nIDEwJSAoJDEgKzAuOSA9MC4xJCkgDQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgNDcsNCUgKHTDrW5oIHJhIHThu6sgcGjGsMahbmcgdHLDrG5oIG9kZHMgPSAkXGZyYWN7XHBpfXsxLVxwaX0kKQ0KDQoqKsSQ4buRaSB24bubaSBjaHV54bq/biBiYXkgbWFuZyBuaMOjbiBoaeG7h3UgbMOgIEluZGlhKioNCg0KLSBvZGRzID0gJGVeey0wLjM3NzY2NH0gPSAwLjY4NSQNCg0KLT4gdOG7tyBs4buHIGNow6puaCBnaeG7r2EgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyB0aMawxqFuZyBnaWEgdsOgIHjDoWMgc3XhuqV0IGNo4buNbiBo4bqhbmcgZ2jhur8gcGjhu5UgdGjDtG5nIGzDoCAwLjY4NSAsIHThu6ljIGzDoCB4w6FjIHN14bqldCBraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGLDqSBoxqFuIHjDoWMgc3XhuqV0IGjDoG5oIGtow6FjaCBjaOG7jW4gaOG6oW5nIHbDqSBwaOG7lSB0aMO0bmcgMzEuNSUgKCQxLSAtMC42ODUgPTAuMzE1JCkgDQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgNDAsNjUlICh0w61uaCByYSB04burIHBoxrDGoW5nIHRyw6xuaCBvZGRzID0gJFxmcmFje1xwaX17MS1ccGl9JCkNCg0KDQo+IEjDo25nIGjDoG5nIGtow7RuZyBWaXN0YXJhIGPDsyB04bu3IGzhu4cga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIGjhuqFuZyB0aMawxqFuZyBnaWEgbmhp4buBdSBoxqFuIHNvIHbhu5tpIGjDo25nIGjDoG5nIGtow7RuZyBJbmRpYQ0KDQoqSOG7hyBz4buRIEFJQyBj4bunYSBtw7QgaMOsbmggbsOgeSA9IDI4NjIxOSoNCg0KKipI4buTaSBxdXkgYmnhur9uIENsYXNzIHbDoCBTb3VyY2VfY2l0eSAqKg0KDQpgYGB7cn0NCg0KY2xhc3Nzb3VyY2UgPC0gZ2xtKGZhY3RvcihjbGFzcyxsZXZlbHMgPSBjKCJFY29ub215IiwiQnVzaW5lc3MiKSkgfiBzb3VyY2VfY2l0eSwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpLCBkYXRhID0gZGYpDQp1bmlxdWUoZGYkc291cmNlX2NpdHkpDQpzdW1tYXJ5KGNsYXNzc291cmNlKQ0KDQoNCmBgYA0KUGjGsMahbmcgdHLDrG5oIGjhu5NpIHF1eSBMb2dpc3RpYyBj4bunYSBDbGFzcyB2w6AgU291cmNlX2NpdHkgY8OzIGThuqFuZzoNCg0KJCQNCmxvZyhvZGRzKSA9IC0wLjc3MzEyOSArMC4wMzY1MjMuQ2hlbm5haSAtMC4wODA5MjQuRGVsaGkgLTAuMDAxODg4Lkh5ZGVyYWJhZCAtMC4xMTg4NjUuS29sa2F0YSArMC4wNDcyMzguTXVtYmFpDQokJA0KDQpHaeG6o2kgdGjDrWNoIGvhur90IHF14bqjOiANCg0KLSBHacOhIHRy4buLIHBfdmFsdWUgY+G7p2EgSHlkZXJhYmFkIGzhu5tuIGjGoW4gbeG7qWMgw70gbmdoxKlhIDAuMDUgbsOqbiBiaeG7g3UgaGnhu4duIG7DoHkga2jDtG5nIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogdHJvbmcgbcO0IGjDrG5oIG7DoHkuDQoNCi0gT2RkcyBj4bunYSBDaGVubmFpIGLhurFuZyAxLjAzNyBs4bqnbiBvZGRzIGPhu6dhIEJhbmdhbG9yZQ0KDQotIE9kZHMgY+G7p2EgRGVsaGkgYuG6sW5nIDAuOTIgbOG6p24gb2RkcyBj4bunYSBCYW5nYWxvcmUNCg0KLSBPZGRzIGPhu6dhIEtvbGthdGEgYuG6sW5nIDAuODg3OSBs4bqnbiBvZGRzIGPhu6dhIEJhbmdhbG9yZQ0KDQotIE9kZHMgY+G7p2EgTXVtYmFpIGLhurFuZyAxLjA0OCBs4bqnbiBvZGRzIGPhu6dhIEJhbmdhbG9yZQ0KDQoqKsSQ4buRaSB24bubaSB0aMOgbmggcGjhu5EgQmFuZ2Fsb3JlKioNCg0KLSBvZGRzID0gJGVeey0wLjc3MzEyOX0gPSAwLjQ2MTUkDQoNCi0gdOG7tyBs4buHIGNow6puaCBnaeG7r2EgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyB0aMawxqFuZyBnaWEgdsOgIHjDoWMgc3XhuqV0IGNo4buNbiBo4bqhbmcgZ2jhur8gcGjhu5UgdGjDtG5nIGzDoCAwLjQ2MTUNCg0KLSBYw6FjIHN14bqldCBraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGzDoCAzMSw1NyUNCg0KKirEkOG7kWkgduG7m2kgdGjDoG5oIHBo4buRIENoZW5uYWkqKg0KDQotIG9kZHMgPSAkZV57LTAuNzczMTI5ICswLjAzNjUyM30gPSAwLjQ3ODckDQoNCi0gdOG7tyBs4buHIGNow6puaCBnaeG7r2EgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyB0aMawxqFuZyBnaWEgdsOgIHjDoWMgc3XhuqV0IGNo4buNbiBo4bqhbmcgZ2jhur8gcGjhu5UgdGjDtG5nIGzDoCAwLjQ3ODcgDQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgMzIuMzclDQoNCioqxJDhu5FpIHbhu5tpIHRow6BuaCBwaOG7kSBEZWxoaSoqDQoNCi0gb2RkcyA9ICRlXnstMC43NzMxMjktMC4wODA5MjR9ID0gMC40MjU2JA0KDQotIHThu7cgbOG7hyBjaMOqbmggZ2nhu69hIHjDoWMgc3XhuqV0IGNo4buNbiBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhIHbDoCB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIGdo4bq/IHBo4buVIHRow7RuZyBsw6AgMC40MjU2DQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgMjksODUlIA0KDQoqKsSQ4buRaSB24bubaSB0aMOgbmggcGjhu5EgS29sa2F0YSoqDQoNCi0gb2RkcyA9ICRlXnstMC43NzMxMjktMC4xMTg4NjV9ID0gMC40MDk4JA0KDQotIHThu7cgbOG7hyBjaMOqbmggZ2nhu69hIHjDoWMgc3XhuqV0IGNo4buNbiBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhIHbDoCB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIGdo4bq/IHBo4buVIHRow7RuZyBsw6AgMC40MDk4DQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgMjksMDYlDQoNCioqxJDhu5FpIHbhu5tpIHRow6BuaCBwaOG7kSBNdW1iYWkqKg0KDQotIG9kZHMgPSAkZV57LTAuNzczMTI5LTAuMDQ3MjM4fSA9IDAuNDQwMiQNCg0KLSB04bu3IGzhu4cgY2jDqm5oIGdp4buvYSB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIGdo4bq/IHRoxrDGoW5nIGdpYSB2w6AgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgbMOgIDAuNDQwMg0KDQotIFjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgbMOgIDMwLDU2JQ0KDQoqKsSQ4buRaSB24bubaSB0aMOgbmggcGjhu5EgQmFuZ2Fsb3JlKioNCg0KLSBvZGRzID0gJGVeey0wLjc3MzEyOX0gPSAwLjQ2MTUkDQoNCg0KPiBUaMOgbmggcGjhu5EgQ2hlbm5haSBjw7MgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGzDoCBs4bubbiBuaOG6pXQgKDMyLjM3JSksIHRp4bq/cCDEkeG6v24gbMOgIHRow6BuaCBwaOG7kSBiYW5nYWxvcmUgduG7m2kgeMOhYyBzdeG6pXQgbMOgIDMxLDU3JSwgdGjhu6kgMyBsw6AgdGjDoG5oIHBo4buRIE11bWFiYWkgduG7m2kgeMOhYyBzdeG6pXQgbMOgIDMwLDU2JSwgdGjDoG5oIHBo4buRIGhlbGhpIGPDsyB4w6FjIHN14bqldCAyOSw4NSUgdsOgIGN14buRaSBjw7luZyBsw6AgdGjDoG5oIHBo4buRIEtvbGthdGEgY8OzIHjDoWMgc3XhuqV0IGzDoCAyOSwwNiUuIEdp4buvYSBuaOG7r25nIHRow6BuaCBwaOG7kSBuw6B5IGPDsyBz4buxIGNow6puaCBs4buHY2ggdHJvbmcgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhLCB0dXkgbmhpw6puIHPhu7EgY2jDqm5oIGzhu4djaCBuw6B5IGtow7RuZyDEkcOhbmcga+G7gw0KDQoqSOG7hyBz4buRIEFJQyBj4bunYSBtw7QgaMOsbmggbsOgeSA9IDM3MjEyNSoNCg0KKipI4buTaSBxdXkgYmnhur9uIENsYXNzIHbDoCBQcmljZV9sZXZlbCAqKg0KDQpgYGB7cn0NCg0KY2xhc3NwcmljZSA8LSBnbG0oZmFjdG9yKGNsYXNzLGxldmVscyA9IGMoIkVjb25vbXkiLCJCdXNpbmVzcyIpKSB+IHByaWNlX2xldmVsLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gJ2xvZ2l0JyksIGRhdGEgPSBkZikNCnN1bW1hcnkoY2xhc3NwcmljZSkNCmBgYA0KS+G6v3QgcXXhuqMgaOG7k2kgcXV5IG3DtCBow6xuaCBsb2dpc3RpYyB0csOqbiBjaG8gdGEgdGjhuqV5IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYmnhur9uIENsYXNzIHbDoCBQcmljZV9sZXZlbC4gDQoNClBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgTG9naXN0aWMgY+G7p2EgQ2xhc3MgdsOgIFByaWNlX2xldmVscyBjw7MgZOG6oW5nOg0KDQokJA0KbG9nKG9kZHMpID0gLTQuOTg3NjggKyA5LjE1MjA0LkNhbw0KJCQNCg0KLSBPZGRzIGPhu6dhIG3hu6ljIGdpw6EgY2FvIGLhurFuZyA5NDMzLjYgbOG6p24gc28gduG7m2kgb2RkcyBj4bunYSBt4bupYyBnacOhIHRo4bqlcC4NCg0KKirEkOG7kWkgduG7m2kgY2h1eeG6v24gYmF5IGPDsyBt4bupYyBnacOhIGNhbyoqDQoNCi0gb2RkcyA9ICRlXnstNC45ODc2OCArIDkuMTUyMDR9ID0gNjQuMzUkDQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgOTgsNDYlLiANCg0KKirEkOG7kWkgduG7m2kgY2h1eeG6v24gYmF5IGPDsyBt4bupYyBnacOhIHRo4bqlcCoqDQoNCi0gb2RkcyA9ICRlXnstNC45ODc2OH0gPSA2LDgyLjEwXnstM30kDQoNCi0gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiB2w6kgdGjGsMahbmcgZ2lhIGzDoCAxLjU0JQ0KDQo+IMSQ4buRaSB24bubaSBuaOG7r25nIGNodXnhur9uIGJheSBjw7MgbeG7qWMgZ2nDoSBjYW8sIGjhuqd1IG5oxrAgxJHhu4F1IHLGoWkgdsOgbyBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYS4gWMOhYyBzdeG6pXQgdsOpIMSRw7MgbMOgIHbDqSBo4bqhbmcgdGjGsMahbmcgZ2lhIMSR4buRaSB24bubaSBt4bupYyBnacOhIGNhbyBsw6AgOTgsNDYlLiANCg0KKk3DtCBow6xuaCBuw6B5IGPDsyBo4buHIHPhu5EgQUlDIGzDoCAzMTU4MioNCg0KKipI4buTaSBxdXkgYmnhur9uIENsYXNzIHbDoCBTdG9wX2FucyoqDQoNCmBgYHtyfQ0KY2xhc3NzdG9wYW5zIDwtIGdsbShmYWN0b3IoY2xhc3MsbGV2ZWxzID0gYygiRWNvbm9teSIsIkJ1c2luZXNzIikpIH4gc3RvcF9hbnMsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAnbG9naXQnKSwgZGF0YSA9IGRmKQ0Kc3VtbWFyeShjbGFzc3N0b3BhbnMpDQoNCmBgYA0KS+G6v3QgcXXhuqMgaOG7k2kgcXV5IG3DtCBow6xuaCBsb2dpc3RpYyB0csOqbiBjaG8gdGEgdGjhuqV5IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgYmnhur9uIENsYXNzIHbDoCBTdG9wc19hbnMuIA0KDQpQaMawxqFuZyB0csOsbmggaOG7k2kgcXV5IExvZ2lzdGljIGPhu6dhIENsYXNzIHbDoCBTdG9wX2FucyBjw7MgZOG6oW5nOg0KDQokJA0KbG9nKG9kZHMpID0gLTEuMjM2NTkgKyAwLjQ5NzY5Llllcw0KJCQNCi0gT2RkcyBj4bunYSBjaHV54bq/biBiYXkgY8OzIMSRaeG7g20gZOG7q25nIGLhurFuZyAxLjY0IGzhuqduIG9kZHMgY+G7p2EgY2h1eeG6v24gYmF5IGtow7RuZyBjw7MgxJFp4buDbSBk4burbmcNCg0KKirEkOG7kWkgduG7m2kgY2h1eeG6v24gYmF5IGPDsyDEkWnhu4NtIGThu6tuZyoqDQoNCi0gb2RkcyA9ICRlXnstMS4yMzY1OSArIDAuNDk3Njl9ID0gMCw0Nzc2JA0KDQotIFThu7cgbOG7hyBnaeG7r2EgeMOhYyBzdeG6pXQga2jDoWNoIGNo4buNbiBo4bqhbmcgZ2jhur8gdGjGsMahbmcgZ2lhIHbDoCB4w6FjIHN14bqldCBraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyBnaOG6vyBwaOG7lSB0aMO0bmcgbMOgIDAsNDc3Ni4NCg0KLSBYw6FjIHN14bqldCBraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGzDoCAzMiwzMiUuIA0KDQoqKsSQ4buRaSB24bubaSBjaHV54bq/biBiYXkga2jDtG5nIGPDsyDEkWnhu4NtIGThu6tuZyoqDQoNCi0gb2RkcyA9ICRlXnstMS4yMzY1OX0gPSAwLDI5JA0KDQotIFThu7cgbOG7hyBnaeG7r2EgeMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBnaOG6vyB0aMawxqFuZyBnaWEgdsOgIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIGdo4bq/IHBo4buVIHRow7RuZyBsw6AgMCwyOQ0KDQotIFjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gdsOpIHRoxrDGoW5nIGdpYSBsw6AgMjIsNDglDQoNCj4gWMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIGPhu6dhIG5o4buvbmcgY2h1eeG6v24gYmF5IGPDsyDEkWnhu4NtIGThu6tuZyAoMzIsMzIlKSBjYW8gaMahbiBuaOG7r25nIGNodXnhur9uIGJheSBraMO0bmcgY8OzIMSRaeG7g20gZOG7q25nICgyMiw0OCUpDQoNCipI4buHIHPhu5EgQUlDIGPhu6dhIG3DtCBow6xuaCBuw6B5IGzDoCAzNzA4NTIqDQoNCioqSOG7k2kgcXV5IGJp4bq/biBDbGFzcyB2w6AgZGF5X2xlZnQqKg0KDQpgYGB7cn0NCmNsYXNzZGF5bGVmdCA8LSBnbG0oZmFjdG9yKGNsYXNzLGxldmVscyA9IGMoIkVjb25vbXkiLCJCdXNpbmVzcyIpKSB+IGRheXNfbGVmdCwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpLCBkYXRhID0gZGYpDQpzdW1tYXJ5KGNsYXNzZGF5bGVmdCkNCg0KYGBgDQpL4bq/dCBxdeG6oyBo4buTaSBxdXkgbcO0IGjDrG5oIGxvZ2lzdGljIHRyw6puIGNobyB0YSB0aOG6pXkgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBiaeG6v24gQ2xhc3MgdsOgIGRheXNfbGVmdA0KDQpQaMawxqFuZyB0csOsbmggaOG7k2kgcXV5IExvZ2lzdGljIGPhu6dhIENsYXNzIHbDoCBkYXlfbGVmdCBjw7MgZOG6oW5nOg0KDQokJA0KbG9nKG9kZHMpID0gLTAuNzM5NDQyOSAtMC4wMDIwNzYxLmRheXNsZWZ0DQokJA0KDQotICRcYmV0YSA9IC0wLjAwMjA3NjEkIHRo4buDIGhp4buHbiBz4buxIGdp4bqjbSB4w6FjIHN14bqldCAiY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIiDEkeG7kWkgduG7m2kgInPhu5EgbmfDoHkgxJHhurd0IHbDqSB0csaw4bubYyBjaHV54bq/biBiYXkiIGNhbyBoxqFuDQoNCi0gS+G6v3QgcXXhuqMgbsOgeSB0aOG7gyBoaeG7h246IEtoaSBz4buRIG5nw6B5IMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5IHTEg25nIGzDqm4gMSBuZ8OgeSwgdGjDrCB4w6FjIHN14bqldCAia2jDoWNoIGjDoG5nIGNo4buNbiBnaOG6vyBo4bqhbmcgdGjGsMahbmcgZ2lhIiBnaeG6o20geHXhu5FuZw0KDQotIEtoaSBkYXlzbGVmdCA9IDAgdGjDrCwgJG9kZHMgPSBlXnstMC43Mzk0NDI5fSA9IDAuNDc3Mzc5OCQNCg0KLSBWw60gZOG7pTogS2hpIGRheXNsZWZ0ID0gMiB0aMOsICRvZGRzID0gZV57LTAuNzM5NDQyOSAtMC4wMDIwNzYxKjI9IDAuNDc1NDAxN30kLCBuZ2jEqWEgbMOgIHThu7cgbOG7hyBnaeG7r2EgeMOhYyBzdeG6pXQgImtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEiIHbDoCAia2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHBo4buVIHRow7RuZyIgbMOgIDAuNDc1NDAxNy4gWMOhYyBzdeG6pXQga2jDoWNoIGjDoG5nIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYSBsw6AgMzIsMjIlDQoNCipI4buHIHPhu5EgQUlDIGPhu6dhIG3DtCBow6xuaCA9IDM3MjMwMyoNCg0KKipI4buTaSBxdXkgYmnhur9uIENsYXNzIHbDoCBEdXJhdGlvbioqDQogIA0KYGBge3J9DQpjbGFzc2R1cmF0aW9uIDwtIGdsbShmYWN0b3IoY2xhc3MsbGV2ZWxzID0gYygiRWNvbm9teSIsIkJ1c2luZXNzIikpIH4gZHVyYXRpb24sIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAnbG9naXQnKSwgZGF0YSA9IGRmKQ0Kc3VtbWFyeShjbGFzc2R1cmF0aW9uKQ0KDQpgYGANClBoxrDGoW5nIHRyw6xuaCBo4buTaSBxdXkgTG9naXN0aWMgY+G7p2EgQ2xhc3MgdsOgIER1cmF0aW9uIGPDsyBk4bqhbmc6DQoNCiQkDQpsb2cob2RkcykgPSAtMS4zMTAzMTgwICswLjA0MTA0MjQuZHVyYXRpb24NCiQkDQoNCi0gJFxiZXRhID0gMC4wNDEwNDI0JCB0aOG7gyBoaeG7h24gc+G7sSBnaWEgdMSDbmcgeMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIMSR4buRaSB24bubaSAidGjhu51pIGdpYW4gYmF5IiBjYW8gaMahbg0KDQotIEvhur90IHF14bqjIG7DoHkgdGjhu4MgaGnhu4duOiBLaGkgdGjhu51pIGdpYW4gYmF5IHTEg25nIGzDqm4gMSBnaeG7nSwgdGjDrCB4w6FjIHN14bqldCAia2jDoWNoIGjDoG5nIGNo4buNbiBnaOG6vyBo4bqhbmcgdGjGsMahbmcgZ2lhIiB0xINuZyBsw6puDQoNCi0gS2hpIGR1cmF0aW9uID0gMCB0aMOsLCAkb2RkcyA9IGVeey0xLjMxMDMxODB9PTAuMjY5NzM0MyQNCg0KLSBWw60gZOG7pTogS2hpIGR1cmF0aW9uID0gMSB0aMOsICRvZGRzID0gZV57LTEuMzEwMzE4MCswLjA0MTA0MjR9ID0gMC4yODEwMzUxJCwgbmdoxKlhIGzDoCB04bu3IGzhu4cgZ2nhu69hIHjDoWMgc3XhuqV0ICJraMOhY2ggaMOgbmcgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhIiB2w6AgImtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSBwaOG7lSB0aMO0bmciIGzDoCAwLjI4MTAzNTEuIFjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgbMOgIDIxLDk0JQ0KDQoqSOG7hyBz4buRIEFJQyBj4bunYSBtw7QgaMOsbmggPSAzNjY2NTQqDQoNCiMjIyAqKk3DtCBow6xuaCBMb2dpc3RpYyDEkWEgYmnhur9uKioNCg0KVHLGsOG7m2Mga2hpIGNo4bqheSBtw7QgaMOsbmggaOG7k2kgcXV5IMSRYSBiaeG6v24sIMSR4buDIGto4bqvYyBwaOG7pWMgaGnhu4duIHTGsOG7o25nIMSRYSBj4buZbmcgdHV54bq/biBnaeG7r2EgY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIHRyb25nIG3DtCBow6xuaCwgY2jDum5nIHTDtGkgdGjhu7FjIGhp4buHbiBiaeG7h24gcGjDoXAgeG/DoSBi4buPIGPDoWMgeeG6v3UgdOG7kSBuZ2/huqFpIGxhaSBjw7MgdHJvbmcgYmnhur9uIHByaWNlLiBTYXUga2hpIHhvw6EgYuG7jyBjw6FjIHnhur91IHThu5EgxJHDsywgdGjhu7FjIGhp4buHbiBjaGlhIHThuq1wIGThu68gbGnhu4d1IHRow6BuaCBoYWkgcGjhuqduOiBwaOG6p24gdGjhu6kgbmjhuqV0IMSR4buDIGh14bqlbiBsdXnhu4duIG3DtCBow6xuaCwgcGjhuqduIHRo4bupIGhhaSBkw7luZyDEkeG7gyBk4buxIGLDoW8gdsOgIGtp4buDbSB0cmEgbcO0IGjDrG5oIGPDsyBob+G6oXQgxJHhu5luZyBoaeG7h3UgcXXhuqMga2jDtG5nLiBDw6FjIGJp4bq/biDEkcaw4bujYyBz4butIGThu6VuZyB0cm9uZyBtw7QgaMOsbmggbMOgOiBDbGFzcywgUHJpY2UsIFN0b3BzLCBEYXlfbGVmdCwgRHVyYXRpb24uIFRyb25nIMSRw7MsIENsYXNzIGzDoCBiaeG6v24gcGjhu6UgdGh14buZYyB2w6AgY8OhYyBiaeG6v24gY8OybiBs4bqhaSBsw6AgYmnhur9uIMSR4buZYyBs4bqtcC4NCg0KKipY4butIGzDvSBvdXRsaWVycyoqDQoNCmBgYHtyfQ0Kc3VtbWFyeShkZiRwcmljZSkNCnpfc2NvcmVzIDwtIHNjYWxlKGRmJHByaWNlKQ0Kb3V0bGllcnMgPC0gd2hpY2goYWJzKHpfc2NvcmVzKSA+IDMpDQpvdXRsaWVycyAjIGlkIChpbmRpY2VzKSBj4bunYSBvdWxpZXJzIA0KZGZfY2xlYW5lZCA8LSBkZiAlPiUgZmlsdGVyKCFyb3dfbnVtYmVyKCkgJWluJSBvdXRsaWVycykNCmJveHBsb3QoZGZfY2xlYW5lZCRwcmljZSkNCnN1bW1hcnkob3V0bGllcnMpDQoNCmBgYA0KDQoqKk3DtCBow6xuaCBo4buTaSBxdXkgxJFhIGJp4bq/biBiYW8gZ+G7k206KiogDQoNCi0gQmnhur9uIHBo4bulIHRodeG7mWM6IENsYXNzDQotIEJp4bq/biDEkeG7mWMgbOG6rXA6IHByaWNlX2xldmVsLCBzdG9wX2FucyxkYXlfbGVmdCwgZHVyYXRpb24NCg0KKipI4buTaSBxdXkgYmnhur9uIENsYXNzLCBQcmljZV9sZXZlbCwgRHVyYXRpb24sIFN0b3BfYW5zLCBEYXlfbGVmdCAqKg0KDQpgYGB7cn0NCnNldC5zZWVkKDEyMykgICMgVHLhuqMgduG7gSBnacOhIHRy4buLIGPhu5EgxJHhu4tuaCBzYXUgbeG7l2kgbOG6p24gbOG6pXkgbeG6q3UNCg0KdHJhaW5faW5kZXggPC0gY3JlYXRlRGF0YVBhcnRpdGlvbihkZl9jbGVhbmVkJGNsYXNzLCBwID0gMC44LCBsaXN0ID0gRkFMU0UsIHRpbWVzID0gMSkNCg0KIyBU4bqhbyB04bqtcCB0cmFpbiB2w6AgdGVzdCB04burIGNo4buJIHPhu5EgxJHDoyBjaOG7jW4NCnRyYWluX2RhdGEgPC0gZGZfY2xlYW5lZFt0cmFpbl9pbmRleCwgXQ0KdGVzdF9kYXRhIDwtIGRmX2NsZWFuZWRbLXRyYWluX2luZGV4LCBdDQpjbGFzc2FsbGxvZ2lzdGljMSA8LSBnbG0oZmFjdG9yKGNsYXNzLGxldmVscyA9IGMoIkVjb25vbXkiLCJCdXNpbmVzcyIpKSB+ICBwcmljZSArIHN0b3BzICsgZHVyYXRpb24gK2RheXNfbGVmdCwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdsb2dpdCcpLCBkYXRhID0gdHJhaW5fZGF0YSkNCnN1bW1hcnkoY2xhc3NhbGxsb2dpc3RpYzEpDQoNCg0KDQoNCmBgYA0KDQoNCiQkDQpsb2cob2RkcykgPSAoLTEsNDE3ZSswMSkgKyAgKDgsMDI5ZS0wNCkucHJpY2UgLSA2LDYyMWUuc3RvcHNvbmUgLTksMTgxZS5zdG9wc3R3b29ybW9yZSAtKDEsOTYxZS0wMSkuZHVyYXRpb24gKygxLDQyMWUtMDEpLmRheXNsZWZ0DQokJA0KDQoqKkdp4bqjaSB0aMOtY2gga+G6v3QgcXXhuqMqKg0KDQotIFRyb25nIHRyxrDhu51uZyBo4bujcCBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwgZ2nDoSB0cuG7iyAkXGJldGFfMSA9KDgsMDI5ZS0wNCkkIHRo4buDIGhp4buHbiBraGkgZ2nDoSB2w6kgbcOheSBiYXkgdMSDbmcgbMOqbiAxMDAwIMSR4buTbmcgdGjDrCBvZGRzIHTEg25nIGzDqm4gMS4wMDA4MDMgbOG6p24uDQoNCi0gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCBnacOhIHRy4buLICRcYmV0YV8yID0gLSA2LDYyMWUkIHRo4buDIGhp4buHbiB4w6FjIHN14bqldCBjaOG7jW4gdsOpIGjhuqFuZyB0aMawxqFuZyBnaWEgY+G7p2Egbmjhu69uZyBjaHV54bq/biBiYXkgY8OzIG3hu5l0IMSRaeG7g20gZOG7q25nIGLDqSBoxqFuIG5o4buvbmcgY2h1eeG6v24gYmF5IGtow7RuZyBjw7MgxJFp4buDbSBk4burbmcuIE9kZHMgY+G7p2Egbmjhu69uZyBjaHV54bq/biBiYXkgY8OzIDEgxJFp4buDbSBk4burbmcgYuG6sW5nIDAuMDAxMzMyMDk4IGzhuqduIG9kZHMgY+G7p2Egbmjhu69uZyBjaHV54bq/biBiYXkga2jDtG5nIMSRaeG7g20gZOG7q25nDQoNCi0gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCBnacOhIHRy4buLICRcYmV0YV8zID0gLTksMTgxZSQgdGjhu4MgaGnhu4duIHjDoWMgc3XhuqV0IGNo4buNbiB2w6kgaOG6oW5nIHRoxrDGoW5nIGdpYSBj4bunYSBuaOG7r25nIGNodXnhur9uIGJheSBjw7MgImzhu5tuIGjGoW4gaG/hurdjIGLhurFuZyAyIiDEkWnhu4NtIGThu6tuZyBiw6kgaMahbiBuaOG7r25nIGNodXnhur9uIGJheSBraMO0bmcgY8OzIMSRaeG7g20gZOG7q25nLiBPZGRzIGPhu6dhIG5o4buvbmcgY2h1eeG6v24gYmF5IGPDsyAibOG7m24gaMahbiBob+G6t2MgYuG6sW5nIDIiIMSRaeG7g20gZOG7q25nIGLhurFuZyAwLjAwMDEwMjk3NzUgbOG6p24gb2RkcyBj4bunYSBuaOG7r25nIGNodXnhur9uIGJheSBraMO0bmcgxJFp4buDbSBk4burbmcNCg0KLSBUcm9uZyB0csaw4budbmcgaOG7o3AgY8OhYyB54bq/dSB04buRIGtow6FjIGtow7RuZyDEkeG7lWksIGdpw6EgdHLhu4sgJFxiZXRhXzQgPSAtKDEsOTYxZS0wMSkkIHRo4buDIGhp4buHbjoga2hpIHRo4budaSBnaWFuIGJheSB0xINuZyBsw6puIDEgZ2nhu50gdGjDrCBvZGRzIGdp4bqjbSAwLjgyMTkzIGzhuqduDQoNCi0gVHJvbmcgdHLGsOG7nW5nIGjhu6NwIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCBnacOhIHRy4buLICAkXGJldGFfNSA9ICAxLjQyMWUtMDEkIHRo4buDIGhp4buHbjoga2hpIHRo4budaSBnaWFuIMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5IHTEg25nIGzDqm4gbeG7mXQgbmfDoHkgdGjDrCBvZGRzIHTEg25nIGzDqm4gMS4xNTI2OTIgbOG6p24uDQoNCioqS2hv4bqjbmcgdGluIGPhuq15IGNobyBo4buHIHPhu5EgaOG7k2kgcXV5KioNCg0KYGBge3Isd2FybmluZz1GQUxTRX0NCmNvbmZpbnQoY2xhc3NhbGxsb2dpc3RpYzEpDQoNCmBgYA0KDQotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwga2hv4bqjbmcgdGluIGPhuq15IGNobyBo4buHIHPhu5EgY+G7p2EgYmnhur9uIFByaWNlIGzDoCBbLTEuNDg4NzU4ZSswMTstMS4zNDk5NDRlKzAxXQ0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGtob+G6o25nIHRpbiBj4bqteSBjaG8gaOG7hyBz4buRIGPhu6dhIGJp4buDdSBoaeG7h24gc3RvcHNvbmUgdHJvbmcgYmnhur9uIHN0b3BzIGzDoCBbNy42NzU5MTNlLTA0Oy02LjE2MTg2OWUrMDBdDQotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwga2hv4bqjbmcgdGluIGPhuq15IGNobyBo4buHIHPhu5EgY+G7p2EgYmnhur9uIHN0b3BzdHdvX29yX21vcmUgbMOgIFstMS4wMDk5ODJlKzAxOy04LjMxNTMxMGUrMDBdDQotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwga2hv4bqjbmcgdGluIGPhuq15IGNobyBo4buHIHPhu5EgY+G7p2EgYmnhur9uIGR1cmF0aW9uIGzDoCBbLTIuMjAyMTQ5ZS0wMTstMS43MjMyMTBlLTAxXQ0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGtob+G6o25nIHRpbiBj4bqteSBjaG8gaOG7hyBz4buRIGPhu6dhIGJp4bq/biBkYXlzX2xlZnQgbMOgIFsxLjI5OTk2NGUtMDE7MS41NDg3MzZlLTAxXQ0KDQojIyAqKk3DtCBow6xuaCBQcm9iaXQgxJFhIGJp4bq/biAqKg0KDQpgYGB7cn0NCmNsYXNzYWxscHJvYml0MSA8LSBnbG0oZmFjdG9yKGNsYXNzLGxldmVscyA9IGMoIkVjb25vbXkiLCJCdXNpbmVzcyIpKSB+ICBwcmljZSArIHN0b3BzICsgZHVyYXRpb24gK2RheXNfbGVmdCwgZmFtaWx5ID0gYmlub21pYWwobGluayA9ICdwcm9iaXQnKSwgZGF0YSA9IHRyYWluX2RhdGEpDQpzdW1tYXJ5KGNsYXNzYWxscHJvYml0MSkNCg0KYGBgDQpQaMawxqFuZyB0csOsbmggaOG7k2kgcXV5Og0KJCRQcm9iaXQoUCh5ID0gXHRleHR7QnVzaW5lc3N9KSkgPSAtNy4wNjkgKyAzLjk4OCBcdGltZXMgMTBeey00fSBcY2RvdCBcdGV4dHtwcmljZX0gLSAwLjA5MTM1IFxjZG90IFx0ZXh0e2R1cmF0aW9ufSAtIDMuNDE5IFxjZG90IFx0ZXh0e3N0b3BzfV97XHRleHR7b25lfX0gLSA0LjQ1OCBcY2RvdCBcdGV4dHtzdG9wc31fe1x0ZXh0e3R3b19vcl9tb3JlfX0gKyAwLjA3MDgxIFxjZG90IFx0ZXh0e2RheXNfbGVmdH0kJA0KDQpIYXkgdmnhur90IGPDoWMga2jDoWM6ICQkXHBpKHk9QnVzaW5lc3MpPVxQaGkoLTcuMDY5ICsgMy45ODggXHRpbWVzIDEwXnstNH0gXGNkb3QgXHRleHR7cHJpY2V9IC0gMC4wOTEzNSBcY2RvdCBcdGV4dHtkdXJhdGlvbn0gLSAzLjQxOSBcY2RvdCBcdGV4dHtzdG9wc31fe1x0ZXh0e29uZX19IC0gNC40NTggXGNkb3QgXHRleHR7c3RvcHN9X3tcdGV4dHt0d29fb3JfbW9yZX19ICsgMC4wNzA4MSBcY2RvdCBcdGV4dHtkYXlzX2xlZnR9KSQkDQoNCioqxJDhu5FpIHbhu5tpIGNodXnhur9uIGJheSBraMO0bmcgY8OzIMSRaeG7g20gZOG7q25nKioNCg0KJCRccGkoeT1CdXNpbmVzcyk9XFBoaSgtNy4wNjkgKyAzLjk4OCBcdGltZXMgMTBeey00fSBcY2RvdCBcdGV4dHtwcmljZX0gLSAwLjA5MTM1IFxjZG90IFx0ZXh0e2R1cmF0aW9ufSArIDAuMDcwODEgXGNkb3QgXHRleHR7ZGF5c19sZWZ0fSkkJA0KKirEkOG7kWkgduG7m2kgY2h1eeG6v24gYmF5IGPDsyBt4buZdCDEkWnhu4NtIGThu6tuZyoqDQoNCiQkXHBpKHk9QnVzaW5lc3MpPVxQaGkoLTcuMDY5ICsgMy45ODggXHRpbWVzIDEwXnstNH0gXGNkb3QgXHRleHR7cHJpY2V9IC0gMC4wOTEzNSBcY2RvdCBcdGV4dHtkdXJhdGlvbn0gLSAzLjQxOSsgMC4wNzA4MSBcY2RvdCBcdGV4dHtkYXlzX2xlZnR9KSQkDQoqKsSQ4buRaSB24bubaSBjaHV54bq/biBiYXkgY8OzIGhhaSBob+G6t2Mgbmhp4buBdSBoxqFuIGhhaSDEkWnhu4NtIGThu6tuZyoqDQoNCiQkXHBpKHk9QnVzaW5lc3MpPVxQaGkoLTcuMDY5ICsgMy45ODggXHRpbWVzIDEwXnstNH0gXGNkb3QgXHRleHR7cHJpY2V9IC0gMC4wOTEzNSBcY2RvdCBcdGV4dHtkdXJhdGlvbn0gLSA0LjQ1OCArIDAuMDcwODEgXGNkb3QgXHRleHR7ZGF5c19sZWZ0fSkkJA0KDQoNCj5OaMawIHbhuq15LCDEkeG7kWkgduG7m2kgY2h1eeG6v24gYmF5IGtow7RuZyBjw7MgxJFp4buDbSBk4burbmcgdGjDrCB4w6FjIHh14bqldCBjaOG7jW4gdsOpIG3DoXkgYmF5IGjhuqFuZyB0aMawxqFuZyBnaWEgc+G6vSBjYW8gaMahbiBsw6AgY2h1eeG6v24gYmF5IGPDsyBt4buZdCDEkWnhu4NtIGThu6tuZywgeMOhYyBzdeG6pXQgY2jhu41uIHbDqSBtw6F5IGJheSBo4bqhbiB0aMawxqFuZyBnaWEgY8OzIG3hu5l0IMSRaeG7g20gZOG7q25nIG5oaeG7gXUgaMahbiB4w6FjIHN14bqldCBjaOG7jW4gdsOpIG3DoXkgYmF5IGPDsyBoYWkgaG/hurdjIG5oaeG7gXUgaMahbiBoYWkgxJFp4buDbSBk4burbmcuDQoNCj5HacOhIHbDqSBjw6BuZyBjYW8gdGjDrCB4w6FjIHN14bqldCDEkeG7gyBjaHV54bq/biBiYXkgbMOgIGjhuqFuZyB0aMawxqFuZyBnaWEgY8OgbmcgbOG7m24gKGjhu4cgc+G7kSAzLjk4OC4xMF57LTR9KQ0KDQo+VGjhu51pIGdpYW4gY2h1eeG6v24gYmF5IGTDoGkgaMahbiwgdGjDrCB4w6FjIHN14bqldCBjaOG7jW4gdsOpIG3DoXkgYmF5IGzDoCB0aMawxqFuZyBnaWEgbOG6oWkgZ2nhuqNtIHh14buRbmcuKGjhu4cgc+G7kSDiiJIwLjA5MTM1KQ0KDQo+U+G7kSBuZ8OgeSBjw7JuIGzhuqFpIHRyxrDhu5tjIGNodXnhur9uIGJheSBjw6BuZyDDrXQgdGjDrCB4w6FjIHN14bqldCBjaOG7jW4gdsOpIGjhuqFuZyB0aMawxqFuZyBnaWEgZ2nhuqNtLiho4buHIHPhu5EgMC4wNzA4MSkNCg0KDQoqKktob+G6o25nIHRpbiBj4bqteSBjaG8gaOG7hyBz4buRIGjhu5NpIHF1eSoqDQoNCmBgYHtyLHdhcm5pbmc9RkFMU0V9DQpjb25maW50KGNsYXNzYWxscHJvYml0MSkNCg0KYGBgDQoNCi0gVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCBraG/huqNuZyB0aW4gY+G6rXkgY2hvIGjhu4cgc+G7kSBj4bunYSBiaeG6v24gUHJpY2UgbMOgIFswLjAwMDM3ODAzNzQ7MC4wMDA0MDkxODM3XQ0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGtob+G6o25nIHRpbiBj4bqteSBjaG8gaOG7hyBz4buRIGPhu6dhIGJp4buDdSBoaeG7h24gc3RvcHNvbmUgdHJvbmcgYmnhur9uIHN0b3BzIGzDoCBbLTMuNTgyNjYyNDM4MyAtMy4xNDM3OTU4Njg3XQ0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGtob+G6o25nIHRpbiBj4bqteSBjaG8gaOG7hyBz4buRIGPhu6dhIGJp4bq/biBzdG9wc3R3b19vcl9tb3JlIGzDoCBbLTQuODI4NTQzMDgwNDstNC4wMjI1MTgwMDU2XQ0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGtob+G6o25nIHRpbiBj4bqteSBjaG8gaOG7hyBz4buRIGPhu6dhIGJp4bq/biBkdXJhdGlvbiBsw6AgWy0wLjEwMjk1MzkwMjI7LTAuMDc5ODQxMzY3Nl0NCi0gVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCBraG/huqNuZyB0aW4gY+G6rXkgY2hvIGjhu4cgc+G7kSBj4bunYSBiaeG6v24gZGF5c19sZWZ0IGzDoCBbMC4wNjM2MTYwMDU3OzAuMDc1MDI5MTY3Nl0NCg0KIyMgKipNw7QgaMOsbmggeMOhYyBzdeG6pXQgdHV54bq/biB0w61uaCDEkWEgYmnhur9uKioNCg0KIyMjICoqTcO0IGjDrG5oIExQTSDEkWEgYmnhur9uKioNCg0KYGBge3J9DQpkZl9jbGVhbmVkIDwtZGZfY2xlYW5lZCAlPiUgbXV0YXRlKGNsYXNzYyA9IGlmX2Vsc2UoY2xhc3MgPT0nRWNvbm9teScsMCwxKSkNCnNldC5zZWVkKDEyMykgDQoNCnRyYWluX2luZGV4X2xwbSA8LSBjcmVhdGVEYXRhUGFydGl0aW9uKGRmX2NsZWFuZWQkY2xhc3MsIHAgPSAwLjgsIGxpc3QgPSBGQUxTRSwgdGltZXMgPSAxKQ0KDQoNCiMgVOG6oW8gdOG6rXAgdHJhaW4gdsOgIHRlc3QgdOG7qyBjaOG7iSBz4buRIMSRw6MgY2jhu41uDQp0cmFpbl9kYXRhX2xwbSA8LSBkZl9jbGVhbmVkW3RyYWluX2luZGV4X2xwbSwgXQ0KdGVzdF9kYXRhX2xwbSA8LSBkZl9jbGVhbmVkWy10cmFpbl9pbmRleF9scG0sIF0NCg0KbHBtIDwtIGdsbShjbGFzc2MgfiBwcmljZSArIHN0b3BzICsgYWlybGluZSArIGR1cmF0aW9uICtkYXlzX2xlZnQsIGRhdGE9dHJhaW5fZGF0YV9scG0pDQoNCnN1bW1hcnkobHBtKQ0KDQpgYGANCg0KICAgVGEgY8OzIHBoxrDGoW5nIHRyw6xuaCBr4bq/dCBxdeG6oyDGsOG7m2MgbMaw4bujbmcgcGjGsMahbmcgdHLDrG5oIHjDoWMgc3XhuqV0IHR1eeG6v24gdMOtbmggOg0KDQokJCBcaGF0e1xwaX09IDAuMDQzNyArMS45NzMuMTBeey01fS5QcmljZS0wLjE1MTEuU3RvcHNvbmUtMC4yMjg4Llx0ZXh0e3N0b3BzdHdvX29yX21vcmV9LTAuMDQxOTUuYWlybGluZUFpckFzaWEtMC4wNzk4NC5cdGV4dHthaXJsaW5lR09fRklSU1R9LTAuMDkzLmFpcmxpbmVJbmRpZ28tMC4wOTc2OS5haXJsaW5lU3BpY2VKZXQtMC4wNjkxLmFpcmxpbmVWaXN0YXJhKzAuMDAyNDk2XHRleHR7ZGF5c19sZWZ0fS0wLjAwMTQyM2R1cmF0aW9uJCQNCg0KIFRyb25nIGJp4bq/biB24buBIGPDoWMgaMOjbmcgYmF5LCB0YSBjw7MgYmnhur9uIHRoYW0gY2hp4bq/dSBsw6AgaMOjbmcgQWlyX0luZGlhIHRhIGPDsyDDvSBuZ2jEqWEgY8OhYyBo4buHIHPhu5EgY+G7p2EgdOG7q25nIGJp4bq/biBnaeG6oyBuaMawIHNhdToNCg0KLSBI4buHIHPhu5EgY+G7p2EgYWlybGluZUFpckFzaWE6IC0wLjA0MTk1IGdp4bqjaSB0aMOtY2ggcuG6sW5nIEtow6FjaCBow6BuZyBiYXkgaMOjbmcgQWlyQXNpYSBjw7MgeMOhYyBzdeG6pXQgY2jhu41uIHbDqSBidXNpbmVzcyB0aOG6pXAgaMahbiAwLjA0MTk1ICg0LjE5NSUpIHNvIHbhu5tpIGtow6FjaCBow6BuZyBiYXkgaMOjbmcgQWlyX0luZGlhIA0KDQotIEjhu4cgc+G7kSBj4bunYSBhaXJsaW5lR09fRklSU1Q6IC0wLjA3OTg0IGdp4bqjaSB0aMOtY2ggcuG6sW5nIEtow6FjaCBow6BuZyBiYXkgaMOjbmcgR09fRklSU1QgY8OzIHjDoWMgc3XhuqV0IGNo4buNbiB2w6kgYnVzaW5lc3MgdGjhuqVwIGjGoW4gMC4wNzk4NCAoNy45ODQlKSBzbyB24bubaSBraMOhY2ggaMOgbmcgYmF5IGjDo25nIEFpcl9JbmRpYS4gDQoNCi0gSOG7hyBz4buRIGPhu6dhIGFpcmxpbmVJbmRpZ286LTAuMDkzIGdp4bqjaSB0aMOtY2ggcuG6sW5nIEtow6FjaCBow6BuZyBiYXkgaMOjbmcgSW5kaWdvIGPDsyB4w6FjIHN14bqldCBjaOG7jW4gdsOpIGJ1c2luZXNzIHRo4bqlcCBoxqFuIDAuMDkzICg5LjMlKSBzbyB24bubaSBraMOhY2ggaMOgbmcgYmF5IGjDo25nIEFpcl9JbmRpYS4NCg0KLSBI4buHIHPhu5EgY+G7p2EgYWlybGluZVNwaWNlSmV0Oi0wLjA5NzY5IGdp4bqjaSB0aMOtY2ggcuG6sW5nIEtow6FjaCBow6BuZyBiYXkgaMOjbmcgU3BpY2VKZXQgY8OzIHjDoWMgc3XhuqV0IGNo4buNbiB2w6kgYnVzaW5lc3MgdGjhuqVwIGjGoW4gMC4wOTc2OSAoOS43NjklKSBzbyB24bubaSBraMOhY2ggaMOgbmcgYmF5IGjDo25nIEFpcl9JbmRpYS4gDQoNCi0gSOG7hyBz4buRIGPhu6dhIGFpcmxpbmVWaXN0YXJhOiAtMC4wNjkxIGdp4bqjaSB0aMOtY2ggcuG6sW5nIEtow6FjaCBow6BuZyBiYXkgaMOjbmcgVmlzdGFyYSBjw7MgeMOhYyBzdeG6pXQgY2jhu41uIHbDqSBidXNpbmVzcyB0aOG6pXAgaMahbiAwLjA2OTEgKDYuOTElKSBzbyB24bubaSBraMOhY2ggaMOgbmcgYmF5IGjDo25nIEFpcl9JbmRpYS4gDQoNClRyb25nIGJp4bq/biBTdG9wIHThu6ljIGNodXnhur9uIGJheSBjw7MgcXXDoSBj4bqjbmgsIHRhIGPDsyBiaeG6v24gdGhhbSBjaGnhur91IGzDoCAibm8iIHThu6ljIGzDoCBjaHV54bq/biBiYXkga2jDtG5nIGPDsyBxdcOhIGPhuqNuaCB0YSBjw7Mgw70gbmdoxKlhIGPDoWMgaOG7hyBz4buRIGPhu6dhIHThu6tuZyBiaeG6v24gZ2nhuqMgbmjGsCBzYXU6DQoNCi0gxJDhu5FpIHbhu5tpIGjhu4cgc+G7kSBj4bunYSBiaeG6v24gc3RvcHNvbmUgOiAtMC4xNTExIGdp4bqjaSB0aMOtY2ggcuG6sW5nIHjDoWMgc3XhuqV0IGNo4buNbiB2w6kgaOG6oW5nIHRoxrDGoW5nIGdpYSBj4bunYSBuaOG7r25nIGNodXnhur9uIGJheSBjw7MgbeG7mXQgxJFp4buDbSBk4burbmcgYsOpIGjGoW4gMTUuMTElIHNvIHbhu5tpIHjDoWMgc3XhuqV0IGNo4buNbiB2w6kgaOG6oW5nIHRoxrDGoW5nIGdpYSBj4bunYSBuaOG7r25nIGNodXnhur9uIGJheSBraMO0bmcgY8OzIMSRaeG7g20gZOG7q25nLg0KDQotIMSQ4buRaSB24bubaSBo4buHIHPhu5EgY+G7p2EgYmnhur9uIHN0b3BzdHdvX29yX21vcmUgOiAtMC4yMjg4IGdp4bqjaSB0aMOtY2ggcuG6sW5nIHjDoWMgc3XhuqV0IGNo4buNbiB2w6kgaOG6oW5nIHRoxrDGoW5nIGdpYSBj4bunYSBuaOG7r25nIGNodXnhur9uIGJheSBjw7MgdOG7qyBoYWkgxJFp4buDbSBxdcOhIGPhuqNuaCBiw6kgaMahbiAyMi44OCUgc28gduG7m2kgeMOhYyBzdeG6pXQgY2jhu41uIHbDqSBo4bqhbmcgdGjGsMahbmcgZ2lhIGPhu6dhIG5o4buvbmcgY2h1eeG6v24gYmF5IGtow7RuZyBjw7MgxJFp4buDbSBk4burbmcuDQoNCi0gxJDhu5FpIHbhu5tpIGjhu4cgc+G7kSBj4bunYSBiaeG6v24gcHJpY2UgOiAkMS45NzMqMTBeey01fSQgY2hvIHRo4bqleSBy4bqxbmcgbuG6v3UgZ2nDoSB2w6kgdMSDbmcgdGjDqm0gMSBuZ8OgbiDEkeG7k25nICwgeMOhYyBzdeG6pXQgY2jhu41uIHbDqSBo4bqhbmcgdGjGsMahbmcgZ2lhIHTEg25nIDAuMDAxOTczJSANCg0KLSDEkOG7kWkgduG7m2kgaOG7hyBz4buRIGPhu6dhIGJp4bq/biBkYXlzX2xlZnQ6ICAwLjAwMjQ5NiwgY2hvIHRo4bqleSBy4bqxbmcgbuG6v3UgdGjhu51pIGdpYW4gxJHhurd0IHbDqSB0csaw4bubYyBjaHV54bq/biBiYXkgdMSDbmcgdGjDqm0gMSBuZ8OgeSAsIHjDoWMgc3XhuqV0IGNo4buNbiB2w6kgaOG6oW5nIHRoxrDGoW5nIGdpYSB0xINuZyAwLjI0OTYlDQoNCi0gxJDhu5FpIHbhu5tpIGjhu4cgc+G7kSBj4bunYSBiaeG6v24gZHVyYXRpb246IC0wLjAwMTQyMyBjaG8gdGjhuqV5IHLhurFuZyBu4bq/dSB0aOG7nWkgZ2lhbiBiYXkgdMSDbmcgdGjDqm0gMSBnaeG7nSwgeMOhYyBzdeG6pXQgY2jhu41uIHbDqSBo4bqhbmcgdGjGsMahbmcgZ2lhIGdp4bqjbSAwLjE0MjMlDQoNCioqS2hv4bqjbmcgdGluIGPhuq15IGNobyBo4buHIHPhu5EgaOG7k2kgcXV5KioNCg0KYGBge3IsIHdhcm5pbmc9RkFMU0V9DQpjb25maW50KGxwbSkNCg0KYGBgDQoNCi0gVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCBraG/huqNuZyB0aW4gY+G6rXkgY2hvIGjhu4cgc+G7kSBj4bunYSBiaeG6v24gUHJpY2UgbMOgIFswLjAwMDAxOTcwMTYzLCAwLjAwMDAxOTc1OTI2XQ0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGtob+G6o25nIHRpbiBj4bqteSBjaG8gaOG7hyBz4buRIGPhu6dhIGJp4bq/biBzdG9wc29uZSBsw6AgWy0wLjE1MzEwODMsIC0wLjE0ODk5ODhdDQotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwga2hv4bqjbmcgdGluIGPhuq15IGNobyBo4buHIHPhu5EgY+G7p2EgYmnhur9uIHN0b3BzdHdvX29yX21vcmUgbMOgIFstMC4yMzIxNDgzLCAtMC4yMjUzNjI3XQ0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGtob+G6o25nIHRpbiBj4bqteSBjaG8gaOG7hyBz4buRIGPhu6dhIGJp4bq/biBhaXJsaW5lQWlyQXNpYSBsw6AgWy0wLjA0NDczNTg3LCAtMC4wMzkxNTQyMl0NCi0gVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCBraG/huqNuZyB0aW4gY+G6rXkgY2hvIGjhu4cgc+G7kSBj4bunYSBiaeG6v24gYWlybGluZUdPX0ZJUlNUIGzDoCAgWy0wLjA4MjI3ODA3LCAtMC4wNzc0MTE4M10gDQotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwga2hv4bqjbmcgdGluIGPhuq15IGNobyBo4buHIHPhu5EgY+G7p2EgYmnhur9uIGFpcmxpbmVJbmRpZ28gbMOgIFstMC4wOTUwOTExNCwgLTAuMDkwOTE1NTBdDQotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwga2hv4bqjbmcgdGluIGPhuq15IGNobyBo4buHIHPhu5EgY+G7p2EgYmnhur9uIGFpcmxpbmVTcGljZUpldCBsw6AgWy0wLjEwMTE1MjAsIC0wLjA5NDIzNDk5XQ0KLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGtob+G6o25nIHRpbiBj4bqteSBjaG8gaOG7hyBz4buRIGPhu6dhIGJp4bq/biBhaXJsaW5lVmlzdGFyYSBsw6AgWy0wLjA3MDUxNzI4LCAtMC4wNjc2OTA4Nl0NCi0gVuG7m2kgbeG7qWMgw70gbmdoxKlhIDUlLCBraG/huqNuZyB0aW4gY+G6rXkgY2hvIGjhu4cgc+G7kSBj4bunYSBiaeG6v24gZHVyYXRpb24gbMOgICBbLTAuMDAxNTI0NjUwLCAtMC4wMDEzMjE3MTZdDQotIFbhu5tpIG3hu6ljIMO9IG5naMSpYSA1JSwga2hv4bqjbmcgdGluIGPhuq15IGNobyBo4buHIHPhu5EgY+G7p2EgYmnhur9uIGRheXNfbGVmdCBsw6AgWzAuMDAyNDU0NDM5LCAwLjAwMjUzNzkzMV0NCg0KIyMgKipDw6FjIHRpw6p1IGNow60gxJHDoW5oIGdpw6EgbcO0IGjDrG5oKioNCg0KIyMjICoqQ2jhu4kgc+G7kSBBSUMqKg0KDQpNw7QgaMOsbmggTG9naXN0aWMgxJFhIGJp4bq/bjogMTc1My44DQpNw7QgaMOsbmggUHJvYml0IMSRYSBiaeG6v246IDE3NTguOQ0KTcO0IGjDrG5oIExQTSDEkWEgYmnhur9uOiAtMjYxMDU3DQpE4buxYSB0aGVvIGNo4buJIHPhu5EgQUlDIGPhu6dhIG3DtCBow6xuaCB0aMOsIG3DtCBow6xuaCBMUE0gbMOgIG3DtCBow6xuaCB04buRdCBuaOG6pXQNCg0KIyMjICoqxJDDoW5oIGdpw6EgbcO0IGjDrG5oOiBNYSB0cuG6rW4gbmjhuqdtIGzhuqtuKioNCg0KVHJvbmcgcGjhuqduIG7DoHkgY2jDum5nIHTDtGkgc+G7rSBk4bulbmcgxJHGsOG7nW5nIGNvbmcgUk9DIMSR4buDIHjDoWMgxJHhu4tuaCBuZ8aw4buhbmcgdOG7kWkgxrB1IMSR4buDIHBow6JuIGxv4bqhaSBoYWkgaOG6oW5nIHbDqSB04burIG3DtCBow6xuaCBk4buxIMSRb8Ohbi4gU2F1IMSRw7MgbOG6rXAgbWEgdHLhuq1uIG5o4bqnbSBs4bqrbiBj4bunYSBnacOhIHRy4buLIGThu7EgxJFvw6FuIHbDoCBnacOhIHRy4buLIHRo4buxYyB04bq/IGPhu6dhIGJhIG3DtCBow6xuaCBo4buTaSBxdXkuDQoNCioqTcO0IGjDrG5oIExvZ2lzdGljKioNCg0KYGBge3J9DQpwcmVkaWN0bG9naXQgPC0gcHJlZGljdC5nbG0oY2xhc3NhbGxsb2dpc3RpYzEsIG5ld2RhdGEgPSB0ZXN0X2RhdGEsIHR5cGU9InJlc3BvbnNlIikNCg0KIyBU4bqhbyDEkeG7kWkgdMaw4bujbmcgUk9DDQpyb2NfY3VydmUgPC0gcm9jKHRlc3RfZGF0YSRjbGFzcywgcHJlZGljdGxvZ2l0KQ0KDQojIFbhur0gxJHGsOG7nW5nIGNvbmcgUk9DDQpwbG90KHJvY19jdXJ2ZSwgbWFpbj0iUk9DIEN1cnZlIiwgY29sPSJibHVlIikNCg0KIyBUw61uaCB0b8OhbiBBVUMNCg0KYXVjX3ZhbHVlIDwtIGF1Yyhyb2NfY3VydmUpDQphdWNfdmFsdWUgI03hu5l0IHRyb25nIG5o4buvbmcgY2jhu4kgc+G7kSDEkcOhbmggZ2nDoSBtw7QgaMOsbmggDQoNCiMgVMOtbmggdG/DoW4gbmfGsOG7oW5nIHThu5FpIMawdSBk4buxYSB0csOqbiBZb3VkZW4ncyBKIHN0YXRpc3RpYw0KDQpjb29yZHMgPC0gY29vcmRzKHJvY19jdXJ2ZSwgImJlc3QiLCByZXQgPSAidGhyZXNob2xkIikNCm9wdGltYWxfdGhyZXNob2xkIDwtIGNvb3JkcyR0aHJlc2hvbGQNCm9wdGltYWxfdGhyZXNob2xkDQoNCg0KcHJlZGljdGVkbG9naXQgPC0gaWZlbHNlKHByZWRpY3Rsb2dpdCA+ICAwLjMxNTk3MjEsICJCdXNpbmVzcyIsICJFY29ub215IikNCg0KIyBU4bqhbyBjb25mdXNpb24gbWF0cml4IMSR4buDIMSRw6FuaCBnacOhIGhp4buHdSBzdeG6pXQNCmNvbmZ1c2lvbl9tYXRyaXggPC0gdGFibGUoUHJlZGljdGVkID0gcHJlZGljdGVkbG9naXQsIEFjdHVhbCA9IHRlc3RfZGF0YSRjbGFzcykNCmFkZG1hcmdpbnMoY29uZnVzaW9uX21hdHJpeCkNCmNvbmZ1c2lvbk1hdHJpeCh0YWJsZShQcmVkaWN0ZWQgPSBwcmVkaWN0ZWRsb2dpdCwgQWN0dWFsID0gdGVzdF9kYXRhJGNsYXNzKSkNCg0KYGBgDQotIEdpw6EgdHLhu4sgQWNjdXJhY3kgPSAgJFxmcmFje1xtYXRocm17MTg1NjIrNDEyODh9IH17NTk5MTB9PTk5LjklJA0KLSBHacOhIHRy4buLIFNlbnNpdGl2aXR5ID0gICRcZnJhY3tcbWF0aHJtezE4NTYyfSB9ezE4NTc3fT05OS45JSQNCi0gR2nDoSB0cuG7iyBTcGVjaWZpY2l0eSA9ICAkXGZyYWN7NDEyODh9ezQxMzMzfT05OS44OSUkDQoNCg0KKipNw7QgaMOsbmggUHJvYml0KioNCg0KDQpgYGB7cn0NCnByZWRpY3Rwcm9iaXQgPC0gcHJlZGljdC5nbG0oY2xhc3NhbGxwcm9iaXQxLCBuZXdkYXRhID0gdGVzdF9kYXRhLCB0eXBlPSJyZXNwb25zZSIpDQoNCiMgVOG6oW8gxJHhu5FpIHTGsOG7o25nIFJPQw0Kcm9jX2N1cnZlX3Byb2JpdCA8LSByb2ModGVzdF9kYXRhJGNsYXNzLCBwcmVkaWN0cHJvYml0KQ0KDQojIFbhur0gxJHGsOG7nW5nIGNvbmcgUk9DDQpwbG90KHJvY19jdXJ2ZV9wcm9iaXQsIG1haW49IlJPQyBDdXJ2ZSBQcm9iaXQiLCBjb2w9ImJsdWUiKQ0KDQojIFTDrW5oIHRvw6FuIEFVQw0KDQphdWNfdmFsdWVfcHJvYml0IDwtIGF1Yyhyb2NfY3VydmVfcHJvYml0KQ0KYXVjX3ZhbHVlX3Byb2JpdCAjTeG7mXQgdHJvbmcgbmjhu69uZyBjaOG7iSBz4buRIMSRw6FuaCBnacOhIG3DtCBow6xuaCANCg0KIyBUw61uaCB0b8OhbiBuZ8aw4buhbmcgdOG7kWkgxrB1IGThu7FhIHRyw6puIFlvdWRlbidzIEogc3RhdGlzdGljDQoNCmNvb3Jkc19wcm9iaXQgPC0gY29vcmRzKHJvY19jdXJ2ZV9wcm9iaXQsICJiZXN0IiwgcmV0ID0gInRocmVzaG9sZCIpDQpvcHRpbWFsX3RocmVzaG9sZF9wcm9iaXQgPC0gY29vcmRzJHRocmVzaG9sZA0Kb3B0aW1hbF90aHJlc2hvbGRfcHJvYml0DQoNCg0KcHJlZGljdGVkcHJvYml0IDwtIGlmZWxzZShwcmVkaWN0cHJvYml0ID4gIDAuMzE1OTcyMSwgIkJ1c2luZXNzIiwgIkVjb25vbXkiKQ0KDQojIFThuqFvIGNvbmZ1c2lvbiBtYXRyaXggxJHhu4MgxJHDoW5oIGdpw6EgaGnhu4d1IHN14bqldA0KY29uZnVzaW9uX21hdHJpeF9wcm9iaXQgPC0gdGFibGUoUHJlZGljdGVkID0gcHJlZGljdGVkcHJvYml0LCBBY3R1YWwgPSB0ZXN0X2RhdGEkY2xhc3MpDQphZGRtYXJnaW5zKGNvbmZ1c2lvbl9tYXRyaXhfcHJvYml0KQ0KY29uZnVzaW9uTWF0cml4KHRhYmxlKFByZWRpY3RlZCA9IHByZWRpY3RlZHByb2JpdCwgQWN0dWFsID0gdGVzdF9kYXRhJGNsYXNzKSkNCg0KYGBgDQoNCioqTcO0IGjDrG5oIExQTSoqDQoNCmBgYHtyfQ0KDQpwcmVkaWN0bHBtIDwtIHByZWRpY3QuZ2xtKGxwbSwgbmV3ZGF0YSA9IHRlc3RfZGF0YSwgdHlwZT0icmVzcG9uc2UiKQ0KIyBU4bqhbyDEkeG7kWkgdMaw4bujbmcgUk9DDQpyb2NfY3VydmVfbHBtIDwtIHJvYyh0ZXN0X2RhdGEkY2xhc3MsIHByZWRpY3RscG0pDQoNCiMgVuG6vSDEkcaw4budbmcgY29uZyBST0MNCnBsb3Qocm9jX2N1cnZlX2xwbSwgbWFpbj0iUk9DIEN1cnZlIExQTSIsIGNvbD0iYmx1ZSIpDQoNCiMgVMOtbmggdG/DoW4gQVVDDQoNCmF1Y192YWx1ZV9scG0gPC0gYXVjKHJvY19jdXJ2ZV9scG0pDQphdWNfdmFsdWVfbHBtICNN4buZdCB0cm9uZyBuaOG7r25nIGNo4buJIHPhu5EgxJHDoW5oIGdpw6EgbcO0IGjDrG5oIA0KDQojIFTDrW5oIHRvw6FuIG5nxrDhu6FuZyB04buRaSDGsHUgZOG7sWEgdHLDqm4gWW91ZGVuJ3MgSiBzdGF0aXN0aWMNCg0KY29vcmRzX2xwbSA8LSBjb29yZHMocm9jX2N1cnZlX2xwbSwgImJlc3QiLCByZXQgPSAidGhyZXNob2xkIikNCm9wdGltYWxfdGhyZXNob2xkX2xwbSA8LSBjb29yZHMkdGhyZXNob2xkDQpvcHRpbWFsX3RocmVzaG9sZF9scG0NCg0KDQpwcmVkaWN0ZWRscG0gPC0gaWZlbHNlKHByZWRpY3RscG0gPiAgMC4zMTU5NzIxLCAiQnVzaW5lc3MiLCAiRWNvbm9teSIpDQoNCiMgVOG6oW8gY29uZnVzaW9uIG1hdHJpeCDEkeG7gyDEkcOhbmggZ2nDoSBoaeG7h3Ugc3XhuqV0DQpjb25mdXNpb25fbWF0cml4X2xwbSA8LSB0YWJsZShQcmVkaWN0ZWQgPSBwcmVkaWN0ZWRscG0sIEFjdHVhbCA9IHRlc3RfZGF0YSRjbGFzcykNCmFkZG1hcmdpbnMoY29uZnVzaW9uX21hdHJpeF9scG0pDQpjb25mdXNpb25NYXRyaXgodGFibGUoUHJlZGljdGVkID0gcHJlZGljdGVkbHBtLCBBY3R1YWwgPSB0ZXN0X2RhdGEkY2xhc3MpKQ0KDQpgYGANCg0KLSBHacOhIHRy4buLIEFjY3VyYWN5ID0gICRcZnJhY3tcbWF0aHJtezE4NTc2KzQxMjEwfSB9ezU5OTEwfT05OS43OSUkDQotIEdpw6EgdHLhu4sgU2Vuc2l0aXZpdHkgPSAgJFxmcmFje1xtYXRocm17MTg1NzZ9IH17MTg1Nzd9PTk5Ljk5JSQNCi0gR2nDoSB0cuG7iyBTcGVjaWZpY2l0eSA9ICAkXGZyYWN7IDQxMjEwfXs0MTMzM309OTkuNyUkDQoNCiMgKipL4bq/dCBsdeG6rW4gdsOgIGtp4bq/biBuZ2jhu4sqKg0KDQojIyAqKkvhur90IGx14bqtbioqDQoNCkLDoGkgbmdoacOqbiBj4bupdSDEkcOjIHjDoWMgxJHhu4tuaCDEkcaw4bujYyBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGjDoG5oIHZpIGzhu7FhIGNo4buNbiBo4bqhbmcgdsOpIGPhu6dhIGtow6FjaCBow6BuZy4gVOG7qyBtw7QgaMOsbmggcGjDom4gdMOtY2ggxJHGoW4gYmnhur9uIGPhu6dhIHThu6tuZyB54bq/dSB04buRIMSR4buDIHjDoWMgxJHhu4tuaCBz4buxIOG6o25oIGjGsOG7n25nIGPhu6dhIHThu6tuZyB54bq/dSB04buRIMSR4bq/biB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgY+G7p2Ega2jDoWNoIGjDoG5nLCB0YSB0aOG6pXkgxJHGsOG7o2MgY8OzIGhhaSB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIHTDrWNoIGPhu7FjIMSR4bq/biB4w6FjIHN14bqldCBuw6B5IGzDoCBraG/huqNuZyB0aOG7nWkgZ2lhbiBkaSBjaHV54buDbiBj4bunYSBjaHV54bq/biBiYXkgdsOgIGdpw6EgdsOpLiBDw7MgaGFpIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgdGnDqnUgY+G7sWMgbMOgIHRo4budaSBnaWFuIMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5LCBz4buRIMSRaeG7g20gZOG7q25nIGNow6JuIGPhu6dhIGNodXnhur9uIGJheS4gVHV5IG5oacOqbiwga2hpIHBow6JuIHTDrWNoIMSRYSBiaeG6v24gxJHhu4MgeGVtIHPhu7Eg4bqjbmggaMaw4bufbmcgbOG6q24gbmhhdSBj4bunYSBjw6FjIHnhur91IHThu5EgxJHhu5ljIGzhuq1wIGPDsyDhuqNuaCBoxrDhu59uZyB0cuG7sWMgdGnhur9wIMSR4bq/biBr4bq/dCBxdeG6oyBjdeG7kWkgY8O5bmcgduG7gSB4w6FjIHN14bqldCBs4buxYSBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgY+G7p2Ega2jDoWNoIGjDoG5nIGhheSBraMO0bmcsIHRhIHRodSDEkcaw4bujYyBr4bq/dCBxdeG6oyBjw7Mgc+G7sSBraMOhYyBiaeG7h3Qga2jDoSBxdWFuIHRy4buNbmcgdHJvbmcga+G6v3QgcXXhuqMgY+G7p2EgbcO0IGjDrG5oLg0KS+G6v3QgcXXhuqMgdOG7qyBtw7QgaMOsbmggTG9naXN0aWMgdsOgIFByb2JpdCDEkWEgYmnhur9uIGNobyB0aOG6pXkgY8OzIGLhu5FuIHnhur91IHThu5EgY2jDrW5oIOG6o25oIGjGsOG7n25nIMSR4bq/biB4w6FjIHN14bqldCBs4buxYSBjaOG7jW4gaOG6oW5nIHbDqTogZ2nDoSB2w6ksIHPhu5EgxJFp4buDbSBk4burbmcgY+G7p2EgY2h1eeG6v24gYmF5LCB0aOG7nWkgZ2lhbiBkaSBjaHV54buDbiwgdsOgIHRo4budaSBnaWFuIMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5LiBHacOhIHbDqSB2w6AgdGjhu51pIGdpYW4gxJHhurd0IHbDqSB0csaw4bubYyBjaHV54bq/biBiYXkgY8OzIOG6o25oIGjGsOG7n25nIHTDrWNoIGPhu7FjIMSR4bq/biB4w6FjIHN14bqldCBs4buxYSBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEuIE5nxrDhu6NjIGzhuqFpLCBz4buRIMSRaeG7g20gZOG7q25nIHbDoCB0aOG7nWkgZ2lhbiBkaSBjaHV54buDbiBj4bunYSBjaHV54bq/biBiYXkgbOG6oWkgY8OzIOG6o25oIGjGsOG7n25nIHRpw6p1IGPhu7FjIMSR4bq/biB4w6FjIHN14bqldCBs4buxYSBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgY+G7p2Ega2jDoWNoIGjDoG5nLiBL4bq/dCBxdeG6oyB04burIG3DtCBow6xuaCB4w6FjIHN14bqldCB0dXnhur9uIHTDrW5oIGNobyB0aOG6pXkgY8OzIG7Eg20geeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24geMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyB2w6ksIGJhbyBn4buTbSBnacOhIHbDqSwgc+G7kSDEkWnhu4NtIGThu6tuZyBj4bunYSBjaHV54bq/biBiYXksIHRo4budaSBnaWFuIGRpIGNodXnhu4NuLCB0aOG7nWkgZ2lhbiDEkeG6t3QgdsOpIHRyxrDhu5tjIGNodXnhur9uIGJheSwgdsOgIGjDo25nIGjDoG5nIGtow7RuZy4gVMawxqFuZyB04buxIG5oxrAgY8OhYyBtw7QgaMOsbmggTG9naXN0aWMgdsOgIFByb2JpdCwgZ2nDoSB2w6kgdsOgIHRo4budaSBnaWFuIMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5IGPDsyDhuqNuaCBoxrDhu59uZyB0w61jaCBj4buxYyDEkeG6v24geMOhYyBzdeG6pXQgY2jhu41uIGjhuqFuZyB2w6kgdGjGsMahbmcgZ2lhLCB0cm9uZyBraGkgY8OhYyB54bq/dSB04buRIGPDsm4gbOG6oWkgY8OzIOG6o25oIGjGsOG7n25nIHRpw6p1IGPhu7FjIMSR4bq/biB4w6FjIHN14bqldCBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgY+G7p2Ega2jDoWNoIGjDoG5nLg0KVOG7qyBjw6FjIGNo4buJIHPhu5EgxJHGsOG7o2MgcsO6dCByYSB04burIG1hIHRy4bqtbiBuaOG6p20gbOG6q24gY+G7p2EgbcO0IGjDrG5oIGNobyB0aOG6pXkgcuG6sW5nIGPhuqMgMyBtw7QgaMOsbmggTG9naXN0aWMsIFByb2JpdCB2w6AgbcO0IGjDrG5oIHjDoWMgc3XhuqV0IHR1eeG6v24gdMOtbmggxJHhu4F1IGhv4bqhdCDEkeG7mW5nIHLhuqV0IHThu5F0LiBL4bq/dCBxdeG6oyBk4buxIGLDoW8gdGjhu4MgaGnhu4duIMSRw7puZyBoxqFuIDk5JSBr4bq/dCBxdeG6oyB0aOG7sWMgdOG6vy4NCg0KDQojIyAqKktp4bq/biBuZ2jhu4sqKg0KDQpU4burIGvhur90IGx14bqtbiB04burIGLDoGkgbmdoacOqbiBj4bupdSB24buBIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gaMOgbmggdmkgbOG7sWEgY2jhu41uIGjhuqFuZyB2w6kgY+G7p2Ega2jDoWNoIGjDoG5nLCB0w6FjIGdp4bqjIGPDsyBt4buZdCBz4buRIGtodXnhur9uIG5naOG7iyBjaG8gY8OhYyBow6NuZyBow6BuZyBraMO0bmcgbmjhurFtIHThu5FpIMawdSBow7NhIHZp4buHYyB0aeG6v3AgY+G6rW4gdsOgIHRodSBow7p0IGtow6FjaCBow6BuZyB0cm9uZyB2aeG7h2MgbOG7sWEgY2jhu41uIGPDoWMgaOG6oW5nIHbDqSBraMOhYyBuaGF1Lg0KIFRyxrDhu5tjIGjhur90LCBow6NuZyBow6BuZyBraMO0bmcgbsOqbiB0aGnhur90IGvhur8gY8OhYyBnw7NpIGdpw6EgdsOpIGjhuqVwIGThuqtuLCDEkeG6t2MgYmnhu4d0IGzDoCB2w6BvIGPDoWMgdGjhu51pIMSRaeG7g20gY8OzIG5odSBj4bqndSBjYW8gaG/hurdjIHRyb25nIGPDoWMgY2hp4bq/biBk4buLY2gga2h1eeG6v24gbcOjaSwgY8OhYyBjaMawxqFuZyB0csOsbmggZ2nhuqNtIGdpw6EgxJHhurdjIGJp4buHdCBz4bq9IGdpw7pwIHRodSBow7p0IHRow6ptIG5oaeG7gXUga2jDoWNoIGjDoG5nIMSR4bq3YyBiaeG7h3QgbMOgIGtow6FjaCBow6BuZyDhu58gdsOpIGjhuqFuZyBwaOG7lSB0aMO0bmcuDQpUaOG7qSBoYWksIGPDoWMgaMOjbmcgaMOgbmcga2jDtG5nIGPhuqduIHTEg25nIGPGsOG7nW5nIHF14bqjbiBsw70gc+G7kSDEkWnhu4NtIGThu6tuZyBjaMOibiBj4bunYSBjaHV54bq/biBiYXkuIFZp4buHYyBnaeG6o20gc+G7kSDEkWnhu4NtIGThu6tuZyBjaMOibiBjaG8gY8OhYyBjaHV54bq/biBiYXkgc+G6vSB0xINuZyBraOG6oyBuxINuZyBs4buxYSBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEgY+G7p2Ega2jDoWNoIGjDoG5nLiBWaeG7h2MgdOG7kWkgxrB1IGjDs2EgdGjhu51pIGdpYW4gZGkgY2h1eeG7g24gY+G7p2EgY2h1eeG6v24gYmF5IGzDoCBt4buZdCB54bq/dSB04buRIHF1YW4gdHLhu41uZy4gQ+G6o2kgdGhp4buHbiBs4buZIHRyw6xuaCBiYXkgxJHhu4MgZ2nhuqNtIHRo4budaSBnaWFuIGRpIGNodXnhu4NuIGhv4bq3YyBjaOG7jW4gY8OhYyDEkcaw4budbmcgYmF5IHRy4buxYyB0aeG6v3Agc+G6vSBnacO6cCB0aeG6v3Qga2nhu4dtIHRo4budaSBnaWFuIGNobyBow6BuaCBraMOhY2ggaOG6oW5nIHRoxrDGoW5nIGdpYS4gUXXhuqNuZyBiw6EgY8OhYyBjaHV54bq/biBiYXkgY8OzIHRo4budaSBnaWFuIGRpIGNodXnhu4NuIG5n4bqvbiBoxqFuIGPFqW5nIGzDoCBt4buZdCBjw6FjaCB0aHUgaMO6dCBraMOhY2ggaMOgbmcgY8OzIG5odSBj4bqndSBkaSBjaHV54buDbiBuaGFuaCBjaMOzbmcuDQpUaOG7qSBiYSwgY8OhYyBow6NuZyBow6BuZyBraMO0bmcgbsOqbiBxdeG6o24gbMO9IHRo4budaSBnaWFuIMSR4bq3dCB2w6kgdHLGsOG7m2MgY2h1eeG6v24gYmF5IG3hu5l0IGPDoWNoIGhp4buHdSBxdeG6oy4gS2h1eeG6v24ga2jDrWNoIGtow6FjaCBow6BuZyDEkeG6t3QgdsOpIHPhu5ttIHRow7RuZyBxdWEgY8OhYyBjaMawxqFuZyB0csOsbmggZ2nhuqNtIGdpw6EgaG/hurdjIMawdSDEkcOjaSDEkeG6t2MgYmnhu4d0IGNobyBuaOG7r25nIGFpIMSR4bq3dCB2w6kgdHLGsOG7m2MgbeG7mXQga2hv4bqjbmcgdGjhu51pIGdpYW4gZMOgaSBz4bq9IGdpw7pwIHTEg25nIGzGsOG7o25nIHbDqSBiw6FuIHJhLiDEkOG7k25nIHRo4budaSwgdOG6oW8gcmEgY8OhYyBnw7NpIGtodXnhur9uIG3Do2kgY2hvIGtow6FjaCBow6BuZyDEkeG6t3QgdsOpIHbDoG8gcGjDunQgY3Xhu5FpLCDEkeG6o20gYuG6o28gcuG6sW5nIGPDoWMgZ8OzaSBuw6B5IHbhuqtuIG1hbmcgbOG6oWkgbOG7o2kgw61jaCBjaG8gdmnhu4djIGNo4buNbiBo4bqhbmcgdsOpIHRoxrDGoW5nIGdpYS4NClRo4bupIHTGsCwgY+G6o2kgdGhp4buHbiBjaOG6pXQgbMaw4bujbmcgZOG7i2NoIHbhu6UgdsOgIHjDonkgZOG7sW5nIHRoxrDGoW5nIGhp4buHdSBow6NuZyBow6BuZyBraMO0bmcgbMOgIG3hu5l0IGNoaeG6v24gbMaw4bujYyBraMO0bmcgdGjhu4MgdGhp4bq/dS4gSMOjbmcgaMOgbmcga2jDtG5nIGPhuqduIMSR4bqjbSBi4bqjbyBjdW5nIGPhuqVwIGThu4tjaCB24bulIHh14bqldCBz4bqvYyDhu58gbeG7jWkga2jDrWEgY+G6oW5oLCB04burIGThu4tjaCB24bulIHRyw6puIG3DoXkgYmF5IMSR4bq/biBk4buLY2ggduG7pSBraMOhY2ggaMOgbmcgdHLGsOG7m2MgdsOgIHNhdSBjaHV54bq/biBiYXkuIFjDonkgZOG7sW5nIHbDoCBkdXkgdHLDrCBt4buZdCB0aMawxqFuZyBoaeG7h3UgbeG6oW5oIG3hur0sIG5o4bqlbiBt4bqhbmggdsOgbyBjaOG6pXQgbMaw4bujbmcgZOG7i2NoIHbhu6UgaOG6oW5nIHRoxrDGoW5nIGdpYSB2w6Agbmjhu69uZyBs4bujaSDDrWNoIG3DoCBraMOhY2ggaMOgbmcgY8OzIHRo4buDIG5o4bqtbiDEkcaw4bujYyBraGkgbOG7sWEgY2jhu41uIGjhuqFuZyB2w6kgbsOgeSBz4bq9IGdpw7pwIHTEg25nIGPGsOG7nW5nIGzDsm5nIHRpbiB2w6Agc+G7sSBow6BpIGzDsm5nIGPhu6dhIGtow6FjaCBow6BuZy4gVmnhu4djIG7Dom5nIGNhbyB0cuG6o2kgbmdoaeG7h20ga2jDoWNoIGjDoG5nIGLhurFuZyBjw6FjaCB04bqhbyByYSBjw6FjIHRy4bqjaSBuZ2hp4buHbSDEkeG7mWMgxJHDoW8gdsOgIMSRw6FuZyBuaOG7myBuaMawIGLhu69hIMSDbiBjYW8gY+G6pXAsIGNo4buXIG5n4buTaSBy4buZbmcgcsOjaSB2w6AgdGhv4bqjaSBtw6FpLCBk4buLY2ggduG7pSBnaeG6o2kgdHLDrSBjYW8gY+G6pXAgdsOgIGThu4tjaCB24bulIGjhu5cgdHLhu6MgxJHhurdjIGJp4buHdCBz4bq9IGdpw7pwIGPDoWMgaMOjbmcgYmF5IMSR4buDIGzhuqFpIGThuqV1IOG6pW4gduG7m2kga2jDoWNoIGjDoG5nLiBUaHUgdGjhuq1wIHBo4bqjbiBo4buTaSBj4bunYSBraMOhY2ggaMOgbmcgdGjGsOG7nW5nIHh1ecOqbiDEkeG7gyBsacOqbiB04bulYyBj4bqjaSB0aGnhu4duIHbDoCB0w7l5IGNo4buJbmggZOG7i2NoIHbhu6UgdGhlbyBuaHUgY+G6p3UgdsOgIG1vbmcgbXXhu5FuIGPhu6dhIGjhu40gbMOgIMSRaeG7gXUgY+G6p24gdGhp4bq/dC4NCkN14buRaSBjw7luZywgY2hp4bq/biBsxrDhu6NjIHRp4bq/cCB0aOG7iyB2w6AgdHJ1eeG7gW4gdGjDtG5nIGhp4buHdSBxdeG6oyBz4bq9IMSRw7NuZyB2YWkgdHLDsiBxdWFuIHRy4buNbmcgdHJvbmcgdmnhu4djIHRodSBow7p0IGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEuIFPhu60gZOG7pW5nIGPDoWMga8OqbmggdHJ1eeG7gW4gdGjDtG5nIHjDoyBo4buZaSB2w6AgY8OhYyBjaGnhur9uIGThu4tjaCBxdeG6o25nIGPDoW8gxJHhu4MgcXXhuqNuZyBiw6EgY8OhYyB54bq/dSB04buRIHTDrWNoIGPhu7FjIG5oxrAgZ2nDoSB2w6kgaOG6pXAgZOG6q24sIHRo4budaSBnaWFuIMSR4bq3dCB2w6kgbGluaCBob+G6oXQgdsOgIGPDoWMgZOG7i2NoIHbhu6UgY2FvIGPhuqVwIHPhur0gZ2nDunAgdGnhur9wIGPhuq1uIMSRw7puZyDEkeG7kWkgdMaw4bujbmcga2jDoWNoIGjDoG5nIG3hu6VjIHRpw6p1LiBU4bqhbyBu4buZaSBkdW5nIHRp4bq/cCB0aOG7iyBuaOG6r20gbeG7pWMgdGnDqnUgxJHhur9uIG5ow7NtIGtow6FjaCBow6BuZyBjw7Mgbmh1IGPhuqd1IGNhbyB24buBIGThu4tjaCB24bulIGjhuqFuZyB0aMawxqFuZyBnaWEgbmjGsCBkb2FuaCBuaMOibiwgbmfGsOG7nWkgY8OzIHRodSBuaOG6rXAgY2FvIGhv4bq3YyBuaOG7r25nIG5nxrDhu51pIHnDqnUgdGjDrWNoIGR1IGzhu4tjaCBjYW8gY+G6pXAgY8WpbmcgbMOgIG3hu5l0IGNoaeG6v24gbMaw4bujYyDEkcOhbmcgbMawdSDDvS4NCkLhurFuZyBjw6FjaCB0aOG7sWMgaGnhu4duIG5o4buvbmcga2h1eeG6v24gbmdo4buLIG7DoHksIGPDoWMgaMOjbmcgaMOgbmcga2jDtG5nIGPDsyB0aOG7gyBj4bqjaSB0aGnhu4duIHPhu7EgaMOgaSBsw7JuZyBj4bunYSBraMOhY2ggaMOgbmcgdsOgIHTEg25nIGto4bqjIG7Eg25nIGtow6FjaCBow6BuZyBjaOG7jW4gaOG6oW5nIHbDqSB0aMawxqFuZyBnaWEsIHThu6sgxJHDsyB04buRaSDGsHUgaMOzYSBkb2FuaCB0aHUgdsOgIG7Dom5nIGNhbyB24buLIHRo4bq/IGPhuqFuaCB0cmFuaCB0csOqbiB0aOG7iyB0csaw4budbmcuDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQo=