Please note that when trying to Knit a report to PDF I encountered an error due to memory constraints. This file contains the full code, while the PDF Report contains only the plots and summary statistics for illustrative purposes.
Load Commands
I loaded each file individually into R from the web to create a combined file of SEC data.
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q10.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q10.zip'
Content type 'application/octet-stream' length 12002626 bytes (11.4 MB)
downloaded 11.4 MB
unzip(temp, "q1_2012_all.csv")
q1_2012 <- read.csv("q1_2012_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q2.zip'
Content type 'application/octet-stream' length 12257834 bytes (11.7 MB)
downloaded 11.7 MB
unzip(temp, "q2_2012_all.csv")
q2_2012 <- read.csv("q2_2012_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q3.zip'
Content type 'application/octet-stream' length 11813209 bytes (11.3 MB)
downloaded 11.3 MB
unzip(temp, "q3_2012_all.csv")
q3_2012 <- read.csv("q3_2012_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2012_q4.zip'
Content type 'application/octet-stream' length 11759021 bytes (11.2 MB)
downloaded 10.3 MB
downloaded length 10761477 != reported length 11759021
unzip(temp, "q4_2012_all.csv")
error 1 in extracting from zip file
q4_2012 <- read.csv("q4_2012_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q1.zip'
Content type 'application/octet-stream' length 11426842 bytes (10.9 MB)
downloaded 10.9 MB
unzip(temp, "q1_2013_all.csv")
q1_2013 <- read.csv("q1_2013_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q2.zip'
Content type 'application/octet-stream' length 12294800 bytes (11.7 MB)
downloaded 11.7 MB
unzip(temp, "q2_2013_all.csv")
q2_2013 <- read.csv("q2_2013_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q3.zip'
Content type 'application/octet-stream' length 12331275 bytes (11.8 MB)
downloaded 11.8 MB
unzip(temp, "q3_2013_all.csv")
q3_2013 <- read.csv("q3_2013_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2013_q4.zip'
Content type 'application/octet-stream' length 12489295 bytes (11.9 MB)
downloaded 11.9 MB
unzip(temp, "q4_2013_all.csv")
q4_2013 <- read.csv("q4_2013_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q1.zip'
Content type 'application/octet-stream' length 12621169 bytes (12.0 MB)
downloaded 12.0 MB
unzip(temp, "q1_2014_all.csv")
q1_2014 <- read.csv("q1_2014_all.csv", sep=",", skipNul=T, header=T)
setwd("~/Georgia Tech/Managing FIs/Assign1")
The working directory was changed to C:/Users/joev2/OneDrive/Documents/Georgia Tech/Managing FIs/Assign1 inside a notebook chunk. The working directory will be reset when the chunk is finished running. Use the knitr root.dir option in the setup chunk to change the working directory for notebook chunks.
q2_2014 <- read.csv("~/Georgia Tech/Managing FIs/Assign1/q2_2014_all.csv")
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q3.zip'
Content type 'application/octet-stream' length 13239788 bytes (12.6 MB)
downloaded 12.6 MB
unzip(temp, "q3_2014_all.csv")
q3_2014 <- read.csv("q3_2014_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2014_q4.zip'
Content type 'application/octet-stream' length 13436977 bytes (12.8 MB)
downloaded 12.8 MB
unzip(temp, "q4_2014_all.csv")
q4_2014 <- read.csv("q4_2014_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q1.zip'
Content type 'application/octet-stream' length 12806276 bytes (12.2 MB)
downloaded 12.2 MB
unzip(temp, "q1_2015_all.csv")
q1_2015 <- read.csv("q1_2015_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q2.zip'
Content type 'application/octet-stream' length 13183979 bytes (12.6 MB)
downloaded 12.6 MB
unzip(temp, "q2_2015_all.csv")
q2_2015 <- read.csv("q2_2015_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q3.zip'
Content type 'application/octet-stream' length 13707984 bytes (13.1 MB)
downloaded 13.1 MB
unzip(temp, "q3_2015_all.csv")
q3_2015 <- read.csv("q3_2015_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2015_q4.zip'
Content type 'application/octet-stream' length 13672831 bytes (13.0 MB)
downloaded 13.0 MB
unzip(temp, "q4_2015_all.csv")
q4_2015 <- read.csv("q4_2015_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q1.zip'
Content type 'application/octet-stream' length 15177551 bytes (14.5 MB)
downloaded 14.5 MB
unzip(temp, "q1_2016_all.csv")
q1_2016 <- read.csv("q1_2016_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q2.zip'
Content type 'application/octet-stream' length 15643843 bytes (14.9 MB)
downloaded 14.9 MB
unzip(temp, "q2_2016_all.csv")
q2_2016 <- read.csv("q2_2016_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q3.zip'
Content type 'application/octet-stream' length 15566189 bytes (14.8 MB)
downloaded 14.8 MB
unzip(temp, "q3_2016_all.csv")
q3_2016 <- read.csv("q3_2016_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2016_q4.zip'
Content type 'application/octet-stream' length 15371263 bytes (14.7 MB)
downloaded 14.7 MB
unzip(temp, "q4_2016_all.csv")
q4_2016 <- read.csv("q4_2016_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q1.zip'
Content type 'application/octet-stream' length 15146559 bytes (14.4 MB)
downloaded 14.4 MB
unzip(temp, "q1_2017_all.csv")
q1_2017 <- read.csv("q1_2017_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q2.zip'
Content type 'application/octet-stream' length 15231558 bytes (14.5 MB)
downloaded 14.5 MB
unzip(temp, "q2_2017_all.csv")
q2_2017 <- read.csv("q2_2017_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q3.zip'
Content type 'application/octet-stream' length 15255963 bytes (14.5 MB)
downloaded 14.5 MB
unzip(temp, "q3_2017_all.csv")
q3_2017 <- read.csv("q3_2017_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2017_q4.zip'
Content type 'application/octet-stream' length 15448988 bytes (14.7 MB)
downloaded 14.7 MB
unzip(temp, "q4_2017_all.csv")
q4_2017 <- read.csv("q4_2017_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q1.zip'
Content type 'application/octet-stream' length 15320197 bytes (14.6 MB)
downloaded 14.6 MB
unzip(temp, "q1_2018_all.csv")
q1_2018 <- read.csv("q1_2018_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q2.zip'
Content type 'application/octet-stream' length 16136876 bytes (15.4 MB)
downloaded 15.4 MB
unzip(temp, "q2_2018_all.csv")
q2_2018 <- read.csv("q2_2018_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q3.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q3.zip'
Content type 'application/octet-stream' length 16309710 bytes (15.6 MB)
downloaded 15.6 MB
unzip(temp, "q3_2018_all.csv")
q3_2018 <- read.csv("q3_2018_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q4.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2018_q4.zip'
Content type 'application/octet-stream' length 16832740 bytes (16.1 MB)
downloaded 16.1 MB
unzip(temp, "q4_2018_all.csv")
q4_2018 <- read.csv("q4_2018_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2019_q1.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2019_q1.zip'
Content type 'application/octet-stream' length 16220248 bytes (15.5 MB)
downloaded 15.5 MB
unzip(temp, "q1_2019_all.csv")
q1_2019 <- read.csv("q1_2019_all.csv", sep=",", skipNul=T, header=T)
temp <- tempfile()
download.file("https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2019_q2.zip",temp, mode="wb")
trying URL 'https://www.sec.gov/files/opa/data/market-structure/metrics-individual-security/individual_security_2019_q2.zip'
Content type 'application/octet-stream' length 16783561 bytes (16.0 MB)
downloaded 16.0 MB
unzip(temp, "q2_2019_all.csv")
q2_2019 <- read.csv("q2_2019_all.csv", sep=",", skipNul=T, header=T)
Build the Plots
Given the complex matrix of data (100 stocks and 100 ETFs for 12 variables across 5 statistics plotted on a time series), I elected to create a separate plot for each of the 12 variables, plotting the 5 summary statistics on a time series. The plots are shown below
Stock LitVol(000s) Plot
stock_LitVol <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, LitVol..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_LitVol %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

Stock OrderVol(000s) Plot
stock_OrderVol <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, OrderVol..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_OrderVol %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

Stock Hidden Plot
stock_Hidden <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, Hidden) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_Hidden %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

Stock TradesForHidden Plot
stock_TradesForHidden <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, TradesForHidden) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_TradesForHidden %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

Stock HiddenVol (000s) Plot
stock_HiddenVol <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, HiddenVol..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_HiddenVol %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

Stock TradeVolForHidden (000s) Plot
stock_TradeVolForHidden <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, TradeVolForHidden..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_TradeVolForHidden %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

Stock Cancels Plot
stock_Cancels <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, Cancels) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_Cancels %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

Stock LitTrades Plot
stock_LitTrades <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, LitTrades) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_LitTrades %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

Stock OddLots Plot
stock_OddLots <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, OddLots) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_OddLots %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

Stock TradesForOddLots Plot
stock_TradeForOddLots <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, TradesForOddLots) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_TradeForOddLots %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

Stock OddLotVol (000s) Plot
stock_OddLotVol <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, OddLotVol..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_OddLotVol %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

Stock TradeVolForOddLots (000s) Plot
stock_TradeVoldForOddLots <- SEC_comb_STOCK %>%
filter(Ticker %in% stock_list_sample) %>%
select(Date, TradeVolForOddLots..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
stock_TradeVoldForOddLots %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF LitVol(000s) Plot
ETF_LitVol <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, LitVol..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_LitVol %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF OrderVol(000s) Plot
ETF_OrderVol <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, OrderVol..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_OrderVol %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF Hidden Plot
ETF_Hidden <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, Hidden) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_Hidden %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF TradesForHidden Plot
ETF_TradesForHidden <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, TradesForHidden) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_TradesForHidden %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF HiddenVol (000s) Plot
ETF_HiddenVol <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, HiddenVol..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_HiddenVol %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF TradeVolForHidden (000s) Plot
ETF_TradeVolForHidden <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, TradeVolForHidden..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_TradeVolForHidden %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF Cancels Plot
ETF_Cancels <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, Cancels) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_Cancels %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF LitTrades Plot
ETF_LitTrades <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, LitTrades) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_LitTrades %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF OddLots Plot
ETF_OddLots <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, OddLots) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_OddLots %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF TradesForOddLots Plot
ETF_TradeForOddLots <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, TradesForOddLots) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_TradeForOddLots %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF OddLotVol (000s) Plot
ETF_OddLotVol <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, OddLotVol..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_OddLotVol %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

ETF TradeVolForOddLots (000s) Plot
ETF_TradeVoldForOddLots <- SEC_comb_ETF %>%
filter(Ticker %in% ETF_list_sample) %>%
select(Date, TradeVolForOddLots..000.) %>%
group_by(Date) %>%
na.omit() %>%
summarise_each(funs(mean = mean, p25 = quantile(.,.25), p50 = quantile(.,.5), p75 = quantile(.,.75), sd = sd)) %>%
gather(type, value, -Date)
ETF_TradeVoldForOddLots %>%
ggplot(aes(x = Date, y = value, color = type)) +
geom_line()

The individual plots for ETFs and Stocks in Q1 2012 are in line with the overall SEC combined file summary statistics. Standard deviations are much higher than the mean across the board, and ETF order volumes are also much higher than stocks. Also, interestingly, many of the Stock graphs show a significant spike in standard deviation at different periods throughout the time series, suggesting that there are one off events that dramatically influences trading activity over the period. The OddLotVol and OddLot graphs for both stocks and ETFs also tell an interesting story, which is that over time, the trade batches got smaller relative to the overall amount of trades. The random sampling we performed shows that we have selected a pool of stocks and ETFs with a broad level of trading activity, and perhaps if we converted the stocks into bins with trading thresholds, we would be able to perform more informative analysis on stocks and ETFs that fall within a certain range of trading volume.
LS0tDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgaHRtbF9kb2N1bWVudDoNCiAgICBkZl9wcmludDogcGFnZWQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KLS0tDQp0aXRsZTogIlZhbGwtTGxvYmVyYSBBc3NpZ25tZW50IDEiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQogIC0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQpQbGVhc2Ugbm90ZSB0aGF0IHdoZW4gdHJ5aW5nIHRvIEtuaXQgYSByZXBvcnQgdG8gUERGIEkgZW5jb3VudGVyZWQgYW4gZXJyb3IgZHVlIHRvIG1lbW9yeSBjb25zdHJhaW50cy4gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBmdWxsIGNvZGUsIHdoaWxlIHRoZSBQREYgUmVwb3J0IGNvbnRhaW5zIG9ubHkgdGhlIHBsb3RzIGFuZCBzdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIGlsbHVzdHJhdGl2ZSBwdXJwb3Nlcy4NCg0KIyMgTG9hZCBDb21tYW5kcw0KDQpJIGxvYWRlZCBlYWNoIGZpbGUgaW5kaXZpZHVhbGx5IGludG8gUiBmcm9tIHRoZSB3ZWIgdG8gY3JlYXRlIGEgY29tYmluZWQgZmlsZSBvZiBTRUMgZGF0YS4NCg0KYGBge3J9DQp0ZW1wIDwtIHRlbXBmaWxlKCkNCmRvd25sb2FkLmZpbGUoImh0dHBzOi8vd3d3LnNlYy5nb3YvZmlsZXMvb3BhL2RhdGEvbWFya2V0LXN0cnVjdHVyZS9tZXRyaWNzLWluZGl2aWR1YWwtc2VjdXJpdHkvaW5kaXZpZHVhbF9zZWN1cml0eV8yMDEyX3ExMC56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxMV8yMDEyX2FsbC5jc3YiKQ0KcTFfMjAxMiA8LSByZWFkLmNzdigicTFfMjAxMl9hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxMl9xMi56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxMl8yMDEyX2FsbC5jc3YiKQ0KcTJfMjAxMiA8LSByZWFkLmNzdigicTJfMjAxMl9hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxMl9xMy56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxM18yMDEyX2FsbC5jc3YiKQ0KcTNfMjAxMiA8LSByZWFkLmNzdigicTNfMjAxMl9hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxMl9xNC56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxNF8yMDEyX2FsbC5jc3YiKQ0KcTRfMjAxMiA8LSByZWFkLmNzdigicTRfMjAxMl9hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxM19xMS56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxMV8yMDEzX2FsbC5jc3YiKQ0KcTFfMjAxMyA8LSByZWFkLmNzdigicTFfMjAxM19hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxM19xMi56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxMl8yMDEzX2FsbC5jc3YiKQ0KcTJfMjAxMyA8LSByZWFkLmNzdigicTJfMjAxM19hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxM19xMy56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxM18yMDEzX2FsbC5jc3YiKQ0KcTNfMjAxMyA8LSByZWFkLmNzdigicTNfMjAxM19hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxM19xNC56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxNF8yMDEzX2FsbC5jc3YiKQ0KcTRfMjAxMyA8LSByZWFkLmNzdigicTRfMjAxM19hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0KdGVtcCA8LSB0ZW1wZmlsZSgpDQpkb3dubG9hZC5maWxlKCJodHRwczovL3d3dy5zZWMuZ292L2ZpbGVzL29wYS9kYXRhL21hcmtldC1zdHJ1Y3R1cmUvbWV0cmljcy1pbmRpdmlkdWFsLXNlY3VyaXR5L2luZGl2aWR1YWxfc2VjdXJpdHlfMjAxNF9xMS56aXAiLHRlbXAsIG1vZGU9IndiIikNCnVuemlwKHRlbXAsICJxMV8yMDE0X2FsbC5jc3YiKQ0KcTFfMjAxNCA8LSByZWFkLmNzdigicTFfMjAxNF9hbGwuY3N2Iiwgc2VwPSIsIiwgc2tpcE51bD1ULCBoZWFkZXI9VCkNCg0Kc2V0d2QoIn4vR2VvcmdpYSBUZWNoL01hbmFnaW5nIEZJcy9Bc3NpZ24xIikNCnEyXzIwMTQgPC0gcmVhZC5jc3YoIn4vR2VvcmdpYSBUZWNoL01hbmFnaW5nIEZJcy9Bc3NpZ24xL3EyXzIwMTRfYWxsLmNzdiIpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTRfcTMuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTNfMjAxNF9hbGwuY3N2IikNCnEzXzIwMTQgPC0gcmVhZC5jc3YoInEzXzIwMTRfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTRfcTQuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTRfMjAxNF9hbGwuY3N2IikNCnE0XzIwMTQgPC0gcmVhZC5jc3YoInE0XzIwMTRfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTVfcTEuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTFfMjAxNV9hbGwuY3N2IikNCnExXzIwMTUgPC0gcmVhZC5jc3YoInExXzIwMTVfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTVfcTIuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTJfMjAxNV9hbGwuY3N2IikNCnEyXzIwMTUgPC0gcmVhZC5jc3YoInEyXzIwMTVfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTVfcTMuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTNfMjAxNV9hbGwuY3N2IikNCnEzXzIwMTUgPC0gcmVhZC5jc3YoInEzXzIwMTVfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTVfcTQuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTRfMjAxNV9hbGwuY3N2IikNCnE0XzIwMTUgPC0gcmVhZC5jc3YoInE0XzIwMTVfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTZfcTEuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTFfMjAxNl9hbGwuY3N2IikNCnExXzIwMTYgPC0gcmVhZC5jc3YoInExXzIwMTZfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTZfcTIuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTJfMjAxNl9hbGwuY3N2IikNCnEyXzIwMTYgPC0gcmVhZC5jc3YoInEyXzIwMTZfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTZfcTMuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTNfMjAxNl9hbGwuY3N2IikNCnEzXzIwMTYgPC0gcmVhZC5jc3YoInEzXzIwMTZfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTZfcTQuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTRfMjAxNl9hbGwuY3N2IikNCnE0XzIwMTYgPC0gcmVhZC5jc3YoInE0XzIwMTZfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTdfcTEuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTFfMjAxN19hbGwuY3N2IikNCnExXzIwMTcgPC0gcmVhZC5jc3YoInExXzIwMTdfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTdfcTIuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTJfMjAxN19hbGwuY3N2IikNCnEyXzIwMTcgPC0gcmVhZC5jc3YoInEyXzIwMTdfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTdfcTMuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTNfMjAxN19hbGwuY3N2IikNCnEzXzIwMTcgPC0gcmVhZC5jc3YoInEzXzIwMTdfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTdfcTQuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTRfMjAxN19hbGwuY3N2IikNCnE0XzIwMTcgPC0gcmVhZC5jc3YoInE0XzIwMTdfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMThfcTEuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTFfMjAxOF9hbGwuY3N2IikNCnExXzIwMTggPC0gcmVhZC5jc3YoInExXzIwMThfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMThfcTIuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTJfMjAxOF9hbGwuY3N2IikNCnEyXzIwMTggPC0gcmVhZC5jc3YoInEyXzIwMThfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMThfcTMuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTNfMjAxOF9hbGwuY3N2IikNCnEzXzIwMTggPC0gcmVhZC5jc3YoInEzXzIwMThfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMThfcTQuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTRfMjAxOF9hbGwuY3N2IikNCnE0XzIwMTggPC0gcmVhZC5jc3YoInE0XzIwMThfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTlfcTEuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTFfMjAxOV9hbGwuY3N2IikNCnExXzIwMTkgPC0gcmVhZC5jc3YoInExXzIwMTlfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQoNCnRlbXAgPC0gdGVtcGZpbGUoKQ0KZG93bmxvYWQuZmlsZSgiaHR0cHM6Ly93d3cuc2VjLmdvdi9maWxlcy9vcGEvZGF0YS9tYXJrZXQtc3RydWN0dXJlL21ldHJpY3MtaW5kaXZpZHVhbC1zZWN1cml0eS9pbmRpdmlkdWFsX3NlY3VyaXR5XzIwMTlfcTIuemlwIix0ZW1wLCBtb2RlPSJ3YiIpDQp1bnppcCh0ZW1wLCAicTJfMjAxOV9hbGwuY3N2IikNCnEyXzIwMTkgPC0gcmVhZC5jc3YoInEyXzIwMTlfYWxsLmNzdiIsIHNlcD0iLCIsIHNraXBOdWw9VCwgaGVhZGVyPVQpDQpgYGANCg0KIyMgTG9hZCBQYWNrYWdlcw0KDQpJIGxvYWRlZCB0aGUgZHBseXIsIHRpZHlyLCBhbmQgZ2dwbG90MiBwYWNrYWdlcyB0byBleGVjdXRlIG15IFIgY29tbWFuZHMNCg0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQojIyBDb21iaW5lIGZpbGVzDQoNCkkgdXNlZCAicmJpbmQiIHRvIGNvbWJpbmUgZWFjaCBmaWxlIGludG8gYSBzaW5nbGUgZGF0YWZyYW1lLiBSZWFkaW5nIHRoaXMgZGF0YWZyYW1lIHdhcyBub3QgcG9zc2libGUgd2hlbiBrbml0dGluZyByZXBvcnQgZHVlIHRvIG1lbW9yeSBjb25zdHJhaW50czsgSSBhdHRlbXB0ZWQgYm90aCByYmluZCB1c2luZyBjb21tYXMgZm9yIGVhY2ggZGF0YSBmcmFtZSwgc2VwYXJhdGUgcmJpbmRzIHdpdGggcGlwZXMgKHNob3duIGJlbG93KSwgYW5kIGJpbmQucm93cywgYnV0IGVhY2ggcHJvdmVkIHRvIHJlcXVpcmUgdG9vIG11Y2ggbWVtb3J5IGZvciB0aGUga25pdCBwZGYgZnVuY3Rpb24gdG8gaGFuZGxlLg0KDQpgYGB7cn0NClNFQ19jb21iIDwtIA0KICBxMV8yMDEyICU+JQ0KICAgIHJiaW5kKHEyXzIwMTIpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTIpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTIpICU+JQ0KICAgIHJiaW5kKHExXzIwMTMpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTMpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTMpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTMpICU+JQ0KICAgIHJiaW5kKHExXzIwMTQpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTQpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTQpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTQpICU+JQ0KICAgIHJiaW5kKHExXzIwMTUpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTUpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTUpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTUpICU+JQ0KICAgIHJiaW5kKHExXzIwMTYpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTYpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTYpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTYpICU+JQ0KICAgIHJiaW5kKHExXzIwMTcpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTcpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTcpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTcpICU+JQ0KICAgIHJiaW5kKHExXzIwMTgpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTgpICU+JQ0KICAgIHJiaW5kKHEzXzIwMTgpICU+JQ0KICAgIHJiaW5kKHE0XzIwMTgpICU+JQ0KICAgIHJiaW5kKHExXzIwMTkpICU+JQ0KICAgIHJiaW5kKHEyXzIwMTkpDQpTRUNfY29tYiA8LSB0cmFuc2Zvcm0oU0VDX2NvbWIsIERhdGUgPSBhcy5EYXRlKGFzLmNoYXJhY3RlcihEYXRlKSwgIiVZJW0lZCIpKQ0KYGBgDQoNCiMjIFN1bW1hcnkgU3RhdGlzdGljcyBmb3IgU0VDIGRhdGENCg0KVG8gcnVuIHN1bW1hcnkgc3RhdGlzdGljcyBvbiB0aGUgY29tYmluZWQgZGF0YXNldCwgSSBjcmVhdGVkIGEgbmV3IGRhdGEgZnJhbWUgdGhhdCBncm91cGVkIHRoZSBjb2x1bW5zIGJ5IEVURiBhbmQgU1RPQ0sgYW5kIHJhbiBzdW1tYXJ5IHN0YXRpc3RpY3MgZm9yIGVhY2ggb2YgdGhlIHZhcmlhYmxlcyByZXF1ZXN0ZWQuDQoNCldoaWxlIHRoZSBTRUMgTUlEQVMgd2Vic2l0ZSBzdGF0ZXMgdGhhdCB0aGVyZSBhcmUgdmFyaWFibGVzIGZvciBUcmFkZXMgYW5kIFRyYWRlVm9sLCB0aGVzZSBkb27igJl0IGFjdHVhbGx5IGFwcGVhciB0byBleGlzdCB3aXRoaW4gdGhlIENTViBmaWxlcyBvbiB0aGUgc2l0ZS4NCg0KV2hlbiByZXZpZXdpbmcgdGhlIHN1bW1hcnkgc3RhdGlzdGljcyB3ZSBjYW4gc2VlIHRoYXQgZm9yIGJvdGggRVRG4oCZcyBhbmQgU3RvY2tzIGFjcm9zcyBhbGwgbWV0cmljcywgdGhlIHN0YW5kYXJkIGRldmlhdGlvbnMgYXJlIGZhciBncmVhdGVyIHRoYW4gdGhlIG1lYW5zIG9mIGVhY2ggdmFyaWFibGUsIHNob3dpbmcgdGhhdCB0aGVyZSBpcyBzaWduaWZpY2FudCB2YXJpYWJpbGl0eSBhbW9uZ3N0IGJvdGggaW5kaXZpZHVhbCBTdG9ja3MgYW5kIEVURnMuIEFkZGl0aW9uYWxseSwgdGhlIG1lZGlhbnMgYXJlIHF1aXRlIGxvdyBjb21wYXJlZCB0byB0aGUgYXZlcmFnZXMgb2YgbWFueSBvZiB0aGUgdmFyaWFibGVzLCBpbmRpY2F0aW5nIHRoYXQgc29tZSBzdG9ja3MvRVRGcyB3aXRoIGEgbG90IG1vcmUgdHJhZGluZyBhY3Rpdml0eSBkcml2ZSB0aGUgbnVtYmVycyB1cC4NCg0KRVRGcyBhcHBlYXIgdG8gaGF2ZSBhIG11Y2ggaGlnaGVyIG9yZGVyIHZvbHVtZSByZWxhdGl2ZSB0byBTdG9ja3MsIHdpdGggYW4gYXZlcmFnZSBvcmRlciB2b2x1bWUgb2Ygb2YgMTIySyBmb3IgRVRGcyBhbmQgb25seSAxNksgZm9yIFN0b2Nrcy4NCg0KDQpgYGB7cn0NCm9wdGlvbnMoc2NpcGVuID0gOTk5KQ0Kb3B0aW9ucyhkaWdpdHM9MykNClN1bV9zdGF0cyA8LSBTRUNfY29tYiAlPiUNCiAgc2VsZWN0KFNlY3VyaXR5LCBMaXRWb2wuLjAwMC4sICBPcmRlclZvbC4uMDAwLiwgSGlkZGVuLCBUcmFkZXNGb3JIaWRkZW4sIA0KICAgICAgICAgSGlkZGVuVm9sLi4wMDAuLCBUcmFkZVZvbEZvckhpZGRlbi4uMDAwLiwgQ2FuY2VscywgTGl0VHJhZGVzLCBPZGRMb3RzLCANCiAgICAgICAgIFRyYWRlc0Zvck9kZExvdHMsIE9kZExvdFZvbC4uMDAwLiwgVHJhZGVWb2xGb3JPZGRMb3RzLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoU2VjdXJpdHkpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gbWVkaWFuLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1TZWN1cml0eSkNClN1bV9zdGF0cw0KYGBgDQoNCiMjIFNlbGVjdCBhIHNhbXBsZSBmcm9tIFExXzIwMTINCg0KSW4gb3JkZXIgdG8gc2VsZWN0IGEgcmFuZG9tIHNhbXBsZSBvZiAxMDAgU3RvY2tzIGFuZCBFVEZzLCBJIGZpcnN0IHNwbGl0IHRoZSBRMV8yMDEyIGludG8gdHdvIGRhdGEgZnJhbWVzIGJ5IGFwcGx5aW5nIGEgZmlsdGVyOyBvbmUgZm9yIFNUT0NLcyBhbmQgb25lIGZvciBFVEZzLiBJIHRoZW4gcHVsbGVkIDEwMCByYW5kb20gc3RvY2tzIGFuZCBFVEZzIGZyb20gZWFjaCBmaWxlLCBhbmQgc2V0IHRoZW0gYXMgYW4gb2JqZWN0IHRvIGJlIHF1ZXJpZWQgZWFjaCB0aW1lIEkgY3JlYXRlIGEgZGF0YSBmcmFtZSB0byBiZSBwbG90dGVkLg0KDQpgYGB7cn0NCnExXzIwMTIgPC0gdHJhbnNmb3JtKHExXzIwMTIsIERhdGUgPSBhcy5EYXRlKGFzLmNoYXJhY3RlcihEYXRlKSwgIiVZJW0lZCIpKQ0KcTFfMjAxMl9TVE9DSyA8LSBmaWx0ZXIocTFfMjAxMixTZWN1cml0eSA9PSAiU3RvY2siKQ0KcTFfMjAxMl9FVEYgPC0gZmlsdGVyKHExXzIwMTIsU2VjdXJpdHkgPT0gIkVURiIpDQpzdG9ja19saXN0IDwtIHVuaXF1ZShxMV8yMDEyX1NUT0NLJFRpY2tlcikNCnN0b2NrX2xpc3Rfc2FtcGxlIDwtIHNhbXBsZShzdG9ja19saXN0LCAxMDApDQpFVEZfbGlzdCA8LSB1bmlxdWUocTFfMjAxMl9FVEYkVGlja2VyKQ0KRVRGX2xpc3Rfc2FtcGxlIDwtIHNhbXBsZShFVEZfbGlzdCwxMDApDQpzdG9ja19saXN0X3NhbXBsZQ0KRVRGX2xpc3Rfc2FtcGxlDQpTRUNfY29tYl9TVE9DSyA8LSBmaWx0ZXIoU0VDX2NvbWIsU2VjdXJpdHkgPT0gIlN0b2NrIikNClNFQ19jb21iX0VURiA8LSBmaWx0ZXIoU0VDX2NvbWIsU2VjdXJpdHkgPT0gIkVURiIpDQpgYGANCg0KIyMgQnVpbGQgdGhlIFBsb3RzDQoNCkdpdmVuIHRoZSBjb21wbGV4IG1hdHJpeCBvZiBkYXRhICgxMDAgc3RvY2tzIGFuZCAxMDAgRVRGcyBmb3IgMTIgdmFyaWFibGVzIGFjcm9zcyA1IHN0YXRpc3RpY3MgcGxvdHRlZCBvbiBhIHRpbWUgc2VyaWVzKSwgSSBlbGVjdGVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIHBsb3QgZm9yIGVhY2ggb2YgdGhlIDEyIHZhcmlhYmxlcywgcGxvdHRpbmcgdGhlIDUgc3VtbWFyeSBzdGF0aXN0aWNzIG9uIGEgdGltZSBzZXJpZXMuIFRoZSBwbG90cyBhcmUgc2hvd24gYmVsb3cNCg0KIyMjIFN0b2NrIExpdFZvbCgwMDBzKSBQbG90DQoNCmBgYHtyfQ0Kc3RvY2tfTGl0Vm9sIDwtIFNFQ19jb21iX1NUT0NLICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgc3RvY2tfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgTGl0Vm9sLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19MaXRWb2wgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBTdG9jayBPcmRlclZvbCgwMDBzKSBQbG90DQoNCmBgYHtyfQ0Kc3RvY2tfT3JkZXJWb2wgPC0gU0VDX2NvbWJfU1RPQ0sgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBzdG9ja19saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBPcmRlclZvbC4uMDAwLikgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0Kc3RvY2tfT3JkZXJWb2wgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBTdG9jayBIaWRkZW4gUGxvdA0KDQpgYGB7cn0NCnN0b2NrX0hpZGRlbiA8LSBTRUNfY29tYl9TVE9DSyAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIHN0b2NrX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIEhpZGRlbikgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0Kc3RvY2tfSGlkZGVuICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgU3RvY2sgVHJhZGVzRm9ySGlkZGVuIFBsb3QNCg0KYGBge3J9DQpzdG9ja19UcmFkZXNGb3JIaWRkZW4gPC0gU0VDX2NvbWJfU1RPQ0sgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBzdG9ja19saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBUcmFkZXNGb3JIaWRkZW4pICU+JQ0KICBncm91cF9ieShEYXRlKSAlPiUNCiAgbmEub21pdCgpICU+JQ0KICBzdW1tYXJpc2VfZWFjaChmdW5zKG1lYW4gPSBtZWFuLCBwMjUgPSBxdWFudGlsZSguLC4yNSksIHA1MCA9IHF1YW50aWxlKC4sLjUpLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSAlPiUNCiAgZ2F0aGVyKHR5cGUsIHZhbHVlLCAtRGF0ZSkNCnN0b2NrX1RyYWRlc0ZvckhpZGRlbiAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIFN0b2NrIEhpZGRlblZvbCAoMDAwcykgUGxvdA0KDQpgYGB7cn0NCnN0b2NrX0hpZGRlblZvbCA8LSBTRUNfY29tYl9TVE9DSyAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIHN0b2NrX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIEhpZGRlblZvbC4uMDAwLikgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0Kc3RvY2tfSGlkZGVuVm9sICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgU3RvY2sgVHJhZGVWb2xGb3JIaWRkZW4gKDAwMHMpIFBsb3QNCg0KYGBge3J9DQpzdG9ja19UcmFkZVZvbEZvckhpZGRlbiA8LSBTRUNfY29tYl9TVE9DSyAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIHN0b2NrX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIFRyYWRlVm9sRm9ySGlkZGVuLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19UcmFkZVZvbEZvckhpZGRlbiAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIFN0b2NrIENhbmNlbHMgUGxvdA0KDQpgYGB7cn0NCnN0b2NrX0NhbmNlbHMgPC0gU0VDX2NvbWJfU1RPQ0sgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBzdG9ja19saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBDYW5jZWxzKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19DYW5jZWxzICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgU3RvY2sgTGl0VHJhZGVzIFBsb3QNCg0KYGBge3J9DQpzdG9ja19MaXRUcmFkZXMgPC0gU0VDX2NvbWJfU1RPQ0sgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBzdG9ja19saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBMaXRUcmFkZXMpICU+JQ0KICBncm91cF9ieShEYXRlKSAlPiUNCiAgbmEub21pdCgpICU+JQ0KICBzdW1tYXJpc2VfZWFjaChmdW5zKG1lYW4gPSBtZWFuLCBwMjUgPSBxdWFudGlsZSguLC4yNSksIHA1MCA9IHF1YW50aWxlKC4sLjUpLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSAlPiUNCiAgZ2F0aGVyKHR5cGUsIHZhbHVlLCAtRGF0ZSkNCnN0b2NrX0xpdFRyYWRlcyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIFN0b2NrIE9kZExvdHMgUGxvdA0KDQpgYGB7cn0NCnN0b2NrX09kZExvdHMgPC0gU0VDX2NvbWJfU1RPQ0sgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBzdG9ja19saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBPZGRMb3RzKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19PZGRMb3RzICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgU3RvY2sgVHJhZGVzRm9yT2RkTG90cyBQbG90DQoNCmBgYHtyfQ0Kc3RvY2tfVHJhZGVGb3JPZGRMb3RzIDwtIFNFQ19jb21iX1NUT0NLICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgc3RvY2tfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgVHJhZGVzRm9yT2RkTG90cykgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0Kc3RvY2tfVHJhZGVGb3JPZGRMb3RzICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgU3RvY2sgT2RkTG90Vm9sICgwMDBzKSBQbG90DQoNCmBgYHtyfQ0Kc3RvY2tfT2RkTG90Vm9sIDwtIFNFQ19jb21iX1NUT0NLICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgc3RvY2tfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgT2RkTG90Vm9sLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19PZGRMb3RWb2wgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBTdG9jayBUcmFkZVZvbEZvck9kZExvdHMgKDAwMHMpIFBsb3QNCg0KYGBge3J9DQpzdG9ja19UcmFkZVZvbGRGb3JPZGRMb3RzIDwtIFNFQ19jb21iX1NUT0NLICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgc3RvY2tfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgVHJhZGVWb2xGb3JPZGRMb3RzLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpzdG9ja19UcmFkZVZvbGRGb3JPZGRMb3RzICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgRVRGIExpdFZvbCgwMDBzKSBQbG90DQoNCmBgYHtyfQ0KRVRGX0xpdFZvbCA8LSBTRUNfY29tYl9FVEYgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBFVEZfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgTGl0Vm9sLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpFVEZfTGl0Vm9sICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgRVRGIE9yZGVyVm9sKDAwMHMpIFBsb3QNCg0KYGBge3J9DQpFVEZfT3JkZXJWb2wgPC0gU0VDX2NvbWJfRVRGICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgRVRGX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIE9yZGVyVm9sLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpFVEZfT3JkZXJWb2wgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBFVEYgSGlkZGVuIFBsb3QNCg0KYGBge3J9DQpFVEZfSGlkZGVuIDwtIFNFQ19jb21iX0VURiAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIEVURl9saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBIaWRkZW4pICU+JQ0KICBncm91cF9ieShEYXRlKSAlPiUNCiAgbmEub21pdCgpICU+JQ0KICBzdW1tYXJpc2VfZWFjaChmdW5zKG1lYW4gPSBtZWFuLCBwMjUgPSBxdWFudGlsZSguLC4yNSksIHA1MCA9IHF1YW50aWxlKC4sLjUpLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSAlPiUNCiAgZ2F0aGVyKHR5cGUsIHZhbHVlLCAtRGF0ZSkNCkVURl9IaWRkZW4gJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBFVEYgVHJhZGVzRm9ySGlkZGVuIFBsb3QNCg0KYGBge3J9DQpFVEZfVHJhZGVzRm9ySGlkZGVuIDwtIFNFQ19jb21iX0VURiAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIEVURl9saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBUcmFkZXNGb3JIaWRkZW4pICU+JQ0KICBncm91cF9ieShEYXRlKSAlPiUNCiAgbmEub21pdCgpICU+JQ0KICBzdW1tYXJpc2VfZWFjaChmdW5zKG1lYW4gPSBtZWFuLCBwMjUgPSBxdWFudGlsZSguLC4yNSksIHA1MCA9IHF1YW50aWxlKC4sLjUpLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSAlPiUNCiAgZ2F0aGVyKHR5cGUsIHZhbHVlLCAtRGF0ZSkNCkVURl9UcmFkZXNGb3JIaWRkZW4gJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBFVEYgSGlkZGVuVm9sICgwMDBzKSBQbG90DQoNCmBgYHtyfQ0KRVRGX0hpZGRlblZvbCA8LSBTRUNfY29tYl9FVEYgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBFVEZfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgSGlkZGVuVm9sLi4wMDAuKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpFVEZfSGlkZGVuVm9sICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgRVRGIFRyYWRlVm9sRm9ySGlkZGVuICgwMDBzKSBQbG90DQoNCmBgYHtyfQ0KRVRGX1RyYWRlVm9sRm9ySGlkZGVuIDwtIFNFQ19jb21iX0VURiAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIEVURl9saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBUcmFkZVZvbEZvckhpZGRlbi4uMDAwLikgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0KRVRGX1RyYWRlVm9sRm9ySGlkZGVuICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBEYXRlLCB5ID0gdmFsdWUsIGNvbG9yID0gdHlwZSkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyMgRVRGIENhbmNlbHMgUGxvdA0KDQpgYGB7cn0NCkVURl9DYW5jZWxzIDwtIFNFQ19jb21iX0VURiAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIEVURl9saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBDYW5jZWxzKSAlPiUNCiAgZ3JvdXBfYnkoRGF0ZSkgJT4lDQogIG5hLm9taXQoKSAlPiUNCiAgc3VtbWFyaXNlX2VhY2goZnVucyhtZWFuID0gbWVhbiwgcDI1ID0gcXVhbnRpbGUoLiwuMjUpLCBwNTAgPSBxdWFudGlsZSguLC41KSwgcDc1ID0gcXVhbnRpbGUoLiwuNzUpLCBzZCA9IHNkKSkgJT4lDQogIGdhdGhlcih0eXBlLCB2YWx1ZSwgLURhdGUpDQpFVEZfQ2FuY2VscyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIEVURiBMaXRUcmFkZXMgUGxvdA0KDQpgYGB7cn0NCkVURl9MaXRUcmFkZXMgPC0gU0VDX2NvbWJfRVRGICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgRVRGX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIExpdFRyYWRlcykgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0KRVRGX0xpdFRyYWRlcyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIEVURiBPZGRMb3RzIFBsb3QNCg0KYGBge3J9DQpFVEZfT2RkTG90cyA8LSBTRUNfY29tYl9FVEYgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBFVEZfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgT2RkTG90cykgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0KRVRGX09kZExvdHMgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBFVEYgVHJhZGVzRm9yT2RkTG90cyBQbG90DQoNCmBgYHtyfQ0KRVRGX1RyYWRlRm9yT2RkTG90cyA8LSBTRUNfY29tYl9FVEYgJT4lDQogIGZpbHRlcihUaWNrZXIgJWluJSBFVEZfbGlzdF9zYW1wbGUpICU+JQ0KICBzZWxlY3QoRGF0ZSwgVHJhZGVzRm9yT2RkTG90cykgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0KRVRGX1RyYWRlRm9yT2RkTG90cyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gRGF0ZSwgeSA9IHZhbHVlLCBjb2xvciA9IHR5cGUpKSArDQogIGdlb21fbGluZSgpDQpgYGANCg0KIyMjIEVURiBPZGRMb3RWb2wgKDAwMHMpIFBsb3QNCg0KYGBge3J9DQpFVEZfT2RkTG90Vm9sIDwtIFNFQ19jb21iX0VURiAlPiUNCiAgZmlsdGVyKFRpY2tlciAlaW4lIEVURl9saXN0X3NhbXBsZSkgJT4lDQogIHNlbGVjdChEYXRlLCBPZGRMb3RWb2wuLjAwMC4pICU+JQ0KICBncm91cF9ieShEYXRlKSAlPiUNCiAgbmEub21pdCgpICU+JQ0KICBzdW1tYXJpc2VfZWFjaChmdW5zKG1lYW4gPSBtZWFuLCBwMjUgPSBxdWFudGlsZSguLC4yNSksIHA1MCA9IHF1YW50aWxlKC4sLjUpLCBwNzUgPSBxdWFudGlsZSguLC43NSksIHNkID0gc2QpKSAlPiUNCiAgZ2F0aGVyKHR5cGUsIHZhbHVlLCAtRGF0ZSkNCkVURl9PZGRMb3RWb2wgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCiMjIyBFVEYgVHJhZGVWb2xGb3JPZGRMb3RzICgwMDBzKSBQbG90DQoNCmBgYHtyfQ0KRVRGX1RyYWRlVm9sZEZvck9kZExvdHMgPC0gU0VDX2NvbWJfRVRGICU+JQ0KICBmaWx0ZXIoVGlja2VyICVpbiUgRVRGX2xpc3Rfc2FtcGxlKSAlPiUNCiAgc2VsZWN0KERhdGUsIFRyYWRlVm9sRm9yT2RkTG90cy4uMDAwLikgJT4lDQogIGdyb3VwX2J5KERhdGUpICU+JQ0KICBuYS5vbWl0KCkgJT4lDQogIHN1bW1hcmlzZV9lYWNoKGZ1bnMobWVhbiA9IG1lYW4sIHAyNSA9IHF1YW50aWxlKC4sLjI1KSwgcDUwID0gcXVhbnRpbGUoLiwuNSksIHA3NSA9IHF1YW50aWxlKC4sLjc1KSwgc2QgPSBzZCkpICU+JQ0KICBnYXRoZXIodHlwZSwgdmFsdWUsIC1EYXRlKQ0KRVRGX1RyYWRlVm9sZEZvck9kZExvdHMgJT4lDQogIGdncGxvdChhZXMoeCA9IERhdGUsIHkgPSB2YWx1ZSwgY29sb3IgPSB0eXBlKSkgKw0KICBnZW9tX2xpbmUoKQ0KYGBgDQoNCg0KVGhlIGluZGl2aWR1YWwgcGxvdHMgZm9yIEVURnMgYW5kIFN0b2NrcyBpbiBRMSAyMDEyIGFyZSBpbiBsaW5lIHdpdGggdGhlIG92ZXJhbGwgU0VDIGNvbWJpbmVkIGZpbGUgc3VtbWFyeSBzdGF0aXN0aWNzLiAgU3RhbmRhcmQgZGV2aWF0aW9ucyBhcmUgbXVjaCBoaWdoZXIgdGhhbiB0aGUgbWVhbiBhY3Jvc3MgdGhlIGJvYXJkLCBhbmQgRVRGIG9yZGVyIHZvbHVtZXMgYXJlIGFsc28gbXVjaCBoaWdoZXIgdGhhbiBzdG9ja3MuIEFsc28sIGludGVyZXN0aW5nbHksIG1hbnkgb2YgdGhlIFN0b2NrIGdyYXBocyBzaG93IGEgc2lnbmlmaWNhbnQgc3Bpa2UgaW4gc3RhbmRhcmQgZGV2aWF0aW9uIGF0IGRpZmZlcmVudCBwZXJpb2RzIHRocm91Z2hvdXQgdGhlIHRpbWUgc2VyaWVzLCBzdWdnZXN0aW5nIHRoYXQgdGhlcmUgYXJlIG9uZSBvZmYgZXZlbnRzIHRoYXQgZHJhbWF0aWNhbGx5IGluZmx1ZW5jZXMgdHJhZGluZyBhY3Rpdml0eSBvdmVyIHRoZSBwZXJpb2QuIFRoZSBPZGRMb3RWb2wgYW5kIE9kZExvdCBncmFwaHMgZm9yIGJvdGggc3RvY2tzIGFuZCBFVEZzIGFsc28gdGVsbCBhbiBpbnRlcmVzdGluZyBzdG9yeSwgd2hpY2ggaXMgdGhhdCBvdmVyIHRpbWUsIHRoZSB0cmFkZSBiYXRjaGVzIGdvdCBzbWFsbGVyIHJlbGF0aXZlIHRvIHRoZSBvdmVyYWxsIGFtb3VudCBvZiB0cmFkZXMuIFRoZSByYW5kb20gc2FtcGxpbmcgd2UgcGVyZm9ybWVkIHNob3dzIHRoYXQgd2UgaGF2ZSBzZWxlY3RlZCBhIHBvb2wgb2Ygc3RvY2tzIGFuZCBFVEZzIHdpdGggYSBicm9hZCBsZXZlbCBvZiB0cmFkaW5nIGFjdGl2aXR5LCBhbmQgcGVyaGFwcyBpZiB3ZSBjb252ZXJ0ZWQgdGhlIHN0b2NrcyBpbnRvIGJpbnMgd2l0aCB0cmFkaW5nIHRocmVzaG9sZHMsIHdlIHdvdWxkIGJlIGFibGUgdG8gcGVyZm9ybSBtb3JlIGluZm9ybWF0aXZlIGFuYWx5c2lzIG9uIHN0b2NrcyBhbmQgRVRGcyB0aGF0IGZhbGwgd2l0aGluIGEgY2VydGFpbiByYW5nZSBvZiB0cmFkaW5nIHZvbHVtZS4=