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

1.1 Thông tin về bộ dữ liệu

Cấu trúc của bộ dữ liệu

ccp <- read.csv("D:/BAI TAP/PTDLDT/Customer-Churn-Prediction.csv", header = TRUE)
str(ccp)
## 'data.frame':    7043 obs. of  12 variables:
##  $ customerID      : chr  "7590-VHVEG" "5575-GNVDE" "3668-QPYBK" "7795-CFOCW" ...
##  $ gender          : chr  "Female" "Male" "Male" "Male" ...
##  $ Dependents      : chr  "No" "No" "No" "No" ...
##  $ tenure          : int  1 34 2 45 2 8 22 10 28 62 ...
##  $ PhoneService    : chr  "No" "Yes" "Yes" "No" ...
##  $ InternetService : chr  "DSL" "DSL" "DSL" "DSL" ...
##  $ Contract        : chr  "Month-to-month" "One year" "Month-to-month" "One year" ...
##  $ PaperlessBilling: chr  "Yes" "No" "Yes" "No" ...
##  $ PaymentMethod   : chr  "Electronic check" "Mailed check" "Mailed check" "Bank transfer (automatic)" ...
##  $ MonthlyCharges  : num  29.9 57 53.9 42.3 70.7 ...
##  $ TotalCharges    : num  29.9 1889.5 108.2 1840.8 151.7 ...
##  $ Churn           : chr  "No" "No" "Yes" "No" ...

Customer-Churn-Prediction.csv là bộ dữ liệu khảo sát quyết định dừng sử dụng dịch vụ của khách hàng. Bộ dữ liệu này bao gồm 12 biến và 7043 quan sát.

  • customerID: Mã khách hàng
  • gender: Giới tính (bao gồm Male và Female)
  • Dependents: Độc lập kinh tế (No và Yes)
  • tenure: Số tháng đã gắn bó với dịch vụ
  • PhoneService: Dịch vụ điện thoại (No và Yes)
  • InternetService: Loại dịch vụ internet (DSL, Fiber optic và No)
  • Contract: Hạn hợp đồng (Ngắn hạn: Month-to-month; Dài hạn: One year, Two year)
  • PaperlessBilling: Hóa đơn điện tử (No và Yes)
  • PaymentMethod: Phương thức thanh toán (Tự động: Bank transfer, Credit card; Thủ công: Electronic check, Mailed check)
  • MonthlyCharges: Số tiền trả hàng tháng
  • TotalCharges: Tổng số tiền đã trả
  • Churn: Dừng sử dụng dịch vụ (No và Yes)

Kiểm tra dữ liệu bị thiếu

sum(is.na(ccp))
## [1] 11
ccp <- na.omit(ccp)

Kết quả cho thấy bộ dữ liệu này không có giá trị nào bị thiếu và đã sẵn sàng để thực hiện các thao tác tính toán và ước lượng.

1.2 Chuyển về factor

library(tidyr)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# Chuyển hạn hợp đồng thành dài hạn và ngắn hạn
ccp$Contracttype <- ifelse(ccp$Contract == "Month-to-month", "Shortterm", "Longterm")

# Chuyển phương thức thanh toán thành tự động và thủ công
ccp$PaymentMethod <- ifelse(ccp$PaymentMethod %in% c("Mailed check","Electronic check"), "Manual", "Automatic")

# Chuyển tất cả các biến về "factor"
ccp <- ccp %>% mutate(across(c(gender,Dependents,PhoneService,InternetService,Contract,PaperlessBilling,PaymentMethod,Churn,Contracttype), as.factor))

Trong hàm glm, việc chuyển các biến về factor là một công cụ đơn giản mà hiệu quả do việc các biến thuộc phân loại này sẽ được glm tự động mã hóa thành biến giả mà không cần phải tác thêm bất cứ bước nào, điều này khiến việc phân tích dữ liệu trở nên đỡ rắc rối hơn. Ngoài ra, việc đưa các biến về factor còn giúp hạn chế lỗi trong quá trình ước lượng các mô hình hồi quy.

ccp$Churn <- relevel(ccp$Churn, ref = "Yes")
levels(ccp$Churn)
## [1] "Yes" "No"

Khi đặt mức ưu tiên của biến phụ thuộc Churn thành Yes, khi đó glm sẽ mặc định rằng ChurnYes là biến phụ thuộc, nghĩa là tỷ lệ các khách hàng quyết định ngưng sử dụng dịch vụ.

PHẦN 2: HỒI QUY LOGISTIC

2.1 Mô hình

logit1 <- glm(Churn ~  Dependents + tenure + PhoneService + InternetService + Contracttype + PaperlessBilling + PaymentMethod + MonthlyCharges + TotalCharges, data = ccp, family = binomial(link = "logit"))
summary(logit1)
## 
## Call:
## glm(formula = Churn ~ Dependents + tenure + PhoneService + InternetService + 
##     Contracttype + PaperlessBilling + PaymentMethod + MonthlyCharges + 
##     TotalCharges, family = binomial(link = "logit"), data = ccp)
## 
## Coefficients:
##                              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                 1.349e+00  2.346e-01   5.750 8.91e-09 ***
## DependentsYes               2.332e-01  7.940e-02   2.937 0.003317 ** 
## tenure                      5.560e-02  5.916e-03   9.399  < 2e-16 ***
## PhoneServiceYes             7.514e-01  1.438e-01   5.227 1.72e-07 ***
## InternetServiceFiber optic -9.724e-01  1.317e-01  -7.382 1.56e-13 ***
## InternetServiceNo           5.244e-01  1.857e-01   2.823 0.004758 ** 
## ContracttypeShortterm      -1.013e+00  1.010e-01 -10.030  < 2e-16 ***
## PaperlessBillingYes        -4.354e-01  7.304e-02  -5.961 2.50e-09 ***
## PaymentMethodManual        -3.073e-01  7.174e-02  -4.284 1.84e-05 ***
## MonthlyCharges             -5.533e-03  3.975e-03  -1.392 0.163891    
## TotalCharges               -2.538e-04  6.717e-05  -3.778 0.000158 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 8143.4  on 7031  degrees of freedom
## Residual deviance: 5969.6  on 7021  degrees of freedom
## AIC: 5991.6
## 
## Number of Fisher Scoring iterations: 6

Bên trên là kết quả hồi quy logistic của biến phụ thuộc ChurnYes. Trong đó ta có thể thấy được:

  • DependentsYes với hệ số hồi quy là 0.2332 và có ý nghĩa thống kê ở mức ý nghĩa rất cao là 1% cho thấy khách hàng không độc lập tài chính (DependentsYes) có log-odds (log của tỷ lệ giữa khách hàng chọn ngưng sử dụng dịch vụ và khách hàng chọn tiếp tục sử dụng dịch vụ) ngừng dịch vụ cao hơn 0.2332 so với khách hàng độc lập tài chính (DependentsNo)

  • tenure với hệ số hồi quy là 0.05566 và có ý nghĩa thống kê ở mức cao 0% cho thấy với mỗi tháng gắn bó thêm, log-odds ngừng dịch vụ tăng 0.0556.

  • PhoneServiceYes với hệ số hồi quy là 0.7514 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng có đăng ký dịch vụ điện thoại có log-odds ngừng dịch vụ cao hơn 0.7514 so với khách hàng không đăng ký dịch vụ điện thoại.

  • InternetServiceFiber optic với hệ số hồi quy là -0.9724 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng sử dụng Fiber optic có log-odds ngừng dịch vụ thấp hơn 0.9724 so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • InternetServiceNo với hệ số hồi quy là 0.5244 và có ý nghĩa thống kê ở mức ý nghĩa 1% cho thấy rằng khách hàng không có dịch vụ internet có log-odds ngừng dịch vụ cao hơn 0.5244 so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • ContractShortterm với hệ số hồi quy là -1.013 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng với hợp đồng ngắn hạn có log-odds ngừng dịch vụ thấp hơn 1.013 so với khách hàng có hợp đồng dài hạn là ContractLongterm.

  • PaperlessBillingYes với hệ số hồi quy là -0.4354 và có ý nghĩa thống kê ở mức 0% cho thấy khách hàng không sử dụng hóa đơn điện tử có log-odds ngừng dịch vụ thấp hơn 0.4354 so với khách hàng sử dụng hóa đơn điện tử.

  • PaymentMethodManual với hệ số hồi quy là -0.3073 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy được khách hàng sử dụng phương thức thanh toán thủ công (Electronic check, Mailed check) có log-odds ngừng dịch vụ thấp hơn 0.3073 so với khách hàng sử dụng phương thức thanh toán tự động. (PaymentMethodAutomatic).

  • MonthlyCharges với hệ số hồi quy là -0.005533 cho thấy với mỗi đơn vị tăng của phí hàng tháng, log-odds ngừng dịch vụ giảm 0.05533. Tuy nhiên giá trị này không có ý nghĩa thống kê đến biến ChurnYes. Điều này cho thấy không có bằng chứng đủ mạnh để kết luận nó có tác động riêng lẻ đáng kể đến ChurnYes khi các biến khác đã được đưa vào mô hình.

  • TotalCharges -0.0002538 và có ý nghĩa thống kê ở mức 0% cho thấy với mỗi đơn vị tăng của tổng phí, log-odds ngừng dịch vụ giảm 0.0002538.

  • Hệ số chặn (Intercept) với giá trị là 1.349 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy log-odds của ChurnYes là 1.349 khi tất cả các biến giải thích khác bằng 0 hoặc ở mức tham chiếu của chúng.

5.2 Dự báo xác suất

