Individual Details

Executive Statement

Coles and Woolworths are the two most dominant supermarkets chains in Australia. As customer, are Australians better off shopping at one rather than the other? The aim of this investigation is to determine whether Coles or Woolworths is significantly cheaper than the other.

Sample

To complete this research, the current cost of 45 matched supermarket products were collected from Coles and Woolworths. Data was collected via the Coles and the Woolworths online shopping websites. I created an initial list of generic supermarket items, eg eggs, bread, based on the Choice Magazine Comparison. This inital list had 31 items to which I added an additional 15 items, making a total number of sampled items to 45.

The pairs of products sampled were collected on the same day (6 May 2017) and were perfect matches with the same brand, size, weight, flavour etc. As such, no homebrand items were sampled. All product prices are full price, sale items were not included. The collection process began with a search on each supermarket websites for the generic item eg “eggs”, and then selected the first item listed that matched on both websites. This method could be improved considerably to create a more random sample, however for the purpose of this assignment, 45 it has provided a satisfactory sample that covers a variety of products.

Variables

Date: Data collection date

Item: Generic description of supermarket item

Detailed Product Description: specific details eg brand and weight, of sampled items.

Coles Price: Price of item at Coles Supermarket

Woolworths Price: Price of item at Woolworths Supermarket

Proceedure

Collated data was entered into an Excel spreadsheet, saved as CSV file and imported into R Studio to be analysed. Initial data inspection included summarising data, visualising data and comparing data to a normal distribution. This lead to filtering out 4 outliers. As the research requires comparing two dependent data sets, the cost of 45 matched items at Coles and Woolworths, the Paired-Sample t-test was selected to test the null hypothesis, that there is no significant price difference between Coles and Woolworths.

Results

Although the initial review of the data shows that Coles items are generally more expensive than Woolworths items the results conclude that there is no significant difference between Coles and Woolworths prices, and the data analysis fails to reject the null hypothesis.

Load Packages and Data

library(dplyr)
library(ggplot2)
library(magrittr)
library(lubridate)
library(granova)
library(car)
library(readr)
library(readr)
Supermarket <- read_csv("~/Documents/Master (GIS)/Statistics/Assignment 3/Assignment 3/Supermarket comparison 060517.csv")
Coles<-Supermarket$`Coles Price`
Woolies<-Supermarket$`Woolworths Price`

Summary Statistics

Summary statistics for Coles product prices show that the mean product price is $6.01, with products ranging between $1.40 and $20.00.

Supermarket %>% summarise(
  Min = min(Coles, na.rm = TRUE),
  Q1 = quantile(Coles, probs = .25, na.rm = TRUE),
  Median = median(Coles, na.rm = TRUE),
  Q3 = quantile(Coles, probs = .75, na.rm = TRUE),
  Max = max(Coles, na.rm = TRUE),
  Mean = mean(Coles, na.rm = TRUE),
  SD = sd(Coles, na.rm = TRUE),
  n = n(),
  Missing = sum(is.na(Coles)))

Summary statistics for Woolworths product prices show that the mean product price is $5.69, 31 cents cheaper than Coles, with products also ranging in price between $1.40 and $20.00.

Supermarket %>% summarise(
  Min = min(Woolies, na.rm = TRUE),
  Q1 = quantile(Woolies, probs = .25, na.rm = TRUE),
  Median = median(Woolies, na.rm = TRUE),
  Q3 = quantile(Woolies, probs = .75, na.rm = TRUE),
  Max = max(Woolies, na.rm = TRUE),
  Mean = mean(Woolies, na.rm = TRUE),
  SD = sd(Woolies, na.rm = TRUE),
  n = n(),
  Missing = sum(is.na(Woolies)))

To visualise these statistics a box plot has been selected to illustrate the similarities and differences between the two supermarkets product prices, specifically the mean, standard deviation, range and outliers. The plot shows that the data for each of the two supermarkets is very similar, however Woolworths has a smaller range in price between Q1 and Q3 compared to Coles.

boxplot(Coles, Woolies, ylab = "Product Price $", xlab = "Supermarket")
axis(1, at = 1:2, labels = c("Coles", "Woolworths"), 
title (main = "Boxplot Comparing Supermarket Prices"))

The Line Plot is suitable for comparing paired samples, demonstrating the price difference between each individual product sampled in one visualisation. Horizontal lines demonstrate little or no difference, angled lines demonstrate difference. This Line Plot shows that most product prices don’t vary greatly between the two supermarkets, some products are more expensive at Coles than Woolworths, and only one product appears to be more expensive at Woolworths than Coles.

matplot(t(data.frame(Coles, Woolies)),type = "b",pch = 19,col = 1,lty = 1, xlab = "Supermarket", ylab = "Product Price", xaxt = "n")
axis(1, at = 1:2, labels = c("Coles", "Woolworths"))
title(main = "Line Plot comparing Supermarket Prices")

Calculate the Difference, Coles minus Woolworths prices, to visualise and compare to normal distribution.

Supermarket_Costs_Differences <- Supermarket %>% mutate(d = Coles - Woolies)
qqPlot(Supermarket_Costs_Differences$d, dist="norm", ylab = "Price Difference", xlab = "Normal Quantiles")

The Q-Q plot shows that most of the data is within the normal distribution range with some outliers at each end. Most of the data is quite crowded between the -1 and 1 quantiles. To improve the distribution and the further data analysis, the outliers with a price difference greater than $1.50 have been filtered out. This process removed four product items; chicken, tampons, strawberries and dish washing tablets.

Supermarket_Clean_Difference<-filter(Supermarket_Costs_Differences, d < 1.5 & d > -1.50) 
qqPlot(Supermarket_Clean_Difference$d, dist="norm", ylab = "Price Difference", xlab = "Normal Quantiles")

The filtered data, as illustrated in the refreshed Q-Q plot, has reduced the price difference to between Coles and Woolworths to be -$0.20 to $1.00, instead of $3.00. This data still favors Woolworths for being the cheaper supermarket.

