About

This worksheet looks at some common trading rules, modeling and forecasting, and some fundamental analysis.

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: Technical Trading Rules

This task follows the example in the book R Example 6.1/p 185 A new package will be required for this worksheet. All packages are included, for your convenience, in the code chunks below.

#Install package quantmod 
if(!require("quantmod",quietly = TRUE))
  install.packages("quantmod",dependencies = TRUE, repos = "https://cloud.r-project.org")
#Install package fArma for modelling ARMA time series processes
if(!require("fArma",quietly = TRUE))
  install.packages("fArma",dependencies = TRUE, repos = "https://cloud.r-project.org")
there is no package called ‘fArma’
Warning in install.packages :
  package ‘fArma’ is not available (for R version 3.5.1)

The following questions are for a stock of your choice from S&P500 (other than AAPL and your colleague!) and for the time-period from Jan 1, 2015 to present.

Observing the crossings or intersections between two simple moving averages can provide signals for buying or selling.

##### 1A) Create a chart of close prices and add the two simple moving averages over the periods n=20 and n=50. Clearly label the plots or provide a legend

getSymbols("DAL", from="2015-01-01", to = Sys.Date())
[1] "DAL"
sma20 =SMA(DAL$DAL.Close, n = 20)
sma50 = SMA(DAL$DAL.Close, n = 50)
plot(DAL$DAL.Close)

lines(sma20,col="red")

lines(sma50, col="blue")

The black line is the graph for closing price. The red line is when MA(20), the blue line is when MA(50). The data is more accurate when n=20 since it’s calculate average more frequently. If the red line cross up the blue line, the stock price tends to go up, when the red line cross down the blue price, the stock price tends to go down.

##### 1B) Select a particular crossover point to explain how you would implement a trading strategy (ref p184)

Mathematically speaking, if we take n=20 and m=50 as an example (where n always < m), consider Ct as the closing price at t. For both of them we have the following to calculate moving average with different length:

The period July 2017 is when MA(20) crosses down MA(50) is a signal to sell (go down). This signals a price drop. If Xti−1 > 0 and Xti < 0, go short at Oti+1. This is when n=20 line cross down m=50 line and price is going to go down.

Bollinger bands are a kind of a trading bands or moving average envelopes. The high and low limits of a Bollinger band are calculated based on a x-number of standard deviation (usually 2) away from the moving average. A standard deviation is also a measure of volatility, as such the band will widen when volatility increases and contract when volatility decreases. As with bands and envelopes the idea of Bollinger band is that prices tend to stay within the band. When prices reach the top band it is assumed that resistance will be encountered and the price will fall. Opposite true when the lower band is reached. When the price moves outside the bands, a continuation of the current trend is expected.

##### 1C) Chart the Bollinger Bands based on the 20-days moving average and two standard deviations. Select a particular point to explain how the BB can be used in a trading strategy (ref p185)

getSymbols("DAL")
[1] "DAL"
chartSeries(DAL, subset='2015-01-01::2019-01-22',theme=chartTheme('white',up.col='green',dn.col='red'),TA=c(addBBands(n=20,sd=2,)))

General rule is to go long when price breaks upper band and go short when price crosses lower band. The results are roughly consistent with moving average crossover rule, while BB is more a volatility indicator.

The stock price breaks the upper band of the BB in the perod Jan 02 2018. This indicates a signal to go long on the stock.

RSI measures the velocity of price changes. Rapid price increases is an indication of stock overbought conditions, and rapid price decreases result in oversold conditions. When used properly RSI can assist in optimizing proper entry and exit decisions.

##### 1D) Chart the Relative Strength Index (RSI) based on 14-days moving average. Select a particular point to explain how RSI can be used in a trading strategy (ref p206)

getSymbols("DAL")
[1] "DAL"
chartSeries(DAL, subset='2015-01-01::2019-01-22',theme=chartTheme('white',up.col='green',dn.col='red'), TA=c(addRSI(n=14)))

So, in the period slightly before Jan 03 2017, When the RSI crosses above the upper threshold( above 70), it indicates overbought conditions; Hence, its the right time to go short on the stock

Notably that sudden large price movements can create false buy or sell signals in the RSI. It is, therefore, best used with refinements to its application or in conjunction with technical trading rules.

Task 2: Modeling & Forecasting

Similar to lab03 pick a currency exchange rates of your choice. Follow R Example 4.2/p 119. Pay special attention to Remark 4.1/p 112 and class notes for the correct interpretation and representation of results. Depending on the R version, the package fArma may not be available (true for 3.5 and up). One can use instead the function arima() to fit an AR(1) and the print to obtain the model coefficients. Check the illustrated example below and read the Help in R, as needed, for more insights on how to use commands.

#ar1 = arima(dataset, order = c(1,0,0)) to obtain the equivalent of an AR(1) model fit.  dataset is in reference to your particular currency exchange pair like RUBUSD for example.
#print(ar1) to print the coffecients of the model.  Pay attention to the interpretation of intercept

First we derive an autoregressive model of order 1, excluding the out-of-sample points. To exclude ppints check the example below

#ar1 = arimadataset[1:n], order - c(1,0,0)).  This will build an AR(1) model based on the time series dataset [1:n] where n is the length of the tie series minus the last four points.  For example EURUSD[1:175] is for the case where the total time series for the EURUSD is 179 observation points.

##### 2A) Derive an AR(1) model excluding the last four points from your time series (the out-of-sample). Note the values of the model coefficients, and write down the correspondng mathematical representation of the model.

