Вступ

Контекст дослідження:

  • Моніторинг цінностей в умовах війни та післявоєнного відновлення потребує валідизованих, компактних інструментів
  • PVQ-10 у WVS: кожна цінність вимірюється одним пунктом → обмеження для повної структури Шварца
  • Відсутність систематичної психометричної верифікації в українському контексті

Мета: Встановити емпіричну структуру базових цінностей в Україні та дослідити зв’язки з індексами культурної модернізації Інглгарта–Вельцеля

Дані: Результати Всесвітнього дослідження цінностей за 2021 рік. Вибірка в Україні містила 1500 респондентів.

Змінні

# Створення першого датафрейму
pvq10_df <- data.frame(
  Цінність = c(
    "Самоспрямування (Self-Direction, sdi)",
    "Влада (Power, pow)",
    "Безпека (Security, sec)",
    "Гедонізм (Hedonism, hed)",
    "Доброзичливість (Benevolence, ben) ",
    "Досягнення (Achievement, ach)",
    "Стимуляція (Stimulation, sti)",
    "Конформність (Conformity, con)",
    "Універсалізм (Universalism, uni)",
    "Традиція (Tradition, tra)"
  ),
  Формулювання = c(
    "Для цієї людини важливо пропонувати нові ідеї, бути творчою особистістю, йти своїм шляхом.",
    "Для цієї людини важливо бути багатим, мати багато грошей і коштовних речей.",
    "Жити в безпеці дуже важливо для цієї людини, він уникає усього, що може передбачати небезпеку.",
    "Для цієї людини важливо добре проводити час, балувати себе.",
    "Для цієї людини важливо робити щось хороше для суспільства.",
    "Для цієї людини важливо бути дуже успішним, щоб оточення знало про його досягнення.",
    "Пригоди і ризик дуже важливі для цієї людини, він прагне до життя, повного захоплюючих подій.",
    "Для цієї людини важливо завжди поводитися правильно, не здійснювати вчинків, які люди не схвалили б.",
    "Для цієї людини важлива турбота про довкілля і природу",
    "Для цієї людини важливо наслідувати традиції і звичаї, прийняті в його родині або релігії."
  ),
  # R автоматично перевіряє імена, але для наочності краще встановити
  check.names = FALSE,
  stringsAsFactors = FALSE
)

# Відображення таблиці за допомогою knitr::kable
knitr::kable(
  pvq10_df, 
  caption = "Пункти шкали базових людських цінностей (PVQ-10)"
)
Пункти шкали базових людських цінностей (PVQ-10)
Цінність Формулювання
Самоспрямування (Self-Direction, sdi) Для цієї людини важливо пропонувати нові ідеї, бути творчою особистістю, йти своїм шляхом.
Влада (Power, pow) Для цієї людини важливо бути багатим, мати багато грошей і коштовних речей.
Безпека (Security, sec) Жити в безпеці дуже важливо для цієї людини, він уникає усього, що може передбачати небезпеку.
Гедонізм (Hedonism, hed) Для цієї людини важливо добре проводити час, балувати себе.
Доброзичливість (Benevolence, ben) Для цієї людини важливо робити щось хороше для суспільства.
Досягнення (Achievement, ach) Для цієї людини важливо бути дуже успішним, щоб оточення знало про його досягнення.
Стимуляція (Stimulation, sti) Пригоди і ризик дуже важливі для цієї людини, він прагне до життя, повного захоплюючих подій.
Конформність (Conformity, con) Для цієї людини важливо завжди поводитися правильно, не здійснювати вчинків, які люди не схвалили б.
Універсалізм (Universalism, uni) Для цієї людини важлива турбота про довкілля і природу
Традиція (Tradition, tra) Для цієї людини важливо наслідувати традиції і звичаї, прийняті в його родині або релігії.

Примітка. Вищі значення в усіх шкалах відображають більшу вираженість відповідних цінностей.

# Створення другого датафрейму
iw_values_df <- data.frame(
  Вимір = c(
    # --- Індекс емансипативних цінностей та його субіндекси ---
    "Емансипативні цінності (RESEMAVAL)",
    "  Самостійність, незалежність (AUTONOMY)", # Субіндекс
    "  Індивідуальна свобода вибору (CHOICE)",   # Субіндекс
    "  Рівність / Гендерна рівність (EQUALITY)",  # Субіндекс
    "  Участь / Право голосу (VOICE)",           # Субіндекс
    
    # --- Індекс секулярно-раціональних цінностей та його субіндекси ---
    "Секулярно-раціональні цінності (SACSECVAL)",
    "  Невіра, низька релігійність (DISBELIEF)",   # Субіндекс
    "  Моральний релятивізм (RELATIVISM)",         # Субіндекс
    "  Непокора авторитетам (DEFIANCE)",           # Субіндекс
    
    # --- Інші окремі індекси ---
    "Індекс постматеріалізму 12-пункт. (Y001)",
    "Індекс постматеріалізму 4-пункт. (Y002)",
    "Індекс автономії Інглгарта (Y003)"
  ),
  Зміст = c(
    # --- RESEMAVAL ---
    "Інтегральний показник орієнтації на свободу вибору, гендерну рівність, участь і толерантність.",
    "Орієнтація на самовираження, незалежність, креативність; пріоритети виховання «незалежності» та «уяви».",
    "Прийняття індивідуальної свободи в моральних питаннях — толерантність до абортів, гомосексуальності, розлучень.",
    "Підтримка гендерної рівності в ключових сферах суспільного життя (політика, освіта, економіка).",
    "Активна громадянська позиція, що поєднує політичну участь та відчуття особистого контролю над життям.",
    
    # --- SACSECVAL ---
    "Інтегральний показник секуляризації й раціоналізму — відхід від традиційної релігійності та підпорядкування авторитетам.",
    "Слабка віра в надприродне, низька релігійна залученість.",
    "Гнучкість моральних оцінок, відхід від абсолютних норм і догм.",
    "Критичне ставлення до влади, відкидання авторитаризму й традиційних ієрархій.",
    
    # --- Інші індекси ---
    "Розширена комплексна оцінка матеріалістичних/постматеріалістичних цінностей (12 пунктів).",
    "Базова оцінка матеріалістичних/постматеріалістичних цінностей (4 пункти).",
    "Показник самовираження, заснований на пріоритеті незалежності, самоконтролю та особистої ініціативи."
  ),
  check.names = FALSE,
  stringsAsFactors = FALSE
)

# Відображення початкової версії таблиці
knitr::kable(
  iw_values_df, 
  caption = "Індекси культурних цінностей Інглгарта–Вельцеля"
)
Індекси культурних цінностей Інглгарта–Вельцеля
Вимір Зміст
Емансипативні цінності (RESEMAVAL) Інтегральний показник орієнтації на свободу вибору, гендерну рівність, участь і толерантність.
Самостійність, незалежність (AUTONOMY) Орієнтація на самовираження, незалежність, креативність; пріоритети виховання «незалежності» та «уяви».
Індивідуальна свобода вибору (CHOICE) Прийняття індивідуальної свободи в моральних питаннях — толерантність до абортів, гомосексуальності, розлучень.
Рівність / Гендерна рівність (EQUALITY) Підтримка гендерної рівності в ключових сферах суспільного життя (політика, освіта, економіка).
Участь / Право голосу (VOICE) Активна громадянська позиція, що поєднує політичну участь та відчуття особистого контролю над життям.
Секулярно-раціональні цінності (SACSECVAL) Інтегральний показник секуляризації й раціоналізму — відхід від традиційної релігійності та підпорядкування авторитетам.
Невіра, низька релігійність (DISBELIEF) Слабка віра в надприродне, низька релігійна залученість.
Моральний релятивізм (RELATIVISM) Гнучкість моральних оцінок, відхід від абсолютних норм і догм.
Непокора авторитетам (DEFIANCE) Критичне ставлення до влади, відкидання авторитаризму й традиційних ієрархій.
Індекс постматеріалізму 12-пункт. (Y001) Розширена комплексна оцінка матеріалістичних/постматеріалістичних цінностей (12 пунктів).
Індекс постматеріалізму 4-пункт. (Y002) Базова оцінка матеріалістичних/постматеріалістичних цінностей (4 пункти).
Індекс автономії Інглгарта (Y003) Показник самовираження, заснований на пріоритеті незалежності, самоконтролю та особистої ініціативи.

Примітка. Вищі значення в усіх шкалах відображають більшу вираженість відповідних культурних цінностей або орієнтацій.


Завантаження бібліотек

rm(list=ls()) 

# Завантаження необхідних пакетів
library(haven)        # Читання файлів SPSS
library(dplyr)        # Маніпуляція даними
library(tidyr)        # Трансформація даних
library(stats)        # Статистичні функції
library(Hmisc)        # Зважена кореляція
library(sjmisc)       # Описова статистика
library(kableExtra)   # Форматування таблиць
library(smacof)       # Багатовимірне шкалювання
library(ggplot2)      # Візуалізація
library(ggrepel)      # Підписи на графіках
library(corrplot)     # Кореляційні матриці
library(EGAnet)       # Експлораторний графовий аналіз
library(psych)        # Психометричний аналіз
library(lavaan)       # Моделювання структурними рівняннями
library(knitr)        # Генерація звітів
library(semPlot)      # Візуалізація SEM моделей
library(weights)      # Зважена кореляція

Аналіз даних: Пріоритет експлораторних методів через обмеження формату з одним індикатором на цінність



1. Підготовка даних

# Завантаження даних World Values Survey Wave 6
dataset_W <- read_sav("WV6_Data_sav_v20201117.sav")

# Фільтрація для України
dataset_U <- dataset_W %>%
  filter(C_COW_ALPHA == "UKR")

cat("📊 Загальна кількість спостережень для України:", nrow(dataset_U), "\n")
## 📊 Загальна кількість спостережень для України: 1500

1.1. Попередня діагностика вихідних змінних

# Змінні Шварца у WVS
schwartz_original_vars <- paste0("V", 70:79)

# Перевірка діапазону та відсутніх значень
cat("\n=== ДІАГНОСТИКА ВИХІДНИХ ЗМІННИХ ШВАРЦА ===\n")
## 
## === ДІАГНОСТИКА ВИХІДНИХ ЗМІННИХ ШВАРЦА ===
validation_report <- data.frame(
  Variable = schwartz_original_vars,
  Min = NA,
  Max = NA,
  N_Valid = NA,
  N_Missing = NA,
  Percent_Missing = NA,
  Invalid_Values = NA
)

for (i in seq_along(schwartz_original_vars)) {
  var <- schwartz_original_vars[i]
  
  # Конвертація в числовий формат
  values <- as.numeric(haven::zap_labels(dataset_U[[var]]))
  
  # Підрахунок статистик
  validation_report$Min[i] <- min(values, na.rm = TRUE)
  validation_report$Max[i] <- max(values, na.rm = TRUE)
  validation_report$N_Valid[i] <- sum(!is.na(values))
  validation_report$N_Missing[i] <- sum(is.na(values))
  validation_report$Percent_Missing[i] <- round(
    sum(is.na(values)) / length(values) * 100, 2
  )
  
  # Перевірка на недопустимі значення (поза діапазоном 1-6)
  invalid <- values[!is.na(values) & (values < 1 | values > 6)]
  validation_report$Invalid_Values[i] <- length(invalid)
}

kable(validation_report, 
      caption = "Діагностика вихідних змінних Шварца (V70-V79)",
      col.names = c("Змінна", "Min", "Max", "Валідних", "NA", "% NA", "Поза діапазоном")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Діагностика вихідних змінних Шварца (V70-V79)
Змінна Min Max Валідних NA % NA Поза діапазоном
V70 1 6 1500 0 0 0
V71 1 6 1500 0 0 0
V72 1 6 1500 0 0 0
V73 1 6 1500 0 0 0
V74 1 6 1500 0 0 0
V75 1 6 1500 0 0 0
V76 1 6 1500 0 0 0
V77 1 6 1500 0 0 0
V78 1 6 1500 0 0 0
V79 1 6 1500 0 0 0
# Виведення попередження, якщо є проблеми
if (any(validation_report$Invalid_Values > 0)) {
  cat("\n⚠️ УВАГА: Виявлено значення поза діапазоном 1-6!\n")
  problematic <- validation_report[validation_report$Invalid_Values > 0, ]
  print(problematic)
}

1.2. Таблиця відповідності змінних

# Назви нових змінних
new_names <- c("sdi", "pow", "sec", "hed", "uni", "ach", "sti", "con", "ben", "tra")

# Витягування атрибутів (labels) з оригінальних змінних
value_labels <- sapply(schwartz_original_vars, function(var) {
  label <- attr(dataset_U[[var]], "label")
  if (is.null(label)) {
    return("Немає атрибута")
  } else {
    return(label)
  }
})

# Створення таблиці відповідності
mapping_table <- data.frame(
  Оригінальна_змінна = schwartz_original_vars,
  Формулювання_запитання = value_labels,
  Нова_змінна = new_names,
  Цінність = c(
    "Self-Direction (Самоспрямування)",
    "Power (Влада)",
    "Security (Безпека)",
    "Hedonism (Гедонізм)",
    "Universalism (Універсалізм)",
    "Achievement (Досягнення)",
    "Stimulation (Стимуляція)",
    "Conformity (Конформність)",
    "Benevolence (Доброзичливість)",
    "Tradition (Традиція)"
  ),
  stringsAsFactors = FALSE
)

kable(mapping_table, 
      caption = "Таблиця відповідності змінних Шварца",
      col.names = c("Вихідна змінна", "Формулювання в WVS", "Нова змінна", "Цінність")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), 
                full_width = TRUE) %>%
  column_spec(2, width = "40em")
Таблиця відповідності змінних Шварца
Вихідна змінна Формулювання в WVS Нова змінна Цінність
V70 V70 Schwartz: It is important to this person to think up new ideas and be creative sdi Self-Direction (Самоспрямування)
V71 V71 Schwartz: It is important to this person to be rich pow Power (Влада)
V72 V72 Schwartz: It is important to this person living in secure surroundings sec Security (Безпека)
V73 V73 Schwartz: It is important to this person to have a good time hed Hedonism (Гедонізм)
V74 V74 Schwartz: It is important to this person to do something for the good of society uni Universalism (Універсалізм)
V75 V75 Schwartz: It is important to this person being very successful ach Achievement (Досягнення)
V76 V76 Schwartz: It is important to this person adventure and taking risks sti Stimulation (Стимуляція)
V77 V77 Schwartz: It is important to this person to always behave properly con Conformity (Конформність)
V78 V78 Schwartz: It is important to this person looking after the environment ben Benevolence (Доброзичливість)
V79 V79 Schwartz: It is important to this person tradition tra Tradition (Традиція)

1.3. Перекодування змінних Шварца

cat("\n=== ПЕРЕКОДУВАННЯ ЗМІННИХ ===\n")
## 
## === ПЕРЕКОДУВАННЯ ЗМІННИХ ===
# Перевірка, чи всі значення в допустимому діапазоні
if (all(validation_report$Invalid_Values == 0)) {
  
  # Інверсія шкали: вищі бали = сильніша підтримка цінності
  dataset_U <- dataset_U %>%
    mutate(
      sdi = 7 - V70,  # Самоспрямування (Self-Direction)
      pow = 7 - V71,  # Влада (Power)
      sec = 7 - V72,  # Безпека (Security)
      hed = 7 - V73,  # Гедонізм (Hedonism)
      uni = 7 - V74,  # Універсалізм (Universalism)
      ach = 7 - V75,  # Досягнення (Achievement)
      sti = 7 - V76,  # Стимуляція (Stimulation)
      con = 7 - V77,  # Конформність (Conformity)
      ben = 7 - V78,  # Доброзичливість (Benevolence)
      tra = 7 - V79   # Традиція (Tradition)
    ) %>%
    rename(
      country = C_COW_ALPHA,
      wt = V258
    )
  
  cat("✅ Перекодування успішно завершено\n")
  
  # Список перекодованих змінних
  schwartz_vars <- c("sdi", "sti", "hed", "ach", "pow", 
                     "sec", "con", "tra", "uni", "ben")
  
  # Розрахунок зваженої кількості
  nwt_U <- round(sum(dataset_U$wt), 0)
  cat("⚖️  Зважена кількість спостережень:", nwt_U, "\n")
  
} else {
  cat("❌ ПОМИЛКА: Виявлено недопустимі значення. Перекодування не виконано.\n")
  cat("   Необхідно спочатку очистити дані.\n")
}
## ✅ Перекодування успішно завершено
## ⚖️  Зважена кількість спостережень: 1500

1.4. Аналіз відсутніх значень

# Змінні для аналізу номологічної валідності

inglehart_welzel_vars <- c(
  
  # --- Група 1: Емансипативні цінності ---
  "RESEMAVAL", # Головний індекс
  "AUTONOMY",  # Субіндекс RESEMAVAL
  "CHOICE",    # Субіндекс RESEMAVAL
  "EQUALITY",  # Субіндекс RESEMAVAL
  "VOICE",     # Субіндекс RESEMAVAL
  
  # --- Група 2: Секулярно-раціональні цінності ---
  "SACSECVAL", # Головний індекс
  "DISBELIEF", # Субіндекс SACSECVAL
  "RELATIVISM",# Субіндекс SACSECVAL
  "DEFIANCE",  # Субіндекс SACSECVAL
  
  # --- Група 3: Окремі індекси ---
  "Y001",      # Індекс постматеріалізму (12-компонентний)
  "Y002",      # Індекс постматеріалізму (4-компонентний)
  "Y003"       # Індекс автономії Інглгарта
)


# Перевірка наявності змінних
existing_vars <- inglehart_welzel_vars[inglehart_welzel_vars %in% names(dataset_U)]
missing_vars <- inglehart_welzel_vars[!inglehart_welzel_vars %in% names(dataset_U)]

if (length(missing_vars) > 0) {
  cat("\n⚠️  УВАГА: Змінні відсутні в датасеті:\n")
  print(missing_vars)
}

# Зведена таблиця відсутніх значень
all_analysis_vars <- c(schwartz_vars, existing_vars, "wt")

na_summary <- data.frame(
  Variable = all_analysis_vars,
  N_Total = nrow(dataset_U),
  N_Missing = sapply(dataset_U[all_analysis_vars], function(x) sum(is.na(x))),
  N_Valid = sapply(dataset_U[all_analysis_vars], function(x) sum(!is.na(x))),
  Percent_Missing = round(sapply(dataset_U[all_analysis_vars], 
                                 function(x) sum(is.na(x)) / nrow(dataset_U) * 100), 2)
)

kable(na_summary, 
      caption = "Таблиця відсутніх значень",
      col.names = c("Змінна", "Всього", "NA", "Валідних", "% NA")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Таблиця відсутніх значень
Змінна Всього NA Валідних % NA
sdi sdi 1500 0 1500 0
sti sti 1500 0 1500 0
hed hed 1500 0 1500 0
ach ach 1500 0 1500 0
pow pow 1500 0 1500 0
sec sec 1500 0 1500 0
con con 1500 0 1500 0
tra tra 1500 0 1500 0
uni uni 1500 0 1500 0
ben ben 1500 0 1500 0
RESEMAVAL RESEMAVAL 1500 0 1500 0
AUTONOMY AUTONOMY 1500 0 1500 0
CHOICE CHOICE 1500 0 1500 0
EQUALITY EQUALITY 1500 0 1500 0
VOICE VOICE 1500 0 1500 0
SACSECVAL SACSECVAL 1500 0 1500 0
DISBELIEF DISBELIEF 1500 0 1500 0
RELATIVISM RELATIVISM 1500 0 1500 0
DEFIANCE DEFIANCE 1500 0 1500 0
Y001 Y001 1500 0 1500 0
Y002 Y002 1500 0 1500 0
Y003 Y003 1500 0 1500 0
wt wt 1500 0 1500 0

2. Результати: описова статистика

cat("\n=== Описова статистика для 10 ціннісних показників (PVQ-10) ===\n")
## 
## === Описова статистика для 10 ціннісних показників (PVQ-10) ===
# Конвертація в числовий формат
dataset_U[schwartz_vars] <- lapply(dataset_U[schwartz_vars], 
                                   function(x) as.numeric(haven::zap_labels(x)))

descr(dataset_U[schwartz_vars], weights = dataset_U$wt) %>%
  kbl(digits = 2, caption = "Описові статистики PVQ-10 для України") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Описові статистики PVQ-10 для України
var type label n NA.prc mean sd se range iqr skew
6 sdi numeric sdi 1500 0 3.58 1.42 0.04 5 (1-6) 3 -0.01
8 sti numeric sti 1500 0 2.80 1.39 0.04 5 (1-6) 2 0.60
4 hed numeric hed 1500 0 3.16 1.37 0.04 5 (1-6) 2 0.33
1 ach numeric ach 1500 0 3.47 1.35 0.03 5 (1-6) 2 0.12
5 pow numeric pow 1500 0 3.03 1.35 0.03 5 (1-6) 2 0.41
7 sec numeric sec 1500 0 4.24 1.33 0.03 5 (1-6) 2 -0.45
3 con numeric con 1500 0 4.26 1.30 0.03 5 (1-6) 2 -0.47
9 tra numeric tra 1500 0 4.51 1.27 0.03 5 (1-6) 2 -0.74
10 uni numeric uni 1500 0 4.08 1.18 0.03 5 (1-6) 2 -0.32
2 ben numeric ben 1500 0 4.03 1.27 0.03 5 (1-6) 2 -0.32

КЛЮЧОВИЙ ВИСНОВОК 1: Ціннісні пріоритети України (2011)

Найбільш пріоритетні цінності:
- Традиція (M = 4.51) - збереження культурної ідентичності
- Конформність (M = 4.26) - повага до соціальних норм
- Безпека (M = 4.24) - прагнення до стабільності

Найменш важливі:
- Стимуляція (M = 2.80) - низька схильність до ризику
- Влада (M = 3.03) - обмежений пріоритет домінування

➡️ Інтерпретація: Сильна орієнтація на підтримання соціального порядку та традиційних цінностей

# Описові статистики цінностей Інглгарта-Вельцеля
correlation_vars <- existing_vars

temp_data <- as.data.frame(lapply(dataset_U[correlation_vars], as.numeric))

descr(temp_data, weights = dataset_U$wt) %>%
  kbl(digits = 2, caption = "Описові статистики індексів Інглгарта-Вельцеля") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"))
Описові статистики індексів Інглгарта-Вельцеля
var type label n NA.prc mean sd se range iqr skew
7 RESEMAVAL numeric RESEMAVAL 1500 0 0.40 0.14 0.00 0.82 (0-0.82) 0.19 0.15
1 AUTONOMY numeric AUTONOMY 1500 0 0.38 0.30 0.01 1 (0-1) 0.67 0.24
2 CHOICE numeric CHOICE 1500 0 0.32 0.21 0.01 1 (0-1) 0.31 0.40
5 EQUALITY numeric EQUALITY 1500 0 0.57 0.24 0.01 1 (0-1) 0.39 -0.30
9 VOICE numeric VOICE 1500 0 0.32 0.24 0.01 1 (0-1) 0.33 0.45
8 SACSECVAL numeric SACSECVAL 1500 0 0.47 0.16 0.00 0.86 (0.06-0.92) 0.22 0.12
4 DISBELIEF numeric DISBELIEF 1500 0 0.43 0.29 0.01 1 (0-1) 0.44 0.61
6 RELATIVISM numeric RELATIVISM 1500 0 0.52 0.40 0.01 1 (0-1) 1.00 -0.04
3 DEFIANCE numeric DEFIANCE 1500 0 0.32 0.18 0.00 0.92 (0-0.92) 0.22 0.33
10 Y001 numeric Y001 1500 0 1.74 1.07 0.03 5 (0-5) 2.00 0.15
11 Y002 numeric Y002 1500 0 1.58 0.56 0.01 2 (1-3) 1.00 0.34
12 Y003 numeric Y003 1500 0 0.18 1.12 0.03 4 (-2-2) 2.00 -0.14

3. Кореляційний аналіз

# Зважена кореляційна матриця
weighted_corr_U <- cov.wt(dataset_U[schwartz_vars], wt = dataset_U$wt, cor = TRUE)
cor.mat_U <- round(weighted_corr_U$cor, 3)

corrplot(cor.mat_U,
         method = "color",
         type = "upper",
         order = "hclust",
         hclust.method = "average",
         addCoef.col = "black",
         number.cex = 0.7,
         tl.col = "black",
         tl.srt = 45,
         diag = FALSE,
         mar = c(0,0,2,0),
         title = "Кореляційна матриця цінностей Шварца (Україна, 2011)")

Нотатка: Кластерний аналіз виявляє природне групування цінностей у дві групи.


4. Топологічна валідизація: багатовимірне шкалювання (MDS)

# Конвертація кореляцій в відстані
dst_U <- sim2diss(cor.mat_U, method = "corr")

# Неметричне MDS
results_U <- mds(delta = dst_U, ndim = 2, type = "ordinal")
Stress_U <- round(results_U$stress, 3)

# Підготовка даних
pl_U <- as.data.frame(results_U$conf)
pl_U$Values <- rownames(pl_U)

pl_U <- pl_U %>%
  mutate(ValueGroup = case_when(
    Values %in% c("sti", "hed", "sdi") ~ "Відкритість до змін",
    Values %in% c("pow", "ach")        ~ "Самоствердження",
    Values %in% c("sec", "con", "tra") ~ "Збереження",
    Values %in% c("ben", "uni")        ~ "Самотрансценденція"
  ))

value_colors <- c(
  "Відкритість до змін" = "#0072B2", 
  "Самоствердження" = "grey50", 
  "Збереження" = "#009E73",
  "Самотрансценденція" = "#CC79A7"
)


# Інверсія осі Y для правильного відображення
pl_U$D2_flipped <- -1 * pl_U$D2
 
# Візуалізація
ggplot(pl_U, aes(x = D1, y = D2_flipped, label = Values, color = ValueGroup)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "grey70") +
  geom_vline(xintercept = 0, linetype = "dashed", color = "grey70") +
  geom_point(size = 8, alpha = 0.8) +
  geom_text_repel(color = "black", size = 6, point.padding = 0.5, 
                  box.padding = 0.5, fontface = "bold") +
  scale_color_manual(values = value_colors) +
  xlim(-1.3, 1.3) + ylim(-1.3, 1.3) +
  annotate("text", x = -0.9, y = 0.9, label = "Відкритість\nдо змін", 
           fontface = "bold", color = "#0072B2", size = 6) +
  annotate("text", x = 0.9, y = -0.9, label = "Збереження", 
           fontface = "bold", color = "#009E73", size = 6) +
  annotate("text", x = -0.9, y = -0.9, label = "Самоствердження", 
           fontface = "bold", color = "grey40", size = 6) +
  annotate("text", x = 0.9, y = 0.9, label = "Самотранс-\nценденція", 
           fontface = "bold", color = "#CC79A7", size = 6) +
  labs(
    title = "Циркумплексна модель цінностей Шварца для України",
    subtitle = paste0("Неметричне багатовимірне шкалювання (Stress = ", 
                     Stress_U, " - хороша відповідність)"),
    color = "Група цінностей:"
  ) +
  theme_minimal() +
  theme(
    legend.position = "bottom",
    legend.text = element_text(size = 12),
    plot.title = element_text(hjust = 0.5, size = 18, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5, size = 14),
    axis.title = element_blank(), 
    axis.text = element_blank(),
    axis.ticks = element_blank(), 
    panel.grid = element_blank()
  )

КЛЮЧОВИЙ ВИСНОВОК 2: Квазіциркумплексна структура

Відповідність моделі: Stress = 0.042 (< 0.10 = хороша відповідність)

Що виявлено: - ✅ Чотири квадранти присутні - ✅ Протилежні полюси диференційовані - ❌ Круговий порядок порушений через злиття суміжних цінностей

➡️ Висновок: Часткове відтворення циркумплексу - візуальний поділ на дві групи замість континууму


5. Конфірматорний аналіз: спроба CFA

# Модель з 4 факторами вищого порядку
model_cfa_4f <- '
  # Фактор 1: Самотрансценденція
  Self_Transcendence =~ uni + ben

  # Фактор 2: Самоствердження
  Self_Enhancement =~ pow + ach

  # Фактор 3: Відкритість до змін
  Openness_to_Change =~ sdi + sti + hed

  # Фактор 4: Збереження
  Conservation =~ con + tra + sec

  # Кореляції між протилежними полюсами
  Self_Transcendence ~~ Self_Enhancement
  Openness_to_Change ~~ Conservation


'

fit_cfa_4f <- sem(
  model_cfa_4f,
  data = dataset_U,
  estimator = "MLR",
  sampling.weights = "wt"
)
## Warning: lavaan->lav_object_post_check():  
##    covariance matrix of latent variables is not positive definite ; use 
##    lavInspect(fit, "cov.lv") to investigate.
summary(fit_cfa_4f, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)
## lavaan 0.6-19 ended normally after 40 iterations
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        26
## 
##   Number of observations                          1500
##   Sampling weights variable                         wt
## 
## Model Test User Model:
##                                               Standard      Scaled
##   Test Statistic                               358.686     273.318
##   Degrees of freedom                                29          29
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  1.312
##     Yuan-Bentler correction (Mplus variant)                       
## 
## Model Test Baseline Model:
## 
##   Test statistic                              3867.743    2678.290
##   Degrees of freedom                                45          45
##   P-value                                        0.000       0.000
##   Scaling correction factor                                  1.444
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.914       0.907
##   Tucker-Lewis Index (TLI)                       0.866       0.856
##                                                                   
##   Robust Comparative Fit Index (CFI)                         0.916
##   Robust Tucker-Lewis Index (TLI)                            0.869
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)             -23696.597  -23696.597
##   Scaling correction factor                                  1.330
##       for the MLR correction                                      
##   Loglikelihood unrestricted model (H1)     -23517.254  -23517.254
##   Scaling correction factor                                  1.320
##       for the MLR correction                                      
##                                                                   
##   Akaike (AIC)                               47445.193   47445.193
##   Bayesian (BIC)                             47583.337   47583.337
##   Sample-size adjusted Bayesian (SABIC)      47500.742   47500.742
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.087       0.075
##   90 Percent confidence interval - lower         0.079       0.068
##   90 Percent confidence interval - upper         0.095       0.082
##   P-value H_0: RMSEA <= 0.050                    0.000       0.000
##   P-value H_0: RMSEA >= 0.080                    0.929       0.125
##                                                                   
##   Robust RMSEA                                               0.086
##   90 Percent confidence interval - lower                     0.077
##   90 Percent confidence interval - upper                     0.095
##   P-value H_0: Robust RMSEA <= 0.050                         0.000
##   P-value H_0: Robust RMSEA >= 0.080                         0.857
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.063       0.063
## 
## Parameter Estimates:
## 
##   Standard errors                             Sandwich
##   Information bread                           Observed
##   Observed information based on                Hessian
## 
## Latent Variables:
##                         Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Self_Transcendence =~                                                      
##     uni                    1.000                               0.747    0.634
##     ben                    1.338    0.079   16.896    0.000    1.000    0.789
##   Self_Enhancement =~                                                        
##     pow                    1.000                               0.920    0.683
##     ach                    0.937    0.068   13.682    0.000    0.862    0.640
##   Openness_to_Change =~                                                      
##     sdi                    1.000                               0.792    0.557
##     sti                    1.072    0.069   15.545    0.000    0.849    0.611
##     hed                    1.120    0.082   13.720    0.000    0.887    0.645
##   Conservation =~                                                            
##     con                    1.000                               1.004    0.775
##     tra                    0.849    0.043   19.641    0.000    0.853    0.673
##     sec                    0.648    0.042   15.378    0.000    0.650    0.489
## 
## Covariances:
##                         Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Self_Transcendence ~~                                                      
##     Self_Enhancmnt         0.148    0.038    3.855    0.000    0.215    0.215
##   Openness_to_Change ~~                                                      
##     Conservation          -0.021    0.036   -0.573    0.567   -0.026   -0.026
##   Self_Transcendence ~~                                                      
##     Opennss_t_Chng         0.188    0.036    5.192    0.000    0.317    0.317
##     Conservation           0.632    0.041   15.435    0.000    0.842    0.842
##   Self_Enhancement ~~                                                        
##     Opennss_t_Chng         0.703    0.050   14.037    0.000    0.965    0.965
##     Conservation           0.016    0.044    0.360    0.719    0.017    0.017
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .uni               0.832    0.051   16.366    0.000    0.832    0.598
##    .ben               0.607    0.068    8.922    0.000    0.607    0.378
##    .pow               0.970    0.073   13.248    0.000    0.970    0.534
##    .ach               1.072    0.070   15.324    0.000    1.072    0.591
##    .sdi               1.396    0.063   22.024    0.000    1.396    0.690
##    .sti               1.213    0.067   18.232    0.000    1.213    0.627
##    .hed               1.102    0.067   16.442    0.000    1.102    0.583
##    .con               0.669    0.058   11.512    0.000    0.669    0.399
##    .tra               0.876    0.057   15.397    0.000    0.876    0.547
##    .sec               1.344    0.062   21.689    0.000    1.344    0.761
##     Self_Trnscndnc    0.558    0.051   10.881    0.000    1.000    1.000
##     Self_Enhancmnt    0.847    0.083   10.243    0.000    1.000    1.000
##     Opennss_t_Chng    0.627    0.066    9.436    0.000    1.000    1.000
##     Conservation      1.008    0.068   14.911    0.000    1.000    1.000
## 
## R-Square:
##                    Estimate
##     uni               0.402
##     ben               0.622
##     pow               0.466
##     ach               0.409
##     sdi               0.310
##     sti               0.373
##     hed               0.417
##     con               0.601
##     tra               0.453
##     sec               0.239

