Oleh : Purwoko Haryadi Santoso
Prodi : Penelitian dan Evaluasi Pendidikan
Mata kuliah : Statistik Multivariat

A. Menetapkan direktori kerja

Pada bagian ini kita menentukan lokasi folder yang digunakan untuk menyimpan file R, data, images, atau beberapa file lainnya yang berhubungan dengan pekerjaan kita di dalam R.

dir="D:/DOCUMENTS/Kuliah Strata-3/2. Kuliah Semester 1/5. Statistik Multivariat (Kam, 07.30)/UAS Multivariat/path analysis"
setwd(dir)

B. Diagram yang menjelaskan Theory of Planned Behavior

Theory of planned behavior (TPB) yang diajukan Ajzen (1991) adalah model teoretik yang menjelaskan bahwa perilaku (behavior) seseorang dipengaruhi oleh niatnya (intention) sedangkan niat seseorang ditentukan oleh sikap (attitude), norma yang berlaku (norms), dan kendali diri (control) yang dimilikinya. Sedangkan menurut TPB tidak ada pengaruh langsung antara attitude, norms, dan control terhadap behavior. Artinya terdapat pengaruh langsung attitude, norms, control terhadap intention dan intention terhadap behavior. Kemudian, terdapat pengaruh tidak langsung attitude, norms, control terhadap behavior melalui variabel mediasi yaitu intention. Penelitian ini akan membuktikan kebenaran teori TPB dengan menggunakan analisis jalur. Gambar di bawah merepresentasikan diagram jalur dari Theory of Planned Behavior.

C. Input dataset

Pada bagian ini, kita menentukan letak dimana file data berada. Dalam hal ini file data disimpan dalam format “PlannedBehavior.csv”. Karena kita telah menentukan letak direktori kerja pada “D:/path analysis” maka kita cukup mengetik “data/PlannedBehavior.csv” saja.

library(readr)
df <- read_csv("data/PlannedBehavior.csv", show_col_types = FALSE)

1. Preview data

Bagian di bawah ini merupakan pratinjau 6 data pertama yang digunakan dimana terdapat 5 variabel dimana 3 variabel eksogen (attitude, norms, control) dan 2 variabel endogen (intention & behahior)

head(df)

2. Statistik deskriptif

Pada bagian ini, ditampilkan statistik deskriptif setiap variabel di dalam dataset. Dapat dilihat bahwa terdapat 100 baris data (dilihat pada kolom n). Kelima variabel memiliki skor dengan skala antara 1 sampai 6 dapat dilihat dari kolom min dan max. Terdapat beberapa variabel memiliki standar deviasi yang hampir mirip seperti attitude (0.77) dan behavior (0.73) serta norms (1.06) dan control (1.01).

library(psych)
describe(df)

Untuk memeriksa normalitas data, kita bisa tinjau dari plot histogram dan boxplot-nya. Berdasarkan plot distribusi histogram, terdapat 3 variabel yang mendekati distribusi normal (norms, control, intention). Sedangkan untuk attitude dan behavior memiliki skewness negatif.

multi.hist(df)

Selain histogram, kita juga bisa menggunakan boxplot untuk mengambarkan distribusi data. Batas garis putus-putus menunjukkan range dari setiap data variabel yaitu (min 1 dan max 6). Kemudian, “box” yang dibuat menggambarkan letak Q3, Q2 (median, garis tebal di tengah), dan Q1. Outlier (pencilan) biasanya akan terdeteksi jika terdapat titik-titik data diluar “box” ini. Berdasarkan boxplot yang ditampilkan, tidak terdapat pencilan yang muncul di dalam data attitude dan intention.

boxplot(df)

D. Asumsi Analisis

Sama seperti asumsi regresi linear yaitu asumsi yang umum digunakan adalah residu yang berdistribusi normal dan ada beberapa asumsi tambahan yang harus dipenuhi dalam analisis jalur antara lain :
1. Variabel data harus memiliki skala pengukuran yang kontinyu (interval atau rasio).
2. Variabel data dalam model bebas kesalahan pengukuran (reliabel).
3. Model hubungan bersifat rekursif (satu arah dan tidak berkebalikan).
4. Residu tidak berhubungan satu sama lain.
5. Hubungan arahnya adalah linear dan additif.

E. Pemodelan dengan pendekatan regresi linear berganda

1. Menentukan korelasi antara variabel eksogen

  • Antara attitude ~~ norms memiliki korelasi 0.227
  • Antara attitude ~~ control memiliki korelasi 0.357
  • Antara norms ~~ control memiliki korelasi 0.249
library(corrplot)
corrplot(cor(df), method="number")

2. Spesifikasi model A (intention model)

Pada model A (intention model), kita ingin memodelkan pengaruh langsung attitude, norms, dan control terhadap intention melalui pendekatan regresi linear berganda.
alt text here

specmod <- "intention ~ attitude + norms + control"

3. Estimasi model A (intention model)

int.model <- lm(specmod, data=df)

4. Hasil pemodelan A (intention model)

summary(int.model)

Call:
lm(formula = specmod, data = df)

Residuals:
     Min       1Q   Median       3Q      Max 
-1.80282 -0.52734 -0.06018  0.51228  1.85202 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  0.58579    0.23963   2.445   0.0154 *  
attitude     0.35232    0.05866   6.006 9.13e-09 ***
norms        0.15250    0.05979   2.550   0.0115 *  
control      0.27502    0.05862   4.692 5.09e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.7356 on 195 degrees of freedom
Multiple R-squared:  0.369, Adjusted R-squared:  0.3593 
F-statistic: 38.01 on 3 and 195 DF,  p-value: < 2.2e-16

5. Menampilkan koefisien jalur (Beta) untuk model A

library(QuantPsyc)
lm.beta(int.model)
 attitude     norms   control 
0.3701939 0.1515933 0.2907633 

6. Spesifikasi model B (behavior model)

