packages = c('quantmod')
# Install all Packages with Dependencies
install.packages(packages, dependencies = TRUE)
Error in install.packages : Updating loaded packages
# Load all Packages
lapply(packages, require, character.only = TRUE)
[[1]]
[1] TRUE
# Required Packages
packages = c('tseries', 'forecast')
# Install all Packages with Dependencies
install.packages(packages, dependencies = TRUE)
Error in install.packages : Updating loaded packages
# Load all Packages
lapply(packages, require, character.only = TRUE)
[[1]]
[1] TRUE
[[2]]
[1] TRUE
# Required Packages
packages = c('FinTS', 'rugarch')
# Install all Packages with Dependencies
install.packages(packages, dependencies = TRUE)
Error in install.packages : Updating loaded packages
# Load all Packages
lapply(packages, require, character.only = TRUE)
[[1]]
[1] TRUE
[[2]]
[1] TRUE
# Create an environment to store the data
stock_data <- new.env()
# Define the stock symbol
stock_symbol <- 'ADANIENT.BO' # ADANIENT.BO is the ticker symbol for Adani Enterprises Ltd on BSE
# Define the start and end dates
start_date <- as.Date('2019-01-01')
end_date <- as.Date('2023-12-31')
# Fetch the stock data
getSymbols(Symbols = stock_symbol, src = 'yahoo', from = start_date, to = end_date, env = stock_data)
Warning: ADANIENT.BO contains missing values. Some functions will not work if objects contain missing values in the middle of the series. Consider using na.omit(), na.approx(), na.fill(), etc to remove or replace them.
[1] "ADANIENT.BO"
# Extract closing prices
adani_prices <- Cl(stock_data[[stock_symbol]])
# Remove missing values
adani_prices <- na.omit(adani_prices)
# View the resulting closing prices
head(adani_prices)
ADANIENT.BO.Close
2019-01-01 157.20
2019-01-02 154.75
2019-01-03 152.55
2019-01-04 152.35
2019-01-07 151.00
2019-01-08 153.40
plot(adani_prices)

# Check the class of the stock_price object
class(adani_prices)
[1] "xts" "zoo"
# Augmented Dickey-Fuller (ADF) Test for Stationarity with Adani Enterprises Ltd on BSE Data
# *******************************************************************
# Perform Augmented Dickey-Fuller (ADF) Test
adf_result <- adf.test(adani_prices)
# Print the ADF test result
print(adf_result)
Augmented Dickey-Fuller Test
data: adani_prices
Dickey-Fuller = -2.4007, Lag order = 10, p-value = 0.4087
alternative hypothesis: stationary
#In this case, since the p-value (0.4087) is greater than a typical significance
#level like 0.05, we fail to reject the null hypothesis.
#Therefore, we do not have enough evidence to conclude that the time series is stationary.
adani_ds = diff(adani_prices);
adani_ds
ADANIENT.BO.Close
2019-01-01 NA
2019-01-02 -2.4499969
2019-01-03 -2.1999969
2019-01-04 -0.1999969
2019-01-07 -1.3500061
2019-01-08 2.3999939
2019-01-09 -4.0999908
2019-01-10 1.8000031
2019-01-11 0.2999878
2019-01-14 -3.0999908
...
2023-12-15 96.1499023
2023-12-18 -11.0000000
2023-12-19 -38.1999512
2023-12-20 -155.5000000
2023-12-21 16.0500488
2023-12-22 5.7998047
2023-12-26 61.4001465
2023-12-27 -26.0000000
2023-12-28 -30.3000488
2023-12-29 36.5000000
# Adani Enterprises Ltd (First)return Difference Time-Series
adani_ds=na.omit(adani_ds)
adf_test_adani_ds = adf.test(adani_ds); adf_test_adani_ds
Warning: p-value smaller than printed p-value
Augmented Dickey-Fuller Test
data: adani_ds
Dickey-Fuller = -9.532, Lag order = 10, p-value = 0.01
alternative hypothesis: stationary
# Ljung-Box Test for Autocorrelation - Data
# ***********************************************
lb_test_adani_ds = Box.test(adani_ds)# Inference : adani Difference (Stationary)
lb_test_adani_ds
Box-Pierce test
data: adani_ds
X-squared = 16.087, df = 1, p-value = 6.049e-05
#In this case, since the p-value (4.294e-05) is much smaller than a typical significance level like 0.05,
#we reject the null hypothesis. Therefore, we have evidence to suggest that there is significant autocorrelation in the time series. | NULL: No Auto correlation | Alternate: Auto Correlation
#Autocorrelation Function (ACF) | Partial Autocorrelation Function (PACF)
# *****************************************************************************
acf(adani_prices) # ACF of adani Series

