Packages

library(tidyverse) # load tidiverse library

Dataset and cleaning

df <- read_csv("https://docs.google.com/spreadsheets/d/e/2PACX-1vStv7Pr69DtRKv6Nw6gVBep8hbT3pEeO6B1vNwxK_1DUHgpoTgbuRpZ4SvgtHFQnBZJVGeeQVyRuXZl/pub?gid=20675042&single=true&output=csv") # load the dataset from google drive
Parsed with column specification:
cols(
  `Merijumu punkts` = col_character(),
  Virsmas = col_character(),
  `1_1` = col_integer(),
  `1_2` = col_integer(),
  `1_3` = col_integer(),
  `1_4` = col_integer(),
  `1_5` = col_integer(),
  `1_6` = col_integer(),
  `1_7` = col_integer(),
  `1_8` = col_integer(),
  `1_9` = col_integer(),
  `1_10` = col_integer(),
  Measurement = col_character()
)
head(df) # explore the dataset
summary(df) # view a summary of dataset
 Mērījumu punkts      Virsmas               1_1              1_2              1_3              1_4              1_5              1_6        
 Length:180         Length:180         Min.   :-60.00   Min.   :-90.00   Min.   :-90.00   Min.   :-90.00   Min.   :-90.00   Min.   :-60.00  
 Class :character   Class :character   1st Qu.: 52.50   1st Qu.:  0.00   1st Qu.:  0.00   1st Qu.:  0.00   1st Qu.:  0.00   1st Qu.:  0.00  
 Mode  :character   Mode  :character   Median : 90.00   Median : 30.00   Median : 30.00   Median : 30.00   Median : 30.00   Median : 30.00  
                                       Mean   : 80.33   Mean   : 31.28   Mean   : 35.44   Mean   : 37.67   Mean   : 34.67   Mean   : 38.78  
                                       3rd Qu.:120.00   3rd Qu.: 60.00   3rd Qu.: 60.00   3rd Qu.: 60.00   3rd Qu.: 60.00   3rd Qu.: 60.00  
                                       Max.   :200.00   Max.   :200.00   Max.   :200.00   Max.   :250.00   Max.   :250.00   Max.   :250.00  
                                       NA's   :120                                                                                          
      1_7              1_8              1_9              1_10        Measurement       
 Min.   :-90.00   Min.   :-90.00   Min.   :-60.00   Min.   :-60.00   Length:180        
 1st Qu.:  0.00   1st Qu.:  0.00   1st Qu.:  0.00   1st Qu.:  0.00   Class :character  
 Median : 30.00   Median : 30.00   Median : 30.00   Median :  0.00   Mode  :character  
 Mean   : 38.17   Mean   : 38.94   Mean   : 31.72   Mean   : 25.17                     
 3rd Qu.: 60.00   3rd Qu.: 60.00   3rd Qu.: 30.00   3rd Qu.: 30.00                     
 Max.   :250.00   Max.   :250.00   Max.   :250.00   Max.   :250.00                     
                                                                                       
df <- janitor::clean_names(df) # normalize names, requires janitor library
df <-  df %>%                                             # create a new df, replacing the old one
  gather(key = "comparison", value = "value", x1_1:x1_10 ) # gathering the columns x1_1 to X1-10. The titles will be in a new colum named "comparison" and the values to a column "value"
summary(df)
 merijumu_punkts      virsmas          measurement         comparison            value       
 Length:1800        Length:1800        Length:1800        Length:1800        Min.   :-90.00  
 Class :character   Class :character   Class :character   Class :character   1st Qu.:  0.00  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   Median : 30.00  
                                                                             Mean   : 36.28  
                                                                             3rd Qu.: 60.00  
                                                                             Max.   :250.00  
                                                                             NA's   :120     
df <- df %>% # create a new df, replacing the old one
  select(-merijumu_punkts)  # without the merijumu column, since we will not use it 
df$value <- abs(df$value) # change all the values to absolute, to eliminate negative values

Ready for analysis

Tables and graphs

io and eo

Comparison