КРИТИЧНИЙ РЕЗУЛЬТАТ: CFA не досягла конвергенції

Причина: Вироджена матриця латентних коваріацій через надмірно високі кореляції між факторами

Методологічна імплікація: Формат з одним індикатором на цінність унеможливлює надійну диференціацію всіх 4 теоретичних полюсів Шварца

➡️ Рішення: Перехід до експлораторних методів


6. Експлораторний графовий аналіз (EGA)

cat("\n=== Exploratory Graph Analysis ===\n")
## 
## === Exploratory Graph Analysis ===
ega_result <- EGA(data = cor.mat_U, n = nwt_U, plot.EGA = TRUE)

# Bootstrap для оцінки стабільності
cat("\n=== Bootstrap EGA для оцінки стабільності ===\n")
## 
## === Bootstrap EGA для оцінки стабільності ===
boot_ega <- bootEGA(data = cor.mat_U, n = nwt_U, seed = 123, iter = 500)

КЛЮЧОВИЙ ВИСНОВОК 3: EGA виявив дві спільноти

Структура:
- 🔵 Соціальний фокус: Безпека, Традиція, Конформність, Доброзичливість, Універсалізм
- 🔴 Особистісний фокус: Влада, Досягнення, Гедонізм, Стимуляція, Самоспрямування

➡️ Теоретична відповідність: Це відповідає альтернативному організаційному принципу Шварца - розрізненню за фокусом інтересів


7. Експлораторний факторний аналіз (EFA)

# Двофакторна модель EFA
model_U <- '
  efa("efa")*Social_focus +
  efa("efa")*Personal_focus =~ uni + ben + con + tra + sec + pow + ach + hed + sti + sdi
'

fit_U <- sem(
  model_U,
  data = dataset_U,
  estimator = "MLR",
  sampling.weights = "wt", auto.efa=TRUE
)

summary(fit_U, fit.measures = TRUE, standardized = TRUE, rsquare = TRUE)
## lavaan 0.6-19 ended normally after 1 iteration
## 
##   Estimator                                         ML
##   Optimization method                           NLMINB
##   Number of model parameters                        31
##   Row rank of the constraints matrix                 2
## 
##   Rotation method                       GEOMIN OBLIQUE
##   Geomin epsilon                                 0.001
##   Rotation algorithm (rstarts)                GPA (30)
##   Standardized metric                             TRUE
##   Row weights                                     None
## 
##   Number of observations                          1500
##   Sampling weights variable                         wt
## 
## Model Test User Model:
##                                               Standard      Scaled
##   Test Statistic                               251.867     185.703
##   Degrees of freedom                                26          26
##   P-value (Chi-square)                           0.000       0.000
##   Scaling correction factor                                  1.356
##     Yuan-Bentler correction (Mplus variant)                       
## 
## Model Test Baseline Model:
## 
##   Test statistic                              3867.743    2678.290
##   Degrees of freedom                                45          45
##   P-value                                        0.000       0.000
##   Scaling correction factor                                  1.444
## 
## User Model versus Baseline Model:
## 
##   Comparative Fit Index (CFI)                    0.941       0.939
##   Tucker-Lewis Index (TLI)                       0.898       0.895
##                                                                   
##   Robust Comparative Fit Index (CFI)                         0.943
##   Robust Tucker-Lewis Index (TLI)                            0.901
## 
## Loglikelihood and Information Criteria:
## 
##   Loglikelihood user model (H0)             -23643.187  -23643.187
##   Scaling correction factor                                  1.288
##       for the MLR correction                                      
##   Loglikelihood unrestricted model (H1)     -23517.254  -23517.254
##   Scaling correction factor                                  1.320
##       for the MLR correction                                      
##                                                                   
##   Akaike (AIC)                               47344.375   47344.375
##   Bayesian (BIC)                             47498.458   47498.458
##   Sample-size adjusted Bayesian (SABIC)      47406.333   47406.333
## 
## Root Mean Square Error of Approximation:
## 
##   RMSEA                                          0.076       0.064
##   90 Percent confidence interval - lower         0.068       0.057
##   90 Percent confidence interval - upper         0.085       0.072
##   P-value H_0: RMSEA <= 0.050                    0.000       0.001
##   P-value H_0: RMSEA >= 0.080                    0.236       0.000
##                                                                   
##   Robust RMSEA                                               0.075
##   90 Percent confidence interval - lower                     0.065
##   90 Percent confidence interval - upper                     0.085
##   P-value H_0: Robust RMSEA <= 0.050                         0.000
##   P-value H_0: Robust RMSEA >= 0.080                         0.195
## 
## Standardized Root Mean Square Residual:
## 
##   SRMR                                           0.035       0.035
## 
## Parameter Estimates:
## 
##   Standard errors                             Sandwich
##   Information bread                           Observed
##   Observed information based on                Hessian
## 
## Latent Variables:
##                         Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Social_focus =~ efa                                                        
##     uni                    0.692    0.035   19.996    0.000    0.692    0.587
##     ben                    0.930    0.037   24.985    0.000    0.930    0.734
##     con                    0.968    0.034   28.336    0.000    0.968    0.747
##     tra                    0.838    0.037   22.602    0.000    0.838    0.662
##     sec                    0.628    0.042   14.955    0.000    0.628    0.472
##     pow                   -0.107    0.042   -2.537    0.011   -0.107   -0.080
##     ach                    0.231    0.042    5.444    0.000    0.231    0.171
##     hed                    0.003    0.017    0.148    0.882    0.003    0.002
##     sti                   -0.026    0.035   -0.754    0.451   -0.026   -0.019
##     sdi                    0.253    0.049    5.205    0.000    0.253    0.178
##   Personal_focus =~ efa                                                      
##     uni                    0.228    0.047    4.849    0.000    0.228    0.194
##     ben                    0.076    0.048    1.593    0.111    0.076    0.060
##     con                   -0.199    0.045   -4.397    0.000   -0.199   -0.154
##     tra                   -0.128    0.043   -2.958    0.003   -0.128   -0.101
##     sec                    0.036    0.030    1.209    0.227    0.036    0.027
##     pow                    0.918    0.042   21.658    0.000    0.918    0.681
##     ach                    0.826    0.040   20.890    0.000    0.826    0.613
##     hed                    0.910    0.039   23.398    0.000    0.910    0.663
##     sti                    0.836    0.042   19.970    0.000    0.836    0.601
##     sdi                    0.741    0.045   16.565    0.000    0.741    0.521
## 
## Covariances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##   Social_focus ~~                                                       
##     Personal_focus    0.082    0.041    1.999    0.046    0.082    0.082
## 
## Variances:
##                    Estimate  Std.Err  z-value  P(>|z|)   Std.lv  Std.all
##    .uni               0.833    0.047   17.735    0.000    0.833    0.599
##    .ben               0.724    0.056   12.858    0.000    0.724    0.451
##    .con               0.733    0.057   12.931    0.000    0.733    0.437
##    .tra               0.903    0.056   15.993    0.000    0.903    0.563
##    .sec               1.369    0.061   22.348    0.000    1.369    0.774
##    .pow               0.979    0.064   15.275    0.000    0.979    0.539
##    .ach               1.049    0.059   17.711    0.000    1.049    0.578
##    .hed               1.059    0.063   16.769    0.000    1.059    0.561
##    .sti               1.238    0.066   18.726    0.000    1.238    0.640
##    .sdi               1.380    0.062   22.423    0.000    1.380    0.682
##     Social_focus      1.000                               1.000    1.000
##     Personal_focus    1.000                               1.000    1.000
## 
## R-Square:
##                    Estimate
##     uni               0.401
##     ben               0.549
##     con               0.563
##     tra               0.437
##     sec               0.226
##     pow               0.461
##     ach               0.422
##     hed               0.439
##     sti               0.360
##     sdi               0.318
# Розрахунок поясненої дисперсії
std_solution <- standardizedSolution(fit_U)

ss_loadings <- std_solution %>%
  filter(op == "=~") %>%
  group_by(Factor = lhs) %>%
  summarise(SS_Loadings = sum(est.std^2))

num_variables <- 10
variance_explained <- ss_loadings %>%
  mutate(
    Variance_Explained_Percent = (SS_Loadings / num_variables) * 100
  )

cat("\n=== Пояснена дисперсія ===\n")
## 
## === Пояснена дисперсія ===
kable(variance_explained, 
      caption = "Пояснена дисперсія факторами",
      col.names = c("Фактор", "Сума квадратів навантажень", "% поясненої дисперсії"),
      digits = 2) %>%
  kable_styling(bootstrap_options = c("striped", "hover"))
Пояснена дисперсія факторами
Фактор Сума квадратів навантажень % поясненої дисперсії
Personal_focus 1.99 19.87
Social_focus 2.17 21.70

7.1. Візуалізація факторної структури

semPaths(
  fit_U,
  edge.color = "black",
  what = "std",
  intercepts = FALSE,
  thresholds = FALSE,
  residuals = FALSE,
  style = "lisrel",
  rotation = 1,
  nCharNodes = 0,
  layout = "circle",
  sizeMan = 9,
  sizeMan2 = 6,
  sizeLat = 14,
  sizeLat2 = 16,
  label.cex = 1.4,
  shapeLat = "ellipse",
  exoCov = TRUE,
  curve = 3,
  curvePivotShape = 0.9,
  esize = 1.2,
  mar = c(3, 8, 3, 3),
  edge.label.cex = 1.2
)

7.2. Індекси відповідності моделі

measures_U <- fitMeasures(
  fit_U,
  c("rmsea.robust", "rmsea.ci.lower.robust", "rmsea.ci.upper.robust",
    "tli.robust", "cfi.robust", "srmr")
)

comp_tab_U <- data.frame(
  `Показник` = c(
    "Robust RMSEA",
    "90% ДІ Robust RMSEA",
    "Robust TLI",
    "Robust CFI",
    "SRMR"
  ),
  `Значення` = c(
    round(measures_U["rmsea.robust"], 3),
    paste0("[", round(measures_U["rmsea.ci.lower.robust"], 3), ", ", 
           round(measures_U["rmsea.ci.upper.robust"], 3), "]"),
    round(measures_U["tli.robust"], 3),
    round(measures_U["cfi.robust"], 3),
    round(measures_U["srmr"], 3)
  ),
  `Критерій` = c(
    "≤ 0.08",
    "-",
    "≥ 0.90",
    "≥ 0.90",
    "≤ 0.08"
  ),
  `Оцінка` = c(
    ifelse(measures_U["rmsea.robust"] <= 0.08, "✅ Прийнятно", "❌ Неприйнятно"),
    "-",
    ifelse(measures_U["tli.robust"] >= 0.90, "✅ Прийнятно", "❌ Неприйнятно"),
    ifelse(measures_U["cfi.robust"] >= 0.90, "✅ Прийнятно", "❌ Неприйнятно"),
    ifelse(measures_U["srmr"] <= 0.08, "✅ Прийнятно", "❌ Неприйнятно")
  ),
  check.names = FALSE
)

kbl(comp_tab_U, caption = "Індекси відповідності двофакторної моделі EFA") %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed"), full_width = FALSE)
Індекси відповідності двофакторної моделі EFA
Показник Значення Критерій Оцінка
rmsea.robust Robust RMSEA 0.075 ≤ 0.08 ✅ Прийнятно
90% ДІ Robust RMSEA [0.065, 0.085]
tli.robust Robust TLI 0.901 ≥ 0.90 ✅ Прийнятно
cfi.robust Robust CFI 0.943 ≥ 0.90 ✅ Прийнятно
srmr SRMR 0.035 ≤ 0.08 ✅ Прийнятно

КЛЮЧОВИЙ ВИСНОВОК 4: Прийнятна відповідність двофакторної моделі

Індекси відповідності: - Robust RMSEA = 0.075 (≤ 0.08) ✅ - Robust CFI = 0.943 (≥ 0.90) ✅ - Robust TLI = 0.901 (≥ 0.90) ✅ - SRMR = 0.035 (≤ 0.08) ✅

Факторна структура: Всі цінності навантажуються на відповідні фактори без суттєвих перехресних навантажень

➡️ Висновок: Двофакторна модель адекватно описує емпіричні дані

7.3. Збереження факторних балів

factor_scores <- lavPredict(fit_U)

dataset_U$Social_focus <- factor_scores[, 1]
dataset_U$Personal_focus <- factor_scores[, 2]

cat("✅ Факторні бали збережено для подальшого кореляційного аналізу\n")
## ✅ Факторні бали збережено для подальшого кореляційного аналізу

Рішення: Використання факторних балів (а не композитних індексів) для перевірки номологічної валідності обумовлено необхідністю тестування латентних конструктів з урахуванням їхньої факторної структури


8. Надійність шкал: Альфа Кронбаха

8.1. Соціальний фокус

SocialFocus_vars_U <- dataset_U[, c("sec", "con", "tra", "ben", "uni")]
SocialFocus_cor_U <- cov.wt(SocialFocus_vars_U, wt = dataset_U$wt, cor = TRUE)
SocialFocus_mat_U <- round(SocialFocus_cor_U$cor, 3)

SocialFocus_result_U <- psych::alpha(SocialFocus_mat_U, n.obs = nwt_U)
SocialFocus_alpha_U <- round(SocialFocus_result_U$total$raw_alpha, 2)

SocialFocus_ci_U <- psych::alpha.ci(SocialFocus_alpha_U, 
                                    n.obs = nwt_U, n.var = 5)
SocialFocus_avg_r_U <- round(SocialFocus_result_U$total$average_r, 2)

cat("📊 Альфа Кронбаха (Соціальний фокус):", SocialFocus_alpha_U, "\n")
## 📊 Альфа Кронбаха (Соціальний фокус): 0.77
cat("   95% ДІ:", round(SocialFocus_ci_U$lower.ci, 2), "-", 
    round(SocialFocus_ci_U$upper.ci, 2), "\n")
##    95% ДІ: 0.75 - 0.79
cat("   Середня міжпунктова кореляція:", SocialFocus_avg_r_U, "\n")
##    Середня міжпунктова кореляція: 0.4

8.2. Особистісний фокус

PersonalFocus_vars_U <- dataset_U[, c("sdi", "sti", "hed", "ach", "pow")]
PersonalFocus_cor_U <- cov.wt(PersonalFocus_vars_U, wt = dataset_U$wt, cor = TRUE)
PersonalFocus_mat_U <- round(PersonalFocus_cor_U$cor, 3)

PersonalFocus_result_U <- psych::alpha(PersonalFocus_mat_U, n.obs = nwt_U)
PersonalFocus_alpha_U <- round(PersonalFocus_result_U$total$raw_alpha, 2)

PersonalFocus_ci_U <- psych::alpha.ci(PersonalFocus_alpha_U, 
                                      n.obs = nwt_U, n.var = 5)
PersonalFocus_avg_r_U <- round(PersonalFocus_result_U$total$average_r, 2)

cat("📊 Альфа Кронбаха (Особистісний фокус):", PersonalFocus_alpha_U, "\n")
## 📊 Альфа Кронбаха (Особистісний фокус): 0.76
cat("   95% ДІ:", round(PersonalFocus_ci_U$lower.ci, 2), "-", 
    round(PersonalFocus_ci_U$upper.ci, 2), "\n")
##    95% ДІ: 0.74 - 0.78
cat("   Середня міжпунктова кореляція:", PersonalFocus_avg_r_U, "\n")
##    Середня міжпунктова кореляція: 0.38

КЛЮЧОВИЙ ВИСНОВОК 5: Хороша внутрішня узгодженість

Надійність шкал:
- Соціальний фокус: α = 0.77 (> 0.70) ✅ - Особистісний фокус: α = 0.76 (> 0.70) ✅

Proportion of Variance Explained:
- Соціальний фокус: 22% поясненої дисперсії
- Особистісний фокус: 20% поясненої дисперсії

➡️ Інтерпретація: Низькі значення частки поясненої загальної дисперсії фактором (сумарно менше 50%) компенсує прийнятна надійність (α ≥ 0.70), що забезпечує валідність конструктів (Fornell & Larcker, 1981)


9. Номологічна валідність: кореляції з індексами Інглгарта-Вельцеля

# Списки змінних
schwartz_foci_vars <- c("Personal_focus", "Social_focus")

# Матриці для збереження результатів
correlation_matrix <- matrix(
  NA, 
  nrow = length(inglehart_welzel_vars), 
  ncol = length(schwartz_foci_vars),
  dimnames = list(inglehart_welzel_vars, schwartz_foci_vars)
)

p_value_matrix <- matrix(
  NA, 
  nrow = length(inglehart_welzel_vars), 
  ncol = length(schwartz_foci_vars),
  dimnames = list(inglehart_welzel_vars, schwartz_foci_vars)
)

# Розрахунок зважених кореляцій
for (var1 in inglehart_welzel_vars) {
  for (var2 in schwartz_foci_vars) {
    test_result <- wtd.cor(
      x = dataset_U[[var1]], 
      y = dataset_U[[var2]], 
      weight = dataset_U$wt
    )
    
    correlation_matrix[var1, var2] <- test_result[1, "correlation"]
    p_value_matrix[var1, var2] <- test_result[1, "p.value"]
  }
}

# Форматування таблиці кореляцій
cor_table <- as.data.frame(round(correlation_matrix, 3))
cor_table$Variable <- rownames(cor_table)

# Додавання значущості
cor_table_formatted <- cor_table %>%
  mutate(
    Personal_focus_sig = ifelse(
      p_value_matrix[Variable, "Personal_focus"] < 0.001, "***",
      ifelse(p_value_matrix[Variable, "Personal_focus"] < 0.01, "**",
             ifelse(p_value_matrix[Variable, "Personal_focus"] < 0.05, "*", ""))
    ),
    Social_focus_sig = ifelse(
      p_value_matrix[Variable, "Social_focus"] < 0.001, "***",
      ifelse(p_value_matrix[Variable, "Social_focus"] < 0.01, "**",
             ifelse(p_value_matrix[Variable, "Social_focus"] < 0.05, "*", ""))
    ),
    Personal_focus = paste0(Personal_focus, Personal_focus_sig),
    Social_focus = paste0(Social_focus, Social_focus_sig)
  ) %>%
  select(Variable, Personal_focus, Social_focus)

kbl(cor_table_formatted, 
    caption = "Зважені кореляції Пірсона факторних балів з індексами культурних цінностей",
    col.names = c("Індекс Інглгарта-Вельцеля", "Особистісний фокус", "Соціальний фокус"),
    align = c("l", "c", "c")) %>%
  kable_styling(bootstrap_options = c("striped", "hover", "condensed")) %>%
  footnote(general = "Примітки: * p < .05, ** p < .01, *** p < .001")
Зважені кореляції Пірсона факторних балів з індексами культурних цінностей
Індекс Інглгарта-Вельцеля Особистісний фокус Соціальний фокус
RESEMAVAL RESEMAVAL 0.162*** -0.037
AUTONOMY AUTONOMY 0.193*** -0.084**
CHOICE CHOICE 0.122*** -0.132***
EQUALITY EQUALITY -0.036 0.054*
VOICE VOICE 0.054* 0.083**
SACSECVAL SACSECVAL 0.109*** -0.316***
DISBELIEF DISBELIEF 0.055* -0.189***
RELATIVISM RELATIVISM 0.171*** -0.243***
DEFIANCE DEFIANCE -0.08** -0.218***
Y001 Y001 0.076** 0.032
Y002 Y002 0.074** 0.034
Y003 Y003 0.204*** -0.075**
Note:
Примітки: * p < .05, ** p < .01, *** p < .001

9.1. Візуалізація ключових кореляцій

# Відбір значущих кореляцій (|r| ≥ 0.10 і p < 0.05)
significant_cors <- data.frame(
  Variable = rep(rownames(correlation_matrix), 2),
  Focus = rep(c("Особистісний фокус", "Соціальний фокус"), 
              each = nrow(correlation_matrix)),
  Correlation = c(correlation_matrix[, "Personal_focus"], 
                  correlation_matrix[, "Social_focus"]),
  P_value = c(p_value_matrix[, "Personal_focus"], 
              p_value_matrix[, "Social_focus"])
) %>%
  filter(abs(Correlation) >= 0.10 & P_value < 0.05)

