Kaitlin Kavlie PSYC 541

Lab #5: Basic Stats Analysis

The Sample Thesis data set was used for the analyses in this lab.

  1. I ran a correlation test and created a scatter plot to examine if there is a relationship between age and GPA1.

I used the code below to run the correlation test on age and GPA1, two continuous variables.

cor.test(thesis$Age, thesis$GPA1)

    Pearson's product-moment correlation

data:  thesis$Age and thesis$GPA1
t = 0.25668, df = 39, p-value = 0.7988
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.2699939  0.3443673
sample estimates:
       cor 
0.04106779 

The correlation between Age and Self Esteem were statistically insignificant, r(39) = .04, ns. While the correlation is .04, the p value is 0.8, making the results insignificant.

Then I used this code below to create a scatter plot, with age along the x-axis and GPA1 on the y-axis.

thesis %>% 
  drop_na(Age, GPA1) %>%                                  
  ggplot(aes(Age, GPA1)) +
  geom_point() +
  theme_minimal() +                                             
  geom_smooth(formula = y~x, method = lm, se = FALSE) +         
  labs(title = "Relationship between Age and GPA1",      
       x = "Age",
       y = "GPA1")

  1. I ran a two sample t-test to examine if there is a difference between the GPA1 of students in the Business college versus students in the Arts & Sciences college. Business is classified as “BU” and Arts&Sciences as “AS”.

The code below was used to run a t-test on GPA1 and College the student studies under, Business or Arts & Sciences. Due to the fact that there are only 2 categories under colleges, this code works without having to alter the subcategories.

t.test(thesis$GPA1 ~ thesis$College)

    Welch Two Sample t-test

data:  thesis$GPA1 by thesis$College
t = -1.2753, df = 38.772, p-value = 0.2098
alternative hypothesis: true difference in means between group AS and group BU is not equal to 0
95 percent confidence interval:
 -0.7143396  0.1619586
sample estimates:
mean in group AS mean in group BU 
         3.02381          3.30000 

Students in the college of Business (M = 3.3) had a statistically insignificantly higher GPA1 than students in the college of Arts & Sciences (M = 3.02), t(38.77) = 1.28, p > .05.

Then the following code was used to create a box plot of GPA1 and the type of college individuals are enrolled in.

thesis %>%
  ggplot(aes(x = GPA1, y = College)) +
  geom_boxplot() +
  geom_jitter(width = .1) +
  theme_minimal() +
  labs(title = "GPA1 by College", x = "GPA1", y = "College")
Warning: Removed 1 rows containing non-finite values (stat_boxplot).
Warning: Removed 1 rows containing missing values (geom_point).

  1. The possible difference between the GPA1 of students in Communications versus Accounting was examined using a two sample t-test.

The code below was used to filter the data for Majors and limit it to Communications and Accounting only, creating a new data set called CommAccountMajor. This allowed me to run a t-test on the two subcategories of Major, Communications and Accounting.

thesis %>% 
  filter(Major == "Comm" | Major == "Account") -> CommAccountMajor

t.test(CommAccountMajor$GPA1 ~ CommAccountMajor$Major)

    Welch Two Sample t-test

data:  CommAccountMajor$GPA1 by CommAccountMajor$Major
t = 0.95153, df = 5.297, p-value = 0.3827
alternative hypothesis: true difference in means between group Account and group Comm is not equal to 0
95 percent confidence interval:
 -0.7868789  1.7368789
sample estimates:
mean in group Account    mean in group Comm 
                3.675                 3.200 

Communications majors (M = 3.2) had a lower GPA1 than Accounting majors (M = 3.68), t(5.3) = 0.95, p > .05.

Then I used the code below to create a box plot comparing the data points of the two subcategories of Major.

