install.packages("ggplot2")
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/ggplot2_4.0.2.tar.gz'
Content type 'application/x-gzip' length 8482095 bytes (8.1 MB)
==================================================
downloaded 8.1 MB
The downloaded source packages are in
‘/tmp/Rtmp5tmGZT/downloaded_packages’
install.packages("dplyr")
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/dplyr_1.2.1.tar.gz'
Content type 'application/x-gzip' length 1521233 bytes (1.5 MB)
==================================================
downloaded 1.5 MB
The downloaded source packages are in
‘/tmp/Rtmp5tmGZT/downloaded_packages’
install.packages("GGally")
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/patchwork_1.3.2.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/ggstats_0.13.0.tar.gz'
trying URL 'http://rspm/default/__linux__/noble/latest/src/contrib/GGally_2.4.0.tar.gz'
The downloaded source packages are in
‘/tmp/Rtmp5tmGZT/downloaded_packages’
# Infection Data Visualizations in R
# Create the data frame
Infections <- c(245, 215, 2076, 5023, 189, 195, 123, 116, 3298, 430, 502, 126, 112, 67, 52, 39, 54, 2356, 6781, 120, 2389, 279, 257, 290, 234, 5689, 261, 672, 205)
ufo2010 <- c(2, 6, 2, 59, 0, 1, 1, 0, 115, 0, 0, 0, 0, 0, 0, 0, 6, 4, 2, 7, 2, 9, 2, 29, 10, 169, 1, 40, 16)
pop <- c(25101, 61912, 33341, 409061, 7481, 18675, 25581, 22286, 459598, 3915, 67197, 34365, 3911, 32122, 31459, 2311, 28350, 101482, 19005, 20679, 36745, 162812, 15927, 251417, 153920, 1554720, 16148, 305455, 37276)
df <- data.frame(infections, ufo2010, pop)
# Load necessary libraries
library(ggplot2)
library(dplyr)
# --- 1. Bar Graph: Comparing Infections and UFO Sightings ---
ggplot(df, aes(x = 1:nrow(df))) +
geom_bar(aes(y = infections, fill = "Infections"), stat = "identity", position = "dodge") +
geom_bar(aes(y = ufo2010, fill = "UFO Sightings (2010)"), stat = "identity", position = "dodge", alpha = 0.7) +
scale_fill_manual("Variables", values = c("Infections" = "skyblue", "UFO Sightings (2010)" = "salmon")) +
labs(x = "Data Point Index", y = "Count", title = "Comparison of Infections and UFO Sightings") +
theme_minimal() +
theme(legend.position = "top")

# Observation: This bar graph compares the number of infections and UFO sightings for each
# data point. The scale of infections is significantly higher than UFO sightings in most cases.
# There are few instances where UFO sightings are non-zero, but their counts are low relative
# to the infection numbers.
# --- 2. Line Chart: Trends in Infections and Population ---
ggplot(df, aes(x = 1:nrow(df))) +
geom_line(aes(y = infections, color = "Infections"), linewidth = 1) +
geom_line(aes(y = pop, color = "Population"), linewidth = 1, linetype = "dashed") +
scale_color_manual("Variables", values = c("Infections" = "green", "Population" = "purple")) +
labs(x = "Data Point Index", y = "Count", title = "Trends in Infections and Population") +
theme_minimal() +
theme(legend.position = "top")

# Observation: This line chart shows the trends of infections and population across the data points.
# The population values are on a much larger scale than infection counts, making it difficult to
# observe detailed changes in infections on the same plot. However, we can see the overall
# fluctuations of both variables.
# --- 3. Scatter Plot: Relationship between Population and Infections ---
ggplot(df, aes(x = pop, y = infections)) +
geom_point(color = "blue", alpha = 0.6) +
labs(x = "Population", y = "Number of Infections", title = "Relationship between Population and Number of Infections") +
theme_minimal()

# Observation: This scatter plot explores the relationship between population size and the number
# of infections. There doesn't appear to be a strong linear correlation. While some high-population
# areas have high infection counts, this is not consistently the case.
# --- 4. Box Plot: Distribution of Infections ---
ggplot(df, aes(y = infections)) +
geom_boxplot(fill = "lightcoral") +
labs(y = "Number of Infections", title = "Distribution of Number of Infections") +
theme_minimal()

