Although modern statistical softwares are able to supply confidence intervals and p-values whenever an analysis is conducted, the mathematical assumptions behind the model for two independent samples come from normal populations with the same standard deviation are almost never strictly met in in real world.

At this stage an understanding of actual conditions to evaluate appropriateness of the tools for a particular problem becomes a important issue. Cases in Chapter 3, mainly focuses on deflections from these assumptions, severity of these deviations and the solution…

Case 1 : Does Cloud Seeding Increases Rainfall or No?

The data used in this case were collected between 1968 and 1972 to test injection of silver iodide into cumulus clouds can lead to increased rainfall

case31<- Sleuth2::case0301
tapply(case31$Rainfall,case31$Treatment,summary) #Basic Desciptive
$Unseeded
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   1.00   24.82   44.20  164.60  159.20 1203.00 

$Seeded
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   4.10   98.13  221.60  442.00  406.00 2746.00 
require(lattice)
bwplot(case0301$Rainfall ~ case0301$Treatment,ylab='Volume of Rainfall per acres')

As it could be seen from the basic descriptives and box plots seeded clouds created substantially higher volume of rain fall. Mean volume of rainfall for seeded days is almost 3 times as large as the unseeded days.

It’s also a good alternative to inspect histogram to see whether two separate treatment groups have similar distributions or not ? In addition a histogram can be a effective tool to observe level of skewness in the data

require(lattice) #We will use histogram function from lattice package to produce a spilt histogram to view both factors.
histogram(~ case0301$Rainfall | case0301$Treatment, xlab='Rainfall volume per acres')

The box plots and histograms of the data in both displays show that both distributions are excessively skewed. But there is more variability occurred in seeded group. Moreover Shapiro test whose results given bellow also confirms that there is no enough evidence to say both of these two distribution is normal.

tapply(case0301$Rainfall,case0301$Treatment,shapiro.test)
$Unseeded

    Shapiro-Wilk normality test

data:  X[[i]]
W = 0.60216, p-value = 3.131e-07


$Seeded

    Shapiro-Wilk normality test

data:  X[[i]]
W = 0.65626, p-value = 1.411e-06
var.test(case0301$Rainfall ~ case0301$Treatment)

    F test to compare two variances

data:  case0301$Rainfall by case0301$Treatment
F = 0.18304, num df = 25, denom df = 25, p-value = 6.695e-05
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.0820690 0.4082315
sample estimates:
ratio of variances 
         0.1830387 

Moreover, equality of variances test also points that variances are substantially differs from each other. At first look this phenomena means a strong deflection from the assumptions and statistical distribution of our statistics will no longer converges to t distribution. But while stating assumptions, the statistical theory lets some approximations such as the one valid here.

If the skewness in the two populations have the same standart deviations and approximately the same shapes and if the sample sizes are about equal, then validity of t tools is affected moderately by long tailedness (kurtosis) and very little by skewness.

But in order to state this approximation and apply t test, one should initially remove adverse outcomes printed by validity of assumptions tests (variance equality and normality test). At this stage logarithmic calculation offers a very practical solution. By nature any logarithmic transformation series will keep same ordering but smaller observations get spread out more, while large numbers squeezed more closely. Could these distribution be more less skewed in logarithms? Let’s see…

##Transfromation of the data into logarithcmic scale
Log_Rainfall <- log(case0301$Rainfall)
# In R log() operator calculates natural logarithms in default but if you wish to use base you are able to assign it via base = is.numeric argument. 
tapply(Log_Rainfall,case31$Treatment,summary) #Basic stats for transformed values.
$Unseeded
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   3.211   3.786   3.990   5.069   7.092 

$Seeded
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  1.411   4.581   5.396   5.134   6.001   7.918 
bwplot(log(case0301$Rainfall) ~ case0301$Treatment, ylab='Log. Transformation of Volume of Rainfall per Acres')

It is clearly seen that logarithmic transformation data suffer less from skewness problem. Maybe a histogram would be a better sketch to compare log transformed volume of rainfalls originated from seeded and unseeded clouds with skewness of a perfectly normal distribution.

library('lattice')
histogram(~ log(case0301$Rainfall) | case0301$Treatment, xlab='Logarithmic Transformed Volume of Rainfall per Acres')

This is graphical presentation, but we can also inspect improvement after logarithmic transformation with t-tools. If we calculate skewness ratios for our raw and logarithmic transformed values it could easily seen that transformation causes substantial improvement. As you can see from the plots, a skewness ratio near “0” is the closest figure to represent a normally distributed data.

# The e1071 package
install.packages('e1071')
Error in install.packages : Updating loaded packages
require(e1071)
#Skewness of raw data
Skewness<- tapply(case0301$Rainfall,case0301$Treatment,skewness)
#Skewness of log transformed data
log_Skewness<- tapply(log(case0301$Rainfall),case0301$Treatment,skewness)
Table_Skewness <- t(rbind(Skewness,log_Skewness))
print("Improvement in Skewness (after log-transformation)")
[1] "Improvement in Skewness (after log-transformation)"
Table_Skewness
         Skewness log_Skewness
Unseeded 2.475611   -0.2036855
Seeded   2.161456   -0.4589744

Now we are ready to test our assumptions once more…

shapiro.test(log(case0301$Rainfall))

    Shapiro-Wilk normality test

data:  log(case0301$Rainfall)
W = 0.98464, p-value = 0.7351
var.test(log(case0301$Rainfall) ~ case0301$Treatment)

    F test to compare two variances

data:  log(case0301$Rainfall) by case0301$Treatment
F = 1.0536, num df = 25, denom df = 25, p-value = 0.8971
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.4724176 2.3499219
sample estimates:
ratio of variances 
          1.053634 
