See http://blogs.sas.com/content/iml/2017/02/20/proportion-of-colors-mandms.html for full expository. Any text here is a riff from that. Rick did the hard work.

library(knitr)
library(kableExtra)
library(scimple) # devtools::install_github("hrbrmstr/scimple")
library(hrbrthemes)
library(ggimage)
library(tidyverse)

options(knitr.table.format = "html") 
data_frame(
  color_name = c("Red", "Orange", "Yellow", "Green", "Blue", "Brown"),
  official_color = c("#cb1634", "#eb6624", "#fff10a", "#37b252", "#009edd", "#562f14"), 
  count = c(108, 133, 103, 139, 133, 96),
  prop_2008 = c(0.13, 0.20, 0.14, 0.16, 0.24, 0.13),
  imgs=c("im-red-lentil.png", "im-orange-lentil.png", "im-yellow-lentil.png",
         "im-green-lentil.png", "im-blue-lentil.png", "im-brown-lentil.png")
) %>% 
  mutate(prop = count / sum(count),
         color_name = factor(color_name, levels=color_name)) ->  mms

cap_src <- "Source: Riffed from The DO Loop <http://blogs.sas.com/content/iml/2017/02/20/proportion-of-colors-mandms.html>"

SAS M&M’s Measurements

The breakroom containers at SAS are filled from two-pound bags. So as to not steal all the M&M’s in the breakroom, [Rick] conducted this experiment over many weeks in late 2016 and early 2017, taking one scoop of M&M’s each week. The following data set contains the cumulative counts for each of the six colors in a sample of size N = 712:

ggplot(mms, aes(color_name, prop, fill=official_color)) +
  geom_col(width=0.65) +
  scale_y_percent(limits=c(0, 0.21)) +
  scale_fill_identity(guide = FALSE) +
  labs(x=NULL, y=NULL, title=sprintf("Sample distribution of colors for M&Ms [n=%d]", sum(mms$count)),
       caption=cap_src) +
  theme_ipsum_rc(grid="Y", axis="x")

Data overview

The data set includes the most recent published distribution is from 2008:

mms %>% 
  mutate(prop=scales::percent(prop), 
         prop_2008=scales::percent(prop_2008)) %>% 
  select(Color=color_name, Frequency=count, Percent=prop, `Test Percent`=prop_2008) %>% 
  kable(align="lrrr") %>% 
  kable_styling(bootstrap_options=c("hover", "condensed", "responsive"), full_width = FALSE)
Color Frequency Percent Test Percent
Red 108 15.17% 13%
Orange 133 18.68% 20%
Yellow 103 14.47% 14%
Green 139 19.52% 16%
Blue 133 18.68% 24%
Brown 96 13.48% 13%

Chi-Square Test Results

Let’s test these proportions:

chisq.test(mms$count, p=mms$prop_2008) %>% 
  broom::tidy() %>% 
  kable(align = "rrrl") %>% 
  kable_styling(bootstrap_options=c("hover", "condensed", "responsive"), full_width = FALSE)
statistic p.value parameter method
17.35305 0.0038767 5 Chi-squared test for given probabilities

The chi-square test rejects the test hypothesis at the α = 0.05 significance level (95% confidence). In other words, the distribution of colors for M&M’s in this 2017 sample does NOT appear to be the same as the color distribution from 2008! You can see this visually from the bar chart: the red and green bars are too tall and the blue bar is too short compared with the expected values.

You need a large sample to be confident that this empirical deviation is real. After collecting data for a few weeks, [Rick] did a preliminary analysis that analyzed about 300 candies. With that smaller sample, the difference between the observed and expected proportions could be attributed to sampling variability and so the chi-square test did not reject the null hypothesis. However, while running that test [Rick] noticed that the green and blue colors accounted for the majority of the difference between the observed and theoretical proportions, so [Rick] decided to collect more data.

Simultaneous confidence intervals for the M&M proportions

