Aim: This project estimates the Value at Risk (VaR) and Expected Shortfall (ES) of a financial portfolio using historical simulation, parametric methods, and Monte Carlo simulations. The analysis is performed on stock market data obtained from Yahoo Finance.

Step 1. Setup and Libraries


# Load Required Libraries
library(quantmod)       # For financial data
library(PerformanceAnalytics)  # Risk analysis functions
library(tidyverse)      # Data manipulation and visualization
library(xts)            # Time-series data handling

Step2: Data Collection

Here, we collect stock price data for a portfolio of 3 stocks: AAPL (Apple), MSFT (Microsoft), and GOOG (Google)

# Define stock symbols
symbols <- c("AAPL", "MSFT", "GOOG")

# Download historical stock data from Yahoo Finance
getSymbols(symbols, src = "yahoo", from = "2020-01-01", to = "2024-01-01", auto.assign = TRUE)
[1] "AAPL" "MSFT" "GOOG"
# Combine adjusted closing prices into one data frame
portfolio_prices <- merge(Ad(AAPL), Ad(MSFT), Ad(GOOG))
colnames(portfolio_prices) <- symbols

# Calculate daily returns
portfolio_returns <- dailyReturn(portfolio_prices)

# Display the first few rows of data
head(portfolio_returns)
           daily.returns
2020-01-02   0.000000000
2020-01-03  -0.009721828
2020-01-06   0.007968350
2020-01-07  -0.004703147
2020-01-08   0.016086074
2020-01-09   0.021241232

Step3. Portfolio Construction

We assign equal weights to the three stocks in the portfolio.

# Define portfolio weights
weights <- c(1/3, 1/3, 1/3)

# Calculate portfolio returns
portfolio_returns$Portfolio <- rowSums(portfolio_returns * weights)
Warning: longer object length is not a multiple of shorter object length
# Plot portfolio returns
chart.CumReturns(portfolio_returns$Portfolio, main = "Cumulative Returns of the Portfolio", col = "blue")

Step4. Value at Risk (VaR) Estimation

We calculate VaR using three methods:

4.1 Historical Simulation

VaR is calculated based on the historical distribution of returns.

# Confidence level
conf_level <- 0.95

# Historical VaR
VaR_hist <- quantile(portfolio_returns$Portfolio, probs = 1 - conf_level)
print(paste("Historical VaR at 95% confidence:", round(VaR_hist, 4)))
[1] "Historical VaR at 95% confidence: -0.0108"

4.2 Parametric (Gaussian) VaR

VaR is estimated assuming returns follow a normal distribution.

# Mean and standard deviation of portfolio returns
mean_ret <- mean(portfolio_returns$Portfolio, na.rm = TRUE)
sd_ret <- sd(portfolio_returns$Portfolio, na.rm = TRUE)

# Parametric VaR
VaR_param <- mean_ret + qnorm(1 - conf_level) * sd_ret
print(paste("Parametric VaR at 95% confidence:", round(VaR_param, 4)))
[1] "Parametric VaR at 95% confidence: -0.0112"

4.3 Monte Carlo Simulation

Simulate thousands of potential returns to estimate VaR.

# Number of simulations
n_sim <- 10000

# Simulate portfolio returns
simulated_returns <- rnorm(n_sim, mean = mean_ret, sd = sd_ret)

# Monte Carlo VaR
VaR_mc <- quantile(simulated_returns, probs = 1 - conf_level)
print(paste("Monte Carlo VaR at 95% confidence:", round(VaR_mc, 4)))
[1] "Monte Carlo VaR at 95% confidence: -0.0112"
# Plot simulated returns
hist(simulated_returns, breaks = 50, col = "skyblue", main = "Monte Carlo Simulated Returns", xlab = "Returns")
abline(v = VaR_mc, col = "red", lwd = 2, lty = 2)

5. Expected Shortfall (ES) Calculation

The Expected Shortfall (Conditional VaR) is the average loss beyond the VaR threshold.

# Historical Expected Shortfall
ES_hist <- mean(portfolio_returns$Portfolio[portfolio_returns$Portfolio <= VaR_hist])
print(paste("Historical Expected Shortfall at 95% confidence:", round(ES_hist, 4)))
[1] "Historical Expected Shortfall at 95% confidence: -0.0156"
# Monte Carlo Expected Shortfall
ES_mc <- mean(simulated_returns[simulated_returns <= VaR_mc])
print(paste("Monte Carlo Expected Shortfall at 95% confidence:", round(ES_mc, 4)))
[1] "Monte Carlo Expected Shortfall at 95% confidence: -0.0141"