Pada model B (behavior model), kita ingin memodelkan pengaruh langsung intention terhadap behavior melalui pendekatan regresi linear berganda. alt text here

specmod <- "behavior ~ intention"

7. Estimasi model B (behavior model)

bhv.model <- lm(specmod, data=df)

8. Hasil pemodelan B (behavior model)

summary(bhv.model)

Call:
lm(formula = specmod, data = df)

Residuals:
     Min       1Q   Median       3Q      Max 
-2.03770 -0.55555  0.06686  0.63565  1.75678 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)  1.74252    0.20377   8.552 3.37e-15 ***
intention    0.45338    0.06496   6.979 4.43e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.8401 on 197 degrees of freedom
Multiple R-squared:  0.1982,    Adjusted R-squared:  0.1942 
F-statistic: 48.71 on 1 and 197 DF,  p-value: 4.427e-11

9. Menampilkan koefisien jalur (Beta) untuk model B

lm.beta(bhv.model)
intention 
  0.44523 

10. Menentukan error pada model A (intention model) dan model B (behavior model)

Model A (Intention Model)

sqrt(1-summary(int.model)$r.squared)
[1] 0.7943479

Model B (Behavior Model)

sqrt(1-summary(bhv.model)$r.squared)
[1] 0.8954163

F. Import library model SEM (path analysis) dengan pendekatan model fitting

Latent Variable Analysis atau “lavaan” adalah library open source yang dikembangkan dalam pemrograman R. Library ini digunakan untuk mengerjakan berbagai macam analisis multivariat termasuk analisis jalur, CFA, SEM, dan growth curve model (dokumentasi lebih lengkapnya dapat dilihat di lavaan.ugent.be).

library(lavaan)

G. Analisis jalur dengan pendekatan model fitting

1. Spesifikasi model

specmod <- "
# Jalur langsung model A dan B (pada regresi) dianalisis bersamaan dengan kovariansnya juga
intention ~ attitude + norms + control
behavior ~ intention

# Kovarians (korelasi antar variabel eksogen)
attitude ~~ norms + control
norms ~~ control
"

2. Estimasi pemodelan

fitmod <- sem(specmod, data=df)

3. Hasil pemodelan dengan model fitting

summary(fitmod, standardized = TRUE)
lavaan 0.6-9 ended normally after 17 iterations

  Estimator                                         ML
  Optimization method                           NLMINB
  Number of model parameters                        12
                                                      
  Number of observations                           199
                                                      
Model Test User Model:
                                                      
  Test statistic                                 2.023
  Degrees of freedom                                 3
  P-value (Chi-square)                           0.568

Parameter Estimates:

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

Regressions:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  intention ~                                                           
    attitude          0.352    0.058    6.068    0.000    0.352    0.370
    norms             0.153    0.059    2.577    0.010    0.153    0.152
    control           0.275    0.058    4.740    0.000    0.275    0.291
  behavior ~                                                            
    intention         0.453    0.065    7.014    0.000    0.453    0.445

Covariances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
  attitude ~~                                                           
    norms             0.200    0.064    3.128    0.002    0.200    0.227
    control           0.334    0.070    4.748    0.000    0.334    0.357
  norms ~~                                                              
    control           0.220    0.065    3.411    0.001    0.220    0.249

Variances:
                   Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
   .intention         0.530    0.053    9.975    0.000    0.530    0.631
   .behavior          0.699    0.070    9.975    0.000    0.699    0.802
    attitude          0.928    0.093    9.975    0.000    0.928    1.000
    norms             0.830    0.083    9.975    0.000    0.830    1.000
    control           0.939    0.094    9.975    0.000    0.939    1.000

4. Menampilkan berbagai indeks fitting

fitmeasures(fitmod)
               npar                fmin               chisq                  df              pvalue 
             12.000               0.005               2.023               3.000               0.568 
     baseline.chisq         baseline.df     baseline.pvalue                 cfi                 tli 
            182.295              10.000               0.000               1.000               1.019 
               nnfi                 rfi                 nfi                pnfi                 ifi 
              1.019               0.963               0.989               0.297               1.005 
                rni                logl   unrestricted.logl                 aic                 bic 
              1.006           -1258.517           -1257.506            2541.035            2580.555 
             ntotal                bic2               rmsea      rmsea.ci.lower      rmsea.ci.upper 
            199.000            2542.538               0.000               0.000               0.103 
       rmsea.pvalue                 rmr          rmr_nomean                srmr        srmr_bentler 
              0.735               0.017               0.017               0.019               0.019 
srmr_bentler_nomean                crmr         crmr_nomean          srmr_mplus   srmr_mplus_nomean 
              0.019               0.023               0.023               0.019               0.019 
              cn_05               cn_01                 gfi                agfi                pgfi 
            769.591            1116.785               0.996               0.980               0.199 
                mfi                ecvi 
              1.002               0.131 

5. Menggambar diagram jalur

library(semPlot)
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
semPaths(fitmod, "std", rotation=2, layout = "tree2", curvature = 2, nCharNodes = 0, nDigits = 3,
             sizeMan = 10, sizeInt = 5, sizeLat = 5, edge.label.cex=1.2, exoVar = FALSE, fade=FALSE)

H. Bagaimana menentukan derajat kebebasan ?

Terdapat lima variabel unique yaitu intention, attitude, norms, control, behavior.
Untuk mengetahui berapa komponen kovarians dan varians unik dalam matriks kovarians (korelasi), kelima variabel ini adalah lower diagonal dari matriks kovarians/ korelasi.

Formula untuk menentukan jumlah informasi unik non redundant = V(V+1)/2 (Meyers, Gamst, & Guarino, 2016).
dimana V = jumlah variabel di dalam data = 5
Maka, jumlah informasi unik non redundant dalam model = 15

Jumlah parameter = menghitung parameter estimate antara lain directional relation (4), error terms(2), varians (3) dan kovarians variabel eksogen (3) = 12 (lihat tabel di atas “number of model parameters”)

