library(tidyverse)
library(lmtest)
library(car)
library(forecast)
library(Ecdat)
BUK <- BudgetUK

1 Tạo function

Viết function để xử lí công việc:

Giải thích các biến truyền vào: data là dữ liệu đưa vào thực hiện tính toán, dependent_variable là biến phụ thuộc, independent_variables là biến độc lập.

Ở phần thực hiện dự báo đầu vào của em là trích xuất dữ liệu từ tập dữ liệu (data) dòng thứ 10. Dữ liệu này bao gồm cột của biến phụ thuộc (dependent_variable) và các cột biến độc lập (independent_variables).

hoiquy <- function(data, dependent_variable,independent_variables){
  # Tạo mô hình hồi quy 
  hq <- lm(formula = paste(dependent_variable, "~", paste0(independent_variables, collapse = " + ")), data = data)
  
  coefficients <- coef(hq)
  dependent_variable <- as.character(formula(hq))[2]
  independent_variables <- all.vars(formula(hq))[-1]
  
  # Tạo hàm hồi quy tuyến tính mẫu
  ham_hq <- paste(dependent_variable, "=", round(coefficients[1], 3))
  for (i in seq_along(independent_variables)) {
    ham_hq <- paste(ham_hq, "+", round(coefficients[i+1], 3), "*", independent_variables[i])
  }
  
  # Kiểm định phương sai thay đổi
  pstd <- ncvTest(hq)
  
  # Kiểm định tự tương quan
  dw_test <- durbinWatsonTest(hq)
  
  # Kiểm tra số lượng biến độc lập để xác định xem có vẽ đồ thị hay không, nếu là chỉ có một biến độc lập thì vẽ biểu đồ phân tán.
  num_independent_vars <- length(independent_variables)
  scatter_plot <- NULL
  if (num_independent_vars == 1) {
    scatter_plot <- ggplot(data, aes_string(x = independent_variables, y = dependent_variable)) +
      geom_point(color = "skyblue") +
      geom_smooth(method = "lm", col = "red") +
      ggtitle(paste("Scatter plot of", dependent_variable, "and", independent_variables))
  }
  
  # Kiểm tra đa cộng tuyến nếu có ít nhất 2 biến độc lập
  VIF <- NULL
  if (num_independent_vars >= 2){
    VIF <- vif(hq)
  }
  
  # Thực hiện dự báo
  forecast_data <- data[10, c(dependent_variable, independent_variables)]
  forecast_values <- forecast::forecast(hq, newdata = forecast_data)
  
  return(list(
    mohinhhoiquy = summary(hq),
    hamhoiquytuyentinhmau = ham_hq,
    kiemdinhphuongsaithaydoi = pstd,
    kiemdinhtutuongquan = dw_test,
    daconguyen = VIF,
    du_bao = forecast_values,
    scatter_plot = scatter_plot
  ))
}

2 Sử dụng function

Chỉ định biến phụ thuộc và biến độc lập

dependent_variable <- "totexp"
independent_variables <- c("wfood","wfuel","wcloth","walc","wtrans","wother","income")

Tính toán trên function đã tạo

hoiquy(BUK,dependent_variable, independent_variables=c("income"))
## $mohinhhoiquy
## 
## Call:
## lm(formula = paste(dependent_variable, "~", paste0(independent_variables, 
##     collapse = " + ")), data = data)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -277.791  -23.539   -6.713   13.287  234.718 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 55.44803    2.42313   22.88   <2e-16 ***
## income       0.31743    0.01623   19.56   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 38.61 on 1517 degrees of freedom
## Multiple R-squared:  0.2014, Adjusted R-squared:  0.2008 
## F-statistic: 382.5 on 1 and 1517 DF,  p-value: < 2.2e-16
## 
## 
## $hamhoiquytuyentinhmau
## [1] "totexp = 55.448 + 0.317 * income"
## 
## $kiemdinhphuongsaithaydoi
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 890.1077, Df = 1, p = < 2.22e-16
## 
## $kiemdinhtutuongquan
##  lag Autocorrelation D-W Statistic p-value
##    1      0.02413827      1.950047   0.336
##  Alternative hypothesis: rho != 0
## 
## $daconguyen
## NULL
## 
## $du_bao
##   Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## 1       90.36487 40.84001 139.8897 14.59566 166.1341
## 
## $scatter_plot

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