pacf(adani_prices) # PACF of adani Series

acf(adani_ds) # ACF of adani Series

pacf(adani_ds) # PACF of adani Difference (Stationary) Series

arma_pq_adani_ds = auto.arima(adani_ds); arma_pq_adani_ds
Series: adani_ds
ARIMA(1,0,1) with zero mean
Coefficients:
ar1 ma1
-0.4124 0.5489
s.e. 0.1092 0.0989
sigma^2 = 3478: log likelihood = -6676.7
AIC=13359.4 AICc=13359.42 BIC=13374.71
adani_ds_fpq = forecast(arma_pq_adani_ds, h = 500)
plot(adani_ds_fpq)

lb_test_arma_pq_adani_ds = Box.test(arma_pq_adani_ds$residuals); lb_test_arma_pq_adani_ds
Box-Pierce test
data: arma_pq_adani_ds$residuals
X-squared = 0.065799, df = 1, p-value = 0.7976
# Test for Volatility Clustering or Heteroskedasticity: Box Test
adani_ret_sq = arma_pq_adani_ds$residuals^2 # Residual Variance (Since Mean Returns is approx. 0)
plot(adani_ret_sq)

adani_ret_sq_box_test = Box.test(adani_ret_sq,lag = 1 ) # H0: Return Variance Series is Not Serially Correlated
adani_ret_sq_box_test # Inference : Return Variance Series is Autocorrelated (Has Volatility Clustering)
Box-Pierce test
data: adani_ret_sq
X-squared = 73.953, df = 1, p-value < 2.2e-16
# Test for Volatility Clustering or Heteroskedasticity: ARCH Test
adani_ret_arch_test = ArchTest(arma_pq_adani_ds$residuals^2,lag = 1) # H0: No ARCH Effects
adani_ret_arch_test # Inference : Return Series is Heteroskedastic (Has Volatility Clustering)
ARCH LM-test; Null hypothesis: no ARCH effects
data: arma_pq_adani_ds$residuals^2
Chi-squared = 8.8783, df = 1, p-value = 0.002886
# GARCH Model
garch_model1 = ugarchspec(variance.model = list(model = 'sGARCH', garchOrder = c(1,1)), mean.model = list(armaOrder = c(1,1), include.mean = TRUE))
adani_ret_garch1 = ugarchfit(garch_model1, data = arma_pq_adani_ds$residuals^2); adani_ret_garch1
*---------------------------------*
* GARCH Model Fit *
*---------------------------------*
Conditional Variance Dynamics
-----------------------------------
GARCH Model : sGARCH(1,1)
Mean Model : ARFIMA(1,0,1)
Distribution : norm
Optimal Parameters
------------------------------------
Estimate Std. Error t value Pr(>|t|)
mu 3.4699e+03 6.1907e+02 5.605 0
ar1 8.9790e-01 2.2387e-02 40.108 0
ma1 3.2756e-01 4.2282e-02 7.747 0
omega 6.2943e+05 4.8466e+04 12.987 0
alpha1 9.3997e-02 4.4700e-03 21.031 0
beta1 9.0500e-01 2.5030e-03 361.602 0
Robust Standard Errors:
Estimate Std. Error t value Pr(>|t|)
mu 3.4699e+03 2.5313e+03 1.37078 0.170442
ar1 8.9790e-01 2.4815e-02 36.18427 0.000000
ma1 3.2756e-01 4.1287e-01 0.79337 0.427563
omega 6.2943e+05 1.4553e+05 4.32516 0.000015
alpha1 9.3997e-02 1.8087e-02 5.19680 0.000000
beta1 9.0500e-01 1.8557e-02 48.77013 0.000000
LogLikelihood : -12321.53
Information Criteria
------------------------------------
Akaike 20.292
Bayes 20.317
Shibata 20.292
Hannan-Quinn 20.302
Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
statistic p-value
Lag[1] 187.7 0
Lag[2*(p+q)+(p+q)-1][5] 196.1 0
Lag[4*(p+q)+(p+q)-1][9] 198.8 0
d.o.f=2
H0 : No serial correlation
Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
statistic p-value
Lag[1] 5.377 0.02040
Lag[2*(p+q)+(p+q)-1][5] 6.411 0.07187
Lag[4*(p+q)+(p+q)-1][9] 7.113 0.18986
d.o.f=2
Weighted ARCH LM Tests
------------------------------------
Statistic Shape Scale P-Value
ARCH Lag[3] 1.146 0.500 2.000 0.2844
ARCH Lag[5] 2.040 1.440 1.667 0.4625
ARCH Lag[7] 2.206 2.315 1.543 0.6736
Nyblom stability test
------------------------------------
Joint Statistic: -147.6846
Individual Statistics:
mu 18.93294
ar1 0.07298
ma1 0.11990
omega 39.02396
alpha1 0.24817
beta1 0.30111
Asymptotic Critical Values (10% 5% 1%)
Joint Statistic: 1.49 1.68 2.12
Individual Statistic: 0.35 0.47 0.75
Sign Bias Test
------------------------------------
Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
group statistic p-value(g-1)
1 20 5113 0
2 30 4851 0
3 40 6251 0
4 50 5244 0
Elapsed time : 0.336184
# GARCH Forecast
adani_ret_garch_forecast1 = ugarchforecast(adani_ret_garch1, n.ahead = 500); adani_ret_garch_forecast1
*------------------------------------*
* GARCH Model Forecast *
*------------------------------------*
Model: sGARCH
Horizon: 500
Roll Steps: 0
Out of Sample: 0
0-roll forecast [T0=1215-01-01]:
Series Sigma
T+1 1630 32706
T+2 1818 32700
T+3 1987 32693
T+4 2138 32686
T+5 2274 32679
T+6 2396 32673
T+7 2506 32666
T+8 2604 32659
T+9 2693 32653
T+10 2772 32646
T+11 2843 32639
T+12 2907 32633
T+13 2965 32626
T+14 3016 32619
T+15 3063 32613
T+16 3104 32606
T+17 3141 32599
T+18 3175 32593
T+19 3205 32586
T+20 3232 32579
T+21 3256 32573
T+22 3278 32566
T+23 3298 32559
T+24 3315 32553
T+25 3331 32546
T+26 3345 32540
T+27 3358 32533
T+28 3369 32526
T+29 3380 32520
T+30 3389 32513
T+31 3397 32507
T+32 3405 32500
T+33 3411 32493
T+34 3417 32487
T+35 3423 32480
T+36 3427 32474
T+37 3432 32467
T+38 3436 32461
T+39 3439 32454
T+40 3442 32448
T+41 3445 32441
T+42 3448 32435
T+43 3450 32428
T+44 3452 32422
T+45 3454 32415
T+46 3455 32409
T+47 3457 32402
T+48 3458 32396
T+49 3459 32389
T+50 3461 32383
T+51 3461 32376
T+52 3462 32370
T+53 3463 32363
T+54 3464 32357
T+55 3464 32350
T+56 3465 32344
T+57 3465 32337
T+58 3466 32331
T+59 3466 32325
T+60 3467 32318
T+61 3467 32312
T+62 3467 32305
T+63 3468 32299
T+64 3468 32292
T+65 3468 32286
T+66 3468 32280
T+67 3468 32273
T+68 3469 32267
T+69 3469 32261
T+70 3469 32254
T+71 3469 32248
T+72 3469 32241
T+73 3469 32235
T+74 3469 32229
T+75 3469 32222
T+76 3469 32216
T+77 3469 32210
T+78 3469 32203
T+79 3469 32197
T+80 3470 32191
T+81 3470 32184
T+82 3470 32178
T+83 3470 32172
T+84 3470 32165
T+85 3470 32159
T+86 3470 32153
T+87 3470 32147
T+88 3470 32140
T+89 3470 32134
T+90 3470 32128
T+91 3470 32121
T+92 3470 32115
T+93 3470 32109
T+94 3470 32103
T+95 3470 32096
T+96 3470 32090
T+97 3470 32084
T+98 3470 32078
T+99 3470 32071
T+100 3470 32065
T+101 3470 32059
T+102 3470 32053
T+103 3470 32047
T+104 3470 32040
T+105 3470 32034
T+106 3470 32028
T+107 3470 32022
T+108 3470 32016
T+109 3470 32009
T+110 3470 32003
T+111 3470 31997
T+112 3470 31991
T+113 3470 31985
T+114 3470 31979
T+115 3470 31973
T+116 3470 31966
T+117 3470 31960
T+118 3470 31954
T+119 3470 31948
T+120 3470 31942
T+121 3470 31936
T+122 3470 31930
T+123 3470 31923
T+124 3470 31917
T+125 3470 31911
T+126 3470 31905
T+127 3470 31899
T+128 3470 31893
T+129 3470 31887
T+130 3470 31881
T+131 3470 31875
T+132 3470 31869
T+133 3470 31863
T+134 3470 31857
T+135 3470 31851
T+136 3470 31845
T+137 3470 31838
T+138 3470 31832
T+139 3470 31826
T+140 3470 31820
T+141 3470 31814
T+142 3470 31808
T+143 3470 31802
T+144 3470 31796
T+145 3470 31790
T+146 3470 31784
T+147 3470 31778
T+148 3470 31772
T+149 3470 31766
T+150 3470 31760
T+151 3470 31754
T+152 3470 31748
T+153 3470 31743
T+154 3470 31737
T+155 3470 31731
T+156 3470 31725
T+157 3470 31719
T+158 3470 31713
T+159 3470 31707
T+160 3470 31701
T+161 3470 31695
T+162 3470 31689
T+163 3470 31683
T+164 3470 31677
T+165 3470 31671
T+166 3470 31665
T+167 3470 31660
T+168 3470 31654
T+169 3470 31648
T+170 3470 31642
T+171 3470 31636
T+172 3470 31630
T+173 3470 31624
T+174 3470 31618
T+175 3470 31613
T+176 3470 31607
T+177 3470 31601
T+178 3470 31595
T+179 3470 31589
T+180 3470 31583
T+181 3470 31578
T+182 3470 31572
T+183 3470 31566
T+184 3470 31560
T+185 3470 31554
T+186 3470 31548
T+187 3470 31543
T+188 3470 31537
T+189 3470 31531
T+190 3470 31525
T+191 3470 31520
T+192 3470 31514
T+193 3470 31508
T+194 3470 31502
T+195 3470 31496
T+196 3470 31491
T+197 3470 31485
T+198 3470 31479
T+199 3470 31473
T+200 3470 31468
T+201 3470 31462
T+202 3470 31456
T+203 3470 31451
T+204 3470 31445
T+205 3470 31439
T+206 3470 31433
T+207 3470 31428
T+208 3470 31422
T+209 3470 31416
T+210 3470 31411
T+211 3470 31405
T+212 3470 31399
T+213 3470 31394
T+214 3470 31388
T+215 3470 31382
T+216 3470 31377
T+217 3470 31371
T+218 3470 31365
T+219 3470 31360
T+220 3470 31354
T+221 3470 31348
T+222 3470 31343
T+223 3470 31337
T+224 3470 31331
T+225 3470 31326
T+226 3470 31320
T+227 3470 31315
T+228 3470 31309
T+229 3470 31303
T+230 3470 31298
T+231 3470 31292
T+232 3470 31287
T+233 3470 31281
T+234 3470 31275
T+235 3470 31270
T+236 3470 31264
T+237 3470 31259
T+238 3470 31253
T+239 3470 31248
T+240 3470 31242
T+241 3470 31236
T+242 3470 31231
T+243 3470 31225
T+244 3470 31220
T+245 3470 31214
T+246 3470 31209
T+247 3470 31203
T+248 3470 31198
T+249 3470 31192
T+250 3470 31187
T+251 3470 31181
T+252 3470 31176
T+253 3470 31170
T+254 3470 31165
T+255 3470 31159
T+256 3470 31154
T+257 3470 31148
T+258 3470 31143
T+259 3470 31137
T+260 3470 31132
T+261 3470 31126
T+262 3470 31121
T+263 3470 31116
T+264 3470 31110
T+265 3470 31105
T+266 3470 31099
T+267 3470 31094
T+268 3470 31088
T+269 3470 31083
T+270 3470 31078
T+271 3470 31072
T+272 3470 31067
T+273 3470 31061
T+274 3470 31056
T+275 3470 31051
T+276 3470 31045
T+277 3470 31040
T+278 3470 31034
T+279 3470 31029
T+280 3470 31024
T+281 3470 31018
T+282 3470 31013
T+283 3470 31008
T+284 3470 31002
T+285 3470 30997
T+286 3470 30991
T+287 3470 30986
T+288 3470 30981
T+289 3470 30975
T+290 3470 30970
T+291 3470 30965
T+292 3470 30959
T+293 3470 30954
T+294 3470 30949
T+295 3470 30944
T+296 3470 30938
T+297 3470 30933
T+298 3470 30928
T+299 3470 30922
T+300 3470 30917
T+301 3470 30912
T+302 3470 30907
T+303 3470 30901
T+304 3470 30896
T+305 3470 30891
T+306 3470 30885
T+307 3470 30880
T+308 3470 30875
T+309 3470 30870
T+310 3470 30864
T+311 3470 30859
T+312 3470 30854
T+313 3470 30849
T+314 3470 30844
T+315 3470 30838
T+316 3470 30833
T+317 3470 30828
T+318 3470 30823
T+319 3470 30818
T+320 3470 30812
T+321 3470 30807
T+322 3470 30802
T+323 3470 30797
T+324 3470 30792
T+325 3470 30786
T+326 3470 30781
T+327 3470 30776
T+328 3470 30771
T+329 3470 30766
T+330 3470 30761
T+331 3470 30755
T+332 3470 30750
T+333 3470 30745
T+334 3470 30740
T+335 3470 30735
T+336 3470 30730
T+337 3470 30725
T+338 3470 30720
T+339 3470 30714
T+340 3470 30709
T+341 3470 30704
T+342 3470 30699
T+343 3470 30694
T+344 3470 30689
T+345 3470 30684
T+346 3470 30679
T+347 3470 30674
T+348 3470 30669
T+349 3470 30663
T+350 3470 30658
T+351 3470 30653
T+352 3470 30648
T+353 3470 30643
T+354 3470 30638
T+355 3470 30633
T+356 3470 30628
T+357 3470 30623
T+358 3470 30618
T+359 3470 30613
T+360 3470 30608
T+361 3470 30603
T+362 3470 30598
T+363 3470 30593
T+364 3470 30588
T+365 3470 30583
T+366 3470 30578
T+367 3470 30573
T+368 3470 30568
T+369 3470 30563
T+370 3470 30558
T+371 3470 30553
T+372 3470 30548
T+373 3470 30543
T+374 3470 30538
T+375 3470 30533
T+376 3470 30528
T+377 3470 30523
T+378 3470 30518
T+379 3470 30513
T+380 3470 30508
T+381 3470 30503
T+382 3470 30498
T+383 3470 30493
T+384 3470 30489
T+385 3470 30484
T+386 3470 30479
T+387 3470 30474
T+388 3470 30469
T+389 3470 30464
T+390 3470 30459
T+391 3470 30454
T+392 3470 30449
T+393 3470 30444
T+394 3470 30440
T+395 3470 30435
T+396 3470 30430
T+397 3470 30425
T+398 3470 30420
T+399 3470 30415
T+400 3470 30410
T+401 3470 30405
T+402 3470 30401
T+403 3470 30396
T+404 3470 30391
T+405 3470 30386
T+406 3470 30381
T+407 3470 30376
T+408 3470 30372
T+409 3470 30367
T+410 3470 30362
T+411 3470 30357
T+412 3470 30352
T+413 3470 30347
T+414 3470 30343
T+415 3470 30338
T+416 3470 30333
T+417 3470 30328
T+418 3470 30324
T+419 3470 30319
T+420 3470 30314
T+421 3470 30309
T+422 3470 30304
T+423 3470 30300
T+424 3470 30295
T+425 3470 30290
T+426 3470 30285
T+427 3470 30281
T+428 3470 30276
T+429 3470 30271
T+430 3470 30266
T+431 3470 30262
T+432 3470 30257
T+433 3470 30252
T+434 3470 30247
T+435 3470 30243
T+436 3470 30238
T+437 3470 30233
T+438 3470 30229
T+439 3470 30224
T+440 3470 30219
T+441 3470 30215
T+442 3470 30210
T+443 3470 30205
T+444 3470 30200
T+445 3470 30196
T+446 3470 30191
T+447 3470 30186
T+448 3470 30182
T+449 3470 30177
T+450 3470 30172
T+451 3470 30168
T+452 3470 30163
T+453 3470 30158
T+454 3470 30154
T+455 3470 30149
T+456 3470 30145
T+457 3470 30140
T+458 3470 30135
T+459 3470 30131
T+460 3470 30126
T+461 3470 30121
T+462 3470 30117
T+463 3470 30112
T+464 3470 30108
T+465 3470 30103
T+466 3470 30098
T+467 3470 30094
T+468 3470 30089
T+469 3470 30085
T+470 3470 30080
T+471 3470 30075
T+472 3470 30071
T+473 3470 30066
T+474 3470 30062
T+475 3470 30057
T+476 3470 30053
T+477 3470 30048
T+478 3470 30044
T+479 3470 30039
T+480 3470 30034
T+481 3470 30030
T+482 3470 30025
T+483 3470 30021
T+484 3470 30016
T+485 3470 30012
T+486 3470 30007
T+487 3470 30003
T+488 3470 29998
T+489 3470 29994
T+490 3470 29989
T+491 3470 29985
T+492 3470 29980
T+493 3470 29976
T+494 3470 29971
T+495 3470 29967
T+496 3470 29962
T+497 3470 29958
T+498 3470 29953
T+499 3470 29949
T+500 3470 29944
plot(adani_ret_garch_forecast1, which = 1)