derajat kebebasan = 15 - 12 = 3
Lihat “Degrees of freedom” pada model test user output diatas

Nilai ini lebih besar daripada nol (0) yang berarti bahwa model overidentified artinya kita bisa menginterpretasikan model fit dengan beberapa indeks fitting di bawah ini.

I. Lima indeks fit yang perlu diperhatikan untuk mengevaluasi model apakah sudah fit dengan data atau belum

  1. Chi square test
    Dalam hasil kita, Model Fit Test Statistics menunjukkan statistik Chi square (17.574) dan p-value (Chi-square) sama dengan 0.568 lebih besar dari 0.05 yang berarti bahwa Ho diterima atau Model sudah fit terhadap data.
  2. Comparative Fit Index (CFI)
    Dalam hasil kita ditemukan CFI = 1.000 dimana kriterianya CFI > 0.9 yang berarti bahwa model sudah fit terhadap data.
  3. Tucker Luwis Index (TLI)  Dalam hasil kita ditemukan TLI = 1.019 dimana kriterianya TLI > 0.95 yang berarti bahwa model sudah fit terhadap data.
  4. Root Mean Square Error of Approximation (RMSEA)  Dalam hasil kita ditemukan RMSEA = 0.000 dimana kriterianya RMSEA < 0.08 yang berarti bahwa model sudah fit terhadap data.
  5. Standardized Root Mean Square Residual (SRMR)
    Dalam hasil kita ditemukan bahwa SRMR adalah 0.019 dimana kriterianya SRMR < 0.08 yang berarti bahwa model sudah fit dengan data.

Berdasarkan kelima indikator evaluasi ini menyimpulkan bahwa model jalur kita sudah fit terhadap data yang tersedia. Jika kemungkinan model masih belum fit, kita harus kembali ke tahap spesifikasi parameter model dan memotong jalur yang tidak signifikan.

J. Persamaan regresi dan R-squared

Lihat p-value nya jika < 0.05 berarti berpengaruh secara signifikan.
Nilai koefisien jalur (beta) lihat pada Std.all masing-masing variabel prediktor.
Kemudian errornya lihat pada Variances pada Std.all. Agar nilainya sama dengan error pada pendekatan regresi linear carilah akar daripadanya.
R-squared menjelaskan seberapa besar varians variabel bebas menentukan varians variabel terikat.