Rick used some SAS scripts he had written for a previous blog post. We’ve got a few packages for computing simultaneous confidence intervals in R but one of the “better” ones does the computation and prints out the results (literally with print()) vs return data, so I made a new package that does the same computations and returns tidy data frames for the confidence intervals. The original version of this document had the computation in a hidden code block but a package is much better and it includes a function that can compute multiple SCIs and return them in a single data frame, similar to what binom::binom.confint() does.

mms <- bind_cols(mms, scimp_goodman(mms$count, alpha=0.05))

mms %>% 
  select(Color=color_name, Count=count, Proportion=prop, 
                `95% Lower`=lower_limit, `95% Upper`=upper_limit) %>% 
  kable(align=c("lrrrr"), caption="Simultaneous confidence Intervals (Goodman method)") %>% 
  kable_styling(bootstrap_options=c("hover", "condensed", "responsive"), full_width = FALSE)
Simultaneous confidence Intervals (Goodman method)
Color Count Proportion 95% Lower 95% Upper
Red 108 0.1516854 0.1196016 0.1905134
Orange 133 0.1867978 0.1513616 0.2282982
Yellow 103 0.1446629 0.1133216 0.1828844
Green 139 0.1952247 0.1590634 0.2372872
Blue 133 0.1867978 0.1513616 0.2282982
Brown 96 0.1348315 0.1045758 0.1721577

The table indicates that the published 2008 proportion for blue (0.24) is far outside the 95% confidence interval, and the proportion for green (0.16) is just barely inside its interval. That by itself does not prove that the 2008 proportion are no longer valid (we might have gotten unlucky during sampling), but combined with the earlier chi-square test, it seems unlikely that the 2008 proportions are applicable to these data.

Cleveland Comparison

We incorporate the Cleveland M&M plant official color distribution values into our data frame and show where their expected distributions fall compared to the sample and where both fall within our computed confidence intervals:

NOTE: Uncomment the commented bits and comment out the geom_image() if you want “normal” points.

url_base <- "http://www.mms.com/Resources/img/"

mms %>% 
  mutate(imgs=sprintf("%s%s", url_base, imgs)) %>% 
  mutate(cleveland_prop=c(0.131, 0.205, 0.135, 0.198, 0.207, 0.124)) %>% 
  ggplot() +
  geom_segment(aes(x=lower_limit, xend=upper_limit, y=color_name, 
                   yend=color_name, color=official_color), size=2) +
  # geom_point(aes(prop, color_name, fill=official_color), 
  #            size=8, shape=21, color="white") +
  geom_image(aes(prop, color_name, image=imgs)) +
  # geom_text(aes(prop, color_name, label="m"), 
  #           color="white", family="Times", fontface="bold") +
  geom_point(aes(cleveland_prop, color_name, color=official_color),
             shape="|", size=6) +
  scale_x_percent(limits=c(0.095, 0.25)) +
  scale_color_identity(guide = FALSE) +
  scale_fill_identity(guide = FALSE) +
  labs(x="Proportion", y=NULL, 
       title="Observed vs 2017 Proportions for M&M Candies",
       subtitle=sprintf("95%% Simultaneous Confidence Intervals, [N=%d]",
                        sum(mms$count)), caption=cap_src) +
  theme_ipsum_rc(grid="X") +
  theme(panel.background=element_rect(color="#5b5b5b", fill="#5b5b5b")) +
  theme(axis.text.x=element_text(hjust=c(0, 0.5, 0.5, 1)))

