knitr::opts_chunk$set(echo = TRUE)
library(quantmod)
## Warning: package 'quantmod' 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
## Loading required package: TTR
## Warning: package 'TTR' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'dplyr' was built under R version 4.3.3
## Warning: package 'forcats' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr     1.1.4     ✔ readr     2.1.5
## ✔ forcats   1.0.0     ✔ stringr   1.5.1
## ✔ ggplot2   3.5.2     ✔ tibble    3.2.1
## ✔ lubridate 1.9.3     ✔ tidyr     1.3.0
## ✔ purrr     1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::first()  masks xts::first()
## ✖ dplyr::lag()    masks stats::lag()
## ✖ dplyr::last()   masks xts::last()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(broom)
library(PerformanceAnalytics)
## Warning: package 'PerformanceAnalytics' was built under R version 4.3.3
## 
## Attaching package: 'PerformanceAnalytics'
## 
## The following object is masked from 'package:graphics':
## 
##     legend
library(dplyr)
library(xts)
library(tseries)
## Warning: package 'tseries' was built under R version 4.3.3
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.3.3
library(sandwich)
## Warning: package 'sandwich' was built under R version 4.3.3
library(broom)
library(ggplot2)

1. TỔNG QUAN DỮ LIỆU

 Bộ dữ liệu được sử dụng trong nghiên cứu bao gồm chỉ số VN-Index (VNI) và giá cổ phiếu của sáu ngân hàng thương mại cổ phần tiêu biểu tại Việt Nam: ACB, BID, OCB, VPB, CTG. Đây là nhóm cổ phiếu thuộc ngành tài chính – ngân hàng, có mức vốn hóa lớn, thanh khoản cao và được niêm yết trên sàn chứng khoán trong thời gian dài, phản ánh tương đối rõ nét biến động của thị trường tài chính Việt Nam.

 Việc kết hợp VN-Index – đại diện cho toàn thị trường – với nhóm cổ phiếu ngân hàng – đại diện cho một ngành có vai trò trung tâm – tạo nên một tập dữ liệu vừa đủ đa dạng về mặt cấu trúc ngành nghề, vừa đủ đại diện về mặt thị trường. Nhờ vậy, bộ dữ liệu này cho phép thực hiện hiệu quả các phân tích kinh tế – tài chính quan trọng như kiểm định tính dừng chuỗi thời gian, ước lượng mô hình CAPM và đường thị trường chứng khoán (SML), xây dựng ma trận hiệp phương sai giữa các cổ phiếu, và tính toán Value at Risk (VaR). Sự lựa chọn có chủ đích này không chỉ đảm bảo tính tin cậy về mặt thống kê, mà còn giúp so sánh kết quả mô hình một cách rõ ràng và có ý nghĩa thực tiễn cao.

df <- read.csv("C:/Users/admin/OneDrive - UFM/Documents/dulieubang/DULIEUMHDBTS.csv")
df$Ngày <- as.Date(df$Ngày, format = "%d/%m/%Y")
df <- df[order(df$Ngày), ]  # sắp xếp tăng dần theo ngày
# Loại dấu phẩy, chuyển cột số sang numeric
for (i in 2:ncol(df)) {
  df[[i]] <- as.numeric(gsub(",", "", df[[i]]))
}

# Tạo xts từ dữ liệu giá
prices_xts <- xts(df[, -1], order.by = df$Ngày)
# **3. TÍNH LỢI SUẤT LOG**
returns_xts <- diff(log(prices_xts))[-1, ]
head(returns_xts)
##                     VNI          ACB          BID          OCB          VPB
## 2024-01-03  0.010940884  0.022233474  0.018429461  0.029311989  0.013154798
## 2024-01-04  0.005708350  0.011934571 -0.003431484  0.014331428  0.013038423
## 2024-01-05  0.003435416  0.005891701  0.019300266  0.014137358 -0.007813607
## 2024-01-08  0.004760535 -0.003939063  0.041803648  0.024267362  0.002629562
## 2024-01-09 -0.001380036 -0.013887209 -0.007564986 -0.006878378 -0.005211059
## 2024-01-10  0.002542962  0.009978113  0.028901950  0.006878378  0.023211979
##                   CTG
## 2024-01-03 0.01459880
## 2024-01-04 0.03559095
## 2024-01-05 0.01388911
## 2024-01-08 0.01878791
## 2024-01-09 0.01511364
## 2024-01-10 0.03278982

2. KIỂM ĐỊNH TÍNH DỪNG

# Tạo danh sách tên cổ phiếu
tickers <- colnames(returns_xts)

# Vòng lặp kiểm định ADF cho từng chuỗi lợi suất
for (ticker in tickers) {
  cat("=== Kiểm định ADF cho:", ticker, "===\n")
 result <- suppressWarnings(adf.test(returns_xts[, ticker], alternative = "stationary"))
  print(result)
  cat("\n")
}
## === Kiểm định ADF cho: VNI ===
## 
##  Augmented Dickey-Fuller Test
## 
## data:  returns_xts[, ticker]
## Dickey-Fuller = -7.3256, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
## 
## 
## === Kiểm định ADF cho: ACB ===
## 
##  Augmented Dickey-Fuller Test
## 
## data:  returns_xts[, ticker]
## Dickey-Fuller = -8.1575, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
## 
## 
## === Kiểm định ADF cho: BID ===
## 
##  Augmented Dickey-Fuller Test
## 
## data:  returns_xts[, ticker]
## Dickey-Fuller = -7.7449, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
## 
## 
## === Kiểm định ADF cho: OCB ===
## 
##  Augmented Dickey-Fuller Test
## 
## data:  returns_xts[, ticker]
## Dickey-Fuller = -7.2642, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
## 
## 
## === Kiểm định ADF cho: VPB ===
## 
##  Augmented Dickey-Fuller Test
## 
## data:  returns_xts[, ticker]
## Dickey-Fuller = -7.2472, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
## 
## 
## === Kiểm định ADF cho: CTG ===
## 
##  Augmented Dickey-Fuller Test
## 
## data:  returns_xts[, ticker]
## Dickey-Fuller = -7.2973, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary

NHẬN XÉT

 Kết quả kiểm định Augmented Dickey-Fuller (ADF) đối với các chuỗi tỷ suất lợi nhuận logarit (log return) của chỉ số VN-Index (VNI) và nhóm cổ phiếu ngân hàng (ACB, BID, OCB, VPB, CTG) cho thấy tất cả các chuỗi đều có thống kê Dickey-Fuller âm lớn, với giá trị p nhỏ hơn hoặc bằng 0.01. Trong một số trường hợp, cảnh báo từ phần mềm cho biết p-value thực tế còn nhỏ hơn mức hiển thị, điều này càng củng cố thêm độ tin cậy của kết quả kiểm định.

 Với mức ý nghĩa 1%, ta bác bỏ giả thuyết rỗng về tồn tại đơn vị gốc trong tất cả các chuỗi, đồng nghĩa với việc các chuỗi lợi suất log đều là chuỗi dừng. Đây là điều kiện cần thiết để đảm bảo tính hợp lệ cho các phân tích hồi quy và đo lường rủi ro tiếp theo trong nghiên cứu.

 Về mặt thực tiễn, tính dừng của các chuỗi tỷ suất lợi nhuận cho phép tiến hành ước lượng các mô hình tài chính như CAPM và đường thị trường chứng khoán (SML), tính toán Value at Risk (VaR), cũng như xây dựng ma trận hiệp phương sai một cách đáng tin cậy. Nhờ đó, các kết quả thu được không chỉ đảm bảo về mặt thống kê mà còn có ý nghĩa thực tiễn trong việc hỗ trợ ra quyết định đầu tư và quản trị rủi ro tài chính.

3. ƯỚC LƯỢNG MÔ HÌNH CAMP

# 1. Đặt tên dữ liệu cho rõ ràng
rets <- returns_xts

# 2. Thiết lập lãi suất phi rủi ro
rf_annual <- 0.05             # 5%/năm
rf_daily  <- rf_annual / 252  # Giả định 252 ngày giao dịch/năm

# 3. Tính lợi suất kỳ vọng thị trường annualized
mean_mkt_daily <- mean(rets[, "VNI"], na.rm = TRUE)
exp_ret_ann    <- mean_mkt_daily * 252

# 4. Danh sách các cổ phiếu (bỏ VNI)
tickers <- setdiff(colnames(rets), "VNI")

# 5. Ước lượng CAPM với robust SE
capm_list <- lapply(tickers, function(sym) {
  y <- rets[, sym] - rf_daily
  x <- rets[, "VNI"] - rf_daily
  fit <- lm(y ~ x)
  rob <- coeftest(fit, vcov = vcovHC(fit, type = "HC1"))
  beta_val  <- rob[2, 1]
  alpha_val <- rob[1, 1]
  t_beta    <- rob[2, 3]
  er_capm   <- rf_annual + beta_val * (exp_ret_ann - rf_annual)
  data.frame(
    Stock   = sym,
    Alpha   = alpha_val,
    Beta    = beta_val,
    t_Beta  = t_beta,
    R2      = summary(fit)$r.squared,
    ER_CAPM = er_capm
  )
})

# 6. Gộp lại thành data frame
capm_df <- do.call(rbind, capm_list)

# 7. Hiển thị kết quả
cat("\nKẾT QUẢ ƯỚC LƯỢNG CAPM\n")
## 
## KẾT QUẢ ƯỚC LƯỢNG CAPM
print(capm_df, row.names = FALSE)
##  Stock         Alpha      Beta   t_Beta        R2   ER_CAPM
##    ACB -0.0005098875 0.9688301 15.34197 0.4108732 0.1329180
##    BID -0.0004979988 1.0616275 19.95763 0.5383858 0.1408601
##    OCB -0.0003483270 0.9830889 16.28413 0.4091828 0.1341383
##    VPB -0.0004299222 1.0083021 18.56153 0.5297904 0.1362962
##    CTG  0.0005719174 1.2269331 19.66197 0.5864899 0.1550079

NHẬN XÉT

 Kết quả ước lượng mô hình định giá tài sản vốn (CAPM) cho nhóm cổ phiếu ngân hàng ACB, BID, OCB, VPB và CTG cho thấy cả năm cổ phiếu đều có hệ số beta dương và có ý nghĩa thống kê rất cao, với giá trị thống kê t lớn hơn 15 trong tất cả các trường hợp. Điều này khẳng định mối quan hệ tuyến tính và cùng chiều giữa lợi suất của từng cổ phiếu với lợi suất thị trường, phù hợp với giả định lý thuyết của mô hình CAPM.

 Cụ thể, các cổ phiếu ACB, OCB, VPB có beta xấp xỉ 1 (lần lượt là 0.969, 0.983 và 1.008), cho thấy mức độ rủi ro hệ thống tương đương với thị trường chung. BID có beta cao hơn nhẹ (1.062), trong khi CTG có beta lớn nhất (1.227), cho thấy mức độ nhạy cảm với biến động thị trường cao hơn đáng kể. Các hệ số \(R^2\) dao động từ khoảng 0.41 đến 0.59, cho thấy mô hình CAPM giải thích được từ 41% đến gần 59% biến động trong lợi suất cổ phiếu – mức độ phù hợp tương đối cao trong bối cảnh dữ liệu tài chính thực nghiệm.

 Về alpha – phần lợi suất vượt trội không do thị trường giải thích – hầu hết cổ phiếu đều có alpha âm và nhỏ về giá trị tuyệt đối, thể hiện rằng phần chênh lệch so với lợi suất kỳ vọng là không đáng kể. Riêng CTG là cổ phiếu duy nhất có alpha dương (+0.00057), gợi ý rằng cổ phiếu này có thể đạt được mức lợi suất cao hơn so với kỳ vọng từ CAPM trong giai đoạn quan sát.

 Lợi suất kỳ vọng tính theo CAPM (annualized) nằm trong khoảng từ 13.29% (ACB) đến 15.50% (CTG), phản ánh phần thưởng rủi ro tương ứng với hệ số beta của từng cổ phiếu. Các cổ phiếu có beta cao hơn, như CTG, được kỳ vọng mang lại lợi suất cao hơn, đúng với lý thuyết của CAPM.

