Практическая работа №5

6. Непараметрические коэффициенты корреляции. Значимость частных коэффициентов регрессии

7. Факторный анализ

Глушков Егор Александрович, гр. 20.М04-мм
Вариант 4


  1. Непараметрические коэффициенты корреляции. Значимость частных коэффициентов регрессии

Данные addicts.xls. Переменные (вариант 4):

  1. Построить корреляционную матрицу по метрическим переменным \(X_1, ... , X_4\) и выделить наиболее значимую корреляцию. Для этого случая построить двумерную диаграмму.

  2. Применить модель множественной регресссии для зависимой переменной \(Y\) и для независимых переменных \(X_1, ... , X_4\). Определить значимость прогноза и указать наиболее значимые переменные.

  3. Вычислить частный коэффициент корреляции \(\rho_{YX_1 \cdot X_2 X_3 X_4}\).


Корреляционная матрица, значимые корреляции

library(readxl)
addicts <- read_excel("addicts.xlsx")
# View(addicts)

Исследуем переменные на наличие пропусков. Выделим нужные переменные

data <- na.omit(addicts[ , c("sstati", "asi1_med", "asi2_emp", "asid3_dyr", "asi7_psy")])
summary(data)
     sstati         asi1_med         asi2_emp        asid3_dyr         asi7_psy   
 Min.   :23.00   Min.   :0.0000   Min.   :0.0000   Min.   : 0.500   Min.   :0.00  
 1st Qu.:43.00   1st Qu.:0.0000   1st Qu.:0.6900   1st Qu.: 2.000   1st Qu.:0.12  
 Median :48.00   Median :0.1900   Median :0.9100   Median : 3.000   Median :0.24  
 Mean   :48.52   Mean   :0.2447   Mean   :0.7834   Mean   : 3.605   Mean   :0.26  
 3rd Qu.:54.00   3rd Qu.:0.4200   3rd Qu.:1.0000   3rd Qu.: 4.000   3rd Qu.:0.36  
 Max.   :72.00   Max.   :1.0000   Max.   :1.0000   Max.   :24.000   Max.   :0.87  

Проверяем данные на нормальность

lshap <- lapply(data, shapiro.test)
lres <- sapply(lshap, `[`, c("statistic","p.value")); lres
          sstati    asi1_med     asi2_emp     asid3_dyr   asi7_psy    
statistic 0.9929767 0.8394149    0.7918929    0.7567038   0.9517803   
p.value   0.2184984 2.858381e-16 1.639616e-18 6.13559e-20 6.385948e-08

Лишь p.value, соответствующий переменной sstati, больше уровня значимости 0.05, что говорит о том, что распределение этих данных незначимо отличается от нормального. Другими словами, можно предположить их нормальность. Для других переменных гипотеза о нормальности отвергается, вследствие чего следует предпочесть непараметрические коэффициенты корреляции (Спирмена, Кендалла), чем более привычный коэффициент корреляции Пирсона.

cor(data, method="pearson")
               sstati    asi1_med     asi2_emp  asid3_dyr  asi7_psy
sstati    1.000000000  0.21570052  0.004541223 0.12211473 0.1947717
asi1_med  0.215700516  1.00000000 -0.031071218 0.09333766 0.1346685
asi2_emp  0.004541223 -0.03107122  1.000000000 0.11027514 0.1899920
asid3_dyr 0.122114730  0.09333766  0.110275143 1.00000000 0.1402910
asi7_psy  0.194771680  0.13466846  0.189992031 0.14029098 1.0000000
ms <- cor(data, method="spearman"); ms
               sstati     asi1_med     asi2_emp  asid3_dyr   asi7_psy
sstati    1.000000000  0.160604387  0.009650113 0.09534054 0.21629588
asi1_med  0.160604387  1.000000000 -0.009739093 0.05920707 0.06179187
asi2_emp  0.009650113 -0.009739093  1.000000000 0.09440814 0.17970881
asid3_dyr 0.095340538  0.059207069  0.094408140 1.00000000 0.12806424
asi7_psy  0.216295882  0.061791868  0.179708808 0.12806424 1.00000000
cor(data, method="kendall")
               sstati     asi1_med     asi2_emp  asid3_dyr   asi7_psy
sstati    1.000000000  0.116505322  0.006477093 0.06777330 0.15059703
asi1_med  0.116505322  1.000000000 -0.005463709 0.04544845 0.04726184
asi2_emp  0.006477093 -0.005463709  1.000000000 0.07372656 0.13120600
asid3_dyr 0.067773302  0.045448452  0.073726560 1.00000000 0.09631333
asi7_psy  0.150597034  0.047261842  0.131206003 0.09631333 1.00000000
show_cor_test <- function(x1, x2) {
  sp <- cor.test(x1, x2, method="spearman", exact=FALSE)
  k <- cor.test(x1, x2, method="kendall", exact=FALSE)
  df <- data.frame(cbind(c(sp$estimate, sp$p.value), c(k$estimate, k$p.value)), 
                   row.names=c("corr coeff (rho | tau resp)", "p.value"))
  colnames(df)<-c('spearman', 'kendall')
  df
}

Выделим наиболее значимые корреляции: уровень тревожности и психиатрический статус

show_cor_test(data$sstati, data$asi7_psy)

Как видно, \(\rho\) и \(\tau\) не так высоки (0.216 и 0.15), однако с учетом соответствующих p.value можно принять гипотезы о том, что данные коэффициенты корреляции Спирмена и Кендалла ненулевые.

Аналогично с уровнем тревожности и медицинским статусом

show_cor_test(data$sstati, data$asi1_med)

Коэффициенты корреляции не высоки, однако p.value говорят о том, что коэффициенты не равны нулю

Такая же ситуация с психиатрическим и социальным статусами

show_cor_test(data$asi7_psy, data$asi2_emp)

Построим heatmap с соответствующими коэффициентами корреляции Спирмена:

library(GGally)
ggcorr(data, method=c("pairwise", "spearman"), label=TRUE)

