Student Details
Name: “Karan Khurana”
ID: “s3998115”
Problem Statement
“This investigation’s goal is to analyse the normality distribution
of a subset of Melbourne and Sydney weather data and offer suggestions
for modelling these variables. The data set’s Daily Wind speed and
Maximum temperature variables have been chosen.
Approach: The investigation includes the following steps:
The mean, median, standard deviation, first and third quartiles,
interquartile range, minimum and maximum values, and R functions will be
used to provide summary statistics for each variable in Melbourne and
Sydney.
For each variable in Melbourne and Sydney, histograms with overlays
of the normal distribution will be generated using the ggplot2 program
in R. The variable is thought to be roughly normally distributed if the
histogram resembles a bell-shaped curve.We may need to take into account
using a non-parametric model if the histogram is skewed.
We shall offer suggestions for the modelling of each variable in
Melbourne and Sydney based on the histograms’ findings. For variables
that are not normally distributed, we would advise using a
non-parametric model, and for variables that are roughly regularly
distributed, we might advise using a parametric model (such a normal
distribution).”
Load Packages
library(dplyr)
Attaching package: ‘dplyr’
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
library(ggplot2)
Data
Import the climate data and prepare it for analysis. Show your
code.
setwd("C:/Users/bhara/Downloads/Data-Applied Analytics/")
Warning: The working directory was changed to C:/Users/bhara/Downloads/Data-Applied Analytics 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.
melbourne <- read.csv("Climate_Data_Melbourne.csv")
sydney <- read.csv("Climate_Data_Sydney.csv")
Summary Statistics
Calculate descriptive statistics (i.e., mean, median, standard
deviation, first and third quartile, interquartile range, minimum and
maximum values) of the selected variable grouped by city.
# This is a chunk for your Summary Statistics section.
# summary of given column of data set Melbourne which contain mean, median, maximum, minimum, 1st and 3rd quartile
print("Summary of melbourne's max temperature")
[1] "Summary of melbourne's max temperature"
summary(melbourne$Maximum.Temperature)
Min. 1st Qu. Median Mean 3rd Qu. Max.
16.10 21.43 25.10 25.64 29.05 41.30
print("Summary of melbourne's wind speed")
[1] "Summary of melbourne's wind speed"
summary(melbourne$Wind.speed)
Min. 1st Qu. Median Mean 3rd Qu. Max.
30.00 35.00 41.00 46.16 54.00 83.00
# printing standard deviation
print("Standard deviation of melbourne's max temperature")
[1] "Standard deviation of melbourne's max temperature"
sd(melbourne$Maximum.Temperature)
[1] 5.768589
print("Standard deviation of melbourne's wind speed")
[1] "Standard deviation of melbourne's wind speed"
sd(melbourne$Wind.speed)
[1] 13.33738
# printing Inter Quartile Range
print("inter Quartile Range of melbourne's max temperature")
[1] "inter Quartile Range of melbourne's max temperature"
IQR(melbourne$Maximum.Temperature)
[1] 7.625
print("inter Quartile Range of melbourne's wind speed")
[1] "inter Quartile Range of melbourne's wind speed"
IQR(melbourne$Wind.speed)
[1] 19
# summary of given column of data set Sydney which contain mean, median, maximum, minimum, 1st and 3rd quartile
print("Summary of Sydney's max temperature")
[1] "Summary of Sydney's max temperature"
summary(sydney$Maximum.Temperature)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
19.40 23.80 27.10 26.97 29.50 36.60 1
print("Summary of Sydney's Wind speed")
[1] "Summary of Sydney's Wind speed"
summary(sydney$maximum.wind.speed)
Min. 1st Qu. Median Mean 3rd Qu. Max.
17.00 31.00 33.00 35.02 37.00 72.00
# printing standard deviation
print("Standard deviation of Sydney's max temperature")
[1] "Standard deviation of Sydney's max temperature"
sd(sydney$Maximum.Temperature, na.rm = TRUE)
[1] 3.762337
print("Standard deviation of Sydney's wind speed")
[1] "Standard deviation of Sydney's wind speed"
sd(sydney$maximum.wind.speed)
[1] 8.055953
# printing Inter Quartile Range
print("inter Quartile Range of Sydney's Max temperature")
[1] "inter Quartile Range of Sydney's Max temperature"
IQR(sydney$Maximum.Temperature,na.rm = TRUE)
[1] 5.7
print("inter Quartile Range of Sydney's wind speed")
[1] "inter Quartile Range of Sydney's wind speed"
IQR(sydney$maximum.wind.speed)
[1] 6
Distribution Fitting
Compare the empirical distribution of selected variable to a normal
distribution separately in Melbourne and in Sydney. You need to do this
visually by plotting the histogram with normal distribution overlay.
Show your code.


