import price data

spotPrice <- read.csv("D:/OilMarketAnalysis/spotPrice.csv")
cannot open file 'D:/OilMarketAnalysis/spotPrice.csv': No such file or directoryError in file(file, "rt") : cannot open the connection

put price data into a dataframe and change the date to the date data format

#simplify date column 
priceData <- edit(priceData)
class discarded from column 㤼㸱as.Date.spotPrice.Day....m..d..Y..㤼㸲

plot price data

import production data

oilProduction <- read.csv("~/oilProduction.csv")

convert date to proper data type and save in a dataframe and clean data

#I need to make the date variable column name simpler for later use
productionData <- edit(productionData)
class discarded from column 㤼㸱as.Date.oilProduction.Date....m..d..Y...1.467.㤼㸲

plot production data

this data looks weird. i want to check for weird values

any(is.na(productionData$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.) | is.infinite(productionData$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.))
[1] FALSE

there appears to be no missing or infinite values

I want to match prices with output

head(priceData)
head(productionData)

#i will join my data frames on the date column
library(dplyr)


oilDataBase <- inner_join(productionData, priceData)
Joining, by = "Date"
#just price and quantity
marketOverview <- oilDataBase[order(oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.),]

View(marketOverview)
plot(marketOverview$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.[1:284], marketOverview$spotPrice.Cushing.OK.WTI.Spot.Price.FOB..Dollars.per.Barrel[1:284], type = "l", xlab = "Production (Thousands of barrels)", ylab = "Price (Dollars)", main = "Quantity Supplied and Price of Oil in Oklahoma", col = "blue")



View(oilDataBase)

model <- lm(formula = oilDataBase$spotPrice.Cushing.OK.WTI.Spot.Price.FOB..Dollars.per.Barrel ~ oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.)

plot(oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467., oilDataBase$spotPrice.Cushing.OK.WTI.Spot.Price.FOB..Dollars.per.Barrel)


model

Call:
lm(formula = oilDataBase$spotPrice.Cushing.OK.WTI.Spot.Price.FOB..Dollars.per.Barrel ~ 
    oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.)

Coefficients:
                                                                               (Intercept)  
                                                                                 4.085e+01  
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.  
                                                                                 3.644e-04  
plot(model)


bfl <- (3.644e-04 * oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.) + 4.085e+01

demand <- (((1/3.644e-04) * oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.) + 4.085e+01)


plot(oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467., bfl, type = "l", xlab = "Production (Thousands of barrels)", main = "Linear Model of Oil Supply in Oklahoma", ylab = "Price (Dollars)", col = "red") 

It appears that higher prices generally lead to a higher production of oil, but recent technological changes make it hard to determine a more realistic supply curve. Production is going up and prices are falling. Currently the market appears oversupplied.

summary(model)

Call:
lm(formula = oilDataBase$spotPrice.Cushing.OK.WTI.Spot.Price.FOB..Dollars.per.Barrel ~ 
    oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.)

Residuals:
   Min     1Q Median     3Q    Max 
-33.51 -24.05 -12.20  17.41  95.75 

Coefficients:
                                                                                            Estimate
(Intercept)                                                                                4.085e+01
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467. 3.644e-04
                                                                                           Std. Error
(Intercept)                                                                                 4.661e+00
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.  5.015e-04
                                                                                           t value
(Intercept)                                                                                  8.765
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.   0.726
                                                                                           Pr(>|t|)
(Intercept)                                                                                  <2e-16
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.    0.468
                                                                                              
(Intercept)                                                                                ***
oilDataBase$oilProduction.Oklahoma.Field.Production.of.Crude.Oil..Thousand.Barrels..1.467.    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 29.01 on 282 degrees of freedom
Multiple R-squared:  0.001868,  Adjusted R-squared:  -0.001671 
F-statistic: 0.5278 on 1 and 282 DF,  p-value: 0.4681

the model does not appear significant at a 5% significance level.

I want to isolate more recent market data from 2015 - 2020…

summary(recentModel)

Call:
lm(formula = orderedRecentData$Production ~ orderedRecentData$Price)

Residuals:
   Min     1Q Median     3Q    Max 
 -3218  -1161   -286   1122   3383 

Coefficients:
                        Estimate Std. Error t value Pr(>|t|)    
(Intercept)              7320.02    1479.08   4.949 1.47e-05 ***
orderedRecentData$Price   145.06      27.66   5.244 5.78e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 1603 on 39 degrees of freedom
Multiple R-squared:  0.4135,    Adjusted R-squared:  0.3985 
F-statistic:  27.5 on 1 and 39 DF,  p-value: 5.783e-06

I want to deseasonalize the data…

now aggrigate, order, and plot the deseasonalized data

deseasonalizedData <- data.frame(deseasonalizedPrice$dspar, deseasonalizedProduction$z) 
row names were found from a short variable and have been discarded

now i want to make a cleaner plot of the deseasonalized relationship

okay, that should do it for supply. now i want to do the same for demand… import the data

USCrudeSupplied <- read.csv("~/USCrudeSupplied.csv")

get the data types set up

I cant find oklahoma specific data so I’m going to marginally use this data. moving on…

I want to compare price and quantity from before horizontal drilling and after. Supposedly technical change should shift the supply line to the right. is this correct?

grab the data

oldData <- oilDataBase[35:85]
Error in `[.data.frame`(oilDataBase, 35:85) : undefined columns selected

plot the data

now order the data for price and quantity

plot and compare price and quantity

try to put both lines on one graph…

i need to show change in demand get the data