Двумерная диаграмма для уровня тревожности и психиатрического статуса:

str <- paste("r", round(cor(data$sstati, data$asi7_psy, method='spearman'), 3), sep="=")
qplot(sstati, asi7_psy, data = data, geom = c("point", "smooth"), method = "lm") + labs(title=str) + theme(plot.title = element_text(hjust = 0.5))

Двумерная диаграмма для уровня тревожности и медицинского статуса:

str <- paste("r", round(cor(data$sstati, data$asi1_med, method='spearman'), 3), sep="=")
qplot(sstati, asi1_med, data = data, geom = c("point", "smooth"), method = "lm") + labs(title=str) + theme(plot.title = element_text(hjust = 0.5))

Двумерная диаграмма для социального и психиатрического статусов:

str <- paste("r", round(cor(data$asi2_emp, data$asi7_psy, method='spearman'), 3), sep="=")
qplot(asi2_emp, asi7_psy, data = data, geom = c("point", "smooth"), method = "lm") + labs(title=str) + theme(plot.title = element_text(hjust = 0.5))

Можно заметить, что имеющаяся линейная связь между этими парами переменных весьма слабая (тем не менее, значима)

Модель множественной регресссии

Применим модель множественной регрессии с asi7_psy как зависимой переменной

mreg <- lm(asi7_psy ~ sstati + asi1_med + asi2_emp + asid3_dyr, data=data)
summary(mreg)

Call:
lm(formula = asi7_psy ~ sstati + asi1_med + asi2_emp + asid3_dyr, 
    data = data)

Residuals:
     Min       1Q   Median       3Q      Max 
-0.36262 -0.13077 -0.02225  0.10122  0.62899 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) -0.043488   0.067113  -0.648  0.51754   
sstati       0.003371   0.001239   2.721  0.00693 **
asi1_med     0.066214   0.040571   1.632  0.10383   
asi2_emp     0.124408   0.039730   3.131  0.00193 **
asid3_dyr    0.007287   0.004683   1.556  0.12085   
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 0.1764 on 272 degrees of freedom
Multiple R-squared:  0.09201,   Adjusted R-squared:  0.07866 
F-statistic: 6.891 on 4 and 272 DF,  p-value: 2.689e-05

Согласно \(p.value < 0.05\) (а именно согласно значимости прогноза 2.689e-05 < 0.05) отвергается гипотеза о том, что данная модель не зависит от предикторов. Значимыми (ненулевыми) коэффициентами с уровнем 0.05 являются значения при переменных sstati и asi2_emp, чего и следовало ожидать из проведенного выше корреляционного анализа (именно коэффициенты корреляции этих пар переменных были наибольними).

Проверим некоррелированность остатков [практически равны 0]

c(cor(mreg$residuals, data$sstati), cor(mreg$residuals, data$asi1_med ), cor(mreg$residuals, data$asi2_emp ), cor(mreg$residuals, data$asid3_dyr))
[1] -1.888976e-16  9.887577e-20 -1.548208e-16  2.494561e-17

Частный коэффициент корреляции \(\rho_{YX_1 \cdot X_2 X_3 X_4}\)

library(matlib)
ms
               sstati     asi1_med     asi2_emp  asid3_dyr   asi7_psy
sstati    1.000000000  0.160604387  0.009650113 0.09534054 0.21629588
asi1_med  0.160604387  1.000000000 -0.009739093 0.05920707 0.06179187
asi2_emp  0.009650113 -0.009739093  1.000000000 0.09440814 0.17970881
asid3_dyr 0.095340538  0.059207069  0.094408140 1.00000000 0.12806424
asi7_psy  0.216295882  0.061791868  0.179708808 0.12806424 1.00000000

\[ \rho_{YX_1 \cdot X_2 X_3 X_4} = - \frac{\Lambda_{Y X_1}}{\sqrt{\Lambda_{Y Y} \Lambda_{1 1}}}\] где \(\Lambda_{ij}\) – алгебраическое дополнение элемента \(\lambda_{ij}\) корреляционной матрицы \(\Lambda\)

rho <- - cofactor(ms, 5, 1) / sqrt(cofactor(ms, 5, 5) * cofactor(ms, 1, 1))
c(r.yx1=ms[1, 5], rho=rho)
    r.yx1       rho 
0.2162959 0.2034030 

\(r_{Y X_1} > \rho_{YX_1 \cdot X_2 X_3 X_4}\), то факторы \(X_2, X_3, X4\) [немного] искажают взаимосвязь между \(Y\) и \(X_1\) в сторону её увеличения


  1. Факторный анализ

Задание.
Построить матрицу факторных нагрузок. Проинтерпретировать главные компоненты, определить вклад первых двух в общую дисперсию и построить двумерную диаграмму первых двух факторов.


Вклад главных компонент в общую дисперсию

pc <- princomp(scale(data))
summary(pc)
Importance of components:
                          Comp.1    Comp.2    Comp.3    Comp.4    Comp.5
Standard deviation     1.2207259 1.0501082 0.9385849 0.8843622 0.8520637
Proportion of Variance 0.2991142 0.2213445 0.1768267 0.1569860 0.1457286
Cumulative Proportion  0.2991142 0.5204587 0.6972854 0.8542714 1.0000000

Первые две компоненты дают 52.04587%

Факторные нагрузки

pc$loadings[, seq(5)]
             Comp.1     Comp.2      Comp.3      Comp.4      Comp.5
sstati    0.5088674  0.3666091  0.13377642  0.58353704  0.49823700
asi1_med  0.4316568  0.5052637  0.07655432 -0.74242863  0.03633432
asi2_emp  0.2806453 -0.7246625  0.22612083 -0.28145720  0.51551306
asid3_dyr 0.4233503 -0.1845726 -0.88210384  0.02520452 -0.08924714
asi7_psy  0.5447377 -0.2260610  0.38341295  0.16861444 -0.69044981

