PHẦN 1: TÌM HIỂU VÀ CHUẨN BỊ DỮ LIỆU

1.1 ĐỌC DỮ LIỆU

  • Bộ dữ liệu “Student Social Media & Relationships” chứa các bản ghi ẩn danh về hành vi mạng xã hội của sinh viên và các kết quả cuộc sống liên quan. Bộ dữ liệu này trải dài trên nhiều quốc gia và trình độ học vấn, tập trung vào các chiều chính như cường độ sử dụng, sở thích nền tảng và động lực mối quan hệ. Mỗi hàng đại diện cho một phản hồi khảo sát của sinh viên, cung cấp ảnh chụp nhanh theo chiều ngang phù hợp cho phân tích thống kê và các ứng dụng học máy.

  • Đối tượng: Học sinh trong độ tuổi từ 16 đến 25 đang theo học chương trình trung học, đại học hoặc sau đại học.

  • Địa lý: Phạm vi nhiều quốc gia (ví dụ: Bangladesh, Ấn Độ, Hoa Kỳ, Vương quốc Anh, Canada, Úc, Đức, Brazil, Nhật Bản, Hàn Quốc).

  • Khung thời gian: Dữ liệu được thu thập thông qua khảo sát trực tuyến một lần được thực hiện vào quý 1 năm 2025.

1.1.1 Đọc file dữ liệu gốc

library(xlsx)
## Warning: package 'xlsx' was built under R version 4.3.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(gmodels)
## Warning: package 'gmodels' was built under R version 4.3.3
data <- read.xlsx(file = "C:/Users/PC_Dell/Downloads/Students_Social_Media_Addiction.xlsx", sheetIndex = 1, header = T)
  • Cấu trúc bộ dữ liệu
str(data)
## 'data.frame':    705 obs. of  12 variables:
##  $ Age                         : num  19 22 20 18 21 19 23 20 18 21 ...
##  $ Gender                      : chr  "Female" "Male" "Female" "Male" ...
##  $ Academic_Level              : chr  "Undergraduate" "Graduate" "Undergraduate" "High School" ...
##  $ Country                     : chr  "Bangladesh" "India" "USA" "UK" ...
##  $ Avg_Daily_Usage_Hours       : num  5.2 2.1 6 3 4.5 7.2 1.5 5.8 4 3.3 ...
##  $ Most_Used_Platform          : chr  "Instagram" "Twitter" "TikTok" "YouTube" ...
##  $ Affects_Academic_Performance: chr  "Yes" "No" "Yes" "No" ...
##  $ Relationship_Status         : chr  "In Relationship" "Single" "Complicated" "Single" ...
##  $ MENTAL_HEALTH               : chr  "GOOD" "GOOD" "BAD" "GOOD" ...
##  $ SLEEP_LEVEL                 : chr  "BAD" "GOOD" "BAD" "GOOD" ...
##  $ CONFLIT_LEVEL               : chr  "Moderate conflict" "Low conflict" "High conflict" "Low conflict" ...
##  $ ADDICTED_LEVEL              : chr  "Heavily addicted" "Moderately addicted" "Heavily addicted" "Moderately addicted" ...

1.2. TỔNG QUAN VỀ DỮ LIỆU

1.2.1 Danh sách các biến và mô tả

Biến định lượng (Numeric Variables)

Tên biến Kiểu dữ liệu Mô tả Ví dụ
Age numeric Tuổi của người tham gia khảo sát 18, 20, 21, 23
Avg_Daily_Usage_Hours numeric Thời gian trung bình sử dụng mạng xã hội mỗi ngày 2.1, 4.5, 5.8, 7.2

Biến định tính (Categorical Variables)

Tên biến Kiểu dữ liệu Mô tả Ví dụ giá trị
Gender character Giới tính của người tham gia “Male”, “Female”
Academic_Level character Trình độ học vấn hiện tại “Undergraduate”, “Graduate”
Country character Quốc gia cư trú “USA”, “India”, “UK”, “Bangladesh”
Most_Used_Platform character Mạng xã hội được sử dụng nhiều nhất “TikTok”, “Instagram”, “YouTube”
Affects_Academic_Performance character Mạng xã hội có ảnh hưởng đến học tập không “Yes”, “No”
Relationship_Status character Tình trạng mối quan hệ hiện tại “Single”, “In Relationship”, “Complicated”
MENTAL_HEALTH character Tình trạng sức khỏe tinh thần “GOOD”, “BAD”
SLEEP_LEVEL character Chất lượng giấc ngủ “GOOD”, “BAD”
CONFLIT_LEVEL character Mức độ mâu thuẫn do mạng xã hội gây ra “Low conflict”, “Moderate conflict”, “High conflict”
ADDICTED_LEVEL character Mức độ nghiện mạng xã hội “Not addicted”, “Moderately addicted”, “Heavily addicted”

1.2.3 Kiểm tra dữ liệu

1.2.3.1 Kiểm tra số lượng NA trong cột định tính
# Kiểm tra số lượng NA trong mỗi cột định tính
na_counts <- sapply(data, function(x) sum(is.na(x)))
na_counts
##                          Age                       Gender 
##                            0                            0 
##               Academic_Level                      Country 
##                            0                            0 
##        Avg_Daily_Usage_Hours           Most_Used_Platform 
##                            0                            0 
## Affects_Academic_Performance          Relationship_Status 
##                            0                            0 
##                MENTAL_HEALTH                  SLEEP_LEVEL 
##                            0                            0 
##                CONFLIT_LEVEL               ADDICTED_LEVEL 
##                            0                            0

Nhận xét - Kết quả thu được cho thấy rằng tất cả các cột định tính đều không có giá trị thiếu (NA) vì số lượng NA trong các cột đều hiển thị là 0

1.2.3.2 Chuyển đổi các biến định tính sang kiểu factor
# Chuyển các biến định tính sang factor
data$Age <- as.factor(data$Age)
data$Gender <- as.factor(data$Gender)
data$Academic_Level <- as.factor(data$Academic_Level)
data$Country <- as.factor(data$Country)
data$Most_Used_Platform <- as.factor(data$Most_Used_Platform)
data$Affects_Academic_Performance <- as.factor(data$Affects_Academic_Performance)
data$SLEEP_LEVEL <- as.factor(data$SLEEP_LEVEL)
data$MENTAL_HEALTH <- as.factor(data$MENTAL_HEALTH)
data$ADDICTED_LEVEL <- as.factor(data$ADDICTED_LEVEL)
data$Relationship_Status <- as.factor(data$Relationship_Status)
data$CONFLIT_LEVEL <- as.factor(data$CONFLIT_LEVEL)

Kiểm tra lại sau khi chuyển đổi

Giải thích:

  • sapply(data, class): Áp dụng hàm class() cho từng cột để kiểm tra kiểu dữ liệu. Kết quả trả về là một vector hiển thị tên cột và loại dữ liệu tương ứng.

  • Nếu kết quả là “factor” cho tất cả các cột → chuyển đổi thành công.

sapply(data, class)
##                          Age                       Gender 
##                     "factor"                     "factor" 
##               Academic_Level                      Country 
##                     "factor"                     "factor" 
##        Avg_Daily_Usage_Hours           Most_Used_Platform 
##                    "numeric"                     "factor" 
## Affects_Academic_Performance          Relationship_Status 
##                     "factor"                     "factor" 
##                MENTAL_HEALTH                  SLEEP_LEVEL 
##                     "factor"                     "factor" 
##                CONFLIT_LEVEL               ADDICTED_LEVEL 
##                     "factor"                     "factor"

Nhận xét : Kết quả thu được toàn bộ các biến định tính đã được chuyển đổi thành dạng factor.

PHẦN 2: PHÂN TÍCH MÔ TẢ BIẾN ĐỊNH TÍNH

install.packages("ggplot2", repos = "https://cloud.r-project.org")
## Warning: package 'ggplot2' is in use and will not be installed
library(ggplot2)

2.1. Gender - Giới tính

2.1.1 Thống kê tần số, tần suất và trực quan hóa

tab_gender <- table(data$Gender)
tab_gender
## 
## Female   Male 
##    353    352
table(data$Gender)/sum(nrow(data))
## 
##    Female      Male 
## 0.5007092 0.4992908
2.1.1.2 Trực quan hoá
# Tạo dataframe từ bảng tần số
gender_freq <- as.data.frame(tab_gender)
colnames(gender_freq) <- c("Gender", "Frequency")

# Tính phần trăm
gender_freq$Percentage <- gender_freq$Frequency / sum(gender_freq$Frequency) * 100

# Tạo nhãn chỉ gồm phần trăm
gender_freq$Label <- paste0(round(gender_freq$Percentage, 1), "%")

# Vẽ biểu đồ tròn với nhãn chỉ phần trăm
ggplot(gender_freq, aes(x = "", y = Percentage, fill = Gender)) +
  geom_col(width = 1, color = "white") +
  coord_polar(theta = "y") +
  theme_void() +
  geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5) +
  labs(title = "Phân bố giới tính của sinh viên") +
  scale_fill_brewer(palette = "Pastel1")

2.1.2 Nhận xét

Biểu đồ tròn thể hiện phân bố giới tính trong bộ dữ liệu sinh viên cho thấy tỷ lệ giữa nam và nữ là gần như tương đương:

  • Nữ chiếm 50.1% (353 người)

  • Nam chiếm 49.9% (352 người)

  • Sự chênh lệch giữa hai nhóm là không đáng kể (chỉ 1 người), điều này cho thấy bộ dữ liệu có cân bằng về giới tính, phù hợp để tiến hành các phân tích so sánh theo giới mà không lo thiên lệch mẫu.

  • Việc có sự phân phối giới tính đồng đều là một yếu tố quan trọng giúp tăng độ tin cậy khi kiểm định các giả thuyết liên quan đến giới, như:

    • So sánh mức độ nghiện mạng xã hội giữa nam và nữ

    • Mối quan hệ giữa giới tính và sức khỏe tinh thần

    • Tác động của mạng xã hội đến học tập theo giới

2.2. Trình độ học vấn

2.2.1 Thống kê tần số, tần suất và trực quan hóa

level_freq <- table(data$Academic_Level)
level_percent <- prop.table(level_freq) * 100
data.frame(Academic_Level = names(level_freq),
           Frequency = as.numeric(level_freq),
           Percentage = round(as.numeric(level_percent), 1))
##   Academic_Level Frequency Percentage
## 1       Graduate       325       46.1
## 2    High School        27        3.8
## 3  Undergraduate       353       50.1
2.1.1.2 Trực quan hoá
# Load thư viện
library(ggplot2)
library(RColorBrewer)  # dùng cho palette màu

# Hàm tái sử dụng để xử lý và vẽ biểu đồ
plot_pie <- function(data, var, title) {
  tab <- table(data[[var]])
  df <- as.data.frame(tab)
  colnames(df) <- c("Category", "Frequency")
  df$Percentage <- df$Frequency / sum(df$Frequency) * 100
  df$Label <- paste0(round(df$Percentage, 1), "%")
  
  ggplot(df, aes(x = "", y = Percentage, fill = Category)) +
    geom_col(width = 1, color = "white") +
    coord_polar(theta = "y") +
    theme_void() +
    geom_text(aes(label = Label), position = position_stack(vjust = 0.5), size = 5) +
    labs(title = title, fill = var) +
    scale_fill_brewer(palette = "Pastel1")
}
plot_pie(data, "Academic_Level", "Phân bố trình độ học vấn của sinh viên")

2.2.2 Nhận xét

  • Phần lớn sinh viên thuộc bậc đại học (Undergraduate) (50.1%), tiếp theo là sau đại học (Graduate) (46.1%), trong khi bậc trung học (High School) chỉ chiếm 3.8%. Điều này phản ánh đa số người tham gia khảo sát là sinh viên đại học trở lên.

2.3. Tác động của mạng xã hội đến học tập

2.3.1 Thống kê tần số, tần suất và trực quan hóa

affect_freq <- table(data$Affects_Academic_Performance)
affect_percent <- prop.table(affect_freq) * 100
data.frame(Affects = names(affect_freq),
           Frequency = as.numeric(affect_freq),
           Percentage = round(as.numeric(affect_percent), 1))
##   Affects Frequency Percentage
## 1      No       252       35.7
## 2     Yes       453       64.3

2.3.1.1 trực quan hóa

plot_pie(data, "Affects_Academic_Performance", "Tác động của mạng xã hội đến học tập")

2.3.2 Nhận xét

  • Khoảng 64.3% sinh viên cho rằng mạng xã hội ảnh hưởng đến kết quả học tập của họ, cho thấy tác động tiêu cực của mạng xã hội là một vấn đề đáng lưu tâm trong môi trường giáo dục.

2.4. Tình trạng mối quan hệ

2.4.1 Thống kê tần số, tần suất và trực quan hóa

rel_freq <- table(data$Relationship_Status)
rel_percent <- prop.table(rel_freq) * 100
data.frame(Relationship_Status = names(rel_freq),
           Frequency = as.numeric(rel_freq),
           Percentage = round(as.numeric(rel_percent), 1))
##   Relationship_Status Frequency Percentage
## 1         Complicated        32        4.5
## 2     In Relationship       289       41.0
## 3              Single       384       54.5
2.4.1.1 Trực quan hoá
plot_pie(data, "Relationship_Status", "Phân bố tình trạng mối quan hệ")

2.4.2 Nhận xét

  • Phần lớn sinh viên đang độc thân (54.5%), tiếp theo là đang trong mối quan hệ (41%). Chỉ 4.5% chọn “phức tạp”, cho thấy nhóm có tình trạng quan hệ không rõ ràng chiếm tỷ lệ rất nhỏ. Và cũng cho ta thấy rằng mẫu khảo sát rất đồng đều về tỷ lệ giữa tình trạng mối quan hệ

2.5. Phân loại sức khỏe tinh thần

2.5.1 Thống kê tần số, tần suất và trực quan hóa

mh_freq <- table(data$MENTAL_HEALTH)
mh_percent <- prop.table(mh_freq) * 100
data.frame(MENTAL_HEALTH = names(mh_freq),
           Frequency = as.numeric(mh_freq),
           Percentage = round(as.numeric(mh_percent), 1))
##   MENTAL_HEALTH Frequency Percentage
## 1           BAD       202       28.7
## 2          GOOD       503       71.3
2.5.1.1 Trực quan hoá
plot_pie(data, "MENTAL_HEALTH", "Phân loại sức khỏe tinh thần")

2.5.2 Nhận xét

  • Biểu đồ cho thấy có 71.3% sinh viên có sức khỏe tinh thần tốt, trong khi 28.7% có sức khỏe tinh thần kém.

  • Mặc dù phần lớn sinh viên duy trì được trạng thái tinh thần tích cực, tỷ lệ 28.7% gặp vấn đề về sức khỏe tâm lý là một con số đáng lưu ý. Điều này phản ánh nhu cầu cần thiết về các chương trình hỗ trợ tâm lý trong môi trường giáo dục đại học, đặc biệt trong bối cảnh áp lực học tập và ảnh hưởng từ mạng xã hội ngày càng gia tăng.

2.6. Mức độ nghiện mạng xã hội

2.6.1 Thống kê tần số, tần suất và trực quan hóa

addict_freq <- table(data$ADDICTED_LEVEL)
addict_percent <- prop.table(addict_freq) * 100
data.frame(ADDICTED_LEVEL = names(addict_freq),
           Frequency = as.numeric(addict_freq),
           Percentage = round(as.numeric(addict_percent), 1))