now plot the data

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KaW1wb3J0IHByaWNlIGRhdGENCmBgYHtyfQ0Kc3BvdFByaWNlIDwtIHJlYWQuY3N2KCJEOi9PaWxNYXJrZXRBbmFseXNpcy9zcG90UHJpY2UuY3N2IikNCmBgYA0KDQpwdXQgcHJpY2UgZGF0YSBpbnRvIGEgZGF0YWZyYW1lIGFuZCBjaGFuZ2UgdGhlIGRhdGUgdG8gdGhlIGRhdGUgZGF0YSBmb3JtYXQNCmBgYHtyfQ0KcHJpY2VEYXRhIDwtIGRhdGEuZnJhbWUoYXMuRGF0ZShzcG90UHJpY2UkRGF5LCAiJW0vJWQvJVkiKSwgc3BvdFByaWNlJEN1c2hpbmcuT0suV1RJLlNwb3QuUHJpY2UuRk9CLi5Eb2xsYXJzLnBlci5CYXJyZWwpDQoNCiNzaW1wbGlmeSBkYXRlIGNvbHVtbiANCnByaWNlRGF0YSA8LSBlZGl0KHByaWNlRGF0YSkNCnByaWNlRGF0YSREYXRlIDwtIGFzLkRhdGUocHJpY2VEYXRhJERhdGUpDQpgYGANCg0KcGxvdCBwcmljZSBkYXRhDQpgYGB7cn0NCnBsb3QocHJpY2VEYXRhJERhdGUsIHByaWNlRGF0YSRzcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbCwgeGxhYiA9ICJEYXRlIiwgeWxhYiA9ICJXVEkgU3BvdCBQcmljZSIsIG1haW4gPSAiQ3VzaGluZyBPa2xhaG9tYSBXVEkgU3BvdCBQcmljZSIsIHR5cGUgPSAiaCIsIGNvbCA9ICJibHVlIikNCmBgYA0KDQppbXBvcnQgcHJvZHVjdGlvbiBkYXRhDQpgYGB7cn0NCm9pbFByb2R1Y3Rpb24gPC0gcmVhZC5jc3YoIn4vb2lsUHJvZHVjdGlvbi5jc3YiKQ0KYGBgDQoNCmNvbnZlcnQgZGF0ZSB0byBwcm9wZXIgZGF0YSB0eXBlIGFuZCBzYXZlIGluIGEgZGF0YWZyYW1lIGFuZCBjbGVhbiBkYXRhDQpgYGB7cn0NCiNjaGFuZ2UgdGhlIGRhdGUgZmllbGQgbmFtZSB0byBEYXRlIHNvIHRoZSBjb21wdXRlciBjYW4gcmVhZCBpdC4uLg0Kb2lsUHJvZHVjdGlvbiA8LSBlZGl0KG9pbFByb2R1Y3Rpb24pDQoNCiNwdXQgcHJvZHVjdGlvbiBkYXRhIGludG8gYSBkYXRhZnJhbWUNCnByb2R1Y3Rpb25EYXRhIDwtIGRhdGEuZnJhbWUoYXMuRGF0ZShvaWxQcm9kdWN0aW9uJERhdGUsICIlbS8lZC8lWSIpWzE6NDY3XSwgb2lsUHJvZHVjdGlvbiRPa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy5bMTo0NjddKQ0KDQojSSBuZWVkIHRvIG1ha2UgdGhlIGRhdGUgdmFyaWFibGUgY29sdW1uIG5hbWUgc2ltcGxlciBmb3IgbGF0ZXIgdXNlDQpwcm9kdWN0aW9uRGF0YSA8LSBlZGl0KHByb2R1Y3Rpb25EYXRhKQ0KcHJvZHVjdGlvbkRhdGEkRGF0ZSA8LSBhcy5EYXRlKHByb2R1Y3Rpb25EYXRhJERhdGUpDQpgYGANCg0KcGxvdCBwcm9kdWN0aW9uIGRhdGENCmBgYHtyfQ0KcGxvdChwcm9kdWN0aW9uRGF0YSREYXRlLCBwcm9kdWN0aW9uRGF0YSRvaWxQcm9kdWN0aW9uLk9rbGFob21hLkZpZWxkLlByb2R1Y3Rpb24ub2YuQ3J1ZGUuT2lsLi5UaG91c2FuZC5CYXJyZWxzLi4xLjQ2Ny4sIHhsYWIgPSAiRGF0ZSIsIHlsYWIgPSAiQmFycmVscyBvZiBPaWwgKFRob3VzYW5kcykiLCBtYWluID0gIk9rbGFob21hIENydWRlIE9pbCBQcm9kdWN0aW9uIiwgdHlwZSA9ICJoIiwgY29sID0gInJlZCIpDQpgYGANCg0KdGhpcyBkYXRhIGxvb2tzIHdlaXJkLiBpIHdhbnQgdG8gY2hlY2sgZm9yIHdlaXJkIHZhbHVlcw0KYGBge3J9DQphbnkoaXMubmEocHJvZHVjdGlvbkRhdGEkb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuKSB8IGlzLmluZmluaXRlKHByb2R1Y3Rpb25EYXRhJG9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3LikpDQpgYGANCg0KdGhlcmUgYXBwZWFycyB0byBiZSBubyBtaXNzaW5nIG9yIGluZmluaXRlIHZhbHVlcw0KDQoNCkkgd2FudCB0byBtYXRjaCBwcmljZXMgd2l0aCBvdXRwdXQNCmBgYHtyfQ0KaGVhZChwcmljZURhdGEpDQpoZWFkKHByb2R1Y3Rpb25EYXRhKQ0KDQojaSB3aWxsIGpvaW4gbXkgZGF0YSBmcmFtZXMgb24gdGhlIGRhdGUgY29sdW1uDQpsaWJyYXJ5KGRwbHlyKQ0KDQoNCm9pbERhdGFCYXNlIDwtIGlubmVyX2pvaW4ocHJvZHVjdGlvbkRhdGEsIHByaWNlRGF0YSkNCg0KDQoNCiNqdXN0IHByaWNlIGFuZCBxdWFudGl0eQ0KbWFya2V0T3ZlcnZpZXcgPC0gb2lsRGF0YUJhc2Vbb3JkZXIob2lsRGF0YUJhc2Ukb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuKSxdDQoNClZpZXcobWFya2V0T3ZlcnZpZXcpDQpwbG90KG1hcmtldE92ZXJ2aWV3JG9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3LlsxOjI4NF0sIG1hcmtldE92ZXJ2aWV3JHNwb3RQcmljZS5DdXNoaW5nLk9LLldUSS5TcG90LlByaWNlLkZPQi4uRG9sbGFycy5wZXIuQmFycmVsWzE6Mjg0XSwgdHlwZSA9ICJsIiwgeGxhYiA9ICJQcm9kdWN0aW9uIChUaG91c2FuZHMgb2YgYmFycmVscykiLCB5bGFiID0gIlByaWNlIChEb2xsYXJzKSIsIG1haW4gPSAiUXVhbnRpdHkgU3VwcGxpZWQgYW5kIFByaWNlIG9mIE9pbCBpbiBPa2xhaG9tYSIsIGNvbCA9ICJibHVlIikNCg0KDQpWaWV3KG9pbERhdGFCYXNlKQ0KDQptb2RlbCA8LSBsbShmb3JtdWxhID0gb2lsRGF0YUJhc2Ukc3BvdFByaWNlLkN1c2hpbmcuT0suV1RJLlNwb3QuUHJpY2UuRk9CLi5Eb2xsYXJzLnBlci5CYXJyZWwgfiBvaWxEYXRhQmFzZSRvaWxQcm9kdWN0aW9uLk9rbGFob21hLkZpZWxkLlByb2R1Y3Rpb24ub2YuQ3J1ZGUuT2lsLi5UaG91c2FuZC5CYXJyZWxzLi4xLjQ2Ny4pDQoNCnBsb3Qob2lsRGF0YUJhc2Ukb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuLCBvaWxEYXRhQmFzZSRzcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbCkNCg0KbW9kZWwNCnBsb3QobW9kZWwpDQoNCmJmbCA8LSAoMy42NDRlLTA0ICogb2lsRGF0YUJhc2Ukb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuKSArIDQuMDg1ZSswMQ0KDQpkZW1hbmQgPC0gKCgoMS8zLjY0NGUtMDQpICogb2lsRGF0YUJhc2Ukb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuKSArIDQuMDg1ZSswMSkNCg0KDQpwbG90KG9pbERhdGFCYXNlJG9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3LiwgYmZsLCB0eXBlID0gImwiLCB4bGFiID0gIlByb2R1Y3Rpb24gKFRob3VzYW5kcyBvZiBiYXJyZWxzKSIsIG1haW4gPSAiTGluZWFyIE1vZGVsIG9mIE9pbCBTdXBwbHkgaW4gT2tsYWhvbWEiLCB5bGFiID0gIlByaWNlIChEb2xsYXJzKSIsIGNvbCA9ICJyZWQiKSANCmBgYA0KDQpJdCBhcHBlYXJzIHRoYXQgaGlnaGVyIHByaWNlcyBnZW5lcmFsbHkgbGVhZCB0byBhIGhpZ2hlciBwcm9kdWN0aW9uIG9mIG9pbCwgYnV0IHJlY2VudCB0ZWNobm9sb2dpY2FsIGNoYW5nZXMgbWFrZSBpdCBoYXJkIHRvIGRldGVybWluZSBhIG1vcmUgcmVhbGlzdGljIHN1cHBseSBjdXJ2ZS4gUHJvZHVjdGlvbiBpcyBnb2luZyB1cCBhbmQgcHJpY2VzIGFyZSBmYWxsaW5nLiBDdXJyZW50bHkgdGhlIG1hcmtldCBhcHBlYXJzIG92ZXJzdXBwbGllZC4NCg0KYGBge3J9DQpzdW1tYXJ5KG1vZGVsKQ0KYGBgDQp0aGUgbW9kZWwgZG9lcyBub3QgYXBwZWFyIHNpZ25pZmljYW50IGF0IGEgNSUgc2lnbmlmaWNhbmNlIGxldmVsLg0KDQoNCg0KSSB3YW50IHRvIGlzb2xhdGUgbW9yZSByZWNlbnQgbWFya2V0IGRhdGEgZnJvbSAyMDE1IC0gMjAyMC4uLg0KYGBge3J9DQpyZWNlbnREYXRhIDwtIGRhdGEuZnJhbWUob2lsRGF0YUJhc2UkRGF0ZVsyNDQ6Mjg0XSwgb2lsRGF0YUJhc2Ukb2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuWzI0NDoyODRdLCBvaWxEYXRhQmFzZSRzcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbFsyNDQ6Mjg0XSkNCg0KcmVjZW50RGF0YSA8LSBlZGl0KHJlY2VudERhdGEpDQoNCm9yZGVyZWRSZWNlbnREYXRhIDwtIHJlY2VudERhdGFbb3JkZXIocmVjZW50RGF0YSRQcm9kdWN0aW9uKSwgXQ0KDQpwbG90KG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24sIG9yZGVyZWRSZWNlbnREYXRhJFByaWNlLCB0eXBlID0gImwiLCB4bGFiID0gIlByb2R1Y3Rpb24iLCB5bGFiID0gIlByaWNlIiwgbWFpbiA9ICJPa2xhaG9tYSBPaWwgTWFya2V0IDIwMTUtMjAxOSIpDQoNCnJlY2VudE1vZGVsIDwtIGxtKG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24gfiBvcmRlcmVkUmVjZW50RGF0YSRQcmljZSkNCg0Kc3VtbWFyeShyZWNlbnRNb2RlbCkNCg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShnZ3RoZW1lcykNCg0KZ2dwbG90KG9yZGVyZWRSZWNlbnREYXRhLCBhZXMoeCA9IG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24sIHkgPSBvcmRlcmVkUmVjZW50RGF0YSRQcmljZSkpKw0KICBnZW9tX3BvaW50KCkrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikrDQogIGdlb21fc3RlcChkaXJlY3Rpb24gPSAiaHYiLCBjb2wgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIk1vZGVsIG9mIE9rbGFob21hIE9pbCBQcm9kdWN0aW9uIFxuMjAxNS8wMS8xNSAtIDIwMTkvMTEvMTUiLCB4ID0gIlByb2R1Y3Rpb24gKFRob3VzYW5kcyBvZiBCYXJyZWxzKSIgLCB5ID0gIlByaWNlIChEb2xsYXJzKSIpICsgDQogIHRoZW1lX2Vjb25vbWlzdF93aGl0ZSgpIA0KICANCg0KYGBgDQoNCmBgYHtyfQ0Kc3VtbWFyeShyZWNlbnRNb2RlbCkNCmBgYA0KDQpJIHdhbnQgdG8gZGVzZWFzb25hbGl6ZSB0aGUgZGF0YS4uLg0KYGBge3J9DQpsaWJyYXJ5KGRlc2Vhc29uYWxpemUpDQojbWFrZSB0aGUgcmVjZW50RGF0YSBpbnRvIGEgdGltZSBzZXJpZXMNCnRzcmVjZW50RGF0YVByb2R1Y3Rpb24gPC0gdHMoZGF0YSA9IHJlY2VudERhdGEkUHJvZHVjdGlvbiwgZnJlcXVlbmN5ID0gMTIsIHN0YXJ0ID0gYygyMDE1LCAxKSkNCnRzcmVjZW50RGF0YVByb2R1Y3Rpb24NCnBsb3QodHNyZWNlbnREYXRhUHJvZHVjdGlvbikNCg0KdHNyZWNlbnREYXRhUHJpY2UgPC0gdHMoZGF0YSA9IHJlY2VudERhdGEkUHJpY2UsIGZyZXF1ZW5jeSA9IDEyLCBzdGFydCA9IGMoMjAxNSwxKSkNCg0KI2Rlc2Vhc29uYWxpemUgcHJvZHVjdGlvbg0KZGVzZWFzb25hbGl6ZWRQcm9kdWN0aW9uIDwtIGRzKHRzcmVjZW50RGF0YVByb2R1Y3Rpb24sIHR5cGUgPSAibW9udGhseSIpDQpkZXNlYXNvbmFsaXplZFByb2R1Y3Rpb24NCnBsb3QoZGVzZWFzb25hbGl6ZWRQcm9kdWN0aW9uJHosIHR5cGUgPSAibCIpDQpwbG90KGRlc2Vhc29uYWxpemVkUHJvZHVjdGlvbiR6ICogdHNyZWNlbnREYXRhUHJvZHVjdGlvbikNCg0KcGxvdCh0c3JlY2VudERhdGFQcm9kdWN0aW9uIC8gZGVzZWFzb25hbGl6ZWRQcm9kdWN0aW9uJHopDQojZGVzZWFzb25hbGl6ZSBwcmljZQ0KZGVzZWFzb25hbGl6ZWRQcmljZSA8LSBkcyh0c3JlY2VudERhdGFQcmljZSwgdHlwZSA9ICJtb250aGx5IikNCnBsb3QoZGVzZWFzb25hbGl6ZWRQcmljZSR6LCB0eXBlID0gImwiKQ0KDQpkYXRhYmFzZSA8LSBkYXRhLmZyYW1lKCh0c3JlY2VudERhdGFQcm9kdWN0aW9uL2Rlc2Vhc29uYWxpemVkUHJvZHVjdGlvbiR6KSwgKHRzcmVjZW50RGF0YVByaWNlL2Rlc2Vhc29uYWxpemVkUHJpY2UkeikpDQoNCmRhdGFiYXNlIDwtIGRhdGFiYXNlW29yZGVyKGRhdGFiYXNlJFgudHNyZWNlbnREYXRhUHJvZHVjdGlvbi5kZXNlYXNvbmFsaXplZFByb2R1Y3Rpb24uei4pLCBdDQoNCnBsb3QoZGF0YWJhc2UkWC50c3JlY2VudERhdGFQcm9kdWN0aW9uLmRlc2Vhc29uYWxpemVkUHJvZHVjdGlvbi56LiwgZGF0YWJhc2UkWC50c3JlY2VudERhdGFQcmljZS5kZXNlYXNvbmFsaXplZFByaWNlLnouLCB0eXBlID0gImwiKQ0KDQoNCg0KYGBgDQoNCg0Kbm93IGFnZ3JpZ2F0ZSwgb3JkZXIsIGFuZCBwbG90IHRoZSBkZXNlYXNvbmFsaXplZCBkYXRhDQpgYGB7cn0NCmRlc2Vhc29uYWxpemVkRGF0YSA8LSBkYXRhLmZyYW1lKGRlc2Vhc29uYWxpemVkUHJpY2UkeiwgZGVzZWFzb25hbGl6ZWRQcm9kdWN0aW9uJHopIA0KDQoNCm9yZGVyZWREZXNlYXNvbmFsaXplZERhdGEgPC0gZGVzZWFzb25hbGl6ZWREYXRhW29yZGVyKGRlc2Vhc29uYWxpemVkRGF0YSksIF0NCg0KcGxvdCgob3JkZXJlZERlc2Vhc29uYWxpemVkRGF0YSRkZXNlYXNvbmFsaXplZFByaWNlLnogKiBvcmRlcmVkUmVjZW50RGF0YSRQcmljZSkgfiAob3JkZXJlZERlc2Vhc29uYWxpemVkRGF0YSRkZXNlYXNvbmFsaXplZFByb2R1Y3Rpb24ueiAqIG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24pLCB0eXBlID0gImwiLCB4bGFiID0gIkRlc2Vhc29uYWxpemVkIFByb2R1Y3Rpb24iLCB5bGFiID0gIkRlc2Vhc29uYWxpemVkIFByaWNlIikNCg0KDQojcGxvdCgob3JkZXJlZERlc2Vhc29uYWxpemVkRGF0YSRkZXNlYXNvbmFsaXplZFByb2R1Y3Rpb24ueiAqIG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24pLCAob3JkZXJlZERlc2Vhc29uYWxpemVkRGF0YSRkZXNlYXNvbmFsaXplZFByaWNlLnogKiBvcmRlcmVkUmVjZW50RGF0YSRQcmljZSksIHR5cGUgPSAibCIpDQpgYGANCg0Kbm93IGkgd2FudCB0byBtYWtlIGEgY2xlYW5lciBwbG90IG9mIHRoZSBkZXNlYXNvbmFsaXplZCByZWxhdGlvbnNoaXANCmBgYHtyfQ0KI2ZpcnN0IGkgd2FudCB0byBjbGVhbiB1cCB0aGUgdmFyaWFibGVzDQojcHJpY2UNCmRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZFByaWNlIDwtIChvcmRlcmVkRGVzZWFzb25hbGl6ZWREYXRhJGRlc2Vhc29uYWxpemVkUHJpY2UueiAqIG9yZGVyZWRSZWNlbnREYXRhJFByaWNlKQ0KDQojcHJvZHVjdGlvbg0KZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkUHJvZHVjdGlvbiA8LSAob3JkZXJlZERlc2Vhc29uYWxpemVkRGF0YSRkZXNlYXNvbmFsaXplZFByb2R1Y3Rpb24ueiAqIG9yZGVyZWRSZWNlbnREYXRhJFByb2R1Y3Rpb24pDQoNCiNwdXQgdGhlbSB0b2dldGhlcg0KZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkRGF0YSA8LSBkYXRhLmZyYW1lKGRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZFByaWNlLCBkZXNlYXNvbmFsaXplZEFuZE9yZGVyZWRQcm9kdWN0aW9uKQ0KDQojb3JkZXIgYWdhaW4NCmRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZERhdGEgPC0gZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkRGF0YVtvcmRlcihkZXNlYXNvbmFsaXplZEFuZE9yZGVyZWREYXRhJGRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZFByaWNlKSxdDQoNCm1vZGVsMyA8LSBsbShkZXNlYXNvbmFsaXplZEFuZE9yZGVyZWREYXRhJGRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZFByaWNlIH4gZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkRGF0YSRkZXNlYXNvbmFsaXplZEFuZE9yZGVyZWRQcm9kdWN0aW9uKQ0KDQojcGxvdCB0aGUgZGF0YQ0KZ2dwbG90KG1vZGVsMywgYWVzKHggPSBtb2RlbDMkbW9kZWwkYGRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZERhdGEkZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkUHJvZHVjdGlvbmAsIHkgPSBtb2RlbDMkbW9kZWwkYGRlc2Vhc29uYWxpemVkQW5kT3JkZXJlZERhdGEkZGVzZWFzb25hbGl6ZWRBbmRPcmRlcmVkUHJpY2VgKSkrDQogIGdlb21fcG9pbnQoKSsNCiAgZ2VvbV9zdGVwKGRpcmVjdGlvbiA9ICJodiIsIGNvbCA9ICJyZWQiKQ0KYGBgDQoNCmBgYHtyfQ0KDQpgYGANCg0KYGBge3J9DQpsaWJyYXJ5KFdpU0VCb290KQ0KeCA8LSBkZVNlYXNvbmFsaXplKGRhdGVzID0gcmVjZW50RGF0YSREYXRlLCB0eXBlID0gIm1vbnRobHkiLCBYID0gcmVjZW50RGF0YSRQcm9kdWN0aW9uLCBtZXRob2QgPSAiZGVNZWFuIikNCg0KeSA8LSBkZVNlYXNvbmFsaXplKGRhdGVzID0gcmVjZW50RGF0YSREYXRlLCB0eXBlID0gIm1vbnRobHkiLCBYID0gcmVjZW50RGF0YSRQcmljZSwgbWV0aG9kID0gImRlTWVhbiIpDQoNCngNCg0KeHkgPC0gZGF0YS5mcmFtZSh4LHkpDQoNCnh5IDwtIHh5W29yZGVyKHgpLCBdDQoNCnBsb3QoeHkkeSB+IHh5JHgsIHR5cGUgPSAiYiIpDQoNCnBsb3QoeCwgdHlwZSA9ICJsIikNCg0KDQptb2RlbDQgPC0gbG0oeHkkeSB+IHh5JHgpDQpzdW1tYXJ5KG1vZGVsNCkNCg0KDQpnZ3Bsb3QoeHksIGFlcyh4ID0geCwgeSA9IHkpKSAgK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpICsgZ2VvbV9zdGVwKCkNCg0KDQpnZ3Bsb3QoeHksIGFlcyh4ID0geHkkeCwgeSA9IHh5JHkpKSsNCiAgZ2VvbV9wb2ludCgpK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpKw0KICBnZW9tX3N0ZXAoZGlyZWN0aW9uID0gImh2IiwgY29sID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJMaW5lYXIgTW9kZWwgb2YgT2tsYWhvbWEgT2lsIFByb2R1Y3Rpb24gXG4yMDE1LTIwMTkiLCB4ID0gIlByb2R1Y3Rpb24gKFRob3VzYW5kcyBvZiBCYXJyZWxzKSIgLCB5ID0gIlByaWNlIChEb2xsYXJzKSIpICsgDQogIHRoZW1lX2Vjb25vbWlzdF93aGl0ZSgpIA0KDQpgYGANCg0KDQoNCg0Kb2theSwgdGhhdCBzaG91bGQgZG8gaXQgZm9yIHN1cHBseS4gbm93IGkgd2FudCB0byBkbyB0aGUgc2FtZSBmb3IgZGVtYW5kLi4uDQppbXBvcnQgdGhlIGRhdGENCmBgYHtyfQ0KVVNDcnVkZVN1cHBsaWVkIDwtIHJlYWQuY3N2KCJ+L1VTQ3J1ZGVTdXBwbGllZC5jc3YiKQ0KYGBgDQoNCg0KZ2V0IHRoZSBkYXRhIHR5cGVzIHNldCB1cA0KYGBge3J9DQpVU0NydWRlU3VwcGxpZWQkw68uLkRhdGUgPC0gYXMuRGF0ZShVU0NydWRlU3VwcGxpZWQkw68uLkRhdGUsICIlYiAlZCwgJVkiKQ0KDQpVU0NydWRlU3VwcGxpZWQgPC0gZWRpdChVU0NydWRlU3VwcGxpZWQpDQpVU0NydWRlU3VwcGxpZWQkRGF0ZSA8LSBhcy5EYXRlKFVTQ3J1ZGVTdXBwbGllZCREYXRlKQ0KDQoNCnBsb3QoVVNDcnVkZVN1cHBsaWVkJERhdGUsIFVTQ3J1ZGVTdXBwbGllZCRVUy5DcnVkZS5PaWwuU3VwcGxpZWQsIHR5cGUgPSAiaCIsIHhsYWIgPSAiRGF0ZSIsIHlsYWIgPSAiQ3J1ZGUgT2lsIFN1cHBsaWVkIChUaG91c2FuZHMgb2YgQmFycmVscykiLCBtYWluID0gIlVTIENydWRlIE9pbCBEZW1hbmQgYnkgRGF0ZSIsIGNvbCA9ICJncmVlbiIpDQpgYGANCg0KSSBjYW50IGZpbmQgb2tsYWhvbWEgc3BlY2lmaWMgZGF0YSBzbyBJJ20gZ29pbmcgdG8gbWFyZ2luYWxseSB1c2UgdGhpcyBkYXRhLiBtb3Zpbmcgb24uLi4NCg0KDQoNCkkgd2FudCB0byBjb21wYXJlIHByaWNlIGFuZCBxdWFudGl0eSBmcm9tIGJlZm9yZSBob3Jpem9udGFsIGRyaWxsaW5nIGFuZCBhZnRlci4gU3VwcG9zZWRseSB0ZWNobmljYWwgY2hhbmdlIHNob3VsZCBzaGlmdCB0aGUgc3VwcGx5IGxpbmUgdG8gdGhlIHJpZ2h0LiBpcyB0aGlzIGNvcnJlY3Q/DQoNCmdyYWIgdGhlIGRhdGENCmBgYHtyfQ0Kb2xkRGF0YSA8LSBkYXRhLmZyYW1lKG9pbERhdGFCYXNlJERhdGVbMzU6NzVdLCBvaWxEYXRhQmFzZSRvaWxQcm9kdWN0aW9uLk9rbGFob21hLkZpZWxkLlByb2R1Y3Rpb24ub2YuQ3J1ZGUuT2lsLi5UaG91c2FuZC5CYXJyZWxzLi4xLjQ2Ny5bMzU6NzVdLCBvaWxEYXRhQmFzZSRzcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbFszNTo3NV0pDQpgYGANCg0KcGxvdCB0aGUgZGF0YQ0KYGBge3J9DQpwbG90KG9sZERhdGEkb2lsRGF0YUJhc2UuRGF0ZS4zNS43NS4sIG9sZERhdGEkb2lsRGF0YUJhc2Uub2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuLjM1Ljc1LiwgdHlwZSA9ICJsIiwgeGxhYiA9ICJEYXRlIiwgeWxhYiA9ICJQcm9kdWN0aW9uIikNCg0KcGxvdChvbGREYXRhJG9pbERhdGFCYXNlLkRhdGUuMzUuNzUuLCBvbGREYXRhJG9pbERhdGFCYXNlLnNwb3RQcmljZS5DdXNoaW5nLk9LLldUSS5TcG90LlByaWNlLkZPQi4uRG9sbGFycy5wZXIuQmFycmVsLjM1Ljc1LiwgdHlwZSA9ICJsIiwgeGxhYiA9ICJEYXRlIiwgeWxhYiA9ICJQcmljZSIpDQpgYGANCg0Kbm93IG9yZGVyIHRoZSBkYXRhIGZvciBwcmljZSBhbmQgcXVhbnRpdHkNCmBgYHtyfQ0Kb3JkZXJlZE9sZERhdGEgPC0gb2xkRGF0YVtvcmRlcihvbGREYXRhJG9pbERhdGFCYXNlLnNwb3RQcmljZS5DdXNoaW5nLk9LLldUSS5TcG90LlByaWNlLkZPQi4uRG9sbGFycy5wZXIuQmFycmVsLjM1Ljc1LiksIF0NCmBgYA0KDQpwbG90IGFuZCBjb21wYXJlIHByaWNlIGFuZCBxdWFudGl0eQ0KYGBge3J9DQpnZ3Bsb3Qob3JkZXJlZE9sZERhdGEsIGFlcyh4ID0gb3JkZXJlZE9sZERhdGEkb2lsRGF0YUJhc2Uub2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuLjM1Ljc1LiwgeSA9IG9yZGVyZWRPbGREYXRhJG9pbERhdGFCYXNlLnNwb3RQcmljZS5DdXNoaW5nLk9LLldUSS5TcG90LlByaWNlLkZPQi4uRG9sbGFycy5wZXIuQmFycmVsLjM1Ljc1LikpKw0KICBnZW9tX3BvaW50KCkrZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikrDQogIGdlb21fc3RlcChkaXJlY3Rpb24gPSAiaHYiLCBjb2wgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIkxpbmVhciBNb2RlbCBvZiBPa2xhaG9tYSBPaWwgUHJvZHVjdGlvbiBcbjE5OTAvMDEvMTUgLSAxOTk0LzA5LzE1IiwgeCA9ICJQcm9kdWN0aW9uIChUaG91c2FuZHMgb2YgQmFycmVscykiICwgeSA9ICJQcmljZSAoRG9sbGFycykiKSArIA0KICB0aGVtZV9lY29ub21pc3Rfd2hpdGUoKSANCmBgYA0KDQp0cnkgdG8gcHV0IGJvdGggbGluZXMgb24gb25lIGdyYXBoLi4uDQpgYGB7cn0NCm9sZFBsb3QgPC0gZ2dwbG90KG9yZGVyZWRPbGREYXRhLCBhZXMoeCA9IG9yZGVyZWRPbGREYXRhJG9pbERhdGFCYXNlLm9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3Li4zNS43NS4sIHkgPSBvcmRlcmVkT2xkRGF0YSRvaWxEYXRhQmFzZS5zcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbC4zNS43NS4pKSsNCiAgZ2VvbV9wb2ludCgpK2dlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpKw0KICBnZW9tX3N0ZXAoZGlyZWN0aW9uID0gImh2IiwgY29sID0gInJlZCIpICsNCiAgbGFicyh0aXRsZSA9ICJMaW5lYXIgTW9kZWwgb2YgT2tsYWhvbWEgT2lsIFByb2R1Y3Rpb24gXG4xOTkwLzAxLzE1IC0gMTk5NC8wOS8xNSIsIHggPSAiUHJvZHVjdGlvbiAoVGhvdXNhbmRzIG9mIEJhcnJlbHMpIiAsIHkgPSAiUHJpY2UgKERvbGxhcnMpIikgKyANCiAgdGhlbWVfZWNvbm9taXN0X3doaXRlKCkgDQoNCg0KcmVjZW50UGxvdCA8LSBnZ3Bsb3Qob3JkZXJlZFJlY2VudERhdGEsIGFlcyh4ID0gb3JkZXJlZFJlY2VudERhdGEkUHJvZHVjdGlvbiwgeSA9IG9yZGVyZWRSZWNlbnREYXRhJFByaWNlKSkrDQogIGdlb21fcG9pbnQoKStnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKSsNCiAgZ2VvbV9zdGVwKGRpcmVjdGlvbiA9ICJodiIsIGNvbCA9ICJyZWQiKSArDQogIGxhYnModGl0bGUgPSAiTW9kZWwgb2YgT2tsYWhvbWEgT2lsIFByb2R1Y3Rpb24gXG4yMDE1LzAxLzE1IC0gMjAxOS8xMS8xNSIsIHggPSAiUHJvZHVjdGlvbiAoVGhvdXNhbmRzIG9mIEJhcnJlbHMpIiAsIHkgPSAiUHJpY2UgKERvbGxhcnMpIikgKyANCiAgdGhlbWVfZWNvbm9taXN0X3doaXRlKCkgDQoNCmdncGxvdCgpKyANCiAgZ2VvbV9wb2ludChkYXRhID0gb3JkZXJlZE9sZERhdGEsIGFlcyh4ID0gb3JkZXJlZE9sZERhdGEkb2lsRGF0YUJhc2Uub2lsUHJvZHVjdGlvbi5Pa2xhaG9tYS5GaWVsZC5Qcm9kdWN0aW9uLm9mLkNydWRlLk9pbC4uVGhvdXNhbmQuQmFycmVscy4uMS40NjcuLjM1Ljc1LiwgeSA9IG9yZGVyZWRPbGREYXRhJG9pbERhdGFCYXNlLnNwb3RQcmljZS5DdXNoaW5nLk9LLldUSS5TcG90LlByaWNlLkZPQi4uRG9sbGFycy5wZXIuQmFycmVsLjM1Ljc1LikpICsNCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IG9yZGVyZWRPbGREYXRhLCBhZXMoeCA9IG9yZGVyZWRPbGREYXRhJG9pbERhdGFCYXNlLm9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3Li4zNS43NS4sIHkgPSBvcmRlcmVkT2xkRGF0YSRvaWxEYXRhQmFzZS5zcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbC4zNS43NS4pLCBmaWxsID0gImJsdWUiLCBjb2xvciA9ICJkYXJrYmx1ZSIsIHNpemUgPSAxLCBtZXRob2QgPSAibG0iKSArIA0KICBnZW9tX3N0ZXAoZGF0YSA9IG9yZGVyZWRPbGREYXRhLCBhZXMoeCA9IG9yZGVyZWRPbGREYXRhJG9pbERhdGFCYXNlLm9pbFByb2R1Y3Rpb24uT2tsYWhvbWEuRmllbGQuUHJvZHVjdGlvbi5vZi5DcnVkZS5PaWwuLlRob3VzYW5kLkJhcnJlbHMuLjEuNDY3Li4zNS43NS4sIHkgPSBvcmRlcmVkT2xkRGF0YSRvaWxEYXRhQmFzZS5zcG90UHJpY2UuQ3VzaGluZy5PSy5XVEkuU3BvdC5QcmljZS5GT0IuLkRvbGxhcnMucGVyLkJhcnJlbC4zNS43NS4pLCBkaXJlY3Rpb24gPSAiaHYiLCBjb2wgPSAicmVkIikgKw0KICANCiAgZ2VvbV9wb2ludChkYXRhID0gb3JkZXJlZFJlY2VudERhdGEsIGFlcyh4ID0gb3JkZXJlZFJlY2VudERhdGEkUHJvZHVjdGlvbiwgeSA9IG9yZGVyZWRSZWNlbnREYXRhJFByaWNlKSkgKyBnZW9tX3Ntb290aChkYXRhID0gb3JkZXJlZFJlY2VudERhdGEsIGFlcyh4ID0gb3JkZXJlZFJlY2VudERhdGEkUHJvZHVjdGlvbiwgeSA9IG9yZGVyZWRSZWNlbnREYXRhJFByaWNlKSwgbWV0aG9kID0gImxtIikrDQogIGdlb21fc3RlcChkYXRhID0gb3JkZXJlZFJlY2VudERhdGEsIGFlcyh4ID0gb3JkZXJlZFJlY2VudERhdGEkUHJvZHVjdGlvbiwgeSA9IG9yZGVyZWRSZWNlbnREYXRhJFByaWNlKSwgZGlyZWN0aW9uID0gImh2IiwgY29sID0gInJlZCIpKw0KICANCiAgbGFicyh4ID0gIlByb2R1Y3Rpb24gKFRob3VzYW5kcyBvZiBCYXJyZWxzKSIsIHkgPSAiUHJpY2UgKERvbGxhcnMpIiwgdGl0bGUgPSAiT2tsYWhvbWEgT2lsIFByb2R1Y3Rpb24gYW5kIFByaWNlIFxuMTk5MC8wMS8xNSAtIDE5OTQvMDkvMTUgYW5kIDIwMTUvMDEvMTUgLSAyMDE5LzExLzE1IikgKw0KICANCiAgdGhlbWVfZWNvbm9taXN0X3doaXRlKCkNCmBgYA0KDQppIG5lZWQgdG8gc2hvdyBjaGFuZ2UgaW4gZGVtYW5kDQpnZXQgdGhlIGRhdGENCmBgYHtyfQ0Kb2xkQ3J1ZGVTdXBwbGllZCA8LSBkYXRhLmZyYW1lKFVTQ3J1ZGVTdXBwbGllZCRVUy5DcnVkZS5PaWwuU3VwcGxpZWRbMToxNzhdKQ0KcmVjZW50Q3J1ZGVTdXBwbGllZCA8LSBkYXRhLmZyYW1lKFVTQ3J1ZGVTdXBwbGllZCRVUy5DcnVkZS5PaWwuU3VwcGxpZWRbMTMxNDoxNDkxXSkNCmBgYA0KDQpub3cgcGxvdCB0aGUgZGF0YQ0KYGBge3J9DQpnZ3Bsb3QoKSArDQogICNnZW9tX2xpbmUoZGF0YSA9IG9sZENydWRlU3VwcGxpZWQsIGFlcyh4ID0gYygxOjE3OCkgLCB5ID0gb2xkQ3J1ZGVTdXBwbGllZCRVU0NydWRlU3VwcGxpZWQuVVMuQ3J1ZGUuT2lsLlN1cHBsaWVkLjEuMTc4LiksIGNvbCA9ICJyZWQiKSArDQogIA0KICBnZW9tX2xpbmUoZGF0YSA9IHJlY2VudENydWRlU3VwcGxpZWQsIGFlcyh4ID0gYygxOjE3OCksIHkgPSByZWNlbnRDcnVkZVN1cHBsaWVkJFVTQ3J1ZGVTdXBwbGllZC5VUy5DcnVkZS5PaWwuU3VwcGxpZWQuMTMxNC4xNDkxLiksIGNvbCA9ICJibHVlIikgKw0KICANCiAgbGFicyh4ID0gIkluZGV4IiwgeSA9ICJDcnVkZSBEZW1hbmQiLCB0aXRsZSA9ICJDcnVkZSBPaWwgRGVtYW5kIFxuMjAxNi8wNy8wOCAtIDIwMTkvMTEvMjkiKSsgdGhlbWVfZWNvbm9taXN0X3doaXRlKCkNCiANCiAgDQpgYGANCg0K