# Observation: This box plot summarizes the distribution of the 'infections' variable. It shows the
# median, quartiles, and potential outliers. The plot indicates that the majority of infection
# counts are relatively low, with some higher values identified as outliers.
# --- 5. Histogram: Frequency Distribution of UFO Sightings ---
ggplot(df, aes(x = ufo2010)) +
geom_histogram(binwidth = 5, fill = "orange", color = "black", alpha = 0.7) +
labs(x = "Number of UFO Sightings (2010)", y = "Frequency", title = "Frequency Distribution of UFO Sightings (2010)") +
theme_minimal()

# Observation: This histogram shows the frequency distribution of UFO sightings in 2010. The
# distribution is heavily skewed towards zero, indicating that most data points have very few or
# no reported UFO sightings.
# --- 6. Scatter Plot: Relationship between Population and UFO Sightings ---
ggplot(df, aes(x = pop, y = ufo2010)) +
geom_point(color = "purple", alpha = 0.6) +
labs(x = "Population", y = "Number of UFO Sightings (2010)", title = "Relationship between Population and UFO Sightings (2010)") +
theme_minimal()

# Observation: This scatter plot examines the relationship between population size and the number
# of UFO sightings. There doesn't seem to be a clear linear relationship between these two variables.
# --- 7. Scatter Plot: Infections vs. UFOs with Population Size ---
ggplot(df, aes(x = ufo2010, y = infections, size = pop)) +
geom_point(alpha = 0.6, color = "maroon") +
scale_size_continuous(name = "Population Size") +
labs(x = "Number of UFO Sightings (2010)", y = "Number of Infections", title = "Infections vs. UFO Sightings, Size by Population") +
theme_minimal()

# Observation: This scatter plot shows the relationship between infections and UFO sightings, with
# the size of each point representing the population size. It helps to visualize if areas with higher
# infections or UFO sightings also tend to have larger populations. No strong pattern is immediately
# apparent.
# --- 8. Pair Plot: Overview of Relationships ---
library(GGally)
ggpairs(df) +
ggtitle("Pair Plot of Infections, UFO Sightings, and Population") +
theme_minimal()

