The shrimps dataset
Dataset on the accumulation of PCBs (Polychlorinated biphenyls)
in the adipose tissue of shrimps. PCBs are often present in coolants, and are
know to accumulate easily in the adipose tissue of shrimps. In this experiment,
two groups of 18 samples (each 100 grams) of shrimps each were cultivated
in different conditions, one control condition and one condition
where the medium was poluted with PCBs. Note that the PCB concentrations were
measured in pg/g adipose tissue.
Goal
The research question is; is there an effect of the
growth condition on the PCB concentration in the adipose
tissue of shrimps?
Load libraries:
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.4 ✔ readr 2.1.5
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.1
## ✔ purrr 1.0.2
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Import the data
shrimps <- read_tsv(
"https://raw.githubusercontent.com/statOmics/PSLSData/main/shrimps.txt"
)
## Rows: 36 Columns: 2
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: "\t"
## dbl (2): PCB.conc, group
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## Rows: 36
## Columns: 2
## $ PCB.conc <dbl> 29.7, 24.5, 97.7, 39.1, 22.6, 32.4, 27.7, 100.1, 40.1, 23.3, …
## $ group <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2…
Data tidying
shrimps <- shrimps %>%
mutate(group = as.factor(group))
Data exploration
The first step is to explore the data.
Visualize the data:
shrimps %>%
ggplot(aes(x = group, y = PCB.conc, fill = group)) +
scale_fill_manual(values = c("darkorchid", "olivedrab")) +
theme_bw() +
geom_boxplot(outlier.shape = NA) +
geom_jitter(width = 0.2) +
ggtitle("Boxplot of the PCB concentrations in two groups of shrimps") +
ylab("PCB concentration (pg/g)") +
stat_summary(
fun = mean, geom = "point",
shape = 5, size = 3, color = "black",
)

We can see that for group 1 we have four very clear outliers
in the data. These values were double-checked (i.e for
typing errors), but there was no reason found to believe
that these values are incorrect.
Analysis
A good way for
testing the research hypothesis is to perform an unpaired
two-sample t-test to find out whether there is a significant
difference in the mean PCB concentrations between both groups
of samples. Before we can do this, we must check if all the
required assumptions are met.
Assumptions
- The observations are independent of each other (in both groups)
- The data (PCB.conc) must be normally distributed (in both groups)
- The variance is equal in the two groups.
The first assumption is met, as we randomly selected shrimps and
submitted them to one of two growth conditions. No underlying
correlation patterns are expected.
We can check the second assumption with a QQ-plot.
shrimps %>%
ggplot(aes(sample = PCB.conc)) +
geom_qq() +
geom_qq_line() +
facet_grid(~ group)

