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  13 variables:
##  $ Student_ID                  : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ 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" ...
##  $ Sleep_Hours_Per_Night       : num  6.5 7.5 5 7 6 4.5 8 6 6.5 7 ...
##  $ Mental_Health_Score         : num  6 8 5 7 6 4 9 6 7 7 ...
##  $ Relationship_Status         : chr  "In Relationship" "Single" "Complicated" "Single" ...
##  $ Conflicts_Over_Social_Media : num  3 0 4 1 2 5 0 2 1 1 ...
##  $ Addicted_Score              : num  8 3 9 4 7 9 2 8 5 4 ...

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

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

Tên biến Kiểu dữ liệu Giải thích
Student_ID Integer (Số nguyên) Mã số định danh duy nhất cho từng sinh viên tham gia khảo sát
Age Integer (Số nguyên) Tuổi của sinh viên (tính theo năm)
Gender Categorical Giới tính của sinh viên: Nam hoặc Nữ
Academic_Level Categorical Trình độ học vấn: Trung học, Đại học, Sau đại học
Country Categorical Quốc gia sinh sống của sinh viên
Avg_Daily_Usage_Hours Float (Số thực) Số giờ trung bình mỗi ngày sinh viên dành cho mạng xã hội
Most_Used_Platform Categorical Nền tảng mạng xã hội được sử dụng nhiều nhất: Instagram, Facebook, TikTok,…
Affects_Academic_Performance Boolean (Yes/No) Tự đánh giá xem mạng xã hội có ảnh hưởng đến việc học hay không
Sleep_Hours_Per_Night Float (Số thực) Số giờ ngủ trung bình mỗi đêm của sinh viên
Mental_Health_Score Integer (1-10) Mức độ sức khỏe tinh thần tự đánh giá (1 = kém, 10 = rất tốt)
Relationship_Status Categorical Tình trạng mối quan hệ: Độc thân, Đang yêu, Phức tạp
Conflicts_Over_Social_Media Integer (Số nguyên) Số lần mâu thuẫn trong mối quan hệ do mạng xã hội gây ra
Addicted_Score Integer (1-10) Điểm nghiện mạng xã hội (1 = không nghiện, 10 = rất nghiện)

1.2.2 THAY ĐỔI BIẾN ĐỊNH LƯỢNG THÀNH BIẾN ĐỊNH TÍNH

  • Để thuận tiện hơn cho việc phân tích dữ liệu, em sẽ thay đổi 2 biến định lượng thành định tính việc phân tích dễ hiểu hơn

Mục tiêu phân loại

- Phân loại sức khỏe tinh thần theo 3 dạng (Mental_Health_Score) → “Kém”, “Bình thường”, “Tốt”

  • 1–3 → Kém, 4–6 → Bình thường, 7–10 → Tốt

- Phân loại độ nghiện mạng xã hội theo 3 dạnh Addicted_Score → “Không nghiện”, “Bình thường”, “Nghiện nặng”

  • 1–3 → Không nghiện, 4–6 → Bình thường, 7–10 → Nghiện nặng

- Phân loại số giờ ngủ để đánh giá theo 2 dạng (Sleep_Hours_Per_Night) -> “thiếu ngủ” và “ngủ đủ”

  • Nếu ngủ trên 6.5 trung bình mỗi đêm là ngủ đủ và ngược lại

- Số lần mâu thuẫn (Conflicts_Over_Social_Media) Nhóm mới (Conflict_Level)

  • = 0 “Không”
  • 1 đến 4 “Khá nhiều”
  • 4 “Rất nhiều”

- Số giờ dùng MXH mỗi ngày (Avg_Daily_Usage_Hours) Mức độ sử dụng (Usage_Level) - < 3 giờ “Thấp” - 3 đến dưới 5 giờ “Trung bình” - ≥ 5 giờ “Cao”

data$Mental_Health_Category <- cut(
  data$Mental_Health_Score,
  breaks = c(0, 3, 6, 10),
  labels = c("Kem", "Bình thường", "Tốt"),
  include.lowest = TRUE,
  right = TRUE
)

# Phân loại Addicted_Score
data$Addiction_Level <- cut(
  data$Addicted_Score,
  breaks = c(0, 3, 6, 10),
  labels = c("Không nghiện", "Bình thường", "Nghiện nặng"),
  include.lowest = TRUE,
  right = TRUE
)
# Phân loại giấc ngủ
data$Sleep_Quality <- ifelse(
  data$Sleep_Hours_Per_Night > 6.5,
  "Ngủ đủ",
  "Thiếu ngủ"
)

# Chuyển đổi số lần mâu thuẫn sang biến định tính
data$Conflict_Level <- cut(data$Conflicts_Over_Social_Media,
                           breaks = c(-1, 0, 4, Inf),
                           labels = c("Khong", "Khá nhiều", "Rất nhiều"),
                           right = TRUE)

data$Usage_Level <- cut(data$Avg_Daily_Usage_Hours,
                        breaks = c(-Inf, 3, 5, Inf),
                        labels = c("Thấp", "Trung bình", "Cao"),
                        right = FALSE)

# Kiểm tra lại kết quả
table(data$Mental_Health_Category)
## 
##         Kem Bình thường         Tốt 
##           0         421         284
table(data$Addiction_Level)
## 
## Không nghiện  Bình thường  Nghiện nặng 
##           17          280          408
table(data$Sleep_Quality)
## 
##    Ngủ đủ Thiếu ngủ 
##       429       276
table(data$Conflict_Level)
## 
##     Khong Khá nhiều Rất nhiều 
##         4       686        15
table(data$Usage_Level)
## 
##       Thấp Trung bình        Cao 
##         43        354        308

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
##                   Student_ID                          Age 
##                            0                            0 
##                       Gender               Academic_Level 
##                            0                            0 
##                      Country        Avg_Daily_Usage_Hours 
##                            0                            0 
##           Most_Used_Platform Affects_Academic_Performance 
##                            0                            0 
##        Sleep_Hours_Per_Night          Mental_Health_Score 
##                            0                            0 
##          Relationship_Status  Conflicts_Over_Social_Media 
##                            0                            0 
##               Addicted_Score       Mental_Health_Category 
##                            0                            0 
##              Addiction_Level                Sleep_Quality 
##                            0                            0 
##               Conflict_Level                  Usage_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_Quality <- as.factor(data$Sleep_Quality)
data$Mental_Health_Category <- as.factor(data$Mental_Health_Category)
data$Addiction_Level <- as.factor(data$Addiction_Level)
data$Relationship_Status <- as.factor(data$Relationship_Status)
data$Conflict_Level <- as.factor(data$Conflict_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)
##                   Student_ID                          Age 
##                    "numeric"                     "factor" 
##                       Gender               Academic_Level 
##                     "factor"                     "factor" 
##                      Country        Avg_Daily_Usage_Hours 
##                     "factor"                    "numeric" 
##           Most_Used_Platform Affects_Academic_Performance 
##                     "factor"                     "factor" 
##        Sleep_Hours_Per_Night          Mental_Health_Score 
##                    "numeric"                    "numeric" 
##          Relationship_Status  Conflicts_Over_Social_Media 
##                     "factor"                    "numeric" 
##               Addicted_Score       Mental_Health_Category 
##                    "numeric"                     "factor" 
##              Addiction_Level                Sleep_Quality 
##                     "factor"                     "factor" 
##               Conflict_Level                  Usage_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_Category)
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           Kem         0        0.0
## 2   Bình thường       421       59.7
## 3           Tốt       284       40.3
2.5.1.1 Trực quan hoá
plot_pie(data, "Mental_Health_Category", "Phân loại sức khỏe tinh thần")

2.5.2 Nhận xét

  • Có đến 59.7% sinh viên đánh giá sức khỏe tinh thần của mình là “bình thường”, trong khi 40.3% cho rằng họ có sức khỏe “tốt”, và không có sinh viên nào là “kém”. Điều này có thể phản ánh nhận thức tích cực hoặc xu hướng tự đánh giá cao.

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$Addiction_Level)
addict_percent <- prop.table(addict_freq) * 100
data.frame(Addiction_Level = names(addict_freq),
           Frequency = as.numeric(addict_freq),
           Percentage = round(as.numeric(addict_percent), 1))
##   Addiction_Level Frequency Percentage
## 1    Không nghiện        17        2.4
## 2     Bình thường       280       39.7
## 3     Nghiện nặng       408       57.9
2.6.1.1 Trực quan hoá
plot_pie(data, "Addiction_Level", "Mức độ nghiện mạng xã hội")

2.6.2 Nhận xét

  • Tỷ lệ sinh viên nghiện nặng chiếm 57.9%, một con số đáng báo động. Chỉ 2.4% không nghiện mạng xã hội, cho thấy đây là một hiện tượng phổ biến và có thể ảnh hưởng đến nhiều khía cạnh trong cuộc sống sinh viên.

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_Quality)
sleep_percent <- prop.table(sleep_freq) * 100
data.frame(Sleep_Quality = names(sleep_freq),
           Frequency = as.numeric(sleep_freq),
           Percentage = round(as.numeric(sleep_percent), 1))
##   Sleep_Quality Frequency Percentage
## 1        Ngủ đủ       429       60.9
## 2     Thiếu ngủ       276       39.1
2.7.1.1 Trực quan hoá
plot_pie(data, "Sleep_Quality", "Tình trạng giấc ngủ")

2.7.2 Nhận xét

  • Có đến 60.9% sinh viên bị thiếu ngủ, trong khi chỉ 39.1% ngủ đủ. Tình trạng thiếu ngủ có thể liên quan đến việc sử dụng mạng xã hội quá mức hoặc áp lực học tập, ảnh hưởng tiêu cực đến sức khỏe và hiệu suất học tập.

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$Conflict_Level)
conflict_percent <- prop.table(conflict_freq) * 100
data.frame(Conflict_Level = names(conflict_freq),
           Frequency = as.numeric(conflict_freq),
           Percentage = round(as.numeric(conflict_percent), 1))
##   Conflict_Level Frequency Percentage
## 1          Khong         4        0.6
## 2      Khá nhiều       686       97.3
## 3      Rất nhiều        15        2.1
2.8.1.1 Trực quan hoá
plot_pie(data, "Conflict_Level", "Số lần mâu thuẫn do mạng xã hội")

2.8.2 Nhận xét

  • Dữ liệu cho thấy phần lớn sinh viên (chiếm 90.6%) thừa nhận rằng họ gặp “khá nhiều” mâu thuẫn liên quan đến mạng xã hội, trong khi chỉ 7.2% cho biết “không có mâu thuẫn” và 2.1% trải qua “rất nhiều mâu thuẫn”. Tỷ lệ cao này cho thấy mạng xã hội không chỉ là công cụ kết nối mà còn là nguồn phát sinh xung đột trong các mối quan hệ cá nhân hoặc học tập.

Việc hơn 90% sinh viên trải nghiệm mâu thuẫn ở mức độ nhất định chứng minh rằng tác động tiêu cực của mạng xã hội là phổ biến, có thể bắt nguồn từ việc hiểu lầm qua tin nhắn, đăng tải nội dung nhạy cảm, hay so sánh bản thân với người khác. Điều này nhấn mạnh sự cần thiết của các chương trình giáo dục truyền thông số, giúp sinh viên nâng cao năng lực ứng xử và kiểm soát hành vi khi sử dụng mạng xã hội trong môi trường học đường và xã hội.

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.

2.10. Mức độ sử dụng MXH

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

# Thống kê tần số
table_usage <- table(data$Usage_Level)
table_usage
## 
##       Thấp Trung bình        Cao 
##         43        354        308
# Thống kê tỷ lệ phần trăm
prop.table(table_usage) * 100
## 
##       Thấp Trung bình        Cao 
##   6.099291  50.212766  43.687943
plot_pie(data, "Usage_Level", "Phân bố trình Mức độ sử dụng mạng xã hội mỗi ngày")

2.10.2 Nhận xét

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 đó.

3.3 CHÁT LƯỢNG GIẤC NGỦ - THIẾU NGỦ

**3.3.1 Ước lượng khoảng tin cậy 95% cho tỷ lệ sinh viên thiếu ngủ*

prop.test(x = sum(data$Sleep_Quality == "Thiếu ngủ"),
          n = sum(!is.na(data$Sleep_Quality)),
          p = 0.4,
          conf.level = 0.95)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(data$Sleep_Quality == "Thiếu ngủ") out of sum(!is.na(data$Sleep_Quality)), null probability 0.4
## X-squared = 0.17878, df = 1, p-value = 0.6724
## alternative hypothesis: true p is not equal to 0.4
## 95 percent confidence interval:
##  0.355448 0.428730
## sample estimates:
##         p 
## 0.3914894

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

  • Giả thuyết:

    • H₀: p = 0.4 (tỷ lệ sinh viên đại học bằng 40%)
    • H₁: p ≠ 0.4 (tỷ lệ sinh viên thiếu ngủ khác 40%)

Nhận xét:

  • Tỷ lệ ước lượng từ mẫu (p̂) = 39.15%

  • Khoảng tin cậy 95%: [35.55%; 42.87%]

  • p-value = 0.6724, lớn hơn α = 0.05

  • Không đủ bằng chứng để bác bỏ giả thuyết H₀: p = 0.4

Kết quả kiểm định cho thấy rằng tỷ lệ sinh viên bị thiếu ngủ trong mẫu khảo sát là khoảng 39.15%, và không khác biệt có ý nghĩa thống kê so với tỷ lệ giả định 40%. Khoảng tin cậy 95% của tỷ lệ thiếu ngủ từ 35.5% đến 42.9% có bao gồm giá trị 0.4, và giá trị p-value khá lớn (0.6724) cho thấy sự khác biệt giữa tỷ lệ thực tế và giả định là không đáng kể. Nhưng bản thân con số 2 trong 5 sinh viên thiếu ngủ vẫn là một dấu hiệu đáng lo ngại về sức khỏe và chất lượng cuộc sống sinh viên. Điều này gợi ý cho tôi về kiểm định mối liên hệ giữa thiếu ngủ và các biến định tính khác

3.3 MỨC ĐỘ NGHIỆN MẠNG XÃ HỘI - NGHIỆN NẶNG

**3.3.1 Ước lượng khoảng tin cậy 95% cho tỷ lệ Nghiện nặng MXH*

