This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

Slide 3

Import the Growth_Value Excel sheet from the Chapter 3 Excel file

Slide 6

Acetech=c(40000,40000,65000,90000,100000,145000,150000,550000)
mean(Acetech)
[1] 147500

Slide 8

median(Acetech)
[1] 95000

Slide 9

load and activate the statip package

#mfv=most frequent value
mfv(Acetech)
[1] 40000

Slide 10

load the epiDisplay package

Sizes=c('S','L','L','M','S','L','M','L','L','M')
tab1(Sizes)
Sizes : 
        Frequency Percent Cum. percent
L               5      50           50
M               3      30           80
S               2      20          100
  Total        10     100          100

Slide 11

Import and activate the psych package

#in this output, the SD refers to the sample standard deviation
describe(Growth_Value)

Population SD (if needed)

# this is the code to create the population standard deviation function:

sd.p=function(x){sd(x)*sqrt((length(x)-1)/length(x))}

#Once the above code is input, you can use the following command to produce the population standard deviation
sd.p(Growth_Value$Growth)
[1] 23.46641187

Slide 13

options(digits=10)
summary(Growth_Value)
      Year             Growth             Value         
 Min.   :1984.00   Min.   :-40.9000   Min.   :-46.5200  
 1st Qu.:1992.75   1st Qu.:  2.8600   1st Qu.:  1.7025  
 Median :2001.50   Median : 15.2450   Median : 15.3800  
 Mean   :2001.50   Mean   : 15.7550   Mean   : 12.0050  
 3rd Qu.:2010.25   3rd Qu.: 36.9725   3rd Qu.: 22.4375  
 Max.   :2019.00   Max.   : 79.4800   Max.   : 44.0800  

Slide 15

Load the matrixStats package

#the answer on the slides (75.5) is incorrect. R will produce the correct answer (72.5)
Score=c(60,70,80)
Weight=c(.25,.25,.5)
weightedMean(Score,Weight)
[1] 72.5
mean(Score)
[1] 70

Slide 17

The book uses this code:

ClothingMean <- aggregate(Online$Clothing, by=list(Online$Sex), mean)
ClothingMean

This code may be simpler in some cases:

aggregate(. ~ Sex, Online, mean)

Slide 20

?summary
summary(Growth_Value)
      Year             Growth             Value         
 Min.   :1984.00   Min.   :-40.9000   Min.   :-46.5200  
 1st Qu.:1992.75   1st Qu.:  2.8600   1st Qu.:  1.7025  
 Median :2001.50   Median : 15.2450   Median : 15.3800  
 Mean   :2001.50   Mean   : 15.7550   Mean   : 12.0050  
 3rd Qu.:2010.25   3rd Qu.: 36.9725   3rd Qu.: 22.4375  
 Max.   :2019.00   Max.   : 79.4800   Max.   : 44.0800  
#note that the help description specified that quantile type=7

Slide 21

To directly calculate the inter-quartile range:

IQR(Growth_Value$Growth)
[1] 34.1125
IQR(Growth_Value$Value)
[1] 20.735
?IQR
#notice in the help description, the type=7; that is because there are 9 different, valid ways to calculate quantiles (they become more similar the more measurements you have and they are essentially the same with 100 or more observations)
#see the Sample Quantiles help description in the stats package for a description of the 9 possible methods to calculate quantiles

?quantile
#For example:
quantile(Growth_Value$Growth, probs=c(.2, .3,.4), type=7)
  20%   30%   40% 
-1.70  6.92 12.12 
#For more information, see:

# https://www.jstor.org/stable/2684934

Slide 24

Boxplot

boxplot(Growth_Value$Growth, Growth_Value$Value, xlab="Annual Returns, 1984-2019
(in percent)", names =c("Growth","Value"), horizontal = TRUE,
col="gold")

This will analyze the data for outliers and extreme values load the rstatix package

Value=as.data.frame(Growth_Value$Value)
identify_outliers(Value)
NA

Slide 30

#this code gives the high and low values of the range
range(Growth_Value$Growth)
[1] -40.90  79.48
range(Growth_Value$Value)
[1] -46.52  44.08

Load the pastecs package

#this code will calculate the range itself as well as the standard deviation and variance
stat.desc(Growth_Value$Growth)
      nbr.val      nbr.null        nbr.na           min           max 
 36.000000000   0.000000000   0.000000000 -40.900000000  79.480000000 
        range           sum        median          mean       SE.mean 