Первая компонента отвечает за “медицинские” факторы: тревожность, медицинский и психиатрический статус, длительность героиновой зависимости, притом везде связь прямо пропорциональна.
Вторая компонента связана с понижением социального статуса и повышением медицинского статуса.
Третья – с понижением длительности героиновой зависимости.
Четвертая – с понижением медицинского статуса и повышением уровня тревожности.
Пятая компонента говорит о повышении уровня тревожности и социального статуса вместе с понижением психиатрического статуса.

Проверка [совпадают с точностью до перестановки знаков для, например, первого фактора]:

ei <- eigen(cor(data))

A <- ei$vectors
Y <- as.matrix(scale(data)) %*% A

cbind(Y[seq(10), seq(3)], pc$scores[seq(10),seq(3)])
                                             Comp.1      Comp.2      Comp.3
 [1,] -0.1983072  0.72089292  0.19465100  0.1983072  0.72089292  0.19465100
 [2,]  1.4273690  2.44695870  0.06755617 -1.4273690  2.44695870  0.06755617
 [3,] -1.0878609  0.12771542 -0.30632264  1.0878609  0.12771542 -0.30632264
 [4,]  0.2421745  0.06698835  0.61873096 -0.2421745  0.06698835  0.61873096
 [5,] -1.2291057 -0.43829516  0.62489850  1.2291057 -0.43829516  0.62489850
 [6,] -1.8404684  1.85516675  0.84688457  1.8404684  1.85516675  0.84688457
 [7,] -0.5164741 -0.90396856  0.22615760  0.5164741 -0.90396856  0.22615760
 [8,]  0.6092661  1.22103938  0.14656096 -0.6092661  1.22103938  0.14656096
 [9,]  0.5496977 -0.84859723  0.39636680 -0.5496977 -0.84859723  0.39636680
[10,] -1.4000370 -0.80176615  0.17534824  1.4000370 -0.80176615  0.17534824
plot(pc$scores, type="n")
text(pc$scores, row.names(data), cex=0.6)

Заметим выброс в виде пациента №166: для него характерно большое значение Comp.1 – повышенные “медицинские” факторы – при достаточно низком Comp.2

