General Issues
Make sure you name your files as requested, including matching
the specified use of upper and lower case. This matters on file systems
that are case-sensitive.
Make sure to commit your work to your local repository and push
your commits to GitLab. We can only see what is on GitLab, not what is
on your computer. You can check what we see by going to the GitLab web
interface.
Include your name and the date in the header of your
.Rmd file using author: and date:
tags.
Your HTML file should be a report of your findings.
Any graph you show should be discussed in your
narrative.
Any code you show should be discussed in your narrative.
If you do not need to discuss a piece of code in the narrative,
use echo FALSE to avoid showing it.
If you load a file that you have included in your repository or
that you download to your repository then you need to make sure the code
in your Rmarkdown document uses a relative path, not an absolute one.
Absolute paths will only make sense on your computer, not on the
computer of someone else who downloads your repository.
If you want to check your work is reproducible you can download
your work to a computer other than the one you use for developing it.
One option is the CLAS Linux systems accessed via FastX. You can use
RStudio there to set up a clean copy of your repository and then just
pull your changes and check that they knit successfully. Using
STAT4580::checkHW is a convenient way to do this.
1. Evaluate a Visualization
The Vox visualization attracted some attention in the internet; some
examples:
The original visualization
made the very common mistake of mapping magnitudes to circle radius,
which distorts the perceived magnitudes since perception focuses on
area. The main change in the revision is to map magnitude to
area.
The revision also changed some color assignments, but kept the
traditional assignment of pink for Breast Cancer.
Analysis of the visualization:
Items: diseases and associated measurements.
Attributes: disease, money raised; deaths.
Marks: circles, text.
Channels: vertical position, area, color (hue), text.
Mappings:
Ranks within the numeric variables are mapped to vertical
position.
Magnitudes of numeric variables are mapped to circle
areas.
Magnitudes are also mapped to text labels.
Disease is mapped to color (hue).
A goal of the visualization is to show the discrepancy between the
relative amounts raised and the relative numbers of deaths. This
relation is communicated by matching the positions or sizes of the
corresponding circles by color, a weaker channel.
One good alternative, used in one of the links above, is a scatter
plot:

Other options:
a Tufte-style slope graph using standardized variables or ranks
(essentially a parallel coordinates plot; used in another of the links
above);
visualizing a derived variable, such as funds per death.
There are issues with the data; some of these are discussed in the
articles linked to above.
2. EPA Fuel Economy Data
library(lubridate)
library(readr)
if (! file.exists("vehicles.csv.zip") ||
file.mtime("vehicles.csv.zip") + months(6) < now())
download.file("http://www.stat.uiowa.edu/~luke/data/vehicles.csv.zip",
"vehicles.csv.zip")
newmpg <- read_csv("vehicles.csv.zip", guess_max = 100000)
From the documentation
for the data the appropriate variables seem to be:
fuelType1 represents the primary fuel type,
fl in mpg.
highway08 corresponds to hwy in
mpg;
cylinders corresponds to cyl in
mpg;
displ corresponds to displ in
mpg;
The primary fuel type counts are
library(dplyr)
tbl <- count(newmpg, fuelType1)
kbl <- knitr::kable(tbl, format = "html")
kableExtra::kable_styling(kbl, full_width = FALSE)
|
fuelType1
|
n
|
|
Diesel
|
1310
|
|
Electricity
|
1329
|
|
Hydrogen
|
39
|
|
Midgrade Gasoline
|
168
|
|
Natural Gas
|
60
|
|
Premium Gasoline
|
15580
|
|
Regular Gasoline
|
31094
|
A bar chart of these numbers:
thm <- theme_minimal() + theme(text = element_text(size = 16))
ggplot(tbl, aes(x = n, y = reorder(fuelType1, n))) +
geom_col() +
scale_x_continuous(expand = expansion(mult = c(0, .1))) +
thm +
ylab(NULL)

