Goal

Estimate the main RI-CLPM with lavaan.

Set up and data import

#library
library(tidyverse)
library(lavaan)
library(data.table)
library(doParallel)
library(parallel)

#data
load("results/predicted_means/240816_pred-means-cleaned-df.Rdata")

#extract datafile from pref_results
MyData <- pred_results$df_combined

#create between variables for 
MyData <- MyData %>% 
  rowwise() %>% 
  mutate(between_educ = mean(c_across(cols = matches("^educ_[[:digit:]]{1,2}")),na.rm = T),
         between_age = mean(c_across(cols = matches("^age_[[:digit:]]{1,2}")),na.rm = T),
         between_female = mean(c_across(cols = matches("^female_[[:digit:]]{1,2}")),na.rm = T),
         between_origin = mean(c_across(cols = matches("^origin_[[:digit:]]{1,2}")),na.rm = T)) %>%
  ungroup()

RI-CLPM with biased corrected means

Main effects

Create lavaan model objects

EU integration

EU_model1_unconstrained <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_1 + 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy

  # Set the residual variances of all FX variables to 0. I DONT UNDERSTAND THIS! no measurement error?? 
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11
  
  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_1 =~ 1*eu_1
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_2   ~ weu_1 + wFeduc_a_1
  weu_3   ~ weu_2 + wFeduc_a_2
  weu_4   ~ weu_3 + wFeduc_a_3
  weu_5   ~ weu_4 + wFeduc_a_4
  weu_6   ~ weu_5 + wFeduc_a_5
  weu_7   ~ weu_6 + wFeduc_a_6
  weu_8   ~ weu_7 + wFeduc_a_7
  weu_9   ~ weu_8 + wFeduc_a_8
  weu_10  ~ weu_9 + wFeduc_a_9
  weu_11  ~ weu_10 + wFeduc_a_10
  
  
  wFeduc_a_2  ~ weu_1 + wFeduc_a_1
  wFeduc_a_3  ~ weu_2 + wFeduc_a_2
  wFeduc_a_4  ~ weu_3 + wFeduc_a_3
  wFeduc_a_5  ~ weu_4 + wFeduc_a_4
  wFeduc_a_6  ~ weu_5 + wFeduc_a_5
  wFeduc_a_7  ~ weu_6 + wFeduc_a_6
  wFeduc_a_8  ~ weu_7 + wFeduc_a_7
  wFeduc_a_9  ~ weu_8 + wFeduc_a_8
  wFeduc_a_10  ~ weu_9 + wFeduc_a_9
  wFeduc_a_11  ~ weu_10 + wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  weu_2 ~~ wFeduc_a_2
  weu_3 ~~ wFeduc_a_3
  weu_4 ~~ wFeduc_a_4
  weu_5 ~~ wFeduc_a_5
  weu_6 ~~ wFeduc_a_6
  weu_7 ~~ wFeduc_a_7
  weu_8 ~~ wFeduc_a_8
  weu_9 ~~ wFeduc_a_9
  weu_10 ~~ wFeduc_a_10
  weu_11 ~~ wFeduc_a_11
  
  # Estimate the variance 
  weu_1 ~~ weu_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  weu_2 ~~ weu_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  weu_3 ~~ weu_3
  wFeduc_a_3 ~~ wFeduc_a_3
  weu_4 ~~ weu_4 
  wFeduc_a_4 ~~ wFeduc_a_4
  weu_5 ~~ vy*weu_5
  wFeduc_a_5 ~~ wFeduc_a_5
  weu_6 ~~ weu_6 
  wFeduc_a_6 ~~ wFeduc_a_6
  weu_7 ~~ weu_7 
  wFeduc_a_7 ~~ wFeduc_a_7
  weu_8 ~~ weu_8 
  wFeduc_a_8 ~~ wFeduc_a_8
  weu_9 ~~ weu_9 
  wFeduc_a_9 ~~ wFeduc_a_9
  weu_10 ~~ weu_10 
  wFeduc_a_10 ~~ wFeduc_a_10
  weu_11 ~~ weu_11 
  wFeduc_a_11 ~~ wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*weu_1
  
'
EU_model1_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_1 + 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy

  # Set the residual variances of all FX variables to 0. I DONT UNDERSTAND THIS! no measurement error?? 
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_1 =~ 1*eu_1
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_2   ~ a*weu_1 + b*wFeduc_a_1
  weu_3   ~ a*weu_2 + b*wFeduc_a_2
  weu_4   ~ a*weu_3 + b*wFeduc_a_3
  weu_5   ~ a*weu_4 + b*wFeduc_a_4
  weu_6   ~ a*weu_5 + b*wFeduc_a_5
  weu_7   ~ a*weu_6 + b*wFeduc_a_6
  weu_8   ~ a*weu_7 + b*wFeduc_a_7
  weu_9   ~ a*weu_8 + b*wFeduc_a_8
  weu_10  ~ a*weu_9 + b*wFeduc_a_9
  weu_11  ~ a*weu_10 + b*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c*weu_1 + d*wFeduc_a_1
  wFeduc_a_3  ~ c*weu_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*weu_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*weu_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*weu_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*weu_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*weu_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*weu_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*weu_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*weu_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  weu_2 ~~ cov*wFeduc_a_2
  weu_3 ~~ cov*wFeduc_a_3
  weu_4 ~~ cov*wFeduc_a_4
  weu_5 ~~ cov*wFeduc_a_5
  weu_6 ~~ cov*wFeduc_a_6
  weu_7 ~~ cov*wFeduc_a_7
  weu_8 ~~ cov*wFeduc_a_8
  weu_9 ~~ cov*wFeduc_a_9
  weu_10 ~~ cov*wFeduc_a_10
  weu_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  weu_1 ~~ weu_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  weu_2 ~~ vy*weu_2 
  wFeduc_a_2 ~~ vx*wFeduc_a_2
  weu_3 ~~ vy*weu_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  weu_4 ~~ vy*weu_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  weu_5 ~~ vy*weu_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  weu_6 ~~ vy*weu_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  weu_7 ~~ vy*weu_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  weu_8 ~~ vy*weu_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  weu_9 ~~ vy*weu_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  weu_10 ~~ vy*weu_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  weu_11 ~~ vy*weu_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*weu_1

'

EU_model1_constrained_lag_means <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*eu_1 + 1*eu_2 + 1*eu_3 + 1*eu_4 + 1*eu_5 + 1*eu_6 + 1*eu_7 + 1*eu_8 + 1*eu_9 + 1*eu_10 + 1*eu_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy

  # Set the residual variances of all FX variables to 0. I DONT UNDERSTAND THIS! no measurement error?? 
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  weu_1 =~ 1*eu_1
  weu_2 =~ 1*eu_2
  weu_3 =~ 1*eu_3
  weu_4 =~ 1*eu_4
  weu_5 =~ 1*eu_5
  weu_6 =~ 1*eu_6
  weu_7 =~ 1*eu_7
  weu_8 =~ 1*eu_8
  weu_9 =~ 1*eu_9
  weu_10 =~ 1*eu_10
  weu_11 =~ 1*eu_11 
  
  # Estimate the lagged effects (constrained)
  weu_2   ~ a*weu_1 + b*wFeduc_a_1
  weu_3   ~ a*weu_2 + b*wFeduc_a_2
  weu_4   ~ a*weu_3 + b*wFeduc_a_3
  weu_5   ~ a*weu_4 + b*wFeduc_a_4
  weu_6   ~ a*weu_5 + b*wFeduc_a_5
  weu_7   ~ a*weu_6 + b*wFeduc_a_6
  weu_8   ~ a*weu_7 + b*wFeduc_a_7
  weu_9   ~ a*weu_8 + b*wFeduc_a_8
  weu_10  ~ a*weu_9 + b*wFeduc_a_9
  weu_11  ~ a*weu_10 + b*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c*weu_1 + d*wFeduc_a_1
  wFeduc_a_3  ~ c*weu_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*weu_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*weu_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*weu_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*weu_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*weu_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*weu_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*weu_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*weu_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  weu_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  weu_2 ~~ cov*wFeduc_a_2
  weu_3 ~~ cov*wFeduc_a_3
  weu_4 ~~ cov*wFeduc_a_4
  weu_5 ~~ cov*wFeduc_a_5
  weu_6 ~~ cov*wFeduc_a_6
  weu_7 ~~ cov*wFeduc_a_7
  weu_8 ~~ cov*wFeduc_a_8
  weu_9 ~~ cov*wFeduc_a_9
  weu_10 ~~ cov*wFeduc_a_10
  weu_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  weu_1 ~~ weu_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  weu_2 ~~ vy*weu_2 
  wFeduc_a_2 ~~ vx*wFeduc_a_2
  weu_3 ~~ vy*weu_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  weu_4 ~~ vy*weu_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  weu_5 ~~ vy*weu_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  weu_6 ~~ vy*weu_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  weu_7 ~~ vy*weu_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  weu_8 ~~ vy*weu_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  weu_9 ~~ vy*weu_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  weu_10 ~~ vy*weu_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  weu_11 ~~ vy*weu_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*weu_1
  
  
  #constrain grand means over time
  eu_1 + eu_2 + eu_3 + eu_4 + eu_5 + eu_6 + eu_7 + eu_8 + eu_9 + eu_10 + eu_11 ~ my*1
  
  Feduc_a_1 + Feduc_a_2 + Feduc_a_3 + Feduc_a_4 + Feduc_a_5 + Feduc_a_6 + Feduc_a_7 + Feduc_a_8 + Feduc_a_9 + Feduc_a_10 + Feduc_a_11 ~ mx*1

'

#save model specifications in list
eu_lavaan_models <- list(EU_model1_unconstrained,
     EU_model1_constrained_lag,
     EU_model1_constrained_lag_means
     )

Cultural Inclusion

cult_model1_unconstrained <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_1 + 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy

  # Set the residual variances of all FX variables to 0. I DONT UNDERSTAND THIS! no measurement error?? 
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_1 =~ 1*cult_1
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects
  wcult_2   ~ wcult_1 + wFeduc_a_1
  wcult_3   ~ wcult_2 + wFeduc_a_2
  wcult_4   ~ wcult_3 + wFeduc_a_3
  wcult_5   ~ wcult_4 + wFeduc_a_4
  wcult_6   ~ wcult_5 + wFeduc_a_5
  wcult_7   ~ wcult_6 + wFeduc_a_6
  wcult_8   ~ wcult_7 + wFeduc_a_7
  wcult_9   ~ wcult_8 + wFeduc_a_8
  wcult_10  ~ wcult_9 + wFeduc_a_9
  wcult_11  ~ wcult_10 + wFeduc_a_10
  
  
  wFeduc_a_2  ~ wcult_1 + wFeduc_a_1
  wFeduc_a_3  ~ wcult_2 + wFeduc_a_2
  wFeduc_a_4  ~ wcult_3 + wFeduc_a_3
  wFeduc_a_5  ~ wcult_4 + wFeduc_a_4
  wFeduc_a_6  ~ wcult_5 + wFeduc_a_5
  wFeduc_a_7  ~ wcult_6 + wFeduc_a_6
  wFeduc_a_8  ~ wcult_7 + wFeduc_a_7
  wFeduc_a_9  ~ wcult_8 + wFeduc_a_8
  wFeduc_a_10  ~ wcult_9 + wFeduc_a_9
  wFeduc_a_11  ~ wcult_10 + wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  wcult_2 ~~ wFeduc_a_2
  wcult_3 ~~ wFeduc_a_3
  wcult_4 ~~ wFeduc_a_4
  wcult_5 ~~ wFeduc_a_5
  wcult_6 ~~ wFeduc_a_6
  wcult_7 ~~ wFeduc_a_7
  wcult_8 ~~ wFeduc_a_8
  wcult_9 ~~ wFeduc_a_9
  wcult_10 ~~ wFeduc_a_10
  wcult_11 ~~ wFeduc_a_11
  
  # Estimate the variance 
  wcult_1 ~~ wcult_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  wcult_2 ~~ wcult_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  wcult_3 ~~ wcult_3
  wFeduc_a_3 ~~ wFeduc_a_3
  wcult_4 ~~ wcult_4 
  wFeduc_a_4 ~~ wFeduc_a_4
  wcult_5 ~~ vy*wcult_5
  wFeduc_a_5 ~~ wFeduc_a_5
  wcult_6 ~~ wcult_6 
  wFeduc_a_6 ~~ wFeduc_a_6
  wcult_7 ~~ wcult_7 
  wFeduc_a_7 ~~ wFeduc_a_7
  wcult_8 ~~ wcult_8 
  wFeduc_a_8 ~~ wFeduc_a_8
  wcult_9 ~~ wcult_9 
  wFeduc_a_9 ~~ wFeduc_a_9
  wcult_10 ~~ wcult_10 
  wFeduc_a_10 ~~ wFeduc_a_10
  wcult_11 ~~ wcult_11 
  wFeduc_a_11 ~~ wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*wcult_1
  
'

cult_model1_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_1 + 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy

  # Set the residual variances of all FX variables to 0. I DONT UNDERSTAND THIS! no measurement error?? 
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11

  # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_1 =~ 1*cult_1
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_2   ~ a*wcult_1 + b*wFeduc_a_1
  wcult_3   ~ a*wcult_2 + b*wFeduc_a_2
  wcult_4   ~ a*wcult_3 + b*wFeduc_a_3
  wcult_5   ~ a*wcult_4 + b*wFeduc_a_4
  wcult_6   ~ a*wcult_5 + b*wFeduc_a_5
  wcult_7   ~ a*wcult_6 + b*wFeduc_a_6
  wcult_8   ~ a*wcult_7 + b*wFeduc_a_7
  wcult_9   ~ a*wcult_8 + b*wFeduc_a_8
  wcult_10  ~ a*wcult_9 + b*wFeduc_a_9
  wcult_11  ~ a*wcult_10 + b*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c*wcult_1 + d*wFeduc_a_1
  wFeduc_a_3  ~ c*wcult_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*wcult_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*wcult_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*wcult_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*wcult_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*wcult_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*wcult_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*wcult_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*wcult_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  wcult_2 ~~ cov*wFeduc_a_2
  wcult_3 ~~ cov*wFeduc_a_3
  wcult_4 ~~ cov*wFeduc_a_4
  wcult_5 ~~ cov*wFeduc_a_5
  wcult_6 ~~ cov*wFeduc_a_6
  wcult_7 ~~ cov*wFeduc_a_7
  wcult_8 ~~ cov*wFeduc_a_8
  wcult_9 ~~ cov*wFeduc_a_9
  wcult_10 ~~ cov*wFeduc_a_10
  wcult_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  wcult_1 ~~ wcult_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  wcult_2 ~~ vy*wcult_2 
  wFeduc_a_2 ~~ vx*wFeduc_a_2
  wcult_3 ~~ vy*wcult_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  wcult_4 ~~ vy*wcult_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  wcult_5 ~~ vy*wcult_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  wcult_6 ~~ vy*wcult_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  wcult_7 ~~ vy*wcult_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  wcult_8 ~~ vy*wcult_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  wcult_9 ~~ vy*wcult_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  wcult_10 ~~ vy*wcult_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  wcult_11 ~~ vy*wcult_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*wcult_1

'

cult_model1_constrained_lag_means <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*cult_1 + 1*cult_2 + 1*cult_3 + 1*cult_4 + 1*cult_5 + 1*cult_6 + 1*cult_7 + 1*cult_8 + 1*cult_9 + 1*cult_10 + 1*cult_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy

  # Set the residual variances of all FX variables to 0. I DONT UNDERSTAND THIS! no measurement error?? 
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11
  
    # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  wcult_1 =~ 1*cult_1
  wcult_2 =~ 1*cult_2
  wcult_3 =~ 1*cult_3
  wcult_4 =~ 1*cult_4
  wcult_5 =~ 1*cult_5
  wcult_6 =~ 1*cult_6
  wcult_7 =~ 1*cult_7
  wcult_8 =~ 1*cult_8
  wcult_9 =~ 1*cult_9
  wcult_10 =~ 1*cult_10
  wcult_11 =~ 1*cult_11 
  
  # Estimate the lagged effects (constrained)
  wcult_2   ~ a*wcult_1 + b*wFeduc_a_1
  wcult_3   ~ a*wcult_2 + b*wFeduc_a_2
  wcult_4   ~ a*wcult_3 + b*wFeduc_a_3
  wcult_5   ~ a*wcult_4 + b*wFeduc_a_4
  wcult_6   ~ a*wcult_5 + b*wFeduc_a_5
  wcult_7   ~ a*wcult_6 + b*wFeduc_a_6
  wcult_8   ~ a*wcult_7 + b*wFeduc_a_7
  wcult_9   ~ a*wcult_8 + b*wFeduc_a_8
  wcult_10  ~ a*wcult_9 + b*wFeduc_a_9
  wcult_11  ~ a*wcult_10 + b*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c*wcult_1 + d*wFeduc_a_1
  wFeduc_a_3  ~ c*wcult_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*wcult_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*wcult_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*wcult_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*wcult_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*wcult_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*wcult_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*wcult_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*wcult_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  wcult_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  wcult_2 ~~ cov*wFeduc_a_2
  wcult_3 ~~ cov*wFeduc_a_3
  wcult_4 ~~ cov*wFeduc_a_4
  wcult_5 ~~ cov*wFeduc_a_5
  wcult_6 ~~ cov*wFeduc_a_6
  wcult_7 ~~ cov*wFeduc_a_7
  wcult_8 ~~ cov*wFeduc_a_8
  wcult_9 ~~ cov*wFeduc_a_9
  wcult_10 ~~ cov*wFeduc_a_10
  wcult_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  wcult_1 ~~ wcult_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  wcult_2 ~~ vy*wcult_2 
  wFeduc_a_2 ~~ vx*wFeduc_a_2
  wcult_3 ~~ vy*wcult_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  wcult_4 ~~ vy*wcult_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  wcult_5 ~~ vy*wcult_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  wcult_6 ~~ vy*wcult_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  wcult_7 ~~ vy*wcult_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  wcult_8 ~~ vy*wcult_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  wcult_9 ~~ vy*wcult_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  wcult_10 ~~ vy*wcult_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  wcult_11 ~~ vy*wcult_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*wcult_1
  
  
  #constrain grand means over time
  cult_1 + cult_2 + cult_3 + cult_4 + cult_5 + cult_6 + cult_7 + cult_8 + cult_9 + cult_10 + cult_11 ~ my*1
  
  Feduc_a_1 + Feduc_a_2 + Feduc_a_3 + Feduc_a_4 + Feduc_a_5 + Feduc_a_6 + Feduc_a_7 + Feduc_a_8 + Feduc_a_9 + Feduc_a_10 + Feduc_a_11 ~ mx*1

'



#save model specifications in list
cult_lavaan_models <- list(cult_model1_unconstrained,
     cult_model1_constrained_lag,
     cult_model1_constrained_lag_means
     )

Income Differences

inc_diff_model1_unconstrained <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_1 + 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy

  # Set the residual variances of all FX variables to 0. I DONT UNDERSTAND THIS! no measurement error?? 
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11
  
    # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_1 =~ 1*inc_diff_1
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_2   ~ winc_diff_1 + wFeduc_a_1
  winc_diff_3   ~ winc_diff_2 + wFeduc_a_2
  winc_diff_4   ~ winc_diff_3 + wFeduc_a_3
  winc_diff_5   ~ winc_diff_4 + wFeduc_a_4
  winc_diff_6   ~ winc_diff_5 + wFeduc_a_5
  winc_diff_7   ~ winc_diff_6 + wFeduc_a_6
  winc_diff_8   ~ winc_diff_7 + wFeduc_a_7
  winc_diff_9   ~ winc_diff_8 + wFeduc_a_8
  winc_diff_10  ~ winc_diff_9 + wFeduc_a_9
  winc_diff_11  ~ winc_diff_10 + wFeduc_a_10
  
  
  wFeduc_a_2  ~ winc_diff_1 + wFeduc_a_1
  wFeduc_a_3  ~ winc_diff_2 + wFeduc_a_2
  wFeduc_a_4  ~ winc_diff_3 + wFeduc_a_3
  wFeduc_a_5  ~ winc_diff_4 + wFeduc_a_4
  wFeduc_a_6  ~ winc_diff_5 + wFeduc_a_5
  wFeduc_a_7  ~ winc_diff_6 + wFeduc_a_6
  wFeduc_a_8  ~ winc_diff_7 + wFeduc_a_7
  wFeduc_a_9  ~ winc_diff_8 + wFeduc_a_8
  wFeduc_a_10  ~ winc_diff_9 + wFeduc_a_9
  wFeduc_a_11  ~ winc_diff_10 + wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  winc_diff_2 ~~ wFeduc_a_2
  winc_diff_3 ~~ wFeduc_a_3
  winc_diff_4 ~~ wFeduc_a_4
  winc_diff_5 ~~ wFeduc_a_5
  winc_diff_6 ~~ wFeduc_a_6
  winc_diff_7 ~~ wFeduc_a_7
  winc_diff_8 ~~ wFeduc_a_8
  winc_diff_9 ~~ wFeduc_a_9
  winc_diff_10 ~~ wFeduc_a_10
  winc_diff_11 ~~ wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_1 ~~ winc_diff_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  winc_diff_2 ~~ winc_diff_2 
  wFeduc_a_2 ~~ wFeduc_a_2
  winc_diff_3 ~~ winc_diff_3
  wFeduc_a_3 ~~ wFeduc_a_3
  winc_diff_4 ~~ winc_diff_4 
  wFeduc_a_4 ~~ wFeduc_a_4
  winc_diff_5 ~~ vy*winc_diff_5
  wFeduc_a_5 ~~ wFeduc_a_5
  winc_diff_6 ~~ winc_diff_6 
  wFeduc_a_6 ~~ wFeduc_a_6
  winc_diff_7 ~~ winc_diff_7 
  wFeduc_a_7 ~~ wFeduc_a_7
  winc_diff_8 ~~ winc_diff_8 
  wFeduc_a_8 ~~ wFeduc_a_8
  winc_diff_9 ~~ winc_diff_9 
  wFeduc_a_9 ~~ wFeduc_a_9
  winc_diff_10 ~~ winc_diff_10 
  wFeduc_a_10 ~~ wFeduc_a_10
  winc_diff_11 ~~ winc_diff_11 
  wFeduc_a_11 ~~ wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*winc_diff_1
  
'

inc_diff_model1_constrained_lag <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_1 + 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy

  # Set the residual variances of all FX variables to 0. I DONT UNDERSTAND THIS! no measurement error?? 
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11
  
    # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_1 =~ 1*inc_diff_1
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_2   ~ a*winc_diff_1 + b*wFeduc_a_1
  winc_diff_3   ~ a*winc_diff_2 + b*wFeduc_a_2
  winc_diff_4   ~ a*winc_diff_3 + b*wFeduc_a_3
  winc_diff_5   ~ a*winc_diff_4 + b*wFeduc_a_4
  winc_diff_6   ~ a*winc_diff_5 + b*wFeduc_a_5
  winc_diff_7   ~ a*winc_diff_6 + b*wFeduc_a_6
  winc_diff_8   ~ a*winc_diff_7 + b*wFeduc_a_7
  winc_diff_9   ~ a*winc_diff_8 + b*wFeduc_a_8
  winc_diff_10  ~ a*winc_diff_9 + b*wFeduc_a_9
  winc_diff_11  ~ a*winc_diff_10 + b*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c*winc_diff_1 + d*wFeduc_a_1
  wFeduc_a_3  ~ c*winc_diff_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*winc_diff_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*winc_diff_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*winc_diff_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*winc_diff_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*winc_diff_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*winc_diff_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*winc_diff_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*winc_diff_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  winc_diff_2 ~~ cov*wFeduc_a_2
  winc_diff_3 ~~ cov*wFeduc_a_3
  winc_diff_4 ~~ cov*wFeduc_a_4
  winc_diff_5 ~~ cov*wFeduc_a_5
  winc_diff_6 ~~ cov*wFeduc_a_6
  winc_diff_7 ~~ cov*wFeduc_a_7
  winc_diff_8 ~~ cov*wFeduc_a_8
  winc_diff_9 ~~ cov*wFeduc_a_9
  winc_diff_10 ~~ cov*wFeduc_a_10
  winc_diff_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_1 ~~ winc_diff_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  winc_diff_2 ~~ vy*winc_diff_2 
  wFeduc_a_2 ~~ vx*wFeduc_a_2
  winc_diff_3 ~~ vy*winc_diff_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  winc_diff_4 ~~ vy*winc_diff_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  winc_diff_5 ~~ vy*winc_diff_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  winc_diff_6 ~~ vy*winc_diff_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  winc_diff_7 ~~ vy*winc_diff_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  winc_diff_8 ~~ vy*winc_diff_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  winc_diff_9 ~~ vy*winc_diff_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  winc_diff_10 ~~ vy*winc_diff_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  winc_diff_11 ~~ vy*winc_diff_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*winc_diff_1

'

inc_diff_model1_constrained_lag_means <- '

  ################
  # BETWEEN PART #
  ###############

  # Create between components (random intercepts)
  RIx =~ 1* Feduc_a_1 + 1* Feduc_a_2 + 1*Feduc_a_3 + 1*Feduc_a_4 + 1*Feduc_a_5 + 1*Feduc_a_6 + 1*Feduc_a_7 + 1*Feduc_a_8 + 1*Feduc_a_9 + 1*Feduc_a_10 + 1*Feduc_a_11
  RIy =~  1*inc_diff_1 + 1*inc_diff_2 + 1*inc_diff_3 + 1*inc_diff_4 + 1*inc_diff_5 + 1*inc_diff_6 + 1*inc_diff_7 + 1*inc_diff_8 + 1*inc_diff_9 + 1*inc_diff_10 + 1*inc_diff_11

  # Estimate the variance and covariance of the random intercepts. 
  RIx ~~ RIx
  RIy ~~ RIy
  RIx ~~ RIy

  # Set the residual variances of all FX variables to 0. I DONT UNDERSTAND THIS! no measurement error?? 
  Feduc_a_1 ~~ 0*Feduc_a_1
  Feduc_a_2 ~~ 0*Feduc_a_2
  Feduc_a_3 ~~ 0*Feduc_a_3
  Feduc_a_4 ~~ 0*Feduc_a_4
  Feduc_a_5 ~~ 0*Feduc_a_5
  Feduc_a_6 ~~ 0*Feduc_a_6
  Feduc_a_7 ~~ 0*Feduc_a_7
  Feduc_a_8 ~~ 0*Feduc_a_8
  Feduc_a_9 ~~ 0*Feduc_a_9
  Feduc_a_10 ~~ 0*Feduc_a_10
  Feduc_a_11 ~~ 0*Feduc_a_11
  
    # Regression of random intercepts on z1
  RIx + RIy ~ between_educ + between_age + between_origin + between_female# Constrained over time.

  ###############
  # WITHIN PART #
  ###############

   # Create within-person centered variables. 
  wFeduc_a_1 =~ 1*Feduc_a_1
  wFeduc_a_2 =~ 1*Feduc_a_2
  wFeduc_a_3 =~ 1*Feduc_a_3
  wFeduc_a_4 =~ 1*Feduc_a_4
  wFeduc_a_5 =~ 1*Feduc_a_5
  wFeduc_a_6 =~ 1*Feduc_a_6
  wFeduc_a_7 =~ 1*Feduc_a_7
  wFeduc_a_8 =~ 1*Feduc_a_8
  wFeduc_a_9 =~ 1*Feduc_a_9
  wFeduc_a_10 =~ 1*Feduc_a_10
  wFeduc_a_11 =~ 1*Feduc_a_11
  winc_diff_1 =~ 1*inc_diff_1
  winc_diff_2 =~ 1*inc_diff_2
  winc_diff_3 =~ 1*inc_diff_3
  winc_diff_4 =~ 1*inc_diff_4
  winc_diff_5 =~ 1*inc_diff_5
  winc_diff_6 =~ 1*inc_diff_6
  winc_diff_7 =~ 1*inc_diff_7
  winc_diff_8 =~ 1*inc_diff_8
  winc_diff_9 =~ 1*inc_diff_9
  winc_diff_10 =~ 1*inc_diff_10
  winc_diff_11 =~ 1*inc_diff_11 
  
  # Estimate the lagged effects (constrained)
  winc_diff_2   ~ a*winc_diff_1 + b*wFeduc_a_1
  winc_diff_3   ~ a*winc_diff_2 + b*wFeduc_a_2
  winc_diff_4   ~ a*winc_diff_3 + b*wFeduc_a_3
  winc_diff_5   ~ a*winc_diff_4 + b*wFeduc_a_4
  winc_diff_6   ~ a*winc_diff_5 + b*wFeduc_a_5
  winc_diff_7   ~ a*winc_diff_6 + b*wFeduc_a_6
  winc_diff_8   ~ a*winc_diff_7 + b*wFeduc_a_7
  winc_diff_9   ~ a*winc_diff_8 + b*wFeduc_a_8
  winc_diff_10  ~ a*winc_diff_9 + b*wFeduc_a_9
  winc_diff_11  ~ a*winc_diff_10 + b*wFeduc_a_10
  
  
  wFeduc_a_2  ~ c*winc_diff_1 + d*wFeduc_a_1
  wFeduc_a_3  ~ c*winc_diff_2 + d*wFeduc_a_2
  wFeduc_a_4  ~ c*winc_diff_3 + d*wFeduc_a_3
  wFeduc_a_5  ~ c*winc_diff_4 + d*wFeduc_a_4
  wFeduc_a_6  ~ c*winc_diff_5 + d*wFeduc_a_5
  wFeduc_a_7  ~ c*winc_diff_6 + d*wFeduc_a_6
  wFeduc_a_8  ~ c*winc_diff_7 + d*wFeduc_a_7
  wFeduc_a_9  ~ c*winc_diff_8 + d*wFeduc_a_8
  wFeduc_a_10  ~ c*winc_diff_9 + d*wFeduc_a_9
  wFeduc_a_11  ~ c*winc_diff_10 + d*wFeduc_a_10
  
  # Estimate the covariance at the first wave. 
  winc_diff_1 ~~ wFeduc_a_1 # Covariance

  # Estimate the covariances between the residuals
  winc_diff_2 ~~ cov*wFeduc_a_2
  winc_diff_3 ~~ cov*wFeduc_a_3
  winc_diff_4 ~~ cov*wFeduc_a_4
  winc_diff_5 ~~ cov*wFeduc_a_5
  winc_diff_6 ~~ cov*wFeduc_a_6
  winc_diff_7 ~~ cov*wFeduc_a_7
  winc_diff_8 ~~ cov*wFeduc_a_8
  winc_diff_9 ~~ cov*wFeduc_a_9
  winc_diff_10 ~~ cov*wFeduc_a_10
  winc_diff_11 ~~ cov*wFeduc_a_11
  
  # Estimate the variance 
  winc_diff_1 ~~ winc_diff_1 
  wFeduc_a_1 ~~ wFeduc_a_1
  
  # Estimate the residual variance
  winc_diff_2 ~~ vy*winc_diff_2 
  wFeduc_a_2 ~~ vx*wFeduc_a_2
  winc_diff_3 ~~ vy*winc_diff_3
  wFeduc_a_3 ~~ vx*wFeduc_a_3
  winc_diff_4 ~~ vy*winc_diff_4 
  wFeduc_a_4 ~~ vx*wFeduc_a_4
  winc_diff_5 ~~ vy*winc_diff_5
  wFeduc_a_5 ~~ vx*wFeduc_a_5
  winc_diff_6 ~~ vy*winc_diff_6 
  wFeduc_a_6 ~~ vx*wFeduc_a_6
  winc_diff_7 ~~ vy*winc_diff_7 
  wFeduc_a_7 ~~ vx*wFeduc_a_7
  winc_diff_8 ~~ vy*winc_diff_8 
  wFeduc_a_8 ~~ vx*wFeduc_a_8
  winc_diff_9 ~~ vy*winc_diff_9 
  wFeduc_a_9 ~~ vx*wFeduc_a_9
  winc_diff_10 ~~ vy*winc_diff_10 
  wFeduc_a_10 ~~ vx*wFeduc_a_10
  winc_diff_11 ~~ vy*winc_diff_11 
  wFeduc_a_11 ~~ vx*wFeduc_a_11
  
  ##########################
  # ADDITIONAL CONSTRAINTS #
  ##########################
  
  # Set correlations between the between-factors (random intercepts) and within-
  # factors at wave 1 at 0. 
  RIx + RIy ~~ 0*wFeduc_a_1 + 0*winc_diff_1
  
  
  #constrain grand means over time
  inc_diff_1 + inc_diff_2 + inc_diff_3 + inc_diff_4 + inc_diff_5 + inc_diff_6 + inc_diff_7 + inc_diff_8 + inc_diff_9 + inc_diff_10 + inc_diff_11 ~ my*1
  
  Feduc_a_1 + Feduc_a_2 + Feduc_a_3 + Feduc_a_4 + Feduc_a_5 + Feduc_a_6 + Feduc_a_7 + Feduc_a_8 + Feduc_a_9 + Feduc_a_10 + Feduc_a_11 ~ mx*1

'


#save model specifications in list
inc_diff_lavaan_models <- list(inc_diff_model1_unconstrained,
     inc_diff_model1_constrained_lag,
     inc_diff_model1_constrained_lag_means
     )

Main analysis: estimate models (ML/ FIML)

lavaan_models_main <- list(eu_lavaan_models,
                           cult_lavaan_models,
                           inc_diff_lavaan_models)

# paralellize the estimation
numCores <- detectCores()
registerDoParallel(core = 3)

#initialize foreach loop
main_results <- foreach(a = 1:3) %:%
  foreach(b = 1:3, .packages = c("tidyverse",
                                 "lavaan")) %dopar% {
                                   lavaan(
                                     lavaan_models_main[[a]][[b]],
                                     data = MyData,
                                     missing = 'ML', 
                                     meanstructure = T, 
                                     int.ov.free = T
                                   )
                                 }
#stop parralellization
stopImplicitCluster()
#parallel computing
registerDoParallel(core = 3)

#store fit stats of all models
fit_list <- foreach(a=1:3) %:%
  foreach(b=1:3,
          .combine = rbind,
          .packages = "lavaan") %dopar% {
            lavInspect(main_results[[a]][[b]], what = "fit")
          }

names(fit_list) <- c("EU models", "Cultural Inclusion models", "Income Difference models")

#stop parralellization
stopImplicitCluster()

Main analysis: estimate models (MLR)

# paralellize the estimation
numCores <- detectCores()
registerDoParallel(core = 3)

#initialize foreach loop
main_results_MLR <- foreach(a = 1:3) %:%
  foreach(b = 1:3, .packages = c("tidyverse",
                                 "lavaan")) %dopar% {
                                   lavaan(
                                     lavaan_models_main[[a]][[b]],
                                     data = MyData,
                                     estimator = 'MLR',
                                     missing = "ML",
                                     meanstructure = T, 
                                     int.ov.free = T
                                   )
                                 }


main_results_MLF <- foreach(a = 1:3) %:%
  foreach(b = 1:3, .packages = c("tidyverse",
                                 "lavaan")) %dopar% {
                                   lavaan(
                                     lavaan_models_main[[a]][[b]],
                                     data = MyData,
                                     estimator = 'MLF',
                                     missing = "ML",
                                     meanstructure = T, 
                                     int.ov.free = T
                                   )
                                 }
#stop parralellization
stopImplicitCluster()


#parallel computing
registerDoParallel(core = 3)

#store fit stats of all models
fit_list_MLR <- foreach(a=1:3) %:%
  foreach(b=1:3,
          .combine = rbind,
          .packages = "lavaan") %dopar% {
            lavInspect(main_results_MLR[[a]][[b]], what = "fit")
          }

names(fit_list_MLR) <- c("EU models", "Cultural Inclusion models", "Income Difference models")

#stop parralellization
stopImplicitCluster()

Export results

main_lavaan_results <- list(main_results_MLR,
                            lavaan_models_main, 
                            fit_list_MLR)

names(main_lavaan_results) <- c("Main lavaan results",
                                "Lavaan model objects",
                                "Fit statistics (extracted)")

save(main_lavaan_results,
     file = "results/riclpm/240816_lavaan-main-results.Rdata")
LS0tDQp0aXRsZTogIlJJQ0xQTSByZXN1bHRzIg0KYXV0aG9yOiAiVGhpam1lbiBKZXJvZW5zZSINCmRhdGU6ICJMYXN0IGNvbXBpbGVkIG9uIGByIGZvcm1hdChTeXMudGltZSgpLCAnJWQgJUIsICVZJylgIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogVFJVRQ0KICAgIHRvY19kZXB0aDogMw0KICAgIHRvY19mbG9hdDogVFJVRQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IFRSVUUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldCgNCiAgY2FjaGUgPSBUUlVFLA0KICBtZXNzYWdlID0gRkFMU0UsDQogIHdhcm5pbmcgPSBGQUxTRSwNCiAgcmVzdWx0cyA9ICJhc2lzIiwNCiAgZmlnLmFsaWduID0gImNlbnRlciINCikNCmBgYA0KDQojIEdvYWwNCg0KRXN0aW1hdGUgdGhlIG1haW4gUkktQ0xQTSB3aXRoIGxhdmFhbi4gDQoNCiMgU2V0IHVwIGFuZCBkYXRhIGltcG9ydA0KDQpgYGB7ciBsaWJyYXJpZXMgYW5kIGRhdGEgaW1wb3J0fQ0KI2xpYnJhcnkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsYXZhYW4pDQpsaWJyYXJ5KGRhdGEudGFibGUpDQpsaWJyYXJ5KGRvUGFyYWxsZWwpDQpsaWJyYXJ5KHBhcmFsbGVsKQ0KDQojZGF0YQ0KbG9hZCgicmVzdWx0cy9wcmVkaWN0ZWRfbWVhbnMvMjQwODE2X3ByZWQtbWVhbnMtY2xlYW5lZC1kZi5SZGF0YSIpDQoNCiNleHRyYWN0IGRhdGFmaWxlIGZyb20gcHJlZl9yZXN1bHRzDQpNeURhdGEgPC0gcHJlZF9yZXN1bHRzJGRmX2NvbWJpbmVkDQoNCiNjcmVhdGUgYmV0d2VlbiB2YXJpYWJsZXMgZm9yIA0KTXlEYXRhIDwtIE15RGF0YSAlPiUgDQogIHJvd3dpc2UoKSAlPiUgDQogIG11dGF0ZShiZXR3ZWVuX2VkdWMgPSBtZWFuKGNfYWNyb3NzKGNvbHMgPSBtYXRjaGVzKCJeZWR1Y19bWzpkaWdpdDpdXXsxLDJ9IikpLG5hLnJtID0gVCksDQogICAgICAgICBiZXR3ZWVuX2FnZSA9IG1lYW4oY19hY3Jvc3MoY29scyA9IG1hdGNoZXMoIl5hZ2VfW1s6ZGlnaXQ6XV17MSwyfSIpKSxuYS5ybSA9IFQpLA0KICAgICAgICAgYmV0d2Vlbl9mZW1hbGUgPSBtZWFuKGNfYWNyb3NzKGNvbHMgPSBtYXRjaGVzKCJeZmVtYWxlX1tbOmRpZ2l0Ol1dezEsMn0iKSksbmEucm0gPSBUKSwNCiAgICAgICAgIGJldHdlZW5fb3JpZ2luID0gbWVhbihjX2Fjcm9zcyhjb2xzID0gbWF0Y2hlcygiXm9yaWdpbl9bWzpkaWdpdDpdXXsxLDJ9IikpLG5hLnJtID0gVCkpICU+JQ0KICB1bmdyb3VwKCkNCmBgYA0KDQojIFJJLUNMUE0gd2l0aCBiaWFzZWQgY29ycmVjdGVkIG1lYW5zDQoNCiMjIE1haW4gZWZmZWN0cw0KDQojIyMgQ3JlYXRlIGxhdmFhbiBtb2RlbCBvYmplY3RzDQojIyMjIEVVIGludGVncmF0aW9uDQoNCmBgYHtyIGV1X2ludGVncmF0aW9uIGxhdmFhbiBtb2RlbHN9DQpFVV9tb2RlbDFfdW5jb25zdHJhaW5lZCA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzEgKyAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqZXVfMSArIDEqZXVfMiArIDEqZXVfMyArIDEqZXVfNCArIDEqZXVfNSArIDEqZXVfNiArIDEqZXVfNyArIDEqZXVfOCArIDEqZXVfOSArIDEqZXVfMTAgKyAxKmV1XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gSSBET05UIFVOREVSU1RBTkQgVEhJUyEgbm8gbWVhc3VyZW1lbnQgZXJyb3I/PyANCiAgRmVkdWNfYV8xIH5+IDAqRmVkdWNfYV8xDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCiAgDQogICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzEgPX4gMSpGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2V1XzEgPX4gMSpldV8xDQogIHdldV8yID1+IDEqZXVfMg0KICB3ZXVfMyA9fiAxKmV1XzMNCiAgd2V1XzQgPX4gMSpldV80DQogIHdldV81ID1+IDEqZXVfNQ0KICB3ZXVfNiA9fiAxKmV1XzYNCiAgd2V1XzcgPX4gMSpldV83DQogIHdldV84ID1+IDEqZXVfOA0KICB3ZXVfOSA9fiAxKmV1XzkNCiAgd2V1XzEwID1+IDEqZXVfMTANCiAgd2V1XzExID1+IDEqZXVfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdldV8yICAgfiB3ZXVfMSArIHdGZWR1Y19hXzENCiAgd2V1XzMgICB+IHdldV8yICsgd0ZlZHVjX2FfMg0KICB3ZXVfNCAgIH4gd2V1XzMgKyB3RmVkdWNfYV8zDQogIHdldV81ICAgfiB3ZXVfNCArIHdGZWR1Y19hXzQNCiAgd2V1XzYgICB+IHdldV81ICsgd0ZlZHVjX2FfNQ0KICB3ZXVfNyAgIH4gd2V1XzYgKyB3RmVkdWNfYV82DQogIHdldV84ICAgfiB3ZXVfNyArIHdGZWR1Y19hXzcNCiAgd2V1XzkgICB+IHdldV84ICsgd0ZlZHVjX2FfOA0KICB3ZXVfMTAgIH4gd2V1XzkgKyB3RmVkdWNfYV85DQogIHdldV8xMSAgfiB3ZXVfMTAgKyB3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gd2V1XzEgKyB3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gd2V1XzIgKyB3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gd2V1XzMgKyB3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gd2V1XzQgKyB3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gd2V1XzUgKyB3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gd2V1XzYgKyB3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gd2V1XzcgKyB3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gd2V1XzggKyB3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IHdldV85ICsgd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiB3ZXVfMTAgKyB3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdldV8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdldV8yIH5+IHdGZWR1Y19hXzINCiAgd2V1XzMgfn4gd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiB3RmVkdWNfYV80DQogIHdldV81IH5+IHdGZWR1Y19hXzUNCiAgd2V1XzYgfn4gd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiB3RmVkdWNfYV83DQogIHdldV84IH5+IHdGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IHdGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2V1XzEgfn4gd2V1XzEgDQogIHdGZWR1Y19hXzEgfn4gd0ZlZHVjX2FfMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2V1XzIgfn4gd2V1XzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICB3ZXVfMyB+fiB3ZXVfMw0KICB3RmVkdWNfYV8zIH5+IHdGZWR1Y19hXzMNCiAgd2V1XzQgfn4gd2V1XzQgDQogIHdGZWR1Y19hXzQgfn4gd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiB2eSp3ZXVfNQ0KICB3RmVkdWNfYV81IH5+IHdGZWR1Y19hXzUNCiAgd2V1XzYgfn4gd2V1XzYgDQogIHdGZWR1Y19hXzYgfn4gd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiB3ZXVfNyANCiAgd0ZlZHVjX2FfNyB+fiB3RmVkdWNfYV83DQogIHdldV84IH5+IHdldV84IA0KICB3RmVkdWNfYV84IH5+IHdGZWR1Y19hXzgNCiAgd2V1Xzkgfn4gd2V1XzkgDQogIHdGZWR1Y19hXzkgfn4gd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gd2V1XzEwIA0KICB3RmVkdWNfYV8xMCB+fiB3RmVkdWNfYV8xMA0KICB3ZXVfMTEgfn4gd2V1XzExIA0KICB3RmVkdWNfYV8xMSB+fiB3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8xICsgMCp3ZXVfMQ0KICANCicNCkVVX21vZGVsMV9jb25zdHJhaW5lZF9sYWcgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8xICsgMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+ICAxKmV1XzEgKyAxKmV1XzIgKyAxKmV1XzMgKyAxKmV1XzQgKyAxKmV1XzUgKyAxKmV1XzYgKyAxKmV1XzcgKyAxKmV1XzggKyAxKmV1XzkgKyAxKmV1XzEwICsgMSpldV8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuIEkgRE9OVCBVTkRFUlNUQU5EIFRISVMhIG5vIG1lYXN1cmVtZW50IGVycm9yPz8gDQogIEZlZHVjX2FfMSB+fiAwKkZlZHVjX2FfMQ0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3ZXVfMSA9fiAxKmV1XzENCiAgd2V1XzIgPX4gMSpldV8yDQogIHdldV8zID1+IDEqZXVfMw0KICB3ZXVfNCA9fiAxKmV1XzQNCiAgd2V1XzUgPX4gMSpldV81DQogIHdldV82ID1+IDEqZXVfNg0KICB3ZXVfNyA9fiAxKmV1XzcNCiAgd2V1XzggPX4gMSpldV84DQogIHdldV85ID1+IDEqZXVfOQ0KICB3ZXVfMTAgPX4gMSpldV8xMA0KICB3ZXVfMTEgPX4gMSpldV8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2V1XzIgICB+IGEqd2V1XzEgKyBiKndGZWR1Y19hXzENCiAgd2V1XzMgICB+IGEqd2V1XzIgKyBiKndGZWR1Y19hXzINCiAgd2V1XzQgICB+IGEqd2V1XzMgKyBiKndGZWR1Y19hXzMNCiAgd2V1XzUgICB+IGEqd2V1XzQgKyBiKndGZWR1Y19hXzQNCiAgd2V1XzYgICB+IGEqd2V1XzUgKyBiKndGZWR1Y19hXzUNCiAgd2V1XzcgICB+IGEqd2V1XzYgKyBiKndGZWR1Y19hXzYNCiAgd2V1XzggICB+IGEqd2V1XzcgKyBiKndGZWR1Y19hXzcNCiAgd2V1XzkgICB+IGEqd2V1XzggKyBiKndGZWR1Y19hXzgNCiAgd2V1XzEwICB+IGEqd2V1XzkgKyBiKndGZWR1Y19hXzkNCiAgd2V1XzExICB+IGEqd2V1XzEwICsgYip3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gYyp3ZXVfMSArIGQqd0ZlZHVjX2FfMQ0KICB3RmVkdWNfYV8zICB+IGMqd2V1XzIgKyBkKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKndldV8zICsgZCp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyp3ZXVfNCArIGQqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMqd2V1XzUgKyBkKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKndldV82ICsgZCp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyp3ZXVfNyArIGQqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMqd2V1XzggKyBkKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyp3ZXVfOSArIGQqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKndldV8xMCArIGQqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3ZXVfMSB+fiB3RmVkdWNfYV8xICMgQ292YXJpYW5jZQ0KDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3ZXVfMiB+fiBjb3Yqd0ZlZHVjX2FfMg0KICB3ZXVfMyB+fiBjb3Yqd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiBjb3Yqd0ZlZHVjX2FfNA0KICB3ZXVfNSB+fiBjb3Yqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiBjb3Yqd0ZlZHVjX2FfNg0KICB3ZXVfNyB+fiBjb3Yqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiBjb3Yqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiBjb3Yqd0ZlZHVjX2FfOQ0KICB3ZXVfMTAgfn4gY292KndGZWR1Y19hXzEwDQogIHdldV8xMSB+fiBjb3Yqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3ZXVfMSB+fiB3ZXVfMSANCiAgd0ZlZHVjX2FfMSB+fiB3RmVkdWNfYV8xDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3ZXVfMiB+fiB2eSp3ZXVfMiANCiAgd0ZlZHVjX2FfMiB+fiB2eCp3RmVkdWNfYV8yDQogIHdldV8zIH5+IHZ5KndldV8zDQogIHdGZWR1Y19hXzMgfn4gdngqd0ZlZHVjX2FfMw0KICB3ZXVfNCB+fiB2eSp3ZXVfNCANCiAgd0ZlZHVjX2FfNCB+fiB2eCp3RmVkdWNfYV80DQogIHdldV81IH5+IHZ5KndldV81DQogIHdGZWR1Y19hXzUgfn4gdngqd0ZlZHVjX2FfNQ0KICB3ZXVfNiB+fiB2eSp3ZXVfNiANCiAgd0ZlZHVjX2FfNiB+fiB2eCp3RmVkdWNfYV82DQogIHdldV83IH5+IHZ5KndldV83IA0KICB3RmVkdWNfYV83IH5+IHZ4KndGZWR1Y19hXzcNCiAgd2V1Xzggfn4gdnkqd2V1XzggDQogIHdGZWR1Y19hXzggfn4gdngqd0ZlZHVjX2FfOA0KICB3ZXVfOSB+fiB2eSp3ZXVfOSANCiAgd0ZlZHVjX2FfOSB+fiB2eCp3RmVkdWNfYV85DQogIHdldV8xMCB+fiB2eSp3ZXVfMTAgDQogIHdGZWR1Y19hXzEwIH5+IHZ4KndGZWR1Y19hXzEwDQogIHdldV8xMSB+fiB2eSp3ZXVfMTEgDQogIHdGZWR1Y19hXzExIH5+IHZ4KndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndldV8xDQoNCicNCg0KRVVfbW9kZWwxX2NvbnN0cmFpbmVkX2xhZ19tZWFucyA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzEgKyAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqZXVfMSArIDEqZXVfMiArIDEqZXVfMyArIDEqZXVfNCArIDEqZXVfNSArIDEqZXVfNiArIDEqZXVfNyArIDEqZXVfOCArIDEqZXVfOSArIDEqZXVfMTAgKyAxKmV1XzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gSSBET05UIFVOREVSU1RBTkQgVEhJUyEgbm8gbWVhc3VyZW1lbnQgZXJyb3I/PyANCiAgRmVkdWNfYV8xIH5+IDAqRmVkdWNfYV8xDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCg0KICAjIFJlZ3Jlc3Npb24gb2YgcmFuZG9tIGludGVyY2VwdHMgb24gejENCiAgUkl4ICsgUkl5IH4gYmV0d2Vlbl9lZHVjICsgYmV0d2Vlbl9hZ2UgKyBiZXR3ZWVuX29yaWdpbiArIGJldHdlZW5fZmVtYWxlIyBDb25zdHJhaW5lZCBvdmVyIHRpbWUuDQoNCiAgIyMjIyMjIyMjIyMjIyMjDQogICMgV0lUSElOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAgIyBDcmVhdGUgd2l0aGluLXBlcnNvbiBjZW50ZXJlZCB2YXJpYWJsZXMuIA0KICB3RmVkdWNfYV8xID1+IDEqRmVkdWNfYV8xDQogIHdGZWR1Y19hXzIgPX4gMSpGZWR1Y19hXzINCiAgd0ZlZHVjX2FfMyA9fiAxKkZlZHVjX2FfMw0KICB3RmVkdWNfYV80ID1+IDEqRmVkdWNfYV80DQogIHdGZWR1Y19hXzUgPX4gMSpGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNiA9fiAxKkZlZHVjX2FfNg0KICB3RmVkdWNfYV83ID1+IDEqRmVkdWNfYV83DQogIHdGZWR1Y19hXzggPX4gMSpGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfOSA9fiAxKkZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMCA9fiAxKkZlZHVjX2FfMTANCiAgd0ZlZHVjX2FfMTEgPX4gMSpGZWR1Y19hXzExDQogIHdldV8xID1+IDEqZXVfMQ0KICB3ZXVfMiA9fiAxKmV1XzINCiAgd2V1XzMgPX4gMSpldV8zDQogIHdldV80ID1+IDEqZXVfNA0KICB3ZXVfNSA9fiAxKmV1XzUNCiAgd2V1XzYgPX4gMSpldV82DQogIHdldV83ID1+IDEqZXVfNw0KICB3ZXVfOCA9fiAxKmV1XzgNCiAgd2V1XzkgPX4gMSpldV85DQogIHdldV8xMCA9fiAxKmV1XzEwDQogIHdldV8xMSA9fiAxKmV1XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3ZXVfMiAgIH4gYSp3ZXVfMSArIGIqd0ZlZHVjX2FfMQ0KICB3ZXVfMyAgIH4gYSp3ZXVfMiArIGIqd0ZlZHVjX2FfMg0KICB3ZXVfNCAgIH4gYSp3ZXVfMyArIGIqd0ZlZHVjX2FfMw0KICB3ZXVfNSAgIH4gYSp3ZXVfNCArIGIqd0ZlZHVjX2FfNA0KICB3ZXVfNiAgIH4gYSp3ZXVfNSArIGIqd0ZlZHVjX2FfNQ0KICB3ZXVfNyAgIH4gYSp3ZXVfNiArIGIqd0ZlZHVjX2FfNg0KICB3ZXVfOCAgIH4gYSp3ZXVfNyArIGIqd0ZlZHVjX2FfNw0KICB3ZXVfOSAgIH4gYSp3ZXVfOCArIGIqd0ZlZHVjX2FfOA0KICB3ZXVfMTAgIH4gYSp3ZXVfOSArIGIqd0ZlZHVjX2FfOQ0KICB3ZXVfMTEgIH4gYSp3ZXVfMTAgKyBiKndGZWR1Y19hXzEwDQogIA0KICANCiAgd0ZlZHVjX2FfMiAgfiBjKndldV8xICsgZCp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyp3ZXVfMiArIGQqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMqd2V1XzMgKyBkKndGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNSAgfiBjKndldV80ICsgZCp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyp3ZXVfNSArIGQqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMqd2V1XzYgKyBkKndGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfOCAgfiBjKndldV83ICsgZCp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyp3ZXVfOCArIGQqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKndldV85ICsgZCp3RmVkdWNfYV85DQogIHdGZWR1Y19hXzExICB+IGMqd2V1XzEwICsgZCp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdldV8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdldV8yIH5+IGNvdip3RmVkdWNfYV8yDQogIHdldV8zIH5+IGNvdip3RmVkdWNfYV8zDQogIHdldV80IH5+IGNvdip3RmVkdWNfYV80DQogIHdldV81IH5+IGNvdip3RmVkdWNfYV81DQogIHdldV82IH5+IGNvdip3RmVkdWNfYV82DQogIHdldV83IH5+IGNvdip3RmVkdWNfYV83DQogIHdldV84IH5+IGNvdip3RmVkdWNfYV84DQogIHdldV85IH5+IGNvdip3RmVkdWNfYV85DQogIHdldV8xMCB+fiBjb3Yqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IGNvdip3RmVkdWNfYV8xMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgDQogIHdldV8xIH5+IHdldV8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdldV8yIH5+IHZ5KndldV8yIA0KICB3RmVkdWNfYV8yIH5+IHZ4KndGZWR1Y19hXzINCiAgd2V1XzMgfn4gdnkqd2V1XzMNCiAgd0ZlZHVjX2FfMyB+fiB2eCp3RmVkdWNfYV8zDQogIHdldV80IH5+IHZ5KndldV80IA0KICB3RmVkdWNfYV80IH5+IHZ4KndGZWR1Y19hXzQNCiAgd2V1XzUgfn4gdnkqd2V1XzUNCiAgd0ZlZHVjX2FfNSB+fiB2eCp3RmVkdWNfYV81DQogIHdldV82IH5+IHZ5KndldV82IA0KICB3RmVkdWNfYV82IH5+IHZ4KndGZWR1Y19hXzYNCiAgd2V1Xzcgfn4gdnkqd2V1XzcgDQogIHdGZWR1Y19hXzcgfn4gdngqd0ZlZHVjX2FfNw0KICB3ZXVfOCB+fiB2eSp3ZXVfOCANCiAgd0ZlZHVjX2FfOCB+fiB2eCp3RmVkdWNfYV84DQogIHdldV85IH5+IHZ5KndldV85IA0KICB3RmVkdWNfYV85IH5+IHZ4KndGZWR1Y19hXzkNCiAgd2V1XzEwIH5+IHZ5KndldV8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gdngqd0ZlZHVjX2FfMTANCiAgd2V1XzExIH5+IHZ5KndldV8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gdngqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMSArIDAqd2V1XzENCiAgDQogIA0KICAjY29uc3RyYWluIGdyYW5kIG1lYW5zIG92ZXIgdGltZQ0KICBldV8xICsgZXVfMiArIGV1XzMgKyBldV80ICsgZXVfNSArIGV1XzYgKyBldV83ICsgZXVfOCArIGV1XzkgKyBldV8xMCArIGV1XzExIH4gbXkqMQ0KICANCiAgRmVkdWNfYV8xICsgRmVkdWNfYV8yICsgRmVkdWNfYV8zICsgRmVkdWNfYV80ICsgRmVkdWNfYV81ICsgRmVkdWNfYV82ICsgRmVkdWNfYV83ICsgRmVkdWNfYV84ICsgRmVkdWNfYV85ICsgRmVkdWNfYV8xMCArIEZlZHVjX2FfMTEgfiBteCoxDQoNCicNCg0KI3NhdmUgbW9kZWwgc3BlY2lmaWNhdGlvbnMgaW4gbGlzdA0KZXVfbGF2YWFuX21vZGVscyA8LSBsaXN0KEVVX21vZGVsMV91bmNvbnN0cmFpbmVkLA0KICAgICBFVV9tb2RlbDFfY29uc3RyYWluZWRfbGFnLA0KICAgICBFVV9tb2RlbDFfY29uc3RyYWluZWRfbGFnX21lYW5zDQogICAgICkNCg0KYGBgDQoNCiMjIyMgQ3VsdHVyYWwgSW5jbHVzaW9uDQpgYGB7ciBjdWx0dXJhbCBpbmNsdXNpb24gfQ0KY3VsdF9tb2RlbDFfdW5jb25zdHJhaW5lZCA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzEgKyAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqY3VsdF8xICsgMSpjdWx0XzIgKyAxKmN1bHRfMyArIDEqY3VsdF80ICsgMSpjdWx0XzUgKyAxKmN1bHRfNiArIDEqY3VsdF83ICsgMSpjdWx0XzggKyAxKmN1bHRfOSArIDEqY3VsdF8xMCArIDEqY3VsdF8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuIEkgRE9OVCBVTkRFUlNUQU5EIFRISVMhIG5vIG1lYXN1cmVtZW50IGVycm9yPz8gDQogIEZlZHVjX2FfMSB+fiAwKkZlZHVjX2FfMQ0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3Y3VsdF8xID1+IDEqY3VsdF8xDQogIHdjdWx0XzIgPX4gMSpjdWx0XzINCiAgd2N1bHRfMyA9fiAxKmN1bHRfMw0KICB3Y3VsdF80ID1+IDEqY3VsdF80DQogIHdjdWx0XzUgPX4gMSpjdWx0XzUNCiAgd2N1bHRfNiA9fiAxKmN1bHRfNg0KICB3Y3VsdF83ID1+IDEqY3VsdF83DQogIHdjdWx0XzggPX4gMSpjdWx0XzgNCiAgd2N1bHRfOSA9fiAxKmN1bHRfOQ0KICB3Y3VsdF8xMCA9fiAxKmN1bHRfMTANCiAgd2N1bHRfMTEgPX4gMSpjdWx0XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMNCiAgd2N1bHRfMiAgIH4gd2N1bHRfMSArIHdGZWR1Y19hXzENCiAgd2N1bHRfMyAgIH4gd2N1bHRfMiArIHdGZWR1Y19hXzINCiAgd2N1bHRfNCAgIH4gd2N1bHRfMyArIHdGZWR1Y19hXzMNCiAgd2N1bHRfNSAgIH4gd2N1bHRfNCArIHdGZWR1Y19hXzQNCiAgd2N1bHRfNiAgIH4gd2N1bHRfNSArIHdGZWR1Y19hXzUNCiAgd2N1bHRfNyAgIH4gd2N1bHRfNiArIHdGZWR1Y19hXzYNCiAgd2N1bHRfOCAgIH4gd2N1bHRfNyArIHdGZWR1Y19hXzcNCiAgd2N1bHRfOSAgIH4gd2N1bHRfOCArIHdGZWR1Y19hXzgNCiAgd2N1bHRfMTAgIH4gd2N1bHRfOSArIHdGZWR1Y19hXzkNCiAgd2N1bHRfMTEgIH4gd2N1bHRfMTAgKyB3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gd2N1bHRfMSArIHdGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMyAgfiB3Y3VsdF8yICsgd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IHdjdWx0XzMgKyB3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gd2N1bHRfNCArIHdGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNiAgfiB3Y3VsdF81ICsgd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IHdjdWx0XzYgKyB3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gd2N1bHRfNyArIHdGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOSAgfiB3Y3VsdF84ICsgd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiB3Y3VsdF85ICsgd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiB3Y3VsdF8xMCArIHdGZWR1Y19hXzEwDQogIA0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlIGF0IHRoZSBmaXJzdCB3YXZlLiANCiAgd2N1bHRfMSB+fiB3RmVkdWNfYV8xICMgQ292YXJpYW5jZQ0KDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3Y3VsdF8yIH5+IHdGZWR1Y19hXzINCiAgd2N1bHRfMyB+fiB3RmVkdWNfYV8zDQogIHdjdWx0XzQgfn4gd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IHdGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiB3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IHdGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiB3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IHdGZWR1Y19hXzEwDQogIHdjdWx0XzExIH5+IHdGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2N1bHRfMSB+fiB3Y3VsdF8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdjdWx0XzIgfn4gd2N1bHRfMiANCiAgd0ZlZHVjX2FfMiB+fiB3RmVkdWNfYV8yDQogIHdjdWx0XzMgfn4gd2N1bHRfMw0KICB3RmVkdWNfYV8zIH5+IHdGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiB3Y3VsdF80IA0KICB3RmVkdWNfYV80IH5+IHdGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiB2eSp3Y3VsdF81DQogIHdGZWR1Y19hXzUgfn4gd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IHdjdWx0XzYgDQogIHdGZWR1Y19hXzYgfn4gd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IHdjdWx0XzcgDQogIHdGZWR1Y19hXzcgfn4gd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IHdjdWx0XzggDQogIHdGZWR1Y19hXzggfn4gd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IHdjdWx0XzkgDQogIHdGZWR1Y19hXzkgfn4gd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiB3Y3VsdF8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gd2N1bHRfMTEgDQogIHdGZWR1Y19hXzExIH5+IHdGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndjdWx0XzENCiAgDQonDQoNCmN1bHRfbW9kZWwxX2NvbnN0cmFpbmVkX2xhZyA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzEgKyAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqY3VsdF8xICsgMSpjdWx0XzIgKyAxKmN1bHRfMyArIDEqY3VsdF80ICsgMSpjdWx0XzUgKyAxKmN1bHRfNiArIDEqY3VsdF83ICsgMSpjdWx0XzggKyAxKmN1bHRfOSArIDEqY3VsdF8xMCArIDEqY3VsdF8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuIEkgRE9OVCBVTkRFUlNUQU5EIFRISVMhIG5vIG1lYXN1cmVtZW50IGVycm9yPz8gDQogIEZlZHVjX2FfMSB+fiAwKkZlZHVjX2FfMQ0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQoNCiAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3Y3VsdF8xID1+IDEqY3VsdF8xDQogIHdjdWx0XzIgPX4gMSpjdWx0XzINCiAgd2N1bHRfMyA9fiAxKmN1bHRfMw0KICB3Y3VsdF80ID1+IDEqY3VsdF80DQogIHdjdWx0XzUgPX4gMSpjdWx0XzUNCiAgd2N1bHRfNiA9fiAxKmN1bHRfNg0KICB3Y3VsdF83ID1+IDEqY3VsdF83DQogIHdjdWx0XzggPX4gMSpjdWx0XzgNCiAgd2N1bHRfOSA9fiAxKmN1bHRfOQ0KICB3Y3VsdF8xMCA9fiAxKmN1bHRfMTANCiAgd2N1bHRfMTEgPX4gMSpjdWx0XzExIA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgbGFnZ2VkIGVmZmVjdHMgKGNvbnN0cmFpbmVkKQ0KICB3Y3VsdF8yICAgfiBhKndjdWx0XzEgKyBiKndGZWR1Y19hXzENCiAgd2N1bHRfMyAgIH4gYSp3Y3VsdF8yICsgYip3RmVkdWNfYV8yDQogIHdjdWx0XzQgICB+IGEqd2N1bHRfMyArIGIqd0ZlZHVjX2FfMw0KICB3Y3VsdF81ICAgfiBhKndjdWx0XzQgKyBiKndGZWR1Y19hXzQNCiAgd2N1bHRfNiAgIH4gYSp3Y3VsdF81ICsgYip3RmVkdWNfYV81DQogIHdjdWx0XzcgICB+IGEqd2N1bHRfNiArIGIqd0ZlZHVjX2FfNg0KICB3Y3VsdF84ICAgfiBhKndjdWx0XzcgKyBiKndGZWR1Y19hXzcNCiAgd2N1bHRfOSAgIH4gYSp3Y3VsdF84ICsgYip3RmVkdWNfYV84DQogIHdjdWx0XzEwICB+IGEqd2N1bHRfOSArIGIqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMSAgfiBhKndjdWx0XzEwICsgYip3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gYyp3Y3VsdF8xICsgZCp3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gYyp3Y3VsdF8yICsgZCp3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gYyp3Y3VsdF8zICsgZCp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyp3Y3VsdF80ICsgZCp3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gYyp3Y3VsdF81ICsgZCp3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gYyp3Y3VsdF82ICsgZCp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyp3Y3VsdF83ICsgZCp3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gYyp3Y3VsdF84ICsgZCp3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IGMqd2N1bHRfOSArIGQqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKndjdWx0XzEwICsgZCp3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdjdWx0XzEgfn4gd0ZlZHVjX2FfMSAjIENvdmFyaWFuY2UNCg0KICAjIEVzdGltYXRlIHRoZSBjb3ZhcmlhbmNlcyBiZXR3ZWVuIHRoZSByZXNpZHVhbHMNCiAgd2N1bHRfMiB+fiBjb3Yqd0ZlZHVjX2FfMg0KICB3Y3VsdF8zIH5+IGNvdip3RmVkdWNfYV8zDQogIHdjdWx0XzQgfn4gY292KndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiBjb3Yqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IGNvdip3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gY292KndGZWR1Y19hXzcNCiAgd2N1bHRfOCB+fiBjb3Yqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IGNvdip3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IGNvdip3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiBjb3Yqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3Y3VsdF8xIH5+IHdjdWx0XzEgDQogIHdGZWR1Y19hXzEgfn4gd0ZlZHVjX2FfMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2N1bHRfMiB+fiB2eSp3Y3VsdF8yIA0KICB3RmVkdWNfYV8yIH5+IHZ4KndGZWR1Y19hXzINCiAgd2N1bHRfMyB+fiB2eSp3Y3VsdF8zDQogIHdGZWR1Y19hXzMgfn4gdngqd0ZlZHVjX2FfMw0KICB3Y3VsdF80IH5+IHZ5KndjdWx0XzQgDQogIHdGZWR1Y19hXzQgfn4gdngqd0ZlZHVjX2FfNA0KICB3Y3VsdF81IH5+IHZ5KndjdWx0XzUNCiAgd0ZlZHVjX2FfNSB+fiB2eCp3RmVkdWNfYV81DQogIHdjdWx0XzYgfn4gdnkqd2N1bHRfNiANCiAgd0ZlZHVjX2FfNiB+fiB2eCp3RmVkdWNfYV82DQogIHdjdWx0Xzcgfn4gdnkqd2N1bHRfNyANCiAgd0ZlZHVjX2FfNyB+fiB2eCp3RmVkdWNfYV83DQogIHdjdWx0Xzggfn4gdnkqd2N1bHRfOCANCiAgd0ZlZHVjX2FfOCB+fiB2eCp3RmVkdWNfYV84DQogIHdjdWx0Xzkgfn4gdnkqd2N1bHRfOSANCiAgd0ZlZHVjX2FfOSB+fiB2eCp3RmVkdWNfYV85DQogIHdjdWx0XzEwIH5+IHZ5KndjdWx0XzEwIA0KICB3RmVkdWNfYV8xMCB+fiB2eCp3RmVkdWNfYV8xMA0KICB3Y3VsdF8xMSB+fiB2eSp3Y3VsdF8xMSANCiAgd0ZlZHVjX2FfMTEgfn4gdngqd0ZlZHVjX2FfMTENCiAgDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogICMgQURESVRJT05BTCBDT05TVFJBSU5UUyAjDQogICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQogIA0KICAjIFNldCBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgYmV0d2Vlbi1mYWN0b3JzIChyYW5kb20gaW50ZXJjZXB0cykgYW5kIHdpdGhpbi0NCiAgIyBmYWN0b3JzIGF0IHdhdmUgMSBhdCAwLiANCiAgUkl4ICsgUkl5IH5+IDAqd0ZlZHVjX2FfMSArIDAqd2N1bHRfMQ0KDQonDQoNCmN1bHRfbW9kZWwxX2NvbnN0cmFpbmVkX2xhZ19tZWFucyA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzEgKyAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqY3VsdF8xICsgMSpjdWx0XzIgKyAxKmN1bHRfMyArIDEqY3VsdF80ICsgMSpjdWx0XzUgKyAxKmN1bHRfNiArIDEqY3VsdF83ICsgMSpjdWx0XzggKyAxKmN1bHRfOSArIDEqY3VsdF8xMCArIDEqY3VsdF8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuIEkgRE9OVCBVTkRFUlNUQU5EIFRISVMhIG5vIG1lYXN1cmVtZW50IGVycm9yPz8gDQogIEZlZHVjX2FfMSB+fiAwKkZlZHVjX2FfMQ0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQogIA0KICAgICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzEgPX4gMSpGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2N1bHRfMSA9fiAxKmN1bHRfMQ0KICB3Y3VsdF8yID1+IDEqY3VsdF8yDQogIHdjdWx0XzMgPX4gMSpjdWx0XzMNCiAgd2N1bHRfNCA9fiAxKmN1bHRfNA0KICB3Y3VsdF81ID1+IDEqY3VsdF81DQogIHdjdWx0XzYgPX4gMSpjdWx0XzYNCiAgd2N1bHRfNyA9fiAxKmN1bHRfNw0KICB3Y3VsdF84ID1+IDEqY3VsdF84DQogIHdjdWx0XzkgPX4gMSpjdWx0XzkNCiAgd2N1bHRfMTAgPX4gMSpjdWx0XzEwDQogIHdjdWx0XzExID1+IDEqY3VsdF8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2N1bHRfMiAgIH4gYSp3Y3VsdF8xICsgYip3RmVkdWNfYV8xDQogIHdjdWx0XzMgICB+IGEqd2N1bHRfMiArIGIqd0ZlZHVjX2FfMg0KICB3Y3VsdF80ICAgfiBhKndjdWx0XzMgKyBiKndGZWR1Y19hXzMNCiAgd2N1bHRfNSAgIH4gYSp3Y3VsdF80ICsgYip3RmVkdWNfYV80DQogIHdjdWx0XzYgICB+IGEqd2N1bHRfNSArIGIqd0ZlZHVjX2FfNQ0KICB3Y3VsdF83ICAgfiBhKndjdWx0XzYgKyBiKndGZWR1Y19hXzYNCiAgd2N1bHRfOCAgIH4gYSp3Y3VsdF83ICsgYip3RmVkdWNfYV83DQogIHdjdWx0XzkgICB+IGEqd2N1bHRfOCArIGIqd0ZlZHVjX2FfOA0KICB3Y3VsdF8xMCAgfiBhKndjdWx0XzkgKyBiKndGZWR1Y19hXzkNCiAgd2N1bHRfMTEgIH4gYSp3Y3VsdF8xMCArIGIqd0ZlZHVjX2FfMTANCiAgDQogIA0KICB3RmVkdWNfYV8yICB+IGMqd2N1bHRfMSArIGQqd0ZlZHVjX2FfMQ0KICB3RmVkdWNfYV8zICB+IGMqd2N1bHRfMiArIGQqd0ZlZHVjX2FfMg0KICB3RmVkdWNfYV80ICB+IGMqd2N1bHRfMyArIGQqd0ZlZHVjX2FfMw0KICB3RmVkdWNfYV81ICB+IGMqd2N1bHRfNCArIGQqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMqd2N1bHRfNSArIGQqd0ZlZHVjX2FfNQ0KICB3RmVkdWNfYV83ICB+IGMqd2N1bHRfNiArIGQqd0ZlZHVjX2FfNg0KICB3RmVkdWNfYV84ICB+IGMqd2N1bHRfNyArIGQqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMqd2N1bHRfOCArIGQqd0ZlZHVjX2FfOA0KICB3RmVkdWNfYV8xMCAgfiBjKndjdWx0XzkgKyBkKndGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTEgIH4gYyp3Y3VsdF8xMCArIGQqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3Y3VsdF8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdjdWx0XzIgfn4gY292KndGZWR1Y19hXzINCiAgd2N1bHRfMyB+fiBjb3Yqd0ZlZHVjX2FfMw0KICB3Y3VsdF80IH5+IGNvdip3RmVkdWNfYV80DQogIHdjdWx0XzUgfn4gY292KndGZWR1Y19hXzUNCiAgd2N1bHRfNiB+fiBjb3Yqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IGNvdip3RmVkdWNfYV83DQogIHdjdWx0Xzggfn4gY292KndGZWR1Y19hXzgNCiAgd2N1bHRfOSB+fiBjb3Yqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiBjb3Yqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gY292KndGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2N1bHRfMSB+fiB3Y3VsdF8xIA0KICB3RmVkdWNfYV8xIH5+IHdGZWR1Y19hXzENCiAgDQogICMgRXN0aW1hdGUgdGhlIHJlc2lkdWFsIHZhcmlhbmNlDQogIHdjdWx0XzIgfn4gdnkqd2N1bHRfMiANCiAgd0ZlZHVjX2FfMiB+fiB2eCp3RmVkdWNfYV8yDQogIHdjdWx0XzMgfn4gdnkqd2N1bHRfMw0KICB3RmVkdWNfYV8zIH5+IHZ4KndGZWR1Y19hXzMNCiAgd2N1bHRfNCB+fiB2eSp3Y3VsdF80IA0KICB3RmVkdWNfYV80IH5+IHZ4KndGZWR1Y19hXzQNCiAgd2N1bHRfNSB+fiB2eSp3Y3VsdF81DQogIHdGZWR1Y19hXzUgfn4gdngqd0ZlZHVjX2FfNQ0KICB3Y3VsdF82IH5+IHZ5KndjdWx0XzYgDQogIHdGZWR1Y19hXzYgfn4gdngqd0ZlZHVjX2FfNg0KICB3Y3VsdF83IH5+IHZ5KndjdWx0XzcgDQogIHdGZWR1Y19hXzcgfn4gdngqd0ZlZHVjX2FfNw0KICB3Y3VsdF84IH5+IHZ5KndjdWx0XzggDQogIHdGZWR1Y19hXzggfn4gdngqd0ZlZHVjX2FfOA0KICB3Y3VsdF85IH5+IHZ5KndjdWx0XzkgDQogIHdGZWR1Y19hXzkgfn4gdngqd0ZlZHVjX2FfOQ0KICB3Y3VsdF8xMCB+fiB2eSp3Y3VsdF8xMCANCiAgd0ZlZHVjX2FfMTAgfn4gdngqd0ZlZHVjX2FfMTANCiAgd2N1bHRfMTEgfn4gdnkqd2N1bHRfMTEgDQogIHdGZWR1Y19hXzExIH5+IHZ4KndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndjdWx0XzENCiAgDQogIA0KICAjY29uc3RyYWluIGdyYW5kIG1lYW5zIG92ZXIgdGltZQ0KICBjdWx0XzEgKyBjdWx0XzIgKyBjdWx0XzMgKyBjdWx0XzQgKyBjdWx0XzUgKyBjdWx0XzYgKyBjdWx0XzcgKyBjdWx0XzggKyBjdWx0XzkgKyBjdWx0XzEwICsgY3VsdF8xMSB+IG15KjENCiAgDQogIEZlZHVjX2FfMSArIEZlZHVjX2FfMiArIEZlZHVjX2FfMyArIEZlZHVjX2FfNCArIEZlZHVjX2FfNSArIEZlZHVjX2FfNiArIEZlZHVjX2FfNyArIEZlZHVjX2FfOCArIEZlZHVjX2FfOSArIEZlZHVjX2FfMTAgKyBGZWR1Y19hXzExIH4gbXgqMQ0KDQonDQoNCg0KDQojc2F2ZSBtb2RlbCBzcGVjaWZpY2F0aW9ucyBpbiBsaXN0DQpjdWx0X2xhdmFhbl9tb2RlbHMgPC0gbGlzdChjdWx0X21vZGVsMV91bmNvbnN0cmFpbmVkLA0KICAgICBjdWx0X21vZGVsMV9jb25zdHJhaW5lZF9sYWcsDQogICAgIGN1bHRfbW9kZWwxX2NvbnN0cmFpbmVkX2xhZ19tZWFucw0KICAgICApDQoNCmBgYA0KDQojIyMjIEluY29tZSBEaWZmZXJlbmNlcw0KDQpgYGB7ciBpbmNvbWUgZGlmZiB1bmNvbnN0cmFpbmVkfQ0KaW5jX2RpZmZfbW9kZWwxX3VuY29uc3RyYWluZWQgPC0gJw0KDQogICMjIyMjIyMjIyMjIyMjIyMNCiAgIyBCRVRXRUVOIFBBUlQgIw0KICAjIyMjIyMjIyMjIyMjIyMNCg0KICAjIENyZWF0ZSBiZXR3ZWVuIGNvbXBvbmVudHMgKHJhbmRvbSBpbnRlcmNlcHRzKQ0KICBSSXggPX4gMSogRmVkdWNfYV8xICsgMSogRmVkdWNfYV8yICsgMSpGZWR1Y19hXzMgKyAxKkZlZHVjX2FfNCArIDEqRmVkdWNfYV81ICsgMSpGZWR1Y19hXzYgKyAxKkZlZHVjX2FfNyArIDEqRmVkdWNfYV84ICsgMSpGZWR1Y19hXzkgKyAxKkZlZHVjX2FfMTAgKyAxKkZlZHVjX2FfMTENCiAgUkl5ID1+ICAxKmluY19kaWZmXzEgKyAxKmluY19kaWZmXzIgKyAxKmluY19kaWZmXzMgKyAxKmluY19kaWZmXzQgKyAxKmluY19kaWZmXzUgKyAxKmluY19kaWZmXzYgKyAxKmluY19kaWZmXzcgKyAxKmluY19kaWZmXzggKyAxKmluY19kaWZmXzkgKyAxKmluY19kaWZmXzEwICsgMSppbmNfZGlmZl8xMQ0KDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIGFuZCBjb3ZhcmlhbmNlIG9mIHRoZSByYW5kb20gaW50ZXJjZXB0cy4gDQogIFJJeCB+fiBSSXgNCiAgUkl5IH5+IFJJeQ0KICBSSXggfn4gUkl5DQoNCiAgIyBTZXQgdGhlIHJlc2lkdWFsIHZhcmlhbmNlcyBvZiBhbGwgRlggdmFyaWFibGVzIHRvIDAuIEkgRE9OVCBVTkRFUlNUQU5EIFRISVMhIG5vIG1lYXN1cmVtZW50IGVycm9yPz8gDQogIEZlZHVjX2FfMSB+fiAwKkZlZHVjX2FfMQ0KICBGZWR1Y19hXzIgfn4gMCpGZWR1Y19hXzINCiAgRmVkdWNfYV8zIH5+IDAqRmVkdWNfYV8zDQogIEZlZHVjX2FfNCB+fiAwKkZlZHVjX2FfNA0KICBGZWR1Y19hXzUgfn4gMCpGZWR1Y19hXzUNCiAgRmVkdWNfYV82IH5+IDAqRmVkdWNfYV82DQogIEZlZHVjX2FfNyB+fiAwKkZlZHVjX2FfNw0KICBGZWR1Y19hXzggfn4gMCpGZWR1Y19hXzgNCiAgRmVkdWNfYV85IH5+IDAqRmVkdWNfYV85DQogIEZlZHVjX2FfMTAgfn4gMCpGZWR1Y19hXzEwDQogIEZlZHVjX2FfMTEgfn4gMCpGZWR1Y19hXzExDQogIA0KICAgICMgUmVncmVzc2lvbiBvZiByYW5kb20gaW50ZXJjZXB0cyBvbiB6MQ0KICBSSXggKyBSSXkgfiBiZXR3ZWVuX2VkdWMgKyBiZXR3ZWVuX2FnZSArIGJldHdlZW5fb3JpZ2luICsgYmV0d2Vlbl9mZW1hbGUjIENvbnN0cmFpbmVkIG92ZXIgdGltZS4NCg0KICAjIyMjIyMjIyMjIyMjIyMNCiAgIyBXSVRISU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICAjIENyZWF0ZSB3aXRoaW4tcGVyc29uIGNlbnRlcmVkIHZhcmlhYmxlcy4gDQogIHdGZWR1Y19hXzEgPX4gMSpGZWR1Y19hXzENCiAgd0ZlZHVjX2FfMiA9fiAxKkZlZHVjX2FfMg0KICB3RmVkdWNfYV8zID1+IDEqRmVkdWNfYV8zDQogIHdGZWR1Y19hXzQgPX4gMSpGZWR1Y19hXzQNCiAgd0ZlZHVjX2FfNSA9fiAxKkZlZHVjX2FfNQ0KICB3RmVkdWNfYV82ID1+IDEqRmVkdWNfYV82DQogIHdGZWR1Y19hXzcgPX4gMSpGZWR1Y19hXzcNCiAgd0ZlZHVjX2FfOCA9fiAxKkZlZHVjX2FfOA0KICB3RmVkdWNfYV85ID1+IDEqRmVkdWNfYV85DQogIHdGZWR1Y19hXzEwID1+IDEqRmVkdWNfYV8xMA0KICB3RmVkdWNfYV8xMSA9fiAxKkZlZHVjX2FfMTENCiAgd2luY19kaWZmXzEgPX4gMSppbmNfZGlmZl8xDQogIHdpbmNfZGlmZl8yID1+IDEqaW5jX2RpZmZfMg0KICB3aW5jX2RpZmZfMyA9fiAxKmluY19kaWZmXzMNCiAgd2luY19kaWZmXzQgPX4gMSppbmNfZGlmZl80DQogIHdpbmNfZGlmZl81ID1+IDEqaW5jX2RpZmZfNQ0KICB3aW5jX2RpZmZfNiA9fiAxKmluY19kaWZmXzYNCiAgd2luY19kaWZmXzcgPX4gMSppbmNfZGlmZl83DQogIHdpbmNfZGlmZl84ID1+IDEqaW5jX2RpZmZfOA0KICB3aW5jX2RpZmZfOSA9fiAxKmluY19kaWZmXzkNCiAgd2luY19kaWZmXzEwID1+IDEqaW5jX2RpZmZfMTANCiAgd2luY19kaWZmXzExID1+IDEqaW5jX2RpZmZfMTEgDQogIA0KICAjIEVzdGltYXRlIHRoZSBsYWdnZWQgZWZmZWN0cyAoY29uc3RyYWluZWQpDQogIHdpbmNfZGlmZl8yICAgfiB3aW5jX2RpZmZfMSArIHdGZWR1Y19hXzENCiAgd2luY19kaWZmXzMgICB+IHdpbmNfZGlmZl8yICsgd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfNCAgIH4gd2luY19kaWZmXzMgKyB3RmVkdWNfYV8zDQogIHdpbmNfZGlmZl81ICAgfiB3aW5jX2RpZmZfNCArIHdGZWR1Y19hXzQNCiAgd2luY19kaWZmXzYgICB+IHdpbmNfZGlmZl81ICsgd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNyAgIH4gd2luY19kaWZmXzYgKyB3RmVkdWNfYV82DQogIHdpbmNfZGlmZl84ICAgfiB3aW5jX2RpZmZfNyArIHdGZWR1Y19hXzcNCiAgd2luY19kaWZmXzkgICB+IHdpbmNfZGlmZl84ICsgd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfMTAgIH4gd2luY19kaWZmXzkgKyB3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMSAgfiB3aW5jX2RpZmZfMTAgKyB3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gd2luY19kaWZmXzEgKyB3RmVkdWNfYV8xDQogIHdGZWR1Y19hXzMgIH4gd2luY19kaWZmXzIgKyB3RmVkdWNfYV8yDQogIHdGZWR1Y19hXzQgIH4gd2luY19kaWZmXzMgKyB3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gd2luY19kaWZmXzQgKyB3RmVkdWNfYV80DQogIHdGZWR1Y19hXzYgIH4gd2luY19kaWZmXzUgKyB3RmVkdWNfYV81DQogIHdGZWR1Y19hXzcgIH4gd2luY19kaWZmXzYgKyB3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gd2luY19kaWZmXzcgKyB3RmVkdWNfYV83DQogIHdGZWR1Y19hXzkgIH4gd2luY19kaWZmXzggKyB3RmVkdWNfYV84DQogIHdGZWR1Y19hXzEwICB+IHdpbmNfZGlmZl85ICsgd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiB3aW5jX2RpZmZfMTAgKyB3RmVkdWNfYV8xMA0KICANCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZSBhdCB0aGUgZmlyc3Qgd2F2ZS4gDQogIHdpbmNfZGlmZl8xIH5+IHdGZWR1Y19hXzEgIyBDb3ZhcmlhbmNlDQoNCiAgIyBFc3RpbWF0ZSB0aGUgY292YXJpYW5jZXMgYmV0d2VlbiB0aGUgcmVzaWR1YWxzDQogIHdpbmNfZGlmZl8yIH5+IHdGZWR1Y19hXzINCiAgd2luY19kaWZmXzMgfn4gd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiB3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IHdGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfNyB+fiB3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IHdGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTAgfn4gd0ZlZHVjX2FfMTANCiAgd2luY19kaWZmXzExIH5+IHdGZWR1Y19hXzExDQogIA0KICAjIEVzdGltYXRlIHRoZSB2YXJpYW5jZSANCiAgd2luY19kaWZmXzEgfn4gd2luY19kaWZmXzEgDQogIHdGZWR1Y19hXzEgfn4gd0ZlZHVjX2FfMQ0KICANCiAgIyBFc3RpbWF0ZSB0aGUgcmVzaWR1YWwgdmFyaWFuY2UNCiAgd2luY19kaWZmXzIgfn4gd2luY19kaWZmXzIgDQogIHdGZWR1Y19hXzIgfn4gd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfMyB+fiB3aW5jX2RpZmZfMw0KICB3RmVkdWNfYV8zIH5+IHdGZWR1Y19hXzMNCiAgd2luY19kaWZmXzQgfn4gd2luY19kaWZmXzQgDQogIHdGZWR1Y19hXzQgfn4gd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiB2eSp3aW5jX2RpZmZfNQ0KICB3RmVkdWNfYV81IH5+IHdGZWR1Y19hXzUNCiAgd2luY19kaWZmXzYgfn4gd2luY19kaWZmXzYgDQogIHdGZWR1Y19hXzYgfn4gd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfNyB+fiB3aW5jX2RpZmZfNyANCiAgd0ZlZHVjX2FfNyB+fiB3RmVkdWNfYV83DQogIHdpbmNfZGlmZl84IH5+IHdpbmNfZGlmZl84IA0KICB3RmVkdWNfYV84IH5+IHdGZWR1Y19hXzgNCiAgd2luY19kaWZmXzkgfn4gd2luY19kaWZmXzkgDQogIHdGZWR1Y19hXzkgfn4gd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTAgfn4gd2luY19kaWZmXzEwIA0KICB3RmVkdWNfYV8xMCB+fiB3RmVkdWNfYV8xMA0KICB3aW5jX2RpZmZfMTEgfn4gd2luY19kaWZmXzExIA0KICB3RmVkdWNfYV8xMSB+fiB3RmVkdWNfYV8xMQ0KICANCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgIyBBRERJVElPTkFMIENPTlNUUkFJTlRTICMNCiAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAgDQogICMgU2V0IGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBiZXR3ZWVuLWZhY3RvcnMgKHJhbmRvbSBpbnRlcmNlcHRzKSBhbmQgd2l0aGluLQ0KICAjIGZhY3RvcnMgYXQgd2F2ZSAxIGF0IDAuIA0KICBSSXggKyBSSXkgfn4gMCp3RmVkdWNfYV8xICsgMCp3aW5jX2RpZmZfMQ0KICANCicNCg0KaW5jX2RpZmZfbW9kZWwxX2NvbnN0cmFpbmVkX2xhZyA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzEgKyAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqaW5jX2RpZmZfMSArIDEqaW5jX2RpZmZfMiArIDEqaW5jX2RpZmZfMyArIDEqaW5jX2RpZmZfNCArIDEqaW5jX2RpZmZfNSArIDEqaW5jX2RpZmZfNiArIDEqaW5jX2RpZmZfNyArIDEqaW5jX2RpZmZfOCArIDEqaW5jX2RpZmZfOSArIDEqaW5jX2RpZmZfMTAgKyAxKmluY19kaWZmXzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gSSBET05UIFVOREVSU1RBTkQgVEhJUyEgbm8gbWVhc3VyZW1lbnQgZXJyb3I/PyANCiAgRmVkdWNfYV8xIH5+IDAqRmVkdWNfYV8xDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCiAgDQogICAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3aW5jX2RpZmZfMSA9fiAxKmluY19kaWZmXzENCiAgd2luY19kaWZmXzIgPX4gMSppbmNfZGlmZl8yDQogIHdpbmNfZGlmZl8zID1+IDEqaW5jX2RpZmZfMw0KICB3aW5jX2RpZmZfNCA9fiAxKmluY19kaWZmXzQNCiAgd2luY19kaWZmXzUgPX4gMSppbmNfZGlmZl81DQogIHdpbmNfZGlmZl82ID1+IDEqaW5jX2RpZmZfNg0KICB3aW5jX2RpZmZfNyA9fiAxKmluY19kaWZmXzcNCiAgd2luY19kaWZmXzggPX4gMSppbmNfZGlmZl84DQogIHdpbmNfZGlmZl85ID1+IDEqaW5jX2RpZmZfOQ0KICB3aW5jX2RpZmZfMTAgPX4gMSppbmNfZGlmZl8xMA0KICB3aW5jX2RpZmZfMTEgPX4gMSppbmNfZGlmZl8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2luY19kaWZmXzIgICB+IGEqd2luY19kaWZmXzEgKyBiKndGZWR1Y19hXzENCiAgd2luY19kaWZmXzMgICB+IGEqd2luY19kaWZmXzIgKyBiKndGZWR1Y19hXzINCiAgd2luY19kaWZmXzQgICB+IGEqd2luY19kaWZmXzMgKyBiKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzUgICB+IGEqd2luY19kaWZmXzQgKyBiKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzYgICB+IGEqd2luY19kaWZmXzUgKyBiKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzcgICB+IGEqd2luY19kaWZmXzYgKyBiKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzggICB+IGEqd2luY19kaWZmXzcgKyBiKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzkgICB+IGEqd2luY19kaWZmXzggKyBiKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzEwICB+IGEqd2luY19kaWZmXzkgKyBiKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzExICB+IGEqd2luY19kaWZmXzEwICsgYip3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gYyp3aW5jX2RpZmZfMSArIGQqd0ZlZHVjX2FfMQ0KICB3RmVkdWNfYV8zICB+IGMqd2luY19kaWZmXzIgKyBkKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKndpbmNfZGlmZl8zICsgZCp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyp3aW5jX2RpZmZfNCArIGQqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMqd2luY19kaWZmXzUgKyBkKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKndpbmNfZGlmZl82ICsgZCp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyp3aW5jX2RpZmZfNyArIGQqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMqd2luY19kaWZmXzggKyBkKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyp3aW5jX2RpZmZfOSArIGQqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKndpbmNfZGlmZl8xMCArIGQqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3aW5jX2RpZmZfMSB+fiB3RmVkdWNfYV8xICMgQ292YXJpYW5jZQ0KDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3aW5jX2RpZmZfMiB+fiBjb3Yqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfMyB+fiBjb3Yqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiBjb3Yqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjb3Yqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiBjb3Yqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfNyB+fiBjb3Yqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjb3Yqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiBjb3Yqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTAgfn4gY292KndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjb3Yqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3aW5jX2RpZmZfMSB+fiB3aW5jX2RpZmZfMSANCiAgd0ZlZHVjX2FfMSB+fiB3RmVkdWNfYV8xDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3aW5jX2RpZmZfMiB+fiB2eSp3aW5jX2RpZmZfMiANCiAgd0ZlZHVjX2FfMiB+fiB2eCp3RmVkdWNfYV8yDQogIHdpbmNfZGlmZl8zIH5+IHZ5KndpbmNfZGlmZl8zDQogIHdGZWR1Y19hXzMgfn4gdngqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiB2eSp3aW5jX2RpZmZfNCANCiAgd0ZlZHVjX2FfNCB+fiB2eCp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IHZ5KndpbmNfZGlmZl81DQogIHdGZWR1Y19hXzUgfn4gdngqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiB2eSp3aW5jX2RpZmZfNiANCiAgd0ZlZHVjX2FfNiB+fiB2eCp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IHZ5KndpbmNfZGlmZl83IA0KICB3RmVkdWNfYV83IH5+IHZ4KndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzggfn4gdnkqd2luY19kaWZmXzggDQogIHdGZWR1Y19hXzggfn4gdngqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiB2eSp3aW5jX2RpZmZfOSANCiAgd0ZlZHVjX2FfOSB+fiB2eCp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiB2eSp3aW5jX2RpZmZfMTAgDQogIHdGZWR1Y19hXzEwIH5+IHZ4KndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiB2eSp3aW5jX2RpZmZfMTEgDQogIHdGZWR1Y19hXzExIH5+IHZ4KndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndpbmNfZGlmZl8xDQoNCicNCg0KaW5jX2RpZmZfbW9kZWwxX2NvbnN0cmFpbmVkX2xhZ19tZWFucyA8LSAnDQoNCiAgIyMjIyMjIyMjIyMjIyMjIw0KICAjIEJFVFdFRU4gUEFSVCAjDQogICMjIyMjIyMjIyMjIyMjIw0KDQogICMgQ3JlYXRlIGJldHdlZW4gY29tcG9uZW50cyAocmFuZG9tIGludGVyY2VwdHMpDQogIFJJeCA9fiAxKiBGZWR1Y19hXzEgKyAxKiBGZWR1Y19hXzIgKyAxKkZlZHVjX2FfMyArIDEqRmVkdWNfYV80ICsgMSpGZWR1Y19hXzUgKyAxKkZlZHVjX2FfNiArIDEqRmVkdWNfYV83ICsgMSpGZWR1Y19hXzggKyAxKkZlZHVjX2FfOSArIDEqRmVkdWNfYV8xMCArIDEqRmVkdWNfYV8xMQ0KICBSSXkgPX4gIDEqaW5jX2RpZmZfMSArIDEqaW5jX2RpZmZfMiArIDEqaW5jX2RpZmZfMyArIDEqaW5jX2RpZmZfNCArIDEqaW5jX2RpZmZfNSArIDEqaW5jX2RpZmZfNiArIDEqaW5jX2RpZmZfNyArIDEqaW5jX2RpZmZfOCArIDEqaW5jX2RpZmZfOSArIDEqaW5jX2RpZmZfMTAgKyAxKmluY19kaWZmXzExDQoNCiAgIyBFc3RpbWF0ZSB0aGUgdmFyaWFuY2UgYW5kIGNvdmFyaWFuY2Ugb2YgdGhlIHJhbmRvbSBpbnRlcmNlcHRzLiANCiAgUkl4IH5+IFJJeA0KICBSSXkgfn4gUkl5DQogIFJJeCB+fiBSSXkNCg0KICAjIFNldCB0aGUgcmVzaWR1YWwgdmFyaWFuY2VzIG9mIGFsbCBGWCB2YXJpYWJsZXMgdG8gMC4gSSBET05UIFVOREVSU1RBTkQgVEhJUyEgbm8gbWVhc3VyZW1lbnQgZXJyb3I/PyANCiAgRmVkdWNfYV8xIH5+IDAqRmVkdWNfYV8xDQogIEZlZHVjX2FfMiB+fiAwKkZlZHVjX2FfMg0KICBGZWR1Y19hXzMgfn4gMCpGZWR1Y19hXzMNCiAgRmVkdWNfYV80IH5+IDAqRmVkdWNfYV80DQogIEZlZHVjX2FfNSB+fiAwKkZlZHVjX2FfNQ0KICBGZWR1Y19hXzYgfn4gMCpGZWR1Y19hXzYNCiAgRmVkdWNfYV83IH5+IDAqRmVkdWNfYV83DQogIEZlZHVjX2FfOCB+fiAwKkZlZHVjX2FfOA0KICBGZWR1Y19hXzkgfn4gMCpGZWR1Y19hXzkNCiAgRmVkdWNfYV8xMCB+fiAwKkZlZHVjX2FfMTANCiAgRmVkdWNfYV8xMSB+fiAwKkZlZHVjX2FfMTENCiAgDQogICAgIyBSZWdyZXNzaW9uIG9mIHJhbmRvbSBpbnRlcmNlcHRzIG9uIHoxDQogIFJJeCArIFJJeSB+IGJldHdlZW5fZWR1YyArIGJldHdlZW5fYWdlICsgYmV0d2Vlbl9vcmlnaW4gKyBiZXR3ZWVuX2ZlbWFsZSMgQ29uc3RyYWluZWQgb3ZlciB0aW1lLg0KDQogICMjIyMjIyMjIyMjIyMjIw0KICAjIFdJVEhJTiBQQVJUICMNCiAgIyMjIyMjIyMjIyMjIyMjDQoNCiAgICMgQ3JlYXRlIHdpdGhpbi1wZXJzb24gY2VudGVyZWQgdmFyaWFibGVzLiANCiAgd0ZlZHVjX2FfMSA9fiAxKkZlZHVjX2FfMQ0KICB3RmVkdWNfYV8yID1+IDEqRmVkdWNfYV8yDQogIHdGZWR1Y19hXzMgPX4gMSpGZWR1Y19hXzMNCiAgd0ZlZHVjX2FfNCA9fiAxKkZlZHVjX2FfNA0KICB3RmVkdWNfYV81ID1+IDEqRmVkdWNfYV81DQogIHdGZWR1Y19hXzYgPX4gMSpGZWR1Y19hXzYNCiAgd0ZlZHVjX2FfNyA9fiAxKkZlZHVjX2FfNw0KICB3RmVkdWNfYV84ID1+IDEqRmVkdWNfYV84DQogIHdGZWR1Y19hXzkgPX4gMSpGZWR1Y19hXzkNCiAgd0ZlZHVjX2FfMTAgPX4gMSpGZWR1Y19hXzEwDQogIHdGZWR1Y19hXzExID1+IDEqRmVkdWNfYV8xMQ0KICB3aW5jX2RpZmZfMSA9fiAxKmluY19kaWZmXzENCiAgd2luY19kaWZmXzIgPX4gMSppbmNfZGlmZl8yDQogIHdpbmNfZGlmZl8zID1+IDEqaW5jX2RpZmZfMw0KICB3aW5jX2RpZmZfNCA9fiAxKmluY19kaWZmXzQNCiAgd2luY19kaWZmXzUgPX4gMSppbmNfZGlmZl81DQogIHdpbmNfZGlmZl82ID1+IDEqaW5jX2RpZmZfNg0KICB3aW5jX2RpZmZfNyA9fiAxKmluY19kaWZmXzcNCiAgd2luY19kaWZmXzggPX4gMSppbmNfZGlmZl84DQogIHdpbmNfZGlmZl85ID1+IDEqaW5jX2RpZmZfOQ0KICB3aW5jX2RpZmZfMTAgPX4gMSppbmNfZGlmZl8xMA0KICB3aW5jX2RpZmZfMTEgPX4gMSppbmNfZGlmZl8xMSANCiAgDQogICMgRXN0aW1hdGUgdGhlIGxhZ2dlZCBlZmZlY3RzIChjb25zdHJhaW5lZCkNCiAgd2luY19kaWZmXzIgICB+IGEqd2luY19kaWZmXzEgKyBiKndGZWR1Y19hXzENCiAgd2luY19kaWZmXzMgICB+IGEqd2luY19kaWZmXzIgKyBiKndGZWR1Y19hXzINCiAgd2luY19kaWZmXzQgICB+IGEqd2luY19kaWZmXzMgKyBiKndGZWR1Y19hXzMNCiAgd2luY19kaWZmXzUgICB+IGEqd2luY19kaWZmXzQgKyBiKndGZWR1Y19hXzQNCiAgd2luY19kaWZmXzYgICB+IGEqd2luY19kaWZmXzUgKyBiKndGZWR1Y19hXzUNCiAgd2luY19kaWZmXzcgICB+IGEqd2luY19kaWZmXzYgKyBiKndGZWR1Y19hXzYNCiAgd2luY19kaWZmXzggICB+IGEqd2luY19kaWZmXzcgKyBiKndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzkgICB+IGEqd2luY19kaWZmXzggKyBiKndGZWR1Y19hXzgNCiAgd2luY19kaWZmXzEwICB+IGEqd2luY19kaWZmXzkgKyBiKndGZWR1Y19hXzkNCiAgd2luY19kaWZmXzExICB+IGEqd2luY19kaWZmXzEwICsgYip3RmVkdWNfYV8xMA0KICANCiAgDQogIHdGZWR1Y19hXzIgIH4gYyp3aW5jX2RpZmZfMSArIGQqd0ZlZHVjX2FfMQ0KICB3RmVkdWNfYV8zICB+IGMqd2luY19kaWZmXzIgKyBkKndGZWR1Y19hXzINCiAgd0ZlZHVjX2FfNCAgfiBjKndpbmNfZGlmZl8zICsgZCp3RmVkdWNfYV8zDQogIHdGZWR1Y19hXzUgIH4gYyp3aW5jX2RpZmZfNCArIGQqd0ZlZHVjX2FfNA0KICB3RmVkdWNfYV82ICB+IGMqd2luY19kaWZmXzUgKyBkKndGZWR1Y19hXzUNCiAgd0ZlZHVjX2FfNyAgfiBjKndpbmNfZGlmZl82ICsgZCp3RmVkdWNfYV82DQogIHdGZWR1Y19hXzggIH4gYyp3aW5jX2RpZmZfNyArIGQqd0ZlZHVjX2FfNw0KICB3RmVkdWNfYV85ICB+IGMqd2luY19kaWZmXzggKyBkKndGZWR1Y19hXzgNCiAgd0ZlZHVjX2FfMTAgIH4gYyp3aW5jX2RpZmZfOSArIGQqd0ZlZHVjX2FfOQ0KICB3RmVkdWNfYV8xMSAgfiBjKndpbmNfZGlmZl8xMCArIGQqd0ZlZHVjX2FfMTANCiAgDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2UgYXQgdGhlIGZpcnN0IHdhdmUuIA0KICB3aW5jX2RpZmZfMSB+fiB3RmVkdWNfYV8xICMgQ292YXJpYW5jZQ0KDQogICMgRXN0aW1hdGUgdGhlIGNvdmFyaWFuY2VzIGJldHdlZW4gdGhlIHJlc2lkdWFscw0KICB3aW5jX2RpZmZfMiB+fiBjb3Yqd0ZlZHVjX2FfMg0KICB3aW5jX2RpZmZfMyB+fiBjb3Yqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiBjb3Yqd0ZlZHVjX2FfNA0KICB3aW5jX2RpZmZfNSB+fiBjb3Yqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiBjb3Yqd0ZlZHVjX2FfNg0KICB3aW5jX2RpZmZfNyB+fiBjb3Yqd0ZlZHVjX2FfNw0KICB3aW5jX2RpZmZfOCB+fiBjb3Yqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiBjb3Yqd0ZlZHVjX2FfOQ0KICB3aW5jX2RpZmZfMTAgfn4gY292KndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiBjb3Yqd0ZlZHVjX2FfMTENCiAgDQogICMgRXN0aW1hdGUgdGhlIHZhcmlhbmNlIA0KICB3aW5jX2RpZmZfMSB+fiB3aW5jX2RpZmZfMSANCiAgd0ZlZHVjX2FfMSB+fiB3RmVkdWNfYV8xDQogIA0KICAjIEVzdGltYXRlIHRoZSByZXNpZHVhbCB2YXJpYW5jZQ0KICB3aW5jX2RpZmZfMiB+fiB2eSp3aW5jX2RpZmZfMiANCiAgd0ZlZHVjX2FfMiB+fiB2eCp3RmVkdWNfYV8yDQogIHdpbmNfZGlmZl8zIH5+IHZ5KndpbmNfZGlmZl8zDQogIHdGZWR1Y19hXzMgfn4gdngqd0ZlZHVjX2FfMw0KICB3aW5jX2RpZmZfNCB+fiB2eSp3aW5jX2RpZmZfNCANCiAgd0ZlZHVjX2FfNCB+fiB2eCp3RmVkdWNfYV80DQogIHdpbmNfZGlmZl81IH5+IHZ5KndpbmNfZGlmZl81DQogIHdGZWR1Y19hXzUgfn4gdngqd0ZlZHVjX2FfNQ0KICB3aW5jX2RpZmZfNiB+fiB2eSp3aW5jX2RpZmZfNiANCiAgd0ZlZHVjX2FfNiB+fiB2eCp3RmVkdWNfYV82DQogIHdpbmNfZGlmZl83IH5+IHZ5KndpbmNfZGlmZl83IA0KICB3RmVkdWNfYV83IH5+IHZ4KndGZWR1Y19hXzcNCiAgd2luY19kaWZmXzggfn4gdnkqd2luY19kaWZmXzggDQogIHdGZWR1Y19hXzggfn4gdngqd0ZlZHVjX2FfOA0KICB3aW5jX2RpZmZfOSB+fiB2eSp3aW5jX2RpZmZfOSANCiAgd0ZlZHVjX2FfOSB+fiB2eCp3RmVkdWNfYV85DQogIHdpbmNfZGlmZl8xMCB+fiB2eSp3aW5jX2RpZmZfMTAgDQogIHdGZWR1Y19hXzEwIH5+IHZ4KndGZWR1Y19hXzEwDQogIHdpbmNfZGlmZl8xMSB+fiB2eSp3aW5jX2RpZmZfMTEgDQogIHdGZWR1Y19hXzExIH5+IHZ4KndGZWR1Y19hXzExDQogIA0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICAjIEFERElUSU9OQUwgQ09OU1RSQUlOVFMgIw0KICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KICANCiAgIyBTZXQgY29ycmVsYXRpb25zIGJldHdlZW4gdGhlIGJldHdlZW4tZmFjdG9ycyAocmFuZG9tIGludGVyY2VwdHMpIGFuZCB3aXRoaW4tDQogICMgZmFjdG9ycyBhdCB3YXZlIDEgYXQgMC4gDQogIFJJeCArIFJJeSB+fiAwKndGZWR1Y19hXzEgKyAwKndpbmNfZGlmZl8xDQogIA0KICANCiAgI2NvbnN0cmFpbiBncmFuZCBtZWFucyBvdmVyIHRpbWUNCiAgaW5jX2RpZmZfMSArIGluY19kaWZmXzIgKyBpbmNfZGlmZl8zICsgaW5jX2RpZmZfNCArIGluY19kaWZmXzUgKyBpbmNfZGlmZl82ICsgaW5jX2RpZmZfNyArIGluY19kaWZmXzggKyBpbmNfZGlmZl85ICsgaW5jX2RpZmZfMTAgKyBpbmNfZGlmZl8xMSB+IG15KjENCiAgDQogIEZlZHVjX2FfMSArIEZlZHVjX2FfMiArIEZlZHVjX2FfMyArIEZlZHVjX2FfNCArIEZlZHVjX2FfNSArIEZlZHVjX2FfNiArIEZlZHVjX2FfNyArIEZlZHVjX2FfOCArIEZlZHVjX2FfOSArIEZlZHVjX2FfMTAgKyBGZWR1Y19hXzExIH4gbXgqMQ0KDQonDQoNCg0KI3NhdmUgbW9kZWwgc3BlY2lmaWNhdGlvbnMgaW4gbGlzdA0KaW5jX2RpZmZfbGF2YWFuX21vZGVscyA8LSBsaXN0KGluY19kaWZmX21vZGVsMV91bmNvbnN0cmFpbmVkLA0KICAgICBpbmNfZGlmZl9tb2RlbDFfY29uc3RyYWluZWRfbGFnLA0KICAgICBpbmNfZGlmZl9tb2RlbDFfY29uc3RyYWluZWRfbGFnX21lYW5zDQogICAgICkNCg0KYGBgDQoNCg0KIyMjIE1haW4gYW5hbHlzaXM6IGVzdGltYXRlIG1vZGVscyAoTUwvIEZJTUwpDQoNCmBgYHtyIGVzdGltYXRlIG1haW4gYW5hbHlzaXN9DQpsYXZhYW5fbW9kZWxzX21haW4gPC0gbGlzdChldV9sYXZhYW5fbW9kZWxzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VsdF9sYXZhYW5fbW9kZWxzLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jX2RpZmZfbGF2YWFuX21vZGVscykNCg0KIyBwYXJhbGVsbGl6ZSB0aGUgZXN0aW1hdGlvbg0KbnVtQ29yZXMgPC0gZGV0ZWN0Q29yZXMoKQ0KcmVnaXN0ZXJEb1BhcmFsbGVsKGNvcmUgPSAzKQ0KDQojaW5pdGlhbGl6ZSBmb3JlYWNoIGxvb3ANCm1haW5fcmVzdWx0cyA8LSBmb3JlYWNoKGEgPSAxOjMpICU6JQ0KICBmb3JlYWNoKGIgPSAxOjMsIC5wYWNrYWdlcyA9IGMoInRpZHl2ZXJzZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGF2YWFuIikpICVkb3BhciUgew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXZhYW4oDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF2YWFuX21vZGVsc19tYWluW1thXV1bW2JdXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gTXlEYXRhLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc3NpbmcgPSAnTUwnLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuc3RydWN0dXJlID0gVCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50Lm92LmZyZWUgPSBUDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCiNzdG9wIHBhcnJhbGVsbGl6YXRpb24NCnN0b3BJbXBsaWNpdENsdXN0ZXIoKQ0KYGBgDQoNCg0KYGBge3IgbWFpbiByZXN1bHRzIGZpdCBzdGF0aXN0aWNzfQ0KI3BhcmFsbGVsIGNvbXB1dGluZw0KcmVnaXN0ZXJEb1BhcmFsbGVsKGNvcmUgPSAzKQ0KDQojc3RvcmUgZml0IHN0YXRzIG9mIGFsbCBtb2RlbHMNCmZpdF9saXN0IDwtIGZvcmVhY2goYT0xOjMpICU6JQ0KICBmb3JlYWNoKGI9MTozLA0KICAgICAgICAgIC5jb21iaW5lID0gcmJpbmQsDQogICAgICAgICAgLnBhY2thZ2VzID0gImxhdmFhbiIpICVkb3BhciUgew0KICAgICAgICAgICAgbGF2SW5zcGVjdChtYWluX3Jlc3VsdHNbW2FdXVtbYl1dLCB3aGF0ID0gImZpdCIpDQogICAgICAgICAgfQ0KDQpuYW1lcyhmaXRfbGlzdCkgPC0gYygiRVUgbW9kZWxzIiwgIkN1bHR1cmFsIEluY2x1c2lvbiBtb2RlbHMiLCAiSW5jb21lIERpZmZlcmVuY2UgbW9kZWxzIikNCg0KI3N0b3AgcGFycmFsZWxsaXphdGlvbg0Kc3RvcEltcGxpY2l0Q2x1c3RlcigpDQpgYGANCg0KDQojIyMgTWFpbiBhbmFseXNpczogZXN0aW1hdGUgbW9kZWxzIChNTFIpDQoNCmBgYHtyIGVzdGltYXRlIG1haW4gYW5hbHlzaXMgTUxSfQ0KIyBwYXJhbGVsbGl6ZSB0aGUgZXN0aW1hdGlvbg0KbnVtQ29yZXMgPC0gZGV0ZWN0Q29yZXMoKQ0KcmVnaXN0ZXJEb1BhcmFsbGVsKGNvcmUgPSAzKQ0KDQojaW5pdGlhbGl6ZSBmb3JlYWNoIGxvb3ANCm1haW5fcmVzdWx0c19NTFIgPC0gZm9yZWFjaChhID0gMTozKSAlOiUNCiAgZm9yZWFjaChiID0gMTozLCAucGFja2FnZXMgPSBjKCJ0aWR5dmVyc2UiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxhdmFhbiIpKSAlZG9wYXIlIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF2YWFuKA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdmFhbl9tb2RlbHNfbWFpbltbYV1dW1tiXV0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IE15RGF0YSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0b3IgPSAnTUxSJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNzaW5nID0gIk1MIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWFuc3RydWN0dXJlID0gVCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50Lm92LmZyZWUgPSBUDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KDQptYWluX3Jlc3VsdHNfTUxGIDwtIGZvcmVhY2goYSA9IDE6MykgJTolDQogIGZvcmVhY2goYiA9IDE6MywgLnBhY2thZ2VzID0gYygidGlkeXZlcnNlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsYXZhYW4iKSkgJWRvcGFyJSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdmFhbigNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXZhYW5fbW9kZWxzX21haW5bW2FdXVtbYl1dLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBNeURhdGEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdG9yID0gJ01MRicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZyA9ICJNTCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbnN0cnVjdHVyZSA9IFQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludC5vdi5mcmVlID0gVA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQojc3RvcCBwYXJyYWxlbGxpemF0aW9uDQpzdG9wSW1wbGljaXRDbHVzdGVyKCkNCg0KDQojcGFyYWxsZWwgY29tcHV0aW5nDQpyZWdpc3RlckRvUGFyYWxsZWwoY29yZSA9IDMpDQoNCiNzdG9yZSBmaXQgc3RhdHMgb2YgYWxsIG1vZGVscw0KZml0X2xpc3RfTUxSIDwtIGZvcmVhY2goYT0xOjMpICU6JQ0KICBmb3JlYWNoKGI9MTozLA0KICAgICAgICAgIC5jb21iaW5lID0gcmJpbmQsDQogICAgICAgICAgLnBhY2thZ2VzID0gImxhdmFhbiIpICVkb3BhciUgew0KICAgICAgICAgICAgbGF2SW5zcGVjdChtYWluX3Jlc3VsdHNfTUxSW1thXV1bW2JdXSwgd2hhdCA9ICJmaXQiKQ0KICAgICAgICAgIH0NCg0KbmFtZXMoZml0X2xpc3RfTUxSKSA8LSBjKCJFVSBtb2RlbHMiLCAiQ3VsdHVyYWwgSW5jbHVzaW9uIG1vZGVscyIsICJJbmNvbWUgRGlmZmVyZW5jZSBtb2RlbHMiKQ0KDQojc3RvcCBwYXJyYWxlbGxpemF0aW9uDQpzdG9wSW1wbGljaXRDbHVzdGVyKCkNCmBgYA0KDQoNCiMgRXhwb3J0IHJlc3VsdHMNCg0KYGBge3Igc2F2ZSByZXN1bHRzfQ0KbWFpbl9sYXZhYW5fcmVzdWx0cyA8LSBsaXN0KG1haW5fcmVzdWx0c19NTFIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF2YWFuX21vZGVsc19tYWluLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXRfbGlzdF9NTFIpDQoNCm5hbWVzKG1haW5fbGF2YWFuX3Jlc3VsdHMpIDwtIGMoIk1haW4gbGF2YWFuIHJlc3VsdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTGF2YWFuIG1vZGVsIG9iamVjdHMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRml0IHN0YXRpc3RpY3MgKGV4dHJhY3RlZCkiKQ0KDQpzYXZlKG1haW5fbGF2YWFuX3Jlc3VsdHMsDQogICAgIGZpbGUgPSAicmVzdWx0cy9yaWNscG0vMjQwODE2X2xhdmFhbi1tYWluLXJlc3VsdHMuUmRhdGEiKQ0KDQpgYGANCg0K


Copyright © 2024 Jeroense Thijmen