6. Results and Comparison

Summarize the results of VaR and Expected Shortfall:

# Results Table
results <- data.frame(
  Method = c("Historical", "Parametric", "Monte Carlo"),
  VaR = c(VaR_hist, VaR_param, VaR_mc),
  ES = c(ES_hist, NA, ES_mc)
)
print(results)
NA

Interpretation of Results

The results below provide insights into the Value at Risk (VaR) and Expected Shortfall (ES) of the portfolio at a 95% confidence level:

Method VaR ES
Historical -0.0108 (1.08%) -0.0156 (1.56%)
Parametric -0.0112 (1.12%) NA
Monte Carlo -0.0112 (1.12%) -0.0141 (1.41%)

1. Value at Risk (VaR)

  • Definition: VaR estimates the maximum loss the portfolio is expected to incur over a given time horizon (e.g., 1 day), at a 95% confidence level.
  • Results:
    • Historical VaR: -1.08%
      The worst 5% of historical daily returns resulted in losses greater than 1.08% of the portfolio value.
    • Parametric VaR: -1.12%
      Assuming a normal distribution of returns, the maximum loss is approximately 1.12%.
    • Monte Carlo VaR: -1.12%
      Using simulated returns, the portfolio’s maximum expected loss is also 1.12%.
    Conclusion: The VaR values are very close across all methods, which indicates a consistent risk level, regardless of the approach. Historical data and simulated data agree on the potential loss.

2. Expected Shortfall (ES)

  • Definition: ES (or Conditional VaR) measures the average loss beyond the VaR threshold (i.e., in the worst-case scenarios).
  • Results:
    • Historical ES: -1.56%
      If losses exceed the VaR level, the average loss in such cases is 1.56%.
    • Monte Carlo ES: -1.41%
      Based on simulated returns, the average loss in the worst-case scenarios is 1.41%.
    • Parametric ES: NA
      ES is not calculated in the parametric method here because it requires additional steps beyond Gaussian VaR.
    Conclusion: The Expected Shortfall is higher than VaR, as expected. ES provides a more conservative measure of risk by focusing on extreme losses beyond the VaR level. Historical ES is slightly higher than Monte Carlo ES, reflecting the actual extreme losses observed in historical data.

Key Insights

  1. VaR across methods consistently estimates losses of approximately 1.1% of the portfolio value at a 95% confidence level.
  2. ES highlights that, in the worst-case scenarios:
    • Losses could average up to 1.56% (Historical) or 1.41% (Monte Carlo).
  3. Comparison:
    • Historical VaR/ES is based on actual observed returns.
    • Monte Carlo simulations are slightly more conservative and smooth out outliers.
    • Parametric methods assume normality, which simplifies computations but ignores heavy tails in real data.

Risk Management Implications

  • If managing a portfolio worth $1,000,000:
    • VaR: The potential loss over 1 day at a 95% confidence level is approximately $11,200.
    • ES: In extreme conditions, the average loss could be up to $15,600.
  • Recommendation:
    • Rely on Expected Shortfall (ES) for better risk management, as it captures extreme risks better than VaR.
    • Use Monte Carlo simulations for stress testing under uncertain market conditions.