df %>% 
  filter(measurement == "extraoral" | measurement == "intraoral")%>% # filter excluiding the intra_vs_extra  level
  # filter(comparison != "x1_1") %>% 
  group_by(comparison) %>%  # group by
  summarise(Mean = mean(value), # create a column for each summary 
            sd = sd(value), 
            Min = min(value), 
            Max = max(value), 
            Q25 = quantile(value, na.rm = T, probs = .25), 
            Median = quantile(value, na.rm = T, probs = .5),
            Q75 = quantile(value, na.rm = T, probs = .75)) 
df %>% 
  filter(measurement == "extraoral" | measurement == "intraoral") %>% # filter excluiding the intra_vs_extra  level
  ggplot(aes(x =fct_reorder(comparison, value), y = value)) + 
  geom_boxplot() + 
  theme_minimal()

df_i_e <- df %>% 
  filter(measurement == "extraoral" | measurement == "intraoral") # create a new df with only i and e

ANOVA comparison

aov(value ~ comparison, data = df_i_e)
Call:
   aov(formula = value ~ comparison, data = df_i_e)

Terms:
                comparison Residuals
Sum of Squares      3296.7  336502.5
Deg. of Freedom          8      1071

Residual standard error: 17.72554
Estimated effects may be unbalanced
120 observations deleted due to missingness
summary(aov(value ~ comparison, data = df_i_e))
              Df Sum Sq Mean Sq F value Pr(>F)
comparison     8   3297   412.1   1.312  0.234
Residuals   1071 336502   314.2               
120 observations deleted due to missingness

virsmas

df %>% 
  filter(measurement == "extraoral" | measurement == "intraoral") %>% # filter excluiding the intra_vs_extra  level
  # filter(comparison != "x1_1") %>% 
  group_by(virsmas) %>%  # group by
  summarise(Mean = mean(value, na.rm=TRUE), # create a column for each summary 
            sd = sd(value, na.rm=TRUE), 
            Min = min(value, na.rm=TRUE), 
            Max = max(value, na.rm=TRUE), 
            Q25 = quantile(value, na.rm = T, probs = .25), 
            Median = quantile(value, na.rm = T, probs = .5),
            Q75 = quantile(value, na.rm = T, probs = .75)) 
df %>% 
  filter(measurement == "extraoral" | measurement == "intraoral") %>% # filter excluiding the intra_vs_extra  level
  ggplot(aes(x =fct_reorder(virsmas, value), y = value)) + 
  geom_boxplot() + 
  theme_minimal()

ANOVA virsmas

aov(value ~ virsmas, data = df_i_e)
Call:
   aov(formula = value ~ virsmas, data = df_i_e)

Terms:
                 virsmas Residuals
Sum of Squares    2313.2  337486.0
Deg. of Freedom        3      1076

Residual standard error: 17.71013
Estimated effects may be unbalanced
120 observations deleted due to missingness
summary(aov(value ~ virsmas, data = df_i_e))
              Df Sum Sq Mean Sq F value Pr(>F)  
virsmas        3   2313   771.1   2.458 0.0614 .
Residuals   1076 337486   313.6                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
120 observations deleted due to missingness

measurement

df %>% 
  filter(measurement == "extraoral" | measurement == "intraoral") %>% 
  group_by(measurement) %>%  # group by
  summarise(Mean = mean(value, na.rm=TRUE), # create a column for each summary 
            sd = sd(value, na.rm=TRUE), 
            Min = min(value, na.rm=TRUE), 
            Max = max(value, na.rm=TRUE), 
            Q25 = quantile(value, na.rm = T, probs = .25), 
            Median = quantile(value, na.rm = T, probs = .5),
            Q75 = quantile(value, na.rm = T, probs = .75)) 
df %>% 
  filter(measurement == "extraoral" | measurement == "intraoral") %>% # filter excluiding the intra_vs_extra  level
  ggplot(aes(x =fct_reorder(measurement, value), y = value)) + 
  geom_boxplot() + 
  theme_minimal()

ANOVA measurement

aov(value ~ measurement, data = df_i_e)
Call:
   aov(formula = value ~ measurement, data = df_i_e)