LS0tDQp0aXRsZTogIioqUGF0aCBBbmFseXNpcyBkZW5nYW4gTWVuZ2d1bmFrYW4gUioqIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQNCiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0DQotLS0NCg0KT2xlaCAgICA6IFB1cndva28gSGFyeWFkaSBTYW50b3NvXA0KUHJvZGkgICAgIDogUGVuZWxpdGlhbiBkYW4gRXZhbHVhc2kgUGVuZGlkaWthblwNCk1hdGEga3VsaWFoIDogU3RhdGlzdGlrIE11bHRpdmFyaWF0DQoNClxiZWdpbntjZW50ZXJ9IE9sZWggICAgOiBQdXJ3b2tvIEhhcnlhZGkgU2FudG9zbyAoTklNLiAyMTcwMTI2MTA0NCkgXGVuZHtjZW50ZXJ9DQpcYmVnaW57Y2VudGVyfSBQcm9kaSAgICAgOiBQZW5lbGl0aWFuIGRhbiBFdmFsdWFzaSBQZW5kaWRpa2FuIFxlbmR7Y2VudGVyfQ0KXGJlZ2lue2NlbnRlcn0gTWF0YSBrdWxpYWggOiBTdGF0aXN0aWsgTXVsdGl2YXJpYXQgXGVuZHtjZW50ZXJ9DQpcYmVnaW57Y2VudGVyfSBEb3NlbiBQZW5nYW1wdSAgIDogRHIuIEthbmEgSGlkYXlhdGksIE0uUGQgXGVuZHtjZW50ZXJ9DQpcYmVnaW57Y2VudGVyfSBQcm9ncmFtIERva3RvciBQZW5lbGl0aWFuIGRhbiBFdmFsdWFzaSBQZW5kaWRpa2FuLCBVTlkgXGVuZHtjZW50ZXJ9DQoNCiMjIEEuIE1lbmV0YXBrYW4gZGlyZWt0b3JpIGtlcmphDQoNClBhZGEgYmFnaWFuIGluaSBraXRhIG1lbmVudHVrYW4gbG9rYXNpIGZvbGRlciB5YW5nIGRpZ3VuYWthbiB1bnR1ayBtZW55aW1wYW4gZmlsZSBSLCBkYXRhLCBpbWFnZXMsIGF0YXUgYmViZXJhcGEgZmlsZSBsYWlubnlhIHlhbmcgYmVyaHVidW5nYW4gZGVuZ2FuIHBla2VyamFhbiBraXRhIGRpIGRhbGFtIFIuDQoNCmBgYHtyfQ0KZGlyPSJEOi9ET0NVTUVOVFMvS3VsaWFoIFN0cmF0YS0zLzIuIEt1bGlhaCBTZW1lc3RlciAxLzUuIFN0YXRpc3RpayBNdWx0aXZhcmlhdCAoS2FtLCAwNy4zMCkvVUFTIE11bHRpdmFyaWF0L3BhdGggYW5hbHlzaXMiDQpzZXR3ZChkaXIpDQpgYGANCg0KIyMgQi4gRGlhZ3JhbSB5YW5nIG1lbmplbGFza2FuICpUaGVvcnkgb2YgUGxhbm5lZCBCZWhhdmlvcioNCg0KKlRoZW9yeSBvZiBwbGFubmVkIGJlaGF2aW9yKiAoVFBCKSB5YW5nIGRpYWp1a2FuIEFqemVuICgxOTkxKSBhZGFsYWggbW9kZWwgdGVvcmV0aWsgeWFuZyBtZW5qZWxhc2thbiBiYWh3YSBwZXJpbGFrdSAoKmJlaGF2aW9yKikgc2VzZW9yYW5nIGRpcGVuZ2FydWhpIG9sZWggbmlhdG55YSAoKmludGVudGlvbiopIHNlZGFuZ2thbiBuaWF0IHNlc2VvcmFuZyBkaXRlbnR1a2FuIG9sZWggc2lrYXAgKCphdHRpdHVkZSopLCBub3JtYSB5YW5nIGJlcmxha3UgKCpub3JtcyopLCBkYW4ga2VuZGFsaSBkaXJpICgqY29udHJvbCopIHlhbmcgZGltaWxpa2lueWEuIFNlZGFuZ2thbiBtZW51cnV0IFRQQiB0aWRhayBhZGEgcGVuZ2FydWggbGFuZ3N1bmcgYW50YXJhICphdHRpdHVkZSosICpub3JtcyosIGRhbiAqY29udHJvbCogdGVyaGFkYXAgKmJlaGF2aW9yKi4gQXJ0aW55YSB0ZXJkYXBhdCAqKnBlbmdhcnVoIGxhbmdzdW5nKiogKmF0dGl0dWRlKiwgKm5vcm1zKiwgKmNvbnRyb2wqIHRlcmhhZGFwICppbnRlbnRpb24qIGRhbiAqaW50ZW50aW9uKiB0ZXJoYWRhcCAqYmVoYXZpb3IqLiBLZW11ZGlhbiwgdGVyZGFwYXQgcGVuZ2FydWggKip0aWRhayBsYW5nc3VuZyoqICphdHRpdHVkZSosICpub3JtcyosICpjb250cm9sKiB0ZXJoYWRhcCAqYmVoYXZpb3IqIG1lbGFsdWkgdmFyaWFiZWwgbWVkaWFzaSB5YWl0dSAqaW50ZW50aW9uKi4gUGVuZWxpdGlhbiBpbmkgYWthbiBtZW1idWt0aWthbiBrZWJlbmFyYW4gdGVvcmkgVFBCIGRlbmdhbiBtZW5nZ3VuYWthbiBhbmFsaXNpcyBqYWx1ci4gR2FtYmFyIGRpIGJhd2FoIG1lcmVwcmVzZW50YXNpa2FuIGRpYWdyYW0gamFsdXIgZGFyaSAqVGhlb3J5IG9mIFBsYW5uZWQgQmVoYXZpb3IqLg0KDQohW10oaW1hZ2VzL1RQQi5wbmcpDQoNCiMjIEMuIElucHV0IGRhdGFzZXQNClBhZGEgYmFnaWFuIGluaSwga2l0YSBtZW5lbnR1a2FuIGxldGFrIGRpbWFuYSBmaWxlIGRhdGEgYmVyYWRhLiBEYWxhbSBoYWwgaW5pIGZpbGUgZGF0YSBkaXNpbXBhbiBkYWxhbSBmb3JtYXQg4oCcUGxhbm5lZEJlaGF2aW9yLmNzduKAnS4gS2FyZW5hIGtpdGEgdGVsYWggbWVuZW50dWthbiBsZXRhayBkaXJla3Rvcmkga2VyamEgcGFkYSDigJxEOi9wYXRoIGFuYWx5c2lz4oCdIG1ha2Ega2l0YSBjdWt1cCBtZW5nZXRpayDigJxkYXRhL1BsYW5uZWRCZWhhdmlvci5jc3bigJ0gc2FqYS4NCg0KYGBge3J9DQpsaWJyYXJ5KHJlYWRyKQ0KZGYgPC0gcmVhZF9jc3YoImRhdGEvUGxhbm5lZEJlaGF2aW9yLmNzdiIsIHNob3dfY29sX3R5cGVzID0gRkFMU0UpDQpgYGANCg0KIyMjIDEuIFByZXZpZXcgZGF0YQ0KQmFnaWFuIGRpIGJhd2FoIGluaSBtZXJ1cGFrYW4gcHJhdGluamF1IDYgZGF0YSBwZXJ0YW1hIHlhbmcgZGlndW5ha2FuIGRpbWFuYSB0ZXJkYXBhdCA1IHZhcmlhYmVsIGRpbWFuYSAzIHZhcmlhYmVsIGVrc29nZW4gKCphdHRpdHVkZSosICpub3JtcyosICpjb250cm9sKikgZGFuIDIgdmFyaWFiZWwgZW5kb2dlbiAoKmludGVudGlvbiogJiAqYmVoYWhpb3IqKQ0KYGBge3J9DQpoZWFkKGRmKQ0KYGBgDQoNCiMjIyAyLiBTdGF0aXN0aWsgZGVza3JpcHRpZg0KUGFkYSBiYWdpYW4gaW5pLCBkaXRhbXBpbGthbiBzdGF0aXN0aWsgZGVza3JpcHRpZiBzZXRpYXAgdmFyaWFiZWwgZGkgZGFsYW0gZGF0YXNldC4gRGFwYXQgZGlsaWhhdCBiYWh3YSB0ZXJkYXBhdCAxMDAgYmFyaXMgZGF0YSAoZGlsaWhhdCBwYWRhIGtvbG9tIG4pLiBLZWxpbWEgdmFyaWFiZWwgbWVtaWxpa2kgc2tvciBkZW5nYW4gc2thbGEgYW50YXJhIDEgc2FtcGFpIDYgZGFwYXQgZGlsaWhhdCBkYXJpIGtvbG9tICoqbWluKiogZGFuICoqbWF4KiouIFRlcmRhcGF0IGJlYmVyYXBhIHZhcmlhYmVsIG1lbWlsaWtpIHN0YW5kYXIgZGV2aWFzaSB5YW5nIGhhbXBpciBtaXJpcCBzZXBlcnRpICphdHRpdHVkZSogKDAuNzcpIGRhbiAqYmVoYXZpb3IqICgwLjczKSBzZXJ0YSAqbm9ybXMqICgxLjA2KSBkYW4gKmNvbnRyb2wqICgxLjAxKS4NCmBgYHtyfQ0KbGlicmFyeShwc3ljaCkNCmRlc2NyaWJlKGRmKQ0KYGBgDQoNClVudHVrIG1lbWVyaWtzYSBub3JtYWxpdGFzIGRhdGEsIGtpdGEgYmlzYSB0aW5qYXUgZGFyaSBwbG90IGhpc3RvZ3JhbSBkYW4gYm94cGxvdC1ueWEuIEJlcmRhc2Fya2FuIHBsb3QgZGlzdHJpYnVzaSBoaXN0b2dyYW0sIHRlcmRhcGF0IDMgdmFyaWFiZWwgeWFuZyBtZW5kZWthdGkgZGlzdHJpYnVzaSBub3JtYWwgKCpub3JtcyosICpjb250cm9sKiwgKmludGVudGlvbiopLiBTZWRhbmdrYW4gdW50dWsgKmF0dGl0dWRlKiBkYW4gKmJlaGF2aW9yKiBtZW1pbGlraSAqc2tld25lc3MqIG5lZ2F0aWYuDQpgYGB7cn0NCm11bHRpLmhpc3QoZGYpDQpgYGANCg0KU2VsYWluIGhpc3RvZ3JhbSwga2l0YSBqdWdhIGJpc2EgbWVuZ2d1bmFrYW4gKmJveHBsb3QqIHVudHVrIG1lbmdhbWJhcmthbiBkaXN0cmlidXNpIGRhdGEuIEJhdGFzIGdhcmlzIHB1dHVzLXB1dHVzIG1lbnVuanVra2FuIHJhbmdlIGRhcmkgc2V0aWFwIGRhdGEgdmFyaWFiZWwgeWFpdHUgKG1pbiAxIGRhbiBtYXggNikuIEtlbXVkaWFuLCDigJwqYm94KuKAnSB5YW5nIGRpYnVhdCBtZW5nZ2FtYmFya2FuIGxldGFrIFEzLCBRMiAobWVkaWFuLCBnYXJpcyB0ZWJhbCBkaSB0ZW5nYWgpLCBkYW4gUTEuICpPdXRsaWVyKiAocGVuY2lsYW4pIGJpYXNhbnlhIGFrYW4gdGVyZGV0ZWtzaSBqaWthIHRlcmRhcGF0IHRpdGlrLXRpdGlrIGRhdGEgZGlsdWFyIOKAnGJveOKAnSBpbmkuIEJlcmRhc2Fya2FuIGJveHBsb3QgeWFuZyBkaXRhbXBpbGthbiwgdGlkYWsgdGVyZGFwYXQgcGVuY2lsYW4geWFuZyBtdW5jdWwgZGkgZGFsYW0gZGF0YSAqYXR0aXR1ZGUqIGRhbiAqaW50ZW50aW9uKi4NCmBgYHtyfQ0KYm94cGxvdChkZikNCmBgYA0KDQojIyBELiBBc3Vtc2kgQW5hbGlzaXMNClNhbWEgc2VwZXJ0aSBhc3Vtc2kgcmVncmVzaSBsaW5lYXIgeWFpdHUgYXN1bXNpIHlhbmcgdW11bSBkaWd1bmFrYW4gYWRhbGFoIHJlc2lkdSB5YW5nIGJlcmRpc3RyaWJ1c2kgbm9ybWFsIGRhbiBhZGEgYmViZXJhcGEgYXN1bXNpIHRhbWJhaGFuIHlhbmcgaGFydXMgZGlwZW51aGkgZGFsYW0gYW5hbGlzaXMgamFsdXIgYW50YXJhIGxhaW4gOlwNCjEuIFZhcmlhYmVsIGRhdGEgaGFydXMgbWVtaWxpa2kgc2thbGEgcGVuZ3VrdXJhbiB5YW5nIGtvbnRpbnl1IChpbnRlcnZhbCBhdGF1IHJhc2lvKS5cDQoyLiBWYXJpYWJlbCBkYXRhIGRhbGFtIG1vZGVsIGJlYmFzIGtlc2FsYWhhbiBwZW5ndWt1cmFuIChyZWxpYWJlbCkuXA0KMy4gTW9kZWwgaHVidW5nYW4gYmVyc2lmYXQgcmVrdXJzaWYgKHNhdHUgYXJhaCBkYW4gdGlkYWsgYmVya2ViYWxpa2FuKS5cDQo0LiBSZXNpZHUgdGlkYWsgYmVyaHVidW5nYW4gc2F0dSBzYW1hIGxhaW4uXA0KNS4gSHVidW5nYW4gYXJhaG55YSBhZGFsYWggbGluZWFyIGRhbiBhZGRpdGlmLlwNCg0KIyMgRS4gUGVtb2RlbGFuIGRlbmdhbiBwZW5kZWthdGFuIHJlZ3Jlc2kgbGluZWFyIGJlcmdhbmRhDQojIyMgMS4gTWVuZW50dWthbiBrb3JlbGFzaSBhbnRhcmEgdmFyaWFiZWwgZWtzb2dlbg0KLSBBbnRhcmEgYXR0aXR1ZGUgfn4gbm9ybXMgbWVtaWxpa2kga29yZWxhc2kgMC4yMjcNCi0gQW50YXJhIGF0dGl0dWRlIH5+IGNvbnRyb2wgbWVtaWxpa2kga29yZWxhc2kgMC4zNTcNCi0gQW50YXJhIG5vcm1zIH5+IGNvbnRyb2wgbWVtaWxpa2kga29yZWxhc2kgMC4yNDkNCmBgYHtyfQ0KbGlicmFyeShjb3JycGxvdCkNCmNvcnJwbG90KGNvcihkZiksIG1ldGhvZD0ibnVtYmVyIikNCmBgYA0KDQojIyMgMi4gU3Blc2lmaWthc2kgbW9kZWwgQSAoaW50ZW50aW9uIG1vZGVsKQ0KUGFkYSBtb2RlbCBBICgqaW50ZW50aW9uIG1vZGVsKiksIGtpdGEgaW5naW4gbWVtb2RlbGthbiBwZW5nYXJ1aCBsYW5nc3VuZyAqYXR0aXR1ZGUqLCAqbm9ybXMqLCBkYW4gKmNvbnRyb2wqIHRlcmhhZGFwICppbnRlbnRpb24qIG1lbGFsdWkgcGVuZGVrYXRhbiByZWdyZXNpIGxpbmVhciBiZXJnYW5kYS5cDQohW2FsdCB0ZXh0IGhlcmVdKGltYWdlcy9tb2RlbCBBLnBuZykNCmBgYHtyfQ0Kc3BlY21vZCA8LSAiaW50ZW50aW9uIH4gYXR0aXR1ZGUgKyBub3JtcyArIGNvbnRyb2wiDQpgYGANCg0KIyMjIDMuIEVzdGltYXNpIG1vZGVsIEEgKGludGVudGlvbiBtb2RlbCkNCmBgYHtyfQ0KaW50Lm1vZGVsIDwtIGxtKHNwZWNtb2QsIGRhdGE9ZGYpDQpgYGANCg0KIyMjIDQuIEhhc2lsIHBlbW9kZWxhbiBBIChpbnRlbnRpb24gbW9kZWwpDQpgYGB7cn0NCnN1bW1hcnkoaW50Lm1vZGVsKQ0KYGBgDQoNCiMjIyA1LiBNZW5hbXBpbGthbiBrb2VmaXNpZW4gamFsdXIgKEJldGEpIHVudHVrIG1vZGVsIEENCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShRdWFudFBzeWMpDQpsbS5iZXRhKGludC5tb2RlbCkNCmBgYA0KDQojIyMgNi4gU3Blc2lmaWthc2kgbW9kZWwgQiAoYmVoYXZpb3IgbW9kZWwpDQpQYWRhIG1vZGVsIEIgKCpiZWhhdmlvciBtb2RlbCopLCBraXRhIGluZ2luIG1lbW9kZWxrYW4gcGVuZ2FydWggbGFuZ3N1bmcgKmludGVudGlvbiogdGVyaGFkYXAgKmJlaGF2aW9yKiBtZWxhbHVpIHBlbmRla2F0YW4gcmVncmVzaSBsaW5lYXIgYmVyZ2FuZGEuDQohW2FsdCB0ZXh0IGhlcmVdKGltYWdlcy9tb2RlbCBCLnBuZykNCg0KYGBge3J9DQpzcGVjbW9kIDwtICJiZWhhdmlvciB+IGludGVudGlvbiINCmBgYA0KDQojIyMgNy4gRXN0aW1hc2kgbW9kZWwgQiAoYmVoYXZpb3IgbW9kZWwpDQpgYGB7cn0NCmJodi5tb2RlbCA8LSBsbShzcGVjbW9kLCBkYXRhPWRmKQ0KYGBgDQoNCiMjIyA4LiBIYXNpbCBwZW1vZGVsYW4gQiAoYmVoYXZpb3IgbW9kZWwpDQpgYGB7cn0NCnN1bW1hcnkoYmh2Lm1vZGVsKQ0KYGBgDQoNCiMjIyA5LiBNZW5hbXBpbGthbiBrb2VmaXNpZW4gamFsdXIgKEJldGEpIHVudHVrIG1vZGVsIEINCmBgYHtyfQ0KbG0uYmV0YShiaHYubW9kZWwpDQpgYGANCg0KIyMjIDEwLiBNZW5lbnR1a2FuIGVycm9yIHBhZGEgbW9kZWwgQSAoaW50ZW50aW9uIG1vZGVsKSBkYW4gbW9kZWwgQiAoYmVoYXZpb3IgbW9kZWwpDQoNCioqTW9kZWwgQSAoSW50ZW50aW9uIE1vZGVsKSoqDQpgYGB7cn0NCnNxcnQoMS1zdW1tYXJ5KGludC5tb2RlbCkkci5zcXVhcmVkKQ0KYGBgDQoNCioqTW9kZWwgQiAoQmVoYXZpb3IgTW9kZWwpKioNCmBgYHtyfQ0Kc3FydCgxLXN1bW1hcnkoYmh2Lm1vZGVsKSRyLnNxdWFyZWQpDQpgYGANCg0KIyMgRi4gSW1wb3J0IGxpYnJhcnkgbW9kZWwgU0VNIChwYXRoIGFuYWx5c2lzKSBkZW5nYW4gcGVuZGVrYXRhbiBtb2RlbCBmaXR0aW5nDQoqTGF0ZW50IFZhcmlhYmxlIEFuYWx5c2lzKiBhdGF1IOKAnGxhdmFhbuKAnSBhZGFsYWggbGlicmFyeSAqb3BlbiBzb3VyY2UqIHlhbmcgZGlrZW1iYW5na2FuIGRhbGFtIHBlbXJvZ3JhbWFuIFIuIExpYnJhcnkgaW5pIGRpZ3VuYWthbiB1bnR1ayBtZW5nZXJqYWthbiBiZXJiYWdhaSBtYWNhbSBhbmFsaXNpcyBtdWx0aXZhcmlhdCB0ZXJtYXN1ayBhbmFsaXNpcyBqYWx1ciwgQ0ZBLCBTRU0sIGRhbiAqZ3Jvd3RoIGN1cnZlIG1vZGVsKiAoZG9rdW1lbnRhc2kgbGViaWggbGVuZ2thcG55YSBkYXBhdCBkaWxpaGF0IGRpIGxhdmFhbi51Z2VudC5iZSkuDQpgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCmxpYnJhcnkobGF2YWFuKQ0KYGBgDQoNCiMjIEcuIEFuYWxpc2lzIGphbHVyIGRlbmdhbiBwZW5kZWthdGFuICoqbW9kZWwgZml0dGluZyoqDQojIyMgMS4gU3Blc2lmaWthc2kgbW9kZWwNCmBgYHtyfQ0Kc3BlY21vZCA8LSAiDQojIEphbHVyIGxhbmdzdW5nIG1vZGVsIEEgZGFuIEIgKHBhZGEgcmVncmVzaSkgZGlhbmFsaXNpcyBiZXJzYW1hYW4gZGVuZ2FuIGtvdmFyaWFuc255YSBqdWdhDQppbnRlbnRpb24gfiBhdHRpdHVkZSArIG5vcm1zICsgY29udHJvbA0KYmVoYXZpb3IgfiBpbnRlbnRpb24NCg0KIyBLb3ZhcmlhbnMgKGtvcmVsYXNpIGFudGFyIHZhcmlhYmVsIGVrc29nZW4pDQphdHRpdHVkZSB+fiBub3JtcyArIGNvbnRyb2wNCm5vcm1zIH5+IGNvbnRyb2wNCiINCmBgYA0KDQojIyMgMi4gRXN0aW1hc2kgcGVtb2RlbGFuDQpgYGB7cn0NCmZpdG1vZCA8LSBzZW0oc3BlY21vZCwgZGF0YT1kZikNCmBgYA0KDQojIyMgMy4gSGFzaWwgcGVtb2RlbGFuIGRlbmdhbiBtb2RlbCBmaXR0aW5nDQpgYGB7cn0NCnN1bW1hcnkoZml0bW9kLCBzdGFuZGFyZGl6ZWQgPSBUUlVFKQ0KYGBgDQoNCiMjIyA0LiBNZW5hbXBpbGthbiBiZXJiYWdhaSBpbmRla3MgZml0dGluZw0KYGBge3J9DQpmaXRtZWFzdXJlcyhmaXRtb2QpDQpgYGANCg0KIyMjIDUuIE1lbmdnYW1iYXIgZGlhZ3JhbSBqYWx1cg0KYGBge3J9DQpsaWJyYXJ5KHNlbVBsb3QpDQpzZW1QYXRocyhmaXRtb2QsICJzdGQiLCByb3RhdGlvbj0yLCBsYXlvdXQgPSAidHJlZTIiLCBjdXJ2YXR1cmUgPSAyLCBuQ2hhck5vZGVzID0gMCwgbkRpZ2l0cyA9IDMsDQogICAgICAgICAgICAgc2l6ZU1hbiA9IDEwLCBzaXplSW50ID0gNSwgc2l6ZUxhdCA9IDUsIGVkZ2UubGFiZWwuY2V4PTEuMiwgZXhvVmFyID0gRkFMU0UsIGZhZGU9RkFMU0UpDQpgYGANCg0KIyMgSC4gQmFnYWltYW5hIG1lbmVudHVrYW4gZGVyYWphdCBrZWJlYmFzYW4gPw0KVGVyZGFwYXQgbGltYSB2YXJpYWJlbCB1bmlxdWUgeWFpdHUgKmludGVudGlvbiosICphdHRpdHVkZSosICpub3JtcyosICpjb250cm9sKiwgKmJlaGF2aW9yKi5cDQpVbnR1ayBtZW5nZXRhaHVpIGJlcmFwYSBrb21wb25lbiBrb3ZhcmlhbnMgZGFuIHZhcmlhbnMgdW5payBkYWxhbSBtYXRyaWtzIGtvdmFyaWFucyAoa29yZWxhc2kpLCBrZWxpbWEgdmFyaWFiZWwgaW5pIGFkYWxhaCBsb3dlciBkaWFnb25hbCBkYXJpIG1hdHJpa3Mga292YXJpYW5zLyBrb3JlbGFzaS5cDQoNCkZvcm11bGEgdW50dWsgbWVuZW50dWthbiBqdW1sYWggaW5mb3JtYXNpIHVuaWsgKm5vbiByZWR1bmRhbnQqID0gVihWKzEpLzIgKE1leWVycywgR2Ftc3QsICYgR3VhcmlubywgMjAxNikuXA0KZGltYW5hIFYgPSBqdW1sYWggdmFyaWFiZWwgZGkgZGFsYW0gZGF0YSA9IDVcDQpNYWthLCBqdW1sYWggaW5mb3JtYXNpIHVuaWsgKm5vbiByZWR1bmRhbnQqIGRhbGFtIG1vZGVsID0gMTVcDQoNCkp1bWxhaCBwYXJhbWV0ZXIgPSBtZW5naGl0dW5nIHBhcmFtZXRlciBlc3RpbWF0ZSBhbnRhcmEgbGFpbiBkaXJlY3Rpb25hbCByZWxhdGlvbiAoNCksIGVycm9yIHRlcm1zKDIpLCB2YXJpYW5zICgzKSBkYW4ga292YXJpYW5zIHZhcmlhYmVsIGVrc29nZW4gKDMpID0gMTJcIChsaWhhdCB0YWJlbCBkaSBhdGFzICJudW1iZXIgb2YgbW9kZWwgcGFyYW1ldGVycyIpDQoNCmRlcmFqYXQga2ViZWJhc2FuID0gMTUgLSAxMiA9IDNcDQpMaWhhdCAiRGVncmVlcyBvZiBmcmVlZG9tIiBwYWRhIG1vZGVsIHRlc3QgdXNlciBvdXRwdXQgZGlhdGFzXA0KXA0KTmlsYWkgaW5pIGxlYmloIGJlc2FyIGRhcmlwYWRhIG5vbCAoMCkgeWFuZyBiZXJhcnRpIGJhaHdhIG1vZGVsICoqb3ZlcmlkZW50aWZpZWQqKiBhcnRpbnlhIGtpdGEgYmlzYSBtZW5naW50ZXJwcmV0YXNpa2FuIG1vZGVsIGZpdCBkZW5nYW4gYmViZXJhcGEgaW5kZWtzIGZpdHRpbmcgZGkgYmF3YWggaW5pLlwNCg0KIyMgSS4gTGltYSBpbmRla3MgZml0IHlhbmcgcGVybHUgZGlwZXJoYXRpa2FuIHVudHVrIG1lbmdldmFsdWFzaSBtb2RlbCBhcGFrYWggc3VkYWggZml0IGRlbmdhbiBkYXRhIGF0YXUgYmVsdW0NCg0KMS4gKipDaGkgc3F1YXJlIHRlc3QqKlwNCkRhbGFtIGhhc2lsIGtpdGEsIE1vZGVsIEZpdCBUZXN0IFN0YXRpc3RpY3MgbWVudW5qdWtrYW4gc3RhdGlzdGlrIENoaSBzcXVhcmUgKDE3LjU3NCkgZGFuIHAtdmFsdWUgKENoaS1zcXVhcmUpIHNhbWEgZGVuZ2FuIDAuNTY4IGxlYmloIGJlc2FyIGRhcmkgMC4wNSB5YW5nIGJlcmFydGkgYmFod2EgSG8gZGl0ZXJpbWEgYXRhdSBNb2RlbCBzdWRhaCBmaXQgdGVyaGFkYXAgZGF0YS5cDQoyLiAqKkNvbXBhcmF0aXZlIEZpdCBJbmRleCAoQ0ZJKSoqXA0KRGFsYW0gaGFzaWwga2l0YSBkaXRlbXVrYW4gQ0ZJID0gMS4wMDAgZGltYW5hIGtyaXRlcmlhbnlhIENGSSA+IDAuOSB5YW5nIGJlcmFydGkgYmFod2EgbW9kZWwgc3VkYWggZml0IHRlcmhhZGFwIGRhdGEuXA0KMy4gKipUdWNrZXIgTHV3aXMgSW5kZXggKFRMSSkqKlwgDQpEYWxhbSBoYXNpbCBraXRhIGRpdGVtdWthbiBUTEkgPSAxLjAxOSBkaW1hbmEga3JpdGVyaWFueWEgVExJID4gMC45NSB5YW5nIGJlcmFydGkgYmFod2EgbW9kZWwgc3VkYWggZml0IHRlcmhhZGFwIGRhdGEuXA0KNC4gKipSb290IE1lYW4gU3F1YXJlIEVycm9yIG9mIEFwcHJveGltYXRpb24gKFJNU0VBKSoqXCANCkRhbGFtIGhhc2lsIGtpdGEgZGl0ZW11a2FuIFJNU0VBID0gMC4wMDAgZGltYW5hIGtyaXRlcmlhbnlhIFJNU0VBIDwgMC4wOCB5YW5nIGJlcmFydGkgYmFod2EgbW9kZWwgc3VkYWggZml0IHRlcmhhZGFwIGRhdGEuXA0KNS4gKipTdGFuZGFyZGl6ZWQgUm9vdCBNZWFuIFNxdWFyZSBSZXNpZHVhbCAoU1JNUikqKlwNCkRhbGFtIGhhc2lsIGtpdGEgZGl0ZW11a2FuIGJhaHdhIFNSTVIgYWRhbGFoIDAuMDE5IGRpbWFuYSBrcml0ZXJpYW55YSBTUk1SIDwgMC4wOCB5YW5nIGJlcmFydGkgYmFod2EgbW9kZWwgc3VkYWggZml0IGRlbmdhbiBkYXRhLlwNCg0KQmVyZGFzYXJrYW4ga2VsaW1hIGluZGlrYXRvciBldmFsdWFzaSBpbmkgbWVueWltcHVsa2FuIGJhaHdhIG1vZGVsIGphbHVyIGtpdGEgc3VkYWggZml0IHRlcmhhZGFwIGRhdGEgeWFuZyB0ZXJzZWRpYS4gSmlrYSBrZW11bmdraW5hbiBtb2RlbCBtYXNpaCBiZWx1bSBmaXQsIGtpdGEgaGFydXMga2VtYmFsaSBrZSB0YWhhcCBzcGVzaWZpa2FzaSBwYXJhbWV0ZXIgbW9kZWwgZGFuIG1lbW90b25nIGphbHVyIHlhbmcgdGlkYWsgc2lnbmlmaWthbi4NCg0KIyMgSi4gUGVyc2FtYWFuIHJlZ3Jlc2kgZGFuIFItc3F1YXJlZA0KTGloYXQgcC12YWx1ZSBueWEgamlrYSA8IDAuMDUgYmVyYXJ0aSBiZXJwZW5nYXJ1aCBzZWNhcmEgc2lnbmlmaWthbi5cDQpOaWxhaSBrb2VmaXNpZW4gamFsdXIgKGJldGEpIGxpaGF0IHBhZGEgKipTdGQuYWxsKiogbWFzaW5nLW1hc2luZyB2YXJpYWJlbCBwcmVkaWt0b3IuXA0KS2VtdWRpYW4gZXJyb3JueWEgbGloYXQgcGFkYSAqKlZhcmlhbmNlcyoqIHBhZGEgKipTdGQuYWxsKiouIEFnYXIgbmlsYWlueWEgc2FtYSBkZW5nYW4gZXJyb3IgcGFkYSBwZW5kZWthdGFuIHJlZ3Jlc2kgbGluZWFyIGNhcmlsYWggYWthciBkYXJpcGFkYW55YS5cDQpSLXNxdWFyZWQgbWVuamVsYXNrYW4gc2ViZXJhcGEgYmVzYXIgdmFyaWFucyB2YXJpYWJlbCBiZWJhcyBtZW5lbnR1a2FuIHZhcmlhbnMgdmFyaWFiZWwgdGVyaWthdC5cDQoNClwNClwNClw=