About

This worksheet looks at VaR calculations for the two cases of single and multiple equity asset. This is the last lab worksheet, other than the extra credit assignment.

Setup

Remember to always set your working directory to the source file location. Go to ‘Session’, scroll down to ‘Set Working Directory’, and click ‘To Source File Location’. Read carefully the below and follow the instructions to complete the tasks and answer any questions. Submit your work to RPubs as detailed in previous notes.

Note

Always read carefully the instructions on Sakai. For clarity, tasks/questions to be completed/answered are highlighted in red color (visible in preview) and numbered according to their particular placement in the task section. Quite often you will need to add your own code chunk.

Execute all code chunks, preview, publish, and submit link on Sakai follwoing the naming convention. Make sure to add comments to your code where appropriate. Use own language!


Task 1: VaR Calculations: Single Equity Asset

#Install package quantmod 
install.packages("quantmod")
Installing package into <U+393C><U+3E31>C:/Users/rtrsa/OneDrive/Documents/R/win-library/3.5<U+393C><U+3E32>
(as <U+393C><U+3E31>lib<U+393C><U+3E32> is unspecified)
trying URL 'https://cran.rstudio.com/bin/windows/contrib/3.5/quantmod_0.4-13.zip'
Content type 'application/zip' length 939983 bytes (917 KB)
downloaded 917 KB
package ‘quantmod’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\rtrsa\AppData\Local\Temp\RtmpC2VlBN\downloaded_packages
library("quantmod")
package <U+393C><U+3E31>quantmod<U+393C><U+3E32> was built under R version 3.5.2Loading required package: xts
Loading required package: zoo

Attaching package: <U+393C><U+3E31>zoo<U+393C><U+3E32>

The following objects are masked from <U+393C><U+3E31>package:base<U+393C><U+3E32>:

    as.Date, as.Date.numeric

Loading required package: TTR
Version 0.4-0 included new data defaults. See ?getSymbols.
Learn from a quantmod author: https://www.datacamp.com/courses/importing-and-managing-financial-data-in-r

Consider the time series of a stock of your choice (other than AAPL and your colleague!) and for the time-period from Jan 1, 2015 to present.

We will first generate the historical time series of daily log returns, and calculate the mean and standard deviation of the time series.

##### 1A) Calculate the historical daily log returns, mean and standard deviation

Given a time series we can generate a histogram and mark the quantile value that corresponds to the 95% confidence level. The quantile value in this case is the critical value for which 95% of the data is on the right (higher) of the critical value as represented by the histogram. The remaining 5% will be on the left. To find the quantile value you will need to use the function quantile() with the proper arguments. For example quantile(xts,probs=0.01) applies to a time series xts and return the critical value correspondng to 99% confidence level.

getSymbols("AMZN",src="yahoo")
[1] "AMZN"
AMZNRD=dailyReturn(AMZN,periods="daily", type="log" , from="2015-01-01", to="2019-02-04")
mean(AMZNRD)
[1] 0.001234735
sd(AMZNRD)
[1] 0.02462137

##### 1B) Plot a histogram and mark the quantile value that corresponds to 95% confidence level. A mark can be added to a plot by using the function abline().

hist(AMZNRD)
quantile(AMZNRD,probs=0.05)
         5% 
-0.03359908 
abline(v=-0.03360729)

Given the above, we can calculate a VaR value for a given investment and a time horizon.

##### 1C) Assume $1000 investment in the stock, calculate the 95% VaR for 3 days’ time horizon. Explain the meaning of VaR in practical terms.

AMZN1<- qnorm(0.05, mean = 0.001234735, sd =  0.02462137*sqrt(3))
VAR1<- 1000*(AMZN1)
VAR1
[1] -68.91081

VaR is the minimum amount you can expect to lose given a particular quantile value. In the given example there is a 5% chance of losing atleast 68.91 in 3 days.

##### 1D) How does the VaR calculated in 1C changes if we assumed simple returns instead of the log returns.

Calculations so far have been on the histogram of log returns. We can instead, looking at the histogram, assume a normal distribution of the log returns. The normal return assumption will have a mean and standard deviation equal to those calculated from the histogram, and properly scaled by the horizon time. Note that the mean is linearly scaled with time and volatility with square-root of time.

getSymbols("AMZN",src="yahoo")
[1] "AMZN"
AMZNRD_simple=dailyReturn(AMZN,periods="daily")
mean(AMZNRD_simple)
[1] 0.001541464
sd(AMZNRD_simple)
[1] 0.02500384
AMZN2<-qnorm(0.05, mean = 0.001535914, sd = 0.02500384*sqrt(3))
VAR2<- 1000*(AMZN2)
VAR2
[1] -69.69928

The VaR falls mildly lower with simple returns, this is because of it’s discrete nature unlike the log returns which are calculated continuously.

##### 1E) Repeat the calculation in 1D assuming instead a normal distribution. How the two results compare and why so?

AMZN3<- qnorm(0.05, mean = 0.001535914, sd = 0.02501071*sqrt(3))
VAR3<- 1000 * AMZN3
VAR3
[1] -69.71885

