Individual Details
- Student Name: Balkan Misirli (s3650250)
Executive Statement
The aim of the investigation was to determine whether Coles or Woolworths has cheaper prices in general. As the population of products/prices for each chain is difficult to obtain and each product is not always matched in the other store, it is necessary to make inferences on the population based on an observable subset of matched products.
The entire inventory of Coles’ online shop was scraped and tabulated per category, with roughly 22,200 total products. To obtain a sample subset of 0.5% of these products, 111 items were chosen at random from each table proportional to the ratio of that entire category’s total products to the overall total number of products.
Random numbers were chosen via Google Sheets’ random function, which then corresponded to rows in the Coles scraped dataset. The chosen products were then matched manually in Woolworths’ online shop. If a match existed, these were taken into the sample. If no match was found, another random item was chosen until a match was found. Items which were ‘on special’ in either chain were not taken into the sample.
The results of the testing indicated that the null hypothesis, that both chains had the same pricing over their entire inventory, was very likely to be incorrect. The one sample t test returned a p-value of < 0.001.
Load Packages and Data
library(car)
library(dplyr)
prices <- read.csv("/Users/balkan_misirli/Downloads/ColesWoolPricesV5.csv")
# data was manually collated in Google Sheets
lev <- read.csv("/Users/balkan_misirli/Downloads/ColesWoolPricesLEV3.csv")
# the long format of the same data, for use in other functions further down
price_diff <- prices %>% mutate(diff_price = Coles.Cost.Quantity - Woolworths.Cost.Quantity, diff_price_perc = diff_price/Coles.Cost.Quantity)
# Price difference and price difference percentage columns were added to transform the values into standardized measures of price difference.
Summary Statistics
The price per unit (kilogram/litre/each) was used in this investigation. In this sample, there were 80 items where Woolworths was cheaper, 15 where both were the same price and the remaining 16 items where Coles was cheaper.
When viewed with side-by-side boxplots the summary statistics look quite similar, with Woolworths having the slightly lower appearance. However, without removing the outliers this plot is largely unreadable.
The summary statistics of the sample show that Coles has a higher mean and standard deviation than Woolworths. the Min/Max statistics emphasise the extremely wide spectrum of values in this sample.
The Q-Q plots of the data did not indicate normality, but given the large sample size this should not be a problem. Also, this type of plot is likely meaningless given the values of each product are not really linked to one another.
The plot of price difference in percentage terms visually exposes the relationship at play within the sample. The red line is price parity, and most points lie above it- showing Coles to be more expensive than Woolworths in this sample.
boxplot(prices$Coles.Cost.Quantity, prices$Woolworths.Cost.Quantity, names = c("Coles", "Woolworths"), ylab = "Dollars")

boxplot(prices$Coles.Cost.Quantity, prices$Woolworths.Cost.Quantity, names = c("Coles", "Woolworths"), ylab = "Dollars", outline = FALSE)

lev %>% group_by(Chain) %>% summarise(Min = min(cost.quantity,na.rm = TRUE),
Q1 = quantile(cost.quantity,probs = .25,na.rm = TRUE),
Median = median(cost.quantity, na.rm = TRUE),
Q3 = quantile(cost.quantity,probs = .75,na.rm = TRUE),
Max = max(cost.quantity,na.rm = TRUE),
Mean = mean(cost.quantity, na.rm = TRUE),
SD = sd(cost.quantity, na.rm = TRUE),
n = n(),
Missing = sum(is.na(cost.quantity)))
prices$Coles.Cost.Quantity %>% qqPlot(dist = "norm")

prices$Woolworths.Cost.Quantity %>% qqPlot(dist = "norm")

plot(price_diff$diff_price_perc*100, ylab = "% Price Diff (+ve: Coles dearer, -ve: WW dearer", xlab = "Product Number")
abline(h = 0, col = "red")