Terms:
                measurement Residuals
Sum of Squares     47600.83 292198.33
Deg. of Freedom           1      1078

Residual standard error: 16.46378
Estimated effects may be unbalanced
120 observations deleted due to missingness
summary(aov(value ~ measurement, data = df_i_e))
              Df Sum Sq Mean Sq F value Pr(>F)    
measurement    1  47601   47601   175.6 <2e-16 ***
Residuals   1078 292198     271                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
120 observations deleted due to missingness

intraoral vs extraoral

Comparison

df %>% 
  filter(measurement == "intra_vs_extra") %>% 
  group_by(comparison) %>%  # group by
  summarise(Mean = mean(value, na.rm=TRUE), # create a column for each summary 
            sd = sd(value, na.rm=TRUE), 
            Min = min(value, na.rm=TRUE), 
            Max = max(value, na.rm=TRUE), 
            Q25 = quantile(value, na.rm = T, probs = .25), 
            Median = quantile(value, na.rm = T, probs = .5),
            Q75 = quantile(value, na.rm = T, probs = .75)) 
df %>% 
  filter(measurement == "intra_vs_extra") %>%
  ggplot(aes(x = comparison, y = value)) + 
  geom_boxplot() + 
  theme_minimal()

ANOVA intraveextra comparison

df_intravsextra <- df %>% 
  filter(measurement == "intra_vs_extra")
aov(value ~ comparison, data = df_intravsextra)
Call:
   aov(formula = value ~ comparison, data = df_intravsextra)

Terms:
                comparison Residuals
Sum of Squares     31107.3 1712100.0
Deg. of Freedom          9       590

Residual standard error: 53.86896
Estimated effects may be unbalanced
summary(aov(value ~ comparison, data = df_intravsextra))
             Df  Sum Sq Mean Sq F value Pr(>F)
comparison    9   31107    3456   1.191  0.298
Residuals   590 1712100    2902               

virsmas

df %>% 
  filter(measurement == "intra_vs_extra") %>% 
  group_by(virsmas) %>%  # group by
  summarise(Mean = mean(value, na.rm=TRUE), # create a column for each summary 
            sd = sd(value, na.rm=TRUE), 
            Min = min(value, na.rm=TRUE), 
            Max = max(value, na.rm=TRUE), 
            Q25 = quantile(value, na.rm = T, probs = .25), 
            Median = quantile(value, na.rm = T, probs = .5),
            Q75 = quantile(value, na.rm = T, probs = .75)) 
df %>% 
  filter(measurement == "intra_vs_extra") %>%
  ggplot(aes(x = fct_reorder(virsmas, value),  y = value)) + 
  geom_boxplot() + 
  theme_minimal()

ANOVA intraveextra virsmas

df_intravsextra <- df %>% 
  filter(measurement == "intra_vs_extra")
aov(value ~ virsmas, data = df_intravsextra)
Call:
   aov(formula = value ~ virsmas, data = df_intravsextra)

Terms:
                  virsmas Residuals
Sum of Squares   663971.4 1079235.9
Deg. of Freedom         3       596

Residual standard error: 42.55348
Estimated effects may be unbalanced
summary(aov(value ~ virsmas, data = df_intravsextra))
             Df  Sum Sq Mean Sq F value Pr(>F)    