getFX("CNY/USD") 
[1] "CNYUSD"
ar1 = arima(CNYUSD[1:175], order = c(1,0,0))
arima(x=CNYUSD, order = c(1, 0, 0))

Call:
arima(x = CNYUSD, order = c(1, 0, 0))

Coefficients:
         ar1  intercept
      0.9682     0.1458
s.e.  0.0179     0.0006

sigma^2 estimated as 8.068e-08:  log likelihood = 1206.41,  aic = -2406.82
##library(fArma)
#ar1 = arimadataset[1:n], order - c(1,0,0))
#ar1 = arima(~ar(1), method="yule-walker", data=CNYUSD)
summary(ar1)
          Length Class  Mode     
coef        2    -none- numeric  
sigma2      1    -none- numeric  
var.coef    4    -none- numeric  
mask        2    -none- logical  
loglik      1    -none- numeric  
aic         1    -none- numeric  
arma        7    -none- numeric  
residuals 175    ts     numeric  
call        3    -none- call     
series      1    -none- character
code        1    -none- numeric  
n.cond      1    -none- numeric  
nobs        1    -none- numeric  
model      10    -none- list     

The mathematical representation of the AR(1) process is

\(Y_{t} = 0.1458 +0.9682Y_{t-1} + W_{t}\) where {\(W_{t}\)}~N(0,\(\sigma^2\))

Next we apply the derived model to predict the rates, within confidence levels, for the out-of-sample points.

##### 2B) Using the fitted model, predict the rates for the excluded points corresponding to the four days ahead. Select one particular forecasted day to illustrate manually how the reported predicted rate can be reproduced using the derived AR(1) model.

predict(ar1,n.ahead = 4, n.back = 175)
$pred
Time Series:
Start = 176 
End = 179 
Frequency = 1 
[1] 0.1475126 0.1474645 0.1474179 0.1473726

$se
Time Series:
Start = 176 
End = 179 
Frequency = 1 
[1] 0.0002859055 0.0003985481 0.0004812064 0.0005478575
CNYUSD[176:179]
            CNY.USD
2019-01-19 0.147540
2019-01-20 0.147538
2019-01-21 0.147214
2019-01-22 0.146944

To manually calculate the first predicted value of the model just insert the previous value from the time series into the equation.

$Y_{t} = 0.1458 +0.9682(0.147562)

Finally we want to assess the goodness of the model by conducting a quantitative analysis.

##### 2C) Formulate and execute a way to test the fitness of the model. Share your results.

The Mean Squared Error test the fitness of this model.

MSE = 1/m \(\sum_{x = 1}^{m} (y_{t}-\hat{y_{t}})^{2}\)

From the formula, yt is the actual testing set and y^t is the predicted set. Also, the smaller the MSE shows a more accurate model.

Task 3: Fundamental Analysis

Consider two stocks of your choice. Unfortunately the code in the R Example 6.2/p 202 is no more valid as Google stopped providing such data as of March 2018. Instead you are advised to use Bloomberg or other sources to extract the needed information. The information in Bloomberg is available in the security description page of a stock.

##### 3A) For each stock report the P/B, P/E, and Assets/Debts ratios. Note also the fiscal calendar date associated with the reported ratios.

NIKE US

NIKE US

From the image, NKE’s P/B ratio is 14.30, P/E is 31.1 and Assets/Debts ratio is 16.90%

Target US

Target US

From the image, TGT’s P/B ratio is 3.27, P/E is 13.2 and Assets/Debts ratio is 33.4%

##### 3B) Based on solely the three reported ratios which company has a stronger financial condition. Explain your logic.

Based on the PE ratio for Nike and Target, a lower PE ratio is better. In which Target has a lower PE ratio of 13.2. Historically PE ratio is between 15-25.

Based on the PB ratio for Nike and Target, A PB ratio higher than 1 means the means the market investors are overvaluling the company. Nike and Target have PB ratio greater than 1 which is 14.30 and 3.27 respectively. In this instance Targets’s PB ratio is better because its a little bit over 1 meaning its overpricing is not so bad.

Based on the Assets and Debts ratio of Nike (16.9%) and Target(33.4%).The statistics shows taht Target is more highly leveraged than Nike. The greater the financial leverage the greater the risk especially in an increasing interest rate market.

Overall, I feel Target has a stronger financial condition than Nike. However, eventhough Target is more highly leveraged than Nike which could pose great risk but the advantage is that Target has more ROE because of its highly leveraged position.

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