##        ADDICTED_LEVEL Frequency Percentage
## 1    Heavily addicted       605       85.8
## 2 Moderately addicted        99       14.0
## 3        Not addicted         1        0.1
2.6.1.1 Trực quan hoá
library(ggplot2)
library(dplyr)

# Tính tần suất
data %>%
  count(ADDICTED_LEVEL) %>%
  ggplot(aes(x = reorder(ADDICTED_LEVEL, -n), y = n, fill = ADDICTED_LEVEL)) +
  geom_bar(stat = "identity", width = 0.6) +
  geom_text(aes(label = paste0(round(n / sum(n) * 100, 1), "%")), 
            vjust = -0.5, size = 4) +
  labs(title = "Mức độ nghiện mạng xã hội",
       x = "Mức độ",
       y = "Số lượng sinh viên") +
  theme_minimal() +
  theme(legend.position = "none")

2.6.2 Nhận xét

  • Biểu đồ cho thấy phần lớn sinh viên trong mẫu khảo sát đang ở tình trạng nghiện mạng xã hội ở mức độ nặng, chiếm tới 85.8%. Trong khi đó, chỉ có khoảng 14% được xếp vào nhóm nghiện vừa phải, và chưa đến 1% (0.1%) là không nghiện (SỬ DỤNG MXH < 2 TIẾNG MỖI NGÀY).

  • Điều này cho thấy mức độ phụ thuộc vào mạng xã hội trong đời sống sinh viên là rất đáng lo ngại, khi gần như toàn bộ đối tượng đều đang sử dụng mạng xã hội ở mức độ có khả năng ảnh hưởng đến sức khỏe tâm thần, thể chất hoặc hiệu suất học tập.

2.7. Tình trạng giấc ngủ

2.7.1 Thống kê tần số, tần suất và trực quan hóa

sleep_freq <- table(data$SLEEP_LEVEL)
sleep_percent <- prop.table(sleep_freq) * 100
data.frame(SLEEP_LEVEL = names(sleep_freq),
           Frequency = as.numeric(sleep_freq),
           Percentage = round(as.numeric(sleep_percent), 1))
##   SLEEP_LEVEL Frequency Percentage
## 1         BAD       276       39.1
## 2        GOOD       429       60.9
2.7.1.1 Trực quan hoá
plot_pie(data, "SLEEP_LEVEL", "Tình trạng giấc ngủ")

2.7.2 Nhận xét

  • Biểu đồ cho thấy:

    • 60.9% sinh viên có giấc ngủ tốt (GOOD),

    • Trong khi 39.1% rơi vào nhóm ngủ kém (BAD).

  • Tỷ lệ sinh viên có giấc ngủ kém chiếm gần 2/5 tổng mẫu, cho thấy một thực trạng đáng lo ngại trong lối sống và sức khỏe của sinh viên. Việc thiếu ngủ kéo dài có thể liên quan đến giảm tập trung, rối loạn tâm lý và tăng nguy cơ nghiện mạng xã hội – điều đã được xác lập rõ ràng qua các nghiên cứu gần đây.

2.8. Mức độ mâu thuẫn do mạng xã hội

2.8.1 Thống kê tần số, tần suất và trực quan hóa

conflict_freq <- table(data$CONFLIT_LEVEL)
conflict_percent <- prop.table(conflict_freq) * 100
data.frame(CONFLIT_LEVEL = names(conflict_freq),
           Frequency = as.numeric(conflict_freq),
           Percentage = round(as.numeric(conflict_percent), 1))
##       CONFLIT_LEVEL Frequency Percentage
## 1     High conflict       189       26.8
## 2      Low conflict        51        7.2
## 3 Moderate conflict       465       66.0
2.8.1.1 Trực quan hoá
plot_pie(data, "CONFLIT_LEVEL", "Số lần mâu thuẫn do mạng xã hội")

2.8.2 Nhận xét

  • Biểu đồ thể hiện mức độ xung đột do sử dụng mạng xã hội của sinh viên:

    • 66% sinh viên gặp mâu thuẫn ở mức độ vừa phải (Moderate conflict).

    • 26.8% trải qua xung đột nghiêm trọng (High conflict).

    • Chỉ 7.2% cho biết ít hoặc không gặp mâu thuẫn (Low conflict).

  • Tỷ lệ sinh viên gặp xung đột do mạng xã hội là rất cao (chiếm tới 92.8%), trong đó trên 1/4 rơi vào tình trạng nghiêm trọng. Điều này phản ánh một thực trạng đáng báo động về ảnh hưởng tiêu cực của mạng xã hội đến các mối quan hệ cá nhân. Việc sử dụng mạng xã hội thiếu kiểm soát có thể dẫn đến hiểu lầm, căng thẳng, và thậm chí rạn nứt trong giao tiếp.

2.9. Nền tảng mạng xã hội được sử dụng phổ biến

2.9.1 Thống kê tần số, tần suất và trực quan hóa

platform_freq <- table(data$Most_Used_Platform)
platform_percent <- prop.table(platform_freq) * 100
data.frame(Platform = names(platform_freq),
           Frequency = as.numeric(platform_freq),
           Percentage = round(as.numeric(platform_percent), 1))
##     Platform Frequency Percentage
## 1   Facebook       123       17.4
## 2  Instagram       249       35.3
## 3  KakaoTalk        12        1.7
## 4       LINE        12        1.7
## 5   LinkedIn        21        3.0
## 6   Snapchat        13        1.8
## 7     TikTok       154       21.8
## 8    Twitter        30        4.3
## 9  VKontakte        12        1.7
## 10    WeChat        15        2.1
## 11  WhatsApp        54        7.7
## 12   YouTube        10        1.4
2.9.1.1 Trực quan hoá
# Tạo bảng tần số
platform_freq <- as.data.frame(table(data$Most_Used_Platform))
colnames(platform_freq) <- c("Platform", "Frequency")

# Vẽ biểu đồ cột
ggplot(platform_freq, aes(x = reorder(Platform, -Frequency), y = Frequency, fill = Platform)) +
  geom_bar(stat = "identity") +
  labs(title = "Nền tảng mạng xã hội được sử dụng phổ biến",
       x = "Nền tảng", y = "Số lượng") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 30, hjust = 1)) +
  guides(fill = "none")

2.9.2 Nhận xét

  • Biểu đồ cho thấy Instagram là nền tảng phổ biến nhất, với 35.3% sinh viên lựa chọn, theo sau là TikTok (21.8%) và Facebook (17.4%). Ba nền tảng này chiếm tổng cộng gần 75% mức sử dụng, cho thấy xu hướng ưu tiên các nền tảng có nội dung trực quan, video ngắn và khả năng tương tác mạnh trong giới sinh viên. Trong khi đó, các ứng dụng nhắn tin như KakaoTalk, LINE, và các nền tảng ít phổ biến hơn như VKontakte, WeChat chỉ chiếm từ 1.7%–2.1%, phản ánh tính chất sử dụng theo khu vực địa lý hoặc mục đích chuyên biệt.

  • Sự ưu thế của Instagram và TikTok là minh chứng rõ ràng cho việc giới trẻ hiện nay bị thu hút bởi nội dung giải trí nhanh, bắt mắt và có tính lan truyền cao, đồng thời cũng tiềm ẩn nguy cơ gây nghiện và phân tán sự chú ý. Ngoài ra, nền tảng chuyên nghiệp như LinkedIn chỉ chiếm 3.0%, cho thấy sinh viên chưa quan tâm nhiều đến phát triển hình ảnh nghề nghiệp trên mạng xã hội. Điều này gợi mở tiềm năng cho các trường đại học và nhà hoạch định chính sách giáo dục trong việc khuyến khích sinh viên sử dụng mạng xã hội một cách hiệu quả hơn, cân bằng giữa giải trí và phát triển bản thân.

PHẦN 3: ƯỚC LƯỢNG KHOẢNG VÀ KIỂM ĐỊNH GIẢ THUYẾT TỶ LỆ CHO 1 BIẾN

3.1 Gender - Male

3.1.1 Ước lượng khoảng tin cậy 95% cho tỷ lệ nam