t.test(log(case0301$Rainfall,exp(1)) ~ case0301$Treatment,var.equal= TRUE,alternative='less' ) #order is Unseeded - Seeded so we state 'less'

    Two Sample t-test

data:  log(case0301$Rainfall, exp(1)) by case0301$Treatment
t = -2.5444, df = 50, p-value = 0.007041
alternative hypothesis: true difference in means is less than 0
95 percent confidence interval:
       -Inf -0.3904045
sample estimates:
mean in group Unseeded   mean in group Seeded 
              3.990406               5.134187 
diff <- log(case0301$Rainfall[case0301$Treatment=='Seeded']) - log(case0301$Rainfall[case0301$Treatment=='Unseeded']) 
mean(diff)
[1] 1.143781

Regarding on Shapiro and var.test now we can confidently say that our data is suitable for any application of t.tools and we can confidently say that average volume of rainfall differs significantly between seeded and unseeded days.

On our first observation on basic statistics for seeded and unseeded days, we said that mean rainfall volume of seed days is about 3.1 times of unseeded days averages. Taking ratios in consideration we could require to estimate confidence interval for this ratio…

Ratio<- (case0301$Rainfall[case0301$Treatment=='Seeded']/case0301$Rainfall[case0301$Treatment=='Unseeded']) #Computes the ratio of seeded days vs unseeded days 
ttest<-t.test(Ratio) #calculates interval in ttest
ttest$conf.int #prints confidence interval estimates
[1] 2.874151 3.791230
attr(,"conf.level")
[1] 0.95

Case 2 Effects of Agent Orange on Troops in Vietnam - An observational Study

Many Vietnam veterans blames Agent Orange, a herbicide sprayed in South Vietnam between 1962 to 1970 on their declining health status. Recent medical studies have shown that high levels of this dioxin can be detected 20 or more years after heavy exposure. Consequently, CDC has compared 1987 dioxin levels in living Vietnam and non- Vietnam veterans who entered the Army between 1965 and 1987.

Blood sample data from 97 non-Veterans and 646 Veterans are collected. Dioxin concentrations for both factors could be seen from following Box-plot and summary

tapply(case0302$Dioxin,case0302$Veteran,summary)
$Vietnam
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00    3.00    4.00    4.26    5.00   45.00 

$Other
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  0.000   3.000   4.000   4.186   5.000  15.000 
require(lattice) #Lattice package enables R to draw split box plots. 
bwplot(case0302$Dioxin  ~  case0302$Veteran,ylab='Dioxin Consentration in Parts per Tril.')

As it can be seen from summary statistics median dioxin levels of non-Vietnam and Vietnam veterans is exactly the same, while means differs minimally (this is caused by presence of outliers, but as number of samples for Vietnam Veterans is 646 we see a much more stabilized effect). So it’s not possible to say data provides enough evidence that Vietnam Veterans has increased level of dioxin in their blood compared Veterans served in USA and West Germany at the same period.

It’s a good alternative to employ a t.test whether these assessments are also valid in scope of a linear model. Here it can be seen that normality assumption doesn’t holds while equality of variances assumption is satisfied.

shapiro.test(case0302$Dioxin)

    Shapiro-Wilk normality test

data:  case0302$Dioxin
W = 0.65326, p-value < 2.2e-16
var.test(case0302$Dioxin  ~ case0302$Veteran)

    F test to compare two variances

data:  case0302$Dioxin by case0302$Veteran
F = 1.318, num df = 645, denom df = 96, p-value = 0.09203
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.9551141 1.7566600
sample estimates:
ratio of variances 
          1.317991 
t.test(case0302$Dioxin[case0302$Veteran=='Vietnam'],case0302$Dioxin[case0302$Veteran=='Other'],alternative='greater',var.equal=TRUE,conf.level=0.95)

    Two Sample t-test

data:  case0302$Dioxin[case0302$Veteran == "Vietnam"] and case0302$Dioxin[case0302$Veteran == "Other"]
t = 0.26302, df = 741, p-value = 0.3963
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
 -0.391951       Inf
sample estimates:
mean of x mean of y 
 4.260062  4.185567 

T.test results also confirms our inference. There is not enough evidence to state group means differs from each other. On the other hand, scope of inference for this analysis can also be criticized. Since samples are not random, inference to the population is speculative. For example, non-participating Vietnam veterans may have been failed to participate because of dioxin-related illnesses. If so, statistical inferences could be seriously biased.

Putting aside inference discussions, observing distortions caused by outliers can be a interesting effort for now. As it could be seen from Shapiro’s test our data doesn’t fits to a normal distribution and box plots reflects significant presence of outliers in data. Here we can list outlier values among Vietnam Veterans…

boxplot.stats(case0302$Dioxin[case0302$Veteran=='Vietnam'])$out
 [1]  9  9  9  9  9  9  9  9  9  9 10 10 11 12 13 15 16 25 45

25 and 45 are the obs.645 and obs.646 respectively and they seem as the most dominant outliers. Let us exclude them and calculate two sample t.test statistics once more..