# Створення графіка
ggplot(significant_cors, aes(x = reorder(Variable, Correlation), 
                             y = Correlation, fill = Focus)) +
  geom_bar(stat = "identity", position = "dodge", alpha = 0.8) +
  geom_hline(yintercept = 0, linetype = "solid", color = "black") +
  geom_hline(yintercept = c(-0.1, 0.1), linetype = "dashed", 
             color = "grey50", alpha = 0.5) +
  coord_flip() +
  scale_fill_manual(values = c("Особистісний фокус" = "#E57373", 
                               "Соціальний фокус" = "#64B5F6")) +
  labs(
    title = "Кореляції факторів PVQ-10 з індексами культурної модернізації",
    subtitle = "Тільки значущі кореляції (|r| ≥ 0.10, p < .05)",
    x = NULL,
    y = "Коефіцієнт кореляції Пірсона",
    fill = "Фактор PVQ-10:"
  ) +
  theme_minimal() +
  theme(
    legend.position = "bottom",
    plot.title = element_text(size = 16, face = "bold"),
    plot.subtitle = element_text(size = 12),
    axis.text.y = element_text(size = 11),
    axis.text.x = element_text(size = 11)
  )

КЛЮЧОВИЙ ВИСНОВОК 6: Емансипативні цінності → Індивідуалізм

Позитивні зв’язки з Особистісним фокусом:
- RESEMAVAL (емансипативні цінності): r = 0.16***
- AUTONOMY (автономія): r = 0.19***
- Y003 (самовираження): r = 0.20***
- RELATIVISM (релятивізм): r = 0.171***
- CHOICE (свобода вибору): r = 0.12***

Негативний зв’язок CHOICE із Соціальним фокусом: r = -0.13***

➡️ Інтерпретація: Прагнення до свободи та самовираження тісно пов’язане з орієнтацією на індивідуальні цілі. Індивідуальна свобода вибору створює напруженість між особистими амбіціями та колективними зобов’язаннями.

КЛЮЧОВИЙ ВИСНОВОК 7: Секуляризація → Послаблення соціальної орієнтації

Негативні зв’язки з Соціальним фокусом:
- SACSECVAL (секулярно-раціональні): r = -0.32*** (найсильніша кореляція!)
- RELATIVISM (моральний релятивізм): r = -0.24***
- DEFIANCE (непокора авторитетам): r = -0.22***
- DISBELIEF (невіра): r = -0.19***

➡️ Відхід від традиційної релігійності та авторитетів супроводжується ослабленням просоціальних установок.

КЛЮЧОВИЙ ВИСНОВОК 8: Постматеріалізм як автономний вимір

Слабкі зв’язки:
- Y002 з Особистісним фокусом: r = 0.08** (слабкий)
- Y002 із Соціальним фокусом: r ≈ 0 (незначущий)

➡️ Інтерпретація: Вісь “матеріалізм-постматеріалізм” функціонує як відносно автономний ціннісний вимір, не зумовлюючи безпосередньо ні егоїстичну, ні альтруїстичну спрямованість. Пріоритет якості життя та самореалізації не вписується в просте протиставлення індивідуалізму та колективізму.


10. Збереження даних

# Збереження оновленого датасету з факторними балами
write_sav(dataset_U, "dataset_U.sav")
cat("✅ Датасет з факторними балами збережено: dataset_U.sav\n")
## ✅ Датасет з факторними балами збережено: dataset_U.sav

Загальні висновки

Основні результати дослідження

1. Часткове відтворення циркумплексу Шварца

  • ✅ Топологічний рівень (MDS): 4 квадранти та протиставлення полюсів
  • ❌ Круговий порядок порушений через злиття суміжних конструктів

2. Емпірична двофакторна структура

Замість 4 теоретичних полюсів виявлено 2 узагальнені виміри:

Соціальний фокус (Social focus) - Колективне благо через нормативний порядок - Цінності: Збереження + Самотрансценденція - α Кронбаха = 0.76 ✅

Особистісний фокус (Personal focus)
- Індивідуальні інтереси через автономію та успіх - Цінності: Відкритість + Самоствердження - α Кронбаха = 0.77 ✅

Слабка кореляція між латентними факторами: r = 0.08 (p = 0.046) → В Україні особисті амбіції та соціальні зобов’язання функціонують як майже незалежні мотиваційні домени

3. Номологічна валідність підтверджена

Теоретично узгоджені кореляції з індексами Інглгарта-Вельцеля: - Особистісний фокус ↔︎ емансипативні цінності (+) - Соціальний фокус ↔︎ секулярно-раціональні цінності (-) - Відтворює базову вісь культурної модернізації

4. Два вектори ціннісних трансформацій (2011)

Вектор 1: Індивідуалістична емансипація - Свобода + автономія → особистісні амбіції

Вектор 2: Секуляризація з ерозією просоціальності
- Раціоналізація → ослаблення альтруїзму - Проблема: руйнування традиційних механізмів солідарності без компенсації світськими альтернативами

5. Практична цінність PVQ-10

Придатний для: моніторингу узагальнених ціннісних пріоритетів в умовах обмежених ресурсів
Не замінює: повні версії (PVQ-21, PVQ-40) для дослідження специфічних мотиваційних типів

6. Методологічний внесок

  • Систематична психометрична валідація PVQ-10 в українському контексті
  • Базова референтна точка (2011) для моніторингу змін після Революції Гідності та війни
  • Емпіричне підтвердження альтернативного організаційного принципу Шварца (фокус інтересів)

Імплікації для соціального прогноузвання

Особливості української ціннісної структури (2011)

Слабкий взаємозв’язок факторів = Можливість подвійного апелювання

Політичні інтервенції можуть одночасно:
- Апелювати до колективних цінностей (патріотизм, солідарність)
- Підтримувати індивідуальні амбіції (підприємництво, самореалізацію)

Без ризику відчуження протилежно налаштованих груп

Виклик: Секуляризація без просоціальності

⚠️ Проблема: Раціоналізація не супроводжується розвитком світських форм солідарності

Необхідність: Розвиток інституційних механізмів соціальної інтеграції, незалежних від традиційних ієрархічних механізмів регуляції

Референтна точка для моніторингу

Дані 2011 року фіксують ціннісний профіль до:
- Революції Гідності (2013-2014)
- Російської агресії (2014-2025)
- Масштабних суспільних трансформацій

Методологічна цінність: Базова лінія для оцінки впливу кризових подій на ціннісну структуру


Обмеження дослідження

1. Обмеження інструменту
- Неможливість моделювання окремих цінностей як латентних змінних
- Низькі значення відсотку поясненої дисперсії

2. Темпоральні обмеження
- Дані 2011 року (до ключових трансформацій)
- Поперечний зріз (без динаміки)

3. Методологічні обмеження
- CFA не досягла конвергенції
- Необхідність валідації на нових даних

4. Генералізація
- Результати специфічні для українського контексту
- Необхідні порівняльні дослідження


Напрями майбутніх досліджень

1. Порівняльні дослідження
- Міжкраїнові відмінності у стабільності двофакторної структури
- Психометрична валідація PVQ-10 в інших пострадянських країнах

2. Поглиблений аналіз парадоксу секуляризації
- Якісні дослідження механізмів ерозії просоціальності
- Пошук світських альтернатив традиційній солідарності

3. Практичне застосування
- Використання PVQ-10 у соціальних опитуваннях в умовах війни
- Інтеграція у системи моніторингу суспільних настроїв
- Дослідження відмінностей Соціального та Особистісного фокусу в соціально-демографічних групах
- Розробка адаптованих версій для специфічних контекстів


Ключові посилання

Schwartz, S. H. (2012). An overview of the Schwartz theory of basic values. Online Readings in Psychology and Culture, 2(1). https://doi.org/10.9707/2307-0919.1116

Inglehart, R., & Welzel, C. (2005). Modernization, cultural change, and democracy: The human development sequence. Cambridge University Press.

Inglehart, R., et al. (2014). World Values Survey: Round Six - Country-Pooled Datafile Version. www.worldvaluessurvey.org


Контакт

Автор: Андрій Бова
Email:

Дата оновлення: 04.12.2025