thesis %>% 
 filter(Major == "Comm" | Major == "Account") %>% 
  ggplot(aes(x = Major, y = GPA1)) +
  geom_boxplot() +
  geom_jitter(width = .2) +
  theme_minimal() +
  labs(title = "GPA1 by Major", x = "GPA1", y = "Major")

  1. I used a paired t-test and created a data table to examine if there is a difference between Mood1 and Mood2.

The code below was used to run the paired t-test on Mood1 and Mood2.

t.test(thesis$Mood1, thesis$Mood2, paired = TRUE)

    Paired t-test

data:  thesis$Mood1 and thesis$Mood2
t = -2.1686, df = 40, p-value = 0.03611
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
 -0.80105415 -0.02821414
sample estimates:
mean of the differences 
             -0.4146341 

Mood2 was statistically significantly higher (M = 0.24) than Mood1 (M = -0.24), t(40) = 2.17, p < .05

To find the means of Mood1 and Mood2 the summary code was used below.

summary(thesis)
      Age            Sex              SelfEsteem        Mood1             Mood2            Major             College               GPA1            GPA2     
 Min.   :19.00   Length:43          Min.   :14.00   Min.   :-4.0000   Min.   :-4.0000   Length:43          Length:43          Min.   :1.400   Min.   :2.20  
 1st Qu.:20.25   Class :character   1st Qu.:23.50   1st Qu.:-1.0000   1st Qu.: 0.0000   Class :character   Class :character   1st Qu.:2.725   1st Qu.:3.00  
 Median :23.50   Mode  :character   Median :25.00   Median : 0.0000   Median : 0.0000   Mode  :character   Mode  :character   Median :3.200   Median :3.45  
 Mean   :24.07                      Mean   :24.44   Mean   :-0.2381   Mean   : 0.2381                                         Mean   :3.117   Mean   :3.40  
 3rd Qu.:26.00                      3rd Qu.:26.00   3rd Qu.: 1.0000   3rd Qu.: 1.0000                                         3rd Qu.:3.675   3rd Qu.:4.00  
 Max.   :41.00                      Max.   :29.00   Max.   : 3.0000   Max.   : 3.0000                                         Max.   :4.000   Max.   :4.00  
 NA's   :1                                          NA's   :1         NA's   :1                                               NA's   :1       NA's   :1     
     Home          
 Length:43         
 Class :character  
 Mode  :character  
                   
                   
                   
                   

The code below was used to make a data table with the Mood1 and Mood2 information, in order to make the data easier to plot.

thesis %>% 
  pivot_longer(cols = c(Mood1, Mood2), names_to = "Time", values_to = "Mood") %>% 
  select(Time, Mood)

After organizing the data into the table above, the code below was used to create a box and scatter plot of the Mood1 and Mood2 data in a comparable manner.

thesis %>% 
  pivot_longer(cols = c(Mood1, Mood2), names_to = "Time", values_to = "Mood") %>% 
  ggplot(aes(x = Time, y = Mood)) +
  geom_boxplot() +
  geom_jitter(width = .2) +
  theme_minimal() +
  labs(title = "Mood and Time", x = "Time", y = "Mood")
Warning: Removed 2 rows containing non-finite values (stat_boxplot).
Warning: Removed 2 rows containing missing values (geom_point).

  1. I ran a chi-square to understand if there is a relationship between where students are from, classified as “Home” in the data, and what college they are in, whether Business “BU” or Arts and Sciences “AS”.

The first code shown below was used to run a chi-square analysis to examine the relationship between home and college.

table(thesis$Home, thesis$College)
            
             AS BU
  Billings    5  6
  OtherMT    11  7
  OutofState  6  6
chisq.test(thesis$Home, thesis$College)

    Pearson's Chi-squared test

data:  thesis$Home and thesis$College
X-squared = 0.76438, df = 2, p-value = 0.6824

There was a statistically insignificant relationship between Home and College, chi-square(2) = 0.76, p = 0.7.

The code below was used to create side by side bar graphs for Business and Arts & Sciences, with the proportion of where students are from.