Hệ số hồi quy: Hệ số cho “income” là 0.31743. Điều này nghĩa là, cho mỗi đơn vị tăng của “income”, giá trị dự kiến cho “totexp” tăng thêm 0.31743, giả sử tất cả các biến khác không thay đổi.

p-values cho cả hai hệ số đều rất nhỏ, điều này cho thấy cả hai hệ số đều có ý nghĩa thống kê.

R-squared: R-squared cho mô hình là 0.2014. Điều này có nghĩa là mô hình này giải thích được khoảng 20.14% sự biến động trong biến phụ thuộc “totexp”.

F-statistic (Thống kê F): Giá trị thống kê F lớn (382.5) và giá trị p-value liên quan đến nó rất nhỏ (< 2.2e-16), cho thấy mô hình hồi quy này có ý nghĩa thống kê, tức là nó phù hợp với dữ liệu tốt hơn so với mô hình không có bất kỳ biến nào.

Tóm lại, dựa trên kết quả này, chúng ta có thể kết luận rằng “income” có ảnh hưởng đáng kể đến “totexp”. Tuy nhiên, mô hình này chỉ giải thích được khoảng 20.14% sự biến động trong “totexp”, vì vậy có thể có các biến khác cũng ảnh hưởng đến “totexp”.

Giá trị Chisquare: 890.1077, Độ tự do (Df): 1, Giá trị p: < 2.22e-16 (giá trị rất nhỏ, gần bằng 0). Giá trị p rất nhỏ, gần bằng 0, cho thấy rằng có thể bác bỏ giả thuyết H0:phương sai sai số không đổi. Có thể kết luận mô hình trên có phương sai sai số thay đổi.

Kết quả kiểm định tự tương quan có mục tiêu xem xét xem trong mô hình hồi quy có tự tương quan hay không. Trong trường hợp này, giá trị D-W Statistic gần 2, và giá trị p lớn hơn mức ý nghĩa 0.05, cho thấy không có đủ bằng chứng để bác bỏ giả thuyết rằng trong mô hình hồi quy không tự tương quan.

Dự báo cho điểm cụ thể của biến phụ thuộc totexp có giá trị 90.36487. Ngoài ra, trong các cột còn lại, “Lo 80” và “Hi 80” đại diện cho giới hạn dưới và giới hạn trên của khoảng tin cậy 80% và “Lo 95” và “Hi 95” đại diện cho giới hạn dưới và giới hạn trên của khoảng tin cậy 95%

Tương tự, các câu lệnh dưới đây em thực hiện với function đã tạo, hàm hồi quy đa biến.