4. ĐƯỜNG THỊ TRƯỜNG CHỨNG KHOÁN SML

# Gọi thư viện
library(ggplot2)
library(RColorBrewer)
# 1. Chuẩn bị dữ liệu SML từ capm_df (đã có từ phần CAPM)
df_sml <- data.frame(
  Beta      = capm_df$Beta,
  ExpReturn = capm_df$ER_CAPM,
  Stock     = capm_df$Stock
)
# 2. Ước lượng đường SML
sml_fit <- lm(ExpReturn ~ Beta, data = df_sml)

# 3. Vẽ biểu đồ SML
library(ggplot2)
scale_y_continuous(labels = scales::percent_format(accuracy = 0.01))
## <ScaleContinuousPosition>
##  Range:  
##  Limits:    0 --    1
  # cần thiết để dùng percent_format

ggplot(df_sml, aes(x = Beta, y = ExpReturn, color = Stock)) +
  geom_point(size = 4) +
  geom_text(aes(label = Stock), nudge_y = 0.002, size = 3, show.legend = FALSE) +
  geom_abline(intercept = coef(sml_fit)[1],
              slope     = coef(sml_fit)[2],
              color     = "#E69F00",
              linetype  = "dashed",
              linewidth = 1.2) +
  scale_color_brewer(palette = "Dark2") +
  scale_y_continuous(labels = scales::percent_format(accuracy = 0.01)) +
  labs(
    title    = "Security Market Line – các cổ phiếu ngân hàng",
    x        = expression(beta),
    y        = "Lợi suất kỳ vọng (annualized)",
    color    = "Cổ phiếu"
  ) +
  theme_minimal(base_size = 14) +
  theme(
    plot.title       = element_text(face = "bold", size = 16),
    plot.subtitle    = element_text(size = 12, color = "gray40"),
    legend.position  = "bottom",
    legend.title     = element_text(face = "bold"),
    panel.grid.minor = element_blank()
  )

 Biểu đồ đường thị trường chứng khoán (Security Market Line – SML) thể hiện mối quan hệ giữa rủi ro hệ thống (thông qua hệ số beta) và lợi suất kỳ vọng annualized của năm cổ phiếu thuộc nhóm ngân hàng: ACB, BID, CTG, OCB và VPB. Đường SML được ước lượng từ dữ liệu thực nghiệm với độ dốc phản ánh phần thưởng rủi ro thị trường, còn phần chặn đứng biểu thị mức lợi suất phi rủi ro (risk-free rate) giả định.

 Tất cả các cổ phiếu trong mẫu đều nằm gần hoặc ngay trên đường SML, cho thấy rằng mức lợi suất kỳ vọng của chúng phù hợp với mức độ rủi ro hệ thống mà nhà đầu tư phải đối mặt, tức là được định giá hợp lý theo lý thuyết CAPM. Cụ thể:

  • CTG có hệ số beta cao nhất (~1.23), đồng nghĩa với mức độ nhạy cảm lớn nhất với thị trường và cũng có lợi suất kỳ vọng cao nhất (~15.5%), đúng như lý thuyết CAPM dự đoán.

  • ACB và OCB có beta gần bằng 1, phản ánh mức rủi ro hệ thống tương đương thị trường, với lợi suất kỳ vọng ~13.3–13.4%.

  • BID và VPB có beta xấp xỉ từ 1.01–1.06, nằm giữa nhóm còn lại, và lợi suất kỳ vọng cũng nằm tương ứng trong khoảng ~13.6–14.1%.

Tổng thể, các điểm dữ liệu phân bố nhất quán quanh đường SML với độ lệch nhỏ, cho thấy mô hình CAPM có mức độ phù hợp cao trong việc mô tả phần thưởng rủi ro của các cổ phiếu ngân hàng tại thời điểm phân tích. Không có cổ phiếu nào rõ ràng bị định giá thấp (nằm cao hơn SML) hay định giá cao (nằm thấp hơn SML), gợi ý thị trường đang phản ánh đúng mức độ rủi ro trong định giá nhóm tài sản này.

5. ƯỚC LƯỢNG MA TRẬN HIỆP PHƯƠNG SAI

stocks <- colnames(returns_xts)
cov_matrix <- cov(returns_xts[, stocks])
cat("\n=== Ma trận hiệp phương sai ===\n")
## 
## === Ma trận hiệp phương sai ===
print(cov_matrix)
##              VNI          ACB          BID          OCB          VPB
## VNI 0.0001091569 0.0001057545 0.0001158840 0.0001073109 0.0001100631
## ACB 0.0001057545 0.0002493668 0.0001294722 0.0001204513 0.0001302771
## BID 0.0001158840 0.0001294722 0.0002285082 0.0001172610 0.0001242101
## OCB 0.0001073109 0.0001204513 0.0001172610 0.0002578217 0.0001282812
## VPB 0.0001100631 0.0001302771 0.0001242101 0.0001282812 0.0002094732
## CTG 0.0001339282 0.0001578595 0.0001764581 0.0001425717 0.0001526888
##              CTG
## VNI 0.0001339282
## ACB 0.0001578595
## BID 0.0001764581
## OCB 0.0001425717
## VPB 0.0001526888
## CTG 0.0002801770

NHẬN XÉT

 Ma trận hiệp phương sai giữa các chuỗi tỷ suất lợi nhuận log cho thấy sự biến động đồng thời giữa các tài sản trong danh mục nghiên cứu. Giá trị trên đường chéo chính đại diện cho phương sai riêng của từng tài sản – hay mức độ biến động nội tại của cổ phiếu – trong khi các phần tử ngoài đường chéo mô tả mức độ tương quan tuyến tính về mặt biến động giữa các cặp tài sản.

 Cụ thể:

  • Cổ phiếu CTG có phương sai cao nhất (0.00028018), cho thấy đây là cổ phiếu có biến động lớn nhất trong nhóm. Tiếp theo là OCB (0.00025782), ACB (0.00024937), BID (0.00022851), và VPB (0.00020947). VN-Index có phương sai nhỏ nhất (0.00010916), phản ánh tính chất trung bình hóa của chỉ số thị trường.

  • Các hiệp phương sai đều mang giá trị dương, cho thấy các cổ phiếu có xu hướng biến động cùng chiều với nhau và với thị trường. Điều này phù hợp với thực tế khi các cổ phiếu thuộc cùng ngành (ngân hàng) thường bị chi phối bởi các yếu tố kinh tế vĩ mô chung.

 Một số cặp có hiệp phương sai nổi bật như:

  • CTG–BID (0.00017646): mức đồng biến cao, thể hiện mối liên hệ mạnh giữa hai cổ phiếu lớn trong ngành ngân hàng.

  • CTG–ACB (0.00015786) và CTG–VPB (0.00015269): cũng thể hiện mức độ đồng biến đáng kể.

 Ngược lại, các cặp như OCB–BID (0.00011726) hay OCB–ACB (0.00012045) có mức đồng biến thấp hơn, phản ánh sự khác biệt nhất định trong phản ứng giá giữa các cổ phiếu này.

 Tổng thể, ma trận hiệp phương sai cho thấy mức độ liên kết mạnh mẽ giữa các cổ phiếu ngân hàng và với thị trường, làm cơ sở quan trọng cho việc xây dựng danh mục đầu tư, ước lượng rủi ro hệ thống, cũng như tính toán giá trị rủi ro (VaR) sau này.

6. ƯỚC LƯỢNG VAR

6.1. VAR CHO TỪNG CỔ PHIẾU

# Thông số đầu vào
conf_level <- 0.99
z_alpha <- qnorm(1 - conf_level)
portfolio_value <- 1e9  # 1 tỷ mỗi cổ phiếu

# Tính toán trung bình và độ lệch chuẩn
mu <- colMeans(returns_xts, na.rm = TRUE)
sd <- apply(returns_xts, 2, sd, na.rm = TRUE)

# Tính VaR theo phần trăm và theo tiền
var_pct <- - (mu + z_alpha * sd)
var_vnd <- var_pct * portfolio_value

# Gộp vào bảng
VaR_df <- data.frame(
  Stock            = colnames(returns_xts),
  Mean_Return      = round(mu, 6),
  Std_Dev          = round(sd, 6),
  VaR_Pct_99       = round(var_pct * 100, 4),
  VaR_VND_99       = round(var_vnd)
)

print(VaR_df)
##     Stock Mean_Return  Std_Dev VaR_Pct_99 VaR_VND_99
## VNI   VNI    0.000538 0.010448     2.3767   23767220
## ACB   ACB    0.000018 0.015791     3.6719   36718610
## BID   BID    0.000061 0.015116     3.5105   35105243
## OCB   OCB    0.000184 0.016057     3.7170   37169796
## VPB   VPB    0.000111 0.014473     3.3559   33558736
## CTG   CTG    0.001187 0.016738     3.7753   37752516

NHẬN XÉT

 Bảng kết quả thể hiện VaR hàng ngày với độ tin cậy 99% cho mỗi cổ phiếu, tức là trong điều kiện thị trường bình thường, xác suất lỗ vượt quá mức VaR là 1%, còn lại 99% là trong phạm vi tổn thất dự đoán. Giá trị VaR được tính bằng cả tỷ suất phần trăm lỗ tối đa kỳ vọng, lẫn giá trị tiền tệ (VNĐ) trên giả định đầu tư 1 tỷ đồng cho mỗi mã.

 Một số nhận xét đáng chú ý:

  • Cổ phiếu CTG có rủi ro lớn nhất, với VaR đạt 3,78%, tương đương khoảng 37,75 triệu VNĐ lỗ kỳ vọng trong một ngày với xác suất 1%. Đây là mức VaR cao nhất trong danh mục, phản ánh mức biến động lớn (Std_Dev = 0.016738).

  • Tiếp theo là OCB và ACB, với VaR lần lượt là 3,72% và 3,67%, tương ứng tổn thất kỳ vọng khoảng 37 triệu và 36,7 triệu đồng mỗi ngày nếu rơi vào vùng rủi ro.

  • Cổ phiếu BID và VPB có mức VaR thấp hơn, lần lượt khoảng 3,51% và 3,36%, tức rủi ro thấp hơn nhẹ so với các cổ phiếu còn lại.

  • VN-Index có VaR thấp nhất (2,38%), tương ứng tổn thất khoảng 23,77 triệu đồng, điều này phù hợp do chỉ số thị trường có tính chất tổng hợp, trung hòa rủi ro và biến động so với các mã đơn lẻ.

 Về tổng thể, kết quả cho thấy các cổ phiếu ngân hàng có mức rủi ro cao hơn chỉ số thị trường, với mức VaR từ 3,3% đến 3,8%, so với khoảng 2,4% của VN-Index. Điều này nhấn mạnh rằng đầu tư vào cổ phiếu ngành ngân hàng, dù mang lại tiềm năng sinh lời, cũng đồng thời kéo theo rủi ro biến động cao hơn đáng kể so với danh mục thị trường chung.

6.2. VAR CHO DANH MỤC ĐẦU TƯ

# 1. Thông số đầu vào
confidence_level <- 0.99
alpha <- 1 - confidence_level
z_alpha <- qnorm(alpha)
holding_period <- 1  # 1 ngày

# 2. Giả định danh mục đầu tư: đầu tư 1 tỷ mỗi cổ phiếu
tickers <- colnames(returns_xts)
weights <- rep(1e9, length(tickers))  # 1 tỷ mỗi mã
names(weights) <- tickers

# 3. Tính lợi suất kỳ vọng và ma trận hiệp phương sai
mean_returns <- colMeans(returns_xts, na.rm = TRUE)
cov_matrix <- cov(returns_xts, use = "complete.obs")

