Summary
In this Notebook we will learn how to:
- find the closest CIMIS weather station
- import weather station data for a single season and a single
location from CIMIS
- filter weather data based on dates
- plot weather data
- compute rolling averages
- compute threshold based metrics, including hot days and frost
days
- compte the last spring freeze date
- find and quantify spells of threshold based metrics, such as heat
waves
- reshape data to put separate variables in separate columns
- compute the diurnal temperature range
- compute irrigation requirements based on reference
evapotranspiration
Load Packages
First load the packages we’ll need below:
library(dplyr)
library(tidyr)
library(ggplot2)
library(sf)
library(cimir)
library(zoo)
library(leaflet)
Import Weather Data from CIMIS
Agroclimate metrics require weather data, such as the minimum and
maximum temperature, precipitation, relative humidity, reference ETo,
and so on. For this exercise, we’ll import weather records from a
station in the CIMIS
network.
Hourly or Daily Weather Data?
In theory, hourly data should be a better predictor of plant or
insect growth, because it captures nuances and processes on a smaller
time scale. Hourly data is also not that hard to get these days, at
least for the current time period.
However in practice most of the crop and pest models in use are based
on daily data, so if you want to use those models you
to provide daily data. The rest of this Notebook therefore will use
daily weather data.
CIMIS
CIMIS is a network of ~150
automated weather stations run by CADWR for the purposes of informing
irrigators. It is a popular source of weather data because of the
coverage area, the stations record hourly and daily values of main
weather variables. The data are also freely available through various
websites and an API.
The cimir
package provides functions to import data from the CIMIS network
directly into R. Many of these functions require creating a CIMIS account
so you can get a CIMIS API key
(free).
Map the CIMIS Stations
The easiest way to get CIMIS data is if you know which station. Let’s
make a map of the CIMIS Stations. Step 1 is to get the list of active
stations:
## If you have a CIMIS key, you can uncomment and run the following:
## cimir::set_key("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")
## stations_all_tbl <- cimir::cimis_station()
stations_all_tbl <- read.csv("./data/cimis_stations_all.csv")
head(stations_all_tbl)
Next we’ll do a little data cleaning, keeping only the columns we’ll
need for to map the active stations:
stations_cleaned_tbl <- stations_all_tbl |>
filter(IsActive == "True") |>
select(StationNbr, Name, HmsLatitude, HmsLongitude) |>
distinct() |>
transmute(station_id = as.numeric(StationNbr),
name = Name,
lon = as.numeric(gsub("^.*/ ", "", HmsLongitude)),
lat = as.numeric(gsub("^.*/ ", "", HmsLatitude)))
head(stations_cleaned_tbl)
Turn this into a spatial object and map it with leaflet:
stations_cleaned_sf <- stations_cleaned_tbl |>
mutate(title = paste0(name, " (#", station_id, ")")) |>
st_as_sf(coords = c("lon", "lat"), crs = 4326) |>
select(title)
leaflet(stations_cleaned_sf) |>
addTiles() |>
addCircleMarkers(radius = 5, popup = ~title)
Query a CIMIS Station
To see what weather variables are available, run
cimis_items()
:
cimis_items()
You can retrieve data using cimis_data()
. Let’s get
daily temperature, precipitation, and reference ETo for the Verona
station (#235), north of Sacramento.
# If you've entered a CIMIS key, uncomment the following line.
# Otherwise, run the next command to load the saved data
# cimis_verona22_tbl <- cimis_data(targets = 235, start.date = "2021-10-01", end.date = "2022-09-30",
# items = "day-air-tmp-max,day-air-tmp-min,day-eto,day-precip")
cimis_verona22_tbl <- readRDS("./data/cimis_verona22.Rds")
head(cimis_verona22_tbl)
Notes about the data frame returned by
cimis_data()
- our data frame contains 4 weather variables in a long (as
opposed to wide) format
- the
Date
column is already formatted as a date
object
Julian
is the day of the year (0..365)
Qc
is a quality control flag (details)
Time Filtering
To filter rows based on the date, you need a column as a Date or time
(POSIXct) object. The lubridate
package has functions to
convert character and number columns into dates.
Once you have a date column, filtering is pretty easy. For example to
pull the records for the 2022 growing season from
April 15 thru Sept 30, 2022:
grwsn_vals_tbl <- cimis_verona22_tbl |>
select(Date, Item, Value, Qc) |>
filter(Date >= as.Date("2022-04-15"), Date <= as.Date("2022-09-30"))
grwsn_vals_tbl |> slice(1:20)
Plot the daily high temps
We can plot daily high temperature at this location with a little
help from dplyr and ggplot:
grwsn_dailymax_tbl <- grwsn_vals_tbl |>
filter(Item == "DayAirTmpMax") |>
rename(max_temp = Value)
ggplot(grwsn_dailymax_tbl, mapping = aes(x = Date, y = max_temp)) +
geom_line() +
labs(title = "Daily High Temps",
subtitle = "Verona CIMIS Station, Spring 2022")
![](data:image/png;base64,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)
Rolling Averages
Rolling / moving averages are generically useful for smoothing out
the bumps in a time series. For crop management you may not want to
smooth out the bumps, but other applications are easier to address by
looking at trends on a weekly or longer time period.
Moving averages can also be useful to identify multi-day extreme
events. For example, 5 consecutive days over 95 °F is killer for
tomatoes. Computing the 5-day rolling average would be one way to
identify when tomatoes might be in trouble (see also a threshold
technique, coming up next).
You can compute a rolling average with zoo::rollmean()
.
k
is the rolling window size (should be an odd number). You
should also pass fill = NA
, which tells it to assign NA as
the rolling average for the first and last days.
grwsn_dailymax_movavg_tbl <- grwsn_dailymax_tbl |>
mutate(dailymax_avg5d = zoo::rollmean(max_temp, k=5, fill=NA))
ggplot(grwsn_dailymax_movavg_tbl, mapping = aes(x = Date, y = dailymax_avg5d)) +
geom_line() +
labs(title = "Daily High Temps (5-day moving average)",
subtitle = "Verona CIMIS Station, Spring 2022")
![](data:image/png;base64,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)
Challenge Question #1
Compute the daily high temperature rolling average for an 11 day
window, then plot it. Answer
## Your answer here
grwsn_dailymax_tbl |>
mutate(dailymax_avg5d = zoo::rollmean(max_temp, k=11, fill=NA)) |>
ggplot(mapping = aes(x = Date, y = dailymax_avg5d)) +
geom_line() +
labs(title = "Daily High Temps (11-day moving average)",
subtitle = "Verona CIMIS Station, Spring 2022")
![](data:image/png;base64,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)
Threshold Methods
Many agroclimate metrics are defined by a threshold value. The
threshold may be in reference to the range of variability at that
location in the historic period, or it may be in reference to when some
kind of physical or biological change happens.
‘extreme heat’ and ‘extreme precipitation’ generally use a
threshhold based on historic values for that location
‘hot days’ are defined by a threshold temperature that affects
crops (Parker et
al. 2022).
Hot Days
How many ‘hot days’ were there in 2022, where ‘hot’ is defined as
over 38 °C (100.4 °F)?
Testing whether a day was ‘hot’ can be done with a simple comparison
expression:
grwsn_hotyn_tbl <- grwsn_dailymax_tbl |>
mutate(hotyn = max_temp > 100.4)
head(grwsn_hotyn_tbl)
The number of hot days can be computed simply by summing the column
of TRUE/FALSE values:
grwsn_hotyn_tbl$hotyn |> sum()
[1] 28
grwsn_hotyn_tbl$hotyn |> table()
FALSE TRUE
141 28
To see when the hot days occurred, we can overlay the
threshold value on the time series plot:
ggplot(grwsn_dailymax_tbl, mapping = aes(x = Date, y = max_temp)) +
geom_line() +
geom_hline(yintercept = 100.4, color = "red", linewidth = 1) +
labs(title = "Daily High Temps",
subtitle = "Verona CIMIS Station, Spring 2022")
![](data:image/png;base64,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)
Challenge Question #2
Write an expression that returns the exact dates of hot days. Answer
## Your answer here
grwsn_dailymax_tbl |>
filter(Item == "DayAirTmpMax", max_temp > 100.4) |>
select(Date, max_temp)
Last Spring Freeze
Planting and other crop management practices have to be timed to take
place after the last freeze of the winter. The date of the last freeze
can be calculated by:
Identifying all freeze events from say February thru June, using
a simple threshold test (minimum daily temp ≤ 32 °F)
Find the date associated with the last freeze
Step 1: add a ‘Frost Day’ column:
daily_min_tbl <- cimis_verona22_tbl |>
filter(Item == "DayAirTmpMin", Date >= as.Date("2022-02-01"), Date <= as.Date("2022-06-30")) |>
mutate(frost_day = Value <= 32) |>
select(Date, Item, Value, frost_day)
head(daily_min_tbl)
Step 2. How many frost days were there from February thru June?
daily_min_tbl$frost_day |> table()
FALSE TRUE
134 16
Step 3. What was the last freeze date?
daily_min_tbl |>
filter(frost_day == TRUE) |>
arrange(desc(Date))
daily_min_tbl |>
filter(frost_day == TRUE) |>
slice_max(Date, n = 1) |>
pull(Date)
[1] "2022-04-12"
Spells and Runs
Some climate metrics are defined by a series of days when a threshold
is surpassed. Examples include heatwaves. We may want to know the number
of heatwaves, or the length of the heatwaves.
rle()
can be used to answer these questions. Let’s see
how rle()
works:
x <- c("a", "a", "a", "h", "t", "t", "t", "t", "a", "a", "a", "a", "c", "c", "d", "d", "d")
xrle_lst <- rle(x)
xrle_lst
Run Length Encoding
lengths: int [1:6] 3 1 4 4 2 3
values : chr [1:6] "a" "h" "t" "a" "c" "d"
As you can see, rle()
returns a list with two elements
containing properties of groups of repeated letters. The
values
element contains the letter in each group, and the
lengths
element contains the number of letters (which could
be 1).
Say we’re interested in groups of 3 or more repeated letters. We can
find the number of groups of 3 or more letters by summing up the results
of a logical expression:
(xrle_lst$lengths >= 3) |> sum()
[1] 4
And we can find the average length of these groups with:
xrle_lst$lengths[ xrle_lst$lengths >= 3 ] |> mean()
[1] 3.5
But what if we only wanted the number of ‘runs’ of the letter ‘a’? We
can simply use a compound logical expression:
## Number of groups of 'a' of length 3 or more
((xrle_lst$values == "a") & (xrle_lst$lengths >= 3)) |> sum()
[1] 2
So how many heatwaves where the high temperature was > 100.4 °F
for 3 or more days?
First we create the rle()
list:
hotyn_rle_lst <- rle(grwsn_hotyn_tbl$hotyn)
hotyn_rle_lst
Run Length Encoding
lengths: int [1:27] 40 1 15 1 10 1 4 3 12 1 ...
values : logi [1:27] FALSE TRUE FALSE TRUE FALSE TRUE ...
Next we find the number of groups of TRUE:
((hotyn_rle_lst$values == TRUE) & (hotyn_rle_lst$lengths >= 3)) |> sum()
[1] 4
Multi-Variable Metrics with Separate Columns
Some metrics combine multiple weather station variables, such as the
daily minimum and daily maximum temperature. Both of these variables are
included in our CIMIS data, but they’re mixed in with other variables in
a long format. Remember what we got back from CIMIS:
cimis_verona22_tbl |>
select(Date, Item, Value, Qc, Unit) |>
slice(1:10)
For many multi-variable metrics, it is often easiest to pull out the
variables we need as separate columns. This can be easily done
tidyr::pivot_wider()
. The key arguments we need to give it
are names_from
and values_from
(details):
daily_temps_tbl <- cimis_verona22_tbl |>
filter(Item %in% c("DayAirTmpMin", "DayAirTmpMax")) |>
select(Date, Item, Value) |>
pivot_wider(names_from = Item, values_from = Value)
daily_temps_tbl |> head()
Average Daily Temperature
With the daily minimum and maximum temperature as separate columns,
computing the average temperature is a simple expression:
daily_mean_tbl <- daily_temps_tbl |>
mutate(daily_mean = (DayAirTmpMax + DayAirTmpMin) / 2)
head(daily_mean_tbl)
Diurnal Temperature Range
The Diurnal Temperature Range (DTR) is a useful metric for evaluating
crop suitability, and is simply the maximum daily temperature minus the
minimum:
daily_dtr_tbl <- daily_temps_tbl |>
mutate(DTR = DayAirTmpMax - DayAirTmpMin)
head(daily_dtr_tbl)
Large swings in temperature may represent days when a front passed
through.
ggplot(daily_dtr_tbl, mapping = aes(x = Date, y = DTR)) +
geom_line() +
labs(title = "Diurnal Temperature Range",
subtitle = "Verona CIMIS Station",
y = "DTR (degrees F)")
![](data:image/png;base64,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)
The histogram of DTR can be used to compare the magnitude of daily
temperature variation across sites or over time:
ggplot(daily_dtr_tbl, mapping = aes(x = DTR)) +
geom_histogram() +
labs(title = "Diurnal Temperature Range",
subtitle = "Verona CIMIS Station. Oct '21 - Sep '22'")
![](data:image/png;base64,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)
Evapotranspiration
The goal of precision irrigation is to give the crop just the amount
of water it needs, and nothing more. A standard method for determining
how much water is needed is to figure out how much water was lost since
the last time it was irrigated, and put back exactly that much.
Crops lose water due to evapotranspiration (ET), which combines
evaporation (i.e., from the soil) and respiration (from the plants). The
challenge however is that different crops respire at different rates,
which further vary based on the stage of the crop (i.e., baby plants
don’t respire nearly as much as mature plants). So there is not
one-size-fits-all value of ET that you can get from weather
variables.
To get around this, CIMIS stations have a sensor that measure
‘reference ET’ (ET0) from a standard ‘crop’ (grass), which
can be converted to crop ET (ETc) by multiplying the
reference ET by a ‘crop coefficient’ (Kc) (more
info). Crop coefficients have been developed through research for
many crops (more
info).
How much water do my tomatoes need?
Let’s compute the amount of daily evapotranspiration for tomatoes for
the month of June. During the middle of the growing season, tomatoes
have a Kc = 1.15.
To compute irrigation requirements, we need to:
Pull out ET0 and precipitation for the month of
June
Put them in separate columns:
june_eto_pr_tbl <- cimis_verona22_tbl |>
filter(Item %in% c("DayEto", "DayPrecip"), Date >= as.Date("2022-06-01"), Date <= as.Date("2022-06-30") ) |>
pivot_wider(id_cols = Date, names_from = Item, values_from = Value)
head(june_eto_pr_tbl)
To compute the daily ETc for tomatoes, we simply multiply
the reference ET0 by the crop coefficient for tomatoes:
Kc <- 1.15
june_etc_tbl <- june_eto_pr_tbl |>
mutate(ETc_tomato = DayEto * Kc)
june_etc_tbl |> head()
The total water loss each day is the amount of ETc minus
any precipitation (which CIMIS also reports in inches):
june_netwaterloss_tbl <- june_etc_tbl |>
mutate(net_water_loss_in = ETc_tomato - DayPrecip )
june_netwaterloss_tbl |> head()
To calculate the total amount of water the tomatoes need, we simply
add up the daily net water lost since the last irrigation event.
Suppose the last irrigation was June 10, 2022, and today is June 15.
How much water do we need to add?
june_netwaterloss_tbl |>
filter(Date > as.Date("2022-06-10"), Date <= as.Date("2022-06-15")) |>
mutate(cummulative_water_lost = cumsum(net_water_loss_in))
Challenge Question #3
From October 1 2021, thru March 31, 2022, how many days did the
temperature dip below 53 °F (a temperature which reduces the load of
certain overwintering insects)? Answer
## Your answer here
daily_coldday_tbl <- cimis_verona22_tbl |>
filter(Item == "DayAirTmpMin", Date >= as.Date("2021-10-01"), Date <= as.Date("2022-03-31")) |>
mutate(cold_day = Value <= 53) |>
select(Date, Item, Value, cold_day)
head(daily_coldday_tbl)
daily_coldday_tbl |> pull(cold_day) |> table()
FALSE TRUE
7 175
End
Remember to save the Notebook to generate a HTML version that
includes all executed code that you can save for keeps!
LS0tDQp0aXRsZTogIkFncm9jbGltYXRlIE1ldHJpY3MgTm90ZWJvb2sgIzEiDQpvdXRwdXQ6IA0KICBodG1sX25vdGVib29rOg0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBjc3M6IGh0dHBzOi8vdWNhbnItaWdpcy5naXRodWIuaW8vYWdyb2NsaW1SL2Fzc2V0cy9uYl9jc3MwMS5jc3MNCiAgICBpbmNsdWRlczogDQogICAgICBhZnRlcl9ib2R5OiBodHRwczovL3VjYW5yLWlnaXMuZ2l0aHViLmlvL2Fncm9jbGltUi9hc3NldHMvbmJfZm9vdGVyX2Fncm9jbGltci5odG1sDQotLS0NCg0KIyBTdW1tYXJ5DQoNCkluIHRoaXMgTm90ZWJvb2sgd2Ugd2lsbCBsZWFybiBob3cgdG86DQoNCi0gICBmaW5kIHRoZSBjbG9zZXN0IENJTUlTIHdlYXRoZXIgc3RhdGlvblwNCi0gICBpbXBvcnQgd2VhdGhlciBzdGF0aW9uIGRhdGEgZm9yIGEgc2luZ2xlIHNlYXNvbiBhbmQgYSBzaW5nbGUgbG9jYXRpb24gZnJvbSBDSU1JU1wNCi0gICBmaWx0ZXIgd2VhdGhlciBkYXRhIGJhc2VkIG9uIGRhdGVzXA0KLSAgIHBsb3Qgd2VhdGhlciBkYXRhXA0KLSAgIGNvbXB1dGUgcm9sbGluZyBhdmVyYWdlc1wNCi0gICBjb21wdXRlIHRocmVzaG9sZCBiYXNlZCBtZXRyaWNzLCBpbmNsdWRpbmcgaG90IGRheXMgYW5kIGZyb3N0IGRheXNcDQotICAgY29tcHRlIHRoZSBsYXN0IHNwcmluZyBmcmVlemUgZGF0ZVwNCi0gICBmaW5kIGFuZCBxdWFudGlmeSBzcGVsbHMgb2YgdGhyZXNob2xkIGJhc2VkIG1ldHJpY3MsIHN1Y2ggYXMgaGVhdCB3YXZlc1wNCi0gICByZXNoYXBlIGRhdGEgdG8gcHV0IHNlcGFyYXRlIHZhcmlhYmxlcyBpbiBzZXBhcmF0ZSBjb2x1bW5zXA0KLSAgIGNvbXB1dGUgdGhlIGRpdXJuYWwgdGVtcGVyYXR1cmUgcmFuZ2VcDQotICAgY29tcHV0ZSBpcnJpZ2F0aW9uIHJlcXVpcmVtZW50cyBiYXNlZCBvbiByZWZlcmVuY2UgZXZhcG90cmFuc3BpcmF0aW9uDQoNClwNCg0KIyBMb2FkIFBhY2thZ2VzDQoNCkZpcnN0IGxvYWQgdGhlIHBhY2thZ2VzIHdlJ2xsIG5lZWQgYmVsb3c6DQoNCmBgYHtyIGNodW5rMDEsIG1lc3NhZ2U9RkFMU0V9DQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KGNpbWlyKQ0KbGlicmFyeSh6b28pDQpsaWJyYXJ5KGxlYWZsZXQpDQpgYGANCg0KXA0KDQojIEltcG9ydCBXZWF0aGVyIERhdGEgZnJvbSBDSU1JUw0KDQpBZ3JvY2xpbWF0ZSBtZXRyaWNzIHJlcXVpcmUgd2VhdGhlciBkYXRhLCBzdWNoIGFzIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHRlbXBlcmF0dXJlLCBwcmVjaXBpdGF0aW9uLCByZWxhdGl2ZSBodW1pZGl0eSwgcmVmZXJlbmNlIEVUbywgYW5kIHNvIG9uLiBGb3IgdGhpcyBleGVyY2lzZSwgd2UnbGwgaW1wb3J0IHdlYXRoZXIgcmVjb3JkcyBmcm9tIGEgc3RhdGlvbiBpbiB0aGUgW0NJTUlTXShodHRwczovL2NpbWlzLndhdGVyLmNhLmdvdi8pIG5ldHdvcmsuDQoNCjo6OiBzaGFkZWQtYm94DQoqKkhvdXJseSBvciBEYWlseSBXZWF0aGVyIERhdGE/KioNCg0KSW4gdGhlb3J5LCBob3VybHkgZGF0YSBzaG91bGQgYmUgYSBiZXR0ZXIgcHJlZGljdG9yIG9mIHBsYW50IG9yIGluc2VjdCBncm93dGgsIGJlY2F1c2UgaXQgY2FwdHVyZXMgbnVhbmNlcyBhbmQgcHJvY2Vzc2VzIG9uIGEgc21hbGxlciB0aW1lIHNjYWxlLiBIb3VybHkgZGF0YSBpcyBhbHNvIG5vdCB0aGF0IGhhcmQgdG8gZ2V0IHRoZXNlIGRheXMsIGF0IGxlYXN0IGZvciB0aGUgY3VycmVudCB0aW1lIHBlcmlvZC4NCg0KSG93ZXZlciBpbiBwcmFjdGljZSBtb3N0IG9mIHRoZSBjcm9wIGFuZCBwZXN0IG1vZGVscyBpbiB1c2UgYXJlIGJhc2VkIG9uICoqZGFpbHkgZGF0YSoqLCBzbyBpZiB5b3Ugd2FudCB0byB1c2UgdGhvc2UgbW9kZWxzIHlvdSB0byBwcm92aWRlIGRhaWx5IGRhdGEuIFRoZSByZXN0IG9mIHRoaXMgTm90ZWJvb2sgdGhlcmVmb3JlIHdpbGwgdXNlICoqZGFpbHkqKiB3ZWF0aGVyIGRhdGEuDQo6OjoNCg0KIyMgQ0lNSVMNCg0KW0NJTUlTXShodHRwczovL2NpbWlzLndhdGVyLmNhLmdvdi8pIGlzIGEgbmV0d29yayBvZiBcfjE1MCBhdXRvbWF0ZWQgd2VhdGhlciBzdGF0aW9ucyBydW4gYnkgW0NBRFdSXShodHRwczovL3dhdGVyLmNhLmdvdi8pIGZvciB0aGUgcHVycG9zZXMgb2YgaW5mb3JtaW5nIGlycmlnYXRvcnMuIEl0IGlzIGEgcG9wdWxhciBzb3VyY2Ugb2Ygd2VhdGhlciBkYXRhIGJlY2F1c2Ugb2YgdGhlIGNvdmVyYWdlIGFyZWEsIHRoZSBzdGF0aW9ucyByZWNvcmQgaG91cmx5IGFuZCBkYWlseSB2YWx1ZXMgb2YgbWFpbiB3ZWF0aGVyIHZhcmlhYmxlcy4gVGhlIGRhdGEgYXJlIGFsc28gZnJlZWx5IGF2YWlsYWJsZSB0aHJvdWdoIHZhcmlvdXMgd2Vic2l0ZXMgYW5kIGFuIEFQSS4NCg0KVGhlIFtgY2ltaXJgXShodHRwczovL2h5ZHJvZWNvbG9neS5uZXQvY2ltaXIvKSBwYWNrYWdlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBpbXBvcnQgZGF0YSBmcm9tIHRoZSBDSU1JUyBuZXR3b3JrIGRpcmVjdGx5IGludG8gUi4gTWFueSBvZiB0aGVzZSBmdW5jdGlvbnMgcmVxdWlyZSBjcmVhdGluZyBhIFtDSU1JUyBhY2NvdW50XShodHRwczovL2NpbWlzLndhdGVyLmNhLmdvdi9BdXRoL1JlZ2lzdGVyLmFzcHgpIHNvIHlvdSBjYW4gZ2V0IGEgW0NJTUlTIEFQSSBrZXldKGh0dHBzOi8vY2ltaXMud2F0ZXIuY2EuZ292L0F1dGgvUmVnaXN0ZXIuYXNweCkgKGZyZWUpLg0KDQojIyMgTWFwIHRoZSBDSU1JUyBTdGF0aW9ucw0KDQpUaGUgZWFzaWVzdCB3YXkgdG8gZ2V0IENJTUlTIGRhdGEgaXMgaWYgeW91IGtub3cgd2hpY2ggc3RhdGlvbi4gTGV0J3MgbWFrZSBhIG1hcCBvZiB0aGUgQ0lNSVMgU3RhdGlvbnMuIFN0ZXAgMSBpcyB0byBnZXQgdGhlIGxpc3Qgb2YgYWN0aXZlIHN0YXRpb25zOg0KDQpgYGB7ciBjaHVuazAyfQ0KIyMgSWYgeW91IGhhdmUgYSBDSU1JUyBrZXksIHlvdSBjYW4gdW5jb21tZW50IGFuZCBydW4gdGhlIGZvbGxvd2luZzoNCiMjIGNpbWlyOjpzZXRfa2V5KCJ4eHh4eHh4eC14eHh4LXh4eHgteHh4eC14eHh4eHh4eHh4eHgiKQ0KIyMgc3RhdGlvbnNfYWxsX3RibCA8LSBjaW1pcjo6Y2ltaXNfc3RhdGlvbigpDQoNCnN0YXRpb25zX2FsbF90YmwgPC0gcmVhZC5jc3YoIi4vZGF0YS9jaW1pc19zdGF0aW9uc19hbGwuY3N2IikNCmhlYWQoc3RhdGlvbnNfYWxsX3RibCkNCmBgYA0KDQpcDQoNCk5leHQgd2UnbGwgZG8gYSBsaXR0bGUgZGF0YSBjbGVhbmluZywga2VlcGluZyBvbmx5IHRoZSBjb2x1bW5zIHdlJ2xsIG5lZWQgZm9yIHRvIG1hcCB0aGUgYWN0aXZlIHN0YXRpb25zOg0KDQpgYGB7ciBjaHVuazAzfQ0Kc3RhdGlvbnNfY2xlYW5lZF90YmwgPC0gc3RhdGlvbnNfYWxsX3RibCB8PiANCiAgZmlsdGVyKElzQWN0aXZlID09ICJUcnVlIikgfD4gDQogIHNlbGVjdChTdGF0aW9uTmJyLCBOYW1lLCBIbXNMYXRpdHVkZSwgSG1zTG9uZ2l0dWRlKSB8PiANCiAgZGlzdGluY3QoKSB8PiANCiAgdHJhbnNtdXRlKHN0YXRpb25faWQgPSBhcy5udW1lcmljKFN0YXRpb25OYnIpLA0KICAgICAgICAgICAgbmFtZSA9IE5hbWUsDQogICAgICAgICAgICBsb24gPSBhcy5udW1lcmljKGdzdWIoIl4uKi8gIiwgIiIsIEhtc0xvbmdpdHVkZSkpLA0KICAgICAgICAgICAgbGF0ID0gYXMubnVtZXJpYyhnc3ViKCJeLiovICIsICIiLCBIbXNMYXRpdHVkZSkpKQ0KDQpoZWFkKHN0YXRpb25zX2NsZWFuZWRfdGJsKQ0KYGBgDQoNClwNCg0KVHVybiB0aGlzIGludG8gYSBzcGF0aWFsIG9iamVjdCBhbmQgbWFwIGl0IHdpdGggbGVhZmxldDoNCg0KYGBge3IgY2h1bmswNH0NCnN0YXRpb25zX2NsZWFuZWRfc2YgPC0gc3RhdGlvbnNfY2xlYW5lZF90YmwgfD4gDQogIG11dGF0ZSh0aXRsZSA9IHBhc3RlMChuYW1lLCAiICgjIiwgc3RhdGlvbl9pZCwgIikiKSkgfD4gDQogIHN0X2FzX3NmKGNvb3JkcyA9IGMoImxvbiIsICJsYXQiKSwgY3JzID0gNDMyNikgfD4gDQogIHNlbGVjdCh0aXRsZSkgDQoNCmxlYWZsZXQoc3RhdGlvbnNfY2xlYW5lZF9zZikgfD4NCiAgYWRkVGlsZXMoKSB8PiANCiAgYWRkQ2lyY2xlTWFya2VycyhyYWRpdXMgPSA1LCBwb3B1cCA9IH50aXRsZSkNCmBgYA0KDQpcDQoNCiMjIFF1ZXJ5IGEgQ0lNSVMgU3RhdGlvbg0KDQpUbyBzZWUgd2hhdCB3ZWF0aGVyIHZhcmlhYmxlcyBhcmUgYXZhaWxhYmxlLCBydW4gYGNpbWlzX2l0ZW1zKClgOg0KDQpgYGB7ciBjaHVuazA1fQ0KY2ltaXNfaXRlbXMoKQ0KYGBgDQoNClwNCg0KWW91IGNhbiByZXRyaWV2ZSBkYXRhIHVzaW5nIGBjaW1pc19kYXRhKClgLiBMZXQncyBnZXQgZGFpbHkgdGVtcGVyYXR1cmUsIHByZWNpcGl0YXRpb24sIGFuZCByZWZlcmVuY2UgRVRvIGZvciB0aGUgVmVyb25hIHN0YXRpb24gKCMyMzUpLCBub3J0aCBvZiBTYWNyYW1lbnRvLg0KDQpgYGB7ciBjaHVuazA2fQ0KIyBJZiB5b3UndmUgZW50ZXJlZCBhIENJTUlTIGtleSwgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZS4gDQojIE90aGVyd2lzZSwgcnVuIHRoZSBuZXh0IGNvbW1hbmQgdG8gbG9hZCB0aGUgc2F2ZWQgZGF0YQ0KIyBjaW1pc192ZXJvbmEyMl90YmwgPC0gY2ltaXNfZGF0YSh0YXJnZXRzID0gMjM1LCBzdGFydC5kYXRlID0gIjIwMjEtMTAtMDEiLCBlbmQuZGF0ZSA9ICIyMDIyLTA5LTMwIiwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMgPSAiZGF5LWFpci10bXAtbWF4LGRheS1haXItdG1wLW1pbixkYXktZXRvLGRheS1wcmVjaXAiKQ0KDQpjaW1pc192ZXJvbmEyMl90YmwgPC0gIHJlYWRSRFMoIi4vZGF0YS9jaW1pc192ZXJvbmEyMi5SZHMiKQ0KDQpoZWFkKGNpbWlzX3Zlcm9uYTIyX3RibCkNCmBgYA0KDQpcDQoNCioqTm90ZXMgYWJvdXQgdGhlIGRhdGEgZnJhbWUgcmV0dXJuZWQgYnkgYGNpbWlzX2RhdGEoKWAqKg0KDQotICAgb3VyIGRhdGEgZnJhbWUgY29udGFpbnMgNCB3ZWF0aGVyIHZhcmlhYmxlcyBpbiBhICpsb25nKiAoYXMgb3Bwb3NlZCB0byB3aWRlKSBmb3JtYXRcDQotICAgdGhlIGBEYXRlYCBjb2x1bW4gaXMgYWxyZWFkeSBmb3JtYXR0ZWQgYXMgYSBkYXRlIG9iamVjdFwNCi0gICBgSnVsaWFuYCBpcyB0aGUgZGF5IG9mIHRoZSB5ZWFyICgwLi4zNjUpDQotICAgYFFjYCBpcyBhIHF1YWxpdHkgY29udHJvbCBmbGFnIChbZGV0YWlsc10oaHR0cHM6Ly9jaW1pcy53YXRlci5jYS5nb3YvQ29udGVudC9QREYvQ3VycmVudEZsYWdzMi5wZGYpKQ0KDQpcDQoNCiMgVGltZSBGaWx0ZXJpbmcNCg0KVG8gZmlsdGVyIHJvd3MgYmFzZWQgb24gdGhlIGRhdGUsIHlvdSBuZWVkIGEgY29sdW1uIGFzIGEgRGF0ZSBvciB0aW1lIChQT1NJWGN0KSBvYmplY3QuIFRoZSBgbHVicmlkYXRlYCBwYWNrYWdlIGhhcyBmdW5jdGlvbnMgdG8gY29udmVydCBjaGFyYWN0ZXIgYW5kIG51bWJlciBjb2x1bW5zIGludG8gZGF0ZXMuDQoNCk9uY2UgeW91IGhhdmUgYSBkYXRlIGNvbHVtbiwgZmlsdGVyaW5nIGlzIHByZXR0eSBlYXN5LiBGb3IgZXhhbXBsZSB0byBwdWxsIHRoZSByZWNvcmRzIGZvciB0aGUgKioyMDIyIGdyb3dpbmcgc2Vhc29uKiogZnJvbSAqKkFwcmlsIDE1KiogdGhydSAqKlNlcHQgMzAsIDIwMjIqKjoNCg0KYGBge3IgY2h1bmswN30NCmdyd3NuX3ZhbHNfdGJsIDwtIGNpbWlzX3Zlcm9uYTIyX3RibCB8PiANCiAgc2VsZWN0KERhdGUsIEl0ZW0sIFZhbHVlLCBRYykgfD4gDQogIGZpbHRlcihEYXRlID49IGFzLkRhdGUoIjIwMjItMDQtMTUiKSwgRGF0ZSA8PSBhcy5EYXRlKCIyMDIyLTA5LTMwIikpDQoNCmdyd3NuX3ZhbHNfdGJsIHw+IHNsaWNlKDE6MjApDQpgYGANCg0KXA0KDQojIyMgUGxvdCB0aGUgZGFpbHkgaGlnaCB0ZW1wcw0KDQpXZSBjYW4gcGxvdCBkYWlseSBoaWdoIHRlbXBlcmF0dXJlIGF0IHRoaXMgbG9jYXRpb24gd2l0aCBhIGxpdHRsZSBoZWxwIGZyb20gZHBseXIgYW5kIGdncGxvdDoNCg0KYGBge3IgY2h1bmswOH0NCmdyd3NuX2RhaWx5bWF4X3RibCA8LSBncndzbl92YWxzX3RibCB8PiANCiAgZmlsdGVyKEl0ZW0gPT0gIkRheUFpclRtcE1heCIpIHw+IA0KICByZW5hbWUobWF4X3RlbXAgPSBWYWx1ZSkNCiANCmdncGxvdChncndzbl9kYWlseW1heF90YmwsIG1hcHBpbmcgPSBhZXMoeCA9IERhdGUsIHkgPSBtYXhfdGVtcCkpICsgDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJEYWlseSBIaWdoIFRlbXBzIiwgDQogICAgICAgICAgIHN1YnRpdGxlID0gIlZlcm9uYSBDSU1JUyBTdGF0aW9uLCBTcHJpbmcgMjAyMiIpDQpgYGANCg0KXA0KDQojIFJvbGxpbmcgQXZlcmFnZXMNCg0KUm9sbGluZyAvIG1vdmluZyBhdmVyYWdlcyBhcmUgZ2VuZXJpY2FsbHkgdXNlZnVsIGZvciBzbW9vdGhpbmcgb3V0IHRoZSBidW1wcyBpbiBhIHRpbWUgc2VyaWVzLiBGb3IgY3JvcCBtYW5hZ2VtZW50IHlvdSBtYXkgbm90IHdhbnQgdG8gc21vb3RoIG91dCB0aGUgYnVtcHMsIGJ1dCBvdGhlciBhcHBsaWNhdGlvbnMgYXJlIGVhc2llciB0byBhZGRyZXNzIGJ5IGxvb2tpbmcgYXQgdHJlbmRzIG9uIGEgd2Vla2x5IG9yIGxvbmdlciB0aW1lIHBlcmlvZC4NCg0KTW92aW5nIGF2ZXJhZ2VzIGNhbiBhbHNvIGJlIHVzZWZ1bCB0byBpZGVudGlmeSBtdWx0aS1kYXkgZXh0cmVtZSBldmVudHMuIEZvciBleGFtcGxlLCA1IGNvbnNlY3V0aXZlIGRheXMgb3ZlciA5NSDCsEYgaXMga2lsbGVyIGZvciB0b21hdG9lcy4gQ29tcHV0aW5nIHRoZSA1LWRheSByb2xsaW5nIGF2ZXJhZ2Ugd291bGQgYmUgb25lIHdheSB0byBpZGVudGlmeSB3aGVuIHRvbWF0b2VzIG1pZ2h0IGJlIGluIHRyb3VibGUgKHNlZSBhbHNvIGEgdGhyZXNob2xkIHRlY2huaXF1ZSwgY29taW5nIHVwIG5leHQpLg0KDQpZb3UgY2FuIGNvbXB1dGUgYSByb2xsaW5nIGF2ZXJhZ2Ugd2l0aCBgem9vOjpyb2xsbWVhbigpYC4gYGtgIGlzIHRoZSByb2xsaW5nIHdpbmRvdyBzaXplIChzaG91bGQgYmUgYW4gb2RkIG51bWJlcikuIFlvdSBzaG91bGQgYWxzbyBwYXNzIGBmaWxsID0gTkFgLCB3aGljaCB0ZWxscyBpdCB0byBhc3NpZ24gTkEgYXMgdGhlIHJvbGxpbmcgYXZlcmFnZSBmb3IgdGhlIGZpcnN0IGFuZCBsYXN0IGRheXMuDQoNCmBgYHtyIGNodW5rMDl9DQpncndzbl9kYWlseW1heF9tb3ZhdmdfdGJsIDwtIGdyd3NuX2RhaWx5bWF4X3RibCB8PiANCiAgbXV0YXRlKGRhaWx5bWF4X2F2ZzVkID0gem9vOjpyb2xsbWVhbihtYXhfdGVtcCwgaz01LCBmaWxsPU5BKSkNCg0KZ2dwbG90KGdyd3NuX2RhaWx5bWF4X21vdmF2Z190YmwsIG1hcHBpbmcgPSBhZXMoeCA9IERhdGUsIHkgPSBkYWlseW1heF9hdmc1ZCkpICsgDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJEYWlseSBIaWdoIFRlbXBzICg1LWRheSBtb3ZpbmcgYXZlcmFnZSkiLCANCiAgICAgICAgICAgc3VidGl0bGUgPSAiVmVyb25hIENJTUlTIFN0YXRpb24sIFNwcmluZyAyMDIyIikNCmBgYA0KDQpcDQoNCiMgQ2hhbGxlbmdlIFF1ZXN0aW9uICMxDQoNCkNvbXB1dGUgdGhlIGRhaWx5IGhpZ2ggdGVtcGVyYXR1cmUgcm9sbGluZyBhdmVyYWdlIGZvciBhbiAxMSBkYXkgd2luZG93LCB0aGVuIHBsb3QgaXQuIFtBbnN3ZXJdKGh0dHA6Ly9iaXQubHkvM0FYZlU2RykNCg0KYGBge3IgY2h1bmsxMH0NCiMjIFlvdXIgYW5zd2VyIGhlcmUNCmdyd3NuX2RhaWx5bWF4X3RibCB8PiANCiAgbXV0YXRlKGRhaWx5bWF4X2F2ZzVkID0gem9vOjpyb2xsbWVhbihtYXhfdGVtcCwgaz0xMSwgZmlsbD1OQSkpIHw+IA0KICBnZ3Bsb3QobWFwcGluZyA9IGFlcyh4ID0gRGF0ZSwgeSA9IGRhaWx5bWF4X2F2ZzVkKSkgKyANCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIkRhaWx5IEhpZ2ggVGVtcHMgKDExLWRheSBtb3ZpbmcgYXZlcmFnZSkiLCANCiAgICAgICAgICAgc3VidGl0bGUgPSAiVmVyb25hIENJTUlTIFN0YXRpb24sIFNwcmluZyAyMDIyIikNCmBgYA0KDQpcDQoNCiMgVGhyZXNob2xkIE1ldGhvZHMNCg0KTWFueSBhZ3JvY2xpbWF0ZSBtZXRyaWNzIGFyZSBkZWZpbmVkIGJ5IGEgdGhyZXNob2xkIHZhbHVlLiBUaGUgdGhyZXNob2xkIG1heSBiZSBpbiByZWZlcmVuY2UgdG8gdGhlIHJhbmdlIG9mIHZhcmlhYmlsaXR5IGF0IHRoYXQgbG9jYXRpb24gaW4gdGhlIGhpc3RvcmljIHBlcmlvZCwgb3IgaXQgbWF5IGJlIGluIHJlZmVyZW5jZSB0byB3aGVuIHNvbWUga2luZCBvZiBwaHlzaWNhbCBvciBiaW9sb2dpY2FsIGNoYW5nZSBoYXBwZW5zLg0KDQotICAgJ2V4dHJlbWUgaGVhdCcgYW5kICdleHRyZW1lIHByZWNpcGl0YXRpb24nIGdlbmVyYWxseSB1c2UgYSB0aHJlc2hob2xkIGJhc2VkIG9uIGhpc3RvcmljIHZhbHVlcyBmb3IgdGhhdCBsb2NhdGlvbg0KDQotICAgJ2hvdCBkYXlzJyBhcmUgZGVmaW5lZCBieSBhIHRocmVzaG9sZCB0ZW1wZXJhdHVyZSB0aGF0IGFmZmVjdHMgY3JvcHMgKFtQYXJrZXIgZXQgYWwuIDIwMjJdKGh0dHBzOi8vZG9pLm9yZy8xMC4zMzkwL2Fncm9ub215MTIwMTAyMDUpKS4NCg0KXA0KDQojIyBIb3QgRGF5cw0KDQpIb3cgbWFueSAnaG90IGRheXMnIHdlcmUgdGhlcmUgaW4gMjAyMiwgd2hlcmUgJ2hvdCcgaXMgZGVmaW5lZCBhcyBvdmVyIDM4IMKwQyAoMTAwLjQgwrBGKT8NCg0KVGVzdGluZyB3aGV0aGVyIGEgZGF5IHdhcyAnaG90JyBjYW4gYmUgZG9uZSB3aXRoIGEgc2ltcGxlIGNvbXBhcmlzb24gZXhwcmVzc2lvbjoNCg0KYGBge3IgY2h1bmsxMX0NCmdyd3NuX2hvdHluX3RibCA8LSBncndzbl9kYWlseW1heF90YmwgfD4gDQogIG11dGF0ZShob3R5biA9IG1heF90ZW1wID4gMTAwLjQpDQoNCmhlYWQoZ3J3c25faG90eW5fdGJsKQ0KYGBgDQoNClwNCg0KVGhlIG51bWJlciBvZiBob3QgZGF5cyBjYW4gYmUgY29tcHV0ZWQgc2ltcGx5IGJ5IHN1bW1pbmcgdGhlIGNvbHVtbiBvZiBUUlVFL0ZBTFNFIHZhbHVlczoNCg0KYGBge3IgY2h1bmsxMn0NCmdyd3NuX2hvdHluX3RibCRob3R5biB8PiBzdW0oKQ0KZ3J3c25faG90eW5fdGJsJGhvdHluIHw+IHRhYmxlKCkNCmBgYA0KDQpcDQoNClRvIHNlZSAqd2hlbiogdGhlIGhvdCBkYXlzIG9jY3VycmVkLCB3ZSBjYW4gb3ZlcmxheSB0aGUgdGhyZXNob2xkIHZhbHVlIG9uIHRoZSB0aW1lIHNlcmllcyBwbG90Og0KDQpgYGB7ciBjaHVuazEzfQ0KZ2dwbG90KGdyd3NuX2RhaWx5bWF4X3RibCwgbWFwcGluZyA9IGFlcyh4ID0gRGF0ZSwgeSA9IG1heF90ZW1wKSkgKyANCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAxMDAuNCwgY29sb3IgPSAicmVkIiwgbGluZXdpZHRoID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkRhaWx5IEhpZ2ggVGVtcHMiLCANCiAgICAgICAgICAgc3VidGl0bGUgPSAiVmVyb25hIENJTUlTIFN0YXRpb24sIFNwcmluZyAyMDIyIikNCmBgYA0KDQpcDQoNCiMgQ2hhbGxlbmdlIFF1ZXN0aW9uICMyDQoNCldyaXRlIGFuIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRoZSBleGFjdCBkYXRlcyBvZiBob3QgZGF5cy4gW0Fuc3dlcl0oaHR0cDovL2JpdC5seS8zWExpaEQ4KQ0KDQpgYGB7ciBjaHVuazE0fQ0KIyMgWW91ciBhbnN3ZXIgaGVyZQ0KZ3J3c25fZGFpbHltYXhfdGJsIHw+IA0KICBmaWx0ZXIoSXRlbSA9PSAiRGF5QWlyVG1wTWF4IiwgbWF4X3RlbXAgPiAxMDAuNCkgfD4gDQogIHNlbGVjdChEYXRlLCBtYXhfdGVtcCkNCmBgYA0KDQpcDQoNCiMgTGFzdCBTcHJpbmcgRnJlZXplDQoNClBsYW50aW5nIGFuZCBvdGhlciBjcm9wIG1hbmFnZW1lbnQgcHJhY3RpY2VzIGhhdmUgdG8gYmUgdGltZWQgdG8gdGFrZSBwbGFjZSBhZnRlciB0aGUgbGFzdCBmcmVlemUgb2YgdGhlIHdpbnRlci4gVGhlIGRhdGUgb2YgdGhlIGxhc3QgZnJlZXplIGNhbiBiZSBjYWxjdWxhdGVkIGJ5Og0KDQoxLiAgSWRlbnRpZnlpbmcgYWxsIGZyZWV6ZSBldmVudHMgZnJvbSBzYXkgRmVicnVhcnkgdGhydSBKdW5lLCB1c2luZyBhIHNpbXBsZSB0aHJlc2hvbGQgdGVzdCAobWluaW11bSBkYWlseSB0ZW1wICZsZTsgMzIgJmRlZztGKQ0KDQoyLiAgRmluZCB0aGUgZGF0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxhc3QgZnJlZXplDQoNClwNCg0KU3RlcCAxOiBhZGQgYSAnRnJvc3QgRGF5JyBjb2x1bW46DQoNCmBgYHtyIGNodW5rMTV9DQpkYWlseV9taW5fdGJsIDwtIGNpbWlzX3Zlcm9uYTIyX3RibCB8PiANCiAgZmlsdGVyKEl0ZW0gPT0gIkRheUFpclRtcE1pbiIsIERhdGUgPj0gYXMuRGF0ZSgiMjAyMi0wMi0wMSIpLCBEYXRlIDw9IGFzLkRhdGUoIjIwMjItMDYtMzAiKSkgfD4gDQogIG11dGF0ZShmcm9zdF9kYXkgPSBWYWx1ZSA8PSAzMikgfD4gDQogIHNlbGVjdChEYXRlLCBJdGVtLCBWYWx1ZSwgZnJvc3RfZGF5KQ0KDQpoZWFkKGRhaWx5X21pbl90YmwpDQpgYGANCg0KXA0KDQpTdGVwIDIuIEhvdyBtYW55IGZyb3N0IGRheXMgd2VyZSB0aGVyZSBmcm9tIEZlYnJ1YXJ5IHRocnUgSnVuZT8NCg0KYGBge3IgY2h1bmsxNn0NCmRhaWx5X21pbl90YmwkZnJvc3RfZGF5IHw+IHRhYmxlKCkNCmBgYA0KDQpcDQoNClN0ZXAgMy4gV2hhdCB3YXMgdGhlICoqbGFzdCoqIGZyZWV6ZSBkYXRlPw0KDQpgYGB7ciBjaHVuazE3fQ0KZGFpbHlfbWluX3RibCB8PiANCiAgZmlsdGVyKGZyb3N0X2RheSA9PSBUUlVFKSB8PiANCiAgYXJyYW5nZShkZXNjKERhdGUpKSANCmBgYA0KDQpcDQoNCmBgYHtyIGNodW5rMTh9DQpkYWlseV9taW5fdGJsIHw+IA0KICBmaWx0ZXIoZnJvc3RfZGF5ID09IFRSVUUpIHw+IA0KICBzbGljZV9tYXgoRGF0ZSwgbiA9IDEpIHw+IA0KICBwdWxsKERhdGUpDQpgYGANCg0KXA0KDQojIFNwZWxscyBhbmQgUnVucw0KDQpTb21lIGNsaW1hdGUgbWV0cmljcyBhcmUgZGVmaW5lZCBieSBhIHNlcmllcyBvZiBkYXlzIHdoZW4gYSB0aHJlc2hvbGQgaXMgc3VycGFzc2VkLiBFeGFtcGxlcyBpbmNsdWRlIGhlYXR3YXZlcy4gV2UgbWF5IHdhbnQgdG8ga25vdyB0aGUgbnVtYmVyIG9mIGhlYXR3YXZlcywgb3IgdGhlIGxlbmd0aCBvZiB0aGUgaGVhdHdhdmVzLg0KDQpgcmxlKClgIGNhbiBiZSB1c2VkIHRvIGFuc3dlciB0aGVzZSBxdWVzdGlvbnMuIExldCdzIHNlZSBob3cgYHJsZSgpYCB3b3JrczoNCg0KYGBge3IgY2h1bmsxOX0NCnggPC0gYygiYSIsICJhIiwgImEiLCAiaCIsICJ0IiwgInQiLCAidCIsICJ0IiwgImEiLCAiYSIsICJhIiwgImEiLCAiYyIsICJjIiwgImQiLCAiZCIsICJkIikNCnhybGVfbHN0IDwtIHJsZSh4KQ0KeHJsZV9sc3QNCmBgYA0KDQpcDQoNCkFzIHlvdSBjYW4gc2VlLCBgcmxlKClgIHJldHVybnMgYSBsaXN0IHdpdGggdHdvIGVsZW1lbnRzIGNvbnRhaW5pbmcgcHJvcGVydGllcyBvZiBncm91cHMgb2YgcmVwZWF0ZWQgbGV0dGVycy4gVGhlIGB2YWx1ZXNgIGVsZW1lbnQgY29udGFpbnMgdGhlIGxldHRlciBpbiBlYWNoIGdyb3VwLCBhbmQgdGhlIGBsZW5ndGhzYCBlbGVtZW50IGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgbGV0dGVycyAod2hpY2ggY291bGQgYmUgMSkuDQoNClNheSB3ZSdyZSBpbnRlcmVzdGVkIGluIGdyb3VwcyBvZiAzIG9yIG1vcmUgcmVwZWF0ZWQgbGV0dGVycy4gV2UgY2FuIGZpbmQgdGhlIG51bWJlciBvZiBncm91cHMgb2YgMyBvciBtb3JlIGxldHRlcnMgYnkgc3VtbWluZyB1cCB0aGUgcmVzdWx0cyBvZiBhIGxvZ2ljYWwgZXhwcmVzc2lvbjoNCg0KYGBge3IgY2h1bmsyMH0NCih4cmxlX2xzdCRsZW5ndGhzID49IDMpIHw+IHN1bSgpDQpgYGANCg0KXA0KDQpBbmQgd2UgY2FuIGZpbmQgdGhlIGF2ZXJhZ2UgbGVuZ3RoIG9mIHRoZXNlIGdyb3VwcyB3aXRoOg0KDQpgYGB7ciBjaHVuazIxfQ0KeHJsZV9sc3QkbGVuZ3Roc1sgeHJsZV9sc3QkbGVuZ3RocyA+PSAzIF0gfD4gbWVhbigpDQpgYGANCg0KXA0KDQpCdXQgd2hhdCBpZiB3ZSBvbmx5IHdhbnRlZCB0aGUgbnVtYmVyIG9mICdydW5zJyBvZiB0aGUgbGV0dGVyICdhJz8gV2UgY2FuIHNpbXBseSB1c2UgYSBjb21wb3VuZCBsb2dpY2FsIGV4cHJlc3Npb246DQoNCmBgYHtyIGNodW5rMjJ9DQojIyBOdW1iZXIgb2YgZ3JvdXBzIG9mICdhJyBvZiBsZW5ndGggMyBvciBtb3JlDQooKHhybGVfbHN0JHZhbHVlcyA9PSAiYSIpICYgKHhybGVfbHN0JGxlbmd0aHMgPj0gMykpIHw+IHN1bSgpDQpgYGANCg0KXA0KDQpTbyBob3cgbWFueSBoZWF0d2F2ZXMgd2hlcmUgdGhlIGhpZ2ggdGVtcGVyYXR1cmUgd2FzIFw+IDEwMC40IMKwRiBmb3IgMyBvciBtb3JlIGRheXM/DQoNCkZpcnN0IHdlIGNyZWF0ZSB0aGUgYHJsZSgpYCBsaXN0Og0KDQpgYGB7ciBjaHVuazIzfQ0KaG90eW5fcmxlX2xzdCA8LSBybGUoZ3J3c25faG90eW5fdGJsJGhvdHluKQ0KaG90eW5fcmxlX2xzdA0KYGBgDQoNClwNCg0KTmV4dCB3ZSBmaW5kIHRoZSBudW1iZXIgb2YgZ3JvdXBzIG9mIFRSVUU6DQoNCmBgYHtyIGNodW5rMjR9DQooKGhvdHluX3JsZV9sc3QkdmFsdWVzID09IFRSVUUpICYgKGhvdHluX3JsZV9sc3QkbGVuZ3RocyA+PSAzKSkgfD4gc3VtKCkNCmBgYA0KDQpcDQoNCiMgTXVsdGktVmFyaWFibGUgTWV0cmljcyB3aXRoIFNlcGFyYXRlIENvbHVtbnMNCg0KU29tZSBtZXRyaWNzIGNvbWJpbmUgbXVsdGlwbGUgd2VhdGhlciBzdGF0aW9uIHZhcmlhYmxlcywgc3VjaCBhcyB0aGUgZGFpbHkgbWluaW11bSBhbmQgZGFpbHkgbWF4aW11bSB0ZW1wZXJhdHVyZS4gQm90aCBvZiB0aGVzZSB2YXJpYWJsZXMgYXJlIGluY2x1ZGVkIGluIG91ciBDSU1JUyBkYXRhLCBidXQgdGhleSdyZSBtaXhlZCBpbiB3aXRoIG90aGVyIHZhcmlhYmxlcyBpbiBhIGxvbmcgZm9ybWF0LiBSZW1lbWJlciB3aGF0IHdlIGdvdCBiYWNrIGZyb20gQ0lNSVM6DQoNCmBgYHtyIGNodW5rMjV9DQpjaW1pc192ZXJvbmEyMl90YmwgfD4gDQogIHNlbGVjdChEYXRlLCBJdGVtLCBWYWx1ZSwgUWMsIFVuaXQpIHw+IA0KICBzbGljZSgxOjEwKQ0KYGBgDQoNClwNCg0KRm9yIG1hbnkgbXVsdGktdmFyaWFibGUgbWV0cmljcywgaXQgaXMgb2Z0ZW4gZWFzaWVzdCB0byBwdWxsIG91dCB0aGUgdmFyaWFibGVzIHdlIG5lZWQgYXMgc2VwYXJhdGUgY29sdW1ucy4gVGhpcyBjYW4gYmUgZWFzaWx5IGRvbmUgYHRpZHlyOjpwaXZvdF93aWRlcigpYC4gVGhlIGtleSBhcmd1bWVudHMgd2UgbmVlZCB0byBnaXZlIGl0IGFyZSBgbmFtZXNfZnJvbWAgYW5kIGB2YWx1ZXNfZnJvbWAgKFtkZXRhaWxzXShodHRwczovL3RpZHlyLnRpZHl2ZXJzZS5vcmcvYXJ0aWNsZXMvcGl2b3QuaHRtbCkpOg0KDQpgYGB7ciBjaHVuazI2fQ0KZGFpbHlfdGVtcHNfdGJsIDwtIGNpbWlzX3Zlcm9uYTIyX3RibCB8PiANCiAgZmlsdGVyKEl0ZW0gJWluJSBjKCJEYXlBaXJUbXBNaW4iLCAiRGF5QWlyVG1wTWF4IikpIHw+IA0KICBzZWxlY3QoRGF0ZSwgSXRlbSwgVmFsdWUpIHw+IA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gSXRlbSwgdmFsdWVzX2Zyb20gPSBWYWx1ZSkNCiAgDQpkYWlseV90ZW1wc190YmwgfD4gaGVhZCgpDQpgYGANCg0KXA0KDQojIyBBdmVyYWdlIERhaWx5IFRlbXBlcmF0dXJlDQoNCldpdGggdGhlIGRhaWx5IG1pbmltdW0gYW5kIG1heGltdW0gdGVtcGVyYXR1cmUgYXMgc2VwYXJhdGUgY29sdW1ucywgY29tcHV0aW5nIHRoZSBhdmVyYWdlIHRlbXBlcmF0dXJlIGlzIGEgc2ltcGxlIGV4cHJlc3Npb246DQoNCmBgYHtyIGNodW5rMjd9DQpkYWlseV9tZWFuX3RibCA8LSBkYWlseV90ZW1wc190YmwgfD4gDQogIG11dGF0ZShkYWlseV9tZWFuID0gKERheUFpclRtcE1heCArIERheUFpclRtcE1pbikgLyAyKQ0KICANCmhlYWQoZGFpbHlfbWVhbl90YmwpDQpgYGANCg0KXA0KDQojIyBEaXVybmFsIFRlbXBlcmF0dXJlIFJhbmdlDQoNClRoZSBEaXVybmFsIFRlbXBlcmF0dXJlIFJhbmdlIChEVFIpIGlzIGEgdXNlZnVsIG1ldHJpYyBmb3IgZXZhbHVhdGluZyBjcm9wIHN1aXRhYmlsaXR5LCBhbmQgaXMgc2ltcGx5IHRoZSBtYXhpbXVtIGRhaWx5IHRlbXBlcmF0dXJlIG1pbnVzIHRoZSBtaW5pbXVtOg0KDQpgYGB7ciBjaHVuazI4fQ0KZGFpbHlfZHRyX3RibCA8LSBkYWlseV90ZW1wc190YmwgfD4gDQogIG11dGF0ZShEVFIgPSBEYXlBaXJUbXBNYXggLSBEYXlBaXJUbXBNaW4pDQogIA0KaGVhZChkYWlseV9kdHJfdGJsKQ0KYGBgDQoNClwNCg0KTGFyZ2Ugc3dpbmdzIGluIHRlbXBlcmF0dXJlIG1heSByZXByZXNlbnQgZGF5cyB3aGVuIGEgZnJvbnQgcGFzc2VkIHRocm91Z2guDQoNCmBgYHtyIGNodW5rMjl9DQpnZ3Bsb3QoZGFpbHlfZHRyX3RibCwgbWFwcGluZyA9IGFlcyh4ID0gRGF0ZSwgeSA9IERUUikpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIkRpdXJuYWwgVGVtcGVyYXR1cmUgUmFuZ2UiLA0KICAgICAgIHN1YnRpdGxlID0gIlZlcm9uYSBDSU1JUyBTdGF0aW9uIiwNCiAgICAgICB5ID0gIkRUUiAoZGVncmVlcyBGKSIpDQpgYGANCg0KXA0KDQpUaGUgaGlzdG9ncmFtIG9mIERUUiBjYW4gYmUgdXNlZCB0byBjb21wYXJlIHRoZSBtYWduaXR1ZGUgb2YgZGFpbHkgdGVtcGVyYXR1cmUgdmFyaWF0aW9uIGFjcm9zcyBzaXRlcyBvciBvdmVyIHRpbWU6DQoNCmBgYHtyIGNodW5rMzB9DQpnZ3Bsb3QoZGFpbHlfZHRyX3RibCwgbWFwcGluZyA9IGFlcyh4ID0gRFRSKSkgKw0KICBnZW9tX2hpc3RvZ3JhbSgpICsNCiAgbGFicyh0aXRsZSA9ICJEaXVybmFsIFRlbXBlcmF0dXJlIFJhbmdlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJWZXJvbmEgQ0lNSVMgU3RhdGlvbi4gT2N0ICcyMSAtIFNlcCAnMjInIikNCmBgYA0KDQpcDQoNCiMgRXZhcG90cmFuc3BpcmF0aW9uDQoNClRoZSBnb2FsIG9mIHByZWNpc2lvbiBpcnJpZ2F0aW9uIGlzIHRvIGdpdmUgdGhlIGNyb3AganVzdCB0aGUgYW1vdW50IG9mIHdhdGVyIGl0IG5lZWRzLCBhbmQgbm90aGluZyBtb3JlLiBBIHN0YW5kYXJkIG1ldGhvZCBmb3IgZGV0ZXJtaW5pbmcgaG93IG11Y2ggd2F0ZXIgaXMgbmVlZGVkIGlzIHRvIGZpZ3VyZSBvdXQgaG93IG11Y2ggd2F0ZXIgd2FzIGxvc3Qgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXMgaXJyaWdhdGVkLCBhbmQgcHV0IGJhY2sgZXhhY3RseSB0aGF0IG11Y2guDQoNCkNyb3BzIGxvc2Ugd2F0ZXIgZHVlIHRvIGV2YXBvdHJhbnNwaXJhdGlvbiAoRVQpLCB3aGljaCBjb21iaW5lcyBldmFwb3JhdGlvbiAoaS5lLiwgZnJvbSB0aGUgc29pbCkgYW5kIHJlc3BpcmF0aW9uIChmcm9tIHRoZSBwbGFudHMpLiBUaGUgY2hhbGxlbmdlIGhvd2V2ZXIgaXMgdGhhdCBkaWZmZXJlbnQgY3JvcHMgcmVzcGlyZSBhdCBkaWZmZXJlbnQgcmF0ZXMsIHdoaWNoIGZ1cnRoZXIgdmFyeSBiYXNlZCBvbiB0aGUgc3RhZ2Ugb2YgdGhlIGNyb3AgKGkuZS4sIGJhYnkgcGxhbnRzIGRvbid0IHJlc3BpcmUgbmVhcmx5IGFzIG11Y2ggYXMgbWF0dXJlIHBsYW50cykuIFNvIHRoZXJlIGlzIG5vdCBvbmUtc2l6ZS1maXRzLWFsbCB2YWx1ZSBvZiBFVCB0aGF0IHlvdSBjYW4gZ2V0IGZyb20gd2VhdGhlciB2YXJpYWJsZXMuDQoNClRvIGdldCBhcm91bmQgdGhpcywgQ0lNSVMgc3RhdGlvbnMgaGF2ZSBhIHNlbnNvciB0aGF0IG1lYXN1cmUgJ3JlZmVyZW5jZSBFVCcgKEVUfjB+KSBmcm9tIGEgc3RhbmRhcmQgJ2Nyb3AnIChncmFzcyksIHdoaWNoIGNhbiBiZSBjb252ZXJ0ZWQgdG8gY3JvcCBFVCAoRVR+Y34pIGJ5IG11bHRpcGx5aW5nIHRoZSByZWZlcmVuY2UgRVQgYnkgYSAnY3JvcCBjb2VmZmljaWVudCcgKEt+Y34pIChbbW9yZSBpbmZvXShodHRwczovL2NpbWlzLndhdGVyLmNhLmdvdi9Db250ZW50L3BkZi9Dcm9wX0NvZWZmaWVudHMucGRmKSkuIENyb3AgY29lZmZpY2llbnRzIGhhdmUgYmVlbiBkZXZlbG9wZWQgdGhyb3VnaCByZXNlYXJjaCBmb3IgbWFueSBjcm9wcyAoW21vcmUgaW5mb10oaHR0cHM6Ly93d3cuZmFvLm9yZy8zL3gwNDkwZS94MDQ5MGUwYi5odG0jY3JvcCUyMGNvZWZmaWNpZW50cykpLg0KDQpcDQoNCiMjIEhvdyBtdWNoIHdhdGVyIGRvIG15IHRvbWF0b2VzIG5lZWQ/DQoNCkxldCdzIGNvbXB1dGUgdGhlIGFtb3VudCBvZiBkYWlseSBldmFwb3RyYW5zcGlyYXRpb24gZm9yIHRvbWF0b2VzIGZvciB0aGUgbW9udGggb2YgSnVuZS4gRHVyaW5nIHRoZSBtaWRkbGUgb2YgdGhlIGdyb3dpbmcgc2Vhc29uLCB0b21hdG9lcyBoYXZlIGEgS35jfiA9IDEuMTUuDQoNClRvIGNvbXB1dGUgaXJyaWdhdGlvbiByZXF1aXJlbWVudHMsIHdlIG5lZWQgdG86DQoNCjEuICBQdWxsIG91dCBFVH4wfiBhbmQgcHJlY2lwaXRhdGlvbiBmb3IgdGhlIG1vbnRoIG9mIEp1bmUNCg0KMi4gIFB1dCB0aGVtIGluIHNlcGFyYXRlIGNvbHVtbnM6DQoNCmBgYHtyIGNodW5rMzF9DQpqdW5lX2V0b19wcl90YmwgPC0gY2ltaXNfdmVyb25hMjJfdGJsIHw+IA0KICBmaWx0ZXIoSXRlbSAlaW4lIGMoIkRheUV0byIsICJEYXlQcmVjaXAiKSwgRGF0ZSA+PSBhcy5EYXRlKCIyMDIyLTA2LTAxIiksIERhdGUgPD0gYXMuRGF0ZSgiMjAyMi0wNi0zMCIpICkgfD4gDQogIHBpdm90X3dpZGVyKGlkX2NvbHMgPSBEYXRlLCBuYW1lc19mcm9tID0gSXRlbSwgdmFsdWVzX2Zyb20gPSBWYWx1ZSkNCg0KaGVhZChqdW5lX2V0b19wcl90YmwpDQpgYGANCg0KXA0KDQpUbyBjb21wdXRlIHRoZSBkYWlseSBFVH5jfiBmb3IgdG9tYXRvZXMsIHdlIHNpbXBseSBtdWx0aXBseSB0aGUgcmVmZXJlbmNlIEVUfjB+IGJ5IHRoZSBjcm9wIGNvZWZmaWNpZW50IGZvciB0b21hdG9lczoNCg0KYGBge3IgY2h1bmszMn0NCktjIDwtIDEuMTUNCg0KanVuZV9ldGNfdGJsIDwtIGp1bmVfZXRvX3ByX3RibCB8PiANCiAgbXV0YXRlKEVUY190b21hdG8gPSBEYXlFdG8gKiBLYykgDQoNCmp1bmVfZXRjX3RibCB8PiBoZWFkKCkNCmBgYA0KDQpcDQoNClRoZSB0b3RhbCB3YXRlciBsb3NzIGVhY2ggZGF5IGlzIHRoZSBhbW91bnQgb2YgRVR+Y34gbWludXMgYW55IHByZWNpcGl0YXRpb24gKHdoaWNoIENJTUlTIGFsc28gcmVwb3J0cyBpbiBpbmNoZXMpOg0KDQpgYGB7ciBjaHVuazMzfQ0KanVuZV9uZXR3YXRlcmxvc3NfdGJsIDwtIGp1bmVfZXRjX3RibCB8PiANCiAgbXV0YXRlKG5ldF93YXRlcl9sb3NzX2luID0gRVRjX3RvbWF0byAtIERheVByZWNpcCApDQoNCmp1bmVfbmV0d2F0ZXJsb3NzX3RibCB8PiBoZWFkKCkNCmBgYA0KDQpcDQoNClRvIGNhbGN1bGF0ZSB0aGUgdG90YWwgYW1vdW50IG9mIHdhdGVyIHRoZSB0b21hdG9lcyBuZWVkLCB3ZSBzaW1wbHkgYWRkIHVwIHRoZSBkYWlseSBuZXQgd2F0ZXIgbG9zdCBzaW5jZSB0aGUgbGFzdCBpcnJpZ2F0aW9uIGV2ZW50Lg0KDQpTdXBwb3NlIHRoZSBsYXN0IGlycmlnYXRpb24gd2FzIEp1bmUgMTAsIDIwMjIsIGFuZCB0b2RheSBpcyBKdW5lIDE1LiBIb3cgbXVjaCB3YXRlciBkbyB3ZSBuZWVkIHRvIGFkZD8NCg0KYGBge3IgY2h1bmszNH0NCmp1bmVfbmV0d2F0ZXJsb3NzX3RibCB8PiANCiAgZmlsdGVyKERhdGUgPiBhcy5EYXRlKCIyMDIyLTA2LTEwIiksIERhdGUgPD0gYXMuRGF0ZSgiMjAyMi0wNi0xNSIpKSB8PiANCiAgbXV0YXRlKGN1bW11bGF0aXZlX3dhdGVyX2xvc3QgPSBjdW1zdW0obmV0X3dhdGVyX2xvc3NfaW4pKQ0KYGBgDQoNClwNCg0KIyBDaGFsbGVuZ2UgUXVlc3Rpb24gIzMNCg0KRnJvbSBPY3RvYmVyIDEgMjAyMSwgdGhydSBNYXJjaCAzMSwgMjAyMiwgaG93IG1hbnkgZGF5cyBkaWQgdGhlIHRlbXBlcmF0dXJlIGRpcCBiZWxvdyA1MyDCsEYgKGEgdGVtcGVyYXR1cmUgd2hpY2ggcmVkdWNlcyB0aGUgbG9hZCBvZiBjZXJ0YWluIG92ZXJ3aW50ZXJpbmcgaW5zZWN0cyk/IFtBbnN3ZXJdKGh0dHA6Ly9iaXQubHkvM0FXaTRVZCkNCg0KYGBge3IgY2h1bmszNX0NCiMjIFlvdXIgYW5zd2VyIGhlcmUNCmRhaWx5X2NvbGRkYXlfdGJsIDwtIGNpbWlzX3Zlcm9uYTIyX3RibCB8PiANCiAgZmlsdGVyKEl0ZW0gPT0gIkRheUFpclRtcE1pbiIsIERhdGUgPj0gYXMuRGF0ZSgiMjAyMS0xMC0wMSIpLCBEYXRlIDw9IGFzLkRhdGUoIjIwMjItMDMtMzEiKSkgfD4gDQogIG11dGF0ZShjb2xkX2RheSA9IFZhbHVlIDw9IDUzKSB8PiANCiAgc2VsZWN0KERhdGUsIEl0ZW0sIFZhbHVlLCBjb2xkX2RheSkNCg0KaGVhZChkYWlseV9jb2xkZGF5X3RibCkNCg0KZGFpbHlfY29sZGRheV90YmwgfD4gcHVsbChjb2xkX2RheSkgfD4gdGFibGUoKQ0KYGBgDQoNCiMgRW5kDQoNClJlbWVtYmVyIHRvIHNhdmUgdGhlIE5vdGVib29rIHRvIGdlbmVyYXRlIGEgSFRNTCB2ZXJzaW9uIHRoYXQgaW5jbHVkZXMgYWxsIGV4ZWN1dGVkIGNvZGUgdGhhdCB5b3UgY2FuIHNhdmUgZm9yIGtlZXBzIQ0K