# Kiểm định 1 phía: p > 0.5 cho nhóm "Nghiện nặng"
prop.test(
  x = sum(data$Addiction_Level == "Nghiện nặng"),
  n = sum(!is.na(data$Addiction_Level)),
  p = 0.5,
  alternative = "greater",   # Kiểm định một phía: lớn hơn
  conf.level = 0.95
)
## 
##  1-sample proportions test with continuity correction
## 
## data:  sum(data$Addiction_Level == "Nghiện nặng") out of sum(!is.na(data$Addiction_Level)), null probability 0.5
## X-squared = 17.163, df = 1, p-value = 1.715e-05
## alternative hypothesis: true p is greater than 0.5
## 95 percent confidence interval:
##  0.547178 1.000000
## sample estimates:
##         p 
## 0.5787234

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

  • Giả thuyết:

    • H₀ (Giả thuyết không): p ≤ 0.5 (tỷ lệ nghiện nặng không vượt quá 50%)
    • H₁ (Giả thuyết đối): p > 0.5 (tỷ lệ nghiện nặng lớn hơn 50%))

Nhận xét:

  • Kết quả kiểm định cho thấy p-value rất nhỏ (< 0.001), nhỏ hơn nhiều so với mức ý nghĩa α = 0.05. Điều này có nghĩa: Bác bỏ H₀ –Có đủ bằng chứng thống kê để kết luận rằng tỷ lệ sinh viên nghiện nặng mạng xã hội lớn hơn 50%.

  • Với tỷ lệ ước lượng là 57.87% và khoảng tin cậy 95% từ 54.7% đến 100%, dữ liệu cho thấy vấn đề nghiện mạng xã hội đã vượt mức “trung bình” và có dấu hiệu trở thành một hiện tượng phổ biến đáng lo ngại trong cộng đồng sinh viên.

Phân tích thực trạng (gắn với bối cảnh xã hội)

  • Việc gần 6 trong 10 sinh viên được khảo sát rơi vào nhóm “nghiện nặng” mạng xã hội phản ánh một thực trạng đáng quan tâm:
    • Mạng xã hội đang chiếm dụng thời gian và thói quen sinh hoạt của phần lớn sinh viên.
    • Hành vi nghiện mạng có thể liên quan đến: Thiếu ngủ, Giảm tập trung học tập, Suy giảm sức khỏe tinh thần, Mâu thuẫn trong các mối quan hệ -Đây không chỉ là một con số thống kê mà còn là tín hiệu cảnh báo về sự mất cân bằng giữa đời sống số và thực tế, ảnh hưởng sâu sắc đến chất lượng sống và học tập của sinh viên trong kỷ nguyên công nghệ

3.4 mức độ mâu thuẫn - CÓ MÂU THUẪN

**3.4.1 Ước lượng khoảng tin cậy 95% cho tỷ lệ Nghiện nặng MXH*

n_conflict_all <- sum(data$Conflict_Level %in% c("Khá nhiều", "Rất nhiều"))
n_total <- sum(!is.na(data$Conflict_Level))

prop.test(x = n_conflict_all,
          n = n_total,
          p = 0.8,
          alternative = "greater")
## 
##  1-sample proportions test with continuity correction
## 
## data:  n_conflict_all out of n_total, null probability 0.8
## X-squared = 165.18, df = 1, p-value < 2.2e-16
## alternative hypothesis: true p is greater than 0.8
## 95 percent confidence interval:
##  0.9864567 1.0000000
## sample estimates:
##         p 
## 0.9943262

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

  • Giả thuyết kiểm định (1 phía):

    • H₀: p ≤ 0.8 (tỷ lệ mâu thuẫn ≤ 80%)

    • H₁: p > 0.8 (tỷ lệ mâu thuẫn > 80%)

Nhận xét: - p-value < 2.2e-16 (rất nhỏ → có ý nghĩa thống kê mạnh)

  • Khoảng tin cậy 95%: [0.9865; 1.0000]

  • Kết quả kiểm định cho thấy tỷ lệ sinh viên có mâu thuẫn do mạng xã hội ở mức “khá nhiều” trở lên là 99.43%, cao hơn đáng kể so với mức giả định thông thường là 80%. Với p-value < 0.05, ta bác bỏ giả thuyết H₀ và chấp nhận H₁, tức là có đủ bằng chứng để kết luận rằng:

    • Mức độ mâu thuẫn liên quan đến mạng xã hội trong cộng đồng sinh viên là rất cao và vượt quá mức bình thường. cho thấy ảnh hưởng tiêu cực của môi trường trực tuyến đến các mối quan hệ cá nhân.

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_Quality, data$Addiction_Level)
table_sleep_addict
##            
##             Không nghiện Bình thường Nghiện nặng
##   Ngủ đủ              17         273         139
##   Thiếu ngủ            0           7         269

4.1.2 Trực quan hoá

library(ggplot2)

# Bảng tần số giữa Sleep_Quality và Addiction_Level
sleep_addict_tbl <- as.data.frame(table(data$Sleep_Quality, data$Addiction_Level))
colnames(sleep_addict_tbl) <- c("Sleep_Quality", "Addiction_Level", "Count")

ggplot(sleep_addict_tbl, aes(x = Sleep_Quality, y = Count, fill = Addiction_Level)) +
  geom_col(position = "dodge", width = 0.7) +
  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",
    x = "Chất lượng giấc ngủ",
    y = "Số lượng sinh viên",
    fill = "Mức độ nghiện"
  ) +
  scale_fill_brewer(palette = "Pastel2") +
  theme_minimal(base_size = 13)

4.1.3 Nhận xét

  • Tỷ lệ nghiện nặng cao ở nhóm thiếu ngủ:

    • Trong nhóm thiếu ngủ, hầu hết sinh viên rơi vào nhóm nghiện mạng xã hội nặng.

    • Điều này cho thấy có thể tồn tại một mối liên hệ tiêu cực giữa thời gian sử dụng mạng xã hội và chất lượng giấc ngủ.

  • Nhóm ngủ đủ vẫn có người nghiện nặng:

    • Mặc dù sinh viên ngủ đủ phần lớn nằm ở nhóm nghiện mức bình thường, vẫn có một bộ phận đáng kể nghiện nặng, cho thấy giấc ngủ không hoàn toàn loại trừ nguy cơ nghiện.
  • Tỷ lệ không nghiện rất thấp ở cả hai nhóm:

    - 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_Quality, data$Addiction_Level)
table_sleep_addict
##            
##             Không nghiện Bình thường Nghiện nặng
##   Ngủ đủ              17         273         139
##   Thiếu ngủ            0           7         269
# Kiểm định Chi bình phương
chisq.test(table_sleep_addict)
## 
##  Pearson's Chi-squared test
## 
## data:  table_sleep_addict
## X-squared = 291.65, df = 2, p-value < 2.2e-16

Các giả thuyết

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

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

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

  • Chi-squared = 291.65

  • bậc tự do (df) = 2

  • p-value < 2.2e-16

Nhận xét:

  • 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

  • Cụ thể, ta thấy rằng:

    • Trong nhóm thiếu ngủ, tỷ lệ nghiện nặng là rất cao (269/276 ≈ 97.5%), trong khi nhóm ngủ đủ có tỷ lệ này thấp hơn (139/429 ≈ 32.4%).

    • Không có trường hợp không nghiện nào trong nhóm thiếu ngủ, trong khi nhóm ngủ đủ lại có đến 17 sinh viên.

4.1.5 Relative Risk

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\Rtmpkbilto\downloaded_packages
library(epitools)
# Tạo bảng chéo
table_Sleep_Addict <- table(data$Sleep_Quality, data$Addiction_Level)
# RR
riskratio(table_Sleep_Addict)
## $data
##            
##             Không nghiện Bình thường Nghiện nặng Total
##   Ngủ đủ              17         273         139   429
##   Thiếu ngủ            0           7         269   276
##   Total               17         280         408   705
## 
## $measure
##            risk ratio with 95% C.I.
##             estimate    lower    upper
##   Ngủ đủ    1.000000       NA       NA
##   Thiếu ngủ 1.062271 1.032196 1.093222
## 
## $p.value
##            two-sided
##             midp.exact fisher.exact   chi.square
##   Ngủ đủ            NA           NA           NA
##   Thiếu ngủ  0.6590497  1.59906e-77 4.658076e-64
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét - nhóm tham chiếu được chọn là Ngủ đủ - Kết quả RR = 1.062 -> Nhóm thiếu ngủ có nguy cơ nghiện mạng xã hội nặng cao hơn 6.2% so với nhóm ngủ đủ. NHƯNG KHÁC BIỆT KHÔNG QUÁ NHIỀU

  • Khoảng tin cậy 95%: từ 1.032 đến 1.093 → không chứa 1, nghĩa là kết quả có ý nghĩa thống kê.

  • Chi-square p-value = 4.66e-64 ⇒ Rất nhỏ ⇒ bác bỏ giả thuyết H₀

  • Nghĩa là có mối liên hệ có ý nghĩa giữa thiếu ngủ và nghiện mạng xã hội nặng

4.1.6 Odds ratio

# Tạo biến Addiction_Binary: TRUE nếu là "Nghiện nặng", FALSE nếu không
data$Addict_Heavy <- data$Addiction_Level == "Nghiện nặng"

# Tạo bảng 2x2 giữa Chất lượng giấc ngủ và Nghiện nặng
table_sleep_addict_2x2 <- table(data$Sleep_Quality, data$Addict_Heavy)

# Hiệu chỉnh để tránh lỗi
table_corrected <- table_sleep_addict_2x2

# Tính Odds Ratio
library(epitools)
oddsratio(table_corrected)
## $data
##            
##             FALSE TRUE Total
##   Ngủ đủ      290  139   429
##   Thiếu ngủ     7  269   276
##   Total       297  408   705
## 
## $measure
##            odds ratio with 95% C.I.
##             estimate    lower    upper
##   Ngủ đủ     1.00000       NA       NA
##   Thiếu ngủ 78.00783 38.52593 187.6693
## 
## $p.value
##            two-sided
##             midp.exact fisher.exact   chi.square
##   Ngủ đủ            NA           NA           NA
##   Thiếu ngủ          0 2.742975e-78 2.215124e-65
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét - nhóm tham chiếu được chọn là Ngủ đủ