LS0tCnRpdGxlOiAiRklOQzYyMSBXaW50ZXIgMjAxOC0xOSBMYWIgV29ya3NoZWV0IDA1IgphdXRob3I6ICJUaXRpbG9wZSBPbHV0YXlvIgpkYXRlOiAiMS8yMy8yMDE5IgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKc3VidGl0bGU6IFRlY2huaWNhbCBBbmFseXNpcyAmIEZ1bmRhbWVudGFscyAoZmluYzYyMS1sYWIwNSkKLS0tCgojIyMgQWJvdXQKClRoaXMgd29ya3NoZWV0IGxvb2tzIGF0IHNvbWUgY29tbW9uIHRyYWRpbmcgcnVsZXMsIG1vZGVsaW5nIGFuZCBmb3JlY2FzdGluZywgYW5kIHNvbWUgZnVuZGFtZW50YWwgYW5hbHlzaXMuICAKCiMjIyBTZXR1cAoKUmVtZW1iZXIgdG8gYWx3YXlzIHNldCB5b3VyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRoZSBzb3VyY2UgZmlsZSBsb2NhdGlvbi4gR28gdG8gJ1Nlc3Npb24nLCBzY3JvbGwgZG93biB0byAnU2V0IFdvcmtpbmcgRGlyZWN0b3J5JywgYW5kIGNsaWNrICdUbyBTb3VyY2UgRmlsZSBMb2NhdGlvbicuIFJlYWQgY2FyZWZ1bGx5IHRoZSBiZWxvdyBhbmQgZm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgdG8gY29tcGxldGUgdGhlIHRhc2tzIGFuZCBhbnN3ZXIgYW55IHF1ZXN0aW9ucy4gIFN1Ym1pdCB5b3VyIHdvcmsgdG8gUlB1YnMgYXMgZGV0YWlsZWQgaW4gcHJldmlvdXMgbm90ZXMuIAoKIyMjIE5vdGUKCkFsd2F5cyByZWFkIGNhcmVmdWxseSB0aGUgaW5zdHJ1Y3Rpb25zIG9uIFNha2FpLiAgRm9yIGNsYXJpdHksIHRhc2tzL3F1ZXN0aW9ucyB0byBiZSBjb21wbGV0ZWQvYW5zd2VyZWQgYXJlIGhpZ2hsaWdodGVkIGluIHJlZCBjb2xvciAodmlzaWJsZSBpbiBwcmV2aWV3KSBhbmQgbnVtYmVyZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHBhcnRpY3VsYXIgcGxhY2VtZW50IGluIHRoZSB0YXNrIHNlY3Rpb24uICBRdWl0ZSBvZnRlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCB5b3VyIG93biBjb2RlIGNodW5rLgoKRXhlY3V0ZSBhbGwgY29kZSBjaHVua3MsIHByZXZpZXcsIHB1Ymxpc2gsIGFuZCBzdWJtaXQgbGluayBvbiBTYWthaSBmb2xsd29pbmcgdGhlIG5hbWluZyBjb252ZW50aW9uLiBNYWtlIHN1cmUgdG8gYWRkIGNvbW1lbnRzIHRvIHlvdXIgY29kZSB3aGVyZSBhcHByb3ByaWF0ZS4gVXNlIG93biBsYW5ndWFnZSEKCi0tLS0tLS0tLS0tLS0tCgojIyMgVGFzayAxOiBUZWNobmljYWwgVHJhZGluZyBSdWxlcwoKVGhpcyB0YXNrIGZvbGxvd3MgdGhlIGV4YW1wbGUgaW4gdGhlIGJvb2sgYFIgRXhhbXBsZSA2LjEvcCAxODVgIEEgbmV3IHBhY2thZ2Ugd2lsbCBiZSByZXF1aXJlZCBmb3IgdGhpcyB3b3Jrc2hlZXQuICBBbGwgcGFja2FnZXMgYXJlIGluY2x1ZGVkLCBmb3IgeW91ciBjb252ZW5pZW5jZSwgaW4gdGhlIGNvZGUgY2h1bmtzIGJlbG93LgoKYGBge3J9CiNJbnN0YWxsIHBhY2thZ2UgcXVhbnRtb2QgCmlmKCFyZXF1aXJlKCJxdWFudG1vZCIscXVpZXRseSA9IFRSVUUpKQogIGluc3RhbGwucGFja2FnZXMoInF1YW50bW9kIixkZXBlbmRlbmNpZXMgPSBUUlVFLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQpgYGAKCmBgYHtyfQojSW5zdGFsbCBwYWNrYWdlIGZBcm1hIGZvciBtb2RlbGxpbmcgQVJNQSB0aW1lIHNlcmllcyBwcm9jZXNzZXMKaWYoIXJlcXVpcmUoImZBcm1hIixxdWlldGx5ID0gVFJVRSkpCiAgaW5zdGFsbC5wYWNrYWdlcygiZkFybWEiLGRlcGVuZGVuY2llcyA9IFRSVUUsIHJlcG9zID0gImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZyIpCmBgYAoKVGhlIGZvbGxvd2luZyBxdWVzdGlvbnMgYXJlIGZvciBhIHN0b2NrIG9mIHlvdXIgY2hvaWNlIGZyb20gUyZQNTAwIChvdGhlciB0aGFuIEFBUEwgYW5kIHlvdXIgY29sbGVhZ3VlISkgYW5kIGZvciB0aGUgdGltZS1wZXJpb2QgZnJvbSBKYW4gMSwgMjAxNSB0byBwcmVzZW50LgoKT2JzZXJ2aW5nIHRoZSBjcm9zc2luZ3Mgb3IgaW50ZXJzZWN0aW9ucyBiZXR3ZWVuIHR3byBzaW1wbGUgbW92aW5nIGF2ZXJhZ2VzIGNhbiBwcm92aWRlIHNpZ25hbHMgZm9yIGJ1eWluZyBvciBzZWxsaW5nLiAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQSkgQ3JlYXRlIGEgY2hhcnQgb2YgY2xvc2UgcHJpY2VzIGFuZCBhZGQgdGhlIHR3byBzaW1wbGUgbW92aW5nIGF2ZXJhZ2VzIG92ZXIgdGhlIHBlcmlvZHMgbj0yMCBhbmQgbj01MC4gQ2xlYXJseSBsYWJlbCB0aGUgcGxvdHMgb3IgcHJvdmlkZSBhIGxlZ2VuZAo8L3NwYW4+CgpgYGB7cn0KZ2V0U3ltYm9scygiREFMIiwgZnJvbT0iMjAxNS0wMS0wMSIsIHRvID0gU3lzLkRhdGUoKSkKc21hMjAgPVNNQShEQUwkREFMLkNsb3NlLCBuID0gMjApCnNtYTUwID0gU01BKERBTCREQUwuQ2xvc2UsIG4gPSA1MCkKcGxvdChEQUwkREFMLkNsb3NlKQpsaW5lcyhzbWEyMCxjb2w9InJlZCIpCmxpbmVzKHNtYTUwLCBjb2w9ImJsdWUiKQpgYGAKClRoZSBibGFjayBsaW5lIGlzIHRoZSBncmFwaCBmb3IgY2xvc2luZyBwcmljZS4gVGhlIHJlZCBsaW5lIGlzIHdoZW4gTUEoMjApLCB0aGUgYmx1ZSBsaW5lIGlzIHdoZW4gTUEoNTApLiBUaGUgZGF0YSBpcyBtb3JlIGFjY3VyYXRlIHdoZW4gbj0yMCBzaW5jZSBpdOKAmXMgY2FsY3VsYXRlIGF2ZXJhZ2UgbW9yZSBmcmVxdWVudGx5LiBJZiB0aGUgcmVkIGxpbmUgY3Jvc3MgdXAgdGhlIGJsdWUgbGluZSwgdGhlIHN0b2NrIHByaWNlIHRlbmRzIHRvIGdvIHVwLCB3aGVuIHRoZSByZWQgbGluZSBjcm9zcyBkb3duIHRoZSBibHVlIHByaWNlLCB0aGUgc3RvY2sgcHJpY2UgdGVuZHMgdG8gZ28gZG93bi4KCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxQikgU2VsZWN0IGEgcGFydGljdWxhciBjcm9zc292ZXIgcG9pbnQgdG8gZXhwbGFpbiBob3cgeW91IHdvdWxkIGltcGxlbWVudCBhIHRyYWRpbmcgc3RyYXRlZ3kgKHJlZiBwMTg0KQo8L3NwYW4+CgpNYXRoZW1hdGljYWxseSBzcGVha2luZywgaWYgd2UgdGFrZSBuPTIwIGFuZCBtPTUwIGFzIGFuIGV4YW1wbGUgKHdoZXJlIG4gYWx3YXlzIDwgbSksIGNvbnNpZGVyIEN0IGFzIHRoZSBjbG9zaW5nIHByaWNlIGF0IHQuIEZvciBib3RoIG9mIHRoZW0gd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHRvIGNhbGN1bGF0ZSBtb3ZpbmcgYXZlcmFnZSB3aXRoIGRpZmZlcmVudCBsZW5ndGg6CiAgCiAgClRoZSBwZXJpb2QgSnVseSAyMDE3IGlzIHdoZW4gTUEoMjApIGNyb3NzZXMgZG93biBNQSg1MCkgaXMgYSBzaWduYWwgdG8gc2VsbCAoZ28gZG93bikuIFRoaXMgc2lnbmFscyBhIHByaWNlIGRyb3AuCklmIFh0aeKIkjEgPiAwIGFuZCBYdGkgPCAwLCBnbyBzaG9ydCBhdCBPdGkrMS4gVGhpcyBpcyB3aGVuIG49MjAgbGluZSBjcm9zcyBkb3duIG09NTAgbGluZSBhbmQgcHJpY2UgaXMgZ29pbmcgdG8gZ28gZG93bi4KCgoKQm9sbGluZ2VyIGJhbmRzIGFyZSBhIGtpbmQgb2YgYSB0cmFkaW5nIGJhbmRzIG9yIG1vdmluZyBhdmVyYWdlIGVudmVsb3Blcy4gIFRoZSBoaWdoIGFuZCBsb3cgbGltaXRzIG9mIGEgQm9sbGluZ2VyIGJhbmQgYXJlIGNhbGN1bGF0ZWQgYmFzZWQgb24gYSB4LW51bWJlciBvZiBzdGFuZGFyZCBkZXZpYXRpb24gKHVzdWFsbHkgMikgYXdheSBmcm9tIHRoZSBtb3ZpbmcgYXZlcmFnZS4gQSBzdGFuZGFyZCBkZXZpYXRpb24gaXMgYWxzbyBhIG1lYXN1cmUgb2Ygdm9sYXRpbGl0eSwgYXMgc3VjaCB0aGUgYmFuZCB3aWxsIHdpZGVuIHdoZW4gdm9sYXRpbGl0eSBpbmNyZWFzZXMgYW5kIGNvbnRyYWN0IHdoZW4gdm9sYXRpbGl0eSBkZWNyZWFzZXMuIEFzIHdpdGggYmFuZHMgYW5kIGVudmVsb3BlcyB0aGUgaWRlYSBvZiBCb2xsaW5nZXIgYmFuZCBpcyB0aGF0IHByaWNlcyB0ZW5kIHRvIHN0YXkgd2l0aGluIHRoZSBiYW5kLiBXaGVuIHByaWNlcyByZWFjaCB0aGUgdG9wIGJhbmQgaXQgaXMgYXNzdW1lZCB0aGF0IHJlc2lzdGFuY2Ugd2lsbCBiZSBlbmNvdW50ZXJlZCBhbmQgdGhlIHByaWNlIHdpbGwgZmFsbC4gIE9wcG9zaXRlIHRydWUgd2hlbiB0aGUgbG93ZXIgYmFuZCBpcyByZWFjaGVkLiBXaGVuIHRoZSBwcmljZSBtb3ZlcyBvdXRzaWRlIHRoZSBiYW5kcywgYSBjb250aW51YXRpb24gb2YgdGhlIGN1cnJlbnQgdHJlbmQgaXMgZXhwZWN0ZWQuCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMUMpIENoYXJ0IHRoZSBCb2xsaW5nZXIgQmFuZHMgYmFzZWQgb24gdGhlIDIwLWRheXMgbW92aW5nIGF2ZXJhZ2UgYW5kIHR3byBzdGFuZGFyZCBkZXZpYXRpb25zLiBTZWxlY3QgYSBwYXJ0aWN1bGFyIHBvaW50IHRvIGV4cGxhaW4gaG93IHRoZSBCQiBjYW4gYmUgdXNlZCBpbiBhIHRyYWRpbmcgc3RyYXRlZ3kgKHJlZiBwMTg1KQo8L3NwYW4+CgpgYGB7cn0KZ2V0U3ltYm9scygiREFMIikKY2hhcnRTZXJpZXMoREFMLCBzdWJzZXQ9JzIwMTUtMDEtMDE6OjIwMTktMDEtMjInLHRoZW1lPWNoYXJ0VGhlbWUoJ3doaXRlJyx1cC5jb2w9J2dyZWVuJyxkbi5jb2w9J3JlZCcpLFRBPWMoYWRkQkJhbmRzKG49MjAsc2Q9MiwpKSkKCmBgYAoKR2VuZXJhbCBydWxlIGlzIHRvIGdvIGxvbmcgd2hlbiBwcmljZSBicmVha3MgdXBwZXIgYmFuZCBhbmQgZ28gc2hvcnQgd2hlbiBwcmljZSBjcm9zc2VzIGxvd2VyIGJhbmQuIFRoZSByZXN1bHRzIGFyZSByb3VnaGx5IGNvbnNpc3RlbnQgd2l0aCBtb3ZpbmcgYXZlcmFnZSBjcm9zc292ZXIgcnVsZSwgd2hpbGUgQkIgaXMgbW9yZSBhIHZvbGF0aWxpdHkgaW5kaWNhdG9yLgoKVGhlIHN0b2NrIHByaWNlIGJyZWFrcyB0aGUgdXBwZXIgYmFuZCBvZiB0aGUgQkIgaW4gdGhlIHBlcm9kICBKYW4gMDIgMjAxOC4gVGhpcyBpbmRpY2F0ZXMgYSBzaWduYWwgdG8gZ28gbG9uZyBvbiB0aGUgc3RvY2suIAoKClJTSSBtZWFzdXJlcyB0aGUgdmVsb2NpdHkgb2YgcHJpY2UgY2hhbmdlcy4gUmFwaWQgcHJpY2UgaW5jcmVhc2VzIGlzIGFuIGluZGljYXRpb24gb2Ygc3RvY2sgb3ZlcmJvdWdodCBjb25kaXRpb25zLCBhbmQgcmFwaWQgcHJpY2UgZGVjcmVhc2VzIHJlc3VsdCBpbiBvdmVyc29sZCBjb25kaXRpb25zLiBXaGVuIHVzZWQgcHJvcGVybHkgUlNJIGNhbiBhc3Npc3QgaW4gb3B0aW1pemluZyBwcm9wZXIgZW50cnkgYW5kIGV4aXQgZGVjaXNpb25zLiAKCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAxRCkgQ2hhcnQgdGhlIFJlbGF0aXZlIFN0cmVuZ3RoIEluZGV4IChSU0kpIGJhc2VkIG9uIDE0LWRheXMgbW92aW5nIGF2ZXJhZ2UuIFNlbGVjdCBhIHBhcnRpY3VsYXIgcG9pbnQgdG8gZXhwbGFpbiBob3cgUlNJIGNhbiBiZSB1c2VkIGluIGEgdHJhZGluZyBzdHJhdGVneSAocmVmIHAyMDYpCjwvc3Bhbj4KCmBgYHtyfQpnZXRTeW1ib2xzKCJEQUwiKQpjaGFydFNlcmllcyhEQUwsIHN1YnNldD0nMjAxNS0wMS0wMTo6MjAxOS0wMS0yMicsdGhlbWU9Y2hhcnRUaGVtZSgnd2hpdGUnLHVwLmNvbD0nZ3JlZW4nLGRuLmNvbD0ncmVkJyksIFRBPWMoYWRkUlNJKG49MTQpKSkKYGBgCgpTbywgaW4gdGhlIHBlcmlvZCBzbGlnaHRseSBiZWZvcmUgSmFuIDAzIDIwMTcsIFdoZW4gdGhlIFJTSSBjcm9zc2VzIGFib3ZlIHRoZSB1cHBlciB0aHJlc2hvbGQoIGFib3ZlIDcwKSwgaXQgaW5kaWNhdGVzIG92ZXJib3VnaHQgY29uZGl0aW9uczsgSGVuY2UsIGl0cyB0aGUgcmlnaHQgdGltZSB0byBnbyBzaG9ydCBvbiB0aGUgc3RvY2sKCk5vdGFibHkgdGhhdCBzdWRkZW4gbGFyZ2UgcHJpY2UgbW92ZW1lbnRzIGNhbiBjcmVhdGUgZmFsc2UgYnV5IG9yIHNlbGwgc2lnbmFscyBpbiB0aGUgUlNJLiBJdCBpcywgdGhlcmVmb3JlLCBiZXN0IHVzZWQgd2l0aCByZWZpbmVtZW50cyB0byBpdHMgYXBwbGljYXRpb24gb3IgaW4gY29uanVuY3Rpb24gd2l0aCB0ZWNobmljYWwgdHJhZGluZyBydWxlcy4KCgoKIyMjIFRhc2sgMjogTW9kZWxpbmcgJiBGb3JlY2FzdGluZwoKU2ltaWxhciB0byBsYWIwMyBwaWNrIGEgY3VycmVuY3kgZXhjaGFuZ2UgcmF0ZXMgb2YgeW91ciBjaG9pY2UuICBGb2xsb3cgYFIgRXhhbXBsZSA0LjIvcCAxMTlgLiAgUGF5IHNwZWNpYWwgYXR0ZW50aW9uIHRvIGBSZW1hcmsgNC4xL3AgMTEyYCBhbmQgY2xhc3Mgbm90ZXMgZm9yIHRoZSBjb3JyZWN0IGludGVycHJldGF0aW9uIGFuZCByZXByZXNlbnRhdGlvbiBvZiByZXN1bHRzLiAgICBEZXBlbmRpbmcgb24gdGhlIFIgdmVyc2lvbiwgIHRoZSBwYWNrYWdlIGBmQXJtYWAgbWF5IG5vdCBiZSBhdmFpbGFibGUgKHRydWUgZm9yIDMuNSBhbmQgdXApLiAgT25lIGNhbiB1c2UgaW5zdGVhZCB0aGUgZnVuY3Rpb24gYGFyaW1hKClgIHRvIGZpdCBhbiBgQVIoMSlgIGFuZCB0aGUgYHByaW50YCB0byBvYnRhaW4gdGhlIG1vZGVsIGNvZWZmaWNpZW50cy4gIENoZWNrIHRoZSBpbGx1c3RyYXRlZCBleGFtcGxlIGJlbG93IGFuZCByZWFkIHRoZSBIZWxwIGluIFIsIGFzIG5lZWRlZCwgZm9yIG1vcmUgaW5zaWdodHMgb24gaG93IHRvIHVzZSBjb21tYW5kcy4KCmBgYHtyfQojYXIxID0gYXJpbWEoZGF0YXNldCwgb3JkZXIgPSBjKDEsMCwwKSkgdG8gb2J0YWluIHRoZSBlcXVpdmFsZW50IG9mIGFuIEFSKDEpIG1vZGVsIGZpdC4gIGRhdGFzZXQgaXMgaW4gcmVmZXJlbmNlIHRvIHlvdXIgcGFydGljdWxhciBjdXJyZW5jeSBleGNoYW5nZSBwYWlyIGxpa2UgUlVCVVNEIGZvciBleGFtcGxlLgojcHJpbnQoYXIxKSB0byBwcmludCB0aGUgY29mZmVjaWVudHMgb2YgdGhlIG1vZGVsLiAgUGF5IGF0dGVudGlvbiB0byB0aGUgaW50ZXJwcmV0YXRpb24gb2YgaW50ZXJjZXB0CmBgYAoKCkZpcnN0IHdlIGRlcml2ZSBhbiBhdXRvcmVncmVzc2l2ZSBtb2RlbCBvZiBvcmRlciAxLCBleGNsdWRpbmcgdGhlIG91dC1vZi1zYW1wbGUgcG9pbnRzLiAgVG8gZXhjbHVkZSBwcGludHMgY2hlY2sgdGhlIGV4YW1wbGUgYmVsb3cKCmBgYHtyfQojYXIxID0gYXJpbWFkYXRhc2V0WzE6bl0sIG9yZGVyIC0gYygxLDAsMCkpLiAgVGhpcyB3aWxsIGJ1aWxkIGFuIEFSKDEpIG1vZGVsIGJhc2VkIG9uIHRoZSB0aW1lIHNlcmllcyBkYXRhc2V0IFsxOm5dIHdoZXJlIG4gaXMgdGhlIGxlbmd0aCBvZiB0aGUgdGllIHNlcmllcyBtaW51cyB0aGUgbGFzdCBmb3VyIHBvaW50cy4gIEZvciBleGFtcGxlIEVVUlVTRFsxOjE3NV0gaXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB0b3RhbCB0aW1lIHNlcmllcyBmb3IgdGhlIEVVUlVTRCBpcyAxNzkgb2JzZXJ2YXRpb24gcG9pbnRzLgpgYGAKCgo8c3BhbiBzdHlsZT0iY29sb3I6cmVkIj4KIyMjIyMgMkEpIERlcml2ZSBhbiBBUigxKSBtb2RlbCBleGNsdWRpbmcgdGhlIGxhc3QgZm91ciBwb2ludHMgZnJvbSB5b3VyIHRpbWUgc2VyaWVzICh0aGUgb3V0LW9mLXNhbXBsZSkuIE5vdGUgdGhlIHZhbHVlcyBvZiB0aGUgbW9kZWwgY29lZmZpY2llbnRzLCBhbmQgd3JpdGUgZG93biB0aGUgY29ycmVzcG9uZG5nIG1hdGhlbWF0aWNhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwuICAgICAgCjwvc3Bhbj4KYGBge3J9CmdldEZYKCJDTlkvVVNEIikgCmFyMSA9IGFyaW1hKENOWVVTRFsxOjE3NV0sIG9yZGVyID0gYygxLDAsMCkpCmFyaW1hKHg9Q05ZVVNELCBvcmRlciA9IGMoMSwgMCwgMCkpCiMjbGlicmFyeShmQXJtYSkKI2FyMSA9IGFyaW1hZGF0YXNldFsxOm5dLCBvcmRlciAtIGMoMSwwLDApKQojYXIxID0gYXJpbWEofmFyKDEpLCBtZXRob2Q9Inl1bGUtd2Fsa2VyIiwgZGF0YT1DTllVU0QpCnN1bW1hcnkoYXIxKQpgYGAKCgpUaGUgbWF0aGVtYXRpY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBBUigxKSBwcm9jZXNzIGlzCgokWV97dH0gPSAwLjE0NTggKzAuOTY4Mllfe3QtMX0gKyBXX3t0fSQgd2hlcmUgeyRXX3t0fSR9fk4oMCwkXHNpZ21hXjIkKQoKTmV4dCB3ZSBhcHBseSB0aGUgZGVyaXZlZCBtb2RlbCB0byBwcmVkaWN0IHRoZSByYXRlcywgd2l0aGluIGNvbmZpZGVuY2UgbGV2ZWxzLCAgZm9yIHRoZSBvdXQtb2Ytc2FtcGxlIHBvaW50cy4KCjxzcGFuIHN0eWxlPSJjb2xvcjpyZWQiPgojIyMjIyAyQikgVXNpbmcgdGhlIGZpdHRlZCBtb2RlbCwgcHJlZGljdCB0aGUgcmF0ZXMgZm9yIHRoZSBleGNsdWRlZCBwb2ludHMgY29ycmVzcG9uZGluZyB0byB0aGUgZm91ciBkYXlzIGFoZWFkLiAgU2VsZWN0IG9uZSAgcGFydGljdWxhciBmb3JlY2FzdGVkIGRheSB0byBpbGx1c3RyYXRlIG1hbnVhbGx5IGhvdyB0aGUgcmVwb3J0ZWQgcHJlZGljdGVkIHJhdGUgY2FuIGJlIHJlcHJvZHVjZWQgdXNpbmcgdGhlIGRlcml2ZWQgQVIoMSkgbW9kZWwuCjwvc3Bhbj4KCmBgYHtyfQpwcmVkaWN0KGFyMSxuLmFoZWFkID0gNCwgbi5iYWNrID0gMTc1KQpgYGAKYGBge3J9CkNOWVVTRFsxNzY6MTc5XQpgYGAKCgpUbyBtYW51YWxseSBjYWxjdWxhdGUgdGhlIGZpcnN0IHByZWRpY3RlZCB2YWx1ZSBvZiB0aGUgbW9kZWwganVzdCBpbnNlcnQgdGhlIHByZXZpb3VzIHZhbHVlIGZyb20gdGhlIHRpbWUgc2VyaWVzIGludG8gdGhlIGVxdWF0aW9uLiAKCiRZX3t0fSA9IDAuMTQ1OCArMC45NjgyKDAuMTQ3NTYyKSAKCkZpbmFsbHkgd2Ugd2FudCB0byBhc3Nlc3MgdGhlIGdvb2RuZXNzIG9mIHRoZSBtb2RlbCBieSBjb25kdWN0aW5nIGEgcXVhbnRpdGF0aXZlIGFuYWx5c2lzLgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDJDKSBGb3JtdWxhdGUgYW5kIGV4ZWN1dGUgYSB3YXkgdG8gdGVzdCB0aGUgZml0bmVzcyBvZiB0aGUgbW9kZWwuIFNoYXJlIHlvdXIgcmVzdWx0cy4KPC9zcGFuPgoKVGhlIE1lYW4gU3F1YXJlZCBFcnJvciB0ZXN0IHRoZSBmaXRuZXNzIG9mIHRoaXMgbW9kZWwuCgpNU0UgPSAxL20JJFxzdW1fe3ggPSAxfV57bX0gKHlfe3R9LVxoYXR7eV97dH19KV57Mn0kCgpGcm9tIHRoZSBmb3JtdWxhLCB5dCBpcyB0aGUgYWN0dWFsIHRlc3Rpbmcgc2V0IGFuZCB5XnQgaXMgdGhlIHByZWRpY3RlZCBzZXQuIEFsc28sIHRoZSBzbWFsbGVyIHRoZSBNU0Ugc2hvd3MgYSBtb3JlIGFjY3VyYXRlIG1vZGVsLgoKCgojIyMgVGFzayAzOiBGdW5kYW1lbnRhbCBBbmFseXNpcwoKQ29uc2lkZXIgdHdvIHN0b2NrcyBvZiB5b3VyIGNob2ljZS4gVW5mb3J0dW5hdGVseSAgdGhlIGNvZGUgaW4gdGhlIGBSIEV4YW1wbGUgNi4yL3AgMjAyYCBpcyBubyBtb3JlIHZhbGlkIGFzIEdvb2dsZSBzdG9wcGVkIHByb3ZpZGluZyBzdWNoIGRhdGEgYXMgb2YgTWFyY2ggMjAxOC4gIEluc3RlYWQgeW91IGFyZSBhZHZpc2VkIHRvIHVzZSBCbG9vbWJlcmcgb3Igb3RoZXIgc291cmNlcyB0byBleHRyYWN0IHRoZSBuZWVkZWQgaW5mb3JtYXRpb24uICBUaGUgaW5mb3JtYXRpb24gaW4gQmxvb21iZXJnIGlzIGF2YWlsYWJsZSBpbiB0aGUgc2VjdXJpdHkgZGVzY3JpcHRpb24gcGFnZSBvZiBhIHN0b2NrLgoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDNBKSBGb3IgZWFjaCBzdG9jayByZXBvcnQgdGhlIFAvQiwgUC9FLCBhbmQgQXNzZXRzL0RlYnRzIHJhdGlvcy4gTm90ZSBhbHNvIHRoZSBmaXNjYWwgY2FsZW5kYXIgZGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcG9ydGVkIHJhdGlvcy4KPC9zcGFuPgoKIVtOSUtFIFVTXSgvdXNlcnMvdGl0aWxvcGVvbHV0YXlvL2Rlc2t0b3AvUmZpbGVzL3NnMjAxOTAxMTgzNDY1OS5naWYpCgpGcm9tIHRoZSBpbWFnZSwgTktFJ3MgUC9CIHJhdGlvIGlzIDE0LjMwLCBQL0UgaXMgMzEuMSBhbmQgQXNzZXRzL0RlYnRzIHJhdGlvIGlzIDE2LjkwJQoKIVtUYXJnZXQgVVNdKC91c2Vycy90aXRpbG9wZW9sdXRheW8vZGVza3RvcC9SZmlsZXMvc2cyMDE5MDExODM0ODI1LmdpZikKCkZyb20gdGhlIGltYWdlLCBUR1QncyBQL0IgcmF0aW8gaXMgMy4yNywgUC9FIGlzIDEzLjIgYW5kIEFzc2V0cy9EZWJ0cyByYXRpbyBpcyAzMy40JQoKPHNwYW4gc3R5bGU9ImNvbG9yOnJlZCI+CiMjIyMjIDNCKSBCYXNlZCBvbiBzb2xlbHkgdGhlIHRocmVlIHJlcG9ydGVkIHJhdGlvcyB3aGljaCBjb21wYW55IGhhcyBhIHN0cm9uZ2VyIGZpbmFuY2lhbCBjb25kaXRpb24uIEV4cGxhaW4geW91ciBsb2dpYy4KPC9zcGFuPgoKQmFzZWQgb24gdGhlIFBFIHJhdGlvIGZvciBOaWtlIGFuZCBUYXJnZXQsIGEgbG93ZXIgUEUgcmF0aW8gaXMgYmV0dGVyLiBJbiB3aGljaCBUYXJnZXQgaGFzIGEgbG93ZXIgUEUgcmF0aW8gb2YgMTMuMi4gSGlzdG9yaWNhbGx5IFBFIHJhdGlvIGlzIGJldHdlZW4gMTUtMjUuCgpCYXNlZCBvbiB0aGUgUEIgcmF0aW8gZm9yIE5pa2UgYW5kIFRhcmdldCwgQSBQQiByYXRpbyBoaWdoZXIgdGhhbiAxIG1lYW5zIHRoZSBtZWFucyB0aGUgbWFya2V0IGludmVzdG9ycyBhcmUgb3ZlcnZhbHVsaW5nIHRoZSBjb21wYW55LiBOaWtlIGFuZCBUYXJnZXQgaGF2ZSBQQiByYXRpbyBncmVhdGVyIHRoYW4gMSB3aGljaCBpcyAxNC4zMCBhbmQgMy4yNyByZXNwZWN0aXZlbHkuIEluIHRoaXMgaW5zdGFuY2UgVGFyZ2V0cydzIFBCIHJhdGlvIGlzIGJldHRlciBiZWNhdXNlIGl0cyBhIGxpdHRsZSBiaXQgb3ZlciAxIG1lYW5pbmcgaXRzIG92ZXJwcmljaW5nIGlzIG5vdCBzbyBiYWQuCgpCYXNlZCBvbiB0aGUgQXNzZXRzIGFuZCBEZWJ0cyByYXRpbyBvZiBOaWtlICgxNi45JSkgYW5kIFRhcmdldCgzMy40JSkuVGhlIHN0YXRpc3RpY3Mgc2hvd3MgdGFodCBUYXJnZXQgaXMgbW9yZSBoaWdobHkgbGV2ZXJhZ2VkIHRoYW4gTmlrZS4gVGhlIGdyZWF0ZXIgdGhlIGZpbmFuY2lhbCBsZXZlcmFnZSB0aGUgZ3JlYXRlciB0aGUgcmlzayBlc3BlY2lhbGx5IGluIGFuIGluY3JlYXNpbmcgaW50ZXJlc3QgcmF0ZSBtYXJrZXQuCgpPdmVyYWxsLCBJIGZlZWwgVGFyZ2V0IGhhcyBhIHN0cm9uZ2VyIGZpbmFuY2lhbCBjb25kaXRpb24gdGhhbiBOaWtlLiAgSG93ZXZlciwgZXZlbnRob3VnaCBUYXJnZXQgaXMgbW9yZSBoaWdobHkgbGV2ZXJhZ2VkIHRoYW4gTmlrZSB3aGljaCBjb3VsZCBwb3NlIGdyZWF0IHJpc2sgYnV0IHRoZSBhZHZhbnRhZ2UgaXMgdGhhdCBUYXJnZXQgaGFzIG1vcmUgUk9FIGJlY2F1c2Ugb2YgaXRzIGhpZ2hseSBsZXZlcmFnZWQgcG9zaXRpb24uICAKCipbaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1IF0oaHR0cDovL2NvbXB1dGF0aW9uYWxmaW5hbmNlLmxzaS51cGMuZWR1KQo=