prop.test(x = sum(data$Gender == "Male"),
          n = nrow(data),
          p = 0.5,             # Giả thuyết H0: p = 0.5
          conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(data$Gender == "Male") out of nrow(data), null probability 0.5
## X-squared = 0, df = 1, p-value = 1
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4617813 0.5368081
## sample estimates:
##         p 
## 0.4992908

3.1.2 Bài toán kiểm định

  • Giả thuyết:

    • H₀: p = 0.5 (tỷ lệ nam bằng 50%)
    • H₁: p ≠ 0.5 (tỷ lệ nam khác 50%)

Nhận xét:

  • Giá trị p-value = 1, lớn hơn mức ý nghĩa thường dùng (α = 0.05), do đó không có đủ bằng chứng để bác bỏ giả thuyết H₀.

  • Khoảng tin cậy 95% cho tỷ lệ sinh viên nam nằm trong khoảng [46.18%; 53.68%], bao gồm giá trị 50%.

  • Ước lượng điểm cho tỷ lệ sinh viên nam là 49.93%, gần sát với 50%.

  • Với mức ý nghĩa 5%, không có sự khác biệt có ý nghĩa thống kê giữa tỷ lệ sinh viên nam và mức chuẩn 50%. Điều này cho thấy phân bố giới tính trong mẫu khảo sát là tương đối cân bằng và phù hợp với giả định tỷ lệ 1:1 giữa nam và nữ.

3.2 Trình độ học vấn - Undergraduate

3.2.1 Ước lượng khoảng tin cậy 95% cho tỷ lệ sinh viên đại học

prop.test(x = sum(data$Academic_Level == "Undergraduate"),
          n = nrow(data),
          p = 0.5,             # Giả thuyết H0: p = 0.5
          conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(data$Academic_Level == "Undergraduate") out of nrow(data), null probability 0.5
## X-squared = 0, df = 1, p-value = 1
## alternative hypothesis: true p is not equal to 0.5
## 95 percent confidence interval:
##  0.4631919 0.5382187
## sample estimates:
##         p 
## 0.5007092

3.2.2 Bài toán kiểm định

  • Giả thuyết:

    • H₀: p = 0.5 (tỷ lệ sinh viên đại học bằng 50%)
    • H₁: p ≠ 0.5 (tỷ lệ sinh viên đại học khác 50%)

Nhận xét:

  • Kết quả kiểm định cho thấy tỷ lệ sinh viên trong mẫu thuộc bậc Undergraduate là khoảng 50.07%, không khác biệt có ý nghĩa thống kê so với tỷ lệ giả định là 50%. Khoảng tin cậy 95% bao gồm giá trị 0.5, và p-value bằng 1 khẳng định rằng không có bằng chứng thống kê để kết luận tỷ lệ sinh viên đại học trong mẫu khác 50%.

  • Vì vậy, ta không bác bỏ giả thuyết H₀, và có thể nói rằng tỷ lệ sinh viên đại học trong mẫu khảo sát là cân bằng, không thiên lệch so với mức trung bình giả định. Điều này cho thấy mẫu khảo sát được xây dựng có tính đại diện tốt về mặt trình độ học vấn nếu giả định tổng thể cũng cân bằng theo cách đó.

PHẦN 4: PHÂN TÍCH MỐI LIÊN HỆ GIỮA HAI BIẾN

4.1 THIẾU NGỦ VÀ NGHIỆN MẠNG XÃ HỘI

Tìm hiểu xem liệu Thiếu ngủ có liên hệ với mức độ nghiện mạng xã hội không? (Nói cách khác: Liệu những người thiếu ngủ có nghiện mạng xã hội nhiều hơn không?)

4.1.1 Bảng tần suất chéo

# Bảng chéo giữa chất lượng giấc ngủ và mức độ nghiện
table_sleep_addict <- table(data$SLEEP_LEVEL, data$ADDICTED_LEVEL)
table_sleep_addict
##       
##        Heavily addicted Moderately addicted Not addicted
##   BAD               276                   0            0
##   GOOD              329                  99            1
prop.table(table_sleep_addict, margin = 1)
##       
##        Heavily addicted Moderately addicted Not addicted
##   BAD       1.000000000         0.000000000  0.000000000
##   GOOD      0.766899767         0.230769231  0.002331002

4.1.2 Trực quan hoá

# Tạo bảng tần suất
table_sleep_addict <- table(data$SLEEP_LEVEL, data$ADDICTED_LEVEL)
df_plot <- as.data.frame(table_sleep_addict)
colnames(df_plot) <- c("Sleep_Level", "Addiction_Level", "Count")

# Trực quan hóa nâng cấp
ggplot(df_plot, aes(x = Sleep_Level, y = Count, fill = Addiction_Level)) +
  geom_col(position = position_dodge(width = 0.7), width = 0.6) +
  geom_text(
    aes(label = Count),
    position = position_dodge(width = 0.7),
    vjust = -0.4, size = 4
  ) +
  labs(
    title = "Mối liên hệ giữa chất lượng giấc ngủ và mức độ nghiện mạng xã hội",
    subtitle = "Hiển thị số lượng sinh viên theo từng nhóm",
    x = "Chất lượng giấc ngủ",
    y = "Số lượng sinh viên",
    fill = "Mức độ nghiện"
  ) +
  theme_minimal(base_size = 13) +
  scale_fill_manual(
    values = c("Not addicted" = "#A8DADC", 
               "Moderately addicted" = "#F4A261", 
               "Heavily addicted" = "#E76F51")
  )

4.1.3 Nhận xét

  • Trong nhóm thiếu ngủ (BAD sleep), có đến 276 sinh viên nghiện nặng, trong khi không có sinh viên nào không nghiện → cho thấy tình trạng thiếu ngủ có liên quan mạnh đến nghiện mạng xã hội.

  • Ngược lại, trong nhóm ngủ đủ (GOOD sleep), số lượng sinh viên nghiện nặng vẫn cao (329) nhưng đã xuất hiện sinh viên không nghiện (1 người) và nghiện vừa (99 người) → cho thấy giấc ngủ tốt có thể liên quan đến mức độ nghiện thấp hơn.

    - Tỷ lệ sinh viên không nghiện mạng xã hội là rất nhỏ trong cả hai nhóm chất lượng giấc ngủ, phản ánh thực trạng mạng xã hội đã len lỏi vào thói quen hàng ngày của phần lớn sinh viên.

-> Cần làm rõ liệu nghiện mạng xã hội có phải là nguyên nhân chính gây ra tình trạng thiếu ngủ, hay là hệ quả của những vấn đề tâm lý khác.

4.1.4 Kiểm định chi bình phương

# Bảng tần số 
table_sleep_addict <- table(data$SLEEP_LEVEL, data$ADDICTED_LEVEL)
table_sleep_addict
##       
##        Heavily addicted Moderately addicted Not addicted
##   BAD               276                   0            0
##   GOOD              329                  99            1
# Kiểm định Chi bình phương
chisq.test(table_sleep_addict)
## Warning in chisq.test(table_sleep_addict): Chi-squared approximation may be
## incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  table_sleep_addict
## X-squared = 74.97, df = 2, p-value < 2.2e-16

Các giả thuyết

  • H₀ (Giả thuyết không): Không có mối liên hệ giữa chất lượng giấc ngủ và mức độ nghiện mạng xã hội. (Hai biến độc lập nhau.)

  • H₁ (Giả thuyết đối):Có mối liên hệ giữa chất lượng giấc ngủ và mức độ nghiện mạng xã hội. (Hai biến phụ thuộc nhau.)

Kết quả kiểm định:

  • Chi-squared = 74.97, df = 2, p-value < 2.2e-16 ⇒ Đây là một kết quả có ý nghĩa thống kê rất cao (p-value ≪ 0.05).

Nhận xét:

  • Mức độ nghiện mạng xã hội có sự khác biệt đáng kể giữa các nhóm chất lượng giấc ngủ (ngủ đủ vs thiếu ngủ).

  • Với giá trị p-value rất nhỏ (nhỏ hơn 0.05), chúng ta bác bỏ giả thuyết H₀ tại mức ý nghĩa 5%. Điều này cho thấy có mối liên hệ có ý nghĩa thống kê giữa chất lượng giấc ngủ và mức độ nghiện mạng xã hội. 2 Biến có mối quan hệ phụ thuộc

4.1.5 Relative Risk

Nhằm phân tích mối quan hệ giữa các biến, chúng ta sử dụng chỉ số Relative Risk (RR) để đo lường mức độ rủi ro hoặc khả năng xảy ra của một sự kiện.

install.packages("epitools", repos = "https://cloud.r-project.org")
## Installing package into 'C:/Users/PC_Dell/AppData/Local/R/win-library/4.3'
## (as 'lib' is unspecified)
## package 'epitools' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\PC_Dell\AppData\Local\Temp\RtmpwbUzku\downloaded_packages
library(epitools)
# Gộp nhóm: Heavily addicted vs. Others
data$Addiction_Group <- ifelse(data$ADDICTED_LEVEL == "Heavily addicted", 
                               "Heavily addicted", 
                               "Not heavily addicted")

# Tạo bảng chéo với Sleep
table_addict_sleep <- table(data$Addiction_Group, data$SLEEP_LEVEL)

# Kiểm tra bảng
print(table_addict_sleep)
##                       
##                        BAD GOOD
##   Heavily addicted     276  329
##   Not heavily addicted   0  100
library(epitools)

riskratio(table_addict_sleep)
## $data
##                       
##                        BAD GOOD Total
##   Heavily addicted     276  329   605
##   Not heavily addicted   0  100   100
##   Total                276  429   705
## 
## $measure
##                       risk ratio with 95% C.I.
##                        estimate    lower    upper
##   Heavily addicted     1.000000       NA       NA
##   Not heavily addicted 1.838906 1.709476 1.978135
## 
## $p.value
##                       two-sided
##                        midp.exact fisher.exact   chi.square
##   Heavily addicted             NA           NA           NA
##   Not heavily addicted          0 1.705096e-24 4.780039e-18
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Risk Ratio (RR) là tỷ số giữa nguy cơ xảy ra một hiện tượng (như “ngủ đủ”) ở nhóm phơi nhiễm và nhóm không phơi nhiễm.

Công thức tổng quát:

\[ RR = \frac{\text{Tỷ lệ sự kiện ở nhóm không nghiện nặng}}{\text{Tỷ lệ sự kiện ở nhóm nghiện nặng}} \]

Trong trường hợp này, “sự kiện” là ngủ đủ (GOOD).

  • Tỷ lệ ngủ đủ ở nhóm Not heavily addicted:

\[ = \frac{\text{100}}{\text{100}} = 1 \]

  • Tỷ lệ ngủ đủ ở nhóm Heavily addicted:

\[ = \frac{\text{329}}{\text{605}} = 0.5438 \]

  • Risk Ratio

\[ RR = \frac{\text{1}}{\text{0.5438}} \]


Số liệu cụ thể trong bảng

Bảng tần suất giữa tình trạng nghiện và chất lượng giấc ngủ
Addiction.Level BAD..Thiếu.ngủ. GOOD..Ngủ.đủ. Total
Heavily addicted 276 329 605
Not heavily addicted 0 100 100

Nhận xét

  • nhóm tham chiếu được chọn là NHÓM NGHIÊN NẶNG

  • P-value cực kỳ nhỏ → loại bỏ giả thuyết H₀, cho thấy mối liên hệ giữa giấc ngủ và nghiện mạng xã hội là có ý nghĩa thống kê.

  • Nhóm “Not heavily addicted” có tỷ lệ có giấc ngủ tốt cao hơn 1.84 lần so với nhóm “Heavily addicted”.

  • -> Kết quả cho thấy sinh viên không nghiện mạng xã hội nặng có khả năng ngủ đủ cao hơn gần 2 lần so với sinh viên nghiện nặng. Điều này củng cố bằng chứng thống kê rằng nghiện mạng xã hội là một yếu tố rủi ro tiêu cực đối với chất lượng giấc ngủ. Do đó, việc giảm mức độ nghiện mạng xã hội có thể đóng vai trò quan trọng trong cải thiện sức khỏe giấc ngủ và chất lượng sống của sinh viên.

4.1.6 Odds ratio

# Gộp nhóm: Heavily addicted vs. Others
data$Addiction_Group <- ifelse(data$ADDICTED_LEVEL == "Heavily addicted", 
                               "Heavily addicted", 
                               "Not heavily addicted")

# Tạo bảng chéo với Sleep
table_addict_sleep <- table(data$Addiction_Group, data$SLEEP_LEVEL)

# Kiểm tra bảng
print(table_addict_sleep)
##                       
##                        BAD GOOD
##   Heavily addicted     276  329
##   Not heavily addicted   0  100
library(epitools)
# Thêm 0.5 để tránh chia cho 0
library(epitools)

oddsratio(table_addict_sleep + 0.5, method = "wald")
## Warning in fisher.test(xx): 'x' has been rounded to integer: Mean relative
## difference: 0.002828854
## Warning in fisher.test(x, or = or, alternative = "l"): 'x' has been rounded to
## integer: Mean relative difference: 0.002828854
## Warning in fisher.test(x, or = or, alternative = "g"): 'x' has been rounded to
## integer: Mean relative difference: 0.002828854
## $data
##                       
##                          BAD  GOOD Total
##   Heavily addicted     276.5 329.5   606
##   Not heavily addicted   0.5 100.5   101
##   Total                277.0 430.0   707
## 
## $measure
##                       odds ratio with 95% C.I.
##                        estimate    lower    upper
##   Heavily addicted       1.0000       NA       NA
##   Not heavily addicted 168.6692 10.42963 2727.737
## 
## $p.value
##                       two-sided
##                        midp.exact fisher.exact   chi.square
##   Heavily addicted             NA           NA           NA
##   Not heavily addicted          0  1.86261e-24 7.809761e-18
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

LƯU Ý

  • vì trong bảng có giá trị = 0 nên ta + thêm 0.5. Kỹ thuật này gọi là continuity correction hoặc Haldane-Anscombe correction được dùng khi bảng có chứa số 0, nhằm tránh lỗi chia cho 0 hoặc log(0) khi tính toán odds ratio (OR) và khoảng tin cậy. Việc cộng thêm 0.5 vào mỗi ô giúp ước lượng ổn định hơn trong các bảng nhỏ hoặc mất cân đối.

  • method = “wald”

  • Chỉ định phương pháp tính khoảng tin cậy (CI) cho Odds Ratio:

  • “wald”: sử dụng ước lượng Wald dựa trên phân phối chuẩn. Đây là cách phổ biến, đơn giản và cho kết quả gần đúng nhanh.

GIẢI THÍCH CÁCH TÍNH OR

\[ OR = \frac{\text{odds của heavily addicted}}{\text{odds của Not heavily addicted}} = \frac{\text{0.839}}{\text{0.00498}} = 168.67 \]

Nhận xét - nhóm tham chiếu được chọn là nghiện nặng

  • Dựa trên kết quả phân tích Odds Ratio (OR), với độ tin cậy 95% . p-value cực kỳ nhỏ (≈ 0) ⇒ bác bỏ giả thuyết H₀, tồn tại Mối liên hệ có ý nghĩa thống kê

  • Hệ số rất lớn (OR = 168) cho ta thấy Nhóm “Not heavily addicted” (không nghiện nặng) có khả năng có giấc ngủ tốt cao hơn khoảng 169 lần so với nhóm “Heavily addicted”.

- Kết quả cho thấy sinh viên không nghiện mạng xã hội nặng có khả năng ngủ đủ cao hơn đáng kể so với những sinh viên nghiện nặng. Điều này củng cố lập luận rằng việc nghiện mạng xã hội có thể là yếu tố nguy cơ quan trọng gây ra thiếu ngủ. Hướng nghiên cứu này gợi ý về mối liên hệ nhân quả có thể có giữa hành vi sử dụng mạng xã hội và chất lượng giấc ngủ, và đặt nền tảng cho các chương trình can thiệp nhằm giảm mức độ sử dụng mạng xã hội để cải thiện sức khỏe giấc ngủ.

4.1.7 Kết luận chung

  • Tình trạng này là một cảnh báo nghiêm túc về lối sống thiếu kiểm soát công nghệ của sinh viên hiện nay. Việc xây dựng các chương trình quản lý thời gian sử dụng mạng xã hội và giáo dục sức khỏe giấc ngủ nên được xem là ưu tiên trong môi trường đại học.
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiTmd1eeG7hW4gUGjDumMgVGjhu4tuaCINCmRhdGU6ICIyMDI1LTA2LTExIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIyAqKlBI4bqmTiAxOiBUw4xNIEhJ4buCVSBWw4AgQ0hV4bqoTiBC4buKIEThu64gTEnhu4ZVKioNCg0KIyMjICoqMS4xIMSQ4buMQyBE4buuIExJ4buGVSoqDQoNCi0gQuG7mSBk4buvIGxp4buHdSAiU3R1ZGVudCBTb2NpYWwgTWVkaWEgJiBSZWxhdGlvbnNoaXBzIiBjaOG7qWEgY8OhYyBi4bqjbiBnaGkg4bqpbiBkYW5oIHbhu4EgaMOgbmggdmkgbeG6oW5nIHjDoyBo4buZaSBj4bunYSBzaW5oIHZpw6puIHbDoCBjw6FjIGvhur90IHF14bqjIGN14buZYyBz4buRbmcgbGnDqm4gcXVhbi4gQuG7mSBk4buvIGxp4buHdSBuw6B5IHRy4bqjaSBkw6BpIHRyw6puIG5oaeG7gXUgcXXhu5FjIGdpYSB2w6AgdHLDrG5oIMSR4buZIGjhu41jIHbhuqVuLCB04bqtcCB0cnVuZyB2w6BvIGPDoWMgY2hp4buBdSBjaMOtbmggbmjGsCBjxrDhu51uZyDEkeG7mSBz4butIGThu6VuZywgc+G7nyB0aMOtY2ggbuG7gW4gdOG6o25nIHbDoCDEkeG7mW5nIGzhu7FjIG3hu5FpIHF1YW4gaOG7hy4gTeG7l2kgaMOgbmcgxJHhuqFpIGRp4buHbiBjaG8gbeG7mXQgcGjhuqNuIGjhu5NpIGto4bqjbyBzw6F0IGPhu6dhIHNpbmggdmnDqm4sIGN1bmcgY+G6pXAg4bqjbmggY2jhu6VwIG5oYW5oIHRoZW8gY2hp4buBdSBuZ2FuZyBwaMO5IGjhu6NwIGNobyBwaMOibiB0w61jaCB0aOG7kW5nIGvDqiB2w6AgY8OhYyDhu6luZyBk4bulbmcgaOG7jWMgbcOheS4NCg0KLSDEkOG7kWkgdMaw4bujbmc6IEjhu41jIHNpbmggdHJvbmcgxJHhu5kgdHXhu5VpIHThu6sgMTYgxJHhur9uIDI1IMSRYW5nIHRoZW8gaOG7jWMgY2jGsMahbmcgdHLDrG5oIHRydW5nIGjhu41jLCDEkeG6oWkgaOG7jWMgaG/hurdjIHNhdSDEkeG6oWkgaOG7jWMuDQoNCi0gxJDhu4thIGzDvTogUGjhuqFtIHZpIG5oaeG7gXUgcXXhu5FjIGdpYSAodsOtIGThu6U6IEJhbmdsYWRlc2gsIOG6pG4gxJDhu5ksIEhvYSBL4buzLCBWxrDGoW5nIHF14buRYyBBbmgsIENhbmFkYSwgw5pjLCDEkOG7qWMsIEJyYXppbCwgTmjhuq10IELhuqNuLCBIw6BuIFF14buRYykuDQoNCi0gS2h1bmcgdGjhu51pIGdpYW46IEThu68gbGnhu4d1IMSRxrDhu6NjIHRodSB0aOG6rXAgdGjDtG5nIHF1YSBraOG6o28gc8OhdCB0cuG7sWMgdHV54bq/biBt4buZdCBs4bqnbiDEkcaw4bujYyB0aOG7sWMgaGnhu4duIHbDoG8gcXXDvSAxIG7Eg20gMjAyNS4NCg0KDQojIyMjICoqMS4xLjEgxJDhu41jIGZpbGUgZOG7ryBsaeG7h3UgZ+G7kWMqKg0KDQpgYGB7cn0NCmxpYnJhcnkoeGxzeCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdtb2RlbHMpDQoNCmRhdGEgPC0gcmVhZC54bHN4KGZpbGUgPSAiQzovVXNlcnMvUENfRGVsbC9Eb3dubG9hZHMvU3R1ZGVudHNfU29jaWFsX01lZGlhX0FkZGljdGlvbi54bHN4Iiwgc2hlZXRJbmRleCA9IDEsIGhlYWRlciA9IFQpDQpgYGANCg0KLSAqKkPhuqV1IHRyw7pjIGLhu5kgZOG7ryBsaeG7h3UqKg0KDQpgYGB7cn0NCnN0cihkYXRhKQ0KYGBgDQoNCiMjIyAqKjEuMi4gVOG7lE5HIFFVQU4gVuG7gCBE4buuIExJ4buGVSoqDQoNCiMjIyMgKioxLjIuMSBEYW5oIHPDoWNoIGPDoWMgYmnhur9uIHbDoCBtw7QgdOG6oyoqDQoNCioqQmnhur9uIMSR4buLbmggbMaw4bujbmcgKE51bWVyaWMgVmFyaWFibGVzKSoqDQoNCnwgVMOqbiBiaeG6v24gICAgICAgICAgICAgICAgfCBLaeG7g3UgZOG7ryBsaeG7h3UgfCBNw7QgdOG6oyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVsOtIGThu6UgICAgICAgICAgICAgIHwNCnwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgYEFnZWAgICAgICAgICAgICAgICAgICAgfCBudW1lcmljICAgICAgfCBUdeG7lWkgY+G7p2EgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQgICAgICAgICAgICAgICAgICB8IDE4LCAyMCwgMjEsIDIzICAgICB8DQp8IGBBdmdfRGFpbHlfVXNhZ2VfSG91cnNgIHwgbnVtZXJpYyAgICAgIHwgVGjhu51pIGdpYW4gdHJ1bmcgYsOsbmggc+G7rSBk4bulbmcgbeG6oW5nIHjDoyBo4buZaSBt4buXaSBuZ8OgeSB8IDIuMSwgNC41LCA1LjgsIDcuMiB8DQoNCioqQmnhur9uIMSR4buLbmggdMOtbmggKENhdGVnb3JpY2FsIFZhcmlhYmxlcykqKg0KDQp8IFTDqm4gYmnhur9uICAgICAgICAgICAgICAgICAgICAgICB8IEtp4buDdSBk4buvIGxp4buHdSB8IE3DtCB04bqjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFbDrSBk4bulIGdpw6EgdHLhu4sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8DQp8IGBHZW5kZXJgICAgICAgICAgICAgICAgICAgICAgICB8IGNoYXJhY3RlciAgICB8IEdp4bubaSB0w61uaCBj4bunYSBuZ8aw4budaSB0aGFtIGdpYSAgICAgICAgICAgICAgIHwgIk1hbGUiLCAiRmVtYWxlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYEFjYWRlbWljX0xldmVsYCAgICAgICAgICAgICAgIHwgY2hhcmFjdGVyICAgIHwgVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIGhp4buHbiB04bqhaSAgICAgICAgICAgICAgICAgIHwgIlVuZGVyZ3JhZHVhdGUiLCAiR3JhZHVhdGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYENvdW50cnlgICAgICAgICAgICAgICAgICAgICAgIHwgY2hhcmFjdGVyICAgIHwgUXXhu5FjIGdpYSBjxrAgdHLDuiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICJVU0EiLCAiSW5kaWEiLCAiVUsiLCAiQmFuZ2xhZGVzaCIgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBNb3N0X1VzZWRfUGxhdGZvcm1gICAgICAgICAgICB8IGNoYXJhY3RlciAgICB8IE3huqFuZyB4w6MgaOG7mWkgxJHGsOG7o2Mgc+G7rSBk4bulbmcgbmhp4buBdSBuaOG6pXQgICAgICAgIHwgIlRpa1RvayIsICJJbnN0YWdyYW0iLCAiWW91VHViZSIgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYEFmZmVjdHNfQWNhZGVtaWNfUGVyZm9ybWFuY2VgIHwgY2hhcmFjdGVyICAgIHwgTeG6oW5nIHjDoyBo4buZaSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGjhu41jIHThuq1wIGtow7RuZyB8ICJZZXMiLCAiTm8iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8IGBSZWxhdGlvbnNoaXBfU3RhdHVzYCAgICAgICAgICB8IGNoYXJhY3RlciAgICB8IFTDrG5oIHRy4bqhbmcgbeG7kWkgcXVhbiBo4buHIGhp4buHbiB04bqhaSAgICAgICAgICAgIHwgIlNpbmdsZSIsICJJbiBSZWxhdGlvbnNoaXAiLCAiQ29tcGxpY2F0ZWQiICAgICAgICAgICAgICAgIHwNCnwgYE1FTlRBTF9IRUFMVEhgICAgICAgICAgICAgICAgIHwgY2hhcmFjdGVyICAgIHwgVMOsbmggdHLhuqFuZyBz4bupYyBraOG7j2UgdGluaCB0aOG6p24gICAgICAgICAgICAgIHwgIkdPT0QiLCAiQkFEIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYFNMRUVQX0xFVkVMYCAgICAgICAgICAgICAgICAgIHwgY2hhcmFjdGVyICAgIHwgQ2jhuqV0IGzGsOG7o25nIGdp4bqlYyBuZ+G7pyAgICAgICAgICAgICAgICAgICAgICAgIHwgIkdPT0QiLCAiQkFEIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgYENPTkZMSVRfTEVWRUxgICAgICAgICAgICAgICAgIHwgY2hhcmFjdGVyICAgIHwgTeG7qWMgxJHhu5kgbcOidSB0aHXhuqtuIGRvIG3huqFuZyB4w6MgaOG7mWkgZ8OieSByYSAgICAgfCAiTG93IGNvbmZsaWN0IiwgIk1vZGVyYXRlIGNvbmZsaWN0IiwgIkhpZ2ggY29uZmxpY3QiICAgICAgfA0KfCBgQURESUNURURfTEVWRUxgICAgICAgICAgICAgICAgfCBjaGFyYWN0ZXIgICAgfCBN4bupYyDEkeG7mSBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpICAgICAgICAgICAgICAgICAgfCAiTm90IGFkZGljdGVkIiwgIk1vZGVyYXRlbHkgYWRkaWN0ZWQiLCAiSGVhdmlseSBhZGRpY3RlZCIgfA0KDQoNCg0KIyMjIyAqKjEuMi4zIEtp4buDbSB0cmEgZOG7ryBsaeG7h3UqKg0KDQojIyMjIyAqKjEuMi4zLjEgS2nhu4NtIHRyYSBz4buRIGzGsOG7o25nIE5BIHRyb25nIGPhu5l0IMSR4buLbmggdMOtbmgqKg0KDQpgYGB7cn0NCiMgS2nhu4NtIHRyYSBz4buRIGzGsOG7o25nIE5BIHRyb25nIG3hu5dpIGPhu5l0IMSR4buLbmggdMOtbmgNCm5hX2NvdW50cyA8LSBzYXBwbHkoZGF0YSwgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkNCm5hX2NvdW50cw0KYGBgDQoNCg0KKipOaOG6rW4geMOpdCoqIA0KLSBL4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgY2hvIHRo4bqleSBy4bqxbmcgdOG6pXQgY+G6oyBjw6FjIGPhu5l0IMSR4buLbmggdMOtbmggxJHhu4F1IGtow7RuZyBjw7MgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkgdsOsIHPhu5EgbMaw4bujbmcgTkEgdHJvbmcgY8OhYyBj4buZdCDEkeG7gXUgaGnhu4NuIHRo4buLIGzDoCAwDQoNCiMjIyMjICoqMS4yLjMuMiBDaHV54buDbiDEkeG7lWkgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBzYW5nIGtp4buDdSBmYWN0b3IqKg0KDQpgYGB7cn0NCiMgQ2h1eeG7g24gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBzYW5nIGZhY3Rvcg0KZGF0YSRBZ2UgPC0gYXMuZmFjdG9yKGRhdGEkQWdlKQ0KZGF0YSRHZW5kZXIgPC0gYXMuZmFjdG9yKGRhdGEkR2VuZGVyKQ0KZGF0YSRBY2FkZW1pY19MZXZlbCA8LSBhcy5mYWN0b3IoZGF0YSRBY2FkZW1pY19MZXZlbCkNCmRhdGEkQ291bnRyeSA8LSBhcy5mYWN0b3IoZGF0YSRDb3VudHJ5KQ0KZGF0YSRNb3N0X1VzZWRfUGxhdGZvcm0gPC0gYXMuZmFjdG9yKGRhdGEkTW9zdF9Vc2VkX1BsYXRmb3JtKQ0KZGF0YSRBZmZlY3RzX0FjYWRlbWljX1BlcmZvcm1hbmNlIDwtIGFzLmZhY3RvcihkYXRhJEFmZmVjdHNfQWNhZGVtaWNfUGVyZm9ybWFuY2UpDQpkYXRhJFNMRUVQX0xFVkVMIDwtIGFzLmZhY3RvcihkYXRhJFNMRUVQX0xFVkVMKQ0KZGF0YSRNRU5UQUxfSEVBTFRIIDwtIGFzLmZhY3RvcihkYXRhJE1FTlRBTF9IRUFMVEgpDQpkYXRhJEFERElDVEVEX0xFVkVMIDwtIGFzLmZhY3RvcihkYXRhJEFERElDVEVEX0xFVkVMKQ0KZGF0YSRSZWxhdGlvbnNoaXBfU3RhdHVzIDwtIGFzLmZhY3RvcihkYXRhJFJlbGF0aW9uc2hpcF9TdGF0dXMpDQpkYXRhJENPTkZMSVRfTEVWRUwgPC0gYXMuZmFjdG9yKGRhdGEkQ09ORkxJVF9MRVZFTCkNCmBgYA0KDQoqKktp4buDbSB0cmEgbOG6oWkgc2F1IGtoaSBjaHV54buDbiDEkeG7lWkqKg0KDQpHaeG6o2kgdGjDrWNoOg0KDQotIHNhcHBseShkYXRhLCBjbGFzcyk6IMOBcCBk4bulbmcgaMOgbSBjbGFzcygpIGNobyB04burbmcgY+G7mXQgxJHhu4Mga2nhu4NtIHRyYSBraeG7g3UgZOG7ryBsaeG7h3UuIEvhur90IHF14bqjIHRy4bqjIHbhu4EgbMOgIG3hu5l0IHZlY3RvciBoaeG7g24gdGjhu4sgdMOqbiBj4buZdCB2w6AgbG/huqFpIGThu68gbGnhu4d1IHTGsMahbmcg4bupbmcuDQoNCi0gTuG6v3Uga+G6v3QgcXXhuqMgbMOgICJmYWN0b3IiIGNobyB04bqldCBj4bqjIGPDoWMgY+G7mXQg4oaSIGNodXnhu4NuIMSR4buVaSB0aMOgbmggY8O0bmcuDQoNCmBgYHtyfQ0Kc2FwcGx5KGRhdGEsIGNsYXNzKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKiA6IEvhur90IHF14bqjIHRodSDEkcaw4bujYyB0b8OgbiBi4buZIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggxJHDoyDEkcaw4bujYyBjaHV54buDbiDEkeG7lWkgdGjDoG5oIGThuqFuZyBmYWN0b3IuDQoNCiMjICoqUEjhuqZOIDI6IFBIw4JOIFTDjUNIIE3DlCBU4bqiIEJJ4bq+TiDEkOG7ik5IIFTDjU5IKioNCg0KYGBge3J9DQppbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIiwgcmVwb3MgPSAiaHR0cHM6Ly9jbG91ZC5yLXByb2plY3Qub3JnIikNCmxpYnJhcnkoZ2dwbG90MikNCmBgYA0KDQojIyMgKioyLjEuIEdlbmRlciAtIEdp4bubaSB0w61uaCoqDQoNCiMjIyMgKioyLjEuMSBUaOG7kW5nIGvDqiB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCnRhYl9nZW5kZXIgPC0gdGFibGUoZGF0YSRHZW5kZXIpDQp0YWJfZ2VuZGVyDQp0YWJsZShkYXRhJEdlbmRlcikvc3VtKG5yb3coZGF0YSkpDQpgYGANCg0KIyMjIyMgKioyLjEuMS4yIFRy4buxYyBxdWFuIGhvw6EqKg0KDQpgYGB7cn0NCiMgVOG6oW8gZGF0YWZyYW1lIHThu6sgYuG6o25nIHThuqduIHPhu5ENCmdlbmRlcl9mcmVxIDwtIGFzLmRhdGEuZnJhbWUodGFiX2dlbmRlcikNCmNvbG5hbWVzKGdlbmRlcl9mcmVxKSA8LSBjKCJHZW5kZXIiLCAiRnJlcXVlbmN5IikNCg0KIyBUw61uaCBwaOG6p24gdHLEg20NCmdlbmRlcl9mcmVxJFBlcmNlbnRhZ2UgPC0gZ2VuZGVyX2ZyZXEkRnJlcXVlbmN5IC8gc3VtKGdlbmRlcl9mcmVxJEZyZXF1ZW5jeSkgKiAxMDANCg0KIyBU4bqhbyBuaMOjbiBjaOG7iSBn4buTbSBwaOG6p24gdHLEg20NCmdlbmRlcl9mcmVxJExhYmVsIDwtIHBhc3RlMChyb3VuZChnZW5kZXJfZnJlcSRQZXJjZW50YWdlLCAxKSwgIiUiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuIHbhu5tpIG5ow6NuIGNo4buJIHBo4bqnbiB0csSDbQ0KZ2dwbG90KGdlbmRlcl9mcmVxLCBhZXMoeCA9ICIiLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IEdlbmRlcikpICsNCiAgZ2VvbV9jb2wod2lkdGggPSAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IExhYmVsKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIHNpemUgPSA1KSArDQogIGxhYnModGl0bGUgPSAiUGjDom4gYuG7kSBnaeG7m2kgdMOtbmggY+G7p2Egc2luaCB2acOqbiIpICsNCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwxIikNCg0KYGBgDQoNCiMjIyMgKioyLjEuMiBOaOG6rW4geMOpdCoqDQoNCkJp4buDdSDEkeG7kyB0csOybiB0aOG7gyBoaeG7h24gcGjDom4gYuG7kSBnaeG7m2kgdMOtbmggdHJvbmcgYuG7mSBk4buvIGxp4buHdSBzaW5oIHZpw6puIGNobyB0aOG6pXkgdOG7tyBs4buHIGdp4buvYSBuYW0gdsOgIG7hu68gbMOgIGfhuqduIG5oxrAgdMawxqFuZyDEkcawxqFuZzoNCg0KLSBO4buvIGNoaeG6v20gNTAuMSUgKDM1MyBuZ8aw4budaSkNCg0KLSBOYW0gY2hp4bq/bSA0OS45JSAoMzUyIG5nxrDhu51pKQ0KDQotIFPhu7EgY2jDqm5oIGzhu4djaCBnaeG7r2EgaGFpIG5ow7NtIGzDoCBraMO0bmcgxJHDoW5nIGvhu4MgKGNo4buJIDEgbmfGsOG7nWkpLCDEkWnhu4F1IG7DoHkgY2hvIHRo4bqleSBi4buZIGThu68gbGnhu4d1IGPDsyBjw6JuIGLhurFuZyB24buBIGdp4bubaSB0w61uaCwgcGjDuSBo4bujcCDEkeG7gyB0aeG6v24gaMOgbmggY8OhYyBwaMOibiB0w61jaCBzbyBzw6FuaCB0aGVvIGdp4bubaSBtw6Aga2jDtG5nIGxvIHRoacOqbiBs4buHY2ggbeG6q3UuDQoNCi0gVmnhu4djIGPDsyBz4buxIHBow6JuIHBo4buRaSBnaeG7m2kgdMOtbmggxJHhu5NuZyDEkeG7gXUgbMOgIG3hu5l0IHnhur91IHThu5EgcXVhbiB0cuG7jW5nIGdpw7pwIHTEg25nIMSR4buZIHRpbiBj4bqteSBraGkga2nhu4NtIMSR4buLbmggY8OhYyBnaeG6oyB0aHV54bq/dCBsacOqbiBxdWFuIMSR4bq/biBnaeG7m2ksIG5oxrA6DQoNCiAgLSBTbyBzw6FuaCBt4bupYyDEkeG7mSBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIGdp4buvYSBuYW0gdsOgIG7hu68NCg0KICAtIE3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZ2nhu5tpIHTDrW5oIHbDoCBz4bupYyBraOG7j2UgdGluaCB0aOG6p24NCg0KICAtIFTDoWMgxJHhu5luZyBj4bunYSBt4bqhbmcgeMOjIGjhu5lpIMSR4bq/biBo4buNYyB04bqtcCB0aGVvIGdp4bubaQ0KDQojIyMgKioyLjIuIFRyw6xuaCDEkeG7mSBo4buNYyB24bqlbioqDQoNCiMjIyMgKioyLjIuMSBUaOG7kW5nIGvDqiB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCmxldmVsX2ZyZXEgPC0gdGFibGUoZGF0YSRBY2FkZW1pY19MZXZlbCkNCmxldmVsX3BlcmNlbnQgPC0gcHJvcC50YWJsZShsZXZlbF9mcmVxKSAqIDEwMA0KZGF0YS5mcmFtZShBY2FkZW1pY19MZXZlbCA9IG5hbWVzKGxldmVsX2ZyZXEpLA0KICAgICAgICAgICBGcmVxdWVuY3kgPSBhcy5udW1lcmljKGxldmVsX2ZyZXEpLA0KICAgICAgICAgICBQZXJjZW50YWdlID0gcm91bmQoYXMubnVtZXJpYyhsZXZlbF9wZXJjZW50KSwgMSkpDQpgYGANCg0KIyMjIyMgKioyLjEuMS4yIFRy4buxYyBxdWFuIGhvw6EqKg0KDQpgYGB7cn0NCiMgTG9hZCB0aMawIHZp4buHbg0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShSQ29sb3JCcmV3ZXIpICAjIGTDuW5nIGNobyBwYWxldHRlIG3DoHUNCg0KIyBIw6BtIHTDoWkgc+G7rSBk4bulbmcgxJHhu4MgeOG7rSBsw70gdsOgIHbhur0gYmnhu4N1IMSR4buTDQpwbG90X3BpZSA8LSBmdW5jdGlvbihkYXRhLCB2YXIsIHRpdGxlKSB7DQogIHRhYiA8LSB0YWJsZShkYXRhW1t2YXJdXSkNCiAgZGYgPC0gYXMuZGF0YS5mcmFtZSh0YWIpDQogIGNvbG5hbWVzKGRmKSA8LSBjKCJDYXRlZ29yeSIsICJGcmVxdWVuY3kiKQ0KICBkZiRQZXJjZW50YWdlIDwtIGRmJEZyZXF1ZW5jeSAvIHN1bShkZiRGcmVxdWVuY3kpICogMTAwDQogIGRmJExhYmVsIDwtIHBhc3RlMChyb3VuZChkZiRQZXJjZW50YWdlLCAxKSwgIiUiKQ0KICANCiAgZ2dwbG90KGRmLCBhZXMoeCA9ICIiLCB5ID0gUGVyY2VudGFnZSwgZmlsbCA9IENhdGVnb3J5KSkgKw0KICAgIGdlb21fY29sKHdpZHRoID0gMSwgY29sb3IgPSAid2hpdGUiKSArDQogICAgY29vcmRfcG9sYXIodGhldGEgPSAieSIpICsNCiAgICB0aGVtZV92b2lkKCkgKw0KICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBMYWJlbCksIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLCBzaXplID0gNSkgKw0KICAgIGxhYnModGl0bGUgPSB0aXRsZSwgZmlsbCA9IHZhcikgKw0KICAgIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMSIpDQp9DQpwbG90X3BpZShkYXRhLCAiQWNhZGVtaWNfTGV2ZWwiLCAiUGjDom4gYuG7kSB0csOsbmggxJHhu5kgaOG7jWMgduG6pW4gY+G7p2Egc2luaCB2acOqbiIpDQpgYGANCg0KDQojIyMjICoqMi4yLjIgTmjhuq1uIHjDqXQqKg0KDQotIFBo4bqnbiBs4bubbiBzaW5oIHZpw6puIHRodeG7mWMgYuG6rWMgxJHhuqFpIGjhu41jIChVbmRlcmdyYWR1YXRlKSAoNTAuMSUpLCB0aeG6v3AgdGhlbyBsw6Agc2F1IMSR4bqhaSBo4buNYyAoR3JhZHVhdGUpICg0Ni4xJSksIHRyb25nIGtoaSBi4bqtYyB0cnVuZyBo4buNYyAoSGlnaCBTY2hvb2wpIGNo4buJIGNoaeG6v20gMy44JS4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIMSRYSBz4buRIG5nxrDhu51pIHRoYW0gZ2lhIGto4bqjbyBzw6F0IGzDoCBzaW5oIHZpw6puIMSR4bqhaSBo4buNYyB0cuG7nyBsw6puLg0KDQoNCiMjIyAqKjIuMy4gVMOhYyDEkeG7mW5nIGPhu6dhIG3huqFuZyB4w6MgaOG7mWkgxJHhur9uIGjhu41jIHThuq1wKioNCg0KIyMjIyAqKjIuMy4xIFRo4buRbmcga8OqIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQpgYGB7cn0NCmFmZmVjdF9mcmVxIDwtIHRhYmxlKGRhdGEkQWZmZWN0c19BY2FkZW1pY19QZXJmb3JtYW5jZSkNCmFmZmVjdF9wZXJjZW50IDwtIHByb3AudGFibGUoYWZmZWN0X2ZyZXEpICogMTAwDQpkYXRhLmZyYW1lKEFmZmVjdHMgPSBuYW1lcyhhZmZlY3RfZnJlcSksDQogICAgICAgICAgIEZyZXF1ZW5jeSA9IGFzLm51bWVyaWMoYWZmZWN0X2ZyZXEpLA0KICAgICAgICAgICBQZXJjZW50YWdlID0gcm91bmQoYXMubnVtZXJpYyhhZmZlY3RfcGVyY2VudCksIDEpKQ0KYGBgDQojIyMjICoqMi4zLjEuMSB0cuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQpwbG90X3BpZShkYXRhLCAiQWZmZWN0c19BY2FkZW1pY19QZXJmb3JtYW5jZSIsICJUw6FjIMSR4buZbmcgY+G7p2EgbeG6oW5nIHjDoyBo4buZaSDEkeG6v24gaOG7jWMgdOG6rXAiKQ0KYGBgDQoNCiMjIyMgKioyLjMuMiBOaOG6rW4geMOpdCoqDQoNCi0gS2hv4bqjbmcgNjQuMyUgc2luaCB2acOqbiBjaG8gcuG6sW5nIG3huqFuZyB4w6MgaOG7mWkg4bqjbmggaMaw4bufbmcgxJHhur9uIGvhur90IHF14bqjIGjhu41jIHThuq1wIGPhu6dhIGjhu40sIGNobyB0aOG6pXkgdMOhYyDEkeG7mW5nIHRpw6p1IGPhu7FjIGPhu6dhIG3huqFuZyB4w6MgaOG7mWkgbMOgIG3hu5l0IHbhuqVuIMSR4buBIMSRw6FuZyBsxrB1IHTDom0gdHJvbmcgbcO0aSB0csaw4budbmcgZ2nDoW8gZOG7pWMuDQoNCg0KIyMjICoqMi40LiBUw6xuaCB0cuG6oW5nIG3hu5FpIHF1YW4gaOG7hyoqDQoNCiMjIyMgKioyLjQuMSBUaOG7kW5nIGvDqiB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQoNCmBgYHtyfQ0KcmVsX2ZyZXEgPC0gdGFibGUoZGF0YSRSZWxhdGlvbnNoaXBfU3RhdHVzKQ0KcmVsX3BlcmNlbnQgPC0gcHJvcC50YWJsZShyZWxfZnJlcSkgKiAxMDANCmRhdGEuZnJhbWUoUmVsYXRpb25zaGlwX1N0YXR1cyA9IG5hbWVzKHJlbF9mcmVxKSwNCiAgICAgICAgICAgRnJlcXVlbmN5ID0gYXMubnVtZXJpYyhyZWxfZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKHJlbF9wZXJjZW50KSwgMSkpDQpgYGANCg0KIyMjIyMgKioyLjQuMS4xIFRy4buxYyBxdWFuIGhvw6EqKg0KDQpgYGB7cn0NCnBsb3RfcGllKGRhdGEsICJSZWxhdGlvbnNoaXBfU3RhdHVzIiwgIlBow6JuIGLhu5EgdMOsbmggdHLhuqFuZyBt4buRaSBxdWFuIGjhu4ciKQ0KDQpgYGANCg0KDQojIyMjICoqMi40LjIgTmjhuq1uIHjDqXQqKg0KDQotIFBo4bqnbiBs4bubbiBzaW5oIHZpw6puIMSRYW5nIMSR4buZYyB0aMOibiAoNTQuNSUpLCB0aeG6v3AgdGhlbyBsw6AgxJFhbmcgdHJvbmcgbeG7kWkgcXVhbiBo4buHICg0MSUpLiBDaOG7iSA0LjUlIGNo4buNbiDigJxwaOG7qWMgdOG6oXDigJ0sIGNobyB0aOG6pXkgbmjDs20gY8OzIHTDrG5oIHRy4bqhbmcgcXVhbiBo4buHIGtow7RuZyByw7UgcsOgbmcgY2hp4bq/bSB04bu3IGzhu4cgcuG6pXQgbmjhu48uIFbDoCBjxaluZyBjaG8gdGEgdGjhuqV5IHLhurFuZyBt4bqrdSBraOG6o28gc8OhdCBy4bqldCDEkeG7k25nIMSR4buBdSB24buBIHThu7cgbOG7hyBnaeG7r2EgdMOsbmggdHLhuqFuZyBt4buRaSBxdWFuIGjhu4cNCg0KIyMjICoqMi41LiBQaMOibiBsb+G6oWkgc+G7qWMga2jhu49lIHRpbmggdGjhuqduKioNCg0KIyMjIyAqKjIuNS4xIFRo4buRbmcga8OqIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KbWhfZnJlcSA8LSB0YWJsZShkYXRhJE1FTlRBTF9IRUFMVEgpDQptaF9wZXJjZW50IDwtIHByb3AudGFibGUobWhfZnJlcSkgKiAxMDANCmRhdGEuZnJhbWUoTUVOVEFMX0hFQUxUSCA9IG5hbWVzKG1oX2ZyZXEpLA0KICAgICAgICAgICBGcmVxdWVuY3kgPSBhcy5udW1lcmljKG1oX2ZyZXEpLA0KICAgICAgICAgICBQZXJjZW50YWdlID0gcm91bmQoYXMubnVtZXJpYyhtaF9wZXJjZW50KSwgMSkpDQpgYGANCg0KIyMjIyMgKioyLjUuMS4xIFRy4buxYyBxdWFuIGhvw6EqKg0KDQpgYGB7cn0NCnBsb3RfcGllKGRhdGEsICJNRU5UQUxfSEVBTFRIIiwgIlBow6JuIGxv4bqhaSBz4bupYyBraOG7j2UgdGluaCB0aOG6p24iKQ0KYGBgDQoNCg0KIyMjIyAqKjIuNS4yIE5o4bqtbiB4w6l0KioNCg0KLSBCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBjw7MgNzEuMyUgc2luaCB2acOqbiBjw7Mgc+G7qWMga2jhu49lIHRpbmggdGjhuqduIHThu5F0LCB0cm9uZyBraGkgMjguNyUgY8OzIHPhu6ljIGto4buPZSB0aW5oIHRo4bqnbiBrw6ltLg0KDQotIE3hurdjIGTDuSBwaOG6p24gbOG7m24gc2luaCB2acOqbiBkdXkgdHLDrCDEkcaw4bujYyB0cuG6oW5nIHRow6FpIHRpbmggdGjhuqduIHTDrWNoIGPhu7FjLCB04bu3IGzhu4cgMjguNyUgZ+G6t3AgduG6pW4gxJHhu4EgduG7gSBz4bupYyBraOG7j2UgdMOibSBsw70gbMOgIG3hu5l0IGNvbiBz4buRIMSRw6FuZyBsxrB1IMO9LiDEkGnhu4F1IG7DoHkgcGjhuqNuIMOhbmggbmh1IGPhuqd1IGPhuqduIHRoaeG6v3QgduG7gSBjw6FjIGNoxrDGoW5nIHRyw6xuaCBo4buXIHRy4bujIHTDom0gbMO9IHRyb25nIG3DtGkgdHLGsOG7nW5nIGdpw6FvIGThu6VjIMSR4bqhaSBo4buNYywgxJHhurdjIGJp4buHdCB0cm9uZyBi4buRaSBj4bqjbmggw6FwIGzhu7FjIGjhu41jIHThuq1wIHbDoCDhuqNuaCBoxrDhu59uZyB04burIG3huqFuZyB4w6MgaOG7mWkgbmfDoHkgY8OgbmcgZ2lhIHTEg25nLg0KDQojIyMgKioyLjYuIE3hu6ljIMSR4buZIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkqKg0KDQojIyMjICoqMi42LjEgVGjhu5FuZyBrw6ogdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCB0cuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQoNCmFkZGljdF9mcmVxIDwtIHRhYmxlKGRhdGEkQURESUNURURfTEVWRUwpDQphZGRpY3RfcGVyY2VudCA8LSBwcm9wLnRhYmxlKGFkZGljdF9mcmVxKSAqIDEwMA0KZGF0YS5mcmFtZShBRERJQ1RFRF9MRVZFTCA9IG5hbWVzKGFkZGljdF9mcmVxKSwNCiAgICAgICAgICAgRnJlcXVlbmN5ID0gYXMubnVtZXJpYyhhZGRpY3RfZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKGFkZGljdF9wZXJjZW50KSwgMSkpDQpgYGANCg0KIyMjIyMgKioyLjYuMS4xIFRy4buxYyBxdWFuIGhvw6EqKg0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQoNCiMgVMOtbmggdOG6p24gc3XhuqV0DQpkYXRhICU+JQ0KICBjb3VudChBRERJQ1RFRF9MRVZFTCkgJT4lDQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIoQURESUNURURfTEVWRUwsIC1uKSwgeSA9IG4sIGZpbGwgPSBBRERJQ1RFRF9MRVZFTCkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHdpZHRoID0gMC42KSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQobiAvIHN1bShuKSAqIDEwMCwgMSksICIlIikpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTAuNSwgc2l6ZSA9IDQpICsNCiAgbGFicyh0aXRsZSA9ICJN4bupYyDEkeG7mSBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIiwNCiAgICAgICB4ID0gIk3hu6ljIMSR4buZIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmcgc2luaCB2acOqbiIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQpgYGANCg0KDQojIyMjICoqMi42LjIgTmjhuq1uIHjDqXQqKg0KDQotIEJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBzaW5oIHZpw6puIHRyb25nIG3huqt1IGto4bqjbyBzw6F0IMSRYW5nIOG7nyB0w6xuaCB0cuG6oW5nIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkg4bufIG3hu6ljIMSR4buZIG7hurduZywgY2hp4bq/bSB04bubaSA4NS44JS4gVHJvbmcga2hpIMSRw7MsIGNo4buJIGPDsyBraG/huqNuZyAxNCUgxJHGsOG7o2MgeOG6v3AgdsOgbyBuaMOzbSBuZ2hp4buHbiB24burYSBwaOG6o2ksIHbDoCBjaMawYSDEkeG6v24gMSUgKDAuMSUpIGzDoCBraMO0bmcgbmdoaeG7h24gKFPhu6wgROG7pE5HIE1YSCA8IDIgVEnhur5ORyBN4buWSSBOR8OAWSkuDQoNCi0gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbeG7qWMgxJHhu5kgcGjhu6UgdGh14buZYyB2w6BvIG3huqFuZyB4w6MgaOG7mWkgdHJvbmcgxJHhu51pIHPhu5FuZyBzaW5oIHZpw6puIGzDoCBy4bqldCDEkcOhbmcgbG8gbmfhuqFpLCBraGkgZ+G6p24gbmjGsCB0b8OgbiBi4buZIMSR4buRaSB0xrDhu6NuZyDEkeG7gXUgxJFhbmcgc+G7rSBk4bulbmcgbeG6oW5nIHjDoyBo4buZaSDhu58gbeG7qWMgxJHhu5kgY8OzIGto4bqjIG7Eg25nIOG6o25oIGjGsOG7n25nIMSR4bq/biBz4bupYyBraOG7j2UgdMOibSB0aOG6p24sIHRo4buDIGNo4bqldCBob+G6t2MgaGnhu4d1IHN14bqldCBo4buNYyB04bqtcC4NCg0KIyMjICoqMi43LiBUw6xuaCB0cuG6oW5nIGdp4bqlYyBuZ+G7pyoqDQoNCiMjIyMgKioyLjcuMSBUaOG7kW5nIGvDqiB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQoNCmBgYHtyfQ0Kc2xlZXBfZnJlcSA8LSB0YWJsZShkYXRhJFNMRUVQX0xFVkVMKQ0Kc2xlZXBfcGVyY2VudCA8LSBwcm9wLnRhYmxlKHNsZWVwX2ZyZXEpICogMTAwDQpkYXRhLmZyYW1lKFNMRUVQX0xFVkVMID0gbmFtZXMoc2xlZXBfZnJlcSksDQogICAgICAgICAgIEZyZXF1ZW5jeSA9IGFzLm51bWVyaWMoc2xlZXBfZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKHNsZWVwX3BlcmNlbnQpLCAxKSkNCmBgYA0KDQojIyMjIyAqKjIuNy4xLjEgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCmBgYHtyfQ0KcGxvdF9waWUoZGF0YSwgIlNMRUVQX0xFVkVMIiwgIlTDrG5oIHRy4bqhbmcgZ2nhuqVjIG5n4bunIikNCmBgYA0KDQoNCiMjIyMgKioyLjcuMiBOaOG6rW4geMOpdCoqDQoNCi0gQmnhu4N1IMSR4buTIGNobyB0aOG6pXk6DQoNCiAgLSA2MC45JSBzaW5oIHZpw6puIGPDsyBnaeG6pWMgbmfhu6cgdOG7kXQgKEdPT0QpLA0KDQogIC0gVHJvbmcga2hpIDM5LjElIHLGoWkgdsOgbyBuaMOzbSBuZ+G7pyBrw6ltIChCQUQpLg0KICANCi0gVOG7tyBs4buHIHNpbmggdmnDqm4gY8OzIGdp4bqlYyBuZ+G7pyBrw6ltIGNoaeG6v20gZ+G6p24gMi81IHThu5VuZyBt4bqrdSwgY2hvIHRo4bqleSBt4buZdCB0aOG7sWMgdHLhuqFuZyDEkcOhbmcgbG8gbmfhuqFpIHRyb25nIGzhu5FpIHPhu5FuZyB2w6Agc+G7qWMga2jhu49lIGPhu6dhIHNpbmggdmnDqm4uIFZp4buHYyB0aGnhur91IG5n4bunIGvDqW8gZMOgaSBjw7MgdGjhu4MgbGnDqm4gcXVhbiDEkeG6v24gZ2nhuqNtIHThuq1wIHRydW5nLCBy4buRaSBsb+G6oW4gdMOibSBsw70gdsOgIHTEg25nIG5ndXkgY8ahIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkg4oCTIMSRaeG7gXUgxJHDoyDEkcaw4bujYyB4w6FjIGzhuq1wIHLDtSByw6BuZyBxdWEgY8OhYyBuZ2hpw6puIGPhu6l1IGfhuqduIMSRw6J5Lg0KDQoNCiMjIyAqKjIuOC4gTeG7qWMgxJHhu5kgbcOidSB0aHXhuqtuIGRvIG3huqFuZyB4w6MgaOG7mWkqKg0KDQojIyMjICoqMi44LjEgVGjhu5FuZyBrw6ogdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCB0cuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQpjb25mbGljdF9mcmVxIDwtIHRhYmxlKGRhdGEkQ09ORkxJVF9MRVZFTCkNCmNvbmZsaWN0X3BlcmNlbnQgPC0gcHJvcC50YWJsZShjb25mbGljdF9mcmVxKSAqIDEwMA0KZGF0YS5mcmFtZShDT05GTElUX0xFVkVMID0gbmFtZXMoY29uZmxpY3RfZnJlcSksDQogICAgICAgICAgIEZyZXF1ZW5jeSA9IGFzLm51bWVyaWMoY29uZmxpY3RfZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKGNvbmZsaWN0X3BlcmNlbnQpLCAxKSkNCmBgYA0KDQojIyMjIyAqKjIuOC4xLjEgVHLhu7FjIHF1YW4gaG/DoSoqDQpgYGB7cn0NCnBsb3RfcGllKGRhdGEsICJDT05GTElUX0xFVkVMIiwgIlPhu5EgbOG6p24gbcOidSB0aHXhuqtuIGRvIG3huqFuZyB4w6MgaOG7mWkiKQ0KDQpgYGANCg0KDQojIyMjICoqMi44LjIgTmjhuq1uIHjDqXQqKg0KDQotIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbeG7qWMgxJHhu5kgeHVuZyDEkeG7mXQgZG8gc+G7rSBk4bulbmcgbeG6oW5nIHjDoyBo4buZaSBj4bunYSBzaW5oIHZpw6puOg0KDQogIC0gNjYlIHNpbmggdmnDqm4gZ+G6t3AgbcOidSB0aHXhuqtuIOG7nyBt4bupYyDEkeG7mSB24burYSBwaOG6o2kgKE1vZGVyYXRlIGNvbmZsaWN0KS4NCg0KICAtIDI2LjglIHRy4bqjaSBxdWEgeHVuZyDEkeG7mXQgbmdoacOqbSB0cuG7jW5nIChIaWdoIGNvbmZsaWN0KS4NCg0KICAtIENo4buJIDcuMiUgY2hvIGJp4bq/dCDDrXQgaG/hurdjIGtow7RuZyBn4bq3cCBtw6J1IHRodeG6q24gKExvdyBjb25mbGljdCkuDQoNCi0gKipU4bu3IGzhu4cgc2luaCB2acOqbiBn4bq3cCB4dW5nIMSR4buZdCBkbyBt4bqhbmcgeMOjIGjhu5lpIGzDoCBy4bqldCBjYW8qKiAoY2hp4bq/bSB04bubaSA5Mi44JSksIHRyb25nIMSRw7MgdHLDqm4gMS80IHLGoWkgdsOgbyB0w6xuaCB0cuG6oW5nIG5naGnDqm0gdHLhu41uZy4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIG3hu5l0IHRo4buxYyB0cuG6oW5nIMSRw6FuZyBiw6FvIMSR4buZbmcgduG7gSDhuqNuaCBoxrDhu59uZyB0acOqdSBj4buxYyBj4bunYSBt4bqhbmcgeMOjIGjhu5lpIMSR4bq/biBjw6FjIG3hu5FpIHF1YW4gaOG7hyBjw6EgbmjDom4uIFZp4buHYyBz4butIGThu6VuZyBt4bqhbmcgeMOjIGjhu5lpIHRoaeG6v3Uga2nhu4NtIHNvw6F0IGPDsyB0aOG7gyBk4bqrbiDEkeG6v24gaGnhu4N1IGzhuqdtLCBjxINuZyB0aOG6s25nLCB2w6AgdGjhuq1tIGNow60gcuG6oW4gbuG7qXQgdHJvbmcgZ2lhbyB0aeG6v3AuDQoNCg0KIyMjICoqMi45LiBO4buBbiB04bqjbmcgbeG6oW5nIHjDoyBo4buZaSDEkcaw4bujYyBz4butIGThu6VuZyBwaOG7lSBiaeG6v24qKg0KDQojIyMjICoqMi45LjEgVGjhu5FuZyBrw6ogdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCB0cuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQpwbGF0Zm9ybV9mcmVxIDwtIHRhYmxlKGRhdGEkTW9zdF9Vc2VkX1BsYXRmb3JtKQ0KcGxhdGZvcm1fcGVyY2VudCA8LSBwcm9wLnRhYmxlKHBsYXRmb3JtX2ZyZXEpICogMTAwDQpkYXRhLmZyYW1lKFBsYXRmb3JtID0gbmFtZXMocGxhdGZvcm1fZnJlcSksDQogICAgICAgICAgIEZyZXF1ZW5jeSA9IGFzLm51bWVyaWMocGxhdGZvcm1fZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKHBsYXRmb3JtX3BlcmNlbnQpLCAxKSkNCmBgYA0KDQojIyMjIyAqKjIuOS4xLjEgVHLhu7FjIHF1YW4gaG/DoSoqDQpgYGB7cn0NCiMgVOG6oW8gYuG6o25nIHThuqduIHPhu5ENCnBsYXRmb3JtX2ZyZXEgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXRhJE1vc3RfVXNlZF9QbGF0Zm9ybSkpDQpjb2xuYW1lcyhwbGF0Zm9ybV9mcmVxKSA8LSBjKCJQbGF0Zm9ybSIsICJGcmVxdWVuY3kiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0DQpnZ3Bsb3QocGxhdGZvcm1fZnJlcSwgYWVzKHggPSByZW9yZGVyKFBsYXRmb3JtLCAtRnJlcXVlbmN5KSwgeSA9IEZyZXF1ZW5jeSwgZmlsbCA9IFBsYXRmb3JtKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIk7hu4FuIHThuqNuZyBt4bqhbmcgeMOjIGjhu5lpIMSRxrDhu6NjIHPhu60gZOG7pW5nIHBo4buVIGJp4bq/biIsDQogICAgICAgeCA9ICJO4buBbiB04bqjbmciLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpICsNCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpDQpgYGANCg0KDQojIyMjICoqMi45LjIgTmjhuq1uIHjDqXQqKg0KDQotIEJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IEluc3RhZ3JhbSBsw6AgbuG7gW4gdOG6o25nIHBo4buVIGJp4bq/biBuaOG6pXQsIHbhu5tpIDM1LjMlIHNpbmggdmnDqm4gbOG7sWEgY2jhu41uLCB0aGVvIHNhdSBsw6AgVGlrVG9rICgyMS44JSkgdsOgIEZhY2Vib29rICgxNy40JSkuIEJhIG7hu4FuIHThuqNuZyBuw6B5IGNoaeG6v20gdOG7lW5nIGPhu5luZyBn4bqnbiA3NSUgbeG7qWMgc+G7rSBk4bulbmcsIGNobyB0aOG6pXkgeHUgaMaw4bubbmcgxrB1IHRpw6puIGPDoWMgbuG7gW4gdOG6o25nIGPDsyBu4buZaSBkdW5nIHRy4buxYyBxdWFuLCB2aWRlbyBuZ+G6r24gdsOgIGto4bqjIG7Eg25nIHTGsMahbmcgdMOhYyBt4bqhbmggdHJvbmcgZ2nhu5tpIHNpbmggdmnDqm4uIFRyb25nIGtoaSDEkcOzLCBjw6FjIOG7qW5nIGThu6VuZyBuaOG6r24gdGluIG5oxrAgS2FrYW9UYWxrLCBMSU5FLCB2w6AgY8OhYyBu4buBbiB04bqjbmcgw610IHBo4buVIGJp4bq/biBoxqFuIG5oxrAgVktvbnRha3RlLCBXZUNoYXQgY2jhu4kgY2hp4bq/bSB04burIDEuNyXigJMyLjElLCBwaOG6o24gw6FuaCB0w61uaCBjaOG6pXQgc+G7rSBk4bulbmcgdGhlbyBraHUgduG7sWMgxJHhu4thIGzDvSBob+G6t2MgbeG7pWMgxJHDrWNoIGNodXnDqm4gYmnhu4d0Lg0KDQotIFPhu7EgxrB1IHRo4bq/IGPhu6dhIEluc3RhZ3JhbSB2w6AgVGlrVG9rIGzDoCBtaW5oIGNo4bupbmcgcsO1IHLDoG5nIGNobyB2aeG7h2MgZ2nhu5tpIHRy4bq7IGhp4buHbiBuYXkgYuG7iyB0aHUgaMO6dCBi4bufaSBu4buZaSBkdW5nIGdp4bqjaSB0csOtIG5oYW5oLCBi4bqvdCBt4bqvdCB2w6AgY8OzIHTDrW5oIGxhbiB0cnV54buBbiBjYW8sIMSR4buTbmcgdGjhu51pIGPFqW5nIHRp4buBbSDhuqluIG5ndXkgY8ahIGfDonkgbmdoaeG7h24gdsOgIHBow6JuIHTDoW4gc+G7sSBjaMO6IMO9LiBOZ2/DoGkgcmEsIG7hu4FuIHThuqNuZyBjaHV5w6puIG5naGnhu4dwIG5oxrAgTGlua2VkSW4gY2jhu4kgY2hp4bq/bSAzLjAlLCBjaG8gdGjhuqV5IHNpbmggdmnDqm4gY2jGsGEgcXVhbiB0w6JtIG5oaeG7gXUgxJHhur9uIHBow6F0IHRyaeG7g24gaMOsbmgg4bqjbmggbmdo4buBIG5naGnhu4dwIHRyw6puIG3huqFuZyB4w6MgaOG7mWkuIMSQaeG7gXUgbsOgeSBn4bujaSBt4bufIHRp4buBbSBuxINuZyBjaG8gY8OhYyB0csaw4budbmcgxJHhuqFpIGjhu41jIHbDoCBuaMOgIGhv4bqhY2ggxJHhu4tuaCBjaMOtbmggc8OhY2ggZ2nDoW8gZOG7pWMgdHJvbmcgdmnhu4djIGtodXnhur9uIGtow61jaCBzaW5oIHZpw6puIHPhu60gZOG7pW5nIG3huqFuZyB4w6MgaOG7mWkgbeG7mXQgY8OhY2ggaGnhu4d1IHF14bqjIGjGoW4sIGPDom4gYuG6sW5nIGdp4buvYSBnaeG6o2kgdHLDrSB2w6AgcGjDoXQgdHJp4buDbiBi4bqjbiB0aMOibi4NCg0KDQojIyAqKlBI4bqmTiAzOiDGr+G7mkMgTMav4buiTkcgS0hP4bqiTkcgVsOAIEtJ4buCTSDEkOG7ik5IIEdJ4bqiIFRIVVnhur5UIFThu7YgTOG7hiBDSE8gMSBCSeG6vk4qKg0KDQojIyMgKiozLjEgR2VuZGVyIC0gTWFsZSoqDQoNCiMjIyMgKiozLjEuMSDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIG5hbSoqDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KHggPSBzdW0oZGF0YSRHZW5kZXIgPT0gIk1hbGUiKSwNCiAgICAgICAgICBuID0gbnJvdyhkYXRhKSwNCiAgICAgICAgICBwID0gMC41LCAgICAgICAgICAgICAjIEdp4bqjIHRodXnhur90IEgwOiBwID0gMC41DQogICAgICAgICAgY29uZi5sZXZlbCA9IDAuOTUpDQpgYGANCiMjIyMgKiozLjEuMiBCw6BpIHRvw6FuIGtp4buDbSDEkeG7i25oKioNCg0KLSBHaeG6oyB0aHV54bq/dDoNCg0KICAtIEjigoA6IHAgPSAwLjUgKHThu7cgbOG7hyBuYW0gYuG6sW5nIDUwJSkNCiAgLSBI4oKBOiBwIOKJoCAwLjUgKHThu7cgbOG7hyBuYW0ga2jDoWMgNTAlKQ0KICANCioqTmjhuq1uIHjDqXQ6KioNCg0KICAtIEdpw6EgdHLhu4sgcC12YWx1ZSA9IDEsIGzhu5tuIGjGoW4gbeG7qWMgw70gbmdoxKlhIHRoxrDhu51uZyBkw7luZyAozrEgPSAwLjA1KSwgZG8gxJHDsyBraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKALg0KDQogIC0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIHNpbmggdmnDqm4gbmFtIG7hurFtIHRyb25nIGtob+G6o25nIFs0Ni4xOCU7IDUzLjY4JV0sIGJhbyBn4buTbSBnacOhIHRy4buLIDUwJS4NCg0KICAtIMav4bubYyBsxrDhu6NuZyDEkWnhu4NtIGNobyB04bu3IGzhu4cgc2luaCB2acOqbiBuYW0gbMOgIDQ5LjkzJSwgZ+G6p24gc8OhdCB24bubaSA1MCUuDQoNCiAgLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdOG7tyBs4buHIHNpbmggdmnDqm4gbmFtIHbDoCBt4bupYyBjaHXhuqluIDUwJS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcGjDom4gYuG7kSBnaeG7m2kgdMOtbmggdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgbMOgIHTGsMahbmcgxJHhu5FpIGPDom4gYuG6sW5nIHbDoCBwaMO5IGjhu6NwIHbhu5tpIGdp4bqjIMSR4buLbmggdOG7tyBs4buHIDE6MSBnaeG7r2EgbmFtIHbDoCBu4buvLg0KDQojIyMgKiozLjIgVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIC0gVW5kZXJncmFkdWF0ZSoqDQoNCiMjIyMgKiozLjIuMSDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIHNpbmggdmnDqm4gxJHhuqFpIGjhu41jKioNCg0KYGBge3J9DQpwcm9wLnRlc3QoeCA9IHN1bShkYXRhJEFjYWRlbWljX0xldmVsID09ICJVbmRlcmdyYWR1YXRlIiksDQogICAgICAgICAgbiA9IG5yb3coZGF0YSksDQogICAgICAgICAgcCA9IDAuNSwgICAgICAgICAgICAgIyBHaeG6oyB0aHV54bq/dCBIMDogcCA9IDAuNQ0KICAgICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQ0KYGBgDQojIyMjICoqMy4yLjIgQsOgaSB0b8OhbiBraeG7g20gxJHhu4tuaCoqDQoNCi0gR2nhuqMgdGh1eeG6v3Q6DQoNCiAgLSBI4oKAOiBwID0gMC41ICh04bu3IGzhu4cgc2luaCB2acOqbiDEkeG6oWkgaOG7jWMgYuG6sW5nIDUwJSkNCiAgLSBI4oKBOiBwIOKJoCAwLjUgKHThu7cgbOG7hyBzaW5oIHZpw6puIMSR4bqhaSBo4buNYyBraMOhYyA1MCUpDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHThu7cgbOG7hyBzaW5oIHZpw6puIHRyb25nIG3huqt1IHRodeG7mWMgYuG6rWMgVW5kZXJncmFkdWF0ZSBsw6Aga2hv4bqjbmcgNTAuMDclLCBraMO0bmcga2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogc28gduG7m2kgdOG7tyBs4buHIGdp4bqjIMSR4buLbmggbMOgIDUwJS4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAwLjUsIHbDoCBwLXZhbHVlIGLhurFuZyAxIGto4bqzbmcgxJHhu4tuaCBy4bqxbmcga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBr4bq/dCBsdeG6rW4gdOG7tyBs4buHIHNpbmggdmnDqm4gxJHhuqFpIGjhu41jIHRyb25nIG3huqt1IGtow6FjIDUwJS4NCg0KLSBWw6wgduG6rXksIHRhIGtow7RuZyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCwgdsOgIGPDsyB0aOG7gyBuw7NpIHLhurFuZyB04bu3IGzhu4cgc2luaCB2acOqbiDEkeG6oWkgaOG7jWMgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgbMOgIGPDom4gYuG6sW5nLCBraMO0bmcgdGhpw6puIGzhu4djaCBzbyB24bubaSBt4bupYyB0cnVuZyBiw6xuaCBnaeG6oyDEkeG7i25oLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBt4bqrdSBraOG6o28gc8OhdCDEkcaw4bujYyB4w6J5IGThu7FuZyBjw7MgdMOtbmggxJHhuqFpIGRp4buHbiB04buRdCB24buBIG3hurd0IHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBu4bq/dSBnaeG6oyDEkeG7i25oIHThu5VuZyB0aOG7gyBjxaluZyBjw6JuIGLhurFuZyB0aGVvIGPDoWNoIMSRw7MuDQoNCiMjICoqUEjhuqZOIDQ6IFBIw4JOIFTDjUNIIE3hu5BJIExJw4pOIEjhu4YgR0nhu65BIEhBSSBCSeG6vk4qKg0KDQojIyMgKio0LjEgVEhJ4bq+VSBOR+G7piBWw4AgTkdISeG7hk4gTeG6oE5HIFjDgyBI4buYSSoqDQoNClTDrG0gaGnhu4N1IHhlbSBsaeG7h3UgVGhp4bq/dSBuZ+G7pyBjw7MgbGnDqm4gaOG7hyB24bubaSBt4bupYyDEkeG7mSBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIGtow7RuZz8NCihOw7NpIGPDoWNoIGtow6FjOiBMaeG7h3Ugbmjhu69uZyBuZ8aw4budaSB0aGnhur91IG5n4bunIGPDsyBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIG5oaeG7gXUgaMahbiBraMO0bmc/KQ0KDQojIyMjICoqNC4xLjEgQuG6o25nIHThuqduIHN14bqldCBjaMOpbyoqDQoNCmBgYHtyfQ0KDQojIELhuqNuZyBjaMOpbyBnaeG7r2EgY2jhuqV0IGzGsOG7o25nIGdp4bqlYyBuZ+G7pyB2w6AgbeG7qWMgxJHhu5kgbmdoaeG7h24NCnRhYmxlX3NsZWVwX2FkZGljdCA8LSB0YWJsZShkYXRhJFNMRUVQX0xFVkVMLCBkYXRhJEFERElDVEVEX0xFVkVMKQ0KdGFibGVfc2xlZXBfYWRkaWN0DQpgYGANCg0KYGBge3J9DQpwcm9wLnRhYmxlKHRhYmxlX3NsZWVwX2FkZGljdCwgbWFyZ2luID0gMSkNCmBgYA0KDQojIyMjICoqNC4xLjIgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0DQp0YWJsZV9zbGVlcF9hZGRpY3QgPC0gdGFibGUoZGF0YSRTTEVFUF9MRVZFTCwgZGF0YSRBRERJQ1RFRF9MRVZFTCkNCmRmX3Bsb3QgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZV9zbGVlcF9hZGRpY3QpDQpjb2xuYW1lcyhkZl9wbG90KSA8LSBjKCJTbGVlcF9MZXZlbCIsICJBZGRpY3Rpb25fTGV2ZWwiLCAiQ291bnQiKQ0KDQojIFRy4buxYyBxdWFuIGjDs2EgbsOibmcgY+G6pXANCmdncGxvdChkZl9wbG90LCBhZXMoeCA9IFNsZWVwX0xldmVsLCB5ID0gQ291bnQsIGZpbGwgPSBBZGRpY3Rpb25fTGV2ZWwpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjcpLCB3aWR0aCA9IDAuNikgKw0KICBnZW9tX3RleHQoDQogICAgYWVzKGxhYmVsID0gQ291bnQpLA0KICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjcpLA0KICAgIHZqdXN0ID0gLTAuNCwgc2l6ZSA9IDQNCiAgKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgY2jhuqV0IGzGsOG7o25nIGdp4bqlYyBuZ+G7pyB2w6AgbeG7qWMgxJHhu5kgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSIsDQogICAgc3VidGl0bGUgPSAiSGnhu4NuIHRo4buLIHPhu5EgbMaw4bujbmcgc2luaCB2acOqbiB0aGVvIHThu6tuZyBuaMOzbSIsDQogICAgeCA9ICJDaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunIiwNCiAgICB5ID0gIlPhu5EgbMaw4bujbmcgc2luaCB2acOqbiIsDQogICAgZmlsbCA9ICJN4bupYyDEkeG7mSBuZ2hp4buHbiINCiAgKSArDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplID0gMTMpICsNCiAgc2NhbGVfZmlsbF9tYW51YWwoDQogICAgdmFsdWVzID0gYygiTm90IGFkZGljdGVkIiA9ICIjQThEQURDIiwgDQogICAgICAgICAgICAgICAiTW9kZXJhdGVseSBhZGRpY3RlZCIgPSAiI0Y0QTI2MSIsIA0KICAgICAgICAgICAgICAgIkhlYXZpbHkgYWRkaWN0ZWQiID0gIiNFNzZGNTEiKQ0KICApDQpgYGANCg0KDQojIyMjICoqNC4xLjMgTmjhuq1uIHjDqXQqKg0KDQotIFRyb25nIG5ow7NtIHRoaeG6v3Ugbmfhu6cgKEJBRCBzbGVlcCksIGPDsyDEkeG6v24gMjc2IHNpbmggdmnDqm4gbmdoaeG7h24gbuG6t25nLCB0cm9uZyBraGkga2jDtG5nIGPDsyBzaW5oIHZpw6puIG7DoG8ga2jDtG5nIG5naGnhu4duIOKGkiBjaG8gdGjhuqV5IHTDrG5oIHRy4bqhbmcgdGhp4bq/dSBuZ+G7pyBjw7MgbGnDqm4gcXVhbiBt4bqhbmggxJHhur9uIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkuDQoNCi0gTmfGsOG7o2MgbOG6oWksIHRyb25nIG5ow7NtIG5n4bunIMSR4bunIChHT09EIHNsZWVwKSwgc+G7kSBsxrDhu6NuZyBzaW5oIHZpw6puIG5naGnhu4duIG7hurduZyB24bqrbiBjYW8gKDMyOSkgbmjGsG5nIMSRw6MgeHXhuqV0IGhp4buHbiBzaW5oIHZpw6puIGtow7RuZyBuZ2hp4buHbiAoMSBuZ8aw4budaSkgdsOgIG5naGnhu4duIHbhu6thICg5OSBuZ8aw4budaSkg4oaSIGNobyB0aOG6pXkgZ2nhuqVjIG5n4bunIHThu5F0IGPDsyB0aOG7gyBsacOqbiBxdWFuIMSR4bq/biBt4bupYyDEkeG7mSBuZ2hp4buHbiB0aOG6pXAgaMahbi4NCg0KICAqKi0gVOG7tyBs4buHIHNpbmggdmnDqm4ga2jDtG5nIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkgbMOgIHLhuqV0IG5o4buPIHRyb25nIGPhuqMgaGFpIG5ow7NtIGNo4bqldCBsxrDhu6NuZyBnaeG6pWMgbmfhu6csIHBo4bqjbiDDoW5oIHRo4buxYyB0cuG6oW5nIG3huqFuZyB4w6MgaOG7mWkgxJHDoyBsZW4gbOG7j2kgdsOgbyB0aMOzaSBxdWVuIGjDoG5nIG5nw6B5IGPhu6dhIHBo4bqnbiBs4bubbiBzaW5oIHZpw6puLioqDQoNCioqLT4gQ+G6p24gbMOgbSByw7UgbGnhu4d1IG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkgY8OzIHBo4bqjaSBsw6Agbmd1ecOqbiBuaMOibiBjaMOtbmggZ8OieSByYSB0w6xuaCB0cuG6oW5nIHRoaeG6v3Ugbmfhu6csIGhheSBsw6AgaOG7hyBxdeG6oyBj4bunYSBuaOG7r25nIHbhuqVuIMSR4buBIHTDom0gbMO9IGtow6FjLioqDQoNCiMjIyMgKio0LjEuNCBLaeG7g20gxJHhu4tuaCBjaGkgYsOsbmggcGjGsMahbmcqKg0KDQpgYGB7cn0NCiMgQuG6o25nIHThuqduIHPhu5EgDQp0YWJsZV9zbGVlcF9hZGRpY3QgPC0gdGFibGUoZGF0YSRTTEVFUF9MRVZFTCwgZGF0YSRBRERJQ1RFRF9MRVZFTCkNCnRhYmxlX3NsZWVwX2FkZGljdA0KIyBLaeG7g20gxJHhu4tuaCBDaGkgYsOsbmggcGjGsMahbmcNCmNoaXNxLnRlc3QodGFibGVfc2xlZXBfYWRkaWN0KQ0KYGBgDQoNCioqQ8OhYyBnaeG6oyB0aHV54bq/dCoqDQoNCiAgLSBI4oKAIChHaeG6oyB0aHV54bq/dCBraMO0bmcpOiBLaMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGNo4bqldCBsxrDhu6NuZyBnaeG6pWMgbmfhu6cgdsOgIG3hu6ljIMSR4buZIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkuIChIYWkgYmnhur9uIMSR4buZYyBs4bqtcCBuaGF1LikNCg0KICAtIEjigoEgKEdp4bqjIHRodXnhur90IMSR4buRaSk6Q8OzIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIGNo4bqldCBsxrDhu6NuZyBnaeG6pWMgbmfhu6cgdsOgIG3hu6ljIMSR4buZIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkuIChIYWkgYmnhur9uIHBo4bulIHRodeG7mWMgbmhhdS4pDQoNCioqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmg6KioNCg0KLSBDaGktc3F1YXJlZCA9IDc0Ljk3LCBkZiA9IDIsIHAtdmFsdWUgPCAyLjJlLTE2IOKHkiDEkMOieSBsw6AgbeG7mXQga+G6v3QgcXXhuqMgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBjYW8gKHAtdmFsdWUg4omqIDAuMDUpLg0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCi0gTeG7qWMgxJHhu5kgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgxJHDoW5nIGvhu4MgZ2nhu69hIGPDoWMgbmjDs20gY2jhuqV0IGzGsOG7o25nIGdp4bqlYyBuZ+G7pyAobmfhu6cgxJHhu6cgdnMgdGhp4bq/dSBuZ+G7pykuDQoNCi0gVuG7m2kgZ2nDoSB0cuG7iyBwLXZhbHVlIHLhuqV0IG5o4buPIChuaOG7jyBoxqFuIDAuMDUpLCBjaMO6bmcgdGEgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoAgdOG6oWkgbeG7qWMgw70gbmdoxKlhIDUlLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIGdp4buvYSBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunIHbDoCBt4bupYyDEkeG7mSBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpLiAyIEJp4bq/biBjw7MgbeG7kWkgcXVhbiBo4buHIHBo4bulIHRodeG7mWMNCg0KIyMjIyAqKjQuMS41IFJlbGF0aXZlIFJpc2sqKg0KDQpOaOG6sW0gcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIGdp4buvYSBjw6FjIGJp4bq/biwgY2jDum5nIHRhIHPhu60gZOG7pW5nIGNo4buJIHPhu5EgUmVsYXRpdmUgUmlzayAoUlIpIMSR4buDIMSRbyBsxrDhu51uZyBt4bupYyDEkeG7mSBy4bunaSBybyBob+G6t2Mga2jhuqMgbsSDbmcgeOG6o3kgcmEgY+G7p2EgbeG7mXQgc+G7sSBraeG7h24uDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygiZXBpdG9vbHMiLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQ0KbGlicmFyeShlcGl0b29scykNCmBgYA0KDQoNCmBgYHtyfQ0KIyBH4buZcCBuaMOzbTogSGVhdmlseSBhZGRpY3RlZCB2cy4gT3RoZXJzDQpkYXRhJEFkZGljdGlvbl9Hcm91cCA8LSBpZmVsc2UoZGF0YSRBRERJQ1RFRF9MRVZFTCA9PSAiSGVhdmlseSBhZGRpY3RlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWF2aWx5IGFkZGljdGVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBoZWF2aWx5IGFkZGljdGVkIikNCg0KIyBU4bqhbyBi4bqjbmcgY2jDqW8gduG7m2kgU2xlZXANCnRhYmxlX2FkZGljdF9zbGVlcCA8LSB0YWJsZShkYXRhJEFkZGljdGlvbl9Hcm91cCwgZGF0YSRTTEVFUF9MRVZFTCkNCg0KIyBLaeG7g20gdHJhIGLhuqNuZw0KcHJpbnQodGFibGVfYWRkaWN0X3NsZWVwKQ0KbGlicmFyeShlcGl0b29scykNCg0Kcmlza3JhdGlvKHRhYmxlX2FkZGljdF9zbGVlcCkNCmBgYA0KDQoqKlJpc2sgUmF0aW8gKFJSKSoqIGzDoCB04bu3IHPhu5EgZ2nhu69hIG5ndXkgY8ahIHjhuqN5IHJhIG3hu5l0IGhp4buHbiB0xrDhu6NuZyAobmjGsCDigJxuZ+G7pyDEkeG7p+KAnSkg4bufIG5ow7NtIHBoxqFpIG5oaeG7hW0gdsOgIG5ow7NtIGtow7RuZyBwaMahaSBuaGnhu4VtLg0KDQpDw7RuZyB0aOG7qWMgdOG7lW5nIHF1w6F0Og0KDQpcWw0KUlIgPSBcZnJhY3tcdGV4dHtU4bu3IGzhu4cgc+G7sSBraeG7h24g4bufIG5ow7NtIGtow7RuZyBuZ2hp4buHbiBu4bq3bmd9fXtcdGV4dHtU4bu3IGzhu4cgc+G7sSBraeG7h24g4bufIG5ow7NtIG5naGnhu4duIG7hurduZ319DQpcXQ0KDQpUcm9uZyB0csaw4budbmcgaOG7o3AgbsOgeSwg4oCcc+G7sSBraeG7h27igJ0gbMOgICoqbmfhu6cgxJHhu6cqKiAoX0dPT0RfKS4NCg0KLSBU4bu3IGzhu4cgbmfhu6cgxJHhu6cg4bufIG5ow7NtIE5vdCBoZWF2aWx5IGFkZGljdGVkOg0KDQpcWw0KID0gXGZyYWN7XHRleHR7MTAwfX17XHRleHR7MTAwfX0gPSAxDQpcXQ0KDQotIFThu7cgbOG7hyBuZ+G7pyDEkeG7pyDhu58gbmjDs20gSGVhdmlseSBhZGRpY3RlZDoNCg0KXFsNCiA9IFxmcmFje1x0ZXh0ezMyOX19e1x0ZXh0ezYwNX19ID0gMC41NDM4DQpcXQ0KDQotICoqUmlzayBSYXRpbyoqDQoNClxbDQpSUiA9IFxmcmFje1x0ZXh0ezF9fXtcdGV4dHswLjU0Mzh9fQ0KXF0NCg0KLS0tDQogDQpT4buRIGxp4buHdSBj4bulIHRo4buDIHRyb25nIGLhuqNuZw0KDQpgYGB7ciwgZWNobz1GQUxTRSwgcmVzdWx0cz0nYXNpcyd9DQprbml0cjo6a2FibGUoDQogIGRhdGEuZnJhbWUoDQogICAgYEFkZGljdGlvbiBMZXZlbGAgPSBjKCJIZWF2aWx5IGFkZGljdGVkIiwgIk5vdCBoZWF2aWx5IGFkZGljdGVkIiksDQogICAgYEJBRCAoVGhp4bq/dSBuZ+G7pylgID0gYygyNzYsIDApLA0KICAgIGBHT09EIChOZ+G7pyDEkeG7pylgID0gYygzMjksIDEwMCksDQogICAgVG90YWwgPSBjKDYwNSwgMTAwKQ0KICApLA0KICBjYXB0aW9uID0gIkLhuqNuZyB04bqnbiBzdeG6pXQgZ2nhu69hIHTDrG5oIHRy4bqhbmcgbmdoaeG7h24gdsOgIGNo4bqldCBsxrDhu6NuZyBnaeG6pWMgbmfhu6ciDQopDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCi0gbmjDs20gdGhhbSBjaGnhur91IMSRxrDhu6NjIGNo4buNbiBsw6AgTkjDk00gTkdIScOKTiBO4bq2TkcNCg0KLSBQLXZhbHVlIGPhu7FjIGvhu7Mgbmjhu48g4oaSIGxv4bqhaSBi4buPIGdp4bqjIHRodXnhur90IEjigoAsIGNobyB0aOG6pXkgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgZ2nhuqVjIG5n4bunIHbDoCBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLg0KDQotIE5ow7NtICJOb3QgaGVhdmlseSBhZGRpY3RlZCIgY8OzIHThu7cgbOG7hyBjw7MgZ2nhuqVjIG5n4bunIHThu5F0IGNhbyBoxqFuIDEuODQgbOG6p24gc28gduG7m2kgbmjDs20gIkhlYXZpbHkgYWRkaWN0ZWQiLg0KDQotIC0+ICoqS+G6v3QgcXXhuqMgY2hvIHRo4bqleSBzaW5oIHZpw6puIGtow7RuZyBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIG7hurduZyBjw7Mga2jhuqMgbsSDbmcgbmfhu6cgxJHhu6cgY2FvIGjGoW4gZ+G6p24gMiBs4bqnbiBzbyB24bubaSBzaW5oIHZpw6puIG5naGnhu4duIG7hurduZy4gxJBp4buBdSBuw6B5IGPhu6duZyBj4buRIGLhurFuZyBjaOG7qW5nIHRo4buRbmcga8OqIHLhurFuZyBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIGzDoCBt4buZdCB54bq/dSB04buRIHLhu6dpIHJvIHRpw6p1IGPhu7FjIMSR4buRaSB24bubaSBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunLiBEbyDEkcOzLCB2aeG7h2MgZ2nhuqNtIG3hu6ljIMSR4buZIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkgY8OzIHRo4buDIMSRw7NuZyB2YWkgdHLDsiBxdWFuIHRy4buNbmcgdHJvbmcgY+G6o2kgdGhp4buHbiBz4bupYyBraOG7j2UgZ2nhuqVjIG5n4bunIHbDoCBjaOG6pXQgbMaw4bujbmcgc+G7kW5nIGPhu6dhIHNpbmggdmnDqm4uKioNCg0KDQojIyMjICoqNC4xLjYgT2RkcyByYXRpbyoqDQoNCmBgYHtyfQ0KIyBH4buZcCBuaMOzbTogSGVhdmlseSBhZGRpY3RlZCB2cy4gT3RoZXJzDQpkYXRhJEFkZGljdGlvbl9Hcm91cCA8LSBpZmVsc2UoZGF0YSRBRERJQ1RFRF9MRVZFTCA9PSAiSGVhdmlseSBhZGRpY3RlZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIZWF2aWx5IGFkZGljdGVkIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBoZWF2aWx5IGFkZGljdGVkIikNCg0KIyBU4bqhbyBi4bqjbmcgY2jDqW8gduG7m2kgU2xlZXANCnRhYmxlX2FkZGljdF9zbGVlcCA8LSB0YWJsZShkYXRhJEFkZGljdGlvbl9Hcm91cCwgZGF0YSRTTEVFUF9MRVZFTCkNCg0KIyBLaeG7g20gdHJhIGLhuqNuZw0KcHJpbnQodGFibGVfYWRkaWN0X3NsZWVwKQ0KbGlicmFyeShlcGl0b29scykNCiMgVGjDqm0gMC41IMSR4buDIHRyw6FuaCBjaGlhIGNobyAwDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KDQpvZGRzcmF0aW8odGFibGVfYWRkaWN0X3NsZWVwICsgMC41LCBtZXRob2QgPSAid2FsZCIpDQoNCg0KYGBgDQoNCioqTMavVSDDnSoqDQoNCi0gdsOsIHRyb25nIGLhuqNuZyBjw7MgZ2nDoSB0cuG7iyA9IDAgbsOqbiB0YSArIHRow6ptIDAuNS4gS+G7uSB0aHXhuq10IG7DoHkgZ+G7jWkgbMOgIGNvbnRpbnVpdHkgY29ycmVjdGlvbiBob+G6t2MgSGFsZGFuZS1BbnNjb21iZSBjb3JyZWN0aW9uIMSRxrDhu6NjIGTDuW5nIGtoaSBi4bqjbmcgY8OzIGNo4bupYSBz4buRIDAsIG5o4bqxbSB0csOhbmggbOG7l2kgY2hpYSBjaG8gMCBob+G6t2MgbG9nKDApIGtoaSB0w61uaCB0b8OhbiBvZGRzIHJhdGlvIChPUikgdsOgIGtob+G6o25nIHRpbiBj4bqteS4gVmnhu4djIGPhu5luZyB0aMOqbSAwLjUgdsOgbyBt4buXaSDDtCBnacO6cCDGsOG7m2MgbMaw4bujbmcg4buVbiDEkeG7i25oIGjGoW4gdHJvbmcgY8OhYyBi4bqjbmcgbmjhu48gaG/hurdjIG3huqV0IGPDom4gxJHhu5FpLg0KDQotICBtZXRob2QgPSAid2FsZCINCg0KICAtIENo4buJIMSR4buLbmggcGjGsMahbmcgcGjDoXAgdMOtbmgga2hv4bqjbmcgdGluIGPhuq15IChDSSkgY2hvIE9kZHMgUmF0aW86DQoNCiAgLSAid2FsZCI6IHPhu60gZOG7pW5nIMaw4bubYyBsxrDhu6NuZyBXYWxkIGThu7FhIHRyw6puIHBow6JuIHBo4buRaSBjaHXhuqluLiDEkMOieSBsw6AgY8OhY2ggcGjhu5UgYmnhur9uLCDEkcahbiBnaeG6o24gdsOgIGNobyBr4bq/dCBxdeG6oyBn4bqnbiDEkcO6bmcgbmhhbmguDQoNCioqR0nhuqJJIFRIw41DSCBDw4FDSCBUw41OSCBPUioqDQoNClxbDQpPUiA9IFxmcmFje1x0ZXh0e29kZHMgY+G7p2EgIGhlYXZpbHkgYWRkaWN0ZWR9fXtcdGV4dHtvZGRzIGPhu6dhIE5vdCBoZWF2aWx5IGFkZGljdGVkfX0gPSAgXGZyYWN7XHRleHR7MC44Mzl9fXtcdGV4dHswLjAwNDk4fX0gPSAxNjguNjcNClxdDQoNCioqTmjhuq1uIHjDqXQqKg0KLSBuaMOzbSB0aGFtIGNoaeG6v3UgxJHGsOG7o2MgY2jhu41uIGzDoCBuZ2hp4buHbiBu4bq3bmcgDQoNCi0gROG7sWEgdHLDqm4ga+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggT2RkcyBSYXRpbyAoT1IpLCB24bubaSDEkeG7mSB0aW4gY+G6rXkgOTUlIC4gcC12YWx1ZSBj4buxYyBr4buzIG5o4buPICjiiYggMCkg4oeSIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKALCB04buTbiB04bqhaSBN4buRaSBsacOqbiBo4buHICBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqICANCg0KLSBI4buHIHPhu5EgcuG6pXQgbOG7m24gKE9SID0gMTY4KSBjaG8gdGEgdGjhuqV5IE5ow7NtICJOb3QgaGVhdmlseSBhZGRpY3RlZCIgKGtow7RuZyBuZ2hp4buHbiBu4bq3bmcpIGPDsyBraOG6oyBuxINuZyBjw7MgZ2nhuqVjIG5n4bunIHThu5F0IGNhbyBoxqFuIGtob+G6o25nIDE2OSBs4bqnbiBzbyB24bubaSBuaMOzbSAiSGVhdmlseSBhZGRpY3RlZCIuDQoNCioqLSBL4bq/dCBxdeG6oyBjaG8gdGjhuqV5IHNpbmggdmnDqm4ga2jDtG5nIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkgbuG6t25nIGPDsyBraOG6oyBuxINuZyBuZ+G7pyDEkeG7pyBjYW8gaMahbiDEkcOhbmcga+G7gyBzbyB24bubaSBuaOG7r25nIHNpbmggdmnDqm4gbmdoaeG7h24gbuG6t25nLiDEkGnhu4F1IG7DoHkgY+G7p25nIGPhu5EgbOG6rXAgbHXhuq1uIHLhurFuZyB2aeG7h2MgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSBjw7MgdGjhu4MgbMOgIHnhur91IHThu5Egbmd1eSBjxqEgcXVhbiB0cuG7jW5nIGfDonkgcmEgdGhp4bq/dSBuZ+G7py4gSMaw4bubbmcgbmdoacOqbiBj4bupdSBuw6B5IGfhu6NpIMO9IHbhu4EgbeG7kWkgbGnDqm4gaOG7hyBuaMOibiBxdeG6oyBjw7MgdGjhu4MgY8OzIGdp4buvYSBow6BuaCB2aSBz4butIGThu6VuZyBt4bqhbmcgeMOjIGjhu5lpIHbDoCBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunLCB2w6AgxJHhurd0IG7hu4FuIHThuqNuZyBjaG8gY8OhYyBjaMawxqFuZyB0csOsbmggY2FuIHRoaeG7h3AgbmjhurFtIGdp4bqjbSBt4bupYyDEkeG7mSBz4butIGThu6VuZyBt4bqhbmcgeMOjIGjhu5lpIMSR4buDIGPhuqNpIHRoaeG7h24gc+G7qWMga2jhu49lIGdp4bqlYyBuZ+G7py4qKg0KDQojIyMjICoqNC4xLjcgS+G6v3QgbHXhuq1uIGNodW5nKioNCg0KLSBUw6xuaCB0cuG6oW5nIG7DoHkgbMOgIG3hu5l0IGPhuqNuaCBiw6FvIG5naGnDqm0gdMO6YyB24buBIGzhu5FpIHPhu5FuZyB0aGnhur91IGtp4buDbSBzb8OhdCBjw7RuZyBuZ2jhu4cgY+G7p2Egc2luaCB2acOqbiBoaeG7h24gbmF5LiBWaeG7h2MgeMOieSBk4buxbmcgY8OhYyBjaMawxqFuZyB0csOsbmggcXXhuqNuIGzDvSB0aOG7nWkgZ2lhbiBz4butIGThu6VuZyBt4bqhbmcgeMOjIGjhu5lpIHbDoCBnacOhbyBk4bulYyBz4bupYyBraOG7j2UgZ2nhuqVjIG5n4bunIG7Dqm4gxJHGsOG7o2MgeGVtIGzDoCDGsHUgdGnDqm4gdHJvbmcgbcO0aSB0csaw4budbmcgxJHhuqFpIGjhu41jLg==