1. Tổng quan

Thị trường chứng khoán Việt Nam những năm gần đây đã có những bước tiến ngoạn mục, thu hút đông đảo nhà đầu tư tham gia. Tuy nhiên, bên cạnh tiềm năng phát triển to lớn, thị trường cũng tiềm ẩn nhiều rủi ro do biến động liên tục. Để đưa ra quyết định đầu tư sáng suốt và hiệu quả, nhà đầu tư cần có những công cụ phân tích chuyên sâu, và ma trận tương quan là một trong những lựa chọn hàng đầu.

Bài tiểu luận này sẽ sử dụng dữ liệu thị trường chứng khoán Việt Nam từ 01/01/2018 đến 29/12/2023 để tính toán và phân tích ma trận tương quan giữa các chỉ số giá chính: VNI và FTMIB. Qua đó, nghiên cứu sẽ cung cấp cái nhìn tổng quan về mức độ liên quan giữa các chỉ số, giúp nhà đầu tư đánh giá rủi ro và xây dựng chiến lược đầu tư phù hợp.

library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.3.3
## Loading required package: xts
## Warning: package 'xts' was built under R version 4.3.3
## Loading required package: zoo
## Warning: package 'zoo' was built under R version 4.3.3
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## 
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
## 
##     legend
library(readxl)
library(PerformanceAnalytics)
library(xlsx)
## Warning: package 'xlsx' was built under R version 4.3.3
data <- read.xlsx("D:/MHNN/MHNN1.xlsx",6)
lgvni<- diff(log(data$VNI), lag = 1)
lgftmib<- diff(log(data$FTMIB), lag = 1)

mhnn <- data.frame(VNI= lgvni, FTMIB= lgftmib)
# Tạo thống kê mô tả
library(psych)
## Warning: package 'psych' was built under R version 4.3.3
summary <- summary(mhnn)
detailed <- describe(mhnn)
print(summary)
##       VNI                 FTMIB           
##  Min.   :-6.908e-02   Min.   :-0.1854115  
##  1st Qu.:-4.788e-03   1st Qu.:-0.0059895  
##  Median : 1.138e-03   Median : 0.0010782  
##  Mean   : 8.628e-05   Mean   : 0.0002245  
##  3rd Qu.: 6.831e-03   3rd Qu.: 0.0072671  
##  Max.   : 4.860e-02   Max.   : 0.0854946
print(detailed)
##       vars    n mean   sd median trimmed  mad   min  max range  skew kurtosis
## VNI      1 1465    0 0.01      0       0 0.01 -0.07 0.05  0.12 -0.97     3.74
## FTMIB    2 1465    0 0.01      0       0 0.01 -0.19 0.09  0.27 -2.02    24.52
##       se
## VNI    0
## FTMIB  0
plot.ts(mhnn$VNI)

plot.ts(mhnn$FTMIB)

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
## 
## Attaching package: 'ggplot2'
## The following objects are masked from 'package:psych':
## 
##     %+%, alpha
ggplot(data.frame(price = mhnn$VNI), aes(sample = price)) +
  geom_qq() +
  geom_qq_line()

ggplot(data.frame(price = mhnn$FTMIB), aes(sample = price)) +
  geom_qq() +
  geom_qq_line()

2. Bối cảnh và tầm quan trọng của ma trận tương quan

Sự biến động của thị trường chứng khoán là điều không thể tránh khỏi, và nó ảnh hưởng trực tiếp đến lợi nhuận của nhà đầu tư. Biến động này có thể xuất phát từ nhiều yếu tố, bao gồm tình hình kinh tế vĩ mô, chính sách tiền tệ, tâm lý nhà đầu tư, v.v. Việc nắm bắt mối liên hệ giữa các cổ phiếu và thị trường chung là vô cùng quan trọng để nhà đầu tư có thể đưa ra quyết định đầu tư sáng suốt.

Ma trận tương quan là công cụ toán học hiệu quả giúp đo lường mức độ liên quan giữa các biến (trong trường hợp này là giá của các chỉ số chứng khoán). Ma trận này thể hiện mức độ đồng biến hoặc nghịch biến giữa các cặp biến, giúp ta có thể đưa ra các nhận định chính xác như:

  • Đánh giá mức độ rủi ro của danh mục đầu tư: Khi các cổ phiếu trong danh mục đầu tư có mức độ tương quan cao, rủi ro của danh mục đầu tư cũng sẽ cao hơn. Ngược lại, nếu các cổ phiếu có mức độ tương quan thấp, rủi ro danh mục đầu tư sẽ được giảm thiểu.

  • Lựa chọn chiến lược đầu tư: Ma trận tương quan giúp nhà đầu tư xác định các cổ phiếu có xu hướng biến động trái chiều nhau. Việc đầu tư vào các cổ phiếu này có thể giúp bù đắp cho nhau khi thị trường biến động, từ đó giảm thiểu rủi ro và tăng hiệu quả đầu tư.

  • Phân tích thị trường: Ma trận tương quan cung cấp thông tin về xu hướng chung của thị trường, giúp nhà đầu tư đưa ra dự báo về biến động thị trường trong tương lai.

3. Ma trận tương quan

3.1. Sử dụng ma trận tương quan

Phân tích mối quan hệ: Ma trận tương quan giúp nhận biết các mối quan hệ giữa các biến. Các biến có hệ số tương quan cao có thể liên quan đến nhau và có thể cần được xem xét đồng thời trong các phân tích hoặc mô hình dự báo.

Lựa chọn biến: Nếu hai biến có hệ số tương quan rất cao, có thể cần phải xem xét việc giữ lại một trong hai biến đó để tránh vấn đề đa cộng tuyến trong các mô hình hồi quy. Dự báo và mô hình: Hiểu biết về mối tương quan giữa các biến có thể cải thiện việc xây dựng mô hình dự báo và hiểu biết về cấu trúc dữ liệu.

Dùng lệnh res() để hiển thị hệ số tương quan giữa các cặp biến. Sau đó dùng round() để làm tròn đến chữ số thập phân thứ 2. Ta thu được kết quả như bảng sau:

res <- cor(mhnn)
round(res, 2)
##        VNI FTMIB
## VNI   1.00  0.17
## FTMIB 0.17  1.00

3.2. Ma trận thu được

và cụ thể hơn ta có thể nhận thấy thông qua biểu đồ tương quan. Trong đó các ô màu biểu thị giá trị của các hệ số tương quan giữa các biến

library(corrplot)
## Warning: package 'corrplot' was built under R version 4.3.3
## corrplot 0.92 loaded
res <- cor(mhnn)
rounded_res <- round(res, 2)
round(res, 2)
##        VNI FTMIB
## VNI   1.00  0.17
## FTMIB 0.17  1.00
corrplot(rounded_res, method = "color")

library(corrplot)
corrplot(res, type = "upper", order = "hclust", 
         tl.col = "black", tl.srt = 45)

Biểu đồ tương quan được tạo ra bởi hàm chart.Correlation từ thư viện PerformanceAnalytics trong R. Biểu đồ này hiển thị mối quan hệ giữa các biến số trong tập dữ liệu và cụ thể:

Đường chéo chính (Diagonal)

Histogram: Trên đường chéo chính của ma trận biểu đồ, các histogram của từng biến được hiển thị. Các biểu đồ này cung cấp thông tin về phân phối của mỗi biến.

Ví dụ:

Các hệ số tương quan (Off-diagonal)

Hệ số tương quan: Các ô trên đường chéo chính chứa các hệ số tương quan giữa các cặp biến. Hệ số tương quan đo lường mức độ và hướng của mối quan hệ tuyến tính giữa hai biến. Giá trị dao động từ -1 đến 1: + 1: Tương quan dương hoàn hảo (khi một biến tăng, biến kia cũng tăng). + -1: Tương quan âm hoàn hảo (khi một biến tăng, biến kia giảm). + 0: Không có mối tương quan tuyến tính.

Ví dụ:

Các ký hiệu sao

Mức độ ý nghĩa thống kê: Các ký hiệu sao (***) xuất hiện bên cạnh các hệ số tương quan cho biết mức độ ý nghĩa thống kê của các hệ số này. Trong nhiều trường hợp, các sao này biểu thị mức độ tin cậy với các ngưỡng phổ biến như:

Một sao () cho biết mức độ ý nghĩa thống kê 0.05 (5%). Hai sao () cho biết mức độ ý nghĩa thống kê 0.01 (1%). Ba sao () cho biết mức độ ý nghĩa thống kê 0.001 (0.1%).

chart.Correlation(mhnn, histogram=TRUE, pch=19)
## Warning in par(usr): argument 1 does not name a graphical parameter

library(ggplot2)
library(ggcorrplot)
## Warning: package 'ggcorrplot' was built under R version 4.3.3
df <- dplyr::select_if(mhnn, is.numeric)
r <- cor(df, use="complete.obs")
ggcorrplot(r)

4. Thực hành các kiểm định

library(tseries)
## Warning: package 'tseries' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
mhnn <- data.frame(VNI= lgvni, FTMIB= lgftmib)

4.1 Kiểm định phân phối chuẩn: Jarque-Bera

Kiểm định Jarque-Bera là một phương pháp thống kê được sử dụng để kiểm tra xem một mẫu dữ liệu có tuân theo phân phối chuẩn hay không. Nó dựa trên việc kiểm tra các đặc trưng thống kê của mẫu dữ liệu, như độ lệch và độ nhọn, để nhận xét về tính chuẩn của phân phối. Giả thiết H0 là có phân phối chuẩn.

4.1.1. VNI

# kiểm định cho chỉ VNI
Var1 <- mhnn$VNI
# Kiểm định phân phối chuẩn cho VNI
result1 <-  jarque.bera.test(Var1)
print(result1)
## 
##  Jarque Bera Test
## 
## data:  Var1
## X-squared = 1091.6, df = 2, p-value < 2.2e-16

không pp chuẩn Kết quả cho thấy giá trị X-squared= 1091.6 tương ứng với giá trị của chi-squared và p_value= 0.0000000022 nhỏ hơn mức ý nghĩa 5%. Do dó ta bác bỏ giải thuyết H0. Dữ liệu đang dử dụng không tuân theo phân phối chuẩn.

4.1.2. FTMIB

# kiểm định cho chỉ FTMIB
Var2 <- mhnn$FTMIB
# Kiểm định phân phối chuẩn cho FTMIB
result2 <-  jarque.bera.test(Var2)
print(result2)
## 
##  Jarque Bera Test
## 
## data:  Var2
## X-squared = 37810, df = 2, p-value < 2.2e-16

không pp chuẩn Kết quả cho thấy giá trị X-squared= 37810 tương ứng với giá trị của chi-squared và p_value= 0.0000000022 nhỏ hơn mức ý nghĩa 5%. Do dó ta bác bỏ giải thuyết H0. Dữ liệu đang dử dụng không tuân theo phân phối chuẩn.

4.2 Kiểm định tính dừng: Augmented Dickey–Fuller

Phép thử nghiệm ADF là một phương pháp thống kê dùng để kiểm tra xem một chuỗi dữ liệu có tính dừng (stationary) hay không. Một chuỗi dữ liệu được coi là dừng nếu các đặc trưng thống kê như trung bình, phương sai và hiệu ứng mùa vụ của nó không thay đổi theo thời gian.

Kiểm định này cho ta biết chuỗi thời gian có tính dừng không. Đặt giả thuyết: H0 là chuỗi thời gian không có tính dừng H1 là chuỗi thời gian co tính dừng

4.2.1. VNI

adf.test(Var1)
## Warning in adf.test(Var1): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  Var1
## Dickey-Fuller = -11.372, Lag order = 11, p-value = 0.01
## alternative hypothesis: stationary

Kết quả thu được sau khi kiểm định

Giá trị Dickey-Fuller là -11.372: đây là giá trị thống kê kiểm định được tính toán từ dữ liệu. Lag order = 11: đây là số lượng lags (độ trễ) được sử dụng trong phép kiểm định.

Giả thuyết H0 là chuỗi dữ liệu không dừng (non-stationary), còn giả thuyết H1 (giả thuyết thay thế) là chuỗi dữ liệu dừng (stationary). Với p-value = 0.01< 0.05(mức ý nghĩa thường dùng), ta bác bỏ giải thuyết H0.

4.2.2. FTMIB

adf.test(Var2)
## Warning in adf.test(Var2): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  Var2
## Dickey-Fuller = -10.763, Lag order = 11, p-value = 0.01
## alternative hypothesis: stationary

Kết quả thu được sau khi kiểm định

Giá trị Dickey-Fuller là -10.763: đây là giá trị thống kê kiểm định được tính toán từ dữ liệu. Lag order = 11: đây là số lượng lags (độ trễ) được sử dụng trong phép kiểm định.

Giả thuyết H0 là chuỗi dữ liệu không dừng (non-stationary), còn giả thuyết H1 (giả thuyết thay thế) là chuỗi dữ liệu dừng (stationary). Với p-value = 0.01< 0.05(mức ý nghĩa thường dùng), ta bác bỏ giải thuyết H0.

4.3 Kiểm định tương quan chuỗi: Ljung-Box

Kiểm định Ljung-Box được sử dụng để kiểm tra tính tương quan tự do của một chuỗi thời gian và xác định xem chuỗi có phụ thuộc tương quan không gian hay không. Đặt giả thiết: H0 là không có tương quan chuỗi Ljung-Box. H1 là có tương quan chuỗi Ljung_Box

4.3.1. VNI

library(stats)
result3 <-  Box.test(Var1, lag = 10, type = "Ljung-Box")
print(result3)
## 
##  Box-Ljung test
## 
## data:  Var1
## X-squared = 15.892, df = 10, p-value = 0.1028

Kết quả kiểm định Box-Ljung cho thấy: với p-value là 0.1028, lớn hơn mức 0.05, chấp nhận giả thuyết H0. Điều này cho thấy có bằng chứng về không có sự tự tương quan đáng kể trong dữ liệu chuỗi thời gian tại các độ trễ đã được kiểm tra.

4.3.2. FTMIB

library(stats)
result4 <-  Box.test(Var2, lag = 10, type = "Ljung-Box")
print(result4)
## 
##  Box-Ljung test
## 
## data:  Var2
## X-squared = 55.845, df = 10, p-value = 2.195e-08

Kết quả kiểm định Box-Ljung cho thấy: với p-value là 0.00000002195, nhỏ hơn mức 0.05, bác bỏ giả thuyết H0. Điều này cho thấy có bằng chứng về có sự tự tương quan đáng kể trong dữ liệu chuỗi thời gian tại các độ trễ đã được kiểm tra.

5. Kiểm tra ARIMA

VNI

library(forecast)
## Warning: package 'forecast' was built under R version 4.3.3
modeld <- auto.arima(mhnn$VNI)
modeld
## Series: mhnn$VNI 
## ARIMA(1,0,1) with zero mean 
## 
## Coefficients:
##          ar1      ma1
##       0.6900  -0.6395
## s.e.  0.1715   0.1828
## 
## sigma^2 = 0.0001705:  log likelihood = 4277.83
## AIC=-8549.66   AICc=-8549.65   BIC=-8533.8

FTMIB

modeld1 <- auto.arima(mhnn$FTMIB)
modeld1
## Series: mhnn$FTMIB 
## ARIMA(3,0,3) with zero mean 
## 
## Coefficients:
##           ar1     ar2     ar3     ma1      ma2      ma3
##       -0.8130  0.4344  0.5370  0.7598  -0.3754  -0.4100
## s.e.   0.1297  0.1764  0.1152  0.1386   0.1810   0.1227
## 
## sigma^2 = 0.0002014:  log likelihood = 4157.83
## AIC=-8301.67   AICc=-8301.59   BIC=-8264.64
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.3.3
library(fGarch)
## Warning: package 'fGarch' was built under R version 4.3.3
## NOTE: Packages 'fBasics', 'timeDate', and 'timeSeries' are no longer
## attached to the search() path when 'fGarch' is attached.
## 
## If needed attach them yourself in your R script by e.g.,
##         require("timeSeries")
## 
## Attaching package: 'fGarch'
## The following objects are masked from 'package:PerformanceAnalytics':
## 
##     ES, VaR
library(rugarch)
## Warning: package 'rugarch' was built under R version 4.3.3
## Loading required package: parallel
## 
## Attaching package: 'rugarch'
## The following object is masked from 'package:stats':
## 
##     sigma
library(readxl)

6. Kiểm định ARCh - LM

VNI

# Kiểm định hiệu ứng ARCH - LM  cho chỉ số chứng khoán
arch_spec <- ugarchspec(variance.model = list(model = "sGARCH"))
arch_VNI <- ugarchfit(spec = arch_spec, data = mhnn$VNI)

residuals <- residuals(arch_VNI)
n <- length(residuals)
x <- 1:n
# Tạo mô hình tuyến tính
arch_lm_model <- lm(residuals^2 ~ x)
# Kiểm định hiệu ứng ARCH-LM
aTSA::arch.test(arima(mhnn$VNI,order = c(1,0,1)))
## ARCH heteroscedasticity test for residuals 
## alternative: heteroscedastic 
## 
## Portmanteau-Q test: 
##      order  PQ p.value
## [1,]     4 191       0
## [2,]     8 293       0
## [3,]    12 371       0
## [4,]    16 399       0
## [5,]    20 416       0
## [6,]    24 418       0
## Lagrange-Multiplier test: 
##      order   LM p.value
## [1,]     4 1056       0
## [2,]     8  466       0
## [3,]    12  296       0
## [4,]    16  218       0
## [5,]    20  168       0
## [6,]    24  134       0

VNI CÓ HIỆU ỨNG ARCH

# Kiểm định hiệu ứng ARCH - LM  cho chỉ số chứng khoán 
arch_spec <- ugarchspec(variance.model = list(model = "sGARCH"))
arch_FTMIB <- ugarchfit(spec = arch_spec, data = mhnn$FTMIB)

residuals1 <- residuals(arch_FTMIB)
n <- length(residuals1)
x <- 1:n
# Tạo mô hình tuyến tính
arch_lm_model1 <- lm(residuals1^2 ~ x)
# Kiểm định hiệu ứng ARCH-LM
 aTSA::arch.test(arima(mhnn$FTMIB,order = c(3,0,3)))
