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:
- Historical Simulation
- Parametric (Gaussian) VaR
- Monte Carlo Simulation
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
- VaR across methods consistently estimates losses of
approximately 1.1% of the portfolio value at a 95%
confidence level.
- ES highlights that, in the worst-case scenarios:
- Losses could average up to 1.56% (Historical) or
1.41% (Monte Carlo).
- 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