We can see that the VaR for a normal distribution is minutely more than the one calculated in the histogram. This is because when we calculate VaR using normal distribution the quantile gets pushed further to the extreme because of the curve of the normal distribution, this puts more asset value at risk.

##### 1F) Write down the mathematical representation corresponding to the VaR calculation in 1E. Explain what each variable in the equation represents, and provide the corresponding numerical value.

x=z*\(\sigma\)\(\sqrt{\Delta t}\) + \(\mu\)

The above formula uses quantile value z, standard deviation sigma multiplied by root 3 which represents the number of days and mean to calculate the VaR. Where z is -0.05724226, sigma is 0.02501071, square root of 3 is the time element or the number of days for which VaR is required and mean is 0.001535914

Task 2: VaR Calculations: Multiple Equity Assets

Consider the times series of the three stocks DIS, TWTR, and NFLX for the time-period from Jan 1,2015 to present. Assume an investment of $100,000 equally distributed among all three stocks.

To calculate the portfolio VaR we will follow the methodolgy described by the variance-covariance. First the covariance matrix needs to be computed. We then calculate the variance or volatility of the portolio as expressed in the varaince-covariance method taking into the weights associated with each asset in the portfolio. Fiinally we compute the mean or expected return of the portfolio taking also into account the weights. Given the expected return and volatility we should be able to compute the VaR of the portfolio. The assumption is we have a normal distribution of log returns.

First we calculate the overall portfolio VaR.

##### 2A) Calculate the portfolio 99% VaR for 1 day, and 3 days. Specify whether using log-returns or simple returns.

Using log returns the one day VaR is -6928.503 and 3 day VaR is -12115.23

getSymbols("FDX",src="yahoo", from="2015-01-01", to="2019-02-04")
[1] "FDX"
FEDEX=dailyReturn(FDX,periods="daily", type="log" )
getSymbols("DPW",src="yahoo",from="2015-01-01", to="2019-02-04")
[1] "DPW"
DHL=dailyReturn(DPW,periods="daily", type="log" )
getSymbols("XRX",src="yahoo", from="2015-01-01", to="2019-02-04")
[1] "XRX"
XEROX=dailyReturn(XRX,periods="daily", type="log" )
M=cbind(FEDEX,DHL,XEROX)
colnames(M)= c("FEDEX", "DHL" , "XEROX")
cor(M) # correlation matrix
          FEDEX        DHL      XEROX
FEDEX 1.0000000 0.11027239 0.42217169
DHL   0.1102724 1.00000000 0.03536048
XEROX 0.4221717 0.03536048 1.00000000
cov(M) # covariance matrix
             FEDEX          DHL        XEROX
FEDEX 0.0002157235 1.315747e-04 1.169039e-04
DHL   0.0001315747 6.599541e-03 5.415846e-05
XEROX 0.0001169039 5.415846e-05 3.554534e-04
w = rep(1/3, 3)
var_p = w %*% cov(M) %*% w 
mu_p = colMeans(M) %*% w 
sigma= sqrt(var_p)
qnorm(0.01,mu_p,sigma, lower.tail = TRUE)*100000
[1] -6928.503
qnorm(0.01,mu_p*3,sigma*sqrt(3), lower.tail = TRUE)*100000
[1] -12115.23

We then describe the mathetical formulation useds in the code to perform the calculations

##### 2B) Write down the mathematical representations used in the code to calculate the VaR. Label properly each variable, what it represents, and the numerical value corresponding to in the code.

\(\sigma_{p}^{2}\) = \(w_{1}^{3}\)\(\sigma_{1}^{3}\) + \(w_{2}^{3}\)\(\sigma_{2}^{3}\)+ \(w_{3}^{3}\)\(\sigma_{3}^{3}\) + 3\(w_{1}\)\(w_{3}\)\(w_{3}\)\(\sigma_{123}\)

The above formula which is derived by transposing the matrix is used to calculate the sigma square of the portfolio which we later take a square root of to get the standard deviation. \(w_{2}\) refers to weight of asset 1 and so on and \(\sigma_{1}\) refers to sigma of asset 1 and so on. \(\sigma_{123}\) refers to covariance of the 3 assets multiplied by their sigma values.

\(\mu_{p}\)= \(w_{1}\)\(\mu_{1}\)+\(w_{2}\)\(\mu_{2}\)+\(w_{3}\)\(\mu_{3}\)

The above formula is used to calculate the mean of the portfolio where \(w_{1}\) is the weight of the first asset and so on, \(\mu_{1}\) is the mean of the first asset and so on. we add all individual means with respect to their weights which gives us the mean of the portfolio.

VaR= z*\(\sigma_{p}\)+ \(\mu_{p}\)

Finally we calculate the VaR with the above formula where z is the quantile value,\(\sigma_{p}\) is the standard deviation of the portfolio and \(\mu_{p}\) is the mean of the portfolio.

We now calculated individual VaR corresponding to each asst in the portfolio

##### 2C) Calculate the three-individual asset 99% VaR for 1 day.