## ARCH heteroscedasticity test for residuals 
## alternative: heteroscedastic 
## 
## Portmanteau-Q test: 
##      order  PQ p.value
## [1,]     4 212       0
## [2,]     8 246       0
## [3,]    12 267       0
## [4,]    16 280       0
## [5,]    20 281       0
## [6,]    24 290       0
## Lagrange-Multiplier test: 
##      order   LM p.value
## [1,]     4 1735       0
## [2,]     8  803       0
## [3,]    12  464       0
## [4,]    16  333       0
## [5,]    20  263       0
## [6,]    24  211       0

FTMIB CÓ HIỆU ỨNG ARCH

7. Mô hình Garch

library(rugarch)
VNIts<- ts(mhnn$VNI)
head(VNIts)
## Time Series:
## Start = 1 
## End = 6 
## Frequency = 1 
## [1]  0.009892958  0.013903513 -0.006986842  0.010071073  0.010367423
## [6]  0.004392599
library(rugarch)
FTMIBts<- ts(mhnn$FTMIB)
head(FTMIBts)
## Time Series:
## Start = 1 
## End = 6 
## Frequency = 1 
## [1] 0.002715448 0.027359441 0.011050944 0.003657259 0.006948236 0.006604533
library(lmtest)
VNIspec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1,1)), mean.model = list(armaOrder = c(1,1), include.mean =TRUE), distribution.model = 'norm')
print(VNIspec)
## 
## *---------------------------------*
## *       GARCH Model Spec          *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## ------------------------------------
## GARCH Model      : gjrGARCH(1,1)
## Variance Targeting   : FALSE 
## 
## Conditional Mean Dynamics
## ------------------------------------
## Mean Model       : ARFIMA(1,0,1)
## Include Mean     : TRUE 
## GARCH-in-Mean        : FALSE 
## 
## Conditional Distribution
## ------------------------------------
## Distribution :  norm 
## Includes Skew    :  FALSE 
## Includes Shape   :  FALSE 
## Includes Lambda  :  FALSE
library(lmtest)
FTMIBspec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1,1)), mean.model = list(armaOrder = c(3,3), include.mean =TRUE), distribution.model = 'norm')
print(FTMIBspec)
## 
## *---------------------------------*
## *       GARCH Model Spec          *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## ------------------------------------
## GARCH Model      : gjrGARCH(1,1)
## Variance Targeting   : FALSE 
## 
## Conditional Mean Dynamics
## ------------------------------------
## Mean Model       : ARFIMA(3,0,3)
## Include Mean     : TRUE 
## GARCH-in-Mean        : FALSE 
## 
## Conditional Distribution
## ------------------------------------
## Distribution :  norm 
## Includes Skew    :  FALSE 
## Includes Shape   :  FALSE 
## Includes Lambda  :  FALSE
VNIfit <- ugarchfit(spec = VNIspec, VNIts)
print(VNIfit)
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(1,1)
## Mean Model   : ARFIMA(1,0,1)
## Distribution : norm 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error   t value Pr(>|t|)
## mu      0.000060    0.000359   0.16772 0.866803
## ar1     0.650968    0.157540   4.13207 0.000036
## ma1    -0.555141    0.168603  -3.29260 0.000993
## omega   0.000011    0.000000 108.44185 0.000000
## alpha1  0.013990    0.007932   1.76375 0.077773
## beta1   0.819688    0.011617  70.55656 0.000000
## gamma1  0.183315    0.032314   5.67288 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000060    0.000365  0.16491 0.869014
## ar1     0.650968    0.176393  3.69043 0.000224
## ma1    -0.555141    0.179881 -3.08615 0.002028
## omega   0.000011    0.000000 59.81026 0.000000
## alpha1  0.013990    0.011714  1.19430 0.232361
## beta1   0.819688    0.020467 40.05001 0.000000
## gamma1  0.183315    0.049910  3.67291 0.000240
## 
## LogLikelihood : 4446.034 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.0601
## Bayes        -6.0348
## Shibata      -6.0602
## Hannan-Quinn -6.0507
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                     0.1643  0.6852
## Lag[2*(p+q)+(p+q)-1][5]    1.1070  1.0000
## Lag[4*(p+q)+(p+q)-1][9]    1.8660  0.9895
## d.o.f=2
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                     0.4318  0.5111
## Lag[2*(p+q)+(p+q)-1][5]    0.8838  0.8854
## Lag[4*(p+q)+(p+q)-1][9]    1.3854  0.9644
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]    0.5050 0.500 2.000  0.4773
## ARCH Lag[5]    0.5525 1.440 1.667  0.8680
## ARCH Lag[7]    0.6254 2.315 1.543  0.9657
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  30.3919
## Individual Statistics:              
## mu     0.20516
## ar1    0.13150
## ma1    0.12657
## omega  7.64101
## alpha1 0.14678
## beta1  0.08016
## gamma1 0.06531
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.69 1.9 2.35
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value    prob sig
## Sign Bias           1.9389 0.05270   *
## Negative Sign Bias  0.7542 0.45085    
## Positive Sign Bias  1.1126 0.26606    
## Joint Effect       10.7653 0.01307  **
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     108.4    1.575e-14
## 2    30     142.2    7.164e-17
## 3    40     148.1    1.261e-14
## 4    50     166.3    1.114e-14
## 
## 
## Elapsed time : 0.367245

Nhìn chung, kết quả cho thấy mô hình GARCH có thể phù hợp với dữ liệu, nhưng việc lựa chọn số nhóm (groups) tối ưu cần được xem xét kỹ lưỡng. Bạn có thể thử nghiệm với các số lượng nhóm khác nhau để tìm ra kết quả tối ưu nhất.

FTMIBfit <- ugarchfit(spec = FTMIBspec, FTMIBts)
print(FTMIBfit)
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(1,1)
## Mean Model   : ARFIMA(3,0,3)
## Distribution : norm 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000167    0.000346   0.4835 0.628743
## ar1    -0.783391    0.169740  -4.6153 0.000004
## ar2     0.526052    0.188374   2.7926 0.005229
## ar3     0.583051    0.145860   3.9973 0.000064
## ma1     0.769654    0.182202   4.2242 0.000024
## ma2    -0.476091    0.198448  -2.3991 0.016436
## ma3    -0.499492    0.158335  -3.1547 0.001607
## omega   0.000010    0.000000  40.2693 0.000000
## alpha1  0.009625    0.008822   1.0910 0.275294
## beta1   0.804544    0.015255  52.7396 0.000000
## gamma1  0.267888    0.040561   6.6045 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000167    0.000365  0.45871 0.646440
## ar1    -0.783391    0.181691 -4.31167 0.000016
## ar2     0.526052    0.145079  3.62596 0.000288
## ar3     0.583051    0.129371  4.50682 0.000007
## ma1     0.769654    0.195978  3.92724 0.000086
## ma2    -0.476091    0.154357 -3.08435 0.002040
## ma3    -0.499492    0.143100 -3.49050 0.000482
## omega   0.000010    0.000000 22.12887 0.000000
## alpha1  0.009625    0.010539  0.91328 0.361095
## beta1   0.804544    0.022011 36.55215 0.000000
## gamma1  0.267888    0.065855  4.06784 0.000047
## 
## LogLikelihood : 4409.877 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.0053
## Bayes        -5.9656
## Shibata      -6.0054
## Hannan-Quinn -5.9905
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                          statistic p-value
## Lag[1]                      0.0906  0.7634
## Lag[2*(p+q)+(p+q)-1][17]    2.6414  1.0000
## Lag[4*(p+q)+(p+q)-1][29]    7.1136  0.9996
## d.o.f=6
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                    0.03966  0.8421
## Lag[2*(p+q)+(p+q)-1][5]   1.97804  0.6236
## Lag[4*(p+q)+(p+q)-1][9]   3.20152  0.7253
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]   0.09278 0.500 2.000  0.7607
## ARCH Lag[5]   0.99634 1.440 1.667  0.7340
## ARCH Lag[7]   1.79631 2.315 1.543  0.7603
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  16.0803
## Individual Statistics:              
## mu     0.03748
## ar1    0.21252
## ar2    0.08252
## ar3    0.05107
## ma1    0.19187
## ma2    0.05963
## ma3    0.06267
## omega  6.57666
## alpha1 0.20680
## beta1  0.14708
## gamma1 0.11397
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          2.49 2.75 3.27
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value      prob sig
## Sign Bias           3.4642 0.0005472 ***
## Negative Sign Bias  1.4221 0.1552152    
## Positive Sign Bias  0.9747 0.3298635    
## Joint Effect       13.0219 0.0045895 ***
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     70.00    9.186e-08
## 2    30     80.56    9.579e-07
## 3    40     94.34    1.742e-06
## 4    50    107.32    3.036e-06
## 
## 
## Elapsed time : 0.6064229
VNIst.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(1, 1), include.mean = TRUE), distribution.model = "std")

VNIst1<- ugarchfit(VNIst.spec,VNIts) 
print(VNIst1)
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(1,1)
## Mean Model   : ARFIMA(1,0,1)
## Distribution : std 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.001056    0.000265   3.9825 0.000068
## ar1     0.665811    0.232920   2.8585 0.004256
## ma1    -0.609440    0.247145  -2.4659 0.013666
## omega   0.000014    0.000001  15.0561 0.000000
## alpha1  0.022527    0.010909   2.0650 0.038925
## beta1   0.753926    0.024086  31.3016 0.000000
## gamma1  0.289611    0.055559   5.2126 0.000000
## shape   3.726180    0.322200  11.5648 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.001056    0.000271   3.8991 0.000097
## ar1     0.665811    0.270513   2.4613 0.013844
## ma1    -0.609440    0.284423  -2.1427 0.032135
## omega   0.000014    0.000001   9.4759 0.000000
## alpha1  0.022527    0.021683   1.0389 0.298838
## beta1   0.753926    0.025361  29.7272 0.000000
## gamma1  0.289611    0.055724   5.1972 0.000000
## shape   3.726180    0.319129  11.6761 0.000000
## 
## LogLikelihood : 4551.772 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.2031
## Bayes        -6.1742
## Shibata      -6.2032
## Hannan-Quinn -6.1923
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                     0.7379  0.3903
## Lag[2*(p+q)+(p+q)-1][5]    1.2983  0.9997
## Lag[4*(p+q)+(p+q)-1][9]    2.1396  0.9779
## d.o.f=2
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                      1.367  0.2423
## Lag[2*(p+q)+(p+q)-1][5]     2.112  0.5921
## Lag[4*(p+q)+(p+q)-1][9]     2.820  0.7883
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]     1.094 0.500 2.000  0.2955
## ARCH Lag[5]     1.294 1.440 1.667  0.6481
## ARCH Lag[7]     1.385 2.315 1.543  0.8442
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  33.3127
## Individual Statistics:             
## mu     0.2236
## ar1    0.2224
## ma1    0.2037
## omega  5.8459
## alpha1 0.2628
## beta1  0.2264
## gamma1 0.1709
## shape  0.2046
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.89 2.11 2.59
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value    prob sig
## Sign Bias            1.668 0.09554   *
## Negative Sign Bias   1.641 0.10092    
## Positive Sign Bias   1.320 0.18719    
## Joint Effect         9.499 0.02334  **
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     41.44    0.0021056
## 2    30     58.41    0.0009709
## 3    40     69.55    0.0018760
## 4    50     85.89    0.0008803
## 
## 
## Elapsed time : 0.738292

Điều này cho thấy mô hình GARCH phù hợp tốt với dữ liệu được quan sát vì sự khác biệt giữa tần số được quan sát và tần số dự kiến ​​trong mỗi nhóm không có ý nghĩa thống kê. Kết quả Kiểm tra mức độ phù hợp của Pearson đã điều chỉnh chứng minh mô hình GARCH là một lựa chọn thích hợp để lập mô hình động lực phương sai có điều kiện trong tập dữ liệu này.

FTMIBst.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(3, 3), include.mean = TRUE), distribution.model = "std")
FTMIBst1<- ugarchfit(FTMIBst.spec,FTMIBts) 
print(FTMIBst1)
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(1,1)
## Mean Model   : ARFIMA(3,0,3)
## Distribution : std 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error   t value Pr(>|t|)
## mu      0.000785    0.000258  3.037777 0.002383
## ar1    -0.803101    0.204947 -3.918574 0.000089
## ar2     0.524863    0.256772  2.044079 0.040946
## ar3     0.643837    0.140974  4.567079 0.000005
## ma1     0.764800    0.215344  3.551530 0.000383
## ma2    -0.530984    0.256577 -2.069496 0.038500
## ma3    -0.597359    0.144278 -4.140349 0.000035
## omega   0.000007    0.000001 12.800405 0.000000
## alpha1  0.000000    0.010433  0.000007 0.999995
## beta1   0.859926    0.017925 47.972852 0.000000
## gamma1  0.191725    0.035887  5.342479 0.000000
## shape   4.761620    0.584678  8.144010 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error   t value Pr(>|t|)
## mu      0.000785    0.000258  3.039980 0.002366
## ar1    -0.803101    0.165237 -4.860306 0.000001
## ar2     0.524863    0.059062  8.886629 0.000000
## ar3     0.643837    0.065185  9.877057 0.000000
## ma1     0.764800    0.180657  4.233428 0.000023
## ma2    -0.530984    0.067464 -7.870578 0.000000
## ma3    -0.597359    0.080068 -7.460622 0.000000
## omega   0.000007    0.000001  8.791863 0.000000
## alpha1  0.000000    0.011218  0.000006 0.999995
## beta1   0.859926    0.018125 47.444345 0.000000
## gamma1  0.191725    0.041979  4.567208 0.000005
## shape   4.761620    0.546727  8.709321 0.000000
## 
## LogLikelihood : 4464.202 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.0781
## Bayes        -6.0348
## Shibata      -6.0782
## Hannan-Quinn -6.0619
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                          statistic p-value
## Lag[1]                       0.967  0.3254
## Lag[2*(p+q)+(p+q)-1][17]     4.337  1.0000
## Lag[4*(p+q)+(p+q)-1][29]     9.433  0.9850
## d.o.f=6
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                     0.1396  0.7087
## Lag[2*(p+q)+(p+q)-1][5]    1.8499  0.6543
## Lag[4*(p+q)+(p+q)-1][9]    2.7558  0.7985
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]     1.009 0.500 2.000  0.3152
## ARCH Lag[5]     1.656 1.440 1.667  0.5523
## ARCH Lag[7]     2.082 2.315 1.543  0.6999
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  12.0321
## Individual Statistics:              
## mu     0.02173
## ar1    0.11400
## ar2    0.08360
## ar3    0.05728
## ma1    0.08676
## ma2    0.05340
## ma3    0.05065
## omega  2.89697
## alpha1 0.05521
## beta1  0.05940
## gamma1 0.03553
## shape  0.05962
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          2.69 2.96 3.51
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value      prob sig
## Sign Bias            4.014 0.0000626 ***
## Negative Sign Bias   1.006 0.3146228    
## Positive Sign Bias   1.486 0.1376159    
## Joint Effect        17.730 0.0004999 ***
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     28.61      0.07236
## 2    30     37.31      0.13836
## 3    40     40.06      0.42274
## 4    50     61.72      0.10485
## 
## 
## Elapsed time : 0.735548
# Phân phối Student đối xứng (sstd)
VNIst1.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(1, 1), include.mean = TRUE), distribution.model = "sstd")

VNIst2<- ugarchfit(VNIst1.spec,VNIts) 
print(VNIst2)
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(1,1)
## Mean Model   : ARFIMA(1,0,1)
## Distribution : sstd 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error   t value Pr(>|t|)
## mu      0.000194    0.000423   0.45713 0.647580
## ar1     0.939799    0.054148  17.35601 0.000000
## ma1    -0.912787    0.067970 -13.42928 0.000000
## omega   0.000011    0.000000  30.57022 0.000000
## alpha1  0.025505    0.012719   2.00520 0.044942
## beta1   0.797505    0.019417  41.07183 0.000000
## gamma1  0.232235    0.049625   4.67983 0.000003
## skew    0.813552    0.030098  27.02974 0.000000
## shape   4.105845    0.404246  10.15680 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.000194    0.000543  0.35647 0.721490
## ar1     0.939799    0.083930 11.19741 0.000000
## ma1    -0.912787    0.105579 -8.64558 0.000000
## omega   0.000011    0.000001 19.75206 0.000000
## alpha1  0.025505    0.014547  1.75327 0.079556
## beta1   0.797505    0.017850 44.67833 0.000000
## gamma1  0.232235    0.056657  4.09896 0.000042
## skew    0.813552    0.031374 25.93080 0.000000
## shape   4.105845    0.357150 11.49614 0.000000
## 
## LogLikelihood : 4567.318 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.2230
## Bayes        -6.1905
## Shibata      -6.2230
## Hannan-Quinn -6.2108
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                      3.751 0.05279
## Lag[2*(p+q)+(p+q)-1][5]     4.178 0.04169
## Lag[4*(p+q)+(p+q)-1][9]     5.187 0.41220
## d.o.f=2
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                     0.9968  0.3181
## Lag[2*(p+q)+(p+q)-1][5]    1.7481  0.6790
## Lag[4*(p+q)+(p+q)-1][9]    2.5263  0.8338
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]     1.097 0.500 2.000  0.2949
## ARCH Lag[5]     1.308 1.440 1.667  0.6442
## ARCH Lag[7]     1.395 2.315 1.543  0.8421
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  48.7829
## Individual Statistics:              
## mu      0.1614
## ar1     0.1768
## ma1     0.1924
## omega  10.3764
## alpha1  0.2033
## beta1   0.1827
## gamma1  0.1152
## skew    0.1100
## shape   0.1402
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          2.1 2.32 2.82
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value     prob sig
## Sign Bias           2.6295 0.008641 ***
## Negative Sign Bias  1.8155 0.069649   *
## Positive Sign Bias  0.8899 0.373645    
## Joint Effect       13.5922 0.003516 ***
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     31.97      0.03150
## 2    30     47.31      0.01732
## 3    40     56.94      0.03170
## 4    50     72.58      0.01596
## 
## 
## Elapsed time : 1.058992
# Phân phối Student đối xứng (sstd)
FTMIBst1.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(3, 3), include.mean = TRUE), distribution.model = "sstd")