# Giả sử đây là thông tin của một khách hàng bất kỳ
newcustomer1 <- data.frame(
  gender = "Female", 
  Dependents = "No", 
  tenure = 2, 
  PhoneService = "Yes", 
  InternetService = "Fiber optic", 
  Contract = "Month-to-month", 
  PaperlessBilling = "No", 
  PaymentMethod = "Manual", 
  MonthlyCharges = 22.3, 
  TotalCharges = 22.3,
  Contracttype = "Shortterm")
# Tính xác suất khách hàng đó ngưng sử dụng dịch vụ
predict(logit1, newdata = newcustomer1, type = "response")
##         1 
## 0.4477365

Giả sử rằng một khách hàng có thông tin như sau:

  • Giới tính: Nữ
  • Độc lập tài chính: Không
  • Số tháng gắn bó: 2
  • Dịch vụ điện thoại: Có
  • Dịch vụ Internet: Fiber optic
  • Hợp đồng: ngắn hạn
  • Hóa đơn điện tử: Không
  • Phương thức thanh toán: Thủ công
  • Số tiền trả hàng tháng: 22.3
  • Tổng số tiền đã trả: 22.3

Vậy khi đó, ta có thể dự đoán được xác suất dừng sử dụng dịch vụ của khách hàng đó theo hồi quy logistic là khoảng 44.77365%.

PHẦN 3: HỒI QUY PROBIT

3.1 Mô hình*

probit1 <- glm(Churn ~ Dependents + tenure + PhoneService + InternetService + Contracttype + PaperlessBilling + PaymentMethod + MonthlyCharges + TotalCharges, data = ccp, family = binomial(link = "probit"))
summary(probit1)
## 
## Call:
## glm(formula = Churn ~ Dependents + tenure + PhoneService + InternetService + 
##     Contracttype + PaperlessBilling + PaymentMethod + MonthlyCharges + 
##     TotalCharges, family = binomial(link = "probit"), data = ccp)
## 
## Coefficients:
##                              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                 8.744e-01  1.361e-01   6.426 1.31e-10 ***
## DependentsYes               1.383e-01  4.501e-02   3.072  0.00213 ** 
## tenure                      2.499e-02  3.040e-03   8.221  < 2e-16 ***
## PhoneServiceYes             4.197e-01  8.266e-02   5.078 3.82e-07 ***
## InternetServiceFiber optic -5.620e-01  7.567e-02  -7.427 1.11e-13 ***
## InternetServiceNo           2.647e-01  1.060e-01   2.497  0.01251 *  
## ContracttypeShortterm      -5.459e-01  5.494e-02  -9.937  < 2e-16 ***
## PaperlessBillingYes        -2.455e-01  4.198e-02  -5.849 4.95e-09 ***
## PaymentMethodManual        -1.761e-01  4.126e-02  -4.267 1.98e-05 ***
## MonthlyCharges             -4.819e-03  2.324e-03  -2.074  0.03812 *  
## TotalCharges               -6.325e-05  3.527e-05  -1.793  0.07290 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 8143.4  on 7031  degrees of freedom
## Residual deviance: 5989.7  on 7021  degrees of freedom
## AIC: 6011.7
## 
## Number of Fisher Scoring iterations: 6

Bên trên là kết quả hồi quy probit của biến phụ thuộc ChurnYes (Khả năng khách hàng ngưng sử dụng dịch vụ). Trong đó ta có thể thấy được:

  • DependentsYes với hệ số hồi quy là 0.1383 và có ý nghĩa thống kê ở mức ý nghĩa ở mức 1% cho thấy khách hàng không độc lập tài chính (DependentsYes) có khả năng ngừng dịch vụ cao hơn 0.1383 lần so với khách hàng độc lập tài chính (DependentsNo)

  • tenure với hệ số hồi quy là 0.2499 và có ý nghĩa thống kê ở mức cao 0% cho thấy với mỗi tháng gắn bó thêm, khả năng ngừng dịch vụ tăng 0.0556.

  • PhoneServiceYes với hệ số hồi quy là 0.4197 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng có đăng ký dịch vụ điện thoại có khả năng ngừng dịch vụ cao hơn 0.4197 lần so với khách hàng không đăng ký dịch vụ điện thoại.

  • InternetServiceFiber optic với hệ số hồi quy là -0.562 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng sử dụng Fiber optic có khả năng ngừng dịch vụ thấp hơn 0.9724 so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • InternetServiceNo với hệ số hồi quy là 0.2647 và có ý nghĩa thống kê ở mức ý nghĩa 5% cho thấy rằng khách hàng không có dịch vụ internet có khả năng ngừng dịch vụ cao hơn 0.2647 so với khách hàng sử dụng dịch vụ DSL (InternetServiceDSL).

  • ContractShortterm với hệ số hồi quy là -0.5459 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khách hàng với hợp đồng ngắn hạn có khả năng ngừng dịch vụ thấp hơn 0.5459 lần so với khách hàng có hợp đồng dài hạn là ContractLongterm.

  • PaperlessBillingYes với hệ số hồi quy là -0.2455 và có ý nghĩa thống kê ở mức 0% cho thấy khách hàng không sử dụng hóa đơn điện tử có khả năng ngừng dịch vụ thấp hơn 0.2455 lần so với khách hàng sử dụng hóa đơn điện tử.

  • PaymentMethodManual với hệ số hồi quy là -0.1761 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy được khách hàng sử dụng phương thức thanh toán thủ công (Electronic check, Mailed check) có khả năng ngừng dịch vụ thấp hơn 0.1761 so với khách hàng sử dụng phương thức thanh toán tự động. (PaymentMethodAutomatic).

  • MonthlyCharges với hệ số hồi quy là -0.004819 và có ý nghĩa thống kê ở mức ý nghĩa 5% cho thấy với mỗi đơn vị tăng của phí hàng tháng, khả năng ngừng dịch vụ giảm 0.004819.

  • TotalCharges -0.00006325 và có ý nghĩa thống kê ở mức 10% cho thấy với mỗi đơn vị tăng của tổng phí, khả năng ngừng dịch vụ giảm0.00006325 lần.

  • Hệ số chặn (Intercept) với giá trị là 0.8744 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy khả năng một khách hàng dừng dịch vụ (ChurnYes) cao hơn 0.8744 lần so với chọn không tiếp tục dịch vụ khi tất cả các biến giải thích khác bằng 0 hoặc ở mức tham chiếu của chúng.

3.2 Dự báo xác suất

# Giả sử đây là thông tin của một khách hàng bất kỳ
newcustomer <- data.frame(
  gender = "Female", 
  Dependents = "No", 
  tenure = 2, 
  PhoneService = "Yes", 
  InternetService = "Fiber optic", 
  Contract = "Shortterm", 
  PaperlessBilling = "No", 
  PaymentMethod = "Manual", 
  MonthlyCharges = 22.3, 
  TotalCharges = 22.3,
  Contracttype = "Shortterm")
# Tính xác suất khách hàng đó ngưng sử dụng dịch vụ
predict(probit1, newdata = newcustomer, type = "response")
##         1 
## 0.4805878

Giả sử rằng một khách hàng có thông tin như sau:

  • Giới tính: Nữ
  • Độc lập tài chính: Không
  • Số tháng gắn bó: 2
  • Dịch vụ điện thoại: Có
  • Dịch vụ Internet: Fiber optic
  • Hợp đồng: ngắn hạn
  • Hóa đơn điện tử: Không
  • Phương thức thanh toán: Thủ công
  • Số tiền trả hàng tháng: 22.3
  • Tổng số tiền đã trả: 22.3

Vậy khi đó, ta có thể dự đoán được xác suất dừng sử dụng dịch vụ của khách hàng đó theo hồi quy probit là khoảng 48.05878%

PHẦN 4: HỒI QUY CLOGLOG

4.1. Mô hình

cloglog1 <- glm(Churn ~  Dependents + tenure + PhoneService + InternetService + Contracttype + PaperlessBilling + PaymentMethod + MonthlyCharges + TotalCharges, data = ccp, family = binomial(link = "cloglog"))
summary(cloglog1)
## 
## Call:
## glm(formula = Churn ~ Dependents + tenure + PhoneService + InternetService + 
##     Contracttype + PaperlessBilling + PaymentMethod + MonthlyCharges + 
##     TotalCharges, family = binomial(link = "cloglog"), data = ccp)
## 
## Coefficients:
##                              Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                 6.343e-01  1.314e-01   4.828 1.38e-06 ***
## DependentsYes               1.275e-01  4.002e-02   3.186  0.00144 ** 
## tenure                      1.383e-02  2.385e-03   5.798 6.72e-09 ***
## PhoneServiceYes             3.289e-01  7.636e-02   4.307 1.65e-05 ***
## InternetServiceFiber optic -5.317e-01  7.185e-02  -7.400 1.37e-13 ***
## InternetServiceNo           1.911e-01  9.959e-02   1.919  0.05505 .  
## ContracttypeShortterm      -4.571e-01  4.696e-02  -9.732  < 2e-16 ***
## PaperlessBillingYes        -2.060e-01  3.856e-02  -5.342 9.17e-08 ***
## PaymentMethodManual        -1.535e-01  3.794e-02  -4.046 5.20e-05 ***
## MonthlyCharges             -7.043e-03  2.339e-03  -3.011  0.00260 ** 
## TotalCharges                5.242e-05  2.946e-05   1.779  0.07525 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 8143.4  on 7031  degrees of freedom
## Residual deviance: 6052.4  on 7021  degrees of freedom
## AIC: 6074.4
## 
## Number of Fisher Scoring iterations: 7

