Required packages
The packages shown below are used in my report for generating outputs.
# This is the R chunk for the required packages
library(readr)
library(readxl)
library(foreign)
library(rvest)
library(dplyr)
library(tidyr)
library(deductive)
library(deducorrect)
library(validate)
library(forecast)
library(stringr)
library(outliers)
library(MASS)
library(ggplot2)
library(knitr)
Executive Summary
We are analyzing the percentage of suicide within Australia over the time period 2009 – 2015. The dataset having the number of death and suicide is taken from the site of Australian Bureau of Statistics and we are analyzing the suicide rate in Australia comparing to the overall death rate in different provinces. The analysis is relevant as if we know the pattern in the suicide rate we can get to know if the state’s suitability for living. As we know the data, we got is raw and it will be noisy. So, before we start with the analysis, we need to do data cleansing. The data we have will include missing values, outliers etc.
We will first read the 2 files, one for the death details and other with suicide rates, using the read_xlsx(). We will then combine both the files using left join and create a single dataset. As now we have a single dataset with the suicide count and death count, we will calculate the percentage of suicide and add it to the data using mutate function. We now have all the details required, we need to check for missing values and outliers. The function is.na() was used to check the missing values, in this case there were no missing values in the dataset. If we had any missing values, we could check for the skewness and then based on that can replace them with median or mean. Next we will check for the outliers. The data has outliers and we need to handle them. We will check if the data is less than the lower fence, if so, it will be replaced by Q1 and if it is greater than the upper fence, we will replace the outliers with Q4 and now our data is ready for analysis.Finaling we can do data transformation to transform complex non-linear relationships into linear relationships.
Data
The datasets are read into R as excel files. There are two datasets used in this report the first one is a list of deaths registered by sex, states and territories and the second datasets intentional self-harm by State and territory of usual residence and Sex, Age-standardized death rates, 2009-2015.The death dataset is imported from “https://www.abs.gov.au/ausstats/abs@.nsf/mf/3105.0.65.001/” and the suicide dataset is imported from “https://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/3303.02018?OpenDocument”.This is an open source of datasets.
setwd("/Users/joeljvc/Desktop/R ")
The working directory was changed to /Users/joeljvc/Desktop/R 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.
getwd()
[1] "/Users/joeljvc/Desktop/R "
death_1 <-read_xls("Total_death.xls",sheet="Table 5.1",skip = 4)
New names:
* `` -> ...1
suicides<-read_xls(" intentional selfharm.xls",sheet="Table 11.6",skip=6)
New names:
* `` -> ...1
* `` -> ...12
* `` -> ...13
Understand
The field and its description is given below:
**Data variables
Data 1 - death_1
1.States - Name of each states in Australia.
2.Year - Time period from 2009-2015.
3.Total number of deaths from 2009-2015 - This shows the total number of deaths.
Data 2 -suicides
1.States -Name of states.
2.Year -Time period from 2009-2015.
3.Number of suicides -Number of Suicides of each states.
death_2<- death_1[-c(1:23,32:55),-c(2:186)]
str(death_2)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 8 obs. of 8 variables:
$ ...1: chr "NSW" "Vic." "Qld" "SA" ...
$ 2009: num 46974 35640 26316 12468 12566 ...
$ 2010: num 47945 35623 27289 12957 12720 ...
$ 2011: num 50661 36552 27414 12665 12724 ...
$ 2012: num 49314 35760 28300 13178 13339 ...
$ 2013: num 50396 35916 27901 12804 13414 ...
$ 2014: num 52320 38042 28704 13262 13787 ...
$ 2015: num 53600 39904 29782 13647 14448 ...
names(death_2)[names(death_2) == "...1"] <- "States"
suicides_1<- suicides[-c(1:25,34:47),-c(9:13)]
str(suicides_1)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 8 obs. of 8 variables:
$ ...1: chr "NSW" "Vic." "Qld" "SA" ...
$ 2009: chr "623" "576" "525" "185" ...
$ 2010: chr "674" "558" "588" "197" ...
$ 2011: chr "617" "526" "578" "212" ...
$ 2012: chr "727" "514" "631" "198" ...
$ 2013: chr "718" "533" "676" "203" ...
$ 2014: chr "832" "658" "658" "243" ...
$ 2015: chr "839" "678" "761" "234" ...
Tidy & Manipulate Data I
Both of the datasets were untidy and to tidy this dataset, we need to gather the columns into a new pair of variables and with gather() function with the parameters year values 2009-2015, and the column name is given as year, the number of suicides is given as values, since that is the one which spread over the suicide file and total number of deaths is given as values for death files.
suicides_1<-suicides_1 %>%
gather('2009','2010','2011','2012','2013','2014','2015',key = "year",value = "Number of suicides ")
names(suicides_1)[names(suicides_1) == "...1"] <-"States"
death_5<-gather(death_2,'2009','2010','2011','2012','2013','2014','2015', key = "year",value = "Total Number of deaths from 2009-2015")
colnames(death_5)
[1] "States" "year"
[3] "Total Number of deaths from 2009-2015"
##Joining Datasets and Type Conversion
since we have change the datasets to the required format we can join both the datasets using left_join() functions over States and year columns. Using str() we check the columns are correct format and could find that the column “Number of suicides” is in character data type even though it clearly holds numerical data. So we will convert it into numeric using as.numeric().We have the state column having the state details and that can be converted to levels using factor().
x<-left_join(suicides_1,death_5,by= c("States","year"))
str(x)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame': 56 obs. of 4 variables:
$ States : chr "NSW" "Vic." "Qld" "SA" ...
$ year : chr "2009" "2009" "2009" "2009" ...
$ Number of suicides : chr "623" "576" "525" "185" ...
$ Total Number of deaths from 2009-2015: num 46974 35640 26316 12468 12566 ...
x$`Number of suicides `<- as.numeric(x$`Number of suicides `)
x$States<-factor(x$States,levels=c("NSW","Vic.","Qld","SA","WA","Tas.","NT","ACT"),ordered = TRUE)
levels(x$States)
[1] "NSW" "Vic." "Qld" "SA" "WA" "Tas." "NT" "ACT"
Tidy & Manipulate Data II
1.By using mutate() function we can add the new variable “Percentage of suicide” while preserving the existing variables.
2.The new variable “Percentage of suicide” is created to know the percentage value of both “Number of suicides” and “Total Number of deaths from 2009-2015”.
y<-mutate(x,"Percentage of suicide"=(x$`Number of suicides ` / x$`Total Number of deaths from 2009-2015`)*100)
Scan I
1.With the is.na() functions the missing values is being checked and during the data preprocessing method this datasets has no missing values, special values.
2.Obvious errors or inconsistencies are also checked in the dataset.
colSums(is.na(y))
States year Number of suicides
0 0 0
Total Number of deaths from 2009-2015 Percentage of suicide
0 0
Scan II
As we are done with a handling missing values, we will check for outliers by generating boxplot for the attributes. There are no outliers for “Number of suicides” and “Total number of deaths from 2009-2015”, but we can see that in the column "percentage of suicides there are six outliers which have to be handled. We can replace them using the 5th and 95th quartile based on if the value is less than the lower fence or greater than the upper fence respectively using cap() function.
boxplot(y$`Number of suicides `)