FTMIBst2<- ugarchfit(FTMIBst1.spec,FTMIBts) 
print(FTMIBst2)
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(1,1)
## Mean Model   : ARFIMA(3,0,3)
## Distribution : sstd 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error    t value Pr(>|t|)
## mu      0.000275    0.000049     5.6439        0
## ar1    -0.675147    0.011192   -60.3244        0
## ar2     0.820780    0.004130   198.7148        0
## ar3     0.818348    0.013156    62.2033        0
## ma1     0.634800    0.000815   779.0813        0
## ma2    -0.842434    0.000339 -2488.2476        0
## ma3    -0.782586    0.000256 -3059.0182        0
## omega   0.000008    0.000001     7.2952        0
## alpha1  0.000000    0.007972     0.0000        1
## beta1   0.849108    0.008813    96.3505        0
## gamma1  0.200226    0.019954    10.0343        0
## skew    0.835886    0.030973    26.9880        0
## shape   5.242775    0.263663    19.8844        0
## 
## Robust Standard Errors:
##         Estimate  Std. Error    t value Pr(>|t|)
## mu      0.000275    0.000074     3.7112 0.000206
## ar1    -0.675147    0.017120   -39.4367 0.000000
## ar2     0.820780    0.010840    75.7168 0.000000
## ar3     0.818348    0.013712    59.6791 0.000000
## ma1     0.634800    0.001547   410.2818 0.000000
## ma2    -0.842434    0.000447 -1883.5194 0.000000
## ma3    -0.782586    0.000088 -8900.0330 0.000000
## omega   0.000008    0.000002     4.0234 0.000057
## alpha1  0.000000    0.015637     0.0000 1.000000
## beta1   0.849108    0.032901    25.8080 0.000000
## gamma1  0.200226    0.049976     4.0064 0.000062
## skew    0.835886    0.029583    28.2552 0.000000
## shape   5.242775    1.063997     4.9274 0.000001
## 
## LogLikelihood : 4478.448 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.0962
## Bayes        -6.0492
## Shibata      -6.0963
## Hannan-Quinn -6.0787
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                          statistic p-value
## Lag[1]                       1.094  0.2956
## Lag[2*(p+q)+(p+q)-1][17]     6.596  1.0000
## Lag[4*(p+q)+(p+q)-1][29]    11.151  0.9194
## d.o.f=6
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                    0.02771  0.8678
## Lag[2*(p+q)+(p+q)-1][5]   1.71737  0.6865
## Lag[4*(p+q)+(p+q)-1][9]   2.74636  0.8000
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]    0.6499 0.500 2.000  0.4201
## ARCH Lag[5]    1.3428 1.440 1.667  0.6346
## ARCH Lag[7]    1.9352 2.315 1.543  0.7310
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  21.2905
## Individual Statistics:              
## mu     0.17587
## ar1    0.08472
## ar2    0.15295
## ar3    0.07572
## ma1    0.16367
## ma2    0.20155
## ma3    0.18665
## omega  4.80763
## alpha1 0.12320
## beta1  0.06895
## gamma1 0.06199
## skew   0.12107
## shape  0.08797
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          2.89 3.15 3.69
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value     prob sig
## Sign Bias           3.2332 0.001252 ***
## Negative Sign Bias  0.8360 0.403317    
## Positive Sign Bias  0.8673 0.385917    
## Joint Effect       12.3433 0.006295 ***
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     11.79       0.8943
## 2    30     19.38       0.9113
## 3    40     24.56       0.9655
## 4    50     31.48       0.9756
## 
## 
## Elapsed time : 1.282947
# Phân phối Generalized Error Distribution(ged)
VNIged.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(1, 1), include.mean = TRUE), distribution.model = "ged")

VNIged1 <- ugarchfit(VNIged.spec,VNIts) 
print(VNIged1)
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(1,1)
## Mean Model   : ARFIMA(1,0,1)
## Distribution : ged 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu      0.001156    0.000143   8.0611 0.000000
## ar1     0.906702    0.017275  52.4867 0.000000
## ma1    -0.884210    0.018865 -46.8705 0.000000
## omega   0.000012    0.000000  35.0913 0.000000
## alpha1  0.025587    0.013036   1.9628 0.049670
## beta1   0.782216    0.019757  39.5921 0.000000
## gamma1  0.207709    0.045309   4.5842 0.000005
## shape   1.055461    0.046220  22.8358 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error   t value Pr(>|t|)
## mu      0.001156    0.000082   14.0828 0.000000
## ar1     0.906702    0.007772  116.6628 0.000000
## ma1    -0.884210    0.007324 -120.7359 0.000000
## omega   0.000012    0.000000   27.4474 0.000000
## alpha1  0.025587    0.014628    1.7492 0.080257
## beta1   0.782216    0.020390   38.3627 0.000000
## gamma1  0.207709    0.047610    4.3627 0.000013
## shape   1.055461    0.047734   22.1112 0.000000
## 
## LogLikelihood : 4545.629 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.1947
## Bayes        -6.1658
## Shibata      -6.1948
## Hannan-Quinn -6.1839
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                      3.382 0.06591
## Lag[2*(p+q)+(p+q)-1][5]     3.780 0.11328
## Lag[4*(p+q)+(p+q)-1][9]     4.797 0.50040
## d.o.f=2
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                      0.838  0.3600
## Lag[2*(p+q)+(p+q)-1][5]     1.416  0.7606
## Lag[4*(p+q)+(p+q)-1][9]     2.040  0.9002
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]    0.8718 0.500 2.000  0.3505
## ARCH Lag[5]    1.0145 1.440 1.667  0.7286
## ARCH Lag[7]    1.0713 2.315 1.543  0.9017
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  40.9765
## Individual Statistics:              
## mu      0.2084
## ar1     0.2075
## ma1     0.2311
## omega  11.5347
## alpha1  0.2227
## beta1   0.1474
## gamma1  0.1350
## shape   0.1252
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.89 2.11 2.59
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value    prob sig
## Sign Bias            1.851 0.06433   *
## Negative Sign Bias   1.285 0.19882    
## Positive Sign Bias   1.127 0.25984    
## Joint Effect         9.474 0.02361  **
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     54.71    2.571e-05
## 2    30     73.68    9.350e-06
## 3    40     87.85    1.253e-05
## 4    50    109.64    1.550e-06
## 
## 
## Elapsed time : 0.9748042
# Phân phối Generalized Error Distribution(ged)
FTMIBged.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(3, 3), include.mean = TRUE), distribution.model = "ged")

FTMIBged1 <- ugarchfit(FTMIBged.spec,FTMIBts) 
print(FTMIBged1)
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(1,1)
## Mean Model   : ARFIMA(3,0,3)
## Distribution : ged 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error    t value Pr(>|t|)
## mu      0.000822    0.000202   4.074669 0.000046
## ar1    -0.789765    0.024301 -32.499716 0.000000
## ar2     0.595567    0.041529  14.341059 0.000000
## ar3     0.684212    0.114290   5.986623 0.000000
## ma1     0.756024    0.035562  21.259103 0.000000
## ma2    -0.589791    0.047165 -12.504737 0.000000
## ma3    -0.629559    0.116243  -5.415873 0.000000
## omega   0.000008    0.000000  18.403834 0.000000
## alpha1  0.000210    0.009328   0.022534 0.982022
## beta1   0.840044    0.017491  48.026167 0.000000
## gamma1  0.211678    0.037820   5.597042 0.000000
## shape   1.231880    0.058072  21.213125 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error    t value Pr(>|t|)
## mu      0.000822    0.000185   4.439221 0.000009
## ar1    -0.789765    0.043206 -18.279027 0.000000
## ar2     0.595567    0.088495   6.729936 0.000000
## ar3     0.684212    0.263924   2.592461 0.009529
## ma1     0.756024    0.070076  10.788589 0.000000
## ma2    -0.589791    0.103368  -5.705749 0.000000
## ma3    -0.629559    0.267447  -2.353960 0.018575
## omega   0.000008    0.000001  12.575060 0.000000
## alpha1  0.000210    0.008619   0.024389 0.980543
## beta1   0.840044    0.019984  42.036145 0.000000
## gamma1  0.211678    0.048883   4.330289 0.000015
## shape   1.231880    0.068155  18.074659 0.000000
## 
## LogLikelihood : 4459.375 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.0715
## Bayes        -6.0282
## Shibata      -6.0716
## Hannan-Quinn -6.0553
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                          statistic p-value
## Lag[1]                       0.714  0.3981
## Lag[2*(p+q)+(p+q)-1][17]     3.710  1.0000
## Lag[4*(p+q)+(p+q)-1][29]     8.714  0.9941
## d.o.f=6
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                    0.05184  0.8199
## Lag[2*(p+q)+(p+q)-1][5]   1.59380  0.7168
## Lag[4*(p+q)+(p+q)-1][9]   2.46417  0.8430
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]    0.6135 0.500 2.000  0.4335
## ARCH Lag[5]    1.3018 1.440 1.667  0.6459
## ARCH Lag[7]    1.7423 2.315 1.543  0.7716
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  15.5361
## Individual Statistics:              
## mu     0.04306
## ar1    0.11806
## ar2    0.04845
## ar3    0.03073
## ma1    0.07800
## ma2    0.02518
## ma3    0.04297
## omega  4.94668
## alpha1 0.11963
## beta1  0.09416
## gamma1 0.06245
## shape  0.12654
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          2.69 2.96 3.51
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value      prob sig
## Sign Bias            4.050 5.388e-05 ***
## Negative Sign Bias   1.192 2.334e-01    
## Positive Sign Bias   1.572 1.163e-01    
## Joint Effect        17.502 5.571e-04 ***
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     38.52      0.00509
## 2    30     39.24      0.09717
## 3    40     54.04      0.05515
## 4    50     56.60      0.21237
## 
## 
## Elapsed time : 1.219241
# Phân phối Generalized Error Distribution đối xứng ("sged")
VNIged.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(1, 1), include.mean = TRUE), distribution.model = "sged")

