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=