Climate scientists have measured the concentration of carbon dioxide
(CO2) in the Earth’s atmosphere dating back thousands of years. In this
project, we will investigate two datasets containing information about
the carbon dioxide levels in the atmosphere. We will specifically look
at the increase in carbon dioxide levels over the past hundred years
relative to the variability in levels of CO2 in the atmosphere over
eight millennia.
These data are calculated by analyzing ice cores. Over time, gas gets
trapped in the ice of Antarctica. Scientists can take samples of that
ice and see how much carbon is in it. The deeper you go into the ice,
the farther back in time you can analyze!
1.The first dataset comes from World Data Center for
Paleoclimatology, Boulder and NOAA Paleoclimatology Program and
describes the carbon dioxide levels back thousands of years “Before
Present” (BP) or before January 1, 1950.
2.The second dataset explores carbon dioxide starting at year zero up
until the recent year of 2014. This dataset was compiled by the
Institute for Atmospheric and Climate Science (IAC) at Eidgenössische
Technische Hochschule in Zürich, Switzerland.
In order to understand the information in these datasets, it’s
important to understand two key facts about the data:
The metric for carbon dioxide level is measured as parts per million
or CO2 ppmv. This number describes the number of carbon dioxide
molecules per one million gas molecules in our atmosphere.
The second metric describes years before present, which is “a time
scale used mainly in … scientific disciplines to specify when events
occurred in the past… standard practice is to use 1 January 1950 as the
commencement date of the age scale, reflecting the origin of practical
radiocarbon dating in the 1950s. The abbreviation “BP” has alternatively
been interpreted as “Before Physics” that is, before nuclear weapons
testing artificially altered the proportion of the carbon isotopes in
the atmosphere, making dating after that time likely to be unreliable.”
This means that saying “the year 20 BP” would be the equivalent of
saying “The year 1930.”
1.Carbon Dioxide over Time Line Graph
# load libraries and data
library(readr)
library(dplyr)
library(ggplot2)
1.Let’s first explore the dataset containing the data from the World
Data Center for Paleoclimatology, Boulder and NOAA Paleoclimatology
Program. Import the “carbon_dioxide_levels.csv” and save it to a new
variable named noaa_data.
noaa_data <- read_csv("carbon_dioxide_levels.csv")
noaa_data
2.Inspect the head of the data frame. What are the names of the two
columns? What types of values are in each?
head(noaa_data)
3.Let’s visualize this data. First, create a new variable named
noaa_viz that is equal to a new ggplot() object and assign noaa_data as
its data argument. Be sure to state the name of the variable after you
define it so that it is rendered to the R notebook.
options(scipen=10000) #removes scientific notation
#Create NOAA Visualization here:
noaa_viz <- ggplot(noaa_data)
noaa_viz

4.Define your scales by creating an aesthetic mapping that maps
Age_yrBP on the x-axis and CO2_ppmv on the y-axis as part of the
canvas.
noaa_viz <- ggplot(noaa_data, aes(x = Age_yrBP, y = CO2_ppmv))
noaa_viz

5.In climate science, it’s common to create line graphs to best
portray the fluctuations in the levels of carbon dioxide. Add a
geom_line() layer to the noaa_viz plot.
noaa_viz <- ggplot(noaa_data, aes(x = Age_yrBP, y = CO2_ppmv)) + geom_line()
noaa_viz

6.Let’s add context to the plot and improve its legibility. Title the
plot “Carbon Dioxide Levels From 8,000 to 136 Years BP” and add a
subtitle that cites the data “From World Data Center for
Paleoclimatology and NOAA Paleoclimatology Program”.
noaa_viz <- ggplot(noaa_data, aes(x = Age_yrBP, y = CO2_ppmv)) + geom_line() + labs(title = "Carbon Dioxide Levels From 8,000 to 136 Years BP", subtitle = "From World Data Center for Paleoclimatology and NOAA Paleoclimatology Program")
noaa_viz

7.Tweak the axis labels so they are more descriptive than the column
headers. The x-axis should read “Years Before Today (0=1950)” and the
y-axis should read “Carbon Dioxide Level (Parts Per Million)”
noaa_viz <- ggplot(noaa_data, aes(x = Age_yrBP, y = CO2_ppmv)) + geom_line() + labs(title = "Carbon Dioxide Levels From 8,000 to 136 Years BP", subtitle = "From World Data Center for Paleoclimatology and NOAA Paleoclimatology Program", x = "Years Before Today (0=1950)", y = "Carbon Dioxide Level (Parts Per Million)")
noaa_viz

8.Currently, the order of the years is counterintuitive. Since the
most recent date is the date closest to 0, or 1950 as Before Physics is
described, we want the years on the x-axis arranged in descending order.
Add this to noaa_viz:
noaa_viz + scale_x_reverse(lim=c(800000,0))