LS0tDQp0aXRsZTogIiINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCiMjIyMg0J/RgNCw0LrRgtC40YfQtdGB0LrQsNGPINGA0LDQsdC+0YLQsCDihJY1DQojIyMgNi4g0J3QtdC/0LDRgNCw0LzQtdGC0YDQuNGH0LXRgdC60LjQtSDQutC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0LrQvtGA0YDQtdC70Y/RhtC40LguINCX0L3QsNGH0LjQvNC+0YHRgtGMINGH0LDRgdGC0L3Ri9GFINC60L7RjdGE0YTQuNGG0LjQtdC90YLQvtCyINGA0LXQs9GA0LXRgdGB0LjQuA0KIyMjIDcuINCk0LDQutGC0L7RgNC90YvQuSDQsNC90LDQu9C40LcNCg0KPiDQk9C70YPRiNC60L7QsiDQldCz0L7RgCDQkNC70LXQutGB0LDQvdC00YDQvtCy0LjRhywg0LPRgC4gMjAu0JwwNC3QvNC8ICANCj4g0JLQsNGA0LjQsNC90YIgNA0KDQotLS0NCg0KPiA2LiDQndC10L/QsNGA0LDQvNC10YLRgNC40YfQtdGB0LrQuNC1INC60L7RjdGE0YTQuNGG0LjQtdC90YLRiyDQutC+0YDRgNC10LvRj9GG0LjQuC4g0JfQvdCw0YfQuNC80L7RgdGC0Ywg0YfQsNGB0YLQvdGL0YUg0LrQvtGN0YTRhNC40YbQuNC10L3RgtC+0LIg0YDQtdCz0YDQtdGB0YHQuNC4DQoNCtCU0LDQvdC90YvQtSBhZGRpY3RzLnhscy4g0J/QtdGA0LXQvNC10L3QvdGL0LUgKNCy0LDRgNC40LDQvdGCIDQpOg0KDQorICRYXzEkICAtLSAqc3N0YXRpKiAtLSDQvtGG0LXQvdC60LAg0YPRgNC+0LLQvdGPINGC0YDQtdCy0L7QttC90L7RgdGC0LgNCisgJFhfMiQgLS0gKmFzaTFfbWVkKiAtLSDQuNC90LTQtdC60YEg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDRgtGP0LbQtdGB0YLQuCDQvNC10LTQuNGG0LjQvdGB0LrQvtCz0L4g0YHRgtCw0YLRg9GB0LANCisgJFhfMyQgLS0gKmFzaTJfZW1wKiAtLSDQuNC90LTQtdC60YEg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDRgtGP0LbQtdGB0YLQuCDRgdC+0YbQuNCw0LvRjNC90L7Qs9C+INGB0YLQsNGC0YPRgdCwICjQt9Cw0L3Rj9GC0L7RgdGC0YwsINC30LDRgNCw0LHQvtGC0L7QuikNCisgJFhfNCQgLS0gKmFzaWQzX2R5ciogLS0g0LTQu9C40YLQtdC70YzQvdC+0YHRgtGMINCz0LXRgNC+0LjQvdC+0LLQvtC5INC30LDQstC40YHQuNC80L7RgdGC0LggIA0KKyAkWSQgLS0gKmFzaTdfcHN5KiAtLSDQuNC90LTQtdC60YEg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCDRgtGP0LbQtdGB0YLQuCDQv9GB0LjRhdC40LDRgtGA0LjRh9C10YHQutC+0LPQviDRgdGC0LDRgtGD0YHQsCAgDQoNCg0KMS4g0J/QvtGB0YLRgNC+0LjRgtGMINC60L7RgNGA0LXQu9GP0YbQuNC+0L3QvdGD0Y4g0LzQsNGC0YDQuNGG0YMg0L/QviDQvNC10YLRgNC40YfQtdGB0LrQuNC8INC/0LXRgNC10LzQtdC90L3Ri9C8ICRYXzEsIC4uLiAsIFhfNCQg0Lgg0LLRi9C00LXQu9C40YLRjCDQvdCw0LjQsdC+0LvQtdC1INC30L3QsNGH0LjQvNGD0Y4g0LrQvtGA0YDQtdC70Y/RhtC40Y4uINCU0LvRjyDRjdGC0L7Qs9C+INGB0LvRg9GH0LDRjyDQv9C+0YHRgtGA0L7QuNGC0Ywg0LTQstGD0LzQtdGA0L3Rg9GOINC00LjQsNCz0YDQsNC80LzRgy4NCg0KMi4g0J/RgNC40LzQtdC90LjRgtGMINC80L7QtNC10LvRjCDQvNC90L7QttC10YHRgtCy0LXQvdC90L7QuSDRgNC10LPRgNC10YHRgdGB0LjQuCDQtNC70Y8g0LfQsNCy0LjRgdC40LzQvtC5INC/0LXRgNC10LzQtdC90L3QvtC5ICRZJCDQuCDQtNC70Y8g0L3QtdC30LDQstC40YHQuNC80YvRhSDQv9C10YDQtdC80LXQvdC90YvRhSAkWF8xLCAuLi4gLCBYXzQkLiDQntC/0YDQtdC00LXQu9C40YLRjCDQt9C90LDRh9C40LzQvtGB0YLRjCDQv9GA0L7Qs9C90L7Qt9CwINC4INGD0LrQsNC30LDRgtGMINC90LDQuNCx0L7Qu9C10LUg0LfQvdCw0YfQuNC80YvQtSDQv9C10YDQtdC80LXQvdC90YvQtS4NCg0KMy4g0JLRi9GH0LjRgdC70LjRgtGMINGH0LDRgdGC0L3Ri9C5INC60L7RjdGE0YTQuNGG0LjQtdC90YIg0LrQvtGA0YDQtdC70Y/RhtC40LggJFxyaG9fe1lYXzEgXGNkb3QgWF8yIFhfMyBYXzR9JC4NCg0KLS0tDQoNCj4g0JrQvtGA0YDQtdC70Y/RhtC40L7QvdC90LDRjyDQvNCw0YLRgNC40YbQsCwg0LfQvdCw0YfQuNC80YvQtSDQutC+0YDRgNC10LvRj9GG0LjQuA0KDQpgYGB7cn0NCmxpYnJhcnkocmVhZHhsKQ0KYWRkaWN0cyA8LSByZWFkX2V4Y2VsKCJhZGRpY3RzLnhsc3giKQ0KIyBWaWV3KGFkZGljdHMpDQpgYGANCg0K0JjRgdGB0LvQtdC00YPQtdC8INC/0LXRgNC10LzQtdC90L3Ri9C1INC90LAg0L3QsNC70LjRh9C40LUg0L/RgNC+0L/Rg9GB0LrQvtCyLiDQktGL0LTQtdC70LjQvCDQvdGD0LbQvdGL0LUg0L/QtdGA0LXQvNC10L3QvdGL0LUgDQpgYGB7cn0NCmRhdGEgPC0gbmEub21pdChhZGRpY3RzWyAsIGMoInNzdGF0aSIsICJhc2kxX21lZCIsICJhc2kyX2VtcCIsICJhc2lkM19keXIiLCAiYXNpN19wc3kiKV0pDQpzdW1tYXJ5KGRhdGEpDQpgYGANCtCf0YDQvtCy0LXRgNGP0LXQvCDQtNCw0L3QvdGL0LUg0L3QsCDQvdC+0YDQvNCw0LvRjNC90L7RgdGC0YwNCmBgYHtyfQ0KbHNoYXAgPC0gbGFwcGx5KGRhdGEsIHNoYXBpcm8udGVzdCkNCmxyZXMgPC0gc2FwcGx5KGxzaGFwLCBgW2AsIGMoInN0YXRpc3RpYyIsInAudmFsdWUiKSk7IGxyZXMNCmBgYA0K0JvQuNGI0YwgcC52YWx1ZSwg0YHQvtC+0YLQstC10YLRgdGC0LLRg9GO0YnQuNC5INC/0LXRgNC10LzQtdC90L3QvtC5ICpzc3RhdGkqLCDQsdC+0LvRjNGI0LUg0YPRgNC+0LLQvdGPINC30L3QsNGH0LjQvNC+0YHRgtC4IDAuMDUsINGH0YLQviDQs9C+0LLQvtGA0LjRgiDQviDRgtC+0LwsINGH0YLQviDRgNCw0YHQv9GA0LXQtNC10LvQtdC90LjQtSDRjdGC0LjRhSDQtNCw0L3QvdGL0YUg0L3QtdC30L3QsNGH0LjQvNC+INC+0YLQu9C40YfQsNC10YLRgdGPINC+0YIg0L3QvtGA0LzQsNC70YzQvdC+0LPQvi4g0JTRgNGD0LPQuNC80Lgg0YHQu9C+0LLQsNC80LgsINC80L7QttC90L4g0L/RgNC10LTQv9C+0LvQvtC20LjRgtGMINC40YUg0L3QvtGA0LzQsNC70YzQvdC+0YHRgtGMLiDQlNC70Y8g0LTRgNGD0LPQuNGFINC/0LXRgNC10LzQtdC90L3Ri9GFINCz0LjQv9C+0YLQtdC30LAg0L4g0L3QvtGA0LzQsNC70YzQvdC+0YHRgtC4INC+0YLQstC10YDQs9Cw0LXRgtGB0Y8sINCy0YHQu9C10LTRgdGC0LLQuNC1INGH0LXQs9C+INGB0LvQtdC00YPQtdGCINC/0YDQtdC00L/QvtGH0LXRgdGC0Ywg0L3QtdC/0LDRgNCw0LzQtdGC0YDQuNGH0LXRgdC60LjQtSDQutC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0LrQvtGA0YDQtdC70Y/RhtC40LggKNCh0L/QuNGA0LzQtdC90LAsINCa0LXQvdC00LDQu9C70LApLCDRh9C10Lwg0LHQvtC70LXQtSDQv9GA0LjQstGL0YfQvdGL0Lkg0LrQvtGN0YTRhNC40YbQuNC10L3RgiDQutC+0YDRgNC10LvRj9GG0LjQuCDQn9C40YDRgdC+0L3QsC4NCg0KYGBge3J9DQpjb3IoZGF0YSwgbWV0aG9kPSJwZWFyc29uIikNCm1zIDwtIGNvcihkYXRhLCBtZXRob2Q9InNwZWFybWFuIik7IG1zDQpjb3IoZGF0YSwgbWV0aG9kPSJrZW5kYWxsIikNCmBgYA0KDQoNCmBgYHtyfQ0Kc2hvd19jb3JfdGVzdCA8LSBmdW5jdGlvbih4MSwgeDIpIHsNCiAgc3AgPC0gY29yLnRlc3QoeDEsIHgyLCBtZXRob2Q9InNwZWFybWFuIiwgZXhhY3Q9RkFMU0UpDQogIGsgPC0gY29yLnRlc3QoeDEsIHgyLCBtZXRob2Q9ImtlbmRhbGwiLCBleGFjdD1GQUxTRSkNCiAgZGYgPC0gZGF0YS5mcmFtZShjYmluZChjKHNwJGVzdGltYXRlLCBzcCRwLnZhbHVlKSwgYyhrJGVzdGltYXRlLCBrJHAudmFsdWUpKSwgDQogICAgICAgICAgICAgICAgICAgcm93Lm5hbWVzPWMoImNvcnIgY29lZmYgKHJobyB8IHRhdSByZXNwKSIsICJwLnZhbHVlIikpDQogIGNvbG5hbWVzKGRmKTwtYygnc3BlYXJtYW4nLCAna2VuZGFsbCcpDQogIGRmDQp9DQpgYGANCg0KDQrQktGL0LTQtdC70LjQvCDQvdCw0LjQsdC+0LvQtdC1INC30L3QsNGH0LjQvNGL0LUg0LrQvtGA0YDQtdC70Y/RhtC40Lg6INGD0YDQvtCy0LXQvdGMINGC0YDQtdCy0L7QttC90L7RgdGC0Lgg0Lgg0L/RgdC40YXQuNCw0YLRgNC40YfQtdGB0LrQuNC5INGB0YLQsNGC0YPRgQ0KYGBge3J9DQpzaG93X2Nvcl90ZXN0KGRhdGEkc3N0YXRpLCBkYXRhJGFzaTdfcHN5KQ0KYGBgDQrQmtCw0Log0LLQuNC00L3QviwgJFxyaG8kINC4ICRcdGF1JCDQvdC1INGC0LDQuiDQstGL0YHQvtC60LggKDAuMjE2INC4IDAuMTUpLCDQvtC00L3QsNC60L4g0YEg0YPRh9C10YLQvtC8INGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGJ0LjRhSAqcC52YWx1ZSog0LzQvtC20L3QviDQv9GA0LjQvdGP0YLRjCDQs9C40L/QvtGC0LXQt9GLINC+INGC0L7QvCwg0YfRgtC+INC00LDQvdC90YvQtSDQutC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0LrQvtGA0YDQtdC70Y/RhtC40Lgg0KHQv9C40YDQvNC10L3QsCDQuCDQmtC10L3QtNCw0LvQu9CwINC90LXQvdGD0LvQtdCy0YvQtS4gIA0KICANCtCQ0L3QsNC70L7Qs9C40YfQvdC+INGBINGD0YDQvtCy0L3QtdC8INGC0YDQtdCy0L7QttC90L7RgdGC0Lgg0Lgg0LzQtdC00LjRhtC40L3RgdC60LjQvCDRgdGC0LDRgtGD0YHQvtC8DQpgYGB7cn0NCnNob3dfY29yX3Rlc3QoZGF0YSRzc3RhdGksIGRhdGEkYXNpMV9tZWQpDQpgYGANCtCa0L7RjdGE0YTQuNGG0LjQtdC90YLRiyDQutC+0YDRgNC10LvRj9GG0LjQuCDQvdC1INCy0YvRgdC+0LrQuCwg0L7QtNC90LDQutC+IHAudmFsdWUg0LPQvtCy0L7RgNGP0YIg0L4g0YLQvtC8LCDRh9GC0L4g0LrQvtGN0YTRhNC40YbQuNC10L3RgtGLINC90LUg0YDQsNCy0L3RiyDQvdGD0LvRjg0KDQrQotCw0LrQsNGPINC20LUg0YHQuNGC0YPQsNGG0LjRjyDRgSDQv9GB0LjRhdC40LDRgtGA0LjRh9C10YHQutC40Lwg0Lgg0YHQvtGG0LjQsNC70YzQvdGL0Lwg0YHRgtCw0YLRg9GB0LDQvNC4IA0KYGBge3J9DQpzaG93X2Nvcl90ZXN0KGRhdGEkYXNpN19wc3ksIGRhdGEkYXNpMl9lbXApDQpgYGANCg0K0J/QvtGB0YLRgNC+0LjQvCBoZWF0bWFwINGBINGB0L7QvtGC0LLQtdGC0YHRgtCy0YPRjtGJ0LjQvNC4INC60L7RjdGE0YTQuNGG0LjQtdC90YLQsNC80Lgg0LrQvtGA0YDQtdC70Y/RhtC40Lgg0KHQv9C40YDQvNC10L3QsDoNCmBgYHtyfQ0KbGlicmFyeShHR2FsbHkpDQpnZ2NvcnIoZGF0YSwgbWV0aG9kPWMoInBhaXJ3aXNlIiwgInNwZWFybWFuIiksIGxhYmVsPVRSVUUpDQpgYGANCg0K0JTQstGD0LzQtdGA0L3QsNGPINC00LjQsNCz0YDQsNC80LzQsCDQtNC70Y8g0YPRgNC+0LLQvdGPINGC0YDQtdCy0L7QttC90L7RgdGC0Lgg0Lgg0L/RgdC40YXQuNCw0YLRgNC40YfQtdGB0LrQvtCz0L4g0YHRgtCw0YLRg9GB0LA6DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3RyIDwtIHBhc3RlKCJyIiwgcm91bmQoY29yKGRhdGEkc3N0YXRpLCBkYXRhJGFzaTdfcHN5LCBtZXRob2Q9J3NwZWFybWFuJyksIDMpLCBzZXA9Ij0iKQ0KcXBsb3Qoc3N0YXRpLCBhc2k3X3BzeSwgZGF0YSA9IGRhdGEsIGdlb20gPSBjKCJwb2ludCIsICJzbW9vdGgiKSwgbWV0aG9kID0gImxtIikgKyBsYWJzKHRpdGxlPXN0cikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQrQlNCy0YPQvNC10YDQvdCw0Y8g0LTQuNCw0LPRgNCw0LzQvNCwINC00LvRjyDRg9GA0L7QstC90Y8g0YLRgNC10LLQvtC20L3QvtGB0YLQuCDQuCDQvNC10LTQuNGG0LjQvdGB0LrQvtCz0L4g0YHRgtCw0YLRg9GB0LA6DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3RyIDwtIHBhc3RlKCJyIiwgcm91bmQoY29yKGRhdGEkc3N0YXRpLCBkYXRhJGFzaTFfbWVkLCBtZXRob2Q9J3NwZWFybWFuJyksIDMpLCBzZXA9Ij0iKQ0KcXBsb3Qoc3N0YXRpLCBhc2kxX21lZCwgZGF0YSA9IGRhdGEsIGdlb20gPSBjKCJwb2ludCIsICJzbW9vdGgiKSwgbWV0aG9kID0gImxtIikgKyBsYWJzKHRpdGxlPXN0cikgKyB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkNCmBgYA0KDQrQlNCy0YPQvNC10YDQvdCw0Y8g0LTQuNCw0LPRgNCw0LzQvNCwINC00LvRjyDRgdC+0YbQuNCw0LvRjNC90L7Qs9C+INC4INC/0YHQuNGF0LjQsNGC0YDQuNGH0LXRgdC60L7Qs9C+INGB0YLQsNGC0YPRgdC+0LI6DQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0Kc3RyIDwtIHBhc3RlKCJyIiwgcm91bmQoY29yKGRhdGEkYXNpMl9lbXAsIGRhdGEkYXNpN19wc3ksIG1ldGhvZD0nc3BlYXJtYW4nKSwgMyksIHNlcD0iPSIpDQpxcGxvdChhc2kyX2VtcCwgYXNpN19wc3ksIGRhdGEgPSBkYXRhLCBnZW9tID0gYygicG9pbnQiLCAic21vb3RoIiksIG1ldGhvZCA9ICJsbSIpICsgbGFicyh0aXRsZT1zdHIpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpDQpgYGANCtCc0L7QttC90L4g0LfQsNC80LXRgtC40YLRjCwg0YfRgtC+INC40LzQtdGO0YnQsNGP0YHRjyDQu9C40L3QtdC50L3QsNGPINGB0LLRj9C30Ywg0LzQtdC20LTRgyDRjdGC0LjQvNC4INC/0LDRgNCw0LzQuCDQv9C10YDQtdC80LXQvdC90YvRhSDQstC10YHRjNC80LAg0YHQu9Cw0LHQsNGPICjRgtC10Lwg0L3QtSDQvNC10L3QtdC1LCDQt9C90LDRh9C40LzQsCkNCg0KPiDQnNC+0LTQtdC70Ywg0LzQvdC+0LbQtdGB0YLQstC10L3QvdC+0Lkg0YDQtdCz0YDQtdGB0YHRgdC40LgNCg0K0J/RgNC40LzQtdC90LjQvCDQvNC+0LTQtdC70Ywg0LzQvdC+0LbQtdGB0YLQstC10L3QvdC+0Lkg0YDQtdCz0YDQtdGB0YHQuNC4INGBIGFzaTdfcHN5INC60LDQuiDQt9Cw0LLQuNGB0LjQvNC+0Lkg0L/QtdGA0LXQvNC10L3QvdC+0LkNCmBgYHtyfQ0KbXJlZyA8LSBsbShhc2k3X3BzeSB+IHNzdGF0aSArIGFzaTFfbWVkICsgYXNpMl9lbXAgKyBhc2lkM19keXIsIGRhdGE9ZGF0YSkNCnN1bW1hcnkobXJlZykNCmBgYA0K0KHQvtCz0LvQsNGB0L3QviAkcC52YWx1ZSA8IDAuMDUkICjQsCDQuNC80LXQvdC90L4g0YHQvtCz0LvQsNGB0L3QviDQt9C90LDRh9C40LzQvtGB0YLQuCDQv9GA0L7Qs9C90L7Qt9CwICoyLjY4OWUtMDUgPCAwLjA1Kikg0L7RgtCy0LXRgNCz0LDQtdGC0YHRjyDQs9C40L/QvtGC0LXQt9CwINC+INGC0L7QvCwg0YfRgtC+INC00LDQvdC90LDRjyDQvNC+0LTQtdC70Ywg0L3QtSDQt9Cw0LLQuNGB0LjRgiDQvtGCINC/0YDQtdC00LjQutGC0L7RgNC+0LIuINCX0L3QsNGH0LjQvNGL0LzQuCAo0L3QtdC90YPQu9C10LLRi9C80LgpINC60L7RjdGE0YTQuNGG0LjQtdC90YLQsNC80Lgg0YEg0YPRgNC+0LLQvdC10LwgMC4wNSDRj9Cy0LvRj9GO0YLRgdGPINC30L3QsNGH0LXQvdC40Y8g0L/RgNC4INC/0LXRgNC10LzQtdC90L3Ri9GFICpzc3RhdGkqINC4ICphc2kyX2VtcCosINGH0LXQs9C+INC4INGB0LvQtdC00L7QstCw0LvQviDQvtC20LjQtNCw0YLRjCDQuNC3INC/0YDQvtCy0LXQtNC10L3QvdC+0LPQviDQstGL0YjQtSDQutC+0YDRgNC10LvRj9GG0LjQvtC90L3QvtCz0L4g0LDQvdCw0LvQuNC30LAgKNC40LzQtdC90L3QviDQutC+0Y3RhNGE0LjRhtC40LXQvdGC0Ysg0LrQvtGA0YDQtdC70Y/RhtC40Lgg0Y3RgtC40YUg0L/QsNGAINC/0LXRgNC10LzQtdC90L3Ri9GFINCx0YvQu9C4INC90LDQuNCx0L7Qu9GM0L3QuNC80LgpLg0KDQoNCtCf0YDQvtCy0LXRgNC40Lwg0L3QtdC60L7RgNGA0LXQu9C40YDQvtCy0LDQvdC90L7RgdGC0Ywg0L7RgdGC0LDRgtC60L7QsiBb0L/RgNCw0LrRgtC40YfQtdGB0LrQuCDRgNCw0LLQvdGLIDBdDQpgYGB7cn0NCmMoY29yKG1yZWckcmVzaWR1YWxzLCBkYXRhJHNzdGF0aSksIGNvcihtcmVnJHJlc2lkdWFscywgZGF0YSRhc2kxX21lZCApLCBjb3IobXJlZyRyZXNpZHVhbHMsIGRhdGEkYXNpMl9lbXAgKSwgY29yKG1yZWckcmVzaWR1YWxzLCBkYXRhJGFzaWQzX2R5cikpDQpgYGANCg0KPiDQp9Cw0YHRgtC90YvQuSDQutC+0Y3RhNGE0LjRhtC40LXQvdGCINC60L7RgNGA0LXQu9GP0YbQuNC4ICRccmhvX3tZWF8xIFxjZG90IFhfMiBYXzMgWF80fSQNCg0KYGBge3J9DQpsaWJyYXJ5KG1hdGxpYikNCm1zDQpgYGANCiQkIFxyaG9fe1lYXzEgXGNkb3QgWF8yIFhfMyBYXzR9ID0gLSBcZnJhY3tcTGFtYmRhX3tZIFhfMX19e1xzcXJ0e1xMYW1iZGFfe1kgWX0gXExhbWJkYV97MSAxfX19JCQgDQrQs9C00LUgJFxMYW1iZGFfe2lqfSQgLS0g0LDQu9Cz0LXQsdGA0LDQuNGH0LXRgdC60L7QtSDQtNC+0L/QvtC70L3QtdC90LjQtSDRjdC70LXQvNC10L3RgtCwICRcbGFtYmRhX3tpan0kINC60L7RgNGA0LXQu9GP0YbQuNC+0L3QvdC+0Lkg0LzQsNGC0YDQuNGG0YsgJFxMYW1iZGEkDQoNCmBgYHtyfQ0KcmhvIDwtIC0gY29mYWN0b3IobXMsIDUsIDEpIC8gc3FydChjb2ZhY3RvcihtcywgNSwgNSkgKiBjb2ZhY3RvcihtcywgMSwgMSkpDQpjKHIueXgxPW1zWzEsIDVdLCByaG89cmhvKQ0KYGBgDQoNCiRyX3tZIFhfMX0gPiBccmhvX3tZWF8xIFxjZG90IFhfMiBYXzMgWF80fSQsINGC0L4g0YTQsNC60YLQvtGA0YsgJFhfMiwgWF8zLCBYNCQgW9C90LXQvNC90L7Qs9C+XSDQuNGB0LrQsNC20LDRjtGCINCy0LfQsNC40LzQvtGB0LLRj9C30Ywg0LzQtdC20LTRgyAkWSQg0LggJFhfMSQg0LIg0YHRgtC+0YDQvtC90YMg0LXRkSDRg9Cy0LXQu9C40YfQtdC90LjRjw0KDQotLS0NCg0KPiA3LiDQpNCw0LrRgtC+0YDQvdGL0Lkg0LDQvdCw0LvQuNC3DQoNCtCX0LDQtNCw0L3QuNC1LiAgDQrQn9C+0YHRgtGA0L7QuNGC0Ywg0LzQsNGC0YDQuNGG0YMg0YTQsNC60YLQvtGA0L3Ri9GFINC90LDQs9GA0YPQt9C+0LouINCf0YDQvtC40L3RgtC10YDQv9GA0LXRgtC40YDQvtCy0LDRgtGMINCz0LvQsNCy0L3Ri9C1INC60L7QvNC/0L7QvdC10L3RgtGLLCDQvtC/0YDQtdC00LXQu9C40YLRjCDQstC60LvQsNC0INC/0LXRgNCy0YvRhSDQtNCy0YPRhSDQsiDQvtCx0YnRg9GOINC00LjRgdC/0LXRgNGB0LjRjiDQuCDQv9C+0YHRgtGA0L7QuNGC0Ywg0LTQstGD0LzQtdGA0L3Rg9GOINC00LjQsNCz0YDQsNC80LzRgyDQv9C10YDQstGL0YUg0LTQstGD0YUg0YTQsNC60YLQvtGA0L7Qsi4NCg0KLS0tDQoNCtCS0LrQu9Cw0LQg0LPQu9Cw0LLQvdGL0YUg0LrQvtC80L/QvtC90LXQvdGCINCyINC+0LHRidGD0Y4g0LTQuNGB0L/QtdGA0YHQuNGODQpgYGB7cn0NCnBjIDwtIHByaW5jb21wKHNjYWxlKGRhdGEpKQ0Kc3VtbWFyeShwYykNCmBgYA0K0J/QtdGA0LLRi9C1INC00LLQtSDQutC+0LzQv9C+0L3QtdC90YLRiyDQtNCw0Y7RgiBgciAwLjUyMDQ1ODcgKiAxMDBgJQ0KDQoNCtCk0LDQutGC0L7RgNC90YvQtSDQvdCw0LPRgNGD0LfQutC4DQpgYGB7cn0NCnBjJGxvYWRpbmdzWywgc2VxKDUpXQ0KYGBgDQrQn9C10YDQstCw0Y8g0LrQvtC80L/QvtC90LXQvdGC0LAg0L7RgtCy0LXRh9Cw0LXRgiDQt9CwICLQvNC10LTQuNGG0LjQvdGB0LrQuNC1IiDRhNCw0LrRgtC+0YDRizog0YLRgNC10LLQvtC20L3QvtGB0YLRjCwg0LzQtdC00LjRhtC40L3RgdC60LjQuSDQuCDQv9GB0LjRhdC40LDRgtGA0LjRh9C10YHQutC40Lkg0YHRgtCw0YLRg9GBLCDQtNC70LjRgtC10LvRjNC90L7RgdGC0Ywg0LPQtdGA0L7QuNC90L7QstC+0Lkg0LfQsNCy0LjRgdC40LzQvtGB0YLQuCwg0L/RgNC40YLQvtC8INCy0LXQt9C00LUg0YHQstGP0LfRjCDQv9GA0Y/QvNC+INC/0YDQvtC/0L7RgNGG0LjQvtC90LDQu9GM0L3QsC4gIA0K0JLRgtC+0YDQsNGPINC60L7QvNC/0L7QvdC10L3RgtCwINGB0LLRj9C30LDQvdCwINGBINC/0L7QvdC40LbQtdC90LjQtdC8INGB0L7RhtC40LDQu9GM0L3QvtCz0L4g0YHRgtCw0YLRg9GB0LAg0Lgg0L/QvtCy0YvRiNC10L3QuNC10Lwg0LzQtdC00LjRhtC40L3RgdC60L7Qs9C+INGB0YLQsNGC0YPRgdCwLiAgDQrQotGA0LXRgtGM0Y8gLS0g0YEg0L/QvtC90LjQttC10L3QuNC10Lwg0LTQu9C40YLQtdC70YzQvdC+0YHRgtC4INCz0LXRgNC+0LjQvdC+0LLQvtC5INC30LDQstC40YHQuNC80L7RgdGC0LguICANCtCn0LXRgtCy0LXRgNGC0LDRjyAtLSDRgSDQv9C+0L3QuNC20LXQvdC40LXQvCDQvNC10LTQuNGG0LjQvdGB0LrQvtCz0L4g0YHRgtCw0YLRg9GB0LAg0Lgg0L/QvtCy0YvRiNC10L3QuNC10Lwg0YPRgNC+0LLQvdGPINGC0YDQtdCy0L7QttC90L7RgdGC0LguICANCtCf0Y/RgtCw0Y8g0LrQvtC80L/QvtC90LXQvdGC0LAg0LPQvtCy0L7RgNC40YIg0L4g0L/QvtCy0YvRiNC10L3QuNC4INGD0YDQvtCy0L3RjyDRgtGA0LXQstC+0LbQvdC+0YHRgtC4INC4INGB0L7RhtC40LDQu9GM0L3QvtCz0L4g0YHRgtCw0YLRg9GB0LAg0LLQvNC10YHRgtC1INGBINC/0L7QvdC40LbQtdC90LjQtdC8INC/0YHQuNGF0LjQsNGC0YDQuNGH0LXRgdC60L7Qs9C+INGB0YLQsNGC0YPRgdCwLiAgDQoNCtCf0YDQvtCy0LXRgNC60LAgW9GB0L7QstC/0LDQtNCw0Y7RgiDRgSDRgtC+0YfQvdC+0YHRgtGM0Y4g0LTQviDQv9C10YDQtdGB0YLQsNC90L7QstC60Lgg0LfQvdCw0LrQvtCyINC00LvRjywg0L3QsNC/0YDQuNC80LXRgCwg0L/QtdGA0LLQvtCz0L4g0YTQsNC60YLQvtGA0LBdOg0KYGBge3J9DQplaSA8LSBlaWdlbihjb3IoZGF0YSkpDQoNCkEgPC0gZWkkdmVjdG9ycw0KWSA8LSBhcy5tYXRyaXgoc2NhbGUoZGF0YSkpICUqJSBBDQoNCmNiaW5kKFlbc2VxKDEwKSwgc2VxKDMpXSwgcGMkc2NvcmVzW3NlcSgxMCksc2VxKDMpXSkNCmBgYA0KDQoNCmBgYHtyIGV2YWw9RkFMU0UsIGluY2x1ZGU9RkFMU0V9DQpiaXBsb3QocGMsIGNleD0wLjUpDQpgYGANCg0KYGBge3J9DQpwbG90KHBjJHNjb3JlcywgdHlwZT0ibiIpDQp0ZXh0KHBjJHNjb3Jlcywgcm93Lm5hbWVzKGRhdGEpLCBjZXg9MC42KQ0KYGBgDQrQl9Cw0LzQtdGC0LjQvCDQstGL0LHRgNC+0YEg0LIg0LLQuNC00LUg0L/QsNGG0LjQtdC90YLQsCDihJYxNjY6INC00LvRjyDQvdC10LPQviDRhdCw0YDQsNC60YLQtdGA0L3QviDQsdC+0LvRjNGI0L7QtSDQt9C90LDRh9C10L3QuNC1IENvbXAuMSAtLSDQv9C+0LLRi9GI0LXQvdC90YvQtSAi0LzQtdC00LjRhtC40L3RgdC60LjQtSIg0YTQsNC60YLQvtGA0YsgLS0g0L/RgNC4INC00L7RgdGC0LDRgtC+0YfQvdC+INC90LjQt9C60L7QvCBDb21wLjINCg==