Regular gas is the dominant fuel type over all years, with premium
second. All other fuel types, including electricity, make up a small
fraction.
3. Fuel Type Over the Years
A filled bar chart shows changes in the primary fuel type used over
the years:
newmpg2 <- filter(newmpg, year <= 2025) |>
mutate(year = factor(year))
ggplot(newmpg2, aes(y = year, fill = fuelType1)) +
geom_bar(position = "fill") +
scale_x_continuous(expand = c(0, 0)) +
labs(x = "Proportion", y = NULL)

Regular gas was the predominant fuel type in the mid 1980s, but
premium’s share gradually increased to the point where almost as many
models use premium as regular, but has decreased recently. Diesel’s
popularity declined early and had a small resurgence recently. The
market share for electricity is still small but is growing.
4. Highway Fuel Economy Over the Years
newmpg3 <- filter(newmpg, year <= 2025, year >= 2000) |>
mutate(year = factor(year))
alpha <- 0.2
size <- 0.3
nyear <- length(levels(newmpg3$year))
A strip chart is a useful way to look at the full data for a numeric
variable at several different levels of a discrete variable, but some
tuning is needed for larger data sets. For examining 26 years of highway
gas mileage data from the EPA data set using alpha = 0.2
and size = 0.3 along with jittering seems to work
reasonably well:
ggplot(newmpg3, aes(x = highway08, y = year)) +
geom_point(position = "jitter", size = size, alpha = alpha) +
ylab(NULL) +
thm

