1 Loading libraries

library(tidyverse)
── 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.4     ✔ tidyr     1.3.1
✔ purrr     1.0.2     ── Conflicts ────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(car)
Loading required package: carData

Attaching package: ‘car’

The following object is masked from ‘package:dplyr’:

    recode

The following object is masked from ‘package:purrr’:

    some
library(tictoc)
library(lmerTest)
Loading required package: lme4
Loading required package: Matrix

Attaching package: ‘Matrix’

The following objects are masked from ‘package:tidyr’:

    expand, pack, unpack


Attaching package: ‘lmerTest’

The following object is masked from ‘package:lme4’:

    lmer

The following object is masked from ‘package:stats’:

    step
library(phonR)

2 Read dataset and manipulate

2.1 Read datasets

Arabic <- read.csv("SpeakingRate24.csv") 
Vratio <- read.csv("Vratio.csv")

2.2 Manipulations

Arabic <- subset(Arabic, select = -Arabic_phrase) ### Supprimer la colonne des phrases en arabe pour éviter les problèmes avec PdfLaTex lors de la compilation LaTex R. Sinon, utiliser XeLaTex pour l'écriture arabe. 
Arabic$CVC <- gsub(' ', '', Arabic$CVC)#supprimer les espaces 
Arabic$V <- gsub(' ', '', Arabic$V)#supprimer les espaces
Arabic$Length <- gsub(' ', '', Arabic$Length)#supprimer les espaces 

Arabic$f0ons <- as.integer(gsub('--undefined--', NA, Arabic$f0ons))
Arabic$f0mid <- as.integer(gsub('--undefined--', NA, Arabic$f0mid))
Arabic$f0off <- as.integer(gsub('--undefined--', NA, Arabic$f0off))


Arabic <- dplyr::mutate_if(Arabic, is.character, as.factor) ## Transformer tous les variables de type "character" à des facteurs. 
#Arabic <- filter(Arabic, V!="e:" & V!="o:")
Arabic$V = factor(Arabic$V, levels = c('i','a','u','i:','a:','u:','e:','o:')) ## ordonner l'ordre de l'apparition V
Arabic$C <- factor(Arabic$C, levels=c("b","d","g","t","k")) ## ordonner l'ordre de l'apparition C
Arabic$VOTi <- as.integer(Arabic$VOTi)
#Arabic$Word_V_ratio <- as.numeric(gsub(',', '.', Arabic$Word_V_ratio)) #remplacer les virgules en points dans les nombres décimaux pour pouvoir faire des calculs. 

levels(Arabic$Rate) <- list("rapide" = "fast",        # Change factor levels
                            "moyen" = "normal",
                            "lent" = "slow")
levels(Arabic$Length) <- list("longue" = "long",        # Change factor levels
                              "courte" = "short")
Arabic <- dplyr::rename(Arabic, Debit = Rate, Longueur = Length)

Arabic$F1midnor <- with(Arabic, normLobanov(F1mid)) #normalisation de F1mid et F2mid
Arabic$F2midnor <- with(Arabic, normLobanov(F2mid)) #normalisation de F1mid et F2mid

Vratio <- dplyr::rename(Vratio, Debit = Rate)

### sous-ensemble 1
ArabicSub1 <- Arabic
ArabicSub1 <- ArabicSub1 %>% 
  filter(Timbre %in% c("i", "a", "u")) %>% droplevels()

### sous-ensemble 2
ArabicSub2 <- Arabic
ArabicSub2 <- ArabicSub2 %>% 
  filter(V %in% c("i", "a", "u", "e:", "u:", "a:")) %>% droplevels()

ArabicSub2$Timbre=gsub('i','e', ArabicSub2$Timbre)
ArabicSub2$Timbre=gsub('u','o', ArabicSub2$Timbre)

ArabicSub2$Timbre= as.factor(ArabicSub2$Timbre)

3 Duration

3.1 Modelling

Our aim here is to model the data using various model specification to obtain our optimal model. We start with easy to more complex modelling strategies

3.1.1 No REML (ML)

We start by using a Maximum Likelihood model to allow for model comparison

3.1.1.1 Simple model with random intercepts