thesis %>% 
  drop_na(Home, College) %>% 
  mutate(College = as_factor(College)) %>% 
  mutate(College = fct_recode(College,
                            "Arts & Sciences" = "AS",
                            "Business" = "BU"))  %>% 
  mutate(Home = as_factor(Home)) %>% 
  mutate(Home = fct_recode(Home,
                          "Billings, MT" = "Billings",
                          "Another city in MT" = "OtherMT",
                          "Out of State" = "OutofState")) %>% 
  ggplot(aes(x = College, fill = Home)) +
  geom_bar(position = "fill") +
  scale_fill_viridis_d() +                        # use scale_fill_grey() here if you don't want color
  theme_minimal() +
  coord_flip() +
  labs(title = "College by Home",
      y = "Proportion of College")

  1. I ran an ANOVA to analyze if there is a difference in Self Esteem and students from different locations.

This code was used to find the mean and standard deviation of self esteem for the three subcategories of the variable home.

thesis %>% 
  drop_na(Home, SelfEsteem) %>% 
  group_by(Home) %>% 
  summarize(Mean = mean(SelfEsteem), 
            "Std Dev" = sd(SelfEsteem),
            N = n())
NA

This code was used to run the ANOVA for self esteem and home.

Home_ANOVA <- aov(thesis$SelfEsteem ~ thesis$Home)
summary(Home_ANOVA)
            Df Sum Sq Mean Sq F value Pr(>F)
thesis$Home  2  15.76   7.879   1.043  0.362
Residuals   39 294.53   7.552               
1 observation deleted due to missingness

There were no statistically significant differences in self esteem by home, F(2, 39) = 1.04, ns.

This code was used to run a post hoc tests for comparisons between individual groups:

TukeyHSD(Home_ANOVA)
  Tukey multiple comparisons of means
    95% family-wise confidence level

Fit: aov(formula = thesis$SelfEsteem ~ thesis$Home)

$`thesis$Home`
                           diff       lwr      upr     p adj
OtherMT-Billings    -1.27777778 -3.772928 1.217373 0.4329248
OutofState-Billings -0.08333333 -2.816634 2.649967 0.9969630
OutofState-OtherMT   1.19444444 -1.300706 3.689595 0.4800845

Like the ANOVA, the post hoc tests for each subcategory of home, are each statistically insignificant. This is due to the fact that each subcategory had a p > .05.

This code was used to create an advanced box plot of the variables self-esteem and home.