120.380000000 567.180000000  15.245000000  15.755000000   3.966547567 
 CI.mean.0.95           var       std.dev      coef.var 
  8.052519664 566.405985714  23.799285403   1.510586189 

Mean Absolute Deviation: Load the DescTools package

MeanAD(Growth_Value$Growth)
[1] 17.49055556
MeanAD(Growth_Value$Value)
[1] 13.66666667

Variance and Standard Deviation

var(Growth_Value$Growth)
[1] 566.4059857
sd(Growth_Value$Growth)
[1] 23.7992854
var(Growth_Value$Value)
[1] 323.2511743
sd(Growth_Value$Value)
[1] 17.97918725

Slide 32

Load the EnvStats package

cv(Growth_Value$Growth)
[1] 1.510586189
cv(Growth_Value$Value)
[1] 1.497641587

Slide 35

Sharpe Ratio

(mean(Growth_Value$Growth)-1)/sd(Growth_Value$Growth)
[1] 0.619976598
(mean(Growth_Value$Value)-1)/sd(Growth_Value$Value)
[1] 0.612096634

Slide 37

k=2
Cheb <- sapply(k, function(k) 1-1/k^2)
Cheb
[1] 0.75

Slide 39

pnorm(1)-pnorm(-1)
[1] 0.6826894921
pnorm(2)-pnorm(-2)
[1] 0.9544997361
pnorm(3)-pnorm(-3)
[1] 0.9973002039

Slide 40

Note that for this slide, the numbers are slightly off from what the book describes because +/- 1.96 standard deviations gives 95%, but they rounded to 2 standard deviations in their description

pnorm(90,74,8)-pnorm(58,74,8)
[1] 0.9544997361
1-pnorm(90,74,8)
[1] 0.02275013195
0.02275013195*280

Slide 43

#this will generate the Z scores for the Growth column
scale(Growth_Value$Growth)
                [,1]
 [1,] -0.89309404210
 [2,]  1.01494644022
 [3,] -0.11449923617
 [4,] -0.73342538249
 [5,]  0.01239533015
 [6,]  1.08763769841
 [7,] -0.51114980109
 [8,]  1.36873857546
 [9,] -0.32837120390
[10,]  0.01827785972
[11,] -0.75527477802
[12,]  1.00234101972
[13,]  0.04432906208
[14,]  0.13256700554
[15,]  0.48215733395
[16,]  2.67760140356
[17,] -0.92754885812
[18,] -1.72547197548
[19,] -2.06749905158
[20,]  1.07587263928
[21,] -0.15273567834
[22,] -0.09475074406
[23,] -0.26030193323
[24,]  0.17374471249
[25,] -2.38053366055
[26,]  1.06704884493
[27,]  0.20147663758
[28,] -0.63384256058
[29,]  0.11617995890
[30,]  0.91830488309
[31,] -0.05525375984
[32,] -0.33299319142
[33,] -0.40946607576
[34,]  0.88258952502
[35,] -0.85233651583
[36,]  0.95233951843
attr(,"scaled:center")
[1] 15.755
attr(,"scaled:scale")
[1] 23.7992854
#this will generate the min and max Z-scores for the Growth column
min(scale(Growth_Value$Growth))
[1] -2.380533661
max(scale(Growth_Value$Growth))
[1] 2.677601404

Slide 46


plot(Growth_Value$Growth, Growth_Value$Value, xlab = "Growth", ylab = "Value", pch=21,  bg="red")

Slide 47

cov(Growth_Value)
                Year        Growth         Value
Year   111.000000000  -7.485142857  -4.020571429
Growth  -7.485142857 566.405985714 285.605448571
Value   -4.020571429 285.605448571 323.251174286
#The covariance between the Growth and Value funds can be found by looking at the number where the Growth column and Value row meet, as well as where the Growth row and Value column meet
cor(Growth_Value)
                 Year         Growth          Value
Year    1.00000000000 -0.02985208619 -0.02122541728
Growth -0.02985208619  1.00000000000  0.66747117548
Value  -0.02122541728  0.66747117548  1.00000000000
#The correlation between the Growth and Value funds can be found by looking at the number where the Growth column and Value row meet, as well as where the Growth row and Value column meet