tic()
lm.mod.1 <- lmer(Duration ~ Debit + V + Sex + (1 | Speaker) + (1 | Word), Arabic, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
2.55 sec elapsed

3.1.1.2 Simple model with random intercepts and slopes for Debit

tic()
lm.mod.2 <- lmer(Duration ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.56 sec elapsed

3.1.1.3 Simple model with random intercepts and slopes for Vowel

tic()
lm.mod.3 <- lmer(Duration ~ Debit + V + Sex + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 3 negative eigenvalues: -7.6e-05 -3.0e-04 -4.4e+00
toc() # 
259.36 sec elapsed

3.1.1.4 Simple model with random intercepts and slopes for Debit and Vowel by speaker

tic()
lm.mod.4 <- lmer(Duration ~ Debit + V + Sex + (Debit | Speaker) + (V| Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
toc() # 
236.84 sec elapsed

3.1.1.5 Interaction model with random intercepts

tic()
lm.mod.5 <- lmer(Duration ~ Debit * V + Sex + (1 | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.88 sec elapsed

3.1.1.6 Interaction model with random slopes for Debit by Speaker

tic()
lm.mod.6 <- lmer(Duration ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
4.87 sec elapsed

3.1.1.7 Interaction model with random slopes for Vowel by Speaker

tic()
lm.mod.7 <- lmer(Duration ~ Debit * V + Sex + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 3 negative eigenvalues: -1.8e-04 -4.7e-04 -1.2e+01
toc() # 
637.36 sec elapsed

3.1.1.8 Interaction model with full random slopes for Debit by Vowel by Speaker

tic()
lm.mod.8 <- lmer(Duration ~ Debit * V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -5.0e+02
toc() # 
368.7 sec elapsed

3.1.2 Model comparison

3.1.2.1 All

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.5, lm.mod.6, lm.mod.7, lm.mod.8)
Data: Arabic
Models:
lm.mod.1: Duration ~ Debit + V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: Duration ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: Duration ~ Debit * V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.6: Duration ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.3: Duration ~ Debit + V + Sex + (V | Speaker) + (1 | Word)
lm.mod.4: Duration ~ Debit + V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word)
lm.mod.7: Duration ~ Debit * V + Sex + (V | Speaker) + (1 | Word)
lm.mod.8: Duration ~ Debit * V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word)
         npar   AIC   BIC logLik deviance   Chisq Df Pr(>Chisq)    
lm.mod.1   14 83110 83210 -41541    83082                          
lm.mod.2   19 82084 82220 -41023    82046 1035.97  5     <2e-16 ***
lm.mod.5   28 81737 81938 -40841    81681  364.38  9     <2e-16 ***
lm.mod.6   33 80526 80762 -40230    80460 1221.52  5     <2e-16 ***
lm.mod.3   49 81868 82220 -40885    81770    0.00 16          1    
lm.mod.4   55 80653 81048 -40272    80543 1226.92  6     <2e-16 ***
lm.mod.7   63 80253 80704 -40063    80127  416.83  8     <2e-16 ***
lm.mod.8   69 78773 79267 -39317    78635 1491.97  6     <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Model comparison results suggest that model 8 is the best model. However, the results from the modelling indicated that Models 3, 4, 7 and 8 had singularity and/or convergence issues.

We rerun our model comparison retaining only the models that converged and which did not have any issues.

3.1.2.2 Models with no issues

anova(lm.mod.1, lm.mod.2, lm.mod.5, lm.mod.6)
Data: Arabic
Models:
lm.mod.1: Duration ~ Debit + V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: Duration ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: Duration ~ Debit * V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.6: Duration ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word)
         npar   AIC   BIC logLik deviance   Chisq Df Pr(>Chisq)    
lm.mod.1   14 83110 83210 -41541    83082                          
lm.mod.2   19 82084 82220 -41023    82046 1035.97  5  < 2.2e-16 ***
lm.mod.5   28 81737 81938 -40841    81681  364.38  9  < 2.2e-16 ***
lm.mod.6   33 80526 80762 -40230    80460 1221.52  5  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The results suggest that model 6 is the optimal model and we use its specifications as our optimal model. We rerun the model with a Restricted Maximum Likelihood (REML)

3.2 Optimal model ran with REML

tic()
lm.mod.Optimal <- update(lm.mod.6, REML = TRUE)
toc()
2.48 sec elapsed
saveRDS(lm.mod.Optimal, "lm.mod.Optimal.Dur.Rds")
lm.mod.Optimal <- readRDS("lm.mod.Optimal.Dur.Rds")

4 Vratio

4.1 Modelling

Our aim here is to model the data using various model specification to obtain our optimal model. We start with easy to more complex modelling strategies

4.1.1 No REML (ML)

We start by using a Maximum Likelihood model to allow for model comparison

4.1.1.1 Simple model with random intercepts

tic()
lm.mod.1 <- lmer(Vratio ~ Debit + Timbre + Sex + (1 | Speaker), Vratio,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.17 sec elapsed

4.1.1.2 Simple model with random slopes for Debit

tic()
lm.mod.2 <- lmer(Vratio ~ Debit + Timbre + Sex + (Debit | Speaker) , Vratio,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.33 sec elapsed

4.1.1.3 Simple model with random slopes for Timbre

tic()
lm.mod.3 <- lmer(Vratio ~ Debit + Timbre + Sex + (Timbre | Speaker) , Vratio,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.47 sec elapsed

4.1.1.4 Simple model with random slopes, no adjustments by Timbre

tic()
lm.mod.4 <- lmer(Vratio ~ Debit + Timbre + Sex + (Debit | Speaker) + (Timbre | Speaker), Vratio,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
toc() # 
1.27 sec elapsed

4.1.1.5 Interaction model with random intercepts

tic()
lm.mod.5 <- lmer(Vratio ~ Debit * Timbre + Sex + (1 | Speaker), Vratio,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.17 sec elapsed

4.1.1.6 Interaction model with random intercepts and slopes for Debit

tic()
lm.mod.6 <- lmer(Vratio ~ Debit * Timbre + Sex + (Debit | Speaker), Vratio,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.41 sec elapsed

4.1.1.7 Interaction model with random intercepts and slopes for Timbre

tic()
lm.mod.7 <- lmer(Vratio ~ Debit * Timbre + Sex + (Timbre | Speaker), Vratio,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.53 sec elapsed

4.1.1.8 Interaction model with random intercepts and slopes for Debit and Timbre

tic()
lm.mod.8 <- lmer(Vratio ~ Debit * Timbre + Sex + (Debit | Speaker) + (Timbre | Speaker), Vratio,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: Model failed to converge with 1 negative eigenvalue: -1.5e-04
toc() # 
1.41 sec elapsed

4.1.2 Model comparison

4.1.2.1 All

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.5, lm.mod.6, lm.mod.7, lm.mod.8)
Data: Vratio
Models:
lm.mod.1: Vratio ~ Debit + Timbre + Sex + (1 | Speaker)
lm.mod.5: Vratio ~ Debit * Timbre + Sex + (1 | Speaker)
lm.mod.2: Vratio ~ Debit + Timbre + Sex + (Debit | Speaker)
lm.mod.3: Vratio ~ Debit + Timbre + Sex + (Timbre | Speaker)
lm.mod.6: Vratio ~ Debit * Timbre + Sex + (Debit | Speaker)
lm.mod.7: Vratio ~ Debit * Timbre + Sex + (Timbre | Speaker)
lm.mod.4: Vratio ~ Debit + Timbre + Sex + (Debit | Speaker) + (Timbre | Speaker)
lm.mod.8: Vratio ~ Debit * Timbre + Sex + (Debit | Speaker) + (Timbre | Speaker)
         npar    AIC    BIC  logLik deviance   Chisq Df Pr(>Chisq)    
lm.mod.1    8 2912.2 2961.7 -1448.1   2896.2                          
lm.mod.5   12 2913.4 2987.7 -1444.7   2889.4  6.8039  4     0.1466    
lm.mod.2   13 2823.5 2903.9 -1398.7   2797.5 91.9534  1     <2e-16 ***
lm.mod.3   13 2770.3 2850.7 -1372.1   2744.3 53.1965  0               
lm.mod.6   17 2824.4 2929.6 -1395.2   2790.4  0.0000  4     1.0000    
lm.mod.7   17 2771.1 2876.3 -1368.6   2737.1 53.2841  0               
lm.mod.4   19 2676.8 2794.3 -1319.4   2638.8 98.3736  2     <2e-16 ***
lm.mod.8   23 2677.3 2819.7 -1315.7   2631.3  7.4293  4     0.1149    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Results showed that model 4 is the best model, with a warning. Model 8 has convergence issues. We rerun our model comparison retaining only the models that converged and which did not have any issues.

4.1.2.2 Models with no issues

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.5, lm.mod.6, lm.mod.7)
Data: Vratio
Models:
lm.mod.1: Vratio ~ Debit + Timbre + Sex + (1 | Speaker)
lm.mod.5: Vratio ~ Debit * Timbre + Sex + (1 | Speaker)
lm.mod.2: Vratio ~ Debit + Timbre + Sex + (Debit | Speaker)
lm.mod.3: Vratio ~ Debit + Timbre + Sex + (Timbre | Speaker)
lm.mod.6: Vratio ~ Debit * Timbre + Sex + (Debit | Speaker)
lm.mod.7: Vratio ~ Debit * Timbre + Sex + (Timbre | Speaker)
         npar    AIC    BIC  logLik deviance   Chisq Df Pr(>Chisq)    
lm.mod.1    8 2912.2 2961.7 -1448.1   2896.2                          
lm.mod.5   12 2913.4 2987.7 -1444.7   2889.4  6.8039  4     0.1466    
lm.mod.2   13 2823.5 2903.9 -1398.7   2797.5 91.9534  1     <2e-16 ***
lm.mod.3   13 2770.3 2850.7 -1372.1   2744.3 53.1965  0               
lm.mod.6   17 2824.4 2929.6 -1395.2   2790.4  0.0000  4     1.0000    
lm.mod.7   17 2771.1 2876.3 -1368.6   2737.1 53.2841  0               
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Hence, we use model 2’s specifications as our optimal model. We rerun the model with a Restricted Maximum Likelihood (REML)

4.2 Optimal model ran with REML

tic()
lm.mod.Optimal <- update(lm.mod.2, REML = TRUE)

toc() # 
0.31 sec elapsed
saveRDS(lm.mod.Optimal, "lm.mod.Optimal.Vratio.Rds")
lm.mod.Optimal <- readRDS("lm.mod.Optimal.Vratio.Rds")

5 Word_V_ratio

5.1 Modelling

Our aim here is to model the data using various model specification to obtain our optimal model. We start with easy to more complex modelling strategies

5.1.1 No REML (ML)

We start by using a Maximum Likelihood model to allow for model comparison

5.1.1.1 Simple model with random intercepts

tic()
lm.mod.1 <- lmer(Word_V_ratio ~ Debit + V + Sex + (1 | Speaker) + (1 | Word), Arabic, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.41 sec elapsed

5.1.1.2 Simple model with random intercepts and slopes for Debit

tic()
lm.mod.2 <- lmer(Word_V_ratio ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.7 sec elapsed

5.1.1.3 Simple model with random intercepts and slopes for Vowel

tic()
lm.mod.3 <- lmer(Word_V_ratio ~ Debit + V + Sex + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -5.9e-01
toc() # 
167.06 sec elapsed

5.1.1.4 Simple model with random intercepts and slopes for Debit and Vowel by speaker

tic()
lm.mod.4 <- lmer(Word_V_ratio ~ Debit + V + Sex + (Debit | Speaker) + (V | Speaker) +  (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
toc() # 
263.18 sec elapsed

5.1.1.5 Interaction model with random intercepts

tic()
lm.mod.5 <- lmer(Word_V_ratio ~ Debit * V + Sex + (1 | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.83 sec elapsed

5.1.1.6 Interaction model with random slopes for Debit by Speaker

tic()
lm.mod.6 <- lmer(Word_V_ratio ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
4.23 sec elapsed

5.1.1.7 Interaction model with random slopes for Vowel by Speaker

tic()
lm.mod.7 <- lmer(Word_V_ratio ~ Debit * V + Sex + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -6.3e-02
toc() # 
254 sec elapsed

5.1.1.8 Interaction model with full random slopes for Debit by Vowel by Speaker

tic()
lm.mod.8 <- lmer(Word_V_ratio ~ Debit * V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -1.7e+00
toc() # 
367.64 sec elapsed

5.1.2 Model comparison

5.1.2.1 All

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.5, lm.mod.6, lm.mod.7, lm.mod.8)
Data: Arabic
Models:
lm.mod.1: Word_V_ratio ~ Debit + V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: Word_V_ratio ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: Word_V_ratio ~ Debit * V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.6: Word_V_ratio ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.3: Word_V_ratio ~ Debit + V + Sex + (V | Speaker) + (1 | Word)
lm.mod.4: Word_V_ratio ~ Debit + V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word)
lm.mod.7: Word_V_ratio ~ Debit * V + Sex + (V | Speaker) + (1 | Word)
lm.mod.8: Word_V_ratio ~ Debit * V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word)
         npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)    
lm.mod.1   14 8704.9 8805.3 -4338.5   8676.9                         
lm.mod.2   19 8330.9 8467.1 -4146.4   8292.9 384.06  5     <2e-16 ***
lm.mod.5   28 8538.7 8739.5 -4241.4   8482.7   0.00  9          1    
lm.mod.6   33 8155.5 8392.0 -4044.7   8089.5 393.29  5     <2e-16 ***
lm.mod.3   49 7870.8 8222.1 -3886.4   7772.8 316.69 16     <2e-16 ***
lm.mod.4   55 7447.8 7842.1 -3668.9   7337.8 434.93  6     <2e-16 ***
lm.mod.7   63 7683.1 8134.8 -3778.6   7557.1   0.00  8          1    
lm.mod.8   69 7248.7 7743.4 -3555.3   7110.7 446.43  6     <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

According to model comparison, model 8 improved the model fit. However, when evaluating the results, models 3, 4, 7 and 8 suffered from singularity and convergence issues. Hence, we rerun our model comparison retaining only the models that converged and which did not have any issues.

5.1.2.2 Models with no issues

anova(lm.mod.1, lm.mod.2, lm.mod.5, lm.mod.6)
Data: Arabic
Models:
lm.mod.1: Word_V_ratio ~ Debit + V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: Word_V_ratio ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: Word_V_ratio ~ Debit * V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.6: Word_V_ratio ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word)
         npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)    
lm.mod.1   14 8704.9 8805.3 -4338.5   8676.9                         
lm.mod.2   19 8330.9 8467.1 -4146.4   8292.9 384.06  5     <2e-16 ***
lm.mod.5   28 8538.7 8739.5 -4241.4   8482.7   0.00  9          1    
lm.mod.6   33 8155.5 8392.0 -4044.7   8089.5 393.29  5     <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The results show that model 6 improved the model fit and its specification is used as our optimal model. We rerun the model with a Restricted Maximum Likelihood (REML)

5.2 Optimal model ran with REML

tic()
lm.mod.Optimal <- update(lm.mod.6, REML = TRUE)

toc() # 
2.03 sec elapsed
saveRDS(lm.mod.Optimal, "lm.mod.Optimal.Word_V_ratio.Rds")
lm.mod.Optimal <- readRDS("lm.mod.Optimal.Word_V_ratio.Rds")

6 F1midnor

6.1 Modelling

Our aim here is to model the data using various model specification to obtain our optimal model. We start with easy to more complex modelling strategies

6.1.1 No REML (ML)

We start by using a Maximum Likelihood model to allow for model comparison

6.1.1.1 Simple model with random intercepts

tic()
lm.mod.1 <- lmer(F1midnor ~ Debit + V + Sex + (1 | Speaker) + (1 | Word), Arabic, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
2.25 sec elapsed

6.1.1.2 Simple model with random intercepts and slopes for Debit

tic()
lm.mod.2 <- lmer(F1midnor ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.91 sec elapsed

6.1.1.3 Simple model with random intercepts and slopes for Vowel

tic()
lm.mod.3 <- lmer(F1midnor ~ Debit + V + Sex + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
64.88 sec elapsed

6.1.1.4 Simple model with random intercepts and slopes for Debit and Vowel by speaker

tic()
lm.mod.4 <- lmer(F1midnor ~ Debit + V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -7.2e+00
toc() # 
179.08 sec elapsed

6.1.1.5 Interaction model with random intercepts

tic()
lm.mod.5 <- lmer(F1midnor ~ Debit * V + Sex + (1 | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.67 sec elapsed

6.1.1.6 Interaction model with random slopes for Debit by Speaker

tic()
lm.mod.6 <- lmer(F1midnor ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
2.23 sec elapsed

6.1.1.7 Interaction model with random slopes for Vowel by Speaker

tic()
lm.mod.7 <- lmer(F1midnor ~ Debit * V + Sex + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
453.41 sec elapsed

6.1.1.8 Interaction model with full random slopes for Debit by Vowel by Speaker

tic()
lm.mod.8 <- lmer(F1midnor ~ Debit * V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 2 negative eigenvalues: -3.7e-04 -6.7e+00
toc() # 
242.94 sec elapsed

6.1.2 Model comparison

6.1.2.1 All

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.5, lm.mod.6, lm.mod.7, lm.mod.8)
Data: Arabic
Models:
lm.mod.1: F1midnor ~ Debit + V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: F1midnor ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: F1midnor ~ Debit * V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.6: F1midnor ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.3: F1midnor ~ Debit + V + Sex + (V | Speaker) + (1 | Word)
lm.mod.4: F1midnor ~ Debit + V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word)
lm.mod.7: F1midnor ~ Debit * V + Sex + (V | Speaker) + (1 | Word)
lm.mod.8: F1midnor ~ Debit * V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word)
         npar    AIC    BIC  logLik deviance   Chisq Df Pr(>Chisq)    
lm.mod.1   14 8926.7 9027.0 -4449.3   8898.7                          
lm.mod.2   19 8385.1 8521.3 -4173.5   8347.1  551.60  5     <2e-16 ***
lm.mod.5   28 8699.3 8900.1 -4321.7   8643.3    0.00  9          1    
lm.mod.6   33 8140.4 8377.0 -4037.2   8074.4  568.91  5     <2e-16 ***
lm.mod.3   49 5642.3 5993.6 -2772.1   5544.3 2530.13 16     <2e-16 ***
lm.mod.4   55 4803.3 5197.7 -2346.7   4693.3  850.94  6     <2e-16 ***
lm.mod.7   63 5299.1 5750.8 -2586.5   5173.1    0.00  8          1    
lm.mod.8   69 4421.4 4916.1 -2141.7   4283.4  889.66  6     <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

According to model comparison using all models, model 8 improved the model fit. However, models 4 and 8 showed singularity and convergence issues. Hence, we rerun model comparison removing any ill-formed model.

6.1.2.2 Models with no issues

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.5, lm.mod.6, lm.mod.7)
Data: Arabic
Models:
lm.mod.1: F1midnor ~ Debit + V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: F1midnor ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: F1midnor ~ Debit * V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.6: F1midnor ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.3: F1midnor ~ Debit + V + Sex + (V | Speaker) + (1 | Word)
lm.mod.7: F1midnor ~ Debit * V + Sex + (V | Speaker) + (1 | Word)
         npar    AIC    BIC  logLik deviance   Chisq Df Pr(>Chisq)    
lm.mod.1   14 8926.7 9027.0 -4449.3   8898.7                          
lm.mod.2   19 8385.1 8521.3 -4173.5   8347.1  551.60  5     <2e-16 ***
lm.mod.5   28 8699.3 8900.1 -4321.7   8643.3    0.00  9          1    
lm.mod.6   33 8140.4 8377.0 -4037.2   8074.4  568.91  5     <2e-16 ***
lm.mod.3   49 5642.3 5993.6 -2772.1   5544.3 2530.13 16     <2e-16 ***
lm.mod.7   63 5299.1 5750.8 -2586.5   5173.1  371.20 14     <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The results show that model 7 improved the model fit. Hence, we use model 7’s specifications as our optimal model given that this is the best model with no singularity or convergence issues. We rerun the model with a Restricted Maximum Likelihood (REML)

6.2 Optimal model ran with REML

tic()
lm.mod.Optimal <- update(lm.mod.7, REML = TRUE)
toc() # 
87.71 sec elapsed
saveRDS(lm.mod.Optimal, "lm.mod.Optimal.F1midnor.Rds")
lm.mod.Optimal <- readRDS("lm.mod.Optimal.F1midnor.Rds")

7 F2midnor

7.1 Modelling

Our aim here is to model the data using various model specification to obtain our optimal model. We start with easy to more complex modelling strategies

7.1.1 No REML (ML)

We start by using a Maximum Likelihood model to allow for model comparison

7.1.1.1 Simple model with random intercepts

tic()
lm.mod.1 <- lmer(F2midnor ~ Debit + V + Sex + (1 | Speaker) + (1 | Word), Arabic, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.56 sec elapsed

7.1.1.2 Simple model with random intercepts and slopes for Debit

tic()
lm.mod.2 <- lmer(F2midnor ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.59 sec elapsed

7.1.1.3 Simple model with random intercepts and slopes for Vowel

tic()
lm.mod.3 <- lmer(F2midnor ~ Debit + V + Sex + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -4.1e+00
toc() # 
70 sec elapsed

7.1.1.4 Simple model with random intercepts and slopes for Debit and Vowel by speaker

tic()
lm.mod.4 <- lmer(F2midnor ~ Debit + V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 2 negative eigenvalues: -7.0e-04 -5.2e+00
toc() # 
180.67 sec elapsed

7.1.1.5 Interaction model with random intercepts

tic()
lm.mod.5 <- lmer(F2midnor ~ Debit * V + Sex + (1 | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.14 sec elapsed

7.1.1.6 Interaction model with random slopes for Debit by Speaker

tic()
lm.mod.6 <- lmer(F2midnor ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
3.9 sec elapsed

7.1.1.7 Interaction model with random slopes for Vowel by Speaker

tic()
lm.mod.7 <- lmer(F2midnor ~ Debit * V + Sex + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: Model failed to converge with 1 negative eigenvalue: -2.5e-02
toc() # 
163.7 sec elapsed

7.1.1.8 Interaction model with full random slopes for Debit by Vowel by Speaker

tic()
lm.mod.8 <- lmer(F2midnor ~ Debit * V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word), Arabic,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -5.2e-03
toc() # 
514.31 sec elapsed

7.1.2 Model comparison

7.1.2.1 All

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.5, lm.mod.6, lm.mod.7, lm.mod.8)
Data: Arabic
Models:
lm.mod.1: F2midnor ~ Debit + V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: F2midnor ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: F2midnor ~ Debit * V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.6: F2midnor ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.3: F2midnor ~ Debit + V + Sex + (V | Speaker) + (1 | Word)
lm.mod.4: F2midnor ~ Debit + V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word)
lm.mod.7: F2midnor ~ Debit * V + Sex + (V | Speaker) + (1 | Word)
lm.mod.8: F2midnor ~ Debit * V + Sex + (Debit | Speaker) + (V | Speaker) + (1 | Word)
         npar     AIC     BIC  logLik deviance   Chisq Df Pr(>Chisq)    
lm.mod.1   14   865.5   965.9 -418.75    837.5                          
lm.mod.2   19   749.3   885.5 -355.66    711.3  126.19  5  < 2.2e-16 ***
lm.mod.5   28  -220.7   -20.0  138.35   -276.7  988.02  9  < 2.2e-16 ***
lm.mod.6   33  -356.7  -120.1  211.33   -422.7  145.96  5  < 2.2e-16 ***
lm.mod.3   49 -2497.9 -2146.6 1297.97  -2595.9 2173.28 16  < 2.2e-16 ***
lm.mod.4   55 -2683.7 -2289.4 1396.84  -2793.7  197.74  6  < 2.2e-16 ***
lm.mod.7   63 -4138.9 -3687.2 2132.43  -4264.9 1471.18  8  < 2.2e-16 ***
lm.mod.8   69 -4372.4 -3877.7 2255.18  -4510.4  245.50  6  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

According to model comparison, model 8 improved the model fit. However, when evaluating the results, models 3, 4, 7 and 8 showed singularity and convergence issues. We rerun our model comparison retaining only the models that converged and which did not have any issues. #### Models with no issues

anova(lm.mod.1, lm.mod.2, lm.mod.5, lm.mod.6)
Data: Arabic
Models:
lm.mod.1: F2midnor ~ Debit + V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: F2midnor ~ Debit + V + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: F2midnor ~ Debit * V + Sex + (1 | Speaker) + (1 | Word)
lm.mod.6: F2midnor ~ Debit * V + Sex + (Debit | Speaker) + (1 | Word)
         npar     AIC     BIC  logLik deviance  Chisq Df Pr(>Chisq)    
lm.mod.1   14  865.51  965.88 -418.75   837.51                         
lm.mod.2   19  749.31  885.54 -355.66   711.31 126.19  5  < 2.2e-16 ***
lm.mod.5   28 -220.71  -19.96  138.35  -276.71 988.02  9  < 2.2e-16 ***
lm.mod.6   33 -356.67 -120.07  211.33  -422.67 145.96  5  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The results suggest that model 6 is improving the model fit. Hence, we use model 6’s specifications as our optimal model. We rerun the model with a Restricted Maximum Likelihood (REML).

7.2 Optimal model ran with REML

tic()
lm.mod.Optimal <- update(lm.mod.6, REML = TRUE)
toc() # 
5 sec elapsed
saveRDS(lm.mod.Optimal, "lm.mod.Optimal.F2midnor.Rds")
lm.mod.Optimal <- readRDS("lm.mod.Optimal.F2midnor.Rds")

8 F1midnor - Subset 1 - Timbre

8.1 Modelling

Our aim here is to model the data using various model specification to obtain our optimal model. We start with easy to more complex modelling strategies

8.1.1 No REML (ML)

We start by using a Maximum Likelihood model to allow for model comparison

8.1.1.1 Simple model with random intercepts

tic()
lm.mod.1 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (1 | Speaker) + (1 | Word), ArabicSub1, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.3 sec elapsed

8.1.1.2 Simple model with random intercepts and slopes for Longueur

tic()
lm.mod.2 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.65 sec elapsed

8.1.1.3 Simple model with random intercepts and slopes for Timbre

tic()
lm.mod.3 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.83 sec elapsed

8.1.1.4 Simple model with random intercepts and slopes for Debit

tic()
lm.mod.4 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.87 sec elapsed

8.1.1.5 Simple model with random intercepts and slopes for Longueur and Timbre

tic()
lm.mod.5 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: Model failed to converge with 1 negative eigenvalue: -1.2e-04
toc() # 
3.35 sec elapsed

8.1.1.6 Simple model with random intercepts and slopes for Longueur and Debit

tic()
lm.mod.6 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: Model failed to converge with 1 negative eigenvalue: -2.5e-04
toc() # 
5.31 sec elapsed

8.1.1.7 Simple model with random intercepts and slopes for Timbre and Debit

tic()
lm.mod.7 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -2.0e+01
toc() # 
6.45 sec elapsed

8.1.1.8 Simple model with random intercepts and slopes for Longueur, Timbre and Debit

tic()
lm.mod.8 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -9.6e-03
toc() # 
11.83 sec elapsed

8.1.1.9 Interaction model with random intercepts

tic()
lm.mod.9 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (1 | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.44 sec elapsed

8.1.1.10 Interaction model with random slopes for Longueur

tic()
lm.mod.10 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1 sec elapsed

8.1.1.11 Interaction model with random slopes for Timbre

tic()
lm.mod.11 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
2.01 sec elapsed

8.1.1.12 Interaction model with random slopes for Debit

tic()
lm.mod.12 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.29 sec elapsed

8.1.1.13 Interaction model with random slopes for Longueur by Timbre

tic()
lm.mod.13 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: Model failed to converge with 1 negative eigenvalue: -1.3e-04
toc() # 
4.65 sec elapsed

8.1.1.14 Interaction model with random slopes for Longueur by Debit

tic()
lm.mod.14 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
4.07 sec elapsed

8.1.1.15 Interaction model with random slopes for Timbre by Debit

tic()
lm.mod.15 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: Model failed to converge with 1 negative eigenvalue: -2.4e-04
toc() # 
8.68 sec elapsed

8.1.1.16 Interaction model with random slopes for Longueur by Timbre by Debit

tic()
lm.mod.16 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -2.6e+01
toc() # 
13.03 sec elapsed

8.1.2 Model comparison

8.1.2.1 All

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.5, lm.mod.6, lm.mod.7, lm.mod.8, lm.mod.9, lm.mod.10, lm.mod.11, lm.mod.12, lm.mod.13, lm.mod.14, lm.mod.15, lm.mod.16)
Data: ArabicSub1
Models:
lm.mod.1: F1midnor ~ Longueur + Timbre + Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.3: F1midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.4: F1midnor ~ Longueur + Timbre + Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word)
lm.mod.6: F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.7: F1midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.9: F1midnor ~ Longueur * Timbre * Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.8: F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.10: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.11: F1midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.12: F1midnor ~ Longueur * Timbre * Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.13: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word)
lm.mod.14: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.15: F1midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.16: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
          npar    AIC    BIC  logLik deviance   Chisq Df Pr(>Chisq)    
lm.mod.1    10 7010.8 7079.7 -3495.4   6990.8                          
lm.mod.2    12 6558.5 6641.1 -3267.3   6534.5  456.33  2     <2e-16 ***
lm.mod.3    15 5725.2 5828.5 -2847.6   5695.2  839.27  3     <2e-16 ***
lm.mod.4    15 6709.9 6813.1 -3340.0   6679.9    0.00  0               
lm.mod.5    18 5171.3 5295.1 -2567.6   5135.3 1544.66  3     <2e-16 ***
lm.mod.6    18 6233.5 6357.4 -3098.7   6197.5    0.00  0               
lm.mod.7    21 5347.6 5492.1 -2652.8   5305.6  891.91  3     <2e-16 ***
lm.mod.9    22 6784.4 6935.8 -3370.2   6740.4    0.00  1          1    
lm.mod.8    24 4749.3 4914.5 -2350.6   4701.3 2039.11  2     <2e-16 ***
lm.mod.10   24 6318.0 6483.1 -3135.0   6270.0    0.00  0               
lm.mod.11   27 5456.7 5642.5 -2701.3   5402.7  867.29  3     <2e-16 ***
lm.mod.12   27 6472.6 6658.4 -3209.3   6418.6    0.00  0               
lm.mod.13   30 4881.5 5088.0 -2410.8   4821.5 1597.07  3     <2e-16 ***
lm.mod.14   30 5980.4 6186.9 -2960.2   5920.4    0.00  0               
lm.mod.15   33 5058.3 5285.4 -2496.2   4992.3  928.10  3     <2e-16 ***
lm.mod.16   36 4445.4 4693.1 -2186.7   4373.4  618.90  3     <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

According to model comparison, model 16 improved the model fit. Out of all models, models 5, 6, 7, 8, 13, 15 and 16 had singularity and/or convergence issues. Hence we rerun our model comparison retaining only the models that converged and which did not have any issues.

8.1.2.2 Models with no issues

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.9, lm.mod.10, lm.mod.11, lm.mod.12, lm.mod.14)
Data: ArabicSub1
Models:
lm.mod.1: F1midnor ~ Longueur + Timbre + Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.3: F1midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.4: F1midnor ~ Longueur + Timbre + Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.9: F1midnor ~ Longueur * Timbre * Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.10: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.11: F1midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.12: F1midnor ~ Longueur * Timbre * Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.14: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word)
          npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)    
lm.mod.1    10 7010.8 7079.7 -3495.4   6990.8                         
lm.mod.2    12 6558.5 6641.1 -3267.3   6534.5 456.33  2     <2e-16 ***
lm.mod.3    15 5725.2 5828.5 -2847.6   5695.2 839.27  3     <2e-16 ***
lm.mod.4    15 6709.9 6813.1 -3340.0   6679.9   0.00  0               
lm.mod.9    22 6784.4 6935.8 -3370.2   6740.4   0.00  7          1    
lm.mod.10   24 6318.0 6483.1 -3135.0   6270.0 470.42  2     <2e-16 ***
lm.mod.11   27 5456.7 5642.5 -2701.3   5402.7 867.29  3     <2e-16 ***
lm.mod.12   27 6472.6 6658.4 -3209.3   6418.6   0.00  0               
lm.mod.14   30 5980.4 6186.9 -2960.2   5920.4 498.20  3     <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Hence, we use model 14’s specifications as our optimal model given that this is the best model with no singularity or convergence issues. We rerun the model with a Restricted Maximum Likelihood (REML)

8.2 Optimal model ran with REML

tic()
lm.mod.Optimal <- update(lm.mod.14, REML = TRUE)
Warning: Model failed to converge with 1 negative eigenvalue: -1.0e-05
toc() # 
4.84 sec elapsed

After running our model 14, there is a convergence issue. Hence we rerun the analysis with model 11th specifications as our optimal model.

tic()
lm.mod.Optimal <- update(lm.mod.11, REML = TRUE)
toc() # 
2.28 sec elapsed
saveRDS(lm.mod.Optimal, "lm.mod.Optimal.F1midnorTimbreSub.Rds")
lm.mod.Optimal <- readRDS("lm.mod.Optimal.F1midnorTimbreSub.Rds")

9 F2midnor - Subset 1 - Timbre

9.1 Modelling

Our aim here is to model the data using various model specification to obtain our optimal model. We start with easy to more complex modelling strategies

9.1.1 No REML (ML)

We start by using a Maximum Likelihood model to allow for model comparison

9.1.1.1 Simple model with random intercepts

tic()
lm.mod.1 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (1 | Speaker) + (1 | Word), ArabicSub1, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.39 sec elapsed

9.1.1.2 Simple model with random intercepts and slopes for Longueur

tic()
lm.mod.2 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.75 sec elapsed

9.1.1.3 Simple model with random intercepts and slopes for Timbre

tic()
lm.mod.3 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.74 sec elapsed

9.1.1.4 Simple model with random intercepts and slopes for Debit

tic()
lm.mod.4 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.01 sec elapsed

9.1.1.5 Simple model with random intercepts and slopes for Longueur and Timbre

tic()
lm.mod.5 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
3.91 sec elapsed

9.1.1.6 Simple model with random intercepts and slopes for Longueur and Debit

tic()
lm.mod.6 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 1 negative eigenvalue: -4.7e-02
toc() # 
4.09 sec elapsed

9.1.1.7 Simple model with random intercepts and slopes for Timbre and Debit

tic()
lm.mod.7 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
toc() # 
8.18 sec elapsed

9.1.1.8 Simple model with random intercepts and slopes for Longueur, Timbre and Debit

tic()
lm.mod.8 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
toc() # 
14.26 sec elapsed

9.1.1.9 Interaction model with random intercepts

tic()
lm.mod.9 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (1 | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.64 sec elapsed

9.1.1.10 Interaction model with random slopes for Longueur

tic()
lm.mod.10 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.03 sec elapsed

9.1.1.11 Interaction model with random slopes for Timbre

tic()
lm.mod.11 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.81 sec elapsed

9.1.1.12 Interaction model with random slopes for Debit

tic()
lm.mod.12 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.47 sec elapsed

9.1.1.13 Interaction model with random slopes for Longueur by Timbre

tic()
lm.mod.13 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
toc() # 
4.9 sec elapsed

9.1.1.14 Interaction model with random slopes for Longueur by Debit

tic()
lm.mod.14 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
5.52 sec elapsed

9.1.1.15 Interaction model with random slopes for Timbre by Debit

tic()
lm.mod.15 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
toc() # 
17.71 sec elapsed

9.1.1.16 Interaction model with random slopes for Longueur by Timbre by Debit

tic()
lm.mod.16 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub1,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
toc() # 
29.13 sec elapsed

9.1.2 Model comparison

9.1.2.1 All

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.5, lm.mod.6, lm.mod.7, lm.mod.8, lm.mod.9, lm.mod.10, lm.mod.11, lm.mod.12, lm.mod.13, lm.mod.14, lm.mod.15, lm.mod.16)
Data: ArabicSub1
Models:
lm.mod.1: F2midnor ~ Longueur + Timbre + Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.3: F2midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.4: F2midnor ~ Longueur + Timbre + Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word)
lm.mod.6: F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.7: F2midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.9: F2midnor ~ Longueur * Timbre * Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.8: F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.10: F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.11: F2midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.12: F2midnor ~ Longueur * Timbre * Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.13: F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word)
lm.mod.14: F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.15: F2midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.16: F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
          npar      AIC      BIC  logLik deviance    Chisq Df Pr(>Chisq)    
lm.mod.1    10   781.57   850.39 -380.79   761.57                           
lm.mod.2    12   765.34   847.92 -370.67   741.34   20.236  2  4.034e-05 ***
lm.mod.3    15 -1444.02 -1340.79  737.01 -1474.02 2215.352  3  < 2.2e-16 ***
lm.mod.4    15   706.63   809.85 -338.31   676.63    0.000  0               
lm.mod.5    18 -1475.19 -1351.31  755.59 -1511.19 2187.813  3  < 2.2e-16 ***
lm.mod.6    18   691.13   815.01 -327.57   655.13    0.000  0               
lm.mod.7    21 -1561.67 -1417.16  801.84 -1603.67 2258.809  3  < 2.2e-16 ***
lm.mod.9    22   108.22   259.62  -32.11    64.22    0.000  1          1    
lm.mod.8    24 -1591.03 -1425.86  819.51 -1639.03 1703.246  2  < 2.2e-16 ***
lm.mod.10   24    88.62   253.78  -20.31    40.62    0.000  0               
lm.mod.11   27 -2386.19 -2200.38 1220.09 -2440.19 2480.805  3  < 2.2e-16 ***
lm.mod.12   27    22.26   208.07   15.87   -31.74    0.000  0               
lm.mod.13   30 -2424.50 -2218.04 1242.25 -2484.50 2452.756  3  < 2.2e-16 ***
lm.mod.14   30     3.27   209.72   28.37   -56.73    0.000  0               
lm.mod.15   33 -2526.90 -2299.80 1296.45 -2592.90 2536.166  3  < 2.2e-16 ***
lm.mod.16   36 -2563.74 -2315.99 1317.87 -2635.74   42.844  3  2.656e-09 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

According to model comparison, model 16 improved the model fit. Out of all models, models 6, 7, 8, 13, 15 and 16 had singularity and/or convergence issues. Hence we rerun our model comparison retaining only the models that converged and which did not have any issues.

However, both showed singularity and convergence issues.

9.1.2.2 Models with no issues

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.5, lm.mod.9, lm.mod.10, lm.mod.11, lm.mod.12, lm.mod.14)
Data: ArabicSub1
Models:
lm.mod.1: F2midnor ~ Longueur + Timbre + Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.3: F2midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.4: F2midnor ~ Longueur + Timbre + Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word)
lm.mod.9: F2midnor ~ Longueur * Timbre * Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.10: F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.11: F2midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.12: F2midnor ~ Longueur * Timbre * Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.14: F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word)
          npar      AIC      BIC  logLik deviance    Chisq Df Pr(>Chisq)    
lm.mod.1    10   781.57   850.39 -380.79   761.57                           
lm.mod.2    12   765.34   847.92 -370.67   741.34   20.236  2  4.034e-05 ***
lm.mod.3    15 -1444.02 -1340.79  737.01 -1474.02 2215.352  3  < 2.2e-16 ***
lm.mod.4    15   706.63   809.85 -338.31   676.63    0.000  0               
lm.mod.5    18 -1475.19 -1351.31  755.59 -1511.19 2187.813  3  < 2.2e-16 ***
lm.mod.9    22   108.22   259.62  -32.11    64.22    0.000  4          1    
lm.mod.10   24    88.62   253.78  -20.31    40.62   23.602  2  7.499e-06 ***
lm.mod.11   27 -2386.19 -2200.38 1220.09 -2440.19 2480.805  3  < 2.2e-16 ***
lm.mod.12   27    22.26   208.07   15.87   -31.74    0.000  0               
lm.mod.14   30     3.27   209.72   28.37   -56.73   24.986  3  1.554e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Hence, we use model 14’s specifications as our optimal model given that this is the best model with no singularity or convergence issues. We rerun the model with a Restricted Maximum Likelihood (REML)

9.2 Optimal model ran with REML

tic()
lm.mod.Optimal <- update(lm.mod.14, REML = TRUE)
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
toc() # 
4.5 sec elapsed

Model 14 received convergence issues. Hence we rerun the analysis with model 11th specifications as our optimal model.

tic()
lm.mod.Optimal <- update(lm.mod.11, REML = TRUE)
toc() # 
1.98 sec elapsed
saveRDS(lm.mod.Optimal, "lm.mod.Optimal.F2midnorTimbreSub.Rds")
lm.mod.Optimal <- readRDS("lm.mod.Optimal.F2midnorTimbreSub.Rds")

10 F1midnor - Subset 2 - Timbre

10.1 Modelling

Our aim here is to model the data using various model specification to obtain our optimal model. We start with easy to more complex modelling strategies

10.1.1 No REML (ML)

We start by using a Maximum Likelihood model to allow for model comparison

10.1.1.1 Simple model with random intercepts

tic()
lm.mod.1 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (1 | Speaker) + (1 | Word), ArabicSub2, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.36 sec elapsed

10.1.1.2 Simple model with random intercepts and slopes for Longueur

tic()
lm.mod.2 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.16 sec elapsed

10.1.1.3 Simple model with random intercepts and slopes for Timbre

tic()
lm.mod.3 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.36 sec elapsed

10.1.1.4 Simple model with random intercepts and slopes for Debit

tic()
lm.mod.4 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.06 sec elapsed

10.1.1.5 Simple model with random intercepts and slopes for Longueur and Timbre

tic()
lm.mod.5 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
3.27 sec elapsed

10.1.1.6 Simple model with random intercepts and slopes for Longueur and Debit

tic()
lm.mod.6 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: Model failed to converge with 1 negative eigenvalue: -5.3e-04
toc() # 
2.67 sec elapsed

10.1.1.7 Simple model with random intercepts and slopes for Timbre and Debit

tic()
lm.mod.7 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 2 negative eigenvalues: -6.5e-05 -7.9e+00
toc() # 
5.22 sec elapsed

10.1.1.8 Simple model with random intercepts and slopes for Longueur, Timbre and Debit

tic()
lm.mod.8 <- lmer(F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 2 negative eigenvalues: -3.1e-04 -4.3e+01
toc() # 
10.82 sec elapsed

10.1.1.9 Interaction model with random intercepts

tic()
lm.mod.9 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (1 | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.44 sec elapsed

10.1.1.10 Interaction model with random slopes for Longueur

tic()
lm.mod.10 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.99 sec elapsed

10.1.1.11 Interaction model with random slopes for Timbre

tic()
lm.mod.11 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.91 sec elapsed

10.1.1.12 Interaction model with random slopes for Debit

tic()
lm.mod.12 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.38 sec elapsed

10.1.1.13 Interaction model with random slopes for Longueur by Timbre

tic()
lm.mod.13 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: Model failed to converge with 1 negative eigenvalue: -3.9e-04
toc() # 
4.67 sec elapsed

10.1.1.14 Interaction model with random slopes for Longueur by Debit

tic()
lm.mod.14 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
4.17 sec elapsed

10.1.1.15 Interaction model with random slopes for Timbre by Debit

tic()
lm.mod.15 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
7.39 sec elapsed

10.1.1.16 Interaction model with random slopes for Longueur by Timbre by Debit

tic()
lm.mod.16 <- lmer(F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 2 negative eigenvalues: -1.5e-04 -2.5e+01
toc() # 
11.77 sec elapsed

10.1.2 Model comparison

10.1.2.1 All

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.5, lm.mod.6, lm.mod.7, lm.mod.8, lm.mod.9, lm.mod.10, lm.mod.11, lm.mod.12, lm.mod.13, lm.mod.14, lm.mod.15, lm.mod.16)
Data: ArabicSub2
Models:
lm.mod.1: F1midnor ~ Longueur + Timbre + Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.3: F1midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.4: F1midnor ~ Longueur + Timbre + Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word)
lm.mod.6: F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.7: F1midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.9: F1midnor ~ Longueur * Timbre * Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.8: F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.10: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.11: F1midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.12: F1midnor ~ Longueur * Timbre * Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.13: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word)
lm.mod.14: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.15: F1midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.16: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
          npar    AIC    BIC  logLik deviance   Chisq Df Pr(>Chisq)    
lm.mod.1    10 6870.3 6939.1 -3425.1   6850.3                          
lm.mod.2    12 6701.1 6783.7 -3338.6   6677.1  173.13  2     <2e-16 ***
lm.mod.3    15 5908.3 6011.5 -2939.1   5878.3  798.89  3     <2e-16 ***
lm.mod.4    15 6452.6 6555.9 -3211.3   6422.6    0.00  0               
lm.mod.5    18 5697.2 5821.1 -2830.6   5661.2  761.43  3     <2e-16 ***
lm.mod.6    18 6265.7 6389.6 -3114.9   6229.7    0.00  0               
lm.mod.7    21 5418.4 5562.9 -2688.2   5376.4  853.34  3     <2e-16 ***
lm.mod.9    22 6652.5 6803.9 -3304.3   6608.5    0.00  1          1    
lm.mod.8    24 5193.8 5358.9 -2572.9   5145.8 1462.75  2     <2e-16 ***
lm.mod.10   24 6477.8 6642.9 -3214.9   6429.8    0.00  0               
lm.mod.11   27 5659.0 5844.8 -2802.5   5605.0  824.74  3     <2e-16 ***
lm.mod.12   27 6220.3 6406.1 -3083.1   6166.3    0.00  0               
lm.mod.13   30 5440.2 5646.6 -2690.1   5380.2  786.08  3     <2e-16 ***
lm.mod.14   30 6026.7 6233.2 -2983.4   5966.7    0.00  0               
lm.mod.15   33 5146.3 5373.4 -2540.2   5080.3  886.40  3     <2e-16 ***
lm.mod.16   36 4907.9 5155.6 -2417.9   4835.9  244.46  3     <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

According to model comparison, models 16 improved the model fit. Out of all models, models 6, 7, 8, 13 and 16 had singularity and/or convergence issues. Hence we rerun our model comparison retaining only the models that converged and which did not have any issues. #### Models with no issues

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.5, lm.mod.9, lm.mod.10, lm.mod.11, lm.mod.12, lm.mod.14, lm.mod.15)
Data: ArabicSub2
Models:
lm.mod.1: F1midnor ~ Longueur + Timbre + Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.3: F1midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.4: F1midnor ~ Longueur + Timbre + Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.5: F1midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word)
lm.mod.9: F1midnor ~ Longueur * Timbre * Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.10: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.11: F1midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.12: F1midnor ~ Longueur * Timbre * Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.14: F1midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.15: F1midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
          npar    AIC    BIC  logLik deviance  Chisq Df Pr(>Chisq)    
lm.mod.1    10 6870.3 6939.1 -3425.1   6850.3                         
lm.mod.2    12 6701.1 6783.7 -3338.6   6677.1 173.13  2     <2e-16 ***
lm.mod.3    15 5908.3 6011.5 -2939.1   5878.3 798.89  3     <2e-16 ***
lm.mod.4    15 6452.6 6555.9 -3211.3   6422.6   0.00  0               
lm.mod.5    18 5697.2 5821.1 -2830.6   5661.2 761.43  3     <2e-16 ***
lm.mod.9    22 6652.5 6803.9 -3304.3   6608.5   0.00  4          1    
lm.mod.10   24 6477.8 6642.9 -3214.9   6429.8 178.77  2     <2e-16 ***
lm.mod.11   27 5659.0 5844.8 -2802.5   5605.0 824.74  3     <2e-16 ***
lm.mod.12   27 6220.3 6406.1 -3083.1   6166.3   0.00  0               
lm.mod.14   30 6026.7 6233.2 -2983.4   5966.7 199.54  3     <2e-16 ***
lm.mod.15   33 5146.3 5373.4 -2540.2   5080.3 886.40  3     <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Hence, we use model 15’s specifications as our optimal model given that this is the best model with no singularity or convergence issues. We rerun the model with a Restricted Maximum Likelihood (REML)

10.2 Optimal model ran with REML

tic()
lm.mod.Optimal <- update(lm.mod.15, REML = TRUE)
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
toc() # 
7.53 sec elapsed

However, model 15 received a convergence issue. Hence we rerun the analysis with model 14th specifications as our optimal model.

tic()
lm.mod.Optimal <- update(lm.mod.14, REML = TRUE)
toc() # 
3.94 sec elapsed
saveRDS(lm.mod.Optimal, "lm.mod.Optimal.F1midnorTimbreSub2.Rds")
lm.mod.Optimal <- readRDS("lm.mod.Optimal.F1midnorTimbreSub2.Rds")

11 F2midnor - Subset 2 - Timbre

11.1 Modelling

Our aim here is to model the data using various model specification to obtain our optimal model. We start with easy to more complex modelling strategies

11.1.1 No REML (ML)

We start by using a Maximum Likelihood model to allow for model comparison

11.1.1.1 Simple model with random intercepts

tic()
lm.mod.1 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (1 | Speaker) + (1 | Word), ArabicSub2, control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.36 sec elapsed

11.1.1.2 Simple model with random intercepts and slopes for Longueur

tic()
lm.mod.2 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.64 sec elapsed

11.1.1.3 Simple model with random intercepts and slopes for Timbre

tic()
lm.mod.3 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.39 sec elapsed

11.1.1.4 Simple model with random intercepts and slopes for Debit

tic()
lm.mod.4 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.95 sec elapsed

11.1.1.5 Simple model with random intercepts and slopes for Longueur and Timbre

tic()
lm.mod.5 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -9.5e-05
toc() # 
3.67 sec elapsed

11.1.1.6 Simple model with random intercepts and slopes for Longueur and Debit

tic()
lm.mod.6 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvaluesWarning: Model failed to converge with 1 negative eigenvalue: -3.1e-04
toc() # 
2.83 sec elapsed

11.1.1.7 Simple model with random intercepts and slopes for Timbre and Debit

tic()
lm.mod.7 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
6.89 sec elapsed

11.1.1.8 Simple model with random intercepts and slopes for Longueur, Timbre and Debit

tic()
lm.mod.8 <- lmer(F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
Warning: Model failed to converge with 3 negative eigenvalues: -7.0e-04 -3.4e-01 -3.6e+01
toc() # 
11.77 sec elapsed

11.1.1.9 Interaction model with random intercepts

tic()
lm.mod.9 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (1 | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.41 sec elapsed

11.1.1.10 Interaction model with random slopes for Longueur

tic()
lm.mod.10 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
0.89 sec elapsed

11.1.1.11 Interaction model with random slopes for Timbre

tic()
lm.mod.11 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.98 sec elapsed

11.1.1.12 Interaction model with random slopes for Debit

tic()
lm.mod.12 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
1.58 sec elapsed

11.1.1.13 Interaction model with random slopes for Longueur by Timbre

tic()
lm.mod.13 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: unable to evaluate scaled gradientWarning: Model failed to converge: degenerate  Hessian with 1 negative eigenvalues
toc() # 
4.57 sec elapsed

11.1.1.14 Interaction model with random slopes for Longueur by Debit

tic()
lm.mod.14 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
Warning: Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
toc() # 
4.47 sec elapsed

11.1.1.15 Interaction model with random slopes for Timbre by Debit

tic()
lm.mod.15 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
toc() # 
9.11 sec elapsed

11.1.1.16 Interaction model with random slopes for Longueur by Timbre by Debit

tic()
lm.mod.16 <- lmer(F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word), ArabicSub2,
               control = lmerControl(optimizer = "bobyqa", optCtrl = list(maxfun = 2e5)), REML = FALSE)
boundary (singular) fit: see help('isSingular')
toc() # 
18.17 sec elapsed

11.1.2 Model comparison

11.1.2.1 All

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.5, lm.mod.6, lm.mod.7, lm.mod.8, lm.mod.9, lm.mod.10, lm.mod.11, lm.mod.12, lm.mod.13, lm.mod.14, lm.mod.15, lm.mod.16)

According to model comparison, models 16 improved the model fit. Out of all models, models 5, 6, 8, 13, 14 and 16 had singularity and/or convergence issues. Hence we rerun our model comparison retaining only the models that converged and which did not have any issues.

11.1.2.2 Models with no issues

anova(lm.mod.1, lm.mod.2, lm.mod.3, lm.mod.4, lm.mod.7, lm.mod.9, lm.mod.10, lm.mod.11, lm.mod.12, lm.mod.15)
Data: ArabicSub2
Models:
lm.mod.1: F2midnor ~ Longueur + Timbre + Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.2: F2midnor ~ Longueur + Timbre + Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.3: F2midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.4: F2midnor ~ Longueur + Timbre + Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.7: F2midnor ~ Longueur + Timbre + Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
lm.mod.9: F2midnor ~ Longueur * Timbre * Debit + Sex + (1 | Speaker) + (1 | Word)
lm.mod.10: F2midnor ~ Longueur * Timbre * Debit + Sex + (Longueur | Speaker) + (1 | Word)
lm.mod.11: F2midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (1 | Word)
lm.mod.12: F2midnor ~ Longueur * Timbre * Debit + Sex + (Debit | Speaker) + (1 | Word)
lm.mod.15: F2midnor ~ Longueur * Timbre * Debit + Sex + (Timbre | Speaker) + (Debit | Speaker) + (1 | Word)
          npar      AIC      BIC  logLik deviance    Chisq Df Pr(>Chisq)    
lm.mod.1    10   129.58   198.40  -54.79   109.58                           
lm.mod.2    12    60.18   142.76  -18.09    36.18   73.408  2     <2e-16 ***
lm.mod.3    15 -1678.89 -1575.67  854.45 -1708.89 1745.068  3     <2e-16 ***
lm.mod.4    15    56.70   159.92  -13.35    26.70    0.000  0               
lm.mod.7    21 -1783.61 -1639.09  912.80 -1825.61 1852.301  6     <2e-16 ***
lm.mod.9    22  -607.29  -455.89  325.65  -651.29    0.000  1          1    
lm.mod.10   24  -687.26  -522.10  367.63  -735.26   83.968  2     <2e-16 ***
lm.mod.11   27 -2657.15 -2471.34 1355.58 -2711.15 1975.893  3     <2e-16 ***
lm.mod.12   27  -692.71  -506.91  373.36  -746.71    0.000  0               
lm.mod.15   33 -2784.89 -2557.79 1425.44 -2850.89 2104.173  6     <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Hence, we use model 15’s specifications as our optimal model given that this is the best model with no singularity or convergence issues. We rerun the model with a Restricted Maximum Likelihood (REML)

11.2 Optimal model ran with REML

tic()
lm.mod.Optimal <- update(lm.mod.15, REML = TRUE)
Warning: Model is nearly unidentifiable: large eigenvalue ratio
 - Rescale variables?
toc() # 
9.01 sec elapsed

This model received a convergence issue. Hence we rerun the analysis with model 11th specifications as our optimal model given that model 12 did not improve the model fit.

tic()
lm.mod.Optimal <- update(lm.mod.11, REML = TRUE)
toc() # 
2.19 sec elapsed
saveRDS(lm.mod.Optimal, "lm.mod.Optimal.F2midnorTimbreSub2.Rds")
lm.mod.Optimal <- readRDS("lm.mod.Optimal.F2midnorTimbreSub2.Rds")

12 session info

sessionInfo()
R version 4.4.2 (2024-10-31 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 10 x64 (build 19045)

Matrix products: default


locale:
[1] LC_COLLATE=English_United Kingdom.utf8  LC_CTYPE=English_United Kingdom.utf8   
[3] LC_MONETARY=English_United Kingdom.utf8 LC_NUMERIC=C                           
[5] LC_TIME=English_United Kingdom.utf8    

time zone: Europe/Paris
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] phonR_1.0-7     lmerTest_3.1-3  lme4_1.1-35.5   Matrix_1.7-1    tictoc_1.2.1   
 [6] car_3.1-3       carData_3.0-5   lubridate_1.9.4 forcats_1.0.0   stringr_1.5.1  
[11] dplyr_1.1.4     purrr_1.0.2     readr_2.1.5     tidyr_1.3.1     tibble_3.2.1   
[16] ggplot2_3.5.1   tidyverse_2.0.0

loaded via a namespace (and not attached):
 [1] utf8_1.2.4          generics_0.1.3      stringi_1.8.4       lattice_0.22-6     
 [5] hms_1.1.3           digest_0.6.37       magrittr_2.0.3      evaluate_1.0.1     
 [9] grid_4.4.2          timechange_0.3.0    fastmap_1.2.0       Formula_1.2-5      
[13] fansi_1.0.6         scales_1.3.0        numDeriv_2016.8-1.1 abind_1.4-8        
[17] cli_3.6.3           rlang_1.1.4         munsell_0.5.1       splines_4.4.2      
[21] withr_3.0.2         yaml_2.3.10         tools_4.4.2         tzdb_0.4.0         
[25] nloptr_2.1.1        minqa_1.2.8         colorspace_2.1-1    boot_1.3-31        
[29] vctrs_0.6.5         R6_2.5.1            lifecycle_1.0.4     MASS_7.3-61        
[33] pkgconfig_2.0.3     pillar_1.9.0        gtable_0.3.6        Rcpp_1.0.13-1      
[37] rsconnect_1.3.3     glue_1.8.0          xfun_0.49           tidyselect_1.2.1   
[41] rstudioapi_0.17.1   knitr_1.49          nlme_3.1-166        htmltools_0.5.8.1  
[45] rmarkdown_2.29      compiler_4.4.2     
LS0tDQp0aXRsZTogIk1vZGVsbGluZyBBcmFiaWMgZGF0YSAtIE1vZGVscyINCmF1dGhvcjogDQogIG5hbWU6ICJKYWxhbCBBbC1UYW1pbWkiDQogIGFmZmlsaWF0aW9uOiAiVW5pdmVyc2l0w6kgUGFyaXMgQ2l0w6kiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclZCAlQiAlWScpYCINCm91dHB1dDogDQogIGh0bWxfbm90ZWJvb2s6DQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA2DQogICAgdG9jX2Zsb2F0Og0KICAgICAgY29sbGFwc2VkOiB0cnVlDQotLS0NCg0KDQoNCiANCiMgTG9hZGluZyBsaWJyYXJpZXMNCg0KYGBge3J9DQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeSh0aWN0b2MpDQpsaWJyYXJ5KGxtZXJUZXN0KQ0KbGlicmFyeShwaG9uUikNCmBgYA0KDQoNCiMgUmVhZCBkYXRhc2V0IGFuZCBtYW5pcHVsYXRlDQoNCiMjIFJlYWQgZGF0YXNldHMNCg0KYGBge3J9DQpBcmFiaWMgPC0gcmVhZC5jc3YoIlNwZWFraW5nUmF0ZTI0LmNzdiIpIA0KVnJhdGlvIDwtIHJlYWQuY3N2KCJWcmF0aW8uY3N2IikNCmBgYA0KDQojIyBNYW5pcHVsYXRpb25zDQoNCmBgYHtyfQ0KQXJhYmljIDwtIHN1YnNldChBcmFiaWMsIHNlbGVjdCA9IC1BcmFiaWNfcGhyYXNlKSAjIyMgU3VwcHJpbWVyIGxhIGNvbG9ubmUgZGVzIHBocmFzZXMgZW4gYXJhYmUgcG91ciDDqXZpdGVyIGxlcyBwcm9ibMOobWVzIGF2ZWMgUGRmTGFUZXggbG9ycyBkZSBsYSBjb21waWxhdGlvbiBMYVRleCBSLiBTaW5vbiwgdXRpbGlzZXIgWGVMYVRleCBwb3VyIGwnw6ljcml0dXJlIGFyYWJlLiANCkFyYWJpYyRDVkMgPC0gZ3N1YignICcsICcnLCBBcmFiaWMkQ1ZDKSNzdXBwcmltZXIgbGVzIGVzcGFjZXMgDQpBcmFiaWMkViA8LSBnc3ViKCcgJywgJycsIEFyYWJpYyRWKSNzdXBwcmltZXIgbGVzIGVzcGFjZXMNCkFyYWJpYyRMZW5ndGggPC0gZ3N1YignICcsICcnLCBBcmFiaWMkTGVuZ3RoKSNzdXBwcmltZXIgbGVzIGVzcGFjZXMgDQoNCkFyYWJpYyRmMG9ucyA8LSBhcy5pbnRlZ2VyKGdzdWIoJy0tdW5kZWZpbmVkLS0nLCBOQSwgQXJhYmljJGYwb25zKSkNCkFyYWJpYyRmMG1pZCA8LSBhcy5pbnRlZ2VyKGdzdWIoJy0tdW5kZWZpbmVkLS0nLCBOQSwgQXJhYmljJGYwbWlkKSkNCkFyYWJpYyRmMG9mZiA8LSBhcy5pbnRlZ2VyKGdzdWIoJy0tdW5kZWZpbmVkLS0nLCBOQSwgQXJhYmljJGYwb2ZmKSkNCg0KDQpBcmFiaWMgPC0gZHBseXI6Om11dGF0ZV9pZihBcmFiaWMsIGlzLmNoYXJhY3RlciwgYXMuZmFjdG9yKSAjIyBUcmFuc2Zvcm1lciB0b3VzIGxlcyB2YXJpYWJsZXMgZGUgdHlwZSAiY2hhcmFjdGVyIiDDoCBkZXMgZmFjdGV1cnMuIA0KI0FyYWJpYyA8LSBmaWx0ZXIoQXJhYmljLCBWIT0iZToiICYgViE9Im86IikNCkFyYWJpYyRWID0gZmFjdG9yKEFyYWJpYyRWLCBsZXZlbHMgPSBjKCdpJywnYScsJ3UnLCdpOicsJ2E6JywndTonLCdlOicsJ286JykpICMjIG9yZG9ubmVyIGwnb3JkcmUgZGUgbCdhcHBhcml0aW9uIFYNCkFyYWJpYyRDIDwtIGZhY3RvcihBcmFiaWMkQywgbGV2ZWxzPWMoImIiLCJkIiwiZyIsInQiLCJrIikpICMjIG9yZG9ubmVyIGwnb3JkcmUgZGUgbCdhcHBhcml0aW9uIEMNCkFyYWJpYyRWT1RpIDwtIGFzLmludGVnZXIoQXJhYmljJFZPVGkpDQojQXJhYmljJFdvcmRfVl9yYXRpbyA8LSBhcy5udW1lcmljKGdzdWIoJywnLCAnLicsIEFyYWJpYyRXb3JkX1ZfcmF0aW8pKSAjcmVtcGxhY2VyIGxlcyB2aXJndWxlcyBlbiBwb2ludHMgZGFucyBsZXMgbm9tYnJlcyBkw6ljaW1hdXggcG91ciBwb3V2b2lyIGZhaXJlIGRlcyBjYWxjdWxzLiANCg0KbGV2ZWxzKEFyYWJpYyRSYXRlKSA8LSBsaXN0KCJyYXBpZGUiID0gImZhc3QiLCAgICAgICAgIyBDaGFuZ2UgZmFjdG9yIGxldmVscw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb3llbiIgPSAibm9ybWFsIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGVudCIgPSAic2xvdyIpDQpsZXZlbHMoQXJhYmljJExlbmd0aCkgPC0gbGlzdCgibG9uZ3VlIiA9ICJsb25nIiwgICAgICAgICMgQ2hhbmdlIGZhY3RvciBsZXZlbHMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3VydGUiID0gInNob3J0IikNCkFyYWJpYyA8LSBkcGx5cjo6cmVuYW1lKEFyYWJpYywgRGViaXQgPSBSYXRlLCBMb25ndWV1ciA9IExlbmd0aCkNCg0KQXJhYmljJEYxbWlkbm9yIDwtIHdpdGgoQXJhYmljLCBub3JtTG9iYW5vdihGMW1pZCkpICNub3JtYWxpc2F0aW9uIGRlIEYxbWlkIGV0IEYybWlkDQpBcmFiaWMkRjJtaWRub3IgPC0gd2l0aChBcmFiaWMsIG5vcm1Mb2Jhbm92KEYybWlkKSkgI25vcm1hbGlzYXRpb24gZGUgRjFtaWQgZXQgRjJtaWQNCg0KVnJhdGlvIDwtIGRwbHlyOjpyZW5hbWUoVnJhdGlvLCBEZWJpdCA9IFJhdGUpDQoNCiMjIyBzb3VzLWVuc2VtYmxlIDENCkFyYWJpY1N1YjEgPC0gQXJhYmljDQpBcmFiaWNTdWIxIDwtIEFyYWJpY1N1YjEgJT4lIA0KICBmaWx0ZXIoVGltYnJlICVpbiUgYygiaSIsICJhIiwgInUiKSkgJT4lIGRyb3BsZXZlbHMoKQ0KDQojIyMgc291cy1lbnNlbWJsZSAyDQpBcmFiaWNTdWIyIDwtIEFyYWJpYw0KQXJhYmljU3ViMiA8LSBBcmFiaWNTdWIyICU+JSANCiAgZmlsdGVyKFYgJWluJSBjKCJpIiwgImEiLCAidSIsICJlOiIsICJ1OiIsICJhOiIpKSAlPiUgZHJvcGxldmVscygpDQoNCkFyYWJpY1N1YjIkVGltYnJlPWdzdWIoJ2knLCdlJywgQXJhYmljU3ViMiRUaW1icmUpDQpBcmFiaWNTdWIyJFRpbWJyZT1nc3ViKCd1JywnbycsIEFyYWJpY1N1YjIkVGltYnJlKQ0KDQpBcmFiaWNTdWIyJFRpbWJyZT0gYXMuZmFjdG9yKEFyYWJpY1N1YjIkVGltYnJlKQ0KYGBgDQoNCg0KDQojIER1cmF0aW9uDQoNCiMjIE1vZGVsbGluZyANCg0KT3VyIGFpbSBoZXJlIGlzIHRvIG1vZGVsIHRoZSBkYXRhIHVzaW5nIHZhcmlvdXMgbW9kZWwgc3BlY2lmaWNhdGlvbiB0byBvYnRhaW4gb3VyIG9wdGltYWwgbW9kZWwuIFdlIHN0YXJ0IHdpdGggZWFzeSB0byBtb3JlIGNvbXBsZXggbW9kZWxsaW5nIHN0cmF0ZWdpZXMgDQoNCg0KIyMjIE5vIFJFTUwgKE1MKQ0KDQpXZSBzdGFydCBieSB1c2luZyBhIE1heGltdW0gTGlrZWxpaG9vZCBtb2RlbCB0byBhbGxvdyBmb3IgbW9kZWwgY29tcGFyaXNvbg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjEgPC0gbG1lcihEdXJhdGlvbiB+IERlYml0ICsgViArIFNleCArICgxIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWMsIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIERlYml0DQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjIgPC0gbG1lcihEdXJhdGlvbiB+IERlYml0ICsgViArIFNleCArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgVm93ZWwNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjMgPC0gbG1lcihEdXJhdGlvbiB+IERlYml0ICsgViArIFNleCArIChWIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWMsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBEZWJpdCBhbmQgVm93ZWwgYnkgc3BlYWtlcg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNCA8LSBsbWVyKER1cmF0aW9uIH4gRGViaXQgKyBWICsgU2V4ICsgKERlYml0IHwgU3BlYWtlcikgKyAoVnwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWMsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjUgPC0gbG1lcihEdXJhdGlvbiB+IERlYml0ICogViArIFNleCArICgxIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWMsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIERlYml0IGJ5IFNwZWFrZXINCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNiA8LSBsbWVyKER1cmF0aW9uIH4gRGViaXQgKiBWICsgU2V4ICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWMsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgVm93ZWwgYnkgU3BlYWtlcg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC43IDwtIGxtZXIoRHVyYXRpb24gfiBEZWJpdCAqIFYgKyBTZXggKyAoViB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIGZ1bGwgcmFuZG9tIHNsb3BlcyBmb3IgRGViaXQgYnkgVm93ZWwgYnkgU3BlYWtlcg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC44IDwtIGxtZXIoRHVyYXRpb24gfiBEZWJpdCAqIFYgKyBTZXggKyAoRGViaXQgfCBTcGVha2VyKSArIChWIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWMsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMgTW9kZWwgY29tcGFyaXNvbg0KDQojIyMjIEFsbA0KDQpgYGB7cn0NCmFub3ZhKGxtLm1vZC4xLCBsbS5tb2QuMiwgbG0ubW9kLjMsIGxtLm1vZC40LCBsbS5tb2QuNSwgbG0ubW9kLjYsIGxtLm1vZC43LCBsbS5tb2QuOCkNCmBgYA0KDQpNb2RlbCBjb21wYXJpc29uIHJlc3VsdHMgc3VnZ2VzdCB0aGF0IG1vZGVsIDggaXMgdGhlIGJlc3QgbW9kZWwuIEhvd2V2ZXIsIHRoZSByZXN1bHRzIGZyb20gdGhlIG1vZGVsbGluZyBpbmRpY2F0ZWQgdGhhdCBNb2RlbHMgMywgNCwgNyBhbmQgOCBoYWQgc2luZ3VsYXJpdHkgYW5kL29yIGNvbnZlcmdlbmNlIGlzc3Vlcy4NCg0KV2UgcmVydW4gb3VyIG1vZGVsIGNvbXBhcmlzb24gcmV0YWluaW5nIG9ubHkgdGhlIG1vZGVscyB0aGF0IGNvbnZlcmdlZCBhbmQgd2hpY2ggZGlkIG5vdCBoYXZlIGFueSBpc3N1ZXMuDQoNCiMjIyMgTW9kZWxzIHdpdGggbm8gaXNzdWVzDQoNCg0KDQpgYGB7cn0NCmFub3ZhKGxtLm1vZC4xLCBsbS5tb2QuMiwgbG0ubW9kLjUsIGxtLm1vZC42KQ0KYGBgDQoNCg0KDQpUaGUgcmVzdWx0cyBzdWdnZXN0IHRoYXQgbW9kZWwgNiBpcyB0aGUgb3B0aW1hbCBtb2RlbCBhbmQgd2UgdXNlIGl0cyBzcGVjaWZpY2F0aW9ucyBhcyBvdXIgb3B0aW1hbCBtb2RlbC4gV2UgcmVydW4gdGhlIG1vZGVsIHdpdGggYSBSZXN0cmljdGVkIE1heGltdW0gTGlrZWxpaG9vZCAoUkVNTCkNCg0KDQojIyBPcHRpbWFsIG1vZGVsIHJhbiB3aXRoIFJFTUwgDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLk9wdGltYWwgPC0gdXBkYXRlKGxtLm1vZC42LCBSRU1MID0gVFJVRSkNCnRvYygpDQpgYGANCg0KDQoNCmBgYHtyfQ0Kc2F2ZVJEUyhsbS5tb2QuT3B0aW1hbCwgImxtLm1vZC5PcHRpbWFsLkR1ci5SZHMiKQ0KbG0ubW9kLk9wdGltYWwgPC0gcmVhZFJEUygibG0ubW9kLk9wdGltYWwuRHVyLlJkcyIpDQpgYGANCg0KDQojIFZyYXRpbw0KDQojIyBNb2RlbGxpbmcgDQoNCk91ciBhaW0gaGVyZSBpcyB0byBtb2RlbCB0aGUgZGF0YSB1c2luZyB2YXJpb3VzIG1vZGVsIHNwZWNpZmljYXRpb24gdG8gb2J0YWluIG91ciBvcHRpbWFsIG1vZGVsLiBXZSBzdGFydCB3aXRoIGVhc3kgdG8gbW9yZSBjb21wbGV4IG1vZGVsbGluZyBzdHJhdGVnaWVzIA0KDQoNCiMjIyBObyBSRU1MIChNTCkNCg0KV2Ugc3RhcnQgYnkgdXNpbmcgYSBNYXhpbXVtIExpa2VsaWhvb2QgbW9kZWwgdG8gYWxsb3cgZm9yIG1vZGVsIGNvbXBhcmlzb24NCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cw0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xIDwtIGxtZXIoVnJhdGlvIH4gRGViaXQgKyBUaW1icmUgKyBTZXggKyAoMSB8IFNwZWFrZXIpLCBWcmF0aW8sDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgRGViaXQNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjIgPC0gbG1lcihWcmF0aW8gfiBEZWJpdCArIFRpbWJyZSArIFNleCArIChEZWJpdCB8IFNwZWFrZXIpICwgVnJhdGlvLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIFRpbWJyZQ0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMyA8LSBsbWVyKFZyYXRpbyB+IERlYml0ICsgVGltYnJlICsgU2V4ICsgKFRpbWJyZSB8IFNwZWFrZXIpICwgVnJhdGlvLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIHNsb3Blcywgbm8gYWRqdXN0bWVudHMgYnkgVGltYnJlIA0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNCA8LSBsbWVyKFZyYXRpbyB+IERlYml0ICsgVGltYnJlICsgU2V4ICsgKERlYml0IHwgU3BlYWtlcikgKyAoVGltYnJlIHwgU3BlYWtlciksIFZyYXRpbywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNSA8LSBsbWVyKFZyYXRpbyB+IERlYml0ICogVGltYnJlICsgU2V4ICsgKDEgfCBTcGVha2VyKSwgVnJhdGlvLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBEZWJpdA0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC42IDwtIGxtZXIoVnJhdGlvIH4gRGViaXQgKiBUaW1icmUgKyBTZXggKyAoRGViaXQgfCBTcGVha2VyKSwgVnJhdGlvLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBUaW1icmUNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNyA8LSBsbWVyKFZyYXRpbyB+IERlYml0ICogVGltYnJlICsgU2V4ICsgKFRpbWJyZSB8IFNwZWFrZXIpLCBWcmF0aW8sDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgRGViaXQgYW5kIFRpbWJyZQ0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC44IDwtIGxtZXIoVnJhdGlvIH4gRGViaXQgKiBUaW1icmUgKyBTZXggKyAoRGViaXQgfCBTcGVha2VyKSArIChUaW1icmUgfCBTcGVha2VyKSwgVnJhdGlvLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyBNb2RlbCBjb21wYXJpc29uDQoNCiMjIyMgQWxsDQoNCg0KYGBge3J9DQphbm92YShsbS5tb2QuMSwgbG0ubW9kLjIsIGxtLm1vZC4zLCBsbS5tb2QuNCwgbG0ubW9kLjUsIGxtLm1vZC42LCBsbS5tb2QuNywgbG0ubW9kLjgpDQpgYGANCg0KUmVzdWx0cyBzaG93ZWQgdGhhdCBtb2RlbCA0IGlzIHRoZSBiZXN0IG1vZGVsLCB3aXRoIGEgd2FybmluZy4gTW9kZWwgOCBoYXMgY29udmVyZ2VuY2UgaXNzdWVzLiBXZSByZXJ1biBvdXIgbW9kZWwgY29tcGFyaXNvbiByZXRhaW5pbmcgb25seSB0aGUgbW9kZWxzIHRoYXQgY29udmVyZ2VkIGFuZCB3aGljaCBkaWQgbm90IGhhdmUgYW55IGlzc3Vlcy4NCg0KDQojIyMjIE1vZGVscyB3aXRoIG5vIGlzc3Vlcw0KDQoNCmBgYHtyfQ0KYW5vdmEobG0ubW9kLjEsIGxtLm1vZC4yLCBsbS5tb2QuMywgbG0ubW9kLjUsIGxtLm1vZC42LCBsbS5tb2QuNykNCmBgYA0KDQoNCkhlbmNlLCB3ZSB1c2UgbW9kZWwgMidzIHNwZWNpZmljYXRpb25zIGFzIG91ciBvcHRpbWFsIG1vZGVsLiBXZSByZXJ1biB0aGUgbW9kZWwgd2l0aCBhIFJlc3RyaWN0ZWQgTWF4aW11bSBMaWtlbGlob29kIChSRU1MKQ0KDQoNCiMjIE9wdGltYWwgbW9kZWwgcmFuIHdpdGggUkVNTCANCg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC5PcHRpbWFsIDwtIHVwZGF0ZShsbS5tb2QuMiwgUkVNTCA9IFRSVUUpDQoNCnRvYygpICMgDQpgYGANCg0KDQpgYGB7cn0NCnNhdmVSRFMobG0ubW9kLk9wdGltYWwsICJsbS5tb2QuT3B0aW1hbC5WcmF0aW8uUmRzIikNCmxtLm1vZC5PcHRpbWFsIDwtIHJlYWRSRFMoImxtLm1vZC5PcHRpbWFsLlZyYXRpby5SZHMiKQ0KYGBgDQoNCg0KDQojIFdvcmRfVl9yYXRpbw0KDQojIyBNb2RlbGxpbmcgDQoNCk91ciBhaW0gaGVyZSBpcyB0byBtb2RlbCB0aGUgZGF0YSB1c2luZyB2YXJpb3VzIG1vZGVsIHNwZWNpZmljYXRpb24gdG8gb2J0YWluIG91ciBvcHRpbWFsIG1vZGVsLiBXZSBzdGFydCB3aXRoIGVhc3kgdG8gbW9yZSBjb21wbGV4IG1vZGVsbGluZyBzdHJhdGVnaWVzIA0KDQojIyMgTm8gUkVNTCAoTUwpDQoNCldlIHN0YXJ0IGJ5IHVzaW5nIGEgTWF4aW11bSBMaWtlbGlob29kIG1vZGVsIHRvIGFsbG93IGZvciBtb2RlbCBjb21wYXJpc29uDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cw0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xIDwtIGxtZXIoV29yZF9WX3JhdGlvIH4gRGViaXQgKyBWICsgU2V4ICsgKDEgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgRGViaXQNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMiA8LSBsbWVyKFdvcmRfVl9yYXRpbyB+IERlYml0ICsgViArIFNleCArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBWb3dlbA0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMyA8LSBsbWVyKFdvcmRfVl9yYXRpbyB+IERlYml0ICsgViArIFNleCArIChWIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWMsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIERlYml0IGFuZCBWb3dlbCBieSBzcGVha2VyDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC40IDwtIGxtZXIoV29yZF9WX3JhdGlvIH4gRGViaXQgKyBWICsgU2V4ICsgKERlYml0IHwgU3BlYWtlcikgKyAoViB8IFNwZWFrZXIpICsgICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cw0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC41IDwtIGxtZXIoV29yZF9WX3JhdGlvIH4gRGViaXQgKiBWICsgU2V4ICsgKDEgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgRGViaXQgYnkgU3BlYWtlcg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC42IDwtIGxtZXIoV29yZF9WX3JhdGlvIH4gRGViaXQgKiBWICsgU2V4ICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWMsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgVm93ZWwgYnkgU3BlYWtlcg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC43IDwtIGxtZXIoV29yZF9WX3JhdGlvIH4gRGViaXQgKiBWICsgU2V4ICsgKFYgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCBmdWxsIHJhbmRvbSBzbG9wZXMgZm9yIERlYml0IGJ5IFZvd2VsIGJ5IFNwZWFrZXINCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuOCA8LSBsbWVyKFdvcmRfVl9yYXRpbyB+IERlYml0ICogViArIFNleCArIChEZWJpdCB8IFNwZWFrZXIpICsgKFYgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCg0KIyMjIE1vZGVsIGNvbXBhcmlzb24NCg0KIyMjIyBBbGwNCg0KDQpgYGB7cn0NCmFub3ZhKGxtLm1vZC4xLCBsbS5tb2QuMiwgbG0ubW9kLjMsIGxtLm1vZC40LCBsbS5tb2QuNSwgbG0ubW9kLjYsIGxtLm1vZC43LCBsbS5tb2QuOCkNCmBgYA0KDQoNCkFjY29yZGluZyB0byBtb2RlbCBjb21wYXJpc29uLCBtb2RlbCA4IGltcHJvdmVkIHRoZSBtb2RlbCBmaXQuIEhvd2V2ZXIsIHdoZW4gZXZhbHVhdGluZyB0aGUgcmVzdWx0cywgbW9kZWxzIDMsIDQsIDcgYW5kIDggc3VmZmVyZWQgZnJvbSBzaW5ndWxhcml0eSBhbmQgY29udmVyZ2VuY2UgaXNzdWVzLiBIZW5jZSwgd2UgcmVydW4gb3VyIG1vZGVsIGNvbXBhcmlzb24gcmV0YWluaW5nIG9ubHkgdGhlIG1vZGVscyB0aGF0IGNvbnZlcmdlZCBhbmQgd2hpY2ggZGlkIG5vdCBoYXZlIGFueSBpc3N1ZXMuDQoNCiMjIyMgTW9kZWxzIHdpdGggbm8gaXNzdWVzDQoNCg0KYGBge3J9DQphbm92YShsbS5tb2QuMSwgbG0ubW9kLjIsIGxtLm1vZC41LCBsbS5tb2QuNikNCmBgYA0KDQoNClRoZSByZXN1bHRzIHNob3cgdGhhdCBtb2RlbCA2IGltcHJvdmVkIHRoZSBtb2RlbCBmaXQgYW5kIGl0cyBzcGVjaWZpY2F0aW9uIGlzIHVzZWQgYXMgb3VyIG9wdGltYWwgbW9kZWwuIFdlIHJlcnVuIHRoZSBtb2RlbCB3aXRoIGEgUmVzdHJpY3RlZCBNYXhpbXVtIExpa2VsaWhvb2QgKFJFTUwpDQoNCiMjIE9wdGltYWwgbW9kZWwgcmFuIHdpdGggUkVNTCANCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuT3B0aW1hbCA8LSB1cGRhdGUobG0ubW9kLjYsIFJFTUwgPSBUUlVFKQ0KDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQpgYGB7cn0NCnNhdmVSRFMobG0ubW9kLk9wdGltYWwsICJsbS5tb2QuT3B0aW1hbC5Xb3JkX1ZfcmF0aW8uUmRzIikNCmxtLm1vZC5PcHRpbWFsIDwtIHJlYWRSRFMoImxtLm1vZC5PcHRpbWFsLldvcmRfVl9yYXRpby5SZHMiKQ0KYGBgDQoNCg0KDQoNCiMgRjFtaWRub3INCg0KIyMgTW9kZWxsaW5nIA0KDQpPdXIgYWltIGhlcmUgaXMgdG8gbW9kZWwgdGhlIGRhdGEgdXNpbmcgdmFyaW91cyBtb2RlbCBzcGVjaWZpY2F0aW9uIHRvIG9idGFpbiBvdXIgb3B0aW1hbCBtb2RlbC4gV2Ugc3RhcnQgd2l0aCBlYXN5IHRvIG1vcmUgY29tcGxleCBtb2RlbGxpbmcgc3RyYXRlZ2llcyANCg0KDQojIyMgTm8gUkVNTCAoTUwpDQoNCldlIHN0YXJ0IGJ5IHVzaW5nIGEgTWF4aW11bSBMaWtlbGlob29kIG1vZGVsIHRvIGFsbG93IGZvciBtb2RlbCBjb21wYXJpc29uDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cw0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xIDwtIGxtZXIoRjFtaWRub3IgfiBEZWJpdCArIFYgKyBTZXggKyAoMSB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBEZWJpdA0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4yIDwtIGxtZXIoRjFtaWRub3IgfiBEZWJpdCArIFYgKyBTZXggKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBWb3dlbA0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMyA8LSBsbWVyKEYxbWlkbm9yIH4gRGViaXQgKyBWICsgU2V4ICsgKFYgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgRGViaXQgYW5kIFZvd2VsIGJ5IHNwZWFrZXINCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjQgPC0gbG1lcihGMW1pZG5vciB+IERlYml0ICsgViArIFNleCArIChEZWJpdCB8IFNwZWFrZXIpICsgKFYgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cw0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC41IDwtIGxtZXIoRjFtaWRub3IgfiBEZWJpdCAqIFYgKyBTZXggKyAoMSB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gc2xvcGVzIGZvciBEZWJpdCBieSBTcGVha2VyDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjYgPC0gbG1lcihGMW1pZG5vciB+IERlYml0ICogViArIFNleCArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIFZvd2VsIGJ5IFNwZWFrZXINCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNyA8LSBsbWVyKEYxbWlkbm9yIH4gRGViaXQgKiBWICsgU2V4ICsgKFYgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggZnVsbCByYW5kb20gc2xvcGVzIGZvciBEZWJpdCBieSBWb3dlbCBieSBTcGVha2VyDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjggPC0gbG1lcihGMW1pZG5vciB+IERlYml0ICogViArIFNleCArIChEZWJpdCB8IFNwZWFrZXIpICsgKFYgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCiMjIyBNb2RlbCBjb21wYXJpc29uDQoNCiMjIyMgQWxsDQoNCmBgYHtyfQ0KYW5vdmEobG0ubW9kLjEsIGxtLm1vZC4yLCBsbS5tb2QuMywgbG0ubW9kLjQsIGxtLm1vZC41LCBsbS5tb2QuNiwgbG0ubW9kLjcsIGxtLm1vZC44KQ0KYGBgDQoNCg0KQWNjb3JkaW5nIHRvIG1vZGVsIGNvbXBhcmlzb24gdXNpbmcgYWxsIG1vZGVscywgbW9kZWwgOCBpbXByb3ZlZCB0aGUgbW9kZWwgZml0LiBIb3dldmVyLCBtb2RlbHMgNCBhbmQgOCBzaG93ZWQgc2luZ3VsYXJpdHkgYW5kIGNvbnZlcmdlbmNlIGlzc3Vlcy4gSGVuY2UsIHdlIHJlcnVuIG1vZGVsIGNvbXBhcmlzb24gcmVtb3ZpbmcgYW55IGlsbC1mb3JtZWQgbW9kZWwuIA0KDQoNCiMjIyMgTW9kZWxzIHdpdGggbm8gaXNzdWVzDQoNCmBgYHtyfQ0KYW5vdmEobG0ubW9kLjEsIGxtLm1vZC4yLCBsbS5tb2QuMywgbG0ubW9kLjUsIGxtLm1vZC42LCBsbS5tb2QuNykNCmBgYA0KDQoNClRoZSByZXN1bHRzIHNob3cgdGhhdCBtb2RlbCA3IGltcHJvdmVkIHRoZSBtb2RlbCBmaXQuIEhlbmNlLCB3ZSB1c2UgbW9kZWwgNydzIHNwZWNpZmljYXRpb25zIGFzIG91ciBvcHRpbWFsIG1vZGVsIGdpdmVuIHRoYXQgdGhpcyBpcyB0aGUgYmVzdCBtb2RlbCB3aXRoIG5vIHNpbmd1bGFyaXR5IG9yIGNvbnZlcmdlbmNlIGlzc3Vlcy4gV2UgcmVydW4gdGhlIG1vZGVsIHdpdGggYSBSZXN0cmljdGVkIE1heGltdW0gTGlrZWxpaG9vZCAoUkVNTCkNCg0KIyMgT3B0aW1hbCBtb2RlbCByYW4gd2l0aCBSRU1MIA0KDQoNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuT3B0aW1hbCA8LSB1cGRhdGUobG0ubW9kLjcsIFJFTUwgPSBUUlVFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KYGBge3J9DQpzYXZlUkRTKGxtLm1vZC5PcHRpbWFsLCAibG0ubW9kLk9wdGltYWwuRjFtaWRub3IuUmRzIikNCmxtLm1vZC5PcHRpbWFsIDwtIHJlYWRSRFMoImxtLm1vZC5PcHRpbWFsLkYxbWlkbm9yLlJkcyIpDQpgYGANCg0KDQoNCiMgRjJtaWRub3INCg0KIyMgTW9kZWxsaW5nIA0KDQpPdXIgYWltIGhlcmUgaXMgdG8gbW9kZWwgdGhlIGRhdGEgdXNpbmcgdmFyaW91cyBtb2RlbCBzcGVjaWZpY2F0aW9uIHRvIG9idGFpbiBvdXIgb3B0aW1hbCBtb2RlbC4gV2Ugc3RhcnQgd2l0aCBlYXN5IHRvIG1vcmUgY29tcGxleCBtb2RlbGxpbmcgc3RyYXRlZ2llcyANCg0KIyMjIE5vIFJFTUwgKE1MKQ0KDQpXZSBzdGFydCBieSB1c2luZyBhIE1heGltdW0gTGlrZWxpaG9vZCBtb2RlbCB0byBhbGxvdyBmb3IgbW9kZWwgY29tcGFyaXNvbg0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMSA8LSBsbWVyKEYybWlkbm9yIH4gRGViaXQgKyBWICsgU2V4ICsgKDEgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgRGViaXQNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMiA8LSBsbWVyKEYybWlkbm9yIH4gRGViaXQgKyBWICsgU2V4ICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWMsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBWb3dlbA0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMyA8LSBsbWVyKEYybWlkbm9yIH4gRGViaXQgKyBWICsgU2V4ICsgKFYgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgRGViaXQgYW5kIFZvd2VsIGJ5IHNwZWFrZXINCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjQgPC0gbG1lcihGMm1pZG5vciB+IERlYml0ICsgViArIFNleCArIChEZWJpdCB8IFNwZWFrZXIpICsgKFYgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNSA8LSBsbWVyKEYybWlkbm9yIH4gRGViaXQgKiBWICsgU2V4ICsgKDEgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgRGViaXQgYnkgU3BlYWtlcg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC42IDwtIGxtZXIoRjJtaWRub3IgfiBEZWJpdCAqIFYgKyBTZXggKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpYywNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgVm93ZWwgYnkgU3BlYWtlcg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC43IDwtIGxtZXIoRjJtaWRub3IgfiBEZWJpdCAqIFYgKyBTZXggKyAoViB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIGZ1bGwgcmFuZG9tIHNsb3BlcyBmb3IgRGViaXQgYnkgVm93ZWwgYnkgU3BlYWtlcg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC44IDwtIGxtZXIoRjJtaWRub3IgfiBEZWJpdCAqIFYgKyBTZXggKyAoRGViaXQgfCBTcGVha2VyKSArIChWIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWMsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMgTW9kZWwgY29tcGFyaXNvbg0KDQoNCiMjIyMgQWxsDQoNCg0KYGBge3J9DQphbm92YShsbS5tb2QuMSwgbG0ubW9kLjIsIGxtLm1vZC4zLCBsbS5tb2QuNCwgbG0ubW9kLjUsIGxtLm1vZC42LCBsbS5tb2QuNywgbG0ubW9kLjgpDQpgYGANCg0KQWNjb3JkaW5nIHRvIG1vZGVsIGNvbXBhcmlzb24sIG1vZGVsIDggaW1wcm92ZWQgdGhlIG1vZGVsIGZpdC4gSG93ZXZlciwgd2hlbiBldmFsdWF0aW5nIHRoZSByZXN1bHRzLCBtb2RlbHMgMywgNCwgNyBhbmQgOCBzaG93ZWQgc2luZ3VsYXJpdHkgYW5kIGNvbnZlcmdlbmNlIGlzc3Vlcy4gV2UgcmVydW4gb3VyIG1vZGVsIGNvbXBhcmlzb24gcmV0YWluaW5nIG9ubHkgdGhlIG1vZGVscyB0aGF0IGNvbnZlcmdlZCBhbmQgd2hpY2ggZGlkIG5vdCBoYXZlIGFueSBpc3N1ZXMuDQojIyMjIE1vZGVscyB3aXRoIG5vIGlzc3Vlcw0KDQoNCmBgYHtyfQ0KYW5vdmEobG0ubW9kLjEsIGxtLm1vZC4yLCBsbS5tb2QuNSwgbG0ubW9kLjYpDQpgYGANCg0KDQpUaGUgcmVzdWx0cyBzdWdnZXN0IHRoYXQgbW9kZWwgNiBpcyBpbXByb3ZpbmcgdGhlIG1vZGVsIGZpdC4gSGVuY2UsIHdlIHVzZSBtb2RlbCA2J3Mgc3BlY2lmaWNhdGlvbnMgYXMgb3VyIG9wdGltYWwgbW9kZWwuIFdlIHJlcnVuIHRoZSBtb2RlbCB3aXRoIGEgUmVzdHJpY3RlZCBNYXhpbXVtIExpa2VsaWhvb2QgKFJFTUwpLg0KDQoNCg0KIyMgT3B0aW1hbCBtb2RlbCByYW4gd2l0aCBSRU1MIA0KDQoNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuT3B0aW1hbCA8LSB1cGRhdGUobG0ubW9kLjYsIFJFTUwgPSBUUlVFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KYGBge3J9DQpzYXZlUkRTKGxtLm1vZC5PcHRpbWFsLCAibG0ubW9kLk9wdGltYWwuRjJtaWRub3IuUmRzIikNCmxtLm1vZC5PcHRpbWFsIDwtIHJlYWRSRFMoImxtLm1vZC5PcHRpbWFsLkYybWlkbm9yLlJkcyIpDQpgYGANCg0KDQojIEYxbWlkbm9yIC0gU3Vic2V0IDEgLSBUaW1icmUNCg0KIyMgTW9kZWxsaW5nIA0KDQpPdXIgYWltIGhlcmUgaXMgdG8gbW9kZWwgdGhlIGRhdGEgdXNpbmcgdmFyaW91cyBtb2RlbCBzcGVjaWZpY2F0aW9uIHRvIG9idGFpbiBvdXIgb3B0aW1hbCBtb2RlbC4gV2Ugc3RhcnQgd2l0aCBlYXN5IHRvIG1vcmUgY29tcGxleCBtb2RlbGxpbmcgc3RyYXRlZ2llcyANCg0KIyMjIE5vIFJFTUwgKE1MKQ0KDQpXZSBzdGFydCBieSB1c2luZyBhIE1heGltdW0gTGlrZWxpaG9vZCBtb2RlbCB0byBhbGxvdyBmb3IgbW9kZWwgY29tcGFyaXNvbg0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMSA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKyBUaW1icmUgKyBEZWJpdCArIFNleCArICgxIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBMb25ndWV1cg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4yIDwtIGxtZXIoRjFtaWRub3IgfiBMb25ndWV1ciArIFRpbWJyZSArIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgVGltYnJlDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjMgPC0gbG1lcihGMW1pZG5vciB+IExvbmd1ZXVyICsgVGltYnJlICsgRGViaXQgKyBTZXggKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgRGViaXQNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNCA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKyBUaW1icmUgKyBEZWJpdCArIFNleCArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMSwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIExvbmd1ZXVyIGFuZCBUaW1icmUNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjUgPC0gbG1lcihGMW1pZG5vciB+IExvbmd1ZXVyICsgVGltYnJlICsgRGViaXQgKyBTZXggKyAoTG9uZ3VldXIgfCBTcGVha2VyKSArIChUaW1icmUgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjEsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIExvbmd1ZXVyIGFuZCBEZWJpdA0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNiA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKyBUaW1icmUgKyBEZWJpdCArIFNleCArIChMb25ndWV1ciB8IFNwZWFrZXIpICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIFRpbWJyZSBhbmQgRGViaXQNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjcgPC0gbG1lcihGMW1pZG5vciB+IExvbmd1ZXVyICsgVGltYnJlICsgRGViaXQgKyBTZXggKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjEsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIExvbmd1ZXVyLCBUaW1icmUgYW5kIERlYml0DQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC44IDwtIGxtZXIoRjFtaWRub3IgfiBMb25ndWV1ciArIFRpbWJyZSArIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjEsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuOSA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArICgxIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gc2xvcGVzIGZvciBMb25ndWV1cg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xMCA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArIChMb25ndWV1ciB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMSwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIFRpbWJyZQ0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xMSA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArIChUaW1icmUgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjEsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIERlYml0DQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjEyIDwtIGxtZXIoRjFtaWRub3IgfiBMb25ndWV1ciAqIFRpbWJyZSAqIERlYml0ICsgU2V4ICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gc2xvcGVzIGZvciBMb25ndWV1ciBieSBUaW1icmUgDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjEzIDwtIGxtZXIoRjFtaWRub3IgfiBMb25ndWV1ciAqIFRpbWJyZSAqIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIExvbmd1ZXVyIGJ5IERlYml0IA0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xNCA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArIChMb25ndWV1ciB8IFNwZWFrZXIpICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIFRpbWJyZSBieSBEZWJpdCANCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMTUgPC0gbG1lcihGMW1pZG5vciB+IExvbmd1ZXVyICogVGltYnJlICogRGViaXQgKyBTZXggKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjEsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gc2xvcGVzIGZvciBMb25ndWV1ciBieSBUaW1icmUgYnkgRGViaXQgDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjE2IDwtIGxtZXIoRjFtaWRub3IgfiBMb25ndWV1ciAqIFRpbWJyZSAqIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjEsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQoNCiMjIyBNb2RlbCBjb21wYXJpc29uDQoNCiMjIyMgQWxsDQoNCg0KYGBge3J9DQphbm92YShsbS5tb2QuMSwgbG0ubW9kLjIsIGxtLm1vZC4zLCBsbS5tb2QuNCwgbG0ubW9kLjUsIGxtLm1vZC42LCBsbS5tb2QuNywgbG0ubW9kLjgsIGxtLm1vZC45LCBsbS5tb2QuMTAsIGxtLm1vZC4xMSwgbG0ubW9kLjEyLCBsbS5tb2QuMTMsIGxtLm1vZC4xNCwgbG0ubW9kLjE1LCBsbS5tb2QuMTYpDQpgYGANCg0KDQpBY2NvcmRpbmcgdG8gbW9kZWwgY29tcGFyaXNvbiwgbW9kZWwgMTYgaW1wcm92ZWQgdGhlIG1vZGVsIGZpdC4gT3V0IG9mIGFsbCBtb2RlbHMsIG1vZGVscyA1LCA2LCA3LCA4LCAxMywgMTUgYW5kIDE2IGhhZCBzaW5ndWxhcml0eSBhbmQvb3IgY29udmVyZ2VuY2UgaXNzdWVzLiBIZW5jZSB3ZSByZXJ1biBvdXIgbW9kZWwgY29tcGFyaXNvbiByZXRhaW5pbmcgb25seSB0aGUgbW9kZWxzIHRoYXQgY29udmVyZ2VkIGFuZCB3aGljaCBkaWQgbm90IGhhdmUgYW55IGlzc3Vlcy4gDQoNCiMjIyMgTW9kZWxzIHdpdGggbm8gaXNzdWVzDQoNCg0KYGBge3J9DQphbm92YShsbS5tb2QuMSwgbG0ubW9kLjIsIGxtLm1vZC4zLCBsbS5tb2QuNCwgbG0ubW9kLjksIGxtLm1vZC4xMCwgbG0ubW9kLjExLCBsbS5tb2QuMTIsIGxtLm1vZC4xNCkNCmBgYA0KDQoNCkhlbmNlLCB3ZSB1c2UgbW9kZWwgMTQncyBzcGVjaWZpY2F0aW9ucyBhcyBvdXIgb3B0aW1hbCBtb2RlbCBnaXZlbiB0aGF0IHRoaXMgaXMgdGhlIGJlc3QgbW9kZWwgd2l0aCBubyBzaW5ndWxhcml0eSBvciBjb252ZXJnZW5jZSBpc3N1ZXMuIFdlIHJlcnVuIHRoZSBtb2RlbCB3aXRoIGEgUmVzdHJpY3RlZCBNYXhpbXVtIExpa2VsaWhvb2QgKFJFTUwpDQoNCg0KIyMgT3B0aW1hbCBtb2RlbCByYW4gd2l0aCBSRU1MIA0KDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLk9wdGltYWwgPC0gdXBkYXRlKGxtLm1vZC4xNCwgUkVNTCA9IFRSVUUpDQp0b2MoKSAjIA0KYGBgDQoNCkFmdGVyIHJ1bm5pbmcgb3VyIG1vZGVsIDE0LCB0aGVyZSBpcyBhIGNvbnZlcmdlbmNlIGlzc3VlLiANCkhlbmNlIHdlIHJlcnVuIHRoZSBhbmFseXNpcyB3aXRoIG1vZGVsIDExdGggc3BlY2lmaWNhdGlvbnMgYXMgb3VyIG9wdGltYWwgbW9kZWwuDQoNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuT3B0aW1hbCA8LSB1cGRhdGUobG0ubW9kLjExLCBSRU1MID0gVFJVRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCmBgYHtyfQ0Kc2F2ZVJEUyhsbS5tb2QuT3B0aW1hbCwgImxtLm1vZC5PcHRpbWFsLkYxbWlkbm9yVGltYnJlU3ViLlJkcyIpDQpsbS5tb2QuT3B0aW1hbCA8LSByZWFkUkRTKCJsbS5tb2QuT3B0aW1hbC5GMW1pZG5vclRpbWJyZVN1Yi5SZHMiKQ0KYGBgDQoNCg0KIyBGMm1pZG5vciAtIFN1YnNldCAxIC0gVGltYnJlDQoNCiMjIE1vZGVsbGluZyANCg0KT3VyIGFpbSBoZXJlIGlzIHRvIG1vZGVsIHRoZSBkYXRhIHVzaW5nIHZhcmlvdXMgbW9kZWwgc3BlY2lmaWNhdGlvbiB0byBvYnRhaW4gb3VyIG9wdGltYWwgbW9kZWwuIFdlIHN0YXJ0IHdpdGggZWFzeSB0byBtb3JlIGNvbXBsZXggbW9kZWxsaW5nIHN0cmF0ZWdpZXMgDQoNCg0KIyMjIE5vIFJFTUwgKE1MKQ0KDQpXZSBzdGFydCBieSB1c2luZyBhIE1heGltdW0gTGlrZWxpaG9vZCBtb2RlbCB0byBhbGxvdyBmb3IgbW9kZWwgY29tcGFyaXNvbg0KDQoNCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjEgPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICsgVGltYnJlICsgRGViaXQgKyBTZXggKyAoMSB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMSwgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgTG9uZ3VldXINCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMiA8LSBsbWVyKEYybWlkbm9yIH4gTG9uZ3VldXIgKyBUaW1icmUgKyBEZWJpdCArIFNleCArIChMb25ndWV1ciB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMSwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIFRpbWJyZQ0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4zIDwtIGxtZXIoRjJtaWRub3IgfiBMb25ndWV1ciArIFRpbWJyZSArIERlYml0ICsgU2V4ICsgKFRpbWJyZSB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMSwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIERlYml0DQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjQgPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICsgVGltYnJlICsgRGViaXQgKyBTZXggKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjEsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBMb25ndWV1ciBhbmQgVGltYnJlDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC41IDwtIGxtZXIoRjJtaWRub3IgfiBMb25ndWV1ciArIFRpbWJyZSArIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBMb25ndWV1ciBhbmQgRGViaXQNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjYgPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICsgVGltYnJlICsgRGViaXQgKyBTZXggKyAoTG9uZ3VldXIgfCBTcGVha2VyKSArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMSwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBUaW1icmUgYW5kIERlYml0DQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC43IDwtIGxtZXIoRjJtaWRub3IgfiBMb25ndWV1ciArIFRpbWJyZSArIERlYml0ICsgU2V4ICsgKFRpbWJyZSB8IFNwZWFrZXIpICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBMb25ndWV1ciwgVGltYnJlIGFuZCBEZWJpdA0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuOCA8LSBsbWVyKEYybWlkbm9yIH4gTG9uZ3VldXIgKyBUaW1icmUgKyBEZWJpdCArIFNleCArIChMb25ndWV1ciB8IFNwZWFrZXIpICsgKFRpbWJyZSB8IFNwZWFrZXIpICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjkgPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICogVGltYnJlICogRGViaXQgKyBTZXggKyAoMSB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMSwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgTG9uZ3VldXINCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMTAgPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICogVGltYnJlICogRGViaXQgKyBTZXggKyAoTG9uZ3VldXIgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjEsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gc2xvcGVzIGZvciBUaW1icmUNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMTEgPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICogVGltYnJlICogRGViaXQgKyBTZXggKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gc2xvcGVzIGZvciBEZWJpdA0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xMiA8LSBsbWVyKEYybWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMSwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgTG9uZ3VldXIgYnkgVGltYnJlIA0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xMyA8LSBsbWVyKEYybWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArIChMb25ndWV1ciB8IFNwZWFrZXIpICsgKFRpbWJyZSB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMSwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gc2xvcGVzIGZvciBMb25ndWV1ciBieSBEZWJpdCANCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMTQgPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICogVGltYnJlICogRGViaXQgKyBTZXggKyAoTG9uZ3VldXIgfCBTcGVha2VyKSArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMSwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gc2xvcGVzIGZvciBUaW1icmUgYnkgRGViaXQgDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjE1IDwtIGxtZXIoRjJtaWRub3IgfiBMb25ndWV1ciAqIFRpbWJyZSAqIERlYml0ICsgU2V4ICsgKFRpbWJyZSB8IFNwZWFrZXIpICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgTG9uZ3VldXIgYnkgVGltYnJlIGJ5IERlYml0IA0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xNiA8LSBsbWVyKEYybWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArIChMb25ndWV1ciB8IFNwZWFrZXIpICsgKFRpbWJyZSB8IFNwZWFrZXIpICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIxLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KDQojIyMgTW9kZWwgY29tcGFyaXNvbg0KDQojIyMjIEFsbA0KDQoNCmBgYHtyfQ0KYW5vdmEobG0ubW9kLjEsIGxtLm1vZC4yLCBsbS5tb2QuMywgbG0ubW9kLjQsIGxtLm1vZC41LCBsbS5tb2QuNiwgbG0ubW9kLjcsIGxtLm1vZC44LCBsbS5tb2QuOSwgbG0ubW9kLjEwLCBsbS5tb2QuMTEsIGxtLm1vZC4xMiwgbG0ubW9kLjEzLCBsbS5tb2QuMTQsIGxtLm1vZC4xNSwgbG0ubW9kLjE2KQ0KYGBgDQoNCg0KQWNjb3JkaW5nIHRvIG1vZGVsIGNvbXBhcmlzb24sIG1vZGVsIDE2IGltcHJvdmVkIHRoZSBtb2RlbCBmaXQuIE91dCBvZiBhbGwgbW9kZWxzLCBtb2RlbHMgNiwgNywgOCwgMTMsIDE1IGFuZCAxNiBoYWQgc2luZ3VsYXJpdHkgYW5kL29yIGNvbnZlcmdlbmNlIGlzc3Vlcy4gSGVuY2Ugd2UgcmVydW4gb3VyIG1vZGVsIGNvbXBhcmlzb24gcmV0YWluaW5nIG9ubHkgdGhlIG1vZGVscyB0aGF0IGNvbnZlcmdlZCBhbmQgd2hpY2ggZGlkIG5vdCBoYXZlIGFueSBpc3N1ZXMuIA0KDQoNCkhvd2V2ZXIsIGJvdGggc2hvd2VkIHNpbmd1bGFyaXR5IGFuZCBjb252ZXJnZW5jZSBpc3N1ZXMuDQoNCiMjIyMgTW9kZWxzIHdpdGggbm8gaXNzdWVzDQoNCg0KYGBge3J9DQphbm92YShsbS5tb2QuMSwgbG0ubW9kLjIsIGxtLm1vZC4zLCBsbS5tb2QuNCwgbG0ubW9kLjUsIGxtLm1vZC45LCBsbS5tb2QuMTAsIGxtLm1vZC4xMSwgbG0ubW9kLjEyLCBsbS5tb2QuMTQpDQpgYGANCg0KDQogSGVuY2UsIHdlIHVzZSBtb2RlbCAxNCdzIHNwZWNpZmljYXRpb25zIGFzIG91ciBvcHRpbWFsIG1vZGVsIGdpdmVuIHRoYXQgdGhpcyBpcyB0aGUgYmVzdCBtb2RlbCB3aXRoIG5vIHNpbmd1bGFyaXR5IG9yIGNvbnZlcmdlbmNlIGlzc3Vlcy4gV2UgcmVydW4gdGhlIG1vZGVsIHdpdGggYSBSZXN0cmljdGVkIE1heGltdW0gTGlrZWxpaG9vZCAoUkVNTCkNCg0KDQoNCg0KDQojIyBPcHRpbWFsIG1vZGVsIHJhbiB3aXRoIFJFTUwgDQoNCg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC5PcHRpbWFsIDwtIHVwZGF0ZShsbS5tb2QuMTQsIFJFTUwgPSBUUlVFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCk1vZGVsIDE0IHJlY2VpdmVkIGNvbnZlcmdlbmNlIGlzc3Vlcy4gSGVuY2Ugd2UgcmVydW4gdGhlIGFuYWx5c2lzIHdpdGggbW9kZWwgMTF0aCBzcGVjaWZpY2F0aW9ucyBhcyBvdXIgb3B0aW1hbCBtb2RlbC4NCg0KDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLk9wdGltYWwgPC0gdXBkYXRlKGxtLm1vZC4xMSwgUkVNTCA9IFRSVUUpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQpgYGB7cn0NCnNhdmVSRFMobG0ubW9kLk9wdGltYWwsICJsbS5tb2QuT3B0aW1hbC5GMm1pZG5vclRpbWJyZVN1Yi5SZHMiKQ0KbG0ubW9kLk9wdGltYWwgPC0gcmVhZFJEUygibG0ubW9kLk9wdGltYWwuRjJtaWRub3JUaW1icmVTdWIuUmRzIikNCmBgYA0KDQoNCg0KDQoNCiMgRjFtaWRub3IgLSBTdWJzZXQgMiAtIFRpbWJyZQ0KDQojIyBNb2RlbGxpbmcgDQoNCk91ciBhaW0gaGVyZSBpcyB0byBtb2RlbCB0aGUgZGF0YSB1c2luZyB2YXJpb3VzIG1vZGVsIHNwZWNpZmljYXRpb24gdG8gb2J0YWluIG91ciBvcHRpbWFsIG1vZGVsLiBXZSBzdGFydCB3aXRoIGVhc3kgdG8gbW9yZSBjb21wbGV4IG1vZGVsbGluZyBzdHJhdGVnaWVzIA0KDQoNCiMjIyBObyBSRU1MIChNTCkNCg0KV2Ugc3RhcnQgYnkgdXNpbmcgYSBNYXhpbXVtIExpa2VsaWhvb2QgbW9kZWwgdG8gYWxsb3cgZm9yIG1vZGVsIGNvbXBhcmlzb24NCg0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMSA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKyBUaW1icmUgKyBEZWJpdCArIFNleCArICgxIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIyLCBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBMb25ndWV1cg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4yIDwtIGxtZXIoRjFtaWRub3IgfiBMb25ndWV1ciArIFRpbWJyZSArIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIyLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgVGltYnJlDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjMgPC0gbG1lcihGMW1pZG5vciB+IExvbmd1ZXVyICsgVGltYnJlICsgRGViaXQgKyBTZXggKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIyLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgRGViaXQNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNCA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKyBUaW1icmUgKyBEZWJpdCArIFNleCArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMiwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIExvbmd1ZXVyIGFuZCBUaW1icmUNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjUgPC0gbG1lcihGMW1pZG5vciB+IExvbmd1ZXVyICsgVGltYnJlICsgRGViaXQgKyBTZXggKyAoTG9uZ3VldXIgfCBTcGVha2VyKSArIChUaW1icmUgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIExvbmd1ZXVyIGFuZCBEZWJpdA0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNiA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKyBUaW1icmUgKyBEZWJpdCArIFNleCArIChMb25ndWV1ciB8IFNwZWFrZXIpICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIyLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIFRpbWJyZSBhbmQgRGViaXQNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjcgPC0gbG1lcihGMW1pZG5vciB+IExvbmd1ZXVyICsgVGltYnJlICsgRGViaXQgKyBTZXggKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIExvbmd1ZXVyLCBUaW1icmUgYW5kIERlYml0DQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC44IDwtIGxtZXIoRjFtaWRub3IgfiBMb25ndWV1ciArIFRpbWJyZSArIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuOSA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArICgxIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIyLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gc2xvcGVzIGZvciBMb25ndWV1cg0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xMCA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArIChMb25ndWV1ciB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMiwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIFRpbWJyZQ0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xMSA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArIChUaW1icmUgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIERlYml0DQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjEyIDwtIGxtZXIoRjFtaWRub3IgfiBMb25ndWV1ciAqIFRpbWJyZSAqIERlYml0ICsgU2V4ICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIyLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gc2xvcGVzIGZvciBMb25ndWV1ciBieSBUaW1icmUgDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjEzIDwtIGxtZXIoRjFtaWRub3IgfiBMb25ndWV1ciAqIFRpbWJyZSAqIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIyLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIExvbmd1ZXVyIGJ5IERlYml0IA0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xNCA8LSBsbWVyKEYxbWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArIChMb25ndWV1ciB8IFNwZWFrZXIpICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIyLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIFRpbWJyZSBieSBEZWJpdCANCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMTUgPC0gbG1lcihGMW1pZG5vciB+IExvbmd1ZXVyICogVGltYnJlICogRGViaXQgKyBTZXggKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gc2xvcGVzIGZvciBMb25ndWV1ciBieSBUaW1icmUgYnkgRGViaXQgDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjE2IDwtIGxtZXIoRjFtaWRub3IgfiBMb25ndWV1ciAqIFRpbWJyZSAqIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoVGltYnJlIHwgU3BlYWtlcikgKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQoNCiMjIyBNb2RlbCBjb21wYXJpc29uDQoNCiMjIyMgQWxsDQoNCg0KYGBge3J9DQphbm92YShsbS5tb2QuMSwgbG0ubW9kLjIsIGxtLm1vZC4zLCBsbS5tb2QuNCwgbG0ubW9kLjUsIGxtLm1vZC42LCBsbS5tb2QuNywgbG0ubW9kLjgsIGxtLm1vZC45LCBsbS5tb2QuMTAsIGxtLm1vZC4xMSwgbG0ubW9kLjEyLCBsbS5tb2QuMTMsIGxtLm1vZC4xNCwgbG0ubW9kLjE1LCBsbS5tb2QuMTYpDQpgYGANCg0KDQpBY2NvcmRpbmcgdG8gbW9kZWwgY29tcGFyaXNvbiwgbW9kZWxzIDE2IGltcHJvdmVkIHRoZSBtb2RlbCBmaXQuIE91dCBvZiBhbGwgbW9kZWxzLCBtb2RlbHMgNiwgNywgOCwgMTMgYW5kIDE2IGhhZCBzaW5ndWxhcml0eSBhbmQvb3IgY29udmVyZ2VuY2UgaXNzdWVzLiBIZW5jZSB3ZSByZXJ1biBvdXIgbW9kZWwgY29tcGFyaXNvbiByZXRhaW5pbmcgb25seSB0aGUgbW9kZWxzIHRoYXQgY29udmVyZ2VkIGFuZCB3aGljaCBkaWQgbm90IGhhdmUgYW55IGlzc3Vlcy4NCiMjIyMgTW9kZWxzIHdpdGggbm8gaXNzdWVzDQoNCg0KYGBge3J9DQphbm92YShsbS5tb2QuMSwgbG0ubW9kLjIsIGxtLm1vZC4zLCBsbS5tb2QuNCwgbG0ubW9kLjUsIGxtLm1vZC45LCBsbS5tb2QuMTAsIGxtLm1vZC4xMSwgbG0ubW9kLjEyLCBsbS5tb2QuMTQsIGxtLm1vZC4xNSkNCmBgYA0KDQoNCkhlbmNlLCB3ZSB1c2UgbW9kZWwgMTUncyBzcGVjaWZpY2F0aW9ucyBhcyBvdXIgb3B0aW1hbCBtb2RlbCBnaXZlbiB0aGF0IHRoaXMgaXMgdGhlIGJlc3QgbW9kZWwgd2l0aCBubyBzaW5ndWxhcml0eSBvciBjb252ZXJnZW5jZSBpc3N1ZXMuIFdlIHJlcnVuIHRoZSBtb2RlbCB3aXRoIGEgUmVzdHJpY3RlZCBNYXhpbXVtIExpa2VsaWhvb2QgKFJFTUwpDQoNCg0KDQoNCiMjIE9wdGltYWwgbW9kZWwgcmFuIHdpdGggUkVNTCANCg0KDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLk9wdGltYWwgPC0gdXBkYXRlKGxtLm1vZC4xNSwgUkVNTCA9IFRSVUUpDQp0b2MoKSAjIA0KYGBgDQoNCg0KSG93ZXZlciwgbW9kZWwgMTUgcmVjZWl2ZWQgYSBjb252ZXJnZW5jZSBpc3N1ZS4gSGVuY2Ugd2UgcmVydW4gdGhlIGFuYWx5c2lzIHdpdGggbW9kZWwgMTR0aCBzcGVjaWZpY2F0aW9ucyBhcyBvdXIgb3B0aW1hbCBtb2RlbC4NCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuT3B0aW1hbCA8LSB1cGRhdGUobG0ubW9kLjE0LCBSRU1MID0gVFJVRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCg0KDQpgYGB7cn0NCnNhdmVSRFMobG0ubW9kLk9wdGltYWwsICJsbS5tb2QuT3B0aW1hbC5GMW1pZG5vclRpbWJyZVN1YjIuUmRzIikNCmxtLm1vZC5PcHRpbWFsIDwtIHJlYWRSRFMoImxtLm1vZC5PcHRpbWFsLkYxbWlkbm9yVGltYnJlU3ViMi5SZHMiKQ0KYGBgDQoNCg0KIyBGMm1pZG5vciAtIFN1YnNldCAyIC0gVGltYnJlDQoNCiMjIE1vZGVsbGluZyANCg0KT3VyIGFpbSBoZXJlIGlzIHRvIG1vZGVsIHRoZSBkYXRhIHVzaW5nIHZhcmlvdXMgbW9kZWwgc3BlY2lmaWNhdGlvbiB0byBvYnRhaW4gb3VyIG9wdGltYWwgbW9kZWwuIFdlIHN0YXJ0IHdpdGggZWFzeSB0byBtb3JlIGNvbXBsZXggbW9kZWxsaW5nIHN0cmF0ZWdpZXMgDQoNCg0KIyMjIE5vIFJFTUwgKE1MKQ0KDQpXZSBzdGFydCBieSB1c2luZyBhIE1heGltdW0gTGlrZWxpaG9vZCBtb2RlbCB0byBhbGxvdyBmb3IgbW9kZWwgY29tcGFyaXNvbg0KDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cw0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xIDwtIGxtZXIoRjJtaWRub3IgfiBMb25ndWV1ciArIFRpbWJyZSArIERlYml0ICsgU2V4ICsgKDEgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIFNpbXBsZSBtb2RlbCB3aXRoIHJhbmRvbSBpbnRlcmNlcHRzIGFuZCBzbG9wZXMgZm9yIExvbmd1ZXVyDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjIgPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICsgVGltYnJlICsgRGViaXQgKyBTZXggKyAoTG9uZ3VldXIgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBUaW1icmUNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMyA8LSBsbWVyKEYybWlkbm9yIH4gTG9uZ3VldXIgKyBUaW1icmUgKyBEZWJpdCArIFNleCArIChUaW1icmUgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBTaW1wbGUgbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cyBhbmQgc2xvcGVzIGZvciBEZWJpdA0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC40IDwtIGxtZXIoRjJtaWRub3IgfiBMb25ndWV1ciArIFRpbWJyZSArIERlYml0ICsgU2V4ICsgKERlYml0IHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIyLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgTG9uZ3VldXIgYW5kIFRpbWJyZQ0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNSA8LSBsbWVyKEYybWlkbm9yIH4gTG9uZ3VldXIgKyBUaW1icmUgKyBEZWJpdCArIFNleCArIChMb25ndWV1ciB8IFNwZWFrZXIpICsgKFRpbWJyZSB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMiwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgTG9uZ3VldXIgYW5kIERlYml0DQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC42IDwtIGxtZXIoRjJtaWRub3IgfiBMb25ndWV1ciArIFRpbWJyZSArIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgVGltYnJlIGFuZCBEZWJpdA0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuNyA8LSBsbWVyKEYybWlkbm9yIH4gTG9uZ3VldXIgKyBUaW1icmUgKyBEZWJpdCArIFNleCArIChUaW1icmUgfCBTcGVha2VyKSArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMiwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCiMjIyMgU2ltcGxlIG1vZGVsIHdpdGggcmFuZG9tIGludGVyY2VwdHMgYW5kIHNsb3BlcyBmb3IgTG9uZ3VldXIsIFRpbWJyZSBhbmQgRGViaXQNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjggPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICsgVGltYnJlICsgRGViaXQgKyBTZXggKyAoTG9uZ3VldXIgfCBTcGVha2VyKSArIChUaW1icmUgfCBTcGVha2VyKSArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMiwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCiMjIyMgSW50ZXJhY3Rpb24gbW9kZWwgd2l0aCByYW5kb20gaW50ZXJjZXB0cw0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC45IDwtIGxtZXIoRjJtaWRub3IgfiBMb25ndWV1ciAqIFRpbWJyZSAqIERlYml0ICsgU2V4ICsgKDEgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIExvbmd1ZXVyDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjEwIDwtIGxtZXIoRjJtaWRub3IgfiBMb25ndWV1ciAqIFRpbWJyZSAqIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoMSB8IFdvcmQpLCBBcmFiaWNTdWIyLA0KICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZXJDb250cm9sKG9wdGltaXplciA9ICJib2J5cWEiLCBvcHRDdHJsID0gbGlzdChtYXhmdW4gPSAyZTUpKSwgUkVNTCA9IEZBTFNFKQ0KdG9jKCkgIyANCmBgYA0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgVGltYnJlDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjExIDwtIGxtZXIoRjJtaWRub3IgfiBMb25ndWV1ciAqIFRpbWJyZSAqIERlYml0ICsgU2V4ICsgKFRpbWJyZSB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMiwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgRGViaXQNCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMTIgPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICogVGltYnJlICogRGViaXQgKyBTZXggKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIExvbmd1ZXVyIGJ5IFRpbWJyZSANCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMTMgPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICogVGltYnJlICogRGViaXQgKyBTZXggKyAoTG9uZ3VldXIgfCBTcGVha2VyKSArIChUaW1icmUgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgTG9uZ3VldXIgYnkgRGViaXQgDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLjE0IDwtIGxtZXIoRjJtaWRub3IgfiBMb25ndWV1ciAqIFRpbWJyZSAqIERlYml0ICsgU2V4ICsgKExvbmd1ZXVyIHwgU3BlYWtlcikgKyAoRGViaXQgfCBTcGVha2VyKSArICgxIHwgV29yZCksIEFyYWJpY1N1YjIsDQogICAgICAgICAgICAgICBjb250cm9sID0gbG1lckNvbnRyb2wob3B0aW1pemVyID0gImJvYnlxYSIsIG9wdEN0cmwgPSBsaXN0KG1heGZ1biA9IDJlNSkpLCBSRU1MID0gRkFMU0UpDQp0b2MoKSAjIA0KYGBgDQoNCg0KDQojIyMjIEludGVyYWN0aW9uIG1vZGVsIHdpdGggcmFuZG9tIHNsb3BlcyBmb3IgVGltYnJlIGJ5IERlYml0IA0KDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC4xNSA8LSBsbWVyKEYybWlkbm9yIH4gTG9uZ3VldXIgKiBUaW1icmUgKiBEZWJpdCArIFNleCArIChUaW1icmUgfCBTcGVha2VyKSArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMiwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCg0KIyMjIyBJbnRlcmFjdGlvbiBtb2RlbCB3aXRoIHJhbmRvbSBzbG9wZXMgZm9yIExvbmd1ZXVyIGJ5IFRpbWJyZSBieSBEZWJpdCANCg0KDQpgYGB7cn0NCnRpYygpDQpsbS5tb2QuMTYgPC0gbG1lcihGMm1pZG5vciB+IExvbmd1ZXVyICogVGltYnJlICogRGViaXQgKyBTZXggKyAoTG9uZ3VldXIgfCBTcGVha2VyKSArIChUaW1icmUgfCBTcGVha2VyKSArIChEZWJpdCB8IFNwZWFrZXIpICsgKDEgfCBXb3JkKSwgQXJhYmljU3ViMiwNCiAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVyQ29udHJvbChvcHRpbWl6ZXIgPSAiYm9ieXFhIiwgb3B0Q3RybCA9IGxpc3QobWF4ZnVuID0gMmU1KSksIFJFTUwgPSBGQUxTRSkNCnRvYygpICMgDQpgYGANCg0KDQoNCg0KIyMjIE1vZGVsIGNvbXBhcmlzb24NCg0KIyMjIyBBbGwNCg0KDQpgYGB7cn0NCmFub3ZhKGxtLm1vZC4xLCBsbS5tb2QuMiwgbG0ubW9kLjMsIGxtLm1vZC40LCBsbS5tb2QuNSwgbG0ubW9kLjYsIGxtLm1vZC43LCBsbS5tb2QuOCwgbG0ubW9kLjksIGxtLm1vZC4xMCwgbG0ubW9kLjExLCBsbS5tb2QuMTIsIGxtLm1vZC4xMywgbG0ubW9kLjE0LCBsbS5tb2QuMTUsIGxtLm1vZC4xNikNCmBgYA0KDQoNCkFjY29yZGluZyB0byBtb2RlbCBjb21wYXJpc29uLCBtb2RlbHMgMTYgaW1wcm92ZWQgdGhlIG1vZGVsIGZpdC4gT3V0IG9mIGFsbCBtb2RlbHMsIG1vZGVscyA1LCA2LCA4LCAxMywgMTQgYW5kIDE2IGhhZCBzaW5ndWxhcml0eSBhbmQvb3IgY29udmVyZ2VuY2UgaXNzdWVzLiBIZW5jZSB3ZSByZXJ1biBvdXIgbW9kZWwgY29tcGFyaXNvbiByZXRhaW5pbmcgb25seSB0aGUgbW9kZWxzIHRoYXQgY29udmVyZ2VkIGFuZCB3aGljaCBkaWQgbm90IGhhdmUgYW55IGlzc3Vlcy4NCg0KIyMjIyBNb2RlbHMgd2l0aCBubyBpc3N1ZXMNCg0KDQpgYGB7cn0NCmFub3ZhKGxtLm1vZC4xLCBsbS5tb2QuMiwgbG0ubW9kLjMsIGxtLm1vZC40LCBsbS5tb2QuNywgbG0ubW9kLjksIGxtLm1vZC4xMCwgbG0ubW9kLjExLCBsbS5tb2QuMTIsIGxtLm1vZC4xNSkNCmBgYA0KDQoNCkhlbmNlLCB3ZSB1c2UgbW9kZWwgMTUncyBzcGVjaWZpY2F0aW9ucyBhcyBvdXIgb3B0aW1hbCBtb2RlbCBnaXZlbiB0aGF0IHRoaXMgaXMgdGhlIGJlc3QgbW9kZWwgd2l0aCBubyBzaW5ndWxhcml0eSBvciBjb252ZXJnZW5jZSBpc3N1ZXMuIFdlIHJlcnVuIHRoZSBtb2RlbCB3aXRoIGEgUmVzdHJpY3RlZCBNYXhpbXVtIExpa2VsaWhvb2QgKFJFTUwpDQoNCg0KDQoNCg0KIyMgT3B0aW1hbCBtb2RlbCByYW4gd2l0aCBSRU1MIA0KDQoNCg0KYGBge3J9DQp0aWMoKQ0KbG0ubW9kLk9wdGltYWwgPC0gdXBkYXRlKGxtLm1vZC4xNSwgUkVNTCA9IFRSVUUpDQp0b2MoKSAjIA0KYGBgDQoNCg0KVGhpcyBtb2RlbCByZWNlaXZlZCBhIGNvbnZlcmdlbmNlIGlzc3VlLiBIZW5jZSB3ZSByZXJ1biB0aGUgYW5hbHlzaXMgd2l0aCBtb2RlbCAxMXRoIHNwZWNpZmljYXRpb25zIGFzIG91ciBvcHRpbWFsIG1vZGVsIGdpdmVuIHRoYXQgbW9kZWwgMTIgZGlkIG5vdCBpbXByb3ZlIHRoZSBtb2RlbCBmaXQuDQoNCmBgYHtyfQ0KdGljKCkNCmxtLm1vZC5PcHRpbWFsIDwtIHVwZGF0ZShsbS5tb2QuMTEsIFJFTUwgPSBUUlVFKQ0KdG9jKCkgIyANCmBgYA0KDQoNCg0KYGBge3J9DQpzYXZlUkRTKGxtLm1vZC5PcHRpbWFsLCAibG0ubW9kLk9wdGltYWwuRjJtaWRub3JUaW1icmVTdWIyLlJkcyIpDQpsbS5tb2QuT3B0aW1hbCA8LSByZWFkUkRTKCJsbS5tb2QuT3B0aW1hbC5GMm1pZG5vclRpbWJyZVN1YjIuUmRzIikNCmBgYA0KDQoNCiMgc2Vzc2lvbiBpbmZvDQoNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIGVycm9yPUZBTFNFfQ0Kc2Vzc2lvbkluZm8oKQ0KYGBgDQo=