# 4. Tính VaR danh mục (theo phân phối chuẩn có hiệp phương sai)
# 4.1. Tổng giá trị danh mục
portfolio_value <- sum(weights)

# 4.2. Tính tỷ trọng (% vốn) theo từng cổ phiếu
w_pct <- weights / portfolio_value

# 4.3. Lợi suất kỳ vọng danh mục
mu_p <- sum(w_pct * mean_returns)

# 4.4. Độ lệch chuẩn danh mục
sigma_p <- sqrt(t(w_pct) %*% cov_matrix %*% w_pct)

# 4.5. Tính VaR
VaR_pct <- - (mu_p + z_alpha * sigma_p)  # theo phần trăm
VaR_vnd <- VaR_pct * portfolio_value     # theo tiền

# 5. Kết quả
cat("=== VaR DANH MỤC (99%, 1 ngày) ===\n")
## === VaR DANH MỤC (99%, 1 ngày) ===
cat("Lợi suất kỳ vọng:", round(mu_p, 6), "\n")
## Lợi suất kỳ vọng: 0.00035
cat("Độ lệch chuẩn danh mục:", round(sigma_p, 6), "\n")
## Độ lệch chuẩn danh mục: 0.012064
cat("VaR (tỷ lệ %):", round(VaR_pct * 100, 4), "%\n")
## VaR (tỷ lệ %): 2.7715 %
cat("VaR (VNĐ):", round(VaR_vnd), "VND\n")
## VaR (VNĐ): 166291915 VND

NHẬN XÉT

 Kết quả ước lượng VaR cho danh mục đầu tư với giả định đầu tư đồng đều (mỗi mã 1 tỷ VNĐ) và tổng giá trị danh mục là 6 tỷ đồng cho thấy:

  • Lợi suất kỳ vọng hàng ngày của danh mục ở mức 0.035% (tương đương 0.00035), phản ánh mức sinh lợi trung bình tích cực, dù khá thấp – điều dễ hiểu trong bối cảnh biến động ngắn hạn của thị trường chứng khoán.

  • Độ lệch chuẩn lợi suất danh mục đạt 0.012064, cho thấy mức biến động hàng ngày là khoảng 1.2%. Đây là mức biến động vừa phải, thấp hơn so với các cổ phiếu riêng lẻ, nhờ vào tác động đa dạng hóa rủi ro giữa các tài sản trong danh mục.

  • Giá trị VaR tại mức tin cậy 99% là 2.77%, tức là với xác suất 99%, mức lỗ tối đa kỳ vọng của danh mục trong một ngày không vượt quá mức này.

  • Chuyển đổi sang giá trị tuyệt đối, VaR danh mục là khoảng 166,29 triệu VNĐ. Điều này đồng nghĩa với việc nhà đầu tư có thể mất tối đa khoảng 166 triệu đồng trong một ngày (với 1% xác suất xảy ra tình huống bất lợi), trong điều kiện thị trường bình thường.

 Kết luận, danh mục đầu tư này, dù có mức lợi suất kỳ vọng thấp, đã tận dụng hiệu quả lợi ích của đa dạng hóa, thể hiện qua độ lệch chuẩn danh mục thấp hơn nhiều cổ phiếu thành phần, và VaR tương đối kiểm soát được so với VaR riêng lẻ của các mã trong cùng danh mục. Đây là một minh chứng thực nghiệm tốt cho vai trò của tối ưu hóa phân bổ tài sản trong quản trị rủi ro tài chính.

7. SO SÁNH LỢI SUẤT DỰ BÁO VÀ LỢI SUẤT THỰC TẾ

library(PerformanceAnalytics)
library(knitr)
## Warning: package 'knitr' was built under R version 4.3.3
# 1. Tính lợi suất thực tế annualized từ rets (log return)
actual_df <- data.frame(
  Stock     = colnames(rets),
  Actual_ER = as.numeric(Return.annualized(rets, scale = 252)) * 100
)

# 2. Gộp với kết quả từ CAPM
compare_df <- merge(
  capm_df[, c("Stock", "ER_CAPM")],
  actual_df,
  by = "Stock"
)
compare_df$ER_CAPM <- compare_df$ER_CAPM * 100
compare_df$Diff    <- compare_df$Actual_ER - compare_df$ER_CAPM

# 3. Hiển thị bảng
kable(
  compare_df,
  col.names = c("Mã", "CAPM (%)", "Thực tế (%)", "Chênh lệch (%)"),
  digits = 2,
  caption = "So sánh lợi suất kỳ vọng CAPM và lợi suất thực tế (Annualized)"
)
So sánh lợi suất kỳ vọng CAPM và lợi suất thực tế (Annualized)
CAPM (%) Thực tế (%) Chênh lệch (%)
ACB 13.29 -2.80 -16.09
BID 14.09 -1.33 -15.42
CTG 15.50 30.18 14.68
OCB 13.41 1.40 -12.01
VPB 13.63 0.16 -13.47

NHẬN XÉT

 Bảng kết quả cho thấy sự khác biệt đáng kể giữa lợi suất kỳ vọng theo mô hình CAPM và lợi suất thực tế annualized của các cổ phiếu ngân hàng trong danh mục. Đa phần các cổ phiếu đều có lợi suất thực tế thấp hơn nhiều so với mức lợi suất mà mô hình CAPM dự đoán.

  • Cụ thể, ACB và BID có mức chênh lệch lần lượt là -16.09% và -15.42%, cho thấy hiệu quả sinh lời thực tế rất kém so với mức phần bù rủi ro kỳ vọng.

  • OCB và VPB cũng ghi nhận mức chênh lệch âm đáng kể, lần lượt là -12.01% và -13.47%, điều này cho thấy các cổ phiếu này có thể đang bị định giá cao so với giá trị thực tế trên thị trường, hoặc chịu ảnh hưởng từ các yếu tố phi hệ thống mà mô hình CAPM không phản ánh được.

  • Ngược lại, CTG là cổ phiếu duy nhất có lợi suất thực tế vượt xa lợi suất kỳ vọng từ mô hình, với chênh lệch dương 14.68%. Điều này hàm ý rằng CTG có thể đang bị định giá thấp hoặc sở hữu những yếu tố nội tại tích cực vượt ngoài phạm vi lý giải của CAPM, chẳng hạn như khả năng sinh lời cao hơn, quản trị hiệu quả, hoặc triển vọng tăng trưởng tích cực trong mắt nhà đầu tư.