Over time the highway gas mileage distributions are moving upward a
little bit, with the upper tails becoming gradually longer and an
increasing number of very high efficiency models (mostly electric).
LS0tCnRpdGxlOiAiQXNzaWdubWVudCA0IE5vdGVzIgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogeWVzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6ICJoaWRlIgotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChjb2xsYXBzZSA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQpgYGAKCiMjIEdlbmVyYWwgSXNzdWVzCgoqIE1ha2Ugc3VyZSB5b3UgbmFtZSB5b3VyIGZpbGVzIGFzIHJlcXVlc3RlZCwgaW5jbHVkaW5nIG1hdGNoaW5nIHRoZQogIHNwZWNpZmllZCB1c2Ugb2YgdXBwZXIgYW5kIGxvd2VyIGNhc2UuIFRoaXMgbWF0dGVycyBvbiBmaWxlIHN5c3RlbXMKICB0aGF0IGFyZSBjYXNlLXNlbnNpdGl2ZS4KCiogTWFrZSBzdXJlIHRvIGNvbW1pdCB5b3VyIHdvcmsgdG8geW91ciBsb2NhbCByZXBvc2l0b3J5IGFuZCBwdXNoIHlvdXIKICBjb21taXRzIHRvIEdpdExhYi4gV2UgY2FuIG9ubHkgc2VlIHdoYXQgaXMgb24gR2l0TGFiLCBub3Qgd2hhdCBpcyBvbgogIHlvdXIgY29tcHV0ZXIuIFlvdSBjYW4gY2hlY2sgd2hhdCB3ZSBzZWUgYnkgZ29pbmcgdG8gdGhlIEdpdExhYiB3ZWIKICBpbnRlcmZhY2UuCiAKKiBJbmNsdWRlIHlvdXIgbmFtZSBhbmQgdGhlIGRhdGUgaW4gdGhlIGhlYWRlciBvZiB5b3VyIGAuUm1kYCBmaWxlCiAgdXNpbmcgYGF1dGhvcjpgIGFuZCBgZGF0ZTpgIHRhZ3MuCgoqIFlvdXIgSFRNTCBmaWxlIHNob3VsZCBiZSBhIHJlcG9ydCBvZiB5b3VyIGZpbmRpbmdzLgoKICAgICogQW55IGdyYXBoIHlvdSBzaG93IHNob3VsZCBiZSBkaXNjdXNzZWQgaW4geW91ciBuYXJyYXRpdmUuCgogICAgKiBBbnkgY29kZSB5b3Ugc2hvdyBzaG91bGQgYmUgZGlzY3Vzc2VkIGluIHlvdXIgbmFycmF0aXZlLgoKICAgICogSWYgeW91IGRvIG5vdCBuZWVkIHRvIGRpc2N1c3MgYSBwaWVjZSBvZiBjb2RlIGluIHRoZSBuYXJyYXRpdmUsCiAgICAgIHVzZSBgZWNobyBGQUxTRWAgdG8gYXZvaWQgc2hvd2luZyBpdC4KCiogSWYgeW91IGxvYWQgYSBmaWxlIHRoYXQgeW91IGhhdmUgaW5jbHVkZWQgaW4geW91ciByZXBvc2l0b3J5IG9yIHRoYXQKICB5b3UgZG93bmxvYWQgdG8geW91ciByZXBvc2l0b3J5IHRoZW4geW91IG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBjb2RlCiAgaW4geW91ciBSbWFya2Rvd24gZG9jdW1lbnQgdXNlcyBhIHJlbGF0aXZlIHBhdGgsIG5vdCBhbiBhYnNvbHV0ZQogIG9uZS4gIEFic29sdXRlIHBhdGhzIHdpbGwgb25seSBtYWtlIHNlbnNlIG9uIHlvdXIgY29tcHV0ZXIsIG5vdCBvbgogIHRoZSBjb21wdXRlciBvZiBzb21lb25lIGVsc2Ugd2hvIGRvd25sb2FkcyB5b3VyIHJlcG9zaXRvcnkuCgoqIElmIHlvdSB3YW50IHRvIGNoZWNrIHlvdXIgd29yayBpcyByZXByb2R1Y2libGUgeW91IGNhbiBkb3dubG9hZCB5b3VyCiAgd29yayB0byBhIGNvbXB1dGVyIG90aGVyIHRoYW4gdGhlIG9uZSB5b3UgdXNlIGZvciBkZXZlbG9waW5nIGl0LgogIE9uZSBvcHRpb24gaXMgdGhlIENMQVMgTGludXggc3lzdGVtcyBhY2Nlc3NlZCB2aWEKICBbRmFzdFhdKGh0dHBzOi8vbGludXguY2xhcy51aW93YS5lZHUvaGVscC9mYXN0eCkuIFlvdSBjYW4gdXNlCiAgUlN0dWRpbyB0aGVyZSB0byBzZXQgdXAgYSBjbGVhbiBjb3B5IG9mIHlvdXIgcmVwb3NpdG9yeSBhbmQgdGhlbgogIGp1c3QgcHVsbCB5b3VyIGNoYW5nZXMgYW5kIGNoZWNrIHRoYXQgdGhleSBrbml0IHN1Y2Nlc3NmdWxseS4KICBVc2luZyBgU1RBVDQ1ODA6OmNoZWNrSFdgIGlzIGEgY29udmVuaWVudCB3YXkgdG8gZG8gdGhpcy4KCgojIyAxLiBFdmFsdWF0ZSBhIFZpc3VhbGl6YXRpb24KClRoZSBWb3ggdmlzdWFsaXphdGlvbiBhdHRyYWN0ZWQgc29tZSBhdHRlbnRpb24gaW4gdGhlIGludGVybmV0OyBzb21lCmV4YW1wbGVzOgoKLSBBIFtwb3N0XShodHRwczovL3d3dy5pZmxzY2llbmNlLmNvbS9pbmZvZ3JhcGhpYy1zaG93cy1kaWZmZXJlbmNlcy1iZXR3ZWVuLWRpc2Vhc2VzLXdlLWRvbmF0ZS1hbmQtZGlzZWFzZXMta2lsbC11cy0yNTQ4OSkKICBvbiA8aHR0cHM6Ly93d3cuaWZsc2NpZW5jZS5jb20vPi4KCi0gQSBbcG9zdF0oaHR0cHM6Ly9ub25wcm9maXRxdWFydGVybHkub3JnLzIwMTQvMDkvMDUvaW5mb2dyYXBoaWMtY29tcGFyZXMtZG9uYXRpb25zLXRvLWRpc2Vhc2UtYW5kLWZpbmRzLWJpZy1kaXNwYXJpdGllcy8pCiAgb24gPGh0dHBzOi8vbm9ucHJvZml0cXVhcnRlcmx5Lm9yZz4gd2l0aCBhIGxpbmsgdG8gb25lIFthbHRlcm5hdGl2ZQogIHZpc3VhbGl6YXRpb25dKGh0dHA6Ly90aGVtZW5kb3phbGluZS5vcmcvcG9zdC85NTc1NzY3NDM4MS90aGlzLWJ1YmJsZS1jaGFydC1pcy1raWxsaW5nLW1lKS4KCjwhLS0gbm90IGF2YWlsYWJsZSBhbnltb3JlCi0gQW5vdGhlciBbYWx0ZXJuYXRpdmUgdmlzdWFsaXphdGlvbl0oPGh0dHA6Ly93d3cudmlzdWFsbWFnbmV0aWMuY29tL3BvcnRmb2xpby9kb25hdGlvbnMtdnMtZGVhdGhzLXdoZXJlLXNob3VsZC1vdXItbW9uZXktZ28vPikuCi0tPgoKLSBUaGUgW29yaWdpbmFsIHZpc3VhbGl6YXRpb25dKGltZy9vcmlnLXZveC1jaGFydC5qcGcpIG1hZGUgdGhlIHZlcnkKICBjb21tb24gbWlzdGFrZSBvZiBtYXBwaW5nIG1hZ25pdHVkZXMgdG8gY2lyY2xlIHJhZGl1cywgd2hpY2gKICBkaXN0b3J0cyB0aGUgcGVyY2VpdmVkIG1hZ25pdHVkZXMgc2luY2UgcGVyY2VwdGlvbiBmb2N1c2VzIG9uCiAgYXJlYS4gVGhlIG1haW4gY2hhbmdlIGluIHRoZSBbcmV2aXNpb25dKGltZy9uZXctdm94LWNoYXJ0LmpwZykgaXMgdG8KICBtYXAgbWFnbml0dWRlIHRvIGFyZWEuCgotIFRoZSByZXZpc2lvbiBhbHNvIGNoYW5nZWQgc29tZSBjb2xvciBhc3NpZ25tZW50cywgYnV0IGtlcHQgdGhlCiAgdHJhZGl0aW9uYWwgYXNzaWdubWVudCBvZiBwaW5rIGZvciBCcmVhc3QgQ2FuY2VyLgoKQW5hbHlzaXMgb2YgdGhlIHZpc3VhbGl6YXRpb246CgotIEl0ZW1zOiBkaXNlYXNlcyBhbmQgYXNzb2NpYXRlZCBtZWFzdXJlbWVudHMuCgotIEF0dHJpYnV0ZXM6IGRpc2Vhc2UsIG1vbmV5IHJhaXNlZDsgZGVhdGhzLgoKLSBNYXJrczogY2lyY2xlcywgdGV4dC4KCi0gQ2hhbm5lbHM6IHZlcnRpY2FsIHBvc2l0aW9uLCBhcmVhLCBjb2xvciAoaHVlKSwgdGV4dC4KCi0gTWFwcGluZ3M6CgogICAgKiBSYW5rcyB3aXRoaW4gdGhlIG51bWVyaWMgdmFyaWFibGVzIGFyZSBtYXBwZWQgdG8gdmVydGljYWwgcG9zaXRpb24uCgogICAgKiBNYWduaXR1ZGVzIG9mIG51bWVyaWMgdmFyaWFibGVzIGFyZSBtYXBwZWQgdG8gY2lyY2xlIGFyZWFzLgoKICAgICogTWFnbml0dWRlcyBhcmUgYWxzbyBtYXBwZWQgdG8gdGV4dCBsYWJlbHMuCgogICAgKiBEaXNlYXNlIGlzIG1hcHBlZCB0byBjb2xvciAoaHVlKS4KCkEgZ29hbCBvZiB0aGUgdmlzdWFsaXphdGlvbiBpcyB0byBzaG93IHRoZSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoZQpyZWxhdGl2ZSBhbW91bnRzIHJhaXNlZCBhbmQgdGhlIHJlbGF0aXZlIG51bWJlcnMgb2YgZGVhdGhzLiAgVGhpcwpyZWxhdGlvbiBpcyBjb21tdW5pY2F0ZWQgYnkgbWF0Y2hpbmcgdGhlIHBvc2l0aW9ucyBvciBzaXplcyBvZiB0aGUKY29ycmVzcG9uZGluZyBjaXJjbGVzIGJ5IGNvbG9yLCBhIHdlYWtlciBjaGFubmVsLgoKT25lIGdvb2QgYWx0ZXJuYXRpdmUsIHVzZWQgaW4gb25lIG9mIHRoZSBsaW5rcyBhYm92ZSwgaXMgYSBzY2F0dGVyIHBsb3Q6CgpgYGB7ciwgZWNobyA9IEZBTFNFfQpsaWJyYXJ5KGdncGxvdDIpCmlmICghIGZpbGUuZXhpc3RzKCJkZnVuZHMuY3N2IikpCiAgICBkb3dubG9hZC5maWxlKCJodHRwczovL3N0YXQudWlvd2EuZWR1L35sdWtlL2RhdGEvZGZ1bmRzLmNzdiIsCiAgICAgICAgICAgICAgICAgICJkZnVuZHMuY3N2IikKZGZ1bmRzIDwtIHJlYWQuY3N2KCJkZnVuZHMuY3N2IikKZ2dwbG90KGRmdW5kcywgYWVzKHggPSBEZWF0aHMsIHkgPSBGdW5kaW5nLCBjb2xvciA9IERpc2Vhc2UpKSArCiAgICBnZW9tX3BvaW50KHNpemUgPSA0KQpgYGAKCk90aGVyIG9wdGlvbnM6CgotIGEgVHVmdGUtc3R5bGUgc2xvcGUgZ3JhcGggdXNpbmcgc3RhbmRhcmRpemVkIHZhcmlhYmxlcyBvciByYW5rcwogIChlc3NlbnRpYWxseSBhIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3Q7IHVzZWQgaW4gYW5vdGhlciBvZiB0aGUKICBsaW5rcyBhYm92ZSk7CgotIHZpc3VhbGl6aW5nIGEgZGVyaXZlZCB2YXJpYWJsZSwgc3VjaCBhcyBmdW5kcyBwZXIgZGVhdGguCgpUaGVyZSBhcmUgaXNzdWVzIHdpdGggdGhlIGRhdGE7IHNvbWUgb2YgdGhlc2UgYXJlIGRpc2N1c3NlZCBpbiB0aGUKYXJ0aWNsZXMgbGlua2VkIHRvIGFib3ZlLgoKCiMjIDIuIEVQQSBGdWVsIEVjb25vbXkgRGF0YQoKYGBge3IsIG1lc3NhZ2UgPSBGQUxTRX0KbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkocmVhZHIpCmlmICghIGZpbGUuZXhpc3RzKCJ2ZWhpY2xlcy5jc3YuemlwIikgfHwKICAgIGZpbGUubXRpbWUoInZlaGljbGVzLmNzdi56aXAiKSArIG1vbnRocyg2KSA8IG5vdygpKQogICAgZG93bmxvYWQuZmlsZSgiaHR0cDovL3d3dy5zdGF0LnVpb3dhLmVkdS9+bHVrZS9kYXRhL3ZlaGljbGVzLmNzdi56aXAiLAogICAgICAgICAgICAgICAgICAidmVoaWNsZXMuY3N2LnppcCIpCm5ld21wZyA8LSByZWFkX2NzdigidmVoaWNsZXMuY3N2LnppcCIsIGd1ZXNzX21heCA9IDEwMDAwMCkKYGBgCgpGcm9tIHRoZSBbZG9jdW1lbnRhdGlvbiBmb3IgdGhlCmRhdGFdKGh0dHBzOi8vd3d3LmZ1ZWxlY29ub215Lmdvdi9mZWcvd3MvaW5kZXguc2h0bWwjdmVoaWNsZSkgdGhlCmFwcHJvcHJpYXRlIHZhcmlhYmxlcyBzZWVtIHRvIGJlOgoKICAqIGBmdWVsVHlwZTFgIHJlcHJlc2VudHMgdGhlIHByaW1hcnkgZnVlbCB0eXBlLCBgZmxgIGluIGBtcGdgLgogICogYGhpZ2h3YXkwOGAgY29ycmVzcG9uZHMgdG8gYGh3eWAgaW4gYG1wZ2A7CiAgKiBgY3lsaW5kZXJzYCBjb3JyZXNwb25kcyB0byBgY3lsYCBpbiBgbXBnYDsKICAqIGBkaXNwbGAgY29ycmVzcG9uZHMgdG8gYGRpc3BsYCBpbiBgbXBnYDsKClRoZSBwcmltYXJ5IGZ1ZWwgdHlwZSBjb3VudHMgYXJlCgpgYGB7ciwgbWVzc2FnZSA9IEZBTFNFfQpsaWJyYXJ5KGRwbHlyKQp0YmwgPC0gY291bnQobmV3bXBnLCBmdWVsVHlwZTEpCmtibCA8LSBrbml0cjo6a2FibGUodGJsLCBmb3JtYXQgPSAiaHRtbCIpCmthYmxlRXh0cmE6OmthYmxlX3N0eWxpbmcoa2JsLCBmdWxsX3dpZHRoID0gRkFMU0UpCmBgYAoKQSBiYXIgY2hhcnQgb2YgdGhlc2UgbnVtYmVyczoKCmBgYHtyfQp0aG0gPC0gdGhlbWVfbWluaW1hbCgpICsgdGhlbWUodGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTYpKQpnZ3Bsb3QodGJsLCBhZXMoeCA9IG4sIHkgPSByZW9yZGVyKGZ1ZWxUeXBlMSwgbikpKSArCiAgICBnZW9tX2NvbCgpICsKICAgIHNjYWxlX3hfY29udGludW91cyhleHBhbmQgPSBleHBhbnNpb24obXVsdCA9IGMoMCwgLjEpKSkgKwogICAgdGhtICsKICAgIHlsYWIoTlVMTCkKYGBgCgpSZWd1bGFyIGdhcyBpcyB0aGUgZG9taW5hbnQgZnVlbCB0eXBlIG92ZXIgYWxsIHllYXJzLCB3aXRoIHByZW1pdW0gc2Vjb25kLgpBbGwgb3RoZXIgZnVlbCB0eXBlcywgaW5jbHVkaW5nIGVsZWN0cmljaXR5LCBtYWtlIHVwIGEgc21hbGwgZnJhY3Rpb24uCgoKIyMgMy4gRnVlbCBUeXBlIE92ZXIgdGhlIFllYXJzCgpBIGZpbGxlZCBiYXIgY2hhcnQgc2hvd3MgY2hhbmdlcyBpbiB0aGUgcHJpbWFyeSBmdWVsIHR5cGUgdXNlZCBvdmVyCnRoZSB5ZWFyczoKICAKYGBge3J9Cm5ld21wZzIgPC0gZmlsdGVyKG5ld21wZywgeWVhciA8PSAyMDI1KSB8PgogICAgbXV0YXRlKHllYXIgPSBmYWN0b3IoeWVhcikpCmdncGxvdChuZXdtcGcyLCBhZXMoeSA9IHllYXIsIGZpbGwgPSBmdWVsVHlwZTEpKSArCiAgICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJmaWxsIikgKwogICAgc2NhbGVfeF9jb250aW51b3VzKGV4cGFuZCA9IGMoMCwgMCkpICsKICAgIGxhYnMoeCA9ICJQcm9wb3J0aW9uIiwgeSA9IE5VTEwpCmBgYAoKUmVndWxhciBnYXMgd2FzIHRoZSBwcmVkb21pbmFudCBmdWVsIHR5cGUgaW4gdGhlIG1pZCAxOTgwcywgYnV0CnByZW1pdW0ncyBzaGFyZSBncmFkdWFsbHkgaW5jcmVhc2VkIHRvIHRoZSBwb2ludCB3aGVyZSBhbG1vc3QgYXMgbWFueQptb2RlbHMgdXNlIHByZW1pdW0gYXMgcmVndWxhciwgYnV0IGhhcyBkZWNyZWFzZWQgcmVjZW50bHkuIERpZXNlbCdzCnBvcHVsYXJpdHkgZGVjbGluZWQgZWFybHkgYW5kIGhhZCBhIHNtYWxsIHJlc3VyZ2VuY2UgcmVjZW50bHkuIFRoZQptYXJrZXQgc2hhcmUgZm9yIGVsZWN0cmljaXR5IGlzIHN0aWxsIHNtYWxsIGJ1dCBpcyBncm93aW5nLgoKCiMjIDQuIEhpZ2h3YXkgRnVlbCBFY29ub215IE92ZXIgdGhlIFllYXJzCgpgYGB7cn0KbmV3bXBnMyA8LSBmaWx0ZXIobmV3bXBnLCB5ZWFyIDw9IDIwMjUsIHllYXIgPj0gMjAwMCkgfD4KICAgIG11dGF0ZSh5ZWFyID0gZmFjdG9yKHllYXIpKQphbHBoYSA8LSAwLjIKc2l6ZSA8LSAwLjMKbnllYXIgPC0gbGVuZ3RoKGxldmVscyhuZXdtcGczJHllYXIpKQpgYGAKCkEgc3RyaXAgY2hhcnQgaXMgYSB1c2VmdWwgd2F5IHRvIGxvb2sgYXQgdGhlIGZ1bGwgZGF0YSBmb3IgYSBudW1lcmljCnZhcmlhYmxlIGF0IHNldmVyYWwgZGlmZmVyZW50IGxldmVscyBvZiBhIGRpc2NyZXRlIHZhcmlhYmxlLCBidXQgc29tZQp0dW5pbmcgaXMgbmVlZGVkIGZvciBsYXJnZXIgZGF0YSBzZXRzLiBGb3IgZXhhbWluaW5nIGByIG55ZWFyYCB5ZWFycyBvZgpoaWdod2F5IGdhcyBtaWxlYWdlIGRhdGEgZnJvbSB0aGUgRVBBIGRhdGEgc2V0IHVzaW5nCmBhbHBoYWAgPSBgciBhbHBoYWAgYW5kIGBzaXplYCA9IGByIHNpemVgIGFsb25nIHdpdGggaml0dGVyaW5nIHNlZW1zIHRvCndvcmsgcmVhc29uYWJseSB3ZWxsOgoKYGBge3J9CmdncGxvdChuZXdtcGczLCBhZXMoeCA9IGhpZ2h3YXkwOCwgeSA9IHllYXIpKSArCiAgICBnZW9tX3BvaW50KHBvc2l0aW9uID0gImppdHRlciIsIHNpemUgPSBzaXplLCBhbHBoYSA9IGFscGhhKSArCiAgICB5bGFiKE5VTEwpICsKICAgIHRobQpgYGAKCk92ZXIgdGltZSB0aGUgaGlnaHdheSBnYXMgbWlsZWFnZSBkaXN0cmlidXRpb25zIGFyZSBtb3ZpbmcgdXB3YXJkCmEgbGl0dGxlIGJpdCwgd2l0aCB0aGUgdXBwZXIgdGFpbHMgYmVjb21pbmcgZ3JhZHVhbGx5IGxvbmdlciBhbmQgYW4KaW5jcmVhc2luZyBudW1iZXIgb2YgdmVyeSBoaWdoIGVmZmljaWVuY3kgbW9kZWxzIChtb3N0bHkgZWxlY3RyaWMpLgoKPCEtLQpMb2NhbCBWYXJpYWJsZXM6IAptb2RlOiBwb2x5LW1hcmtkb3duK1IKbW9kZTogZmx5c3BlbGwKRW5kOgotLT4K