We clearly see that we have strong deviations from
normality. Many datapoints do not lie near the quantile-quantile
line. As such, we may conclude that our data are not normally distributed.
In addition, the boxplots suggest that the
variability differs between the two groups.
As such, we are not allowed to perform the t-test.
Given the location of the outliers transformation will not help, so we will resort to non-parametric
tests, i.e. to the Wilcoxon rank-sum test.
Wilcoxon rank-sum test
The Wilcoxon rank-sum test (or the Mann-Whitney U test) is an important
non-parametric data analysis method. In rank-based tests, the data
\(Y_i\) are first transformed to its ranked equivalent
\[ R_i=R(Y_i) = \#\{Y_j: Y_j\leq Y_i; j=1,\ldots, n\}. \]
Ranks are very robust to outliers. For instance, it does not
matter if the highest value in an hypothetical dataset has a
value of 10 or 100; it will keep the same rank (highest rank).
Note, that there might be ties in the data, e.g., if
two samples of shrimps have an equal concentration of PCBs.
In this case, the Wilcoxon rank-sum test will compute
mid-ranks, which are calculated as follows;
\[R(Y_i) = \frac{\sum\limits_{\forall j : Y_j=Y_i}R(Y_j)}{\#{\forall j:Y_j=Y_i}} \]
i.e., the midrank is equal to the mean of the ranks of equal
observations.
After computing the ranks and midranks, the Wilcoxon test will
compare the mean rank between both treatment groups:
wilcox_res <- wilcox.test(PCB.conc ~ group, data = shrimps)
wilcox_res
##
## Wilcoxon rank sum exact test
##
## data: PCB.conc by group
## W = 88, p-value = 0.01871
## alternative hypothesis: true location shift is not equal to 0
We find that the test is significant on the 5%
significance level (p = 0.01871). The value W=88
could be calculated manually as the Mann-Withney statistic
that counts how many times a value from group 1 is larger or equal than values of group 2.
Interpretation
The interpretation of the Wilcoxon rank-sum test is
slightly more challenging than that of a t-test.
Since we are no longer interpreting differences in the distributions between the groups in terms of the average differences but in in terms of the
probabilistic index.
The null hypothesis of the Wilcoxon test states that
the distributions
are equal for both groups:
\[ H_0: f_1 = f_2 \]
In words: the distribution of PCB concentrations in
shrimps are equal for both treatment conditions.
against the alternative hypothesis that
\[ H_1: P(Y_{1} \geq Y_{2}) \ne 1/2 \]
In words: The probability that a random observation of a
PCB concentration derived from shrimps that
was grown in the control condition is larger than or equal to
than a random observation of a PCB concentration
derived from a shrimps that was grown in
the other condition is not equal to 50%.
We can estimate this probability based on the observed test statistic.
n1 <- n2 <- 18 # 18 observations in each group
WObs <- wilcox_res$statistic # get the observed test statistic
WObs / (n1 * n2)
## W
## 0.2716049
We can see that the point estimate of this probability
is 27.2%.
We can interpret it as follows;
There is a probability of 27.2% that the PCB concentration in a random
shrimp that was grown in the control condition is
greater than or equal to the PCB concentration in a random
shrimp that was grown in the treatment condition. This probability is significantly different from 50% on the 5% significance level (p = 0.01871).
LS0tCnRpdGxlOiAiRXhlcmNpc2UgOS4xOiBOb24tcGFyYW1ldHJpYyBzdGF0aXN0aWNzIG9uIHRoZSBzaHJpbXBzIGRhdGFzZXQgLSBzb2x1dGlvbiIKYXV0aG9yOiAiTGlldmVuIENsZW1lbnQgYW5kIEplcm9lbiBHaWxpcyIKZGF0ZTogInN0YXRPbWljcywgR2hlbnQgVW5pdmVyc2l0eSAoaHR0cHM6Ly9zdGF0b21pY3MuZ2l0aHViLmlvKSIKLS0tCgojIFRoZSBzaHJpbXBzIGRhdGFzZXQKCkRhdGFzZXQgb24gdGhlIGFjY3VtdWxhdGlvbiBvZiBQQ0JzIChQb2x5Y2hsb3JpbmF0ZWQgYmlwaGVueWxzKQppbiB0aGUgYWRpcG9zZSB0aXNzdWUgb2Ygc2hyaW1wcy4gUENCcyBhcmUgb2Z0ZW4gcHJlc2VudCBpbiBjb29sYW50cywgYW5kIGFyZQprbm93IHRvIGFjY3VtdWxhdGUgZWFzaWx5IGluIHRoZSBhZGlwb3NlIHRpc3N1ZSBvZiBzaHJpbXBzLiBJbiB0aGlzIGV4cGVyaW1lbnQsCnR3byBncm91cHMgb2YgMTggc2FtcGxlcyAoZWFjaCAxMDAgZ3JhbXMpIG9mIHNocmltcHMgZWFjaCB3ZXJlIGN1bHRpdmF0ZWQKaW4gZGlmZmVyZW50IGNvbmRpdGlvbnMsIG9uZSBjb250cm9sIGNvbmRpdGlvbiBhbmQgb25lIGNvbmRpdGlvbgp3aGVyZSB0aGUgbWVkaXVtIHdhcyBwb2x1dGVkIHdpdGggUENCcy4gTm90ZSB0aGF0IHRoZSBQQ0IgY29uY2VudHJhdGlvbnMgd2VyZQptZWFzdXJlZCBpbiBwZy9nIGFkaXBvc2UgdGlzc3VlLgoKIyBHb2FsCgpUaGUgcmVzZWFyY2ggcXVlc3Rpb24gaXM7IGlzIHRoZXJlIGFuIGVmZmVjdCBvZiB0aGUKZ3Jvd3RoIGNvbmRpdGlvbiBvbiB0aGUgUENCIGNvbmNlbnRyYXRpb24gaW4gdGhlIGFkaXBvc2UKdGlzc3VlIG9mIHNocmltcHM/CgpMb2FkIGxpYnJhcmllczoKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgojIEltcG9ydCB0aGUgZGF0YQoKYGBge3J9CnNocmltcHMgPC0gcmVhZF90c3YoCiAgImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9zdGF0T21pY3MvUFNMU0RhdGEvbWFpbi9zaHJpbXBzLnR4dCIKKQpnbGltcHNlKHNocmltcHMpCmBgYAoKIyBEYXRhIHRpZHlpbmcKCmBgYHtyfQpzaHJpbXBzIDwtIHNocmltcHMgJT4lCiAgbXV0YXRlKGdyb3VwID0gYXMuZmFjdG9yKGdyb3VwKSkKYGBgCgojIERhdGEgZXhwbG9yYXRpb24KClRoZSBmaXJzdCBzdGVwIGlzIHRvIGV4cGxvcmUgdGhlIGRhdGEuCgpgYGB7cn0Kc2hyaW1wcyAlPiUKICBjb3VudChncm91cCkKYGBgCgpWaXN1YWxpemUgdGhlIGRhdGE6CgpgYGB7cn0Kc2hyaW1wcyAlPiUKICBnZ3Bsb3QoYWVzKHggPSBncm91cCwgeSA9IFBDQi5jb25jLCBmaWxsID0gZ3JvdXApKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZGFya29yY2hpZCIsICJvbGl2ZWRyYWIiKSkgKwogIHRoZW1lX2J3KCkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMikgKwogIGdndGl0bGUoIkJveHBsb3Qgb2YgdGhlIFBDQiBjb25jZW50cmF0aW9ucyBpbiB0d28gZ3JvdXBzIG9mIHNocmltcHMiKSArCiAgeWxhYigiUENCIGNvbmNlbnRyYXRpb24gKHBnL2cpIikgKwogIHN0YXRfc3VtbWFyeSgKICAgIGZ1biA9IG1lYW4sIGdlb20gPSAicG9pbnQiLAogICAgc2hhcGUgPSA1LCBzaXplID0gMywgY29sb3IgPSAiYmxhY2siLAogICkKYGBgCgpXZSBjYW4gc2VlIHRoYXQgZm9yIGdyb3VwIDEgd2UgaGF2ZSBmb3VyIHZlcnkgY2xlYXIgb3V0bGllcnMKaW4gdGhlIGRhdGEuIFRoZXNlIHZhbHVlcyB3ZXJlIGRvdWJsZS1jaGVja2VkIChpLmUgZm9yCnR5cGluZyBlcnJvcnMpLCBidXQgdGhlcmUgd2FzIG5vIHJlYXNvbiBmb3VuZCB0byBiZWxpZXZlCnRoYXQgdGhlc2UgdmFsdWVzIGFyZSBpbmNvcnJlY3QuCgojIEFuYWx5c2lzCgpBIGdvb2Qgd2F5IGZvcgp0ZXN0aW5nIHRoZSByZXNlYXJjaCBoeXBvdGhlc2lzIGlzIHRvIHBlcmZvcm0gYW4gdW5wYWlyZWQKdHdvLXNhbXBsZSB0LXRlc3QgdG8gZmluZCBvdXQgd2hldGhlciB0aGVyZSBpcyBhIHNpZ25pZmljYW50CmRpZmZlcmVuY2UgaW4gdGhlIG1lYW4gUENCIGNvbmNlbnRyYXRpb25zIGJldHdlZW4gYm90aCBncm91cHMKb2Ygc2FtcGxlcy4gQmVmb3JlIHdlIGNhbiBkbyB0aGlzLCB3ZSBtdXN0IGNoZWNrIGlmIGFsbCB0aGUKcmVxdWlyZWQgYXNzdW1wdGlvbnMgYXJlIG1ldC4KCiMjIEFzc3VtcHRpb25zCgoxLiBUaGUgb2JzZXJ2YXRpb25zIGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyIChpbiBib3RoIGdyb3VwcykKMi4gVGhlIGRhdGEgKFBDQi5jb25jKSBtdXN0IGJlIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBib3RoIGdyb3VwcykKMy4gVGhlIHZhcmlhbmNlIGlzIGVxdWFsIGluIHRoZSB0d28gZ3JvdXBzLgoKVGhlIGZpcnN0IGFzc3VtcHRpb24gaXMgbWV0LCBhcyB3ZSByYW5kb21seSBzZWxlY3RlZCBzaHJpbXBzIGFuZApzdWJtaXR0ZWQgdGhlbSB0byBvbmUgb2YgdHdvIGdyb3d0aCBjb25kaXRpb25zLiBObyB1bmRlcmx5aW5nCmNvcnJlbGF0aW9uIHBhdHRlcm5zIGFyZSBleHBlY3RlZC4KCldlIGNhbiBjaGVjayB0aGUgc2Vjb25kIGFzc3VtcHRpb24gd2l0aCBhIFFRLXBsb3QuCgpgYGB7cn0Kc2hyaW1wcyAlPiUKICBnZ3Bsb3QoYWVzKHNhbXBsZSA9IFBDQi5jb25jKSkgKwogIGdlb21fcXEoKSArCiAgZ2VvbV9xcV9saW5lKCkgKwogIGZhY2V0X2dyaWQofiBncm91cCkKYGBgCgpXZSBjbGVhcmx5IHNlZSB0aGF0IHdlIGhhdmUgc3Ryb25nIGRldmlhdGlvbnMgZnJvbQpub3JtYWxpdHkuIE1hbnkgZGF0YXBvaW50cyBkbyBub3QgbGllIG5lYXIgdGhlIHF1YW50aWxlLXF1YW50aWxlCmxpbmUuIEFzIHN1Y2gsIHdlIG1heSBjb25jbHVkZSB0aGF0IG91ciBkYXRhIGFyZSBub3Qgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuCkluIGFkZGl0aW9uLCB0aGUgYm94cGxvdHMgc3VnZ2VzdCB0aGF0IHRoZQp2YXJpYWJpbGl0eSBkaWZmZXJzIGJldHdlZW4gdGhlIHR3byBncm91cHMuCgpBcyBzdWNoLCB3ZSBhcmUgbm90IGFsbG93ZWQgdG8gcGVyZm9ybSB0aGUgdC10ZXN0LgpHaXZlbiB0aGUgbG9jYXRpb24gb2YgdGhlIG91dGxpZXJzIHRyYW5zZm9ybWF0aW9uIHdpbGwgbm90IGhlbHAsIHNvIHdlIHdpbGwgcmVzb3J0IHRvIG5vbi1wYXJhbWV0cmljCnRlc3RzLCBpLmUuIHRvIHRoZSBXaWxjb3hvbiByYW5rLXN1bSB0ZXN0LgoKIyMgV2lsY294b24gcmFuay1zdW0gdGVzdAoKVGhlIFdpbGNveG9uIHJhbmstc3VtIHRlc3QgKG9yIHRoZSBNYW5uLVdoaXRuZXkgVSB0ZXN0KSBpcyBhbiBpbXBvcnRhbnQKbm9uLXBhcmFtZXRyaWMgZGF0YSBhbmFseXNpcyBtZXRob2QuIEluIHJhbmstYmFzZWQgdGVzdHMsIHRoZSBkYXRhCiRZX2kkIGFyZSBmaXJzdCB0cmFuc2Zvcm1lZCB0byBpdHMgcmFua2VkIGVxdWl2YWxlbnQKXFsgUl9pPVIoWV9pKSA9IFwjXHtZX2o6IFlfalxsZXEgWV9pOyBqPTEsXGxkb3RzLCBuXH0uIFxdCgpSYW5rcyBhcmUgdmVyeSByb2J1c3QgdG8gb3V0bGllcnMuIEZvciBpbnN0YW5jZSwgaXQgZG9lcyBub3QKbWF0dGVyIGlmIHRoZSBoaWdoZXN0IHZhbHVlIGluIGFuIGh5cG90aGV0aWNhbCBkYXRhc2V0IGhhcyBhCnZhbHVlIG9mIDEwIG9yIDEwMDsgaXQgd2lsbCBrZWVwIHRoZSBzYW1lIHJhbmsgKGhpZ2hlc3QgcmFuaykuCgpOb3RlLCB0aGF0IHRoZXJlIG1pZ2h0IGJlIHRpZXMgaW4gdGhlIGRhdGEsIGUuZy4sIGlmCnR3byBzYW1wbGVzIG9mIHNocmltcHMgaGF2ZSBhbiBlcXVhbCBjb25jZW50cmF0aW9uIG9mIFBDQnMuCkluIHRoaXMgY2FzZSwgdGhlIFdpbGNveG9uIHJhbmstc3VtIHRlc3Qgd2lsbCBjb21wdXRlCm1pZC1yYW5rcywgd2hpY2ggYXJlIGNhbGN1bGF0ZWQgYXMgZm9sbG93czsKXFtSKFlfaSkgPSBcZnJhY3tcc3VtXGxpbWl0c197XGZvcmFsbCBqIDogWV9qPVlfaX1SKFlfail9e1wje1xmb3JhbGwgajpZX2o9WV9pfX0gIFxdCmkuZS4sIHRoZSBtaWRyYW5rIGlzIGVxdWFsIHRvIHRoZSBtZWFuIG9mIHRoZSByYW5rcyBvZiBlcXVhbApvYnNlcnZhdGlvbnMuCgpBZnRlciBjb21wdXRpbmcgdGhlIHJhbmtzIGFuZCBtaWRyYW5rcywgdGhlIFdpbGNveG9uIHRlc3Qgd2lsbApjb21wYXJlIHRoZSBtZWFuIHJhbmsgYmV0d2VlbiBib3RoIHRyZWF0bWVudCBncm91cHM6CgpgYGB7cn0Kd2lsY294X3JlcyA8LSB3aWxjb3gudGVzdChQQ0IuY29uYyB+IGdyb3VwLCBkYXRhID0gc2hyaW1wcykKd2lsY294X3JlcwpgYGAKCldlIGZpbmQgdGhhdCB0aGUgdGVzdCBpcyBzaWduaWZpY2FudCBvbiB0aGUgNSUKc2lnbmlmaWNhbmNlIGxldmVsIChwID0gMC4wMTg3MSkuIFRoZSB2YWx1ZSBXPTg4CmNvdWxkIGJlIGNhbGN1bGF0ZWQgbWFudWFsbHkgYXMgdGhlIE1hbm4tV2l0aG5leSBzdGF0aXN0aWMKdGhhdCBjb3VudHMgaG93IG1hbnkgdGltZXMgYSB2YWx1ZSBmcm9tIGdyb3VwIDEgaXMgbGFyZ2VyIG9yIGVxdWFsIHRoYW4gdmFsdWVzIG9mIGdyb3VwIDIuCgojIyMgSW50ZXJwcmV0YXRpb24KClRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgV2lsY294b24gcmFuay1zdW0gdGVzdCBpcwpzbGlnaHRseSBtb3JlIGNoYWxsZW5naW5nIHRoYW4gdGhhdCBvZiBhIHQtdGVzdC4KU2luY2Ugd2UgYXJlIG5vIGxvbmdlciBpbnRlcnByZXRpbmcgZGlmZmVyZW5jZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbnMgYmV0d2VlbiB0aGUgZ3JvdXBzIGluIHRlcm1zIG9mIHRoZSBhdmVyYWdlIGRpZmZlcmVuY2VzIGJ1dCBpbiBpbiB0ZXJtcyBvZiB0aGUKKnByb2JhYmlsaXN0aWMgaW5kZXgqLgoKVGhlIG51bGwgaHlwb3RoZXNpcyBvZiB0aGUgV2lsY294b24gdGVzdCBzdGF0ZXMgdGhhdAp0aGUgZGlzdHJpYnV0aW9ucwphcmUgZXF1YWwgZm9yIGJvdGggZ3JvdXBzOgoKXFsgSF8wOiBmXzEgPSBmXzIgXF0KCkluIHdvcmRzOiB0aGUgZGlzdHJpYnV0aW9uIG9mIFBDQiBjb25jZW50cmF0aW9ucyBpbgpzaHJpbXBzIGFyZSBlcXVhbCBmb3IgYm90aCB0cmVhdG1lbnQgY29uZGl0aW9ucy4KCmFnYWluc3QgdGhlIGFsdGVybmF0aXZlIGh5cG90aGVzaXMgdGhhdAoKXFsgSF8xOiBQKFlfezF9IFxnZXEgWV97Mn0pIFxuZSAxLzIgXF0KCkluIHdvcmRzOiBUaGUgcHJvYmFiaWxpdHkgdGhhdCBhIHJhbmRvbSBvYnNlcnZhdGlvbiBvZiBhClBDQiBjb25jZW50cmF0aW9uIGRlcml2ZWQgZnJvbSBzaHJpbXBzIHRoYXQKd2FzIGdyb3duIGluIHRoZSBjb250cm9sIGNvbmRpdGlvbiAqaXMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8qCnRoYW4gYSByYW5kb20gb2JzZXJ2YXRpb24gb2YgYSBQQ0IgY29uY2VudHJhdGlvbgpkZXJpdmVkIGZyb20gYSBzaHJpbXBzIHRoYXQgd2FzIGdyb3duIGluCnRoZSBvdGhlciBjb25kaXRpb24gKmlzIG5vdCBlcXVhbCB0byA1MCUqLgoKV2UgY2FuIGVzdGltYXRlIHRoaXMgcHJvYmFiaWxpdHkgYmFzZWQgb24gdGhlIG9ic2VydmVkIHRlc3Qgc3RhdGlzdGljLgoKYGBge3J9Cm4xIDwtIG4yIDwtIDE4ICMgMTggb2JzZXJ2YXRpb25zIGluIGVhY2ggZ3JvdXAKV09icyA8LSB3aWxjb3hfcmVzJHN0YXRpc3RpYyAjIGdldCB0aGUgb2JzZXJ2ZWQgdGVzdCBzdGF0aXN0aWMKV09icyAvIChuMSAqIG4yKQpgYGAKCldlIGNhbiBzZWUgdGhhdCB0aGUgcG9pbnQgZXN0aW1hdGUgb2YgdGhpcyBwcm9iYWJpbGl0eQppcyBgciByb3VuZChXT2JzLyhuMSpuMiksMykqMTAwYCUuCgpXZSBjYW4gaW50ZXJwcmV0IGl0IGFzIGZvbGxvd3M7CgpUaGVyZSBpcyBhIHByb2JhYmlsaXR5IG9mIDI3LjIlIHRoYXQgdGhlIFBDQiBjb25jZW50cmF0aW9uIGluIGEgcmFuZG9tCnNocmltcCB0aGF0IHdhcyBncm93biBpbiB0aGUgY29udHJvbCBjb25kaXRpb24gaXMKZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBQQ0IgY29uY2VudHJhdGlvbiBpbiBhIHJhbmRvbQpzaHJpbXAgdGhhdCB3YXMgZ3Jvd24gaW4gdGhlIHRyZWF0bWVudCBjb25kaXRpb24uIFRoaXMgcHJvYmFiaWxpdHkgaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgZnJvbSA1MCUgb24gdGhlIDUlIHNpZ25pZmljYW5jZSBsZXZlbCAocCA9IDAuMDE4NzEpLgo=