# Observation: The pair plot provides a matrix of scatter plots for each pair of variables and
# density plots for the distribution of each individual variable. This gives a quick overview of
# potential linear relationships and the shape of the distributions. The distributions of
# infections and UFO sightings appear skewed, and the scatter plots reiterate the lack of strong
# linear correlations observed in the individual plots.
LS0tCnRpdGxlOiAiQXNzaWdubWVudCA0IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9Cmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiKQpgYGAKCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJkcGx5ciIpCmBgYAoKCmBgYHtyfQppbnN0YWxsLnBhY2thZ2VzKCJHR2FsbHkiKQpgYGAKCgpgYGB7cn0KIyBJbmZlY3Rpb24gRGF0YSBWaXN1YWxpemF0aW9ucyBpbiBSCgojIENyZWF0ZSB0aGUgZGF0YSBmcmFtZQpJbmZlY3Rpb25zIDwtIGMoMjQ1LCAyMTUsIDIwNzYsIDUwMjMsIDE4OSwgMTk1LCAxMjMsIDExNiwgMzI5OCwgNDMwLCA1MDIsIDEyNiwgMTEyLCA2NywgNTIsIDM5LCA1NCwgMjM1NiwgNjc4MSwgMTIwLCAyMzg5LCAyNzksIDI1NywgMjkwLCAyMzQsIDU2ODksIDI2MSwgNjcyLCAyMDUpCnVmbzIwMTAgPC0gYygyLCA2LCAyLCA1OSwgMCwgMSwgMSwgMCwgMTE1LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA2LCA0LCAyLCA3LCAyLCA5LCAyLCAyOSwgMTAsIDE2OSwgMSwgNDAsIDE2KQpwb3AgPC0gYygyNTEwMSwgNjE5MTIsIDMzMzQxLCA0MDkwNjEsIDc0ODEsIDE4Njc1LCAyNTU4MSwgMjIyODYsIDQ1OTU5OCwgMzkxNSwgNjcxOTcsIDM0MzY1LCAzOTExLCAzMjEyMiwgMzE0NTksIDIzMTEsIDI4MzUwLCAxMDE0ODIsIDE5MDA1LCAyMDY3OSwgMzY3NDUsIDE2MjgxMiwgMTU5MjcsIDI1MTQxNywgMTUzOTIwLCAxNTU0NzIwLCAxNjE0OCwgMzA1NDU1LCAzNzI3NikKYGBgCgoKYGBge3J9CmRmIDwtIGRhdGEuZnJhbWUoaW5mZWN0aW9ucywgdWZvMjAxMCwgcG9wKQoKIyBMb2FkIG5lY2Vzc2FyeSBsaWJyYXJpZXMKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KGRwbHlyKQpgYGAKCgpgYGB7cn0KIyAtLS0gMS4gQmFyIEdyYXBoOiBDb21wYXJpbmcgSW5mZWN0aW9ucyBhbmQgVUZPIFNpZ2h0aW5ncyAtLS0KZ2dwbG90KGRmLCBhZXMoeCA9IDE6bnJvdyhkZikpKSArCiAgZ2VvbV9iYXIoYWVzKHkgPSBpbmZlY3Rpb25zLCBmaWxsID0gIkluZmVjdGlvbnMiKSwgc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdlb21fYmFyKGFlcyh5ID0gdWZvMjAxMCwgZmlsbCA9ICJVRk8gU2lnaHRpbmdzICgyMDEwKSIpLCBzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiLCBhbHBoYSA9IDAuNykgKwogIHNjYWxlX2ZpbGxfbWFudWFsKCJWYXJpYWJsZXMiLCB2YWx1ZXMgPSBjKCJJbmZlY3Rpb25zIiA9ICJza3libHVlIiwgIlVGTyBTaWdodGluZ3MgKDIwMTApIiA9ICJzYWxtb24iKSkgKwogIGxhYnMoeCA9ICJEYXRhIFBvaW50IEluZGV4IiwgeSA9ICJDb3VudCIsIHRpdGxlID0gIkNvbXBhcmlzb24gb2YgSW5mZWN0aW9ucyBhbmQgVUZPIFNpZ2h0aW5ncyIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQpgYGAKCgpgYGB7cn0KIyBPYnNlcnZhdGlvbjogVGhpcyBiYXIgZ3JhcGggY29tcGFyZXMgdGhlIG51bWJlciBvZiBpbmZlY3Rpb25zIGFuZCBVRk8gc2lnaHRpbmdzIGZvciBlYWNoCiMgZGF0YSBwb2ludC4gVGhlIHNjYWxlIG9mIGluZmVjdGlvbnMgaXMgc2lnbmlmaWNhbnRseSBoaWdoZXIgdGhhbiBVRk8gc2lnaHRpbmdzIGluIG1vc3QgY2FzZXMuCiMgVGhlcmUgYXJlIGZldyBpbnN0YW5jZXMgd2hlcmUgVUZPIHNpZ2h0aW5ncyBhcmUgbm9uLXplcm8sIGJ1dCB0aGVpciBjb3VudHMgYXJlIGxvdyByZWxhdGl2ZQojIHRvIHRoZSBpbmZlY3Rpb24gbnVtYmVycy4KYGBgCgoKYGBge3J9CiMgLS0tIDIuIExpbmUgQ2hhcnQ6IFRyZW5kcyBpbiBJbmZlY3Rpb25zIGFuZCBQb3B1bGF0aW9uIC0tLQpnZ3Bsb3QoZGYsIGFlcyh4ID0gMTpucm93KGRmKSkpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBpbmZlY3Rpb25zLCBjb2xvciA9ICJJbmZlY3Rpb25zIiksIGxpbmV3aWR0aCA9IDEpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBwb3AsIGNvbG9yID0gIlBvcHVsYXRpb24iKSwgbGluZXdpZHRoID0gMSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCgiVmFyaWFibGVzIiwgdmFsdWVzID0gYygiSW5mZWN0aW9ucyIgPSAiZ3JlZW4iLCAiUG9wdWxhdGlvbiIgPSAicHVycGxlIikpICsKICBsYWJzKHggPSAiRGF0YSBQb2ludCBJbmRleCIsIHkgPSAiQ291bnQiLCB0aXRsZSA9ICJUcmVuZHMgaW4gSW5mZWN0aW9ucyBhbmQgUG9wdWxhdGlvbiIpICsKICB0aGVtZV9taW5pbWFsKCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKQoKYGBgCgoKYGBge3J9CiMgT2JzZXJ2YXRpb246IFRoaXMgbGluZSBjaGFydCBzaG93cyB0aGUgdHJlbmRzIG9mIGluZmVjdGlvbnMgYW5kIHBvcHVsYXRpb24gYWNyb3NzIHRoZSBkYXRhIHBvaW50cy4KIyBUaGUgcG9wdWxhdGlvbiB2YWx1ZXMgYXJlIG9uIGEgbXVjaCBsYXJnZXIgc2NhbGUgdGhhbiBpbmZlY3Rpb24gY291bnRzLCBtYWtpbmcgaXQgZGlmZmljdWx0IHRvCiMgb2JzZXJ2ZSBkZXRhaWxlZCBjaGFuZ2VzIGluIGluZmVjdGlvbnMgb24gdGhlIHNhbWUgcGxvdC4gSG93ZXZlciwgd2UgY2FuIHNlZSB0aGUgb3ZlcmFsbAojIGZsdWN0dWF0aW9ucyBvZiBib3RoIHZhcmlhYmxlcy4KYGBgCgoKYGBge3J9CiMgLS0tIDMuIFNjYXR0ZXIgUGxvdDogUmVsYXRpb25zaGlwIGJldHdlZW4gUG9wdWxhdGlvbiBhbmQgSW5mZWN0aW9ucyAtLS0KZ2dwbG90KGRmLCBhZXMoeCA9IHBvcCwgeSA9IGluZmVjdGlvbnMpKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJibHVlIiwgYWxwaGEgPSAwLjYpICsKICBsYWJzKHggPSAiUG9wdWxhdGlvbiIsIHkgPSAiTnVtYmVyIG9mIEluZmVjdGlvbnMiLCB0aXRsZSA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBQb3B1bGF0aW9uIGFuZCBOdW1iZXIgb2YgSW5mZWN0aW9ucyIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKYGBge3J9CiMgT2JzZXJ2YXRpb246IFRoaXMgc2NhdHRlciBwbG90IGV4cGxvcmVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwb3B1bGF0aW9uIHNpemUgYW5kIHRoZSBudW1iZXIKIyBvZiBpbmZlY3Rpb25zLiBUaGVyZSBkb2Vzbid0IGFwcGVhciB0byBiZSBhIHN0cm9uZyBsaW5lYXIgY29ycmVsYXRpb24uIFdoaWxlIHNvbWUgaGlnaC1wb3B1bGF0aW9uCiMgYXJlYXMgaGF2ZSBoaWdoIGluZmVjdGlvbiBjb3VudHMsIHRoaXMgaXMgbm90IGNvbnNpc3RlbnRseSB0aGUgY2FzZS4KYGBgCgoKYGBge3J9CiMgLS0tIDQuIEJveCBQbG90OiBEaXN0cmlidXRpb24gb2YgSW5mZWN0aW9ucyAtLS0KZ2dwbG90KGRmLCBhZXMoeSA9IGluZmVjdGlvbnMpKSArCiAgZ2VvbV9ib3hwbG90KGZpbGwgPSAibGlnaHRjb3JhbCIpICsKICBsYWJzKHkgPSAiTnVtYmVyIG9mIEluZmVjdGlvbnMiLCB0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgTnVtYmVyIG9mIEluZmVjdGlvbnMiKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCmBgYHtyfQojIE9ic2VydmF0aW9uOiBUaGlzIGJveCBwbG90IHN1bW1hcml6ZXMgdGhlIGRpc3RyaWJ1dGlvbiBvZiB0aGUgJ2luZmVjdGlvbnMnIHZhcmlhYmxlLiBJdCBzaG93cyB0aGUKIyBtZWRpYW4sIHF1YXJ0aWxlcywgYW5kIHBvdGVudGlhbCBvdXRsaWVycy4gVGhlIHBsb3QgaW5kaWNhdGVzIHRoYXQgdGhlIG1ham9yaXR5IG9mIGluZmVjdGlvbgojIGNvdW50cyBhcmUgcmVsYXRpdmVseSBsb3csIHdpdGggc29tZSBoaWdoZXIgdmFsdWVzIGlkZW50aWZpZWQgYXMgb3V0bGllcnMuCmBgYAoKCmBgYHtyfQojIC0tLSA1LiBIaXN0b2dyYW06IEZyZXF1ZW5jeSBEaXN0cmlidXRpb24gb2YgVUZPIFNpZ2h0aW5ncyAtLS0KZ2dwbG90KGRmLCBhZXMoeCA9IHVmbzIwMTApKSArCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1LCBmaWxsID0gIm9yYW5nZSIsIGNvbG9yID0gImJsYWNrIiwgYWxwaGEgPSAwLjcpICsKICBsYWJzKHggPSAiTnVtYmVyIG9mIFVGTyBTaWdodGluZ3MgKDIwMTApIiwgeSA9ICJGcmVxdWVuY3kiLCB0aXRsZSA9ICJGcmVxdWVuY3kgRGlzdHJpYnV0aW9uIG9mIFVGTyBTaWdodGluZ3MgKDIwMTApIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCgpgYGB7cn0KIyBPYnNlcnZhdGlvbjogVGhpcyBoaXN0b2dyYW0gc2hvd3MgdGhlIGZyZXF1ZW5jeSBkaXN0cmlidXRpb24gb2YgVUZPIHNpZ2h0aW5ncyBpbiAyMDEwLiBUaGUKIyBkaXN0cmlidXRpb24gaXMgaGVhdmlseSBza2V3ZWQgdG93YXJkcyB6ZXJvLCBpbmRpY2F0aW5nIHRoYXQgbW9zdCBkYXRhIHBvaW50cyBoYXZlIHZlcnkgZmV3IG9yCiMgbm8gcmVwb3J0ZWQgVUZPIHNpZ2h0aW5ncy4KYGBgCgoKYGBge3J9CiMgLS0tIDYuIFNjYXR0ZXIgUGxvdDogUmVsYXRpb25zaGlwIGJldHdlZW4gUG9wdWxhdGlvbiBhbmQgVUZPIFNpZ2h0aW5ncyAtLS0KZ2dwbG90KGRmLCBhZXMoeCA9IHBvcCwgeSA9IHVmbzIwMTApKSArCiAgZ2VvbV9wb2ludChjb2xvciA9ICJwdXJwbGUiLCBhbHBoYSA9IDAuNikgKwogIGxhYnMoeCA9ICJQb3B1bGF0aW9uIiwgeSA9ICJOdW1iZXIgb2YgVUZPIFNpZ2h0aW5ncyAoMjAxMCkiLCB0aXRsZSA9ICJSZWxhdGlvbnNoaXAgYmV0d2VlbiBQb3B1bGF0aW9uIGFuZCBVRk8gU2lnaHRpbmdzICgyMDEwKSIpICsKICB0aGVtZV9taW5pbWFsKCkKYGBgCgoKYGBge3J9CiMgT2JzZXJ2YXRpb246IFRoaXMgc2NhdHRlciBwbG90IGV4YW1pbmVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBwb3B1bGF0aW9uIHNpemUgYW5kIHRoZSBudW1iZXIKIyBvZiBVRk8gc2lnaHRpbmdzLiBUaGVyZSBkb2Vzbid0IHNlZW0gdG8gYmUgYSBjbGVhciBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlc2UgdHdvIHZhcmlhYmxlcy4KYGBgCgoKYGBge3J9CiMgLS0tIDcuIFNjYXR0ZXIgUGxvdDogSW5mZWN0aW9ucyB2cy4gVUZPcyB3aXRoIFBvcHVsYXRpb24gU2l6ZSAtLS0KZ2dwbG90KGRmLCBhZXMoeCA9IHVmbzIwMTAsIHkgPSBpbmZlY3Rpb25zLCBzaXplID0gcG9wKSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjYsIGNvbG9yID0gIm1hcm9vbiIpICsKICBzY2FsZV9zaXplX2NvbnRpbnVvdXMobmFtZSA9ICJQb3B1bGF0aW9uIFNpemUiKSArCiAgbGFicyh4ID0gIk51bWJlciBvZiBVRk8gU2lnaHRpbmdzICgyMDEwKSIsIHkgPSAiTnVtYmVyIG9mIEluZmVjdGlvbnMiLCB0aXRsZSA9ICJJbmZlY3Rpb25zIHZzLiBVRk8gU2lnaHRpbmdzLCBTaXplIGJ5IFBvcHVsYXRpb24iKSArCiAgdGhlbWVfbWluaW1hbCgpCmBgYAoKCmBgYHtyfQojIE9ic2VydmF0aW9uOiBUaGlzIHNjYXR0ZXIgcGxvdCBzaG93cyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gaW5mZWN0aW9ucyBhbmQgVUZPIHNpZ2h0aW5ncywgd2l0aAojIHRoZSBzaXplIG9mIGVhY2ggcG9pbnQgcmVwcmVzZW50aW5nIHRoZSBwb3B1bGF0aW9uIHNpemUuIEl0IGhlbHBzIHRvIHZpc3VhbGl6ZSBpZiBhcmVhcyB3aXRoIGhpZ2hlcgojIGluZmVjdGlvbnMgb3IgVUZPIHNpZ2h0aW5ncyBhbHNvIHRlbmQgdG8gaGF2ZSBsYXJnZXIgcG9wdWxhdGlvbnMuIE5vIHN0cm9uZyBwYXR0ZXJuIGlzIGltbWVkaWF0ZWx5CiMgYXBwYXJlbnQuCmBgYAoKCgpgYGB7cn0KIyAtLS0gOC4gUGFpciBQbG90OiBPdmVydmlldyBvZiBSZWxhdGlvbnNoaXBzIC0tLQpsaWJyYXJ5KEdHYWxseSkKZ2dwYWlycyhkZikgKwogIGdndGl0bGUoIlBhaXIgUGxvdCBvZiBJbmZlY3Rpb25zLCBVRk8gU2lnaHRpbmdzLCBhbmQgUG9wdWxhdGlvbiIpICsKICB0aGVtZV9taW5pbWFsKCkKCmBgYAoKCmBgYHtyfQojIE9ic2VydmF0aW9uOiBUaGUgcGFpciBwbG90IHByb3ZpZGVzIGEgbWF0cml4IG9mIHNjYXR0ZXIgcGxvdHMgZm9yIGVhY2ggcGFpciBvZiB2YXJpYWJsZXMgYW5kCiMgZGVuc2l0eSBwbG90cyBmb3IgdGhlIGRpc3RyaWJ1dGlvbiBvZiBlYWNoIGluZGl2aWR1YWwgdmFyaWFibGUuIFRoaXMgZ2l2ZXMgYSBxdWljayBvdmVydmlldyBvZgojIHBvdGVudGlhbCBsaW5lYXIgcmVsYXRpb25zaGlwcyBhbmQgdGhlIHNoYXBlIG9mIHRoZSBkaXN0cmlidXRpb25zLiBUaGUgZGlzdHJpYnV0aW9ucyBvZgojIGluZmVjdGlvbnMgYW5kIFVGTyBzaWdodGluZ3MgYXBwZWFyIHNrZXdlZCwgYW5kIHRoZSBzY2F0dGVyIHBsb3RzIHJlaXRlcmF0ZSB0aGUgbGFjayBvZiBzdHJvbmcKIyBsaW5lYXIgY29ycmVsYXRpb25zIG9ic2VydmVkIGluIHRoZSBpbmRpdmlkdWFsIHBsb3RzLgpgYGAKCgoKCg==