# This is a chunk for your Distribution Fitting section.
library(ggplot2)
# For maximum temperature speed in Melbourne
ggplot(melbourne, aes(x = Maximum.Temperature)) +
geom_histogram(aes(y=..density..), binwidth = 2, colour="black", fill="white") +
geom_density(color="blue") +
labs(x = "Max temperature", y = "Density", title = "Histogram of Maximum temperature in Melbourne")
# For Daily Wind speed in Melbourne
ggplot(melbourne, aes(x = Wind.speed)) +
geom_histogram(aes(y=..density..), binwidth = 2, colour="black", fill="white") +
geom_density(color="blue") +
labs(x = "Daily Wind speed (km/h)", y = "Density", title = "Histogram of Daily Wind speed in Melbourne")
# For Daily Wind speed in Sydney
ggplot(sydney, aes(x = maximum.wind.speed)) +
geom_histogram(aes(y=..density..), binwidth = 2, colour="black", fill="white") +
geom_density(color="blue") +
labs(x = "Daily Wind speed (km/h)", y = "Density", title = "Histogram of Daily Wind speed in Sydney")

# For Maximum temperature in Sydney
ggplot(sydney, aes(x = Maximum.Temperature)) +
geom_histogram(aes(y=..density..), binwidth = 2, colour="black", fill="white") +
geom_density(color="blue") +
labs(x = "Maximum temperature (°C)", y = "Density", title = "Histogram of Maximum temperature in Sydney")