LS0tDQp0aXRsZTogItCf0YHQuNGF0L7QvNC10YLRgNC40YfQvdC40Lkg0LDQvdCw0LvRltC3IFBWUS0xMCDQsiDQo9C60YDQsNGX0L3RliINCnN1YnRpdGxlOiAi0JzQtdGC0L7QtNC40YfQvdC40Lkg0ZbQvdGB0YLRgNGD0LzQtdC90YLQsNGA0ZbQuSDQtNC70Y8g0LzQvtC90ZbRgtC+0YDQuNC90LPRgyDRhtGW0L3QvdC+0YHRgtC10LkiDQphdXRob3I6ICLQkNC90LTRgNGW0Lkg0JHQvtCy0LAiDQpkYXRlOiAiMTItMTEtMjAyNSINCm91dHB1dDoNCiAgaHRtbF9kb2N1bWVudDoNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2NfZGVwdGg6IDMNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IGNvc21vDQogICAgaGlnaGxpZ2h0OiB0YW5nbw0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgDQogICAgICAgICAgICAgICAgICAgICAgZmlnLndpZHRoID0gMTAsIGZpZy5oZWlnaHQgPSA3KQ0KYGBgDQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQoNCi5rZXktZmluZGluZyB7DQogIGJhY2tncm91bmQtY29sb3I6ICNlM2YyZmQ7DQogIGJvcmRlci1sZWZ0OiA1cHggc29saWQgIzIxOTZGMzsNCiAgcGFkZGluZzogMTVweDsNCiAgbWFyZ2luOiAyMHB4IDA7DQogIGJvcmRlci1yYWRpdXM6IDVweDsNCn0NCg0KLmNvbmNsdXNpb24tYm94IHsNCiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjNlMDsNCiAgYm9yZGVyLWxlZnQ6IDVweCBzb2xpZCAjZmY5ODAwOw0KICBwYWRkaW5nOiAxNXB4Ow0KICBtYXJnaW46IDIwcHggMDsNCiAgYm9yZGVyLXJhZGl1czogNXB4Ow0KfQ0KDQoubWV0aG9kLW5vdGUgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNlNWY1Ow0KICBib3JkZXItbGVmdDogNXB4IHNvbGlkICM5YzI3YjA7DQogIHBhZGRpbmc6IDEwcHg7DQogIG1hcmdpbjogMTVweCAwOw0KICBib3JkZXItcmFkaXVzOiA1cHg7DQogIGZvbnQtc2l6ZTogMC45ZW07DQp9DQoNCg0KLmNvZGUtZm9sZGluZy1idG4sIA0KLmJ0bi1kb3dubG9hZCwNCi5idG4tZ3JvdXAgLmJ0bi5idG4tZGVmYXVsdC5kcm9wZG93bi10b2dnbGUgeyANCiAgYmFja2dyb3VuZC1jb2xvcjogIzFFODhFNSAhaW1wb3J0YW50OyANCiAgY29sb3I6ICNmZmZmZmYgIWltcG9ydGFudDsgICAgICAgICAgICANCiAgYm9yZGVyLWNvbG9yOiAjMTk3NkQyICFpbXBvcnRhbnQ7ICAgICANCn0NCg0KLmNvZGUtZm9sZGluZy1idG46aG92ZXIsIA0KLmJ0bi1kb3dubG9hZDpob3ZlciwNCi5idG4tZ3JvdXAgLmJ0bi5idG4tZGVmYXVsdC5kcm9wZG93bi10b2dnbGU6aG92ZXIsDQouYnRuLWdyb3VwLm9wZW4gLmJ0bi5idG4tZGVmYXVsdC5kcm9wZG93bi10b2dnbGUgew0KICBiYWNrZ3JvdW5kLWNvbG9yOiAjMTU2NUMwICFpbXBvcnRhbnQ7IA0KICBjb2xvcjogI2ZmZmZmZiAhaW1wb3J0YW50Ow0KICBib3JkZXItY29sb3I6ICMxMDU1YTYgIWltcG9ydGFudDsNCn0NCg0KYGBgDQoNCiMg0JLRgdGC0YPQvw0KDQo8ZGl2IGNsYXNzPSJrZXktZmluZGluZyI+DQoqKtCa0L7QvdGC0LXQutGB0YIg0LTQvtGB0LvRltC00LbQtdC90L3RjzoqKg0KDQotINCc0L7QvdGW0YLQvtGA0LjQvdCzINGG0ZbQvdC90L7RgdGC0LXQuSDQsiDRg9C80L7QstCw0YUg0LLRltC50L3QuCDRgtCwINC/0ZbRgdC70Y/QstC+0ZTQvdC90L7Qs9C+INCy0ZbQtNC90L7QstC70LXQvdC90Y8g0L/QvtGC0YDQtdCx0YPRlCAqKtCy0LDQu9GW0LTQuNC30L7QstCw0L3QuNGFLCDQutC+0LzQv9Cw0LrRgtC90LjRhSDRltC90YHRgtGA0YPQvNC10L3RgtGW0LIqKg0KLSBQVlEtMTAg0YMgV1ZTOiDQutC+0LbQvdCwINGG0ZbQvdC90ZbRgdGC0Ywg0LLQuNC80ZbRgNGO0ZTRgtGM0YHRjyAqKtC+0LTQvdC40Lwg0L/Rg9C90LrRgtC+0LwqKiDihpIg0L7QsdC80LXQttC10L3QvdGPINC00LvRjyDQv9C+0LLQvdC+0Zcg0YHRgtGA0YPQutGC0YPRgNC4INCo0LLQsNGA0YbQsA0KLSDQktGW0LTRgdGD0YLQvdGW0YHRgtGMINGB0LjRgdGC0LXQvNCw0YLQuNGH0L3QvtGXINC/0YHQuNGF0L7QvNC10YLRgNC40YfQvdC+0Zcg0LLQtdGA0LjRhNGW0LrQsNGG0ZbRlyDQsiDRg9C60YDQsNGX0L3RgdGM0LrQvtC80YMg0LrQvtC90YLQtdC60YHRgtGWDQoNCioq0JzQtdGC0LA6Kiog0JLRgdGC0LDQvdC+0LLQuNGC0Lgg0LXQvNC/0ZbRgNC40YfQvdGDINGB0YLRgNGD0LrRgtGD0YDRgyDQsdCw0LfQvtCy0LjRhSDRhtGW0L3QvdC+0YHRgtC10Lkg0LIg0KPQutGA0LDRl9C90ZYg0YLQsCDQtNC+0YHQu9GW0LTQuNGC0Lgg0LfQsifRj9C30LrQuCDQtyDRltC90LTQtdC60YHQsNC80Lgg0LrRg9C70YzRgtGD0YDQvdC+0Zcg0LzQvtC00LXRgNC90ZbQt9Cw0YbRltGXINCG0L3Qs9C70LPQsNGA0YLQsOKAk9CS0LXQu9GM0YbQtdC70Y8NCg0KKirQlNCw0L3RljoqKiDQoNC10LfRg9C70YzRgtCw0YLQuCDQktGB0LXRgdCy0ZbRgtC90YzQvtCz0L4g0LTQvtGB0LvRltC00LbQtdC90L3RjyDRhtGW0L3QvdC+0YHRgtC10Lkg0LfQsCAyMDIxINGA0ZbQui4g0JLQuNCx0ZbRgNC60LAg0LIg0KPQutGA0LDRl9C90ZYg0LzRltGB0YLQuNC70LAgMTUwMCDRgNC10YHQv9C+0L3QtNC10L3RgtGW0LIuDQo8L2Rpdj4NCg0KIyDQl9C80ZbQvdC90ZYNCg0KYGBge3J9DQojINCh0YLQstC+0YDQtdC90L3RjyDQv9C10YDRiNC+0LPQviDQtNCw0YLQsNGE0YDQtdC50LzRgw0KcHZxMTBfZGYgPC0gZGF0YS5mcmFtZSgNCiAg0KbRltC90L3RltGB0YLRjCA9IGMoDQogICAgItCh0LDQvNC+0YHQv9GA0Y/QvNGD0LLQsNC90L3RjyAoU2VsZi1EaXJlY3Rpb24sIHNkaSkiLA0KICAgICLQktC70LDQtNCwIChQb3dlciwgcG93KSIsDQogICAgItCR0LXQt9C/0LXQutCwIChTZWN1cml0eSwgc2VjKSIsDQogICAgItCT0LXQtNC+0L3RltC30LwgKEhlZG9uaXNtLCBoZWQpIiwNCiAgICAi0JTQvtCx0YDQvtC30LjRh9C70LjQstGW0YHRgtGMIChCZW5ldm9sZW5jZSwgYmVuKSAiLA0KICAgICLQlNC+0YHRj9Cz0L3QtdC90L3RjyAoQWNoaWV2ZW1lbnQsIGFjaCkiLA0KICAgICLQodGC0LjQvNGD0LvRj9GG0ZbRjyAoU3RpbXVsYXRpb24sIHN0aSkiLA0KICAgICLQmtC+0L3RhNC+0YDQvNC90ZbRgdGC0YwgKENvbmZvcm1pdHksIGNvbikiLA0KICAgICLQo9C90ZbQstC10YDRgdCw0LvRltC30LwgKFVuaXZlcnNhbGlzbSwgdW5pKSIsDQogICAgItCi0YDQsNC00LjRhtGW0Y8gKFRyYWRpdGlvbiwgdHJhKSINCiAgKSwNCiAg0KTQvtGA0LzRg9C70Y7QstCw0L3QvdGPID0gYygNCiAgICAi0JTQu9GPINGG0ZbRlNGXINC70Y7QtNC40L3QuCDQstCw0LbQu9C40LLQviDQv9GA0L7Qv9C+0L3Rg9Cy0LDRgtC4INC90L7QstGWINGW0LTQtdGXLCDQsdGD0YLQuCDRgtCy0L7RgNGH0L7RjiDQvtGB0L7QsdC40YHRgtGW0YHRgtGOLCDQudGC0Lgg0YHQstC+0ZfQvCDRiNC70Y/RhdC+0LwuIiwNCiAgICAi0JTQu9GPINGG0ZbRlNGXINC70Y7QtNC40L3QuCDQstCw0LbQu9C40LLQviDQsdGD0YLQuCDQsdCw0LPQsNGC0LjQvCwg0LzQsNGC0Lgg0LHQsNCz0LDRgtC+INCz0YDQvtGI0LXQuSDRliDQutC+0YjRgtC+0LLQvdC40YUg0YDQtdGH0LXQuS4iLA0KICAgICLQltC40YLQuCDQsiDQsdC10LfQv9C10YbRliDQtNGD0LbQtSDQstCw0LbQu9C40LLQviDQtNC70Y8g0YbRltGU0Zcg0LvRjtC00LjQvdC4LCDQstGW0L0g0YPQvdC40LrQsNGUINGD0YHRjNC+0LPQviwg0YnQviDQvNC+0LbQtSDQv9C10YDQtdC00LHQsNGH0LDRgtC4INC90LXQsdC10LfQv9C10LrRgy4iLA0KICAgICLQlNC70Y8g0YbRltGU0Zcg0LvRjtC00LjQvdC4INCy0LDQttC70LjQstC+INC00L7QsdGA0LUg0L/RgNC+0LLQvtC00LjRgtC4INGH0LDRgSwg0LHQsNC70YPQstCw0YLQuCDRgdC10LHQtS4iLA0KICAgICLQlNC70Y8g0YbRltGU0Zcg0LvRjtC00LjQvdC4INCy0LDQttC70LjQstC+INGA0L7QsdC40YLQuCDRidC+0YHRjCDRhdC+0YDQvtGI0LUg0LTQu9GPINGB0YPRgdC/0ZbQu9GM0YHRgtCy0LAuIiwNCiAgICAi0JTQu9GPINGG0ZbRlNGXINC70Y7QtNC40L3QuCDQstCw0LbQu9C40LLQviDQsdGD0YLQuCDQtNGD0LbQtSDRg9GB0L/RltGI0L3QuNC8LCDRidC+0LEg0L7RgtC+0YfQtdC90L3RjyDQt9C90LDQu9C+INC/0YDQviDQudC+0LPQviDQtNC+0YHRj9Cz0L3QtdC90L3Rjy4iLA0KICAgICLQn9GA0LjQs9C+0LTQuCDRliDRgNC40LfQuNC6INC00YPQttC1INCy0LDQttC70LjQstGWINC00LvRjyDRhtGW0ZTRlyDQu9GO0LTQuNC90LgsINCy0ZbQvSDQv9GA0LDQs9C90LUg0LTQviDQttC40YLRgtGPLCDQv9C+0LLQvdC+0LPQviDQt9Cw0YXQvtC/0LvRjtGO0YfQuNGFINC/0L7QtNGW0LkuIiwNCiAgICAi0JTQu9GPINGG0ZbRlNGXINC70Y7QtNC40L3QuCDQstCw0LbQu9C40LLQviDQt9Cw0LLQttC00Lgg0L/QvtCy0L7QtNC40YLQuNGB0Y8g0L/RgNCw0LLQuNC70YzQvdC+LCDQvdC1INC30LTRltC50YHQvdGO0LLQsNGC0Lgg0LLRh9C40L3QutGW0LIsINGP0LrRliDQu9GO0LTQuCDQvdC1INGB0YXQstCw0LvQuNC70Lgg0LEuIiwNCiAgICAi0JTQu9GPINGG0ZbRlNGXINC70Y7QtNC40L3QuCDQstCw0LbQu9C40LLQsCDRgtGD0YDQsdC+0YLQsCDQv9GA0L4g0LTQvtCy0LrRltC70LvRjyDRliDQv9GA0LjRgNC+0LTRgyIsDQogICAgItCU0LvRjyDRhtGW0ZTRlyDQu9GO0LTQuNC90Lgg0LLQsNC20LvQuNCy0L4g0L3QsNGB0LvRltC00YPQstCw0YLQuCDRgtGA0LDQtNC40YbRltGXINGWINC30LLQuNGH0LDRlywg0L/RgNC40LnQvdGP0YLRliDQsiDQudC+0LPQviDRgNC+0LTQuNC90ZYg0LDQsdC+INGA0LXQu9GW0LPRltGXLiINCiAgKSwNCiAgIyBSINCw0LLRgtC+0LzQsNGC0LjRh9C90L4g0L/QtdGA0LXQstGW0YDRj9GUINGW0LzQtdC90LAsINCw0LvQtSDQtNC70Y8g0L3QsNC+0YfQvdC+0YHRgtGWINC60YDQsNGJ0LUg0LLRgdGC0LDQvdC+0LLQuNGC0LgNCiAgY2hlY2submFtZXMgPSBGQUxTRSwNCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFDQopDQoNCiMg0JLRltC00L7QsdGA0LDQttC10L3QvdGPINGC0LDQsdC70LjRhtGWINC30LAg0LTQvtC/0L7QvNC+0LPQvtGOIGtuaXRyOjprYWJsZQ0Ka25pdHI6OmthYmxlKA0KICBwdnExMF9kZiwgDQogIGNhcHRpb24gPSAi0J/Rg9C90LrRgtC4INGI0LrQsNC70Lgg0LHQsNC30L7QstC40YUg0LvRjtC00YHRjNC60LjRhSDRhtGW0L3QvdC+0YHRgtC10LkgKFBWUS0xMCkiDQopDQpgYGANCg0K0J/RgNC40LzRltGC0LrQsC4g0JLQuNGJ0ZYg0LfQvdCw0YfQtdC90L3RjyDQsiDRg9GB0ZbRhSDRiNC60LDQu9Cw0YUg0LLRltC00L7QsdGA0LDQttCw0Y7RgtGMINCx0ZbQu9GM0YjRgyDQstC40YDQsNC20LXQvdGW0YHRgtGMINCy0ZbQtNC/0L7QstGW0LTQvdC40YUg0YbRltC90L3QvtGB0YLQtdC5Lg0KDQpgYGB7cn0NCg0KIyDQodGC0LLQvtGA0LXQvdC90Y8g0LTRgNGD0LPQvtCz0L4g0LTQsNGC0LDRhNGA0LXQudC80YMNCml3X3ZhbHVlc19kZiA8LSBkYXRhLmZyYW1lKA0KICDQktC40LzRltGAID0gYygNCiAgICAjIC0tLSDQhtC90LTQtdC60YEg0LXQvNCw0L3RgdC40L/QsNGC0LjQstC90LjRhSDRhtGW0L3QvdC+0YHRgtC10Lkg0YLQsCDQudC+0LPQviDRgdGD0LHRltC90LTQtdC60YHQuCAtLS0NCiAgICAi0JXQvNCw0L3RgdC40L/QsNGC0LjQstC90ZYg0YbRltC90L3QvtGB0YLRliAoUkVTRU1BVkFMKSIsDQogICAgIiAg0KHQsNC80L7RgdGC0ZbQudC90ZbRgdGC0YwsINC90LXQt9Cw0LvQtdC20L3RltGB0YLRjCAoQVVUT05PTVkpIiwgIyDQodGD0LHRltC90LTQtdC60YENCiAgICAiICDQhtC90LTQuNCy0ZbQtNGD0LDQu9GM0L3QsCDRgdCy0L7QsdC+0LTQsCDQstC40LHQvtGA0YMgKENIT0lDRSkiLCAgICMg0KHRg9Cx0ZbQvdC00LXQutGBDQogICAgIiAg0KDRltCy0L3RltGB0YLRjCAvINCT0LXQvdC00LXRgNC90LAg0YDRltCy0L3RltGB0YLRjCAoRVFVQUxJVFkpIiwgICMg0KHRg9Cx0ZbQvdC00LXQutGBDQogICAgIiAg0KPRh9Cw0YHRgtGMIC8g0J/RgNCw0LLQviDQs9C+0LvQvtGB0YMgKFZPSUNFKSIsICAgICAgICAgICAjINCh0YPQsdGW0L3QtNC10LrRgQ0KICAgIA0KICAgICMgLS0tINCG0L3QtNC10LrRgSDRgdC10LrRg9C70Y/RgNC90L4t0YDQsNGG0ZbQvtC90LDQu9GM0L3QuNGFINGG0ZbQvdC90L7RgdGC0LXQuSDRgtCwINC50L7Qs9C+INGB0YPQsdGW0L3QtNC10LrRgdC4IC0tLQ0KICAgICLQodC10LrRg9C70Y/RgNC90L4t0YDQsNGG0ZbQvtC90LDQu9GM0L3RliDRhtGW0L3QvdC+0YHRgtGWIChTQUNTRUNWQUwpIiwNCiAgICAiICDQndC10LLRltGA0LAsINC90LjQt9GM0LrQsCDRgNC10LvRltCz0ZbQudC90ZbRgdGC0YwgKERJU0JFTElFRikiLCAgICMg0KHRg9Cx0ZbQvdC00LXQutGBDQogICAgIiAg0JzQvtGA0LDQu9GM0L3QuNC5INGA0LXQu9GP0YLQuNCy0ZbQt9C8IChSRUxBVElWSVNNKSIsICAgICAgICAgIyDQodGD0LHRltC90LTQtdC60YENCiAgICAiICDQndC10L/QvtC60L7RgNCwINCw0LLRgtC+0YDQuNGC0LXRgtCw0LwgKERFRklBTkNFKSIsICAgICAgICAgICAjINCh0YPQsdGW0L3QtNC10LrRgQ0KICAgIA0KICAgICMgLS0tINCG0L3RiNGWINC+0LrRgNC10LzRliDRltC90LTQtdC60YHQuCAtLS0NCiAgICAi0IbQvdC00LXQutGBINC/0L7RgdGC0LzQsNGC0LXRgNGW0LDQu9GW0LfQvNGDIDEyLdC/0YPQvdC60YIuIChZMDAxKSIsDQogICAgItCG0L3QtNC10LrRgSDQv9C+0YHRgtC80LDRgtC10YDRltCw0LvRltC30LzRgyA0LdC/0YPQvdC60YIuIChZMDAyKSIsDQogICAgItCG0L3QtNC10LrRgSDQsNCy0YLQvtC90L7QvNGW0Zcg0IbQvdCz0LvQs9Cw0YDRgtCwIChZMDAzKSINCiAgKSwNCiAg0JfQvNGW0YHRgiA9IGMoDQogICAgIyAtLS0gUkVTRU1BVkFMIC0tLQ0KICAgICLQhtC90YLQtdCz0YDQsNC70YzQvdC40Lkg0L/QvtC60LDQt9C90LjQuiDQvtGA0ZbRlNC90YLQsNGG0ZbRlyDQvdCwINGB0LLQvtCx0L7QtNGDINCy0LjQsdC+0YDRgywg0LPQtdC90LTQtdGA0L3RgyDRgNGW0LLQvdGW0YHRgtGMLCDRg9GH0LDRgdGC0Ywg0ZYg0YLQvtC70LXRgNCw0L3RgtC90ZbRgdGC0YwuIiwNCiAgICAi0J7RgNGW0ZTQvdGC0LDRhtGW0Y8g0L3QsCDRgdCw0LzQvtCy0LjRgNCw0LbQtdC90L3Rjywg0L3QtdC30LDQu9C10LbQvdGW0YHRgtGMLCDQutGA0LXQsNGC0LjQstC90ZbRgdGC0Yw7INC/0YDRltC+0YDQuNGC0LXRgtC4INCy0LjRhdC+0LLQsNC90L3RjyDCq9C90LXQt9Cw0LvQtdC20L3QvtGB0YLRlsK7INGC0LAgwqvRg9GP0LLQuMK7LiIsDQogICAgItCf0YDQuNC50L3Rj9GC0YLRjyDRltC90LTQuNCy0ZbQtNGD0LDQu9GM0L3QvtGXINGB0LLQvtCx0L7QtNC4INCyINC80L7RgNCw0LvRjNC90LjRhSDQv9C40YLQsNC90L3Rj9GFIOKAlCDRgtC+0LvQtdGA0LDQvdGC0L3RltGB0YLRjCDQtNC+INCw0LHQvtGA0YLRltCyLCDQs9C+0LzQvtGB0LXQutGB0YPQsNC70YzQvdC+0YHRgtGWLCDRgNC+0LfQu9GD0YfQtdC90YwuIiwNCiAgICAi0J/RltC00YLRgNC40LzQutCwINCz0LXQvdC00LXRgNC90L7RlyDRgNGW0LLQvdC+0YHRgtGWINCyINC60LvRjtGH0L7QstC40YUg0YHRhNC10YDQsNGFINGB0YPRgdC/0ZbQu9GM0L3QvtCz0L4g0LbQuNGC0YLRjyAo0L/QvtC70ZbRgtC40LrQsCwg0L7RgdCy0ZbRgtCwLCDQtdC60L7QvdC+0LzRltC60LApLiIsDQogICAgItCQ0LrRgtC40LLQvdCwINCz0YDQvtC80LDQtNGP0L3RgdGM0LrQsCDQv9C+0LfQuNGG0ZbRjywg0YnQviDQv9C+0ZTQtNC90YPRlCDQv9C+0LvRltGC0LjRh9C90YMg0YPRh9Cw0YHRgtGMINGC0LAg0LLRltC00YfRg9GC0YLRjyDQvtGB0L7QsdC40YHRgtC+0LPQviDQutC+0L3RgtGA0L7Qu9GOINC90LDQtCDQttC40YLRgtGP0LwuIiwNCiAgICANCiAgICAjIC0tLSBTQUNTRUNWQUwgLS0tDQogICAgItCG0L3RgtC10LPRgNCw0LvRjNC90LjQuSDQv9C+0LrQsNC30L3QuNC6INGB0LXQutGD0LvRj9GA0LjQt9Cw0YbRltGXINC5INGA0LDRhtGW0L7QvdCw0LvRltC30LzRgyDigJQg0LLRltC00YXRltC0INCy0ZbQtCDRgtGA0LDQtNC40YbRltC50L3QvtGXINGA0LXQu9GW0LPRltC50L3QvtGB0YLRliDRgtCwINC/0ZbQtNC/0L7RgNGP0LTQutGD0LLQsNC90L3RjyDQsNCy0YLQvtGA0LjRgtC10YLQsNC8LiIsDQogICAgItCh0LvQsNCx0LrQsCDQstGW0YDQsCDQsiDQvdCw0LTQv9GA0LjRgNC+0LTQvdC1LCDQvdC40LfRjNC60LAg0YDQtdC70ZbQs9GW0LnQvdCwINC30LDQu9GD0YfQtdC90ZbRgdGC0YwuIiwNCiAgICAi0JPQvdGD0YfQutGW0YHRgtGMINC80L7RgNCw0LvRjNC90LjRhSDQvtGG0ZbQvdC+0LosINCy0ZbQtNGF0ZbQtCDQstGW0LQg0LDQsdGB0L7Qu9GO0YLQvdC40YUg0L3QvtGA0Lwg0ZYg0LTQvtCz0LwuIiwNCiAgICAi0JrRgNC40YLQuNGH0L3QtSDRgdGC0LDQstC70LXQvdC90Y8g0LTQviDQstC70LDQtNC4LCDQstGW0LTQutC40LTQsNC90L3RjyDQsNCy0YLQvtGA0LjRgtCw0YDQuNC30LzRgyDQuSDRgtGA0LDQtNC40YbRltC50L3QuNGFINGW0ZTRgNCw0YDRhdGW0LkuIiwNCiAgICANCiAgICAjIC0tLSDQhtC90YjRliDRltC90LTQtdC60YHQuCAtLS0NCiAgICAi0KDQvtC30YjQuNGA0LXQvdCwINC60L7QvNC/0LvQtdC60YHQvdCwINC+0YbRltC90LrQsCDQvNCw0YLQtdGA0ZbQsNC70ZbRgdGC0LjRh9C90LjRhS/Qv9C+0YHRgtC80LDRgtC10YDRltCw0LvRltGB0YLQuNGH0L3QuNGFINGG0ZbQvdC90L7RgdGC0LXQuSAoMTIg0L/Rg9C90LrRgtGW0LIpLiIsDQogICAgItCR0LDQt9C+0LLQsCDQvtGG0ZbQvdC60LAg0LzQsNGC0LXRgNGW0LDQu9GW0YHRgtC40YfQvdC40YUv0L/QvtGB0YLQvNCw0YLQtdGA0ZbQsNC70ZbRgdGC0LjRh9C90LjRhSDRhtGW0L3QvdC+0YHRgtC10LkgKDQg0L/Rg9C90LrRgtC4KS4iLA0KICAgICLQn9C+0LrQsNC30L3QuNC6INGB0LDQvNC+0LLQuNGA0LDQttC10L3QvdGPLCDQt9Cw0YHQvdC+0LLQsNC90LjQuSDQvdCwINC/0YDRltC+0YDQuNGC0LXRgtGWINC90LXQt9Cw0LvQtdC20L3QvtGB0YLRliwg0YHQsNC80L7QutC+0L3RgtGA0L7Qu9GOINGC0LAg0L7RgdC+0LHQuNGB0YLQvtGXINGW0L3RltGG0ZbQsNGC0LjQstC4LiINCiAgKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRSwNCiAgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFDQopDQoNCiMg0JLRltC00L7QsdGA0LDQttC10L3QvdGPINC/0L7Rh9Cw0YLQutC+0LLQvtGXINCy0LXRgNGB0ZbRlyDRgtCw0LHQu9C40YbRlg0Ka25pdHI6OmthYmxlKA0KICBpd192YWx1ZXNfZGYsIA0KICBjYXB0aW9uID0gItCG0L3QtNC10LrRgdC4INC60YPQu9GM0YLRg9GA0L3QuNGFINGG0ZbQvdC90L7RgdGC0LXQuSDQhtC90LPQu9Cz0LDRgNGC0LDigJPQktC10LvRjNGG0LXQu9GPIg0KKQ0KYGBgDQoNCtCf0YDQuNC80ZbRgtC60LAuINCS0LjRidGWINC30L3QsNGH0LXQvdC90Y8g0LIg0YPRgdGW0YUg0YjQutCw0LvQsNGFINCy0ZbQtNC+0LHRgNCw0LbQsNGO0YLRjCDQsdGW0LvRjNGI0YMg0LLQuNGA0LDQttC10L3RltGB0YLRjCDQstGW0LTQv9C+0LLRltC00L3QuNGFINC60YPQu9GM0YLRg9GA0L3QuNGFINGG0ZbQvdC90L7RgdGC0LXQuSDQsNCx0L4g0L7RgNGW0ZTQvdGC0LDRhtGW0LkuDQoNCi0tLQ0KDQojINCX0LDQstCw0L3RgtCw0LbQtdC90L3RjyDQsdGW0LHQu9GW0L7RgtC10LoNCg0KYGBge3IgbGlicmFyaWVzfQ0Kcm0obGlzdD1scygpKSANCg0KIyDQl9Cw0LLQsNC90YLQsNC20LXQvdC90Y8g0L3QtdC+0LHRhdGW0LTQvdC40YUg0L/QsNC60LXRgtGW0LINCmxpYnJhcnkoaGF2ZW4pICAgICAgICAjINCn0LjRgtCw0L3QvdGPINGE0LDQudC70ZbQsiBTUFNTDQpsaWJyYXJ5KGRwbHlyKSAgICAgICAgIyDQnNCw0L3RltC/0YPQu9GP0YbRltGPINC00LDQvdC40LzQuA0KbGlicmFyeSh0aWR5cikgICAgICAgICMg0KLRgNCw0L3RgdGE0L7RgNC80LDRhtGW0Y8g0LTQsNC90LjRhQ0KbGlicmFyeShzdGF0cykgICAgICAgICMg0KHRgtCw0YLQuNGB0YLQuNGH0L3RliDRhNGD0L3QutGG0ZbRlw0KbGlicmFyeShIbWlzYykgICAgICAgICMg0JfQstCw0LbQtdC90LAg0LrQvtGA0LXQu9GP0YbRltGPDQpsaWJyYXJ5KHNqbWlzYykgICAgICAgIyDQntC/0LjRgdC+0LLQsCDRgdGC0LDRgtC40YHRgtC40LrQsA0KbGlicmFyeShrYWJsZUV4dHJhKSAgICMg0KTQvtGA0LzQsNGC0YPQstCw0L3QvdGPINGC0LDQsdC70LjRhtGMDQpsaWJyYXJ5KHNtYWNvZikgICAgICAgIyDQkdCw0LPQsNGC0L7QstC40LzRltGA0L3QtSDRiNC60LDQu9GO0LLQsNC90L3Rjw0KbGlicmFyeShnZ3Bsb3QyKSAgICAgICMg0JLRltC30YPQsNC70ZbQt9Cw0YbRltGPDQpsaWJyYXJ5KGdncmVwZWwpICAgICAgIyDQn9GW0LTQv9C40YHQuCDQvdCwINCz0YDQsNGE0ZbQutCw0YUNCmxpYnJhcnkoY29ycnBsb3QpICAgICAjINCa0L7RgNC10LvRj9GG0ZbQudC90ZYg0LzQsNGC0YDQuNGG0ZYNCmxpYnJhcnkoRUdBbmV0KSAgICAgICAjINCV0LrRgdC/0LvQvtGA0LDRgtC+0YDQvdC40Lkg0LPRgNCw0YTQvtCy0LjQuSDQsNC90LDQu9GW0LcNCmxpYnJhcnkocHN5Y2gpICAgICAgICAjINCf0YHQuNGF0L7QvNC10YLRgNC40YfQvdC40Lkg0LDQvdCw0LvRltC3DQpsaWJyYXJ5KGxhdmFhbikgICAgICAgIyDQnNC+0LTQtdC70Y7QstCw0L3QvdGPINGB0YLRgNGD0LrRgtGD0YDQvdC40LzQuCDRgNGW0LLQvdGP0L3QvdGP0LzQuA0KbGlicmFyeShrbml0cikgICAgICAgICMg0JPQtdC90LXRgNCw0YbRltGPINC30LLRltGC0ZbQsg0KbGlicmFyeShzZW1QbG90KSAgICAgICMg0JLRltC30YPQsNC70ZbQt9Cw0YbRltGPIFNFTSDQvNC+0LTQtdC70LXQuQ0KbGlicmFyeSh3ZWlnaHRzKSAgICAgICMg0JfQstCw0LbQtdC90LAg0LrQvtGA0LXQu9GP0YbRltGPDQpgYGANCg0KPGRpdiBjbGFzcz0ibWV0aG9kLW5vdGUiPg0KKirQkNC90LDQu9GW0Lcg0LTQsNC90LjRhToqKiDQn9GA0ZbQvtGA0LjRgtC10YIg0LXQutGB0L/Qu9C+0YDQsNGC0L7RgNC90LjRhSDQvNC10YLQvtC00ZbQsiDRh9C10YDQtdC3INC+0LHQvNC10LbQtdC90L3RjyDRhNC+0YDQvNCw0YLRgyDQtyDQvtC00L3QuNC8INGW0L3QtNC40LrQsNGC0L7RgNC+0Lwg0L3QsCDRhtGW0L3QvdGW0YHRgtGMDQo8L2Rpdj4NCg0KLS0tDQoNCg0KDQotLS0NCg0KDQojIDEuINCf0ZbQtNCz0L7RgtC+0LLQutCwINC00LDQvdC40YUNCg0KYGBge3IgbG9hZF9kYXRhfQ0KIyDQl9Cw0LLQsNC90YLQsNC20LXQvdC90Y8g0LTQsNC90LjRhSBXb3JsZCBWYWx1ZXMgU3VydmV5IFdhdmUgNg0KZGF0YXNldF9XIDwtIHJlYWRfc2F2KCJXVjZfRGF0YV9zYXZfdjIwMjAxMTE3LnNhdiIpDQoNCiMg0KTRltC70YzRgtGA0LDRhtGW0Y8g0LTQu9GPINCj0LrRgNCw0ZfQvdC4DQpkYXRhc2V0X1UgPC0gZGF0YXNldF9XICU+JQ0KICBmaWx0ZXIoQ19DT1dfQUxQSEEgPT0gIlVLUiIpDQoNCmNhdCgi8J+TiiDQl9Cw0LPQsNC70YzQvdCwINC60ZbQu9GM0LrRltGB0YLRjCDRgdC/0L7RgdGC0LXRgNC10LbQtdC90Ywg0LTQu9GPINCj0LrRgNCw0ZfQvdC4OiIsIG5yb3coZGF0YXNldF9VKSwgIlxuIikNCmBgYA0KDQoNCiMgMS4xLiDQn9C+0L/QtdGA0LXQtNC90Y8g0LTRltCw0LPQvdC+0YHRgtC40LrQsCDQstC40YXRltC00L3QuNGFINC30LzRltC90L3QuNGFDQoNCmBgYHtyfQ0KIyDQl9C80ZbQvdC90ZYg0KjQstCw0YDRhtCwINGDIFdWUw0Kc2Nod2FydHpfb3JpZ2luYWxfdmFycyA8LSBwYXN0ZTAoIlYiLCA3MDo3OSkNCg0KIyDQn9C10YDQtdCy0ZbRgNC60LAg0LTRltCw0L/QsNC30L7QvdGDINGC0LAg0LLRltC00YHRg9GC0L3RltGFINC30L3QsNGH0LXQvdGMDQpjYXQoIlxuPT09INCU0IbQkNCT0J3QntCh0KLQmNCa0JAg0JLQmNCl0IbQlNCd0JjQpSDQl9Cc0IbQndCd0JjQpSDQqNCS0JDQoNCm0JAgPT09XG4iKQ0KDQp2YWxpZGF0aW9uX3JlcG9ydCA8LSBkYXRhLmZyYW1lKA0KICBWYXJpYWJsZSA9IHNjaHdhcnR6X29yaWdpbmFsX3ZhcnMsDQogIE1pbiA9IE5BLA0KICBNYXggPSBOQSwNCiAgTl9WYWxpZCA9IE5BLA0KICBOX01pc3NpbmcgPSBOQSwNCiAgUGVyY2VudF9NaXNzaW5nID0gTkEsDQogIEludmFsaWRfVmFsdWVzID0gTkENCikNCg0KZm9yIChpIGluIHNlcV9hbG9uZyhzY2h3YXJ0el9vcmlnaW5hbF92YXJzKSkgew0KICB2YXIgPC0gc2Nod2FydHpfb3JpZ2luYWxfdmFyc1tpXQ0KICANCiAgIyDQmtC+0L3QstC10YDRgtCw0YbRltGPINCyINGH0LjRgdC70L7QstC40Lkg0YTQvtGA0LzQsNGCDQogIHZhbHVlcyA8LSBhcy5udW1lcmljKGhhdmVuOjp6YXBfbGFiZWxzKGRhdGFzZXRfVVtbdmFyXV0pKQ0KICANCiAgIyDQn9GW0LTRgNCw0YXRg9C90L7QuiDRgdGC0LDRgtC40YHRgtC40LoNCiAgdmFsaWRhdGlvbl9yZXBvcnQkTWluW2ldIDwtIG1pbih2YWx1ZXMsIG5hLnJtID0gVFJVRSkNCiAgdmFsaWRhdGlvbl9yZXBvcnQkTWF4W2ldIDwtIG1heCh2YWx1ZXMsIG5hLnJtID0gVFJVRSkNCiAgdmFsaWRhdGlvbl9yZXBvcnQkTl9WYWxpZFtpXSA8LSBzdW0oIWlzLm5hKHZhbHVlcykpDQogIHZhbGlkYXRpb25fcmVwb3J0JE5fTWlzc2luZ1tpXSA8LSBzdW0oaXMubmEodmFsdWVzKSkNCiAgdmFsaWRhdGlvbl9yZXBvcnQkUGVyY2VudF9NaXNzaW5nW2ldIDwtIHJvdW5kKA0KICAgIHN1bShpcy5uYSh2YWx1ZXMpKSAvIGxlbmd0aCh2YWx1ZXMpICogMTAwLCAyDQogICkNCiAgDQogICMg0J/QtdGA0LXQstGW0YDQutCwINC90LAg0L3QtdC00L7Qv9GD0YHRgtC40LzRliDQt9C90LDRh9C10L3QvdGPICjQv9C+0LfQsCDQtNGW0LDQv9Cw0LfQvtC90L7QvCAxLTYpDQogIGludmFsaWQgPC0gdmFsdWVzWyFpcy5uYSh2YWx1ZXMpICYgKHZhbHVlcyA8IDEgfCB2YWx1ZXMgPiA2KV0NCiAgdmFsaWRhdGlvbl9yZXBvcnQkSW52YWxpZF9WYWx1ZXNbaV0gPC0gbGVuZ3RoKGludmFsaWQpDQp9DQoNCmthYmxlKHZhbGlkYXRpb25fcmVwb3J0LCANCiAgICAgIGNhcHRpb24gPSAi0JTRltCw0LPQvdC+0YHRgtC40LrQsCDQstC40YXRltC00L3QuNGFINC30LzRltC90L3QuNGFINCo0LLQsNGA0YbQsCAoVjcwLVY3OSkiLA0KICAgICAgY29sLm5hbWVzID0gYygi0JfQvNGW0L3QvdCwIiwgIk1pbiIsICJNYXgiLCAi0JLQsNC70ZbQtNC90LjRhSIsICJOQSIsICIlIE5BIiwgItCf0L7Qt9CwINC00ZbQsNC/0LDQt9C+0L3QvtC8IikpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSkNCg0KIyDQktC40LLQtdC00LXQvdC90Y8g0L/QvtC/0LXRgNC10LTQttC10L3QvdGPLCDRj9C60YnQviDRlCDQv9GA0L7QsdC70LXQvNC4DQppZiAoYW55KHZhbGlkYXRpb25fcmVwb3J0JEludmFsaWRfVmFsdWVzID4gMCkpIHsNCiAgY2F0KCJcbuKaoO+4jyDQo9CS0JDQk9CQOiDQktC40Y/QstC70LXQvdC+INC30L3QsNGH0LXQvdC90Y8g0L/QvtC30LAg0LTRltCw0L/QsNC30L7QvdC+0LwgMS02IVxuIikNCiAgcHJvYmxlbWF0aWMgPC0gdmFsaWRhdGlvbl9yZXBvcnRbdmFsaWRhdGlvbl9yZXBvcnQkSW52YWxpZF9WYWx1ZXMgPiAwLCBdDQogIHByaW50KHByb2JsZW1hdGljKQ0KfQ0KYGBgDQoNCiMgMS4yLiDQotCw0LHQu9C40YbRjyDQstGW0LTQv9C+0LLRltC00L3QvtGB0YLRliDQt9C80ZbQvdC90LjRhQ0KYGBge3J9DQojINCd0LDQt9Cy0Lgg0L3QvtCy0LjRhSDQt9C80ZbQvdC90LjRhQ0KbmV3X25hbWVzIDwtIGMoInNkaSIsICJwb3ciLCAic2VjIiwgImhlZCIsICJ1bmkiLCAiYWNoIiwgInN0aSIsICJjb24iLCAiYmVuIiwgInRyYSIpDQoNCiMg0JLQuNGC0Y/Qs9GD0LLQsNC90L3RjyDQsNGC0YDQuNCx0YPRgtGW0LIgKGxhYmVscykg0Lcg0L7RgNC40LPRltC90LDQu9GM0L3QuNGFINC30LzRltC90L3QuNGFDQp2YWx1ZV9sYWJlbHMgPC0gc2FwcGx5KHNjaHdhcnR6X29yaWdpbmFsX3ZhcnMsIGZ1bmN0aW9uKHZhcikgew0KICBsYWJlbCA8LSBhdHRyKGRhdGFzZXRfVVtbdmFyXV0sICJsYWJlbCIpDQogIGlmIChpcy5udWxsKGxhYmVsKSkgew0KICAgIHJldHVybigi0J3QtdC80LDRlCDQsNGC0YDQuNCx0YPRgtCwIikNCiAgfSBlbHNlIHsNCiAgICByZXR1cm4obGFiZWwpDQogIH0NCn0pDQoNCiMg0KHRgtCy0L7RgNC10L3QvdGPINGC0LDQsdC70LjRhtGWINCy0ZbQtNC/0L7QstGW0LTQvdC+0YHRgtGWDQptYXBwaW5nX3RhYmxlIDwtIGRhdGEuZnJhbWUoDQogINCe0YDQuNCz0ZbQvdCw0LvRjNC90LBf0LfQvNGW0L3QvdCwID0gc2Nod2FydHpfb3JpZ2luYWxfdmFycywNCiAg0KTQvtGA0LzRg9C70Y7QstCw0L3QvdGPX9C30LDQv9C40YLQsNC90L3RjyA9IHZhbHVlX2xhYmVscywNCiAg0J3QvtCy0LBf0LfQvNGW0L3QvdCwID0gbmV3X25hbWVzLA0KICDQptGW0L3QvdGW0YHRgtGMID0gYygNCiAgICAiU2VsZi1EaXJlY3Rpb24gKNCh0LDQvNC+0YHQv9GA0Y/QvNGD0LLQsNC90L3RjykiLA0KICAgICJQb3dlciAo0JLQu9Cw0LTQsCkiLA0KICAgICJTZWN1cml0eSAo0JHQtdC30L/QtdC60LApIiwNCiAgICAiSGVkb25pc20gKNCT0LXQtNC+0L3RltC30LwpIiwNCiAgICAiVW5pdmVyc2FsaXNtICjQo9C90ZbQstC10YDRgdCw0LvRltC30LwpIiwNCiAgICAiQWNoaWV2ZW1lbnQgKNCU0L7RgdGP0LPQvdC10L3QvdGPKSIsDQogICAgIlN0aW11bGF0aW9uICjQodGC0LjQvNGD0LvRj9GG0ZbRjykiLA0KICAgICJDb25mb3JtaXR5ICjQmtC+0L3RhNC+0YDQvNC90ZbRgdGC0YwpIiwNCiAgICAiQmVuZXZvbGVuY2UgKNCU0L7QsdGA0L7Qt9C40YfQu9C40LLRltGB0YLRjCkiLA0KICAgICJUcmFkaXRpb24gKNCi0YDQsNC00LjRhtGW0Y8pIg0KICApLA0KICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UNCikNCg0Ka2FibGUobWFwcGluZ190YWJsZSwgDQogICAgICBjYXB0aW9uID0gItCi0LDQsdC70LjRhtGPINCy0ZbQtNC/0L7QstGW0LTQvdC+0YHRgtGWINC30LzRltC90L3QuNGFINCo0LLQsNGA0YbQsCIsDQogICAgICBjb2wubmFtZXMgPSBjKCLQktC40YXRltC00L3QsCDQt9C80ZbQvdC90LAiLCAi0KTQvtGA0LzRg9C70Y7QstCw0L3QvdGPINCyIFdWUyIsICLQndC+0LLQsCDQt9C80ZbQvdC90LAiLCAi0KbRltC90L3RltGB0YLRjCIpKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiksIA0KICAgICAgICAgICAgICAgIGZ1bGxfd2lkdGggPSBUUlVFKSAlPiUNCiAgY29sdW1uX3NwZWMoMiwgd2lkdGggPSAiNDBlbSIpDQoNCmBgYA0KDQojIDEuMy4g0J/QtdGA0LXQutC+0LTRg9Cy0LDQvdC90Y8g0LfQvNGW0L3QvdC40YUg0KjQstCw0YDRhtCwDQpgYGB7cn0NCmNhdCgiXG49PT0g0J/QldCg0JXQmtCe0JTQo9CS0JDQndCd0K8g0JfQnNCG0J3QndCY0KUgPT09XG4iKQ0KDQojINCf0LXRgNC10LLRltGA0LrQsCwg0YfQuCDQstGB0ZYg0LfQvdCw0YfQtdC90L3RjyDQsiDQtNC+0L/Rg9GB0YLQuNC80L7QvNGDINC00ZbQsNC/0LDQt9C+0L3Rlg0KaWYgKGFsbCh2YWxpZGF0aW9uX3JlcG9ydCRJbnZhbGlkX1ZhbHVlcyA9PSAwKSkgew0KICANCiAgIyDQhtC90LLQtdGA0YHRltGPINGI0LrQsNC70Lg6INCy0LjRidGWINCx0LDQu9C4ID0g0YHQuNC70YzQvdGW0YjQsCDQv9GW0LTRgtGA0LjQvNC60LAg0YbRltC90L3QvtGB0YLRlg0KICBkYXRhc2V0X1UgPC0gZGF0YXNldF9VICU+JQ0KICAgIG11dGF0ZSgNCiAgICAgIHNkaSA9IDcgLSBWNzAsICAjINCh0LDQvNC+0YHQv9GA0Y/QvNGD0LLQsNC90L3RjyAoU2VsZi1EaXJlY3Rpb24pDQogICAgICBwb3cgPSA3IC0gVjcxLCAgIyDQktC70LDQtNCwIChQb3dlcikNCiAgICAgIHNlYyA9IDcgLSBWNzIsICAjINCR0LXQt9C/0LXQutCwIChTZWN1cml0eSkNCiAgICAgIGhlZCA9IDcgLSBWNzMsICAjINCT0LXQtNC+0L3RltC30LwgKEhlZG9uaXNtKQ0KICAgICAgdW5pID0gNyAtIFY3NCwgICMg0KPQvdGW0LLQtdGA0YHQsNC70ZbQt9C8IChVbml2ZXJzYWxpc20pDQogICAgICBhY2ggPSA3IC0gVjc1LCAgIyDQlNC+0YHRj9Cz0L3QtdC90L3RjyAoQWNoaWV2ZW1lbnQpDQogICAgICBzdGkgPSA3IC0gVjc2LCAgIyDQodGC0LjQvNGD0LvRj9GG0ZbRjyAoU3RpbXVsYXRpb24pDQogICAgICBjb24gPSA3IC0gVjc3LCAgIyDQmtC+0L3RhNC+0YDQvNC90ZbRgdGC0YwgKENvbmZvcm1pdHkpDQogICAgICBiZW4gPSA3IC0gVjc4LCAgIyDQlNC+0LHRgNC+0LfQuNGH0LvQuNCy0ZbRgdGC0YwgKEJlbmV2b2xlbmNlKQ0KICAgICAgdHJhID0gNyAtIFY3OSAgICMg0KLRgNCw0LTQuNGG0ZbRjyAoVHJhZGl0aW9uKQ0KICAgICkgJT4lDQogICAgcmVuYW1lKA0KICAgICAgY291bnRyeSA9IENfQ09XX0FMUEhBLA0KICAgICAgd3QgPSBWMjU4DQogICAgKQ0KICANCiAgY2F0KCLinIUg0J/QtdGA0LXQutC+0LTRg9Cy0LDQvdC90Y8g0YPRgdC/0ZbRiNC90L4g0LfQsNCy0LXRgNGI0LXQvdC+XG4iKQ0KICANCiAgIyDQodC/0LjRgdC+0Log0L/QtdGA0LXQutC+0LTQvtCy0LDQvdC40YUg0LfQvNGW0L3QvdC40YUNCiAgc2Nod2FydHpfdmFycyA8LSBjKCJzZGkiLCAic3RpIiwgImhlZCIsICJhY2giLCAicG93IiwgDQogICAgICAgICAgICAgICAgICAgICAic2VjIiwgImNvbiIsICJ0cmEiLCAidW5pIiwgImJlbiIpDQogIA0KICAjINCg0L7Qt9GA0LDRhdGD0L3QvtC6INC30LLQsNC20LXQvdC+0Zcg0LrRltC70YzQutC+0YHRgtGWDQogIG53dF9VIDwtIHJvdW5kKHN1bShkYXRhc2V0X1Ukd3QpLCAwKQ0KICBjYXQoIuKalu+4jyAg0JfQstCw0LbQtdC90LAg0LrRltC70YzQutGW0YHRgtGMINGB0L/QvtGB0YLQtdGA0LXQttC10L3RjDoiLCBud3RfVSwgIlxuIikNCiAgDQp9IGVsc2Ugew0KICBjYXQoIuKdjCDQn9Ce0JzQmNCb0JrQkDog0JLQuNGP0LLQu9C10L3QviDQvdC10LTQvtC/0YPRgdGC0LjQvNGWINC30L3QsNGH0LXQvdC90Y8uINCf0LXRgNC10LrQvtC00YPQstCw0L3QvdGPINC90LUg0LLQuNC60L7QvdCw0L3Qvi5cbiIpDQogIGNhdCgiICAg0J3QtdC+0LHRhdGW0LTQvdC+INGB0L/QvtGH0LDRgtC60YMg0L7Rh9C40YHRgtC40YLQuCDQtNCw0L3Rli5cbiIpDQp9DQpgYGANCg0KIyAxLjQuINCQ0L3QsNC70ZbQtyDQstGW0LTRgdGD0YLQvdGW0YUg0LfQvdCw0YfQtdC90YwNCg0KYGBge3IgbWlzc2luZ19hbmFseXNpc30NCiMg0JfQvNGW0L3QvdGWINC00LvRjyDQsNC90LDQu9GW0LfRgyDQvdC+0LzQvtC70L7Qs9GW0YfQvdC+0Zcg0LLQsNC70ZbQtNC90L7RgdGC0ZYNCg0KaW5nbGVoYXJ0X3dlbHplbF92YXJzIDwtIGMoDQogIA0KICAjIC0tLSDQk9GA0YPQv9CwIDE6INCV0LzQsNC90YHQuNC/0LDRgtC40LLQvdGWINGG0ZbQvdC90L7RgdGC0ZYgLS0tDQogICJSRVNFTUFWQUwiLCAjINCT0L7Qu9C+0LLQvdC40Lkg0ZbQvdC00LXQutGBDQogICJBVVRPTk9NWSIsICAjINCh0YPQsdGW0L3QtNC10LrRgSBSRVNFTUFWQUwNCiAgIkNIT0lDRSIsICAgICMg0KHRg9Cx0ZbQvdC00LXQutGBIFJFU0VNQVZBTA0KICAiRVFVQUxJVFkiLCAgIyDQodGD0LHRltC90LTQtdC60YEgUkVTRU1BVkFMDQogICJWT0lDRSIsICAgICAjINCh0YPQsdGW0L3QtNC10LrRgSBSRVNFTUFWQUwNCiAgDQogICMgLS0tINCT0YDRg9C/0LAgMjog0KHQtdC60YPQu9GP0YDQvdC+LdGA0LDRhtGW0L7QvdCw0LvRjNC90ZYg0YbRltC90L3QvtGB0YLRliAtLS0NCiAgIlNBQ1NFQ1ZBTCIsICMg0JPQvtC70L7QstC90LjQuSDRltC90LTQtdC60YENCiAgIkRJU0JFTElFRiIsICMg0KHRg9Cx0ZbQvdC00LXQutGBIFNBQ1NFQ1ZBTA0KICAiUkVMQVRJVklTTSIsIyDQodGD0LHRltC90LTQtdC60YEgU0FDU0VDVkFMDQogICJERUZJQU5DRSIsICAjINCh0YPQsdGW0L3QtNC10LrRgSBTQUNTRUNWQUwNCiAgDQogICMgLS0tINCT0YDRg9C/0LAgMzog0J7QutGA0LXQvNGWINGW0L3QtNC10LrRgdC4IC0tLQ0KICAiWTAwMSIsICAgICAgIyDQhtC90LTQtdC60YEg0L/QvtGB0YLQvNCw0YLQtdGA0ZbQsNC70ZbQt9C80YMgKDEyLdC60L7QvNC/0L7QvdC10L3RgtC90LjQuSkNCiAgIlkwMDIiLCAgICAgICMg0IbQvdC00LXQutGBINC/0L7RgdGC0LzQsNGC0LXRgNGW0LDQu9GW0LfQvNGDICg0LdC60L7QvNC/0L7QvdC10L3RgtC90LjQuSkNCiAgIlkwMDMiICAgICAgICMg0IbQvdC00LXQutGBINCw0LLRgtC+0L3QvtC80ZbRlyDQhtC90LPQu9Cz0LDRgNGC0LANCikNCg0KDQojINCf0LXRgNC10LLRltGA0LrQsCDQvdCw0Y/QstC90L7RgdGC0ZYg0LfQvNGW0L3QvdC40YUNCmV4aXN0aW5nX3ZhcnMgPC0gaW5nbGVoYXJ0X3dlbHplbF92YXJzW2luZ2xlaGFydF93ZWx6ZWxfdmFycyAlaW4lIG5hbWVzKGRhdGFzZXRfVSldDQptaXNzaW5nX3ZhcnMgPC0gaW5nbGVoYXJ0X3dlbHplbF92YXJzWyFpbmdsZWhhcnRfd2VsemVsX3ZhcnMgJWluJSBuYW1lcyhkYXRhc2V0X1UpXQ0KDQppZiAobGVuZ3RoKG1pc3NpbmdfdmFycykgPiAwKSB7DQogIGNhdCgiXG7imqDvuI8gINCj0JLQkNCT0JA6INCX0LzRltC90L3RliDQstGW0LTRgdGD0YLQvdGWINCyINC00LDRgtCw0YHQtdGC0ZY6XG4iKQ0KICBwcmludChtaXNzaW5nX3ZhcnMpDQp9DQoNCiMg0JfQstC10LTQtdC90LAg0YLQsNCx0LvQuNGG0Y8g0LLRltC00YHRg9GC0L3RltGFINC30L3QsNGH0LXQvdGMDQphbGxfYW5hbHlzaXNfdmFycyA8LSBjKHNjaHdhcnR6X3ZhcnMsIGV4aXN0aW5nX3ZhcnMsICJ3dCIpDQoNCm5hX3N1bW1hcnkgPC0gZGF0YS5mcmFtZSgNCiAgVmFyaWFibGUgPSBhbGxfYW5hbHlzaXNfdmFycywNCiAgTl9Ub3RhbCA9IG5yb3coZGF0YXNldF9VKSwNCiAgTl9NaXNzaW5nID0gc2FwcGx5KGRhdGFzZXRfVVthbGxfYW5hbHlzaXNfdmFyc10sIGZ1bmN0aW9uKHgpIHN1bShpcy5uYSh4KSkpLA0KICBOX1ZhbGlkID0gc2FwcGx5KGRhdGFzZXRfVVthbGxfYW5hbHlzaXNfdmFyc10sIGZ1bmN0aW9uKHgpIHN1bSghaXMubmEoeCkpKSwNCiAgUGVyY2VudF9NaXNzaW5nID0gcm91bmQoc2FwcGx5KGRhdGFzZXRfVVthbGxfYW5hbHlzaXNfdmFyc10sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSAvIG5yb3coZGF0YXNldF9VKSAqIDEwMCksIDIpDQopDQoNCmthYmxlKG5hX3N1bW1hcnksIA0KICAgICAgY2FwdGlvbiA9ICLQotCw0LHQu9C40YbRjyDQstGW0LTRgdGD0YLQvdGW0YUg0LfQvdCw0YfQtdC90YwiLA0KICAgICAgY29sLm5hbWVzID0gYygi0JfQvNGW0L3QvdCwIiwgItCS0YHRjNC+0LPQviIsICJOQSIsICLQktCw0LvRltC00L3QuNGFIiwgIiUgTkEiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKQ0KYGBgDQoNCg0KIyAyLiDQoNC10LfRg9C70YzRgtCw0YLQuDog0L7Qv9C40YHQvtCy0LAg0YHRgtCw0YLQuNGB0YLQuNC60LANCg0KYGBge3IgZGVzY3JpcHRpdmVfc3RhdHN9DQpjYXQoIlxuPT09INCe0L/QuNGB0L7QstCwINGB0YLQsNGC0LjRgdGC0LjQutCwINC00LvRjyAxMCDRhtGW0L3QvdGW0YHQvdC40YUg0L/QvtC60LDQt9C90LjQutGW0LIgKFBWUS0xMCkgPT09XG4iKQ0KDQojINCa0L7QvdCy0LXRgNGC0LDRhtGW0Y8g0LIg0YfQuNGB0LvQvtCy0LjQuSDRhNC+0YDQvNCw0YINCmRhdGFzZXRfVVtzY2h3YXJ0el92YXJzXSA8LSBsYXBwbHkoZGF0YXNldF9VW3NjaHdhcnR6X3ZhcnNdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgYXMubnVtZXJpYyhoYXZlbjo6emFwX2xhYmVscyh4KSkpDQoNCmRlc2NyKGRhdGFzZXRfVVtzY2h3YXJ0el92YXJzXSwgd2VpZ2h0cyA9IGRhdGFzZXRfVSR3dCkgJT4lDQogIGtibChkaWdpdHMgPSAyLCBjYXB0aW9uID0gItCe0L/QuNGB0L7QstGWINGB0YLQsNGC0LjRgdGC0LjQutC4IFBWUS0xMCDQtNC70Y8g0KPQutGA0LDRl9C90LgiKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpDQpgYGANCg0KPGRpdiBjbGFzcz0ia2V5LWZpbmRpbmciPg0KKirQmtCb0K7Qp9Ce0JLQmNCZINCS0JjQodCd0J7QktCe0JogMTog0KbRltC90L3RltGB0L3RliDQv9GA0ZbQvtGA0LjRgtC10YLQuCDQo9C60YDQsNGX0L3QuCAoMjAxMSkqKiAgDQoNCtCd0LDQudCx0ZbQu9GM0Ygg0L/RgNGW0L7RgNC40YLQtdGC0L3RliDRhtGW0L3QvdC+0YHRgtGWOiAgIA0KLSAqKtCi0YDQsNC00LjRhtGW0Y8qKiAoTSA9IDQuNTEpIC0g0LfQsdC10YDQtdC20LXQvdC90Y8g0LrRg9C70YzRgtGD0YDQvdC+0Zcg0ZbQtNC10L3RgtC40YfQvdC+0YHRgtGWICAgDQotICoq0JrQvtC90YTQvtGA0LzQvdGW0YHRgtGMKiogKE0gPSA0LjI2KSAtINC/0L7QstCw0LPQsCDQtNC+INGB0L7RhtGW0LDQu9GM0L3QuNGFINC90L7RgNC8ICAgICANCi0gKirQkdC10LfQv9C10LrQsCoqIChNID0gNC4yNCkgLSDQv9GA0LDQs9C90LXQvdC90Y8g0LTQviDRgdGC0LDQsdGW0LvRjNC90L7RgdGC0ZYgICANCg0K0J3QsNC50LzQtdC90Ygg0LLQsNC20LvQuNCy0ZY6ICAgDQotICoq0KHRgtC40LzRg9C70Y/RhtGW0Y8qKiAoTSA9IDIuODApIC0g0L3QuNC30YzQutCwINGB0YXQuNC70YzQvdGW0YHRgtGMINC00L4g0YDQuNC30LjQutGDICAgIA0KLSAqKtCS0LvQsNC00LAqKiAoTSA9IDMuMDMpIC0g0L7QsdC80LXQttC10L3QuNC5INC/0YDRltC+0YDQuNGC0LXRgiDQtNC+0LzRltC90YPQstCw0L3QvdGPICAgIA0KDQrinqHvuI8gKirQhtC90YLQtdGA0L/RgNC10YLQsNGG0ZbRjzoqKiDQodC40LvRjNC90LAg0L7RgNGW0ZTQvdGC0LDRhtGW0Y8g0L3QsCDQv9GW0LTRgtGA0LjQvNCw0L3QvdGPINGB0L7RhtGW0LDQu9GM0L3QvtCz0L4g0L/QvtGA0Y/QtNC60YMg0YLQsCDRgtGA0LDQtNC40YbRltC50L3QuNGFINGG0ZbQvdC90L7RgdGC0LXQuQ0KPC9kaXY+DQoNCmBgYHtyIGRlc2NyaXB0aXZlX2luZ2xlaGFydH0NCiMg0J7Qv9C40YHQvtCy0ZYg0YHRgtCw0YLQuNGB0YLQuNC60Lgg0YbRltC90L3QvtGB0YLQtdC5INCG0L3Qs9C70LPQsNGA0YLQsC3QktC10LvRjNGG0LXQu9GPDQpjb3JyZWxhdGlvbl92YXJzIDwtIGV4aXN0aW5nX3ZhcnMNCg0KdGVtcF9kYXRhIDwtIGFzLmRhdGEuZnJhbWUobGFwcGx5KGRhdGFzZXRfVVtjb3JyZWxhdGlvbl92YXJzXSwgYXMubnVtZXJpYykpDQoNCmRlc2NyKHRlbXBfZGF0YSwgd2VpZ2h0cyA9IGRhdGFzZXRfVSR3dCkgJT4lDQogIGtibChkaWdpdHMgPSAyLCBjYXB0aW9uID0gItCe0L/QuNGB0L7QstGWINGB0YLQsNGC0LjRgdGC0LjQutC4INGW0L3QtNC10LrRgdGW0LIg0IbQvdCz0LvQs9Cw0YDRgtCwLdCS0LXQu9GM0YbQtdC70Y8iKSAlPiUNCiAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIikpDQpgYGANCg0KLS0tDQoNCiMgMy4g0JrQvtGA0LXQu9GP0YbRltC50L3QuNC5INCw0L3QsNC70ZbQtw0KDQpgYGB7ciBjb3JyZWxhdGlvbl9hbmFseXNpc30NCiMg0JfQstCw0LbQtdC90LAg0LrQvtGA0LXQu9GP0YbRltC50L3QsCDQvNCw0YLRgNC40YbRjw0Kd2VpZ2h0ZWRfY29ycl9VIDwtIGNvdi53dChkYXRhc2V0X1Vbc2Nod2FydHpfdmFyc10sIHd0ID0gZGF0YXNldF9VJHd0LCBjb3IgPSBUUlVFKQ0KY29yLm1hdF9VIDwtIHJvdW5kKHdlaWdodGVkX2NvcnJfVSRjb3IsIDMpDQoNCmNvcnJwbG90KGNvci5tYXRfVSwNCiAgICAgICAgIG1ldGhvZCA9ICJjb2xvciIsDQogICAgICAgICB0eXBlID0gInVwcGVyIiwNCiAgICAgICAgIG9yZGVyID0gImhjbHVzdCIsDQogICAgICAgICBoY2x1c3QubWV0aG9kID0gImF2ZXJhZ2UiLA0KICAgICAgICAgYWRkQ29lZi5jb2wgPSAiYmxhY2siLA0KICAgICAgICAgbnVtYmVyLmNleCA9IDAuNywNCiAgICAgICAgIHRsLmNvbCA9ICJibGFjayIsDQogICAgICAgICB0bC5zcnQgPSA0NSwNCiAgICAgICAgIGRpYWcgPSBGQUxTRSwNCiAgICAgICAgIG1hciA9IGMoMCwwLDIsMCksDQogICAgICAgICB0aXRsZSA9ICLQmtC+0YDQtdC70Y/RhtGW0LnQvdCwINC80LDRgtGA0LjRhtGPINGG0ZbQvdC90L7RgdGC0LXQuSDQqNCy0LDRgNGG0LAgKNCj0LrRgNCw0ZfQvdCwLCAyMDExKSIpDQpgYGANCg0KPGRpdiBjbGFzcz0ibWV0aG9kLW5vdGUiPg0KKirQndC+0YLQsNGC0LrQsDoqKiDQmtC70LDRgdGC0LXRgNC90LjQuSDQsNC90LDQu9GW0Lcg0LLQuNGP0LLQu9GP0ZQg0L/RgNC40YDQvtC00L3QtSDQs9GA0YPQv9GD0LLQsNC90L3RjyDRhtGW0L3QvdC+0YHRgtC10Lkg0YMgKirQtNCy0ZYg0LPRgNGD0L/QuCoqLg0KPC9kaXY+DQoNCi0tLQ0KDQojIDQuINCi0L7Qv9C+0LvQvtCz0ZbRh9C90LAg0LLQsNC70ZbQtNC40LfQsNGG0ZbRjzog0LHQsNCz0LDRgtC+0LLQuNC80ZbRgNC90LUg0YjQutCw0LvRjtCy0LDQvdC90Y8gKE1EUykNCg0KYGBge3IgbWRzX2FuYWx5c2lzLCBmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTB9DQojINCa0L7QvdCy0LXRgNGC0LDRhtGW0Y8g0LrQvtGA0LXQu9GP0YbRltC5INCyINCy0ZbQtNGB0YLQsNC90ZYNCmRzdF9VIDwtIHNpbTJkaXNzKGNvci5tYXRfVSwgbWV0aG9kID0gImNvcnIiKQ0KDQojINCd0LXQvNC10YLRgNC40YfQvdC1IE1EUw0KcmVzdWx0c19VIDwtIG1kcyhkZWx0YSA9IGRzdF9VLCBuZGltID0gMiwgdHlwZSA9ICJvcmRpbmFsIikNClN0cmVzc19VIDwtIHJvdW5kKHJlc3VsdHNfVSRzdHJlc3MsIDMpDQoNCiMg0J/RltC00LPQvtGC0L7QstC60LAg0LTQsNC90LjRhQ0KcGxfVSA8LSBhcy5kYXRhLmZyYW1lKHJlc3VsdHNfVSRjb25mKQ0KcGxfVSRWYWx1ZXMgPC0gcm93bmFtZXMocGxfVSkNCg0KcGxfVSA8LSBwbF9VICU+JQ0KICBtdXRhdGUoVmFsdWVHcm91cCA9IGNhc2Vfd2hlbigNCiAgICBWYWx1ZXMgJWluJSBjKCJzdGkiLCAiaGVkIiwgInNkaSIpIH4gItCS0ZbQtNC60YDQuNGC0ZbRgdGC0Ywg0LTQviDQt9C80ZbQvSIsDQogICAgVmFsdWVzICVpbiUgYygicG93IiwgImFjaCIpICAgICAgICB+ICLQodCw0LzQvtGB0YLQstC10YDQtNC20LXQvdC90Y8iLA0KICAgIFZhbHVlcyAlaW4lIGMoInNlYyIsICJjb24iLCAidHJhIikgfiAi0JfQsdC10YDQtdC20LXQvdC90Y8iLA0KICAgIFZhbHVlcyAlaW4lIGMoImJlbiIsICJ1bmkiKSAgICAgICAgfiAi0KHQsNC80L7RgtGA0LDQvdGB0YbQtdC90LTQtdC90YbRltGPIg0KICApKQ0KDQp2YWx1ZV9jb2xvcnMgPC0gYygNCiAgItCS0ZbQtNC60YDQuNGC0ZbRgdGC0Ywg0LTQviDQt9C80ZbQvSIgPSAiIzAwNzJCMiIsIA0KICAi0KHQsNC80L7RgdGC0LLQtdGA0LTQttC10L3QvdGPIiA9ICJncmV5NTAiLCANCiAgItCX0LHQtdGA0LXQttC10L3QvdGPIiA9ICIjMDA5RTczIiwNCiAgItCh0LDQvNC+0YLRgNCw0L3RgdGG0LXQvdC00LXQvdGG0ZbRjyIgPSAiI0NDNzlBNyINCikNCg0KDQojINCG0L3QstC10YDRgdGW0Y8g0L7RgdGWIFkg0LTQu9GPINC/0YDQsNCy0LjQu9GM0L3QvtCz0L4g0LLRltC00L7QsdGA0LDQttC10L3QvdGPDQpwbF9VJEQyX2ZsaXBwZWQgPC0gLTEgKiBwbF9VJEQyDQogDQojINCS0ZbQt9GD0LDQu9GW0LfQsNGG0ZbRjw0KZ2dwbG90KHBsX1UsIGFlcyh4ID0gRDEsIHkgPSBEMl9mbGlwcGVkLCBsYWJlbCA9IFZhbHVlcywgY29sb3IgPSBWYWx1ZUdyb3VwKSkgKw0KICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCBjb2xvciA9ICJncmV5NzAiKSArDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGxpbmV0eXBlID0gImRhc2hlZCIsIGNvbG9yID0gImdyZXk3MCIpICsNCiAgZ2VvbV9wb2ludChzaXplID0gOCwgYWxwaGEgPSAwLjgpICsNCiAgZ2VvbV90ZXh0X3JlcGVsKGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDYsIHBvaW50LnBhZGRpbmcgPSAwLjUsIA0KICAgICAgICAgICAgICAgICAgYm94LnBhZGRpbmcgPSAwLjUsIGZvbnRmYWNlID0gImJvbGQiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSB2YWx1ZV9jb2xvcnMpICsNCiAgeGxpbSgtMS4zLCAxLjMpICsgeWxpbSgtMS4zLCAxLjMpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuOSwgeSA9IDAuOSwgbGFiZWwgPSAi0JLRltC00LrRgNC40YLRltGB0YLRjFxu0LTQviDQt9C80ZbQvSIsIA0KICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiIzAwNzJCMiIsIHNpemUgPSA2KSArDQogIGFubm90YXRlKCJ0ZXh0IiwgeCA9IDAuOSwgeSA9IC0wLjksIGxhYmVsID0gItCX0LHQtdGA0LXQttC10L3QvdGPIiwgDQogICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiLCBjb2xvciA9ICIjMDA5RTczIiwgc2l6ZSA9IDYpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gLTAuOSwgeSA9IC0wLjksIGxhYmVsID0gItCh0LDQvNC+0YHRgtCy0LXRgNC00LbQtdC90L3RjyIsIA0KICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIiwgY29sb3IgPSAiZ3JleTQwIiwgc2l6ZSA9IDYpICsNCiAgYW5ub3RhdGUoInRleHQiLCB4ID0gMC45LCB5ID0gMC45LCBsYWJlbCA9ICLQodCw0LzQvtGC0YDQsNC90YEtXG7RhtC10L3QtNC10L3RhtGW0Y8iLCANCiAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIsIGNvbG9yID0gIiNDQzc5QTciLCBzaXplID0gNikgKw0KICBsYWJzKA0KICAgIHRpdGxlID0gItCm0LjRgNC60YPQvNC/0LvQtdC60YHQvdCwINC80L7QtNC10LvRjCDRhtGW0L3QvdC+0YHRgtC10Lkg0KjQstCw0YDRhtCwINC00LvRjyDQo9C60YDQsNGX0L3QuCIsDQogICAgc3VidGl0bGUgPSBwYXN0ZTAoItCd0LXQvNC10YLRgNC40YfQvdC1INCx0LDQs9Cw0YLQvtCy0LjQvNGW0YDQvdC1INGI0LrQsNC70Y7QstCw0L3QvdGPIChTdHJlc3MgPSAiLCANCiAgICAgICAgICAgICAgICAgICAgIFN0cmVzc19VLCAiIC0g0YXQvtGA0L7RiNCwINCy0ZbQtNC/0L7QstGW0LTQvdGW0YHRgtGMKSIpLA0KICAgIGNvbG9yID0gItCT0YDRg9C/0LAg0YbRltC90L3QvtGB0YLQtdC5OiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKA0KICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLA0KICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiksDQogICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgc2l6ZSA9IDE4LCBmYWNlID0gImJvbGQiKSwNCiAgICBwbG90LnN1YnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41LCBzaXplID0gMTQpLA0KICAgIGF4aXMudGl0bGUgPSBlbGVtZW50X2JsYW5rKCksIA0KICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICBheGlzLnRpY2tzID0gZWxlbWVudF9ibGFuaygpLCANCiAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpDQogICkNCmBgYA0KDQo8ZGl2IGNsYXNzPSJrZXktZmluZGluZyI+DQoqKtCa0JvQrtCn0J7QktCY0Jkg0JLQmNCh0J3QntCS0J7QmiAyOiDQmtCy0LDQt9GW0YbQuNGA0LrRg9C80L/Qu9C10LrRgdC90LAg0YHRgtGA0YPQutGC0YPRgNCwKioNCg0KKirQktGW0LTQv9C+0LLRltC00L3RltGB0YLRjCDQvNC+0LTQtdC70ZY6KiogU3RyZXNzID0gYHIgU3RyZXNzX1VgICg8IDAuMTAgPSDRhdC+0YDQvtGI0LAg0LLRltC00L/QvtCy0ZbQtNC90ZbRgdGC0YwpDQoNCioq0KnQviDQstC40Y/QstC70LXQvdC+OioqDQotIOKchSDQp9C+0YLQuNGA0Lgg0LrQstCw0LTRgNCw0L3RgtC4INC/0YDQuNGB0YPRgtC90ZYNCi0g4pyFINCf0YDQvtGC0LjQu9C10LbQvdGWINC/0L7Qu9GO0YHQuCDQtNC40YTQtdGA0LXQvdGG0ZbQudC+0LLQsNC90ZYNCi0g4p2MINCa0YDRg9Cz0L7QstC40Lkg0L/QvtGA0Y/QtNC+0Log0L/QvtGA0YPRiNC10L3QuNC5INGH0LXRgNC10Lcg0LfQu9C40YLRgtGPINGB0YPQvNGW0LbQvdC40YUg0YbRltC90L3QvtGB0YLQtdC5DQoNCuKeoe+4jyAqKtCS0LjRgdC90L7QstC+0Lo6Kiog0KfQsNGB0YLQutC+0LLQtSDQstGW0LTRgtCy0L7RgNC10L3QvdGPINGG0LjRgNC60YPQvNC/0LvQtdC60YHRgyAtINCy0ZbQt9GD0LDQu9GM0L3QuNC5INC/0L7QtNGW0Lsg0L3QsCAqKtC00LLRliDQs9GA0YPQv9C4Kiog0LfQsNC80ZbRgdGC0Ywg0LrQvtC90YLQuNC90YPRg9C80YMNCjwvZGl2Pg0KDQotLS0NCg0KIyA1LiDQmtC+0L3RhNGW0YDQvNCw0YLQvtGA0L3QuNC5INCw0L3QsNC70ZbQtzog0YHQv9GA0L7QsdCwIENGQQ0KDQpgYGB7ciBjZmFfNGZhY3RvcnMsIG1lc3NhZ2U9VFJVRSwgd2FybmluZz1UUlVFfQ0KIyDQnNC+0LTQtdC70Ywg0LcgNCDRhNCw0LrRgtC+0YDQsNC80Lgg0LLQuNGJ0L7Qs9C+INC/0L7RgNGP0LTQutGDDQptb2RlbF9jZmFfNGYgPC0gJw0KICAjINCk0LDQutGC0L7RgCAxOiDQodCw0LzQvtGC0YDQsNC90YHRhtC10L3QtNC10L3RhtGW0Y8NCiAgU2VsZl9UcmFuc2NlbmRlbmNlID1+IHVuaSArIGJlbg0KDQogICMg0KTQsNC60YLQvtGAIDI6INCh0LDQvNC+0YHRgtCy0LXRgNC00LbQtdC90L3Rjw0KICBTZWxmX0VuaGFuY2VtZW50ID1+IHBvdyArIGFjaA0KDQogICMg0KTQsNC60YLQvtGAIDM6INCS0ZbQtNC60YDQuNGC0ZbRgdGC0Ywg0LTQviDQt9C80ZbQvQ0KICBPcGVubmVzc190b19DaGFuZ2UgPX4gc2RpICsgc3RpICsgaGVkDQoNCiAgIyDQpNCw0LrRgtC+0YAgNDog0JfQsdC10YDQtdC20LXQvdC90Y8NCiAgQ29uc2VydmF0aW9uID1+IGNvbiArIHRyYSArIHNlYw0KDQogICMg0JrQvtGA0LXQu9GP0YbRltGXINC80ZbQtiDQv9GA0L7RgtC40LvQtdC20L3QuNC80Lgg0L/QvtC70Y7RgdCw0LzQuA0KICBTZWxmX1RyYW5zY2VuZGVuY2Ugfn4gU2VsZl9FbmhhbmNlbWVudA0KICBPcGVubmVzc190b19DaGFuZ2Ugfn4gQ29uc2VydmF0aW9uDQoNCg0KJw0KDQpmaXRfY2ZhXzRmIDwtIHNlbSgNCiAgbW9kZWxfY2ZhXzRmLA0KICBkYXRhID0gZGF0YXNldF9VLA0KICBlc3RpbWF0b3IgPSAiTUxSIiwNCiAgc2FtcGxpbmcud2VpZ2h0cyA9ICJ3dCINCikNCg0Kc3VtbWFyeShmaXRfY2ZhXzRmLCBmaXQubWVhc3VyZXMgPSBUUlVFLCBzdGFuZGFyZGl6ZWQgPSBUUlVFLCByc3F1YXJlID0gVFJVRSkNCmBgYA0KDQo8ZGl2IGNsYXNzPSJjb25jbHVzaW9uLWJveCI+DQoqKtCa0KDQmNCi0JjQp9Cd0JjQmSDQoNCV0JfQo9Cb0KzQotCQ0KI6IENGQSDQvdC1INC00L7RgdGP0LPQu9CwINC60L7QvdCy0LXRgNCz0LXQvdGG0ZbRlyoqDQoNCioq0J/RgNC40YfQuNC90LA6Kiog0JLQuNGA0L7QtNC20LXQvdCwINC80LDRgtGA0LjRhtGPINC70LDRgtC10L3RgtC90LjRhSDQutC+0LLQsNGA0ZbQsNGG0ZbQuSDRh9C10YDQtdC3INC90LDQtNC80ZbRgNC90L4g0LLQuNGB0L7QutGWINC60L7RgNC10LvRj9GG0ZbRlyDQvNGW0LYg0YTQsNC60YLQvtGA0LDQvNC4DQoNCioq0JzQtdGC0L7QtNC+0LvQvtCz0ZbRh9C90LAg0ZbQvNC/0LvRltC60LDRhtGW0Y86Kiog0KTQvtGA0LzQsNGCINC3INC+0LTQvdC40Lwg0ZbQvdC00LjQutCw0YLQvtGA0L7QvCDQvdCwINGG0ZbQvdC90ZbRgdGC0Ywg0YPQvdC10LzQvtC20LvQuNCy0LvRjtGUINC90LDQtNGW0LnQvdGDINC00LjRhNC10YDQtdC90YbRltCw0YbRltGOINCy0YHRltGFIDQg0YLQtdC+0YDQtdGC0LjRh9C90LjRhSDQv9C+0LvRjtGB0ZbQsiDQqNCy0LDRgNGG0LANCg0K4p6h77iPICoq0KDRltGI0LXQvdC90Y86Kiog0J/QtdGA0LXRhdGW0LQg0LTQviDQtdC60YHQv9C70L7RgNCw0YLQvtGA0L3QuNGFINC80LXRgtC+0LTRltCyDQo8L2Rpdj4NCg0KLS0tDQoNCiMgNi4g0JXQutGB0L/Qu9C+0YDQsNGC0L7RgNC90LjQuSDQs9GA0LDRhNC+0LLQuNC5INCw0L3QsNC70ZbQtyAoRUdBKQ0KDQpgYGB7ciBlZ2FfYW5hbHlzaXMsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04fQ0KY2F0KCJcbj09PSBFeHBsb3JhdG9yeSBHcmFwaCBBbmFseXNpcyA9PT1cbiIpDQplZ2FfcmVzdWx0IDwtIEVHQShkYXRhID0gY29yLm1hdF9VLCBuID0gbnd0X1UsIHBsb3QuRUdBID0gVFJVRSkNCg0KIyBCb290c3RyYXAg0LTQu9GPINC+0YbRltC90LrQuCDRgdGC0LDQsdGW0LvRjNC90L7RgdGC0ZYNCmNhdCgiXG49PT0gQm9vdHN0cmFwIEVHQSDQtNC70Y8g0L7RhtGW0L3QutC4INGB0YLQsNCx0ZbQu9GM0L3QvtGB0YLRliA9PT1cbiIpDQpib290X2VnYSA8LSBib290RUdBKGRhdGEgPSBjb3IubWF0X1UsIG4gPSBud3RfVSwgc2VlZCA9IDEyMywgaXRlciA9IDUwMCkNCmBgYA0KDQo8ZGl2IGNsYXNzPSJrZXktZmluZGluZyI+DQoqKtCa0JvQrtCn0J7QktCY0Jkg0JLQmNCh0J3QntCS0J7QmiAzOiBFR0Eg0LLQuNGP0LLQuNCyINC00LLRliDRgdC/0ZbQu9GM0L3QvtGC0LgqKg0KDQoqKtCh0YLRgNGD0LrRgtGD0YDQsDoqKiAgDQotICDwn5S1ICAqKtCh0L7RhtGW0LDQu9GM0L3QuNC5INGE0L7QutGD0YE6Kiog0JHQtdC30L/QtdC60LAsINCi0YDQsNC00LjRhtGW0Y8sINCa0L7QvdGE0L7RgNC80L3RltGB0YLRjCwg0JTQvtCx0YDQvtC30LjRh9C70LjQstGW0YHRgtGMLCDQo9C90ZbQstC10YDRgdCw0LvRltC30LwgICANCi0gIPCflLQgKirQntGB0L7QsdC40YHRgtGW0YHQvdC40Lkg0YTQvtC60YPRgToqKiDQktC70LDQtNCwLCDQlNC+0YHRj9Cz0L3QtdC90L3Rjywg0JPQtdC00L7QvdGW0LfQvCwg0KHRgtC40LzRg9C70Y/RhtGW0Y8sINCh0LDQvNC+0YHQv9GA0Y/QvNGD0LLQsNC90L3RjyAgIA0KDQrinqHvuI8gKirQotC10L7RgNC10YLQuNGH0L3QsCDQstGW0LTQv9C+0LLRltC00L3RltGB0YLRjDoqKiDQptC1INCy0ZbQtNC/0L7QstGW0LTQsNGUINCw0LvRjNGC0LXRgNC90LDRgtC40LLQvdC+0LzRgyDQvtGA0LPQsNC90ZbQt9Cw0YbRltC50L3QvtC80YMg0L/RgNC40L3RhtC40L/RgyDQqNCy0LDRgNGG0LAgLSDRgNC+0LfRgNGW0LfQvdC10L3QvdGOINC30LAgKirRhNC+0LrRg9GB0L7QvCDRltC90YLQtdGA0LXRgdGW0LIqKg0KPC9kaXY+DQoNCi0tLQ0KDQojIDcuINCV0LrRgdC/0LvQvtGA0LDRgtC+0YDQvdC40Lkg0YTQsNC60YLQvtGA0L3QuNC5INCw0L3QsNC70ZbQtyAoRUZBKQ0KDQpgYGB7ciBlZmFfMmZhY3RvcnN9DQojINCU0LLQvtGE0LDQutGC0L7RgNC90LAg0LzQvtC00LXQu9GMIEVGQQ0KbW9kZWxfVSA8LSAnDQogIGVmYSgiZWZhIikqU29jaWFsX2ZvY3VzICsNCiAgZWZhKCJlZmEiKSpQZXJzb25hbF9mb2N1cyA9fiB1bmkgKyBiZW4gKyBjb24gKyB0cmEgKyBzZWMgKyBwb3cgKyBhY2ggKyBoZWQgKyBzdGkgKyBzZGkNCicNCg0KZml0X1UgPC0gc2VtKA0KICBtb2RlbF9VLA0KICBkYXRhID0gZGF0YXNldF9VLA0KICBlc3RpbWF0b3IgPSAiTUxSIiwNCiAgc2FtcGxpbmcud2VpZ2h0cyA9ICJ3dCIsIGF1dG8uZWZhPVRSVUUNCikNCg0Kc3VtbWFyeShmaXRfVSwgZml0Lm1lYXN1cmVzID0gVFJVRSwgc3RhbmRhcmRpemVkID0gVFJVRSwgcnNxdWFyZSA9IFRSVUUpDQoNCg0KIyDQoNC+0LfRgNCw0YXRg9C90L7QuiDQv9C+0Y/RgdC90LXQvdC+0Zcg0LTQuNGB0L/QtdGA0YHRltGXDQpzdGRfc29sdXRpb24gPC0gc3RhbmRhcmRpemVkU29sdXRpb24oZml0X1UpDQoNCnNzX2xvYWRpbmdzIDwtIHN0ZF9zb2x1dGlvbiAlPiUNCiAgZmlsdGVyKG9wID09ICI9fiIpICU+JQ0KICBncm91cF9ieShGYWN0b3IgPSBsaHMpICU+JQ0KICBzdW1tYXJpc2UoU1NfTG9hZGluZ3MgPSBzdW0oZXN0LnN0ZF4yKSkNCg0KbnVtX3ZhcmlhYmxlcyA8LSAxMA0KdmFyaWFuY2VfZXhwbGFpbmVkIDwtIHNzX2xvYWRpbmdzICU+JQ0KICBtdXRhdGUoDQogICAgVmFyaWFuY2VfRXhwbGFpbmVkX1BlcmNlbnQgPSAoU1NfTG9hZGluZ3MgLyBudW1fdmFyaWFibGVzKSAqIDEwMA0KICApDQoNCmNhdCgiXG49PT0g0J/QvtGP0YHQvdC10L3QsCDQtNC40YHQv9C10YDRgdGW0Y8gPT09XG4iKQ0Ka2FibGUodmFyaWFuY2VfZXhwbGFpbmVkLCANCiAgICAgIGNhcHRpb24gPSAi0J/QvtGP0YHQvdC10L3QsCDQtNC40YHQv9C10YDRgdGW0Y8g0YTQsNC60YLQvtGA0LDQvNC4IiwNCiAgICAgIGNvbC5uYW1lcyA9IGMoItCk0LDQutGC0L7RgCIsICLQodGD0LzQsCDQutCy0LDQtNGA0LDRgtGW0LIg0L3QsNCy0LDQvdGC0LDQttC10L3RjCIsICIlINC/0L7Rj9GB0L3QtdC90L7RlyDQtNC40YHQv9C10YDRgdGW0ZciKSwNCiAgICAgIGRpZ2l0cyA9IDIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIpKQ0KYGBgDQoNCiMjIDcuMS4g0JLRltC30YPQsNC70ZbQt9Cw0YbRltGPINGE0LDQutGC0L7RgNC90L7RlyDRgdGC0YDRg9C60YLRg9GA0LgNCg0KYGBge3IgZWZhX3Zpc3VhbGl6YXRpb24sIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04fQ0Kc2VtUGF0aHMoDQogIGZpdF9VLA0KICBlZGdlLmNvbG9yID0gImJsYWNrIiwNCiAgd2hhdCA9ICJzdGQiLA0KICBpbnRlcmNlcHRzID0gRkFMU0UsDQogIHRocmVzaG9sZHMgPSBGQUxTRSwNCiAgcmVzaWR1YWxzID0gRkFMU0UsDQogIHN0eWxlID0gImxpc3JlbCIsDQogIHJvdGF0aW9uID0gMSwNCiAgbkNoYXJOb2RlcyA9IDAsDQogIGxheW91dCA9ICJjaXJjbGUiLA0KICBzaXplTWFuID0gOSwNCiAgc2l6ZU1hbjIgPSA2LA0KICBzaXplTGF0ID0gMTQsDQogIHNpemVMYXQyID0gMTYsDQogIGxhYmVsLmNleCA9IDEuNCwNCiAgc2hhcGVMYXQgPSAiZWxsaXBzZSIsDQogIGV4b0NvdiA9IFRSVUUsDQogIGN1cnZlID0gMywNCiAgY3VydmVQaXZvdFNoYXBlID0gMC45LA0KICBlc2l6ZSA9IDEuMiwNCiAgbWFyID0gYygzLCA4LCAzLCAzKSwNCiAgZWRnZS5sYWJlbC5jZXggPSAxLjINCikNCmBgYA0KDQojIyA3LjIuINCG0L3QtNC10LrRgdC4INCy0ZbQtNC/0L7QstGW0LTQvdC+0YHRgtGWINC80L7QtNC10LvRlg0KDQpgYGB7ciBtb2RlbF9maXRfaW5kaWNlc30NCm1lYXN1cmVzX1UgPC0gZml0TWVhc3VyZXMoDQogIGZpdF9VLA0KICBjKCJybXNlYS5yb2J1c3QiLCAicm1zZWEuY2kubG93ZXIucm9idXN0IiwgInJtc2VhLmNpLnVwcGVyLnJvYnVzdCIsDQogICAgInRsaS5yb2J1c3QiLCAiY2ZpLnJvYnVzdCIsICJzcm1yIikNCikNCg0KY29tcF90YWJfVSA8LSBkYXRhLmZyYW1lKA0KICBg0J/QvtC60LDQt9C90LjQumAgPSBjKA0KICAgICJSb2J1c3QgUk1TRUEiLA0KICAgICI5MCUg0JTQhiBSb2J1c3QgUk1TRUEiLA0KICAgICJSb2J1c3QgVExJIiwNCiAgICAiUm9idXN0IENGSSIsDQogICAgIlNSTVIiDQogICksDQogIGDQl9C90LDRh9C10L3QvdGPYCA9IGMoDQogICAgcm91bmQobWVhc3VyZXNfVVsicm1zZWEucm9idXN0Il0sIDMpLA0KICAgIHBhc3RlMCgiWyIsIHJvdW5kKG1lYXN1cmVzX1VbInJtc2VhLmNpLmxvd2VyLnJvYnVzdCJdLCAzKSwgIiwgIiwgDQogICAgICAgICAgIHJvdW5kKG1lYXN1cmVzX1VbInJtc2VhLmNpLnVwcGVyLnJvYnVzdCJdLCAzKSwgIl0iKSwNCiAgICByb3VuZChtZWFzdXJlc19VWyJ0bGkucm9idXN0Il0sIDMpLA0KICAgIHJvdW5kKG1lYXN1cmVzX1VbImNmaS5yb2J1c3QiXSwgMyksDQogICAgcm91bmQobWVhc3VyZXNfVVsic3JtciJdLCAzKQ0KICApLA0KICBg0JrRgNC40YLQtdGA0ZbQuWAgPSBjKA0KICAgICLiiaQgMC4wOCIsDQogICAgIi0iLA0KICAgICLiiaUgMC45MCIsDQogICAgIuKJpSAwLjkwIiwNCiAgICAi4omkIDAuMDgiDQogICksDQogIGDQntGG0ZbQvdC60LBgID0gYygNCiAgICBpZmVsc2UobWVhc3VyZXNfVVsicm1zZWEucm9idXN0Il0gPD0gMC4wOCwgIuKchSDQn9GA0LjQudC90Y/RgtC90L4iLCAi4p2MINCd0LXQv9GA0LjQudC90Y/RgtC90L4iKSwNCiAgICAiLSIsDQogICAgaWZlbHNlKG1lYXN1cmVzX1VbInRsaS5yb2J1c3QiXSA+PSAwLjkwLCAi4pyFINCf0YDQuNC50L3Rj9GC0L3QviIsICLinYwg0J3QtdC/0YDQuNC50L3Rj9GC0L3QviIpLA0KICAgIGlmZWxzZShtZWFzdXJlc19VWyJjZmkucm9idXN0Il0gPj0gMC45MCwgIuKchSDQn9GA0LjQudC90Y/RgtC90L4iLCAi4p2MINCd0LXQv9GA0LjQudC90Y/RgtC90L4iKSwNCiAgICBpZmVsc2UobWVhc3VyZXNfVVsic3JtciJdIDw9IDAuMDgsICLinIUg0J/RgNC40LnQvdGP0YLQvdC+IiwgIuKdjCDQndC10L/RgNC40LnQvdGP0YLQvdC+IikNCiAgKSwNCiAgY2hlY2submFtZXMgPSBGQUxTRQ0KKQ0KDQprYmwoY29tcF90YWJfVSwgY2FwdGlvbiA9ICLQhtC90LTQtdC60YHQuCDQstGW0LTQv9C+0LLRltC00L3QvtGB0YLRliDQtNCy0L7RhNCw0LrRgtC+0YDQvdC+0Zcg0LzQvtC00LXQu9GWIEVGQSIpICU+JQ0KICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiKSwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCjxkaXYgY2xhc3M9ImtleS1maW5kaW5nIj4NCioq0JrQm9Cu0KfQntCS0JjQmSDQktCY0KHQndCe0JLQntCaIDQ6INCf0YDQuNC50L3Rj9GC0L3QsCDQstGW0LTQv9C+0LLRltC00L3RltGB0YLRjCDQtNCy0L7RhNCw0LrRgtC+0YDQvdC+0Zcg0LzQvtC00LXQu9GWKioNCg0KKirQhtC90LTQtdC60YHQuCDQstGW0LTQv9C+0LLRltC00L3QvtGB0YLRljoqKg0KLSBSb2J1c3QgUk1TRUEgPSBgciByb3VuZChtZWFzdXJlc19VWyJybXNlYS5yb2J1c3QiXSwgMylgICjiiaQgMC4wOCkg4pyFDQotIFJvYnVzdCBDRkkgPSBgciByb3VuZChtZWFzdXJlc19VWyJjZmkucm9idXN0Il0sIDMpYCAo4omlIDAuOTApIOKchQ0KLSBSb2J1c3QgVExJID0gYHIgcm91bmQobWVhc3VyZXNfVVsidGxpLnJvYnVzdCJdLCAzKWAgKOKJpSAwLjkwKSDinIUNCi0gU1JNUiA9IGByIHJvdW5kKG1lYXN1cmVzX1VbInNybXIiXSwgMylgICjiiaQgMC4wOCkg4pyFDQoNCioq0KTQsNC60YLQvtGA0L3QsCDRgdGC0YDRg9C60YLRg9GA0LA6Kiog0JLRgdGWINGG0ZbQvdC90L7RgdGC0ZYg0L3QsNCy0LDQvdGC0LDQttGD0Y7RgtGM0YHRjyDQvdCwINCy0ZbQtNC/0L7QstGW0LTQvdGWINGE0LDQutGC0L7RgNC4ICoq0LHQtdC3INGB0YPRgtGC0ZTQstC40YUg0L/QtdGA0LXRhdGA0LXRgdC90LjRhSDQvdCw0LLQsNC90YLQsNC20LXQvdGMKioNCg0K4p6h77iPICoq0JLQuNGB0L3QvtCy0L7QujoqKiDQlNCy0L7RhNCw0LrRgtC+0YDQvdCwINC80L7QtNC10LvRjCDQsNC00LXQutCy0LDRgtC90L4g0L7Qv9C40YHRg9GUINC10LzQv9GW0YDQuNGH0L3RliDQtNCw0L3Rlg0KPC9kaXY+DQoNCiMjIDcuMy4g0JfQsdC10YDQtdC20LXQvdC90Y8g0YTQsNC60YLQvtGA0L3QuNGFINCx0LDQu9GW0LINCg0KYGBge3Igc2F2ZV9mYWN0b3Jfc2NvcmVzfQ0KZmFjdG9yX3Njb3JlcyA8LSBsYXZQcmVkaWN0KGZpdF9VKQ0KDQpkYXRhc2V0X1UkU29jaWFsX2ZvY3VzIDwtIGZhY3Rvcl9zY29yZXNbLCAxXQ0KZGF0YXNldF9VJFBlcnNvbmFsX2ZvY3VzIDwtIGZhY3Rvcl9zY29yZXNbLCAyXQ0KDQpjYXQoIuKchSDQpNCw0LrRgtC+0YDQvdGWINCx0LDQu9C4INC30LHQtdGA0LXQttC10L3QviDQtNC70Y8g0L/QvtC00LDQu9GM0YjQvtCz0L4g0LrQvtGA0LXQu9GP0YbRltC50L3QvtCz0L4g0LDQvdCw0LvRltC30YNcbiIpDQpgYGANCg0KPGRpdiBjbGFzcz0ibWV0aG9kLW5vdGUiPg0KKirQoNGW0YjQtdC90L3RjzoqKiDQktC40LrQvtGA0LjRgdGC0LDQvdC90Y8g0YTQsNC60YLQvtGA0L3QuNGFINCx0LDQu9GW0LIgKNCwINC90LUg0LrQvtC80L/QvtC30LjRgtC90LjRhSDRltC90LTQtdC60YHRltCyKSDQtNC70Y8g0L/QtdGA0LXQstGW0YDQutC4INC90L7QvNC+0LvQvtCz0ZbRh9C90L7RlyDQstCw0LvRltC00L3QvtGB0YLRliDQvtCx0YPQvNC+0LLQu9C10L3QviDQvdC10L7QsdGF0ZbQtNC90ZbRgdGC0Y4g0YLQtdGB0YLRg9Cy0LDQvdC90Y8g0LvQsNGC0LXQvdGC0L3QuNGFINC60L7QvdGB0YLRgNGD0LrRgtGW0LIg0Lcg0YPRgNCw0YXRg9Cy0LDQvdC90Y/QvCDRl9GF0L3RjNC+0Zcg0YTQsNC60YLQvtGA0L3QvtGXINGB0YLRgNGD0LrRgtGD0YDQuA0KPC9kaXY+DQoNCi0tLQ0KDQojIDguINCd0LDQtNGW0LnQvdGW0YHRgtGMINGI0LrQsNC7OiDQkNC70YzRhNCwINCa0YDQvtC90LHQsNGF0LANCg0KIyMgOC4xLiDQodC+0YbRltCw0LvRjNC90LjQuSDRhNC+0LrRg9GBDQoNCmBgYHtyIGFscGhhX3NvY2lhbH0NClNvY2lhbEZvY3VzX3ZhcnNfVSA8LSBkYXRhc2V0X1VbLCBjKCJzZWMiLCAiY29uIiwgInRyYSIsICJiZW4iLCAidW5pIildDQpTb2NpYWxGb2N1c19jb3JfVSA8LSBjb3Yud3QoU29jaWFsRm9jdXNfdmFyc19VLCB3dCA9IGRhdGFzZXRfVSR3dCwgY29yID0gVFJVRSkNClNvY2lhbEZvY3VzX21hdF9VIDwtIHJvdW5kKFNvY2lhbEZvY3VzX2Nvcl9VJGNvciwgMykNCg0KU29jaWFsRm9jdXNfcmVzdWx0X1UgPC0gcHN5Y2g6OmFscGhhKFNvY2lhbEZvY3VzX21hdF9VLCBuLm9icyA9IG53dF9VKQ0KU29jaWFsRm9jdXNfYWxwaGFfVSA8LSByb3VuZChTb2NpYWxGb2N1c19yZXN1bHRfVSR0b3RhbCRyYXdfYWxwaGEsIDIpDQoNClNvY2lhbEZvY3VzX2NpX1UgPC0gcHN5Y2g6OmFscGhhLmNpKFNvY2lhbEZvY3VzX2FscGhhX1UsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi5vYnMgPSBud3RfVSwgbi52YXIgPSA1KQ0KU29jaWFsRm9jdXNfYXZnX3JfVSA8LSByb3VuZChTb2NpYWxGb2N1c19yZXN1bHRfVSR0b3RhbCRhdmVyYWdlX3IsIDIpDQoNCmNhdCgi8J+TiiDQkNC70YzRhNCwINCa0YDQvtC90LHQsNGF0LAgKNCh0L7RhtGW0LDQu9GM0L3QuNC5INGE0L7QutGD0YEpOiIsIFNvY2lhbEZvY3VzX2FscGhhX1UsICJcbiIpDQpjYXQoIiAgIDk1JSDQlNCGOiIsIHJvdW5kKFNvY2lhbEZvY3VzX2NpX1UkbG93ZXIuY2ksIDIpLCAiLSIsIA0KICAgIHJvdW5kKFNvY2lhbEZvY3VzX2NpX1UkdXBwZXIuY2ksIDIpLCAiXG4iKQ0KY2F0KCIgICDQodC10YDQtdC00L3RjyDQvNGW0LbQv9GD0L3QutGC0L7QstCwINC60L7RgNC10LvRj9GG0ZbRjzoiLCBTb2NpYWxGb2N1c19hdmdfcl9VLCAiXG4iKQ0KYGBgDQoNCiMjIDguMi4g0J7RgdC+0LHQuNGB0YLRltGB0L3QuNC5INGE0L7QutGD0YENCg0KYGBge3IgYWxwaGFfcGVyc29uYWx9DQpQZXJzb25hbEZvY3VzX3ZhcnNfVSA8LSBkYXRhc2V0X1VbLCBjKCJzZGkiLCAic3RpIiwgImhlZCIsICJhY2giLCAicG93IildDQpQZXJzb25hbEZvY3VzX2Nvcl9VIDwtIGNvdi53dChQZXJzb25hbEZvY3VzX3ZhcnNfVSwgd3QgPSBkYXRhc2V0X1Ukd3QsIGNvciA9IFRSVUUpDQpQZXJzb25hbEZvY3VzX21hdF9VIDwtIHJvdW5kKFBlcnNvbmFsRm9jdXNfY29yX1UkY29yLCAzKQ0KDQpQZXJzb25hbEZvY3VzX3Jlc3VsdF9VIDwtIHBzeWNoOjphbHBoYShQZXJzb25hbEZvY3VzX21hdF9VLCBuLm9icyA9IG53dF9VKQ0KUGVyc29uYWxGb2N1c19hbHBoYV9VIDwtIHJvdW5kKFBlcnNvbmFsRm9jdXNfcmVzdWx0X1UkdG90YWwkcmF3X2FscGhhLCAyKQ0KDQpQZXJzb25hbEZvY3VzX2NpX1UgPC0gcHN5Y2g6OmFscGhhLmNpKFBlcnNvbmFsRm9jdXNfYWxwaGFfVSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG4ub2JzID0gbnd0X1UsIG4udmFyID0gNSkNClBlcnNvbmFsRm9jdXNfYXZnX3JfVSA8LSByb3VuZChQZXJzb25hbEZvY3VzX3Jlc3VsdF9VJHRvdGFsJGF2ZXJhZ2VfciwgMikNCg0KY2F0KCLwn5OKINCQ0LvRjNGE0LAg0JrRgNC+0L3QsdCw0YXQsCAo0J7RgdC+0LHQuNGB0YLRltGB0L3QuNC5INGE0L7QutGD0YEpOiIsIFBlcnNvbmFsRm9jdXNfYWxwaGFfVSwgIlxuIikNCmNhdCgiICAgOTUlINCU0IY6Iiwgcm91bmQoUGVyc29uYWxGb2N1c19jaV9VJGxvd2VyLmNpLCAyKSwgIi0iLCANCiAgICByb3VuZChQZXJzb25hbEZvY3VzX2NpX1UkdXBwZXIuY2ksIDIpLCAiXG4iKQ0KY2F0KCIgICDQodC10YDQtdC00L3RjyDQvNGW0LbQv9GD0L3QutGC0L7QstCwINC60L7RgNC10LvRj9GG0ZbRjzoiLCBQZXJzb25hbEZvY3VzX2F2Z19yX1UsICJcbiIpDQpgYGANCg0KPGRpdiBjbGFzcz0ia2V5LWZpbmRpbmciPg0KKirQmtCb0K7Qp9Ce0JLQmNCZINCS0JjQodCd0J7QktCe0JogNTog0KXQvtGA0L7RiNCwINCy0L3Rg9GC0YDRltGI0L3RjyDRg9C30LPQvtC00LbQtdC90ZbRgdGC0YwqKiAgIA0KDQoqKtCd0LDQtNGW0LnQvdGW0YHRgtGMINGI0LrQsNC7OioqICAgICANCi0g0KHQvtGG0ZbQsNC70YzQvdC40Lkg0YTQvtC60YPRgTogzrEgPSBgciBTb2NpYWxGb2N1c19hbHBoYV9VYCAoPiAwLjcwKSDinIUNCi0g0J7RgdC+0LHQuNGB0YLRltGB0L3QuNC5INGE0L7QutGD0YE6IM6xID0gYHIgUGVyc29uYWxGb2N1c19hbHBoYV9VYCAoPiAwLjcwKSDinIUNCg0KKipQcm9wb3J0aW9uIG9mIFZhcmlhbmNlIEV4cGxhaW5lZDoqKiAgIA0KLSDQodC+0YbRltCw0LvRjNC90LjQuSDRhNC+0LrRg9GBOiAyMiUg0L/QvtGP0YHQvdC10L3QvtGXINC00LjRgdC/0LXRgNGB0ZbRlyAgICAgIA0KLSDQntGB0L7QsdC40YHRgtGW0YHQvdC40Lkg0YTQvtC60YPRgTogIDIwJSDQv9C+0Y/RgdC90LXQvdC+0Zcg0LTQuNGB0L/QtdGA0YHRltGXICAgICANCg0K4p6h77iPICoq0IbQvdGC0LXRgNC/0YDQtdGC0LDRhtGW0Y86Kiog0J3QuNC30YzQutGWINC30L3QsNGH0LXQvdC90Y8g0YfQsNGB0YLQutC4INC/0L7Rj9GB0L3QtdC90L7RlyDQt9Cw0LPQsNC70YzQvdC+0Zcg0LTQuNGB0L/QtdGA0YHRltGXINGE0LDQutGC0L7RgNC+0LwgKNGB0YPQvNCw0YDQvdC+INC80LXQvdGI0LUgNTAlKSDQutC+0LzQv9C10L3RgdGD0ZQg0L/RgNC40LnQvdGP0YLQvdCwINC90LDQtNGW0LnQvdGW0YHRgtGMICjOsSDiiaUgMC43MCksINGJ0L4g0LfQsNCx0LXQt9C/0LXRh9GD0ZQg0LLQsNC70ZbQtNC90ZbRgdGC0Ywg0LrQvtC90YHRgtGA0YPQutGC0ZbQsiAoRm9ybmVsbCAmIExhcmNrZXIsIDE5ODEpDQo8L2Rpdj4NCg0KLS0tDQoNCiMgOS4g0J3QvtC80L7Qu9C+0LPRltGH0L3QsCDQstCw0LvRltC00L3RltGB0YLRjDog0LrQvtGA0LXQu9GP0YbRltGXINC3INGW0L3QtNC10LrRgdCw0LzQuCDQhtC90LPQu9Cz0LDRgNGC0LAt0JLQtdC70YzRhtC10LvRjw0KDQpgYGB7ciBjb3JyZWxhdGlvbl9hbmFseXNpc19kZXRhaWxlZH0NCiMg0KHQv9C40YHQutC4INC30LzRltC90L3QuNGFDQpzY2h3YXJ0el9mb2NpX3ZhcnMgPC0gYygiUGVyc29uYWxfZm9jdXMiLCAiU29jaWFsX2ZvY3VzIikNCg0KIyDQnNCw0YLRgNC40YbRliDQtNC70Y8g0LfQsdC10YDQtdC20LXQvdC90Y8g0YDQtdC30YPQu9GM0YLQsNGC0ZbQsg0KY29ycmVsYXRpb25fbWF0cml4IDwtIG1hdHJpeCgNCiAgTkEsIA0KICBucm93ID0gbGVuZ3RoKGluZ2xlaGFydF93ZWx6ZWxfdmFycyksIA0KICBuY29sID0gbGVuZ3RoKHNjaHdhcnR6X2ZvY2lfdmFycyksDQogIGRpbW5hbWVzID0gbGlzdChpbmdsZWhhcnRfd2VsemVsX3ZhcnMsIHNjaHdhcnR6X2ZvY2lfdmFycykNCikNCg0KcF92YWx1ZV9tYXRyaXggPC0gbWF0cml4KA0KICBOQSwgDQogIG5yb3cgPSBsZW5ndGgoaW5nbGVoYXJ0X3dlbHplbF92YXJzKSwgDQogIG5jb2wgPSBsZW5ndGgoc2Nod2FydHpfZm9jaV92YXJzKSwNCiAgZGltbmFtZXMgPSBsaXN0KGluZ2xlaGFydF93ZWx6ZWxfdmFycywgc2Nod2FydHpfZm9jaV92YXJzKQ0KKQ0KDQojINCg0L7Qt9GA0LDRhdGD0L3QvtC6INC30LLQsNC20LXQvdC40YUg0LrQvtGA0LXQu9GP0YbRltC5DQpmb3IgKHZhcjEgaW4gaW5nbGVoYXJ0X3dlbHplbF92YXJzKSB7DQogIGZvciAodmFyMiBpbiBzY2h3YXJ0el9mb2NpX3ZhcnMpIHsNCiAgICB0ZXN0X3Jlc3VsdCA8LSB3dGQuY29yKA0KICAgICAgeCA9IGRhdGFzZXRfVVtbdmFyMV1dLCANCiAgICAgIHkgPSBkYXRhc2V0X1VbW3ZhcjJdXSwgDQogICAgICB3ZWlnaHQgPSBkYXRhc2V0X1Ukd3QNCiAgICApDQogICAgDQogICAgY29ycmVsYXRpb25fbWF0cml4W3ZhcjEsIHZhcjJdIDwtIHRlc3RfcmVzdWx0WzEsICJjb3JyZWxhdGlvbiJdDQogICAgcF92YWx1ZV9tYXRyaXhbdmFyMSwgdmFyMl0gPC0gdGVzdF9yZXN1bHRbMSwgInAudmFsdWUiXQ0KICB9DQp9DQoNCiMg0KTQvtGA0LzQsNGC0YPQstCw0L3QvdGPINGC0LDQsdC70LjRhtGWINC60L7RgNC10LvRj9GG0ZbQuQ0KY29yX3RhYmxlIDwtIGFzLmRhdGEuZnJhbWUocm91bmQoY29ycmVsYXRpb25fbWF0cml4LCAzKSkNCmNvcl90YWJsZSRWYXJpYWJsZSA8LSByb3duYW1lcyhjb3JfdGFibGUpDQoNCiMg0JTQvtC00LDQstCw0L3QvdGPINC30L3QsNGH0YPRidC+0YHRgtGWDQpjb3JfdGFibGVfZm9ybWF0dGVkIDwtIGNvcl90YWJsZSAlPiUNCiAgbXV0YXRlKA0KICAgIFBlcnNvbmFsX2ZvY3VzX3NpZyA9IGlmZWxzZSgNCiAgICAgIHBfdmFsdWVfbWF0cml4W1ZhcmlhYmxlLCAiUGVyc29uYWxfZm9jdXMiXSA8IDAuMDAxLCAiKioqIiwNCiAgICAgIGlmZWxzZShwX3ZhbHVlX21hdHJpeFtWYXJpYWJsZSwgIlBlcnNvbmFsX2ZvY3VzIl0gPCAwLjAxLCAiKioiLA0KICAgICAgICAgICAgIGlmZWxzZShwX3ZhbHVlX21hdHJpeFtWYXJpYWJsZSwgIlBlcnNvbmFsX2ZvY3VzIl0gPCAwLjA1LCAiKiIsICIiKSkNCiAgICApLA0KICAgIFNvY2lhbF9mb2N1c19zaWcgPSBpZmVsc2UoDQogICAgICBwX3ZhbHVlX21hdHJpeFtWYXJpYWJsZSwgIlNvY2lhbF9mb2N1cyJdIDwgMC4wMDEsICIqKioiLA0KICAgICAgaWZlbHNlKHBfdmFsdWVfbWF0cml4W1ZhcmlhYmxlLCAiU29jaWFsX2ZvY3VzIl0gPCAwLjAxLCAiKioiLA0KICAgICAgICAgICAgIGlmZWxzZShwX3ZhbHVlX21hdHJpeFtWYXJpYWJsZSwgIlNvY2lhbF9mb2N1cyJdIDwgMC4wNSwgIioiLCAiIikpDQogICAgKSwNCiAgICBQZXJzb25hbF9mb2N1cyA9IHBhc3RlMChQZXJzb25hbF9mb2N1cywgUGVyc29uYWxfZm9jdXNfc2lnKSwNCiAgICBTb2NpYWxfZm9jdXMgPSBwYXN0ZTAoU29jaWFsX2ZvY3VzLCBTb2NpYWxfZm9jdXNfc2lnKQ0KICApICU+JQ0KICBzZWxlY3QoVmFyaWFibGUsIFBlcnNvbmFsX2ZvY3VzLCBTb2NpYWxfZm9jdXMpDQoNCmtibChjb3JfdGFibGVfZm9ybWF0dGVkLCANCiAgICBjYXB0aW9uID0gItCX0LLQsNC20LXQvdGWINC60L7RgNC10LvRj9GG0ZbRlyDQn9GW0YDRgdC+0L3QsCDRhNCw0LrRgtC+0YDQvdC40YUg0LHQsNC70ZbQsiDQtyDRltC90LTQtdC60YHQsNC80Lgg0LrRg9C70YzRgtGD0YDQvdC40YUg0YbRltC90L3QvtGB0YLQtdC5IiwNCiAgICBjb2wubmFtZXMgPSBjKCLQhtC90LTQtdC60YEg0IbQvdCz0LvQs9Cw0YDRgtCwLdCS0LXQu9GM0YbQtdC70Y8iLCAi0J7RgdC+0LHQuNGB0YLRltGB0L3QuNC5INGE0L7QutGD0YEiLCAi0KHQvtGG0ZbQsNC70YzQvdC40Lkg0YTQvtC60YPRgSIpLA0KICAgIGFsaWduID0gYygibCIsICJjIiwgImMiKSkgJT4lDQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIpKSAlPiUNCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICLQn9GA0LjQvNGW0YLQutC4OiAqIHAgPCAuMDUsICoqIHAgPCAuMDEsICoqKiBwIDwgLjAwMSIpDQpgYGANCg0KIyMgOS4xLiDQktGW0LfRg9Cw0LvRltC30LDRhtGW0Y8g0LrQu9GO0YfQvtCy0LjRhSDQutC+0YDQtdC70Y/RhtGW0LkNCg0KYGBge3IgY29ycmVsYXRpb25fdmlzdWFsaXphdGlvbiwgZmlnLndpZHRoPTEyLCBmaWcuaGVpZ2h0PTh9DQojINCS0ZbQtNCx0ZbRgCDQt9C90LDRh9GD0YnQuNGFINC60L7RgNC10LvRj9GG0ZbQuSAofHJ8IOKJpSAwLjEwINGWIHAgPCAwLjA1KQ0Kc2lnbmlmaWNhbnRfY29ycyA8LSBkYXRhLmZyYW1lKA0KICBWYXJpYWJsZSA9IHJlcChyb3duYW1lcyhjb3JyZWxhdGlvbl9tYXRyaXgpLCAyKSwNCiAgRm9jdXMgPSByZXAoYygi0J7RgdC+0LHQuNGB0YLRltGB0L3QuNC5INGE0L7QutGD0YEiLCAi0KHQvtGG0ZbQsNC70YzQvdC40Lkg0YTQvtC60YPRgSIpLCANCiAgICAgICAgICAgICAgZWFjaCA9IG5yb3coY29ycmVsYXRpb25fbWF0cml4KSksDQogIENvcnJlbGF0aW9uID0gYyhjb3JyZWxhdGlvbl9tYXRyaXhbLCAiUGVyc29uYWxfZm9jdXMiXSwgDQogICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbl9tYXRyaXhbLCAiU29jaWFsX2ZvY3VzIl0pLA0KICBQX3ZhbHVlID0gYyhwX3ZhbHVlX21hdHJpeFssICJQZXJzb25hbF9mb2N1cyJdLCANCiAgICAgICAgICAgICAgcF92YWx1ZV9tYXRyaXhbLCAiU29jaWFsX2ZvY3VzIl0pDQopICU+JQ0KICBmaWx0ZXIoYWJzKENvcnJlbGF0aW9uKSA+PSAwLjEwICYgUF92YWx1ZSA8IDAuMDUpDQoNCiMg0KHRgtCy0L7RgNC10L3QvdGPINCz0YDQsNGE0ZbQutCwDQpnZ3Bsb3Qoc2lnbmlmaWNhbnRfY29ycywgYWVzKHggPSByZW9yZGVyKFZhcmlhYmxlLCBDb3JyZWxhdGlvbiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gQ29ycmVsYXRpb24sIGZpbGwgPSBGb2N1cykpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImRvZGdlIiwgYWxwaGEgPSAwLjgpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgbGluZXR5cGUgPSAic29saWQiLCBjb2xvciA9ICJibGFjayIpICsNCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYygtMC4xLCAwLjEpLCBsaW5ldHlwZSA9ICJkYXNoZWQiLCANCiAgICAgICAgICAgICBjb2xvciA9ICJncmV5NTAiLCBhbHBoYSA9IDAuNSkgKw0KICBjb29yZF9mbGlwKCkgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCLQntGB0L7QsdC40YHRgtGW0YHQvdC40Lkg0YTQvtC60YPRgSIgPSAiI0U1NzM3MyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICLQodC+0YbRltCw0LvRjNC90LjQuSDRhNC+0LrRg9GBIiA9ICIjNjRCNUY2IikpICsNCiAgbGFicygNCiAgICB0aXRsZSA9ICLQmtC+0YDQtdC70Y/RhtGW0Zcg0YTQsNC60YLQvtGA0ZbQsiBQVlEtMTAg0Lcg0ZbQvdC00LXQutGB0LDQvNC4INC60YPQu9GM0YLRg9GA0L3QvtGXINC80L7QtNC10YDQvdGW0LfQsNGG0ZbRlyIsDQogICAgc3VidGl0bGUgPSAi0KLRltC70YzQutC4INC30L3QsNGH0YPRidGWINC60L7RgNC10LvRj9GG0ZbRlyAofHJ8IOKJpSAwLjEwLCBwIDwgLjA1KSIsDQogICAgeCA9IE5VTEwsDQogICAgeSA9ICLQmtC+0LXRhNGW0YbRltGU0L3RgiDQutC+0YDQtdC70Y/RhtGW0Zcg0J/RltGA0YHQvtC90LAiLA0KICAgIGZpbGwgPSAi0KTQsNC60YLQvtGAIFBWUS0xMDoiDQogICkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZSgNCiAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIiwNCiAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNiwgZmFjZSA9ICJib2xkIiksDQogICAgcGxvdC5zdWJ0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIpLA0KICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSksDQogICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDExKQ0KICApDQpgYGANCg0KPGRpdiBjbGFzcz0ia2V5LWZpbmRpbmciPg0KKirQmtCb0K7Qp9Ce0JLQmNCZINCS0JjQodCd0J7QktCe0JogNjog0JXQvNCw0L3RgdC40L/QsNGC0LjQstC90ZYg0YbRltC90L3QvtGB0YLRliDihpIg0IbQvdC00LjQstGW0LTRg9Cw0LvRltC30LwqKiAgICANCg0KKirQn9C+0LfQuNGC0LjQstC90ZYg0LfQsifRj9C30LrQuCDQtyDQntGB0L7QsdC40YHRgtGW0YHQvdC40Lwg0YTQvtC60YPRgdC+0Lw6KiogIA0KLSBSRVNFTUFWQUwgKNC10LzQsNC90YHQuNC/0LDRgtC40LLQvdGWINGG0ZbQvdC90L7RgdGC0ZYpOiByID0gMC4xNioqKiAgDQotIEFVVE9OT01ZICjQsNCy0YLQvtC90L7QvNGW0Y8pOiByID0gMC4xOSoqKiAgDQotIFkwMDMgKNGB0LDQvNC+0LLQuNGA0LDQttC10L3QvdGPKTogciA9IDAuMjAqKiogIA0KLSBSRUxBVElWSVNNICjRgNC10LvRj9GC0LjQstGW0LfQvCk6IHIgPSAwLjE3MSoqKiAgIA0KLSBDSE9JQ0UgKNGB0LLQvtCx0L7QtNCwINCy0LjQsdC+0YDRgyk6IHIgPSAwLjEyKioqICANCg0KKirQndC10LPQsNGC0LjQstC90LjQuSDQt9CyJ9GP0LfQvtC6IENIT0lDRSDRltC3INCh0L7RhtGW0LDQu9GM0L3QuNC8INGE0L7QutGD0YHQvtC8OioqIHIgPSAtMC4xMyoqKiAgICAgDQoNCuKeoe+4jyAqKtCG0L3RgtC10YDQv9GA0LXRgtCw0YbRltGPOioqINCf0YDQsNCz0L3QtdC90L3RjyDQtNC+INGB0LLQvtCx0L7QtNC4INGC0LAg0YHQsNC80L7QstC40YDQsNC20LXQvdC90Y8g0YLRltGB0L3QviDQv9C+0LIn0Y/Qt9Cw0L3QtSDQtyDQvtGA0ZbRlNC90YLQsNGG0ZbRlNGOINC90LAg0ZbQvdC00LjQstGW0LTRg9Cw0LvRjNC90ZYg0YbRltC70ZYuINCG0L3QtNC40LLRltC00YPQsNC70YzQvdCwINGB0LLQvtCx0L7QtNCwINCy0LjQsdC+0YDRgyDRgdGC0LLQvtGA0Y7RlCAqKtC90LDQv9GA0YPQttC10L3RltGB0YLRjCoqINC80ZbQtiDQvtGB0L7QsdC40YHRgtC40LzQuCDQsNC80LHRltGG0ZbRj9C80Lgg0YLQsCDQutC+0LvQtdC60YLQuNCy0L3QuNC80Lgg0LfQvtCx0L7QsifRj9C30LDQvdC90Y/QvNC4LiAgIA0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9ImtleS1maW5kaW5nIj4NCioq0JrQm9Cu0KfQntCS0JjQmSDQktCY0KHQndCe0JLQntCaIDc6INCh0LXQutGD0LvRj9GA0LjQt9Cw0YbRltGPIOKGkiDQn9C+0YHQu9Cw0LHQu9C10L3QvdGPINGB0L7RhtGW0LDQu9GM0L3QvtGXINC+0YDRltGU0L3RgtCw0YbRltGXKiogICANCg0KKirQndC10LPQsNGC0LjQstC90ZYg0LfQsifRj9C30LrQuCDQtyDQodC+0YbRltCw0LvRjNC90LjQvCDRhNC+0LrRg9GB0L7QvDoqKiAgICANCi0gU0FDU0VDVkFMICjRgdC10LrRg9C70Y/RgNC90L4t0YDQsNGG0ZbQvtC90LDQu9GM0L3Rlik6IHIgPSAtMC4zMioqKiAo0L3QsNC50YHQuNC70YzQvdGW0YjQsCDQutC+0YDQtdC70Y/RhtGW0Y8hKSAgICAgDQotIFJFTEFUSVZJU00gKNC80L7RgNCw0LvRjNC90LjQuSDRgNC10LvRj9GC0LjQstGW0LfQvCk6IHIgPSAtMC4yNCoqKiAgICAgDQotIERFRklBTkNFICjQvdC10L/QvtC60L7RgNCwINCw0LLRgtC+0YDQuNGC0LXRgtCw0LwpOiByID0gLTAuMjIqKiogICAgIA0KLSBESVNCRUxJRUYgKNC90LXQstGW0YDQsCk6IHIgPSAtMC4xOSoqKiAgICAgIA0KDQoNCuKeoe+4jyDQktGW0LTRhdGW0LQg0LLRltC0INGC0YDQsNC00LjRhtGW0LnQvdC+0Zcg0YDQtdC70ZbQs9GW0LnQvdC+0YHRgtGWINGC0LAg0LDQstGC0L7RgNC40YLQtdGC0ZbQsiDRgdGD0L/RgNC+0LLQvtC00LbRg9GU0YLRjNGB0Y8gKirQvtGB0LvQsNCx0LvQtdC90L3Rj9C8Kiog0L/RgNC+0YHQvtGG0ZbQsNC70YzQvdC40YUg0YPRgdGC0LDQvdC+0LLQvtC6Lg0KPC9kaXY+DQoNCjxkaXYgY2xhc3M9ImtleS1maW5kaW5nIj4NCioq0JrQm9Cu0KfQntCS0JjQmSDQktCY0KHQndCe0JLQntCaIDg6INCf0L7RgdGC0LzQsNGC0LXRgNGW0LDQu9GW0LfQvCDRj9C6INCw0LLRgtC+0L3QvtC80L3QuNC5INCy0LjQvNGW0YAqKiAgICAgDQoNCioq0KHQu9Cw0LHQutGWINC30LIn0Y/Qt9C60Lg6KiogICAgICANCi0gWTAwMiDQtyDQntGB0L7QsdC40YHRgtGW0YHQvdC40Lwg0YTQvtC60YPRgdC+0Lw6IHIgPSAwLjA4KiogKNGB0LvQsNCx0LrQuNC5KSAgICAgDQotIFkwMDIg0ZbQtyDQodC+0YbRltCw0LvRjNC90LjQvCDRhNC+0LrRg9GB0L7QvDogciDiiYggMCAo0L3QtdC30L3QsNGH0YPRidC40LkpICAgICANCg0K4p6h77iPICoq0IbQvdGC0LXRgNC/0YDQtdGC0LDRhtGW0Y86Kiog0JLRltGB0YwgItC80LDRgtC10YDRltCw0LvRltC30Lwt0L/QvtGB0YLQvNCw0YLQtdGA0ZbQsNC70ZbQt9C8IiDRhNGD0L3QutGG0ZbQvtC90YPRlCDRj9C6ICoq0LLRltC00L3QvtGB0L3QviDQsNCy0YLQvtC90L7QvNC90LjQuSoqINGG0ZbQvdC90ZbRgdC90LjQuSDQstC40LzRltGALCDQvdC1INC30YPQvNC+0LLQu9GO0Y7Rh9C4INCx0LXQt9C/0L7RgdC10YDQtdC00L3RjNC+INC90ZYg0LXQs9C+0ZfRgdGC0LjRh9C90YMsINC90ZYg0LDQu9GM0YLRgNGD0ZfRgdGC0LjRh9C90YMg0YHQv9GA0Y/QvNC+0LLQsNC90ZbRgdGC0YwuINCf0YDRltC+0YDQuNGC0LXRgiDRj9C60L7RgdGC0ZYg0LbQuNGC0YLRjyDRgtCwINGB0LDQvNC+0YDQtdCw0LvRltC30LDRhtGW0ZcgKirQvdC1INCy0L/QuNGB0YPRlNGC0YzRgdGPKiog0LIg0L/RgNC+0YHRgtC1INC/0YDQvtGC0LjRgdGC0LDQstC70LXQvdC90Y8g0ZbQvdC00LjQstGW0LTRg9Cw0LvRltC30LzRgyDRgtCwINC60L7Qu9C10LrRgtC40LLRltC30LzRgy4gICAgDQo8L2Rpdj4NCg0KLS0tDQoNCiMgMTAuINCX0LHQtdGA0LXQttC10L3QvdGPINC00LDQvdC40YUNCg0KYGBge3Igc2F2ZV9kYXRhfQ0KIyDQl9Cx0LXRgNC10LbQtdC90L3RjyDQvtC90L7QstC70LXQvdC+0LPQviDQtNCw0YLQsNGB0LXRgtGDINC3INGE0LDQutGC0L7RgNC90LjQvNC4INCx0LDQu9Cw0LzQuA0Kd3JpdGVfc2F2KGRhdGFzZXRfVSwgImRhdGFzZXRfVS5zYXYiKQ0KY2F0KCLinIUg0JTQsNGC0LDRgdC10YIg0Lcg0YTQsNC60YLQvtGA0L3QuNC80Lgg0LHQsNC70LDQvNC4INC30LHQtdGA0LXQttC10L3QvjogZGF0YXNldF9VLnNhdlxuIikNCmBgYA0KDQotLS0NCg0KIyDQl9Cw0LPQsNC70YzQvdGWINCy0LjRgdC90L7QstC60LgNCg0KPGRpdiBjbGFzcz0iY29uY2x1c2lvbi1ib3giPg0KIyMg0J7RgdC90L7QstC90ZYg0YDQtdC30YPQu9GM0YLQsNGC0Lgg0LTQvtGB0LvRltC00LbQtdC90L3Rjw0KDQojIyMgMS4gKirQp9Cw0YHRgtC60L7QstC1INCy0ZbQtNGC0LLQvtGA0LXQvdC90Y8g0YbQuNGA0LrRg9C80L/Qu9C10LrRgdGDINCo0LLQsNGA0YbQsCoqDQotIOKchSDQotC+0L/QvtC70L7Qs9GW0YfQvdC40Lkg0YDRltCy0LXQvdGMIChNRFMpOiA0INC60LLQsNC00YDQsNC90YLQuCDRgtCwINC/0YDQvtGC0LjRgdGC0LDQstC70LXQvdC90Y8g0L/QvtC70Y7RgdGW0LINCi0g4p2MINCa0YDRg9Cz0L7QstC40Lkg0L/QvtGA0Y/QtNC+0Log0L/QvtGA0YPRiNC10L3QuNC5INGH0LXRgNC10Lcg0LfQu9C40YLRgtGPINGB0YPQvNGW0LbQvdC40YUg0LrQvtC90YHRgtGA0YPQutGC0ZbQsg0KDQojIyMgMi4gKirQldC80L/RltGA0LjRh9C90LAg0LTQstC+0YTQsNC60YLQvtGA0L3QsCDRgdGC0YDRg9C60YLRg9GA0LAqKg0K0JfQsNC80ZbRgdGC0YwgNCDRgtC10L7RgNC10YLQuNGH0L3QuNGFINC/0L7Qu9GO0YHRltCyINCy0LjRj9Cy0LvQtdC90L4gKioyINGD0LfQsNCz0LDQu9GM0L3QtdC90ZYg0LLQuNC80ZbRgNC4OioqDQoNCioq0KHQvtGG0ZbQsNC70YzQvdC40Lkg0YTQvtC60YPRgSoqIChTb2NpYWwgZm9jdXMpDQotINCa0L7Qu9C10LrRgtC40LLQvdC1INCx0LvQsNCz0L4g0YfQtdGA0LXQtyDQvdC+0YDQvNCw0YLQuNCy0L3QuNC5INC/0L7RgNGP0LTQvtC6DQotINCm0ZbQvdC90L7RgdGC0ZY6INCX0LHQtdGA0LXQttC10L3QvdGPICsg0KHQsNC80L7RgtGA0LDQvdGB0YbQtdC90LTQtdC90YbRltGPDQotIM6xINCa0YDQvtC90LHQsNGF0LAgPSAwLjc2IOKchQ0KDQoqKtCe0YHQvtCx0LjRgdGC0ZbRgdC90LjQuSDRhNC+0LrRg9GBKiogKFBlcnNvbmFsIGZvY3VzKSAgDQotINCG0L3QtNC40LLRltC00YPQsNC70YzQvdGWINGW0L3RgtC10YDQtdGB0Lgg0YfQtdGA0LXQtyDQsNCy0YLQvtC90L7QvNGW0Y4g0YLQsCDRg9GB0L/RltGFDQotINCm0ZbQvdC90L7RgdGC0ZY6INCS0ZbQtNC60YDQuNGC0ZbRgdGC0YwgKyDQodCw0LzQvtGB0YLQstC10YDQtNC20LXQvdC90Y8NCi0gzrEg0JrRgNC+0L3QsdCw0YXQsCA9IDAuNzcg4pyFDQoNCioq0KHQu9Cw0LHQutCwINC60L7RgNC10LvRj9GG0ZbRjyDQvNGW0LYg0LvQsNGC0LXQvdGC0L3QuNC80Lgg0YTQsNC60YLQvtGA0LDQvNC4OioqIHIgPSAwLjA4IChwID0gMC4wNDYpDQrihpIg0JIg0KPQutGA0LDRl9C90ZYg0L7RgdC+0LHQuNGB0YLRliDQsNC80LHRltGG0ZbRlyDRgtCwINGB0L7RhtGW0LDQu9GM0L3RliDQt9C+0LHQvtCyJ9GP0LfQsNC90L3RjyDRhNGD0L3QutGG0ZbQvtC90YPRjtGC0Ywg0Y/QuiDQvNCw0LnQttC1ICoq0L3QtdC30LDQu9C10LbQvdGWINC80L7RgtC40LLQsNGG0ZbQudC90ZYg0LTQvtC80LXQvdC4KioNCg0KIyMjIDMuICoq0J3QvtC80L7Qu9C+0LPRltGH0L3QsCDQstCw0LvRltC00L3RltGB0YLRjCDQv9GW0LTRgtCy0LXRgNC00LbQtdC90LAqKg0K0KLQtdC+0YDQtdGC0LjRh9C90L4g0YPQt9Cz0L7QtNC20LXQvdGWINC60L7RgNC10LvRj9GG0ZbRlyDQtyDRltC90LTQtdC60YHQsNC80Lgg0IbQvdCz0LvQs9Cw0YDRgtCwLdCS0LXQu9GM0YbQtdC70Y86DQotINCe0YHQvtCx0LjRgdGC0ZbRgdC90LjQuSDRhNC+0LrRg9GBIOKGlCDQtdC80LDQvdGB0LjQv9Cw0YLQuNCy0L3RliDRhtGW0L3QvdC+0YHRgtGWICgrKQ0KLSDQodC+0YbRltCw0LvRjNC90LjQuSDRhNC+0LrRg9GBIOKGlCDRgdC10LrRg9C70Y/RgNC90L4t0YDQsNGG0ZbQvtC90LDQu9GM0L3RliDRhtGW0L3QvdC+0YHRgtGWICgtKQ0KLSDQktGW0LTRgtCy0L7RgNGO0ZQg0LHQsNC30L7QstGDINCy0ZbRgdGMINC60YPQu9GM0YLRg9GA0L3QvtGXINC80L7QtNC10YDQvdGW0LfQsNGG0ZbRlw0KDQojIyMgNC4gKirQlNCy0LAg0LLQtdC60YLQvtGA0Lgg0YbRltC90L3RltGB0L3QuNGFINGC0YDQsNC90YHRhNC+0YDQvNCw0YbRltC5ICgyMDExKSoqDQoNCioq0JLQtdC60YLQvtGAIDE6INCG0L3QtNC40LLRltC00YPQsNC70ZbRgdGC0LjRh9C90LAg0LXQvNCw0L3RgdC40L/QsNGG0ZbRjyoqDQotINCh0LLQvtCx0L7QtNCwICsg0LDQstGC0L7QvdC+0LzRltGPIOKGkiDQvtGB0L7QsdC40YHRgtGW0YHQvdGWINCw0LzQsdGW0YbRltGXDQoNCioq0JLQtdC60YLQvtGAIDI6INCh0LXQutGD0LvRj9GA0LjQt9Cw0YbRltGPINC3INC10YDQvtC30ZbRlNGOINC/0YDQvtGB0L7RhtGW0LDQu9GM0L3QvtGB0YLRlioqICANCi0g0KDQsNGG0ZbQvtC90LDQu9GW0LfQsNGG0ZbRjyDihpIg0L7RgdC70LDQsdC70LXQvdC90Y8g0LDQu9GM0YLRgNGD0ZfQt9C80YMNCi0g0J/RgNC+0LHQu9C10LzQsDog0YDRg9C50L3Rg9Cy0LDQvdC90Y8g0YLRgNCw0LTQuNGG0ZbQudC90LjRhSDQvNC10YXQsNC90ZbQt9C80ZbQsiDRgdC+0LvRltC00LDRgNC90L7RgdGC0ZYgKirQsdC10LcqKiDQutC+0LzQv9C10L3RgdCw0YbRltGXINGB0LLRltGC0YHRjNC60LjQvNC4INCw0LvRjNGC0LXRgNC90LDRgtC40LLQsNC80LgNCg0KIyMjIDUuICoq0J/RgNCw0LrRgtC40YfQvdCwINGG0ZbQvdC90ZbRgdGC0YwgUFZRLTEwKioNCuKchSAqKtCf0YDQuNC00LDRgtC90LjQuSDQtNC70Y86Kiog0LzQvtC90ZbRgtC+0YDQuNC90LPRgyDRg9C30LDQs9Cw0LvRjNC90LXQvdC40YUg0YbRltC90L3RltGB0L3QuNGFINC/0YDRltC+0YDQuNGC0LXRgtGW0LIg0LIg0YPQvNC+0LLQsNGFINC+0LHQvNC10LbQtdC90LjRhSDRgNC10YHRg9GA0YHRltCyICANCuKdjCAqKtCd0LUg0LfQsNC80ZbQvdGO0ZQ6Kiog0L/QvtCy0L3RliDQstC10YDRgdGW0ZcgKFBWUS0yMSwgUFZRLTQwKSDQtNC70Y8g0LTQvtGB0LvRltC00LbQtdC90L3RjyDRgdC/0LXRhtC40YTRltGH0L3QuNGFINC80L7RgtC40LLQsNGG0ZbQudC90LjRhSDRgtC40L/RltCyDQoNCiMjIyA2LiAqKtCc0LXRgtC+0LTQvtC70L7Qs9GW0YfQvdC40Lkg0LLQvdC10YHQvtC6KioNCi0g0KHQuNGB0YLQtdC80LDRgtC40YfQvdCwINC/0YHQuNGF0L7QvNC10YLRgNC40YfQvdCwINCy0LDQu9GW0LTQsNGG0ZbRjyBQVlEtMTAg0LIg0YPQutGA0LDRl9C90YHRjNC60L7QvNGDINC60L7QvdGC0LXQutGB0YLRlg0KLSDQkdCw0LfQvtCy0LAg0YDQtdGE0LXRgNC10L3RgtC90LAg0YLQvtGH0LrQsCAoMjAxMSkg0LTQu9GPINC80L7QvdGW0YLQvtGA0LjQvdCz0YMg0LfQvNGW0L0g0L/RltGB0LvRjyDQoNC10LLQvtC70Y7RhtGW0Zcg0JPRltC00L3QvtGB0YLRliDRgtCwINCy0ZbQudC90LgNCi0g0JXQvNC/0ZbRgNC40YfQvdC1INC/0ZbQtNGC0LLQtdGA0LTQttC10L3QvdGPINCw0LvRjNGC0LXRgNC90LDRgtC40LLQvdC+0LPQviDQvtGA0LPQsNC90ZbQt9Cw0YbRltC50L3QvtCz0L4g0L/RgNC40L3RhtC40L/RgyDQqNCy0LDRgNGG0LAgKNGE0L7QutGD0YEg0ZbQvdGC0LXRgNC10YHRltCyKQ0KPC9kaXY+DQoNCi0tLQ0KDQojINCG0LzQv9C70ZbQutCw0YbRltGXINC00LvRjyDRgdC+0YbRltCw0LvRjNC90L7Qs9C+INC/0YDQvtCz0L3QvtGD0LfQstCw0L3QvdGPICAgIA0KDQo8ZGl2IGNsYXNzPSJrZXktZmluZGluZyI+ICAgIA0KIyMg0J7RgdC+0LHQu9C40LLQvtGB0YLRliDRg9C60YDQsNGX0L3RgdGM0LrQvtGXINGG0ZbQvdC90ZbRgdC90L7RlyDRgdGC0YDRg9C60YLRg9GA0LggKDIwMTEpICAgDQoNCiMjIyDQodC70LDQsdC60LjQuSDQstC30LDRlNC80L7Qt9CyJ9GP0LfQvtC6INGE0LDQutGC0L7RgNGW0LIgPSDQnNC+0LbQu9C40LLRltGB0YLRjCDQv9C+0LTQstGW0LnQvdC+0LPQviDQsNC/0LXQu9GO0LLQsNC90L3RjyAgIA0KKirQn9C+0LvRltGC0LjRh9C90ZYg0ZbQvdGC0LXRgNCy0LXQvdGG0ZbRlyDQvNC+0LbRg9GC0Ywg0L7QtNC90L7Rh9Cw0YHQvdC+OioqICAgDQotINCQ0L/QtdC70Y7QstCw0YLQuCDQtNC+INC60L7Qu9C10LrRgtC40LLQvdC40YUg0YbRltC90L3QvtGB0YLQtdC5ICjQv9Cw0YLRgNGW0L7RgtC40LfQvCwg0YHQvtC70ZbQtNCw0YDQvdGW0YHRgtGMKSAgIA0KLSDQn9GW0LTRgtGA0LjQvNGD0LLQsNGC0Lgg0ZbQvdC00LjQstGW0LTRg9Cw0LvRjNC90ZYg0LDQvNCx0ZbRhtGW0ZcgKNC/0ZbQtNC/0YDQuNGU0LzQvdC40YbRgtCy0L4sINGB0LDQvNC+0YDQtdCw0LvRltC30LDRhtGW0Y4pICAgDQoNCioq0JHQtdC3INGA0LjQt9C40LrRgyoqINCy0ZbQtNGH0YPQttC10L3QvdGPINC/0YDQvtGC0LjQu9C10LbQvdC+INC90LDQu9Cw0YjRgtC+0LLQsNC90LjRhSDQs9GA0YPQvyAgIA0KDQojIyMg0JLQuNC60LvQuNC6OiDQodC10LrRg9C70Y/RgNC40LfQsNGG0ZbRjyDQsdC10Lcg0L/RgNC+0YHQvtGG0ZbQsNC70YzQvdC+0YHRgtGWICAgDQrimqDvuI8gKirQn9GA0L7QsdC70LXQvNCwOioqINCg0LDRhtGW0L7QvdCw0LvRltC30LDRhtGW0Y8g0L3QtSDRgdGD0L/RgNC+0LLQvtC00LbRg9GU0YLRjNGB0Y8g0YDQvtC30LLQuNGC0LrQvtC8INGB0LLRltGC0YHRjNC60LjRhSDRhNC+0YDQvCDRgdC+0LvRltC00LDRgNC90L7RgdGC0ZYgIA0KDQoqKtCd0LXQvtCx0YXRltC00L3RltGB0YLRjDoqKiDQoNC+0LfQstC40YLQvtC6INGW0L3RgdGC0LjRgtGD0YbRltC50L3QuNGFINC80LXRhdCw0L3RltC30LzRltCyINGB0L7RhtGW0LDQu9GM0L3QvtGXINGW0L3RgtC10LPRgNCw0YbRltGXLCDQvdC10LfQsNC70LXQttC90LjRhSDQstGW0LQg0YLRgNCw0LTQuNGG0ZbQudC90LjRhSDRltGU0YDQsNGA0YXRltGH0L3QuNGFINC80LXRhdCw0L3RltC30LzRltCyINGA0LXQs9GD0LvRj9GG0ZbRlyAgIA0KDQojIyMg0KDQtdGE0LXRgNC10L3RgtC90LAg0YLQvtGH0LrQsCDQtNC70Y8g0LzQvtC90ZbRgtC+0YDQuNC90LPRgyAgDQrQlNCw0L3RliAyMDExINGA0L7QutGDINGE0ZbQutGB0YPRjtGC0Ywg0YbRltC90L3RltGB0L3QuNC5INC/0YDQvtGE0ZbQu9GMICoq0LTQvjoqKiAgIA0KLSDQoNC10LLQvtC70Y7RhtGW0Zcg0JPRltC00L3QvtGB0YLRliAoMjAxMy0yMDE0KSAgIA0KLSDQoNC+0YHRltC50YHRjNC60L7RlyDQsNCz0YDQtdGB0ZbRlyAoMjAxNC0yMDI1KSAgIA0KLSDQnNCw0YHRiNGC0LDQsdC90LjRhSDRgdGD0YHQv9GW0LvRjNC90LjRhSDRgtGA0LDQvdGB0YTQvtGA0LzQsNGG0ZbQuSAgDQoNCioq0JzQtdGC0L7QtNC+0LvQvtCz0ZbRh9C90LAg0YbRltC90L3RltGB0YLRjDoqKiDQkdCw0LfQvtCy0LAg0LvRltC90ZbRjyDQtNC70Y8g0L7RhtGW0L3QutC4INCy0L/Qu9C40LLRgyDQutGA0LjQt9C+0LLQuNGFINC/0L7QtNGW0Lkg0L3QsCDRhtGW0L3QvdGW0YHQvdGDINGB0YLRgNGD0LrRgtGD0YDRgyAgDQo8L2Rpdj4NCg0KLS0tDQoNCiMg0J7QsdC80LXQttC10L3QvdGPINC00L7RgdC70ZbQtNC20LXQvdC90Y8NCg0KPGRpdiBjbGFzcz0ibWV0aG9kLW5vdGUiPg0KKioxLiDQntCx0LzQtdC20LXQvdC90Y8g0ZbQvdGB0YLRgNGD0LzQtdC90YLRgyoqICAgICANCi0g0J3QtdC80L7QttC70LjQstGW0YHRgtGMINC80L7QtNC10LvRjtCy0LDQvdC90Y8g0L7QutGA0LXQvNC40YUg0YbRltC90L3QvtGB0YLQtdC5INGP0Log0LvQsNGC0LXQvdGC0L3QuNGFINC30LzRltC90L3QuNGFICAgDQotINCd0LjQt9GM0LrRliDQt9C90LDRh9C10L3QvdGPINCy0ZbQtNGB0L7RgtC60YMg0L/QvtGP0YHQvdC10L3QvtGXINC00LjRgdC/0LXRgNGB0ZbRlyAgICANCg0KKioyLiDQotC10LzQv9C+0YDQsNC70YzQvdGWINC+0LHQvNC10LbQtdC90L3RjyoqICAgDQotINCU0LDQvdGWIDIwMTEg0YDQvtC60YMgKNC00L4g0LrQu9GO0YfQvtCy0LjRhSDRgtGA0LDQvdGB0YTQvtGA0LzQsNGG0ZbQuSkgIA0KLSDQn9C+0L/QtdGA0LXRh9C90LjQuSDQt9GA0ZbQtyAo0LHQtdC3INC00LjQvdCw0LzRltC60LgpICANCg0KKiozLiDQnNC10YLQvtC00L7Qu9C+0LPRltGH0L3RliDQvtCx0LzQtdC20LXQvdC90Y8qKiAgDQotIENGQSDQvdC1INC00L7RgdGP0LPQu9CwINC60L7QvdCy0LXRgNCz0LXQvdGG0ZbRlyAgDQotINCd0LXQvtCx0YXRltC00L3RltGB0YLRjCDQstCw0LvRltC00LDRhtGW0Zcg0L3QsCDQvdC+0LLQuNGFINC00LDQvdC40YUgIA0KDQoqKjQuINCT0LXQvdC10YDQsNC70ZbQt9Cw0YbRltGPKiogICANCi0g0KDQtdC30YPQu9GM0YLQsNGC0Lgg0YHQv9C10YbQuNGE0ZbRh9C90ZYg0LTQu9GPINGD0LrRgNCw0ZfQvdGB0YzQutC+0LPQviDQutC+0L3RgtC10LrRgdGC0YMgIA0KLSDQndC10L7QsdGF0ZbQtNC90ZYg0L/QvtGA0ZbQstC90Y/Qu9GM0L3RliDQtNC+0YHQu9GW0LTQttC10L3QvdGPICANCjwvZGl2Pg0KDQotLS0NCg0KIyDQndCw0L/RgNGP0LzQuCDQvNCw0LnQsdGD0YLQvdGW0YUg0LTQvtGB0LvRltC00LbQtdC90YwNCg0KPGRpdiBjbGFzcz0iY29uY2x1c2lvbi1ib3giPg0KDQoqKjEuINCf0L7RgNGW0LLQvdGP0LvRjNC90ZYg0LTQvtGB0LvRltC00LbQtdC90L3RjyoqICAgDQotINCc0ZbQttC60YDQsNGX0L3QvtCy0ZYg0LLRltC00LzRltC90L3QvtGB0YLRliDRgyDRgdGC0LDQsdGW0LvRjNC90L7RgdGC0ZYg0LTQstC+0YTQsNC60YLQvtGA0L3QvtGXINGB0YLRgNGD0LrRgtGD0YDQuCAgDQotINCf0YHQuNGF0L7QvNC10YLRgNC40YfQvdCwINCy0LDQu9GW0LTQsNGG0ZbRjyBQVlEtMTAg0LIg0ZbQvdGI0LjRhSDQv9C+0YHRgtGA0LDQtNGP0L3RgdGM0LrQuNGFINC60YDQsNGX0L3QsNGFICANCg0KKioyLiDQn9C+0LPQu9C40LHQu9C10L3QuNC5INCw0L3QsNC70ZbQtyDQv9Cw0YDQsNC00L7QutGB0YMg0YHQtdC60YPQu9GP0YDQuNC30LDRhtGW0ZcqKiAgDQotINCv0LrRltGB0L3RliDQtNC+0YHQu9GW0LTQttC10L3QvdGPINC80LXRhdCw0L3RltC30LzRltCyINC10YDQvtC30ZbRlyDQv9GA0L7RgdC+0YbRltCw0LvRjNC90L7RgdGC0ZYgIA0KLSDQn9C+0YjRg9C6INGB0LLRltGC0YHRjNC60LjRhSDQsNC70YzRgtC10YDQvdCw0YLQuNCyINGC0YDQsNC00LjRhtGW0LnQvdGW0Lkg0YHQvtC70ZbQtNCw0YDQvdC+0YHRgtGWICANCg0KKiozLiDQn9GA0LDQutGC0LjRh9C90LUg0LfQsNGB0YLQvtGB0YPQstCw0L3QvdGPKiogICANCi0g0JLQuNC60L7RgNC40YHRgtCw0L3QvdGPIFBWUS0xMCDRgyDRgdC+0YbRltCw0LvRjNC90LjRhSDQvtC/0LjRgtGD0LLQsNC90L3Rj9GFINCyINGD0LzQvtCy0LDRhSDQstGW0LnQvdC4ICANCi0g0IbQvdGC0LXQs9GA0LDRhtGW0Y8g0YMg0YHQuNGB0YLQtdC80Lgg0LzQvtC90ZbRgtC+0YDQuNC90LPRgyDRgdGD0YHQv9GW0LvRjNC90LjRhSDQvdCw0YHRgtGA0L7Rl9CyICANCi0g0JTQvtGB0LvRltC00LbQtdC90L3RjyDQstGW0LTQvNGW0L3QvdC+0YHRgtC10Lkg0KHQvtGG0ZbQsNC70YzQvdC+0LPQviDRgtCwINCe0YHQvtCx0LjRgdGC0ZbRgdC90L7Qs9C+INGE0L7QutGD0YHRgyDQsiDRgdC+0YbRltCw0LvRjNC90L4t0LTQtdC80L7Qs9GA0LDRhNGW0YfQvdC40YUg0LPRgNGD0L/QsNGFICANCi0g0KDQvtC30YDQvtCx0LrQsCDQsNC00LDQv9GC0L7QstCw0L3QuNGFINCy0LXRgNGB0ZbQuSDQtNC70Y8g0YHQv9C10YbQuNGE0ZbRh9C90LjRhSDQutC+0L3RgtC10LrRgdGC0ZbQsiAgDQogIA0KDQo8L2Rpdj4NCg0KLS0tDQoNCiMg0JrQu9GO0YfQvtCy0ZYg0L/QvtGB0LjQu9Cw0L3QvdGPDQoNCjxkaXYgY2xhc3M9Im1ldGhvZC1ub3RlIj4NCg0KDQpTY2h3YXJ0eiwgUy4gSC4gKDIwMTIpLiBBbiBvdmVydmlldyBvZiB0aGUgU2Nod2FydHogdGhlb3J5IG9mIGJhc2ljIHZhbHVlcy4gKk9ubGluZSBSZWFkaW5ncyBpbiBQc3ljaG9sb2d5IGFuZCBDdWx0dXJlKiwgKjIqKDEpLiBodHRwczovL2RvaS5vcmcvMTAuOTcwNy8yMzA3LTA5MTkuMTExNg0KDQpJbmdsZWhhcnQsIFIuLCAmIFdlbHplbCwgQy4gKDIwMDUpLiAqTW9kZXJuaXphdGlvbiwgY3VsdHVyYWwgY2hhbmdlLCBhbmQgZGVtb2NyYWN5OiBUaGUgaHVtYW4gZGV2ZWxvcG1lbnQgc2VxdWVuY2UqLiBDYW1icmlkZ2UgVW5pdmVyc2l0eSBQcmVzcy4NCg0KSW5nbGVoYXJ0LCBSLiwgZXQgYWwuICgyMDE0KS4gKldvcmxkIFZhbHVlcyBTdXJ2ZXk6IFJvdW5kIFNpeCAtIENvdW50cnktUG9vbGVkIERhdGFmaWxlIFZlcnNpb24qLiB3d3cud29ybGR2YWx1ZXNzdXJ2ZXkub3JnDQo8L2Rpdj4NCg0KLS0tDQoNCiMjINCa0L7QvdGC0LDQutGCDQoqKtCQ0LLRgtC+0YA6Kiog0JDQvdC00YDRltC5INCR0L7QstCwICANCioqRW1haWw6KiogYW5hZ3JhbUB1a3IubmV0DQoNCtCU0LDRgtCwINC+0L3QvtCy0LvQtdC90L3RjzogYHIgZm9ybWF0KFN5cy5EYXRlKCksICIlZC4lbS4lWSIpYA0KDQotLS0NCg0K