VNIged2 <- ugarchfit(VNIged.spec,VNIts) 
print(VNIged2)
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(1,1)
## Mean Model   : ARFIMA(1,0,1)
## Distribution : sged 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error   t value Pr(>|t|)
## mu     -0.000052    0.000105  -0.49408 0.621248
## ar1     0.936633    0.015019  62.36383 0.000000
## ma1    -0.912296    0.017758 -51.37416 0.000000
## omega   0.000011    0.000000  32.73581 0.000000
## alpha1  0.026475    0.010212   2.59258 0.009526
## beta1   0.796136    0.015930  49.97601 0.000000
## gamma1  0.199979    0.036192   5.52557 0.000000
## skew    0.857825    0.021142  40.57507 0.000000
## shape   1.118055    0.050894  21.96813 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error   t value Pr(>|t|)
## mu     -0.000052    0.000034   -1.5194 0.128654
## ar1     0.936633    0.007032  133.2026 0.000000
## ma1    -0.912296    0.007969 -114.4801 0.000000
## omega   0.000011    0.000000   28.7813 0.000000
## alpha1  0.026475    0.009663    2.7398 0.006148
## beta1   0.796136    0.014568   54.6480 0.000000
## gamma1  0.199979    0.031938    6.2614 0.000000
## skew    0.857825    0.021039   40.7728 0.000000
## shape   1.118055    0.053271   20.9881 0.000000
## 
## LogLikelihood : 4562.396 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.2162
## Bayes        -6.1837
## Shibata      -6.2163
## Hannan-Quinn -6.2041
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic  p-value
## Lag[1]                      4.117 0.042454
## Lag[2*(p+q)+(p+q)-1][5]     4.667 0.009904
## Lag[4*(p+q)+(p+q)-1][9]     5.594 0.328564
## d.o.f=2
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                     0.9071  0.3409
## Lag[2*(p+q)+(p+q)-1][5]    1.5409  0.7298
## Lag[4*(p+q)+(p+q)-1][9]    2.2284  0.8760
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]    0.9435 0.500 2.000  0.3314
## ARCH Lag[5]    1.1052 1.440 1.667  0.7020
## ARCH Lag[7]    1.1692 2.315 1.543  0.8846
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  44.9132
## Individual Statistics:               
## mu      0.13500
## ar1     0.18690
## ma1     0.22814
## omega  12.32771
## alpha1  0.21920
## beta1   0.15744
## gamma1  0.13076
## skew    0.05715
## shape   0.09250
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          2.1 2.32 2.82
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value     prob sig
## Sign Bias           2.8882 0.003932 ***
## Negative Sign Bias  1.7843 0.074588   *
## Positive Sign Bias  0.7224 0.470176    
## Joint Effect       14.9088 0.001896 ***
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     37.89     0.006121
## 2    30     53.37     0.003821
## 3    40     56.72     0.033094
## 4    50     76.81     0.006764
## 
## 
## Elapsed time : 1.615032
# Phân phối Generalized Error Distribution đối xứng ("sged")
FTMIBged.spec <- ugarchspec(variance.model = list(model = "gjrGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(3, 3), include.mean = TRUE), distribution.model = "sged")

FTMIBged2 <- ugarchfit(FTMIBged.spec,FTMIBts) 
print(FTMIBged2)
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : gjrGARCH(1,1)
## Mean Model   : ARFIMA(3,0,3)
## Distribution : sged 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error    t value Pr(>|t|)
## mu      0.000139    0.000209   0.664691  0.50625
## ar1    -0.772552    0.090203  -8.564635  0.00000
## ar2     0.584920    0.028148  20.779980  0.00000
## ar3     0.681751    0.023861  28.572082  0.00000
## ma1     0.737612    0.098230   7.509054  0.00000
## ma2    -0.576842    0.029769 -19.377361  0.00000
## ma3    -0.622407    0.024854 -25.042181  0.00000
## omega   0.000006    0.000001   9.637010  0.00000
## alpha1  0.000000    0.007794   0.000023  0.99998
## beta1   0.864953    0.014199  60.915294  0.00000
## gamma1  0.192765    0.032772   5.882060  0.00000
## skew    0.856431    0.027248  31.430490  0.00000
## shape   1.274873    0.060043  21.232749  0.00000
## 
## Robust Standard Errors:
##         Estimate  Std. Error    t value Pr(>|t|)
## mu      0.000139    0.000148   0.938469  0.34800
## ar1    -0.772552    0.113645  -6.797929  0.00000
## ar2     0.584920    0.014497  40.348572  0.00000
## ar3     0.681751    0.015792  43.171762  0.00000
## ma1     0.737612    0.123449   5.975019  0.00000
## ma2    -0.576842    0.020739 -27.814646  0.00000
## ma3    -0.622407    0.012002 -51.856894  0.00000
## omega   0.000006    0.000001   8.166647  0.00000
## alpha1  0.000000    0.007044   0.000025  0.99998
## beta1   0.864953    0.014972  57.771724  0.00000
## gamma1  0.192765    0.037196   5.182452  0.00000
## skew    0.856431    0.029872  28.669603  0.00000
## shape   1.274873    0.060740  20.989099  0.00000
## 
## LogLikelihood : 4471.293 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -6.0864
## Bayes        -6.0395
## Shibata      -6.0866
## Hannan-Quinn -6.0689
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                          statistic p-value
## Lag[1]                      0.9092  0.3403
## Lag[2*(p+q)+(p+q)-1][17]    3.7009  1.0000
## Lag[4*(p+q)+(p+q)-1][29]    8.4238  0.9962
## d.o.f=6
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                     0.1026  0.7488
## Lag[2*(p+q)+(p+q)-1][5]    1.7975  0.6670
## Lag[4*(p+q)+(p+q)-1][9]    2.8519  0.7832
## d.o.f=2
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[3]    0.7073 0.500 2.000  0.4003
## ARCH Lag[5]    1.4305 1.440 1.667  0.6108
## ARCH Lag[7]    2.0358 2.315 1.543  0.7097
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  10.63
## Individual Statistics:              
## mu     0.04000
## ar1    0.05491
## ar2    0.02667
## ar3    0.03923
## ma1    0.04199
## ma2    0.01858
## ma3    0.04230
## omega  2.74101
## alpha1 0.05519
## beta1  0.06565
## gamma1 0.04144
## skew   0.13780
## shape  0.03677
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          2.89 3.15 3.69
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value      prob sig
## Sign Bias            3.612 0.0003147 ***
## Negative Sign Bias   0.996 0.3194054    
## Positive Sign Bias   1.068 0.2859018    
## Joint Effect        14.818 0.0019793 ***
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     19.03       0.4551
## 2    30     23.68       0.7448
## 3    40     33.95       0.6993
## 4    50     42.75       0.7232
## 
## 
## Elapsed time : 1.849441
# Tạo danh sách bao gồm các phân phối và ước lượng của VNI
VNI_list <- list(
  garchn= VNIfit,
  garcht= VNIst1,
  garchst = VNIst2,
  garchg = VNIged1,
  garchsg = VNIged2
)
# Tính toán các thông tin
VNI_info_mat <- sapply(VNI_list, infocriteria) 
rownames(VNI_info_mat) <- rownames(infocriteria(VNIfit))
print(VNI_info_mat)
##                 garchn    garcht   garchst    garchg   garchsg
## Akaike       -6.060115 -6.203102 -6.222960 -6.194715 -6.216241
## Bayes        -6.034840 -6.174216 -6.190464 -6.165830 -6.183745
## Shibata      -6.060160 -6.203161 -6.223035 -6.194774 -6.216316
## Hannan-Quinn -6.050688 -6.192328 -6.210840 -6.183941 -6.204121
# Tạo danh sách bao gồm các phân phối và ước lượng của FTMIB
FTMIB_list <- list(
  garchn= FTMIBfit,
  garcht= FTMIBst1,
  garchst = FTMIBst2,
  garchg = FTMIBged1,
  garchsg = FTMIBged2
)
# Tính toán các thông tin
FTMIB_info_mat <- sapply(FTMIB_list, infocriteria) 
rownames(FTMIB_info_mat) <- rownames(infocriteria(FTMIBfit))
print(FTMIB_info_mat)
##                 garchn    garcht   garchst    garchg   garchsg
## Akaike       -6.005293 -6.078091 -6.096175 -6.071502 -6.086407
## Bayes        -5.965576 -6.034764 -6.049236 -6.028174 -6.039468
## Shibata      -6.005405 -6.078224 -6.096330 -6.071634 -6.086563
## Hannan-Quinn -5.990480 -6.061931 -6.078668 -6.055341 -6.068900
VNI.res <- residuals(VNIst2)/sigma(VNIst2)
fitdist(distribution = "sstd", VNI.res, control = list())
## $pars
##           mu        sigma         skew        shape 
## -0.001253601  1.004744166  0.812967567  4.065814912 
## 
## $convergence
## [1] 0
## 
## $values
## [1] 2131.483 1938.793 1938.793
## 
## $lagrange
## [1] 0
## 
## $hessian
##            [,1]      [,2]       [,3]      [,4]
## [1,] 2241.51717  546.8934 -745.11901  25.32153
## [2,]  546.89339 1906.6291  254.65484 139.42412
## [3,] -745.11901  254.6548 1359.46978  34.20208
## [4,]   25.32153  139.4241   34.20208  15.11503
## 
## $ineqx0
## NULL
## 
## $nfuneval
## [1] 102
## 
## $outer.iter
## [1] 2
## 
## $elapsed
## Time difference of 0.08497 secs
## 
## $vscale
## [1] 1 1 1 1 1
FTMIB.res <- residuals(FTMIBst2)/sigma(FTMIBst2)
fitdist(distribution = "sstd", FTMIB.res, control = list())
## $pars
##          mu       sigma        skew       shape 
## -0.02369694  1.00394114  0.82499952  5.27872845 
## 
## $convergence
## [1] 0
## 
## $values
## [1] 2166.011 2003.463 2003.463
## 
## $lagrange
## [1] 0
## 
## $hessian
##            [,1]       [,2]        [,3]      [,4]
## [1,] 1838.74949  482.78239 -468.680949 10.629723
## [2,]  482.78239 1875.91146  130.429406 54.288084
## [3,] -468.68095  130.42941 1282.006075  4.157882
## [4,]   10.62972   54.28808    4.157882  3.555558
## 
## $ineqx0
## NULL
## 
## $nfuneval
## [1] 115
## 
## $outer.iter
## [1] 2
## 
## $elapsed
## Time difference of 0.10219 secs
## 
## $vscale
## [1] 1 1 1 1 1
s = pdist("sstd",VNI.res, mu = -0.001253601, sigma =  1.004744166, skew = 0.812967567, shape = 4.065814912 )
head(s,10)
##  [1] 0.8178124 0.9137602 0.1928740 0.8455235 0.8614565 0.6237356 0.8598205
##  [8] 0.4863047 0.9385351 0.3530719
s1 = pdist("sstd",FTMIB.res, mu = -0.02369694, sigma =  1.00394114, skew = 0.82499952, shape = 5.27872845 )
head(s1,10)
##  [1] 0.5544621 0.9816308 0.8133523 0.6277376 0.6805947 0.7752502 0.6890950
##  [8] 0.7393540 0.6749065 0.3845884

8. Kiểm định biên

library("copula")
## Warning: package 'copula' was built under R version 4.3.3
library("scatterplot3d")
#Chuyển đôi dữ liệu phân phối đều
u <- pobs(s)
head(u,10)
##  [1] 0.8090041 0.9147340 0.1841746 0.8369714 0.8567531 0.6371078 0.8533424
##  [8] 0.4931787 0.9386085 0.3431105
k <- pobs(s1)
head(k,10)
##  [1] 0.5654843 0.9802183 0.8117326 0.6296044 0.6787176 0.7742156 0.6848568
##  [8] 0.7360164 0.6712142 0.3888131

Kiểm định cho biến VNI

# Kiểm định Anderson_Darling
library(nortest)
ad.test(u)
## 
##  Anderson-Darling normality test
## 
## data:  u
## A = 16.255, p-value < 2.2e-16
# Kiểm định Cramer-von Mises
cvm.test(u)
## Warning in cvm.test(u): p-value is smaller than 7.37e-10, cannot be computed
## more accurately
## 
##  Cramer-von Mises normality test
## 
## data:  u
## W = 2.2282, p-value = 7.37e-10
# Kiểm định Kolmogorov-Smirnov
ks.test(u, y = "punif")
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  u
## D = 0.00068213, p-value = 1
## alternative hypothesis: two-sided

Kiểm định cho biến FTMIB

# Kiểm định Anderson_Darling
library(nortest)
ad.test(k)
## 
##  Anderson-Darling normality test
## 
## data:  k
## A = 16.255, p-value < 2.2e-16
# Kiểm định Cramer-von Mises
cvm.test(k)
## Warning in cvm.test(k): p-value is smaller than 7.37e-10, cannot be computed
## more accurately
## 
##  Cramer-von Mises normality test
## 
## data:  k
## W = 2.2282, p-value = 7.37e-10
# Kiểm định Kolmogorov-Smirnov
ks.test(k, y = "punif")
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  k
## D = 0.00068213, p-value = 1
## alternative hypothesis: two-sided

9. Copula

library(VineCopula)
## Warning: package 'VineCopula' was built under R version 4.3.3
## 
## Attaching package: 'VineCopula'
## The following object is masked from 'package:copula':
## 
##     pobs
BiCopSelect(u,k, familyset= c(1:10), selectioncrit="AIC",indeptest = FALSE, level = 0.05)
## Bivariate copula: Survival Gumbel (par = 1.09, tau = 0.08)
gumbel.cop <- gumbelCopula(param = 1.09, dim = 2)
plot(mhnn, xlab = "u", ylab = "k", main = "Đồ thị phân tán của copula Gumbel")

persp(gumbel.cop, dCopula, xlab = "u", ylab = "k", zlab = "Mật độ",
      main = "Đồ thị mật độ của copula Gumbel")

gumbel.cop1 <- gumbelCopula(param = 1.09, dim = 2)
set.seed(123)
data12 <- rCopula(1465, gumbel.cop1)
# Vẽ biểu đồ 3D
scatterplot3d(data12[,1], data12[,2], pch = 16, color = "blue",
             type = "h", highlight.3d = TRUE,
             xlab = "U1", ylab = "U2", zlab = "Probability")
## Warning in scatterplot3d(data12[, 1], data12[, 2], pch = 16, color = "blue", :
## color is ignored when highlight.3d = TRUE

plot(data12[, 1], data12[, 2], pch = 16, col = "blue", 
     main = "Scatter Plot of Gumbel Copula Data",
     xlab = "U1", ylab = "U2")

library(ggplot2)

# Tạo dữ liệu giả định
set.seed(123)
data <- data.frame(u = u, k = k)

# Vẽ đồ thị phân tán
ggplot(data, aes(x = u, y = k)) +
  geom_point(size = 1, alpha = 0.5) +
  labs(x = "U", y = "K", title = "Đồ thị phân tán của U và K") +
  theme_classic()

# Cài đặt và tải thư viện plot3D
library(plot3D)
## Warning: package 'plot3D' was built under R version 4.3.3
library(copula)
# Thiết lập Joe copula với tham số par = 1.09
theta <- 1.09
gumbel_cop <- gumbelCopula(param = theta)
# Kiểm tra Kendall's tau của Joe copula
tau <- tau(gumbel_cop)
print(tau)
## [1] 0.08256881
e <- cbind(u,k)
fit <- fitCopula(gumbelCopula(), data = e, method = "ml")  
# Maximum Likelihood Estimation (MLE)
theta <- coef(fit)
print(theta)
##    alpha 
## 1.064523
# Load necessary libraries
library(copula)
library(MASS)
library(scatterplot3d)

# Define the parameter for the Gumbel copula
theta <- 1.09

# Create the Joe copula object
gumbel_copula <- gumbelCopula(param = theta)

# Perform Kernel Density Estimation
kde2d_result <- kde2d(e[,1], e[,2], n = 50)

# Convert kde2d result to a format suitable for scatterplot3d
x <- kde2d_result$x
y <- kde2d_result$y
z <- kde2d_result$z

# Create a grid of points for scatterplot3d
grid <- expand.grid(x = x, y = y)

# Flatten z for scatterplot3d
z_flat <- as.vector(z)

# Plot the density using scatterplot3d
scatterplot3d(grid$x, grid$y, z_flat, type = "h", angle = 30, 
              main = "Density Plot of Gumbel Copula",
              xlab = "Rainfall Depth", 
              ylab = "Shot Duration", 
              zlab = "Bivariate Distribution",
              pch = 20, color = "turquoise")

# Load necessary libraries
library(copula)
library(MASS)

# Define the parameter for the Joe copula
theta <- 1.09

# Create the Joe copula object
gumbel_copula <- gumbelCopula(param = theta)

# Perform Kernel Density Estimation
kde2d_result <- kde2d(e[,1], e[,2], n = 1000)

# Extract the results
x <- kde2d_result$x
y <- kde2d_result$y
z <- kde2d_result$z

# Plot the PDF using persp
persp(x, y, z, phi = 30, theta = 50, col = "lightblue", 
      xlab = "Discharge", ylab = "Duration", zlab = "Density", 
      main = "PDF of Joe Copula")

# Plot the contour plot
contour(x, y, z, xlab = "Discharge", ylab = "Duration", 
        main = "Contour Plot of Gumbel Copula")

# Tạo thêm dữ liệu từ Gumbel copula
set.seed(654)
e <- rCopula(1465, gumbel_cop)
x <- qnorm(e[,1])
y <- qnorm(e[,2])

# Vẽ biểu đồ hộp và râu
boxplot(x, y, 
        col = c("lightblue", "lightgreen"),
        names = c("VNI", "FTMIB"),
        main = "Box Plot")

library(knitr)
library(copula)
library(ggplot2)
library(plotly)
## Warning: package 'plotly' was built under R version 4.3.3
## 
## Attaching package: 'plotly'
## The following object is masked from 'package:MASS':
## 
##     select
## The following object is masked from 'package:ggplot2':
## 
##     last_plot
## The following object is masked from 'package:stats':
## 
##     filter
## The following object is masked from 'package:graphics':
## 
##     layout
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.3.3
library(VC2copula)
## Warning: package 'VC2copula' was built under R version 4.3.3
## 
## Attaching package: 'VC2copula'
## The following objects are masked from 'package:VineCopula':
## 
##     BB1Copula, BB6Copula, BB7Copula, BB8Copula, copulaFromFamilyIndex,
##     joeBiCopula, r270BB1Copula, r270BB6Copula, r270BB7Copula,
##     r270BB8Copula, r270ClaytonCopula, r270GumbelCopula,
##     r270JoeBiCopula, r270TawnT1Copula, r270TawnT2Copula, r90BB1Copula,
##     r90BB6Copula, r90BB7Copula, r90BB8Copula, r90ClaytonCopula,
##     r90GumbelCopula, r90JoeBiCopula, r90TawnT1Copula, r90TawnT2Copula,
##     surBB1Copula, surBB6Copula, surBB7Copula, surBB8Copula,
##     surClaytonCopula, surGumbelCopula, surJoeBiCopula, surTawnT1Copula,
##     surTawnT2Copula, tawnT1Copula, tawnT2Copula, vineCopula
library(VineCopula)
library(gridGraphics)
## Warning: package 'gridGraphics' was built under R version 4.3.3
## Loading required package: grid
library(png)
library(rugarch)

#Tạo hàm vẽ biểu đồ
scatter_plot <- function(random_data, cl) {
  ggplot(data.frame(e), aes(e[,1], e[,2])) +
  geom_point(alpha = 0.5, col = cl) +
  theme_minimal() +
  labs(x = "u", y = "v")
  } #for scatter

persp_plot <- function(copula_obj, file_name, cl) {
  png(file_name)
  persp(copula_obj, dCopula, 
        xlab = 'u', ylab = 'k', col = cl, ltheta = 180,  
        ticktype = "detailed", cex.axis = 0.8)
  dev.off()
  rasterGrob(readPNG(file_name),interpolate = TRUE)
}# for pdf
#Mô phỏng copula gumbel với p=1.09
cop_gum <- gumbelCopula(param = 1.09, dim = 2)
#Mô phỏng 1465 quan sát ngẫu nhiên dựa trên copula có sẵn
random_gum <- rCopula(copula = cop_gum,n = 1465)

#Vẽ biểu đồ 
library(grid)
png('gums.png')
scatter_plot(random_gum,'skyblue')
dev.off()
## png 
##   2
gums <- rasterGrob(readPNG('gums.png'), interpolate = TRUE)
library(ggplot2)
ggplot(data.frame(u,k), aes(u, k)) +
  geom_point(color = "skyblue", alpha = 0.5) +
  theme_minimal()

library(gridExtra)

# Vẽ biểu đồ mật độ phân tán
png('gums.png')
gums <- scatter_plot(random_gum, 'skyblue')
dev.off()
## png 
##   2
# Vẽ biểu đồ PDF
gump <- persp_plot(cop_gum, 'gump.png', 'skyblue')

# Tạo chú thích
legend <- legendGrob(
  labels = c("Gumbel"), pch = 15,
  gp = gpar(col = c('skyblue'), fill = c('skyblue'))
)

# Vẽ cả hai biểu đồ cùng với chú thích trên cùng một hình
grid.arrange(gums, gump, legend, ncol = 2, 
              layout_matrix = rbind(c(1, 4), c(1, 3)),
              widths = c(2, 1),
              top = textGrob("Biểu đồ mật độ phân tán và PDF của Copula Gumbel",
                            gp = gpar(fontsize = 13, font = 2)))

#Tạo hàm vẽ biểu đồ
scatter_plot1 <- function(random_data, cl) {
  ggplot(data.frame(random_data), aes(random_data[,1], random_data[,2])) +
  geom_point(alpha = 0.5, col = cl) +
  theme_minimal() +
  labs(x = "u", y = "v")
  } #for scatter

persp_plot1 <- function(copula_obj, file_name, cl) {
  png(file_name)
  persp(copula_obj, dCopula, 
        xlab = 'u', ylab = 'v', col = cl, ltheta = 120,  
        ticktype = "detailed", cex.axis = 0.8)
  dev.off()
  rasterGrob(readPNG(file_name),interpolate = TRUE)
}# for pdf
#Mô phỏng copula gumbel với p=5
cop_gum1 <- gumbelCopula(param = 5, dim = 2)
#Mô phỏng 6000 quan sát ngẫu nhiên dựa trên copula có sẵn
random_gum1 <- rCopula(copula = cop_gum1,n = 6000)
png('gums.png')
scatter_plot1(random_gum1,'#CC6699')
dev.off()
## png 
##   2
gums1 <- rasterGrob(readPNG('gums.png'), interpolate = TRUE)
library(gridExtra)

# Vẽ biểu đồ mật độ phân tán
png('gums.png')
gums1 <- scatter_plot1(random_gum1, '#CC6699')
dev.off()
## png 
##   2
# Vẽ biểu đồ PDF
gump1 <- persp_plot1(cop_gum1, 'gump.png', '#CC6699')

# Tạo chú thích
legend1 <- legendGrob(
  labels = c("Gumbel"), pch = 15,
  gp = gpar(col = c('#CC6699'), fill = c('#CC6699'))
)

# Vẽ cả hai biểu đồ cùng với chú thích trên cùng một hình
grid.arrange(gums1, gump1, legend1, ncol = 2, 
              layout_matrix = rbind(c(1, 2), c(1, 3)),
              widths = c(2, 1),
              top = textGrob("Biểu đồ mật độ phân tán và PDF của Copula Gumbel",
                            gp = gpar(fontsize = 15, font = 2)))

LS0tDQp0aXRsZTogIk3DlCBIw4xOSCBOR+G6qlUgTkhJw4pOIg0KYXV0aG9yOiAiTMOqIFRo4buLIE5n4buNYyDDgW5oIg0KZGF0ZTogIjIwMjQtMDctMTMiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2NfZGVwdGg6IDINCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IHRydWUNCiAgd29yZF9kb2N1bWVudDoNCiAgICAgdG9jOiB0cnVlDQogICAgIHRvY19kZXB0aDogJzInDQogIHBkZl9kb2N1bWVudDoNCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCi0tLQ0KDQojICoqMS4gVOG7lW5nIHF1YW4qKg0KDQogIFRo4buLIHRyxrDhu51uZyBjaOG7qW5nIGtob8OhbiBWaeG7h3QgTmFtIG5o4buvbmcgbsSDbSBn4bqnbiDEkcOieSDEkcOjIGPDsyBuaOG7r25nIGLGsOG7m2MgdGnhur9uIG5nb+G6oW4gbeG7pWMsIHRodSBow7p0IMSRw7RuZyDEkeG6o28gbmjDoCDEkeG6p3UgdMawIHRoYW0gZ2lhLiBUdXkgbmhpw6puLCBiw6puIGPhuqFuaCB0aeG7gW0gbsSDbmcgcGjDoXQgdHJp4buDbiB0byBs4bubbiwgdGjhu4sgdHLGsOG7nW5nIGPFqW5nIHRp4buBbSDhuqluIG5oaeG7gXUgcuG7p2kgcm8gZG8gYmnhur9uIMSR4buZbmcgbGnDqm4gdOG7pWMuIMSQ4buDIMSRxrBhIHJhIHF1eeG6v3QgxJHhu4tuaCDEkeG6p3UgdMawIHPDoW5nIHN14buRdCB2w6AgaGnhu4d1IHF14bqjLCBuaMOgIMSR4bqndSB0xrAgY+G6p24gY8OzIG5o4buvbmcgY8O0bmcgY+G7pSBwaMOibiB0w61jaCBjaHV5w6puIHPDonUsIHbDoCBtYSB0cuG6rW4gdMawxqFuZyBxdWFuIGzDoCBt4buZdCB0cm9uZyBuaOG7r25nIGzhu7FhIGNo4buNbiBow6BuZyDEkeG6p3UuDQoNCiAgQsOgaSB0aeG7g3UgbHXhuq1uIG7DoHkgc+G6vSBz4butIGThu6VuZyBk4buvIGxp4buHdSB0aOG7iyB0csaw4budbmcgY2jhu6luZyBraG/DoW4gVmnhu4d0IE5hbSB04burIDAxLzAxLzIwMTggxJHhur9uIDI5LzEyLzIwMjMgxJHhu4MgdMOtbmggdG/DoW4gdsOgIHBow6JuIHTDrWNoIG1hIHRy4bqtbiB0xrDGoW5nIHF1YW4gZ2nhu69hIGPDoWMgY2jhu4kgc+G7kSBnacOhIGNow61uaDogVk5JIHbDoCBGVE1JQi4gUXVhIMSRw7MsIG5naGnDqm4gY+G7qXUgc+G6vSBjdW5nIGPhuqVwIGPDoWkgbmjDrG4gdOG7lW5nIHF1YW4gduG7gSBt4bupYyDEkeG7mSBsacOqbiBxdWFuIGdp4buvYSBjw6FjIGNo4buJIHPhu5EsIGdpw7pwIG5ow6AgxJHhuqd1IHTGsCDEkcOhbmggZ2nDoSBy4bunaSBybyB2w6AgeMOieSBk4buxbmcgY2hp4bq/biBsxrDhu6NjIMSR4bqndSB0xrAgcGjDuSBo4bujcC4NCiAgDQpgYGB7cn0NCmxpYnJhcnkoUGVyZm9ybWFuY2VBbmFseXRpY3MpDQpsaWJyYXJ5KHJlYWR4bCkNCmxpYnJhcnkoUGVyZm9ybWFuY2VBbmFseXRpY3MpDQpsaWJyYXJ5KHhsc3gpDQpkYXRhIDwtIHJlYWQueGxzeCgiRDovTUhOTi9NSE5OMS54bHN4Iiw2KQ0KYGBgDQogDQogDQpgYGB7cn0NCmxndm5pPC0gZGlmZihsb2coZGF0YSRWTkkpLCBsYWcgPSAxKQ0KbGdmdG1pYjwtIGRpZmYobG9nKGRhdGEkRlRNSUIpLCBsYWcgPSAxKQ0KDQptaG5uIDwtIGRhdGEuZnJhbWUoVk5JPSBsZ3ZuaSwgRlRNSUI9IGxnZnRtaWIpDQpgYGANCg0KDQpgYGB7cn0NCiMgVOG6oW8gdGjhu5FuZyBrw6ogbcO0IHThuqMNCmxpYnJhcnkocHN5Y2gpDQpzdW1tYXJ5IDwtIHN1bW1hcnkobWhubikNCmRldGFpbGVkIDwtIGRlc2NyaWJlKG1obm4pDQpwcmludChzdW1tYXJ5KQ0KYGBgDQoNCmBgYHtyfQ0KcHJpbnQoZGV0YWlsZWQpDQpgYGANCg0KICANCmBgYHtyfQ0KcGxvdC50cyhtaG5uJFZOSSkNCmBgYA0KDQpgYGB7cn0NCnBsb3QudHMobWhubiRGVE1JQikNCmBgYA0KICANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGRhdGEuZnJhbWUocHJpY2UgPSBtaG5uJFZOSSksIGFlcyhzYW1wbGUgPSBwcmljZSkpICsNCiAgZ2VvbV9xcSgpICsNCiAgZ2VvbV9xcV9saW5lKCkNCmBgYA0KICANCmBgYHtyfQ0KZ2dwbG90KGRhdGEuZnJhbWUocHJpY2UgPSBtaG5uJEZUTUlCKSwgYWVzKHNhbXBsZSA9IHByaWNlKSkgKw0KICBnZW9tX3FxKCkgKw0KICBnZW9tX3FxX2xpbmUoKQ0KYGBgDQoNCg0KDQoNCiMgKioyLiBC4buRaSBj4bqjbmggdsOgIHThuqdtIHF1YW4gdHLhu41uZyBj4bunYSBtYSB0cuG6rW4gdMawxqFuZyBxdWFuKioNCg0KICBT4buxIGJp4bq/biDEkeG7mW5nIGPhu6dhIHRo4buLIHRyxrDhu51uZyBjaOG7qW5nIGtob8OhbiBsw6AgxJFp4buBdSBraMO0bmcgdGjhu4MgdHLDoW5oIGto4buPaSwgdsOgIG7DsyDhuqNuaCBoxrDhu59uZyB0cuG7sWMgdGnhur9wIMSR4bq/biBs4bujaSBuaHXhuq1uIGPhu6dhIG5ow6AgxJHhuqd1IHTGsC4gQmnhur9uIMSR4buZbmcgbsOgeSBjw7MgdGjhu4MgeHXhuqV0IHBow6F0IHThu6sgbmhp4buBdSB54bq/dSB04buRLCBiYW8gZ+G7k20gdMOsbmggaMOsbmgga2luaCB04bq/IHbEqSBtw7QsIGNow61uaCBzw6FjaCB0aeG7gW4gdOG7hywgdMOibSBsw70gbmjDoCDEkeG6p3UgdMawLCB2LnYuIFZp4buHYyBu4bqvbSBi4bqvdCBt4buRaSBsacOqbiBo4buHIGdp4buvYSBjw6FjIGPhu5UgcGhp4bq/dSB2w6AgdGjhu4sgdHLGsOG7nW5nIGNodW5nIGzDoCB2w7QgY8O5bmcgcXVhbiB0cuG7jW5nIMSR4buDIG5ow6AgxJHhuqd1IHTGsCBjw7MgdGjhu4MgxJHGsGEgcmEgcXV54bq/dCDEkeG7i25oIMSR4bqndSB0xrAgc8Ohbmcgc3Xhu5F0Lg0KDQogIE1hIHRy4bqtbiB0xrDGoW5nIHF1YW4gbMOgIGPDtG5nIGPhu6UgdG/DoW4gaOG7jWMgaGnhu4d1IHF14bqjIGdpw7pwIMSRbyBsxrDhu51uZyBt4bupYyDEkeG7mSBsacOqbiBxdWFuIGdp4buvYSBjw6FjIGJp4bq/biAodHJvbmcgdHLGsOG7nW5nIGjhu6NwIG7DoHkgbMOgIGdpw6EgY+G7p2EgY8OhYyBjaOG7iSBz4buRIGNo4bupbmcga2hvw6FuKS4gTWEgdHLhuq1uIG7DoHkgdGjhu4MgaGnhu4duIG3hu6ljIMSR4buZIMSR4buTbmcgYmnhur9uIGhv4bq3YyBuZ2jhu4tjaCBiaeG6v24gZ2nhu69hIGPDoWMgY+G6t3AgYmnhur9uLCBnacO6cCB0YSBjw7MgdGjhu4MgxJHGsGEgcmEgY8OhYyBuaOG6rW4gxJHhu4tuaCBjaMOtbmggeMOhYyBuaMawOg0KDQotIMSQw6FuaCBnacOhIG3hu6ljIMSR4buZIHLhu6dpIHJvIGPhu6dhIGRhbmggbeG7pWMgxJHhuqd1IHTGsDogS2hpIGPDoWMgY+G7lSBwaGnhur91IHRyb25nIGRhbmggbeG7pWMgxJHhuqd1IHTGsCBjw7MgbeG7qWMgxJHhu5kgdMawxqFuZyBxdWFuIGNhbywgcuG7p2kgcm8gY+G7p2EgZGFuaCBt4bulYyDEkeG6p3UgdMawIGPFqW5nIHPhur0gY2FvIGjGoW4uIE5nxrDhu6NjIGzhuqFpLCBu4bq/dSBjw6FjIGPhu5UgcGhp4bq/dSBjw7MgbeG7qWMgxJHhu5kgdMawxqFuZyBxdWFuIHRo4bqlcCwgcuG7p2kgcm8gZGFuaCBt4bulYyDEkeG6p3UgdMawIHPhur0gxJHGsOG7o2MgZ2nhuqNtIHRoaeG7g3UuDQoNCi0gTOG7sWEgY2jhu41uIGNoaeG6v24gbMaw4bujYyDEkeG6p3UgdMawOiBNYSB0cuG6rW4gdMawxqFuZyBxdWFuIGdpw7pwIG5ow6AgxJHhuqd1IHTGsCB4w6FjIMSR4buLbmggY8OhYyBj4buVIHBoaeG6v3UgY8OzIHh1IGjGsOG7m25nIGJp4bq/biDEkeG7mW5nIHRyw6FpIGNoaeG7gXUgbmhhdS4gVmnhu4djIMSR4bqndSB0xrAgdsOgbyBjw6FjIGPhu5UgcGhp4bq/dSBuw6B5IGPDsyB0aOG7gyBnacO6cCBiw7kgxJHhuq9wIGNobyBuaGF1IGtoaSB0aOG7iyB0csaw4budbmcgYmnhur9uIMSR4buZbmcsIHThu6sgxJHDsyBnaeG6o20gdGhp4buDdSBy4bunaSBybyB2w6AgdMSDbmcgaGnhu4d1IHF14bqjIMSR4bqndSB0xrAuDQoNCi0gUGjDom4gdMOtY2ggdGjhu4sgdHLGsOG7nW5nOiBNYSB0cuG6rW4gdMawxqFuZyBxdWFuIGN1bmcgY+G6pXAgdGjDtG5nIHRpbiB24buBIHh1IGjGsOG7m25nIGNodW5nIGPhu6dhIHRo4buLIHRyxrDhu51uZywgZ2nDunAgbmjDoCDEkeG6p3UgdMawIMSRxrBhIHJhIGThu7EgYsOhbyB24buBIGJp4bq/biDEkeG7mW5nIHRo4buLIHRyxrDhu51uZyB0cm9uZyB0xrDGoW5nIGxhaS4NCg0KDQoNCg0KIyAqKjMuIE1hIHRy4bqtbiB0xrDGoW5nIHF1YW4qKg0KDQojIyAqKjMuMS4gU+G7rSBk4bulbmcgbWEgdHLhuq1uIHTGsMahbmcgcXVhbioqDQogIA0KICBQaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4c6IE1hIHRy4bqtbiB0xrDGoW5nIHF1YW4gZ2nDunAgbmjhuq1uIGJp4bq/dCBjw6FjIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY8OhYyBiaeG6v24uIEPDoWMgYmnhur9uIGPDsyBo4buHIHPhu5EgdMawxqFuZyBxdWFuIGNhbyBjw7MgdGjhu4MgbGnDqm4gcXVhbiDEkeG6v24gbmhhdSB2w6AgY8OzIHRo4buDIGPhuqduIMSRxrDhu6NjIHhlbSB4w6l0IMSR4buTbmcgdGjhu51pIHRyb25nIGPDoWMgcGjDom4gdMOtY2ggaG/hurdjIG3DtCBow6xuaCBk4buxIGLDoW8uDQogIA0KICBM4buxYSBjaOG7jW4gYmnhur9uOiBO4bq/dSBoYWkgYmnhur9uIGPDsyBo4buHIHPhu5EgdMawxqFuZyBxdWFuIHLhuqV0IGNhbywgY8OzIHRo4buDIGPhuqduIHBo4bqjaSB4ZW0geMOpdCB2aeG7h2MgZ2nhu68gbOG6oWkgbeG7mXQgdHJvbmcgaGFpIGJp4bq/biDEkcOzIMSR4buDIHRyw6FuaCB24bqlbiDEkeG7gSDEkWEgY+G7mW5nIHR1eeG6v24gdHJvbmcgY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5Lg0KROG7sSBiw6FvIHbDoCBtw7QgaMOsbmg6IEhp4buDdSBiaeG6v3QgduG7gSBt4buRaSB0xrDGoW5nIHF1YW4gZ2nhu69hIGPDoWMgYmnhur9uIGPDsyB0aOG7gyBj4bqjaSB0aGnhu4duIHZp4buHYyB4w6J5IGThu7FuZyBtw7QgaMOsbmggZOG7sSBiw6FvIHbDoCBoaeG7g3UgYmnhur90IHbhu4EgY+G6pXUgdHLDumMgZOG7ryBsaeG7h3UuDQoNCiAgRMO5bmcgbOG7h25oIHJlcygpIMSR4buDIGhp4buDbiB0aOG7iyBo4buHIHPhu5EgdMawxqFuZyBxdWFuIGdp4buvYSBjw6FjIGPhurdwIGJp4bq/bi4gU2F1IMSRw7MgZMO5bmcgcm91bmQoKSDEkeG7gyBsw6BtIHRyw7JuIMSR4bq/biBjaOG7ryBz4buRIHRo4bqtcCBwaMOibiB0aOG7qSAyLiBUYSB0aHUgxJHGsOG7o2Mga+G6v3QgcXXhuqMgbmjGsCBi4bqjbmcgc2F1Og0KDQpgYGB7cn0NCnJlcyA8LSBjb3IobWhubikNCnJvdW5kKHJlcywgMikNCmBgYA0KIyMgKiozLjIuIE1hIHRy4bqtbiB0aHUgxJHGsOG7o2MqKg0KICANCiAgKip2w6AgY+G7pSB0aOG7gyBoxqFuIHRhIGPDsyB0aOG7gyBuaOG6rW4gdGjhuqV5IHRow7RuZyBxdWEgYmnhu4N1IMSR4buTIHTGsMahbmcgcXVhbi4gVHJvbmcgxJHDsyBjw6FjIMO0IG3DoHUgYmnhu4N1IHRo4buLIGdpw6EgdHLhu4sgY+G7p2EgY8OhYyBo4buHIHPhu5EgdMawxqFuZyBxdWFuIGdp4buvYSBjw6FjIGJp4bq/bioqIA0KDQoNCmBgYHtyfQ0KbGlicmFyeShjb3JycGxvdCkNCnJlcyA8LSBjb3IobWhubikNCnJvdW5kZWRfcmVzIDwtIHJvdW5kKHJlcywgMikNCnJvdW5kKHJlcywgMikNCmNvcnJwbG90KHJvdW5kZWRfcmVzLCBtZXRob2QgPSAiY29sb3IiKQ0KYGBgDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGNvcnJwbG90KQ0KY29ycnBsb3QocmVzLCB0eXBlID0gInVwcGVyIiwgb3JkZXIgPSAiaGNsdXN0IiwgDQogICAgICAgICB0bC5jb2wgPSAiYmxhY2siLCB0bC5zcnQgPSA0NSkNCmBgYA0KDQogIEJp4buDdSDEkeG7kyB0xrDGoW5nIHF1YW4gxJHGsOG7o2MgdOG6oW8gcmEgYuG7n2kgaMOgbSBjaGFydC5Db3JyZWxhdGlvbiB04burIHRoxrAgdmnhu4duIFBlcmZvcm1hbmNlQW5hbHl0aWNzIHRyb25nIFIuIEJp4buDdSDEkeG7kyBuw6B5IGhp4buDbiB0aOG7iyBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGPDoWMgYmnhur9uIHPhu5EgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgdsOgIGPhu6UgdGjhu4M6DQogIA0KICAqKsSQxrDhu51uZyBjaMOpbyBjaMOtbmggKERpYWdvbmFsKSoqDQogIA0KICBIaXN0b2dyYW06IFRyw6puIMSRxrDhu51uZyBjaMOpbyBjaMOtbmggY+G7p2EgbWEgdHLhuq1uIGJp4buDdSDEkeG7kywgY8OhYyBoaXN0b2dyYW0gY+G7p2EgdOG7q25nIGJp4bq/biDEkcaw4bujYyBoaeG7g24gdGjhu4suIEPDoWMgYmnhu4N1IMSR4buTIG7DoHkgY3VuZyBj4bqlcCB0aMO0bmcgdGluIHbhu4EgcGjDom4gcGjhu5FpIGPhu6dhIG3hu5dpIGJp4bq/bi4NCiAgDQogIFbDrSBk4bulOg0KICANCg0KICAqKkPDoWMgaOG7hyBz4buRIHTGsMahbmcgcXVhbiAoT2ZmLWRpYWdvbmFsKSoqDQogIA0KICBI4buHIHPhu5EgdMawxqFuZyBxdWFuOiBDw6FjIMO0IHRyw6puIMSRxrDhu51uZyBjaMOpbyBjaMOtbmggY2jhu6lhIGPDoWMgaOG7hyBz4buRIHTGsMahbmcgcXVhbiBnaeG7r2EgY8OhYyBj4bq3cCBiaeG6v24uIEjhu4cgc+G7kSB0xrDGoW5nIHF1YW4gxJFvIGzGsOG7nW5nIG3hu6ljIMSR4buZIHbDoCBoxrDhu5tuZyBj4bunYSBt4buRaSBxdWFuIGjhu4cgdHV54bq/biB0w61uaCBnaeG7r2EgaGFpIGJp4bq/bi4gR2nDoSB0cuG7iyBkYW8gxJHhu5luZyB04burIC0xIMSR4bq/biAxOg0KICAgKyAxOiBUxrDGoW5nIHF1YW4gZMawxqFuZyBob8OgbiBo4bqjbyAoa2hpIG3hu5l0IGJp4bq/biB0xINuZywgYmnhur9uIGtpYSBjxaluZyB0xINuZykuDQogICArIC0xOiBUxrDGoW5nIHF1YW4gw6JtIGhvw6BuIGjhuqNvIChraGkgbeG7mXQgYmnhur9uIHTEg25nLCBiaeG6v24ga2lhIGdp4bqjbSkuDQogICArIDA6IEtow7RuZyBjw7MgbeG7kWkgdMawxqFuZyBxdWFuIHR1eeG6v24gdMOtbmguDQogICANCiAgVsOtIGThu6U6DQogIA0KDQoNCiAgKipDw6FjIGvDvSBoaeG7h3Ugc2FvKioNCiAgDQogIE3hu6ljIMSR4buZIMO9IG5naMSpYSB0aOG7kW5nIGvDqjogQ8OhYyBrw70gaGnhu4d1IHNhbyAoKioqKSB4deG6pXQgaGnhu4duIGLDqm4gY+G6oW5oIGPDoWMgaOG7hyBz4buRIHTGsMahbmcgcXVhbiBjaG8gYmnhur90IG3hu6ljIMSR4buZIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBj4bunYSBjw6FjIGjhu4cgc+G7kSBuw6B5LiBUcm9uZyBuaGnhu4F1IHRyxrDhu51uZyBo4bujcCwgY8OhYyBzYW8gbsOgeSBiaeG7g3UgdGjhu4sgbeG7qWMgxJHhu5kgdGluIGPhuq15IHbhu5tpIGPDoWMgbmfGsOG7oW5nIHBo4buVIGJp4bq/biBuaMawOg0KICANCk3hu5l0IHNhbyAoKikgY2hvIGJp4bq/dCBt4bupYyDEkeG7mSDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogMC4wNSAoNSUpLg0KSGFpIHNhbyAoKiopIGNobyBiaeG6v3QgbeG7qWMgxJHhu5kgw70gbmdoxKlhIHRo4buRbmcga8OqIDAuMDEgKDElKS4NCkJhIHNhbyAoKioqKSBjaG8gYmnhur90IG3hu6ljIMSR4buZIMO9IG5naMSpYSB0aOG7kW5nIGvDqiAwLjAwMSAoMC4xJSkuDQoNCmBgYHtyfQ0KY2hhcnQuQ29ycmVsYXRpb24obWhubiwgaGlzdG9ncmFtPVRSVUUsIHBjaD0xOSkNCmBgYA0KDQoNCg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZ2djb3JycGxvdCkNCmRmIDwtIGRwbHlyOjpzZWxlY3RfaWYobWhubiwgaXMubnVtZXJpYykNCnIgPC0gY29yKGRmLCB1c2U9ImNvbXBsZXRlLm9icyIpDQpnZ2NvcnJwbG90KHIpDQpgYGANCg0KDQoNCiMgKio0LiBUaOG7sWMgaMOgbmggY8OhYyBraeG7g20gxJHhu4tuaCoqIA0KDQpgYGB7cn0NCmxpYnJhcnkodHNlcmllcykNCm1obm4gPC0gZGF0YS5mcmFtZShWTkk9IGxndm5pLCBGVE1JQj0gbGdmdG1pYikNCmBgYA0KDQojIyAqKjQuMSBLaeG7g20gxJHhu4tuaCBwaMOibiBwaOG7kWkgY2h14bqpbjogSmFycXVlLUJlcmEqKg0KDQoNCiAgS2nhu4NtIMSR4buLbmggSmFycXVlLUJlcmEgbMOgIG3hu5l0IHBoxrDGoW5nIHBow6FwIHRo4buRbmcga8OqIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIGtp4buDbSB0cmEgeGVtIG3hu5l0IG3huqt1IGThu68gbGnhu4d1IGPDsyB0dcOibiB0aGVvIHBow6JuIHBo4buRaSBjaHXhuqluIGhheSBraMO0bmcuIE7DsyBk4buxYSB0csOqbiB2aeG7h2Mga2nhu4NtIHRyYSBjw6FjIMSR4bq3YyB0csawbmcgdGjhu5FuZyBrw6ogY+G7p2EgbeG6q3UgZOG7ryBsaeG7h3UsIG5oxrAgxJHhu5kgbOG7h2NoIHbDoCDEkeG7mSBuaOG7jW4sIMSR4buDIG5o4bqtbiB4w6l0IHbhu4EgdMOtbmggY2h14bqpbiBj4bunYSBwaMOibiBwaOG7kWkuIEdp4bqjIHRoaeG6v3QgSDAgbMOgIGPDsyBwaMOibiBwaOG7kWkgY2h14bqpbi4NCiAgDQojIyMgKio0LjEuMS4gVk5JKioNCmBgYHtyfQ0KIyBraeG7g20gxJHhu4tuaCBjaG8gY2jhu4kgVk5JDQpWYXIxIDwtIG1obm4kVk5JDQojIEtp4buDbSDEkeG7i25oIHBow6JuIHBo4buRaSBjaHXhuqluIGNobyBWTkkNCnJlc3VsdDEgPC0gIGphcnF1ZS5iZXJhLnRlc3QoVmFyMSkNCnByaW50KHJlc3VsdDEpDQoNCmBgYA0Ka2jDtG5nIHBwIGNodeG6qW4NCiAgS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBnacOhIHRy4buLIFgtc3F1YXJlZD0gMTA5MS42IHTGsMahbmcg4bupbmcgduG7m2kgZ2nDoSB0cuG7iyBj4bunYSBjaGktc3F1YXJlZCB2w6AgcF92YWx1ZT0gMC4wMDAwMDAwMDIyIG5o4buPIGjGoW4gbeG7qWMgw70gbmdoxKlhIDUlLiBEbyBkw7MgdGEgYsOhYyBi4buPIGdp4bqjaSB0aHV54bq/dCBIMC4gROG7ryBsaeG7h3UgxJFhbmcgZOG7rSBk4bulbmcga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4uDQoNCiMjIyAqKjQuMS4yLiBGVE1JQioqDQpgYGB7cn0NCiMga2nhu4NtIMSR4buLbmggY2hvIGNo4buJIEZUTUlCDQpWYXIyIDwtIG1obm4kRlRNSUINCiMgS2nhu4NtIMSR4buLbmggcGjDom4gcGjhu5FpIGNodeG6qW4gY2hvIEZUTUlCDQpyZXN1bHQyIDwtICBqYXJxdWUuYmVyYS50ZXN0KFZhcjIpDQpwcmludChyZXN1bHQyKQ0KDQpgYGANCmtow7RuZyBwcCBjaHXhuqluDQogIEvhur90IHF14bqjIGNobyB0aOG6pXkgZ2nDoSB0cuG7iyBYLXNxdWFyZWQ9IDM3ODEwIHTGsMahbmcg4bupbmcgduG7m2kgZ2nDoSB0cuG7iyBj4bunYSBjaGktc3F1YXJlZCB2w6AgcF92YWx1ZT0gMC4wMDAwMDAwMDIyIG5o4buPIGjGoW4gbeG7qWMgw70gbmdoxKlhIDUlLiBEbyBkw7MgdGEgYsOhYyBi4buPIGdp4bqjaSB0aHV54bq/dCBIMC4gROG7ryBsaeG7h3UgxJFhbmcgZOG7rSBk4bulbmcga2jDtG5nIHR1w6JuIHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4uDQogIA0KICANCiMjICoqNC4yIEtp4buDbSDEkeG7i25oIHTDrW5oIGThu6tuZzogQXVnbWVudGVkIERpY2tleeKAk0Z1bGxlcioqDQoNCiAqKlBow6lwIHRo4butIG5naGnhu4dtIEFERiBsw6AgbeG7mXQgcGjGsMahbmcgcGjDoXAgdGjhu5FuZyBrw6ogZMO5bmcgxJHhu4Mga2nhu4NtIHRyYSB4ZW0gbeG7mXQgY2h14buXaSBk4buvIGxp4buHdSBjw7MgdMOtbmggZOG7q25nIChzdGF0aW9uYXJ5KSBoYXkga2jDtG5nLiBN4buZdCBjaHXhu5dpIGThu68gbGnhu4d1IMSRxrDhu6NjIGNvaSBsw6AgZOG7q25nIG7hur91IGPDoWMgxJHhurdjIHRyxrBuZyB0aOG7kW5nIGvDqiBuaMawIHRydW5nIGLDrG5oLCBwaMawxqFuZyBzYWkgdsOgIGhp4buHdSDhu6luZyBtw7lhIHbhu6UgY+G7p2EgbsOzIGtow7RuZyB0aGF5IMSR4buVaSB0aGVvIHRo4budaSBnaWFuLioqDQoNCiAgS2nhu4NtIMSR4buLbmggbsOgeSBjaG8gdGEgYmnhur90IGNodeG7l2kgdGjhu51pIGdpYW4gY8OzIHTDrW5oIGThu6tuZyBraMO0bmcuDQogIMSQ4bq3dCBnaeG6oyB0aHV54bq/dDogSDAgbMOgIGNodeG7l2kgdGjhu51pIGdpYW4ga2jDtG5nIGPDsyB0w61uaCBk4burbmcNCiAgICAgICAgICAgICAgICAgIEgxIGzDoCBjaHXhu5dpIHRo4budaSBnaWFuIGNvIHTDrW5oIGThu6tuZw0KDQojIyMgKio0LjIuMS4gVk5JKiogIA0KYGBge3J9DQphZGYudGVzdChWYXIxKQ0KYGBgDQogDQogICoqS+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIHNhdSBraGkga2nhu4NtIMSR4buLbmgqKg0KICANCiAgR2nDoSB0cuG7iyBEaWNrZXktRnVsbGVyIGzDoCAtMTEuMzcyOiDEkcOieSBsw6AgZ2nDoSB0cuG7iyB0aOG7kW5nIGvDqiBraeG7g20gxJHhu4tuaCDEkcaw4bujYyB0w61uaCB0b8OhbiB04burIGThu68gbGnhu4d1LiBMYWcgb3JkZXIgPSAxMTogxJHDonkgbMOgIHPhu5EgbMaw4bujbmcgbGFncyAoxJHhu5kgdHLhu4UpIMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIHBow6lwIGtp4buDbSDEkeG7i25oLg0KDQogIEdp4bqjIHRodXnhur90IEgwIGzDoCBjaHXhu5dpIGThu68gbGnhu4d1IGtow7RuZyBk4burbmcgKG5vbi1zdGF0aW9uYXJ5KSwgY8OybiBnaeG6oyB0aHV54bq/dCBIMSAoZ2nhuqMgdGh1eeG6v3QgdGhheSB0aOG6vykgbMOgIGNodeG7l2kgZOG7ryBsaeG7h3UgZOG7q25nIChzdGF0aW9uYXJ5KS4NClbhu5tpIHAtdmFsdWUgPSAwLjAxPCAwLjA1KG3hu6ljIMO9IG5naMSpYSB0aMaw4budbmcgZMO5bmcpLCB0YSBiw6FjIGLhu48gZ2nhuqNpIHRodXnhur90IEgwLg0KDQoNCiMjIyAqKjQuMi4yLiBGVE1JQioqICANCmBgYHtyfQ0KYWRmLnRlc3QoVmFyMikNCmBgYA0KKipL4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2Mgc2F1IGtoaSBraeG7g20gxJHhu4tuaCoqDQogIA0KICBHacOhIHRy4buLIERpY2tleS1GdWxsZXIgbMOgIC0xMC43NjM6IMSRw6J5IGzDoCBnacOhIHRy4buLIHRo4buRbmcga8OqIGtp4buDbSDEkeG7i25oIMSRxrDhu6NjIHTDrW5oIHRvw6FuIHThu6sgZOG7ryBsaeG7h3UuIExhZyBvcmRlciA9IDExOiDEkcOieSBsw6Agc+G7kSBsxrDhu6NuZyBsYWdzICjEkeG7mSB0cuG7hSkgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgcGjDqXAga2nhu4NtIMSR4buLbmguDQoNCiAgR2nhuqMgdGh1eeG6v3QgSDAgbMOgIGNodeG7l2kgZOG7ryBsaeG7h3Uga2jDtG5nIGThu6tuZyAobm9uLXN0YXRpb25hcnkpLCBjw7JuIGdp4bqjIHRodXnhur90IEgxIChnaeG6oyB0aHV54bq/dCB0aGF5IHRo4bq/KSBsw6AgY2h14buXaSBk4buvIGxp4buHdSBk4burbmcgKHN0YXRpb25hcnkpLg0KVuG7m2kgcC12YWx1ZSA9IDAuMDE8IDAuMDUobeG7qWMgw70gbmdoxKlhIHRoxrDhu51uZyBkw7luZyksIHRhIGLDoWMgYuG7jyBnaeG6o2kgdGh1eeG6v3QgSDAuDQoNCiMjICoqNC4zIEtp4buDbSDEkeG7i25oIHTGsMahbmcgcXVhbiBjaHXhu5dpOiBManVuZy1Cb3gqKg0KDQogIEtp4buDbSDEkeG7i25oIExqdW5nLUJveCDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBraeG7g20gdHJhIHTDrW5oIHTGsMahbmcgcXVhbiB04buxIGRvIGPhu6dhIG3hu5l0IGNodeG7l2kgdGjhu51pIGdpYW4gdsOgIHjDoWMgxJHhu4tuaCB4ZW0gY2h14buXaSBjw7MgcGjhu6UgdGh14buZYyB0xrDGoW5nIHF1YW4ga2jDtG5nIGdpYW4gaGF5IGtow7RuZy4gDQogIMSQ4bq3dCBnaeG6oyB0aGnhur90OiBIMCBsw6Aga2jDtG5nIGPDsyB0xrDGoW5nIHF1YW4gY2h14buXaSBManVuZy1Cb3guDQogICAgICAgICAgICAgICAgIEgxIGzDoCBjw7MgdMawxqFuZyBxdWFuIGNodeG7l2kgTGp1bmdfQm94DQoNCiMjIyAqKjQuMy4xLiBWTkkqKg0KYGBge3J9DQpsaWJyYXJ5KHN0YXRzKQ0KcmVzdWx0MyA8LSAgQm94LnRlc3QoVmFyMSwgbGFnID0gMTAsIHR5cGUgPSAiTGp1bmctQm94IikNCnByaW50KHJlc3VsdDMpDQpgYGANCg0KICBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBCb3gtTGp1bmcgY2hvIHRo4bqleTogIHbhu5tpIHAtdmFsdWUgbMOgIDAuMTAyOCwgbOG7m24gaMahbiBt4bupYyAwLjA1LCBjaOG6pXAgbmjhuq1uIGdp4bqjIHRodXnhur90IEgwLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw7MgYuG6sW5nIGNo4bupbmcgduG7gSBraMO0bmcgY8OzIHPhu7EgdOG7sSB0xrDGoW5nIHF1YW4gxJHDoW5nIGvhu4MgdHJvbmcgZOG7ryBsaeG7h3UgY2h14buXaSB0aOG7nWkgZ2lhbiB04bqhaSBjw6FjIMSR4buZIHRy4buFIMSRw6MgxJHGsOG7o2Mga2nhu4NtIHRyYS4NCg0KDQojIyMgKio0LjMuMi4gRlRNSUIqKg0KDQpgYGB7cn0NCmxpYnJhcnkoc3RhdHMpDQpyZXN1bHQ0IDwtICBCb3gudGVzdChWYXIyLCBsYWcgPSAxMCwgdHlwZSA9ICJManVuZy1Cb3giKQ0KcHJpbnQocmVzdWx0NCkNCmBgYA0KICBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBCb3gtTGp1bmcgY2hvIHRo4bqleTogIHbhu5tpIHAtdmFsdWUgbMOgIDAuMDAwMDAwMDIxOTUsIG5o4buPIGjGoW4gbeG7qWMgMC4wNSwgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEgwLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw7MgYuG6sW5nIGNo4bupbmcgduG7gSBjw7Mgc+G7sSB04buxIHTGsMahbmcgcXVhbiDEkcOhbmcga+G7gyB0cm9uZyBk4buvIGxp4buHdSBjaHXhu5dpIHRo4budaSBnaWFuIHThuqFpIGPDoWMgxJHhu5kgdHLhu4UgxJHDoyDEkcaw4bujYyBraeG7g20gdHJhLg0KDQoNCg0KIyAqKjUuIEtp4buDbSB0cmEgQVJJTUEqKg0KDQoqKlZOSSoqDQpgYGB7cn0NCmxpYnJhcnkoZm9yZWNhc3QpDQptb2RlbGQgPC0gYXV0by5hcmltYShtaG5uJFZOSSkNCm1vZGVsZA0KYGBgDQoqKkZUTUlCKioNCmBgYHtyfQ0KbW9kZWxkMSA8LSBhdXRvLmFyaW1hKG1obm4kRlRNSUIpDQptb2RlbGQxDQoNCmBgYA0KDQoNCg0KYGBge3J9DQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoZkdhcmNoKQ0KbGlicmFyeShydWdhcmNoKQ0KbGlicmFyeShyZWFkeGwpDQpgYGANCg0KIyAqKjYuIEtp4buDbSDEkeG7i25oIEFSQ2ggLSBMTSoqDQoNCioqVk5JKioNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBoaeG7h3Ug4bupbmcgQVJDSCAtIExNICBjaG8gY2jhu4kgc+G7kSBjaOG7qW5nIGtob8Ohbg0KYXJjaF9zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gInNHQVJDSCIpKQ0KYXJjaF9WTkkgPC0gdWdhcmNoZml0KHNwZWMgPSBhcmNoX3NwZWMsIGRhdGEgPSBtaG5uJFZOSSkNCg0KcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhhcmNoX1ZOSSkNCm4gPC0gbGVuZ3RoKHJlc2lkdWFscykNCnggPC0gMTpuDQojIFThuqFvIG3DtCBow6xuaCB0dXnhur9uIHTDrW5oDQphcmNoX2xtX21vZGVsIDwtIGxtKHJlc2lkdWFsc14yIH4geCkNCiMgS2nhu4NtIMSR4buLbmggaGnhu4d1IOG7qW5nIEFSQ0gtTE0NCmFUU0E6OmFyY2gudGVzdChhcmltYShtaG5uJFZOSSxvcmRlciA9IGMoMSwwLDEpKSkNCg0KYGBgDQpWTkkgQ8OTIEhJ4buGVSDhu6hORyBBUkNIDQoNCg0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggaGnhu4d1IOG7qW5nIEFSQ0ggLSBMTSAgY2hvIGNo4buJIHPhu5EgY2jhu6luZyBraG/DoW4gDQphcmNoX3NwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAic0dBUkNIIikpDQphcmNoX0ZUTUlCIDwtIHVnYXJjaGZpdChzcGVjID0gYXJjaF9zcGVjLCBkYXRhID0gbWhubiRGVE1JQikNCg0KcmVzaWR1YWxzMSA8LSByZXNpZHVhbHMoYXJjaF9GVE1JQikNCm4gPC0gbGVuZ3RoKHJlc2lkdWFsczEpDQp4IDwtIDE6bg0KIyBU4bqhbyBtw7QgaMOsbmggdHV54bq/biB0w61uaA0KYXJjaF9sbV9tb2RlbDEgPC0gbG0ocmVzaWR1YWxzMV4yIH4geCkNCiMgS2nhu4NtIMSR4buLbmggaGnhu4d1IOG7qW5nIEFSQ0gtTE0NCiBhVFNBOjphcmNoLnRlc3QoYXJpbWEobWhubiRGVE1JQixvcmRlciA9IGMoMywwLDMpKSkNCmBgYA0KRlRNSUIgQ8OTIEhJ4buGVSDhu6hORyBBUkNIDQogDQojICoqNy4gTcO0IGjDrG5oIEdhcmNoKioNCg0KYGBge3J9DQpsaWJyYXJ5KHJ1Z2FyY2gpDQpWTkl0czwtIHRzKG1obm4kVk5JKQ0KaGVhZChWTkl0cykNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkocnVnYXJjaCkNCkZUTUlCdHM8LSB0cyhtaG5uJEZUTUlCKQ0KaGVhZChGVE1JQnRzKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShsbXRlc3QpDQpWTklzcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMSwxKSksIG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMSwxKSwgaW5jbHVkZS5tZWFuID1UUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gJ25vcm0nKQ0KcHJpbnQoVk5Jc3BlYykNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkobG10ZXN0KQ0KRlRNSUJzcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMSwxKSksIG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMywzKSwgaW5jbHVkZS5tZWFuID1UUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gJ25vcm0nKQ0KcHJpbnQoRlRNSUJzcGVjKQ0KYGBgDQoNCg0KYGBge3J9DQpWTklmaXQgPC0gdWdhcmNoZml0KHNwZWMgPSBWTklzcGVjLCBWTkl0cykNCnByaW50KFZOSWZpdCkNCmBgYA0KDQoqKk5ow6xuIGNodW5nLCBr4bq/dCBxdeG6oyBjaG8gdGjhuqV5IG3DtCBow6xuaCBHQVJDSCBjw7MgdGjhu4MgcGjDuSBo4bujcCB24bubaSBk4buvIGxp4buHdSwgbmjGsG5nIHZp4buHYyBs4buxYSBjaOG7jW4gc+G7kSBuaMOzbSAoZ3JvdXBzKSB04buRaSDGsHUgY+G6p24gxJHGsOG7o2MgeGVtIHjDqXQga+G7uSBsxrDhu6FuZy4gQuG6oW4gY8OzIHRo4buDIHRo4butIG5naGnhu4dtIHbhu5tpIGPDoWMgc+G7kSBsxrDhu6NuZyBuaMOzbSBraMOhYyBuaGF1IMSR4buDIHTDrG0gcmEga+G6v3QgcXXhuqMgdOG7kWkgxrB1IG5o4bqldC4qKg0KDQpgYGB7cn0NCkZUTUlCZml0IDwtIHVnYXJjaGZpdChzcGVjID0gRlRNSUJzcGVjLCBGVE1JQnRzKQ0KcHJpbnQoRlRNSUJmaXQpDQpgYGANCg0KYGBge3J9DQpWTklzdC5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMSwgMSkpLCBtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDEsIDEpLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gInN0ZCIpDQoNClZOSXN0MTwtIHVnYXJjaGZpdChWTklzdC5zcGVjLFZOSXRzKSANCnByaW50KFZOSXN0MSkNCmBgYA0KDQoqKsSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG3DtCBow6xuaCBHQVJDSCBwaMO5IGjhu6NwIHThu5F0IHbhu5tpIGThu68gbGnhu4d1IMSRxrDhu6NjIHF1YW4gc8OhdCB2w6wgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIHThuqduIHPhu5EgxJHGsOG7o2MgcXVhbiBzw6F0IHbDoCB04bqnbiBz4buRIGThu7Ega2nhur9uIOKAi+KAi3Ryb25nIG3hu5dpIG5ow7NtIGtow7RuZyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiBL4bq/dCBxdeG6oyBLaeG7g20gdHJhIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgY+G7p2EgUGVhcnNvbiDEkcOjIMSRaeG7gXUgY2jhu4luaCBjaOG7qW5nIG1pbmggbcO0IGjDrG5oIEdBUkNIIGzDoCBt4buZdCBs4buxYSBjaOG7jW4gdGjDrWNoIGjhu6NwIMSR4buDIGzhuq1wIG3DtCBow6xuaCDEkeG7mW5nIGzhu7FjIHBoxrDGoW5nIHNhaSBjw7MgxJFp4buBdSBraeG7h24gdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UgbsOgeS4qKg0KDQpgYGB7cn0NCkZUTUlCc3Quc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDEpKSwgbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygzLCAzKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzdGQiKQ0KRlRNSUJzdDE8LSB1Z2FyY2hmaXQoRlRNSUJzdC5zcGVjLEZUTUlCdHMpIA0KcHJpbnQoRlRNSUJzdDEpDQpgYGANCg0KYGBge3J9DQojIFBow6JuIHBo4buRaSBTdHVkZW50IMSR4buRaSB44bupbmcgKHNzdGQpDQpWTklzdDEuc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDEpKSwgbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygxLCAxKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzc3RkIikNCg0KVk5Jc3QyPC0gdWdhcmNoZml0KFZOSXN0MS5zcGVjLFZOSXRzKSANCnByaW50KFZOSXN0MikNCmBgYA0KDQpgYGB7cn0NCiMgUGjDom4gcGjhu5FpIFN0dWRlbnQgxJHhu5FpIHjhu6luZyAoc3N0ZCkNCkZUTUlCc3QxLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygxLCAxKSksIG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMywgMyksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAic3N0ZCIpDQoNCkZUTUlCc3QyPC0gdWdhcmNoZml0KEZUTUlCc3QxLnNwZWMsRlRNSUJ0cykgDQpwcmludChGVE1JQnN0MikNCmBgYA0KDQoNCmBgYHtyfQ0KIyBQaMOibiBwaOG7kWkgR2VuZXJhbGl6ZWQgRXJyb3IgRGlzdHJpYnV0aW9uKGdlZCkNClZOSWdlZC5zcGVjIDwtIHVnYXJjaHNwZWModmFyaWFuY2UubW9kZWwgPSBsaXN0KG1vZGVsID0gImdqckdBUkNIIiwgZ2FyY2hPcmRlciA9IGMoMSwgMSkpLCBtZWFuLm1vZGVsID0gbGlzdChhcm1hT3JkZXIgPSBjKDEsIDEpLCBpbmNsdWRlLm1lYW4gPSBUUlVFKSwgZGlzdHJpYnV0aW9uLm1vZGVsID0gImdlZCIpDQoNClZOSWdlZDEgPC0gdWdhcmNoZml0KFZOSWdlZC5zcGVjLFZOSXRzKSANCnByaW50KFZOSWdlZDEpDQpgYGANCg0KYGBge3J9DQojIFBow6JuIHBo4buRaSBHZW5lcmFsaXplZCBFcnJvciBEaXN0cmlidXRpb24oZ2VkKQ0KRlRNSUJnZWQuc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDEpKSwgbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygzLCAzKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJnZWQiKQ0KDQpGVE1JQmdlZDEgPC0gdWdhcmNoZml0KEZUTUlCZ2VkLnNwZWMsRlRNSUJ0cykgDQpwcmludChGVE1JQmdlZDEpDQpgYGANCg0KYGBge3J9DQojIFBow6JuIHBo4buRaSBHZW5lcmFsaXplZCBFcnJvciBEaXN0cmlidXRpb24gxJHhu5FpIHjhu6luZyAoInNnZWQiKQ0KVk5JZ2VkLnNwZWMgPC0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAiZ2pyR0FSQ0giLCBnYXJjaE9yZGVyID0gYygxLCAxKSksIG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMSwgMSksIGluY2x1ZGUubWVhbiA9IFRSVUUpLCBkaXN0cmlidXRpb24ubW9kZWwgPSAic2dlZCIpDQoNClZOSWdlZDIgPC0gdWdhcmNoZml0KFZOSWdlZC5zcGVjLFZOSXRzKSANCnByaW50KFZOSWdlZDIpDQpgYGANCg0KYGBge3J9DQojIFBow6JuIHBo4buRaSBHZW5lcmFsaXplZCBFcnJvciBEaXN0cmlidXRpb24gxJHhu5FpIHjhu6luZyAoInNnZWQiKQ0KRlRNSUJnZWQuc3BlYyA8LSB1Z2FyY2hzcGVjKHZhcmlhbmNlLm1vZGVsID0gbGlzdChtb2RlbCA9ICJnanJHQVJDSCIsIGdhcmNoT3JkZXIgPSBjKDEsIDEpKSwgbWVhbi5tb2RlbCA9IGxpc3QoYXJtYU9yZGVyID0gYygzLCAzKSwgaW5jbHVkZS5tZWFuID0gVFJVRSksIGRpc3RyaWJ1dGlvbi5tb2RlbCA9ICJzZ2VkIikNCg0KRlRNSUJnZWQyIDwtIHVnYXJjaGZpdChGVE1JQmdlZC5zcGVjLEZUTUlCdHMpIA0KcHJpbnQoRlRNSUJnZWQyKQ0KYGBgDQoNCg0KYGBge3J9DQojIFThuqFvIGRhbmggc8OhY2ggYmFvIGfhu5NtIGPDoWMgcGjDom4gcGjhu5FpIHbDoCDGsOG7m2MgbMaw4bujbmcgY+G7p2EgVk5JDQpWTklfbGlzdCA8LSBsaXN0KA0KICBnYXJjaG49IFZOSWZpdCwNCiAgZ2FyY2h0PSBWTklzdDEsDQogIGdhcmNoc3QgPSBWTklzdDIsDQogIGdhcmNoZyA9IFZOSWdlZDEsDQogIGdhcmNoc2cgPSBWTklnZWQyDQopDQojIFTDrW5oIHRvw6FuIGPDoWMgdGjDtG5nIHRpbg0KVk5JX2luZm9fbWF0IDwtIHNhcHBseShWTklfbGlzdCwgaW5mb2NyaXRlcmlhKSANCnJvd25hbWVzKFZOSV9pbmZvX21hdCkgPC0gcm93bmFtZXMoaW5mb2NyaXRlcmlhKFZOSWZpdCkpDQpwcmludChWTklfaW5mb19tYXQpDQpgYGANCmBgYHtyfQ0KIyBU4bqhbyBkYW5oIHPDoWNoIGJhbyBn4buTbSBjw6FjIHBow6JuIHBo4buRaSB2w6AgxrDhu5tjIGzGsOG7o25nIGPhu6dhIEZUTUlCDQpGVE1JQl9saXN0IDwtIGxpc3QoDQogIGdhcmNobj0gRlRNSUJmaXQsDQogIGdhcmNodD0gRlRNSUJzdDEsDQogIGdhcmNoc3QgPSBGVE1JQnN0MiwNCiAgZ2FyY2hnID0gRlRNSUJnZWQxLA0KICBnYXJjaHNnID0gRlRNSUJnZWQyDQopDQojIFTDrW5oIHRvw6FuIGPDoWMgdGjDtG5nIHRpbg0KRlRNSUJfaW5mb19tYXQgPC0gc2FwcGx5KEZUTUlCX2xpc3QsIGluZm9jcml0ZXJpYSkgDQpyb3duYW1lcyhGVE1JQl9pbmZvX21hdCkgPC0gcm93bmFtZXMoaW5mb2NyaXRlcmlhKEZUTUlCZml0KSkNCnByaW50KEZUTUlCX2luZm9fbWF0KQ0KYGBgDQoNCg0KYGBge3J9DQpWTkkucmVzIDwtIHJlc2lkdWFscyhWTklzdDIpL3NpZ21hKFZOSXN0MikNCmZpdGRpc3QoZGlzdHJpYnV0aW9uID0gInNzdGQiLCBWTkkucmVzLCBjb250cm9sID0gbGlzdCgpKQ0KYGBgDQpgYGB7cn0NCkZUTUlCLnJlcyA8LSByZXNpZHVhbHMoRlRNSUJzdDIpL3NpZ21hKEZUTUlCc3QyKQ0KZml0ZGlzdChkaXN0cmlidXRpb24gPSAic3N0ZCIsIEZUTUlCLnJlcywgY29udHJvbCA9IGxpc3QoKSkNCmBgYA0KDQoNCmBgYHtyfQ0KcyA9IHBkaXN0KCJzc3RkIixWTkkucmVzLCBtdSA9IC0wLjAwMTI1MzYwMSwgc2lnbWEgPSAgMS4wMDQ3NDQxNjYsIHNrZXcgPSAwLjgxMjk2NzU2Nywgc2hhcGUgPSA0LjA2NTgxNDkxMiApDQpoZWFkKHMsMTApDQpgYGANCg0KYGBge3J9DQpzMSA9IHBkaXN0KCJzc3RkIixGVE1JQi5yZXMsIG11ID0gLTAuMDIzNjk2OTQsIHNpZ21hID0gIDEuMDAzOTQxMTQsIHNrZXcgPSAwLjgyNDk5OTUyLCBzaGFwZSA9IDUuMjc4NzI4NDUgKQ0KaGVhZChzMSwxMCkNCmBgYA0KDQojICoqOC4gS2nhu4NtIMSR4buLbmggYmnDqm4qKg0KYGBge3J9DQpsaWJyYXJ5KCJjb3B1bGEiKQ0KbGlicmFyeSgic2NhdHRlcnBsb3QzZCIpDQojQ2h1eeG7g24gxJHDtGkgZOG7ryBsaeG7h3UgcGjDom4gcGjhu5FpIMSR4buBdQ0KdSA8LSBwb2JzKHMpDQpoZWFkKHUsMTApDQprIDwtIHBvYnMoczEpDQpoZWFkKGssMTApDQpgYGANCipLaeG7g20gxJHhu4tuaCBjaG8gYmnhur9uIFZOSSoNCg0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIEFuZGVyc29uX0RhcmxpbmcNCmxpYnJhcnkobm9ydGVzdCkNCmFkLnRlc3QodSkNCmBgYA0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggQ3JhbWVyLXZvbiBNaXNlcw0KY3ZtLnRlc3QodSkNCmBgYA0KYGBge3J9DQojIEtp4buDbSDEkeG7i25oIEtvbG1vZ29yb3YtU21pcm5vdg0Ka3MudGVzdCh1LCB5ID0gInB1bmlmIikNCmBgYA0KDQoNCipLaeG7g20gxJHhu4tuaCBjaG8gYmnhur9uIEZUTUlCKg0KDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggQW5kZXJzb25fRGFybGluZw0KbGlicmFyeShub3J0ZXN0KQ0KYWQudGVzdChrKQ0KYGBgDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCBDcmFtZXItdm9uIE1pc2VzDQpjdm0udGVzdChrKQ0KYGBgDQpgYGB7cn0NCiMgS2nhu4NtIMSR4buLbmggS29sbW9nb3Jvdi1TbWlybm92DQprcy50ZXN0KGssIHkgPSAicHVuaWYiKQ0KDQpgYGANCg0KIyAqKjkuIENvcHVsYSoqDQoNCg0KYGBge3J9DQpsaWJyYXJ5KFZpbmVDb3B1bGEpDQpCaUNvcFNlbGVjdCh1LGssIGZhbWlseXNldD0gYygxOjEwKSwgc2VsZWN0aW9uY3JpdD0iQUlDIixpbmRlcHRlc3QgPSBGQUxTRSwgbGV2ZWwgPSAwLjA1KQ0KYGBgDQoNCmBgYHtyfQ0KZ3VtYmVsLmNvcCA8LSBndW1iZWxDb3B1bGEocGFyYW0gPSAxLjA5LCBkaW0gPSAyKQ0KcGxvdChtaG5uLCB4bGFiID0gInUiLCB5bGFiID0gImsiLCBtYWluID0gIsSQ4buTIHRo4buLIHBow6JuIHTDoW4gY+G7p2EgY29wdWxhIEd1bWJlbCIpDQpgYGANCg0KYGBge3J9DQpwZXJzcChndW1iZWwuY29wLCBkQ29wdWxhLCB4bGFiID0gInUiLCB5bGFiID0gImsiLCB6bGFiID0gIk3huq10IMSR4buZIiwNCiAgICAgIG1haW4gPSAixJDhu5MgdGjhu4sgbeG6rXQgxJHhu5kgY+G7p2EgY29wdWxhIEd1bWJlbCIpDQpgYGANCg0KDQpgYGB7cn0NCmd1bWJlbC5jb3AxIDwtIGd1bWJlbENvcHVsYShwYXJhbSA9IDEuMDksIGRpbSA9IDIpDQpzZXQuc2VlZCgxMjMpDQpkYXRhMTIgPC0gckNvcHVsYSgxNDY1LCBndW1iZWwuY29wMSkNCiMgVuG6vSBiaeG7g3UgxJHhu5MgM0QNCnNjYXR0ZXJwbG90M2QoZGF0YTEyWywxXSwgZGF0YTEyWywyXSwgcGNoID0gMTYsIGNvbG9yID0gImJsdWUiLA0KICAgICAgICAgICAgIHR5cGUgPSAiaCIsIGhpZ2hsaWdodC4zZCA9IFRSVUUsDQogICAgICAgICAgICAgeGxhYiA9ICJVMSIsIHlsYWIgPSAiVTIiLCB6bGFiID0gIlByb2JhYmlsaXR5IikNCmBgYA0KYGBge3J9DQpwbG90KGRhdGExMlssIDFdLCBkYXRhMTJbLCAyXSwgcGNoID0gMTYsIGNvbCA9ICJibHVlIiwgDQogICAgIG1haW4gPSAiU2NhdHRlciBQbG90IG9mIEd1bWJlbCBDb3B1bGEgRGF0YSIsDQogICAgIHhsYWIgPSAiVTEiLCB5bGFiID0gIlUyIikNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBU4bqhbyBk4buvIGxp4buHdSBnaeG6oyDEkeG7i25oDQpzZXQuc2VlZCgxMjMpDQpkYXRhIDwtIGRhdGEuZnJhbWUodSA9IHUsIGsgPSBrKQ0KDQojIFbhur0gxJHhu5MgdGjhu4sgcGjDom4gdMOhbg0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gdSwgeSA9IGspKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDEsIGFscGhhID0gMC41KSArDQogIGxhYnMoeCA9ICJVIiwgeSA9ICJLIiwgdGl0bGUgPSAixJDhu5MgdGjhu4sgcGjDom4gdMOhbiBj4bunYSBVIHbDoCBLIikgKw0KICB0aGVtZV9jbGFzc2ljKCkNCmBgYA0KDQoNCmBgYHtyfQ0KIyBDw6BpIMSR4bq3dCB2w6AgdOG6o2kgdGjGsCB2aeG7h24gcGxvdDNEDQpsaWJyYXJ5KHBsb3QzRCkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoY29wdWxhKQ0KIyBUaGnhur90IGzhuq1wIEpvZSBjb3B1bGEgduG7m2kgdGhhbSBz4buRIHBhciA9IDEuMDkNCnRoZXRhIDwtIDEuMDkNCmd1bWJlbF9jb3AgPC0gZ3VtYmVsQ29wdWxhKHBhcmFtID0gdGhldGEpDQojIEtp4buDbSB0cmEgS2VuZGFsbCdzIHRhdSBj4bunYSBKb2UgY29wdWxhDQp0YXUgPC0gdGF1KGd1bWJlbF9jb3ApDQpwcmludCh0YXUpDQpgYGANCmBgYHtyfQ0KZSA8LSBjYmluZCh1LGspDQpmaXQgPC0gZml0Q29wdWxhKGd1bWJlbENvcHVsYSgpLCBkYXRhID0gZSwgbWV0aG9kID0gIm1sIikgIA0KIyBNYXhpbXVtIExpa2VsaWhvb2QgRXN0aW1hdGlvbiAoTUxFKQ0KdGhldGEgPC0gY29lZihmaXQpDQpwcmludCh0aGV0YSkNCmBgYA0KDQoNCg0KYGBge3J9DQojIExvYWQgbmVjZXNzYXJ5IGxpYnJhcmllcw0KbGlicmFyeShjb3B1bGEpDQpsaWJyYXJ5KE1BU1MpDQpsaWJyYXJ5KHNjYXR0ZXJwbG90M2QpDQoNCiMgRGVmaW5lIHRoZSBwYXJhbWV0ZXIgZm9yIHRoZSBHdW1iZWwgY29wdWxhDQp0aGV0YSA8LSAxLjA5DQoNCiMgQ3JlYXRlIHRoZSBKb2UgY29wdWxhIG9iamVjdA0KZ3VtYmVsX2NvcHVsYSA8LSBndW1iZWxDb3B1bGEocGFyYW0gPSB0aGV0YSkNCg0KIyBQZXJmb3JtIEtlcm5lbCBEZW5zaXR5IEVzdGltYXRpb24NCmtkZTJkX3Jlc3VsdCA8LSBrZGUyZChlWywxXSwgZVssMl0sIG4gPSA1MCkNCg0KIyBDb252ZXJ0IGtkZTJkIHJlc3VsdCB0byBhIGZvcm1hdCBzdWl0YWJsZSBmb3Igc2NhdHRlcnBsb3QzZA0KeCA8LSBrZGUyZF9yZXN1bHQkeA0KeSA8LSBrZGUyZF9yZXN1bHQkeQ0KeiA8LSBrZGUyZF9yZXN1bHQkeg0KDQojIENyZWF0ZSBhIGdyaWQgb2YgcG9pbnRzIGZvciBzY2F0dGVycGxvdDNkDQpncmlkIDwtIGV4cGFuZC5ncmlkKHggPSB4LCB5ID0geSkNCg0KIyBGbGF0dGVuIHogZm9yIHNjYXR0ZXJwbG90M2QNCnpfZmxhdCA8LSBhcy52ZWN0b3IoeikNCg0KIyBQbG90IHRoZSBkZW5zaXR5IHVzaW5nIHNjYXR0ZXJwbG90M2QNCnNjYXR0ZXJwbG90M2QoZ3JpZCR4LCBncmlkJHksIHpfZmxhdCwgdHlwZSA9ICJoIiwgYW5nbGUgPSAzMCwgDQogICAgICAgICAgICAgIG1haW4gPSAiRGVuc2l0eSBQbG90IG9mIEd1bWJlbCBDb3B1bGEiLA0KICAgICAgICAgICAgICB4bGFiID0gIlJhaW5mYWxsIERlcHRoIiwgDQogICAgICAgICAgICAgIHlsYWIgPSAiU2hvdCBEdXJhdGlvbiIsIA0KICAgICAgICAgICAgICB6bGFiID0gIkJpdmFyaWF0ZSBEaXN0cmlidXRpb24iLA0KICAgICAgICAgICAgICBwY2ggPSAyMCwgY29sb3IgPSAidHVycXVvaXNlIikNCmBgYA0KDQpgYGB7cn0NCiMgTG9hZCBuZWNlc3NhcnkgbGlicmFyaWVzDQpsaWJyYXJ5KGNvcHVsYSkNCmxpYnJhcnkoTUFTUykNCg0KIyBEZWZpbmUgdGhlIHBhcmFtZXRlciBmb3IgdGhlIEpvZSBjb3B1bGENCnRoZXRhIDwtIDEuMDkNCg0KIyBDcmVhdGUgdGhlIEpvZSBjb3B1bGEgb2JqZWN0DQpndW1iZWxfY29wdWxhIDwtIGd1bWJlbENvcHVsYShwYXJhbSA9IHRoZXRhKQ0KDQojIFBlcmZvcm0gS2VybmVsIERlbnNpdHkgRXN0aW1hdGlvbg0Ka2RlMmRfcmVzdWx0IDwtIGtkZTJkKGVbLDFdLCBlWywyXSwgbiA9IDEwMDApDQoNCiMgRXh0cmFjdCB0aGUgcmVzdWx0cw0KeCA8LSBrZGUyZF9yZXN1bHQkeA0KeSA8LSBrZGUyZF9yZXN1bHQkeQ0KeiA8LSBrZGUyZF9yZXN1bHQkeg0KDQojIFBsb3QgdGhlIFBERiB1c2luZyBwZXJzcA0KcGVyc3AoeCwgeSwgeiwgcGhpID0gMzAsIHRoZXRhID0gNTAsIGNvbCA9ICJsaWdodGJsdWUiLCANCiAgICAgIHhsYWIgPSAiRGlzY2hhcmdlIiwgeWxhYiA9ICJEdXJhdGlvbiIsIHpsYWIgPSAiRGVuc2l0eSIsIA0KICAgICAgbWFpbiA9ICJQREYgb2YgSm9lIENvcHVsYSIpDQoNCiMgUGxvdCB0aGUgY29udG91ciBwbG90DQpjb250b3VyKHgsIHksIHosIHhsYWIgPSAiRGlzY2hhcmdlIiwgeWxhYiA9ICJEdXJhdGlvbiIsIA0KICAgICAgICBtYWluID0gIkNvbnRvdXIgUGxvdCBvZiBHdW1iZWwgQ29wdWxhIikNCg0KYGBgDQoNCmBgYHtyfQ0KIyBU4bqhbyB0aMOqbSBk4buvIGxp4buHdSB04burIEd1bWJlbCBjb3B1bGENCnNldC5zZWVkKDY1NCkNCmUgPC0gckNvcHVsYSgxNDY1LCBndW1iZWxfY29wKQ0KeCA8LSBxbm9ybShlWywxXSkNCnkgPC0gcW5vcm0oZVssMl0pDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgaOG7mXAgdsOgIHLDonUNCmJveHBsb3QoeCwgeSwgDQogICAgICAgIGNvbCA9IGMoImxpZ2h0Ymx1ZSIsICJsaWdodGdyZWVuIiksDQogICAgICAgIG5hbWVzID0gYygiVk5JIiwgIkZUTUlCIiksDQogICAgICAgIG1haW4gPSAiQm94IFBsb3QiKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShrbml0cikNCmxpYnJhcnkoY29wdWxhKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGdyaWRFeHRyYSkNCmxpYnJhcnkoVkMyY29wdWxhKQ0KbGlicmFyeShWaW5lQ29wdWxhKQ0KbGlicmFyeShncmlkR3JhcGhpY3MpDQpsaWJyYXJ5KHBuZykNCmxpYnJhcnkocnVnYXJjaCkNCg0KI1ThuqFvIGjDoG0gduG6vSBiaeG7g3UgxJHhu5MNCnNjYXR0ZXJfcGxvdCA8LSBmdW5jdGlvbihyYW5kb21fZGF0YSwgY2wpIHsNCiAgZ2dwbG90KGRhdGEuZnJhbWUoZSksIGFlcyhlWywxXSwgZVssMl0pKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIGNvbCA9IGNsKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoeCA9ICJ1IiwgeSA9ICJ2IikNCiAgfSAjZm9yIHNjYXR0ZXINCg0KcGVyc3BfcGxvdCA8LSBmdW5jdGlvbihjb3B1bGFfb2JqLCBmaWxlX25hbWUsIGNsKSB7DQogIHBuZyhmaWxlX25hbWUpDQogIHBlcnNwKGNvcHVsYV9vYmosIGRDb3B1bGEsIA0KICAgICAgICB4bGFiID0gJ3UnLCB5bGFiID0gJ2snLCBjb2wgPSBjbCwgbHRoZXRhID0gMTgwLCAgDQogICAgICAgIHRpY2t0eXBlID0gImRldGFpbGVkIiwgY2V4LmF4aXMgPSAwLjgpDQogIGRldi5vZmYoKQ0KICByYXN0ZXJHcm9iKHJlYWRQTkcoZmlsZV9uYW1lKSxpbnRlcnBvbGF0ZSA9IFRSVUUpDQp9IyBmb3IgcGRmDQpgYGANCg0KYGBge3J9DQojTcO0IHBo4buPbmcgY29wdWxhIGd1bWJlbCB24bubaSBwPTEuMDkNCmNvcF9ndW0gPC0gZ3VtYmVsQ29wdWxhKHBhcmFtID0gMS4wOSwgZGltID0gMikNCiNNw7QgcGjhu49uZyAxNDY1IHF1YW4gc8OhdCBuZ+G6q3Ugbmhpw6puIGThu7FhIHRyw6puIGNvcHVsYSBjw7Mgc+G6tW4NCnJhbmRvbV9ndW0gPC0gckNvcHVsYShjb3B1bGEgPSBjb3BfZ3VtLG4gPSAxNDY1KQ0KDQojVuG6vSBiaeG7g3UgxJHhu5MgDQpgYGANCg0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZCkNCnBuZygnZ3Vtcy5wbmcnKQ0Kc2NhdHRlcl9wbG90KHJhbmRvbV9ndW0sJ3NreWJsdWUnKQ0KZGV2Lm9mZigpDQpndW1zIDwtIHJhc3Rlckdyb2IocmVhZFBORygnZ3Vtcy5wbmcnKSwgaW50ZXJwb2xhdGUgPSBUUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KGRhdGEuZnJhbWUodSxrKSwgYWVzKHUsIGspKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAic2t5Ymx1ZSIsIGFscGhhID0gMC41KSArDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShncmlkRXh0cmEpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgcGjDom4gdMOhbg0KcG5nKCdndW1zLnBuZycpDQpndW1zIDwtIHNjYXR0ZXJfcGxvdChyYW5kb21fZ3VtLCAnc2t5Ymx1ZScpDQpkZXYub2ZmKCkNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBQREYNCmd1bXAgPC0gcGVyc3BfcGxvdChjb3BfZ3VtLCAnZ3VtcC5wbmcnLCAnc2t5Ymx1ZScpDQoNCiMgVOG6oW8gY2jDuiB0aMOtY2gNCmxlZ2VuZCA8LSBsZWdlbmRHcm9iKA0KICBsYWJlbHMgPSBjKCJHdW1iZWwiKSwgcGNoID0gMTUsDQogIGdwID0gZ3Bhcihjb2wgPSBjKCdza3libHVlJyksIGZpbGwgPSBjKCdza3libHVlJykpDQopDQoNCiMgVuG6vSBj4bqjIGhhaSBiaeG7g3UgxJHhu5MgY8O5bmcgduG7m2kgY2jDuiB0aMOtY2ggdHLDqm4gY8O5bmcgbeG7mXQgaMOsbmgNCmdyaWQuYXJyYW5nZShndW1zLCBndW1wLCBsZWdlbmQsIG5jb2wgPSAyLCANCiAgICAgICAgICAgICAgbGF5b3V0X21hdHJpeCA9IHJiaW5kKGMoMSwgNCksIGMoMSwgMykpLA0KICAgICAgICAgICAgICB3aWR0aHMgPSBjKDIsIDEpLA0KICAgICAgICAgICAgICB0b3AgPSB0ZXh0R3JvYigiQmnhu4N1IMSR4buTIG3huq10IMSR4buZIHBow6JuIHTDoW4gdsOgIFBERiBj4bunYSBDb3B1bGEgR3VtYmVsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncCA9IGdwYXIoZm9udHNpemUgPSAxMywgZm9udCA9IDIpKSkNCmBgYA0KDQoNCg0KYGBge3J9DQojVOG6oW8gaMOgbSB24bq9IGJp4buDdSDEkeG7kw0Kc2NhdHRlcl9wbG90MSA8LSBmdW5jdGlvbihyYW5kb21fZGF0YSwgY2wpIHsNCiAgZ2dwbG90KGRhdGEuZnJhbWUocmFuZG9tX2RhdGEpLCBhZXMocmFuZG9tX2RhdGFbLDFdLCByYW5kb21fZGF0YVssMl0pKSArDQogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjUsIGNvbCA9IGNsKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnMoeCA9ICJ1IiwgeSA9ICJ2IikNCiAgfSAjZm9yIHNjYXR0ZXINCg0KcGVyc3BfcGxvdDEgPC0gZnVuY3Rpb24oY29wdWxhX29iaiwgZmlsZV9uYW1lLCBjbCkgew0KICBwbmcoZmlsZV9uYW1lKQ0KICBwZXJzcChjb3B1bGFfb2JqLCBkQ29wdWxhLCANCiAgICAgICAgeGxhYiA9ICd1JywgeWxhYiA9ICd2JywgY29sID0gY2wsIGx0aGV0YSA9IDEyMCwgIA0KICAgICAgICB0aWNrdHlwZSA9ICJkZXRhaWxlZCIsIGNleC5heGlzID0gMC44KQ0KICBkZXYub2ZmKCkNCiAgcmFzdGVyR3JvYihyZWFkUE5HKGZpbGVfbmFtZSksaW50ZXJwb2xhdGUgPSBUUlVFKQ0KfSMgZm9yIHBkZg0KYGBgDQoNCg0KYGBge3J9DQojTcO0IHBo4buPbmcgY29wdWxhIGd1bWJlbCB24bubaSBwPTUNCmNvcF9ndW0xIDwtIGd1bWJlbENvcHVsYShwYXJhbSA9IDUsIGRpbSA9IDIpDQojTcO0IHBo4buPbmcgNjAwMCBxdWFuIHPDoXQgbmfhuqt1IG5oacOqbiBk4buxYSB0csOqbiBjb3B1bGEgY8OzIHPhurVuDQpyYW5kb21fZ3VtMSA8LSByQ29wdWxhKGNvcHVsYSA9IGNvcF9ndW0xLG4gPSA2MDAwKQ0KDQpgYGANCg0KYGBge3J9DQpwbmcoJ2d1bXMucG5nJykNCnNjYXR0ZXJfcGxvdDEocmFuZG9tX2d1bTEsJyNDQzY2OTknKQ0KZGV2Lm9mZigpDQpndW1zMSA8LSByYXN0ZXJHcm9iKHJlYWRQTkcoJ2d1bXMucG5nJyksIGludGVycG9sYXRlID0gVFJVRSkNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoZ3JpZEV4dHJhKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIG3huq10IMSR4buZIHBow6JuIHTDoW4NCnBuZygnZ3Vtcy5wbmcnKQ0KZ3VtczEgPC0gc2NhdHRlcl9wbG90MShyYW5kb21fZ3VtMSwgJyNDQzY2OTknKQ0KZGV2Lm9mZigpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgUERGDQpndW1wMSA8LSBwZXJzcF9wbG90MShjb3BfZ3VtMSwgJ2d1bXAucG5nJywgJyNDQzY2OTknKQ0KDQojIFThuqFvIGNow7ogdGjDrWNoDQpsZWdlbmQxIDwtIGxlZ2VuZEdyb2IoDQogIGxhYmVscyA9IGMoIkd1bWJlbCIpLCBwY2ggPSAxNSwNCiAgZ3AgPSBncGFyKGNvbCA9IGMoJyNDQzY2OTknKSwgZmlsbCA9IGMoJyNDQzY2OTknKSkNCikNCg0KIyBW4bq9IGPhuqMgaGFpIGJp4buDdSDEkeG7kyBjw7luZyB24bubaSBjaMO6IHRow61jaCB0csOqbiBjw7luZyBt4buZdCBow6xuaA0KZ3JpZC5hcnJhbmdlKGd1bXMxLCBndW1wMSwgbGVnZW5kMSwgbmNvbCA9IDIsIA0KICAgICAgICAgICAgICBsYXlvdXRfbWF0cml4ID0gcmJpbmQoYygxLCAyKSwgYygxLCAzKSksDQogICAgICAgICAgICAgIHdpZHRocyA9IGMoMiwgMSksDQogICAgICAgICAgICAgIHRvcCA9IHRleHRHcm9iKCJCaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgcGjDom4gdMOhbiB2w6AgUERGIGPhu6dhIENvcHVsYSBHdW1iZWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250c2l6ZSA9IDE1LCBmb250ID0gMikpKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0K