Interpretation
Going back to your problem statement, what insight has been gained
from the investigation?
Based on the histograms , we can see that the distribution of “Daily
Wind speed” in both Melbourne and Sydney is not normal. The distribution
of “Maximum temperature” in Melbourne is approximately normal, but the
distribution in Sydney is slightly skewed to the right. Therefore, we
can recommend using a non-parametric model for “Daily Wind speed”, and a
parametric model (such as a normal distribution) for “Maximum
temperature” in Melbourne, but a non-parametric for “Maximum
temperature” in Sydney.
A non-parametric model, such as the median or rank-based methods, can
be more appropriate for non-normal distributions because they do not
make any assumptions about the underlying distribution of the data. On
the other hand, parametric models, such as the normal distribution,
assume that the data follow a specific distribution, which may not be
the case in non-normal distributions.
In the case of “Maximum temperature” in Melbourne, the approximately
normal distribution indicates that a parametric model, such as a normal
distribution, may be appropriate. However, in the case of “Maximum
temperature” in Sydney, the slightly skewed distribution suggests that a
non-parametric model may be more appropriate.
LS0tDQp0aXRsZTogIk1BVEgxMzI0IEFzc2lnbm1lbnQgMSINCnN1YnRpdGxlOiAiU3RhdGlzdGljYWwgQW5hbHlzaXMgb2YgQ2xpbWF0ZSBkYXRhIg0Kb3V0cHV0OiBodG1sX25vdGVib29rIA0KLS0tDQoNCiMjIFN0dWRlbnQgRGV0YWlscw0KDQpOYW1lOiAiS2FyYW4gS2h1cmFuYSINCg0KSUQ6ICJzMzk5ODExNSINCg0KIyMgUHJvYmxlbSBTdGF0ZW1lbnQNCg0KIlRoaXMgaW52ZXN0aWdhdGlvbidzIGdvYWwgaXMgdG8gYW5hbHlzZSB0aGUgbm9ybWFsaXR5IGRpc3RyaWJ1dGlvbiBvZiBhIHN1YnNldCBvZiBNZWxib3VybmUgYW5kIFN5ZG5leSB3ZWF0aGVyIGRhdGEgYW5kIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBtb2RlbGxpbmcgdGhlc2UgdmFyaWFibGVzLiBUaGUgZGF0YSBzZXQncyBEYWlseSBXaW5kIHNwZWVkIGFuZCBNYXhpbXVtIHRlbXBlcmF0dXJlIHZhcmlhYmxlcyBoYXZlIGJlZW4gY2hvc2VuLg0KDQpBcHByb2FjaDogVGhlIGludmVzdGlnYXRpb24gaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBzdGVwczoNCg0KVGhlIG1lYW4sIG1lZGlhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCBmaXJzdCBhbmQgdGhpcmQgcXVhcnRpbGVzLCBpbnRlcnF1YXJ0aWxlIHJhbmdlLCBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlcywgYW5kIFIgZnVuY3Rpb25zIHdpbGwgYmUgdXNlZCB0byBwcm92aWRlIHN1bW1hcnkgc3RhdGlzdGljcyBmb3IgZWFjaCB2YXJpYWJsZSBpbiBNZWxib3VybmUgYW5kIFN5ZG5leS4NCg0KRm9yIGVhY2ggdmFyaWFibGUgaW4gTWVsYm91cm5lIGFuZCBTeWRuZXksIGhpc3RvZ3JhbXMgd2l0aCBvdmVybGF5cyBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiB3aWxsIGJlIGdlbmVyYXRlZCB1c2luZyB0aGUgZ2dwbG90MiBwcm9ncmFtIGluIFIuIFRoZSB2YXJpYWJsZSBpcyB0aG91Z2h0IHRvIGJlIHJvdWdobHkgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgaWYgdGhlIGhpc3RvZ3JhbSByZXNlbWJsZXMgYSBiZWxsLXNoYXBlZCBjdXJ2ZS5XZSBtYXkgbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCB1c2luZyBhIG5vbi1wYXJhbWV0cmljIG1vZGVsIGlmIHRoZSBoaXN0b2dyYW0gaXMgc2tld2VkLg0KDQpXZSBzaGFsbCBvZmZlciBzdWdnZXN0aW9ucyBmb3IgdGhlIG1vZGVsbGluZyBvZiBlYWNoIHZhcmlhYmxlIGluIE1lbGJvdXJuZSBhbmQgU3lkbmV5IGJhc2VkIG9uIHRoZSBoaXN0b2dyYW1zJyBmaW5kaW5ncy4gRm9yIHZhcmlhYmxlcyB0aGF0IGFyZSBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQsIHdlIHdvdWxkIGFkdmlzZSB1c2luZyBhIG5vbi1wYXJhbWV0cmljIG1vZGVsLCBhbmQgZm9yIHZhcmlhYmxlcyB0aGF0IGFyZSByb3VnaGx5IHJlZ3VsYXJseSBkaXN0cmlidXRlZCwgd2UgbWlnaHQgYWR2aXNlIHVzaW5nIGEgcGFyYW1ldHJpYyBtb2RlbCAoc3VjaCBhIG5vcm1hbCBkaXN0cmlidXRpb24pLiINCg0KIyMgTG9hZCBQYWNrYWdlcw0KDQpgYGB7cn0NCiMgVGhpcyBpcyBhIGNodW5rIHdoZXJlIHlvdSBjYW4gbG9hZCB0aGUgbmVjZXNzYXJ5IHBhY2thZ2VzIHJlcXVpcmVkIHRvIHJlcHJvZHVjZSB0aGUgcmVwb3J0DQojIENsZWFuIHRoZSBlbnZpcm9ubWVudA0Kcm0obGlzdD1scygpKQ0KDQoNCg0KIyBMb2FkIHRoZSBuZWVkZWQgbGlicmFyaWVzDQppbnN0YWxsLnBhY2thZ2VzKGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQpgYGANCg0KIyMgRGF0YQ0KDQpJbXBvcnQgdGhlIGNsaW1hdGUgZGF0YSBhbmQgcHJlcGFyZSBpdCBmb3IgYW5hbHlzaXMuIFNob3cgeW91ciBjb2RlLg0KDQpgYGB7cn0NCiMgVGhpcyBpcyBhIGNodW5rIGZvciB5b3VyIERhdGEgc2VjdGlvbi4gDQojIFNldCB0aGUgd29yayBkaXJlY3RvcnkNCnNldHdkKCJDOi9Vc2Vycy9iaGFyYS9Eb3dubG9hZHMvRGF0YS1BcHBsaWVkIEFuYWx5dGljcy8iKQ0KbWVsYm91cm5lIDwtIHJlYWQuY3N2KCJDbGltYXRlX0RhdGFfTWVsYm91cm5lLmNzdiIpDQpzeWRuZXkgPC0gcmVhZC5jc3YoIkNsaW1hdGVfRGF0YV9TeWRuZXkuY3N2IikNCg0KYGBgDQoNCiMjIFN1bW1hcnkgU3RhdGlzdGljcw0KDQpDYWxjdWxhdGUgZGVzY3JpcHRpdmUgc3RhdGlzdGljcyAoaS5lLiwgbWVhbiwgbWVkaWFuLCBzdGFuZGFyZCBkZXZpYXRpb24sIGZpcnN0IGFuZCB0aGlyZCBxdWFydGlsZSwgaW50ZXJxdWFydGlsZSByYW5nZSwgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMpIG9mIHRoZSBzZWxlY3RlZCB2YXJpYWJsZSBncm91cGVkIGJ5IGNpdHkuDQoNCmBgYHtyfQ0KIyBUaGlzIGlzIGEgY2h1bmsgZm9yIHlvdXIgU3VtbWFyeSBTdGF0aXN0aWNzIHNlY3Rpb24uIA0KIyBzdW1tYXJ5IG9mIGdpdmVuIGNvbHVtbiBvZiBkYXRhIHNldCBNZWxib3VybmUgd2hpY2ggY29udGFpbiBtZWFuLCBtZWRpYW4sIG1heGltdW0sIG1pbmltdW0sIDFzdCBhbmQgM3JkIHF1YXJ0aWxlDQpwcmludCgiU3VtbWFyeSBvZiBtZWxib3VybmUncyBtYXggdGVtcGVyYXR1cmUiKQ0Kc3VtbWFyeShtZWxib3VybmUkTWF4aW11bS5UZW1wZXJhdHVyZSkNCnByaW50KCJTdW1tYXJ5IG9mIG1lbGJvdXJuZSdzIHdpbmQgc3BlZWQiKQ0Kc3VtbWFyeShtZWxib3VybmUkV2luZC5zcGVlZCkNCg0KIyBwcmludGluZyBzdGFuZGFyZCBkZXZpYXRpb24gDQpwcmludCgiU3RhbmRhcmQgZGV2aWF0aW9uIG9mIG1lbGJvdXJuZSdzIG1heCB0ZW1wZXJhdHVyZSIpDQpzZChtZWxib3VybmUkTWF4aW11bS5UZW1wZXJhdHVyZSkNCnByaW50KCJTdGFuZGFyZCBkZXZpYXRpb24gb2YgbWVsYm91cm5lJ3Mgd2luZCBzcGVlZCIpDQpzZChtZWxib3VybmUkV2luZC5zcGVlZCkNCg0KIyBwcmludGluZyBJbnRlciBRdWFydGlsZSBSYW5nZQ0KcHJpbnQoImludGVyIFF1YXJ0aWxlIFJhbmdlIG9mIG1lbGJvdXJuZSdzIG1heCB0ZW1wZXJhdHVyZSIpDQpJUVIobWVsYm91cm5lJE1heGltdW0uVGVtcGVyYXR1cmUpDQpwcmludCgiaW50ZXIgUXVhcnRpbGUgUmFuZ2Ugb2YgbWVsYm91cm5lJ3Mgd2luZCBzcGVlZCIpDQpJUVIobWVsYm91cm5lJFdpbmQuc3BlZWQpDQoNCiMgc3VtbWFyeSBvZiBnaXZlbiBjb2x1bW4gb2YgZGF0YSBzZXQgU3lkbmV5IHdoaWNoIGNvbnRhaW4gbWVhbiwgbWVkaWFuLCBtYXhpbXVtLCBtaW5pbXVtLCAxc3QgYW5kIDNyZCBxdWFydGlsZQ0KcHJpbnQoIlN1bW1hcnkgb2YgU3lkbmV5J3MgbWF4IHRlbXBlcmF0dXJlIikNCnN1bW1hcnkoc3lkbmV5JE1heGltdW0uVGVtcGVyYXR1cmUpDQpwcmludCgiU3VtbWFyeSBvZiBTeWRuZXkncyBXaW5kIHNwZWVkIikNCnN1bW1hcnkoc3lkbmV5JG1heGltdW0ud2luZC5zcGVlZCkNCg0KIyBwcmludGluZyBzdGFuZGFyZCBkZXZpYXRpb24NCnByaW50KCJTdGFuZGFyZCBkZXZpYXRpb24gb2YgU3lkbmV5J3MgbWF4IHRlbXBlcmF0dXJlIikNCnNkKHN5ZG5leSRNYXhpbXVtLlRlbXBlcmF0dXJlLCBuYS5ybSA9IFRSVUUpDQpwcmludCgiU3RhbmRhcmQgZGV2aWF0aW9uIG9mIFN5ZG5leSdzIHdpbmQgc3BlZWQiKQ0Kc2Qoc3lkbmV5JG1heGltdW0ud2luZC5zcGVlZCkNCg0KIyBwcmludGluZyBJbnRlciBRdWFydGlsZSBSYW5nZQ0KcHJpbnQoImludGVyIFF1YXJ0aWxlIFJhbmdlIG9mIFN5ZG5leSdzIE1heCB0ZW1wZXJhdHVyZSIpDQpJUVIoc3lkbmV5JE1heGltdW0uVGVtcGVyYXR1cmUsbmEucm0gPSBUUlVFKQ0KcHJpbnQoImludGVyIFF1YXJ0aWxlIFJhbmdlIG9mIFN5ZG5leSdzIHdpbmQgc3BlZWQiKQ0KSVFSKHN5ZG5leSRtYXhpbXVtLndpbmQuc3BlZWQpDQoNCg0KDQoNCmBgYA0KDQojIyBEaXN0cmlidXRpb24gRml0dGluZw0KDQpDb21wYXJlIHRoZSBlbXBpcmljYWwgZGlzdHJpYnV0aW9uIG9mIHNlbGVjdGVkIHZhcmlhYmxlIHRvIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiBzZXBhcmF0ZWx5IGluIE1lbGJvdXJuZSBhbmQgaW4gU3lkbmV5LiBZb3UgbmVlZCB0byBkbyB0aGlzIHZpc3VhbGx5IGJ5IHBsb3R0aW5nIHRoZSBoaXN0b2dyYW0gd2l0aCBub3JtYWwgZGlzdHJpYnV0aW9uIG92ZXJsYXkuIFNob3cgeW91ciBjb2RlLg0KDQpgYGB7cn0NCiMgVGhpcyBpcyBhIGNodW5rIGZvciB5b3VyIERpc3RyaWJ1dGlvbiBGaXR0aW5nIHNlY3Rpb24uIA0KICBsaWJyYXJ5KGdncGxvdDIpDQoNCiMgRm9yIG1heGltdW0gdGVtcGVyYXR1cmUgc3BlZWQgaW4gTWVsYm91cm5lDQpnZ3Bsb3QobWVsYm91cm5lLCBhZXMoeCA9IE1heGltdW0uVGVtcGVyYXR1cmUpKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSwgYmlud2lkdGggPSAyLCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0id2hpdGUiKSArDQogIGdlb21fZGVuc2l0eShjb2xvcj0iYmx1ZSIpICsNCiAgbGFicyh4ID0gIk1heCB0ZW1wZXJhdHVyZSIsIHkgPSAiRGVuc2l0eSIsIHRpdGxlID0gIkhpc3RvZ3JhbSBvZiBNYXhpbXVtIHRlbXBlcmF0dXJlIGluIE1lbGJvdXJuZSIpDQoNCiMgRm9yIERhaWx5IFdpbmQgc3BlZWQgaW4gTWVsYm91cm5lDQpnZ3Bsb3QobWVsYm91cm5lLCBhZXMoeCA9IFdpbmQuc3BlZWQpKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSwgYmlud2lkdGggPSAyLCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0id2hpdGUiKSArDQogIGdlb21fZGVuc2l0eShjb2xvcj0iYmx1ZSIpICsNCiAgbGFicyh4ID0gIkRhaWx5IFdpbmQgc3BlZWQgKGttL2gpIiwgeSA9ICJEZW5zaXR5IiwgdGl0bGUgPSAiSGlzdG9ncmFtIG9mIERhaWx5IFdpbmQgc3BlZWQgaW4gTWVsYm91cm5lIikNCg0KIyBGb3IgRGFpbHkgV2luZCBzcGVlZCBpbiBTeWRuZXkNCmdncGxvdChzeWRuZXksIGFlcyh4ID0gbWF4aW11bS53aW5kLnNwZWVkKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShhZXMoeT0uLmRlbnNpdHkuLiksIGJpbndpZHRoID0gMiwgY29sb3VyPSJibGFjayIsIGZpbGw9IndoaXRlIikgKw0KICBnZW9tX2RlbnNpdHkoY29sb3I9ImJsdWUiKSArDQogIGxhYnMoeCA9ICJEYWlseSBXaW5kIHNwZWVkIChrbS9oKSIsIHkgPSAiRGVuc2l0eSIsIHRpdGxlID0gIkhpc3RvZ3JhbSBvZiBEYWlseSBXaW5kIHNwZWVkIGluIFN5ZG5leSIpDQoNCiMgRm9yIE1heGltdW0gdGVtcGVyYXR1cmUgaW4gU3lkbmV5DQpnZ3Bsb3Qoc3lkbmV5LCBhZXMoeCA9IE1heGltdW0uVGVtcGVyYXR1cmUpKSArDQogIGdlb21faGlzdG9ncmFtKGFlcyh5PS4uZGVuc2l0eS4uKSwgYmlud2lkdGggPSAyLCBjb2xvdXI9ImJsYWNrIiwgZmlsbD0id2hpdGUiKSArDQogIGdlb21fZGVuc2l0eShjb2xvcj0iYmx1ZSIpICsNCiAgbGFicyh4ID0gIk1heGltdW0gdGVtcGVyYXR1cmUgKMKwQykiLCB5ID0gIkRlbnNpdHkiLCB0aXRsZSA9ICJIaXN0b2dyYW0gb2YgTWF4aW11bSB0ZW1wZXJhdHVyZSBpbiBTeWRuZXkiKQ0KDQoNCmBgYA0KDQojIyBJbnRlcnByZXRhdGlvbg0KDQpHb2luZyBiYWNrIHRvIHlvdXIgcHJvYmxlbSBzdGF0ZW1lbnQsIHdoYXQgaW5zaWdodCBoYXMgYmVlbiBnYWluZWQgZnJvbSB0aGUgaW52ZXN0aWdhdGlvbj8NCg0KQmFzZWQgb24gdGhlIGhpc3RvZ3JhbXMgLCB3ZSBjYW4gc2VlIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBvZiAiRGFpbHkgV2luZCBzcGVlZCIgaW4gYm90aCBNZWxib3VybmUgYW5kIFN5ZG5leSBpcyBub3Qgbm9ybWFsLiBUaGUgZGlzdHJpYnV0aW9uIG9mICJNYXhpbXVtIHRlbXBlcmF0dXJlIiBpbiBNZWxib3VybmUgaXMgYXBwcm94aW1hdGVseSBub3JtYWwsIGJ1dCB0aGUgZGlzdHJpYnV0aW9uIGluIFN5ZG5leSBpcyBzbGlnaHRseSBza2V3ZWQgdG8gdGhlIHJpZ2h0LiBUaGVyZWZvcmUsIHdlIGNhbiByZWNvbW1lbmQgdXNpbmcgYSBub24tcGFyYW1ldHJpYyBtb2RlbCBmb3IgIkRhaWx5IFdpbmQgc3BlZWQiLCBhbmQgYSBwYXJhbWV0cmljIG1vZGVsIChzdWNoIGFzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbikgZm9yICJNYXhpbXVtIHRlbXBlcmF0dXJlIiBpbiBNZWxib3VybmUsIGJ1dCBhIG5vbi1wYXJhbWV0cmljIGZvciAiTWF4aW11bSB0ZW1wZXJhdHVyZSIgaW4gU3lkbmV5Lg0KDQpBIG5vbi1wYXJhbWV0cmljIG1vZGVsLCBzdWNoIGFzIHRoZSBtZWRpYW4gb3IgcmFuay1iYXNlZCBtZXRob2RzLCBjYW4gYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3Igbm9uLW5vcm1hbCBkaXN0cmlidXRpb25zIGJlY2F1c2UgdGhleSBkbyBub3QgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHVuZGVybHlpbmcgZGlzdHJpYnV0aW9uIG9mIHRoZSBkYXRhLiBPbiB0aGUgb3RoZXIgaGFuZCwgcGFyYW1ldHJpYyBtb2RlbHMsIHN1Y2ggYXMgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24sIGFzc3VtZSB0aGF0IHRoZSBkYXRhIGZvbGxvdyBhIHNwZWNpZmljIGRpc3RyaWJ1dGlvbiwgd2hpY2ggbWF5IG5vdCBiZSB0aGUgY2FzZSBpbiBub24tbm9ybWFsIGRpc3RyaWJ1dGlvbnMuDQoNCkluIHRoZSBjYXNlIG9mICJNYXhpbXVtIHRlbXBlcmF0dXJlIiBpbiBNZWxib3VybmUsIHRoZSBhcHByb3hpbWF0ZWx5IG5vcm1hbCBkaXN0cmlidXRpb24gaW5kaWNhdGVzIHRoYXQgYSBwYXJhbWV0cmljIG1vZGVsLCBzdWNoIGFzIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgbWF5IGJlIGFwcHJvcHJpYXRlLiBIb3dldmVyLCBpbiB0aGUgY2FzZSBvZiAiTWF4aW11bSB0ZW1wZXJhdHVyZSIgaW4gU3lkbmV5LCB0aGUgc2xpZ2h0bHkgc2tld2VkIGRpc3RyaWJ1dGlvbiBzdWdnZXN0cyB0aGF0IGEgbm9uLXBhcmFtZXRyaWMgbW9kZWwgbWF5IGJlIG1vcmUgYXBwcm9wcmlhdGUuDQo=