Bên trên là kết quả của hồi quy cloglog với biến phụ thuộc là ChurnYes. Kết quả hồi quy như sau:

  • DependentsYes với hệ số hồi quy là 0.1275 và có ý nghĩa thống kê ở mức ý nghĩa 5% cho thấy khi các yếu tố khách không đổi, khách hàng độc lập tài chính có tỷ lệ dừng dịch vụ cao hơn khách hàng không độc lập tài chính 0.1275 lần.

  • tenure với hệ số hồi quy là 0.01383 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy rằng với mỗi tháng gắn bó thêm với dịch vụ, xác suất ngừng dịch vụ tăng lên 0.01383 lần.

  • PhoneServiceYes với hệ số hồi quy là 0.3289 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy rằng trong điều kiện các yếu tố khác không đổi, việc đăng ký dịch vụ điện thoại khiến xác suất ngừng dịch vụ tăng 0.3289 lần so với không đăng ký.

  • InternetServiceFiber optic với hệ số hồi quy là -0.5137 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy rằng trong điều kiện các yếu tố khách không đổi, khách hàng sử dụng Fiber optic có xác suất ngừng dịch vụ giảm 0.5137 lần so với khách hàng dùng DSL

  • InternetServiceNo với hệ số hồi quy là 0.1911 và có ý nghĩa thống kê ở mức ý nghĩa 10% cho thấy rằng trong điều kiện các yếu tố khác không đổi, khách hàng chọn không đăng ký dịch vụ Internet có xác suất ngừng dịch vụ tăng 0.1911 lần so với khách hàng dùng DSL.

  • ContractLongterm với hệ số hồi quy là 0.4571 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy rằng trong điều kiện các yếu tố khác không đổi, khách hàng chọn hợp đồng dài hạn có xác suất ngừng dịch vụ tăng 0.4571 lần so với khách hàng chọn hợp đồng ngắn hạn

  • PaperlessBillingYes với hệ số hồi quy là -0.206 và có ý nghĩa thống kê ở mức ý nghĩa 0% cho thấy trong điều kiện các yếu tố khác không đổi, khách hàng chọn hóa đơn điện tử có xác suất ngừng dịch vụ giảm 0.206 lần so với khách hàng không chọn hóa đơn điện tử.

  • PaymentMethodManual với hệ số hồi quy là -0.1535 và có ý nghĩa thống kê ở mức ý nghĩa 0%, cho thấy trong điều kiện các yếu tố khác không đổi thì khách hàng chọn phương thức thanh toán thủ công có xác suất ngừng dịch vụ thấp hơn các khách hàng chọn thanh toán tự động là 0.1535 lần.

  • MonthlyCharges với hệ số hồi quy là -0.007043 và có ý nghĩa thống kê ở mức ý nghĩa 1% cho thấy được với mỗi đơn vị tăng trong phí hàng tháng, xác suất dừng dịch vụ giảm xuống 0.007043 lần.

  • TotalCharges với hệ số hồi quy là 0.00005242 và có ý nghĩa thống kê ở mức ý nghĩa 10% cho thấy rằng với mỗi đơn vị tăng trong tổng phí đã thanh toán, xác suất dừng dịch vụ tăng lên 0.0005242 lần.

4.2 Dự báo xác suất

# Giả sử đây là thông tin của một khách hàng bất kỳ
newcustomer <- data.frame(
  gender = "Female", 
  Dependents = "No", 
  tenure = 2, 
  PhoneService = "Yes", 
  InternetService = "Fiber optic", 
  Contract = "Shortterm", 
  PaperlessBilling = "No", 
  PaymentMethod = "Manual", 
  MonthlyCharges = 22.3, 
  TotalCharges = 22.3,
  Contracttype = "Shortterm")
# Tính xác suất khách hàng đó ngưng sử dụng dịch vụ
predict(cloglog1, newdata = newcustomer, type = "response")
##         1 
## 0.5206988

Giả sử rằng một khách hàng có thông tin như sau:

  • Giới tính: Nữ
  • Độc lập tài chính: Không
  • Số tháng gắn bó: 2
  • Dịch vụ điện thoại: Có
  • Dịch vụ Internet: Fiber optic
  • Hợp đồng: ngắn hạn
  • Hóa đơn điện tử: Không
  • Phương thức thanh toán: Thủ công
  • Số tiền trả hàng tháng: 22.3
  • Tổng số tiền đã trả: 22.3

Vậy khi đó, ta có thể dự đoán được xác suất dừng sử dụng dịch vụ của khách hàng đó theo hồi quy cloglog là khoảng 52.07%

PHẦN 5: TRƯỜNG HỢP MULTIPLES CỦA LOGISTIC

Cách 1:

# tạo một biến độc lập khác
ccp$Contract1 <- ifelse(ccp$Contract == "Two year", "two", "nottwo")
ccp$Contract1 <- as.factor(ccp$Contract1) # chuyển về factor để hồi quy
ccp$Contract1 <- relevel(ccp$Contract1, ref = "two")
ccp$Contract2 <- ifelse(ccp$Contract == "One year", "one", "not one")
ccp$Contract2 <- as.factor(ccp$Contract2) # chuyển về factor để hồi quy
ccp$Contract2 <- relevel(ccp$Contract2, ref = "one")

Hồi quy probit cho:

Contract1

ab <- glm(Contract1 ~ Dependents + InternetService + PaymentMethod + MonthlyCharges, data = ccp, family = binomial(link = "probit"))
summary(ab)
## 
## Call:
## glm(formula = Contract1 ~ Dependents + InternetService + PaymentMethod + 
##     MonthlyCharges, family = binomial(link = "probit"), data = ccp)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                 3.513914   0.127310  27.601   <2e-16 ***
## DependentsYes              -0.389308   0.039237  -9.922   <2e-16 ***
## InternetServiceFiber optic  2.043344   0.078685  25.969   <2e-16 ***
## InternetServiceNo          -2.461781   0.093071 -26.451   <2e-16 ***
## PaymentMethodManual         0.643435   0.038351  16.778   <2e-16 ***
## MonthlyCharges             -0.048570   0.001867 -26.018   <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: 7744.2  on 7031  degrees of freedom
## Residual deviance: 5761.5  on 7026  degrees of freedom
## AIC: 5773.5
## 
## Number of Fisher Scoring iterations: 6

Contract2:

ac <- glm(Contract2 ~ Dependents + InternetService + PaymentMethod + MonthlyCharges, data = ccp, family = binomial(link = "probit"))
summary(ac)
## 
## Call:
## glm(formula = Contract2 ~ Dependents + InternetService + PaymentMethod + 
##     MonthlyCharges, family = binomial(link = "probit"), data = ccp)
## 
## Coefficients:
##                             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                 1.668434   0.095698  17.434  < 2e-16 ***
## DependentsYes              -0.115496   0.037471  -3.082  0.00205 ** 
## InternetServiceFiber optic  0.764346   0.062168  12.295  < 2e-16 ***
## InternetServiceNo          -0.662982   0.072408  -9.156  < 2e-16 ***
## PaymentMethodManual         0.197665   0.035359   5.590 2.27e-08 ***
## MonthlyCharges             -0.016875   0.001423 -11.861  < 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: 7215.8  on 7031  degrees of freedom
## Residual deviance: 6942.5  on 7026  degrees of freedom
## AIC: 6954.5
## 
## Number of Fisher Scoring iterations: 5

Cách 2:

levels(ccp$Contract) # vậy "Month-to-month" là tham chiếu
## [1] "Month-to-month" "One year"       "Two year"
library(nnet)
## Warning: package 'nnet' was built under R version 4.5.1
model <- multinom(Contract ~ Dependents + InternetService + PaymentMethod + MonthlyCharges, data = ccp)
## # weights:  21 (12 variable)
## initial  value 7725.441614 
## iter  10 value 6040.857414
## iter  20 value 5472.371122
## final  value 5472.370995 
## converged
summary(model)
## Call:
## multinom(formula = Contract ~ Dependents + InternetService + 
##     PaymentMethod + MonthlyCharges, data = ccp)
## 
## Coefficients:
##          (Intercept) DependentsYes InternetServiceFiber optic InternetServiceNo
## One year   -4.386198     0.6172139                  -3.197897          2.925246
## Two year   -7.705071     0.9594237                  -5.184083          5.824691
##          PaymentMethodManual MonthlyCharges
## One year           -0.929749     0.07128421
## Two year           -1.513802     0.12276599
## 
## Std. Errors:
##          (Intercept) DependentsYes InternetServiceFiber optic InternetServiceNo
## One year   0.2007025    0.07344436                  0.1452377         0.1492763
## Two year   0.2708270    0.07712228                  0.1748812         0.1960447
##          PaymentMethodManual MonthlyCharges
## One year          0.06828864    0.003252151
## Two year          0.07517898    0.004104006
## 
## Residual Deviance: 10944.74 
## AIC: 10968.74

kiểm tra ý nghĩa thống kê