LS0tCnRpdGxlOiAiVmFsdWUgYXQgUmlzayAoVmFSKSBhbmQgRXhwZWN0ZWQgU2hvcnRmYWxsIgphdXRob3IgOiBKZWJpbiBKZXJ2aXMgCmVtYWlsIDogamViaW4uamVydmlzMkBtYWlsLmRjdS5pZSAKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIEFpbTogVGhpcyBwcm9qZWN0IGVzdGltYXRlcyB0aGUgVmFsdWUgYXQgUmlzayAoVmFSKSBhbmQgRXhwZWN0ZWQgU2hvcnRmYWxsIChFUykgb2YgYSBmaW5hbmNpYWwgcG9ydGZvbGlvIHVzaW5nIGhpc3RvcmljYWwgc2ltdWxhdGlvbiwgcGFyYW1ldHJpYyBtZXRob2RzLCBhbmQgTW9udGUgQ2FybG8gc2ltdWxhdGlvbnMuIFRoZSBhbmFseXNpcyBpcyBwZXJmb3JtZWQgb24gc3RvY2sgbWFya2V0IGRhdGEgb2J0YWluZWQgZnJvbSBZYWhvbyBGaW5hbmNlLgoKIyMgU3RlcCAxLiBTZXR1cCBhbmQgTGlicmFyaWVzCgpgYGB7cn0KCiMgTG9hZCBSZXF1aXJlZCBMaWJyYXJpZXMKbGlicmFyeShxdWFudG1vZCkgICAgICAgIyBGb3IgZmluYW5jaWFsIGRhdGEKbGlicmFyeShQZXJmb3JtYW5jZUFuYWx5dGljcykgICMgUmlzayBhbmFseXNpcyBmdW5jdGlvbnMKbGlicmFyeSh0aWR5dmVyc2UpICAgICAgIyBEYXRhIG1hbmlwdWxhdGlvbiBhbmQgdmlzdWFsaXphdGlvbgpsaWJyYXJ5KHh0cykgICAgICAgICAgICAjIFRpbWUtc2VyaWVzIGRhdGEgaGFuZGxpbmcKCgpgYGAKCiMjIFN0ZXAyOiBEYXRhIENvbGxlY3Rpb24KSGVyZSwgd2UgY29sbGVjdCBzdG9jayBwcmljZSBkYXRhIGZvciBhIHBvcnRmb2xpbyBvZiAzIHN0b2NrczogQUFQTCAoQXBwbGUpLCBNU0ZUIChNaWNyb3NvZnQpLCBhbmQgR09PRyAoR29vZ2xlKQoKYGBge3J9CiMgRGVmaW5lIHN0b2NrIHN5bWJvbHMKc3ltYm9scyA8LSBjKCJBQVBMIiwgIk1TRlQiLCAiR09PRyIpCgojIERvd25sb2FkIGhpc3RvcmljYWwgc3RvY2sgZGF0YSBmcm9tIFlhaG9vIEZpbmFuY2UKZ2V0U3ltYm9scyhzeW1ib2xzLCBzcmMgPSAieWFob28iLCBmcm9tID0gIjIwMjAtMDEtMDEiLCB0byA9ICIyMDI0LTAxLTAxIiwgYXV0by5hc3NpZ24gPSBUUlVFKQoKIyBDb21iaW5lIGFkanVzdGVkIGNsb3NpbmcgcHJpY2VzIGludG8gb25lIGRhdGEgZnJhbWUKcG9ydGZvbGlvX3ByaWNlcyA8LSBtZXJnZShBZChBQVBMKSwgQWQoTVNGVCksIEFkKEdPT0cpKQpjb2xuYW1lcyhwb3J0Zm9saW9fcHJpY2VzKSA8LSBzeW1ib2xzCgojIENhbGN1bGF0ZSBkYWlseSByZXR1cm5zCnBvcnRmb2xpb19yZXR1cm5zIDwtIGRhaWx5UmV0dXJuKHBvcnRmb2xpb19wcmljZXMpCgojIERpc3BsYXkgdGhlIGZpcnN0IGZldyByb3dzIG9mIGRhdGEKaGVhZChwb3J0Zm9saW9fcmV0dXJucykKCmBgYAoKIyMgU3RlcDMuIFBvcnRmb2xpbyBDb25zdHJ1Y3Rpb24KV2UgYXNzaWduIGVxdWFsIHdlaWdodHMgdG8gdGhlIHRocmVlIHN0b2NrcyBpbiB0aGUgcG9ydGZvbGlvLgpgYGB7cn0KIyBEZWZpbmUgcG9ydGZvbGlvIHdlaWdodHMKd2VpZ2h0cyA8LSBjKDEvMywgMS8zLCAxLzMpCgojIENhbGN1bGF0ZSBwb3J0Zm9saW8gcmV0dXJucwpwb3J0Zm9saW9fcmV0dXJucyRQb3J0Zm9saW8gPC0gcm93U3Vtcyhwb3J0Zm9saW9fcmV0dXJucyAqIHdlaWdodHMpCgojIFBsb3QgcG9ydGZvbGlvIHJldHVybnMKY2hhcnQuQ3VtUmV0dXJucyhwb3J0Zm9saW9fcmV0dXJucyRQb3J0Zm9saW8sIG1haW4gPSAiQ3VtdWxhdGl2ZSBSZXR1cm5zIG9mIHRoZSBQb3J0Zm9saW8iLCBjb2wgPSAiYmx1ZSIpCgpgYGAKIyMgU3RlcDQuIFZhbHVlIGF0IFJpc2sgKFZhUikgRXN0aW1hdGlvbgpXZSBjYWxjdWxhdGUgVmFSIHVzaW5nIHRocmVlIG1ldGhvZHM6CgoqIEhpc3RvcmljYWwgU2ltdWxhdGlvbgoqIFBhcmFtZXRyaWMgKEdhdXNzaWFuKSBWYVIKKiBNb250ZSBDYXJsbyBTaW11bGF0aW9uCgojIyMgNC4xIEhpc3RvcmljYWwgU2ltdWxhdGlvbgoKVmFSIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgZGlzdHJpYnV0aW9uIG9mIHJldHVybnMuCmBgYHtyfQojIENvbmZpZGVuY2UgbGV2ZWwKY29uZl9sZXZlbCA8LSAwLjk1CgojIEhpc3RvcmljYWwgVmFSClZhUl9oaXN0IDwtIHF1YW50aWxlKHBvcnRmb2xpb19yZXR1cm5zJFBvcnRmb2xpbywgcHJvYnMgPSAxIC0gY29uZl9sZXZlbCkKcHJpbnQocGFzdGUoIkhpc3RvcmljYWwgVmFSIGF0IDk1JSBjb25maWRlbmNlOiIsIHJvdW5kKFZhUl9oaXN0LCA0KSkpCgpgYGAKCiMjIyA0LjIgUGFyYW1ldHJpYyAoR2F1c3NpYW4pIFZhUgoKVmFSIGlzIGVzdGltYXRlZCBhc3N1bWluZyByZXR1cm5zIGZvbGxvdyBhIG5vcm1hbCBkaXN0cmlidXRpb24uCmBgYHtyfQojIE1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBwb3J0Zm9saW8gcmV0dXJucwptZWFuX3JldCA8LSBtZWFuKHBvcnRmb2xpb19yZXR1cm5zJFBvcnRmb2xpbywgbmEucm0gPSBUUlVFKQpzZF9yZXQgPC0gc2QocG9ydGZvbGlvX3JldHVybnMkUG9ydGZvbGlvLCBuYS5ybSA9IFRSVUUpCgojIFBhcmFtZXRyaWMgVmFSClZhUl9wYXJhbSA8LSBtZWFuX3JldCArIHFub3JtKDEgLSBjb25mX2xldmVsKSAqIHNkX3JldApwcmludChwYXN0ZSgiUGFyYW1ldHJpYyBWYVIgYXQgOTUlIGNvbmZpZGVuY2U6Iiwgcm91bmQoVmFSX3BhcmFtLCA0KSkpCgpgYGAKIyMjIDQuMyBNb250ZSBDYXJsbyBTaW11bGF0aW9uCgpTaW11bGF0ZSB0aG91c2FuZHMgb2YgcG90ZW50aWFsIHJldHVybnMgdG8gZXN0aW1hdGUgVmFSLgpgYGB7cn0KIyBOdW1iZXIgb2Ygc2ltdWxhdGlvbnMKbl9zaW0gPC0gMTAwMDAKCiMgU2ltdWxhdGUgcG9ydGZvbGlvIHJldHVybnMKc2ltdWxhdGVkX3JldHVybnMgPC0gcm5vcm0obl9zaW0sIG1lYW4gPSBtZWFuX3JldCwgc2QgPSBzZF9yZXQpCgojIE1vbnRlIENhcmxvIFZhUgpWYVJfbWMgPC0gcXVhbnRpbGUoc2ltdWxhdGVkX3JldHVybnMsIHByb2JzID0gMSAtIGNvbmZfbGV2ZWwpCnByaW50KHBhc3RlKCJNb250ZSBDYXJsbyBWYVIgYXQgOTUlIGNvbmZpZGVuY2U6Iiwgcm91bmQoVmFSX21jLCA0KSkpCgojIFBsb3Qgc2ltdWxhdGVkIHJldHVybnMKaGlzdChzaW11bGF0ZWRfcmV0dXJucywgYnJlYWtzID0gNTAsIGNvbCA9ICJza3libHVlIiwgbWFpbiA9ICJNb250ZSBDYXJsbyBTaW11bGF0ZWQgUmV0dXJucyIsIHhsYWIgPSAiUmV0dXJucyIpCmFibGluZSh2ID0gVmFSX21jLCBjb2wgPSAicmVkIiwgbHdkID0gMiwgbHR5ID0gMikKCmBgYAoKIyMgNS4gRXhwZWN0ZWQgU2hvcnRmYWxsIChFUykgQ2FsY3VsYXRpb24KVGhlIEV4cGVjdGVkIFNob3J0ZmFsbCAoQ29uZGl0aW9uYWwgVmFSKSBpcyB0aGUgYXZlcmFnZSBsb3NzIGJleW9uZCB0aGUgVmFSIHRocmVzaG9sZC4KYGBge3J9CiMgSGlzdG9yaWNhbCBFeHBlY3RlZCBTaG9ydGZhbGwKRVNfaGlzdCA8LSBtZWFuKHBvcnRmb2xpb19yZXR1cm5zJFBvcnRmb2xpb1twb3J0Zm9saW9fcmV0dXJucyRQb3J0Zm9saW8gPD0gVmFSX2hpc3RdKQpwcmludChwYXN0ZSgiSGlzdG9yaWNhbCBFeHBlY3RlZCBTaG9ydGZhbGwgYXQgOTUlIGNvbmZpZGVuY2U6Iiwgcm91bmQoRVNfaGlzdCwgNCkpKQoKIyBNb250ZSBDYXJsbyBFeHBlY3RlZCBTaG9ydGZhbGwKRVNfbWMgPC0gbWVhbihzaW11bGF0ZWRfcmV0dXJuc1tzaW11bGF0ZWRfcmV0dXJucyA8PSBWYVJfbWNdKQpwcmludChwYXN0ZSgiTW9udGUgQ2FybG8gRXhwZWN0ZWQgU2hvcnRmYWxsIGF0IDk1JSBjb25maWRlbmNlOiIsIHJvdW5kKEVTX21jLCA0KSkpCgpgYGAKCiMjIDYuIFJlc3VsdHMgYW5kIENvbXBhcmlzb24KU3VtbWFyaXplIHRoZSByZXN1bHRzIG9mIFZhUiBhbmQgRXhwZWN0ZWQgU2hvcnRmYWxsOgpgYGB7cn0KIyBSZXN1bHRzIFRhYmxlCnJlc3VsdHMgPC0gZGF0YS5mcmFtZSgKICBNZXRob2QgPSBjKCJIaXN0b3JpY2FsIiwgIlBhcmFtZXRyaWMiLCAiTW9udGUgQ2FybG8iKSwKICBWYVIgPSBjKFZhUl9oaXN0LCBWYVJfcGFyYW0sIFZhUl9tYyksCiAgRVMgPSBjKEVTX2hpc3QsIE5BLCBFU19tYykKKQpwcmludChyZXN1bHRzKQoKYGBgCgojIyMgKipJbnRlcnByZXRhdGlvbiBvZiBSZXN1bHRzKioKClRoZSByZXN1bHRzIGJlbG93IHByb3ZpZGUgaW5zaWdodHMgaW50byB0aGUgKipWYWx1ZSBhdCBSaXNrIChWYVIpKiogYW5kICoqRXhwZWN0ZWQgU2hvcnRmYWxsIChFUykqKiBvZiB0aGUgcG9ydGZvbGlvIGF0IGEgKio5NSUgY29uZmlkZW5jZSBsZXZlbCoqOgoKfCAqKk1ldGhvZCoqICAgICAgIHwgKipWYVIqKiAgICAgICAgICB8ICoqRVMqKiAgICAgICAgICAgfAp8LS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tfAp8ICoqSGlzdG9yaWNhbCoqICAgIHwgLTAuMDEwOCAoMS4wOCUpIHwgLTAuMDE1NiAoMS41NiUpIHwKfCAqKlBhcmFtZXRyaWMqKiAgICB8IC0wLjAxMTIgKDEuMTIlKSB8IE5BICAgICAgICAgICAgICAgfAp8ICoqTW9udGUgQ2FybG8qKiAgIHwgLTAuMDExMiAoMS4xMiUpIHwgLTAuMDE0MSAoMS40MSUpIHwKCi0tLQoKIyMjICoqMS4gVmFsdWUgYXQgUmlzayAoVmFSKSoqCi0gKipEZWZpbml0aW9uKio6IFZhUiBlc3RpbWF0ZXMgdGhlICoqbWF4aW11bSBsb3NzKiogdGhlIHBvcnRmb2xpbyBpcyBleHBlY3RlZCB0byBpbmN1ciBvdmVyIGEgZ2l2ZW4gdGltZSBob3Jpem9uIChlLmcuLCAxIGRheSksIGF0IGEgOTUlIGNvbmZpZGVuY2UgbGV2ZWwuCi0gKipSZXN1bHRzKio6CiAgIC0gKipIaXN0b3JpY2FsIFZhUioqOiAtMS4wOCUgIAogICAgIFRoZSB3b3JzdCA1JSBvZiBoaXN0b3JpY2FsIGRhaWx5IHJldHVybnMgcmVzdWx0ZWQgaW4gbG9zc2VzIGdyZWF0ZXIgdGhhbiAqKjEuMDglKiogb2YgdGhlIHBvcnRmb2xpbyB2YWx1ZS4KICAgLSAqKlBhcmFtZXRyaWMgVmFSKio6IC0xLjEyJSAgCiAgICAgQXNzdW1pbmcgYSAqKm5vcm1hbCBkaXN0cmlidXRpb24qKiBvZiByZXR1cm5zLCB0aGUgbWF4aW11bSBsb3NzIGlzIGFwcHJveGltYXRlbHkgKioxLjEyJSoqLgogICAtICoqTW9udGUgQ2FybG8gVmFSKio6IC0xLjEyJSAgCiAgICAgVXNpbmcgc2ltdWxhdGVkIHJldHVybnMsIHRoZSBwb3J0Zm9saW8ncyBtYXhpbXVtIGV4cGVjdGVkIGxvc3MgaXMgYWxzbyAqKjEuMTIlKiouCgogICAqKkNvbmNsdXNpb24qKjogVGhlICoqVmFSIHZhbHVlcyoqIGFyZSB2ZXJ5IGNsb3NlIGFjcm9zcyBhbGwgbWV0aG9kcywgd2hpY2ggaW5kaWNhdGVzIGEgY29uc2lzdGVudCByaXNrIGxldmVsLCByZWdhcmRsZXNzIG9mIHRoZSBhcHByb2FjaC4gSGlzdG9yaWNhbCBkYXRhIGFuZCBzaW11bGF0ZWQgZGF0YSBhZ3JlZSBvbiB0aGUgcG90ZW50aWFsIGxvc3MuCgotLS0KCiMjIyAqKjIuIEV4cGVjdGVkIFNob3J0ZmFsbCAoRVMpKioKLSAqKkRlZmluaXRpb24qKjogRVMgKG9yIENvbmRpdGlvbmFsIFZhUikgbWVhc3VyZXMgdGhlICoqYXZlcmFnZSBsb3NzKiogYmV5b25kIHRoZSBWYVIgdGhyZXNob2xkIChpLmUuLCBpbiB0aGUgd29yc3QtY2FzZSBzY2VuYXJpb3MpLgotICoqUmVzdWx0cyoqOgogICAtICoqSGlzdG9yaWNhbCBFUyoqOiAtMS41NiUgIAogICAgIElmIGxvc3NlcyBleGNlZWQgdGhlICoqVmFSIGxldmVsKiosIHRoZSBhdmVyYWdlIGxvc3MgaW4gc3VjaCBjYXNlcyBpcyAqKjEuNTYlKiouCiAgIC0gKipNb250ZSBDYXJsbyBFUyoqOiAtMS40MSUgIAogICAgIEJhc2VkIG9uIHNpbXVsYXRlZCByZXR1cm5zLCB0aGUgYXZlcmFnZSBsb3NzIGluIHRoZSB3b3JzdC1jYXNlIHNjZW5hcmlvcyBpcyAqKjEuNDElKiouCiAgIC0gKipQYXJhbWV0cmljIEVTKio6ICoqTkEqKiAgCiAgICAgRVMgaXMgbm90IGNhbGN1bGF0ZWQgaW4gdGhlIHBhcmFtZXRyaWMgbWV0aG9kIGhlcmUgYmVjYXVzZSBpdCByZXF1aXJlcyBhZGRpdGlvbmFsIHN0ZXBzIGJleW9uZCBHYXVzc2lhbiBWYVIuCgogICAqKkNvbmNsdXNpb24qKjogVGhlICoqRXhwZWN0ZWQgU2hvcnRmYWxsKiogaXMgaGlnaGVyIHRoYW4gVmFSLCBhcyBleHBlY3RlZC4gRVMgcHJvdmlkZXMgYSAqKm1vcmUgY29uc2VydmF0aXZlIG1lYXN1cmUgb2YgcmlzayoqIGJ5IGZvY3VzaW5nIG9uIGV4dHJlbWUgbG9zc2VzIGJleW9uZCB0aGUgVmFSIGxldmVsLiBIaXN0b3JpY2FsIEVTIGlzIHNsaWdodGx5IGhpZ2hlciB0aGFuIE1vbnRlIENhcmxvIEVTLCByZWZsZWN0aW5nIHRoZSBhY3R1YWwgZXh0cmVtZSBsb3NzZXMgb2JzZXJ2ZWQgaW4gaGlzdG9yaWNhbCBkYXRhLgoKLS0tCgojIyMgKipLZXkgSW5zaWdodHMqKgoxLiAqKlZhUioqIGFjcm9zcyBtZXRob2RzIGNvbnNpc3RlbnRseSBlc3RpbWF0ZXMgbG9zc2VzIG9mIGFwcHJveGltYXRlbHkgKioxLjElKiogb2YgdGhlIHBvcnRmb2xpbyB2YWx1ZSBhdCBhIDk1JSBjb25maWRlbmNlIGxldmVsLgoyLiAqKkVTKiogaGlnaGxpZ2h0cyB0aGF0LCBpbiB0aGUgd29yc3QtY2FzZSBzY2VuYXJpb3M6CiAgIC0gTG9zc2VzIGNvdWxkIGF2ZXJhZ2UgdXAgdG8gKioxLjU2JSoqIChIaXN0b3JpY2FsKSBvciAqKjEuNDElKiogKE1vbnRlIENhcmxvKS4KMy4gKipDb21wYXJpc29uKio6CiAgIC0gSGlzdG9yaWNhbCBWYVIvRVMgaXMgYmFzZWQgb24gYWN0dWFsIG9ic2VydmVkIHJldHVybnMuCiAgIC0gTW9udGUgQ2FybG8gc2ltdWxhdGlvbnMgYXJlIHNsaWdodGx5IG1vcmUgY29uc2VydmF0aXZlIGFuZCBzbW9vdGggb3V0IG91dGxpZXJzLgogICAtIFBhcmFtZXRyaWMgbWV0aG9kcyBhc3N1bWUgbm9ybWFsaXR5LCB3aGljaCBzaW1wbGlmaWVzIGNvbXB1dGF0aW9ucyBidXQgaWdub3JlcyBoZWF2eSB0YWlscyBpbiByZWFsIGRhdGEuCgotLS0KCiMjIyAqKlJpc2sgTWFuYWdlbWVudCBJbXBsaWNhdGlvbnMqKgotIElmIG1hbmFnaW5nIGEgcG9ydGZvbGlvIHdvcnRoICoqJDEsMDAwLDAwMCoqOgogICAtICoqVmFSKio6IFRoZSBwb3RlbnRpYWwgbG9zcyBvdmVyIDEgZGF5IGF0IGEgOTUlIGNvbmZpZGVuY2UgbGV2ZWwgaXMgYXBwcm94aW1hdGVseSAqKiQxMSwyMDAqKi4KICAgLSAqKkVTKio6IEluIGV4dHJlbWUgY29uZGl0aW9ucywgdGhlIGF2ZXJhZ2UgbG9zcyBjb3VsZCBiZSB1cCB0byAqKiQxNSw2MDAqKi4KLSAqKlJlY29tbWVuZGF0aW9uKio6CiAgIC0gUmVseSBvbiAqKkV4cGVjdGVkIFNob3J0ZmFsbCAoRVMpKiogZm9yIGJldHRlciByaXNrIG1hbmFnZW1lbnQsIGFzIGl0IGNhcHR1cmVzIGV4dHJlbWUgcmlza3MgYmV0dGVyIHRoYW4gVmFSLgogICAtIFVzZSBNb250ZSBDYXJsbyBzaW11bGF0aW9ucyBmb3Igc3RyZXNzIHRlc3RpbmcgdW5kZXIgdW5jZXJ0YWluIG1hcmtldCBjb25kaXRpb25zLgoK