NO_Outlier_Dioxin <- subset(case0302,case0302$Dioxin[case0302$Veteran=='Vietnam']<25) #Data excluding both two outliers
Error in subset(case0302, case0302$Dioxin[case0302$Veteran == "Vietnam"] <  : 
  object 'case0302' not found

Box plot of the data after removing outliers,

And consequently t test statistics after removing both outliers and the largest outlier…

t.test(NO_Outlier_Dioxin$Dioxin~ NO_Outlier_Dioxin$Veteran, alternative='greater' )

    Welch Two Sample t-test

data:  NO_Outlier_Dioxin$Dioxin by NO_Outlier_Dioxin$Veteran
t = -0.0853, df = 117.33, p-value = 0.5339
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
 -0.4285707        Inf
sample estimates:
mean in group Vietnam   mean in group Other 
             4.164596              4.185567 
t.test(Dioxin_Excl_646$Dioxin~ Dioxin_Excl_646$Veteran, alternative='greater' )

    Welch Two Sample t-test

data:  Dioxin_Excl_646$Dioxin by Dioxin_Excl_646$Veteran
t = 0.045709, df = 121.27, p-value = 0.4818
alternative hypothesis: true difference in means is greater than 0
95 percent confidence interval:
 -0.3996048        Inf
sample estimates:
mean in group Vietnam   mean in group Other 
             4.196899              4.185567 

It could clearly seen that after removing outliers tendency to reject initial hypothesis lowers substantially. Here we didn’t any change in our decision but it’s a good exhibit to see effects of outlier on t.tools.

LS0tCnRpdGxlOiAiU3RhdGlzdGljYWwgU2xldXRoIENoYXB0ZXIgMyAtIENhc2UgMSAmIDIgOiBBIENsb3NlciBMb29rIGF0IEFzc3VtcHRpb25zICIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpBbHRob3VnaCBtb2Rlcm4gc3RhdGlzdGljYWwgc29mdHdhcmVzIGFyZSBhYmxlIHRvIHN1cHBseSBjb25maWRlbmNlIGludGVydmFscyBhbmQgcC12YWx1ZXMgd2hlbmV2ZXIgYW4gYW5hbHlzaXMgaXMgY29uZHVjdGVkLCB0aGUgbWF0aGVtYXRpY2FsIGFzc3VtcHRpb25zIGJlaGluZCB0aGUgbW9kZWwgZm9yIHR3byBpbmRlcGVuZGVudCBzYW1wbGVzIGNvbWUgZnJvbSBub3JtYWwgcG9wdWxhdGlvbnMgd2l0aCB0aGUgc2FtZSBzdGFuZGFyZCBkZXZpYXRpb24gYXJlIGFsbW9zdCBuZXZlciBzdHJpY3RseSBtZXQgaW4gaW4gcmVhbCB3b3JsZC4gCgpBdCB0aGlzIHN0YWdlIGFuIHVuZGVyc3RhbmRpbmcgb2YgYWN0dWFsIGNvbmRpdGlvbnMgdG8gZXZhbHVhdGUgYXBwcm9wcmlhdGVuZXNzIG9mIHRoZSB0b29scyBmb3IgYSBwYXJ0aWN1bGFyIHByb2JsZW0gYmVjb21lcyBhIGltcG9ydGFudCBpc3N1ZS4gQ2FzZXMgaW4gQ2hhcHRlciAzLCBtYWlubHkgZm9jdXNlcyBvbiBkZWZsZWN0aW9ucyBmcm9tIHRoZXNlIGFzc3VtcHRpb25zLCBzZXZlcml0eSBvZiB0aGVzZSBkZXZpYXRpb25zIGFuZCB0aGUgc29sdXRpb24uLi4KCiMjIENhc2UgMSA6IERvZXMgQ2xvdWQgU2VlZGluZyBJbmNyZWFzZXMgUmFpbmZhbGwgb3IgTm8/CgpUaGUgZGF0YSB1c2VkIGluIHRoaXMgY2FzZSB3ZXJlIGNvbGxlY3RlZCBiZXR3ZWVuIDE5NjggYW5kIDE5NzIgdG8gdGVzdCBpbmplY3Rpb24gb2Ygc2lsdmVyIGlvZGlkZSBpbnRvIGN1bXVsdXMgY2xvdWRzIGNhbiBsZWFkIHRvIGluY3JlYXNlZCByYWluZmFsbCAKCmBgYHtyfQpyZXF1aXJlKFNsZXV0aDIpICMgV2UgbG9hZGVkIGRhdGEgcmVsYXRlZCB0byBjYXNlIGJ5IHVzaW5nIFNsZXV0aCBQYWNrYWdlCmNhc2UzMTwtIFNsZXV0aDI6OmNhc2UwMzAxCnRhcHBseShjYXNlMzEkUmFpbmZhbGwsY2FzZTMxJFRyZWF0bWVudCxzdW1tYXJ5KSAjQmFzaWMgRGVzY2lwdGl2ZXMKYGBgCgpgYGB7cn0KcmVxdWlyZShsYXR0aWNlKQpid3Bsb3QoY2FzZTAzMDEkUmFpbmZhbGwgfiBjYXNlMDMwMSRUcmVhdG1lbnQseWxhYj0nVm9sdW1lIG9mIFJhaW5mYWxsIHBlciBhY3JlcycpCmBgYAoKCkFzIGl0IGNvdWxkIGJlIHNlZW4gZnJvbSB0aGUgYmFzaWMgZGVzY3JpcHRpdmVzIGFuZCBib3ggcGxvdHMgc2VlZGVkIGNsb3VkcyBjcmVhdGVkIHN1YnN0YW50aWFsbHkgaGlnaGVyIHZvbHVtZSBvZiByYWluIGZhbGwuIE1lYW4gdm9sdW1lIG9mIHJhaW5mYWxsIGZvciBzZWVkZWQgZGF5cyBpcyBhbG1vc3QgMyB0aW1lcyBhcyBsYXJnZSBhcyB0aGUgdW5zZWVkZWQgZGF5cy4KCkl0J3MgYWxzbyBhIGdvb2QgYWx0ZXJuYXRpdmUgdG8gaW5zcGVjdCBoaXN0b2dyYW0gdG8gc2VlIHdoZXRoZXIgdHdvIHNlcGFyYXRlIHRyZWF0bWVudCBncm91cHMgaGF2ZSBzaW1pbGFyIGRpc3RyaWJ1dGlvbnMgb3Igbm90ID8gSW4gYWRkaXRpb24gYSBoaXN0b2dyYW0gY2FuIGJlIGEgZWZmZWN0aXZlIHRvb2wgdG8gb2JzZXJ2ZSBsZXZlbCBvZiBza2V3bmVzcyBpbiB0aGUgZGF0YQoKYGBge3J9CnJlcXVpcmUobGF0dGljZSkgI1dlIHdpbGwgdXNlIGhpc3RvZ3JhbSBmdW5jdGlvbiBmcm9tIGxhdHRpY2UgcGFja2FnZSB0byBwcm9kdWNlIGEgc3BpbHQgaGlzdG9ncmFtIHRvIHZpZXcgYm90aCBmYWN0b3JzLgoKaGlzdG9ncmFtKH4gY2FzZTAzMDEkUmFpbmZhbGwgfCBjYXNlMDMwMSRUcmVhdG1lbnQsIHhsYWI9J1JhaW5mYWxsIHZvbHVtZSBwZXIgYWNyZXMnKQoKYGBgCgpUaGUgYm94IHBsb3RzIGFuZCBoaXN0b2dyYW1zIG9mIHRoZSBkYXRhIGluIGJvdGggZGlzcGxheXMgc2hvdyB0aGF0IGJvdGggZGlzdHJpYnV0aW9ucyBhcmUgZXhjZXNzaXZlbHkgc2tld2VkLiBCdXQgdGhlcmUgaXMgbW9yZSB2YXJpYWJpbGl0eSBvY2N1cnJlZCBpbiBzZWVkZWQgZ3JvdXAuIE1vcmVvdmVyIFNoYXBpcm8gdGVzdCB3aG9zZSByZXN1bHRzIGdpdmVuIGJlbGxvdyBhbHNvIGNvbmZpcm1zIHRoYXQgdGhlcmUgaXMgbm8gZW5vdWdoIGV2aWRlbmNlIHRvIHNheSBib3RoIG9mIHRoZXNlIHR3byBkaXN0cmlidXRpb24gaXMgbm9ybWFsLiAKCmBgYHtyfQp0YXBwbHkoY2FzZTAzMDEkUmFpbmZhbGwsY2FzZTAzMDEkVHJlYXRtZW50LHNoYXBpcm8udGVzdCkKdmFyLnRlc3QoY2FzZTAzMDEkUmFpbmZhbGwgfiBjYXNlMDMwMSRUcmVhdG1lbnQpCmBgYAoKTW9yZW92ZXIsIGVxdWFsaXR5IG9mICB2YXJpYW5jZXMgdGVzdCBhbHNvIHBvaW50cyB0aGF0IHZhcmlhbmNlcyBhcmUgc3Vic3RhbnRpYWxseSBkaWZmZXJzIGZyb20gZWFjaCBvdGhlci4gQXQgZmlyc3QgbG9vayB0aGlzIHBoZW5vbWVuYSBtZWFucyBhIHN0cm9uZyBkZWZsZWN0aW9uIGZyb20gdGhlIGFzc3VtcHRpb25zIGFuZCBzdGF0aXN0aWNhbCBkaXN0cmlidXRpb24gb2Ygb3VyIHN0YXRpc3RpY3Mgd2lsbCBubyBsb25nZXIgY29udmVyZ2VzIHRvIHQgZGlzdHJpYnV0aW9uLiBCdXQgd2hpbGUgc3RhdGluZyBhc3N1bXB0aW9ucywgdGhlICBzdGF0aXN0aWNhbCB0aGVvcnkgbGV0cyBzb21lIGFwcHJveGltYXRpb25zIHN1Y2ggYXMgdGhlIG9uZSB2YWxpZCBoZXJlLiAKCiMjIyMgKklmIHRoZSBza2V3bmVzcyBpbiB0aGUgdHdvIHBvcHVsYXRpb25zIGhhdmUgIHRoZSBzYW1lIHN0YW5kYXJ0IGRldmlhdGlvbnMgYW5kIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgc2hhcGVzIGFuZCBpZiB0aGUgIHNhbXBsZSBzaXplcyBhcmUgYWJvdXQgZXF1YWwsIHRoZW4gIHZhbGlkaXR5IG9mIHQgdG9vbHMgaXMgYWZmZWN0ZWQgbW9kZXJhdGVseSBieSBsb25nIHRhaWxlZG5lc3MgKGt1cnRvc2lzKSBhbmQgdmVyeSBsaXR0bGUgYnkgc2tld25lc3MuKgoKQnV0IGluIG9yZGVyIHRvIHN0YXRlIHRoaXMgYXBwcm94aW1hdGlvbiBhbmQgYXBwbHkgdCB0ZXN0LCBvbmUgc2hvdWxkIGluaXRpYWxseSByZW1vdmUgYWR2ZXJzZSBvdXRjb21lcyBwcmludGVkIGJ5IHZhbGlkaXR5IG9mIGFzc3VtcHRpb25zIHRlc3RzICh2YXJpYW5jZSBlcXVhbGl0eSBhbmQgbm9ybWFsaXR5IHRlc3QpLiBBdCB0aGlzIHN0YWdlIGxvZ2FyaXRobWljIGNhbGN1bGF0aW9uIG9mZmVycyBhIHZlcnkgcHJhY3RpY2FsIHNvbHV0aW9uLiBCeSBuYXR1cmUgYW55IGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIHNlcmllcyB3aWxsIGtlZXAgc2FtZSBvcmRlcmluZyAgYnV0IHNtYWxsZXIgb2JzZXJ2YXRpb25zIGdldCBzcHJlYWQgb3V0IG1vcmUsIHdoaWxlIGxhcmdlIG51bWJlcnMgc3F1ZWV6ZWQgbW9yZSBjbG9zZWx5LiAgQ291bGQgdGhlc2UgZGlzdHJpYnV0aW9uIGJlIG1vcmUgbGVzcyBza2V3ZWQgaW4gbG9nYXJpdGhtcz8gTGV0J3Mgc2VlLi4uCgpgYGB7cn0KIyNUcmFuc2Zyb21hdGlvbiBvZiB0aGUgZGF0YSBpbnRvIGxvZ2FyaXRoY21pYyBzY2FsZQpMb2dfUmFpbmZhbGwgPC0gbG9nKGNhc2UwMzAxJFJhaW5mYWxsKQojIEluIFIgbG9nKCkgb3BlcmF0b3IgY2FsY3VsYXRlcyBuYXR1cmFsIGxvZ2FyaXRobXMgaW4gZGVmYXVsdCBidXQgaWYgeW91IHdpc2ggdG8gdXNlIGJhc2UgeW91IGFyZSBhYmxlIHRvIGFzc2lnbiBpdCB2aWEgYmFzZSA9IGlzLm51bWVyaWMgYXJndW1lbnQuIApgYGAKCmBgYHtyfQp0YXBwbHkoTG9nX1JhaW5mYWxsLGNhc2UzMSRUcmVhdG1lbnQsc3VtbWFyeSkgI0Jhc2ljIHN0YXRzIGZvciB0cmFuc2Zvcm1lZCB2YWx1ZXMuCmBgYApgYGB7cn0KYndwbG90KGxvZyhjYXNlMDMwMSRSYWluZmFsbCkgfiBjYXNlMDMwMSRUcmVhdG1lbnQsIHlsYWI9J0xvZy4gVHJhbnNmb3JtYXRpb24gb2YgVm9sdW1lIG9mIFJhaW5mYWxsIHBlciBBY3JlcycpCmBgYAoKSXQgaXMgY2xlYXJseSBzZWVuIHRoYXQgbG9nYXJpdGhtaWMgdHJhbnNmb3JtYXRpb24gZGF0YSBzdWZmZXIgbGVzcyBmcm9tIHNrZXduZXNzIHByb2JsZW0uIE1heWJlIGEgaGlzdG9ncmFtIHdvdWxkIGJlIGEgYmV0dGVyIHNrZXRjaCB0byBjb21wYXJlIGxvZyB0cmFuc2Zvcm1lZCB2b2x1bWUgb2YgcmFpbmZhbGxzIG9yaWdpbmF0ZWQgZnJvbSBzZWVkZWQgYW5kIHVuc2VlZGVkIGNsb3VkcyB3aXRoIHNrZXduZXNzIG9mIGEgcGVyZmVjdGx5IG5vcm1hbCBkaXN0cmlidXRpb24uIApgYGB7cn0KbGlicmFyeSgnbGF0dGljZScpCmhpc3RvZ3JhbSh+IGxvZyhjYXNlMDMwMSRSYWluZmFsbCkgfCBjYXNlMDMwMSRUcmVhdG1lbnQsIHhsYWI9J0xvZ2FyaXRobWljIFRyYW5zZm9ybWVkIFZvbHVtZSBvZiBSYWluZmFsbCBwZXIgQWNyZXMnKQpgYGAKCiAgICFbXShodHRwczovL3d3dy5hbmFseXRpY3N2aWRoeWEuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDE0LzA3L3NrZXduZXNzLWFuZC1rdXJ0b3Npcy5naWYpCgpUaGlzIGlzIGdyYXBoaWNhbCBwcmVzZW50YXRpb24sIGJ1dCB3ZSBjYW4gYWxzbyBpbnNwZWN0IGltcHJvdmVtZW50IGFmdGVyIGxvZ2FyaXRobWljIHRyYW5zZm9ybWF0aW9uIHdpdGggdC10b29scy4gSWYgd2UgY2FsY3VsYXRlIHNrZXduZXNzIHJhdGlvcyBmb3Igb3VyIHJhdyBhbmQgbG9nYXJpdGhtaWMgdHJhbnNmb3JtZWQgdmFsdWVzIGl0IGNvdWxkIGVhc2lseSBzZWVuIHRoYXQgdHJhbnNmb3JtYXRpb24gY2F1c2VzIHN1YnN0YW50aWFsIGltcHJvdmVtZW50LiBBcyB5b3UgY2FuIHNlZSBmcm9tIHRoZSBwbG90cywgYSBza2V3bmVzcyByYXRpbyBuZWFyICIwIiBpcyB0aGUgY2xvc2VzdCBmaWd1cmUgdG8gcmVwcmVzZW50IGEgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgZGF0YS4KCgpgYGB7cn0KIyBUaGUgZTEwNzEgcGFja2FnZQppbnN0YWxsLnBhY2thZ2VzKCdlMTA3MScpCnJlcXVpcmUoZTEwNzEpCiNTa2V3bmVzcyBvZiByYXcgZGF0YQpTa2V3bmVzczwtIHRhcHBseShjYXNlMDMwMSRSYWluZmFsbCxjYXNlMDMwMSRUcmVhdG1lbnQsc2tld25lc3MpCiNTa2V3bmVzcyBvZiBsb2cgdHJhbnNmb3JtZWQgZGF0YQpsb2dfU2tld25lc3M8LSB0YXBwbHkobG9nKGNhc2UwMzAxJFJhaW5mYWxsKSxjYXNlMDMwMSRUcmVhdG1lbnQsc2tld25lc3MpClRhYmxlX1NrZXduZXNzIDwtIHQocmJpbmQoU2tld25lc3MsbG9nX1NrZXduZXNzKSkKcHJpbnQoIkltcHJvdmVtZW50IGluIFNrZXduZXNzIChhZnRlciBsb2ctdHJhbnNmb3JtYXRpb24pIikKVGFibGVfU2tld25lc3MKYGBgCgpOb3cgd2UgYXJlIHJlYWR5IHRvIHRlc3Qgb3VyIGFzc3VtcHRpb25zIG9uY2UgbW9yZS4uLgoKYGBge3J9CnNoYXBpcm8udGVzdChsb2coY2FzZTAzMDEkUmFpbmZhbGwpKQp2YXIudGVzdChsb2coY2FzZTAzMDEkUmFpbmZhbGwpIH4gY2FzZTAzMDEkVHJlYXRtZW50KQp0LnRlc3QobG9nKGNhc2UwMzAxJFJhaW5mYWxsLGV4cCgxKSkgfiBjYXNlMDMwMSRUcmVhdG1lbnQsdmFyLmVxdWFsPSBUUlVFLGFsdGVybmF0aXZlPSdsZXNzJyApICNvcmRlciBpcyBVbnNlZWRlZCAtIFNlZWRlZCBzbyB3ZSBzdGF0ZSAnbGVzcycKZGlmZiA8LSBsb2coY2FzZTAzMDEkUmFpbmZhbGxbY2FzZTAzMDEkVHJlYXRtZW50PT0nU2VlZGVkJ10pIC0gbG9nKGNhc2UwMzAxJFJhaW5mYWxsW2Nhc2UwMzAxJFRyZWF0bWVudD09J1Vuc2VlZGVkJ10pIAptZWFuKGRpZmYpCmBgYAoKUmVnYXJkaW5nIG9uIFNoYXBpcm8gYW5kIHZhci50ZXN0IG5vdyB3ZSBjYW4gY29uZmlkZW50bHkgc2F5IHRoYXQgb3VyIGRhdGEgaXMgc3VpdGFibGUgZm9yIGFueSBhcHBsaWNhdGlvbiBvZiB0LnRvb2xzIGFuZCB3ZSBjYW4gY29uZmlkZW50bHkgc2F5IHRoYXQgYXZlcmFnZSB2b2x1bWUgIG9mIHJhaW5mYWxsIGRpZmZlcnMgc2lnbmlmaWNhbnRseSBiZXR3ZWVuIHNlZWRlZCBhbmQgdW5zZWVkZWQgZGF5cy4gCgpPbiBvdXIgZmlyc3Qgb2JzZXJ2YXRpb24gb24gYmFzaWMgc3RhdGlzdGljcyBmb3Igc2VlZGVkIGFuZCB1bnNlZWRlZCBkYXlzLCB3ZSBzYWlkIHRoYXQgbWVhbiByYWluZmFsbCB2b2x1bWUgb2Ygc2VlZCBkYXlzIGlzIGFib3V0IDMuMSB0aW1lcyBvZiB1bnNlZWRlZCBkYXlzIGF2ZXJhZ2VzLiBUYWtpbmcgcmF0aW9zIGluIGNvbnNpZGVyYXRpb24gd2UgY291bGQgcmVxdWlyZSB0byBlc3RpbWF0ZSBjb25maWRlbmNlIGludGVydmFsIGZvciB0aGlzIHJhdGlvLi4uIAoKYGBge3J9ClJhdGlvPC0gKGNhc2UwMzAxJFJhaW5mYWxsW2Nhc2UwMzAxJFRyZWF0bWVudD09J1NlZWRlZCddL2Nhc2UwMzAxJFJhaW5mYWxsW2Nhc2UwMzAxJFRyZWF0bWVudD09J1Vuc2VlZGVkJ10pICNDb21wdXRlcyB0aGUgcmF0aW8gb2Ygc2VlZGVkIGRheXMgdnMgdW5zZWVkZWQgZGF5cyAKdHRlc3Q8LXQudGVzdChSYXRpbykgI2NhbGN1bGF0ZXMgaW50ZXJ2YWwgaW4gdHRlc3QKdHRlc3QkY29uZi5pbnQgI3ByaW50cyBjb25maWRlbmNlIGludGVydmFsIGVzdGltYXRlcwoKCgpgYGAKCiMjIENhc2UgMiBFZmZlY3RzIG9mIEFnZW50IE9yYW5nZSBvbiBUcm9vcHMgaW4gVmlldG5hbSAtIEFuIG9ic2VydmF0aW9uYWwgU3R1ZHkgCgpNYW55IFZpZXRuYW0gdmV0ZXJhbnMgYmxhbWVzIEFnZW50IE9yYW5nZSwgYSBoZXJiaWNpZGUgc3ByYXllZCBpbiBTb3V0aCBWaWV0bmFtIGJldHdlZW4gMTk2MiB0byAxOTcwIG9uIHRoZWlyIGRlY2xpbmluZyBoZWFsdGggc3RhdHVzLiBSZWNlbnQgbWVkaWNhbCBzdHVkaWVzIGhhdmUgc2hvd24gdGhhdCBoaWdoIGxldmVscyBvZiB0aGlzIGRpb3hpbiBjYW4gYmUgZGV0ZWN0ZWQgMjAgb3IgbW9yZSB5ZWFycyBhZnRlciBoZWF2eSBleHBvc3VyZS4gQ29uc2VxdWVudGx5LCBDREMgaGFzIGNvbXBhcmVkIDE5ODcgZGlveGluIGxldmVscyBpbiBsaXZpbmcgVmlldG5hbSBhbmQgbm9uLSBWaWV0bmFtIHZldGVyYW5zIHdobyBlbnRlcmVkIHRoZSBBcm15IGJldHdlZW4gMTk2NSBhbmQgIDE5ODcuIAoKQmxvb2Qgc2FtcGxlIGRhdGEgZnJvbSA5NyBub24tVmV0ZXJhbnMgYW5kIDY0NiBWZXRlcmFucyBhcmUgY29sbGVjdGVkLiBEaW94aW4gY29uY2VudHJhdGlvbnMgZm9yIGJvdGggZmFjdG9ycyBjb3VsZCBiZSBzZWVuIGZyb20gIGZvbGxvd2luZyBCb3gtcGxvdCBhbmQgc3VtbWFyeSAKCmBgYHtyfQp0YXBwbHkoY2FzZTAzMDIkRGlveGluLGNhc2UwMzAyJFZldGVyYW4sc3VtbWFyeSkKYGBgCgpgYGB7cn0KcmVxdWlyZShsYXR0aWNlKSAjTGF0dGljZSBwYWNrYWdlIGVuYWJsZXMgUiB0byBkcmF3IHNwbGl0IGJveCBwbG90cy4gCmJ3cGxvdChjYXNlMDMwMiREaW94aW4gIH4gIGNhc2UwMzAyJFZldGVyYW4seWxhYj0nRGlveGluIENvbnNlbnRyYXRpb24gaW4gUGFydHMgcGVyIFRyaWwuJykKYGBgCgpBcyBpdCBjYW4gYmUgc2VlbiBmcm9tIHN1bW1hcnkgc3RhdGlzdGljcyBtZWRpYW4gZGlveGluIGxldmVscyBvZiBub24tVmlldG5hbSBhbmQgVmlldG5hbSB2ZXRlcmFucyBpcyBleGFjdGx5IHRoZSBzYW1lLCB3aGlsZSBtZWFucyBkaWZmZXJzIG1pbmltYWxseSAodGhpcyBpcyBjYXVzZWQgYnkgcHJlc2VuY2Ugb2Ygb3V0bGllcnMsIGJ1dCBhcyBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgVmlldG5hbSBWZXRlcmFucyBpcyA2NDYgd2Ugc2VlIGEgbXVjaCBtb3JlIHN0YWJpbGl6ZWQgZWZmZWN0KS4gU28gaXQncyBub3QgcG9zc2libGUgdG8gc2F5IGRhdGEgcHJvdmlkZXMgZW5vdWdoIGV2aWRlbmNlIHRoYXQgVmlldG5hbSBWZXRlcmFucyBoYXMgaW5jcmVhc2VkIGxldmVsIG9mIGRpb3hpbiBpbiB0aGVpciBibG9vZCBjb21wYXJlZCBWZXRlcmFucyBzZXJ2ZWQgaW4gVVNBIGFuZCBXZXN0IEdlcm1hbnkgYXQgdGhlIHNhbWUgcGVyaW9kLiAKCkl0J3MgYSBnb29kIGFsdGVybmF0aXZlIHRvIGVtcGxveSBhIHQudGVzdCB3aGV0aGVyIHRoZXNlIGFzc2Vzc21lbnRzIGFyZSBhbHNvIHZhbGlkIGluIHNjb3BlIG9mIGEgbGluZWFyIG1vZGVsLiBIZXJlIGl0IGNhbiBiZSBzZWVuIHRoYXQgbm9ybWFsaXR5IGFzc3VtcHRpb24gZG9lc24ndCBob2xkcyB3aGlsZSBlcXVhbGl0eSBvZiAgdmFyaWFuY2VzIGFzc3VtcHRpb24gaXMgc2F0aXNmaWVkLiAKCmBgYHtyfQpzaGFwaXJvLnRlc3QoY2FzZTAzMDIkRGlveGluKQp2YXIudGVzdChjYXNlMDMwMiREaW94aW4gIH4gY2FzZTAzMDIkVmV0ZXJhbikKdC50ZXN0KGNhc2UwMzAyJERpb3hpbltjYXNlMDMwMiRWZXRlcmFuPT0nVmlldG5hbSddLGNhc2UwMzAyJERpb3hpbltjYXNlMDMwMiRWZXRlcmFuPT0nT3RoZXInXSxhbHRlcm5hdGl2ZT0nZ3JlYXRlcicsdmFyLmVxdWFsPVRSVUUsY29uZi5sZXZlbD0wLjk1KQoKYGBgCgpULnRlc3QgcmVzdWx0cyBhbHNvIGNvbmZpcm1zIG91ciBpbmZlcmVuY2UuIFRoZXJlIGlzIG5vdCBlbm91Z2ggZXZpZGVuY2UgdG8gc3RhdGUgZ3JvdXAgbWVhbnMgZGlmZmVycyBmcm9tIGVhY2ggb3RoZXIuIE9uIHRoZSBvdGhlciBoYW5kLCBzY29wZSBvZiBpbmZlcmVuY2UgZm9yIHRoaXMgYW5hbHlzaXMgY2FuIGFsc28gYmUgY3JpdGljaXplZC4gU2luY2Ugc2FtcGxlcyBhcmUgbm90IHJhbmRvbSwgaW5mZXJlbmNlIHRvIHRoZSBwb3B1bGF0aW9uIGlzIHNwZWN1bGF0aXZlLiBGb3IgZXhhbXBsZSwgbm9uLXBhcnRpY2lwYXRpbmcgVmlldG5hbSB2ZXRlcmFucyBtYXkgaGF2ZSBiZWVuICBmYWlsZWQgdG8gcGFydGljaXBhdGUgYmVjYXVzZSBvZiBkaW94aW4tcmVsYXRlZCBpbGxuZXNzZXMuIElmIHNvLCBzdGF0aXN0aWNhbCBpbmZlcmVuY2VzIGNvdWxkIGJlIHNlcmlvdXNseSBiaWFzZWQuIAoKUHV0dGluZyBhc2lkZSBpbmZlcmVuY2UgZGlzY3Vzc2lvbnMsIG9ic2VydmluZyBkaXN0b3J0aW9ucyBjYXVzZWQgYnkgb3V0bGllcnMgY2FuIGJlIGEgaW50ZXJlc3RpbmcgZWZmb3J0IGZvciBub3cuIEFzIGl0IGNvdWxkIGJlIHNlZW4gZnJvbSBTaGFwaXJvJ3MgdGVzdCBvdXIgZGF0YSBkb2Vzbid0IGZpdHMgdG8gYSBub3JtYWwgZGlzdHJpYnV0aW9uIGFuZCBib3ggcGxvdHMgcmVmbGVjdHMgc2lnbmlmaWNhbnQgcHJlc2VuY2Ugb2Ygb3V0bGllcnMgaW4gZGF0YS4gSGVyZSB3ZSBjYW4gbGlzdCBvdXRsaWVyIHZhbHVlcyBhbW9uZyBWaWV0bmFtIFZldGVyYW5zLi4uCgpgYGB7cn0KYm94cGxvdC5zdGF0cyhjYXNlMDMwMiREaW94aW5bY2FzZTAzMDIkVmV0ZXJhbj09J1ZpZXRuYW0nXSkkb3V0CmBgYAoKMjUgYW5kIDQ1IGFyZSB0aGUgb2JzLjY0NSBhbmQgb2JzLjY0NiByZXNwZWN0aXZlbHkgYW5kIHRoZXkgc2VlbSBhcyB0aGUgbW9zdCBkb21pbmFudCBvdXRsaWVycy4gTGV0IHVzIGV4Y2x1ZGUgdGhlbSBhbmQgY2FsY3VsYXRlIHR3byBzYW1wbGUgdC50ZXN0IHN0YXRpc3RpY3Mgb25jZSBtb3JlLi4gIAoKYGBge3J9Ck5PX091dGxpZXJfRGlveGluIDwtIHN1YnNldChjYXNlMDMwMixjYXNlMDMwMiREaW94aW5bY2FzZTAzMDIkVmV0ZXJhbj09J1ZpZXRuYW0nXTwyNSkgI0RhdGEgZXhjbHVkaW5nIGJvdGggdHdvIG91dGxpZXJzCkRpb3hpbl9FeGNsXzY0NiA8LSBzdWJzZXQoY2FzZTAzMDIsY2FzZTAzMDIkRGlveGluW2Nhc2UwMzAyJFZldGVyYW49PSdWaWV0bmFtJ108NDUpICAgI0RhdGEgZXhjbHVkaW5nIG9ubHkgdGhlIGxhcmdlc3QgIG91dGxpZXIKYGBgCgpCb3ggcGxvdCBvZiB0aGUgZGF0YSBhZnRlciByZW1vdmluZyBvdXRsaWVycywgCgpgYGB7cn0KcmVxdWlyZShsYXR0aWNlKQpid3Bsb3QoTk9fT3V0bGllcl9EaW94aW4kRGlveGluICB+ICBjYXNlMDMwMiRWZXRlcmFuLHlsYWI9J0Rpb3hpbiBDb25zZW50cmF0aW9uIGluIFBhcnRzIHBlciBUcmlsLicpCmBgYAoKQW5kIGNvbnNlcXVlbnRseSB0IHRlc3Qgc3RhdGlzdGljcyBhZnRlciByZW1vdmluZyBib3RoIG91dGxpZXJzIGFuZCB0aGUgbGFyZ2VzdCBvdXRsaWVyLi4uCgpgYGB7cn0KdC50ZXN0KE5PX091dGxpZXJfRGlveGluJERpb3hpbn4gTk9fT3V0bGllcl9EaW94aW4kVmV0ZXJhbiwgYWx0ZXJuYXRpdmU9J2dyZWF0ZXInICkgI05vIE91dGxpZXIgCmBgYAoKYGBge3J9CnQudGVzdChEaW94aW5fRXhjbF82NDYkRGlveGlufiBEaW94aW5fRXhjbF82NDYkVmV0ZXJhbiwgYWx0ZXJuYXRpdmU9J2dyZWF0ZXInICkgI09ubHkgdGhlIGxhcmdlc3Qgb3V0bGllciBpcyBleGNsdWRlZAoKYGBgCgpJdCBjb3VsZCBjbGVhcmx5IHNlZW4gdGhhdCBhZnRlciByZW1vdmluZyBvdXRsaWVycyB0ZW5kZW5jeSB0byByZWplY3QgaW5pdGlhbCBoeXBvdGhlc2lzIGxvd2VycyBzdWJzdGFudGlhbGx5LiBIZXJlIHdlIGRpZG4ndCBhbnkgY2hhbmdlIGluIG91ciBkZWNpc2lvbiBidXQgaXQncyBhIGdvb2QgZXhoaWJpdCB0byBzZWUgZWZmZWN0cyBvZiBvdXRsaWVyIG9uIHQudG9vbHMuIAoKCgoKCgoKCgoK