boxplot(y$`Total Number of deaths from 2009-2015`)

z<-boxplot(y$`Percentage of suicide`)

z$out
[1] 3.882476 4.587156 4.564315 4.624277 4.794521 4.099061
cap <- function(x){
quantiles <- quantile( x, c(.05, 0.25, 0.75, .95 ) )
x[ x < quantiles[2] - 1.5*IQR(x) ] <- quantiles[1]
x[ x > quantiles[3] + 1.5*IQR(x) ] <- quantiles[4]
x
}
y$`Percentage of suicide`<-cap(y$`Percentage of suicide`)
boxplot(y$`Percentage of suicide`)

Transform
To further proceed with statistical analysis, data transformation is requisite.
Below is the situation where we might need transformations.
1.For better understanding we may need to change the scale or standardize the values of a variable.
2.We may need to transform complex non-linear relationships into linear relationships.
3.In measurable induction, normal distribution is preferred over skewed distribution. Along these lines, at whatever point we have skewed distribution or heterogeneous of variances, we can use transformations which can decrease skewness or heterogeneity of variances.
4.By using hist() function we can observe “Number of suicides”, “Total Number of deaths from 2009-2015” and “Percentage of suicide” having a right-skewed distribution.
5.We are using boxcox transformation for “Number of suicides” which is an non-normal data and the Box-Cox transformation is a type of power transformation to transform non-normal data into a normal distribution.
6.Another transformation is the square root transformation. It is additionally utilized for decreasing right skewness, and furthermore has the advantage that it can be applied to zero values. The square root transformation is applied to “Total Number of deaths from 2009-2015” and “Percentage of suicide” for reducing right skewness.
hist(y$`Number of suicides `, main = "Histogram of number of suicides", xlab = "Suicides")

hist(y$`Total Number of deaths from 2009-2015`, main = "Total number of deaths", xlab = "Deaths")

hist(y$`Percentage of suicide`, main = "Percentage of suicides",xlab = "Percentage of suicides")

#Boxcox transformation on 'number of suicides'
boxcox_suicides<- BoxCox(y$`Number of suicides `,lambda = "auto")
hist(boxcox_suicides)

#square root transformation on total number of deaths
sqrt_deaths<-sqrt(y$`Total Number of deaths from 2009-2015`)
hist(sqrt_deaths,main = "Histogram after transformation - Total number of deaths", xlab = "Total number of deaths")

# square root transformation on percentage of suicides
sqrt_percentage<-sqrt(y$`Percentage of suicide`)
hist(sqrt_percentage,main = "Histogram after transformation - Percentage of suicide", xlab = "Percentage of suicides")