virsmas       3  663971  221324   122.2 <2e-16 ***
Residuals   596 1079236    1811                   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
LS0tDQp0aXRsZTogIkFuYWx5c2lzIEFpcmEgMiINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6IA0KICAgIHRvYzogeWVzDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgZmlnX2NhcHRpb246IHRydWUNCi0tLQ0KDQojIFBhY2thZ2VzDQpgYGB7ciBwYWNrYWdlc30NCmxpYnJhcnkodGlkeXZlcnNlKSAjIGxvYWQgdGlkaXZlcnNlIGxpYnJhcnkNCmBgYA0KDQojIERhdGFzZXQgYW5kIGNsZWFuaW5nDQpgYGB7ciBkYXRhc2V0fQ0KZGYgPC0gcmVhZF9jc3YoImh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kL2UvMlBBQ1gtMXZTdHY3UHI2OUR0Ukt2Nk53NmdWQmVwOGhiVDNwRWVPNkIxdk53eEtfMURVSGdwb1RnYnVScFo0U3ZndEhGUW5CWkpWR2VlUVZ5UnVYWmwvcHViP2dpZD0yMDY3NTA0MiZzaW5nbGU9dHJ1ZSZvdXRwdXQ9Y3N2IikgIyBsb2FkIHRoZSBkYXRhc2V0IGZyb20gZ29vZ2xlIGRyaXZlDQpgYGANCg0KYGBge3IgaGVhZCBkZn0NCmhlYWQoZGYpICMgZXhwbG9yZSB0aGUgZGF0YXNldA0KYGBgDQoNCmBgYHtyIHN1bW1hcnkgZGZ9DQpzdW1tYXJ5KGRmKSAjIHZpZXcgYSBzdW1tYXJ5IG9mIGRhdGFzZXQNCmBgYA0KDQpgYGB7ciBqYW5pdG9yfQ0KZGYgPC0gamFuaXRvcjo6Y2xlYW5fbmFtZXMoZGYpICMgbm9ybWFsaXplIG5hbWVzLCByZXF1aXJlcyBqYW5pdG9yIGxpYnJhcnkNCmBgYA0KDQoNCmBgYHtyIHdpZGUgdG8gbG9uZ30NCmRmIDwtICBkZiAlPiUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNyZWF0ZSBhIG5ldyBkZiwgcmVwbGFjaW5nIHRoZSBvbGQgb25lDQogIGdhdGhlcihrZXkgPSAiY29tcGFyaXNvbiIsIHZhbHVlID0gInZhbHVlIiwgeDFfMTp4MV8xMCApICMgZ2F0aGVyaW5nIHRoZSBjb2x1bW5zIHgxXzEgdG8gWDEtMTAuIFRoZSB0aXRsZXMgd2lsbCBiZSBpbiBhIG5ldyBjb2x1bSBuYW1lZCAiY29tcGFyaXNvbiIgYW5kIHRoZSB2YWx1ZXMgdG8gYSBjb2x1bW4gInZhbHVlIg0KYGBgDQoNCmBgYHtyIHN1bW1hcnkgZGYgMn0NCnN1bW1hcnkoZGYpDQpgYGANCg0KDQpgYGB7ciB1bnNlbGVjdCBtZXJpanVtdX0NCmRmIDwtIGRmICU+JSAjIGNyZWF0ZSBhIG5ldyBkZiwgcmVwbGFjaW5nIHRoZSBvbGQgb25lDQogIHNlbGVjdCgtbWVyaWp1bXVfcHVua3RzKSAgIyB3aXRob3V0IHRoZSBtZXJpanVtdSBjb2x1bW4sIHNpbmNlIHdlIHdpbGwgbm90IHVzZSBpdCANCg0KYGBgDQpgYGB7ciBjb252ZXJ0IHRvIGFic30NCmRmJHZhbHVlIDwtIGFicyhkZiR2YWx1ZSkgIyBjaGFuZ2UgYWxsIHRoZSB2YWx1ZXMgdG8gYWJzb2x1dGUsIHRvIGVsaW1pbmF0ZSBuZWdhdGl2ZSB2YWx1ZXMNCmBgYA0KDQpSZWFkeSBmb3IgYW5hbHlzaXMNCg0KIyBUYWJsZXMgYW5kIGdyYXBocw0KIyMgaW8gYW5kIGVvDQoNCiMjIyBDb21wYXJpc29uDQpgYGB7ciB0YWJsZSBjb21wYXJpc29ufQ0KZGYgJT4lIA0KICBmaWx0ZXIobWVhc3VyZW1lbnQgPT0gImV4dHJhb3JhbCIgfCBtZWFzdXJlbWVudCA9PSAiaW50cmFvcmFsIiklPiUgIyBmaWx0ZXIgZXhjbHVpZGluZyB0aGUgaW50cmFfdnNfZXh0cmEgIGxldmVsDQogICMgZmlsdGVyKGNvbXBhcmlzb24gIT0gIngxXzEiKSAlPiUgDQogIGdyb3VwX2J5KGNvbXBhcmlzb24pICU+JSAgIyBncm91cCBieQ0KICBzdW1tYXJpc2UoTWVhbiA9IG1lYW4odmFsdWUpLCAjIGNyZWF0ZSBhIGNvbHVtbiBmb3IgZWFjaCBzdW1tYXJ5IA0KICAgICAgICAgICAgc2QgPSBzZCh2YWx1ZSksIA0KICAgICAgICAgICAgTWluID0gbWluKHZhbHVlKSwgDQogICAgICAgICAgICBNYXggPSBtYXgodmFsdWUpLCANCiAgICAgICAgICAgIFEyNSA9IHF1YW50aWxlKHZhbHVlLCBuYS5ybSA9IFQsIHByb2JzID0gLjI1KSwgDQogICAgICAgICAgICBNZWRpYW4gPSBxdWFudGlsZSh2YWx1ZSwgbmEucm0gPSBULCBwcm9icyA9IC41KSwNCiAgICAgICAgICAgIFE3NSA9IHF1YW50aWxlKHZhbHVlLCBuYS5ybSA9IFQsIHByb2JzID0gLjc1KSkgDQpgYGANCg0KYGBge3IgcGxvdCBjb21wYXJpc29ufQ0KZGYgJT4lIA0KICBmaWx0ZXIobWVhc3VyZW1lbnQgPT0gImV4dHJhb3JhbCIgfCBtZWFzdXJlbWVudCA9PSAiaW50cmFvcmFsIikgJT4lICMgZmlsdGVyIGV4Y2x1aWRpbmcgdGhlIGludHJhX3ZzX2V4dHJhICBsZXZlbA0KICBnZ3Bsb3QoYWVzKHggPWZjdF9yZW9yZGVyKGNvbXBhcmlzb24sIHZhbHVlKSwgeSA9IHZhbHVlKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKyANCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KDQpgYGB7ciBhbm92YSBjb21wYXJpc29ufQ0KZGZfaV9lIDwtIGRmICU+JSANCiAgZmlsdGVyKG1lYXN1cmVtZW50ID09ICJleHRyYW9yYWwiIHwgbWVhc3VyZW1lbnQgPT0gImludHJhb3JhbCIpICMgY3JlYXRlIGEgbmV3IGRmIHdpdGggb25seSBpIGFuZCBlDQpgYGANCiMjIyBBTk9WQSBjb21wYXJpc29uDQpgYGB7ciBhb3YgY29tcGFyaXNvbn0NCmFvdih2YWx1ZSB+IGNvbXBhcmlzb24sIGRhdGEgPSBkZl9pX2UpDQpgYGANCg0KYGBge3IgYW5vdmEgY29tcGFyaXNvbiAyfQ0Kc3VtbWFyeShhb3YodmFsdWUgfiBjb21wYXJpc29uLCBkYXRhID0gZGZfaV9lKSkNCmBgYA0KDQojIyMgdmlyc21hcw0KDQpgYGB7ciB0YWJsZSB2aXJzbWFzfQ0KDQpkZiAlPiUgDQogIGZpbHRlcihtZWFzdXJlbWVudCA9PSAiZXh0cmFvcmFsIiB8IG1lYXN1cmVtZW50ID09ICJpbnRyYW9yYWwiKSAlPiUgIyBmaWx0ZXIgZXhjbHVpZGluZyB0aGUgaW50cmFfdnNfZXh0cmEgIGxldmVsDQogICMgZmlsdGVyKGNvbXBhcmlzb24gIT0gIngxXzEiKSAlPiUgDQogIGdyb3VwX2J5KHZpcnNtYXMpICU+JSAgIyBncm91cCBieQ0KICBzdW1tYXJpc2UoTWVhbiA9IG1lYW4odmFsdWUsIG5hLnJtPVRSVUUpLCAjIGNyZWF0ZSBhIGNvbHVtbiBmb3IgZWFjaCBzdW1tYXJ5IA0KICAgICAgICAgICAgc2QgPSBzZCh2YWx1ZSwgbmEucm09VFJVRSksIA0KICAgICAgICAgICAgTWluID0gbWluKHZhbHVlLCBuYS5ybT1UUlVFKSwgDQogICAgICAgICAgICBNYXggPSBtYXgodmFsdWUsIG5hLnJtPVRSVUUpLCANCiAgICAgICAgICAgIFEyNSA9IHF1YW50aWxlKHZhbHVlLCBuYS5ybSA9IFQsIHByb2JzID0gLjI1KSwgDQogICAgICAgICAgICBNZWRpYW4gPSBxdWFudGlsZSh2YWx1ZSwgbmEucm0gPSBULCBwcm9icyA9IC41KSwNCiAgICAgICAgICAgIFE3NSA9IHF1YW50aWxlKHZhbHVlLCBuYS5ybSA9IFQsIHByb2JzID0gLjc1KSkgDQoNCmBgYA0KDQoNCmBgYHtyfQ0KZGYgJT4lIA0KICBmaWx0ZXIobWVhc3VyZW1lbnQgPT0gImV4dHJhb3JhbCIgfCBtZWFzdXJlbWVudCA9PSAiaW50cmFvcmFsIikgJT4lICMgZmlsdGVyIGV4Y2x1aWRpbmcgdGhlIGludHJhX3ZzX2V4dHJhICBsZXZlbA0KICBnZ3Bsb3QoYWVzKHggPWZjdF9yZW9yZGVyKHZpcnNtYXMsIHZhbHVlKSwgeSA9IHZhbHVlKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKyANCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCiMjIyBBTk9WQSB2aXJzbWFzDQpgYGB7ciBhb3Ygdmlyc21hcyAxfQ0KYW92KHZhbHVlIH4gdmlyc21hcywgZGF0YSA9IGRmX2lfZSkNCmBgYA0KDQpgYGB7ciB2aXJzbWFzIDJ9DQpzdW1tYXJ5KGFvdih2YWx1ZSB+IHZpcnNtYXMsIGRhdGEgPSBkZl9pX2UpKQ0KYGBgDQoNCiMjIyBtZWFzdXJlbWVudA0KDQoNCmBgYHtyIHRhYmxlIG1lYXN1cmVtZW50IGV4dHJhIGFuZCBpbnRyYX0NCg0KZGYgJT4lIA0KICBmaWx0ZXIobWVhc3VyZW1lbnQgPT0gImV4dHJhb3JhbCIgfCBtZWFzdXJlbWVudCA9PSAiaW50cmFvcmFsIikgJT4lIA0KICBncm91cF9ieShtZWFzdXJlbWVudCkgJT4lICAjIGdyb3VwIGJ5DQogIHN1bW1hcmlzZShNZWFuID0gbWVhbih2YWx1ZSwgbmEucm09VFJVRSksICMgY3JlYXRlIGEgY29sdW1uIGZvciBlYWNoIHN1bW1hcnkgDQogICAgICAgICAgICBzZCA9IHNkKHZhbHVlLCBuYS5ybT1UUlVFKSwgDQogICAgICAgICAgICBNaW4gPSBtaW4odmFsdWUsIG5hLnJtPVRSVUUpLCANCiAgICAgICAgICAgIE1heCA9IG1heCh2YWx1ZSwgbmEucm09VFJVRSksIA0KICAgICAgICAgICAgUTI1ID0gcXVhbnRpbGUodmFsdWUsIG5hLnJtID0gVCwgcHJvYnMgPSAuMjUpLCANCiAgICAgICAgICAgIE1lZGlhbiA9IHF1YW50aWxlKHZhbHVlLCBuYS5ybSA9IFQsIHByb2JzID0gLjUpLA0KICAgICAgICAgICAgUTc1ID0gcXVhbnRpbGUodmFsdWUsIG5hLnJtID0gVCwgcHJvYnMgPSAuNzUpKSANCg0KYGBgDQpgYGB7ciBtZWFzdXJlbWVudCBleHRyYSBhbmQgaW50cmF9DQpkZiAlPiUgDQogIGZpbHRlcihtZWFzdXJlbWVudCA9PSAiZXh0cmFvcmFsIiB8IG1lYXN1cmVtZW50ID09ICJpbnRyYW9yYWwiKSAlPiUgIyBmaWx0ZXIgZXhjbHVpZGluZyB0aGUgaW50cmFfdnNfZXh0cmEgIGxldmVsDQogIGdncGxvdChhZXMoeCA9ZmN0X3Jlb3JkZXIobWVhc3VyZW1lbnQsIHZhbHVlKSwgeSA9IHZhbHVlKSkgKyANCiAgZ2VvbV9ib3hwbG90KCkgKyANCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCiMjIyBBTk9WQSBtZWFzdXJlbWVudA0KYGBge3IgYW92IG1lYXN1cmVtZW50IGkgYW5kIGV9DQphb3YodmFsdWUgfiBtZWFzdXJlbWVudCwgZGF0YSA9IGRmX2lfZSkNCmBgYA0KDQpgYGB7ciBhb3YgbWVhc3VyZW1lbnQgaSBhbmQgZSAyfQ0Kc3VtbWFyeShhb3YodmFsdWUgfiBtZWFzdXJlbWVudCwgZGF0YSA9IGRmX2lfZSkpDQpgYGANCg0KDQojIyBpbnRyYW9yYWwgdnMgZXh0cmFvcmFsDQojIyMgQ29tcGFyaXNvbg0KYGBge3IgdGFibGUgaW50cmF2c2V4dHJhIG1lYXN1cmVtZW50fQ0KZGYgJT4lIA0KICBmaWx0ZXIobWVhc3VyZW1lbnQgPT0gImludHJhX3ZzX2V4dHJhIikgJT4lIA0KICBncm91cF9ieShjb21wYXJpc29uKSAlPiUgICMgZ3JvdXAgYnkNCiAgc3VtbWFyaXNlKE1lYW4gPSBtZWFuKHZhbHVlLCBuYS5ybT1UUlVFKSwgIyBjcmVhdGUgYSBjb2x1bW4gZm9yIGVhY2ggc3VtbWFyeSANCiAgICAgICAgICAgIHNkID0gc2QodmFsdWUsIG5hLnJtPVRSVUUpLCANCiAgICAgICAgICAgIE1pbiA9IG1pbih2YWx1ZSwgbmEucm09VFJVRSksIA0KICAgICAgICAgICAgTWF4ID0gbWF4KHZhbHVlLCBuYS5ybT1UUlVFKSwgDQogICAgICAgICAgICBRMjUgPSBxdWFudGlsZSh2YWx1ZSwgbmEucm0gPSBULCBwcm9icyA9IC4yNSksIA0KICAgICAgICAgICAgTWVkaWFuID0gcXVhbnRpbGUodmFsdWUsIG5hLnJtID0gVCwgcHJvYnMgPSAuNSksDQogICAgICAgICAgICBRNzUgPSBxdWFudGlsZSh2YWx1ZSwgbmEucm0gPSBULCBwcm9icyA9IC43NSkpIA0KYGBgDQoNCmBgYHtyIGJveHBsb3QgaW50cmF2c2V4dHJhIG1lYXN1cmVtZW50fQ0KZGYgJT4lIA0KICBmaWx0ZXIobWVhc3VyZW1lbnQgPT0gImludHJhX3ZzX2V4dHJhIikgJT4lDQogIGdncGxvdChhZXMoeCA9IGNvbXBhcmlzb24sIHkgPSB2YWx1ZSkpICsgDQogIGdlb21fYm94cGxvdCgpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQoNCiMjIyBBTk9WQSBpbnRyYXZlZXh0cmEgY29tcGFyaXNvbg0KYGBge3IgYW92IGl2c2UgY29tcGFyaXNvbn0NCmRmX2ludHJhdnNleHRyYSA8LSBkZiAlPiUgDQogIGZpbHRlcihtZWFzdXJlbWVudCA9PSAiaW50cmFfdnNfZXh0cmEiKQ0KYGBgDQoNCmBgYHtyIGFvdiBpdnNlIGNvcG0gMX0NCmFvdih2YWx1ZSB+IGNvbXBhcmlzb24sIGRhdGEgPSBkZl9pbnRyYXZzZXh0cmEpDQpgYGANCg0KYGBge3IgYW92IGl2c2UgY29tcCAyfQ0Kc3VtbWFyeShhb3YodmFsdWUgfiBjb21wYXJpc29uLCBkYXRhID0gZGZfaW50cmF2c2V4dHJhKSkNCmBgYA0KDQoNCiMjIyB2aXJzbWFzDQpgYGB7ciB0YWJsZSBpbnRyYXZzZXh0cmEgdmlyc21hc30NCmRmICU+JSANCiAgZmlsdGVyKG1lYXN1cmVtZW50ID09ICJpbnRyYV92c19leHRyYSIpICU+JSANCiAgZ3JvdXBfYnkodmlyc21hcykgJT4lICAjIGdyb3VwIGJ5DQogIHN1bW1hcmlzZShNZWFuID0gbWVhbih2YWx1ZSwgbmEucm09VFJVRSksICMgY3JlYXRlIGEgY29sdW1uIGZvciBlYWNoIHN1bW1hcnkgDQogICAgICAgICAgICBzZCA9IHNkKHZhbHVlLCBuYS5ybT1UUlVFKSwgDQogICAgICAgICAgICBNaW4gPSBtaW4odmFsdWUsIG5hLnJtPVRSVUUpLCANCiAgICAgICAgICAgIE1heCA9IG1heCh2YWx1ZSwgbmEucm09VFJVRSksIA0KICAgICAgICAgICAgUTI1ID0gcXVhbnRpbGUodmFsdWUsIG5hLnJtID0gVCwgcHJvYnMgPSAuMjUpLCANCiAgICAgICAgICAgIE1lZGlhbiA9IHF1YW50aWxlKHZhbHVlLCBuYS5ybSA9IFQsIHByb2JzID0gLjUpLA0KICAgICAgICAgICAgUTc1ID0gcXVhbnRpbGUodmFsdWUsIG5hLnJtID0gVCwgcHJvYnMgPSAuNzUpKSANCmBgYA0KDQpgYGB7ciBib3hwbG90IGludHJhdnNleHRyYSB2aXJzbWFzfQ0KZGYgJT4lIA0KICBmaWx0ZXIobWVhc3VyZW1lbnQgPT0gImludHJhX3ZzX2V4dHJhIikgJT4lDQogIGdncGxvdChhZXMoeCA9IGZjdF9yZW9yZGVyKHZpcnNtYXMsIHZhbHVlKSwgIHkgPSB2YWx1ZSkpICsgDQogIGdlb21fYm94cGxvdCgpICsgDQogIHRoZW1lX21pbmltYWwoKQ0KYGBgDQojIyMgQU5PVkEgaW50cmF2ZWV4dHJhIHZpcnNtYXMNCmBgYHtyIGFvdiBpdnNlIHZpcnNtYXN9DQpkZl9pbnRyYXZzZXh0cmEgPC0gZGYgJT4lIA0KICBmaWx0ZXIobWVhc3VyZW1lbnQgPT0gImludHJhX3ZzX2V4dHJhIikNCmBgYA0KDQpgYGB7ciBhb3YgaXZzZSB2aXJzbWFzIDJ9DQphb3YodmFsdWUgfiB2aXJzbWFzLCBkYXRhID0gZGZfaW50cmF2c2V4dHJhKQ0KYGBgDQoNCmBgYHtyIGFvdiBpdnNlIHZpcnNtYXMgM30NCnN1bW1hcnkoYW92KHZhbHVlIH4gdmlyc21hcywgZGF0YSA9IGRmX2ludHJhdnNleHRyYSkpDQpgYGANCg0K