noaa_viz <- noaa_viz + scale_x_reverse(lim=c(800000,0))
noaa_viz

2.Carbon Dioxide Levels in the last Two Millennia
9.In the second code block, let’s explore the second dataset
containing the data for the last 2014 years. Import the “yearly_co2.csv”
file and save it to a new variable named iac_data.
#Create IAC Visualization
iac_data <- read_csv( "yearly_co2.csv")
iac_data
10.Inspect the head. What are the names of the four columns? What
types of values are in each? Note that the data_mean_global is an
equivalent metric to CO2_ppmv. We will not be using the other two
columns in this project. What’s different about the year column in this
dataset?
head(iac_data)
11.Again, let’s create a new ggplot() object named iac_viz and
associate iac_data as its data argument. Let’s make a new variable named
iac_viz. Be sure to state the name of the variable after you define it
so that it is rendered to the R notebook.
iac_viz <- ggplot(iac_data)
iac_viz

12.Define your scales by creating an aesthetic mapping that maps year
on the x-axis and data_mean_global on the y-axis as part of the
canvas.
Note: The dataset column headers are different than the ones in the
previous data frame. Years are chornological starting from 0 up to 2014,
not in terms of BP. The data_mean_global references the same metric as
C02_ppmv for carbon dioxide average parts per million in the earth’s
atmosphere.
iac_viz <- ggplot(iac_data, aes(x = year, y = data_mean_global))
iac_viz

13.A line graph also makes sense for these data. Let’s explore how
much carbon dioxide was stored in the atmosphere over the past two
millennia by adding a geom_line() layer to the iac_viz plot.
iac_viz <- iac_viz + geom_line()
iac_viz

14.This plot still needs labels to add context to the plot. Title the
plot “Carbon Dioxide Levels over Time” and add a subtitle that cites the
data “From Institute for Atmospheric and Climate Science (IAC).”
iac_viz <- iac_viz + labs(title = "Carbon Dioxide Levels over Time", subtitle = "From Institute for Atmospheric and Climate Science (IAC).")
iac_viz

15.Tweak the axis labels so they are more descriptive than the column
headers. The x-axis should read “Year” and the y-axis should read
“Carbon Dioxide Level (Parts Per Million)”
iac_viz <- iac_viz + labs(x = "year", y = "Carbon Dioxide Level (Parts Per Million)")
iac_viz

16.Let’s highlight the rise in carbon dioxide levels by adding a
horizontal line that represents the maximum level in the first chart
spanning over 8,000 years of carbon dioxide data. On a new line of code
in the block, create a new variable named millennia_max and retrieve the
maximum value of the CO2_ppmv column in the noaa_data. Print the value
so you can see what it is.
millennia_max <- max(noaa_data$CO2_ppmv, na.rm = TRUE)
millennia_max
[1] 298.6
17.Now that we have the maximum number in the noaa_data let’s map it
on our iac_data plot. There’s a geom in ggolot called geom_hline() that
plots a horizontal line. Add a geom_hline() layer to iac_viz that has a
yintercept value in its aesthetic mapping of millennia_max.
iac_viz <- iac_viz + geom_hline(yintercept = millennia_max)
iac_viz

18.Add one more argument to the horizontal line’s aesthetic mapping
so that the legend can display information about what the line
represents. Assign the value of the linetype argument as “Historical CO2
Peak before 1950”
What do you notice has happened in the last 100 years relative to the
last 8 millennia?
iac_viz <- iac_viz + geom_hline(aes(yintercept = millennia_max, linetype = "Historical CO2 Peak before 1950"))
iac_viz

19.Add color
iac_viz <- iac_viz + geom_hline(aes(yintercept = millennia_max, linetype = "Historical CO2 Peak before 1950", color = "Historical CO2 Peak before 1950"))
iac_viz

20.Change color
iac_viz <- iac_viz + scale_color_manual(values = c("Historical CO2 Peak before 1950" = "blue"))
iac_viz