thesis %>% 
  drop_na(Home, SelfEsteem) %>% 
  mutate(Home = as_factor(Home)) %>% 
  mutate(Home = fct_recode(Home,
                            "Billings, MT" = "Billings",
                          "Another city in MT" = "OtherMT",
                          "Out of State" = "OutofState"))  %>% 
  ggplot(aes(x = Home, y = SelfEsteem)) +
  geom_boxplot() +
  geom_jitter(width = .2) +
  theme_minimal() +
  labs(title = "Self Esteem by Home",
       y = "Self Esteem") 

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpLYWl0bGluIEthdmxpZSBQU1lDIDU0MQ0KDQpMYWIgIzU6IEJhc2ljIFN0YXRzIEFuYWx5c2lzDQoNCg0KVGhlIFNhbXBsZSBUaGVzaXMgZGF0YSBzZXQgd2FzIHVzZWQgZm9yIHRoZSBhbmFseXNlcyBpbiB0aGlzIGxhYi4NCg0KDQoNCjEuICBJIHJhbiBhIGNvcnJlbGF0aW9uIHRlc3QgYW5kIGNyZWF0ZWQgYSBzY2F0dGVyIHBsb3QgdG8gZXhhbWluZSBpZiB0aGVyZSBpcyBhIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGFnZSBhbmQgR1BBMS4NCg0KSSB1c2VkIHRoZSBjb2RlIGJlbG93IHRvIHJ1biB0aGUgY29ycmVsYXRpb24gdGVzdCBvbiBhZ2UgYW5kIEdQQTEsIHR3byBjb250aW51b3VzIHZhcmlhYmxlcy4NCg0KYGBge3J9DQpjb3IudGVzdCh0aGVzaXMkQWdlLCB0aGVzaXMkR1BBMSkNCg0KYGBgDQoNClRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIEFnZSBhbmQgU2VsZiBFc3RlZW0gd2VyZSBzdGF0aXN0aWNhbGx5IGluc2lnbmlmaWNhbnQsICpyKigzOSkgPSAuMDQsICpucyouIFdoaWxlIHRoZSBjb3JyZWxhdGlvbiBpcyAuMDQsIHRoZSBwIHZhbHVlIGlzIDAuOCwgbWFraW5nIHRoZSByZXN1bHRzIGluc2lnbmlmaWNhbnQuIA0KDQoNCg0KDQpUaGVuIEkgdXNlZCB0aGlzIGNvZGUgYmVsb3cgdG8gY3JlYXRlIGEgc2NhdHRlciBwbG90LCB3aXRoIGFnZSBhbG9uZyB0aGUgeC1heGlzIGFuZCBHUEExIG9uIHRoZSB5LWF4aXMuDQoNCmBgYHtyfQ0KdGhlc2lzICU+JSANCiAgZHJvcF9uYShBZ2UsIEdQQTEpICU+JSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgZ2dwbG90KGFlcyhBZ2UsIEdQQTEpKSArDQogIGdlb21fcG9pbnQoKSArDQogIHRoZW1lX21pbmltYWwoKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGdlb21fc21vb3RoKGZvcm11bGEgPSB5fngsIG1ldGhvZCA9IGxtLCBzZSA9IEZBTFNFKSArICAgICAgICAgDQogIGxhYnModGl0bGUgPSAiUmVsYXRpb25zaGlwIGJldHdlZW4gQWdlIGFuZCBHUEExIiwgICAgICANCiAgICAgICB4ID0gIkFnZSIsDQogICAgICAgeSA9ICJHUEExIikNCmBgYA0KDQoNCg0KMi4gIEkgcmFuIGEgdHdvIHNhbXBsZSB0LXRlc3QgdG8gZXhhbWluZSBpZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgR1BBMSBvZiBzdHVkZW50cyBpbiB0aGUgQnVzaW5lc3MgY29sbGVnZSB2ZXJzdXMgc3R1ZGVudHMgaW4gdGhlIEFydHMgJiBTY2llbmNlcyBjb2xsZWdlLiBCdXNpbmVzcyBpcyBjbGFzc2lmaWVkIGFzICJCVSIgYW5kIEFydHMmU2NpZW5jZXMgYXMgIkFTIi4NCg0KICAgDQoNClRoZSBjb2RlIGJlbG93IHdhcyB1c2VkIHRvIHJ1biBhIHQtdGVzdCBvbiBHUEExIGFuZCBDb2xsZWdlIHRoZSBzdHVkZW50IHN0dWRpZXMgdW5kZXIsIEJ1c2luZXNzIG9yIEFydHMgJiBTY2llbmNlcy4gRHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlcmUgYXJlIG9ubHkgMiBjYXRlZ29yaWVzIHVuZGVyIGNvbGxlZ2VzLCB0aGlzIGNvZGUgd29ya3Mgd2l0aG91dCBoYXZpbmcgdG8gYWx0ZXIgdGhlIHN1YmNhdGVnb3JpZXMuDQoNCmBgYHtyfQ0KdC50ZXN0KHRoZXNpcyRHUEExIH4gdGhlc2lzJENvbGxlZ2UpDQpgYGANClN0dWRlbnRzIGluIHRoZSBjb2xsZWdlIG9mIEJ1c2luZXNzICgqTSogPSAzLjMpIGhhZCBhIHN0YXRpc3RpY2FsbHkgaW5zaWduaWZpY2FudGx5IGhpZ2hlciBHUEExIHRoYW4gc3R1ZGVudHMgaW4gdGhlIGNvbGxlZ2Ugb2YgQXJ0cyAmIFNjaWVuY2VzICgqTSogPSAzLjAyKSwgKnQqKDM4Ljc3KSA9IDEuMjgsICpwKiA+IC4wNS4NCg0KDQpUaGVuIHRoZSBmb2xsb3dpbmcgY29kZSB3YXMgdXNlZCB0byBjcmVhdGUgYSBib3ggcGxvdCBvZiBHUEExIGFuZCB0aGUgdHlwZSBvZiBjb2xsZWdlIGluZGl2aWR1YWxzIGFyZSBlbnJvbGxlZCBpbi4NCg0KDQpgYGB7cn0NCnRoZXNpcyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gR1BBMSwgeSA9IENvbGxlZ2UpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkdQQTEgYnkgQ29sbGVnZSIsIHggPSAiR1BBMSIsIHkgPSAiQ29sbGVnZSIpDQpgYGANCg0KDQoNCjMuICBUaGUgcG9zc2libGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBHUEExIG9mIHN0dWRlbnRzIGluIENvbW11bmljYXRpb25zIHZlcnN1cyBBY2NvdW50aW5nIHdhcyBleGFtaW5lZCB1c2luZyBhIHR3byBzYW1wbGUgdC10ZXN0Lg0KDQpUaGUgY29kZSBiZWxvdyB3YXMgdXNlZCB0byBmaWx0ZXIgdGhlIGRhdGEgZm9yIE1ham9ycyBhbmQgbGltaXQgaXQgdG8gQ29tbXVuaWNhdGlvbnMgYW5kIEFjY291bnRpbmcgb25seSwgY3JlYXRpbmcgYSBuZXcgZGF0YSBzZXQgY2FsbGVkIENvbW1BY2NvdW50TWFqb3IuIFRoaXMgYWxsb3dlZCBtZSB0byBydW4gYSB0LXRlc3Qgb24gdGhlIHR3byBzdWJjYXRlZ29yaWVzIG9mIE1ham9yLCBDb21tdW5pY2F0aW9ucyBhbmQgQWNjb3VudGluZy4NCg0KYGBge3J9DQp0aGVzaXMgJT4lIA0KICBmaWx0ZXIoTWFqb3IgPT0gIkNvbW0iIHwgTWFqb3IgPT0gIkFjY291bnQiKSAtPiBDb21tQWNjb3VudE1ham9yDQoNCnQudGVzdChDb21tQWNjb3VudE1ham9yJEdQQTEgfiBDb21tQWNjb3VudE1ham9yJE1ham9yKQ0KYGBgDQoNCkNvbW11bmljYXRpb25zIG1ham9ycyAoKk0qID0gMy4yKSBoYWQgYSBsb3dlciBHUEExIHRoYW4gQWNjb3VudGluZyBtYWpvcnMgKCpNKiA9IDMuNjgpLCAqdCooNS4zKSA9IDAuOTUsICpwKiA+IC4wNS4NCg0KDQoNClRoZW4gSSB1c2VkIHRoZSBjb2RlIGJlbG93IHRvIGNyZWF0ZSBhIGJveCBwbG90IGNvbXBhcmluZyB0aGUgZGF0YSBwb2ludHMgb2YgdGhlIHR3byBzdWJjYXRlZ29yaWVzIG9mIE1ham9yLg0KDQpgYGB7cn0NCnRoZXNpcyAlPiUgDQogZmlsdGVyKE1ham9yID09ICJDb21tIiB8IE1ham9yID09ICJBY2NvdW50IikgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBNYWpvciwgeSA9IEdQQTEpKSArDQogIGdlb21fYm94cGxvdCgpICsNCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAuMikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkdQQTEgYnkgTWFqb3IiLCB4ID0gIkdQQTEiLCB5ID0gIk1ham9yIikNCmBgYA0KDQoNCg0KNC4gIEkgdXNlZCBhIHBhaXJlZCB0LXRlc3QgYW5kIGNyZWF0ZWQgYSBkYXRhIHRhYmxlIHRvIGV4YW1pbmUgaWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGJldHdlZW4gTW9vZDEgYW5kIE1vb2QyLg0KDQoNCg0KVGhlIGNvZGUgYmVsb3cgd2FzIHVzZWQgdG8gcnVuIHRoZSBwYWlyZWQgdC10ZXN0IG9uIE1vb2QxIGFuZCBNb29kMi4NCg0KYGBge3J9DQp0LnRlc3QodGhlc2lzJE1vb2QxLCB0aGVzaXMkTW9vZDIsIHBhaXJlZCA9IFRSVUUpDQpgYGANCg0KTW9vZDIgd2FzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnRseSBoaWdoZXIgKCpNKiA9IDAuMjQpIHRoYW4gTW9vZDEgKCpNKiA9IC0wLjI0KSwgKnQqKDQwKSA9IDIuMTcsICpwKiA8IC4wNQ0KDQoNCg0KVG8gZmluZCB0aGUgbWVhbnMgb2YgTW9vZDEgYW5kIE1vb2QyIHRoZSBzdW1tYXJ5IGNvZGUgd2FzIHVzZWQgYmVsb3cuDQpgYGB7cn0NCnN1bW1hcnkodGhlc2lzKQ0KYGBgDQoNCg0KVGhlIGNvZGUgYmVsb3cgd2FzIHVzZWQgdG8gbWFrZSBhIGRhdGEgdGFibGUgd2l0aCB0aGUgTW9vZDEgYW5kIE1vb2QyIGluZm9ybWF0aW9uLCBpbiBvcmRlciB0byBtYWtlIHRoZSBkYXRhIGVhc2llciB0byBwbG90Lg0KDQpgYGB7cn0NCnRoZXNpcyAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhNb29kMSwgTW9vZDIpLCBuYW1lc190byA9ICJUaW1lIiwgdmFsdWVzX3RvID0gIk1vb2QiKSAlPiUgDQogIHNlbGVjdChUaW1lLCBNb29kKQ0KYGBgDQoNCkFmdGVyIG9yZ2FuaXppbmcgdGhlIGRhdGEgaW50byB0aGUgdGFibGUgYWJvdmUsIHRoZSBjb2RlIGJlbG93IHdhcyB1c2VkIHRvIGNyZWF0ZSBhIGJveCBhbmQgc2NhdHRlciBwbG90IG9mIHRoZSBNb29kMSBhbmQgTW9vZDIgZGF0YSBpbiBhIGNvbXBhcmFibGUgbWFubmVyLg0KDQpgYGB7cn0NCnRoZXNpcyAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhNb29kMSwgTW9vZDIpLCBuYW1lc190byA9ICJUaW1lIiwgdmFsdWVzX3RvID0gIk1vb2QiKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IFRpbWUsIHkgPSBNb29kKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gLjIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJNb29kIGFuZCBUaW1lIiwgeCA9ICJUaW1lIiwgeSA9ICJNb29kIikNCmBgYA0KDQoNCg0KDQo1LiAgSSByYW4gYSBjaGktc3F1YXJlIHRvIHVuZGVyc3RhbmQgaWYgdGhlcmUgaXMgYSByZWxhdGlvbnNoaXAgYmV0d2VlbiB3aGVyZSBzdHVkZW50cyBhcmUgZnJvbSwgY2xhc3NpZmllZCBhcyAiSG9tZSIgaW4gdGhlIGRhdGEsIGFuZCB3aGF0IGNvbGxlZ2UgdGhleSBhcmUgaW4sIHdoZXRoZXIgQnVzaW5lc3MgIkJVIiBvciBBcnRzIGFuZCBTY2llbmNlcyAiQVMiLg0KDQoNClRoZSBmaXJzdCBjb2RlIHNob3duIGJlbG93IHdhcyB1c2VkIHRvIHJ1biBhIGNoaS1zcXVhcmUgYW5hbHlzaXMgdG8gZXhhbWluZSB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gaG9tZSBhbmQgY29sbGVnZS4NCg0KYGBge3J9DQp0YWJsZSh0aGVzaXMkSG9tZSwgdGhlc2lzJENvbGxlZ2UpDQpjaGlzcS50ZXN0KHRoZXNpcyRIb21lLCB0aGVzaXMkQ29sbGVnZSkNCmBgYA0KDQpUaGVyZSB3YXMgYSBzdGF0aXN0aWNhbGx5IGluc2lnbmlmaWNhbnQgcmVsYXRpb25zaGlwIGJldHdlZW4gSG9tZSBhbmQgQ29sbGVnZSwgKmNoaS1zcXVhcmUqKDIpID0gMC43NiwgKnAqID0gMC43Lg0KDQoNClRoZSBjb2RlIGJlbG93IHdhcyB1c2VkIHRvIGNyZWF0ZSBzaWRlIGJ5IHNpZGUgYmFyIGdyYXBocyBmb3IgQnVzaW5lc3MgYW5kIEFydHMgJiBTY2llbmNlcywgd2l0aCB0aGUgcHJvcG9ydGlvbiBvZiB3aGVyZSBzdHVkZW50cyBhcmUgZnJvbS4NCg0KYGBge3J9DQp0aGVzaXMgJT4lIA0KICBkcm9wX25hKEhvbWUsIENvbGxlZ2UpICU+JSANCiAgbXV0YXRlKENvbGxlZ2UgPSBhc19mYWN0b3IoQ29sbGVnZSkpICU+JSANCiAgbXV0YXRlKENvbGxlZ2UgPSBmY3RfcmVjb2RlKENvbGxlZ2UsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFydHMgJiBTY2llbmNlcyIgPSAiQVMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCdXNpbmVzcyIgPSAiQlUiKSkgICU+JSANCiAgbXV0YXRlKEhvbWUgPSBhc19mYWN0b3IoSG9tZSkpICU+JSANCiAgbXV0YXRlKEhvbWUgPSBmY3RfcmVjb2RlKEhvbWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJCaWxsaW5ncywgTVQiID0gIkJpbGxpbmdzIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkFub3RoZXIgY2l0eSBpbiBNVCIgPSAiT3RoZXJNVCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJPdXQgb2YgU3RhdGUiID0gIk91dG9mU3RhdGUiKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBDb2xsZWdlLCBmaWxsID0gSG9tZSkpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZmlsbCIpICsNCiAgc2NhbGVfZmlsbF92aXJpZGlzX2QoKSArICAgICAgICAgICAgICAgICAgICAgICAgIyB1c2Ugc2NhbGVfZmlsbF9ncmV5KCkgaGVyZSBpZiB5b3UgZG9uJ3Qgd2FudCBjb2xvcg0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gIkNvbGxlZ2UgYnkgSG9tZSIsDQogICAgICB5ID0gIlByb3BvcnRpb24gb2YgQ29sbGVnZSIpDQoNCmBgYA0KDQoNCg0KNi4gIEkgcmFuIGFuIEFOT1ZBIHRvIGFuYWx5emUgaWYgdGhlcmUgaXMgYSBkaWZmZXJlbmNlIGluIFNlbGYgRXN0ZWVtIGFuZCBzdHVkZW50cyBmcm9tIGRpZmZlcmVudCBsb2NhdGlvbnMuDQoNCg0KDQpUaGlzIGNvZGUgd2FzIHVzZWQgdG8gZmluZCB0aGUgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHNlbGYgZXN0ZWVtIGZvciB0aGUgdGhyZWUgc3ViY2F0ZWdvcmllcyBvZiB0aGUgdmFyaWFibGUgaG9tZS4NCg0KYGBge3J9DQp0aGVzaXMgJT4lIA0KICBkcm9wX25hKEhvbWUsIFNlbGZFc3RlZW0pICU+JSANCiAgZ3JvdXBfYnkoSG9tZSkgJT4lIA0KICBzdW1tYXJpemUoTWVhbiA9IG1lYW4oU2VsZkVzdGVlbSksIA0KICAgICAgICAgICAgIlN0ZCBEZXYiID0gc2QoU2VsZkVzdGVlbSksDQogICAgICAgICAgICBOID0gbigpKQ0KDQpgYGANCg0KVGhpcyBjb2RlIHdhcyB1c2VkIHRvIHJ1biB0aGUgQU5PVkEgZm9yIHNlbGYgZXN0ZWVtIGFuZCBob21lLg0KDQpgYGB7cn0NCkhvbWVfQU5PVkEgPC0gYW92KHRoZXNpcyRTZWxmRXN0ZWVtIH4gdGhlc2lzJEhvbWUpDQpzdW1tYXJ5KEhvbWVfQU5PVkEpDQoNCg0KYGBgDQoNClRoZXJlIHdlcmUgbm8gc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCBkaWZmZXJlbmNlcyBpbiBzZWxmIGVzdGVlbSBieSBob21lLCAqRiooMiwgMzkpID0gMS4wNCwgKm5zKi4NCg0KDQoNCg0KVGhpcyBjb2RlIHdhcyB1c2VkIHRvIHJ1biBhIHBvc3QgaG9jIHRlc3RzIGZvciBjb21wYXJpc29ucyBiZXR3ZWVuIGluZGl2aWR1YWwgZ3JvdXBzOg0KDQpgYGB7cn0NClR1a2V5SFNEKEhvbWVfQU5PVkEpDQpgYGANCkxpa2UgdGhlIEFOT1ZBLCB0aGUgcG9zdCBob2MgdGVzdHMgZm9yIGVhY2ggc3ViY2F0ZWdvcnkgb2YgaG9tZSwgYXJlIGVhY2ggc3RhdGlzdGljYWxseSBpbnNpZ25pZmljYW50LiBUaGlzIGlzIGR1ZSB0byB0aGUgZmFjdCB0aGF0IGVhY2ggc3ViY2F0ZWdvcnkgaGFkIGEgKnAqID4gLjA1Lg0KDQoNCg0KVGhpcyBjb2RlIHdhcyB1c2VkIHRvIGNyZWF0ZSBhbiBhZHZhbmNlZCBib3ggcGxvdCBvZiB0aGUgdmFyaWFibGVzIHNlbGYtZXN0ZWVtIGFuZCBob21lLg0KDQpgYGB7cn0NCnRoZXNpcyAlPiUgDQogIGRyb3BfbmEoSG9tZSwgU2VsZkVzdGVlbSkgJT4lIA0KICBtdXRhdGUoSG9tZSA9IGFzX2ZhY3RvcihIb21lKSkgJT4lIA0KICBtdXRhdGUoSG9tZSA9IGZjdF9yZWNvZGUoSG9tZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmlsbGluZ3MsIE1UIiA9ICJCaWxsaW5ncyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJBbm90aGVyIGNpdHkgaW4gTVQiID0gIk90aGVyTVQiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAiT3V0IG9mIFN0YXRlIiA9ICJPdXRvZlN0YXRlIikpICAlPiUgDQogIGdncGxvdChhZXMoeCA9IEhvbWUsIHkgPSBTZWxmRXN0ZWVtKSkgKw0KICBnZW9tX2JveHBsb3QoKSArDQogIGdlb21faml0dGVyKHdpZHRoID0gLjIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJTZWxmIEVzdGVlbSBieSBIb21lIiwNCiAgICAgICB5ID0gIlNlbGYgRXN0ZWVtIikgDQpgYGANCg0KDQo=