co <- summary(model)$coefficients
se <- summary(model)$standard.errors
aaa <- abs(co/se)
format.pval(2 * (1 - pnorm(aaa)), digits = 10, eps = .Machine$double.eps)
##  [1] "< 2.220446e-16" "< 2.220446e-16" "< 2.220446e-16" "< 2.220446e-16"
##  [5] "< 2.220446e-16" "< 2.220446e-16" "< 2.220446e-16" "< 2.220446e-16"
##  [9] "< 2.220446e-16" "< 2.220446e-16" "< 2.220446e-16" "< 2.220446e-16"
LS0tDQp0aXRsZTogIlBURExEVF9USDgiDQphdXRob3I6ICJOZ3V54buFbiBUcuG6p24gS2jDoW5oIFNhbiINCmRhdGU6ICIyMDI1LTA3LTExIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCmJvZHkgew0KICBmb250LXNpemU6IDE4cHg7DQp9DQoNCmgxIHsgZm9udC1zaXplOiAyLjJlbTsgfQ0KaDIgeyBmb250LXNpemU6IDEuOGVtOyB9DQpoMyB7IGZvbnQtc2l6ZTogMS41ZW07IH0NCg0KcCB7DQogIGZvbnQtc2l6ZTogMS4xZW07DQogIGxpbmUtaGVpZ2h0OiAxLjY7IA0KfQ0KDQpjb2RlIHsNCiAgZm9udC1zaXplOiAxNnB4Ow0KfQ0KYGBgDQoNCiMgKipQSOG6pk4gMTogVMOMTSBISeG7glUgVsOAIENIVeG6qE4gQuG7iiBE4buuIExJ4buGVSoqDQoNCiMjICoqMS4xIFRow7RuZyB0aW4gduG7gSBi4buZIGThu68gbGnhu4d1KioNCg0KKioqQ+G6pXUgdHLDumMgY+G7p2EgYuG7mSBk4buvIGxp4buHdSoqKg0KDQpgYGB7cn0NCmNjcCA8LSByZWFkLmNzdigiRDovQkFJIFRBUC9QVERMRFQvQ3VzdG9tZXItQ2h1cm4tUHJlZGljdGlvbi5jc3YiLCBoZWFkZXIgPSBUUlVFKQ0Kc3RyKGNjcCkNCmBgYA0KDQpgQ3VzdG9tZXItQ2h1cm4tUHJlZGljdGlvbi5jc3ZgIGzDoCBi4buZIGThu68gbGnhu4d1IGto4bqjbyBzw6F0IHF1eeG6v3QgxJHhu4tuaCBk4burbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY+G7p2Ega2jDoWNoIGjDoG5nLiBC4buZIGThu68gbGnhu4d1IG7DoHkgYmFvIGfhu5NtIDEyIGJp4bq/biB2w6AgNzA0MyBxdWFuIHPDoXQuDQoNCi0gYGN1c3RvbWVySURgOiBNw6Mga2jDoWNoIGjDoG5nDQotIGBnZW5kZXJgOiBHaeG7m2kgdMOtbmggKGJhbyBn4buTbSBNYWxlIHbDoCBGZW1hbGUpDQotIGBEZXBlbmRlbnRzYDogxJDhu5ljIGzhuq1wIGtpbmggdOG6vyAoTm8gdsOgIFllcykNCi0gYHRlbnVyZWA6IFPhu5EgdGjDoW5nIMSRw6MgZ+G6r24gYsOzIHbhu5tpIGThu4tjaCB24bulDQotIGBQaG9uZVNlcnZpY2VgOiBE4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWkgKE5vIHbDoCBZZXMpDQotIGBJbnRlcm5ldFNlcnZpY2VgOiBMb+G6oWkgZOG7i2NoIHbhu6UgaW50ZXJuZXQgKERTTCwgRmliZXIgb3B0aWMgdsOgIE5vKQ0KLSBgQ29udHJhY3RgOiBI4bqhbiBo4bujcCDEkeG7k25nIChOZ+G6r24gaOG6oW46IE1vbnRoLXRvLW1vbnRoOyBEw6BpIGjhuqFuOiBPbmUgeWVhciwgVHdvIHllYXIpDQotIGBQYXBlcmxlc3NCaWxsaW5nYDogSMOzYSDEkcahbiDEkWnhu4duIHThu60gKE5vIHbDoCBZZXMpDQotIGBQYXltZW50TWV0aG9kYDogUGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIChU4buxIMSR4buZbmc6IEJhbmsgdHJhbnNmZXIsIENyZWRpdCBjYXJkOyBUaOG7pyBjw7RuZzogRWxlY3Ryb25pYyBjaGVjaywgTWFpbGVkIGNoZWNrKQ0KLSBgTW9udGhseUNoYXJnZXNgOiBT4buRIHRp4buBbiB0cuG6oyBow6BuZyB0aMOhbmcNCi0gYFRvdGFsQ2hhcmdlc2A6IFThu5VuZyBz4buRIHRp4buBbiDEkcOjIHRy4bqjDQotIGBDaHVybmA6IEThu6tuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSAoTm8gdsOgIFllcykNCg0KKioqS2nhu4NtIHRyYSBk4buvIGxp4buHdSBi4buLIHRoaeG6v3UqKioNCg0KYGBge3J9DQpzdW0oaXMubmEoY2NwKSkNCmNjcCA8LSBuYS5vbWl0KGNjcCkNCmBgYA0KS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBi4buZIGThu68gbGnhu4d1IG7DoHkga2jDtG5nIGPDsyBnacOhIHRy4buLIG7DoG8gYuG7iyB0aGnhur91IHbDoCDEkcOjIHPhurVuIHPDoG5nIMSR4buDIHRo4buxYyBoaeG7h24gY8OhYyB0aGFvIHTDoWMgdMOtbmggdG/DoW4gdsOgIMaw4bubYyBsxrDhu6NuZy4NCg0KIyMgKioxLjIgQ2h1eeG7g24gduG7gSBmYWN0b3IqKg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXIpDQpsaWJyYXJ5KGRwbHlyKQ0KDQojIENodXnhu4NuIGjhuqFuIGjhu6NwIMSR4buTbmcgdGjDoG5oIGTDoGkgaOG6oW4gdsOgIG5n4bqvbiBo4bqhbg0KY2NwJENvbnRyYWN0dHlwZSA8LSBpZmVsc2UoY2NwJENvbnRyYWN0ID09ICJNb250aC10by1tb250aCIsICJTaG9ydHRlcm0iLCAiTG9uZ3Rlcm0iKQ0KDQojIENodXnhu4NuIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiB0aMOgbmggdOG7sSDEkeG7mW5nIHbDoCB0aOG7pyBjw7RuZw0KY2NwJFBheW1lbnRNZXRob2QgPC0gaWZlbHNlKGNjcCRQYXltZW50TWV0aG9kICVpbiUgYygiTWFpbGVkIGNoZWNrIiwiRWxlY3Ryb25pYyBjaGVjayIpLCAiTWFudWFsIiwgIkF1dG9tYXRpYyIpDQoNCiMgQ2h1eeG7g24gdOG6pXQgY+G6oyBjw6FjIGJp4bq/biB24buBICJmYWN0b3IiDQpjY3AgPC0gY2NwICU+JSBtdXRhdGUoYWNyb3NzKGMoZ2VuZGVyLERlcGVuZGVudHMsUGhvbmVTZXJ2aWNlLEludGVybmV0U2VydmljZSxDb250cmFjdCxQYXBlcmxlc3NCaWxsaW5nLFBheW1lbnRNZXRob2QsQ2h1cm4sQ29udHJhY3R0eXBlKSwgYXMuZmFjdG9yKSkNCmBgYA0KDQpUcm9uZyBow6BtIGBnbG1gLCB2aeG7h2MgY2h1eeG7g24gY8OhYyBiaeG6v24gduG7gSBmYWN0b3IgbMOgIG3hu5l0IGPDtG5nIGPhu6UgxJHGoW4gZ2nhuqNuIG3DoCBoaeG7h3UgcXXhuqMgZG8gdmnhu4djIGPDoWMgYmnhur9uIHRodeG7mWMgcGjDom4gbG/huqFpIG7DoHkgc+G6vSDEkcaw4bujYyBgZ2xtYCB04buxIMSR4buZbmcgbcOjIGjDs2EgdGjDoG5oIGJp4bq/biBnaeG6oyBtw6Aga2jDtG5nIGPhuqduIHBo4bqjaSB0w6FjIHRow6ptIGLhuqV0IGPhu6kgYsaw4bubYyBuw6BvLCDEkWnhu4F1IG7DoHkga2hp4bq/biB2aeG7h2MgcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdHLhu58gbsOqbiDEkeG7oSBy4bqvYyBy4buRaSBoxqFuLiBOZ2/DoGkgcmEsIHZp4buHYyDEkcawYSBjw6FjIGJp4bq/biB24buBIGZhY3RvciBjw7JuIGdpw7pwIGjhuqFuIGNo4bq/IGzhu5dpIHRyb25nIHF1w6EgdHLDrG5oIMaw4bubYyBsxrDhu6NuZyBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkuDQoNCmBgYHtyfQ0KY2NwJENodXJuIDwtIHJlbGV2ZWwoY2NwJENodXJuLCByZWYgPSAiWWVzIikNCmxldmVscyhjY3AkQ2h1cm4pDQpgYGANCg0KS2hpIMSR4bq3dCBt4bupYyDGsHUgdGnDqm4gY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgYENodXJuYCB0aMOgbmggWWVzLCBraGkgxJHDsyBgZ2xtYCBz4bq9IG3hurdjIMSR4buLbmggcuG6sW5nIENodXJuWWVzIGzDoCBiaeG6v24gcGjhu6UgdGh14buZYywgbmdoxKlhIGzDoCB04bu3IGzhu4cgY8OhYyBraMOhY2ggaMOgbmcgcXV54bq/dCDEkeG7i25oIG5nxrBuZyBz4butIGThu6VuZyBk4buLY2ggduG7pS4NCg0KIyAqKlBI4bqmTiAyOiBI4buSSSBRVVkgTE9HSVNUSUMqKg0KDQojIyAqKjIuMSBNw7QgaMOsbmgqKg0KDQpgYGB7cn0NCmxvZ2l0MSA8LSBnbG0oQ2h1cm4gfiAgRGVwZW5kZW50cyArIHRlbnVyZSArIFBob25lU2VydmljZSArIEludGVybmV0U2VydmljZSArIENvbnRyYWN0dHlwZSArIFBhcGVybGVzc0JpbGxpbmcgKyBQYXltZW50TWV0aG9kICsgTW9udGhseUNoYXJnZXMgKyBUb3RhbENoYXJnZXMsIGRhdGEgPSBjY3AsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAibG9naXQiKSkNCnN1bW1hcnkobG9naXQxKQ0KYGBgDQoNCkLDqm4gdHLDqm4gbMOgIGvhur90IHF14bqjIGjhu5NpIHF1eSBsb2dpc3RpYyBj4bunYSBiaeG6v24gcGjhu6UgdGh14buZYyBDaHVyblllcy4gVHJvbmcgxJHDsyB0YSBjw7MgdGjhu4MgdGjhuqV5IMSRxrDhu6NjOg0KDQotIGBEZXBlbmRlbnRzWWVzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjIzMzIgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSBy4bqldCBjYW8gbMOgIDElIGNobyB0aOG6pXkga2jDoWNoIGjDoG5nIGtow7RuZyDEkeG7mWMgbOG6rXAgdMOgaSBjaMOtbmggKCoqRGVwZW5kZW50c1llcyoqKSBjw7MgbG9nLW9kZHMgKGxvZyBj4bunYSB04bu3IGzhu4cgZ2nhu69hIGtow6FjaCBow6BuZyBjaOG7jW4gbmfGsG5nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIHbDoCBraMOhY2ggaMOgbmcgY2jhu41uIHRp4bq/cCB04bulYyBz4butIGThu6VuZyBk4buLY2ggduG7pSkgbmfhu6tuZyBk4buLY2ggduG7pSBjYW8gaMahbiAwLjIzMzIgc28gduG7m2kga2jDoWNoIGjDoG5nIMSR4buZYyBs4bqtcCB0w6BpIGNow61uaCAoKipEZXBlbmRlbnRzTm8qKikNCg0KLSBgdGVudXJlYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjA1NTY2IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyBjYW8gMCUgY2hvIHRo4bqleSB24bubaSBt4buXaSB0aMOhbmcgZ+G6r24gYsOzIHRow6ptLCBsb2ctb2RkcyBuZ+G7q25nIGThu4tjaCB24bulIHTEg25nIDAuMDU1Ni4NCg0KLSBgUGhvbmVTZXJ2aWNlWWVzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjc1MTQgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyBjw7MgxJHEg25nIGvDvSBk4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWkgY8OzIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgY2FvIGjGoW4gMC43NTE0IHNvIHbhu5tpIGtow6FjaCBow6BuZyBraMO0bmcgxJHEg25nIGvDvSBk4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWkuDQoNCi0gYEludGVybmV0U2VydmljZUZpYmVyIG9wdGljYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC45NzI0IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcgRmliZXIgb3B0aWMgY8OzIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgdGjhuqVwIGjGoW4gMC45NzI0IHNvIHbhu5tpIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBEU0wgKCoqSW50ZXJuZXRTZXJ2aWNlRFNMKiopLg0KDQotIGBJbnRlcm5ldFNlcnZpY2VOb2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgMC41MjQ0IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMSUgY2hvIHRo4bqleSBy4bqxbmcga2jDoWNoIGjDoG5nIGtow7RuZyBjw7MgZOG7i2NoIHbhu6UgaW50ZXJuZXQgY8OzIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgY2FvIGjGoW4gMC41MjQ0IHNvIHbhu5tpIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBEU0wgKCoqSW50ZXJuZXRTZXJ2aWNlRFNMKiopLg0KDQotIGBDb250cmFjdFNob3J0dGVybWAgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgLTEuMDEzIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBraMOhY2ggaMOgbmcgduG7m2kgaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4gY8OzIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgdGjhuqVwIGjGoW4gMS4wMTMgc28gduG7m2kga2jDoWNoIGjDoG5nIGPDsyBo4bujcCDEkeG7k25nIGTDoGkgaOG6oW4gbMOgICoqQ29udHJhY3RMb25ndGVybSoqLg0KDQotIGBQYXBlcmxlc3NCaWxsaW5nWWVzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC40MzU0IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyAwJSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyBraMO0bmcgc+G7rSBk4bulbmcgaMOzYSDEkcahbiDEkWnhu4duIHThu60gY8OzIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgdGjhuqVwIGjGoW4gMC40MzU0IHNvIHbhu5tpIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBow7NhIMSRxqFuIMSRaeG7h24gdOG7rS4NCg0KLSBgUGF5bWVudE1ldGhvZE1hbnVhbGAgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgLTAuMzA3MyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDAlIGNobyB0aOG6pXkgxJHGsOG7o2Mga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiB0aOG7pyBjw7RuZyAoKipFbGVjdHJvbmljIGNoZWNrKiosICoqTWFpbGVkIGNoZWNrKiopIGPDsyBsb2ctb2RkcyBuZ+G7q25nIGThu4tjaCB24bulIHRo4bqlcCBoxqFuIDAuMzA3MyBzbyB24bubaSBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIHThu7EgxJHhu5luZy4gKCoqUGF5bWVudE1ldGhvZEF1dG9tYXRpYyoqKS4NCg0KLSBgTW9udGhseUNoYXJnZXNgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIC0wLjAwNTUzMyBjaG8gdGjhuqV5IHbhu5tpIG3hu5dpIMSRxqFuIHbhu4sgdMSDbmcgY+G7p2EgcGjDrSBow6BuZyB0aMOhbmcsIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgZ2nhuqNtIDAuMDU1MzMuIFR1eSBuaGnDqm4gZ2nDoSB0cuG7iyBuw6B5IGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIMSR4bq/biBiaeG6v24gKipDaHVyblllcyoqLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBraMO0bmcgY8OzIGLhurFuZyBjaOG7qW5nIMSR4bunIG3huqFuaCDEkeG7gyBr4bq/dCBsdeG6rW4gbsOzIGPDsyB0w6FjIMSR4buZbmcgcmnDqm5nIGzhursgxJHDoW5nIGvhu4MgxJHhur9uICoqQ2h1cm5ZZXMqKiBraGkgY8OhYyBiaeG6v24ga2jDoWMgxJHDoyDEkcaw4bujYyDEkcawYSB2w6BvIG3DtCBow6xuaC4NCg0KLSBgVG90YWxDaGFyZ2VzYCAtMC4wMDAyNTM4IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyAwJSBjaG8gdGjhuqV5IHbhu5tpIG3hu5dpIMSRxqFuIHbhu4sgdMSDbmcgY+G7p2EgdOG7lW5nIHBow60sIGxvZy1vZGRzIG5n4burbmcgZOG7i2NoIHbhu6UgZ2nhuqNtIDAuMDAwMjUzOC4NCg0KLSBI4buHIHPhu5EgY2jhurduIChJbnRlcmNlcHQpIHbhu5tpIGdpw6EgdHLhu4sgbMOgIDEuMzQ5IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBsb2ctb2RkcyBj4bunYSBDaHVyblllcyBsw6AgMS4zNDkga2hpIHThuqV0IGPhuqMgY8OhYyBiaeG6v24gZ2nhuqNpIHRow61jaCBraMOhYyBi4bqxbmcgMCBob+G6t2Mg4bufIG3hu6ljIHRoYW0gY2hp4bq/dSBj4bunYSBjaMO6bmcuDQoNCiMjICoqNS4yIEThu7EgYsOhbyB4w6FjIHN14bqldCoqDQoNCmBgYHtyfQ0KIyBHaeG6oyBz4butIMSRw6J5IGzDoCB0aMO0bmcgdGluIGPhu6dhIG3hu5l0IGtow6FjaCBow6BuZyBi4bqldCBr4buzDQpuZXdjdXN0b21lcjEgPC0gZGF0YS5mcmFtZSgNCiAgZ2VuZGVyID0gIkZlbWFsZSIsIA0KICBEZXBlbmRlbnRzID0gIk5vIiwgDQogIHRlbnVyZSA9IDIsIA0KICBQaG9uZVNlcnZpY2UgPSAiWWVzIiwgDQogIEludGVybmV0U2VydmljZSA9ICJGaWJlciBvcHRpYyIsIA0KICBDb250cmFjdCA9ICJNb250aC10by1tb250aCIsIA0KICBQYXBlcmxlc3NCaWxsaW5nID0gIk5vIiwgDQogIFBheW1lbnRNZXRob2QgPSAiTWFudWFsIiwgDQogIE1vbnRobHlDaGFyZ2VzID0gMjIuMywgDQogIFRvdGFsQ2hhcmdlcyA9IDIyLjMsDQogIENvbnRyYWN0dHlwZSA9ICJTaG9ydHRlcm0iKQ0KIyBUw61uaCB4w6FjIHN14bqldCBraMOhY2ggaMOgbmcgxJHDsyBuZ8awbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UNCnByZWRpY3QobG9naXQxLCBuZXdkYXRhID0gbmV3Y3VzdG9tZXIxLCB0eXBlID0gInJlc3BvbnNlIikNCmBgYA0KR2nhuqMgc+G7rSBy4bqxbmcgbeG7mXQga2jDoWNoIGjDoG5nIGPDsyB0aMO0bmcgdGluIG5oxrAgc2F1Og0KDQotIEdp4bubaSB0w61uaDogTuG7rw0KLSDEkOG7mWMgbOG6rXAgdMOgaSBjaMOtbmg6IEtow7RuZw0KLSBT4buRIHRow6FuZyBn4bqvbiBiw7M6IDINCi0gROG7i2NoIHbhu6UgxJFp4buHbiB0aG/huqFpOiBDw7MNCi0gROG7i2NoIHbhu6UgSW50ZXJuZXQ6IEZpYmVyIG9wdGljDQotIEjhu6NwIMSR4buTbmc6IG5n4bqvbiBo4bqhbg0KLSBIw7NhIMSRxqFuIMSRaeG7h24gdOG7rTogS2jDtG5nDQotIFBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbjogVGjhu6cgY8O0bmcNCi0gU+G7kSB0aeG7gW4gdHLhuqMgaMOgbmcgdGjDoW5nOiAyMi4zDQotIFThu5VuZyBz4buRIHRp4buBbiDEkcOjIHRy4bqjOiAyMi4zDQoNClbhuq15IGtoaSDEkcOzLCB0YSBjw7MgdGjhu4MgZOG7sSDEkW/DoW4gxJHGsOG7o2MgeMOhYyBzdeG6pXQgZOG7q25nIHPhu60gZOG7pW5nIGThu4tjaCB24bulIGPhu6dhIGtow6FjaCBow6BuZyDEkcOzIHRoZW8gaOG7k2kgcXV5IGxvZ2lzdGljIGzDoCBraG/huqNuZyA0NC43NzM2NSUuDQoNCiMgKipQSOG6pk4gMzogSOG7kkkgUVVZIFBST0JJVCoqDQoNCiMjICoqMy4xIE3DtCBow6xuaCoqKg0KDQpgYGB7cn0NCnByb2JpdDEgPC0gZ2xtKENodXJuIH4gRGVwZW5kZW50cyArIHRlbnVyZSArIFBob25lU2VydmljZSArIEludGVybmV0U2VydmljZSArIENvbnRyYWN0dHlwZSArIFBhcGVybGVzc0JpbGxpbmcgKyBQYXltZW50TWV0aG9kICsgTW9udGhseUNoYXJnZXMgKyBUb3RhbENoYXJnZXMsIGRhdGEgPSBjY3AsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikpDQpzdW1tYXJ5KHByb2JpdDEpDQpgYGANCg0KQsOqbiB0csOqbiBsw6Aga+G6v3QgcXXhuqMgaOG7k2kgcXV5IHByb2JpdCBj4bunYSBiaeG6v24gcGjhu6UgdGh14buZYyBDaHVyblllcyAoS2jhuqMgbsSDbmcga2jDoWNoIGjDoG5nIG5nxrBuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSkuIFRyb25nIMSRw7MgdGEgY8OzIHRo4buDIHRo4bqleSDEkcaw4bujYzoNCg0KLSBgRGVwZW5kZW50c1llc2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgMC4xMzgzIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEg4bufIG3hu6ljIDElIGNobyB0aOG6pXkga2jDoWNoIGjDoG5nIGtow7RuZyDEkeG7mWMgbOG6rXAgdMOgaSBjaMOtbmggKCoqRGVwZW5kZW50c1llcyoqKSBjw7Mga2jhuqMgbsSDbmcgbmfhu6tuZyBk4buLY2ggduG7pSBjYW8gaMahbiAwLjEzODMgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIMSR4buZYyBs4bqtcCB0w6BpIGNow61uaCAoKipEZXBlbmRlbnRzTm8qKikNCg0KLSBgdGVudXJlYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjI0OTkgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIGNhbyAwJSBjaG8gdGjhuqV5IHbhu5tpIG3hu5dpIHRow6FuZyBn4bqvbiBiw7MgdGjDqm0sIGto4bqjIG7Eg25nIG5n4burbmcgZOG7i2NoIHbhu6UgdMSDbmcgMC4wNTU2Lg0KDQotIGBQaG9uZVNlcnZpY2VZZXNgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIDAuNDE5NyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDAlIGNobyB0aOG6pXkga2jDoWNoIGjDoG5nIGPDsyDEkcSDbmcga8O9IGThu4tjaCB24bulIMSRaeG7h24gdGhv4bqhaSBjw7Mga2jhuqMgbsSDbmcgbmfhu6tuZyBk4buLY2ggduG7pSBjYW8gaMahbiAwLjQxOTcgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIGtow7RuZyDEkcSDbmcga8O9IGThu4tjaCB24bulIMSRaeG7h24gdGhv4bqhaS4NCg0KLSBgSW50ZXJuZXRTZXJ2aWNlRmliZXIgb3B0aWNgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIC0wLjU2MiB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDAlIGNobyB0aOG6pXkga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIEZpYmVyIG9wdGljIGPDsyBraOG6oyBuxINuZyBuZ+G7q25nIGThu4tjaCB24bulIHRo4bqlcCBoxqFuIDAuOTcyNCBzbyB24bubaSBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgRFNMICgqKkludGVybmV0U2VydmljZURTTCoqKS4NCg0KLSBgSW50ZXJuZXRTZXJ2aWNlTm9gIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIDAuMjY0NyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDUlIGNobyB0aOG6pXkgcuG6sW5nIGtow6FjaCBow6BuZyBraMO0bmcgY8OzIGThu4tjaCB24bulIGludGVybmV0IGPDsyBraOG6oyBuxINuZyBuZ+G7q25nIGThu4tjaCB24bulIGNhbyBoxqFuIDAuMjY0NyBzbyB24bubaSBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgRFNMICgqKkludGVybmV0U2VydmljZURTTCoqKS4NCg0KLSBgQ29udHJhY3RTaG9ydHRlcm1gIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIC0wLjU0NTkgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyB24bubaSBo4bujcCDEkeG7k25nIG5n4bqvbiBo4bqhbiBjw7Mga2jhuqMgbsSDbmcgbmfhu6tuZyBk4buLY2ggduG7pSB0aOG6pXAgaMahbiAwLjU0NTkgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIGPDsyBo4bujcCDEkeG7k25nIGTDoGkgaOG6oW4gbMOgICoqQ29udHJhY3RMb25ndGVybSoqLg0KDQotIGBQYXBlcmxlc3NCaWxsaW5nWWVzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC4yNDU1IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyAwJSBjaG8gdGjhuqV5IGtow6FjaCBow6BuZyBraMO0bmcgc+G7rSBk4bulbmcgaMOzYSDEkcahbiDEkWnhu4duIHThu60gY8OzIGto4bqjIG7Eg25nICBuZ+G7q25nIGThu4tjaCB24bulIHRo4bqlcCBoxqFuIDAuMjQ1NSBs4bqnbiBzbyB24bubaSBraMOhY2ggaMOgbmcgc+G7rSBk4bulbmcgaMOzYSDEkcahbiDEkWnhu4duIHThu60uDQoNCi0gYFBheW1lbnRNZXRob2RNYW51YWxgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIC0wLjE3NjEgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IMSRxrDhu6NjIGtow6FjaCBow6BuZyBz4butIGThu6VuZyBwaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW4gdGjhu6cgY8O0bmcgKCoqRWxlY3Ryb25pYyBjaGVjayoqLCAqKk1haWxlZCBjaGVjayoqKSBjw7Mga2jhuqMgbsSDbmcgbmfhu6tuZyBk4buLY2ggduG7pSB0aOG6pXAgaMahbiAwLjE3NjEgc28gduG7m2kga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiB04buxIMSR4buZbmcuICgqKlBheW1lbnRNZXRob2RBdXRvbWF0aWMqKikuDQoNCi0gYE1vbnRobHlDaGFyZ2VzYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAtMC4wMDQ4MTkgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSA1JSBjaG8gdGjhuqV5IHbhu5tpIG3hu5dpIMSRxqFuIHbhu4sgdMSDbmcgY+G7p2EgcGjDrSBow6BuZyB0aMOhbmcsIGto4bqjIG7Eg25nIG5n4burbmcgZOG7i2NoIHbhu6UgZ2nhuqNtIDAuMDA0ODE5LiANCg0KLSBgVG90YWxDaGFyZ2VzYCAtMC4wMDAwNjMyNSB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgMTAlIGNobyB0aOG6pXkgduG7m2kgbeG7l2kgxJHGoW4gduG7iyB0xINuZyBj4bunYSB04buVbmcgcGjDrSwga2jhuqMgbsSDbmcgbmfhu6tuZyBk4buLY2ggduG7pSBnaeG6o20wLjAwMDA2MzI1IGzhuqduLg0KDQotIEjhu4cgc+G7kSBjaOG6t24gKEludGVyY2VwdCkgduG7m2kgZ2nDoSB0cuG7iyBsw6AgMC44NzQ0IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBraOG6oyBuxINuZyBt4buZdCBraMOhY2ggaMOgbmcgZOG7q25nIGThu4tjaCB24bulICgqKkNodXJuWWVzKiopIGNhbyBoxqFuIDAuODc0NCBs4bqnbiBzbyB24bubaSBjaOG7jW4ga2jDtG5nIHRp4bq/cCB04bulYyBk4buLY2ggduG7pSBraGkgdOG6pXQgY+G6oyBjw6FjIGJp4bq/biBnaeG6o2kgdGjDrWNoIGtow6FjIGLhurFuZyAwIGhv4bq3YyDhu58gbeG7qWMgdGhhbSBjaGnhur91IGPhu6dhIGNow7puZy4NCg0KIyMgKiozLjIgROG7sSBiw6FvIHjDoWMgc3XhuqV0KioNCg0KYGBge3J9DQojIEdp4bqjIHPhu60gxJHDonkgbMOgIHRow7RuZyB0aW4gY+G7p2EgbeG7mXQga2jDoWNoIGjDoG5nIGLhuqV0IGvhu7MNCm5ld2N1c3RvbWVyIDwtIGRhdGEuZnJhbWUoDQogIGdlbmRlciA9ICJGZW1hbGUiLCANCiAgRGVwZW5kZW50cyA9ICJObyIsIA0KICB0ZW51cmUgPSAyLCANCiAgUGhvbmVTZXJ2aWNlID0gIlllcyIsIA0KICBJbnRlcm5ldFNlcnZpY2UgPSAiRmliZXIgb3B0aWMiLCANCiAgQ29udHJhY3QgPSAiU2hvcnR0ZXJtIiwgDQogIFBhcGVybGVzc0JpbGxpbmcgPSAiTm8iLCANCiAgUGF5bWVudE1ldGhvZCA9ICJNYW51YWwiLCANCiAgTW9udGhseUNoYXJnZXMgPSAyMi4zLCANCiAgVG90YWxDaGFyZ2VzID0gMjIuMywNCiAgQ29udHJhY3R0eXBlID0gIlNob3J0dGVybSIpDQojIFTDrW5oIHjDoWMgc3XhuqV0IGtow6FjaCBow6BuZyDEkcOzIG5nxrBuZyBz4butIGThu6VuZyBk4buLY2ggduG7pQ0KcHJlZGljdChwcm9iaXQxLCBuZXdkYXRhID0gbmV3Y3VzdG9tZXIsIHR5cGUgPSAicmVzcG9uc2UiKQ0KYGBgDQpHaeG6oyBz4butIHLhurFuZyBt4buZdCBraMOhY2ggaMOgbmcgY8OzIHRow7RuZyB0aW4gbmjGsCBzYXU6DQoNCi0gR2nhu5tpIHTDrW5oOiBO4buvDQotIMSQ4buZYyBs4bqtcCB0w6BpIGNow61uaDogS2jDtG5nDQotIFPhu5EgdGjDoW5nIGfhuq9uIGLDszogMg0KLSBE4buLY2ggduG7pSDEkWnhu4duIHRob+G6oWk6IEPDsw0KLSBE4buLY2ggduG7pSBJbnRlcm5ldDogRmliZXIgb3B0aWMNCi0gSOG7o3AgxJHhu5NuZzogbmfhuq9uIGjhuqFuDQotIEjDs2EgxJHGoW4gxJFp4buHbiB04butOiBLaMO0bmcNCi0gUGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuOiBUaOG7pyBjw7RuZw0KLSBT4buRIHRp4buBbiB0cuG6oyBow6BuZyB0aMOhbmc6IDIyLjMNCi0gVOG7lW5nIHPhu5EgdGnhu4FuIMSRw6MgdHLhuqM6IDIyLjMNCg0KVuG6rXkga2hpIMSRw7MsIHRhIGPDsyB0aOG7gyBk4buxIMSRb8OhbiDEkcaw4bujYyB4w6FjIHN14bqldCBk4burbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UgY+G7p2Ega2jDoWNoIGjDoG5nIMSRw7MgdGhlbyBo4buTaSBxdXkgcHJvYml0IGzDoCBraG/huqNuZyA0OC4wNTg3OCUNCg0KIyAqKlBI4bqmTiA0OiBI4buSSSBRVVkgQ0xPR0xPRyoqDQoNCiMjICAqKjQuMS4gTcO0IGjDrG5oKioNCg0KYGBge3J9DQpjbG9nbG9nMSA8LSBnbG0oQ2h1cm4gfiAgRGVwZW5kZW50cyArIHRlbnVyZSArIFBob25lU2VydmljZSArIEludGVybmV0U2VydmljZSArIENvbnRyYWN0dHlwZSArIFBhcGVybGVzc0JpbGxpbmcgKyBQYXltZW50TWV0aG9kICsgTW9udGhseUNoYXJnZXMgKyBUb3RhbENoYXJnZXMsIGRhdGEgPSBjY3AsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAiY2xvZ2xvZyIpKQ0Kc3VtbWFyeShjbG9nbG9nMSkNCmBgYA0KDQpCw6puIHRyw6puIGzDoCBr4bq/dCBxdeG6oyBj4bunYSBo4buTaSBxdXkgY2xvZ2xvZyB24bubaSBiaeG6v24gcGjhu6UgdGh14buZYyBsw6AgQ2h1cm5ZZXMuIEvhur90IHF14bqjIGjhu5NpIHF1eSBuaMawIHNhdToNCg0KLSBgRGVwZW5kZW50c1llc2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgMC4xMjc1IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgNSUgY2hvIHRo4bqleSBraGkgY8OhYyB54bq/dSB04buRIGtow6FjaCBraMO0bmcgxJHhu5VpLCBraMOhY2ggaMOgbmcgxJHhu5ljIGzhuq1wIHTDoGkgY2jDrW5oIGPDsyB04bu3IGzhu4cgZOG7q25nIGThu4tjaCB24bulIGNhbyBoxqFuIGtow6FjaCBow6BuZyBraMO0bmcgxJHhu5ljIGzhuq1wIHTDoGkgY2jDrW5oIDAuMTI3NSBs4bqnbi4NCg0KLSBgdGVudXJlYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjAxMzgzIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBy4bqxbmcgduG7m2kgbeG7l2kgdGjDoW5nIGfhuq9uIGLDsyB0aMOqbSB24bubaSBk4buLY2ggduG7pSwgeMOhYyBzdeG6pXQgbmfhu6tuZyBk4buLY2ggduG7pSB0xINuZyBsw6puIDAuMDEzODMgbOG6p24uDQoNCi0gYFBob25lU2VydmljZVllc2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgMC4zMjg5IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSBy4bqxbmcgdHJvbmcgxJFp4buBdSBraeG7h24gY8OhYyB54bq/dSB04buRIGtow6FjIGtow7RuZyDEkeG7lWksIHZp4buHYyDEkcSDbmcga8O9IGThu4tjaCB24bulIMSRaeG7h24gdGhv4bqhaSBraGnhur9uIHjDoWMgc3XhuqV0IG5n4burbmcgZOG7i2NoIHbhu6UgdMSDbmcgMC4zMjg5IGzhuqduIHNvIHbhu5tpIGtow7RuZyDEkcSDbmcga8O9Lg0KDQotIGBJbnRlcm5ldFNlcnZpY2VGaWJlciBvcHRpY2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgLTAuNTEzNyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDAlIGNobyB0aOG6pXkgcuG6sW5nIHRyb25nIMSRaeG7gXUga2nhu4duIGPDoWMgeeG6v3UgdOG7kSBraMOhY2gga2jDtG5nIMSR4buVaSwga2jDoWNoIGjDoG5nIHPhu60gZOG7pW5nIEZpYmVyIG9wdGljIGPDsyB4w6FjIHN14bqldCBuZ+G7q25nIGThu4tjaCB24bulIGdp4bqjbSAwLjUxMzcgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIGTDuW5nIERTTA0KDQotIGBJbnRlcm5ldFNlcnZpY2VOb2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgMC4xOTExIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMTAlIGNobyB0aOG6pXkgcuG6sW5nIHRyb25nIMSRaeG7gXUga2nhu4duIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBraMO0bmcgxJHhu5VpLCBraMOhY2ggaMOgbmcgY2jhu41uIGtow7RuZyDEkcSDbmcga8O9IGThu4tjaCB24bulIEludGVybmV0IGPDsyB4w6FjIHN14bqldCBuZ+G7q25nIGThu4tjaCB24bulIHTEg25nIDAuMTkxMSBs4bqnbiBzbyB24bubaSBraMOhY2ggaMOgbmcgZMO5bmcgRFNMLg0KDQotIGBDb250cmFjdExvbmd0ZXJtYCB24bubaSBo4buHIHPhu5EgaOG7k2kgcXV5IGzDoCAwLjQ1NzEgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSBjaG8gdGjhuqV5IHLhurFuZyB0cm9uZyDEkWnhu4F1IGtp4buHbiBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwga2jDoWNoIGjDoG5nIGNo4buNbiBo4bujcCDEkeG7k25nIGTDoGkgaOG6oW4gY8OzIHjDoWMgc3XhuqV0IG5n4burbmcgZOG7i2NoIHbhu6UgdMSDbmcgMC40NTcxIGzhuqduIHNvIHbhu5tpIGtow6FjaCBow6BuZyBjaOG7jW4gaOG7o3AgxJHhu5NuZyBuZ+G6r24gaOG6oW4NCg0KLSBgUGFwZXJsZXNzQmlsbGluZ1llc2AgduG7m2kgaOG7hyBz4buRIGjhu5NpIHF1eSBsw6AgLTAuMjA2IHbDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyDDvSBuZ2jEqWEgMCUgY2hvIHRo4bqleSB0cm9uZyDEkWnhu4F1IGtp4buHbiBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSwga2jDoWNoIGjDoG5nIGNo4buNbiBow7NhIMSRxqFuIMSRaeG7h24gdOG7rSBjw7MgeMOhYyBzdeG6pXQgbmfhu6tuZyBk4buLY2ggduG7pSBnaeG6o20gMC4yMDYgbOG6p24gc28gduG7m2kga2jDoWNoIGjDoG5nIGtow7RuZyBjaOG7jW4gaMOzYSDEkcahbiDEkWnhu4duIHThu60uDQoNCi0gYFBheW1lbnRNZXRob2RNYW51YWxgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIC0wLjE1MzUgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAwJSwgY2hvIHRo4bqleSB0cm9uZyDEkWnhu4F1IGtp4buHbiBjw6FjIHnhur91IHThu5Ega2jDoWMga2jDtG5nIMSR4buVaSB0aMOsIGtow6FjaCBow6BuZyBjaOG7jW4gcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIHRo4bunIGPDtG5nIGPDsyB4w6FjIHN14bqldCBuZ+G7q25nIGThu4tjaCB24bulIHRo4bqlcCBoxqFuIGPDoWMga2jDoWNoIGjDoG5nIGNo4buNbiB0aGFuaCB0b8OhbiB04buxIMSR4buZbmcgbMOgIDAuMTUzNSBs4bqnbi4NCg0KLSBgTW9udGhseUNoYXJnZXNgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIC0wLjAwNzA0MyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiDhu58gbeG7qWMgw70gbmdoxKlhIDElIGNobyB0aOG6pXkgxJHGsOG7o2MgduG7m2kgbeG7l2kgxJHGoW4gduG7iyB0xINuZyB0cm9uZyBwaMOtIGjDoG5nIHRow6FuZywgeMOhYyBzdeG6pXQgZOG7q25nIGThu4tjaCB24bulIGdp4bqjbSB4deG7kW5nIDAuMDA3MDQzIGzhuqduLg0KDQotIGBUb3RhbENoYXJnZXNgIHbhu5tpIGjhu4cgc+G7kSBo4buTaSBxdXkgbMOgIDAuMDAwMDUyNDIgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6og4bufIG3hu6ljIMO9IG5naMSpYSAxMCUgY2hvIHRo4bqleSBy4bqxbmcgduG7m2kgbeG7l2kgxJHGoW4gduG7iyB0xINuZyB0cm9uZyB04buVbmcgcGjDrSDEkcOjIHRoYW5oIHRvw6FuLCB4w6FjIHN14bqldCBk4burbmcgZOG7i2NoIHbhu6UgdMSDbmcgbMOqbiAwLjAwMDUyNDIgbOG6p24uDQoNCiMjICoqNC4yIEThu7EgYsOhbyB4w6FjIHN14bqldCoqDQoNCmBgYHtyfQ0KIyBHaeG6oyBz4butIMSRw6J5IGzDoCB0aMO0bmcgdGluIGPhu6dhIG3hu5l0IGtow6FjaCBow6BuZyBi4bqldCBr4buzDQpuZXdjdXN0b21lciA8LSBkYXRhLmZyYW1lKA0KICBnZW5kZXIgPSAiRmVtYWxlIiwgDQogIERlcGVuZGVudHMgPSAiTm8iLCANCiAgdGVudXJlID0gMiwgDQogIFBob25lU2VydmljZSA9ICJZZXMiLCANCiAgSW50ZXJuZXRTZXJ2aWNlID0gIkZpYmVyIG9wdGljIiwgDQogIENvbnRyYWN0ID0gIlNob3J0dGVybSIsIA0KICBQYXBlcmxlc3NCaWxsaW5nID0gIk5vIiwgDQogIFBheW1lbnRNZXRob2QgPSAiTWFudWFsIiwgDQogIE1vbnRobHlDaGFyZ2VzID0gMjIuMywgDQogIFRvdGFsQ2hhcmdlcyA9IDIyLjMsDQogIENvbnRyYWN0dHlwZSA9ICJTaG9ydHRlcm0iKQ0KIyBUw61uaCB4w6FjIHN14bqldCBraMOhY2ggaMOgbmcgxJHDsyBuZ8awbmcgc+G7rSBk4bulbmcgZOG7i2NoIHbhu6UNCnByZWRpY3QoY2xvZ2xvZzEsIG5ld2RhdGEgPSBuZXdjdXN0b21lciwgdHlwZSA9ICJyZXNwb25zZSIpDQpgYGANCkdp4bqjIHPhu60gcuG6sW5nIG3hu5l0IGtow6FjaCBow6BuZyBjw7MgdGjDtG5nIHRpbiBuaMawIHNhdToNCg0KLSBHaeG7m2kgdMOtbmg6IE7hu68NCi0gxJDhu5ljIGzhuq1wIHTDoGkgY2jDrW5oOiBLaMO0bmcNCi0gU+G7kSB0aMOhbmcgZ+G6r24gYsOzOiAyDQotIEThu4tjaCB24bulIMSRaeG7h24gdGhv4bqhaTogQ8OzDQotIEThu4tjaCB24bulIEludGVybmV0OiBGaWJlciBvcHRpYw0KLSBI4bujcCDEkeG7k25nOiBuZ+G6r24gaOG6oW4NCi0gSMOzYSDEkcahbiDEkWnhu4duIHThu606IEtow7RuZw0KLSBQaMawxqFuZyB0aOG7qWMgdGhhbmggdG/DoW46IFRo4bunIGPDtG5nDQotIFPhu5EgdGnhu4FuIHRy4bqjIGjDoG5nIHRow6FuZzogMjIuMw0KLSBU4buVbmcgc+G7kSB0aeG7gW4gxJHDoyB0cuG6ozogMjIuMw0KDQpW4bqteSBraGkgxJHDsywgdGEgY8OzIHRo4buDIGThu7EgxJFvw6FuIMSRxrDhu6NjIHjDoWMgc3XhuqV0IGThu6tuZyBz4butIGThu6VuZyBk4buLY2ggduG7pSBj4bunYSBraMOhY2ggaMOgbmcgxJHDsyB0aGVvIGjhu5NpIHF1eSBjbG9nbG9nIGzDoCBraG/huqNuZyA1Mi4wNyUNCg0KIyAqKlBI4bqmTiA1OiBUUsav4bucTkcgSOG7olAgTVVMVElQTEVTIEPhu6ZBIExPR0lTVElDKioNCg0KIyMgKipDw6FjaCAxOioqIA0KDQpgYGB7cn0NCiMgdOG6oW8gbeG7mXQgYmnhur9uIMSR4buZYyBs4bqtcCBraMOhYw0KY2NwJENvbnRyYWN0MSA8LSBpZmVsc2UoY2NwJENvbnRyYWN0ID09ICJUd28geWVhciIsICJ0d28iLCAibm90dHdvIikNCmNjcCRDb250cmFjdDEgPC0gYXMuZmFjdG9yKGNjcCRDb250cmFjdDEpICMgY2h1eeG7g24gduG7gSBmYWN0b3IgxJHhu4MgaOG7k2kgcXV5DQpjY3AkQ29udHJhY3QxIDwtIHJlbGV2ZWwoY2NwJENvbnRyYWN0MSwgcmVmID0gInR3byIpDQpjY3AkQ29udHJhY3QyIDwtIGlmZWxzZShjY3AkQ29udHJhY3QgPT0gIk9uZSB5ZWFyIiwgIm9uZSIsICJub3Qgb25lIikNCmNjcCRDb250cmFjdDIgPC0gYXMuZmFjdG9yKGNjcCRDb250cmFjdDIpICMgY2h1eeG7g24gduG7gSBmYWN0b3IgxJHhu4MgaOG7k2kgcXV5DQpjY3AkQ29udHJhY3QyIDwtIHJlbGV2ZWwoY2NwJENvbnRyYWN0MiwgcmVmID0gIm9uZSIpDQpgYGANCg0KSOG7k2kgcXV5IHByb2JpdCBjaG86DQoNCkNvbnRyYWN0MQ0KDQpgYGB7cn0NCmFiIDwtIGdsbShDb250cmFjdDEgfiBEZXBlbmRlbnRzICsgSW50ZXJuZXRTZXJ2aWNlICsgUGF5bWVudE1ldGhvZCArIE1vbnRobHlDaGFyZ2VzLCBkYXRhID0gY2NwLCBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gInByb2JpdCIpKQ0Kc3VtbWFyeShhYikNCmBgYA0KDQpDb250cmFjdDI6DQoNCmBgYHtyfQ0KYWMgPC0gZ2xtKENvbnRyYWN0MiB+IERlcGVuZGVudHMgKyBJbnRlcm5ldFNlcnZpY2UgKyBQYXltZW50TWV0aG9kICsgTW9udGhseUNoYXJnZXMsIGRhdGEgPSBjY3AsIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikpDQpzdW1tYXJ5KGFjKQ0KYGBgDQoNCiMjICoqQ8OhY2ggMjoqKg0KDQpgYGB7cn0NCmxldmVscyhjY3AkQ29udHJhY3QpICMgduG6rXkgIk1vbnRoLXRvLW1vbnRoIiBsw6AgdGhhbSBjaGnhur91DQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KG5uZXQpDQptb2RlbCA8LSBtdWx0aW5vbShDb250cmFjdCB+IERlcGVuZGVudHMgKyBJbnRlcm5ldFNlcnZpY2UgKyBQYXltZW50TWV0aG9kICsgTW9udGhseUNoYXJnZXMsIGRhdGEgPSBjY3ApDQpzdW1tYXJ5KG1vZGVsKQ0KYGBgDQoNCmtp4buDbSB0cmEgw70gbmdoxKlhIHRo4buRbmcga8OqDQoNCmBgYHtyfQ0KY28gPC0gc3VtbWFyeShtb2RlbCkkY29lZmZpY2llbnRzDQpzZSA8LSBzdW1tYXJ5KG1vZGVsKSRzdGFuZGFyZC5lcnJvcnMNCmFhYSA8LSBhYnMoY28vc2UpDQpmb3JtYXQucHZhbCgyICogKDEgLSBwbm9ybShhYWEpKSwgZGlnaXRzID0gMTAsIGVwcyA9IC5NYWNoaW5lJGRvdWJsZS5lcHMpDQpgYGANCg0K