# Plot the specified aspect of the GARCH forecast
plot(adani_ret_garch_forecast1, which = 3)

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCmBgYHtyfQ0KIHBhY2thZ2VzID0gYygncXVhbnRtb2QnKQ0KDQojIEluc3RhbGwgYWxsIFBhY2thZ2VzIHdpdGggRGVwZW5kZW5jaWVzDQppbnN0YWxsLnBhY2thZ2VzKHBhY2thZ2VzLCBkZXBlbmRlbmNpZXMgPSBUUlVFKQ0KDQojIExvYWQgYWxsIFBhY2thZ2VzDQpsYXBwbHkocGFja2FnZXMsIHJlcXVpcmUsIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkNCmBgYA0KDQogDQpgYGB7cn0NCiMgUmVxdWlyZWQgUGFja2FnZXMNCnBhY2thZ2VzID0gYygndHNlcmllcycsICdmb3JlY2FzdCcpDQoNCiMgSW5zdGFsbCBhbGwgUGFja2FnZXMgd2l0aCBEZXBlbmRlbmNpZXMNCmluc3RhbGwucGFja2FnZXMocGFja2FnZXMsIGRlcGVuZGVuY2llcyA9IFRSVUUpDQoNCiMgTG9hZCBhbGwgUGFja2FnZXMNCmxhcHBseShwYWNrYWdlcywgcmVxdWlyZSwgY2hhcmFjdGVyLm9ubHkgPSBUUlVFKQ0KDQpgYGANCmBgYHtyfQ0KIyBSZXF1aXJlZCBQYWNrYWdlcw0KcGFja2FnZXMgPSBjKCdGaW5UUycsICdydWdhcmNoJykNCg0KIyBJbnN0YWxsIGFsbCBQYWNrYWdlcyB3aXRoIERlcGVuZGVuY2llcw0KaW5zdGFsbC5wYWNrYWdlcyhwYWNrYWdlcywgZGVwZW5kZW5jaWVzID0gVFJVRSkNCg0KIyBMb2FkIGFsbCBQYWNrYWdlcw0KbGFwcGx5KHBhY2thZ2VzLCByZXF1aXJlLCBjaGFyYWN0ZXIub25seSA9IFRSVUUpDQoNCg0KDQpgYGANCg0KDQpgYGB7cn0NCg0KIyBDcmVhdGUgYW4gZW52aXJvbm1lbnQgdG8gc3RvcmUgdGhlIGRhdGENCnN0b2NrX2RhdGEgPC0gbmV3LmVudigpDQoNCiMgRGVmaW5lIHRoZSBzdG9jayBzeW1ib2wNCnN0b2NrX3N5bWJvbCA8LSAnQURBTklFTlQuQk8nICAjIEFEQU5JRU5ULkJPIGlzIHRoZSB0aWNrZXIgc3ltYm9sIGZvciBBZGFuaSBFbnRlcnByaXNlcyBMdGQgb24gQlNFDQoNCiMgRGVmaW5lIHRoZSBzdGFydCBhbmQgZW5kIGRhdGVzDQpzdGFydF9kYXRlIDwtIGFzLkRhdGUoJzIwMTktMDEtMDEnKQ0KZW5kX2RhdGUgPC0gYXMuRGF0ZSgnMjAyMy0xMi0zMScpDQoNCiMgRmV0Y2ggdGhlIHN0b2NrIGRhdGENCmdldFN5bWJvbHMoU3ltYm9scyA9IHN0b2NrX3N5bWJvbCwgc3JjID0gJ3lhaG9vJywgZnJvbSA9IHN0YXJ0X2RhdGUsIHRvID0gZW5kX2RhdGUsIGVudiA9IHN0b2NrX2RhdGEpDQpgYGANCg0KDQpgYGB7cn0NCg0KIyBFeHRyYWN0IGNsb3NpbmcgcHJpY2VzDQphZGFuaV9wcmljZXMgPC0gQ2woc3RvY2tfZGF0YVtbc3RvY2tfc3ltYm9sXV0pDQoNCiMgUmVtb3ZlIG1pc3NpbmcgdmFsdWVzDQphZGFuaV9wcmljZXMgPC0gbmEub21pdChhZGFuaV9wcmljZXMpDQoNCiMgVmlldyB0aGUgcmVzdWx0aW5nIGNsb3NpbmcgcHJpY2VzDQpoZWFkKGFkYW5pX3ByaWNlcykNCiANCmBgYA0KDQoNCmBgYHtyfQ0KDQojIENoZWNrIHRoZSBjbGFzcyBvZiB0aGUgc3RvY2tfcHJpY2Ugb2JqZWN0DQpjbGFzcyhhZGFuaV9wcmljZXMpDQpgYGANCg0KDQpgYGB7cn0NCg0KIyBBdWdtZW50ZWQgRGlja2V5LUZ1bGxlciAoQURGKSBUZXN0IGZvciBTdGF0aW9uYXJpdHkgd2l0aCBBZGFuaSBFbnRlcnByaXNlcyBMdGQgb24gQlNFIERhdGENCiMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQojIFBlcmZvcm0gQXVnbWVudGVkIERpY2tleS1GdWxsZXIgKEFERikgVGVzdA0KYWRmX3Jlc3VsdCA8LSBhZGYudGVzdChhZGFuaV9wcmljZXMpDQoNCiMgUHJpbnQgdGhlIEFERiB0ZXN0IHJlc3VsdA0KcHJpbnQoYWRmX3Jlc3VsdCkNCg0KI0luIHRoaXMgY2FzZSwgc2luY2UgdGhlIHAtdmFsdWUgKDAuNDA4NykgaXMgZ3JlYXRlciB0aGFuIGEgdHlwaWNhbCBzaWduaWZpY2FuY2UNCiNsZXZlbCBsaWtlIDAuMDUsIHdlIGZhaWwgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuDQojVGhlcmVmb3JlLCB3ZSBkbyBub3QgaGF2ZSBlbm91Z2ggZXZpZGVuY2UgdG8gY29uY2x1ZGUgdGhhdCB0aGUgdGltZSBzZXJpZXMgaXMgc3RhdGlvbmFyeS4NCmBgYA0KDQoNCmBgYHtyfQ0KYWRhbmlfZHMgPSBkaWZmKGFkYW5pX3ByaWNlcyk7ICANCmFkYW5pX2RzDQogICMgQWRhbmkgRW50ZXJwcmlzZXMgTHRkICAoRmlyc3QpcmV0dXJuIERpZmZlcmVuY2UgVGltZS1TZXJpZXMNCmBgYA0KICANCg0KYGBge3J9DQphZGFuaV9kcz1uYS5vbWl0KGFkYW5pX2RzKQ0KIA0KYWRmX3Rlc3RfYWRhbmlfZHMgPSBhZGYudGVzdChhZGFuaV9kcyk7IGFkZl90ZXN0X2FkYW5pX2RzDQpgYGANCg0KDQpgYGB7cn0NCiMgTGp1bmctQm94IFRlc3QgZm9yIEF1dG9jb3JyZWxhdGlvbiAtICBEYXRhDQojICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCmxiX3Rlc3RfYWRhbmlfZHMgPSBCb3gudGVzdChhZGFuaV9kcykjIEluZmVyZW5jZSA6IGFkYW5pIERpZmZlcmVuY2UgKFN0YXRpb25hcnkpDQogbGJfdGVzdF9hZGFuaV9kcw0KI0luIHRoaXMgY2FzZSwgc2luY2UgdGhlIHAtdmFsdWUgKDQuMjk0ZS0wNSkgaXMgbXVjaCBzbWFsbGVyIHRoYW4gYSB0eXBpY2FsIHNpZ25pZmljYW5jZSBsZXZlbCBsaWtlIDAuMDUsDQojd2UgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuIFRoZXJlZm9yZSwgd2UgaGF2ZSBldmlkZW5jZSB0byBzdWdnZXN0IHRoYXQgdGhlcmUgaXMgc2lnbmlmaWNhbnQgYXV0b2NvcnJlbGF0aW9uIGluIHRoZSB0aW1lIHNlcmllcy4gfCBOVUxMOiBObyBBdXRvIGNvcnJlbGF0aW9uIHwgQWx0ZXJuYXRlOiBBdXRvIENvcnJlbGF0aW9uDQpgYGANCg0KDQpgYGB7cn0NCg0KI0F1dG9jb3JyZWxhdGlvbiBGdW5jdGlvbiAoQUNGKSB8IFBhcnRpYWwgQXV0b2NvcnJlbGF0aW9uIEZ1bmN0aW9uIChQQUNGKQ0KIyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQphY2YoYWRhbmlfcHJpY2VzKSAjIEFDRiBvZiBhZGFuaSBTZXJpZXMNCmBgYA0KDQoNCmBgYHtyfQ0KDQpwYWNmKGFkYW5pX3ByaWNlcykgIyBQQUNGIG9mIGFkYW5pIFNlcmllcw0KYGBgDQoNCg0KYGBge3J9DQoNCg0KYWNmKGFkYW5pX2RzKSAjIEFDRiBvZiBhZGFuaSBTZXJpZXMNCmBgYA0KDQoNCmBgYHtyfQ0KcGFjZihhZGFuaV9kcykgIyBQQUNGIG9mIGFkYW5pIERpZmZlcmVuY2UgKFN0YXRpb25hcnkpIFNlcmllcw0KYGBgDQoNCg0KYGBge3J9DQoNCmFybWFfcHFfYWRhbmlfZHMgPSBhdXRvLmFyaW1hKGFkYW5pX2RzKTsgYXJtYV9wcV9hZGFuaV9kcw0KYGBgDQoNCg0KYGBge3J9DQphZGFuaV9kc19mcHEgPSBmb3JlY2FzdChhcm1hX3BxX2FkYW5pX2RzLCBoID0gNTAwKQ0KcGxvdChhZGFuaV9kc19mcHEpDQpgYGANCg0KDQpgYGB7cn0NCmxiX3Rlc3RfYXJtYV9wcV9hZGFuaV9kcyA9IEJveC50ZXN0KGFybWFfcHFfYWRhbmlfZHMkcmVzaWR1YWxzKTsgbGJfdGVzdF9hcm1hX3BxX2FkYW5pX2RzDQpgYGANCg0KDQpgYGB7cn0NCiMgVGVzdCBmb3IgVm9sYXRpbGl0eSBDbHVzdGVyaW5nIG9yIEhldGVyb3NrZWRhc3RpY2l0eTogQm94IFRlc3QNCmFkYW5pX3JldF9zcSA9IGFybWFfcHFfYWRhbmlfZHMkcmVzaWR1YWxzXjIgIyBSZXNpZHVhbCBWYXJpYW5jZSAoU2luY2UgTWVhbiBSZXR1cm5zIGlzIGFwcHJveC4gMCkNCnBsb3QoYWRhbmlfcmV0X3NxKQ0KYGBgDQoNCg0KYGBge3J9DQphZGFuaV9yZXRfc3FfYm94X3Rlc3QgPSBCb3gudGVzdChhZGFuaV9yZXRfc3EsbGFnID0gMSApICMgSDA6IFJldHVybiBWYXJpYW5jZSBTZXJpZXMgaXMgTm90IFNlcmlhbGx5IENvcnJlbGF0ZWQNCmFkYW5pX3JldF9zcV9ib3hfdGVzdCAjIEluZmVyZW5jZSA6IFJldHVybiBWYXJpYW5jZSBTZXJpZXMgaXMgQXV0b2NvcnJlbGF0ZWQgKEhhcyBWb2xhdGlsaXR5IENsdXN0ZXJpbmcpDQpgYGANCg0KDQpgYGB7cn0NCiMgVGVzdCBmb3IgVm9sYXRpbGl0eSBDbHVzdGVyaW5nIG9yIEhldGVyb3NrZWRhc3RpY2l0eTogQVJDSCBUZXN0DQphZGFuaV9yZXRfYXJjaF90ZXN0ID0gQXJjaFRlc3QoYXJtYV9wcV9hZGFuaV9kcyRyZXNpZHVhbHNeMixsYWcgPSAxKSAjIEgwOiBObyBBUkNIIEVmZmVjdHMNCmFkYW5pX3JldF9hcmNoX3Rlc3QgIyBJbmZlcmVuY2UgOiBSZXR1cm4gU2VyaWVzIGlzIEhldGVyb3NrZWRhc3RpYyAoSGFzIFZvbGF0aWxpdHkgQ2x1c3RlcmluZykNCmBgYA0KIA0KIA0KDQoNCmBgYHtyfQ0KIyBHQVJDSCBNb2RlbA0KZ2FyY2hfbW9kZWwxID0gdWdhcmNoc3BlYyh2YXJpYW5jZS5tb2RlbCA9IGxpc3QobW9kZWwgPSAnc0dBUkNIJywgZ2FyY2hPcmRlciA9IGMoMSwxKSksIG1lYW4ubW9kZWwgPSBsaXN0KGFybWFPcmRlciA9IGMoMSwxKSwgaW5jbHVkZS5tZWFuID0gVFJVRSkpDQphZGFuaV9yZXRfZ2FyY2gxID0gdWdhcmNoZml0KGdhcmNoX21vZGVsMSwgZGF0YSA9IGFybWFfcHFfYWRhbmlfZHMkcmVzaWR1YWxzXjIpOyBhZGFuaV9yZXRfZ2FyY2gxDQpgYGANCg0KDQpgYGB7cn0NCiMgR0FSQ0ggRm9yZWNhc3QNCmFkYW5pX3JldF9nYXJjaF9mb3JlY2FzdDEgPSB1Z2FyY2hmb3JlY2FzdChhZGFuaV9yZXRfZ2FyY2gxLCBuLmFoZWFkID0gNTAwKTsgYWRhbmlfcmV0X2dhcmNoX2ZvcmVjYXN0MQ0KYGBgDQoNCg0KYGBge3J9DQpwbG90KGFkYW5pX3JldF9nYXJjaF9mb3JlY2FzdDEsIHdoaWNoID0gMSkNCmBgYA0KDQoNCmBgYHtyfQ0KIyBQbG90IHRoZSBzcGVjaWZpZWQgYXNwZWN0IG9mIHRoZSBHQVJDSCBmb3JlY2FzdA0KcGxvdChhZGFuaV9yZXRfZ2FyY2hfZm9yZWNhc3QxLCB3aGljaCA9IDMpDQoNCmBgYA0KDQoNCiA=