LS0tDQp0aXRsZTogIlZpc3VhbGl6aW5nIENhcmJvbiBEaW94aWRlIExldmVscyINCmF1dGhvcjogIkFubmFiZWwgS3VvIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJVktJW0tJWQgJUg6JU0nKWAiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpDbGltYXRlIHNjaWVudGlzdHMgaGF2ZSBtZWFzdXJlZCB0aGUgY29uY2VudHJhdGlvbiBvZiBjYXJib24gZGlveGlkZSAoQ08yKSBpbiB0aGUgRWFydGjigJlzIGF0bW9zcGhlcmUgZGF0aW5nIGJhY2sgdGhvdXNhbmRzIG9mIHllYXJzLiBJbiB0aGlzIHByb2plY3QsIHdlIHdpbGwgaW52ZXN0aWdhdGUgdHdvIGRhdGFzZXRzIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNhcmJvbiBkaW94aWRlIGxldmVscyBpbiB0aGUgYXRtb3NwaGVyZS4gV2Ugd2lsbCBzcGVjaWZpY2FsbHkgbG9vayBhdCB0aGUgaW5jcmVhc2UgaW4gY2FyYm9uIGRpb3hpZGUgbGV2ZWxzIG92ZXIgdGhlIHBhc3QgaHVuZHJlZCB5ZWFycyByZWxhdGl2ZSB0byB0aGUgdmFyaWFiaWxpdHkgaW4gbGV2ZWxzIG9mIENPMiBpbiB0aGUgYXRtb3NwaGVyZSBvdmVyIGVpZ2h0IG1pbGxlbm5pYS4NCg0KVGhlc2UgZGF0YSBhcmUgY2FsY3VsYXRlZCBieSBhbmFseXppbmcgaWNlIGNvcmVzLiBPdmVyIHRpbWUsIGdhcyBnZXRzIHRyYXBwZWQgaW4gdGhlIGljZSBvZiBBbnRhcmN0aWNhLiBTY2llbnRpc3RzIGNhbiB0YWtlIHNhbXBsZXMgb2YgdGhhdCBpY2UgYW5kIHNlZSBob3cgbXVjaCBjYXJib24gaXMgaW4gaXQuIFRoZSBkZWVwZXIgeW91IGdvIGludG8gdGhlIGljZSwgdGhlIGZhcnRoZXIgYmFjayBpbiB0aW1lIHlvdSBjYW4gYW5hbHl6ZSENCg0KMS5UaGUgZmlyc3QgZGF0YXNldCBjb21lcyBmcm9tIFdvcmxkIERhdGEgQ2VudGVyIGZvciBQYWxlb2NsaW1hdG9sb2d5LCBCb3VsZGVyIGFuZCBOT0FBIFBhbGVvY2xpbWF0b2xvZ3kgUHJvZ3JhbSBhbmQgZGVzY3JpYmVzIHRoZSBjYXJib24gZGlveGlkZSBsZXZlbHMgYmFjayB0aG91c2FuZHMgb2YgeWVhcnMg4oCcQmVmb3JlIFByZXNlbnTigJ0gKEJQKSBvciBiZWZvcmUgSmFudWFyeSAxLCAxOTUwLg0KDQoyLlRoZSBzZWNvbmQgZGF0YXNldCBleHBsb3JlcyBjYXJib24gZGlveGlkZSBzdGFydGluZyBhdCB5ZWFyIHplcm8gdXAgdW50aWwgdGhlIHJlY2VudCB5ZWFyIG9mIDIwMTQuIFRoaXMgZGF0YXNldCB3YXMgY29tcGlsZWQgYnkgdGhlIEluc3RpdHV0ZSBmb3IgQXRtb3NwaGVyaWMgYW5kIENsaW1hdGUgU2NpZW5jZSAoSUFDKSBhdCBFaWRnZW7DtnNzaXNjaGUgVGVjaG5pc2NoZSBIb2Noc2NodWxlIGluIFrDvHJpY2gsIFN3aXR6ZXJsYW5kLg0KDQpJbiBvcmRlciB0byB1bmRlcnN0YW5kIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGVzZSBkYXRhc2V0cywgaXTigJlzIGltcG9ydGFudCB0byB1bmRlcnN0YW5kIHR3byBrZXkgZmFjdHMgYWJvdXQgdGhlIGRhdGE6DQoNClRoZSBtZXRyaWMgZm9yIGNhcmJvbiBkaW94aWRlIGxldmVsIGlzIG1lYXN1cmVkIGFzIHBhcnRzIHBlciBtaWxsaW9uIG9yIENPMiBwcG12LiBUaGlzIG51bWJlciBkZXNjcmliZXMgdGhlIG51bWJlciBvZiBjYXJib24gZGlveGlkZSBtb2xlY3VsZXMgcGVyIG9uZSBtaWxsaW9uIGdhcyBtb2xlY3VsZXMgaW4gb3VyIGF0bW9zcGhlcmUuDQoNClRoZSBzZWNvbmQgbWV0cmljIGRlc2NyaWJlcyB5ZWFycyBiZWZvcmUgcHJlc2VudCwgd2hpY2ggaXMg4oCcYSB0aW1lIHNjYWxlIHVzZWQgbWFpbmx5IGluIOKApiBzY2llbnRpZmljIGRpc2NpcGxpbmVzIHRvIHNwZWNpZnkgd2hlbiBldmVudHMgb2NjdXJyZWQgaW4gdGhlIHBhc3TigKYgc3RhbmRhcmQgcHJhY3RpY2UgaXMgdG8gdXNlIDEgSmFudWFyeSAxOTUwIGFzIHRoZSBjb21tZW5jZW1lbnQgZGF0ZSBvZiB0aGUgYWdlIHNjYWxlLCByZWZsZWN0aW5nIHRoZSBvcmlnaW4gb2YgcHJhY3RpY2FsIHJhZGlvY2FyYm9uIGRhdGluZyBpbiB0aGUgMTk1MHMuIFRoZSBhYmJyZXZpYXRpb24g4oCcQlDigJ0gaGFzIGFsdGVybmF0aXZlbHkgYmVlbiBpbnRlcnByZXRlZCBhcyDigJxCZWZvcmUgUGh5c2ljc+KAnSB0aGF0IGlzLCBiZWZvcmUgbnVjbGVhciB3ZWFwb25zIHRlc3RpbmcgYXJ0aWZpY2lhbGx5IGFsdGVyZWQgdGhlIHByb3BvcnRpb24gb2YgdGhlIGNhcmJvbiBpc290b3BlcyBpbiB0aGUgYXRtb3NwaGVyZSwgbWFraW5nIGRhdGluZyBhZnRlciB0aGF0IHRpbWUgbGlrZWx5IHRvIGJlIHVucmVsaWFibGUu4oCdIFRoaXMgbWVhbnMgdGhhdCBzYXlpbmcg4oCcdGhlIHllYXIgMjAgQlDigJ0gd291bGQgYmUgdGhlIGVxdWl2YWxlbnQgb2Ygc2F5aW5nIOKAnFRoZSB5ZWFyIDE5MzAu4oCdDQoNCiMgMS5DYXJib24gRGlveGlkZSBvdmVyIFRpbWUgTGluZSBHcmFwaA0KDQoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVycm9yPVRSVUV9DQojIGxvYWQgbGlicmFyaWVzIGFuZCBkYXRhDQpsaWJyYXJ5KHJlYWRyKQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQoxLkxldOKAmXMgZmlyc3QgZXhwbG9yZSB0aGUgZGF0YXNldCBjb250YWluaW5nIHRoZSBkYXRhIGZyb20gdGhlIFdvcmxkIERhdGEgQ2VudGVyIGZvciBQYWxlb2NsaW1hdG9sb2d5LCBCb3VsZGVyIGFuZCBOT0FBIFBhbGVvY2xpbWF0b2xvZ3kgUHJvZ3JhbS4gSW1wb3J0IHRoZSAiY2FyYm9uX2Rpb3hpZGVfbGV2ZWxzLmNzdiIgYW5kIHNhdmUgaXQgdG8gYSBuZXcgdmFyaWFibGUgbmFtZWQgbm9hYV9kYXRhLg0KDQpgYGB7Un0NCm5vYWFfZGF0YSA8LSByZWFkX2NzdigiY2FyYm9uX2Rpb3hpZGVfbGV2ZWxzLmNzdiIpDQpub2FhX2RhdGENCmBgYA0KDQoyLkluc3BlY3QgdGhlIGhlYWQgb2YgdGhlIGRhdGEgZnJhbWUuIFdoYXQgYXJlIHRoZSBuYW1lcyBvZiB0aGUgdHdvIGNvbHVtbnM/IFdoYXQgdHlwZXMgb2YgdmFsdWVzIGFyZSBpbiBlYWNoPw0KYGBge3J9DQpoZWFkKG5vYWFfZGF0YSkNCmBgYA0KDQozLkxldOKAmXMgdmlzdWFsaXplIHRoaXMgZGF0YS4gRmlyc3QsIGNyZWF0ZSBhIG5ldyB2YXJpYWJsZSBuYW1lZCBub2FhX3ZpeiB0aGF0IGlzIGVxdWFsIHRvIGEgbmV3IGdncGxvdCgpIG9iamVjdCBhbmQgYXNzaWduIG5vYWFfZGF0YSBhcyBpdHMgZGF0YSBhcmd1bWVudC4gQmUgc3VyZSB0byBzdGF0ZSB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgYWZ0ZXIgeW91IGRlZmluZSBpdCBzbyB0aGF0IGl0IGlzIHJlbmRlcmVkIHRvIHRoZSBSIG5vdGVib29rLg0KDQpgYGB7ciBlcnJvcj1UUlVFfQ0Kb3B0aW9ucyhzY2lwZW49MTAwMDApICNyZW1vdmVzIHNjaWVudGlmaWMgbm90YXRpb24NCiNDcmVhdGUgTk9BQSBWaXN1YWxpemF0aW9uIGhlcmU6DQpub2FhX3ZpeiA8LSBnZ3Bsb3Qobm9hYV9kYXRhKQ0Kbm9hYV92aXoNCmBgYA0KDQo0LkRlZmluZSB5b3VyIHNjYWxlcyBieSBjcmVhdGluZyBhbiBhZXN0aGV0aWMgbWFwcGluZyB0aGF0IG1hcHMgQWdlX3lyQlAgb24gdGhlIHgtYXhpcyBhbmQgQ08yX3BwbXYgb24gdGhlIHktYXhpcyBhcyBwYXJ0IG9mIHRoZSBjYW52YXMuDQoNCmBgYHtyfQ0Kbm9hYV92aXogPC0gZ2dwbG90KG5vYWFfZGF0YSwgYWVzKHggPSBBZ2VfeXJCUCwgeSA9IENPMl9wcG12KSkNCm5vYWFfdml6DQpgYGANCg0KNS5JbiBjbGltYXRlIHNjaWVuY2UsIGl04oCZcyBjb21tb24gdG8gY3JlYXRlIGxpbmUgZ3JhcGhzIHRvIGJlc3QgcG9ydHJheSB0aGUgZmx1Y3R1YXRpb25zIGluIHRoZSBsZXZlbHMgb2YgY2FyYm9uIGRpb3hpZGUuIEFkZCBhIGdlb21fbGluZSgpIGxheWVyIHRvIHRoZSBub2FhX3ZpeiBwbG90Lg0KDQpgYGB7cn0NCg0Kbm9hYV92aXogPC0gZ2dwbG90KG5vYWFfZGF0YSwgYWVzKHggPSBBZ2VfeXJCUCwgeSA9IENPMl9wcG12KSkgKyBnZW9tX2xpbmUoKQ0Kbm9hYV92aXoNCmBgYA0KDQo2LkxldOKAmXMgYWRkIGNvbnRleHQgdG8gdGhlIHBsb3QgYW5kIGltcHJvdmUgaXRzIGxlZ2liaWxpdHkuIFRpdGxlIHRoZSBwbG90ICJDYXJib24gRGlveGlkZSBMZXZlbHMgRnJvbSA4LDAwMCB0byAxMzYgWWVhcnMgQlAiIGFuZCBhZGQgYSBzdWJ0aXRsZSB0aGF0IGNpdGVzIHRoZSBkYXRhICJGcm9tIFdvcmxkIERhdGEgQ2VudGVyIGZvciBQYWxlb2NsaW1hdG9sb2d5IGFuZCBOT0FBIFBhbGVvY2xpbWF0b2xvZ3kgUHJvZ3JhbSIuDQoNCmBgYHtSfQ0Kbm9hYV92aXogPC0gZ2dwbG90KG5vYWFfZGF0YSwgYWVzKHggPSBBZ2VfeXJCUCwgeSA9IENPMl9wcG12KSkgKyBnZW9tX2xpbmUoKSArIGxhYnModGl0bGUgPSAgIkNhcmJvbiBEaW94aWRlIExldmVscyBGcm9tIDgsMDAwIHRvIDEzNiBZZWFycyBCUCIsIHN1YnRpdGxlID0gICJGcm9tIFdvcmxkIERhdGEgQ2VudGVyIGZvciBQYWxlb2NsaW1hdG9sb2d5IGFuZCBOT0FBIFBhbGVvY2xpbWF0b2xvZ3kgUHJvZ3JhbSIpDQoNCm5vYWFfdml6DQpgYGANCg0KNy5Ud2VhayB0aGUgYXhpcyBsYWJlbHMgc28gdGhleSBhcmUgbW9yZSBkZXNjcmlwdGl2ZSB0aGFuIHRoZSBjb2x1bW4gaGVhZGVycy4gVGhlIHgtYXhpcyBzaG91bGQgcmVhZCAiWWVhcnMgQmVmb3JlIFRvZGF5ICgwPTE5NTApIiBhbmQgdGhlIHktYXhpcyBzaG91bGQgcmVhZCAiQ2FyYm9uIERpb3hpZGUgTGV2ZWwgKFBhcnRzIFBlciBNaWxsaW9uKSINCg0KYGBge1J9DQpub2FhX3ZpeiA8LSBnZ3Bsb3Qobm9hYV9kYXRhLCBhZXMoeCA9IEFnZV95ckJQLCB5ID0gQ08yX3BwbXYpKSArIGdlb21fbGluZSgpICsgbGFicyh0aXRsZSA9ICAiQ2FyYm9uIERpb3hpZGUgTGV2ZWxzIEZyb20gOCwwMDAgdG8gMTM2IFllYXJzIEJQIiwgc3VidGl0bGUgPSAgIkZyb20gV29ybGQgRGF0YSBDZW50ZXIgZm9yIFBhbGVvY2xpbWF0b2xvZ3kgYW5kIE5PQUEgUGFsZW9jbGltYXRvbG9neSBQcm9ncmFtIiwgeCA9ICJZZWFycyBCZWZvcmUgVG9kYXkgKDA9MTk1MCkiLCB5ID0gIkNhcmJvbiBEaW94aWRlIExldmVsIChQYXJ0cyBQZXIgTWlsbGlvbikiKQ0KDQpub2FhX3Zpeg0KYGBgDQoNCjguQ3VycmVudGx5LCB0aGUgb3JkZXIgb2YgdGhlIHllYXJzIGlzIGNvdW50ZXJpbnR1aXRpdmUuIFNpbmNlIHRoZSBtb3N0IHJlY2VudCBkYXRlIGlzIHRoZSBkYXRlIGNsb3Nlc3QgdG8gMCwgb3IgMTk1MCBhcyBCZWZvcmUgUGh5c2ljcyBpcyBkZXNjcmliZWQsIHdlIHdhbnQgdGhlIHllYXJzIG9uIHRoZSB4LWF4aXMgYXJyYW5nZWQgaW4gZGVzY2VuZGluZyBvcmRlci4gQWRkIHRoaXMgdG8gbm9hYV92aXo6DQpgYGB7cn0NCm5vYWFfdml6ICsgc2NhbGVfeF9yZXZlcnNlKGxpbT1jKDgwMDAwMCwwKSkgDQoNCmBgYA0KYGBge1J9DQpub2FhX3ZpeiA8LSBub2FhX3ZpeiArIHNjYWxlX3hfcmV2ZXJzZShsaW09Yyg4MDAwMDAsMCkpIA0KDQpub2FhX3Zpeg0KYGBgDQoNCiMgMi5DYXJib24gRGlveGlkZSBMZXZlbHMgaW4gdGhlIGxhc3QgVHdvIE1pbGxlbm5pYQ0KDQo5LkluIHRoZSBzZWNvbmQgY29kZSBibG9jaywgbGV04oCZcyBleHBsb3JlIHRoZSBzZWNvbmQgZGF0YXNldCBjb250YWluaW5nIHRoZSBkYXRhIGZvciB0aGUgbGFzdCAyMDE0IHllYXJzLiBJbXBvcnQgdGhlICJ5ZWFybHlfY28yLmNzdiIgZmlsZSBhbmQgc2F2ZSBpdCB0byBhIG5ldyB2YXJpYWJsZSBuYW1lZCBpYWNfZGF0YS4NCg0KYGBge3IgbWVzc2FnZT1GQUxTRSwgZXJyb3I9VFJVRX0NCiNDcmVhdGUgSUFDIFZpc3VhbGl6YXRpb24NCmlhY19kYXRhIDwtIHJlYWRfY3N2KCAieWVhcmx5X2NvMi5jc3YiKQ0KaWFjX2RhdGENCmBgYA0KDQoxMC5JbnNwZWN0IHRoZSBoZWFkLiBXaGF0IGFyZSB0aGUgbmFtZXMgb2YgdGhlIGZvdXIgY29sdW1ucz8gV2hhdCB0eXBlcyBvZiB2YWx1ZXMgYXJlIGluIGVhY2g/IE5vdGUgdGhhdCB0aGUgZGF0YV9tZWFuX2dsb2JhbCBpcyBhbiBlcXVpdmFsZW50IG1ldHJpYyB0byBDTzJfcHBtdi4gV2Ugd2lsbCBub3QgYmUgdXNpbmcgdGhlIG90aGVyIHR3byBjb2x1bW5zIGluIHRoaXMgcHJvamVjdC4gV2hhdOKAmXMgZGlmZmVyZW50IGFib3V0IHRoZSB5ZWFyIGNvbHVtbiBpbiB0aGlzIGRhdGFzZXQ/DQoNCmBgYHtyfQ0KaGVhZChpYWNfZGF0YSkNCmBgYA0KDQoxMS5BZ2FpbiwgbGV04oCZcyBjcmVhdGUgYSBuZXcgZ2dwbG90KCkgb2JqZWN0IG5hbWVkIGlhY192aXogYW5kIGFzc29jaWF0ZSBpYWNfZGF0YSBhcyBpdHMgZGF0YSBhcmd1bWVudC4gTGV04oCZcyBtYWtlIGEgbmV3IHZhcmlhYmxlIG5hbWVkIGlhY192aXouIEJlIHN1cmUgdG8gc3RhdGUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGFmdGVyIHlvdSBkZWZpbmUgaXQgc28gdGhhdCBpdCBpcyByZW5kZXJlZCB0byB0aGUgUiBub3RlYm9vay4NCg0KYGBge1J9DQppYWNfdml6IDwtIGdncGxvdChpYWNfZGF0YSkNCmlhY192aXoNCmBgYA0KDQoxMi5EZWZpbmUgeW91ciBzY2FsZXMgYnkgY3JlYXRpbmcgYW4gYWVzdGhldGljIG1hcHBpbmcgdGhhdCBtYXBzIHllYXIgb24gdGhlIHgtYXhpcyBhbmQgZGF0YV9tZWFuX2dsb2JhbCBvbiB0aGUgeS1heGlzIGFzIHBhcnQgb2YgdGhlIGNhbnZhcy4NCg0KTm90ZTogVGhlIGRhdGFzZXQgY29sdW1uIGhlYWRlcnMgYXJlIGRpZmZlcmVudCB0aGFuIHRoZSBvbmVzIGluIHRoZSBwcmV2aW91cyBkYXRhIGZyYW1lLiBZZWFycyBhcmUgY2hvcm5vbG9naWNhbCBzdGFydGluZyBmcm9tIDAgdXAgdG8gMjAxNCwgbm90IGluIHRlcm1zIG9mIEJQLiBUaGUgZGF0YV9tZWFuX2dsb2JhbCByZWZlcmVuY2VzIHRoZSBzYW1lIG1ldHJpYyBhcyBDMDJfcHBtdiBmb3IgY2FyYm9uIGRpb3hpZGUgYXZlcmFnZSBwYXJ0cyBwZXIgbWlsbGlvbiBpbiB0aGUgZWFydGjigJlzIGF0bW9zcGhlcmUuDQoNCmBgYHtSfQ0KaWFjX3ZpeiA8LSBnZ3Bsb3QoaWFjX2RhdGEsIGFlcyh4ID0geWVhciwgeSA9IGRhdGFfbWVhbl9nbG9iYWwpKQ0KaWFjX3Zpeg0KYGBgDQoNCjEzLkEgbGluZSBncmFwaCBhbHNvIG1ha2VzIHNlbnNlIGZvciB0aGVzZSBkYXRhLiBMZXTigJlzIGV4cGxvcmUgaG93IG11Y2ggY2FyYm9uIGRpb3hpZGUgd2FzIHN0b3JlZCBpbiB0aGUgYXRtb3NwaGVyZSBvdmVyIHRoZSBwYXN0IHR3byBtaWxsZW5uaWEgYnkgYWRkaW5nIGEgZ2VvbV9saW5lKCkgbGF5ZXIgdG8gdGhlIGlhY192aXogcGxvdC4NCg0KYGBge3J9DQppYWNfdml6IDwtIGlhY192aXogKyBnZW9tX2xpbmUoKQ0KaWFjX3Zpeg0KYGBgDQoNCjE0LlRoaXMgcGxvdCBzdGlsbCBuZWVkcyBsYWJlbHMgdG8gYWRkIGNvbnRleHQgdG8gdGhlIHBsb3QuIFRpdGxlIHRoZSBwbG90ICJDYXJib24gRGlveGlkZSBMZXZlbHMgb3ZlciBUaW1lIiBhbmQgYWRkIGEgc3VidGl0bGUgdGhhdCBjaXRlcyB0aGUgZGF0YSAiRnJvbSBJbnN0aXR1dGUgZm9yIEF0bW9zcGhlcmljIGFuZCBDbGltYXRlIFNjaWVuY2UgKElBQykuIg0KDQpgYGB7cn0NCmlhY192aXogPC0gaWFjX3ZpeiArIGxhYnModGl0bGUgPSAiQ2FyYm9uIERpb3hpZGUgTGV2ZWxzIG92ZXIgVGltZSIsIHN1YnRpdGxlID0gIkZyb20gSW5zdGl0dXRlIGZvciBBdG1vc3BoZXJpYyBhbmQgQ2xpbWF0ZSBTY2llbmNlIChJQUMpLiIpDQppYWNfdml6DQpgYGANCg0KMTUuVHdlYWsgdGhlIGF4aXMgbGFiZWxzIHNvIHRoZXkgYXJlIG1vcmUgZGVzY3JpcHRpdmUgdGhhbiB0aGUgY29sdW1uIGhlYWRlcnMuIFRoZSB4LWF4aXMgc2hvdWxkIHJlYWQgIlllYXIiIGFuZCB0aGUgeS1heGlzIHNob3VsZCByZWFkICJDYXJib24gRGlveGlkZSBMZXZlbCAoUGFydHMgUGVyIE1pbGxpb24pIg0KDQpgYGB7cn0NCmlhY192aXogPC0gaWFjX3ZpeiArIGxhYnMoeCA9ICJ5ZWFyIiwgeSA9ICJDYXJib24gRGlveGlkZSBMZXZlbCAoUGFydHMgUGVyIE1pbGxpb24pIikNCmlhY192aXoNCmBgYA0KDQoxNi5MZXTigJlzIGhpZ2hsaWdodCB0aGUgcmlzZSBpbiBjYXJib24gZGlveGlkZSBsZXZlbHMgYnkgYWRkaW5nIGEgaG9yaXpvbnRhbCBsaW5lIHRoYXQgcmVwcmVzZW50cyB0aGUgbWF4aW11bSBsZXZlbCBpbiB0aGUgZmlyc3QgY2hhcnQgc3Bhbm5pbmcgb3ZlciA4LDAwMCB5ZWFycyBvZiBjYXJib24gZGlveGlkZSBkYXRhLiBPbiBhIG5ldyBsaW5lIG9mIGNvZGUgaW4gdGhlIGJsb2NrLCBjcmVhdGUgYSBuZXcgdmFyaWFibGUgbmFtZWQgbWlsbGVubmlhX21heCBhbmQgcmV0cmlldmUgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIENPMl9wcG12IGNvbHVtbiBpbiB0aGUgbm9hYV9kYXRhLiBQcmludCB0aGUgdmFsdWUgc28geW91IGNhbiBzZWUgd2hhdCBpdCBpcy4NCg0KYGBge3J9DQptaWxsZW5uaWFfbWF4IDwtIG1heChub2FhX2RhdGEkQ08yX3BwbXYsIG5hLnJtID0gVFJVRSkNCg0KbWlsbGVubmlhX21heA0KYGBgDQoNCjE3Lk5vdyB0aGF0IHdlIGhhdmUgdGhlIG1heGltdW0gbnVtYmVyIGluIHRoZSBub2FhX2RhdGEgbGV04oCZcyBtYXAgaXQgb24gb3VyIGlhY19kYXRhIHBsb3QuIFRoZXJl4oCZcyBhIGdlb20gaW4gZ2dvbG90IGNhbGxlZCBnZW9tX2hsaW5lKCkgdGhhdCBwbG90cyBhIGhvcml6b250YWwgbGluZS4gQWRkIGEgZ2VvbV9obGluZSgpIGxheWVyIHRvIGlhY192aXogdGhhdCBoYXMgYSB5aW50ZXJjZXB0IHZhbHVlIGluIGl0cyBhZXN0aGV0aWMgbWFwcGluZyBvZiBtaWxsZW5uaWFfbWF4Lg0KDQpgYGB7cn0NCmlhY192aXogPC0gaWFjX3ZpeiArIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1pbGxlbm5pYV9tYXgpDQoNCmlhY192aXoNCmBgYA0KDQoxOC5BZGQgb25lIG1vcmUgYXJndW1lbnQgdG8gdGhlIGhvcml6b250YWwgbGluZeKAmXMgYWVzdGhldGljIG1hcHBpbmcgc28gdGhhdCB0aGUgbGVnZW5kIGNhbiBkaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHdoYXQgdGhlIGxpbmUgcmVwcmVzZW50cy4gQXNzaWduIHRoZSB2YWx1ZSBvZiB0aGUgbGluZXR5cGUgYXJndW1lbnQgYXMgIkhpc3RvcmljYWwgQ08yIFBlYWsgYmVmb3JlIDE5NTAiDQoNCldoYXQgZG8geW91IG5vdGljZSBoYXMgaGFwcGVuZWQgaW4gdGhlIGxhc3QgMTAwIHllYXJzIHJlbGF0aXZlIHRvIHRoZSBsYXN0IDggbWlsbGVubmlhPw0KYGBge3J9DQppYWNfdml6IDwtIGlhY192aXogKyBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWlsbGVubmlhX21heCwgbGluZXR5cGUgPSAiSGlzdG9yaWNhbCBDTzIgUGVhayBiZWZvcmUgMTk1MCIpKSANCg0KaWFjX3Zpeg0KYGBgDQoNCjE5LkFkZCBjb2xvcg0KDQpgYGB7cn0NCmlhY192aXogPC0gaWFjX3ZpeiArIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSBtaWxsZW5uaWFfbWF4LCBsaW5ldHlwZSA9ICJIaXN0b3JpY2FsIENPMiBQZWFrIGJlZm9yZSAxOTUwIiwgY29sb3IgPSAiSGlzdG9yaWNhbCBDTzIgUGVhayBiZWZvcmUgMTk1MCIpKSAgDQoNCmlhY192aXoNCmBgYA0KMjAuQ2hhbmdlIGNvbG9yDQpgYGB7cn0NCmlhY192aXogPC0gaWFjX3ZpeiAgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiSGlzdG9yaWNhbCBDTzIgUGVhayBiZWZvcmUgMTk1MCIgPSAiYmx1ZSIpKSANCmlhY192aXoNCmBgYA0KDQo=