hoiquy(BUK,dependent_variable,independent_variables=c("wfood","wfuel","wcloth","walc"))
## $mohinhhoiquy
## 
## Call:
## lm(formula = paste(dependent_variable, "~", paste0(independent_variables, 
##     collapse = " + ")), data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -89.959 -22.290  -5.311  15.280 256.164 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  171.855      4.730  36.331  < 2e-16 ***
## wfood       -170.466      9.381 -18.172  < 2e-16 ***
## wfuel       -205.540     18.535 -11.089  < 2e-16 ***
## wcloth        50.267     10.701   4.697 2.88e-06 ***
## walc          15.224     14.972   1.017    0.309    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 35.84 on 1514 degrees of freedom
## Multiple R-squared:  0.3133, Adjusted R-squared:  0.3115 
## F-statistic: 172.7 on 4 and 1514 DF,  p-value: < 2.2e-16
## 
## 
## $hamhoiquytuyentinhmau
## [1] "totexp = 171.855 + -170.466 * wfood + -205.54 * wfuel + 50.267 * wcloth + 15.224 * walc"
## 
## $kiemdinhphuongsaithaydoi
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 254.7772, Df = 1, p = < 2.22e-16
## 
## $kiemdinhtutuongquan
##  lag Autocorrelation D-W Statistic p-value
##    1      0.03232575      1.935105   0.196
##  Alternative hypothesis: rho != 0
## 
## $daconguyen
##    wfood    wfuel   wcloth     walc 
## 1.149276 1.093700 1.216460 1.062243 
## 
## $du_bao
##   Point Forecast    Lo 80    Hi 80   Lo 95    Hi 95
## 1       82.39558 36.39441 128.3967 12.0173 152.7739
## 
## $scatter_plot
## NULL
hoiquy(BUK,dependent_variable,independent_variables=c("wfood","wfuel","wcloth","walc","wother"))
## $mohinhhoiquy
## 
## Call:
## lm(formula = paste(dependent_variable, "~", paste0(independent_variables, 
##     collapse = " + ")), data = data)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -89.889 -22.353  -5.259  15.162 256.069 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  170.180      7.698  22.107  < 2e-16 ***
## wfood       -168.939     10.895 -15.506  < 2e-16 ***
## wfuel       -204.158     19.206 -10.630  < 2e-16 ***
## wcloth        51.800     12.062   4.294 1.86e-05 ***
## walc          16.471     15.644   1.053    0.293    
## wother         3.030     10.986   0.276    0.783    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 35.85 on 1513 degrees of freedom
## Multiple R-squared:  0.3133, Adjusted R-squared:  0.3111 
## F-statistic: 138.1 on 5 and 1513 DF,  p-value: < 2.2e-16
## 
## 
## $hamhoiquytuyentinhmau
## [1] "totexp = 170.18 + -168.939 * wfood + -204.158 * wfuel + 51.8 * wcloth + 16.471 * walc + 3.03 * wother"
## 
## $kiemdinhphuongsaithaydoi
## Non-constant Variance Score Test 
## Variance formula: ~ fitted.values 
## Chisquare = 254.0881, Df = 1, p = < 2.22e-16
## 
## $kiemdinhtutuongquan
##  lag Autocorrelation D-W Statistic p-value
##    1      0.03230388      1.935148   0.178
##  Alternative hypothesis: rho != 0
## 
## $daconguyen
##    wfood    wfuel   wcloth     walc   wother 
## 1.549368 1.173654 1.544585 1.159041 1.520879 
## 
## $du_bao
##   Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
## 1       82.28644 36.26842 128.3045 11.88236 152.6905
## 
## $scatter_plot
## NULL
LS0tDQp0aXRsZTogIlRI4buwQyBIw4BOSCBUUsOKTiBM4buaUCAiDQphdXRob3I6ICJUcuG6p24gSHV54buBbiBUcsOibiINCmRhdGU6ICIyMDIzLTA3LTI1Ig0Kb3V0cHV0Og0KICBib29rZG93bjo6aHRtbF9kb2N1bWVudDI6DQogICAgY3NzOiAiYmFpdGFwbmdheTE4LmNzcyINCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KDQpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobG10ZXN0KQ0KbGlicmFyeShjYXIpDQpsaWJyYXJ5KGZvcmVjYXN0KQ0KbGlicmFyeShFY2RhdCkNCkJVSyA8LSBCdWRnZXRVSw0KYGBgDQoNCg0KIyAqKlThuqFvIGZ1bmN0aW9uKioNCg0KDQpWaeG6v3QgZnVuY3Rpb24gxJHhu4MgeOG7rSBsw60gY8O0bmcgdmnhu4djOg0KDQotIE3DtCBow6xuaCBo4buTaSBxdXkNCg0KLSBLaeG7g20gxJHhu4tuaCB04buxIHTGsMahbmcgcXVhbg0KDQotIEtp4buDbSDEkeG7i25oIHBoxrDGoW5nIHNhaSB0aGF5IMSR4buVaQ0KDQotIEtp4buDbSDEkeG7i25oIGPDsyB44bqjeSByYSDEkWEgY+G7mW5nIHR1eeG6v24gaGF5IGtow7RuZw0KDQotIEThu7EgYsOhbw0KDQpHaeG6o2kgdGjDrWNoIGPDoWMgYmnhur9uIHRydXnhu4FuIHbDoG86ICoqX2RhdGFfKiogbMOgIGThu68gbGnhu4d1IMSRxrBhIHbDoG8gdGjhu7FjIGhp4buHbiB0w61uaCB0b8OhbiwgKipfZGVwZW5kZW50X3ZhcmlhYmxlXyoqIGzDoCBiaeG6v24gcGjhu6UgdGh14buZYywgKipfaW5kZXBlbmRlbnRfdmFyaWFibGVzXyoqIGzDoCBiaeG6v24gxJHhu5ljIGzhuq1wLg0KDQrhu54gcGjhuqduIHRo4buxYyBoaeG7h24gZOG7sSBiw6FvIMSR4bqndSB2w6BvIGPhu6dhIGVtIGzDoCB0csOtY2ggeHXhuqV0IGThu68gbGnhu4d1IHThu6sgdOG6rXAgZOG7ryBsaeG7h3UgKGRhdGEpIGTDsm5nIHRo4bupIDEwLiBE4buvIGxp4buHdSBuw6B5IGJhbyBn4buTbSBj4buZdCBj4bunYSBiaeG6v24gcGjhu6UgdGh14buZYyAoZGVwZW5kZW50X3ZhcmlhYmxlKSB2w6AgY8OhYyBj4buZdCBiaeG6v24gxJHhu5ljIGzhuq1wIChpbmRlcGVuZGVudF92YXJpYWJsZXMpLiANCg0KYGBge3J9DQpob2lxdXkgPC0gZnVuY3Rpb24oZGF0YSwgZGVwZW5kZW50X3ZhcmlhYmxlLGluZGVwZW5kZW50X3ZhcmlhYmxlcyl7DQogICMgVOG6oW8gbcO0IGjDrG5oIGjhu5NpIHF1eSANCiAgaHEgPC0gbG0oZm9ybXVsYSA9IHBhc3RlKGRlcGVuZGVudF92YXJpYWJsZSwgIn4iLCBwYXN0ZTAoaW5kZXBlbmRlbnRfdmFyaWFibGVzLCBjb2xsYXBzZSA9ICIgKyAiKSksIGRhdGEgPSBkYXRhKQ0KICANCiAgY29lZmZpY2llbnRzIDwtIGNvZWYoaHEpDQogIGRlcGVuZGVudF92YXJpYWJsZSA8LSBhcy5jaGFyYWN0ZXIoZm9ybXVsYShocSkpWzJdDQogIGluZGVwZW5kZW50X3ZhcmlhYmxlcyA8LSBhbGwudmFycyhmb3JtdWxhKGhxKSlbLTFdDQogIA0KICAjIFThuqFvIGjDoG0gaOG7k2kgcXV5IHR1eeG6v24gdMOtbmggbeG6q3UNCiAgaGFtX2hxIDwtIHBhc3RlKGRlcGVuZGVudF92YXJpYWJsZSwgIj0iLCByb3VuZChjb2VmZmljaWVudHNbMV0sIDMpKQ0KICBmb3IgKGkgaW4gc2VxX2Fsb25nKGluZGVwZW5kZW50X3ZhcmlhYmxlcykpIHsNCiAgICBoYW1faHEgPC0gcGFzdGUoaGFtX2hxLCAiKyIsIHJvdW5kKGNvZWZmaWNpZW50c1tpKzFdLCAzKSwgIioiLCBpbmRlcGVuZGVudF92YXJpYWJsZXNbaV0pDQogIH0NCiAgDQogICMgS2nhu4NtIMSR4buLbmggcGjGsMahbmcgc2FpIHRoYXkgxJHhu5VpDQogIHBzdGQgPC0gbmN2VGVzdChocSkNCiAgDQogICMgS2nhu4NtIMSR4buLbmggdOG7sSB0xrDGoW5nIHF1YW4NCiAgZHdfdGVzdCA8LSBkdXJiaW5XYXRzb25UZXN0KGhxKQ0KICANCiAgIyBLaeG7g20gdHJhIHPhu5EgbMaw4bujbmcgYmnhur9uIMSR4buZYyBs4bqtcCDEkeG7gyB4w6FjIMSR4buLbmggeGVtIGPDsyB24bq9IMSR4buTIHRo4buLIGhheSBraMO0bmcsIG7hur91IGzDoCBjaOG7iSBjw7MgbeG7mXQgYmnhur9uIMSR4buZYyBs4bqtcCB0aMOsIHbhur0gYmnhu4N1IMSR4buTIHBow6JuIHTDoW4uDQogIG51bV9pbmRlcGVuZGVudF92YXJzIDwtIGxlbmd0aChpbmRlcGVuZGVudF92YXJpYWJsZXMpDQogIHNjYXR0ZXJfcGxvdCA8LSBOVUxMDQogIGlmIChudW1faW5kZXBlbmRlbnRfdmFycyA9PSAxKSB7DQogICAgc2NhdHRlcl9wbG90IDwtIGdncGxvdChkYXRhLCBhZXNfc3RyaW5nKHggPSBpbmRlcGVuZGVudF92YXJpYWJsZXMsIHkgPSBkZXBlbmRlbnRfdmFyaWFibGUpKSArDQogICAgICBnZW9tX3BvaW50KGNvbG9yID0gInNreWJsdWUiKSArDQogICAgICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2wgPSAicmVkIikgKw0KICAgICAgZ2d0aXRsZShwYXN0ZSgiU2NhdHRlciBwbG90IG9mIiwgZGVwZW5kZW50X3ZhcmlhYmxlLCAiYW5kIiwgaW5kZXBlbmRlbnRfdmFyaWFibGVzKSkNCiAgfQ0KICANCiAgIyBLaeG7g20gdHJhIMSRYSBj4buZbmcgdHV54bq/biBu4bq/dSBjw7Mgw610IG5o4bqldCAyIGJp4bq/biDEkeG7mWMgbOG6rXANCiAgVklGIDwtIE5VTEwNCiAgaWYgKG51bV9pbmRlcGVuZGVudF92YXJzID49IDIpew0KICAgIFZJRiA8LSB2aWYoaHEpDQogIH0NCiAgDQogICMgVGjhu7FjIGhp4buHbiBk4buxIGLDoW8NCiAgZm9yZWNhc3RfZGF0YSA8LSBkYXRhWzEwLCBjKGRlcGVuZGVudF92YXJpYWJsZSwgaW5kZXBlbmRlbnRfdmFyaWFibGVzKV0NCiAgZm9yZWNhc3RfdmFsdWVzIDwtIGZvcmVjYXN0Ojpmb3JlY2FzdChocSwgbmV3ZGF0YSA9IGZvcmVjYXN0X2RhdGEpDQogIA0KICByZXR1cm4obGlzdCgNCiAgICBtb2hpbmhob2lxdXkgPSBzdW1tYXJ5KGhxKSwNCiAgICBoYW1ob2lxdXl0dXllbnRpbmhtYXUgPSBoYW1faHEsDQogICAga2llbWRpbmhwaHVvbmdzYWl0aGF5ZG9pID0gcHN0ZCwNCiAgICBraWVtZGluaHR1dHVvbmdxdWFuID0gZHdfdGVzdCwNCiAgICBkYWNvbmd1eWVuID0gVklGLA0KICAgIGR1X2JhbyA9IGZvcmVjYXN0X3ZhbHVlcywNCiAgICBzY2F0dGVyX3Bsb3QgPSBzY2F0dGVyX3Bsb3QNCiAgKSkNCn0NCmBgYA0KDQojICoqU+G7rSBk4bulbmcgZnVuY3Rpb24qKg0KDQpDaOG7iSDEkeG7i25oIGJp4bq/biBwaOG7pSB0aHXhu5ljIHbDoCBiaeG6v24gxJHhu5ljIGzhuq1wDQpgYGB7cixtZXNzYWdlPUZBTFNFLHdhcm5pbmc9RkFMU0V9DQpkZXBlbmRlbnRfdmFyaWFibGUgPC0gInRvdGV4cCINCmluZGVwZW5kZW50X3ZhcmlhYmxlcyA8LSBjKCJ3Zm9vZCIsIndmdWVsIiwid2Nsb3RoIiwid2FsYyIsInd0cmFucyIsIndvdGhlciIsImluY29tZSIpDQpgYGANCg0KVMOtbmggdG/DoW4gdHLDqm4gZnVuY3Rpb24gxJHDoyB04bqhbw0KYGBge3IsbWVzc2FnZT1GQUxTRSx3YXJuaW5nPUZBTFNFfQ0KaG9pcXV5KEJVSyxkZXBlbmRlbnRfdmFyaWFibGUsIGluZGVwZW5kZW50X3ZhcmlhYmxlcz1jKCJpbmNvbWUiKSkNCmBgYA0KDQoqKkdp4bqjaSB0aMOtY2gga+G6v3QgcXXhuqM6KioNCg0KLSBNw7QgaMOsbmggaOG7k2kgcXV5IHR1eeG6v24gdMOtbmg6IHRvdGV4cCA9IDU1LjQ0ODAzICsgMC4zMTc0MyBpbmNvbWUNCg0KSOG7hyBz4buRIGjhu5NpIHF1eTogSOG7hyBz4buRIGNobyDigJxpbmNvbWXigJ0gbMOgIDAuMzE3NDMuIMSQaeG7gXUgbsOgeSBuZ2jEqWEgbMOgLCBjaG8gbeG7l2kgxJHGoW4gduG7iyB0xINuZyBj4bunYSDigJxpbmNvbWXigJ0sIGdpw6EgdHLhu4sgZOG7sSBraeG6v24gY2hvIOKAnHRvdGV4cOKAnSB0xINuZyB0aMOqbSAwLjMxNzQzLCBnaeG6oyBz4butIHThuqV0IGPhuqMgY8OhYyBiaeG6v24ga2jDoWMga2jDtG5nIHRoYXkgxJHhu5VpLg0KDQpwLXZhbHVlcyBjaG8gY+G6oyBoYWkgaOG7hyBz4buRIMSR4buBdSBy4bqldCBuaOG7jywgxJFp4buBdSBuw6B5IGNobyB0aOG6pXkgY+G6oyBoYWkgaOG7hyBz4buRIMSR4buBdSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQpSLXNxdWFyZWQ6IFItc3F1YXJlZCBjaG8gbcO0IGjDrG5oIGzDoCAwLjIwMTQuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhIGzDoCBtw7QgaMOsbmggbsOgeSBnaeG6o2kgdGjDrWNoIMSRxrDhu6NjIGtob+G6o25nIDIwLjE0JSBz4buxIGJp4bq/biDEkeG7mW5nIHRyb25nIGJp4bq/biBwaOG7pSB0aHXhu5ljIOKAnHRvdGV4cOKAnS4NCg0KRi1zdGF0aXN0aWMgKFRo4buRbmcga8OqIEYpOiBHacOhIHRy4buLIHRo4buRbmcga8OqIEYgbOG7m24gKDM4Mi41KSB2w6AgZ2nDoSB0cuG7iyBwLXZhbHVlIGxpw6puIHF1YW4gxJHhur9uIG7DsyBy4bqldCBuaOG7jyAoPCAyLjJlLTE2KSwgY2hvIHRo4bqleSBtw7QgaMOsbmggaOG7k2kgcXV5IG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiwgdOG7qWMgbMOgIG7DsyBwaMO5IGjhu6NwIHbhu5tpIGThu68gbGnhu4d1IHThu5F0IGjGoW4gc28gduG7m2kgbcO0IGjDrG5oIGtow7RuZyBjw7MgYuG6pXQga+G7syBiaeG6v24gbsOgby4NCg0KVMOzbSBs4bqhaSwgZOG7sWEgdHLDqm4ga+G6v3QgcXXhuqMgbsOgeSwgY2jDum5nIHRhIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIOKAnGluY29tZeKAnSBjw7Mg4bqjbmggaMaw4bufbmcgxJHDoW5nIGvhu4MgxJHhur9uIOKAnHRvdGV4cOKAnS4gVHV5IG5oacOqbiwgbcO0IGjDrG5oIG7DoHkgY2jhu4kgZ2nhuqNpIHRow61jaCDEkcaw4bujYyBraG/huqNuZyAyMC4xNCUgc+G7sSBiaeG6v24gxJHhu5luZyB0cm9uZyDigJx0b3RleHDigJ0sIHbDrCB24bqteSBjw7MgdGjhu4MgY8OzIGPDoWMgYmnhur9uIGtow6FjIGPFqW5nIOG6o25oIGjGsOG7n25nIMSR4bq/biDigJx0b3RleHDigJ0uDQoNCi0gS2nhu4NtIMSR4buLbmggcGjGsMahbmcgc2FpIHRoYXkgxJHhu5VpDQoNCkdpw6EgdHLhu4sgQ2hpc3F1YXJlOiA4OTAuMTA3NywgxJDhu5kgdOG7sSBkbyAoRGYpOiAxLCBHacOhIHRy4buLIHA6IDwgMi4yMmUtMTYgKGdpw6EgdHLhu4sgcuG6pXQgbmjhu48sIGfhuqduIGLhurFuZyAwKS4gR2nDoSB0cuG7iyBwIHLhuqV0IG5o4buPLCBn4bqnbiBi4bqxbmcgMCwgY2hvIHRo4bqleSBy4bqxbmcgY8OzIHRo4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBIMDpwaMawxqFuZyBzYWkgc2FpIHPhu5Ega2jDtG5nIMSR4buVaS4gQ8OzIHRo4buDIGvhur90IGx14bqtbiBtw7QgaMOsbmggdHLDqm4gY8OzIHBoxrDGoW5nIHNhaSBzYWkgc+G7kSB0aGF5IMSR4buVaS4NCg0KLSBLaeG7g20gxJHhu4tuaCB04buxIHTGsMahbmcgcXVhbg0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCB04buxIHTGsMahbmcgcXVhbiBjw7MgbeG7pWMgdGnDqnUgeGVtIHjDqXQgeGVtIHRyb25nIG3DtCBow6xuaCBo4buTaSBxdXkgY8OzIHThu7EgdMawxqFuZyBxdWFuIGhheSBraMO0bmcuIFRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5LCBnacOhIHRy4buLIEQtVyBTdGF0aXN0aWMgZ+G6p24gMiwgdsOgIGdpw6EgdHLhu4sgcCBs4bubbiBoxqFuIG3hu6ljIMO9IG5naMSpYSAwLjA1LCBjaG8gdGjhuqV5IGtow7RuZyBjw7MgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IHLhurFuZyB0cm9uZyBtw7QgaMOsbmggaOG7k2kgcXV5IGtow7RuZyB04buxIHTGsMahbmcgcXVhbi4NCg0KLSBE4buxIGLDoW8NCg0KROG7sSBiw6FvIGNobyDEkWnhu4NtIGPhu6UgdGjhu4MgY+G7p2EgYmnhur9uIHBo4bulIHRodeG7mWMgdG90ZXhwIGPDsyBnacOhIHRy4buLIDkwLjM2NDg3LiBOZ2/DoGkgcmEsIHRyb25nIGPDoWMgY+G7mXQgY8OybiBs4bqhaSwgIkxvIDgwIiB2w6AgIkhpIDgwIiDEkeG6oWkgZGnhu4duIGNobyBnaeG7m2kgaOG6oW4gZMaw4bubaSB2w6AgZ2nhu5tpIGjhuqFuIHRyw6puIGPhu6dhIGtob+G6o25nIHRpbiBj4bqteSA4MCUgdsOgICJMbyA5NSIgdsOgICJIaSA5NSIgxJHhuqFpIGRp4buHbiBjaG8gZ2nhu5tpIGjhuqFuIGTGsOG7m2kgdsOgIGdp4bubaSBo4bqhbiB0csOqbiBj4bunYSBraG/huqNuZyB0aW4gY+G6rXkgOTUlIA0KDQpUxrDGoW5nIHThu7EsIGPDoWMgY8OidSBs4buHbmggZMaw4bubaSDEkcOieSBlbSB0aOG7sWMgaGnhu4duIHbhu5tpIGZ1bmN0aW9uIMSRw6MgdOG6oW8sIGjDoG0gaOG7k2kgcXV5IMSRYSBiaeG6v24uDQoNCi0gSOG7k2kgcXV5IMSRYSBiaeG6v24gduG7m2kgYmnhur9uIHBo4bulIHRodeG7mWMgbMOgICJ0b3RleHAiIHbDoCBiaeG6v24gxJHhu5ljIGzhuq1wIGzDoCAid2Zvb2QiLCAid2Z1ZWwiLA0KIndjbG90aCIsIndhbGMiDQoNCmBgYHtyfQ0KaG9pcXV5KEJVSyxkZXBlbmRlbnRfdmFyaWFibGUsaW5kZXBlbmRlbnRfdmFyaWFibGVzPWMoIndmb29kIiwid2Z1ZWwiLCJ3Y2xvdGgiLCJ3YWxjIikpDQpgYGANCg0KLSBI4buTaSBxdXkgxJFhIGJp4bq/biB24bubaSBiaeG6v24gcGjhu6UgdGh14buZYyBsw6AgInRvdGV4cCIgdsOgIGJp4bq/biDEkeG7mWMgbOG6rXAgbMOgICJ3Zm9vZCIsICJ3ZnVlbCIsDQoid2Nsb3RoIiwid2FsYyIsICJ3b3RoZXIiDQpgYGB7cn0NCmhvaXF1eShCVUssZGVwZW5kZW50X3ZhcmlhYmxlLGluZGVwZW5kZW50X3ZhcmlhYmxlcz1jKCJ3Zm9vZCIsIndmdWVsIiwid2Nsb3RoIiwid2FsYyIsIndvdGhlciIpKQ0KYGBgDQoNCg0KDQoNCg==