meanf=mean(FEDEX)
sdf=sd(FEDEX)
FDX2<- qnorm(0.01,meanf,sdf,lower.tail = TRUE)*33333
meanx=mean(XEROX)
sdx=sd(XEROX)
XRX2<- qnorm(0.01,meanx,sdx,lower.tail = TRUE)*33333
meand=mean(DHL)
sdd=sd(DHL)
DPW2<- qnorm(0.01,meand,sdd,lower.tail = TRUE)*33333
print(FDX2)
[1] -1137.916
print(XRX2)
[1] -1470.042
print(DPW2)
[1] -6382.915

Finally we compare the overall VaR to the individual VaR calculations

##### 2D) Compare the overall portfolio VaR to the sum of the individual asset VaR for the 1 day case. Share observations. In theory it is assumed that a portfolio tends to reduce the risk involved with a single stock and mitigate some of it. The overall portfolio VAR is 6928.503 while the individual VaR values add up to 8990.873 (i.e.6382.915+ 1470.042+1137.916) this helps us in concluding that a portfolio can significantly reduce the risk.

*http://computationalfinance.lsi.upc.edu

LS0tDQp0aXRsZTogIkZJTkM2MjEgV2ludGVyIDIwMTgtMTkgTGFiIFdvcmtzaGVldCAwNyINCmF1dGhvcjogIlNhbmdhbWl0cmEgQWdyYXdhbCINCmRhdGU6ICIyLzYvMjAxOSINCm91dHB1dDoNCiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdA0KICBodG1sX2RvY3VtZW50OiBkZWZhdWx0DQpzdWJ0aXRsZTogVmFyIENhbGN1bGF0aW9ucyAoZmluYzYyMS1sYWIwNykNCi0tLQ0KDQojIyMgQWJvdXQNCg0KVGhpcyB3b3Jrc2hlZXQgbG9va3MgYXQgVmFSIGNhbGN1bGF0aW9ucyBmb3IgdGhlIHR3byBjYXNlcyBvZiBzaW5nbGUgYW5kIG11bHRpcGxlIGVxdWl0eSBhc3NldC4gVGhpcyBpcyB0aGUgbGFzdCBsYWIgd29ya3NoZWV0LCBvdGhlciB0aGFuIHRoZSBleHRyYSBjcmVkaXQgYXNzaWdubWVudC4NCg0KIyMjIFNldHVwDQoNClJlbWVtYmVyIHRvIGFsd2F5cyBzZXQgeW91ciB3b3JraW5nIGRpcmVjdG9yeSB0byB0aGUgc291cmNlIGZpbGUgbG9jYXRpb24uIEdvIHRvICdTZXNzaW9uJywgc2Nyb2xsIGRvd24gdG8gJ1NldCBXb3JraW5nIERpcmVjdG9yeScsIGFuZCBjbGljayAnVG8gU291cmNlIEZpbGUgTG9jYXRpb24nLiBSZWFkIGNhcmVmdWxseSB0aGUgYmVsb3cgYW5kIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGNvbXBsZXRlIHRoZSB0YXNrcyBhbmQgYW5zd2VyIGFueSBxdWVzdGlvbnMuICBTdWJtaXQgeW91ciB3b3JrIHRvIFJQdWJzIGFzIGRldGFpbGVkIGluIHByZXZpb3VzIG5vdGVzLiANCg0KIyMjIE5vdGUNCg0KQWx3YXlzIHJlYWQgY2FyZWZ1bGx5IHRoZSBpbnN0cnVjdGlvbnMgb24gU2FrYWkuICBGb3IgY2xhcml0eSwgdGFza3MvcXVlc3Rpb25zIHRvIGJlIGNvbXBsZXRlZC9hbnN3ZXJlZCBhcmUgaGlnaGxpZ2h0ZWQgaW4gcmVkIGNvbG9yICh2aXNpYmxlIGluIHByZXZpZXcpIGFuZCBudW1iZXJlZCBhY2NvcmRpbmcgdG8gdGhlaXIgcGFydGljdWxhciBwbGFjZW1lbnQgaW4gdGhlIHRhc2sgc2VjdGlvbi4gIFF1aXRlIG9mdGVuIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHlvdXIgb3duIGNvZGUgY2h1bmsuDQoNCkV4ZWN1dGUgYWxsIGNvZGUgY2h1bmtzLCBwcmV2aWV3LCBwdWJsaXNoLCBhbmQgc3VibWl0IGxpbmsgb24gU2FrYWkgZm9sbHdvaW5nIHRoZSBuYW1pbmcgY29udmVudGlvbi4gTWFrZSBzdXJlIHRvIGFkZCBjb21tZW50cyB0byB5b3VyIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuIFVzZSBvd24gbGFuZ3VhZ2UhDQoNCi0tLS0tLS0tLS0tLS0tDQoNCiMjIyBUYXNrIDE6IFZhUiBDYWxjdWxhdGlvbnM6IFNpbmdsZSBFcXVpdHkgQXNzZXQNCg0KDQpgYGB7cn0NCiNJbnN0YWxsIHBhY2thZ2UgcXVhbnRtb2QgDQppbnN0YWxsLnBhY2thZ2VzKCJxdWFudG1vZCIpDQpsaWJyYXJ5KCJxdWFudG1vZCIpDQpgYGANCg0KQ29uc2lkZXIgdGhlIHRpbWUgc2VyaWVzIG9mIGEgc3RvY2sgb2YgeW91ciBjaG9pY2UgKG90aGVyIHRoYW4gQUFQTCBhbmQgeW91ciBjb2xsZWFndWUhKSBhbmQgZm9yIHRoZSB0aW1lLXBlcmlvZCBmcm9tIEphbiAxLCAyMDE1IHRvIHByZXNlbnQuIA0KDQpXZSB3aWxsIGZpcnN0IGdlbmVyYXRlIHRoZSBoaXN0b3JpY2FsIHRpbWUgc2VyaWVzIG9mIGRhaWx5IGxvZyByZXR1cm5zLCBhbmQgY2FsY3VsYXRlIHRoZSBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIHRpbWUgc2VyaWVzLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFBKSBDYWxjdWxhdGUgdGhlIGhpc3RvcmljYWwgZGFpbHkgbG9nIHJldHVybnMsIG1lYW4gYW5kIHN0YW5kYXJkIGRldmlhdGlvbg0KPC9zcGFuPg0KDQpHaXZlbiBhIHRpbWUgc2VyaWVzIHdlIGNhbiBnZW5lcmF0ZSBhIGhpc3RvZ3JhbSBhbmQgbWFyayB0aGUgcXVhbnRpbGUgdmFsdWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgOTUlIGNvbmZpZGVuY2UgbGV2ZWwuIFRoZSBxdWFudGlsZSB2YWx1ZSBpbiB0aGlzIGNhc2UgaXMgdGhlIGNyaXRpY2FsIHZhbHVlIGZvciB3aGljaCA5NSUgb2YgdGhlIGRhdGEgaXMgb24gdGhlIHJpZ2h0IChoaWdoZXIpIG9mIHRoZSBjcml0aWNhbCB2YWx1ZSBhcyByZXByZXNlbnRlZCBieSB0aGUgaGlzdG9ncmFtLiBUaGUgcmVtYWluaW5nIDUlIHdpbGwgYmUgb24gdGhlIGxlZnQuIFRvIGZpbmQgdGhlIHF1YW50aWxlIHZhbHVlIHlvdSB3aWxsIG5lZWQgdG8gdXNlIHRoZSBmdW5jdGlvbiBgcXVhbnRpbGUoKWAgd2l0aCB0aGUgcHJvcGVyIGFyZ3VtZW50cy4gRm9yIGV4YW1wbGUgYHF1YW50aWxlKHh0cyxwcm9icz0wLjAxKWAgIGFwcGxpZXMgdG8gYSB0aW1lIHNlcmllcyBgeHRzYCBhbmQgcmV0dXJuIHRoZSBjcml0aWNhbCB2YWx1ZSBjb3JyZXNwb25kbmcgdG8gYDk5JWAgY29uZmlkZW5jZSBsZXZlbC4NCg0KYGBge3J9DQpnZXRTeW1ib2xzKCJBTVpOIixzcmM9InlhaG9vIikNCkFNWk5SRD1kYWlseVJldHVybihBTVpOLHBlcmlvZHM9ImRhaWx5IiwgdHlwZT0ibG9nIiAsIGZyb209IjIwMTUtMDEtMDEiLCB0bz0iMjAxOS0wMi0wNCIpDQptZWFuKEFNWk5SRCkNCnNkKEFNWk5SRCkNCg0KYGBgDQoNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxQikgUGxvdCBhIGhpc3RvZ3JhbSBhbmQgbWFyayB0aGUgcXVhbnRpbGUgdmFsdWUgdGhhdCBjb3JyZXNwb25kcyB0byA5NSUgY29uZmlkZW5jZSBsZXZlbC4gQSBtYXJrIGNhbiBiZSBhZGRlZCB0byBhIHBsb3QgYnkgdXNpbmcgdGhlIGZ1bmN0aW9uIGBhYmxpbmUoKWAuDQo8L3NwYW4+DQoNCmBgYHtyfQ0KaGlzdChBTVpOUkQpDQpxdWFudGlsZShBTVpOUkQscHJvYnM9MC4wNSkNCmFibGluZSh2PS0wLjAzMzYwNzI5KQ0KYGBgDQoNCg0KR2l2ZW4gdGhlIGFib3ZlLCB3ZSBjYW4gY2FsY3VsYXRlIGEgVmFSIHZhbHVlIGZvciBhIGdpdmVuIGludmVzdG1lbnQgYW5kIGEgdGltZSBob3Jpem9uLg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDFDKSBBc3N1bWUgJDEwMDAgaW52ZXN0bWVudCBpbiB0aGUgc3RvY2ssIGNhbGN1bGF0ZSB0aGUgOTUlIFZhUiBmb3IgMyBkYXlz4oCZIHRpbWUgaG9yaXpvbi4gIEV4cGxhaW4gdGhlIG1lYW5pbmcgb2YgVmFSIGluIHByYWN0aWNhbCB0ZXJtcy4NCjwvc3Bhbj4NCg0KYGBge3J9DQpBTVpOMTwtIHFub3JtKDAuMDUsIG1lYW4gPSAwLjAwMTIzNDczNSwgc2QgPSAgMC4wMjQ2MjEzNypzcXJ0KDMpKQ0KDQpWQVIxPC0gMTAwMCooQU1aTjEpDQpWQVIxDQoNCmBgYA0KVmFSIGlzIHRoZSBtaW5pbXVtIGFtb3VudCB5b3UgY2FuIGV4cGVjdCB0byBsb3NlIGdpdmVuIGEgcGFydGljdWxhciBxdWFudGlsZSB2YWx1ZS4gSW4gdGhlIGdpdmVuIGV4YW1wbGUgdGhlcmUgaXMgYSA1JSBjaGFuY2Ugb2YgbG9zaW5nIGF0bGVhc3QgNjguOTEgaW4gMyBkYXlzLiANCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAxRCkgSG93IGRvZXMgdGhlIFZhUiBjYWxjdWxhdGVkIGluIDFDIGNoYW5nZXMgaWYgd2UgYXNzdW1lZCBzaW1wbGUgcmV0dXJucyBpbnN0ZWFkIG9mIHRoZSBsb2cgcmV0dXJucy4NCjwvc3Bhbj4NCg0KQ2FsY3VsYXRpb25zIHNvIGZhciBoYXZlIGJlZW4gb24gdGhlIGhpc3RvZ3JhbSBvZiBsb2cgcmV0dXJucy4gV2UgY2FuIGluc3RlYWQsIGxvb2tpbmcgYXQgdGhlIGhpc3RvZ3JhbSwgYXNzdW1lIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiB0aGUgbG9nIHJldHVybnMuIFRoZSBub3JtYWwgcmV0dXJuIGFzc3VtcHRpb24gd2lsbCBoYXZlIGEgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIGVxdWFsIHRvIHRob3NlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaGlzdG9ncmFtLCBhbmQgcHJvcGVybHkgc2NhbGVkIGJ5IHRoZSBob3Jpem9uIHRpbWUuICBOb3RlIHRoYXQgdGhlIG1lYW4gaXMgbGluZWFybHkgc2NhbGVkIHdpdGggdGltZSBhbmQgdm9sYXRpbGl0eSB3aXRoIHNxdWFyZS1yb290IG9mIHRpbWUuDQpgYGB7cn0NCmdldFN5bWJvbHMoIkFNWk4iLHNyYz0ieWFob28iKQ0KQU1aTlJEX3NpbXBsZT1kYWlseVJldHVybihBTVpOLHBlcmlvZHM9ImRhaWx5IikNCm1lYW4oQU1aTlJEX3NpbXBsZSkNCnNkKEFNWk5SRF9zaW1wbGUpDQoNCg0KQU1aTjI8LXFub3JtKDAuMDUsIG1lYW4gPSAwLjAwMTUzNTkxNCwgc2QgPSAwLjAyNTAwMzg0KnNxcnQoMykpDQpWQVIyPC0gMTAwMCooQU1aTjIpDQpWQVIyDQpgYGANClRoZSBWYVIgZmFsbHMgbWlsZGx5IGxvd2VyIHdpdGggc2ltcGxlIHJldHVybnMsIHRoaXMgaXMgYmVjYXVzZSBvZiBpdCdzIGRpc2NyZXRlIG5hdHVyZSB1bmxpa2UgdGhlIGxvZyByZXR1cm5zIHdoaWNoIGFyZSBjYWxjdWxhdGVkIGNvbnRpbnVvdXNseS4gDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUUpIFJlcGVhdCB0aGUgY2FsY3VsYXRpb24gaW4gMUQgYXNzdW1pbmcgaW5zdGVhZCBhIG5vcm1hbCBkaXN0cmlidXRpb24uIEhvdyB0aGUgdHdvIHJlc3VsdHMgY29tcGFyZSBhbmQgd2h5IHNvPw0KDQoNCjwvc3Bhbj4NCmBgYHtyfQ0KQU1aTjM8LSBxbm9ybSgwLjA1LCBtZWFuID0gMC4wMDE1MzU5MTQsIHNkID0gMC4wMjUwMTA3MSpzcXJ0KDMpKQ0KDQpWQVIzPC0gMTAwMCAqIEFNWk4zDQpWQVIzDQoNCmBgYA0KV2UgY2FuIHNlZSB0aGF0IHRoZSBWYVIgZm9yIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBpcyBtaW51dGVseSBtb3JlIHRoYW4gdGhlIG9uZSBjYWxjdWxhdGVkIGluIHRoZSBoaXN0b2dyYW0uIFRoaXMgaXMgYmVjYXVzZSB3aGVuIHdlIGNhbGN1bGF0ZSBWYVIgdXNpbmcgbm9ybWFsIGRpc3RyaWJ1dGlvbiB0aGUgcXVhbnRpbGUgZ2V0cyBwdXNoZWQgZnVydGhlciB0byB0aGUgZXh0cmVtZSBiZWNhdXNlIG9mIHRoZSBjdXJ2ZSBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgdGhpcyBwdXRzIG1vcmUgYXNzZXQgdmFsdWUgYXQgcmlzay4NCg0KDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPg0KIyMjIyMgMUYpIFdyaXRlIGRvd24gdGhlIG1hdGhlbWF0aWNhbCByZXByZXNlbnRhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBWYVIgY2FsY3VsYXRpb24gaW4gMUUuIEV4cGxhaW4gd2hhdCBlYWNoIHZhcmlhYmxlIGluIHRoZSBlcXVhdGlvbiByZXByZXNlbnRzLCBhbmQgcHJvdmlkZSB0aGUgY29ycmVzcG9uZGluZyBudW1lcmljYWwgdmFsdWUuDQo8L3NwYW4+DQoNCng9eiokXHNpZ21hJCRcc3FydHtcRGVsdGEgdH0kICsgJFxtdSQNCg0KVGhlIGFib3ZlIGZvcm11bGEgdXNlcyBxdWFudGlsZSB2YWx1ZSB6LCBzdGFuZGFyZCBkZXZpYXRpb24gc2lnbWEgbXVsdGlwbGllZCBieSByb290IDMgd2hpY2ggcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGRheXMgYW5kIG1lYW4gdG8gY2FsY3VsYXRlIHRoZSBWYVIuIFdoZXJlIHogaXMgLTAuMDU3MjQyMjYsIHNpZ21hIGlzIDAuMDI1MDEwNzEsIHNxdWFyZSByb290IG9mIDMgaXMgdGhlIHRpbWUgZWxlbWVudCBvciB0aGUgbnVtYmVyIG9mIGRheXMgZm9yIHdoaWNoIFZhUiBpcyByZXF1aXJlZCBhbmQgbWVhbiBpcyAwLjAwMTUzNTkxNA0KDQoNCiMjIyBUYXNrIDI6IFZhUiBDYWxjdWxhdGlvbnM6IE11bHRpcGxlIEVxdWl0eSBBc3NldHMNCg0KQ29uc2lkZXIgdGhlIHRpbWVzIHNlcmllcyBvZiB0aGUgdGhyZWUgc3RvY2tzIERJUywgVFdUUiwgYW5kIE5GTFggZm9yIHRoZSB0aW1lLXBlcmlvZCBmcm9tIEphbiAxLDIwMTUgdG8gcHJlc2VudC4gQXNzdW1lIGFuIGludmVzdG1lbnQgb2YgJDEwMCwwMDAgZXF1YWxseSBkaXN0cmlidXRlZCBhbW9uZyBhbGwgdGhyZWUgc3RvY2tzLiANCg0KVG8gY2FsY3VsYXRlIHRoZSBwb3J0Zm9saW8gVmFSIHdlIHdpbGwgZm9sbG93IHRoZSBtZXRob2RvbGd5IGRlc2NyaWJlZCBieSB0aGUgdmFyaWFuY2UtY292YXJpYW5jZS4gRmlyc3QgdGhlIGNvdmFyaWFuY2UgbWF0cml4IG5lZWRzIHRvIGJlIGNvbXB1dGVkLiAgV2UgdGhlbiBjYWxjdWxhdGUgdGhlIHZhcmlhbmNlIG9yIHZvbGF0aWxpdHkgb2YgdGhlIHBvcnRvbGlvIGFzIGV4cHJlc3NlZCBpbiB0aGUgdmFyYWluY2UtY292YXJpYW5jZSBtZXRob2QgdGFraW5nIGludG8gdGhlIHdlaWdodHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYXNzZXQgaW4gdGhlIHBvcnRmb2xpby4gIEZpaW5hbGx5IHdlIGNvbXB1dGUgdGhlIG1lYW4gb3IgZXhwZWN0ZWQgcmV0dXJuIG9mIHRoZSBwb3J0Zm9saW8gdGFraW5nIGFsc28gaW50byBhY2NvdW50IHRoZSB3ZWlnaHRzLiAgR2l2ZW4gdGhlIGV4cGVjdGVkIHJldHVybiBhbmQgdm9sYXRpbGl0eSB3ZSBzaG91bGQgYmUgYWJsZSB0byBjb21wdXRlIHRoZSBWYVIgb2YgdGhlIHBvcnRmb2xpby4gIFRoZSBhc3N1bXB0aW9uIGlzIHdlIGhhdmUgYSBub3JtYWwgZGlzdHJpYnV0aW9uIG9mIGxvZyByZXR1cm5zLg0KDQpGaXJzdCB3ZSBjYWxjdWxhdGUgdGhlIG92ZXJhbGwgcG9ydGZvbGlvIFZhUi4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+DQojIyMjIyAyQSkgQ2FsY3VsYXRlIHRoZSBwb3J0Zm9saW8gOTklIFZhUiBmb3IgMSBkYXksIGFuZCAzIGRheXMuIFNwZWNpZnkgd2hldGhlciB1c2luZyBsb2ctcmV0dXJucyBvciBzaW1wbGUgcmV0dXJucy4gICAgICANCjwvc3Bhbj4NCg0KVXNpbmcgbG9nIHJldHVybnMgdGhlIG9uZSBkYXkgVmFSIGlzIC02OTI4LjUwMyBhbmQgMyBkYXkgVmFSIGlzIC0xMjExNS4yMw0KDQpgYGB7cn0NCmdldFN5bWJvbHMoIkZEWCIsc3JjPSJ5YWhvbyIsIGZyb209IjIwMTUtMDEtMDEiLCB0bz0iMjAxOS0wMi0wNCIpDQpGRURFWD1kYWlseVJldHVybihGRFgscGVyaW9kcz0iZGFpbHkiLCB0eXBlPSJsb2ciICkNCg0KDQpnZXRTeW1ib2xzKCJEUFciLHNyYz0ieWFob28iLGZyb209IjIwMTUtMDEtMDEiLCB0bz0iMjAxOS0wMi0wNCIpDQpESEw9ZGFpbHlSZXR1cm4oRFBXLHBlcmlvZHM9ImRhaWx5IiwgdHlwZT0ibG9nIiApDQoNCg0KZ2V0U3ltYm9scygiWFJYIixzcmM9InlhaG9vIiwgZnJvbT0iMjAxNS0wMS0wMSIsIHRvPSIyMDE5LTAyLTA0IikNClhFUk9YPWRhaWx5UmV0dXJuKFhSWCxwZXJpb2RzPSJkYWlseSIsIHR5cGU9ImxvZyIgKQ0KDQpNPWNiaW5kKEZFREVYLERITCxYRVJPWCkNCg0KY29sbmFtZXMoTSk9IGMoIkZFREVYIiwgIkRITCIgLCAiWEVST1giKQ0KDQpjb3IoTSkgIyBjb3JyZWxhdGlvbiBtYXRyaXgNCmNvdihNKSAjIGNvdmFyaWFuY2UgbWF0cml4DQp3ID0gcmVwKDEvMywgMykNCnZhcl9wID0gdyAlKiUgY292KE0pICUqJSB3IA0KbXVfcCA9IGNvbE1lYW5zKE0pICUqJSB3IA0Kc2lnbWE9IHNxcnQodmFyX3ApDQpxbm9ybSgwLjAxLG11X3Asc2lnbWEsIGxvd2VyLnRhaWwgPSBUUlVFKSoxMDAwMDANCg0KDQpgYGANCmBgYHtyfQ0KDQpxbm9ybSgwLjAxLG11X3AqMyxzaWdtYSpzcXJ0KDMpLCBsb3dlci50YWlsID0gVFJVRSkqMTAwMDAwDQoNCmBgYA0KDQpXZSB0aGVuIGRlc2NyaWJlIHRoZSBtYXRoZXRpY2FsIGZvcm11bGF0aW9uIHVzZWRzIGluIHRoZSBjb2RlIHRvIHBlcmZvcm0gdGhlIGNhbGN1bGF0aW9ucw0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJCKSBXcml0ZSBkb3duIHRoZSBtYXRoZW1hdGljYWwgcmVwcmVzZW50YXRpb25zIHVzZWQgaW4gdGhlIGNvZGUgdG8gY2FsY3VsYXRlIHRoZSBWYVIuICBMYWJlbCBwcm9wZXJseSBlYWNoIHZhcmlhYmxlLCB3aGF0IGl0IHJlcHJlc2VudHMsIGFuZCB0aGUgbnVtZXJpY2FsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gaW4gdGhlIGNvZGUuDQo8L3NwYW4+DQoNCiRcc2lnbWFfe3B9XnsyfSQgPSAkd197MX1eezN9JCRcc2lnbWFfezF9XnszfSQgKyAkd197Mn1eezN9JCRcc2lnbWFfezJ9XnszfSQrICR3X3szfV57M30kJFxzaWdtYV97M31eezN9JCArIDMkd197MX0kJHdfezN9JCR3X3szfSQkXHNpZ21hX3sxMjN9JA0KDQpUaGUgYWJvdmUgZm9ybXVsYSB3aGljaCBpcyBkZXJpdmVkIGJ5IHRyYW5zcG9zaW5nIHRoZSBtYXRyaXggaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHNpZ21hIHNxdWFyZSBvZiB0aGUgcG9ydGZvbGlvIHdoaWNoIHdlIGxhdGVyIHRha2UgYSBzcXVhcmUgcm9vdCBvZiB0byBnZXQgdGhlIHN0YW5kYXJkIGRldmlhdGlvbi4gJHdfezJ9JCByZWZlcnMgdG8gd2VpZ2h0IG9mIGFzc2V0IDEgYW5kIHNvIG9uIGFuZCAkXHNpZ21hX3sxfSQgcmVmZXJzIHRvIHNpZ21hIG9mIGFzc2V0IDEgYW5kIHNvIG9uLiAkXHNpZ21hX3sxMjN9JCByZWZlcnMgdG8gY292YXJpYW5jZSBvZiB0aGUgMyBhc3NldHMgbXVsdGlwbGllZCBieSB0aGVpciBzaWdtYSB2YWx1ZXMuIA0KDQokXG11X3twfSQ9ICR3X3sxfSQkXG11X3sxfSQrJHdfezJ9JCRcbXVfezJ9JCskd197M30kJFxtdV97M30kDQoNClRoZSBhYm92ZSBmb3JtdWxhIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBtZWFuIG9mIHRoZSBwb3J0Zm9saW8gd2hlcmUgJHdfezF9JCBpcyB0aGUgd2VpZ2h0IG9mIHRoZSBmaXJzdCBhc3NldCBhbmQgc28gb24sICRcbXVfezF9JCBpcyB0aGUgbWVhbiBvZiB0aGUgZmlyc3QgYXNzZXQgYW5kIHNvIG9uLiB3ZSBhZGQgYWxsIGluZGl2aWR1YWwgbWVhbnMgd2l0aCByZXNwZWN0IHRvIHRoZWlyIHdlaWdodHMgd2hpY2ggZ2l2ZXMgdXMgdGhlIG1lYW4gb2YgdGhlIHBvcnRmb2xpby4NCg0KVmFSPSB6KiRcc2lnbWFfe3B9JCsgJFxtdV97cH0kDQoNCkZpbmFsbHkgd2UgY2FsY3VsYXRlIHRoZSBWYVIgd2l0aCB0aGUgYWJvdmUgZm9ybXVsYSB3aGVyZSB6IGlzIHRoZSBxdWFudGlsZSB2YWx1ZSwkXHNpZ21hX3twfSQgaXMgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgcG9ydGZvbGlvIGFuZCAkXG11X3twfSQgaXMgdGhlIG1lYW4gb2YgdGhlIHBvcnRmb2xpby4NCg0KV2Ugbm93IGNhbGN1bGF0ZWQgaW5kaXZpZHVhbCBWYVIgY29ycmVzcG9uZGluZyB0byBlYWNoIGFzc3QgaW4gdGhlIHBvcnRmb2xpbw0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJDKSBDYWxjdWxhdGUgdGhlIHRocmVlLWluZGl2aWR1YWwgYXNzZXQgOTklIFZhUiBmb3IgMSBkYXkuICANCjwvc3Bhbj4NCmBgYHtyfQ0KDQptZWFuZj1tZWFuKEZFREVYKQ0Kc2RmPXNkKEZFREVYKQ0KRkRYMjwtIHFub3JtKDAuMDEsbWVhbmYsc2RmLGxvd2VyLnRhaWwgPSBUUlVFKSozMzMzMw0KDQptZWFueD1tZWFuKFhFUk9YKQ0Kc2R4PXNkKFhFUk9YKQ0KWFJYMjwtIHFub3JtKDAuMDEsbWVhbngsc2R4LGxvd2VyLnRhaWwgPSBUUlVFKSozMzMzMw0KDQoNCm1lYW5kPW1lYW4oREhMKQ0Kc2RkPXNkKERITCkNCkRQVzI8LSBxbm9ybSgwLjAxLG1lYW5kLHNkZCxsb3dlci50YWlsID0gVFJVRSkqMzMzMzMNCg0KcHJpbnQoRkRYMikNCnByaW50KFhSWDIpDQpwcmludChEUFcyKQ0KYGBgDQoNCkZpbmFsbHkgd2UgY29tcGFyZSB0aGUgb3ZlcmFsbCBWYVIgdG8gdGhlIGluZGl2aWR1YWwgVmFSIGNhbGN1bGF0aW9ucw0KDQo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4NCiMjIyMjIDJEKSBDb21wYXJlIHRoZSBvdmVyYWxsIHBvcnRmb2xpbyBWYVIgdG8gdGhlIHN1bSBvZiB0aGUgaW5kaXZpZHVhbCBhc3NldCBWYVIgZm9yIHRoZSAxIGRheSBjYXNlLiAgU2hhcmUgb2JzZXJ2YXRpb25zLg0KPC9zcGFuPg0KSW4gdGhlb3J5IGl0IGlzIGFzc3VtZWQgdGhhdCBhIHBvcnRmb2xpbyB0ZW5kcyB0byByZWR1Y2UgdGhlIHJpc2sgaW52b2x2ZWQgd2l0aCBhIHNpbmdsZSBzdG9jayBhbmQgbWl0aWdhdGUgc29tZSBvZiBpdC4gVGhlIG92ZXJhbGwgcG9ydGZvbGlvIFZBUiBpcyA2OTI4LjUwMyB3aGlsZSB0aGUgaW5kaXZpZHVhbCBWYVIgdmFsdWVzIGFkZCB1cCB0byA4OTkwLjg3MyAoaS5lLjYzODIuOTE1KyAxNDcwLjA0MisxMTM3LjkxNikgdGhpcyBoZWxwcyB1cyBpbiBjb25jbHVkaW5nIHRoYXQgYSBwb3J0Zm9saW8gY2FuIHNpZ25pZmljYW50bHkgcmVkdWNlIHRoZSByaXNrLg0KDQoqW2h0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSBdKGh0dHA6Ly9jb21wdXRhdGlvbmFsZmluYW5jZS5sc2kudXBjLmVkdSkNCg==