LS0tCnRpdGxlOiAiTW1tbW1tbSIKYXV0aG9yOiAiQm9iIFJ1ZGlzIgpkYXRlOiAiMy8zLzIwMTciCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHRydWUKICAgIHRoZW1lOiBmbGF0bHkKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKLS0tCgpTZWUgPGh0dHA6Ly9ibG9ncy5zYXMuY29tL2NvbnRlbnQvaW1sLzIwMTcvMDIvMjAvcHJvcG9ydGlvbi1vZi1jb2xvcnMtbWFuZG1zLmh0bWw+IGZvciBmdWxsIGV4cG9zaXRvcnkuIEFueSB0ZXh0IGhlcmUgaXMgYSByaWZmIGZyb20gdGhhdC4gUmljayBkaWQgdGhlIGhhcmQgd29yay4KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGZpZy5yZXRpbmE9MikKYGBgCgpgYGB7ciBsaWJyYXJpZXMsIG1lc3NhZ2U9RkFMU0V9CmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKbGlicmFyeShzY2ltcGxlKSAjIGRldnRvb2xzOjppbnN0YWxsX2dpdGh1YigiaHJicm1zdHIvc2NpbXBsZSIpCmxpYnJhcnkoaHJicnRoZW1lcykKbGlicmFyeShnZ2ltYWdlKQpsaWJyYXJ5KHRpZHl2ZXJzZSkKCm9wdGlvbnMoa25pdHIudGFibGUuZm9ybWF0ID0gImh0bWwiKSAKYGBgCgpgYGB7ciBkYXRhfQpkYXRhX2ZyYW1lKAogIGNvbG9yX25hbWUgPSBjKCJSZWQiLCAiT3JhbmdlIiwgIlllbGxvdyIsICJHcmVlbiIsICJCbHVlIiwgIkJyb3duIiksCiAgb2ZmaWNpYWxfY29sb3IgPSBjKCIjY2IxNjM0IiwgIiNlYjY2MjQiLCAiI2ZmZjEwYSIsICIjMzdiMjUyIiwgIiMwMDllZGQiLCAiIzU2MmYxNCIpLCAKICBjb3VudCA9IGMoMTA4LCAxMzMsIDEwMywgMTM5LCAxMzMsIDk2KSwKICBwcm9wXzIwMDggPSBjKDAuMTMsIDAuMjAsIDAuMTQsIDAuMTYsIDAuMjQsIDAuMTMpLAogIGltZ3M9YygiaW0tcmVkLWxlbnRpbC5wbmciLCAiaW0tb3JhbmdlLWxlbnRpbC5wbmciLCAiaW0teWVsbG93LWxlbnRpbC5wbmciLAogICAgICAgICAiaW0tZ3JlZW4tbGVudGlsLnBuZyIsICJpbS1ibHVlLWxlbnRpbC5wbmciLCAiaW0tYnJvd24tbGVudGlsLnBuZyIpCikgJT4lIAogIG11dGF0ZShwcm9wID0gY291bnQgLyBzdW0oY291bnQpLAogICAgICAgICBjb2xvcl9uYW1lID0gZmFjdG9yKGNvbG9yX25hbWUsIGxldmVscz1jb2xvcl9uYW1lKSkgLT4gIG1tcwoKY2FwX3NyYyA8LSAiU291cmNlOiBSaWZmZWQgZnJvbSBUaGUgRE8gTG9vcCA8aHR0cDovL2Jsb2dzLnNhcy5jb20vY29udGVudC9pbWwvMjAxNy8wMi8yMC9wcm9wb3J0aW9uLW9mLWNvbG9ycy1tYW5kbXMuaHRtbD4iCmBgYAoKIyMjIFNBUyBNJk0ncyBNZWFzdXJlbWVudHMKClRoZSBicmVha3Jvb20gY29udGFpbmVycyBhdCBTQVMgYXJlIGZpbGxlZCBmcm9tIHR3by1wb3VuZCBiYWdzLiBTbyBhcyB0byBub3Qgc3RlYWwgYWxsIHRoZSBNJk0ncyBpbiB0aGUgYnJlYWtyb29tLCBbUmlja10gY29uZHVjdGVkIHRoaXMgZXhwZXJpbWVudCBvdmVyIG1hbnkgd2Vla3MgaW4gbGF0ZSAyMDE2IGFuZCBlYXJseSAyMDE3LCB0YWtpbmcgb25lIHNjb29wIG9mIE0mTSdzIGVhY2ggd2Vlay4gVGhlIGZvbGxvd2luZyBkYXRhIHNldCBjb250YWlucyB0aGUgY3VtdWxhdGl2ZSBjb3VudHMgZm9yIGVhY2ggb2YgdGhlIHNpeCBjb2xvcnMgaW4gYSBzYW1wbGUgb2Ygc2l6ZSBOID0gYHIgc3VtKG1tcyRjb3VudClgOgoKYGBge3IgYmFyc30KZ2dwbG90KG1tcywgYWVzKGNvbG9yX25hbWUsIHByb3AsIGZpbGw9b2ZmaWNpYWxfY29sb3IpKSArCiAgZ2VvbV9jb2wod2lkdGg9MC42NSkgKwogIHNjYWxlX3lfcGVyY2VudChsaW1pdHM9YygwLCAwLjIxKSkgKwogIHNjYWxlX2ZpbGxfaWRlbnRpdHkoZ3VpZGUgPSBGQUxTRSkgKwogIGxhYnMoeD1OVUxMLCB5PU5VTEwsIHRpdGxlPXNwcmludGYoIlNhbXBsZSBkaXN0cmlidXRpb24gb2YgY29sb3JzIGZvciBNJk1zIFtuPSVkXSIsIHN1bShtbXMkY291bnQpKSwKICAgICAgIGNhcHRpb249Y2FwX3NyYykgKwogIHRoZW1lX2lwc3VtX3JjKGdyaWQ9IlkiLCBheGlzPSJ4IikKYGBgCgojIyMgRGF0YSBvdmVydmlldwoKVGhlIGRhdGEgc2V0IGluY2x1ZGVzIHRoZSBtb3N0IHJlY2VudCBwdWJsaXNoZWQgZGlzdHJpYnV0aW9uIGlzIGZyb20gMjAwODoKCmBgYHtyIHRhYmxlMX0KbW1zICU+JSAKICBtdXRhdGUocHJvcD1zY2FsZXM6OnBlcmNlbnQocHJvcCksIAogICAgICAgICBwcm9wXzIwMDg9c2NhbGVzOjpwZXJjZW50KHByb3BfMjAwOCkpICU+JSAKICBzZWxlY3QoQ29sb3I9Y29sb3JfbmFtZSwgRnJlcXVlbmN5PWNvdW50LCBQZXJjZW50PXByb3AsIGBUZXN0IFBlcmNlbnRgPXByb3BfMjAwOCkgJT4lIAogIGthYmxlKGFsaWduPSJscnJyIikgJT4lIAogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnM9YygiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgZnVsbF93aWR0aCA9IEZBTFNFKQpgYGAKCiMjIyBDaGktU3F1YXJlIFRlc3QgUmVzdWx0cwoKTGV0J3MgdGVzdCB0aGVzZSBwcm9wb3J0aW9uczoKCmBgYHtyIGNoaXNxfQpjaGlzcS50ZXN0KG1tcyRjb3VudCwgcD1tbXMkcHJvcF8yMDA4KSAlPiUgCiAgYnJvb206OnRpZHkoKSAlPiUgCiAga2FibGUoYWxpZ24gPSAicnJybCIpICU+JSAKICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zPWMoImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksIGZ1bGxfd2lkdGggPSBGQUxTRSkKYGBgCgpUaGUgY2hpLXNxdWFyZSB0ZXN0IHJlamVjdHMgdGhlIHRlc3QgaHlwb3RoZXNpcyBhdCB0aGUgzrEgPSAwLjA1IHNpZ25pZmljYW5jZSBsZXZlbCAoOTUlIGNvbmZpZGVuY2UpLiBJbiBvdGhlciB3b3JkcywgdGhlIGRpc3RyaWJ1dGlvbiBvZiBjb2xvcnMgZm9yIE0mTSdzIGluIHRoaXMgMjAxNyBzYW1wbGUgZG9lcyBOT1QgYXBwZWFyIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBjb2xvciBkaXN0cmlidXRpb24gZnJvbSAyMDA4ISBZb3UgY2FuIHNlZSB0aGlzIHZpc3VhbGx5IGZyb20gdGhlIGJhciBjaGFydDogdGhlIHJlZCBhbmQgZ3JlZW4gYmFycyBhcmUgdG9vIHRhbGwgYW5kIHRoZSBibHVlIGJhciBpcyB0b28gc2hvcnQgY29tcGFyZWQgd2l0aCB0aGUgZXhwZWN0ZWQgdmFsdWVzLgoKWW91IG5lZWQgYSBsYXJnZSBzYW1wbGUgdG8gYmUgY29uZmlkZW50IHRoYXQgdGhpcyBlbXBpcmljYWwgZGV2aWF0aW9uIGlzIHJlYWwuIEFmdGVyIGNvbGxlY3RpbmcgZGF0YSBmb3IgYSBmZXcgd2Vla3MsIFtSaWNrXSBkaWQgYSBwcmVsaW1pbmFyeSBhbmFseXNpcyB0aGF0IGFuYWx5emVkIGFib3V0IDMwMCBjYW5kaWVzLiBXaXRoIHRoYXQgc21hbGxlciBzYW1wbGUsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG9ic2VydmVkIGFuZCBleHBlY3RlZCBwcm9wb3J0aW9ucyBjb3VsZCBiZSBhdHRyaWJ1dGVkIHRvIHNhbXBsaW5nIHZhcmlhYmlsaXR5IGFuZCBzbyB0aGUgY2hpLXNxdWFyZSB0ZXN0IGRpZCBub3QgcmVqZWN0IHRoZSBudWxsIGh5cG90aGVzaXMuIEhvd2V2ZXIsIHdoaWxlIHJ1bm5pbmcgdGhhdCB0ZXN0IFtSaWNrXSBub3RpY2VkIHRoYXQgdGhlIGdyZWVuIGFuZCBibHVlIGNvbG9ycyBhY2NvdW50ZWQgZm9yIHRoZSBtYWpvcml0eSBvZiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBvYnNlcnZlZCBhbmQgdGhlb3JldGljYWwgcHJvcG9ydGlvbnMsIHNvIFtSaWNrXSBkZWNpZGVkIHRvIGNvbGxlY3QgbW9yZSBkYXRhLgoKIyMjIFNpbXVsdGFuZW91cyBjb25maWRlbmNlIGludGVydmFscyBmb3IgdGhlIE0mTSBwcm9wb3J0aW9ucwoKUmljayB1c2VkIHNvbWUgU0FTIHNjcmlwdHMgaGUgaGFkIHdyaXR0ZW4gZm9yIGEgcHJldmlvdXMgYmxvZyBwb3N0LiBXZSd2ZSBnb3QgYSBmZXcgcGFja2FnZXMgZm9yIGNvbXB1dGluZyBzaW11bHRhbmVvdXMgY29uZmlkZW5jZSBpbnRlcnZhbHMgaW4gUiBidXQgb25lIG9mIHRoZSAiYmV0dGVyIiBvbmVzIGRvZXMgdGhlIGNvbXB1dGF0aW9uIGFuZCBwcmludHMgb3V0IHRoZSByZXN1bHRzIChsaXRlcmFsbHkgd2l0aCBgcHJpbnQoKWApIHZzIHJldHVybiBkYXRhLCBzbyBJIFttYWRlIGEgbmV3IHBhY2thZ2VdKGh0dHBzOi8vZ2l0aHViLmNvbS9ocmJybXN0ci9zY2ltcGxlKSB0aGF0IGRvZXMgdGhlIHNhbWUgY29tcHV0YXRpb25zIGFuZCByZXR1cm5zIHRpZHkgZGF0YSBmcmFtZXMgZm9yIHRoZSBjb25maWRlbmNlIGludGVydmFscy4gVGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhpcyBkb2N1bWVudCBoYWQgdGhlIGNvbXB1dGF0aW9uIGluIGEgaGlkZGVuIGNvZGUgYmxvY2sgYnV0IGEgcGFja2FnZSBpcyBtdWNoIGJldHRlciBhbmQgaXQgaW5jbHVkZXMgYSBmdW5jdGlvbiB0aGF0IGNhbiBjb21wdXRlIG11bHRpcGxlIFNDSXMgYW5kIHJldHVybiB0aGVtIGluIGEgc2luZ2xlIGRhdGEgZnJhbWUsIHNpbWlsYXIgdG8gd2hhdCBgYmlub206OmJpbm9tLmNvbmZpbnQoKWAgZG9lcy4KCmBgYHtyIGNvbmZpbnR9Cm1tcyA8LSBiaW5kX2NvbHMobW1zLCBzY2ltcF9nb29kbWFuKG1tcyRjb3VudCwgYWxwaGE9MC4wNSkpCgptbXMgJT4lIAogIHNlbGVjdChDb2xvcj1jb2xvcl9uYW1lLCBDb3VudD1jb3VudCwgUHJvcG9ydGlvbj1wcm9wLCAKICAgICAgICAgICAgICAgIGA5NSUgTG93ZXJgPWxvd2VyX2xpbWl0LCBgOTUlIFVwcGVyYD11cHBlcl9saW1pdCkgJT4lIAogIGthYmxlKGFsaWduPWMoImxycnJyIiksIGNhcHRpb249IlNpbXVsdGFuZW91cyBjb25maWRlbmNlIEludGVydmFscyAoR29vZG1hbiBtZXRob2QpIikgJT4lIAogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnM9YygiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwgZnVsbF93aWR0aCA9IEZBTFNFKQpgYGAKClRoZSB0YWJsZSBpbmRpY2F0ZXMgdGhhdCB0aGUgcHVibGlzaGVkIDIwMDggcHJvcG9ydGlvbiBmb3IgYmx1ZSAoMC4yNCkgaXMgZmFyIG91dHNpZGUgdGhlIDk1JSBjb25maWRlbmNlIGludGVydmFsLCBhbmQgdGhlIHByb3BvcnRpb24gZm9yIGdyZWVuICgwLjE2KSBpcyBqdXN0IGJhcmVseSBpbnNpZGUgaXRzIGludGVydmFsLiBUaGF0IGJ5IGl0c2VsZiBkb2VzIG5vdCBwcm92ZSB0aGF0IHRoZSAyMDA4IHByb3BvcnRpb24gYXJlIG5vIGxvbmdlciB2YWxpZCAod2UgbWlnaHQgaGF2ZSBnb3R0ZW4gdW5sdWNreSBkdXJpbmcgc2FtcGxpbmcpLCBidXQgY29tYmluZWQgd2l0aCB0aGUgZWFybGllciBjaGktc3F1YXJlIHRlc3QsIGl0IHNlZW1zIHVubGlrZWx5IHRoYXQgdGhlIDIwMDggcHJvcG9ydGlvbnMgYXJlIGFwcGxpY2FibGUgdG8gdGhlc2UgZGF0YS4KCiMjIyBDbGV2ZWxhbmQgQ29tcGFyaXNvbgoKV2UgaW5jb3Jwb3JhdGUgdGhlIENsZXZlbGFuZCBNJk0gcGxhbnQgb2ZmaWNpYWwgY29sb3IgZGlzdHJpYnV0aW9uIHZhbHVlcyBpbnRvIG91ciBkYXRhIGZyYW1lIGFuZCBzaG93IHdoZXJlIHRoZWlyIGV4cGVjdGVkIGRpc3RyaWJ1dGlvbnMgZmFsbCBjb21wYXJlZCB0byB0aGUgc2FtcGxlIGFuZCB3aGVyZSBib3RoIGZhbGwgd2l0aGluIG91ciBjb21wdXRlZCBjb25maWRlbmNlIGludGVydmFsczoKCk5PVEU6IFVuY29tbWVudCB0aGUgY29tbWVudGVkIGJpdHMgYW5kIGNvbW1lbnQgb3V0IHRoZSBgZ2VvbV9pbWFnZSgpYCBpZiB5b3Ugd2FudCAibm9ybWFsIiBwb2ludHMuCgpgYGB7ciBjbGV2ZWxhbmQsIGZpZy53aWR0aD05LjUsIGZpZy5oZWlnaHQ9MTB9CnVybF9iYXNlIDwtICJodHRwOi8vd3d3Lm1tcy5jb20vUmVzb3VyY2VzL2ltZy8iCgptbXMgJT4lIAogIG11dGF0ZShpbWdzPXNwcmludGYoIiVzJXMiLCB1cmxfYmFzZSwgaW1ncykpICU+JSAKICBtdXRhdGUoY2xldmVsYW5kX3Byb3A9YygwLjEzMSwgMC4yMDUsIDAuMTM1LCAwLjE5OCwgMC4yMDcsIDAuMTI0KSkgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX3NlZ21lbnQoYWVzKHg9bG93ZXJfbGltaXQsIHhlbmQ9dXBwZXJfbGltaXQsIHk9Y29sb3JfbmFtZSwgCiAgICAgICAgICAgICAgICAgICB5ZW5kPWNvbG9yX25hbWUsIGNvbG9yPW9mZmljaWFsX2NvbG9yKSwgc2l6ZT0yKSArCiAgIyBnZW9tX3BvaW50KGFlcyhwcm9wLCBjb2xvcl9uYW1lLCBmaWxsPW9mZmljaWFsX2NvbG9yKSwgCiAgIyAgICAgICAgICAgIHNpemU9OCwgc2hhcGU9MjEsIGNvbG9yPSJ3aGl0ZSIpICsKICBnZW9tX2ltYWdlKGFlcyhwcm9wLCBjb2xvcl9uYW1lLCBpbWFnZT1pbWdzKSkgKwogICMgZ2VvbV90ZXh0KGFlcyhwcm9wLCBjb2xvcl9uYW1lLCBsYWJlbD0ibSIpLCAKICAjICAgICAgICAgICBjb2xvcj0id2hpdGUiLCBmYW1pbHk9IlRpbWVzIiwgZm9udGZhY2U9ImJvbGQiKSArCiAgZ2VvbV9wb2ludChhZXMoY2xldmVsYW5kX3Byb3AsIGNvbG9yX25hbWUsIGNvbG9yPW9mZmljaWFsX2NvbG9yKSwKICAgICAgICAgICAgIHNoYXBlPSJ8Iiwgc2l6ZT02KSArCiAgc2NhbGVfeF9wZXJjZW50KGxpbWl0cz1jKDAuMDk1LCAwLjI1KSkgKwogIHNjYWxlX2NvbG9yX2lkZW50aXR5KGd1aWRlID0gRkFMU0UpICsKICBzY2FsZV9maWxsX2lkZW50aXR5KGd1aWRlID0gRkFMU0UpICsKICBsYWJzKHg9IlByb3BvcnRpb24iLCB5PU5VTEwsIAogICAgICAgdGl0bGU9Ik9ic2VydmVkIHZzIDIwMTcgUHJvcG9ydGlvbnMgZm9yIE0mTSBDYW5kaWVzIiwKICAgICAgIHN1YnRpdGxlPXNwcmludGYoIjk1JSUgU2ltdWx0YW5lb3VzIENvbmZpZGVuY2UgSW50ZXJ2YWxzLCBbTj0lZF0iLAogICAgICAgICAgICAgICAgICAgICAgICBzdW0obW1zJGNvdW50KSksIGNhcHRpb249Y2FwX3NyYykgKwogIHRoZW1lX2lwc3VtX3JjKGdyaWQ9IlgiKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZD1lbGVtZW50X3JlY3QoY29sb3I9IiM1YjViNWIiLCBmaWxsPSIjNWI1YjViIikpICsKICB0aGVtZShheGlzLnRleHQueD1lbGVtZW50X3RleHQoaGp1c3Q9YygwLCAwLjUsIDAuNSwgMSkpKQpgYGAK