Hypothesis Test
The hypothesis test chosen was the One Sample T Test on the percentage difference in prices per unit of weight (with Coles price being the denominator). This unit was chosen because although the magnitude of prices varied greatly the relative price difference was rather smaller. However, this means that a 5c difference in a 20c product would be weighted equally with a 5 dollar difference in a 20 dollar product.
The null hypothesis was that the mean price percentage difference between these populations is zero. A significance level of alpha = 0.01 was used, such that the null will be rejected if the p value indicates probability of obtaining this sample mean, given the null being true, is less than 0.01.
To test for homogeneity of variance, the Levene’s test was implemented on the two samples. Resulting in p = 0.82, the test failed to reject the null hypothesis. Thus, the population variance of Coles and Woolworths are likely to be identical.
#
leveneTest(lev$cost.quantity ~ Chain, data = lev)
Levene's Test for Homogeneity of Variance (center = median)
Df F value Pr(>F)
group 1 0.0496 0.8239
220
t.test(price_diff$diff_price_perc, mu = 0, conf.level = 0.99)
One Sample t-test
data: price_diff$diff_price_perc
t = 5.2924, df = 110, p-value = 6.224e-07
alternative hypothesis: true mean is not equal to 0
99 percent confidence interval:
0.02734727 0.08102037
sample estimates:
mean of x
0.05418382
Interpretation
The t-test resulted in a p-value of < 0.001 and 99% confidence interval of between 2.73% and 8.1% price percentage difference. This result means there is statistically significant evidence to reject the null hypothesis (that the population mean lies at 0% difference) in favour of the alternate. In this case, it appears likely that Woolworths is cheaper than Coles overall.
Implicit in this statement is that this sample may be within the sliver of possible valid samples which would give this result even though the two populations are equal. Very unlikely but possible.
Discussion
Based on this sample, it can be inferred with strong evidence that Woolworths is cheaper than Coles over the entire set of products.
During data collection, it was noticed that one chain seemed consistently cheaper than the other depending on category. If indeed so, it may imply that each category has its own distinct probability distribution. Further investigation may be useful in uncovering better pricing by chain per category. Problems originating from this point were likely avoided by sampling products proportionally by category such that the results were a representative subset of the population by category.
It was also noticed that items which did not have an identical match (but were broadly matched) seemed to have greater price variance than those that did. This may indicate two separate probability distributions for exactly matched versus non-matched products. This may render our findings unrepresentative of reality.
This investigation fails to consider that each chain sets prices strategically, at least partly in response to the pricing signals of the other- their primary competitor. It may be more important for a chain to be cheaper on one product than another. Consequently, another possible improvement to this investigation could be to weight the products by their relative importance in the average shopper’s basket. Perhaps being a lot cheaper on an exotic item is not preferable to being a little cheaper on an everyday item.
If this investigation were to be repeated, it would certainly merit some investment of time in building a more capable web scraping program to obtain Woolworths’ price data as well as some functionality to synthesize/fuzzy match products. Collecting and processing a broadly representative sample dataset was by far the most time consuming portion of this venture.
LS0tCnRpdGxlOiAiTUFUSDEzMjQgQXNzaWdubWVudCAzIgpzdWJ0aXRsZTogIlN1cGVybWFya2V0IFByaWNlIFdhcnMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIEluZGl2aWR1YWwgRGV0YWlscwoKKiBTdHVkZW50IE5hbWU6IEJhbGthbiBNaXNpcmxpIChzMzY1MDI1MCkKCiMjIEV4ZWN1dGl2ZSBTdGF0ZW1lbnQKClRoZSBhaW0gb2YgdGhlIGludmVzdGlnYXRpb24gd2FzIHRvIGRldGVybWluZSB3aGV0aGVyIENvbGVzIG9yIFdvb2x3b3J0aHMgaGFzIGNoZWFwZXIgcHJpY2VzIGluIGdlbmVyYWwuIEFzIHRoZSBwb3B1bGF0aW9uIG9mIHByb2R1Y3RzL3ByaWNlcyBmb3IgZWFjaCBjaGFpbiBpcyBkaWZmaWN1bHQgdG8gb2J0YWluIGFuZCBlYWNoIHByb2R1Y3QgaXMgbm90IGFsd2F5cyBtYXRjaGVkIGluIHRoZSBvdGhlciBzdG9yZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIG1ha2UgaW5mZXJlbmNlcyBvbiB0aGUgcG9wdWxhdGlvbiBiYXNlZCBvbiBhbiBvYnNlcnZhYmxlIHN1YnNldCBvZiBtYXRjaGVkIHByb2R1Y3RzLgoKVGhlIGVudGlyZSBpbnZlbnRvcnkgb2YgQ29sZXMnIG9ubGluZSBzaG9wIHdhcyBzY3JhcGVkIGFuZCB0YWJ1bGF0ZWQgcGVyIGNhdGVnb3J5LCB3aXRoIHJvdWdobHkgMjIsMjAwIHRvdGFsIHByb2R1Y3RzLiBUbyBvYnRhaW4gYSBzYW1wbGUgc3Vic2V0IG9mIDAuNSUgb2YgdGhlc2UgcHJvZHVjdHMsIDExMSBpdGVtcyB3ZXJlIGNob3NlbiBhdCByYW5kb20gZnJvbSBlYWNoIHRhYmxlIHByb3BvcnRpb25hbCB0byB0aGUgcmF0aW8gb2YgdGhhdCBlbnRpcmUgY2F0ZWdvcnnigJlzIHRvdGFsIHByb2R1Y3RzIHRvIHRoZSBvdmVyYWxsIHRvdGFsIG51bWJlciBvZiBwcm9kdWN0cy4gCgpSYW5kb20gbnVtYmVycyB3ZXJlIGNob3NlbiB2aWEgR29vZ2xlIFNoZWV0c+KAmSByYW5kb20gZnVuY3Rpb24sIHdoaWNoIHRoZW4gY29ycmVzcG9uZGVkIHRvIHJvd3MgaW4gdGhlIENvbGVzIHNjcmFwZWQgZGF0YXNldC4gVGhlIGNob3NlbiBwcm9kdWN0cyB3ZXJlIHRoZW4gbWF0Y2hlZCBtYW51YWxseSBpbiBXb29sd29ydGhz4oCZIG9ubGluZSBzaG9wLiBJZiBhIG1hdGNoIGV4aXN0ZWQsIHRoZXNlIHdlcmUgdGFrZW4gaW50byB0aGUgc2FtcGxlLiBJZiBubyBtYXRjaCB3YXMgZm91bmQsIGFub3RoZXIgcmFuZG9tIGl0ZW0gd2FzIGNob3NlbiB1bnRpbCBhIG1hdGNoIHdhcyBmb3VuZC4gSXRlbXMgd2hpY2ggd2VyZSAnb24gc3BlY2lhbCcgaW4gZWl0aGVyIGNoYWluIHdlcmUgbm90IHRha2VuIGludG8gdGhlIHNhbXBsZS4KClRoZSByZXN1bHRzIG9mIHRoZSB0ZXN0aW5nIGluZGljYXRlZCB0aGF0IHRoZSBudWxsIGh5cG90aGVzaXMsIHRoYXQgYm90aCBjaGFpbnMgaGFkIHRoZSBzYW1lIHByaWNpbmcgb3ZlciB0aGVpciBlbnRpcmUgaW52ZW50b3J5LCB3YXMgdmVyeSBsaWtlbHkgdG8gYmUgaW5jb3JyZWN0LiBUaGUgb25lIHNhbXBsZSB0IHRlc3QgcmV0dXJuZWQgYSBwLXZhbHVlIG9mIDwgMC4wMDEuCgoKIyMgTG9hZCBQYWNrYWdlcyBhbmQgRGF0YQoKYGBge3J9CmxpYnJhcnkoY2FyKQpsaWJyYXJ5KGRwbHlyKQpwcmljZXMgPC0gcmVhZC5jc3YoIi9Vc2Vycy9iYWxrYW5fbWlzaXJsaS9Eb3dubG9hZHMvQ29sZXNXb29sUHJpY2VzVjUuY3N2IikKIyBkYXRhIHdhcyBtYW51YWxseSBjb2xsYXRlZCBpbiBHb29nbGUgU2hlZXRzCgpsZXYgPC0gcmVhZC5jc3YoIi9Vc2Vycy9iYWxrYW5fbWlzaXJsaS9Eb3dubG9hZHMvQ29sZXNXb29sUHJpY2VzTEVWMy5jc3YiKQojIHRoZSBsb25nIGZvcm1hdCBvZiB0aGUgc2FtZSBkYXRhLCBmb3IgdXNlIGluIG90aGVyIGZ1bmN0aW9ucyBmdXJ0aGVyIGRvd24KCnByaWNlX2RpZmYgPC0gcHJpY2VzICU+JSBtdXRhdGUoZGlmZl9wcmljZSA9IENvbGVzLkNvc3QuUXVhbnRpdHkgLSBXb29sd29ydGhzLkNvc3QuUXVhbnRpdHksIGRpZmZfcHJpY2VfcGVyYyA9IGRpZmZfcHJpY2UvQ29sZXMuQ29zdC5RdWFudGl0eSkKIyBQcmljZSBkaWZmZXJlbmNlIGFuZCBwcmljZSBkaWZmZXJlbmNlIHBlcmNlbnRhZ2UgY29sdW1ucyB3ZXJlIGFkZGVkIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWVzIGludG8gc3RhbmRhcmRpemVkIG1lYXN1cmVzIG9mIHByaWNlIGRpZmZlcmVuY2UuCmBgYAoKIyMgU3VtbWFyeSBTdGF0aXN0aWNzCgpUaGUgcHJpY2UgcGVyIHVuaXQgKGtpbG9ncmFtL2xpdHJlL2VhY2gpIHdhcyB1c2VkIGluIHRoaXMgaW52ZXN0aWdhdGlvbi4gSW4gdGhpcyBzYW1wbGUsIHRoZXJlIHdlcmUgODAgaXRlbXMgd2hlcmUgV29vbHdvcnRocyB3YXMgY2hlYXBlciwgMTUgd2hlcmUgYm90aCB3ZXJlIHRoZSBzYW1lIHByaWNlIGFuZCB0aGUgcmVtYWluaW5nIDE2IGl0ZW1zIHdoZXJlIENvbGVzIHdhcyBjaGVhcGVyLgoKV2hlbiB2aWV3ZWQgd2l0aCBzaWRlLWJ5LXNpZGUgYm94cGxvdHMgdGhlIHN1bW1hcnkgc3RhdGlzdGljcyBsb29rIHF1aXRlIHNpbWlsYXIsIHdpdGggV29vbHdvcnRocyBoYXZpbmcgdGhlIHNsaWdodGx5IGxvd2VyIGFwcGVhcmFuY2UuIEhvd2V2ZXIsIHdpdGhvdXQgcmVtb3ZpbmcgdGhlIG91dGxpZXJzIHRoaXMgcGxvdCBpcyBsYXJnZWx5IHVucmVhZGFibGUuCgpUaGUgc3VtbWFyeSBzdGF0aXN0aWNzIG9mIHRoZSBzYW1wbGUgc2hvdyB0aGF0IENvbGVzIGhhcyBhIGhpZ2hlciBtZWFuIGFuZCBzdGFuZGFyZCBkZXZpYXRpb24gdGhhbiBXb29sd29ydGhzLiB0aGUgTWluL01heCBzdGF0aXN0aWNzIGVtcGhhc2lzZSB0aGUgZXh0cmVtZWx5IHdpZGUgc3BlY3RydW0gb2YgdmFsdWVzIGluIHRoaXMgc2FtcGxlLgoKVGhlIFEtUSBwbG90cyBvZiB0aGUgZGF0YSBkaWQgbm90IGluZGljYXRlIG5vcm1hbGl0eSwgYnV0IGdpdmVuIHRoZSBsYXJnZSBzYW1wbGUgc2l6ZSB0aGlzIHNob3VsZCBub3QgYmUgYSBwcm9ibGVtLiBBbHNvLCB0aGlzIHR5cGUgb2YgcGxvdCBpcyBsaWtlbHkgbWVhbmluZ2xlc3MgZ2l2ZW4gdGhlIHZhbHVlcyBvZiBlYWNoIHByb2R1Y3QgYXJlIG5vdCByZWFsbHkgbGlua2VkIHRvIG9uZSBhbm90aGVyLgoKVGhlIHBsb3Qgb2YgcHJpY2UgZGlmZmVyZW5jZSBpbiBwZXJjZW50YWdlIHRlcm1zIHZpc3VhbGx5IGV4cG9zZXMgdGhlIHJlbGF0aW9uc2hpcCBhdCBwbGF5IHdpdGhpbiB0aGUgc2FtcGxlLiBUaGUgcmVkIGxpbmUgaXMgcHJpY2UgcGFyaXR5LCBhbmQgbW9zdCBwb2ludHMgbGllIGFib3ZlIGl0LSBzaG93aW5nIENvbGVzIHRvIGJlIG1vcmUgZXhwZW5zaXZlIHRoYW4gV29vbHdvcnRocyBpbiB0aGlzIHNhbXBsZS4KCmBgYHtyfQoKYm94cGxvdChwcmljZXMkQ29sZXMuQ29zdC5RdWFudGl0eSwgcHJpY2VzJFdvb2x3b3J0aHMuQ29zdC5RdWFudGl0eSwgbmFtZXMgPSBjKCJDb2xlcyIsICJXb29sd29ydGhzIiksIHlsYWIgPSAiRG9sbGFycyIpCgpib3hwbG90KHByaWNlcyRDb2xlcy5Db3N0LlF1YW50aXR5LCBwcmljZXMkV29vbHdvcnRocy5Db3N0LlF1YW50aXR5LCBuYW1lcyA9IGMoIkNvbGVzIiwgIldvb2x3b3J0aHMiKSwgeWxhYiA9ICJEb2xsYXJzIiwgb3V0bGluZSA9IEZBTFNFKQoKbGV2ICU+JSBncm91cF9ieShDaGFpbikgJT4lIHN1bW1hcmlzZShNaW4gPSBtaW4oY29zdC5xdWFudGl0eSxuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICBRMSA9IHF1YW50aWxlKGNvc3QucXVhbnRpdHkscHJvYnMgPSAuMjUsbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFuID0gbWVkaWFuKGNvc3QucXVhbnRpdHksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgIFEzID0gcXVhbnRpbGUoY29zdC5xdWFudGl0eSxwcm9icyA9IC43NSxuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggPSBtYXgoY29zdC5xdWFudGl0eSxuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICBNZWFuID0gbWVhbihjb3N0LnF1YW50aXR5LCBuYS5ybSA9IFRSVUUpLAogICAgICAgICAgICAgICAgICAgICAgICBTRCA9IHNkKGNvc3QucXVhbnRpdHksIG5hLnJtID0gVFJVRSksCiAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBuKCksCiAgICAgICAgICAgICAgICAgICAgICAgIE1pc3NpbmcgPSBzdW0oaXMubmEoY29zdC5xdWFudGl0eSkpKQoKcHJpY2VzJENvbGVzLkNvc3QuUXVhbnRpdHkgJT4lIHFxUGxvdChkaXN0ID0gIm5vcm0iKQpwcmljZXMkV29vbHdvcnRocy5Db3N0LlF1YW50aXR5ICU+JSBxcVBsb3QoZGlzdCA9ICJub3JtIikKCnBsb3QocHJpY2VfZGlmZiRkaWZmX3ByaWNlX3BlcmMqMTAwLCB5bGFiID0gIiUgUHJpY2UgRGlmZiAoK3ZlOiBDb2xlcyBkZWFyZXIsIC12ZTogV1cgZGVhcmVyIiwgeGxhYiA9ICJQcm9kdWN0IE51bWJlciIpCmFibGluZShoID0gMCwgY29sID0gInJlZCIpCmBgYAoKCiMjIEh5cG90aGVzaXMgVGVzdAoKVGhlIGh5cG90aGVzaXMgdGVzdCBjaG9zZW4gd2FzIHRoZSBPbmUgU2FtcGxlIFQgVGVzdCBvbiB0aGUgcGVyY2VudGFnZSBkaWZmZXJlbmNlIGluIHByaWNlcyBwZXIgdW5pdCBvZiB3ZWlnaHQgKHdpdGggQ29sZXMgcHJpY2UgYmVpbmcgdGhlIGRlbm9taW5hdG9yKS4gVGhpcyB1bml0IHdhcyBjaG9zZW4gYmVjYXVzZSBhbHRob3VnaCB0aGUgbWFnbml0dWRlIG9mIHByaWNlcyB2YXJpZWQgZ3JlYXRseSB0aGUgcmVsYXRpdmUgcHJpY2UgZGlmZmVyZW5jZSB3YXMgcmF0aGVyIHNtYWxsZXIuIEhvd2V2ZXIsIHRoaXMgbWVhbnMgdGhhdCBhIDVjIGRpZmZlcmVuY2UgaW4gYSAyMGMgcHJvZHVjdCB3b3VsZCBiZSB3ZWlnaHRlZCBlcXVhbGx5IHdpdGggYSA1IGRvbGxhciBkaWZmZXJlbmNlIGluIGEgMjAgZG9sbGFyIHByb2R1Y3QuCgpUaGUgbnVsbCBoeXBvdGhlc2lzIHdhcyB0aGF0IHRoZSBtZWFuIHByaWNlIHBlcmNlbnRhZ2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZXNlIHBvcHVsYXRpb25zIGlzIHplcm8uIEEgc2lnbmlmaWNhbmNlIGxldmVsIG9mIGFscGhhID0gMC4wMSB3YXMgdXNlZCwgc3VjaCB0aGF0IHRoZSBudWxsIHdpbGwgYmUgcmVqZWN0ZWQgaWYgdGhlIHAgdmFsdWUgaW5kaWNhdGVzIHByb2JhYmlsaXR5IG9mIG9idGFpbmluZyB0aGlzIHNhbXBsZSBtZWFuLCBnaXZlbiB0aGUgbnVsbCBiZWluZyB0cnVlLCBpcyBsZXNzIHRoYW4gMC4wMS4KClRvIHRlc3QgZm9yIGhvbW9nZW5laXR5IG9mIHZhcmlhbmNlLCB0aGUgTGV2ZW5lJ3MgdGVzdCB3YXMgaW1wbGVtZW50ZWQgb24gdGhlIHR3byBzYW1wbGVzLiBSZXN1bHRpbmcgaW4gcCA9IDAuODIsIHRoZSB0ZXN0IGZhaWxlZCB0byByZWplY3QgdGhlIG51bGwgaHlwb3RoZXNpcy4gVGh1cywgdGhlIHBvcHVsYXRpb24gdmFyaWFuY2Ugb2YgQ29sZXMgYW5kIFdvb2x3b3J0aHMgYXJlIGxpa2VseSB0byBiZSBpZGVudGljYWwuCgpgYGB7cn0KIwoKbGV2ZW5lVGVzdChsZXYkY29zdC5xdWFudGl0eSB+IENoYWluLCBkYXRhID0gbGV2KQp0LnRlc3QocHJpY2VfZGlmZiRkaWZmX3ByaWNlX3BlcmMsIG11ID0gMCwgY29uZi5sZXZlbCA9IDAuOTkpCgoKYGBgCgojIyBJbnRlcnByZXRhdGlvbgoKVGhlIHQtdGVzdCByZXN1bHRlZCBpbiBhIHAtdmFsdWUgb2YgPCAwLjAwMSBhbmQgOTklIGNvbmZpZGVuY2UgaW50ZXJ2YWwgb2YgYmV0d2VlbiAyLjczJSBhbmQgOC4xJSBwcmljZSBwZXJjZW50YWdlIGRpZmZlcmVuY2UuIFRoaXMgcmVzdWx0IG1lYW5zIHRoZXJlIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgZXZpZGVuY2UgdG8gcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMgKHRoYXQgdGhlIHBvcHVsYXRpb24gbWVhbiBsaWVzIGF0IDAlIGRpZmZlcmVuY2UpIGluIGZhdm91ciBvZiB0aGUgYWx0ZXJuYXRlLiBJbiB0aGlzIGNhc2UsIGl0IGFwcGVhcnMgbGlrZWx5IHRoYXQgV29vbHdvcnRocyBpcyBjaGVhcGVyIHRoYW4gQ29sZXMgb3ZlcmFsbC4KCkltcGxpY2l0IGluIHRoaXMgc3RhdGVtZW50IGlzIHRoYXQgdGhpcyBzYW1wbGUgbWF5IGJlIHdpdGhpbiB0aGUgc2xpdmVyIG9mIHBvc3NpYmxlIHZhbGlkIHNhbXBsZXMgd2hpY2ggd291bGQgZ2l2ZSB0aGlzIHJlc3VsdCBldmVuIHRob3VnaCB0aGUgdHdvIHBvcHVsYXRpb25zIGFyZSBlcXVhbC4gVmVyeSB1bmxpa2VseSBidXQgcG9zc2libGUuCgojIyBEaXNjdXNzaW9uIAoKQmFzZWQgb24gdGhpcyBzYW1wbGUsIGl0IGNhbiBiZSBpbmZlcnJlZCB3aXRoIHN0cm9uZyBldmlkZW5jZSB0aGF0IFdvb2x3b3J0aHMgaXMgY2hlYXBlciB0aGFuIENvbGVzIG92ZXIgdGhlIGVudGlyZSBzZXQgb2YgcHJvZHVjdHMuCgpEdXJpbmcgZGF0YSBjb2xsZWN0aW9uLCBpdCB3YXMgbm90aWNlZCB0aGF0IG9uZSBjaGFpbiBzZWVtZWQgY29uc2lzdGVudGx5IGNoZWFwZXIgdGhhbiB0aGUgb3RoZXIgZGVwZW5kaW5nIG9uIGNhdGVnb3J5LiBJZiBpbmRlZWQgc28sIGl0IG1heSBpbXBseSB0aGF0IGVhY2ggY2F0ZWdvcnkgaGFzIGl0cyBvd24gZGlzdGluY3QgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uLiBGdXJ0aGVyIGludmVzdGlnYXRpb24gbWF5IGJlIHVzZWZ1bCBpbiB1bmNvdmVyaW5nIGJldHRlciBwcmljaW5nIGJ5IGNoYWluIHBlciBjYXRlZ29yeS4gUHJvYmxlbXMgb3JpZ2luYXRpbmcgZnJvbSB0aGlzIHBvaW50IHdlcmUgbGlrZWx5IGF2b2lkZWQgYnkgc2FtcGxpbmcgcHJvZHVjdHMgcHJvcG9ydGlvbmFsbHkgYnkgY2F0ZWdvcnkgc3VjaCB0aGF0IHRoZSByZXN1bHRzIHdlcmUgYSByZXByZXNlbnRhdGl2ZSBzdWJzZXQgb2YgdGhlIHBvcHVsYXRpb24gYnkgY2F0ZWdvcnkuCgpJdCB3YXMgYWxzbyBub3RpY2VkIHRoYXQgaXRlbXMgd2hpY2ggZGlkIG5vdCBoYXZlIGFuIGlkZW50aWNhbCBtYXRjaCAoYnV0IHdlcmUgYnJvYWRseSBtYXRjaGVkKSBzZWVtZWQgdG8gaGF2ZSBncmVhdGVyIHByaWNlIHZhcmlhbmNlIHRoYW4gdGhvc2UgdGhhdCBkaWQuIFRoaXMgbWF5IGluZGljYXRlIHR3byBzZXBhcmF0ZSBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb25zIGZvciBleGFjdGx5IG1hdGNoZWQgdmVyc3VzIG5vbi1tYXRjaGVkIHByb2R1Y3RzLiBUaGlzIG1heSByZW5kZXIgb3VyIGZpbmRpbmdzIHVucmVwcmVzZW50YXRpdmUgb2YgcmVhbGl0eS4KClRoaXMgaW52ZXN0aWdhdGlvbiBmYWlscyB0byBjb25zaWRlciB0aGF0IGVhY2ggY2hhaW4gc2V0cyBwcmljZXMgc3RyYXRlZ2ljYWxseSwgYXQgbGVhc3QgcGFydGx5IGluIHJlc3BvbnNlIHRvIHRoZSBwcmljaW5nIHNpZ25hbHMgb2YgdGhlIG90aGVyLSB0aGVpciBwcmltYXJ5IGNvbXBldGl0b3IuIEl0IG1heSBiZSBtb3JlIGltcG9ydGFudCBmb3IgYSBjaGFpbiB0byBiZSBjaGVhcGVyIG9uIG9uZSBwcm9kdWN0IHRoYW4gYW5vdGhlci4gQ29uc2VxdWVudGx5LCBhbm90aGVyIHBvc3NpYmxlIGltcHJvdmVtZW50IHRvIHRoaXMgaW52ZXN0aWdhdGlvbiBjb3VsZCBiZSB0byB3ZWlnaHQgdGhlIHByb2R1Y3RzIGJ5IHRoZWlyIHJlbGF0aXZlIGltcG9ydGFuY2UgaW4gdGhlIGF2ZXJhZ2Ugc2hvcHBlcidzIGJhc2tldC4gUGVyaGFwcyBiZWluZyBhIGxvdCBjaGVhcGVyIG9uIGFuIGV4b3RpYyBpdGVtIGlzIG5vdCBwcmVmZXJhYmxlIHRvIGJlaW5nIGEgbGl0dGxlIGNoZWFwZXIgb24gYW4gZXZlcnlkYXkgaXRlbS4KCklmIHRoaXMgaW52ZXN0aWdhdGlvbiB3ZXJlIHRvIGJlIHJlcGVhdGVkLCBpdCB3b3VsZCBjZXJ0YWlubHkgbWVyaXQgc29tZSBpbnZlc3RtZW50IG9mIHRpbWUgaW4gYnVpbGRpbmcgYSBtb3JlIGNhcGFibGUgd2ViIHNjcmFwaW5nIHByb2dyYW0gdG8gb2J0YWluIFdvb2x3b3J0aHPigJkgcHJpY2UgZGF0YSBhcyB3ZWxsIGFzIHNvbWUgZnVuY3Rpb25hbGl0eSB0byBzeW50aGVzaXplL2Z1enp5IG1hdGNoIHByb2R1Y3RzLiBDb2xsZWN0aW5nIGFuZCBwcm9jZXNzaW5nIGEgYnJvYWRseSByZXByZXNlbnRhdGl2ZSBzYW1wbGUgZGF0YXNldCB3YXMgYnkgZmFyIHRoZSBtb3N0IHRpbWUgY29uc3VtaW5nIHBvcnRpb24gb2YgdGhpcyB2ZW50dXJlLgoKCg==