NA
NA
LS0tCnRpdGxlOiAiTUFUSDIzNDkgU2VtZXN0ZXIgMSwgMjAyMCIKYXV0aG9yOiAiSk9FTCBWQVJHSEVTRSBDSEVSSUFOIChTMzgwODAzMykiCnN1YnRpdGxlOiBBc3NpZ25tZW50IDIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKLS0tCgoKIyMgUmVxdWlyZWQgcGFja2FnZXMgCgpUaGUgcGFja2FnZXMgc2hvd24gYmVsb3cgYXJlIHVzZWQgaW4gbXkgcmVwb3J0IGZvciBnZW5lcmF0aW5nIG91dHB1dHMuCgpgYGB7cn0KIyBUaGlzIGlzIHRoZSBSIGNodW5rIGZvciB0aGUgcmVxdWlyZWQgcGFja2FnZXMKbGlicmFyeShyZWFkcikKbGlicmFyeShyZWFkeGwpCmxpYnJhcnkoZm9yZWlnbikKbGlicmFyeShydmVzdCkKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5cikKbGlicmFyeShkZWR1Y3RpdmUpCmxpYnJhcnkoZGVkdWNvcnJlY3QpCmxpYnJhcnkodmFsaWRhdGUpCmxpYnJhcnkoZm9yZWNhc3QpCmxpYnJhcnkoc3RyaW5ncikKbGlicmFyeShvdXRsaWVycykKbGlicmFyeShNQVNTKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoa25pdHIpIAoKYGBgCgoKIyMgRXhlY3V0aXZlIFN1bW1hcnkgCgpXZSBhcmUgYW5hbHl6aW5nIHRoZSBwZXJjZW50YWdlIG9mIHN1aWNpZGUgd2l0aGluIEF1c3RyYWxpYSBvdmVyIHRoZSB0aW1lIHBlcmlvZCAyMDA5IOKAkyAyMDE1LiBUaGUgZGF0YXNldCBoYXZpbmcgdGhlIG51bWJlciBvZiBkZWF0aCBhbmQgc3VpY2lkZSBpcyB0YWtlbiBmcm9tIHRoZSBzaXRlIG9mIEF1c3RyYWxpYW4gQnVyZWF1IG9mIFN0YXRpc3RpY3MgYW5kIHdlIGFyZSBhbmFseXppbmcgdGhlIHN1aWNpZGUgcmF0ZSBpbiBBdXN0cmFsaWEgY29tcGFyaW5nIHRvIHRoZSBvdmVyYWxsIGRlYXRoIHJhdGUgaW4gZGlmZmVyZW50IHByb3ZpbmNlcy4gVGhlIGFuYWx5c2lzIGlzIHJlbGV2YW50IGFzIGlmIHdlIGtub3cgdGhlIHBhdHRlcm4gaW4gdGhlIHN1aWNpZGUgcmF0ZSB3ZSBjYW4gZ2V0IHRvIGtub3cgaWYgdGhlIHN0YXRl4oCZcyBzdWl0YWJpbGl0eSBmb3IgbGl2aW5nLiBBcyB3ZSBrbm93IHRoZSBkYXRhLCB3ZSBnb3QgaXMgcmF3IGFuZCBpdCB3aWxsIGJlIG5vaXN5LiBTbywgYmVmb3JlIHdlIHN0YXJ0IHdpdGggdGhlIGFuYWx5c2lzLCB3ZSBuZWVkIHRvIGRvIGRhdGEgY2xlYW5zaW5nLiBUaGUgZGF0YSB3ZSBoYXZlIHdpbGwgaW5jbHVkZSBtaXNzaW5nIHZhbHVlcywgb3V0bGllcnMgZXRjLiAKCldlIHdpbGwgZmlyc3QgcmVhZCB0aGUgMiBmaWxlcywgb25lIGZvciB0aGUgZGVhdGggZGV0YWlscyBhbmQgb3RoZXIgd2l0aCBzdWljaWRlIHJhdGVzLCB1c2luZyB0aGUgcmVhZF94bHN4KCkuIFdlIHdpbGwgdGhlbiBjb21iaW5lIGJvdGggdGhlIGZpbGVzIHVzaW5nIGxlZnQgam9pbiBhbmQgY3JlYXRlIGEgc2luZ2xlIGRhdGFzZXQuIEFzIG5vdyB3ZSBoYXZlIGEgc2luZ2xlIGRhdGFzZXQgd2l0aCB0aGUgc3VpY2lkZSBjb3VudCBhbmQgZGVhdGggY291bnQsIHdlIHdpbGwgY2FsY3VsYXRlIHRoZSBwZXJjZW50YWdlIG9mIHN1aWNpZGUgYW5kIGFkZCBpdCB0byB0aGUgZGF0YSB1c2luZyBtdXRhdGUgZnVuY3Rpb24uIFdlIG5vdyBoYXZlIGFsbCB0aGUgZGV0YWlscyByZXF1aXJlZCwgd2UgbmVlZCB0byBjaGVjayBmb3IgbWlzc2luZyB2YWx1ZXMgYW5kIG91dGxpZXJzLiBUaGUgZnVuY3Rpb24gaXMubmEoKSB3YXMgdXNlZCB0byBjaGVjayB0aGUgbWlzc2luZyB2YWx1ZXMsIGluIHRoaXMgY2FzZSB0aGVyZSB3ZXJlIG5vIG1pc3NpbmcgdmFsdWVzIGluIHRoZSBkYXRhc2V0LiBJZiB3ZSBoYWQgYW55IG1pc3NpbmcgdmFsdWVzLCB3ZSBjb3VsZCBjaGVjayBmb3IgdGhlIHNrZXduZXNzIGFuZCB0aGVuIGJhc2VkIG9uIHRoYXQgY2FuIHJlcGxhY2UgdGhlbSB3aXRoIG1lZGlhbiBvciBtZWFuLiBOZXh0IHdlIHdpbGwgY2hlY2sgZm9yIHRoZSBvdXRsaWVycy4gVGhlIGRhdGEgaGFzIG91dGxpZXJzIGFuZCB3ZSBuZWVkIHRvIGhhbmRsZSB0aGVtLiBXZSB3aWxsIGNoZWNrIGlmIHRoZSBkYXRhIGlzIGxlc3MgdGhhbiB0aGUgbG93ZXIgZmVuY2UsIGlmIHNvLCBpdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IFExIGFuZCBpZiBpdCBpcyBncmVhdGVyIHRoYW4gdGhlIHVwcGVyIGZlbmNlLCB3ZSB3aWxsIHJlcGxhY2UgdGhlIG91dGxpZXJzIHdpdGggUTQgYW5kIG5vdyBvdXIgZGF0YSBpcyByZWFkeSBmb3IgYW5hbHlzaXMuRmluYWxpbmcgd2UgY2FuIGRvIGRhdGEgdHJhbnNmb3JtYXRpb24gdG8gdHJhbnNmb3JtIGNvbXBsZXggbm9uLWxpbmVhciByZWxhdGlvbnNoaXBzIGludG8gbGluZWFyIHJlbGF0aW9uc2hpcHMuCgoKIyMgRGF0YSAKClRoZSBkYXRhc2V0cyBhcmUgcmVhZCBpbnRvIFIgYXMgZXhjZWwgZmlsZXMuIFRoZXJlIGFyZSB0d28gZGF0YXNldHMgdXNlZCBpbiB0aGlzIHJlcG9ydCB0aGUgZmlyc3Qgb25lIGlzIGEgbGlzdCBvZiBkZWF0aHMgcmVnaXN0ZXJlZCBieSBzZXgsIHN0YXRlcyBhbmQgdGVycml0b3JpZXMgYW5kIHRoZSBzZWNvbmQgZGF0YXNldHMgaW50ZW50aW9uYWwgc2VsZi1oYXJtIGJ5IFN0YXRlIGFuZCB0ZXJyaXRvcnkgb2YgdXN1YWwgcmVzaWRlbmNlIGFuZCBTZXgsIEFnZS1zdGFuZGFyZGl6ZWQgZGVhdGggcmF0ZXMsIDIwMDktMjAxNS5UaGUgZGVhdGggZGF0YXNldCBpcyBpbXBvcnRlZCBmcm9tICJodHRwczovL3d3dy5hYnMuZ292LmF1L2F1c3N0YXRzL2Fic0AubnNmL21mLzMxMDUuMC42NS4wMDEvIiBhbmQgdGhlIHN1aWNpZGUgZGF0YXNldCBpcyBpbXBvcnRlZCBmcm9tICJodHRwczovL3d3dy5hYnMuZ292LmF1L0FVU1NUQVRTL2Fic0AubnNmL0RldGFpbHNQYWdlLzMzMDMuMDIwMTg/T3BlbkRvY3VtZW50Ii5UaGlzIGlzIGFuIG9wZW4gc291cmNlIG9mIGRhdGFzZXRzLgoKCmBgYHtyfQoKc2V0d2QoIi9Vc2Vycy9qb2VsanZjL0Rlc2t0b3AvUiAiKQpnZXR3ZCgpCgpkZWF0aF8xIDwtcmVhZF94bHMoIlRvdGFsX2RlYXRoLnhscyIsc2hlZXQ9IlRhYmxlIDUuMSIsc2tpcCA9IDQpCgpzdWljaWRlczwtcmVhZF94bHMoIiBpbnRlbnRpb25hbCBzZWxmaGFybS54bHMiLHNoZWV0PSJUYWJsZSAxMS42Iixza2lwPTYpCgpgYGAKCiMjIFVuZGVyc3RhbmQgCgpUaGUgZmllbGQgYW5kIGl0cyBkZXNjcmlwdGlvbiBpcyBnaXZlbiBiZWxvdzoKCioqRGF0YSB2YXJpYWJsZXMKCkRhdGEgMSAtIGRlYXRoXzEgICAgICAgICAgCjEuU3RhdGVzIC0gTmFtZSBvZiBlYWNoIHN0YXRlcyBpbiBBdXN0cmFsaWEuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCjIuWWVhciAtIFRpbWUgcGVyaW9kIGZyb20gMjAwOS0yMDE1LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCjMuVG90YWwgbnVtYmVyIG9mIGRlYXRocyBmcm9tIDIwMDktMjAxNSAtIFRoaXMgc2hvd3MgdGhlIHRvdGFsIG51bWJlciBvZiBkZWF0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApEYXRhIDIgLXN1aWNpZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoxLlN0YXRlcyAtTmFtZSBvZiBzdGF0ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCjIuWWVhciAtVGltZSBwZXJpb2QgZnJvbSAyMDA5LTIwMTUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKMy5OdW1iZXIgb2Ygc3VpY2lkZXMgLU51bWJlciBvZiBTdWljaWRlcyBvZiBlYWNoIHN0YXRlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoKYGBge3J9CgpkZWF0aF8yPC0gZGVhdGhfMVstYygxOjIzLDMyOjU1KSwtYygyOjE4NildCnN0cihkZWF0aF8yKQpuYW1lcyhkZWF0aF8yKVtuYW1lcyhkZWF0aF8yKSA9PSAiLi4uMSJdIDwtICJTdGF0ZXMiCgpzdWljaWRlc18xPC0gc3VpY2lkZXNbLWMoMToyNSwzNDo0NyksLWMoOToxMyldCnN0cihzdWljaWRlc18xKQoKYGBgCgojIwlUaWR5ICYgTWFuaXB1bGF0ZSBEYXRhIEkgCgpCb3RoIG9mIHRoZSBkYXRhc2V0cyB3ZXJlIHVudGlkeSBhbmQgdG8gdGlkeSB0aGlzIGRhdGFzZXQsIHdlIG5lZWQgdG8gZ2F0aGVyIHRoZSBjb2x1bW5zIGludG8gYSBuZXcgcGFpciBvZiB2YXJpYWJsZXMgYW5kIHdpdGggZ2F0aGVyKCkgZnVuY3Rpb24gd2l0aCB0aGUgcGFyYW1ldGVycyB5ZWFyIHZhbHVlcyAyMDA5LTIwMTUsIGFuZCB0aGUgY29sdW1uIG5hbWUgaXMgZ2l2ZW4gYXMgeWVhciwgdGhlIG51bWJlciBvZiBzdWljaWRlcyBpcyBnaXZlbiBhcyB2YWx1ZXMsIHNpbmNlIHRoYXQgaXMgdGhlIG9uZSB3aGljaCBzcHJlYWQgb3ZlciB0aGUgc3VpY2lkZSBmaWxlIGFuZCB0b3RhbCBudW1iZXIgb2YgZGVhdGhzIGlzIGdpdmVuIGFzIHZhbHVlcyBmb3IgZGVhdGggZmlsZXMuCgpgYGB7cn0KIApzdWljaWRlc18xPC1zdWljaWRlc18xICU+JQogIGdhdGhlcignMjAwOScsJzIwMTAnLCcyMDExJywnMjAxMicsJzIwMTMnLCcyMDE0JywnMjAxNScsa2V5ID0gInllYXIiLHZhbHVlID0gIk51bWJlciBvZiBzdWljaWRlcyAiKQpuYW1lcyhzdWljaWRlc18xKVtuYW1lcyhzdWljaWRlc18xKSA9PSAiLi4uMSJdIDwtIlN0YXRlcyIKCmRlYXRoXzU8LWdhdGhlcihkZWF0aF8yLCcyMDA5JywnMjAxMCcsJzIwMTEnLCcyMDEyJywnMjAxMycsJzIwMTQnLCcyMDE1Jywga2V5ID0gInllYXIiLHZhbHVlID0gIlRvdGFsIE51bWJlciBvZiBkZWF0aHMgZnJvbSAyMDA5LTIwMTUiKQpjb2xuYW1lcyhkZWF0aF81KQoKYGBgCgojI0pvaW5pbmcgRGF0YXNldHMgYW5kIFR5cGUgQ29udmVyc2lvbgoKc2luY2Ugd2UgaGF2ZSBjaGFuZ2UgdGhlIGRhdGFzZXRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQgd2UgY2FuIGpvaW4gYm90aCB0aGUgZGF0YXNldHMgdXNpbmcgbGVmdF9qb2luKCkgZnVuY3Rpb25zIG92ZXIgU3RhdGVzIGFuZCB5ZWFyIGNvbHVtbnMuIFVzaW5nIHN0cigpIHdlIGNoZWNrIHRoZSBjb2x1bW5zIGFyZSBjb3JyZWN0IGZvcm1hdCBhbmQgY291bGQgZmluZCB0aGF0IHRoZSBjb2x1bW4gIk51bWJlciBvZiBzdWljaWRlcyIgaXMgaW4gY2hhcmFjdGVyIGRhdGEgdHlwZSBldmVuIHRob3VnaCBpdCBjbGVhcmx5IGhvbGRzIG51bWVyaWNhbCBkYXRhLiBTbyB3ZSB3aWxsIGNvbnZlcnQgaXQgaW50byBudW1lcmljIHVzaW5nIGFzLm51bWVyaWMoKS5XZSBoYXZlIHRoZSBzdGF0ZSBjb2x1bW4gaGF2aW5nIHRoZSBzdGF0ZSBkZXRhaWxzIGFuZCB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gbGV2ZWxzIHVzaW5nIGZhY3RvcigpLgoKYGBge3J9Cng8LWxlZnRfam9pbihzdWljaWRlc18xLGRlYXRoXzUsYnk9IGMoIlN0YXRlcyIsInllYXIiKSkKc3RyKHgpCngkYE51bWJlciBvZiBzdWljaWRlcyBgPC0gYXMubnVtZXJpYyh4JGBOdW1iZXIgb2Ygc3VpY2lkZXMgYCkKeCRTdGF0ZXM8LWZhY3Rvcih4JFN0YXRlcyxsZXZlbHM9YygiTlNXIiwiVmljLiIsIlFsZCIsIlNBIiwiV0EiLCJUYXMuIiwiTlQiLCJBQ1QiKSxvcmRlcmVkID0gVFJVRSkKbGV2ZWxzKHgkU3RhdGVzKQoKYGBgCgojIwlUaWR5ICYgTWFuaXB1bGF0ZSBEYXRhIElJIAoKMS5CeSB1c2luZyBtdXRhdGUoKSBmdW5jdGlvbiB3ZSBjYW4gYWRkIHRoZSBuZXcgdmFyaWFibGUgIlBlcmNlbnRhZ2Ugb2Ygc3VpY2lkZSIgd2hpbGUgcHJlc2VydmluZyB0aGUgZXhpc3RpbmcgdmFyaWFibGVzLiAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCjIuVGhlIG5ldyB2YXJpYWJsZSAiUGVyY2VudGFnZSBvZiBzdWljaWRlIiBpcyBjcmVhdGVkIHRvIGtub3cgdGhlIHBlcmNlbnRhZ2UgdmFsdWUgb2YgYm90aCAiTnVtYmVyIG9mIHN1aWNpZGVzIiBhbmQgIlRvdGFsIE51bWJlciBvZiBkZWF0aHMgZnJvbSAyMDA5LTIwMTUiLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKYGBge3J9CgoKeTwtbXV0YXRlKHgsIlBlcmNlbnRhZ2Ugb2Ygc3VpY2lkZSI9KHgkYE51bWJlciBvZiBzdWljaWRlcyBgIC8geCRgVG90YWwgTnVtYmVyIG9mIGRlYXRocyBmcm9tIDIwMDktMjAxNWApKjEwMCkKCmBgYAoKCiMjCVNjYW4gSSAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAKMS5XaXRoIHRoZSBpcy5uYSgpIGZ1bmN0aW9ucyB0aGUgbWlzc2luZyB2YWx1ZXMgaXMgYmVpbmcgY2hlY2tlZCBhbmQgZHVyaW5nIHRoZSBkYXRhIHByZXByb2Nlc3NpbmcgbWV0aG9kIHRoaXMgZGF0YXNldHMgaGFzIG5vIG1pc3NpbmcgdmFsdWVzLCBzcGVjaWFsIHZhbHVlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoyLk9idmlvdXMgZXJyb3JzIG9yIGluY29uc2lzdGVuY2llcyBhcmUgYWxzbyBjaGVja2VkIGluIHRoZSBkYXRhc2V0LgoKCmBgYHtyfQoKY29sU3Vtcyhpcy5uYSh5KSkKCmBgYAoKCiMjCVNjYW4gSUkKICAgICAgCkFzIHdlIGFyZSBkb25lIHdpdGggYSBoYW5kbGluZyBtaXNzaW5nIHZhbHVlcywgd2Ugd2lsbCBjaGVjayBmb3Igb3V0bGllcnMgYnkgZ2VuZXJhdGluZyBib3hwbG90IGZvciB0aGUgYXR0cmlidXRlcy4gVGhlcmUgYXJlIG5vIG91dGxpZXJzIGZvciAiTnVtYmVyIG9mIHN1aWNpZGVzIiBhbmQgIlRvdGFsIG51bWJlciBvZiBkZWF0aHMgZnJvbSAyMDA5LTIwMTUiLCBidXQgd2UgY2FuIHNlZSB0aGF0IGluIHRoZSBjb2x1bW4gInBlcmNlbnRhZ2Ugb2Ygc3VpY2lkZXMgdGhlcmUgYXJlIHNpeCBvdXRsaWVycyB3aGljaCBoYXZlIHRvIGJlIGhhbmRsZWQuIFdlIGNhbiByZXBsYWNlIHRoZW0gdXNpbmcgdGhlIDV0aCBhbmQgOTV0aCBxdWFydGlsZSBiYXNlZCBvbiBpZiB0aGUgdmFsdWUgaXMgbGVzcyB0aGFuIHRoZSBsb3dlciBmZW5jZSBvciBncmVhdGVyIHRoYW4gdGhlIHVwcGVyIGZlbmNlIHJlc3BlY3RpdmVseSB1c2luZyBjYXAoKSBmdW5jdGlvbi4gICAgICAgICAgIAoKYGBge3J9Cgpib3hwbG90KHkkYE51bWJlciBvZiBzdWljaWRlcyBgKQpib3hwbG90KHkkYFRvdGFsIE51bWJlciBvZiBkZWF0aHMgZnJvbSAyMDA5LTIwMTVgKQp6PC1ib3hwbG90KHkkYFBlcmNlbnRhZ2Ugb2Ygc3VpY2lkZWApCnokb3V0CgpjYXAgPC0gZnVuY3Rpb24oeCl7CiAgcXVhbnRpbGVzIDwtIHF1YW50aWxlKCB4LCBjKC4wNSwgMC4yNSwgMC43NSwgLjk1ICkgKQogIHhbIHggPCBxdWFudGlsZXNbMl0gLSAxLjUqSVFSKHgpIF0gPC0gcXVhbnRpbGVzWzFdCiAgeFsgeCA+IHF1YW50aWxlc1szXSArIDEuNSpJUVIoeCkgXSA8LSBxdWFudGlsZXNbNF0KICB4Cn0KeSRgUGVyY2VudGFnZSBvZiBzdWljaWRlYDwtY2FwKHkkYFBlcmNlbnRhZ2Ugb2Ygc3VpY2lkZWApCmJveHBsb3QoeSRgUGVyY2VudGFnZSBvZiBzdWljaWRlYCkKCmBgYAoKCiMjCVRyYW5zZm9ybSAKClRvIGZ1cnRoZXIgcHJvY2VlZCB3aXRoIHN0YXRpc3RpY2FsIGFuYWx5c2lzLCBkYXRhIHRyYW5zZm9ybWF0aW9uIGlzIHJlcXVpc2l0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApCZWxvdyBpcyB0aGUgc2l0dWF0aW9uIHdoZXJlIHdlIG1pZ2h0IG5lZWQgdHJhbnNmb3JtYXRpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoxLkZvciBiZXR0ZXIgdW5kZXJzdGFuZGluZyB3ZSBtYXkgbmVlZCB0byBjaGFuZ2UgdGhlIHNjYWxlIG9yIHN0YW5kYXJkaXplIHRoZSB2YWx1ZXMgb2YgYSB2YXJpYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoyLldlIG1heSBuZWVkIHRvIHRyYW5zZm9ybSBjb21wbGV4IG5vbi1saW5lYXIgcmVsYXRpb25zaGlwcyBpbnRvIGxpbmVhciByZWxhdGlvbnNoaXBzLiAgICAgICAgICAgICAgICAgICAgICAgICAgCjMuSW4gbWVhc3VyYWJsZSBpbmR1Y3Rpb24sIG5vcm1hbCBkaXN0cmlidXRpb24gaXMgcHJlZmVycmVkIG92ZXIgc2tld2VkIGRpc3RyaWJ1dGlvbi4gQWxvbmcgdGhlc2UgbGluZXMsIGF0IHdoYXRldmVyIHBvaW50IHdlIGhhdmUgc2tld2VkIGRpc3RyaWJ1dGlvbiBvciBoZXRlcm9nZW5lb3VzIG9mIHZhcmlhbmNlcywgd2UgY2FuIHVzZSB0cmFuc2Zvcm1hdGlvbnMgd2hpY2ggY2FuIGRlY3JlYXNlIHNrZXduZXNzIG9yIGhldGVyb2dlbmVpdHkgb2YgdmFyaWFuY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCjQuQnkgdXNpbmcgaGlzdCgpIGZ1bmN0aW9uIHdlIGNhbiBvYnNlcnZlICJOdW1iZXIgb2Ygc3VpY2lkZXPigJ0sIOKAnFRvdGFsIE51bWJlciBvZiBkZWF0aHMgZnJvbSAyMDA5LTIwMTUiIGFuZCAiUGVyY2VudGFnZSBvZiBzdWljaWRlIiBoYXZpbmcgYSByaWdodC1za2V3ZWQgZGlzdHJpYnV0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCjUuV2UgYXJlIHVzaW5nIGJveGNveCB0cmFuc2Zvcm1hdGlvbiBmb3IgIk51bWJlciBvZiBzdWljaWRlcyIgd2hpY2ggaXMgYW4gbm9uLW5vcm1hbCBkYXRhIGFuZCB0aGUgQm94LUNveCB0cmFuc2Zvcm1hdGlvbiBpcyBhIHR5cGUgb2YgcG93ZXIgdHJhbnNmb3JtYXRpb24gdG8gdHJhbnNmb3JtIG5vbi1ub3JtYWwgZGF0YSBpbnRvIGEgbm9ybWFsIGRpc3RyaWJ1dGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo2LkFub3RoZXIgdHJhbnNmb3JtYXRpb24gaXMgdGhlIHNxdWFyZSByb290IHRyYW5zZm9ybWF0aW9uLiBJdCBpcyBhZGRpdGlvbmFsbHkgdXRpbGl6ZWQgZm9yIGRlY3JlYXNpbmcgcmlnaHQgc2tld25lc3MsIGFuZCBmdXJ0aGVybW9yZSBoYXMgdGhlIGFkdmFudGFnZSB0aGF0IGl0IGNhbiBiZSBhcHBsaWVkIHRvIHplcm8gdmFsdWVzLiBUaGUgc3F1YXJlIHJvb3QgdHJhbnNmb3JtYXRpb24gaXMgYXBwbGllZCB0byAiVG90YWwgTnVtYmVyIG9mIGRlYXRocyBmcm9tIDIwMDktMjAxNSIgYW5kICJQZXJjZW50YWdlIG9mIHN1aWNpZGUiIGZvciByZWR1Y2luZyByaWdodCBza2V3bmVzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgoKYGBge3J9CgpoaXN0KHkkYE51bWJlciBvZiBzdWljaWRlcyBgLCBtYWluID0gIkhpc3RvZ3JhbSBvZiBudW1iZXIgb2Ygc3VpY2lkZXMiLCB4bGFiID0gIlN1aWNpZGVzIikKaGlzdCh5JGBUb3RhbCBOdW1iZXIgb2YgZGVhdGhzIGZyb20gMjAwOS0yMDE1YCwgbWFpbiA9ICJUb3RhbCBudW1iZXIgb2YgZGVhdGhzIiwgeGxhYiA9ICJEZWF0aHMiKQpoaXN0KHkkYFBlcmNlbnRhZ2Ugb2Ygc3VpY2lkZWAsIG1haW4gPSAiUGVyY2VudGFnZSBvZiBzdWljaWRlcyIseGxhYiA9ICJQZXJjZW50YWdlIG9mIHN1aWNpZGVzIikKCiNCb3hjb3ggdHJhbnNmb3JtYXRpb24gb24gJ251bWJlciBvZiBzdWljaWRlcycKYm94Y294X3N1aWNpZGVzPC0gQm94Q294KHkkYE51bWJlciBvZiBzdWljaWRlcyBgLGxhbWJkYSA9ICJhdXRvIikKaGlzdChib3hjb3hfc3VpY2lkZXMpCgojc3F1YXJlIHJvb3QgdHJhbnNmb3JtYXRpb24gb24gdG90YWwgbnVtYmVyIG9mIGRlYXRocwpzcXJ0X2RlYXRoczwtc3FydCh5JGBUb3RhbCBOdW1iZXIgb2YgZGVhdGhzIGZyb20gMjAwOS0yMDE1YCkgCmhpc3Qoc3FydF9kZWF0aHMsbWFpbiA9ICJIaXN0b2dyYW0gYWZ0ZXIgdHJhbnNmb3JtYXRpb24gLSBUb3RhbCBudW1iZXIgb2YgZGVhdGhzIiwgeGxhYiA9ICJUb3RhbCBudW1iZXIgb2YgZGVhdGhzIikKCiMgc3F1YXJlIHJvb3QgdHJhbnNmb3JtYXRpb24gb24gcGVyY2VudGFnZSBvZiBzdWljaWRlcyAKc3FydF9wZXJjZW50YWdlPC1zcXJ0KHkkYFBlcmNlbnRhZ2Ugb2Ygc3VpY2lkZWApCmhpc3Qoc3FydF9wZXJjZW50YWdlLG1haW4gPSAiSGlzdG9ncmFtIGFmdGVyIHRyYW5zZm9ybWF0aW9uIC0gUGVyY2VudGFnZSBvZiBzdWljaWRlIiwgeGxhYiA9ICJQZXJjZW50YWdlIG9mIHN1aWNpZGVzIikKCgpgYGAKCiMjIFJlZmVyZW5jZSBMaXN0CgpodHRwczovL3d3dy5hYnMuZ292LmF1L2F1c3N0YXRzL2Fic0AubnNmL21mLzMxMDUuMC42NS4wMDEvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApodHRwczovL3d3dy5hYnMuZ292LmF1L0FVU1NUQVRTL2Fic0AubnNmL0RldGFpbHNQYWdlLzMzMDMuMDIwMTg/ICAgICAgICAgICAgICAgCmh0dHA6Ly9yYXJlLXBob2VuaXgtMTYxNjEwLmFwcHNwb3QuY29tL3NlY3VyZWQvaW5kZXguaHRtbCAgICAgICAgICAgICAgICAgICAgCgo8YnI+Cjxicj4K