- Kết quả OR = 78.00783 cho ta thấy Sinh viên thiếu ngủ có nguy cơ nghiện mạng xã hội cao hơn 78 lần so với sinh viên ngủ đủ, với độ tin cậy 95% (CI: [38.5 ; 187.7]). p-value cực kỳ nhỏ (≈ 0) ⇒ Mối liên hệ này rất có ý nghĩa thống kê.

  • ta thấy được rằng: Có mối liên hệ rất mạnh và có ý nghĩa thống kê cao giữa việc thiếu ngủ và nghiện mạng xã hội. Điều này phản ánh rằng những sinh viên thiếu ngủ có xu hướng nghiện mạng xã hội nhiều hơn, hoặc ngược lại — nghiện mạng xã hội dẫn đến rối loạn 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+G7kWMqKg0KDQpgYGB7cn0NCmxpYnJhcnkoeGxzeCkNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdtb2RlbHMpDQoNCmRhdGEgPC0gcmVhZC54bHN4KGZpbGUgPSAiQzovVXNlcnMvUENfRGVsbC9Eb3dubG9hZHMvU3R1ZGVudHNfU29jaWFsX01lZGlhX0FkZGljdGlvbi54bHN4Iiwgc2hlZXRJbmRleCA9IDEsIGhlYWRlciA9IFQpDQpgYGANCg0KLSAqKkPhuqV1IHRyw7pjIGLhu5kgZOG7ryBsaeG7h3UqKg0KDQpgYGB7cn0NCnN0cihkYXRhKQ0KYGBgDQoNCiMjIyAqKjEuMi4gVOG7lE5HIFFVQU4gVuG7gCBE4buuIExJ4buGVSoqDQoNCiMjIyMgKioxLjIuMSBEYW5oIHPDoWNoIGPDoWMgYmnhur9uIHbDoCBtw7QgdOG6oyoqDQoNCnwgVMOqbiBiaeG6v24gICAgICAgICAgICAgICAgICAgICAgICAgICB8IEtp4buDdSBk4buvIGxp4buHdSAgICAgICAgfCBHaeG6o2kgdGjDrWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwNCnwgKipTdHVkZW50XF9JRCoqICAgICAgICAgICAgICAgICAgICB8IEludGVnZXIgKFPhu5Egbmd1ecOqbikgfCBNw6Mgc+G7kSDEkeG7i25oIGRhbmggZHV5IG5o4bqldCBjaG8gdOG7q25nIHNpbmggdmnDqm4gdGhhbSBnaWEga2jhuqNvIHPDoXQgICAgICAgICAgICAgICAgIHwNCnwgKipBZ2UqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEludGVnZXIgKFPhu5Egbmd1ecOqbikgfCBUdeG7lWkgY+G7p2Egc2luaCB2acOqbiAodMOtbmggdGhlbyBuxINtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKkdlbmRlcioqICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2F0ZWdvcmljYWwgICAgICAgICB8IEdp4bubaSB0w61uaCBj4bunYSBzaW5oIHZpw6puOiAqTmFtKiBob+G6t2MgKk7hu68qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqQWNhZGVtaWNcX0xldmVsKiogICAgICAgICAgICAgICAgfCBDYXRlZ29yaWNhbCAgICAgICAgIHwgVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuOiBUcnVuZyBo4buNYywgxJDhuqFpIGjhu41jLCBTYXUgxJHhuqFpIGjhu41jICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8DQp8ICoqQ291bnRyeSoqICAgICAgICAgICAgICAgICAgICAgICAgfCBDYXRlZ29yaWNhbCAgICAgICAgIHwgUXXhu5FjIGdpYSBzaW5oIHPhu5FuZyBj4bunYSBzaW5oIHZpw6puICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipBdmdcX0RhaWx5XF9Vc2FnZVxfSG91cnMqKiAgICAgICB8IEZsb2F0IChT4buRIHRo4buxYykgICAgIHwgU+G7kSBnaeG7nSB0cnVuZyBiw6xuaCBt4buXaSBuZ8OgeSBzaW5oIHZpw6puIGTDoG5oIGNobyBt4bqhbmcgeMOjIGjhu5lpICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKk1vc3RcX1VzZWRcX1BsYXRmb3JtKiogICAgICAgICAgIHwgQ2F0ZWdvcmljYWwgICAgICAgICB8IE7hu4FuIHThuqNuZyBt4bqhbmcgeMOjIGjhu5lpIMSRxrDhu6NjIHPhu60gZOG7pW5nIG5oaeG7gXUgbmjhuqV0OiBJbnN0YWdyYW0sIEZhY2Vib29rLCBUaWtUb2ssLi4uIHwNCnwgKipBZmZlY3RzXF9BY2FkZW1pY1xfUGVyZm9ybWFuY2UqKiB8IEJvb2xlYW4gKFllcy9ObykgICAgfCBU4buxIMSRw6FuaCBnacOhIHhlbSBt4bqhbmcgeMOjIGjhu5lpIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gdmnhu4djIGjhu41jIGhheSBraMO0bmcgICAgICAgICAgICAgICB8DQp8ICoqU2xlZXBcX0hvdXJzXF9QZXJcX05pZ2h0KiogICAgICAgfCBGbG9hdCAoU+G7kSB0aOG7sWMpICAgICB8IFPhu5EgZ2nhu50gbmfhu6cgdHJ1bmcgYsOsbmggbeG7l2kgxJHDqm0gY+G7p2Egc2luaCB2acOqbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KfCAqKk1lbnRhbFxfSGVhbHRoXF9TY29yZSoqICAgICAgICAgIHwgSW50ZWdlciAoMS0xMCkgICAgICB8IE3hu6ljIMSR4buZIHPhu6ljIGto4buPZSB0aW5oIHRo4bqnbiB04buxIMSRw6FuaCBnacOhICgxID0ga8OpbSwgMTAgPSBy4bqldCB04buRdCkgICAgICAgICAgICAgICAgIHwNCnwgKipSZWxhdGlvbnNoaXBcX1N0YXR1cyoqICAgICAgICAgICB8IENhdGVnb3JpY2FsICAgICAgICAgfCBUw6xuaCB0cuG6oW5nIG3hu5FpIHF1YW4gaOG7hzogxJDhu5ljIHRow6JuLCDEkGFuZyB5w6p1LCBQaOG7qWMgdOG6oXAgICAgICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipDb25mbGljdHNcX092ZXJcX1NvY2lhbFxfTWVkaWEqKiB8IEludGVnZXIgKFPhu5Egbmd1ecOqbikgfCBT4buRIGzhuqduIG3DonUgdGh14bqrbiB0cm9uZyBt4buRaSBxdWFuIGjhu4cgZG8gbeG6oW5nIHjDoyBo4buZaSBnw6J5IHJhICAgICAgICAgICAgICAgICAgICAgIHwNCnwgKipBZGRpY3RlZFxfU2NvcmUqKiAgICAgICAgICAgICAgICB8IEludGVnZXIgKDEtMTApICAgICAgfCDEkGnhu4NtIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkgKDEgPSBraMO0bmcgbmdoaeG7h24sIDEwID0gcuG6pXQgbmdoaeG7h24pICAgICAgICAgICAgICAgICAgIHwNCg0KIyMjIyAqKjEuMi4yIFRIQVkgxJDhu5RJIEJJ4bq+TiDEkOG7ik5IIEzGr+G7ok5HIFRIw4BOSCBCSeG6vk4gxJDhu4pOSCBUw41OSCoqDQoNCi0gxJDhu4MgdGh14bqtbiB0aeG7h24gaMahbiBjaG8gdmnhu4djIHBow6JuIHTDrWNoIGThu68gbGnhu4d1LCBlbSBz4bq9IHRoYXkgxJHhu5VpIDIgYmnhur9uIMSR4buLbmggbMaw4bujbmcgdGjDoG5oIMSR4buLbmggdMOtbmggdmnhu4djIHBow6JuIHTDrWNoIGThu4UgaGnhu4N1IGjGoW4NCg0KKipN4bulYyB0acOqdSBwaMOibiBsb+G6oWkqKg0KDQoqKi0gUGjDom4gbG/huqFpIHPhu6ljIGto4buPZSB0aW5oIHRo4bqnbiB0aGVvIDMgZOG6oW5nIChNZW50YWxfSGVhbHRoX1Njb3JlKSDihpIgIkvDqW0iLCAiQsOsbmggdGjGsOG7nW5nIiwgIlThu5F0IioqDQoNCi0gMeKAkzMg4oaSIEvDqW0sIDTigJM2IOKGkiBCw6xuaCB0aMaw4budbmcsIDfigJMxMCDihpIgVOG7kXQNCg0KKiotICBQaMOibiBsb+G6oWkgxJHhu5kgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSB0aGVvIDMgZOG6oW5oIEFkZGljdGVkX1Njb3JlIOKGkiAiS2jDtG5nIG5naGnhu4duIiwgIkLDrG5oIHRoxrDhu51uZyIsICJOZ2hp4buHbiBu4bq3bmciKioNCg0KLSAx4oCTMyDihpIgS2jDtG5nIG5naGnhu4duLCA04oCTNiDihpIgQsOsbmggdGjGsOG7nW5nLCA34oCTMTAg4oaSIE5naGnhu4duIG7hurduZw0KDQoNCioqLSBQaMOibiBsb+G6oWkgc+G7kSBnaeG7nSBuZ+G7pyDEkeG7gyDEkcOhbmggZ2nDoSB0aGVvIDIgZOG6oW5nIChTbGVlcF9Ib3Vyc19QZXJfTmlnaHQpIC0+ICJ0aGnhur91IG5n4bunIiB2w6AgIm5n4bunIMSR4bunIioqDQoNCi0gTuG6v3Ugbmfhu6cgdHLDqm4gNi41IHRydW5nIGLDrG5oIG3hu5dpIMSRw6ptIGzDoCBuZ+G7pyDEkeG7pyB2w6AgbmfGsOG7o2MgbOG6oWkNCg0KKiotIFPhu5EgbOG6p24gbcOidSB0aHXhuqtuIChDb25mbGljdHNfT3Zlcl9Tb2NpYWxfTWVkaWEpCU5ow7NtIG3hu5tpIChDb25mbGljdF9MZXZlbCkqKg0KDQogIC0gPSAwCSJLaMO0bmciDQogIC0gMSDEkeG6v24gNAkiS2jDoSBuaGnhu4F1Ig0KICAtID4gNAkiUuG6pXQgbmhp4buBdSINCg0KKiotIFPhu5EgZ2nhu50gZMO5bmcgTVhIIG3hu5dpIG5nw6B5IChBdmdfRGFpbHlfVXNhZ2VfSG91cnMpCU3hu6ljIMSR4buZIHPhu60gZOG7pW5nIChVc2FnZV9MZXZlbCkqKg0KICAtIDwgMyBnaeG7nQkiVGjhuqVwIg0KICAtIDMgxJHhur9uIGTGsOG7m2kgNSBnaeG7nQkiVHJ1bmcgYsOsbmgiDQogIC0g4omlIDUgZ2nhu50JIkNhbyINCiAgDQpgYGB7cn0NCmRhdGEkTWVudGFsX0hlYWx0aF9DYXRlZ29yeSA8LSBjdXQoDQogIGRhdGEkTWVudGFsX0hlYWx0aF9TY29yZSwNCiAgYnJlYWtzID0gYygwLCAzLCA2LCAxMCksDQogIGxhYmVscyA9IGMoIktlbSIsICJCw6xuaCB0aMaw4budbmciLCAiVOG7kXQiKSwNCiAgaW5jbHVkZS5sb3dlc3QgPSBUUlVFLA0KICByaWdodCA9IFRSVUUNCikNCg0KIyBQaMOibiBsb+G6oWkgQWRkaWN0ZWRfU2NvcmUNCmRhdGEkQWRkaWN0aW9uX0xldmVsIDwtIGN1dCgNCiAgZGF0YSRBZGRpY3RlZF9TY29yZSwNCiAgYnJlYWtzID0gYygwLCAzLCA2LCAxMCksDQogIGxhYmVscyA9IGMoIktow7RuZyBuZ2hp4buHbiIsICJCw6xuaCB0aMaw4budbmciLCAiTmdoaeG7h24gbuG6t25nIiksDQogIGluY2x1ZGUubG93ZXN0ID0gVFJVRSwNCiAgcmlnaHQgPSBUUlVFDQopDQojIFBow6JuIGxv4bqhaSBnaeG6pWMgbmfhu6cNCmRhdGEkU2xlZXBfUXVhbGl0eSA8LSBpZmVsc2UoDQogIGRhdGEkU2xlZXBfSG91cnNfUGVyX05pZ2h0ID4gNi41LA0KICAiTmfhu6cgxJHhu6ciLA0KICAiVGhp4bq/dSBuZ+G7pyINCikNCg0KIyBDaHV54buDbiDEkeG7lWkgc+G7kSBs4bqnbiBtw6J1IHRodeG6q24gc2FuZyBiaeG6v24gxJHhu4tuaCB0w61uaA0KZGF0YSRDb25mbGljdF9MZXZlbCA8LSBjdXQoZGF0YSRDb25mbGljdHNfT3Zlcl9Tb2NpYWxfTWVkaWEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC0xLCAwLCA0LCBJbmYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiS2hvbmciLCAiS2jDoSBuaGnhu4F1IiwgIlLhuqV0IG5oaeG7gXUiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gVFJVRSkNCg0KZGF0YSRVc2FnZV9MZXZlbCA8LSBjdXQoZGF0YSRBdmdfRGFpbHlfVXNhZ2VfSG91cnMsDQogICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC1JbmYsIDMsIDUsIEluZiksDQogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJUaOG6pXAiLCAiVHJ1bmcgYsOsbmgiLCAiQ2FvIiksDQogICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IEZBTFNFKQ0KDQojIEtp4buDbSB0cmEgbOG6oWkga+G6v3QgcXXhuqMNCnRhYmxlKGRhdGEkTWVudGFsX0hlYWx0aF9DYXRlZ29yeSkNCnRhYmxlKGRhdGEkQWRkaWN0aW9uX0xldmVsKQ0KdGFibGUoZGF0YSRTbGVlcF9RdWFsaXR5KQ0KdGFibGUoZGF0YSRDb25mbGljdF9MZXZlbCkNCnRhYmxlKGRhdGEkVXNhZ2VfTGV2ZWwpDQpgYGANCg0KIyMjIyAqKjEuMi4zIEtp4buDbSB0cmEgZOG7ryBsaeG7h3UqKg0KDQojIyMjIyAqKjEuMi4zLjEgS2nhu4NtIHRyYSBz4buRIGzGsOG7o25nIE5BIHRyb25nIGPhu5l0IMSR4buLbmggdMOtbmgqKg0KDQpgYGB7cn0NCiMgS2nhu4NtIHRyYSBz4buRIGzGsOG7o25nIE5BIHRyb25nIG3hu5dpIGPhu5l0IMSR4buLbmggdMOtbmgNCm5hX2NvdW50cyA8LSBzYXBwbHkoZGF0YSwgZnVuY3Rpb24oeCkgc3VtKGlzLm5hKHgpKSkNCm5hX2NvdW50cw0KYGBgDQoNCg0KKipOaOG6rW4geMOpdCoqIA0KLSBL4bq/dCBxdeG6oyB0aHUgxJHGsOG7o2MgY2hvIHRo4bqleSBy4bqxbmcgdOG6pXQgY+G6oyBjw6FjIGPhu5l0IMSR4buLbmggdMOtbmggxJHhu4F1IGtow7RuZyBjw7MgZ2nDoSB0cuG7iyB0aGnhur91IChOQSkgdsOsIHPhu5EgbMaw4bujbmcgTkEgdHJvbmcgY8OhYyBj4buZdCDEkeG7gXUgaGnhu4NuIHRo4buLIGzDoCAwDQoNCiMjIyMjICoqMS4yLjMuMiBDaHV54buDbiDEkeG7lWkgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBzYW5nIGtp4buDdSBmYWN0b3IqKg0KDQpgYGB7cn0NCiMgQ2h1eeG7g24gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCBzYW5nIGZhY3Rvcg0KZGF0YSRBZ2UgPC0gYXMuZmFjdG9yKGRhdGEkQWdlKQ0KZGF0YSRHZW5kZXIgPC0gYXMuZmFjdG9yKGRhdGEkR2VuZGVyKQ0KZGF0YSRBY2FkZW1pY19MZXZlbCA8LSBhcy5mYWN0b3IoZGF0YSRBY2FkZW1pY19MZXZlbCkNCmRhdGEkQ291bnRyeSA8LSBhcy5mYWN0b3IoZGF0YSRDb3VudHJ5KQ0KZGF0YSRNb3N0X1VzZWRfUGxhdGZvcm0gPC0gYXMuZmFjdG9yKGRhdGEkTW9zdF9Vc2VkX1BsYXRmb3JtKQ0KZGF0YSRBZmZlY3RzX0FjYWRlbWljX1BlcmZvcm1hbmNlIDwtIGFzLmZhY3RvcihkYXRhJEFmZmVjdHNfQWNhZGVtaWNfUGVyZm9ybWFuY2UpDQpkYXRhJFNsZWVwX1F1YWxpdHkgPC0gYXMuZmFjdG9yKGRhdGEkU2xlZXBfUXVhbGl0eSkNCmRhdGEkTWVudGFsX0hlYWx0aF9DYXRlZ29yeSA8LSBhcy5mYWN0b3IoZGF0YSRNZW50YWxfSGVhbHRoX0NhdGVnb3J5KQ0KZGF0YSRBZGRpY3Rpb25fTGV2ZWwgPC0gYXMuZmFjdG9yKGRhdGEkQWRkaWN0aW9uX0xldmVsKQ0KZGF0YSRSZWxhdGlvbnNoaXBfU3RhdHVzIDwtIGFzLmZhY3RvcihkYXRhJFJlbGF0aW9uc2hpcF9TdGF0dXMpDQpkYXRhJENvbmZsaWN0X0xldmVsIDwtIGFzLmZhY3RvcihkYXRhJENvbmZsaWN0X0xldmVsKQ0KYGBgDQoNCioqS2nhu4NtIHRyYSBs4bqhaSBzYXUga2hpIGNodXnhu4NuIMSR4buVaSoqDQoNCkdp4bqjaSB0aMOtY2g6DQoNCi0gc2FwcGx5KGRhdGEsIGNsYXNzKTogw4FwIGThu6VuZyBow6BtIGNsYXNzKCkgY2hvIHThu6tuZyBj4buZdCDEkeG7gyBraeG7g20gdHJhIGtp4buDdSBk4buvIGxp4buHdS4gS+G6v3QgcXXhuqMgdHLhuqMgduG7gSBsw6AgbeG7mXQgdmVjdG9yIGhp4buDbiB0aOG7iyB0w6puIGPhu5l0IHbDoCBsb+G6oWkgZOG7ryBsaeG7h3UgdMawxqFuZyDhu6luZy4NCg0KLSBO4bq/dSBr4bq/dCBxdeG6oyBsw6AgImZhY3RvciIgY2hvIHThuqV0IGPhuqMgY8OhYyBj4buZdCDihpIgY2h1eeG7g24gxJHhu5VpIHRow6BuaCBjw7RuZy4NCg0KYGBge3J9DQpzYXBwbHkoZGF0YSwgY2xhc3MpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqIDogS+G6v3QgcXXhuqMgdGh1IMSRxrDhu6NjIHRvw6BuIGLhu5kgY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaCDEkcOjIMSRxrDhu6NjIGNodXnhu4NuIMSR4buVaSB0aMOgbmggZOG6oW5nIGZhY3Rvci4NCg0KIyMgKipQSOG6pk4gMjogUEjDgk4gVMONQ0ggTcOUIFThuqIgQknhur5OIMSQ4buKTkggVMONTkgqKg0KDQpgYGB7cn0NCmluc3RhbGwucGFja2FnZXMoImdncGxvdDIiLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYGBgDQoNCiMjIyAqKjIuMS4gR2VuZGVyIC0gR2nhu5tpIHTDrW5oKioNCg0KIyMjIyAqKjIuMS4xIFRo4buRbmcga8OqIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KdGFiX2dlbmRlciA8LSB0YWJsZShkYXRhJEdlbmRlcikNCnRhYl9nZW5kZXINCnRhYmxlKGRhdGEkR2VuZGVyKS9zdW0obnJvdyhkYXRhKSkNCmBgYA0KDQojIyMjIyAqKjIuMS4xLjIgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBkYXRhZnJhbWUgdOG7qyBi4bqjbmcgdOG6p24gc+G7kQ0KZ2VuZGVyX2ZyZXEgPC0gYXMuZGF0YS5mcmFtZSh0YWJfZ2VuZGVyKQ0KY29sbmFtZXMoZ2VuZGVyX2ZyZXEpIDwtIGMoIkdlbmRlciIsICJGcmVxdWVuY3kiKQ0KDQojIFTDrW5oIHBo4bqnbiB0csSDbQ0KZ2VuZGVyX2ZyZXEkUGVyY2VudGFnZSA8LSBnZW5kZXJfZnJlcSRGcmVxdWVuY3kgLyBzdW0oZ2VuZGVyX2ZyZXEkRnJlcXVlbmN5KSAqIDEwMA0KDQojIFThuqFvIG5ow6NuIGNo4buJIGfhu5NtIHBo4bqnbiB0csSDbQ0KZ2VuZGVyX2ZyZXEkTGFiZWwgPC0gcGFzdGUwKHJvdW5kKGdlbmRlcl9mcmVxJFBlcmNlbnRhZ2UsIDEpLCAiJSIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4gduG7m2kgbmjDo24gY2jhu4kgcGjhuqduIHRyxINtDQpnZ3Bsb3QoZ2VuZGVyX2ZyZXEsIGFlcyh4ID0gIiIsIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gR2VuZGVyKSkgKw0KICBnZW9tX2NvbCh3aWR0aCA9IDEsIGNvbG9yID0gIndoaXRlIikgKw0KICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKw0KICB0aGVtZV92b2lkKCkgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gTGFiZWwpLCBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC41KSwgc2l6ZSA9IDUpICsNCiAgbGFicyh0aXRsZSA9ICJQaMOibiBi4buRIGdp4bubaSB0w61uaCBj4bunYSBzaW5oIHZpw6puIikgKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlBhc3RlbDEiKQ0KDQpgYGANCg0KIyMjIyAqKjIuMS4yIE5o4bqtbiB4w6l0KioNCg0KQmnhu4N1IMSR4buTIHRyw7JuIHRo4buDIGhp4buHbiBwaMOibiBi4buRIGdp4bubaSB0w61uaCB0cm9uZyBi4buZIGThu68gbGnhu4d1IHNpbmggdmnDqm4gY2hvIHRo4bqleSB04bu3IGzhu4cgZ2nhu69hIG5hbSB2w6AgbuG7ryBsw6AgZ+G6p24gbmjGsCB0xrDGoW5nIMSRxrDGoW5nOg0KDQotIE7hu68gY2hp4bq/bSA1MC4xJSAoMzUzIG5nxrDhu51pKQ0KDQotIE5hbSBjaGnhur9tIDQ5LjklICgzNTIgbmfGsOG7nWkpDQoNCi0gU+G7sSBjaMOqbmggbOG7h2NoIGdp4buvYSBoYWkgbmjDs20gbMOgIGtow7RuZyDEkcOhbmcga+G7gyAoY2jhu4kgMSBuZ8aw4budaSksIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGLhu5kgZOG7ryBsaeG7h3UgY8OzIGPDom4gYuG6sW5nIHbhu4EgZ2nhu5tpIHTDrW5oLCBwaMO5IGjhu6NwIMSR4buDIHRp4bq/biBow6BuaCBjw6FjIHBow6JuIHTDrWNoIHNvIHPDoW5oIHRoZW8gZ2nhu5tpIG3DoCBraMO0bmcgbG8gdGhpw6puIGzhu4djaCBt4bqrdS4NCg0KLSBWaeG7h2MgY8OzIHPhu7EgcGjDom4gcGjhu5FpIGdp4bubaSB0w61uaCDEkeG7k25nIMSR4buBdSBsw6AgbeG7mXQgeeG6v3UgdOG7kSBxdWFuIHRy4buNbmcgZ2nDunAgdMSDbmcgxJHhu5kgdGluIGPhuq15IGtoaSBraeG7g20gxJHhu4tuaCBjw6FjIGdp4bqjIHRodXnhur90IGxpw6puIHF1YW4gxJHhur9uIGdp4bubaSwgbmjGsDoNCg0KICAtIFNvIHPDoW5oIG3hu6ljIMSR4buZIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkgZ2nhu69hIG5hbSB2w6AgbuG7rw0KDQogIC0gTeG7kWkgcXVhbiBo4buHIGdp4buvYSBnaeG7m2kgdMOtbmggdsOgIHPhu6ljIGto4buPZSB0aW5oIHRo4bqnbg0KDQogIC0gVMOhYyDEkeG7mW5nIGPhu6dhIG3huqFuZyB4w6MgaOG7mWkgxJHhur9uIGjhu41jIHThuq1wIHRoZW8gZ2nhu5tpDQoNCiMjIyAqKjIuMi4gVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuKioNCg0KIyMjIyAqKjIuMi4xIFRo4buRbmcga8OqIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KbGV2ZWxfZnJlcSA8LSB0YWJsZShkYXRhJEFjYWRlbWljX0xldmVsKQ0KbGV2ZWxfcGVyY2VudCA8LSBwcm9wLnRhYmxlKGxldmVsX2ZyZXEpICogMTAwDQpkYXRhLmZyYW1lKEFjYWRlbWljX0xldmVsID0gbmFtZXMobGV2ZWxfZnJlcSksDQogICAgICAgICAgIEZyZXF1ZW5jeSA9IGFzLm51bWVyaWMobGV2ZWxfZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKGxldmVsX3BlcmNlbnQpLCAxKSkNCmBgYA0KDQojIyMjIyAqKjIuMS4xLjIgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCmBgYHtyfQ0KIyBMb2FkIHRoxrAgdmnhu4duDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikgICMgZMO5bmcgY2hvIHBhbGV0dGUgbcOgdQ0KDQojIEjDoG0gdMOhaSBz4butIGThu6VuZyDEkeG7gyB44butIGzDvSB2w6AgduG6vSBiaeG7g3UgxJHhu5MNCnBsb3RfcGllIDwtIGZ1bmN0aW9uKGRhdGEsIHZhciwgdGl0bGUpIHsNCiAgdGFiIDwtIHRhYmxlKGRhdGFbW3Zhcl1dKQ0KICBkZiA8LSBhcy5kYXRhLmZyYW1lKHRhYikNCiAgY29sbmFtZXMoZGYpIDwtIGMoIkNhdGVnb3J5IiwgIkZyZXF1ZW5jeSIpDQogIGRmJFBlcmNlbnRhZ2UgPC0gZGYkRnJlcXVlbmN5IC8gc3VtKGRmJEZyZXF1ZW5jeSkgKiAxMDANCiAgZGYkTGFiZWwgPC0gcGFzdGUwKHJvdW5kKGRmJFBlcmNlbnRhZ2UsIDEpLCAiJSIpDQogIA0KICBnZ3Bsb3QoZGYsIGFlcyh4ID0gIiIsIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gQ2F0ZWdvcnkpKSArDQogICAgZ2VvbV9jb2wod2lkdGggPSAxLCBjb2xvciA9ICJ3aGl0ZSIpICsNCiAgICBjb29yZF9wb2xhcih0aGV0YSA9ICJ5IikgKw0KICAgIHRoZW1lX3ZvaWQoKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IExhYmVsKSwgcG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSksIHNpemUgPSA1KSArDQogICAgbGFicyh0aXRsZSA9IHRpdGxlLCBmaWxsID0gdmFyKSArDQogICAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJQYXN0ZWwxIikNCn0NCnBsb3RfcGllKGRhdGEsICJBY2FkZW1pY19MZXZlbCIsICJQaMOibiBi4buRIHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBj4bunYSBzaW5oIHZpw6puIikNCmBgYA0KDQoNCiMjIyMgKioyLjIuMiBOaOG6rW4geMOpdCoqDQoNCi0gUGjhuqduIGzhu5tuIHNpbmggdmnDqm4gdGh14buZYyBi4bqtYyDEkeG6oWkgaOG7jWMgKFVuZGVyZ3JhZHVhdGUpICg1MC4xJSksIHRp4bq/cCB0aGVvIGzDoCBzYXUgxJHhuqFpIGjhu41jIChHcmFkdWF0ZSkgKDQ2LjElKSwgdHJvbmcga2hpIGLhuq1jIHRydW5nIGjhu41jIChIaWdoIFNjaG9vbCkgY2jhu4kgY2hp4bq/bSAzLjglLiDEkGnhu4F1IG7DoHkgcGjhuqNuIMOhbmggxJFhIHPhu5EgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQgbMOgIHNpbmggdmnDqm4gxJHhuqFpIGjhu41jIHRy4bufIGzDqm4uDQoNCg0KIyMjICoqMi4zLiBUw6FjIMSR4buZbmcgY+G7p2EgbeG6oW5nIHjDoyBo4buZaSDEkeG6v24gaOG7jWMgdOG6rXAqKg0KDQojIyMjICoqMi4zLjEgVGjhu5FuZyBrw6ogdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCB0cuG7sWMgcXVhbiBow7NhKioNCmBgYHtyfQ0KYWZmZWN0X2ZyZXEgPC0gdGFibGUoZGF0YSRBZmZlY3RzX0FjYWRlbWljX1BlcmZvcm1hbmNlKQ0KYWZmZWN0X3BlcmNlbnQgPC0gcHJvcC50YWJsZShhZmZlY3RfZnJlcSkgKiAxMDANCmRhdGEuZnJhbWUoQWZmZWN0cyA9IG5hbWVzKGFmZmVjdF9mcmVxKSwNCiAgICAgICAgICAgRnJlcXVlbmN5ID0gYXMubnVtZXJpYyhhZmZlY3RfZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKGFmZmVjdF9wZXJjZW50KSwgMSkpDQpgYGANCiMjIyMgKioyLjMuMS4xIHRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCnBsb3RfcGllKGRhdGEsICJBZmZlY3RzX0FjYWRlbWljX1BlcmZvcm1hbmNlIiwgIlTDoWMgxJHhu5luZyBj4bunYSBt4bqhbmcgeMOjIGjhu5lpIMSR4bq/biBo4buNYyB04bqtcCIpDQpgYGANCg0KIyMjIyAqKjIuMy4yIE5o4bqtbiB4w6l0KioNCg0KLSBLaG/huqNuZyA2NC4zJSBzaW5oIHZpw6puIGNobyBy4bqxbmcgbeG6oW5nIHjDoyBo4buZaSDhuqNuaCBoxrDhu59uZyDEkeG6v24ga+G6v3QgcXXhuqMgaOG7jWMgdOG6rXAgY+G7p2EgaOG7jSwgY2hvIHRo4bqleSB0w6FjIMSR4buZbmcgdGnDqnUgY+G7sWMgY+G7p2EgbeG6oW5nIHjDoyBo4buZaSBsw6AgbeG7mXQgduG6pW4gxJHhu4EgxJHDoW5nIGzGsHUgdMOibSB0cm9uZyBtw7RpIHRyxrDhu51uZyBnacOhbyBk4bulYy4NCg0KDQojIyMgKioyLjQuIFTDrG5oIHRy4bqhbmcgbeG7kWkgcXVhbiBo4buHKioNCg0KIyMjIyAqKjIuNC4xIFRo4buRbmcga8OqIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCg0KYGBge3J9DQpyZWxfZnJlcSA8LSB0YWJsZShkYXRhJFJlbGF0aW9uc2hpcF9TdGF0dXMpDQpyZWxfcGVyY2VudCA8LSBwcm9wLnRhYmxlKHJlbF9mcmVxKSAqIDEwMA0KZGF0YS5mcmFtZShSZWxhdGlvbnNoaXBfU3RhdHVzID0gbmFtZXMocmVsX2ZyZXEpLA0KICAgICAgICAgICBGcmVxdWVuY3kgPSBhcy5udW1lcmljKHJlbF9mcmVxKSwNCiAgICAgICAgICAgUGVyY2VudGFnZSA9IHJvdW5kKGFzLm51bWVyaWMocmVsX3BlcmNlbnQpLCAxKSkNCmBgYA0KDQojIyMjIyAqKjIuNC4xLjEgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCmBgYHtyfQ0KcGxvdF9waWUoZGF0YSwgIlJlbGF0aW9uc2hpcF9TdGF0dXMiLCAiUGjDom4gYuG7kSB0w6xuaCB0cuG6oW5nIG3hu5FpIHF1YW4gaOG7hyIpDQoNCmBgYA0KDQoNCiMjIyMgKioyLjQuMiBOaOG6rW4geMOpdCoqDQoNCi0gUGjhuqduIGzhu5tuIHNpbmggdmnDqm4gxJFhbmcgxJHhu5ljIHRow6JuICg1NC41JSksIHRp4bq/cCB0aGVvIGzDoCDEkWFuZyB0cm9uZyBt4buRaSBxdWFuIGjhu4cgKDQxJSkuIENo4buJIDQuNSUgY2jhu41uIOKAnHBo4bupYyB04bqhcOKAnSwgY2hvIHRo4bqleSBuaMOzbSBjw7MgdMOsbmggdHLhuqFuZyBxdWFuIGjhu4cga2jDtG5nIHLDtSByw6BuZyBjaGnhur9tIHThu7cgbOG7hyBy4bqldCBuaOG7jy4gVsOgIGPFqW5nIGNobyB0YSB0aOG6pXkgcuG6sW5nIG3huqt1IGto4bqjbyBzw6F0IHLhuqV0IMSR4buTbmcgxJHhu4F1IHbhu4EgdOG7tyBs4buHIGdp4buvYSB0w6xuaCB0cuG6oW5nIG3hu5FpIHF1YW4gaOG7hw0KDQojIyMgKioyLjUuIFBow6JuIGxv4bqhaSBz4bupYyBraOG7j2UgdGluaCB0aOG6p24qKg0KDQojIyMjICoqMi41LjEgVGjhu5FuZyBrw6ogdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCB0cuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQptaF9mcmVxIDwtIHRhYmxlKGRhdGEkTWVudGFsX0hlYWx0aF9DYXRlZ29yeSkNCm1oX3BlcmNlbnQgPC0gcHJvcC50YWJsZShtaF9mcmVxKSAqIDEwMA0KZGF0YS5mcmFtZShNZW50YWxfSGVhbHRoID0gbmFtZXMobWhfZnJlcSksDQogICAgICAgICAgIEZyZXF1ZW5jeSA9IGFzLm51bWVyaWMobWhfZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKG1oX3BlcmNlbnQpLCAxKSkNCmBgYA0KDQojIyMjIyAqKjIuNS4xLjEgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCmBgYHtyfQ0KcGxvdF9waWUoZGF0YSwgIk1lbnRhbF9IZWFsdGhfQ2F0ZWdvcnkiLCAiUGjDom4gbG/huqFpIHPhu6ljIGto4buPZSB0aW5oIHRo4bqnbiIpDQpgYGANCg0KDQojIyMjICoqMi41LjIgTmjhuq1uIHjDqXQqKg0KDQotIEPDsyDEkeG6v24gNTkuNyUgc2luaCB2acOqbiDEkcOhbmggZ2nDoSBz4bupYyBraOG7j2UgdGluaCB0aOG6p24gY+G7p2EgbcOsbmggbMOgIOKAnGLDrG5oIHRoxrDhu51uZ+KAnSwgdHJvbmcga2hpIDQwLjMlIGNobyBy4bqxbmcgaOG7jSBjw7Mgc+G7qWMga2jhu49lIOKAnHThu5F04oCdLCB2w6Aga2jDtG5nIGPDsyBzaW5oIHZpw6puIG7DoG8gbMOgIOKAnGvDqW3igJ0uIMSQaeG7gXUgbsOgeSBjw7MgdGjhu4MgcGjhuqNuIMOhbmggbmjhuq1uIHRo4bupYyB0w61jaCBj4buxYyBob+G6t2MgeHUgaMaw4bubbmcgdOG7sSDEkcOhbmggZ2nDoSBjYW8uDQoNCg0KIyMjICoqMi42LiBN4bupYyDEkeG7mSBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpKioNCg0KIyMjIyAqKjIuNi4xIFRo4buRbmcga8OqIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KDQphZGRpY3RfZnJlcSA8LSB0YWJsZShkYXRhJEFkZGljdGlvbl9MZXZlbCkNCmFkZGljdF9wZXJjZW50IDwtIHByb3AudGFibGUoYWRkaWN0X2ZyZXEpICogMTAwDQpkYXRhLmZyYW1lKEFkZGljdGlvbl9MZXZlbCA9IG5hbWVzKGFkZGljdF9mcmVxKSwNCiAgICAgICAgICAgRnJlcXVlbmN5ID0gYXMubnVtZXJpYyhhZGRpY3RfZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKGFkZGljdF9wZXJjZW50KSwgMSkpDQpgYGANCg0KIyMjIyMgKioyLjYuMS4xIFRy4buxYyBxdWFuIGhvw6EqKg0KDQpgYGB7cn0NCnBsb3RfcGllKGRhdGEsICJBZGRpY3Rpb25fTGV2ZWwiLCAiTeG7qWMgxJHhu5kgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSIpDQoNCmBgYA0KDQoNCiMjIyMgKioyLjYuMiBOaOG6rW4geMOpdCoqDQoNCi0gVOG7tyBs4buHIHNpbmggdmnDqm4gbmdoaeG7h24gbuG6t25nIGNoaeG6v20gNTcuOSUsIG3hu5l0IGNvbiBz4buRIMSRw6FuZyBiw6FvIMSR4buZbmcuIENo4buJIDIuNCUga2jDtG5nIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWksIGNobyB0aOG6pXkgxJHDonkgbMOgIG3hu5l0IGhp4buHbiB0xrDhu6NuZyBwaOG7lSBiaeG6v24gdsOgIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24gbmhp4buBdSBraMOtYSBj4bqhbmggdHJvbmcgY3Xhu5ljIHPhu5FuZyBzaW5oIHZpw6puLg0KDQojIyMgKioyLjcuIFTDrG5oIHRy4bqhbmcgZ2nhuqVjIG5n4bunKioNCg0KIyMjIyAqKjIuNy4xIFRo4buRbmcga8OqIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCg0KYGBge3J9DQpzbGVlcF9mcmVxIDwtIHRhYmxlKGRhdGEkU2xlZXBfUXVhbGl0eSkNCnNsZWVwX3BlcmNlbnQgPC0gcHJvcC50YWJsZShzbGVlcF9mcmVxKSAqIDEwMA0KZGF0YS5mcmFtZShTbGVlcF9RdWFsaXR5ID0gbmFtZXMoc2xlZXBfZnJlcSksDQogICAgICAgICAgIEZyZXF1ZW5jeSA9IGFzLm51bWVyaWMoc2xlZXBfZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKHNsZWVwX3BlcmNlbnQpLCAxKSkNCmBgYA0KDQojIyMjIyAqKjIuNy4xLjEgVHLhu7FjIHF1YW4gaG/DoSoqDQoNCmBgYHtyfQ0KcGxvdF9waWUoZGF0YSwgIlNsZWVwX1F1YWxpdHkiLCAiVMOsbmggdHLhuqFuZyBnaeG6pWMgbmfhu6ciKQ0KYGBgDQoNCg0KIyMjIyAqKjIuNy4yIE5o4bqtbiB4w6l0KioNCg0KLSBDw7MgxJHhur9uIDYwLjklIHNpbmggdmnDqm4gYuG7iyB0aGnhur91IG5n4bunLCB0cm9uZyBraGkgY2jhu4kgMzkuMSUgbmfhu6cgxJHhu6cuIFTDrG5oIHRy4bqhbmcgdGhp4bq/dSBuZ+G7pyBjw7MgdGjhu4MgbGnDqm4gcXVhbiDEkeG6v24gdmnhu4djIHPhu60gZOG7pW5nIG3huqFuZyB4w6MgaOG7mWkgcXXDoSBt4bupYyBob+G6t2Mgw6FwIGzhu7FjIGjhu41jIHThuq1wLCDhuqNuaCBoxrDhu59uZyB0acOqdSBj4buxYyDEkeG6v24gc+G7qWMga2jhu49lIHbDoCBoaeG7h3Ugc3XhuqV0IGjhu41jIHThuq1wLg0KDQojIyMgKioyLjguIE3hu6ljIMSR4buZIG3DonUgdGh14bqrbiBkbyBt4bqhbmcgeMOjIGjhu5lpKioNCg0KIyMjIyAqKjIuOC4xIFRo4buRbmcga8OqIHThuqduIHPhu5EsIHThuqduIHN14bqldCB2w6AgdHLhu7FjIHF1YW4gaMOzYSoqDQoNCmBgYHtyfQ0KY29uZmxpY3RfZnJlcSA8LSB0YWJsZShkYXRhJENvbmZsaWN0X0xldmVsKQ0KY29uZmxpY3RfcGVyY2VudCA8LSBwcm9wLnRhYmxlKGNvbmZsaWN0X2ZyZXEpICogMTAwDQpkYXRhLmZyYW1lKENvbmZsaWN0X0xldmVsID0gbmFtZXMoY29uZmxpY3RfZnJlcSksDQogICAgICAgICAgIEZyZXF1ZW5jeSA9IGFzLm51bWVyaWMoY29uZmxpY3RfZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKGNvbmZsaWN0X3BlcmNlbnQpLCAxKSkNCmBgYA0KDQojIyMjIyAqKjIuOC4xLjEgVHLhu7FjIHF1YW4gaG/DoSoqDQpgYGB7cn0NCnBsb3RfcGllKGRhdGEsICJDb25mbGljdF9MZXZlbCIsICJT4buRIGzhuqduIG3DonUgdGh14bqrbiBkbyBt4bqhbmcgeMOjIGjhu5lpIikNCg0KYGBgDQoNCg0KIyMjIyAqKjIuOC4yIE5o4bqtbiB4w6l0KioNCg0KLSBE4buvIGxp4buHdSBjaG8gdGjhuqV5IHBo4bqnbiBs4bubbiBzaW5oIHZpw6puIChjaGnhur9tIDkwLjYlKSB0aOG7q2Egbmjhuq1uIHLhurFuZyBo4buNIGfhurdwICJraMOhIG5oaeG7gXUiIG3DonUgdGh14bqrbiBsacOqbiBxdWFuIMSR4bq/biBt4bqhbmcgeMOjIGjhu5lpLCB0cm9uZyBraGkgY2jhu4kgNy4yJSBjaG8gYmnhur90ICJraMO0bmcgY8OzIG3DonUgdGh14bqrbiIgdsOgIDIuMSUgdHLhuqNpIHF1YSAicuG6pXQgbmhp4buBdSBtw6J1IHRodeG6q24iLiBU4bu3IGzhu4cgY2FvIG7DoHkgY2hvIHRo4bqleSBt4bqhbmcgeMOjIGjhu5lpIGtow7RuZyBjaOG7iSBsw6AgY8O0bmcgY+G7pSBr4bq/dCBu4buRaSBtw6AgY8OybiBsw6Agbmd14buTbiBwaMOhdCBzaW5oIHh1bmcgxJHhu5l0IHRyb25nIGPDoWMgbeG7kWkgcXVhbiBo4buHIGPDoSBuaMOibiBob+G6t2MgaOG7jWMgdOG6rXAuDQoNClZp4buHYyBoxqFuIDkwJSBzaW5oIHZpw6puIHRy4bqjaSBuZ2hp4buHbSBtw6J1IHRodeG6q24g4bufIG3hu6ljIMSR4buZIG5o4bqldCDEkeG7i25oIGNo4bupbmcgbWluaCBy4bqxbmcgdMOhYyDEkeG7mW5nIHRpw6p1IGPhu7FjIGPhu6dhIG3huqFuZyB4w6MgaOG7mWkgbMOgIHBo4buVIGJp4bq/biwgY8OzIHRo4buDIGLhuq90IG5ndeG7k24gdOG7qyB2aeG7h2MgaGnhu4N1IGzhuqdtIHF1YSB0aW4gbmjhuq9uLCDEkcSDbmcgdOG6o2kgbuG7mWkgZHVuZyBuaOG6oXkgY+G6o20sIGhheSBzbyBzw6FuaCBi4bqjbiB0aMOibiB24bubaSBuZ8aw4budaSBraMOhYy4gxJBp4buBdSBuw6B5IG5o4bqlbiBt4bqhbmggc+G7sSBj4bqnbiB0aGnhur90IGPhu6dhIGPDoWMgY2jGsMahbmcgdHLDrG5oIGdpw6FvIGThu6VjIHRydXnhu4FuIHRow7RuZyBz4buRLCBnacO6cCBzaW5oIHZpw6puIG7Dom5nIGNhbyBuxINuZyBs4buxYyDhu6luZyB44butIHbDoCBraeG7g20gc2/DoXQgaMOgbmggdmkga2hpIHPhu60gZOG7pW5nIG3huqFuZyB4w6MgaOG7mWkgdHJvbmcgbcO0aSB0csaw4budbmcgaOG7jWMgxJHGsOG7nW5nIHbDoCB4w6MgaOG7mWkuDQoNCg0KIyMjICoqMi45LiBO4buBbiB04bqjbmcgbeG6oW5nIHjDoyBo4buZaSDEkcaw4bujYyBz4butIGThu6VuZyBwaOG7lSBiaeG6v24qKg0KDQojIyMjICoqMi45LjEgVGjhu5FuZyBrw6ogdOG6p24gc+G7kSwgdOG6p24gc3XhuqV0IHbDoCB0cuG7sWMgcXVhbiBow7NhKioNCg0KYGBge3J9DQpwbGF0Zm9ybV9mcmVxIDwtIHRhYmxlKGRhdGEkTW9zdF9Vc2VkX1BsYXRmb3JtKQ0KcGxhdGZvcm1fcGVyY2VudCA8LSBwcm9wLnRhYmxlKHBsYXRmb3JtX2ZyZXEpICogMTAwDQpkYXRhLmZyYW1lKFBsYXRmb3JtID0gbmFtZXMocGxhdGZvcm1fZnJlcSksDQogICAgICAgICAgIEZyZXF1ZW5jeSA9IGFzLm51bWVyaWMocGxhdGZvcm1fZnJlcSksDQogICAgICAgICAgIFBlcmNlbnRhZ2UgPSByb3VuZChhcy5udW1lcmljKHBsYXRmb3JtX3BlcmNlbnQpLCAxKSkNCmBgYA0KDQojIyMjIyAqKjIuOS4xLjEgVHLhu7FjIHF1YW4gaG/DoSoqDQpgYGB7cn0NCiMgVOG6oW8gYuG6o25nIHThuqduIHPhu5ENCnBsYXRmb3JtX2ZyZXEgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXRhJE1vc3RfVXNlZF9QbGF0Zm9ybSkpDQpjb2xuYW1lcyhwbGF0Zm9ybV9mcmVxKSA8LSBjKCJQbGF0Zm9ybSIsICJGcmVxdWVuY3kiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0DQpnZ3Bsb3QocGxhdGZvcm1fZnJlcSwgYWVzKHggPSByZW9yZGVyKFBsYXRmb3JtLCAtRnJlcXVlbmN5KSwgeSA9IEZyZXF1ZW5jeSwgZmlsbCA9IFBsYXRmb3JtKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIk7hu4FuIHThuqNuZyBt4bqhbmcgeMOjIGjhu5lpIMSRxrDhu6NjIHPhu60gZOG7pW5nIHBo4buVIGJp4bq/biIsDQogICAgICAgeCA9ICJO4buBbiB04bqjbmciLCB5ID0gIlPhu5EgbMaw4bujbmciKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIGhqdXN0ID0gMSkpICsNCiAgZ3VpZGVzKGZpbGwgPSAibm9uZSIpDQpgYGANCg0KDQojIyMjICoqMi45LjIgTmjhuq1uIHjDqXQqKg0KDQotIEJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IEluc3RhZ3JhbSBsw6AgbuG7gW4gdOG6o25nIHBo4buVIGJp4bq/biBuaOG6pXQsIHbhu5tpIDM1LjMlIHNpbmggdmnDqm4gbOG7sWEgY2jhu41uLCB0aGVvIHNhdSBsw6AgVGlrVG9rICgyMS44JSkgdsOgIEZhY2Vib29rICgxNy40JSkuIEJhIG7hu4FuIHThuqNuZyBuw6B5IGNoaeG6v20gdOG7lW5nIGPhu5luZyBn4bqnbiA3NSUgbeG7qWMgc+G7rSBk4bulbmcsIGNobyB0aOG6pXkgeHUgaMaw4bubbmcgxrB1IHRpw6puIGPDoWMgbuG7gW4gdOG6o25nIGPDsyBu4buZaSBkdW5nIHRy4buxYyBxdWFuLCB2aWRlbyBuZ+G6r24gdsOgIGto4bqjIG7Eg25nIHTGsMahbmcgdMOhYyBt4bqhbmggdHJvbmcgZ2nhu5tpIHNpbmggdmnDqm4uIFRyb25nIGtoaSDEkcOzLCBjw6FjIOG7qW5nIGThu6VuZyBuaOG6r24gdGluIG5oxrAgS2FrYW9UYWxrLCBMSU5FLCB2w6AgY8OhYyBu4buBbiB04bqjbmcgw610IHBo4buVIGJp4bq/biBoxqFuIG5oxrAgVktvbnRha3RlLCBXZUNoYXQgY2jhu4kgY2hp4bq/bSB04burIDEuNyXigJMyLjElLCBwaOG6o24gw6FuaCB0w61uaCBjaOG6pXQgc+G7rSBk4bulbmcgdGhlbyBraHUgduG7sWMgxJHhu4thIGzDvSBob+G6t2MgbeG7pWMgxJHDrWNoIGNodXnDqm4gYmnhu4d0Lg0KDQotIFPhu7EgxrB1IHRo4bq/IGPhu6dhIEluc3RhZ3JhbSB2w6AgVGlrVG9rIGzDoCBtaW5oIGNo4bupbmcgcsO1IHLDoG5nIGNobyB2aeG7h2MgZ2nhu5tpIHRy4bq7IGhp4buHbiBuYXkgYuG7iyB0aHUgaMO6dCBi4bufaSBu4buZaSBkdW5nIGdp4bqjaSB0csOtIG5oYW5oLCBi4bqvdCBt4bqvdCB2w6AgY8OzIHTDrW5oIGxhbiB0cnV54buBbiBjYW8sIMSR4buTbmcgdGjhu51pIGPFqW5nIHRp4buBbSDhuqluIG5ndXkgY8ahIGfDonkgbmdoaeG7h24gdsOgIHBow6JuIHTDoW4gc+G7sSBjaMO6IMO9LiBOZ2/DoGkgcmEsIG7hu4FuIHThuqNuZyBjaHV5w6puIG5naGnhu4dwIG5oxrAgTGlua2VkSW4gY2jhu4kgY2hp4bq/bSAzLjAlLCBjaG8gdGjhuqV5IHNpbmggdmnDqm4gY2jGsGEgcXVhbiB0w6JtIG5oaeG7gXUgxJHhur9uIHBow6F0IHRyaeG7g24gaMOsbmgg4bqjbmggbmdo4buBIG5naGnhu4dwIHRyw6puIG3huqFuZyB4w6MgaOG7mWkuIMSQaeG7gXUgbsOgeSBn4bujaSBt4bufIHRp4buBbSBuxINuZyBjaG8gY8OhYyB0csaw4budbmcgxJHhuqFpIGjhu41jIHbDoCBuaMOgIGhv4bqhY2ggxJHhu4tuaCBjaMOtbmggc8OhY2ggZ2nDoW8gZOG7pWMgdHJvbmcgdmnhu4djIGtodXnhur9uIGtow61jaCBzaW5oIHZpw6puIHPhu60gZOG7pW5nIG3huqFuZyB4w6MgaOG7mWkgbeG7mXQgY8OhY2ggaGnhu4d1IHF14bqjIGjGoW4sIGPDom4gYuG6sW5nIGdp4buvYSBnaeG6o2kgdHLDrSB2w6AgcGjDoXQgdHJp4buDbiBi4bqjbiB0aMOibi4NCg0KIyMjICoqMi4xMC4gTeG7qWMgxJHhu5kgc+G7rSBk4bulbmcgTVhIKioNCg0KIyMjIyAqKjIuMTAuMSBUaOG7kW5nIGvDqiB04bqnbiBz4buRLCB04bqnbiBzdeG6pXQgdsOgIHRy4buxYyBxdWFuIGjDs2EqKg0KDQpgYGB7cn0NCiMgVGjhu5FuZyBrw6ogdOG6p24gc+G7kQ0KdGFibGVfdXNhZ2UgPC0gdGFibGUoZGF0YSRVc2FnZV9MZXZlbCkNCnRhYmxlX3VzYWdlDQoNCiMgVGjhu5FuZyBrw6ogdOG7tyBs4buHIHBo4bqnbiB0csSDbQ0KcHJvcC50YWJsZSh0YWJsZV91c2FnZSkgKiAxMDANCg0KYGBgDQoNCmBgYHtyfQ0KcGxvdF9waWUoZGF0YSwgIlVzYWdlX0xldmVsIiwgIlBow6JuIGLhu5EgdHLDrG5oIE3hu6ljIMSR4buZIHPhu60gZOG7pW5nIG3huqFuZyB4w6MgaOG7mWkgbeG7l2kgbmfDoHkiKQ0KYGBgDQoNCiMjIyMgKioyLjEwLjIgTmjhuq1uIHjDqXQqKg0KDQojIyAqKlBI4bqmTiAzOiDGr+G7mkMgTMav4buiTkcgS0hP4bqiTkcgVsOAIEtJ4buCTSDEkOG7ik5IIEdJ4bqiIFRIVVnhur5UIFThu7YgTOG7hiBDSE8gMSBCSeG6vk4qKg0KDQojIyMgKiozLjEgR2VuZGVyIC0gTWFsZSoqDQoNCiMjIyMgKiozLjEuMSDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIG5hbSoqDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KHggPSBzdW0oZGF0YSRHZW5kZXIgPT0gIk1hbGUiKSwNCiAgICAgICAgICBuID0gbnJvdyhkYXRhKSwNCiAgICAgICAgICBwID0gMC41LCAgICAgICAgICAgICAjIEdp4bqjIHRodXnhur90IEgwOiBwID0gMC41DQogICAgICAgICAgY29uZi5sZXZlbCA9IDAuOTUpDQpgYGANCiMjIyMgKiozLjEuMiBCw6BpIHRvw6FuIGtp4buDbSDEkeG7i25oKioNCg0KLSBHaeG6oyB0aHV54bq/dDoNCg0KICAtIEjigoA6IHAgPSAwLjUgKHThu7cgbOG7hyBuYW0gYuG6sW5nIDUwJSkNCiAgLSBI4oKBOiBwIOKJoCAwLjUgKHThu7cgbOG7hyBuYW0ga2jDoWMgNTAlKQ0KICANCioqTmjhuq1uIHjDqXQ6KioNCg0KICAtIEdpw6EgdHLhu4sgcC12YWx1ZSA9IDEsIGzhu5tuIGjGoW4gbeG7qWMgw70gbmdoxKlhIHRoxrDhu51uZyBkw7luZyAozrEgPSAwLjA1KSwgZG8gxJHDsyBraMO0bmcgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKALg0KDQogIC0gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIHNpbmggdmnDqm4gbmFtIG7hurFtIHRyb25nIGtob+G6o25nIFs0Ni4xOCU7IDUzLjY4JV0sIGJhbyBn4buTbSBnacOhIHRy4buLIDUwJS4NCg0KICAtIMav4bubYyBsxrDhu6NuZyDEkWnhu4NtIGNobyB04bu3IGzhu4cgc2luaCB2acOqbiBuYW0gbMOgIDQ5LjkzJSwgZ+G6p24gc8OhdCB24bubaSA1MCUuDQoNCiAgLSBW4bubaSBt4bupYyDDvSBuZ2jEqWEgNSUsIGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBnaeG7r2EgdOG7tyBs4buHIHNpbmggdmnDqm4gbmFtIHbDoCBt4bupYyBjaHXhuqluIDUwJS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgcGjDom4gYuG7kSBnaeG7m2kgdMOtbmggdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgbMOgIHTGsMahbmcgxJHhu5FpIGPDom4gYuG6sW5nIHbDoCBwaMO5IGjhu6NwIHbhu5tpIGdp4bqjIMSR4buLbmggdOG7tyBs4buHIDE6MSBnaeG7r2EgbmFtIHbDoCBu4buvLg0KDQojIyMgKiozLjIgVHLDrG5oIMSR4buZIGjhu41jIHbhuqVuIC0gVW5kZXJncmFkdWF0ZSoqDQoNCiMjIyMgKiozLjIuMSDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIHNpbmggdmnDqm4gxJHhuqFpIGjhu41jKioNCg0KYGBge3J9DQpwcm9wLnRlc3QoeCA9IHN1bShkYXRhJEFjYWRlbWljX0xldmVsID09ICJVbmRlcmdyYWR1YXRlIiksDQogICAgICAgICAgbiA9IG5yb3coZGF0YSksDQogICAgICAgICAgcCA9IDAuNSwgICAgICAgICAgICAgIyBHaeG6oyB0aHV54bq/dCBIMDogcCA9IDAuNQ0KICAgICAgICAgIGNvbmYubGV2ZWwgPSAwLjk1KQ0KYGBgDQojIyMjICoqMy4yLjIgQsOgaSB0b8OhbiBraeG7g20gxJHhu4tuaCoqDQoNCi0gR2nhuqMgdGh1eeG6v3Q6DQoNCiAgLSBI4oKAOiBwID0gMC41ICh04bu3IGzhu4cgc2luaCB2acOqbiDEkeG6oWkgaOG7jWMgYuG6sW5nIDUwJSkNCiAgLSBI4oKBOiBwIOKJoCAwLjUgKHThu7cgbOG7hyBzaW5oIHZpw6puIMSR4bqhaSBo4buNYyBraMOhYyA1MCUpDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSBL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHThu7cgbOG7hyBzaW5oIHZpw6puIHRyb25nIG3huqt1IHRodeG7mWMgYuG6rWMgVW5kZXJncmFkdWF0ZSBsw6Aga2hv4bqjbmcgNTAuMDclLCBraMO0bmcga2jDoWMgYmnhu4d0IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogc28gduG7m2kgdOG7tyBs4buHIGdp4bqjIMSR4buLbmggbMOgIDUwJS4gS2hv4bqjbmcgdGluIGPhuq15IDk1JSBiYW8gZ+G7k20gZ2nDoSB0cuG7iyAwLjUsIHbDoCBwLXZhbHVlIGLhurFuZyAxIGto4bqzbmcgxJHhu4tuaCBy4bqxbmcga2jDtG5nIGPDsyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBr4bq/dCBsdeG6rW4gdOG7tyBs4buHIHNpbmggdmnDqm4gxJHhuqFpIGjhu41jIHRyb25nIG3huqt1IGtow6FjIDUwJS4NCg0KLSBWw6wgduG6rXksIHRhIGtow7RuZyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCwgdsOgIGPDsyB0aOG7gyBuw7NpIHLhurFuZyB04bu3IGzhu4cgc2luaCB2acOqbiDEkeG6oWkgaOG7jWMgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgbMOgIGPDom4gYuG6sW5nLCBraMO0bmcgdGhpw6puIGzhu4djaCBzbyB24bubaSBt4bupYyB0cnVuZyBiw6xuaCBnaeG6oyDEkeG7i25oLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBt4bqrdSBraOG6o28gc8OhdCDEkcaw4bujYyB4w6J5IGThu7FuZyBjw7MgdMOtbmggxJHhuqFpIGRp4buHbiB04buRdCB24buBIG3hurd0IHRyw6xuaCDEkeG7mSBo4buNYyB24bqlbiBu4bq/dSBnaeG6oyDEkeG7i25oIHThu5VuZyB0aOG7gyBjxaluZyBjw6JuIGLhurFuZyB0aGVvIGPDoWNoIMSRw7MuDQoNCg0KIyMjICoqMy4zIENIw4FUIEzGr+G7ok5HIEdJ4bqkQyBOR+G7piAtIFRISeG6vlUgTkfhu6YqKg0KDQojIyMjICoqMy4zLjEgxq/hu5tjIGzGsOG7o25nIGtob+G6o25nIHRpbiBj4bqteSA5NSUgY2hvIHThu7cgbOG7hyBzaW5oIHZpw6puIHRoaeG6v3Ugbmfhu6cqDQoNCmBgYHtyfQ0KcHJvcC50ZXN0KHggPSBzdW0oZGF0YSRTbGVlcF9RdWFsaXR5ID09ICJUaGnhur91IG5n4bunIiksDQogICAgICAgICAgbiA9IHN1bSghaXMubmEoZGF0YSRTbGVlcF9RdWFsaXR5KSksDQogICAgICAgICAgcCA9IDAuNCwNCiAgICAgICAgICBjb25mLmxldmVsID0gMC45NSkNCmBgYA0KDQojIyMjICoqMy4zLjIgQsOgaSB0b8OhbiBraeG7g20gxJHhu4tuaCoqDQoNCi0gR2nhuqMgdGh1eeG6v3Q6DQoNCiAgLSBI4oKAOiBwID0gMC40ICh04bu3IGzhu4cgc2luaCB2acOqbiDEkeG6oWkgaOG7jWMgYuG6sW5nIDQwJSkNCiAgLSBI4oKBOiBwIOKJoCAwLjQgKHThu7cgbOG7hyBzaW5oIHZpw6puIHRoaeG6v3Ugbmfhu6cga2jDoWMgNDAlKQ0KICANCioqTmjhuq1uIHjDqXQ6KioNCg0KLSBU4bu3IGzhu4cgxrDhu5tjIGzGsOG7o25nIHThu6sgbeG6q3UgKHDMgikgPSAzOS4xNSUNCg0KLSBLaG/huqNuZyB0aW4gY+G6rXkgOTUlOiBbMzUuNTUlOyA0Mi44NyVdDQoNCi0gcC12YWx1ZSA9IDAuNjcyNCwgbOG7m24gaMahbiDOsSA9IDAuMDUNCg0KLSBLaMO0bmcgxJHhu6cgYuG6sW5nIGNo4bupbmcgxJHhu4MgYsOhYyBi4buPIGdp4bqjIHRodXnhur90IEjigoA6IHAgPSAwLjQNCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBjaG8gdGjhuqV5IHLhurFuZyB04bu3IGzhu4cgc2luaCB2acOqbiBi4buLIHRoaeG6v3Ugbmfhu6cgdHJvbmcgbeG6q3Uga2jhuqNvIHPDoXQgbMOgIGtob+G6o25nIDM5LjE1JSwgdsOgIGtow7RuZyBraMOhYyBiaeG7h3QgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBzbyB24bubaSB04bu3IGzhu4cgZ2nhuqMgxJHhu4tuaCA0MCUuIEtob+G6o25nIHRpbiBj4bqteSA5NSUgY+G7p2EgdOG7tyBs4buHIHRoaeG6v3Ugbmfhu6cgdOG7qyAzNS41JSDEkeG6v24gNDIuOSUgY8OzIGJhbyBn4buTbSBnacOhIHRy4buLIDAuNCwgdsOgIGdpw6EgdHLhu4sgcC12YWx1ZSBraMOhIGzhu5tuICgwLjY3MjQpIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgZ2nhu69hIHThu7cgbOG7hyB0aOG7sWMgdOG6vyB2w6AgZ2nhuqMgxJHhu4tuaCBsw6Aga2jDtG5nIMSRw6FuZyBr4buDLiBOaMawbmcgYuG6o24gdGjDom4gY29uIHPhu5EgMiB0cm9uZyA1IHNpbmggdmnDqm4gdGhp4bq/dSBuZ+G7pyB24bqrbiBsw6AgbeG7mXQgZOG6pXUgaGnhu4d1IMSRw6FuZyBsbyBuZ+G6oWkgduG7gSBz4bupYyBraOG7j2UgdsOgIGNo4bqldCBsxrDhu6NuZyBjdeG7mWMgc+G7kW5nIHNpbmggdmnDqm4uIMSQaeG7gXUgbsOgeSBn4bujaSDDvSBjaG8gdMO0aSB24buBIGtp4buDbSDEkeG7i25oIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHRoaeG6v3Ugbmfhu6cgdsOgIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmgga2jDoWMqKg0KDQojIyMgKiozLjMgTeG7qEMgxJDhu5ggTkdISeG7hk4gTeG6oE5HIFjDgyBI4buYSSAtIE5HSEnhu4ZOIE7hurZORyoqDQoNCiMjIyMgKiozLjMuMSDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIE5naGnhu4duIG7hurduZyBNWEgqDQoNCmBgYHtyfQ0KIyBLaeG7g20gxJHhu4tuaCAxIHBow61hOiBwID4gMC41IGNobyBuaMOzbSAiTmdoaeG7h24gbuG6t25nIg0KcHJvcC50ZXN0KA0KICB4ID0gc3VtKGRhdGEkQWRkaWN0aW9uX0xldmVsID09ICJOZ2hp4buHbiBu4bq3bmciKSwNCiAgbiA9IHN1bSghaXMubmEoZGF0YSRBZGRpY3Rpb25fTGV2ZWwpKSwNCiAgcCA9IDAuNSwNCiAgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIsICAgIyBLaeG7g20gxJHhu4tuaCBt4buZdCBwaMOtYTogbOG7m24gaMahbg0KICBjb25mLmxldmVsID0gMC45NQ0KKQ0KDQpgYGANCg0KIyMjIyAqKjMuMy4yIELDoGkgdG/DoW4ga2nhu4NtIMSR4buLbmgqKg0KDQotIEdp4bqjIHRodXnhur90Og0KDQogIC0gSOKCgCAoR2nhuqMgdGh1eeG6v3Qga2jDtG5nKTogcCDiiaQgMC41ICh04bu3IGzhu4cgbmdoaeG7h24gbuG6t25nIGtow7RuZyB2xrDhu6N0IHF1w6EgNTAlKQ0KICAtIEjigoEgKEdp4bqjIHRodXnhur90IMSR4buRaSk6IHAgPiAwLjUgKHThu7cgbOG7hyBuZ2hp4buHbiBu4bq3bmcgbOG7m24gaMahbiA1MCUpKQ0KDQoqKk5o4bqtbiB4w6l0OioqDQoNCi0gS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSBwLXZhbHVlIHLhuqV0IG5o4buPICg8IDAuMDAxKSwgbmjhu48gaMahbiBuaGnhu4F1IHNvIHbhu5tpIG3hu6ljIMO9IG5naMSpYSDOsSA9IDAuMDUuIMSQaeG7gXUgbsOgeSBjw7MgbmdoxKlhOiBCw6FjIGLhu48gSOKCgCDigJMqKkPDsyDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHThu7cgbOG7hyBzaW5oIHZpw6puIG5naGnhu4duIG7hurduZyBt4bqhbmcgeMOjIGjhu5lpIGzhu5tuIGjGoW4gNTAlLioqDQoNCi0gVuG7m2kgdOG7tyBs4buHIMaw4bubYyBsxrDhu6NuZyBsw6AgNTcuODclIHbDoCBraG/huqNuZyB0aW4gY+G6rXkgOTUlIHThu6sgNTQuNyUgxJHhur9uIDEwMCUsIGThu68gbGnhu4d1IGNobyB0aOG6pXkgduG6pW4gxJHhu4EgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSDEkcOjIHbGsOG7o3QgbeG7qWMgInRydW5nIGLDrG5oIiB2w6AgY8OzIGThuqV1IGhp4buHdSB0cuG7nyB0aMOgbmggbeG7mXQgaGnhu4duIHTGsOG7o25nIHBo4buVIGJp4bq/biDEkcOhbmcgbG8gbmfhuqFpIHRyb25nIGPhu5luZyDEkeG7k25nIHNpbmggdmnDqm4uDQoNCioqUGjDom4gdMOtY2ggdGjhu7FjIHRy4bqhbmcgKGfhuq9uIHbhu5tpIGLhu5FpIGPhuqNuaCB4w6MgaOG7mWkpKioNCg0KLSBWaeG7h2MgZ+G6p24gNiB0cm9uZyAxMCBzaW5oIHZpw6puIMSRxrDhu6NjIGto4bqjbyBzw6F0IHLGoWkgdsOgbyBuaMOzbSAibmdoaeG7h24gbuG6t25nIiBt4bqhbmcgeMOjIGjhu5lpIHBo4bqjbiDDoW5oIG3hu5l0IHRo4buxYyB0cuG6oW5nIMSRw6FuZyBxdWFuIHTDom06DQogIC0gTeG6oW5nIHjDoyBo4buZaSDEkWFuZyBjaGnhur9tIGThu6VuZyB0aOG7nWkgZ2lhbiB2w6AgdGjDs2kgcXVlbiBzaW5oIGhv4bqhdCBj4bunYSBwaOG6p24gbOG7m24gc2luaCB2acOqbi4NCiAgLSBIw6BuaCB2aSBuZ2hp4buHbiBt4bqhbmcgY8OzIHRo4buDIGxpw6puIHF1YW4gxJHhur9uOiBUaGnhur91IG5n4bunLCBHaeG6o20gdOG6rXAgdHJ1bmcgaOG7jWMgdOG6rXAsIFN1eSBnaeG6o20gc+G7qWMga2jhu49lIHRpbmggdGjhuqduLCBNw6J1IHRodeG6q24gdHJvbmcgY8OhYyBt4buRaSBxdWFuIGjhu4cNCi3EkMOieSBraMO0bmcgY2jhu4kgbMOgIG3hu5l0IGNvbiBz4buRIHRo4buRbmcga8OqIG3DoCBjw7JuIGzDoCB0w61uIGhp4buHdSBj4bqjbmggYsOhbyB24buBIHPhu7EgbeG6pXQgY8OibiBi4bqxbmcgZ2nhu69hIMSR4budaSBz4buRbmcgc+G7kSB2w6AgdGjhu7FjIHThur8sIOG6o25oIGjGsOG7n25nIHPDonUgc+G6r2MgxJHhur9uIGNo4bqldCBsxrDhu6NuZyBz4buRbmcgdsOgIGjhu41jIHThuq1wIGPhu6dhIHNpbmggdmnDqm4gdHJvbmcga+G7tyBuZ3V5w6puIGPDtG5nIG5naOG7hw0KDQojIyMgKiozLjQgbeG7qWMgxJHhu5kgbcOidSB0aHXhuqtuIC0gQ8OTIE3DglUgVEhV4bqqTioqDQoNCiMjIyMgKiozLjQuMSDGr+G7m2MgbMaw4bujbmcga2hv4bqjbmcgdGluIGPhuq15IDk1JSBjaG8gdOG7tyBs4buHIE5naGnhu4duIG7hurduZyBNWEgqDQoNCmBgYHtyfQ0Kbl9jb25mbGljdF9hbGwgPC0gc3VtKGRhdGEkQ29uZmxpY3RfTGV2ZWwgJWluJSBjKCJLaMOhIG5oaeG7gXUiLCAiUuG6pXQgbmhp4buBdSIpKQ0Kbl90b3RhbCA8LSBzdW0oIWlzLm5hKGRhdGEkQ29uZmxpY3RfTGV2ZWwpKQ0KDQpwcm9wLnRlc3QoeCA9IG5fY29uZmxpY3RfYWxsLA0KICAgICAgICAgIG4gPSBuX3RvdGFsLA0KICAgICAgICAgIHAgPSAwLjgsDQogICAgICAgICAgYWx0ZXJuYXRpdmUgPSAiZ3JlYXRlciIpDQpgYGANCg0KDQojIyMjICoqMy40LjIgQsOgaSB0b8OhbiBraeG7g20gxJHhu4tuaCoqDQotIEdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oICgxIHBow61hKToNCg0KICAtIEjigoA6IHAg4omkIDAuOCAodOG7tyBs4buHIG3DonUgdGh14bqrbiDiiaQgODAlKQ0KDQogIC0gSOKCgTogcCA+IDAuOCAodOG7tyBs4buHIG3DonUgdGh14bqrbiA+IDgwJSkNCiAgDQoqKk5o4bqtbiB4w6l0OioqDQotIHAtdmFsdWUgPCAyLjJlLTE2IChy4bqldCBuaOG7jyDihpIgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBt4bqhbmgpDQoNCi0gS2hv4bqjbmcgdGluIGPhuq15IDk1JTogWzAuOTg2NTsgMS4wMDAwXQ0KDQotICoqS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggY2hvIHRo4bqleSB04bu3IGzhu4cgc2luaCB2acOqbiBjw7MgbcOidSB0aHXhuqtuIGRvIG3huqFuZyB4w6MgaOG7mWkg4bufIG3hu6ljICJraMOhIG5oaeG7gXUiIHRy4bufIGzDqm4gbMOgIDk5LjQzJSwgY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgbeG7qWMgZ2nhuqMgxJHhu4tuaCB0aMO0bmcgdGjGsOG7nW5nIGzDoCA4MCUuIFbhu5tpIHAtdmFsdWUgPCAwLjA1LCB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCB2w6AgY2jhuqVwIG5o4bqtbiBI4oKBLCB04bupYyBsw6AgY8OzIMSR4bunIGLhurFuZyBjaOG7qW5nIMSR4buDIGvhur90IGx14bqtbiBy4bqxbmc6KioNCg0KICAtIE3hu6ljIMSR4buZIG3DonUgdGh14bqrbiBsacOqbiBxdWFuIMSR4bq/biBt4bqhbmcgeMOjIGjhu5lpIHRyb25nIGPhu5luZyDEkeG7k25nIHNpbmggdmnDqm4gbMOgIHLhuqV0IGNhbyB2w6Agdsaw4bujdCBxdcOhIG3hu6ljIGLDrG5oIHRoxrDhu51uZy4gY2hvIHRo4bqleSDhuqNuaCBoxrDhu59uZyB0acOqdSBj4buxYyBj4bunYSBtw7RpIHRyxrDhu51uZyB0cuG7sWMgdHV54bq/biDEkeG6v24gY8OhYyBt4buRaSBxdWFuIGjhu4cgY8OhIG5ow6JuLg0KDQojIyAqKlBI4bqmTiA0OiBQSMOCTiBUw41DSCBN4buQSSBMScOKTiBI4buGIEdJ4buuQSBIQUkgQknhur5OKioNCg0KIyMjICoqNC4xIFRISeG6vlUgTkfhu6YgVsOAIE5HSEnhu4ZOIE3huqBORyBYw4MgSOG7mEkqKg0KDQpUw6xtIGhp4buDdSB4ZW0gbGnhu4d1IFRoaeG6v3Ugbmfhu6cgY8OzIGxpw6puIGjhu4cgduG7m2kgbeG7qWMgxJHhu5kgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSBraMO0bmc/DQooTsOzaSBjw6FjaCBraMOhYzogTGnhu4d1IG5o4buvbmcgbmfGsOG7nWkgdGhp4bq/dSBuZ+G7pyBjw7MgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSBuaGnhu4F1IGjGoW4ga2jDtG5nPykNCg0KIyMjIyAqKjQuMS4xIELhuqNuZyB04bqnbiBzdeG6pXQgY2jDqW8qKg0KDQpgYGB7cn0NCg0KIyBC4bqjbmcgY2jDqW8gZ2nhu69hIGNo4bqldCBsxrDhu6NuZyBnaeG6pWMgbmfhu6cgdsOgIG3hu6ljIMSR4buZIG5naGnhu4duDQp0YWJsZV9zbGVlcF9hZGRpY3QgPC0gdGFibGUoZGF0YSRTbGVlcF9RdWFsaXR5LCBkYXRhJEFkZGljdGlvbl9MZXZlbCkNCnRhYmxlX3NsZWVwX2FkZGljdA0KYGBgDQoNCiMjIyMgKio0LjEuMiBUcuG7sWMgcXVhbiBob8OhKioNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIELhuqNuZyB04bqnbiBz4buRIGdp4buvYSBTbGVlcF9RdWFsaXR5IHbDoCBBZGRpY3Rpb25fTGV2ZWwNCnNsZWVwX2FkZGljdF90YmwgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkYXRhJFNsZWVwX1F1YWxpdHksIGRhdGEkQWRkaWN0aW9uX0xldmVsKSkNCmNvbG5hbWVzKHNsZWVwX2FkZGljdF90YmwpIDwtIGMoIlNsZWVwX1F1YWxpdHkiLCAiQWRkaWN0aW9uX0xldmVsIiwgIkNvdW50IikNCg0KZ2dwbG90KHNsZWVwX2FkZGljdF90YmwsIGFlcyh4ID0gU2xlZXBfUXVhbGl0eSwgeSA9IENvdW50LCBmaWxsID0gQWRkaWN0aW9uX0xldmVsKSkgKw0KICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIsIHdpZHRoID0gMC43KSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiTeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgY2jhuqV0IGzGsOG7o25nIGdp4bqlYyBuZ+G7pyB2w6AgbeG7qWMgxJHhu5kgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSIsDQogICAgeCA9ICJDaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunIiwNCiAgICB5ID0gIlPhu5EgbMaw4bujbmcgc2luaCB2acOqbiIsDQogICAgZmlsbCA9ICJN4bupYyDEkeG7mSBuZ2hp4buHbiINCiAgKSArDQogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiUGFzdGVsMiIpICsNCiAgdGhlbWVfbWluaW1hbChiYXNlX3NpemUgPSAxMykNCg0KYGBgDQoNCiMjIyMgKio0LjEuMyBOaOG6rW4geMOpdCoqDQoNCi0gVOG7tyBs4buHIG5naGnhu4duIG7hurduZyBjYW8g4bufIG5ow7NtIHRoaeG6v3Ugbmfhu6c6DQoNCiAgLSBUcm9uZyBuaMOzbSB0aGnhur91IG5n4bunLCBo4bqndSBo4bq/dCBzaW5oIHZpw6puIHLGoWkgdsOgbyBuaMOzbSBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIG7hurduZy4NCg0KICAtIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDsyB0aOG7gyB04buTbiB04bqhaSBt4buZdCBt4buRaSBsacOqbiBo4buHIHRpw6p1IGPhu7FjIGdp4buvYSB0aOG7nWkgZ2lhbiBz4butIGThu6VuZyBt4bqhbmcgeMOjIGjhu5lpIHbDoCBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunLg0KDQotIE5ow7NtIG5n4bunIMSR4bunIHbhuqtuIGPDsyBuZ8aw4budaSBuZ2hp4buHbiBu4bq3bmc6DQoNCiAgLSBN4bq3YyBkw7kgc2luaCB2acOqbiBuZ+G7pyDEkeG7pyBwaOG6p24gbOG7m24gbuG6sW0g4bufIG5ow7NtIG5naGnhu4duIG3hu6ljIGLDrG5oIHRoxrDhu51uZywgduG6q24gY8OzIG3hu5l0IGLhu5kgcGjhuq1uIMSRw6FuZyBr4buDIG5naGnhu4duIG7hurduZywgY2hvIHRo4bqleSBnaeG6pWMgbmfhu6cga2jDtG5nIGhvw6BuIHRvw6BuIGxv4bqhaSB0cuG7qyBuZ3V5IGPGoSBuZ2hp4buHbi4NCg0KLSBU4bu3IGzhu4cga2jDtG5nIG5naGnhu4duIHLhuqV0IHRo4bqlcCDhu58gY+G6oyBoYWkgbmjDs206DQoNCiAgKiotIFThu7cgbOG7hyBzaW5oIHZpw6puIGtow7RuZyBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIGzDoCBy4bqldCBuaOG7jyB0cm9uZyBj4bqjIGhhaSBuaMOzbSBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunLCBwaOG6o24gw6FuaCB0aOG7sWMgdHLhuqFuZyBt4bqhbmcgeMOjIGjhu5lpIMSRw6MgbGVuIGzhu49pIHbDoG8gdGjDs2kgcXVlbiBow6BuZyBuZ8OgeSBj4bunYSBwaOG6p24gbOG7m24gc2luaCB2acOqbi4qKg0KDQoqKi0+IEPhuqduIGzDoG0gcsO1IGxp4buHdSBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIGPDsyBwaOG6o2kgbMOgIG5ndXnDqm4gbmjDom4gY2jDrW5oIGfDonkgcmEgdMOsbmggdHLhuqFuZyB0aGnhur91IG5n4bunLCBoYXkgbMOgIGjhu4cgcXXhuqMgY+G7p2Egbmjhu69uZyB24bqlbiDEkeG7gSB0w6JtIGzDvSBraMOhYy4qKg0KDQojIyMjICoqNC4xLjQgS2nhu4NtIMSR4buLbmggY2hpIGLDrG5oIHBoxrDGoW5nKioNCg0KYGBge3J9DQojIELhuqNuZyB04bqnbiBz4buRIA0KdGFibGVfc2xlZXBfYWRkaWN0IDwtIHRhYmxlKGRhdGEkU2xlZXBfUXVhbGl0eSwgZGF0YSRBZGRpY3Rpb25fTGV2ZWwpDQp0YWJsZV9zbGVlcF9hZGRpY3QNCiMgS2nhu4NtIMSR4buLbmggQ2hpIGLDrG5oIHBoxrDGoW5nDQpjaGlzcS50ZXN0KHRhYmxlX3NsZWVwX2FkZGljdCkNCmBgYA0KDQoqKkPDoWMgZ2nhuqMgdGh1eeG6v3QqKg0KDQogIC0gSOKCgCAoR2nhuqMgdGh1eeG6v3Qga2jDtG5nKTogQ2jhuqV0IGzGsOG7o25nIGdp4bqlYyBuZ+G7pyB2w6AgbeG7qWMgxJHhu5kgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSBraMO0bmcgY8OzIG3hu5FpIGxpw6puIGjhu4cgKMSR4buZYyBs4bqtcCkuDQoNCiAgLSBI4oKBIChHaeG6oyB0aHV54bq/dCDEkeG7kWkpOiBDaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunIHbDoCBt4bupYyDEkeG7mSBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIGPDsyBt4buRaSBsacOqbiBo4buHIChraMO0bmcgxJHhu5ljIGzhuq1wKS4NCg0KKipL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaDoqKg0KDQotIENoaS1zcXVhcmVkID0gMjkxLjY1DQoNCi0gYuG6rWMgdOG7sSBkbyAoZGYpID0gMg0KDQotIHAtdmFsdWUgPCAyLjJlLTE2DQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSBW4bubaSBnacOhIHRy4buLIHAtdmFsdWUgcuG6pXQgbmjhu48gKG5o4buPIGjGoW4gMC4wNSksIGNow7puZyB0YSBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCB04bqhaSBt4bupYyDDvSBuZ2jEqWEgNSUuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGPDsyBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogZ2nhu69hIGNo4bqldCBsxrDhu6NuZyBnaeG6pWMgbmfhu6cgdsOgIG3hu6ljIMSR4buZIG5naGnhu4duIG3huqFuZyB4w6MgaOG7mWkuIDIgQmnhur9uIGPDsyBt4buRaSBxdWFuIGjhu4cgcGjhu6UgdGh14buZYw0KDQotIEPhu6UgdGjhu4MsIHRhIHRo4bqleSBy4bqxbmc6DQoNCiAgLSBUcm9uZyBuaMOzbSB0aGnhur91IG5n4bunLCB04bu3IGzhu4cgbmdoaeG7h24gbuG6t25nIGzDoCBy4bqldCBjYW8gKDI2OS8yNzYg4omIIDk3LjUlKSwgdHJvbmcga2hpIG5ow7NtIG5n4bunIMSR4bunIGPDsyB04bu3IGzhu4cgbsOgeSB0aOG6pXAgaMahbiAoMTM5LzQyOSDiiYggMzIuNCUpLg0KDQogIC0gS2jDtG5nIGPDsyB0csaw4budbmcgaOG7o3Aga2jDtG5nIG5naGnhu4duIG7DoG8gdHJvbmcgbmjDs20gdGhp4bq/dSBuZ+G7pywgdHJvbmcga2hpIG5ow7NtIG5n4bunIMSR4bunIGzhuqFpIGPDsyDEkeG6v24gMTcgc2luaCB2acOqbi4NCg0KIyMjIyAqKjQuMS41IFJlbGF0aXZlIFJpc2sqKg0KDQoNCmBgYHtyfQ0KaW5zdGFsbC5wYWNrYWdlcygiZXBpdG9vbHMiLCByZXBvcyA9ICJodHRwczovL2Nsb3VkLnItcHJvamVjdC5vcmciKQ0KbGlicmFyeShlcGl0b29scykNCmBgYA0KDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgY2jDqW8NCnRhYmxlX1NsZWVwX0FkZGljdCA8LSB0YWJsZShkYXRhJFNsZWVwX1F1YWxpdHksIGRhdGEkQWRkaWN0aW9uX0xldmVsKQ0KIyBSUg0Kcmlza3JhdGlvKHRhYmxlX1NsZWVwX0FkZGljdCkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCi0gbmjDs20gdGhhbSBjaGnhur91IMSRxrDhu6NjIGNo4buNbiBsw6AgTmfhu6cgxJHhu6cgDQotIEvhur90IHF14bqjIFJSID0gMS4wNjIgLT4gKipOaMOzbSB0aGnhur91IG5n4bunIGPDsyBuZ3V5IGPGoSBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIG7hurduZyBjYW8gaMahbiA2LjIlIHNvIHbhu5tpIG5ow7NtIG5n4bunIMSR4bunLioqIE5Ixq9ORyBLSMOBQyBCSeG7hlQgS0jDlE5HIFFVw4EgTkhJ4buAVQ0KDQotIEtob+G6o25nIHRpbiBj4bqteSA5NSU6IHThu6sgMS4wMzIgxJHhur9uIDEuMDkzIOKGkiBraMO0bmcgY2jhu6lhIDEsIG5naMSpYSBsw6Aga+G6v3QgcXXhuqMgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4NCg0KLSBDaGktc3F1YXJlIHAtdmFsdWUgPSA0LjY2ZS02NCDih5IgUuG6pXQgbmjhu48g4oeSIGLDoWMgYuG7jyBnaeG6oyB0aHV54bq/dCBI4oKADQoNCi0gTmdoxKlhIGzDoCBjw7MgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIGdp4buvYSB0aGnhur91IG5n4bunIHbDoCBuZ2hp4buHbiBt4bqhbmcgeMOjIGjhu5lpIG7hurduZw0KDQojIyMjICoqNC4xLjYgT2RkcyByYXRpbyoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBiaeG6v24gQWRkaWN0aW9uX0JpbmFyeTogVFJVRSBu4bq/dSBsw6AgIk5naGnhu4duIG7hurduZyIsIEZBTFNFIG7hur91IGtow7RuZw0KZGF0YSRBZGRpY3RfSGVhdnkgPC0gZGF0YSRBZGRpY3Rpb25fTGV2ZWwgPT0gIk5naGnhu4duIG7hurduZyINCg0KIyBU4bqhbyBi4bqjbmcgMngyIGdp4buvYSBDaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunIHbDoCBOZ2hp4buHbiBu4bq3bmcNCnRhYmxlX3NsZWVwX2FkZGljdF8yeDIgPC0gdGFibGUoZGF0YSRTbGVlcF9RdWFsaXR5LCBkYXRhJEFkZGljdF9IZWF2eSkNCg0KIyBIaeG7h3UgY2jhu4luaCDEkeG7gyB0csOhbmggbOG7l2kNCnRhYmxlX2NvcnJlY3RlZCA8LSB0YWJsZV9zbGVlcF9hZGRpY3RfMngyDQoNCiMgVMOtbmggT2RkcyBSYXRpbw0KbGlicmFyeShlcGl0b29scykNCm9kZHNyYXRpbyh0YWJsZV9jb3JyZWN0ZWQpDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQotIG5ow7NtIHRoYW0gY2hp4bq/dSDEkcaw4bujYyBjaOG7jW4gbMOgIE5n4bunIMSR4bunIA0KDQoqKi0gS+G6v3QgcXXhuqMgT1IgPSA3OC4wMDc4MyBjaG8gdGEgdGjhuqV5IFNpbmggdmnDqm4gdGhp4bq/dSBuZ+G7pyBjw7Mgbmd1eSBjxqEgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSBjYW8gaMahbiA3OCBs4bqnbiBzbyB24bubaSBzaW5oIHZpw6puIG5n4bunIMSR4bunKiosIHbhu5tpIMSR4buZIHRpbiBj4bqteSA5NSUgKENJOiBbMzguNSA7IDE4Ny43XSkuIHAtdmFsdWUgY+G7sWMga+G7syBuaOG7jyAo4omIIDApIOKHkiBN4buRaSBsacOqbiBo4buHIG7DoHkgcuG6pXQgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi4gDQoNCi0gdGEgdGjhuqV5IMSRxrDhu6NjIHLhurFuZzogKipDw7MgbeG7kWkgbGnDqm4gaOG7hyBy4bqldCBt4bqhbmggdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogY2FvIGdp4buvYSB2aeG7h2MgdGhp4bq/dSBuZ+G7pyB2w6AgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaS4gxJBp4buBdSBuw6B5IHBo4bqjbiDDoW5oIHLhurFuZyBuaOG7r25nIHNpbmggdmnDqm4gdGhp4bq/dSBuZ+G7pyBjw7MgeHUgaMaw4bubbmcgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSBuaGnhu4F1IGjGoW4sIGhv4bq3YyBuZ8aw4bujYyBs4bqhaSDigJQgbmdoaeG7h24gbeG6oW5nIHjDoyBo4buZaSBk4bqrbiDEkeG6v24gcuG7kWkgbG/huqFuIGdp4bqlYyBuZ+G7py4qKg0KDQojIyMjICoqNC4xLjcgS+G6v3QgbHXhuq1uIGNodW5nKioNCg0KLSBUw6xuaCB0cuG6oW5nIG7DoHkgbMOgIG3hu5l0IGPhuqNuaCBiw6FvIG5naGnDqm0gdMO6YyB24buBIGzhu5FpIHPhu5FuZyB0aGnhur91IGtp4buDbSBzb8OhdCBjw7RuZyBuZ2jhu4cgY+G7p2Egc2luaCB2acOqbiBoaeG7h24gbmF5LiBWaeG7h2MgeMOieSBk4buxbmcgY8OhYyBjaMawxqFuZyB0csOsbmggcXXhuqNuIGzDvSB0aOG7nWkgZ2lhbiBz4butIGThu6VuZyBt4bqhbmcgeMOjIGjhu5lpIHbDoCBnacOhbyBk4bulYyBz4bupYyBraOG7j2UgZ2nhuqVjIG5n4bunIG7Dqm4gxJHGsOG7o2MgeGVtIGzDoCDGsHUgdGnDqm4gdHJvbmcgbcO0aSB0csaw4budbmcgxJHhuqFpIGjhu41jLg==