LS0tDQp0aXRsZTogIk3DtCBow6xuaCDEkeG7i25oIGdpw6EgdMOgaSBz4bqjbiINCmF1dGhvcjogIlBo4bqhbSBUaOG7iyBRdeG7s25oIEdpYW8iDQpkYXRlOiAiMjAyNS0wNy0wMyINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY3NzOiAic3R5bGUuY3NzIg0KICAgIHRvYzogdHJ1ZQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgIG51bWJlcl9zZWN0aW9uczogZmFsc2UNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1UUlVFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCmBgYHtyfQ0KbGlicmFyeShxdWFudG1vZCkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShicm9vbSkNCmxpYnJhcnkoUGVyZm9ybWFuY2VBbmFseXRpY3MpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh4dHMpDQpsaWJyYXJ5KHRzZXJpZXMpDQpsaWJyYXJ5KGxtdGVzdCkNCmxpYnJhcnkoc2FuZHdpY2gpDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQoNCiMgKioxLiBU4buUTkcgUVVBTiBE4buuIExJ4buGVSoqDQoNCiZlbXNwO0Lhu5kgZOG7ryBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgdHJvbmcgbmdoacOqbiBj4bupdSBiYW8gZ+G7k20gY2jhu4kgc+G7kSBWTi1JbmRleCAoVk5JKSB2w6AgZ2nDoSBj4buVIHBoaeG6v3UgY+G7p2Egc8OhdSBuZ8OibiBow6BuZyB0aMawxqFuZyBt4bqhaSBj4buVIHBo4bqnbiB0acOqdSBiaeG7g3UgdOG6oWkgVmnhu4d0IE5hbTogQUNCLCBCSUQsIE9DQiwgVlBCLCBDVEcuIMSQw6J5IGzDoCBuaMOzbSBj4buVIHBoaeG6v3UgdGh14buZYyBuZ8OgbmggdMOgaSBjaMOtbmgg4oCTIG5nw6JuIGjDoG5nLCBjw7MgbeG7qWMgduG7kW4gaMOzYSBs4bubbiwgdGhhbmgga2hv4bqjbiBjYW8gdsOgIMSRxrDhu6NjIG5pw6ptIHnhur90IHRyw6puIHPDoG4gY2jhu6luZyBraG/DoW4gdHJvbmcgdGjhu51pIGdpYW4gZMOgaSwgcGjhuqNuIMOhbmggdMawxqFuZyDEkeG7kWkgcsO1IG7DqXQgYmnhur9uIMSR4buZbmcgY+G7p2EgdGjhu4sgdHLGsOG7nW5nIHTDoGkgY2jDrW5oIFZp4buHdCBOYW0uDQoNCiZlbXNwO1Zp4buHYyBr4bq/dCBo4bujcCBWTi1JbmRleCDigJMgxJHhuqFpIGRp4buHbiBjaG8gdG/DoG4gdGjhu4sgdHLGsOG7nW5nIOKAkyB24bubaSBuaMOzbSBj4buVIHBoaeG6v3UgbmfDom4gaMOgbmcg4oCTIMSR4bqhaSBkaeG7h24gY2hvIG3hu5l0IG5nw6BuaCBjw7MgdmFpIHRyw7IgdHJ1bmcgdMOibSDigJMgdOG6oW8gbsOqbiBt4buZdCB04bqtcCBk4buvIGxp4buHdSB24burYSDEkeG7pyDEkWEgZOG6oW5nIHbhu4EgbeG6t3QgY+G6pXUgdHLDumMgbmfDoG5oIG5naOG7gSwgduG7q2EgxJHhu6cgxJHhuqFpIGRp4buHbiB24buBIG3hurd0IHRo4buLIHRyxrDhu51uZy4gTmjhu50gduG6rXksIGLhu5kgZOG7ryBsaeG7h3UgbsOgeSBjaG8gcGjDqXAgdGjhu7FjIGhp4buHbiBoaeG7h3UgcXXhuqMgY8OhYyBwaMOibiB0w61jaCBraW5oIHThur8g4oCTIHTDoGkgY2jDrW5oIHF1YW4gdHLhu41uZyBuaMawIGtp4buDbSDEkeG7i25oIHTDrW5oIGThu6tuZyBjaHXhu5dpIHRo4budaSBnaWFuLCDGsOG7m2MgbMaw4bujbmcgbcO0IGjDrG5oIENBUE0gdsOgIMSRxrDhu51uZyB0aOG7iyB0csaw4budbmcgY2jhu6luZyBraG/DoW4gKFNNTCksIHjDonkgZOG7sW5nIG1hIHRy4bqtbiBoaeG7h3AgcGjGsMahbmcgc2FpIGdp4buvYSBjw6FjIGPhu5UgcGhp4bq/dSwgdsOgIHTDrW5oIHRvw6FuIFZhbHVlIGF0IFJpc2sgKFZhUikuIFPhu7EgbOG7sWEgY2jhu41uIGPDsyBjaOG7pyDEkcOtY2ggbsOgeSBraMO0bmcgY2jhu4kgxJHhuqNtIGLhuqNvIHTDrW5oIHRpbiBj4bqteSB24buBIG3hurd0IHRo4buRbmcga8OqLCBtw6AgY8OybiBnacO6cCBzbyBzw6FuaCBr4bq/dCBxdeG6oyBtw7QgaMOsbmggbeG7mXQgY8OhY2ggcsO1IHLDoG5nIHbDoCBjw7Mgw70gbmdoxKlhIHRo4buxYyB0aeG7hW4gY2FvLg0KDQpgYGB7cn0NCmRmIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9hZG1pbi9PbmVEcml2ZSAtIFVGTS9Eb2N1bWVudHMvZHVsaWV1YmFuZy9EVUxJRVVNSERCVFMuY3N2IikNCmRmJE5nw6B5IDwtIGFzLkRhdGUoZGYkTmfDoHksIGZvcm1hdCA9ICIlZC8lbS8lWSIpDQpkZiA8LSBkZltvcmRlcihkZiROZ8OgeSksIF0gICMgc+G6r3AgeOG6v3AgdMSDbmcgZOG6p24gdGhlbyBuZ8OgeQ0KIyBMb+G6oWkgZOG6pXUgcGjhuql5LCBjaHV54buDbiBj4buZdCBz4buRIHNhbmcgbnVtZXJpYw0KZm9yIChpIGluIDI6bmNvbChkZikpIHsNCiAgZGZbW2ldXSA8LSBhcy5udW1lcmljKGdzdWIoIiwiLCAiIiwgZGZbW2ldXSkpDQp9DQoNCiMgVOG6oW8geHRzIHThu6sgZOG7ryBsaeG7h3UgZ2nDoQ0KcHJpY2VzX3h0cyA8LSB4dHMoZGZbLCAtMV0sIG9yZGVyLmJ5ID0gZGYkTmfDoHkpDQojICoqMy4gVMONTkggTOG7okkgU1XhuqRUIExPRyoqDQpyZXR1cm5zX3h0cyA8LSBkaWZmKGxvZyhwcmljZXNfeHRzKSlbLTEsIF0NCmhlYWQocmV0dXJuc194dHMpDQpgYGANCg0KIyAqKjIuIEtJ4buCTSDEkOG7ik5IIFTDjU5IIEThu6pORyoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBkYW5oIHPDoWNoIHTDqm4gY+G7lSBwaGnhur91DQp0aWNrZXJzIDwtIGNvbG5hbWVzKHJldHVybnNfeHRzKQ0KDQojIFbDsm5nIGzhurdwIGtp4buDbSDEkeG7i25oIEFERiBjaG8gdOG7q25nIGNodeG7l2kgbOG7o2kgc3XhuqV0DQpmb3IgKHRpY2tlciBpbiB0aWNrZXJzKSB7DQogIGNhdCgiPT09IEtp4buDbSDEkeG7i25oIEFERiBjaG86IiwgdGlja2VyLCAiPT09XG4iKQ0KIHJlc3VsdCA8LSBzdXBwcmVzc1dhcm5pbmdzKGFkZi50ZXN0KHJldHVybnNfeHRzWywgdGlja2VyXSwgYWx0ZXJuYXRpdmUgPSAic3RhdGlvbmFyeSIpKQ0KICBwcmludChyZXN1bHQpDQogIGNhdCgiXG4iKQ0KfQ0KYGBgDQoNCioqTkjhuqxOIFjDiVQqKg0KDQomZW1zcDtL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBBdWdtZW50ZWQgRGlja2V5LUZ1bGxlciAoQURGKSDEkeG7kWkgduG7m2kgY8OhYyBjaHXhu5dpIHThu7cgc3XhuqV0IGzhu6NpIG5odeG6rW4gbG9nYXJpdCAobG9nIHJldHVybikgY+G7p2EgY2jhu4kgc+G7kSBWTi1JbmRleCAoVk5JKSB2w6AgbmjDs20gY+G7lSBwaGnhur91IG5nw6JuIGjDoG5nIChBQ0IsIEJJRCwgT0NCLCBWUEIsIENURykgY2hvIHRo4bqleSB04bqldCBj4bqjIGPDoWMgY2h14buXaSDEkeG7gXUgY8OzIHRo4buRbmcga8OqIERpY2tleS1GdWxsZXIgw6JtIGzhu5tuLCB24bubaSBnacOhIHRy4buLIHAgbmjhu48gaMahbiBob+G6t2MgYuG6sW5nIDAuMDEuIFRyb25nIG3hu5l0IHPhu5EgdHLGsOG7nW5nIGjhu6NwLCBj4bqjbmggYsOhbyB04burIHBo4bqnbiBt4buBbSBjaG8gYmnhur90IHAtdmFsdWUgdGjhu7FjIHThur8gY8OybiBuaOG7jyBoxqFuIG3hu6ljIGhp4buDbiB0aOG7iywgxJFp4buBdSBuw6B5IGPDoG5nIGPhu6duZyBj4buRIHRow6ptIMSR4buZIHRpbiBj4bqteSBj4bunYSBr4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaC4NCg0KJmVtc3A7VuG7m2kgbeG7qWMgw70gbmdoxKlhIDElLCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgcuG7l25nIHbhu4EgdOG7k24gdOG6oWkgxJHGoW4gduG7iyBn4buRYyB0cm9uZyB04bqldCBj4bqjIGPDoWMgY2h14buXaSwgxJHhu5NuZyBuZ2jEqWEgduG7m2kgdmnhu4djIGPDoWMgY2h14buXaSBs4bujaSBzdeG6pXQgbG9nIMSR4buBdSBsw6AgY2h14buXaSBk4burbmcuIMSQw6J5IGzDoCDEkWnhu4F1IGtp4buHbiBj4bqnbiB0aGnhur90IMSR4buDIMSR4bqjbSBi4bqjbyB0w61uaCBo4bujcCBs4buHIGNobyBjw6FjIHBow6JuIHTDrWNoIGjhu5NpIHF1eSB2w6AgxJFvIGzGsOG7nW5nIHLhu6dpIHJvIHRp4bq/cCB0aGVvIHRyb25nIG5naGnDqm4gY+G7qXUuDQoNCiZlbXNwO1bhu4EgbeG6t3QgdGjhu7FjIHRp4buFbiwgdMOtbmggZOG7q25nIGPhu6dhIGPDoWMgY2h14buXaSB04bu3IHN14bqldCBs4bujaSBuaHXhuq1uIGNobyBwaMOpcCB0aeG6v24gaMOgbmggxrDhu5tjIGzGsOG7o25nIGPDoWMgbcO0IGjDrG5oIHTDoGkgY2jDrW5oIG5oxrAgQ0FQTSB2w6AgxJHGsOG7nW5nIHRo4buLIHRyxrDhu51uZyBjaOG7qW5nIGtob8OhbiAoU01MKSwgdMOtbmggdG/DoW4gVmFsdWUgYXQgUmlzayAoVmFSKSwgY8WpbmcgbmjGsCB4w6J5IGThu7FuZyBtYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaSBt4buZdCBjw6FjaCDEkcOhbmcgdGluIGPhuq15LiBOaOG7nSDEkcOzLCBjw6FjIGvhur90IHF14bqjIHRodSDEkcaw4bujYyBraMO0bmcgY2jhu4kgxJHhuqNtIGLhuqNvIHbhu4EgbeG6t3QgdGjhu5FuZyBrw6ogbcOgIGPDsm4gY8OzIMO9IG5naMSpYSB0aOG7sWMgdGnhu4VuIHRyb25nIHZp4buHYyBo4buXIHRy4bujIHJhIHF1eeG6v3QgxJHhu4tuaCDEkeG6p3UgdMawIHbDoCBxdeG6o24gdHLhu4sgcuG7p2kgcm8gdMOgaSBjaMOtbmguDQoNCiMgKiozLiDGr+G7mkMgTMav4buiTkcgTcOUIEjDjE5IIENBTVAqKg0KDQpgYGB7cn0NCiMgMS4gxJDhurd0IHTDqm4gZOG7ryBsaeG7h3UgY2hvIHLDtSByw6BuZw0KcmV0cyA8LSByZXR1cm5zX3h0cw0KDQojIDIuIFRoaeG6v3QgbOG6rXAgbMOjaSBzdeG6pXQgcGhpIHLhu6dpIHJvDQpyZl9hbm51YWwgPC0gMC4wNSAgICAgICAgICAgICAjIDUlL27Eg20NCnJmX2RhaWx5ICA8LSByZl9hbm51YWwgLyAyNTIgICMgR2nhuqMgxJHhu4tuaCAyNTIgbmfDoHkgZ2lhbyBk4buLY2gvbsSDbQ0KDQojIDMuIFTDrW5oIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyB0aOG7iyB0csaw4budbmcgYW5udWFsaXplZA0KbWVhbl9ta3RfZGFpbHkgPC0gbWVhbihyZXRzWywgIlZOSSJdLCBuYS5ybSA9IFRSVUUpDQpleHBfcmV0X2FubiAgICA8LSBtZWFuX21rdF9kYWlseSAqIDI1Mg0KDQojIDQuIERhbmggc8OhY2ggY8OhYyBj4buVIHBoaeG6v3UgKGLhu48gVk5JKQ0KdGlja2VycyA8LSBzZXRkaWZmKGNvbG5hbWVzKHJldHMpLCAiVk5JIikNCg0KIyA1LiDGr+G7m2MgbMaw4bujbmcgQ0FQTSB24bubaSByb2J1c3QgU0UNCmNhcG1fbGlzdCA8LSBsYXBwbHkodGlja2VycywgZnVuY3Rpb24oc3ltKSB7DQogIHkgPC0gcmV0c1ssIHN5bV0gLSByZl9kYWlseQ0KICB4IDwtIHJldHNbLCAiVk5JIl0gLSByZl9kYWlseQ0KICBmaXQgPC0gbG0oeSB+IHgpDQogIHJvYiA8LSBjb2VmdGVzdChmaXQsIHZjb3YgPSB2Y292SEMoZml0LCB0eXBlID0gIkhDMSIpKQ0KICBiZXRhX3ZhbCAgPC0gcm9iWzIsIDFdDQogIGFscGhhX3ZhbCA8LSByb2JbMSwgMV0NCiAgdF9iZXRhICAgIDwtIHJvYlsyLCAzXQ0KICBlcl9jYXBtICAgPC0gcmZfYW5udWFsICsgYmV0YV92YWwgKiAoZXhwX3JldF9hbm4gLSByZl9hbm51YWwpDQogIGRhdGEuZnJhbWUoDQogICAgU3RvY2sgICA9IHN5bSwNCiAgICBBbHBoYSAgID0gYWxwaGFfdmFsLA0KICAgIEJldGEgICAgPSBiZXRhX3ZhbCwNCiAgICB0X0JldGEgID0gdF9iZXRhLA0KICAgIFIyICAgICAgPSBzdW1tYXJ5KGZpdCkkci5zcXVhcmVkLA0KICAgIEVSX0NBUE0gPSBlcl9jYXBtDQogICkNCn0pDQoNCiMgNi4gR+G7mXAgbOG6oWkgdGjDoG5oIGRhdGEgZnJhbWUNCmNhcG1fZGYgPC0gZG8uY2FsbChyYmluZCwgY2FwbV9saXN0KQ0KDQojIDcuIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KY2F0KCJcbkvhur5UIFFV4bqiIMav4buaQyBMxq/hu6JORyBDQVBNXG4iKQ0KcHJpbnQoY2FwbV9kZiwgcm93Lm5hbWVzID0gRkFMU0UpDQpgYGANCg0KKipOSOG6rE4gWMOJVCoqDQoNCiZlbXNwO0vhur90IHF14bqjIMaw4bubYyBsxrDhu6NuZyBtw7QgaMOsbmggxJHhu4tuaCBnacOhIHTDoGkgc+G6o24gduG7kW4gKENBUE0pIGNobyBuaMOzbSBj4buVIHBoaeG6v3UgbmfDom4gaMOgbmcgQUNCLCBCSUQsIE9DQiwgVlBCIHbDoCBDVEcgY2hvIHRo4bqleSBj4bqjIG7Eg20gY+G7lSBwaGnhur91IMSR4buBdSBjw7MgaOG7hyBz4buRIGJldGEgZMawxqFuZyB2w6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBjYW8sIHbhu5tpIGdpw6EgdHLhu4sgdGjhu5FuZyBrw6ogdCBs4bubbiBoxqFuIDE1IHRyb25nIHThuqV0IGPhuqMgY8OhYyB0csaw4budbmcgaOG7o3AuIMSQaeG7gXUgbsOgeSBraOG6s25nIMSR4buLbmggbeG7kWkgcXVhbiBo4buHIHR1eeG6v24gdMOtbmggdsOgIGPDuW5nIGNoaeG7gXUgZ2nhu69hIGzhu6NpIHN14bqldCBj4bunYSB04burbmcgY+G7lSBwaGnhur91IHbhu5tpIGzhu6NpIHN14bqldCB0aOG7iyB0csaw4budbmcsIHBow7kgaOG7o3AgduG7m2kgZ2nhuqMgxJHhu4tuaCBsw70gdGh1eeG6v3QgY+G7p2EgbcO0IGjDrG5oIENBUE0uDQoNCiZlbXNwO0Phu6UgdGjhu4MsIGPDoWMgY+G7lSBwaGnhur91IEFDQiwgT0NCLCBWUEIgY8OzIGJldGEgeOG6pXAgeOG7iSAxIChs4bqnbiBsxrDhu6N0IGzDoCAwLjk2OSwgMC45ODMgdsOgIDEuMDA4KSwgY2hvIHRo4bqleSBt4bupYyDEkeG7mSBy4bunaSBybyBo4buHIHRo4buRbmcgdMawxqFuZyDEkcawxqFuZyB24bubaSB0aOG7iyB0csaw4budbmcgY2h1bmcuIEJJRCBjw7MgYmV0YSBjYW8gaMahbiBuaOG6uSAoMS4wNjIpLCB0cm9uZyBraGkgQ1RHIGPDsyBiZXRhIGzhu5tuIG5o4bqldCAoMS4yMjcpLCBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIG5o4bqheSBj4bqjbSB24bubaSBiaeG6v24gxJHhu5luZyB0aOG7iyB0csaw4budbmcgY2FvIGjGoW4gxJHDoW5nIGvhu4MuIEPDoWMgaOG7hyBz4buRICRSXjIkIGRhbyDEkeG7mW5nIHThu6sga2hv4bqjbmcgMC40MSDEkeG6v24gMC41OSwgY2hvIHRo4bqleSBtw7QgaMOsbmggQ0FQTSBnaeG6o2kgdGjDrWNoIMSRxrDhu6NjIHThu6sgNDElIMSR4bq/biBn4bqnbiA1OSUgYmnhur9uIMSR4buZbmcgdHJvbmcgbOG7o2kgc3XhuqV0IGPhu5UgcGhp4bq/dSDigJMgbeG7qWMgxJHhu5kgcGjDuSBo4bujcCB0xrDGoW5nIMSR4buRaSBjYW8gdHJvbmcgYuG7kWkgY+G6o25oIGThu68gbGnhu4d1IHTDoGkgY2jDrW5oIHRo4buxYyBuZ2hp4buHbS4NCg0KJmVtc3A7VuG7gSBhbHBoYSDigJMgcGjhuqduIGzhu6NpIHN14bqldCB2xrDhu6N0IHRy4buZaSBraMO0bmcgZG8gdGjhu4sgdHLGsOG7nW5nIGdp4bqjaSB0aMOtY2gg4oCTIGjhuqd1IGjhur90IGPhu5UgcGhp4bq/dSDEkeG7gXUgY8OzIGFscGhhIMOibSB2w6Agbmjhu48gduG7gSBnacOhIHRy4buLIHR1eeG7h3QgxJHhu5FpLCB0aOG7gyBoaeG7h24gcuG6sW5nIHBo4bqnbiBjaMOqbmggbOG7h2NoIHNvIHbhu5tpIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyBsw6Aga2jDtG5nIMSRw6FuZyBr4buDLiBSacOqbmcgQ1RHIGzDoCBj4buVIHBoaeG6v3UgZHV5IG5o4bqldCBjw7MgYWxwaGEgZMawxqFuZyAoKzAuMDAwNTcpLCBn4bujaSDDvSBy4bqxbmcgY+G7lSBwaGnhur91IG7DoHkgY8OzIHRo4buDIMSR4bqhdCDEkcaw4bujYyBt4bupYyBs4bujaSBzdeG6pXQgY2FvIGjGoW4gc28gduG7m2kga+G7syB24buNbmcgdOG7qyBDQVBNIHRyb25nIGdpYWkgxJFv4bqhbiBxdWFuIHPDoXQuDQoNCiZlbXNwO0zhu6NpIHN14bqldCBr4buzIHbhu41uZyB0w61uaCB0aGVvIENBUE0gKGFubnVhbGl6ZWQpIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMTMuMjklIChBQ0IpIMSR4bq/biAxNS41MCUgKENURyksIHBo4bqjbiDDoW5oIHBo4bqnbiB0aMaw4bufbmcgcuG7p2kgcm8gdMawxqFuZyDhu6luZyB24bubaSBo4buHIHPhu5EgYmV0YSBj4bunYSB04burbmcgY+G7lSBwaGnhur91LiBDw6FjIGPhu5UgcGhp4bq/dSBjw7MgYmV0YSBjYW8gaMahbiwgbmjGsCBDVEcsIMSRxrDhu6NjIGvhu7MgduG7jW5nIG1hbmcgbOG6oWkgbOG7o2kgc3XhuqV0IGNhbyBoxqFuLCDEkcO6bmcgduG7m2kgbMO9IHRodXnhur90IGPhu6dhIENBUE0uDQoNCiMgKio0LiDEkMav4bucTkcgVEjhu4ogVFLGr+G7nE5HIENI4buoTkcgS0hPw4FOIFNNTCoqDQoNCmBgYHtyfQ0KDQojIEfhu41pIHRoxrAgdmnhu4duDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCiMgMS4gQ2h14bqpbiBi4buLIGThu68gbGnhu4d1IFNNTCB04burIGNhcG1fZGYgKMSRw6MgY8OzIHThu6sgcGjhuqduIENBUE0pDQpkZl9zbWwgPC0gZGF0YS5mcmFtZSgNCiAgQmV0YSAgICAgID0gY2FwbV9kZiRCZXRhLA0KICBFeHBSZXR1cm4gPSBjYXBtX2RmJEVSX0NBUE0sDQogIFN0b2NrICAgICA9IGNhcG1fZGYkU3RvY2sNCikNCiMgMi4gxq/hu5tjIGzGsOG7o25nIMSRxrDhu51uZyBTTUwNCnNtbF9maXQgPC0gbG0oRXhwUmV0dXJuIH4gQmV0YSwgZGF0YSA9IGRmX3NtbCkNCg0KIyAzLiBW4bq9IGJp4buDdSDEkeG7kyBTTUwNCmxpYnJhcnkoZ2dwbG90MikNCnNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMC4wMSkpDQogICMgY+G6p24gdGhp4bq/dCDEkeG7gyBkw7luZyBwZXJjZW50X2Zvcm1hdA0KDQpnZ3Bsb3QoZGZfc21sLCBhZXMoeCA9IEJldGEsIHkgPSBFeHBSZXR1cm4sIGNvbG9yID0gU3RvY2spKSArDQogIGdlb21fcG9pbnQoc2l6ZSA9IDQpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IFN0b2NrKSwgbnVkZ2VfeSA9IDAuMDAyLCBzaXplID0gMywgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKw0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSBjb2VmKHNtbF9maXQpWzFdLA0KICAgICAgICAgICAgICBzbG9wZSAgICAgPSBjb2VmKHNtbF9maXQpWzJdLA0KICAgICAgICAgICAgICBjb2xvciAgICAgPSAiI0U2OUYwMCIsDQogICAgICAgICAgICAgIGxpbmV0eXBlICA9ICJkYXNoZWQiLA0KICAgICAgICAgICAgICBsaW5ld2lkdGggPSAxLjIpICsNCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBzY2FsZXM6OnBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMC4wMSkpICsNCiAgbGFicygNCiAgICB0aXRsZSAgICA9ICJTZWN1cml0eSBNYXJrZXQgTGluZSDigJMgY8OhYyBj4buVIHBoaeG6v3UgbmfDom4gaMOgbmciLA0KICAgIHggICAgICAgID0gZXhwcmVzc2lvbihiZXRhKSwNCiAgICB5ICAgICAgICA9ICJM4bujaSBzdeG6pXQga+G7syB24buNbmcgKGFubnVhbGl6ZWQpIiwNCiAgICBjb2xvciAgICA9ICJD4buVIHBoaeG6v3UiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKGJhc2Vfc2l6ZSA9IDE0KSArDQogIHRoZW1lKA0KICAgIHBsb3QudGl0bGUgICAgICAgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE2KSwNCiAgICBwbG90LnN1YnRpdGxlICAgID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgY29sb3IgPSAiZ3JheTQwIiksDQogICAgbGVnZW5kLnBvc2l0aW9uICA9ICJib3R0b20iLA0KICAgIGxlZ2VuZC50aXRsZSAgICAgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiksDQogICAgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKQ0KICApDQoNCmBgYA0KDQomZW1zcDtCaeG7g3UgxJHhu5MgxJHGsOG7nW5nIHRo4buLIHRyxrDhu51uZyBjaOG7qW5nIGtob8OhbiAoU2VjdXJpdHkgTWFya2V0IExpbmUg4oCTIFNNTCkgdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgcuG7p2kgcm8gaOG7hyB0aOG7kW5nICh0aMO0bmcgcXVhIGjhu4cgc+G7kSBiZXRhKSB2w6AgbOG7o2kgc3XhuqV0IGvhu7MgduG7jW5nIGFubnVhbGl6ZWQgY+G7p2EgbsSDbSBj4buVIHBoaeG6v3UgdGh14buZYyBuaMOzbSBuZ8OibiBow6BuZzogQUNCLCBCSUQsIENURywgT0NCIHbDoCBWUEIuIMSQxrDhu51uZyBTTUwgxJHGsOG7o2MgxrDhu5tjIGzGsOG7o25nIHThu6sgZOG7ryBsaeG7h3UgdGjhu7FjIG5naGnhu4dtIHbhu5tpIMSR4buZIGThu5FjIHBo4bqjbiDDoW5oIHBo4bqnbiB0aMaw4bufbmcgcuG7p2kgcm8gdGjhu4sgdHLGsOG7nW5nLCBjw7JuIHBo4bqnbiBjaOG6t24gxJHhu6luZyBiaeG7g3UgdGjhu4sgbeG7qWMgbOG7o2kgc3XhuqV0IHBoaSBy4bunaSBybyAocmlzay1mcmVlIHJhdGUpIGdp4bqjIMSR4buLbmguDQoNCiZlbXNwO1ThuqV0IGPhuqMgY8OhYyBj4buVIHBoaeG6v3UgdHJvbmcgbeG6q3UgxJHhu4F1IG7hurFtIGfhuqduIGhv4bq3YyBuZ2F5IHRyw6puIMSRxrDhu51uZyBTTUwsIGNobyB0aOG6pXkgcuG6sW5nIG3hu6ljIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyBj4bunYSBjaMO6bmcgcGjDuSBo4bujcCB24bubaSBt4bupYyDEkeG7mSBy4bunaSBybyBo4buHIHRo4buRbmcgbcOgIG5ow6AgxJHhuqd1IHTGsCBwaOG6o2kgxJHhu5FpIG3hurd0LCB04bupYyBsw6AgxJHGsOG7o2MgxJHhu4tuaCBnacOhIGjhu6NwIGzDvSB0aGVvIGzDvSB0aHV54bq/dCBDQVBNLiBD4bulIHRo4buDOg0KDQotIENURyBjw7MgaOG7hyBz4buRIGJldGEgY2FvIG5o4bqldCAofjEuMjMpLCDEkeG7k25nIG5naMSpYSB24bubaSBt4bupYyDEkeG7mSBuaOG6oXkgY+G6o20gbOG7m24gbmjhuqV0IHbhu5tpIHRo4buLIHRyxrDhu51uZyB2w6AgY8WpbmcgY8OzIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyBjYW8gbmjhuqV0ICh+MTUuNSUpLCDEkcO6bmcgbmjGsCBsw70gdGh1eeG6v3QgQ0FQTSBk4buxIMSRb8Ohbi4NCg0KLSBBQ0IgdsOgIE9DQiBjw7MgYmV0YSBn4bqnbiBi4bqxbmcgMSwgcGjhuqNuIMOhbmggbeG7qWMgcuG7p2kgcm8gaOG7hyB0aOG7kW5nIHTGsMahbmcgxJHGsMahbmcgdGjhu4sgdHLGsOG7nW5nLCB24bubaSBs4bujaSBzdeG6pXQga+G7syB24buNbmcgfjEzLjPigJMxMy40JS4NCg0KLSBCSUQgdsOgIFZQQiBjw7MgYmV0YSB44bqlcCB44buJIHThu6sgMS4wMeKAkzEuMDYsIG7hurFtIGdp4buvYSBuaMOzbSBjw7JuIGzhuqFpLCB2w6AgbOG7o2kgc3XhuqV0IGvhu7MgduG7jW5nIGPFqW5nIG7hurFtIHTGsMahbmcg4bupbmcgdHJvbmcga2hv4bqjbmcgfjEzLjbigJMxNC4xJS4NCg0KVOG7lW5nIHRo4buDLCBjw6FjIMSRaeG7g20gZOG7ryBsaeG7h3UgcGjDom4gYuG7kSBuaOG6pXQgcXXDoW4gcXVhbmggxJHGsOG7nW5nIFNNTCB24bubaSDEkeG7mSBs4buHY2ggbmjhu48sIGNobyB0aOG6pXkgbcO0IGjDrG5oIENBUE0gY8OzIG3hu6ljIMSR4buZIHBow7kgaOG7o3AgY2FvIHRyb25nIHZp4buHYyBtw7QgdOG6oyBwaOG6p24gdGjGsOG7n25nIHLhu6dpIHJvIGPhu6dhIGPDoWMgY+G7lSBwaGnhur91IG5nw6JuIGjDoG5nIHThuqFpIHRo4budaSDEkWnhu4NtIHBow6JuIHTDrWNoLiBLaMO0bmcgY8OzIGPhu5UgcGhp4bq/dSBuw6BvIHLDtSByw6BuZyBi4buLIMSR4buLbmggZ2nDoSB0aOG6pXAgKG7hurFtIGNhbyBoxqFuIFNNTCkgaGF5IMSR4buLbmggZ2nDoSBjYW8gKG7hurFtIHRo4bqlcCBoxqFuIFNNTCksIGfhu6NpIMO9IHRo4buLIHRyxrDhu51uZyDEkWFuZyBwaOG6o24gw6FuaCDEkcO6bmcgbeG7qWMgxJHhu5kgcuG7p2kgcm8gdHJvbmcgxJHhu4tuaCBnacOhIG5ow7NtIHTDoGkgc+G6o24gbsOgeS4NCg0KIyAqKjUuIMav4buaQyBMxq/hu6JORyBNQSBUUuG6rE4gSEnhu4ZQIFBIxq/GoE5HIFNBSSoqDQoNCmBgYHtSfQ0Kc3RvY2tzIDwtIGNvbG5hbWVzKHJldHVybnNfeHRzKQ0KY292X21hdHJpeCA8LSBjb3YocmV0dXJuc194dHNbLCBzdG9ja3NdKQ0KY2F0KCJcbj09PSBNYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaSA9PT1cbiIpDQpwcmludChjb3ZfbWF0cml4KQ0KYGBgDQoNCioqTkjhuqxOIFjDiVQqKg0KDQomZW1zcDtNYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaSBnaeG7r2EgY8OhYyBjaHXhu5dpIHThu7cgc3XhuqV0IGzhu6NpIG5odeG6rW4gbG9nIGNobyB0aOG6pXkgc+G7sSBiaeG6v24gxJHhu5luZyDEkeG7k25nIHRo4budaSBnaeG7r2EgY8OhYyB0w6BpIHPhuqNuIHRyb25nIGRhbmggbeG7pWMgbmdoacOqbiBj4bupdS4gR2nDoSB0cuG7iyB0csOqbiDEkcaw4budbmcgY2jDqW8gY2jDrW5oIMSR4bqhaSBkaeG7h24gY2hvIHBoxrDGoW5nIHNhaSByacOqbmcgY+G7p2EgdOG7q25nIHTDoGkgc+G6o24g4oCTIGhheSBt4bupYyDEkeG7mSBiaeG6v24gxJHhu5luZyBu4buZaSB04bqhaSBj4bunYSBj4buVIHBoaeG6v3Ug4oCTIHRyb25nIGtoaSBjw6FjIHBo4bqnbiB04butIG5nb8OgaSDEkcaw4budbmcgY2jDqW8gbcO0IHThuqMgbeG7qWMgxJHhu5kgdMawxqFuZyBxdWFuIHR1eeG6v24gdMOtbmggduG7gSBt4bq3dCBiaeG6v24gxJHhu5luZyBnaeG7r2EgY8OhYyBj4bq3cCB0w6BpIHPhuqNuLg0KDQomZW1zcDtD4bulIHRo4buDOg0KDQotIEPhu5UgcGhp4bq/dSBDVEcgY8OzIHBoxrDGoW5nIHNhaSBjYW8gbmjhuqV0ICgwLjAwMDI4MDE4KSwgY2hvIHRo4bqleSDEkcOieSBsw6AgY+G7lSBwaGnhur91IGPDsyBiaeG6v24gxJHhu5luZyBs4bubbiBuaOG6pXQgdHJvbmcgbmjDs20uIFRp4bq/cCB0aGVvIGzDoCBPQ0IgKDAuMDAwMjU3ODIpLCBBQ0IgKDAuMDAwMjQ5MzcpLCBCSUQgKDAuMDAwMjI4NTEpLCB2w6AgVlBCICgwLjAwMDIwOTQ3KS4gVk4tSW5kZXggY8OzIHBoxrDGoW5nIHNhaSBuaOG7jyBuaOG6pXQgKDAuMDAwMTA5MTYpLCBwaOG6o24gw6FuaCB0w61uaCBjaOG6pXQgdHJ1bmcgYsOsbmggaMOzYSBj4bunYSBjaOG7iSBz4buRIHRo4buLIHRyxrDhu51uZy4NCg0KLSBDw6FjIGhp4buHcCBwaMawxqFuZyBzYWkgxJHhu4F1IG1hbmcgZ2nDoSB0cuG7iyBkxrDGoW5nLCBjaG8gdGjhuqV5IGPDoWMgY+G7lSBwaGnhur91IGPDsyB4dSBoxrDhu5tuZyBiaeG6v24gxJHhu5luZyBjw7luZyBjaGnhu4F1IHbhu5tpIG5oYXUgdsOgIHbhu5tpIHRo4buLIHRyxrDhu51uZy4gxJBp4buBdSBuw6B5IHBow7kgaOG7o3AgduG7m2kgdGjhu7FjIHThur8ga2hpIGPDoWMgY+G7lSBwaGnhur91IHRodeG7mWMgY8O5bmcgbmfDoG5oIChuZ8OibiBow6BuZykgdGjGsOG7nW5nIGLhu4sgY2hpIHBo4buRaSBi4bufaSBjw6FjIHnhur91IHThu5Ega2luaCB04bq/IHbEqSBtw7QgY2h1bmcuDQoNCiZlbXNwO03hu5l0IHPhu5EgY+G6t3AgY8OzIGhp4buHcCBwaMawxqFuZyBzYWkgbuG7lWkgYuG6rXQgbmjGsDoNCg0KLSBDVEfigJNCSUQgKDAuMDAwMTc2NDYpOiBt4bupYyDEkeG7k25nIGJp4bq/biBjYW8sIHRo4buDIGhp4buHbiBt4buRaSBsacOqbiBo4buHIG3huqFuaCBnaeG7r2EgaGFpIGPhu5UgcGhp4bq/dSBs4bubbiB0cm9uZyBuZ8OgbmggbmfDom4gaMOgbmcuDQoNCi0gQ1RH4oCTQUNCICgwLjAwMDE1Nzg2KSB2w6AgQ1RH4oCTVlBCICgwLjAwMDE1MjY5KTogY8WpbmcgdGjhu4MgaGnhu4duIG3hu6ljIMSR4buZIMSR4buTbmcgYmnhur9uIMSRw6FuZyBr4buDLg0KDQomZW1zcDtOZ8aw4bujYyBs4bqhaSwgY8OhYyBj4bq3cCBuaMawIE9DQuKAk0JJRCAoMC4wMDAxMTcyNikgaGF5IE9DQuKAk0FDQiAoMC4wMDAxMjA0NSkgY8OzIG3hu6ljIMSR4buTbmcgYmnhur9uIHRo4bqlcCBoxqFuLCBwaOG6o24gw6FuaCBz4buxIGtow6FjIGJp4buHdCBuaOG6pXQgxJHhu4tuaCB0cm9uZyBwaOG6o24g4bupbmcgZ2nDoSBnaeG7r2EgY8OhYyBj4buVIHBoaeG6v3UgbsOgeS4NCg0KJmVtc3A7VOG7lW5nIHRo4buDLCBtYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaSBjaG8gdGjhuqV5IG3hu6ljIMSR4buZIGxpw6puIGvhur90IG3huqFuaCBt4bq9IGdp4buvYSBjw6FjIGPhu5UgcGhp4bq/dSBuZ8OibiBow6BuZyB2w6AgduG7m2kgdGjhu4sgdHLGsOG7nW5nLCBsw6BtIGPGoSBz4bufIHF1YW4gdHLhu41uZyBjaG8gdmnhu4djIHjDonkgZOG7sW5nIGRhbmggbeG7pWMgxJHhuqd1IHTGsCwgxrDhu5tjIGzGsOG7o25nIHLhu6dpIHJvIGjhu4cgdGjhu5FuZywgY8WpbmcgbmjGsCB0w61uaCB0b8OhbiBnacOhIHRy4buLIHLhu6dpIHJvIChWYVIpIHNhdSBuw6B5Lg0KDQojICoqNi4gxq/hu5pDIEzGr+G7ok5HIFZBUioqDQoNCiMjICoqNi4xLiBWQVIgQ0hPIFThu6pORyBD4buUIFBISeG6vlUqKg0KDQpgYGB7cn0NCiMgVGjDtG5nIHPhu5EgxJHhuqd1IHbDoG8NCmNvbmZfbGV2ZWwgPC0gMC45OQ0Kel9hbHBoYSA8LSBxbm9ybSgxIC0gY29uZl9sZXZlbCkNCnBvcnRmb2xpb192YWx1ZSA8LSAxZTkgICMgMSB04bu3IG3hu5dpIGPhu5UgcGhp4bq/dQ0KDQojIFTDrW5oIHRvw6FuIHRydW5nIGLDrG5oIHbDoCDEkeG7mSBs4buHY2ggY2h14bqpbg0KbXUgPC0gY29sTWVhbnMocmV0dXJuc194dHMsIG5hLnJtID0gVFJVRSkNCnNkIDwtIGFwcGx5KHJldHVybnNfeHRzLCAyLCBzZCwgbmEucm0gPSBUUlVFKQ0KDQojIFTDrW5oIFZhUiB0aGVvIHBo4bqnbiB0csSDbSB2w6AgdGhlbyB0aeG7gW4NCnZhcl9wY3QgPC0gLSAobXUgKyB6X2FscGhhICogc2QpDQp2YXJfdm5kIDwtIHZhcl9wY3QgKiBwb3J0Zm9saW9fdmFsdWUNCg0KIyBH4buZcCB2w6BvIGLhuqNuZw0KVmFSX2RmIDwtIGRhdGEuZnJhbWUoDQogIFN0b2NrICAgICAgICAgICAgPSBjb2xuYW1lcyhyZXR1cm5zX3h0cyksDQogIE1lYW5fUmV0dXJuICAgICAgPSByb3VuZChtdSwgNiksDQogIFN0ZF9EZXYgICAgICAgICAgPSByb3VuZChzZCwgNiksDQogIFZhUl9QY3RfOTkgICAgICAgPSByb3VuZCh2YXJfcGN0ICogMTAwLCA0KSwNCiAgVmFSX1ZORF85OSAgICAgICA9IHJvdW5kKHZhcl92bmQpDQopDQoNCnByaW50KFZhUl9kZikNCmBgYA0KDQoqKk5I4bqsTiBYw4lUKioNCg0KJmVtc3A7QuG6o25nIGvhur90IHF14bqjIHRo4buDIGhp4buHbiBWYVIgaMOgbmcgbmfDoHkgduG7m2kgxJHhu5kgdGluIGPhuq15IDk5JSBjaG8gbeG7l2kgY+G7lSBwaGnhur91LCB04bupYyBsw6AgdHJvbmcgxJFp4buBdSBraeG7h24gdGjhu4sgdHLGsOG7nW5nIGLDrG5oIHRoxrDhu51uZywgeMOhYyBzdeG6pXQgbOG7lyB2xrDhu6N0IHF1w6EgbeG7qWMgVmFSIGzDoCAxJSwgY8OybiBs4bqhaSA5OSUgbMOgIHRyb25nIHBo4bqhbSB2aSB04buVbiB0aOG6pXQgZOG7sSDEkW/DoW4uIEdpw6EgdHLhu4sgVmFSIMSRxrDhu6NjIHTDrW5oIGLhurFuZyBj4bqjIHThu7cgc3XhuqV0IHBo4bqnbiB0csSDbSBs4buXIHThu5FpIMSRYSBr4buzIHbhu41uZywgbOG6q24gZ2nDoSB0cuG7iyB0aeG7gW4gdOG7hyAoVk7EkCkgdHLDqm4gZ2nhuqMgxJHhu4tuaCDEkeG6p3UgdMawIDEgdOG7tyDEkeG7k25nIGNobyBt4buXaSBtw6MuDQoNCiZlbXNwO03hu5l0IHPhu5Egbmjhuq1uIHjDqXQgxJHDoW5nIGNow7ogw706DQoNCi0gQ+G7lSBwaGnhur91IENURyBjw7MgcuG7p2kgcm8gbOG7m24gbmjhuqV0LCB24bubaSBWYVIgxJHhuqF0IDMsNzglLCB0xrDGoW5nIMSRxrDGoW5nIGtob+G6o25nIDM3LDc1IHRyaeG7h3UgVk7EkCBs4buXIGvhu7MgduG7jW5nIHRyb25nIG3hu5l0IG5nw6B5IHbhu5tpIHjDoWMgc3XhuqV0IDElLiDEkMOieSBsw6AgbeG7qWMgVmFSIGNhbyBuaOG6pXQgdHJvbmcgZGFuaCBt4bulYywgcGjhuqNuIMOhbmggbeG7qWMgYmnhur9uIMSR4buZbmcgbOG7m24gKFN0ZF9EZXYgPSAwLjAxNjczOCkuDQoNCi0gVGnhur9wIHRoZW8gbMOgIE9DQiB2w6AgQUNCLCB24bubaSBWYVIgbOG6p24gbMaw4bujdCBsw6AgMyw3MiUgdsOgIDMsNjclLCB0xrDGoW5nIOG7qW5nIHThu5VuIHRo4bqldCBr4buzIHbhu41uZyBraG/huqNuZyAzNyB0cmnhu4d1IHbDoCAzNiw3IHRyaeG7h3UgxJHhu5NuZyBt4buXaSBuZ8OgeSBu4bq/dSByxqFpIHbDoG8gdsO5bmcgcuG7p2kgcm8uDQoNCi0gQ+G7lSBwaGnhur91IEJJRCB2w6AgVlBCIGPDsyBt4bupYyBWYVIgdGjhuqVwIGjGoW4sIGzhuqduIGzGsOG7o3Qga2hv4bqjbmcgMyw1MSUgdsOgIDMsMzYlLCB04bupYyBy4bunaSBybyB0aOG6pXAgaMahbiBuaOG6uSBzbyB24bubaSBjw6FjIGPhu5UgcGhp4bq/dSBjw7JuIGzhuqFpLg0KDQotIFZOLUluZGV4IGPDsyBWYVIgdGjhuqVwIG5o4bqldCAoMiwzOCUpLCB0xrDGoW5nIOG7qW5nIHThu5VuIHRo4bqldCBraG/huqNuZyAyMyw3NyB0cmnhu4d1IMSR4buTbmcsIMSRaeG7gXUgbsOgeSBwaMO5IGjhu6NwIGRvIGNo4buJIHPhu5EgdGjhu4sgdHLGsOG7nW5nIGPDsyB0w61uaCBjaOG6pXQgdOG7lW5nIGjhu6NwLCB0cnVuZyBow7JhIHLhu6dpIHJvIHbDoCBiaeG6v24gxJHhu5luZyBzbyB24bubaSBjw6FjIG3DoyDEkcahbiBs4bq7Lg0KDQomZW1zcDtW4buBIHThu5VuZyB0aOG7gywga+G6v3QgcXXhuqMgY2hvIHRo4bqleSBjw6FjIGPhu5UgcGhp4bq/dSBuZ8OibiBow6BuZyBjw7MgbeG7qWMgcuG7p2kgcm8gY2FvIGjGoW4gY2jhu4kgc+G7kSB0aOG7iyB0csaw4budbmcsIHbhu5tpIG3hu6ljIFZhUiB04burIDMsMyUgxJHhur9uIDMsOCUsIHNvIHbhu5tpIGtob+G6o25nIDIsNCUgY+G7p2EgVk4tSW5kZXguIMSQaeG7gXUgbsOgeSBuaOG6pW4gbeG6oW5oIHLhurFuZyDEkeG6p3UgdMawIHbDoG8gY+G7lSBwaGnhur91IG5nw6BuaCBuZ8OibiBow6BuZywgZMO5IG1hbmcgbOG6oWkgdGnhu4FtIG7Eg25nIHNpbmggbOG7nWksIGPFqW5nIMSR4buTbmcgdGjhu51pIGvDqW8gdGhlbyBy4bunaSBybyBiaeG6v24gxJHhu5luZyBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBkYW5oIG3hu6VjIHRo4buLIHRyxrDhu51uZyBjaHVuZy4NCg0KIyMgKio2LjIuIFZBUiBDSE8gREFOSCBN4bukQyDEkOG6plUgVMavKioNCg0KYGBge3J9DQojIDEuIFRow7RuZyBz4buRIMSR4bqndSB2w6BvDQpjb25maWRlbmNlX2xldmVsIDwtIDAuOTkNCmFscGhhIDwtIDEgLSBjb25maWRlbmNlX2xldmVsDQp6X2FscGhhIDwtIHFub3JtKGFscGhhKQ0KaG9sZGluZ19wZXJpb2QgPC0gMSAgIyAxIG5nw6B5DQoNCiMgMi4gR2nhuqMgxJHhu4tuaCBkYW5oIG3hu6VjIMSR4bqndSB0xrA6IMSR4bqndSB0xrAgMSB04bu3IG3hu5dpIGPhu5UgcGhp4bq/dQ0KdGlja2VycyA8LSBjb2xuYW1lcyhyZXR1cm5zX3h0cykNCndlaWdodHMgPC0gcmVwKDFlOSwgbGVuZ3RoKHRpY2tlcnMpKSAgIyAxIHThu7cgbeG7l2kgbcOjDQpuYW1lcyh3ZWlnaHRzKSA8LSB0aWNrZXJzDQoNCiMgMy4gVMOtbmggbOG7o2kgc3XhuqV0IGvhu7MgduG7jW5nIHbDoCBtYSB0cuG6rW4gaGnhu4dwIHBoxrDGoW5nIHNhaQ0KbWVhbl9yZXR1cm5zIDwtIGNvbE1lYW5zKHJldHVybnNfeHRzLCBuYS5ybSA9IFRSVUUpDQpjb3ZfbWF0cml4IDwtIGNvdihyZXR1cm5zX3h0cywgdXNlID0gImNvbXBsZXRlLm9icyIpDQoNCiMgNC4gVMOtbmggVmFSIGRhbmggbeG7pWMgKHRoZW8gcGjDom4gcGjhu5FpIGNodeG6qW4gY8OzIGhp4buHcCBwaMawxqFuZyBzYWkpDQojIDQuMS4gVOG7lW5nIGdpw6EgdHLhu4sgZGFuaCBt4bulYw0KcG9ydGZvbGlvX3ZhbHVlIDwtIHN1bSh3ZWlnaHRzKQ0KDQojIDQuMi4gVMOtbmggdOG7tyB0cuG7jW5nICglIHbhu5FuKSB0aGVvIHThu6tuZyBj4buVIHBoaeG6v3UNCndfcGN0IDwtIHdlaWdodHMgLyBwb3J0Zm9saW9fdmFsdWUNCg0KIyA0LjMuIEzhu6NpIHN14bqldCBr4buzIHbhu41uZyBkYW5oIG3hu6VjDQptdV9wIDwtIHN1bSh3X3BjdCAqIG1lYW5fcmV0dXJucykNCg0KIyA0LjQuIMSQ4buZIGzhu4djaCBjaHXhuqluIGRhbmggbeG7pWMNCnNpZ21hX3AgPC0gc3FydCh0KHdfcGN0KSAlKiUgY292X21hdHJpeCAlKiUgd19wY3QpDQoNCiMgNC41LiBUw61uaCBWYVINClZhUl9wY3QgPC0gLSAobXVfcCArIHpfYWxwaGEgKiBzaWdtYV9wKSAgIyB0aGVvIHBo4bqnbiB0csSDbQ0KVmFSX3ZuZCA8LSBWYVJfcGN0ICogcG9ydGZvbGlvX3ZhbHVlICAgICAjIHRoZW8gdGnhu4FuDQoNCiMgNS4gS+G6v3QgcXXhuqMNCmNhdCgiPT09IFZhUiBEQU5IIE3hu6RDICg5OSUsIDEgbmfDoHkpID09PVxuIikNCmNhdCgiTOG7o2kgc3XhuqV0IGvhu7MgduG7jW5nOiIsIHJvdW5kKG11X3AsIDYpLCAiXG4iKQ0KY2F0KCLEkOG7mSBs4buHY2ggY2h14bqpbiBkYW5oIG3hu6VjOiIsIHJvdW5kKHNpZ21hX3AsIDYpLCAiXG4iKQ0KY2F0KCJWYVIgKHThu7cgbOG7hyAlKToiLCByb3VuZChWYVJfcGN0ICogMTAwLCA0KSwgIiVcbiIpDQpjYXQoIlZhUiAoVk7EkCk6Iiwgcm91bmQoVmFSX3ZuZCksICJWTkRcbiIpDQpgYGANCg0KKipOSOG6rE4gWMOJVCoqDQoNCiZlbXNwO0vhur90IHF14bqjIMaw4bubYyBsxrDhu6NuZyBWYVIgY2hvIGRhbmggbeG7pWMgxJHhuqd1IHTGsCB24bubaSBnaeG6oyDEkeG7i25oIMSR4bqndSB0xrAgxJHhu5NuZyDEkeG7gXUgKG3hu5dpIG3DoyAxIHThu7cgVk7EkCkgdsOgIHThu5VuZyBnacOhIHRy4buLIGRhbmggbeG7pWMgbMOgIDYgdOG7tyDEkeG7k25nIGNobyB0aOG6pXk6DQoNCi0gTOG7o2kgc3XhuqV0IGvhu7MgduG7jW5nIGjDoG5nIG5nw6B5IGPhu6dhIGRhbmggbeG7pWMg4bufIG3hu6ljIDAuMDM1JSAodMawxqFuZyDEkcawxqFuZyAwLjAwMDM1KSwgcGjhuqNuIMOhbmggbeG7qWMgc2luaCBs4bujaSB0cnVuZyBiw6xuaCB0w61jaCBj4buxYywgZMO5IGtow6EgdGjhuqVwIOKAkyDEkWnhu4F1IGThu4UgaGnhu4N1IHRyb25nIGLhu5FpIGPhuqNuaCBiaeG6v24gxJHhu5luZyBuZ+G6r24gaOG6oW4gY+G7p2EgdGjhu4sgdHLGsOG7nW5nIGNo4bupbmcga2hvw6FuLg0KDQotIMSQ4buZIGzhu4djaCBjaHXhuqluIGzhu6NpIHN14bqldCBkYW5oIG3hu6VjIMSR4bqhdCAwLjAxMjA2NCwgY2hvIHRo4bqleSBt4bupYyBiaeG6v24gxJHhu5luZyBow6BuZyBuZ8OgeSBsw6Aga2hv4bqjbmcgMS4yJS4gxJDDonkgbMOgIG3hu6ljIGJp4bq/biDEkeG7mW5nIHbhu6thIHBo4bqjaSwgdGjhuqVwIGjGoW4gc28gduG7m2kgY8OhYyBj4buVIHBoaeG6v3UgcmnDqm5nIGzhurssIG5o4budIHbDoG8gdMOhYyDEkeG7mW5nIMSRYSBk4bqhbmcgaMOzYSBy4bunaSBybyBnaeG7r2EgY8OhYyB0w6BpIHPhuqNuIHRyb25nIGRhbmggbeG7pWMuDQoNCi0gR2nDoSB0cuG7iyBWYVIgdOG6oWkgbeG7qWMgdGluIGPhuq15IDk5JSBsw6AgMi43NyUsIHThu6ljIGzDoCB24bubaSB4w6FjIHN14bqldCA5OSUsIG3hu6ljIGzhu5cgdOG7kWkgxJFhIGvhu7MgduG7jW5nIGPhu6dhIGRhbmggbeG7pWMgdHJvbmcgbeG7mXQgbmfDoHkga2jDtG5nIHbGsOG7o3QgcXXDoSBt4bupYyBuw6B5Lg0KDQotIENodXnhu4NuIMSR4buVaSBzYW5nIGdpw6EgdHLhu4sgdHV54buHdCDEkeG7kWksIFZhUiBkYW5oIG3hu6VjIGzDoCBraG/huqNuZyAxNjYsMjkgdHJp4buHdSBWTsSQLiDEkGnhu4F1IG7DoHkgxJHhu5NuZyBuZ2jEqWEgduG7m2kgdmnhu4djIG5ow6AgxJHhuqd1IHTGsCBjw7MgdGjhu4MgbeG6pXQgdOG7kWkgxJFhIGtob+G6o25nIDE2NiB0cmnhu4d1IMSR4buTbmcgdHJvbmcgbeG7mXQgbmfDoHkgKHbhu5tpIDElIHjDoWMgc3XhuqV0IHjhuqN5IHJhIHTDrG5oIGh14buRbmcgYuG6pXQgbOG7o2kpLCB0cm9uZyDEkWnhu4F1IGtp4buHbiB0aOG7iyB0csaw4budbmcgYsOsbmggdGjGsOG7nW5nLg0KDQomZW1zcDtL4bq/dCBsdeG6rW4sIGRhbmggbeG7pWMgxJHhuqd1IHTGsCBuw6B5LCBkw7kgY8OzIG3hu6ljIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyB0aOG6pXAsIMSRw6MgdOG6rW4gZOG7pW5nIGhp4buHdSBxdeG6oyBs4bujaSDDrWNoIGPhu6dhIMSRYSBk4bqhbmcgaMOzYSwgdGjhu4MgaGnhu4duIHF1YSDEkeG7mSBs4buHY2ggY2h14bqpbiBkYW5oIG3hu6VjIHRo4bqlcCBoxqFuIG5oaeG7gXUgY+G7lSBwaGnhur91IHRow6BuaCBwaOG6p24sIHbDoCBWYVIgdMawxqFuZyDEkeG7kWkga2nhu4NtIHNvw6F0IMSRxrDhu6NjIHNvIHbhu5tpIFZhUiByacOqbmcgbOG6uyBj4bunYSBjw6FjIG3DoyB0cm9uZyBjw7luZyBkYW5oIG3hu6VjLiDEkMOieSBsw6AgbeG7mXQgbWluaCBjaOG7qW5nIHRo4buxYyBuZ2hp4buHbSB04buRdCBjaG8gdmFpIHRyw7IgY+G7p2EgdOG7kWkgxrB1IGjDs2EgcGjDom4gYuG7lSB0w6BpIHPhuqNuIHRyb25nIHF14bqjbiB0cuG7iyBy4bunaSBybyB0w6BpIGNow61uaC4NCg0KIyAqKjcuIFNPIFPDgU5IIEzhu6JJIFNV4bqkVCBE4buwIELDgU8gVsOAIEzhu6JJIFNV4bqkVCBUSOG7sEMgVOG6vioqDQoNCmBgYHtyfQ0KbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykNCmxpYnJhcnkoa25pdHIpDQoNCiMgMS4gVMOtbmggbOG7o2kgc3XhuqV0IHRo4buxYyB04bq/IGFubnVhbGl6ZWQgdOG7qyByZXRzIChsb2cgcmV0dXJuKQ0KYWN0dWFsX2RmIDwtIGRhdGEuZnJhbWUoDQogIFN0b2NrICAgICA9IGNvbG5hbWVzKHJldHMpLA0KICBBY3R1YWxfRVIgPSBhcy5udW1lcmljKFJldHVybi5hbm51YWxpemVkKHJldHMsIHNjYWxlID0gMjUyKSkgKiAxMDANCikNCg0KIyAyLiBH4buZcCB24bubaSBr4bq/dCBxdeG6oyB04burIENBUE0NCmNvbXBhcmVfZGYgPC0gbWVyZ2UoDQogIGNhcG1fZGZbLCBjKCJTdG9jayIsICJFUl9DQVBNIildLA0KICBhY3R1YWxfZGYsDQogIGJ5ID0gIlN0b2NrIg0KKQ0KY29tcGFyZV9kZiRFUl9DQVBNIDwtIGNvbXBhcmVfZGYkRVJfQ0FQTSAqIDEwMA0KY29tcGFyZV9kZiREaWZmICAgIDwtIGNvbXBhcmVfZGYkQWN0dWFsX0VSIC0gY29tcGFyZV9kZiRFUl9DQVBNDQoNCiMgMy4gSGnhu4NuIHRo4buLIGLhuqNuZw0Ka2FibGUoDQogIGNvbXBhcmVfZGYsDQogIGNvbC5uYW1lcyA9IGMoIk3DoyIsICJDQVBNICglKSIsICJUaOG7sWMgdOG6vyAoJSkiLCAiQ2jDqm5oIGzhu4djaCAoJSkiKSwNCiAgZGlnaXRzID0gMiwNCiAgY2FwdGlvbiA9ICJTbyBzw6FuaCBs4bujaSBzdeG6pXQga+G7syB24buNbmcgQ0FQTSB2w6AgbOG7o2kgc3XhuqV0IHRo4buxYyB04bq/IChBbm51YWxpemVkKSINCikNCmBgYA0KDQoqKk5I4bqsTiBYw4lUKioNCg0KJmVtc3A7QuG6o25nIGvhur90IHF14bqjIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgZ2nhu69hIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyB0aGVvIG3DtCBow6xuaCBDQVBNIHbDoCBs4bujaSBzdeG6pXQgdGjhu7FjIHThur8gYW5udWFsaXplZCBj4bunYSBjw6FjIGPhu5UgcGhp4bq/dSBuZ8OibiBow6BuZyB0cm9uZyBkYW5oIG3hu6VjLiDEkGEgcGjhuqduIGPDoWMgY+G7lSBwaGnhur91IMSR4buBdSBjw7MgbOG7o2kgc3XhuqV0IHRo4buxYyB04bq/IHRo4bqlcCBoxqFuIG5oaeG7gXUgc28gduG7m2kgbeG7qWMgbOG7o2kgc3XhuqV0IG3DoCBtw7QgaMOsbmggQ0FQTSBk4buxIMSRb8Ohbi4gDQoNCi0gQ+G7pSB0aOG7gywgQUNCIHbDoCBCSUQgY8OzIG3hu6ljIGNow6puaCBs4buHY2ggbOG6p24gbMaw4bujdCBsw6AgLTE2LjA5JSB2w6AgLTE1LjQyJSwgY2hvIHRo4bqleSBoaeG7h3UgcXXhuqMgc2luaCBs4budaSB0aOG7sWMgdOG6vyBy4bqldCBrw6ltIHNvIHbhu5tpIG3hu6ljIHBo4bqnbiBiw7kgcuG7p2kgcm8ga+G7syB24buNbmcuIA0KDQotIE9DQiB2w6AgVlBCIGPFqW5nIGdoaSBuaOG6rW4gbeG7qWMgY2jDqm5oIGzhu4djaCDDom0gxJHDoW5nIGvhu4MsIGzhuqduIGzGsOG7o3QgbMOgIC0xMi4wMSUgdsOgIC0xMy40NyUsIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDoWMgY+G7lSBwaGnhur91IG7DoHkgY8OzIHRo4buDIMSRYW5nIGLhu4sgxJHhu4tuaCBnacOhIGNhbyBzbyB24bubaSBnacOhIHRy4buLIHRo4buxYyB04bq/IHRyw6puIHRo4buLIHRyxrDhu51uZywgaG/hurdjIGNo4buLdSDhuqNuaCBoxrDhu59uZyB04burIGPDoWMgeeG6v3UgdOG7kSBwaGkgaOG7hyB0aOG7kW5nIG3DoCBtw7QgaMOsbmggQ0FQTSBraMO0bmcgcGjhuqNuIMOhbmggxJHGsOG7o2MuDQoNCi0gTmfGsOG7o2MgbOG6oWksIENURyBsw6AgY+G7lSBwaGnhur91IGR1eSBuaOG6pXQgY8OzIGzhu6NpIHN14bqldCB0aOG7sWMgdOG6vyB2xrDhu6N0IHhhIGzhu6NpIHN14bqldCBr4buzIHbhu41uZyB04burIG3DtCBow6xuaCwgduG7m2kgY2jDqm5oIGzhu4djaCBkxrDGoW5nIDE0LjY4JS4gxJBp4buBdSBuw6B5IGjDoG0gw70gcuG6sW5nIENURyBjw7MgdGjhu4MgxJFhbmcgYuG7iyDEkeG7i25oIGdpw6EgdGjhuqVwIGhv4bq3YyBz4bufIGjhu691IG5o4buvbmcgeeG6v3UgdOG7kSBu4buZaSB04bqhaSB0w61jaCBj4buxYyB2xrDhu6N0IG5nb8OgaSBwaOG6oW0gdmkgbMO9IGdp4bqjaSBj4bunYSBDQVBNLCBjaOG6s25nIGjhuqFuIG5oxrAga2jhuqMgbsSDbmcgc2luaCBs4budaSBjYW8gaMahbiwgcXXhuqNuIHRy4buLIGhp4buHdSBxdeG6oywgaG/hurdjIHRyaeG7g24gduG7jW5nIHTEg25nIHRyxrDhu59uZyB0w61jaCBj4buxYyB0cm9uZyBt4bqvdCBuaMOgIMSR4bqndSB0xrAuDQoNCg0KDQo=