Variables have been filtered to remove outliers to be able to continue to conduct the analysis.

Coles_C<-Supermarket_Clean_Difference$`Coles Price`
Woolies_C<-Supermarket_Clean_Difference$`Woolworths Price`

The filtered supermarket data with 41 items has been used to run a statistic summary of the differnce between supermarket prices:

Supermarket_Clean_Difference %>% summarise(
  Min = min(d, na.rm = TRUE),
  Q1 = quantile(d, probs = .25, na.rm = TRUE),
  Median = median(d, na.rm = TRUE),
  Q3 = quantile(d, probs = .75, na.rm = TRUE),
  Max = max(d, na.rm = TRUE),
  Mean = mean(d, na.rm = TRUE),
  SD = sd(d, na.rm = TRUE),
  n = n(),
  Missing = sum(is.na(d)))

The results show that products are on average $0.27 more expensive at Coles than at Woolworths. The price differnece between the two stores varies between Woolworths being $0.20 more expensive than Coles to Coles being $0.99 more expensive than Woolworths. The standard deviation is 0.30.

Hypothesis Test

The null hypothesis of this test is that there is no signficiant price difference matched products purchased at Coles and Woolworths. The alternative hypothesis is that there is a significant difference.

Hypotheses for the paired (dependent) samples t-test: Null Hypothesis, H0:μΔ=0 Alternaitve Hypothesis, HA:μΔ≠0

Assumptions: Comparing the product price difference, μΔ, between two matched products, di=xi2−xi1. Δ are normally distributed Large sample has been used (filtered data set = 41 samples)

Decision Rules: Reject H0H0: If pp-value < 0.05 (α significance level) If 95% Confidence Interval(CI) of the mean difference does not capture H0:μΔ=0 If neither of these occur; fail to reject H0.

Conclusion: Test will be statistically significant if the H0 is rejected. If the test results fail to reject the H0, the test is not statistically significant.

Paired t-test calculations

t.test(Coles_C, Woolies_C, paired = TRUE, alternative = "two.sided")

    Paired t-test

data:  Coles_C and Woolies_C
t = 5.731, df = 40, p-value = 1.129e-06
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 0.1736776 0.3629078
sample estimates:
mean of the differences 
              0.2682927 

The 95% confidence interval (CI) of the mean is reported as [0.174, 0.363]. As the 95% CI captures the mean of the sample difference (0.268), we fail to reject Null Hypothesis. There is no statistically significant mean difference between supermarket prices.

p-value

2*pt(q = 5.731, df = 44)
[1] 1.999999

Using the results from the Paired t-test the p-value was calculated to be 2.00. As this is much larger than significance level of 0.05 (alpha), we fail to reject the Null Hypothesis. There is no significant mean difference in supermarket prices.

Summary of results

t = 5.731.

Degrees of freedom for this sample is 40 (df=nΔ−1, df=41-1).

95% CI [0.174, 0.363]

Mean of the difference = 0.268

P-value = 2.00

Interpretation

A paired-samples t-test was used to test for a significant mean difference between Coles and Woolworths supermarket product prices. The investigation found the mean difference to be 0.268 (SD = 0.300).

Visual inspection of the Q-Q plot showed that the orignal data set was not normally distributed. Subsequently, four items were filtered from the data to approximate the desired normally distribution.

The paired-samples t-test found no statistically significant mean between the prices of matched products at Coles and Woolworths, t (df=41)=5.731, p = 2.00, 95% [0.174, 0.363]. According to this data neither Coles nor Woolworths are cheaper than the other.

Discussion

Although the initial inspection of the supermarket comparison data showed Woolworths products to be cheaper, the results from both the p-value and the 95% CI support the decision to fail to reject the Null Hypothesis. According to results it won’t make a significant difference to our ‘back pocket’ which supermarket we choose to shop in if purchasing full priced, brand items.

The strengths of this investiagtion includes the consistancy that was met in matching items between Coles and Woolworths, the number of items sampled, and the consistant methodology, however the method of collecting the specific products could be improved.

Limitations arise in the comparison of only full priced, brand items. Savings between supermarkets can potentially be made through selecting sale items, or cheaper house brands. In addition, the prices were only collected from the respective supermarket websites not from visiting supermarkets. Prices in supermarkets vary across the country due to transport and availability of product items, variation of location has not been considered in this investigation.

Additional limitations include only viewing the data through the statistical lens of applying an appropriate test. The paired t-test has tested each Coles item against its match at Woolworths, but the cummulative difference has not been investigated. The average price difference between supermarkets was found to be $0.28. The difference is not significant, but when purchasing a full trolly full of products, the average saving of $0.28 per product adds up. When purchasing all these items Coles total was $270.34, Woolworths was $256. $16.34 is a good saving, but if this was an average families weeklies groceries, this would add up to $850 saving across a year.