#also see https://rpsychologist.com/correlation/

Slide 49

Geometric Mean: Load the EnvStats package

The Geometric Mean formula cannot use negative numbers. Thus, if you had a 100% increase one year and a 50% loss the next year, you would have what you started with. In r, you would write it as 2.0 (a 100% increase or doubling) and 0.50 (your amount was cut by 50%):

#this represents a doubling in the first year and losing half in the second year--you are left with 100% of what you started with
return=c(2.0,0.5)
geoMean(return)
[1] 1
#the arithmetic mean gives you the incorrect answer and suggests you are left with an extra 25% at the end of the second year:
mean(return)
[1] 1.25
#this code is for the example on slide 49 and represents a 10% increase followed by a 10% decrease

r=c(1.1,0.9)
geoMean(r)
[1] 0.9949874371
#the answer (0.995) shows a .005 loss or -0.5%

For the Connect homework and exams, they sometimes give (for example), the first 2 years and the first half of the third year. In this case you would need to multiply the numbers and then take the 2.5th root

#If our return is 10% in the first year and 25% in the second year, with a loss of 15% in the first half of the third year, your calculation would look like:

(1.1*1.25*0.85)^(1/(2.5))
[1] 1.064360257

Slide 51


time1=13322
time2=16915

n=5

G=(x=time2/time1)^(1/(n-1))
G-1
[1] 0.06151379683
#the result is written as a proportion

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiSmFnZ2lhICYgS2VsbHkgNXRoIGVkaXRpb24gQ2hhcHRlciAzIFIgQ29kZSIKCmF1dGhvcjoKICAtIERyLiBSb25hbGQgTS4gTWlsbGVyLCAgV29vZGJ1cnkgU2Nob29sIG9mIEJ1c2luZXNzLCBVdGFoIFZhbGxleSBVbml2ZXJzaXR5LCByb25hbGQubWlsbGVyQHV2dS5lZHUKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ21kK1NoaWZ0K0VudGVyKi4gCgoKIyMgU2xpZGUgMwpJbXBvcnQgdGhlIEdyb3d0aF9WYWx1ZSBFeGNlbCBzaGVldCBmcm9tIHRoZSBDaGFwdGVyIDMgRXhjZWwgZmlsZQoKCiMjIFNsaWRlIDYKYGBge3J9CkFjZXRlY2g9Yyg0MDAwMCw0MDAwMCw2NTAwMCw5MDAwMCwxMDAwMDAsMTQ1MDAwLDE1MDAwMCw1NTAwMDApCm1lYW4oQWNldGVjaCkKCmBgYAoKIyMgU2xpZGUgOApgYGB7cn0KbWVkaWFuKEFjZXRlY2gpCmBgYAoKCiMjIFNsaWRlIDkKbG9hZCBhbmQgYWN0aXZhdGUgdGhlIHN0YXRpcCBwYWNrYWdlCmBgYHtyfQojbWZ2PW1vc3QgZnJlcXVlbnQgdmFsdWUKbWZ2KEFjZXRlY2gpCmBgYAoKIyMgU2xpZGUgMTAKbG9hZCB0aGUgZXBpRGlzcGxheSBwYWNrYWdlCmBgYHtyfQpTaXplcz1jKCdTJywnTCcsJ0wnLCdNJywnUycsJ0wnLCdNJywnTCcsJ0wnLCdNJykKdGFiMShTaXplcykKYGBgCgoKIyMgU2xpZGUgMTEKSW1wb3J0IGFuZCBhY3RpdmF0ZSB0aGUgcHN5Y2ggcGFja2FnZQpgYGB7cn0KI2luIHRoaXMgb3V0cHV0LCB0aGUgU0QgcmVmZXJzIHRvIHRoZSBzYW1wbGUgc3RhbmRhcmQgZGV2aWF0aW9uCmRlc2NyaWJlKEdyb3d0aF9WYWx1ZSkKYGBgCgoKUG9wdWxhdGlvbiBTRCAoaWYgbmVlZGVkKQpgYGB7cn0KIyB0aGlzIGlzIHRoZSBjb2RlIHRvIGNyZWF0ZSB0aGUgcG9wdWxhdGlvbiBzdGFuZGFyZCBkZXZpYXRpb24gZnVuY3Rpb246CgpzZC5wPWZ1bmN0aW9uKHgpe3NkKHgpKnNxcnQoKGxlbmd0aCh4KS0xKS9sZW5ndGgoeCkpfQoKI09uY2UgdGhlIGFib3ZlIGNvZGUgaXMgaW5wdXQsIHlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byBwcm9kdWNlIHRoZSBwb3B1bGF0aW9uIHN0YW5kYXJkIGRldmlhdGlvbgpzZC5wKEdyb3d0aF9WYWx1ZSRHcm93dGgpCmBgYAoKIyMgU2xpZGUgMTMKCmBgYHtyfQpvcHRpb25zKGRpZ2l0cz0xMCkKc3VtbWFyeShHcm93dGhfVmFsdWUpCmBgYAoKIyMgU2xpZGUgMTUKTG9hZCB0aGUgbWF0cml4U3RhdHMgcGFja2FnZQpgYGB7cn0KI3RoZSBhbnN3ZXIgb24gdGhlIHNsaWRlcyAoNzUuNSkgaXMgaW5jb3JyZWN0LiBSIHdpbGwgcHJvZHVjZSB0aGUgY29ycmVjdCBhbnN3ZXIgKDcyLjUpClNjb3JlPWMoNjAsNzAsODApCldlaWdodD1jKC4yNSwuMjUsLjUpCndlaWdodGVkTWVhbihTY29yZSxXZWlnaHQpCmBgYAoKYGBge3J9Cm1lYW4oU2NvcmUpCmBgYAoKIyMgU2xpZGUgMTcKVGhlIGJvb2sgdXNlcyB0aGlzIGNvZGU6CmBgYHtyfQpDbG90aGluZ01lYW4gPC0gYWdncmVnYXRlKE9ubGluZSRDbG90aGluZywgYnk9bGlzdChPbmxpbmUkU2V4KSwgbWVhbikKQ2xvdGhpbmdNZWFuCmBgYAoKVGhpcyBjb2RlIG1heSBiZSBzaW1wbGVyIGluIHNvbWUgY2FzZXM6CmBgYHtyfQphZ2dyZWdhdGUoLiB+IFNleCwgT25saW5lLCBtZWFuKQpgYGAKCgojIyBTbGlkZSAyMAoKYGBge3J9Cj9zdW1tYXJ5CnN1bW1hcnkoR3Jvd3RoX1ZhbHVlKQoKCiNub3RlIHRoYXQgdGhlIGhlbHAgZGVzY3JpcHRpb24gc3BlY2lmaWVkIHRoYXQgcXVhbnRpbGUgdHlwZT03CmBgYAoKCiMjIFNsaWRlIDIxClRvIGRpcmVjdGx5IGNhbGN1bGF0ZSB0aGUgaW50ZXItcXVhcnRpbGUgcmFuZ2U6CmBgYHtyfQpJUVIoR3Jvd3RoX1ZhbHVlJEdyb3d0aCkKSVFSKEdyb3d0aF9WYWx1ZSRWYWx1ZSkKP0lRUgojbm90aWNlIGluIHRoZSBoZWxwIGRlc2NyaXB0aW9uLCB0aGUgdHlwZT03OyB0aGF0IGlzIGJlY2F1c2UgdGhlcmUgYXJlIDkgZGlmZmVyZW50LCB2YWxpZCB3YXlzIHRvIGNhbGN1bGF0ZSBxdWFudGlsZXMgKHRoZXkgYmVjb21lIG1vcmUgc2ltaWxhciB0aGUgbW9yZSBtZWFzdXJlbWVudHMgeW91IGhhdmUgYW5kIHRoZXkgYXJlIGVzc2VudGlhbGx5IHRoZSBzYW1lIHdpdGggMTAwIG9yIG1vcmUgb2JzZXJ2YXRpb25zKQpgYGAKCgoKYGBge3J9CiNzZWUgdGhlIFNhbXBsZSBRdWFudGlsZXMgaGVscCBkZXNjcmlwdGlvbiBpbiB0aGUgc3RhdHMgcGFja2FnZSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgOSBwb3NzaWJsZSBtZXRob2RzIHRvIGNhbGN1bGF0ZSBxdWFudGlsZXMKCj9xdWFudGlsZQojRm9yIGV4YW1wbGU6CnF1YW50aWxlKEdyb3d0aF9WYWx1ZSRHcm93dGgsIHByb2JzPWMoLjIsIC4zLC40KSwgdHlwZT03KQoKI0ZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWU6CgojIGh0dHBzOi8vd3d3LmpzdG9yLm9yZy9zdGFibGUvMjY4NDkzNAoKYGBgCiAKIAojIyBTbGlkZSAyNApCb3hwbG90CmBgYHtyfQpib3hwbG90KEdyb3d0aF9WYWx1ZSRHcm93dGgsIEdyb3d0aF9WYWx1ZSRWYWx1ZSwgeGxhYj0iQW5udWFsIFJldHVybnMsIDE5ODQtMjAxOQooaW4gcGVyY2VudCkiLCBuYW1lcyA9YygiR3Jvd3RoIiwiVmFsdWUiKSwgaG9yaXpvbnRhbCA9IFRSVUUsCmNvbD0iZ29sZCIpCmBgYAoKVGhpcyB3aWxsIGFuYWx5emUgdGhlIGRhdGEgZm9yIG91dGxpZXJzIGFuZCBleHRyZW1lIHZhbHVlcwpsb2FkIHRoZSByc3RhdGl4IHBhY2thZ2UKYGBge3J9ClZhbHVlPWFzLmRhdGEuZnJhbWUoR3Jvd3RoX1ZhbHVlJFZhbHVlKQppZGVudGlmeV9vdXRsaWVycyhWYWx1ZSkKCmBgYAoKCiMjIFNsaWRlIDMwCmBgYHtyfQojdGhpcyBjb2RlIGdpdmVzIHRoZSBoaWdoIGFuZCBsb3cgdmFsdWVzIG9mIHRoZSByYW5nZQpyYW5nZShHcm93dGhfVmFsdWUkR3Jvd3RoKQpyYW5nZShHcm93dGhfVmFsdWUkVmFsdWUpCmBgYAoKTG9hZCB0aGUgcGFzdGVjcyBwYWNrYWdlCmBgYHtyfQojdGhpcyBjb2RlIHdpbGwgY2FsY3VsYXRlIHRoZSByYW5nZSBpdHNlbGYgYXMgd2VsbCBhcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIGFuZCB2YXJpYW5jZQpzdGF0LmRlc2MoR3Jvd3RoX1ZhbHVlJEdyb3d0aCkKYGBgCgpNZWFuIEFic29sdXRlIERldmlhdGlvbjogTG9hZCB0aGUgRGVzY1Rvb2xzIHBhY2thZ2UKYGBge3J9Ck1lYW5BRChHcm93dGhfVmFsdWUkR3Jvd3RoKQpNZWFuQUQoR3Jvd3RoX1ZhbHVlJFZhbHVlKQpgYGAKClZhcmlhbmNlIGFuZCBTdGFuZGFyZCBEZXZpYXRpb24KYGBge3J9CnZhcihHcm93dGhfVmFsdWUkR3Jvd3RoKQpzZChHcm93dGhfVmFsdWUkR3Jvd3RoKQpgYGAKCmBgYHtyfQp2YXIoR3Jvd3RoX1ZhbHVlJFZhbHVlKQpzZChHcm93dGhfVmFsdWUkVmFsdWUpCmBgYAoKCiMjIFNsaWRlIDMyCkxvYWQgdGhlIEVudlN0YXRzIHBhY2thZ2UKYGBge3J9CmN2KEdyb3d0aF9WYWx1ZSRHcm93dGgpCmN2KEdyb3d0aF9WYWx1ZSRWYWx1ZSkKYGBgCgoKIyMgU2xpZGUgMzUgClNoYXJwZSBSYXRpbwpgYGB7cn0KKG1lYW4oR3Jvd3RoX1ZhbHVlJEdyb3d0aCktMSkvc2QoR3Jvd3RoX1ZhbHVlJEdyb3d0aCkKKG1lYW4oR3Jvd3RoX1ZhbHVlJFZhbHVlKS0xKS9zZChHcm93dGhfVmFsdWUkVmFsdWUpCmBgYAoKCiMjIFNsaWRlIDM3CmBgYHtyfQprPTIKQ2hlYiA8LSBzYXBwbHkoaywgZnVuY3Rpb24oaykgMS0xL2teMikKQ2hlYgpgYGAKCgojIyBTbGlkZSAzOQoKYGBge3J9CnBub3JtKDEpLXBub3JtKC0xKQpwbm9ybSgyKS1wbm9ybSgtMikKcG5vcm0oMyktcG5vcm0oLTMpCmBgYAoKCiMjIFNsaWRlIDQwCk5vdGUgdGhhdCBmb3IgdGhpcyBzbGlkZSwgdGhlIG51bWJlcnMgYXJlIHNsaWdodGx5IG9mZiBmcm9tIHdoYXQgdGhlIGJvb2sgZGVzY3JpYmVzIGJlY2F1c2UgCisvLSAxLjk2IHN0YW5kYXJkIGRldmlhdGlvbnMgZ2l2ZXMgOTUlLCBidXQgdGhleSByb3VuZGVkIHRvIDIgc3RhbmRhcmQgZGV2aWF0aW9ucyBpbiB0aGVpciBkZXNjcmlwdGlvbgpgYGB7cn0KcG5vcm0oOTAsNzQsOCktcG5vcm0oNTgsNzQsOCkKYGBgCgpgYGB7cn0KMS1wbm9ybSg5MCw3NCw4KQpgYGAKCmBgYHtyfQowLjAyMjc1MDEzMTk1KjI4MApgYGAKCgojIyBTbGlkZSA0MwoKYGBge3J9CiN0aGlzIHdpbGwgZ2VuZXJhdGUgdGhlIFogc2NvcmVzIGZvciB0aGUgR3Jvd3RoIGNvbHVtbgpzY2FsZShHcm93dGhfVmFsdWUkR3Jvd3RoKQpgYGAKCmBgYHtyfQojdGhpcyB3aWxsIGdlbmVyYXRlIHRoZSBtaW4gYW5kIG1heCBaLXNjb3JlcyBmb3IgdGhlIEdyb3d0aCBjb2x1bW4KbWluKHNjYWxlKEdyb3d0aF9WYWx1ZSRHcm93dGgpKQptYXgoc2NhbGUoR3Jvd3RoX1ZhbHVlJEdyb3d0aCkpCmBgYAoKIyMgU2xpZGUgNDYKCmBgYHtyfQoKcGxvdChHcm93dGhfVmFsdWUkR3Jvd3RoLCBHcm93dGhfVmFsdWUkVmFsdWUsIHhsYWIgPSAiR3Jvd3RoIiwgeWxhYiA9ICJWYWx1ZSIsIHBjaD0yMSwgIGJnPSJyZWQiKQpgYGAKCiMjIFNsaWRlIDQ3CgpgYGB7cn0KY292KEdyb3d0aF9WYWx1ZSkKCiNUaGUgY292YXJpYW5jZSBiZXR3ZWVuIHRoZSBHcm93dGggYW5kIFZhbHVlIGZ1bmRzIGNhbiBiZSBmb3VuZCBieSBsb29raW5nIGF0IHRoZSBudW1iZXIgd2hlcmUgdGhlIEdyb3d0aCBjb2x1bW4gYW5kIFZhbHVlIHJvdyBtZWV0LCBhcyB3ZWxsIGFzIHdoZXJlIHRoZSBHcm93dGggcm93IGFuZCBWYWx1ZSBjb2x1bW4gbWVldAoKYGBgCgoKYGBge3J9CmNvcihHcm93dGhfVmFsdWUpCgojVGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIEdyb3d0aCBhbmQgVmFsdWUgZnVuZHMgY2FuIGJlIGZvdW5kIGJ5IGxvb2tpbmcgYXQgdGhlIG51bWJlciB3aGVyZSB0aGUgR3Jvd3RoIGNvbHVtbiBhbmQgVmFsdWUgcm93IG1lZXQsIGFzIHdlbGwgYXMgd2hlcmUgdGhlIEdyb3d0aCByb3cgYW5kIFZhbHVlIGNvbHVtbiBtZWV0CgojYWxzbyBzZWUgaHR0cHM6Ly9ycHN5Y2hvbG9naXN0LmNvbS9jb3JyZWxhdGlvbi8KCmBgYAoKIyMgU2xpZGUgNDkKR2VvbWV0cmljIE1lYW46IApMb2FkIHRoZSBFbnZTdGF0cyBwYWNrYWdlCgpUaGUgR2VvbWV0cmljIE1lYW4gZm9ybXVsYSBjYW5ub3QgdXNlIG5lZ2F0aXZlIG51bWJlcnMuIFRodXMsIGlmIHlvdSBoYWQgYSAxMDAlIGluY3JlYXNlIG9uZSB5ZWFyIGFuZCBhIDUwJSBsb3NzIHRoZSBuZXh0IHllYXIsIHlvdSB3b3VsZCBoYXZlIHdoYXQgeW91IHN0YXJ0ZWQgd2l0aC4gSW4gciwgeW91IHdvdWxkIHdyaXRlIGl0IGFzIDIuMCAoYSAxMDAlIGluY3JlYXNlIG9yIGRvdWJsaW5nKSBhbmQgMC41MCAoeW91ciBhbW91bnQgd2FzIGN1dCBieSA1MCUpOgoKYGBge3J9CiN0aGlzIHJlcHJlc2VudHMgYSBkb3VibGluZyBpbiB0aGUgZmlyc3QgeWVhciBhbmQgbG9zaW5nIGhhbGYgaW4gdGhlIHNlY29uZCB5ZWFyLS15b3UgYXJlIGxlZnQgd2l0aCAxMDAlIG9mIHdoYXQgeW91IHN0YXJ0ZWQgd2l0aApyZXR1cm49YygyLjAsMC41KQpnZW9NZWFuKHJldHVybikKYGBgCgpgYGB7cn0KI3RoZSBhcml0aG1ldGljIG1lYW4gZ2l2ZXMgeW91IHRoZSBpbmNvcnJlY3QgYW5zd2VyIGFuZCBzdWdnZXN0cyB5b3UgYXJlIGxlZnQgd2l0aCBhbiBleHRyYSAyNSUgYXQgdGhlIGVuZCBvZiB0aGUgc2Vjb25kIHllYXI6Cm1lYW4ocmV0dXJuKQpgYGAKCgpgYGB7cn0KI3RoaXMgY29kZSBpcyBmb3IgdGhlIGV4YW1wbGUgb24gc2xpZGUgNDkgYW5kIHJlcHJlc2VudHMgYSAxMCUgaW5jcmVhc2UgZm9sbG93ZWQgYnkgYSAxMCUgZGVjcmVhc2UKCnI9YygxLjEsMC45KQpnZW9NZWFuKHIpCgojdGhlIGFuc3dlciAoMC45OTUpIHNob3dzIGEgLjAwNSBsb3NzIG9yIC0wLjUlCmBgYAoKRm9yIHRoZSBDb25uZWN0IGhvbWV3b3JrIGFuZCBleGFtcywgdGhleSBzb21ldGltZXMgZ2l2ZSAoZm9yIGV4YW1wbGUpLCB0aGUgZmlyc3QgMiB5ZWFycyBhbmQgdGhlIGZpcnN0IGhhbGYgb2YgdGhlIHRoaXJkIHllYXIuIEluIHRoaXMgY2FzZSB5b3Ugd291bGQgbmVlZCB0byBtdWx0aXBseSB0aGUgbnVtYmVycyBhbmQgdGhlbiB0YWtlIHRoZSAyLjV0aCByb290CmBgYHtyfQojSWYgb3VyIHJldHVybiBpcyAxMCUgaW4gdGhlIGZpcnN0IHllYXIgYW5kIDI1JSBpbiB0aGUgc2Vjb25kIHllYXIsIHdpdGggYSBsb3NzIG9mIDE1JSBpbiB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgdGhpcmQgeWVhciwgeW91ciBjYWxjdWxhdGlvbiB3b3VsZCBsb29rIGxpa2U6CgooMS4xKjEuMjUqMC44NSleKDEvKDIuNSkpCmBgYAoKCiMjIFNsaWRlIDUxCgpgYGB7cn0KCnRpbWUxPTEzMzIyCnRpbWUyPTE2OTE1CgpuPTUKCkc9KHg9dGltZTIvdGltZTEpXigxLyhuLTEpKQpHLTEKI3RoZSByZXN1bHQgaXMgd3JpdHRlbiBhcyBhIHByb3BvcnRpb24KYGBgCgoKCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgpgYGB7cn0KYGBgCgoKYGBge3J9CmBgYAoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgo=