1 Data processing

1.1 Packages

pacman::p_load(tidyverse, readxl, janitor,  dplyr, tidyr, ggplot2, openxlsx,  psych, corrplot, factoextra,lavaan)

1.2 Dataframe

df <- read_excel("C:/Users/louis/Downloads/four_countries_data.xlsx")

1.3 Clean data

df = clean_names(df)
df = remove_empty(df)
value for "which" not specified, defaulting to c("rows", "cols")
df = df %>% mutate_all(~ tolower(.) %>% stringi::stri_trans_general(.,"Latin-ASCII"))

1.4 Remove duplicated lines

df <- df[-c(1, 2), ]

1.5 Create a new df only with the items

#important items: Perception of AI - q1_p_ai_1, q2_p_ai_1 and q3_p_ai_1; Adoption of AI - q4_ado_ai_1, q5_ado_ai_1, q6_ado_ai_1. 

df_items <- subset(df, select = c(finished, q1_p_ai_1, q2_p_ai_1, q3_p_ai_1, q4_ado_ai_1, q5_ado_ai_1, q6_ado_ai_1))

1.6 Check - everyone finished the questionnaire?

unique(df_items$finished) #yes, everyone completed the questionnaire
[1] "true"

1.7 Check NA’s

sum(is.na(df_items$q1_p_ai_1))
[1] 55
sum(is.na(df_items$q2_p_ai_1))
[1] 55
sum(is.na(df_items$q3_p_ai_1))
[1] 55
sum(is.na(df_items$q4_ado_ai_1))
[1] 55
sum(is.na(df_items$q5_ado_ai_1))
[1] 55
sum(is.na(df_items$q6_ado_ai_1))
[1] 55

1.8 Rename variables and transform into numeric

df_items <- df_items %>%
  rename(perception_1 = q1_p_ai_1,
         perception_2 = q2_p_ai_1,
         perception_3 = q3_p_ai_1,
         adoption_1 = q4_ado_ai_1,
         adoption_2 = q5_ado_ai_1,
         adoption_3 = q6_ado_ai_1) %>%
  mutate(across(c(perception_1:perception_3, adoption_1:adoption_3), 
                as.numeric)) %>%
  mutate(across(c(perception_1:perception_3, adoption_1:adoption_3), 
                ~ round(., 2)))

1.9 Check variables

df_items %>% names
[1] "finished"     "perception_1" "perception_2" "perception_3" "adoption_1"   "adoption_2"   "adoption_3"  

2 Data analysis

2.1 Data imputation

df_items <- df_items %>%
  mutate(across(perception_1:adoption_3, ~ ifelse(is.na(.), mean(., na.rm = TRUE), .))) %>%
  mutate(across(c(perception_1:perception_3, adoption_1:adoption_3), 
                ~ round(., 2)))

2.2 Internal consistency - AI Perception

df_items %>%
  select(perception_1:perception_3) %>%
  alpha ()
Number of categories should be increased  in order to count frequencies. 

Reliability analysis   
Call: alpha(x = .)

 

    95% confidence boundaries 

 Reliability if an item is dropped:

 Item statistics 

2.3 Internal consistency - AI Adoption

df_items %>%
  select(adoption_1:adoption_3) %>%
  alpha ()
Number of categories should be increased  in order to count frequencies. 

Reliability analysis   
Call: alpha(x = .)

 

    95% confidence boundaries 

 Reliability if an item is dropped:

 Item statistics 
correlation_matrix <- cor(df_items[, c("perception_1", "perception_2", "perception_3")])

corrplot(correlation_matrix, method = "circle", type = "upper", tl.col = "black", tl.srt = 45)

correlation_total <- cor(df_items[, c("perception_1", "perception_2", "perception_3", "adoption_1", "adoption_2", "adoption_3")])

correlation_total
             perception_1 perception_2 perception_3 adoption_1 adoption_2 adoption_3
perception_1    1.0000000    0.1393240    0.1422010  0.1431429  0.1615556  0.1603307
perception_2    0.1393240    1.0000000    0.8191796  0.6211067  0.5757151  0.4947517
perception_3    0.1422010    0.8191796    1.0000000  0.6550311  0.5989819  0.5229324
adoption_1      0.1431429    0.6211067    0.6550311  1.0000000  0.6380226  0.5054160
adoption_2      0.1615556    0.5757151    0.5989819  0.6380226  1.0000000  0.4980452
adoption_3      0.1603307    0.4947517    0.5229324  0.5054160  0.4980452  1.0000000
df_items <- df_items %>% select(-finished) # I removed the questionnaire completion variable

2.4 Exploratory Factor Analysis

fa.parallel(df_items, fa = "fa")
Parallel analysis suggests that the number of factors =  2  and the number of components =  NA 

fa_result <- fa(df_items, nfactors = 2, rotate = "varimax")

print(fa_result)
Factor Analysis using method =  minres
Call: fa(r = df_items, nfactors = 2, rotate = "varimax")
Standardized loadings (pattern matrix) based upon correlation matrix

                       MR1  MR2
SS loadings           1.83 1.55
Proportion Var        0.30 0.26
Cumulative Var        0.30 0.56
Proportion Explained  0.54 0.46
Cumulative Proportion 0.54 1.00

Mean item complexity =  1.6
Test of the hypothesis that 2 factors are sufficient.

df null model =  15  with the objective function =  2.81 with Chi Square =  3039.18
df of  the model are 4  and the objective function was  0 

The root mean square of the residuals (RMSR) is  0.01 
The df corrected root mean square of the residuals is  0.02 

The harmonic n.obs is  1084 with the empirical chi square  3.08  with prob <  0.54 
The total n.obs was  1084  with Likelihood Chi Square =  3.51  with prob <  0.48 

Tucker Lewis Index of factoring reliability =  1.001
RMSEA index =  0  and the 90 % confidence intervals are  0 0.043
BIC =  -24.44
Fit based upon off diagonal values = 1
Measures of factor score adequacy             
                                                   MR1  MR2
Correlation of (regression) scores with factors   0.90 0.79
Multiple R square of scores with factors          0.81 0.63
Minimum correlation of possible factor scores     0.63 0.26
fa.diagram(fa_result)

2.5 Confirmatory Factor Analysis

df_items %>% names
[1] "perception_1" "perception_2" "perception_3" "adoption_1"   "adoption_2"   "adoption_3"  
model <- '
  Factor1 =~ perception_1 + perception_2 + perception_3
  Factor2 =~ adoption_1 + adoption_2 + adoption_3
'
fit <- cfa(model, data = df_items)
summary(fit, fit.measures = TRUE, standardized = TRUE)
lavaan 0.6.17 ended normally after 51 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        13

  Number of observations                          1084

Model Test User Model:
                                                      
  Test statistic                                17.165
  Degrees of freedom                                 8
  P-value (Chi-square)                           0.028

Model Test Baseline Model:

  Test statistic                              3049.966
  Degrees of freedom                                15
  P-value                                        0.000

User Model versus Baseline Model:

  Comparative Fit Index (CFI)                    0.997
  Tucker-Lewis Index (TLI)                       0.994

Loglikelihood and Information Criteria:

  Loglikelihood user model (H0)             -13870.105
  Loglikelihood unrestricted model (H1)     -13861.523
                                                      
  Akaike (AIC)                               27766.210
  Bayesian (BIC)                             27831.059
  Sample-size adjusted Bayesian (SABIC)      27789.768

Root Mean Square Error of Approximation:

  RMSEA                                          0.033
  90 Percent confidence interval - lower         0.010
  90 Percent confidence interval - upper         0.054
  P-value H_0: RMSEA <= 0.050                    0.906
  P-value H_0: RMSEA >= 0.080                    0.000

Standardized Root Mean Square Residual:

  SRMR                                           0.021

Parameter Estimates:

  Standard errors                             Standard
  Information                                 Expected
  Information saturated (h1) model          Structured

Latent Variables:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  Factor1 =~                                                            
    perception_1      1.000                               0.513    0.165
    perception_2      3.859    0.734    5.261    0.000    1.979    0.884
    perception_3      4.156    0.789    5.265    0.000    2.131    0.926
  Factor2 =~                                                            
    adoption_1        1.000                               2.098    0.819
    adoption_2        0.924    0.036   25.926    0.000    1.939    0.769
    adoption_3        0.866    0.041   21.049    0.000    1.817    0.639

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  Factor1 ~~                                                            
    Factor2           0.924    0.182    5.085    0.000    0.859    0.859

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .perception_1      9.359    0.403   23.222    0.000    9.359    0.973
   .perception_2      1.099    0.084   13.053    0.000    1.099    0.219
   .perception_3      0.751    0.087    8.635    0.000    0.751    0.142
   .adoption_1        2.156    0.143   15.043    0.000    2.156    0.329
   .adoption_2        2.597    0.148   17.519    0.000    2.597    0.409
   .adoption_3        4.770    0.231   20.614    0.000    4.770    0.591
    Factor1           0.263    0.100    2.626    0.009    1.000    1.000
    Factor2           4.402    0.288   15.304    0.000    1.000    1.000

3 Final conclusion

Exploratory Factor Analysis (EFA) and Confirmatory Factor Analysis (CFA) are both heavily used in psychology and psychometrics. Despite both analyses sharing some common background, we tend to use EFA when we have no prior knowledge about the internal structure of a tool. Therefore, even if we think the tool consists of two constructs (perception and adoption), we believe we don’t have a strong theoretical background to run a CFA on this data. However, if we ask the computer to run the analysis, it will run the analysis. The interpretation of the results, on the other hand, tends to be fragile and can be severely criticized. In summary, we carried out four analyses: (1) we calculated the Cronbach’s alpha of each proposed factor (perception and adoption) and their respective items; (2) we checked the correlations between these items; (3) we carried out an exploratory analysis to explore the nature and number of hidden factors; and (4) we carried out the confirmatory analysis based not on the results of the EFA but on the proposed relationship between all items and their respective constructs. Despite the differences in naming and rationale behind all analyses, these models are very similar and share the same mathematical background, which is based on correlation analysis. Due to computational settings, we used the maximum likelihood estimator. Other estimators could be used to better handle categorical data. Minor issues just occurred. When calculating Cronbach’s alpha, we noticed a discrepancy between the proposed factors of AI Perception and AI Adoption. The perception factor had a lower alpha (0.63) compared to the adoption factor (0.78). This greater variability in the perception scale can be justified by several reasons, which is why we implemented other analyses such as exploratory analysis. In this analysis, we found that item 1 of perception is not related to either the perception or AI adoption factor. Therefore, we do not recommend using this item. Regarding the correlational results, we observed that the correlations between the perception items (perception_1, perception_2, perception_3) and the adoption items (adoption_1, adoption_2, adoption_3) indicate that there is a moderate to strong relationship between items within the same categories (perception or adoption). The correlations are higher among perception items (e.g., 0.819 between perception_2 and perception_3) and among adoption items (e.g., 0.638 between adoption_1 and adoption_2). The correlations between perception items and adoption items are lower, suggesting that although there is some relationship between perception and adoption, they are distinct enough to be considered separate factors.

LS0tDQp0aXRsZTogIkxMTXMgYW5kIHBzeWNob21ldHJpY3MgLSBMdWlzICYgTG91aXNlIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGNzczogZXN0aWxvLmNzcw0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIHRoZW1lOiBzYW5kc3RvbmUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHRydWUNCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQogICAgbnVtYmVyX3NlY3Rpb25zOiB0cnVlDQogICAgZmlnX2NhcHRpb246IHRydWUNCiAgICBoaWdobGlnaHQ6IHRhbmdvDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCi0tLQ0KDQojIERhdGEgcHJvY2Vzc2luZw0KDQojIyBQYWNrYWdlcw0KDQpgYGB7cn0NCnBhY21hbjo6cF9sb2FkKHRpZHl2ZXJzZSwgcmVhZHhsLCBqYW5pdG9yLCAgZHBseXIsIHRpZHlyLCBnZ3Bsb3QyLCBvcGVueGxzeCwgIHBzeWNoLCBjb3JycGxvdCwgZmFjdG9leHRyYSxsYXZhYW4pDQpgYGANCg0KIyMgRGF0YWZyYW1lDQoNCmBgYHtyfQ0KZGYgPC0gcmVhZF9leGNlbCgiQzovVXNlcnMvbG91aXMvRG93bmxvYWRzL2ZvdXJfY291bnRyaWVzX2RhdGEueGxzeCIpDQpgYGANCg0KIyMgQ2xlYW4gZGF0YQ0KDQpgYGB7cn0NCmRmID0gY2xlYW5fbmFtZXMoZGYpDQpkZiA9IHJlbW92ZV9lbXB0eShkZikNCmRmID0gZGYgJT4lIG11dGF0ZV9hbGwofiB0b2xvd2VyKC4pICU+JSBzdHJpbmdpOjpzdHJpX3RyYW5zX2dlbmVyYWwoLiwiTGF0aW4tQVNDSUkiKSkNCmBgYA0KDQojIyBSZW1vdmUgZHVwbGljYXRlZCBsaW5lcyANCmBgYHtyfQ0KZGYgPC0gZGZbLWMoMSwgMiksIF0NCmBgYA0KDQojIyBDcmVhdGUgYSBuZXcgZGYgb25seSB3aXRoIHRoZSBpdGVtcw0KYGBge3J9DQojaW1wb3J0YW50IGl0ZW1zOiBQZXJjZXB0aW9uIG9mIEFJIC0gcTFfcF9haV8xLCBxMl9wX2FpXzEgYW5kIHEzX3BfYWlfMTsgQWRvcHRpb24gb2YgQUkgLSBxNF9hZG9fYWlfMSwgcTVfYWRvX2FpXzEsIHE2X2Fkb19haV8xLiANCg0KZGZfaXRlbXMgPC0gc3Vic2V0KGRmLCBzZWxlY3QgPSBjKGZpbmlzaGVkLCBxMV9wX2FpXzEsIHEyX3BfYWlfMSwgcTNfcF9haV8xLCBxNF9hZG9fYWlfMSwgcTVfYWRvX2FpXzEsIHE2X2Fkb19haV8xKSkNCg0KYGBgDQoNCiMjIENoZWNrIC0gZXZlcnlvbmUgZmluaXNoZWQgdGhlIHF1ZXN0aW9ubmFpcmU/DQpgYGB7cn0NCnVuaXF1ZShkZl9pdGVtcyRmaW5pc2hlZCkgI3llcywgZXZlcnlvbmUgY29tcGxldGVkIHRoZSBxdWVzdGlvbm5haXJlDQpgYGANCiMjIENoZWNrIE5BJ3MNCmBgYHtyfQ0Kc3VtKGlzLm5hKGRmX2l0ZW1zJHExX3BfYWlfMSkpDQpzdW0oaXMubmEoZGZfaXRlbXMkcTJfcF9haV8xKSkNCnN1bShpcy5uYShkZl9pdGVtcyRxM19wX2FpXzEpKQ0Kc3VtKGlzLm5hKGRmX2l0ZW1zJHE0X2Fkb19haV8xKSkNCnN1bShpcy5uYShkZl9pdGVtcyRxNV9hZG9fYWlfMSkpDQpzdW0oaXMubmEoZGZfaXRlbXMkcTZfYWRvX2FpXzEpKQ0KYGBgDQoNCiMjIFJlbmFtZSB2YXJpYWJsZXMgYW5kIHRyYW5zZm9ybSBpbnRvIG51bWVyaWMNCg0KYGBge3J9DQpkZl9pdGVtcyA8LSBkZl9pdGVtcyAlPiUNCiAgcmVuYW1lKHBlcmNlcHRpb25fMSA9IHExX3BfYWlfMSwNCiAgICAgICAgIHBlcmNlcHRpb25fMiA9IHEyX3BfYWlfMSwNCiAgICAgICAgIHBlcmNlcHRpb25fMyA9IHEzX3BfYWlfMSwNCiAgICAgICAgIGFkb3B0aW9uXzEgPSBxNF9hZG9fYWlfMSwNCiAgICAgICAgIGFkb3B0aW9uXzIgPSBxNV9hZG9fYWlfMSwNCiAgICAgICAgIGFkb3B0aW9uXzMgPSBxNl9hZG9fYWlfMSkgJT4lDQogIG11dGF0ZShhY3Jvc3MoYyhwZXJjZXB0aW9uXzE6cGVyY2VwdGlvbl8zLCBhZG9wdGlvbl8xOmFkb3B0aW9uXzMpLCANCiAgICAgICAgICAgICAgICBhcy5udW1lcmljKSkgJT4lDQogIG11dGF0ZShhY3Jvc3MoYyhwZXJjZXB0aW9uXzE6cGVyY2VwdGlvbl8zLCBhZG9wdGlvbl8xOmFkb3B0aW9uXzMpLCANCiAgICAgICAgICAgICAgICB+IHJvdW5kKC4sIDIpKSkNCmBgYA0KDQojIyBDaGVjayB2YXJpYWJsZXMNCmBgYHtyfQ0KZGZfaXRlbXMgJT4lIG5hbWVzDQpgYGANCiMgRGF0YSBhbmFseXNpcyANCiMjIERhdGEgaW1wdXRhdGlvbiANCmBgYHtyfQ0KZGZfaXRlbXMgPC0gZGZfaXRlbXMgJT4lDQogIG11dGF0ZShhY3Jvc3MocGVyY2VwdGlvbl8xOmFkb3B0aW9uXzMsIH4gaWZlbHNlKGlzLm5hKC4pLCBtZWFuKC4sIG5hLnJtID0gVFJVRSksIC4pKSkgJT4lDQogIG11dGF0ZShhY3Jvc3MoYyhwZXJjZXB0aW9uXzE6cGVyY2VwdGlvbl8zLCBhZG9wdGlvbl8xOmFkb3B0aW9uXzMpLCANCiAgICAgICAgICAgICAgICB+IHJvdW5kKC4sIDIpKSkNCmBgYA0KDQojIyBJbnRlcm5hbCBjb25zaXN0ZW5jeSAtIEFJIFBlcmNlcHRpb24NCmBgYHtyfQ0KZGZfaXRlbXMgJT4lDQogIHNlbGVjdChwZXJjZXB0aW9uXzE6cGVyY2VwdGlvbl8zKSAlPiUNCiAgYWxwaGEgKCkNCmBgYA0KDQoNCiMjIEludGVybmFsIGNvbnNpc3RlbmN5IC0gQUkgQWRvcHRpb24NCmBgYHtyfQ0KZGZfaXRlbXMgJT4lDQogIHNlbGVjdChhZG9wdGlvbl8xOmFkb3B0aW9uXzMpICU+JQ0KICBhbHBoYSAoKQ0KYGBgDQoNCg0KYGBge3J9DQpjb3JyZWxhdGlvbl9tYXRyaXggPC0gY29yKGRmX2l0ZW1zWywgYygicGVyY2VwdGlvbl8xIiwgInBlcmNlcHRpb25fMiIsICJwZXJjZXB0aW9uXzMiKV0pDQoNCmNvcnJwbG90KGNvcnJlbGF0aW9uX21hdHJpeCwgbWV0aG9kID0gImNpcmNsZSIsIHR5cGUgPSAidXBwZXIiLCB0bC5jb2wgPSAiYmxhY2siLCB0bC5zcnQgPSA0NSkNCmBgYA0KDQpgYGB7cn0NCmNvcnJlbGF0aW9uX3RvdGFsIDwtIGNvcihkZl9pdGVtc1ssIGMoInBlcmNlcHRpb25fMSIsICJwZXJjZXB0aW9uXzIiLCAicGVyY2VwdGlvbl8zIiwgImFkb3B0aW9uXzEiLCAiYWRvcHRpb25fMiIsICJhZG9wdGlvbl8zIildKQ0KDQpjb3JyZWxhdGlvbl90b3RhbA0KYGBgDQoNCmBgYHtyfQ0KZGZfaXRlbXMgPC0gZGZfaXRlbXMgJT4lIHNlbGVjdCgtZmluaXNoZWQpICMgSSByZW1vdmVkIHRoZSBxdWVzdGlvbm5haXJlIGNvbXBsZXRpb24gdmFyaWFibGUNCmBgYA0KDQojIyBFeHBsb3JhdG9yeSBGYWN0b3IgQW5hbHlzaXMNCg0KYGBge3J9DQpmYS5wYXJhbGxlbChkZl9pdGVtcywgZmEgPSAiZmEiKQ0KDQpmYV9yZXN1bHQgPC0gZmEoZGZfaXRlbXMsIG5mYWN0b3JzID0gMiwgcm90YXRlID0gInZhcmltYXgiKQ0KDQpwcmludChmYV9yZXN1bHQpDQpmYS5kaWFncmFtKGZhX3Jlc3VsdCkNCmBgYA0KDQojIyBDb25maXJtYXRvcnkgRmFjdG9yIEFuYWx5c2lzDQoNCmBgYHtyfQ0KZGZfaXRlbXMgJT4lIG5hbWVzDQpgYGANCg0KYGBge3J9DQptb2RlbCA8LSAnDQogIEZhY3RvcjEgPX4gcGVyY2VwdGlvbl8xICsgcGVyY2VwdGlvbl8yICsgcGVyY2VwdGlvbl8zDQogIEZhY3RvcjIgPX4gYWRvcHRpb25fMSArIGFkb3B0aW9uXzIgKyBhZG9wdGlvbl8zDQonDQpgYGANCg0KYGBge3J9DQpmaXQgPC0gY2ZhKG1vZGVsLCBkYXRhID0gZGZfaXRlbXMpDQpgYGANCg0KYGBge3J9DQpzdW1tYXJ5KGZpdCwgZml0Lm1lYXN1cmVzID0gVFJVRSwgc3RhbmRhcmRpemVkID0gVFJVRSkNCmBgYA0KDQojIEZpbmFsIGNvbmNsdXNpb24NCkV4cGxvcmF0b3J5IEZhY3RvciBBbmFseXNpcyAoRUZBKSBhbmQgQ29uZmlybWF0b3J5IEZhY3RvciBBbmFseXNpcyAoQ0ZBKSBhcmUgYm90aCBoZWF2aWx5IHVzZWQgaW4gcHN5Y2hvbG9neSBhbmQgcHN5Y2hvbWV0cmljcy4gRGVzcGl0ZSBib3RoIGFuYWx5c2VzIHNoYXJpbmcgc29tZSBjb21tb24gYmFja2dyb3VuZCwgd2UgdGVuZCB0byB1c2UgRUZBIHdoZW4gd2UgaGF2ZSBubyBwcmlvciBrbm93bGVkZ2UgYWJvdXQgdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiBhIHRvb2wuIFRoZXJlZm9yZSwgZXZlbiBpZiB3ZSB0aGluayB0aGUgdG9vbCBjb25zaXN0cyBvZiB0d28gY29uc3RydWN0cyAocGVyY2VwdGlvbiBhbmQgYWRvcHRpb24pLCB3ZSBiZWxpZXZlIHdlIGRvbid0IGhhdmUgYSBzdHJvbmcgdGhlb3JldGljYWwgYmFja2dyb3VuZCB0byBydW4gYSBDRkEgb24gdGhpcyBkYXRhLiBIb3dldmVyLCBpZiB3ZSBhc2sgdGhlIGNvbXB1dGVyIHRvIHJ1biB0aGUgYW5hbHlzaXMsIGl0IHdpbGwgcnVuIHRoZSBhbmFseXNpcy4gVGhlIGludGVycHJldGF0aW9uIG9mIHRoZSByZXN1bHRzLCBvbiB0aGUgb3RoZXIgaGFuZCwgdGVuZHMgdG8gYmUgZnJhZ2lsZSBhbmQgY2FuIGJlIHNldmVyZWx5IGNyaXRpY2l6ZWQuIEluIHN1bW1hcnksIHdlIGNhcnJpZWQgb3V0IGZvdXIgYW5hbHlzZXM6ICgxKSB3ZSBjYWxjdWxhdGVkIHRoZSBDcm9uYmFjaCdzIGFscGhhIG9mIGVhY2ggcHJvcG9zZWQgZmFjdG9yIChwZXJjZXB0aW9uIGFuZCBhZG9wdGlvbikgYW5kIHRoZWlyIHJlc3BlY3RpdmUgaXRlbXM7ICgyKSB3ZSBjaGVja2VkIHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGVzZSBpdGVtczsgKDMpIHdlIGNhcnJpZWQgb3V0IGFuIGV4cGxvcmF0b3J5IGFuYWx5c2lzIHRvIGV4cGxvcmUgdGhlIG5hdHVyZSBhbmQgbnVtYmVyIG9mIGhpZGRlbiBmYWN0b3JzOyBhbmQgKDQpIHdlIGNhcnJpZWQgb3V0IHRoZSBjb25maXJtYXRvcnkgYW5hbHlzaXMgYmFzZWQgbm90IG9uIHRoZSByZXN1bHRzIG9mIHRoZSBFRkEgYnV0IG9uIHRoZSBwcm9wb3NlZCByZWxhdGlvbnNoaXAgYmV0d2VlbiBhbGwgaXRlbXMgYW5kIHRoZWlyIHJlc3BlY3RpdmUgY29uc3RydWN0cy4gRGVzcGl0ZSB0aGUgZGlmZmVyZW5jZXMgaW4gbmFtaW5nIGFuZCByYXRpb25hbGUgYmVoaW5kIGFsbCBhbmFseXNlcywgdGhlc2UgbW9kZWxzIGFyZSB2ZXJ5IHNpbWlsYXIgYW5kIHNoYXJlIHRoZSBzYW1lIG1hdGhlbWF0aWNhbCBiYWNrZ3JvdW5kLCB3aGljaCBpcyBiYXNlZCBvbiBjb3JyZWxhdGlvbiBhbmFseXNpcy4gRHVlIHRvIGNvbXB1dGF0aW9uYWwgc2V0dGluZ3MsIHdlIHVzZWQgdGhlIG1heGltdW0gbGlrZWxpaG9vZCBlc3RpbWF0b3IuIE90aGVyIGVzdGltYXRvcnMgY291bGQgYmUgdXNlZCB0byBiZXR0ZXIgaGFuZGxlIGNhdGVnb3JpY2FsIGRhdGEuIE1pbm9yIGlzc3VlcyBqdXN0IG9jY3VycmVkLiBXaGVuIGNhbGN1bGF0aW5nIENyb25iYWNoJ3MgYWxwaGEsIHdlIG5vdGljZWQgYSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoZSBwcm9wb3NlZCBmYWN0b3JzIG9mIEFJIFBlcmNlcHRpb24gYW5kIEFJIEFkb3B0aW9uLiBUaGUgcGVyY2VwdGlvbiBmYWN0b3IgaGFkIGEgbG93ZXIgYWxwaGEgKDAuNjMpIGNvbXBhcmVkIHRvIHRoZSBhZG9wdGlvbiBmYWN0b3IgKDAuNzgpLiBUaGlzIGdyZWF0ZXIgdmFyaWFiaWxpdHkgaW4gdGhlIHBlcmNlcHRpb24gc2NhbGUgY2FuIGJlIGp1c3RpZmllZCBieSBzZXZlcmFsIHJlYXNvbnMsIHdoaWNoIGlzIHdoeSB3ZSBpbXBsZW1lbnRlZCBvdGhlciBhbmFseXNlcyBzdWNoIGFzIGV4cGxvcmF0b3J5IGFuYWx5c2lzLiBJbiB0aGlzIGFuYWx5c2lzLCB3ZSBmb3VuZCB0aGF0IGl0ZW0gMSBvZiBwZXJjZXB0aW9uIGlzIG5vdCByZWxhdGVkIHRvIGVpdGhlciB0aGUgcGVyY2VwdGlvbiBvciBBSSBhZG9wdGlvbiBmYWN0b3IuIFRoZXJlZm9yZSwgd2UgZG8gbm90IHJlY29tbWVuZCB1c2luZyB0aGlzIGl0ZW0uIFJlZ2FyZGluZyB0aGUgY29ycmVsYXRpb25hbCByZXN1bHRzLCB3ZSBvYnNlcnZlZCB0aGF0IHRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgcGVyY2VwdGlvbiBpdGVtcyAocGVyY2VwdGlvbl8xLCBwZXJjZXB0aW9uXzIsIHBlcmNlcHRpb25fMykgYW5kIHRoZSBhZG9wdGlvbiBpdGVtcyAoYWRvcHRpb25fMSwgYWRvcHRpb25fMiwgYWRvcHRpb25fMykgaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBhIG1vZGVyYXRlIHRvIHN0cm9uZyByZWxhdGlvbnNoaXAgYmV0d2VlbiBpdGVtcyB3aXRoaW4gdGhlIHNhbWUgY2F0ZWdvcmllcyAocGVyY2VwdGlvbiBvciBhZG9wdGlvbikuIFRoZSBjb3JyZWxhdGlvbnMgYXJlIGhpZ2hlciBhbW9uZyBwZXJjZXB0aW9uIGl0ZW1zIChlLmcuLCAwLjgxOSBiZXR3ZWVuIHBlcmNlcHRpb25fMiBhbmQgcGVyY2VwdGlvbl8zKSBhbmQgYW1vbmcgYWRvcHRpb24gaXRlbXMgKGUuZy4sIDAuNjM4IGJldHdlZW4gYWRvcHRpb25fMSBhbmQgYWRvcHRpb25fMikuIFRoZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiBwZXJjZXB0aW9uIGl0ZW1zIGFuZCBhZG9wdGlvbiBpdGVtcyBhcmUgbG93ZXIsIHN1Z2dlc3RpbmcgdGhhdCBhbHRob3VnaCB0aGVyZSBpcyBzb21lIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHBlcmNlcHRpb24gYW5kIGFkb3B0aW9uLCB0aGV5IGFyZSBkaXN0aW5jdCBlbm91Z2ggdG8gYmUgY29uc2lkZXJlZCBzZXBhcmF0ZSBmYWN0b3JzLg==