LS0tCnRpdGxlOiAiTUFUSDEzMjQgQXNzaWdubWVudCAzIgpzdWJ0aXRsZTogIlN1cGVybWFya2V0IFByaWNlIFdhcnMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIEluZGl2aWR1YWwgRGV0YWlscwoKKiBQZW5lbG9wZSBMeW5jaCAoczM0ODI5MzApCgojIyBFeGVjdXRpdmUgU3RhdGVtZW50CgpDb2xlcyBhbmQgV29vbHdvcnRocyBhcmUgdGhlIHR3byBtb3N0IGRvbWluYW50IHN1cGVybWFya2V0cyBjaGFpbnMgaW4gQXVzdHJhbGlhLiBBcyBjdXN0b21lciwgYXJlIEF1c3RyYWxpYW5zIGJldHRlciBvZmYgc2hvcHBpbmcgYXQgb25lIHJhdGhlciB0aGFuIHRoZSBvdGhlcj8gVGhlIGFpbSBvZiB0aGlzIGludmVzdGlnYXRpb24gaXMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgQ29sZXMgb3IgV29vbHdvcnRocyBpcyBzaWduaWZpY2FudGx5IGNoZWFwZXIgdGhhbiB0aGUgb3RoZXIuIAoKCioqU2FtcGxlKioKClRvIGNvbXBsZXRlIHRoaXMgcmVzZWFyY2gsIHRoZSBjdXJyZW50IGNvc3Qgb2YgNDUgbWF0Y2hlZCBzdXBlcm1hcmtldCBwcm9kdWN0cyB3ZXJlIGNvbGxlY3RlZCBmcm9tIENvbGVzIGFuZCBXb29sd29ydGhzLiBEYXRhIHdhcyBjb2xsZWN0ZWQgdmlhIHRoZSBDb2xlcyBhbmQgdGhlIFdvb2x3b3J0aHMgb25saW5lIHNob3BwaW5nIHdlYnNpdGVzLiBJIGNyZWF0ZWQgYW4gaW5pdGlhbCBsaXN0IG9mIGdlbmVyaWMgc3VwZXJtYXJrZXQgaXRlbXMsIGVnIGVnZ3MsIGJyZWFkLCBiYXNlZCBvbiB0aGUgW0Nob2ljZSBNYWdhemluZSBDb21wYXJpc29uXShodHRwczovL3d3dy5jaG9pY2UuY29tLmF1L3Nob3BwaW5nL2V2ZXJ5ZGF5LXNob3BwaW5nL3N1cGVybWFya2V0cy9hcnRpY2xlcy9jaGVhcGVzdC1ncm9jZXJpZXMtYXVzdHJhbGlhKS4gVGhpcyBpbml0YWwgbGlzdCBoYWQgMzEgaXRlbXMgdG8gd2hpY2ggSSBhZGRlZCBhbiBhZGRpdGlvbmFsIDE1IGl0ZW1zLCBtYWtpbmcgYSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlZCBpdGVtcyB0byA0NS4gCgpUaGUgcGFpcnMgb2YgcHJvZHVjdHMgc2FtcGxlZCB3ZXJlIGNvbGxlY3RlZCBvbiB0aGUgc2FtZSBkYXkgKDYgTWF5IDIwMTcpIGFuZCB3ZXJlIHBlcmZlY3QgbWF0Y2hlcyB3aXRoIHRoZSBzYW1lIGJyYW5kLCBzaXplLCB3ZWlnaHQsIGZsYXZvdXIgZXRjLiBBcyBzdWNoLCBubyBob21lYnJhbmQgaXRlbXMgd2VyZSBzYW1wbGVkLiBBbGwgcHJvZHVjdCBwcmljZXMgYXJlIGZ1bGwgcHJpY2UsIHNhbGUgaXRlbXMgd2VyZSBub3QgaW5jbHVkZWQuIFRoZSBjb2xsZWN0aW9uIHByb2Nlc3MgYmVnYW4gd2l0aCBhIHNlYXJjaCBvbiBlYWNoIHN1cGVybWFya2V0IHdlYnNpdGVzIGZvciB0aGUgZ2VuZXJpYyBpdGVtIGVnICJlZ2dzIiwgYW5kIHRoZW4gc2VsZWN0ZWQgdGhlIGZpcnN0IGl0ZW0gbGlzdGVkIHRoYXQgbWF0Y2hlZCBvbiBib3RoIHdlYnNpdGVzLiBUaGlzIG1ldGhvZCBjb3VsZCBiZSBpbXByb3ZlZCBjb25zaWRlcmFibHkgdG8gY3JlYXRlIGEgbW9yZSByYW5kb20gc2FtcGxlLCBob3dldmVyIGZvciB0aGUgcHVycG9zZSBvZiB0aGlzIGFzc2lnbm1lbnQsIDQ1IGl0IGhhcyBwcm92aWRlZCBhIHNhdGlzZmFjdG9yeSBzYW1wbGUgdGhhdCBjb3ZlcnMgYSB2YXJpZXR5IG9mIHByb2R1Y3RzLgoKCioqVmFyaWFibGVzKioKCipEYXRlOiogRGF0YSBjb2xsZWN0aW9uIGRhdGUKCipJdGVtOiogR2VuZXJpYyBkZXNjcmlwdGlvbiBvZiBzdXBlcm1hcmtldCBpdGVtCgoqRGV0YWlsZWQgUHJvZHVjdCBEZXNjcmlwdGlvbjoqIHNwZWNpZmljIGRldGFpbHMgZWcgYnJhbmQgYW5kIHdlaWdodCwgb2Ygc2FtcGxlZCBpdGVtcy4KCipDb2xlcyBQcmljZToqIFByaWNlIG9mIGl0ZW0gYXQgQ29sZXMgU3VwZXJtYXJrZXQKCipXb29sd29ydGhzIFByaWNlOiogUHJpY2Ugb2YgaXRlbSBhdCBXb29sd29ydGhzIFN1cGVybWFya2V0CgoKCioqUHJvY2VlZHVyZSoqIAoKQ29sbGF0ZWQgZGF0YSB3YXMgZW50ZXJlZCBpbnRvIGFuIEV4Y2VsIHNwcmVhZHNoZWV0LCBzYXZlZCBhcyBDU1YgZmlsZSBhbmQgaW1wb3J0ZWQgaW50byBSIFN0dWRpbyB0byBiZSBhbmFseXNlZC4gSW5pdGlhbCBkYXRhIGluc3BlY3Rpb24gaW5jbHVkZWQgc3VtbWFyaXNpbmcgZGF0YSwgdmlzdWFsaXNpbmcgZGF0YSBhbmQgY29tcGFyaW5nIGRhdGEgdG8gYSBub3JtYWwgZGlzdHJpYnV0aW9uLiBUaGlzIGxlYWQgdG8gZmlsdGVyaW5nIG91dCA0IG91dGxpZXJzLiBBcyB0aGUgcmVzZWFyY2ggcmVxdWlyZXMgY29tcGFyaW5nIHR3byBkZXBlbmRlbnQgZGF0YSBzZXRzLCB0aGUgY29zdCBvZiA0NSBtYXRjaGVkIGl0ZW1zIGF0IENvbGVzIGFuZCBXb29sd29ydGhzLCB0aGUgUGFpcmVkLVNhbXBsZSB0LXRlc3Qgd2FzIHNlbGVjdGVkIHRvIHRlc3QgdGhlIG51bGwgaHlwb3RoZXNpcywgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBwcmljZSBkaWZmZXJlbmNlIGJldHdlZW4gQ29sZXMgYW5kIFdvb2x3b3J0aHMuICAKCgoqKlJlc3VsdHMqKgoKQWx0aG91Z2ggdGhlIGluaXRpYWwgcmV2aWV3IG9mIHRoZSBkYXRhIHNob3dzIHRoYXQgQ29sZXMgaXRlbXMgYXJlIGdlbmVyYWxseSBtb3JlIGV4cGVuc2l2ZSB0aGFuIFdvb2x3b3J0aHMgaXRlbXMgdGhlIHJlc3VsdHMgY29uY2x1ZGUgdGhhdCB0aGVyZSBpcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gQ29sZXMgYW5kIFdvb2x3b3J0aHMgcHJpY2VzLCBhbmQgdGhlIGRhdGEgYW5hbHlzaXMgZmFpbHMgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuCgoKIyMgTG9hZCBQYWNrYWdlcyBhbmQgRGF0YQoKYGBge3J9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShtYWdyaXR0cikKbGlicmFyeShsdWJyaWRhdGUpCmxpYnJhcnkoZ3Jhbm92YSkKbGlicmFyeShjYXIpCmxpYnJhcnkocmVhZHIpCmBgYAoKCmBgYHtyfQpsaWJyYXJ5KHJlYWRyKQpTdXBlcm1hcmtldCA8LSByZWFkX2Nzdigifi9Eb2N1bWVudHMvTWFzdGVyIChHSVMpL1N0YXRpc3RpY3MvQXNzaWdubWVudCAzL0Fzc2lnbm1lbnQgMy9TdXBlcm1hcmtldCBjb21wYXJpc29uIDA2MDUxNy5jc3YiKQpgYGAKCgpgYGB7cn0KQ29sZXM8LVN1cGVybWFya2V0JGBDb2xlcyBQcmljZWAKV29vbGllczwtU3VwZXJtYXJrZXQkYFdvb2x3b3J0aHMgUHJpY2VgCmBgYAoKCiMjIFN1bW1hcnkgU3RhdGlzdGljcwoKU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBDb2xlcyBwcm9kdWN0IHByaWNlcyBzaG93IHRoYXQgdGhlIG1lYW4gcHJvZHVjdCBwcmljZSBpcyAkNi4wMSwgd2l0aCBwcm9kdWN0cyByYW5naW5nIGJldHdlZW4gJDEuNDAgYW5kICQyMC4wMC4KCmBgYHtyfQpTdXBlcm1hcmtldCAlPiUgc3VtbWFyaXNlKAogIE1pbiA9IG1pbihDb2xlcywgbmEucm0gPSBUUlVFKSwKICBRMSA9IHF1YW50aWxlKENvbGVzLCBwcm9icyA9IC4yNSwgbmEucm0gPSBUUlVFKSwKICBNZWRpYW4gPSBtZWRpYW4oQ29sZXMsIG5hLnJtID0gVFJVRSksCiAgUTMgPSBxdWFudGlsZShDb2xlcywgcHJvYnMgPSAuNzUsIG5hLnJtID0gVFJVRSksCiAgTWF4ID0gbWF4KENvbGVzLCBuYS5ybSA9IFRSVUUpLAogIE1lYW4gPSBtZWFuKENvbGVzLCBuYS5ybSA9IFRSVUUpLAogIFNEID0gc2QoQ29sZXMsIG5hLnJtID0gVFJVRSksCiAgbiA9IG4oKSwKICBNaXNzaW5nID0gc3VtKGlzLm5hKENvbGVzKSkpCmBgYAoKU3VtbWFyeSBzdGF0aXN0aWNzIGZvciBXb29sd29ydGhzIHByb2R1Y3QgcHJpY2VzIHNob3cgdGhhdCB0aGUgbWVhbiBwcm9kdWN0IHByaWNlIGlzICQ1LjY5LCAzMSBjZW50cyBjaGVhcGVyIHRoYW4gQ29sZXMsIHdpdGggcHJvZHVjdHMgYWxzbyByYW5naW5nIGluIHByaWNlIGJldHdlZW4gJDEuNDAgYW5kICQyMC4wMC4KCmBgYHtyfQpTdXBlcm1hcmtldCAlPiUgc3VtbWFyaXNlKAogIE1pbiA9IG1pbihXb29saWVzLCBuYS5ybSA9IFRSVUUpLAogIFExID0gcXVhbnRpbGUoV29vbGllcywgcHJvYnMgPSAuMjUsIG5hLnJtID0gVFJVRSksCiAgTWVkaWFuID0gbWVkaWFuKFdvb2xpZXMsIG5hLnJtID0gVFJVRSksCiAgUTMgPSBxdWFudGlsZShXb29saWVzLCBwcm9icyA9IC43NSwgbmEucm0gPSBUUlVFKSwKICBNYXggPSBtYXgoV29vbGllcywgbmEucm0gPSBUUlVFKSwKICBNZWFuID0gbWVhbihXb29saWVzLCBuYS5ybSA9IFRSVUUpLAogIFNEID0gc2QoV29vbGllcywgbmEucm0gPSBUUlVFKSwKICBuID0gbigpLAogIE1pc3NpbmcgPSBzdW0oaXMubmEoV29vbGllcykpKQpgYGAKVG8gdmlzdWFsaXNlIHRoZXNlIHN0YXRpc3RpY3MgYSBib3ggcGxvdCBoYXMgYmVlbiBzZWxlY3RlZCB0byBpbGx1c3RyYXRlIHRoZSBzaW1pbGFyaXRpZXMgYW5kIGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBzdXBlcm1hcmtldHMgcHJvZHVjdCBwcmljZXMsIHNwZWNpZmljYWxseSB0aGUgbWVhbiwgc3RhbmRhcmQgZGV2aWF0aW9uLCByYW5nZSBhbmQgb3V0bGllcnMuIFRoZSBwbG90IHNob3dzIHRoYXQgdGhlIGRhdGEgZm9yIGVhY2ggb2YgdGhlIHR3byBzdXBlcm1hcmtldHMgaXMgdmVyeSBzaW1pbGFyLCBob3dldmVyIFdvb2x3b3J0aHMgaGFzIGEgc21hbGxlciByYW5nZSBpbiBwcmljZSBiZXR3ZWVuIFExIGFuZCBRMyBjb21wYXJlZCB0byBDb2xlcy4gIAoKYGBge3J9CmJveHBsb3QoQ29sZXMsIFdvb2xpZXMsIHlsYWIgPSAiUHJvZHVjdCBQcmljZSAkIiwgeGxhYiA9ICJTdXBlcm1hcmtldCIpCmF4aXMoMSwgYXQgPSAxOjIsIGxhYmVscyA9IGMoIkNvbGVzIiwgIldvb2x3b3J0aHMiKSwgCnRpdGxlIChtYWluID0gIkJveHBsb3QgQ29tcGFyaW5nIFN1cGVybWFya2V0IFByaWNlcyIpKQpgYGAKVGhlIExpbmUgUGxvdCBpcyBzdWl0YWJsZSBmb3IgY29tcGFyaW5nIHBhaXJlZCBzYW1wbGVzLCBkZW1vbnN0cmF0aW5nIHRoZSBwcmljZSBkaWZmZXJlbmNlIGJldHdlZW4gZWFjaCBpbmRpdmlkdWFsIHByb2R1Y3Qgc2FtcGxlZCBpbiBvbmUgdmlzdWFsaXNhdGlvbi4gSG9yaXpvbnRhbCBsaW5lcyBkZW1vbnN0cmF0ZSBsaXR0bGUgb3Igbm8gZGlmZmVyZW5jZSwgYW5nbGVkIGxpbmVzIGRlbW9uc3RyYXRlIGRpZmZlcmVuY2UuIFRoaXMgTGluZSBQbG90IHNob3dzIHRoYXQgbW9zdCBwcm9kdWN0IHByaWNlcyBkb24ndCB2YXJ5IGdyZWF0bHkgYmV0d2VlbiB0aGUgdHdvIHN1cGVybWFya2V0cywgc29tZSBwcm9kdWN0cyBhcmUgbW9yZSBleHBlbnNpdmUgYXQgQ29sZXMgdGhhbiBXb29sd29ydGhzLCBhbmQgb25seSBvbmUgcHJvZHVjdCBhcHBlYXJzIHRvIGJlIG1vcmUgZXhwZW5zaXZlIGF0IFdvb2x3b3J0aHMgdGhhbiBDb2xlcy4gCgpgYGB7cn0KbWF0cGxvdCh0KGRhdGEuZnJhbWUoQ29sZXMsIFdvb2xpZXMpKSx0eXBlID0gImIiLHBjaCA9IDE5LGNvbCA9IDEsbHR5ID0gMSwgeGxhYiA9ICJTdXBlcm1hcmtldCIsIHlsYWIgPSAiUHJvZHVjdCBQcmljZSIsIHhheHQgPSAibiIpCmF4aXMoMSwgYXQgPSAxOjIsIGxhYmVscyA9IGMoIkNvbGVzIiwgIldvb2x3b3J0aHMiKSkKdGl0bGUobWFpbiA9ICJMaW5lIFBsb3QgY29tcGFyaW5nIFN1cGVybWFya2V0IFByaWNlcyIpCmBgYApDYWxjdWxhdGUgdGhlIERpZmZlcmVuY2UsIENvbGVzIG1pbnVzIFdvb2x3b3J0aHMgcHJpY2VzLCB0byB2aXN1YWxpc2UgYW5kIGNvbXBhcmUgdG8gbm9ybWFsIGRpc3RyaWJ1dGlvbi4KCmBgYHtyfQpTdXBlcm1hcmtldF9Db3N0c19EaWZmZXJlbmNlcyA8LSBTdXBlcm1hcmtldCAlPiUgbXV0YXRlKGQgPSBDb2xlcyAtIFdvb2xpZXMpCmBgYAoKCmBgYHtyfQpxcVBsb3QoU3VwZXJtYXJrZXRfQ29zdHNfRGlmZmVyZW5jZXMkZCwgZGlzdD0ibm9ybSIsIHlsYWIgPSAiUHJpY2UgRGlmZmVyZW5jZSIsIHhsYWIgPSAiTm9ybWFsIFF1YW50aWxlcyIpCmBgYApUaGUgUS1RIHBsb3Qgc2hvd3MgdGhhdCBtb3N0IG9mIHRoZSBkYXRhIGlzIHdpdGhpbiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiByYW5nZSB3aXRoIHNvbWUgb3V0bGllcnMgYXQgZWFjaCBlbmQuIE1vc3Qgb2YgdGhlIGRhdGEgaXMgcXVpdGUgY3Jvd2RlZCBiZXR3ZWVuIHRoZSAtMSBhbmQgMSBxdWFudGlsZXMuIFRvIGltcHJvdmUgdGhlIGRpc3RyaWJ1dGlvbiBhbmQgdGhlIGZ1cnRoZXIgZGF0YSBhbmFseXNpcywgdGhlIG91dGxpZXJzIHdpdGggYSBwcmljZSBkaWZmZXJlbmNlIGdyZWF0ZXIgdGhhbiAkMS41MCBoYXZlIGJlZW4gZmlsdGVyZWQgb3V0LiBUaGlzIHByb2Nlc3MgcmVtb3ZlZCBmb3VyIHByb2R1Y3QgaXRlbXM7IGNoaWNrZW4sIHRhbXBvbnMsIHN0cmF3YmVycmllcyBhbmQgZGlzaCB3YXNoaW5nIHRhYmxldHMuCgpgYGB7cn0KU3VwZXJtYXJrZXRfQ2xlYW5fRGlmZmVyZW5jZTwtZmlsdGVyKFN1cGVybWFya2V0X0Nvc3RzX0RpZmZlcmVuY2VzLCBkIDwgMS41ICYgZCA+IC0xLjUwKSAKYGBgCgpgYGB7cn0KcXFQbG90KFN1cGVybWFya2V0X0NsZWFuX0RpZmZlcmVuY2UkZCwgZGlzdD0ibm9ybSIsIHlsYWIgPSAiUHJpY2UgRGlmZmVyZW5jZSIsIHhsYWIgPSAiTm9ybWFsIFF1YW50aWxlcyIpCmBgYApUaGUgZmlsdGVyZWQgZGF0YSwgYXMgaWxsdXN0cmF0ZWQgaW4gdGhlIHJlZnJlc2hlZCBRLVEgcGxvdCwgaGFzIHJlZHVjZWQgdGhlIHByaWNlIGRpZmZlcmVuY2UgdG8gYmV0d2VlbiBDb2xlcyBhbmQgV29vbHdvcnRocyB0byBiZSAtJDAuMjAgdG8gJDEuMDAsIGluc3RlYWQgb2YgJDMuMDAuIFRoaXMgZGF0YSBzdGlsbCBmYXZvcnMgV29vbHdvcnRocyBmb3IgYmVpbmcgdGhlIGNoZWFwZXIgc3VwZXJtYXJrZXQuCgpWYXJpYWJsZXMgaGF2ZSBiZWVuIGZpbHRlcmVkIHRvIHJlbW92ZSBvdXRsaWVycyB0byBiZSBhYmxlIHRvIGNvbnRpbnVlIHRvIGNvbmR1Y3QgdGhlIGFuYWx5c2lzLiAKYGBge3J9CkNvbGVzX0M8LVN1cGVybWFya2V0X0NsZWFuX0RpZmZlcmVuY2UkYENvbGVzIFByaWNlYApXb29saWVzX0M8LVN1cGVybWFya2V0X0NsZWFuX0RpZmZlcmVuY2UkYFdvb2x3b3J0aHMgUHJpY2VgCmBgYAoKVGhlIGZpbHRlcmVkIHN1cGVybWFya2V0IGRhdGEgd2l0aCA0MSBpdGVtcyBoYXMgYmVlbiB1c2VkIHRvIHJ1biBhIHN0YXRpc3RpYyBzdW1tYXJ5IG9mIHRoZSBkaWZmZXJuY2UgYmV0d2VlbiBzdXBlcm1hcmtldCBwcmljZXM6CmBgYHtyfQpTdXBlcm1hcmtldF9DbGVhbl9EaWZmZXJlbmNlICU+JSBzdW1tYXJpc2UoCiAgTWluID0gbWluKGQsIG5hLnJtID0gVFJVRSksCiAgUTEgPSBxdWFudGlsZShkLCBwcm9icyA9IC4yNSwgbmEucm0gPSBUUlVFKSwKICBNZWRpYW4gPSBtZWRpYW4oZCwgbmEucm0gPSBUUlVFKSwKICBRMyA9IHF1YW50aWxlKGQsIHByb2JzID0gLjc1LCBuYS5ybSA9IFRSVUUpLAogIE1heCA9IG1heChkLCBuYS5ybSA9IFRSVUUpLAogIE1lYW4gPSBtZWFuKGQsIG5hLnJtID0gVFJVRSksCiAgU0QgPSBzZChkLCBuYS5ybSA9IFRSVUUpLAogIG4gPSBuKCksCiAgTWlzc2luZyA9IHN1bShpcy5uYShkKSkpCmBgYApUaGUgcmVzdWx0cyBzaG93IHRoYXQgcHJvZHVjdHMgYXJlIG9uIGF2ZXJhZ2UgJDAuMjcgbW9yZSBleHBlbnNpdmUgYXQgQ29sZXMgdGhhbiBhdCBXb29sd29ydGhzLiBUaGUgcHJpY2UgZGlmZmVybmVjZSBiZXR3ZWVuIHRoZSB0d28gc3RvcmVzIHZhcmllcyBiZXR3ZWVuIFdvb2x3b3J0aHMgYmVpbmcgJDAuMjAgbW9yZSBleHBlbnNpdmUgdGhhbiBDb2xlcyB0byBDb2xlcyBiZWluZyAkMC45OSBtb3JlIGV4cGVuc2l2ZSB0aGFuIFdvb2x3b3J0aHMuIFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gaXMgMC4zMC4gCgoKIyMgSHlwb3RoZXNpcyBUZXN0CgpUaGUgbnVsbCBoeXBvdGhlc2lzIG9mIHRoaXMgdGVzdCBpcyB0aGF0IHRoZXJlIGlzIG5vIHNpZ25maWNpYW50IHByaWNlIGRpZmZlcmVuY2UgbWF0Y2hlZCBwcm9kdWN0cyBwdXJjaGFzZWQgYXQgQ29sZXMgYW5kIFdvb2x3b3J0aHMuIFRoZSBhbHRlcm5hdGl2ZSBoeXBvdGhlc2lzIGlzIHRoYXQgdGhlcmUgaXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlLgoKKipIeXBvdGhlc2VzIGZvciB0aGUgcGFpcmVkIChkZXBlbmRlbnQpIHNhbXBsZXMgdC10ZXN0OioqCiAgTnVsbCBIeXBvdGhlc2lzLCBIMDrOvM6UPTAKICBBbHRlcm5haXR2ZSBIeXBvdGhlc2lzLCBIQTrOvM6U4omgMAoKKipBc3N1bXB0aW9uczoqKgogIENvbXBhcmluZyB0aGUgcHJvZHVjdCBwcmljZSBkaWZmZXJlbmNlLCDOvM6ULCBiZXR3ZWVuIHR3byBtYXRjaGVkIHByb2R1Y3RzLCBkaT14aTLiiJJ4aTEuCiAgzpQgYXJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkCiAgTGFyZ2Ugc2FtcGxlIGhhcyBiZWVuIHVzZWQgKGZpbHRlcmVkIGRhdGEgc2V0ID0gNDEgc2FtcGxlcykKCioqRGVjaXNpb24gUnVsZXM6KioKICBSZWplY3QgSDBIMDoKICBJZiBwcC12YWx1ZSA8IDAuMDUgKM6xIHNpZ25pZmljYW5jZSBsZXZlbCkKICBJZiA5NSUgQ29uZmlkZW5jZSBJbnRlcnZhbChDSSkgb2YgdGhlIG1lYW4gZGlmZmVyZW5jZSBkb2VzIG5vdCBjYXB0dXJlIEgwOs68zpQ9MAogIElmIG5laXRoZXIgb2YgdGhlc2Ugb2NjdXI7IGZhaWwgdG8gcmVqZWN0IEgwLgoKKipDb25jbHVzaW9uOioqCiAgVGVzdCB3aWxsIGJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgaWYgdGhlIEgwIGlzIHJlamVjdGVkLgogIElmIHRoZSB0ZXN0IHJlc3VsdHMgZmFpbCB0byByZWplY3QgdGhlIEgwLCB0aGUgdGVzdCBpcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudC4KCioqUGFpcmVkIHQtdGVzdCBjYWxjdWxhdGlvbnMqKgpgYGB7cn0KdC50ZXN0KENvbGVzX0MsIFdvb2xpZXNfQywgcGFpcmVkID0gVFJVRSwgYWx0ZXJuYXRpdmUgPSAidHdvLnNpZGVkIikKYGBgClRoZSA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbCAoQ0kpIG9mIHRoZSBtZWFuIGlzIHJlcG9ydGVkIGFzIFswLjE3NCwgMC4zNjNdLiBBcyB0aGUgOTUlIENJIGNhcHR1cmVzIHRoZSBtZWFuIG9mIHRoZSBzYW1wbGUgZGlmZmVyZW5jZSAoMC4yNjgpLCB3ZSBmYWlsIHRvIHJlamVjdCBOdWxsIEh5cG90aGVzaXMuIFRoZXJlIGlzIG5vIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgbWVhbiBkaWZmZXJlbmNlIGJldHdlZW4gc3VwZXJtYXJrZXQgcHJpY2VzLgoKCioqcC12YWx1ZSoqCmBgYHtyfQoyKnB0KHEgPSA1LjczMSwgZGYgPSA0NCkKYGBgClVzaW5nIHRoZSByZXN1bHRzIGZyb20gdGhlIFBhaXJlZCB0LXRlc3QgdGhlIHAtdmFsdWUgd2FzIGNhbGN1bGF0ZWQgdG8gYmUgMi4wMC4gQXMgdGhpcyBpcyBtdWNoIGxhcmdlciB0aGFuIHNpZ25pZmljYW5jZSBsZXZlbCBvZiAwLjA1IChhbHBoYSksIHdlIGZhaWwgdG8gcmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMuIFRoZXJlIGlzIG5vIHNpZ25pZmljYW50IG1lYW4gZGlmZmVyZW5jZSBpbiBzdXBlcm1hcmtldCBwcmljZXMuCgoKCioqU3VtbWFyeSBvZiByZXN1bHRzKioKCiAgdCA9IDUuNzMxLiAKICAKICBEZWdyZWVzIG9mIGZyZWVkb20gZm9yIHRoaXMgc2FtcGxlIGlzIDQwIChkZj1uzpTiiJIxLCBkZj00MS0xKS4KICAKICA5NSUgQ0kgWzAuMTc0LCAwLjM2M10KICAKICBNZWFuIG9mIHRoZSBkaWZmZXJlbmNlID0gMC4yNjgKICAKICBQLXZhbHVlID0gMi4wMAoKCgojIyBJbnRlcnByZXRhdGlvbgoKQSBwYWlyZWQtc2FtcGxlcyB0LXRlc3Qgd2FzIHVzZWQgdG8gdGVzdCBmb3IgYSBzaWduaWZpY2FudCBtZWFuIGRpZmZlcmVuY2UgYmV0d2VlbiBDb2xlcyBhbmQgV29vbHdvcnRocyBzdXBlcm1hcmtldCBwcm9kdWN0IHByaWNlcy4gVGhlIGludmVzdGlnYXRpb24gZm91bmQgdGhlIG1lYW4gZGlmZmVyZW5jZSB0byBiZSAwLjI2OCAoU0QgPSAwLjMwMCkuIAoKVmlzdWFsIGluc3BlY3Rpb24gb2YgdGhlIFEtUSBwbG90IHNob3dlZCB0aGF0IHRoZSBvcmlnbmFsIGRhdGEgc2V0IHdhcyBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIFN1YnNlcXVlbnRseSwgZm91ciBpdGVtcyB3ZXJlIGZpbHRlcmVkIGZyb20gdGhlIGRhdGEgdG8gYXBwcm94aW1hdGUgdGhlIGRlc2lyZWQgbm9ybWFsbHkgZGlzdHJpYnV0aW9uLiAKClRoZSBwYWlyZWQtc2FtcGxlcyB0LXRlc3QgZm91bmQgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBtZWFuIGJldHdlZW4gdGhlIHByaWNlcyBvZiBtYXRjaGVkIHByb2R1Y3RzIGF0IENvbGVzIGFuZCBXb29sd29ydGhzLCB0IChkZj00MSk9NS43MzEsIHAgPSAyLjAwLCA5NSUgWzAuMTc0LCAwLjM2M10uIEFjY29yZGluZyB0byB0aGlzIGRhdGEgbmVpdGhlciBDb2xlcyBub3IgV29vbHdvcnRocyBhcmUgY2hlYXBlciB0aGFuIHRoZSBvdGhlci4gIAoKCiMjIERpc2N1c3Npb24gCgpBbHRob3VnaCB0aGUgaW5pdGlhbCBpbnNwZWN0aW9uIG9mIHRoZSBzdXBlcm1hcmtldCBjb21wYXJpc29uIGRhdGEgc2hvd2VkIFdvb2x3b3J0aHMgcHJvZHVjdHMgdG8gYmUgY2hlYXBlciwgdGhlIHJlc3VsdHMgZnJvbSBib3RoIHRoZSBwLXZhbHVlIGFuZCB0aGUgOTUlIENJIHN1cHBvcnQgdGhlIGRlY2lzaW9uIHRvIGZhaWwgdG8gcmVqZWN0IHRoZSBOdWxsIEh5cG90aGVzaXMuIEFjY29yZGluZyB0byByZXN1bHRzIGl0IHdvbid0IG1ha2UgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIHRvIG91ciAnYmFjayBwb2NrZXQnIHdoaWNoIHN1cGVybWFya2V0IHdlIGNob29zZSB0byBzaG9wIGluIGlmIHB1cmNoYXNpbmcgZnVsbCBwcmljZWQsIGJyYW5kIGl0ZW1zLgoKVGhlIHN0cmVuZ3RocyBvZiB0aGlzIGludmVzdGlhZ3Rpb24gaW5jbHVkZXMgdGhlIGNvbnNpc3RhbmN5IHRoYXQgd2FzIG1ldCBpbiBtYXRjaGluZyBpdGVtcyBiZXR3ZWVuIENvbGVzIGFuZCBXb29sd29ydGhzLCB0aGUgbnVtYmVyIG9mIGl0ZW1zIHNhbXBsZWQsIGFuZCB0aGUgY29uc2lzdGFudCBtZXRob2RvbG9neSwgaG93ZXZlciB0aGUgbWV0aG9kIG9mIGNvbGxlY3RpbmcgdGhlIHNwZWNpZmljIHByb2R1Y3RzIGNvdWxkIGJlIGltcHJvdmVkLiAKCkxpbWl0YXRpb25zIGFyaXNlIGluIHRoZSBjb21wYXJpc29uIG9mIG9ubHkgZnVsbCBwcmljZWQsIGJyYW5kIGl0ZW1zLiBTYXZpbmdzIGJldHdlZW4gc3VwZXJtYXJrZXRzIGNhbiBwb3RlbnRpYWxseSBiZSBtYWRlIHRocm91Z2ggc2VsZWN0aW5nIHNhbGUgaXRlbXMsIG9yIGNoZWFwZXIgaG91c2UgYnJhbmRzLiBJbiBhZGRpdGlvbiwgdGhlIHByaWNlcyB3ZXJlIG9ubHkgY29sbGVjdGVkIGZyb20gdGhlIHJlc3BlY3RpdmUgc3VwZXJtYXJrZXQgd2Vic2l0ZXMgbm90IGZyb20gdmlzaXRpbmcgc3VwZXJtYXJrZXRzLiBQcmljZXMgaW4gc3VwZXJtYXJrZXRzIHZhcnkgYWNyb3NzIHRoZSBjb3VudHJ5IGR1ZSB0byB0cmFuc3BvcnQgYW5kIGF2YWlsYWJpbGl0eSBvZiBwcm9kdWN0IGl0ZW1zLCB2YXJpYXRpb24gb2YgbG9jYXRpb24gaGFzIG5vdCBiZWVuIGNvbnNpZGVyZWQgaW4gdGhpcyBpbnZlc3RpZ2F0aW9uLgoKQWRkaXRpb25hbCBsaW1pdGF0aW9ucyBpbmNsdWRlIG9ubHkgdmlld2luZyB0aGUgZGF0YSB0aHJvdWdoIHRoZSBzdGF0aXN0aWNhbCBsZW5zIG9mIGFwcGx5aW5nIGFuIGFwcHJvcHJpYXRlIHRlc3QuIFRoZSBwYWlyZWQgdC10ZXN0IGhhcyB0ZXN0ZWQgZWFjaCBDb2xlcyBpdGVtIGFnYWluc3QgaXRzIG1hdGNoIGF0IFdvb2x3b3J0aHMsIGJ1dCB0aGUgY3VtbXVsYXRpdmUgZGlmZmVyZW5jZSBoYXMgbm90IGJlZW4gaW52ZXN0aWdhdGVkLiBUaGUgYXZlcmFnZSBwcmljZSBkaWZmZXJlbmNlIGJldHdlZW4gc3VwZXJtYXJrZXRzIHdhcyBmb3VuZCB0byBiZSAkMC4yOC4gVGhlIGRpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50LCBidXQgd2hlbiBwdXJjaGFzaW5nIGEgZnVsbCB0cm9sbHkgZnVsbCBvZiBwcm9kdWN0cywgdGhlIGF2ZXJhZ2Ugc2F2aW5nIG9mICQwLjI4IHBlciBwcm9kdWN0IGFkZHMgdXAuIFdoZW4gcHVyY2hhc2luZyBhbGwgdGhlc2UgaXRlbXMgQ29sZXMgdG90YWwgd2FzICQyNzAuMzQsIFdvb2x3b3J0aHMgd2FzICQyNTYuICQxNi4zNCBpcyBhIGdvb2Qgc2F2aW5nLCBidXQgaWYgdGhpcyB3YXMgYW4gYXZlcmFnZSBmYW1pbGllcyB3ZWVrbGllcyBncm9jZXJpZXMsIHRoaXMgd291bGQgYWRkIHVwIHRvICQ4NTAgc2F2aW5nIGFjcm9zcyBhIHllYXIuIAoK