df <- read.csv("caffeine_intake_tracker.csv")

LỜI CẢM ƠN

Lời đầu tiên, em xin gửi lời cảm ơn chân thành đến Giảng viên - ThS. Trần Mạnh Tường. Trong quá trình học tập và tìm hiểu môn “Phân tích dữ liệu định tính”, em đã nhận được sự quan tâm giúp đỡ, hướng dẫn và chỉ bảo tận tình của thầy. Thầy đã giúp em tích lũy thêm nhiều kiến thức để có cái nhìn khái quát và hiểu hơn về môn học này. Từ những kiến thức được thầy truyền tải, em dần hiểu được tầm quan trọng của môn học mà bấy lâu nay còn nhiều thắc mắc. Thông qua bài tiểu luận này, em xin trình bày những gì em đã tìm hiểu về môn học, và cụ thể là em lựa chọn đề tài “Phân tích những yếu tố ảnh hưởng đến mức độ tiêu thụ rượu của sinh viên”.

Kiến thức là vô hạn nhưng sự tiếp nhận kiến thức của bản thân em luôn có những hạn chế nhất định. Do đó, trong quá trình hoàn thành bài tiểu luận, chắc chắn em không tránh khỏi những thiếu sót, vậy nên em rất mong nhận được những góp ý từ thầy để bài tiểu luận được hoàn thiện hơn.

Em kính chúc thầy sức khỏe, hạnh phúc và thành công trên con đường sự nghiệp của mình.

1 CHƯƠNG 1 : TỔNG QUAN NGHIÊN CỨU

1.1 Lý do chọn đề tài

Trong nhịp sống hiện đại, các sản phẩm chứa caffeine như cà phê, trà, nước tăng lực hay socola đang trở nên phổ biến và gần như không thể thiếu với nhiều người, đặc biệt là sinh viên và người lao động trí óc. Tuy nhiên, bên cạnh những lợi ích như giúp tỉnh táo và cải thiện hiệu suất làm việc tạm thời, caffeine cũng tiềm ẩn nhiều ảnh hưởng tiêu cực đến sức khỏe, đặc biệt là chất lượng giấc ngủ. Mất ngủ, ngủ chập chờn hay khó đi vào giấc ngủ là những hệ quả dễ gặp nhưng thường bị xem nhẹ. Với mong muốn tìm hiểu rõ hơn mối quan hệ giữa việc tiêu thụ caffeine và các rối loạn giấc ngủ, từ đó đưa ra những khuyến nghị khoa học và thiết thực, em quyết định chọn đề tài “Phân tích các yếu tố ảnh hưởng đến giấc ngủ khi tiêu thụ các chất có chứa caffeine” làm nội dung nghiên cứu tiểu luận của mình.

1.2 Mục tiêu nghiên cứu

Đề tài nhằm phân tích và đánh giá mối liên hệ giữa việc tiêu thụ các chất chứa caffeine và chất lượng giấc ngủ của người sử dụng. Cụ thể, nghiên cứu tập trung xác định mức độ ảnh hưởng của lượng caffeine tiêu thụ đến chất lượng giấc ngủ và khả năng bị rối loạn giấc ngủ. Đồng thời, đề tài cũng xem xét sự khác biệt về tác động của caffeine tùy theo loại đồ uống như cà phê, trà hoặc nước tăng lực, cũng như thời điểm tiêu thụ trong ngày (sáng, chiều hoặc tối). Ngoài ra, nghiên cứu còn làm rõ vai trò của các yếu tố nhân khẩu học như độ tuổi và giới tính trong việc điều chỉnh khả năng dung nạp caffeine và phản ứng giấc ngủ. Trên cơ sở kết quả phân tích, đề tài kỳ vọng sẽ đưa ra các khuyến nghị khoa học và thực tiễn về liều lượng, loại thức uống và thời điểm sử dụng caffeine phù hợp nhằm nâng cao chất lượng giấc ngủ và sức khỏe tổng thể.

1.3 Đối tượng và phạm vi nghiên cứu

  • Đối tượng nghiên cứu:

Bộ dữ liệu nghiên cứu gồm 500 quan sát trong lĩnh vực Khoa học Dữ liệu.

  • Phạm vi nghiên cứu

Nghiên cứu này tập trung phân tích mối quan hệ giữa việc tiêu thụ caffeine và chất lượng giấc ngủ trên mẫu dữ liệu gồm 500 cá nhân đang hoạt động trong lĩnh vực Khoa học Dữ liệu.Thông tin được thu thập thông qua các biến định lượng và định tính như: lượng caffeine tiêu thụ (mg), loại đồ uống sử dụng (cà phê, trà, nước tăng lực), thời điểm tiêu thụ trong ngày (sáng, chiều, tối), mức độ tập trung, chất lượng giấc ngủ.

1.4 Phương pháp nghiên cứu

Bài nghiên cứu sử dụng phương pháp thống kê và các mô hình hồi quy để phân tích dữ liệu, nhằm làm rõ tác động của các yếu tố ảnh hưởng đến giấc ngủ như lượng tiêu thụ cà phê , trà , nước tăng lực .

1.5 Kết cấu bài nghiên cứu

  • Chương 1: Tổng quan nghiên cứu
  • Chương 2: Dữ liệu nghiên cứu
  • Chương 3: Kết quả phân tích
  • Chương 4: Kết luận

2 CHƯƠNG 2: DỮ LIỆU PHÂN TÍCH

2.1 Giới thiệu bộ dữ liệu

Bộ dữ liệu bao gồm 500 quan sát, bao gồm 13 biến, với cả các biến định tính và định lượng. Ta có 9 biến định tính và 4 biến định lượng

d <-read.csv(file.choose(), header=T)
str(d)
## 'data.frame':    500 obs. of  13 variables:
##  $ caffeine_mg          : num  0.4545 0.2864 0.5318 0.0682 0.4091 ...
##  $ age                  : num  1 0.8333 0.4762 0.6429 0.0476 ...
##  $ focus_level          : num  0.715 0.846 0.666 0.751 0.808 ...
##  $ sleep_quality        : num  0.75 0.73 0.277 0.654 0.71 ...
##  $ sleep_impacted       : int  1 0 1 0 1 1 0 1 1 1 ...
##  $ beverage_coffee      : chr  "True" "True" "False" "False" ...
##  $ beverage_energy_drink: chr  "False" "False" "True" "False" ...
##  $ beverage_tea         : chr  "False" "False" "False" "True" ...
##  $ time_of_day_afternoon: chr  "False" "False" "False" "False" ...
##  $ time_of_day_evening  : chr  "True" "False" "False" "False" ...
##  $ time_of_day_morning  : chr  "False" "True" "True" "True" ...
##  $ gender_female        : chr  "True" "True" "False" "True" ...
##  $ gender_male          : chr  "False" "False" "True" "False" ...
sum(is.na(d))
## [1] 0

Không có giá trị NA trong bộ dữ liệu

2.2 Mô tả các biến trong dữ liệu

# Load thư viện
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.3
# Tạo bảng mô tả biến
variable_explain <- data.frame(
  Ten_Bien = c(
    "caffeine_mg",
    "age",
    "focus_level",
    "sleep_quality",
    "sleep_impacted",
    "beverage_coffee",
    "beverage_energy_drink",
    "beverage_tea",
    "time_of_day_afternoon",
    "time_of_day_evening",
    "time_of_day_morning",
    "gender_female",
    "gender_male"
  ),
  Y_Nghia = c(
    "Lượng caffeine tiêu thụ (chuẩn hóa giữa 0 và 1)",
    "Tuổi người tham gia (chuẩn hóa giữa 0 và 1)",
    "Mức độ tập trung sau khi tiêu thụ caffeine (chuẩn hóa)",
    "Chất lượng giấc ngủ được đánh giá (chuẩn hóa)",
    "Giấc ngủ có bị ảnh hưởng bởi caffeine hay không (1: Có, 0: Không)",
    "Loại đồ uống: Có uống cà phê hay không (TRUE/FALSE)",
    "Loại đồ uống: Có uống nước tăng lực hay không (TRUE/FALSE)",
    "Loại đồ uống: Có uống trà hay không (TRUE/FALSE)",
    "Thời gian tiêu thụ: Buổi chiều (TRUE/FALSE)",
    "Thời gian tiêu thụ: Buổi tối (TRUE/FALSE)",
    "Thời gian tiêu thụ: Buổi sáng (TRUE/FALSE)",
    "Giới tính: Nữ (TRUE/FALSE)",
    "Giới tính: Nam (TRUE/FALSE)"
  )
)

# Hiển thị bảng với caption
kable(variable_explain, caption = "Giải thích các biến trong bộ dữ liệu caffeine_intake_tracker.csv")
Giải thích các biến trong bộ dữ liệu caffeine_intake_tracker.csv
Ten_Bien Y_Nghia
caffeine_mg Lượng caffeine tiêu thụ (chuẩn hóa giữa 0 và 1)
age Tuổi người tham gia (chuẩn hóa giữa 0 và 1)
focus_level Mức độ tập trung sau khi tiêu thụ caffeine (chuẩn hóa)
sleep_quality Chất lượng giấc ngủ được đánh giá (chuẩn hóa)
sleep_impacted Giấc ngủ có bị ảnh hưởng bởi caffeine hay không (1: Có, 0: Không)
beverage_coffee Loại đồ uống: Có uống cà phê hay không (TRUE/FALSE)
beverage_energy_drink Loại đồ uống: Có uống nước tăng lực hay không (TRUE/FALSE)
beverage_tea Loại đồ uống: Có uống trà hay không (TRUE/FALSE)
time_of_day_afternoon Thời gian tiêu thụ: Buổi chiều (TRUE/FALSE)
time_of_day_evening Thời gian tiêu thụ: Buổi tối (TRUE/FALSE)
time_of_day_morning Thời gian tiêu thụ: Buổi sáng (TRUE/FALSE)
gender_female Giới tính: Nữ (TRUE/FALSE)
gender_male Giới tính: Nam (TRUE/FALSE)

3 CHƯƠNG 3: KẾT QUẢ PHÂN TÍCH

3.1 Thống kê mô tả biến phụ thuộc(sleep_impacted-giấc ngủ bị ảnh hưởng)

Giải thích biến

# Load thư viện
library(knitr)

# 1. Bảng giải thích các mức của biến sleep_impacted (biến phụ thuộc)
sleep_impacted_levels <- data.frame(
  Gia_tri = c(0, 1),
  Y_nghia = c(
    "Không bị ảnh hưởng bởi caffeine",
    "Bị ảnh hưởng bởi caffeine"
  )
)

# Hiển thị bảng với chú thích
kable(sleep_impacted_levels, caption = "Giải thích các mức độ trong biến sleep_impacted")
Giải thích các mức độ trong biến sleep_impacted
Gia_tri Y_nghia
0 Không bị ảnh hưởng bởi caffeine
1 Bị ảnh hưởng bởi caffeine

Lập bản tần số và tần suất

# Tạo bảng tần suất cho biến sleep_impacted (giữ nguyên mức gốc)
ts_sleep_impacted <- table(d$sleep_impacted)

# Tạo bảng dữ liệu
ts_sleep_impacted_df <- data.frame(
  Gia_tri = names(ts_sleep_impacted),
  Tan_so = as.vector(ts_sleep_impacted),
  Ty_le = round((as.vector(ts_sleep_impacted) / sum(ts_sleep_impacted)) * 100, 2)
)

# Hiển thị kết quả
ts_sleep_impacted_df
##   Gia_tri Tan_so Ty_le
## 1       0    297  59.4
## 2       1    203  40.6

Biểu đồ

# Tạo bảng tần suất cho biến sleep_impacted
ts_sleep_impacted <- table(d$sleep_impacted)

# Tính tỷ lệ phần trăm
percent_sleep_impacted <- round((ts_sleep_impacted / sum(ts_sleep_impacted)) * 100, 2)

# Tạo nhãn có tên mức + tỷ lệ
labels_sleep_impacted <- paste(names(ts_sleep_impacted), "(", percent_sleep_impacted, "%)", sep = "")

# Vẽ biểu đồ tròn
pie(ts_sleep_impacted,
    labels = labels_sleep_impacted,
    main = "Biểu đồ tròn: Mức ảnh hưởng của caffeine tới giấc ngủ (sleep_impacted)",
    col = rainbow(length(ts_sleep_impacted)))

Nhận xét

Biểu đồ cho thấy có 40,6% người tham gia bị ảnh hưởng đến giấc ngủ khi tiêu thụ caffeine, trong khi 59,4% không bị ảnh hưởng. Tỷ lệ này cho thấy caffeine có thể gây tác động đáng kể đến giấc ngủ ở một bộ phận lớn người dùng. Điều này cho thấy cần thiết phải phân tích sâu hơn để hiểu rõ các yếu tố làm tăng nguy cơ mất ngủ khi sử dụng caffeine.

3.2 Thống kê mô tả biến độc lập

3.2.1 Biến beverage_coffee

Giải thích biến

# Load thư viện
library(knitr)

# 1. Bảng giải thích các mức của biến beverage_coffee (biến nhị phân)
beverage_coffee_levels <- data.frame(
  Gia_tri = c("TRUE", "FALSE"),
  Y_nghia = c(
    "Người tham gia có uống cà phê",
    "Người tham gia không uống cà phê"
  )
)

# Hiển thị bảng
kable(beverage_coffee_levels, caption = "Giải thích các mức độ trong biến beverage_coffee")
Giải thích các mức độ trong biến beverage_coffee
Gia_tri Y_nghia
TRUE Người tham gia có uống cà phê
FALSE Người tham gia không uống cà phê

Lập bảng tần số và tần suất

# Tạo bảng tần suất cho biến beverage_coffee (giữ nguyên mức gốc)
ts_beverage_coffee <- table(d$beverage_coffee)

# Tạo bảng dữ liệu
ts_beverage_coffee_df <- data.frame(
  Gia_tri = names(ts_beverage_coffee),
  Tan_so = as.vector(ts_beverage_coffee),
  Ty_le = round((as.vector(ts_beverage_coffee) / sum(ts_beverage_coffee)) * 100, 2)
)

# Hiển thị kết quả
ts_beverage_coffee_df
##   Gia_tri Tan_so Ty_le
## 1   False    235    47
## 2    True    265    53

Biểu đồ

# Tạo bảng tần suất cho biến beverage_coffee
ts_beverage_coffee <- table(d$beverage_coffee)

# Tính tỷ lệ phần trăm
percent_beverage_coffee <- round((ts_beverage_coffee / sum(ts_beverage_coffee)) * 100, 2)

# Tạo nhãn có tên mức + tỷ lệ
labels_beverage_coffee <- paste(names(ts_beverage_coffee), "(", percent_beverage_coffee, "%)", sep = "")

# Vẽ biểu đồ tròn
pie(ts_beverage_coffee, 
    labels = labels_beverage_coffee,
    main = "Biểu đồ tròn: Tỷ lệ người uống cà phê (beverage_coffee)",
    col = rainbow(length(ts_beverage_coffee)))

Nhận xét

Biểu đồ cho thấy có 53% người tham gia khảo sát có uống cà phê, trong khi 47% không sử dụng loại đồ uống này. Tỷ lệ tương đối cân bằng này cho thấy cà phê là loại thức uống chứa caffeine phổ biến nhất trong mẫu khảo sát, đồng thời cũng là yếu tố đáng chú ý khi phân tích ảnh hưởng của caffeine đến giấc ngủ.

3.2.2 Biến beverage_energy_drink

Giải thích biến

# Load thư viện
library(knitr)

# Bảng giải thích các mức của biến beverage_energy_drink (biến nhị phân)
beverage_energy_drink_levels <- data.frame(
  Gia_tri = c("TRUE", "FALSE"),
  Y_nghia = c(
    "Người tham gia có uống nước tăng lực",
    "Người tham gia không uống nước tăng lực"
  )
)

# Hiển thị bảng
kable(beverage_energy_drink_levels, caption = "Giải thích các mức độ trong biến beverage_energy_drink")
Giải thích các mức độ trong biến beverage_energy_drink
Gia_tri Y_nghia
TRUE Người tham gia có uống nước tăng lực
FALSE Người tham gia không uống nước tăng lực

Lập bảng tần số và tần suất

# Tạo bảng tần suất cho biến beverage_energy_drink
ts_beverage_energy <- table(d$beverage_energy_drink)

# Tính tỷ lệ phần trăm
percent_beverage_energy <- round((ts_beverage_energy / sum(ts_beverage_energy)) * 100, 2)

# Tạo bảng dữ liệu
ts_beverage_energy_df <- data.frame(
  Gia_tri = names(ts_beverage_energy),
  Tan_so = as.vector(ts_beverage_energy),
  Ty_le = percent_beverage_energy
)

# Hiển thị bảng kết quả
ts_beverage_energy_df
##   Gia_tri Tan_so Ty_le.Var1 Ty_le.Freq
## 1   False    453      False       90.6
## 2    True     47       True        9.4

Biểu đồ

# Tạo bảng tần suất
ts_beverage_energy <- table(d$beverage_energy_drink)

# Tính tỷ lệ phần trăm
percent_beverage_energy <- round((ts_beverage_energy / sum(ts_beverage_energy)) * 100, 2)

# (Tuỳ chọn) Gắn nhãn tiếng Việt thay cho TRUE/FALSE
names(ts_beverage_energy) <- c("Không uống nước tăng lực", "Có uống nước tăng lực")

# Tạo nhãn hiển thị: tên mức + tỷ lệ %
labels_beverage_energy <- paste(
  names(ts_beverage_energy), 
  "(", percent_beverage_energy, "%)", 
  sep = ""
)

# Vẽ biểu đồ tròn
pie(ts_beverage_energy,
    labels = labels_beverage_energy,
    main = "Biểu đồ tròn: Tỷ lệ người uống nước tăng lực (beverage_energy_drink)",
    col = rainbow(length(ts_beverage_energy)))

Nhận xét

Biểu đồ cho thấy chỉ có 9,4% người tham gia khảo sát sử dụng nước tăng lực, trong khi 90,6% không sử dụng loại đồ uống này. Điều này cho thấy nước tăng lực không phải là nguồn caffeine phổ biến trong cộng đồng khảo sát, đồng thời cho thấy mức độ ảnh hưởng của loại đồ uống này đến giấc ngủ có thể sẽ không chiếm ưu thế trong phân tích tổng thể.

3.2.3 Biến beverage_tea

Giải thích biến

# Load thư viện
library(knitr)

# Bảng giải thích các mức của biến beverage_tea (biến nhị phân)
beverage_tea_levels <- data.frame(
  Gia_tri = c("TRUE", "FALSE"),
  Y_nghia = c(
    "Người tham gia có uống trà",
    "Người tham gia không uống trà"
  )
)

# Hiển thị bảng
kable(beverage_tea_levels, caption = "Giải thích các mức độ trong biến beverage_tea")
Giải thích các mức độ trong biến beverage_tea
Gia_tri Y_nghia
TRUE Người tham gia có uống trà
FALSE Người tham gia không uống trà

Lập bảng tần số và tần suất

# Tạo bảng tần suất cho biến beverage_tea
ts_beverage_tea <- table(d$beverage_tea)

# Tính tỷ lệ phần trăm
percent_beverage_tea <- round((ts_beverage_tea / sum(ts_beverage_tea)) * 100, 2)

# Tạo bảng dữ liệu
ts_beverage_tea_df <- data.frame(
  Gia_tri = names(ts_beverage_tea),
  Tan_so = as.vector(ts_beverage_tea),
  Ty_le = percent_beverage_tea
)

# Hiển thị bảng kết quả
ts_beverage_tea_df
##   Gia_tri Tan_so Ty_le.Var1 Ty_le.Freq
## 1   False    312      False       62.4
## 2    True    188       True       37.6

Biểu đồ

# Tạo bảng tần suất
ts_beverage_tea <- table(d$beverage_tea)

# Tính tỷ lệ phần trăm
percent_beverage_tea <- round((ts_beverage_tea / sum(ts_beverage_tea)) * 100, 2)

# (Tùy chọn) Gắn nhãn tiếng Việt thay cho TRUE/FALSE
names(ts_beverage_tea) <- c("Không uống trà", "Có uống trà")

# Tạo nhãn: tên mức + tỷ lệ %
labels_beverage_tea <- paste(
  names(ts_beverage_tea), 
  "(", percent_beverage_tea, "%)", 
  sep = ""
)

# Vẽ biểu đồ tròn
pie(ts_beverage_tea,
    labels = labels_beverage_tea,
    main = "Biểu đồ tròn: Tỷ lệ người uống trà (beverage_tea)",
    col = rainbow(length(ts_beverage_tea)))

Nhận xét

Biểu đồ cho thấy có 37,6% người tham gia khảo sát có uống trà, trong khi 62,4% không sử dụng loại đồ uống này. Mặc dù không phổ biến bằng cà phê, trà vẫn là nguồn caffeine tương đối phổ biến trong cộng đồng khảo sát và có thể đóng vai trò nhất định trong việc ảnh hưởng đến chất lượng giấc ngủ.

3.2.4 time_of_day_evenning

Giải thích biến

# Load thư viện
library(knitr)

# Bảng giải thích các mức của biến time_of_day_evening (biến nhị phân)
time_of_day_evening_levels <- data.frame(
  Gia_tri = c("TRUE", "FALSE"),
  Y_nghia = c(
    "Thời gian khảo sát diễn ra vào buổi tối",
    "Thời gian khảo sát không diễn ra vào buổi tối"
  )
)

# Hiển thị bảng
kable(time_of_day_evening_levels, caption = "Giải thích các mức độ trong biến time_of_day_evening")
Giải thích các mức độ trong biến time_of_day_evening
Gia_tri Y_nghia
TRUE Thời gian khảo sát diễn ra vào buổi tối
FALSE Thời gian khảo sát không diễn ra vào buổi tối

Lập bảng tần số và tần suất

# Tạo bảng tần suất cho biến time_of_day_evening
ts_time_evening <- table(d$time_of_day_evening)

# Tính tỷ lệ phần trăm
percent_time_evening <- round((ts_time_evening / sum(ts_time_evening)) * 100, 2)

# Tạo bảng dữ liệu
ts_time_evening_df <- data.frame(
  Gia_tri = names(ts_time_evening),
  Tan_so = as.vector(ts_time_evening),
  Ty_le = percent_time_evening
)

# Hiển thị bảng kết quả
ts_time_evening_df
##   Gia_tri Tan_so Ty_le.Var1 Ty_le.Freq
## 1   False    406      False       81.2
## 2    True     94       True       18.8

Biểu đồ

# Tạo bảng tần suất
ts_time_evening <- table(d$time_of_day_evening)

# Tính tỷ lệ phần trăm
percent_time_evening <- round((ts_time_evening / sum(ts_time_evening)) * 100, 2)

# Gắn nhãn tiếng Việt thay cho FALSE/TRUE
names(ts_time_evening) <- c("Không buổi tối", "Buổi tối")

# Tạo nhãn: tên mức + tỷ lệ %
labels_time_evening <- paste(
  names(ts_time_evening),
  "(", percent_time_evening, "%)",
  sep = ""
)

# Vẽ biểu đồ tròn
pie(ts_time_evening,
    labels = labels_time_evening,
    main = "Biểu đồ tròn: Tỷ lệ thời gian sử dụng vào buổi tối (time_of_day_evening)",
    col = rainbow(length(ts_time_evening)))

Nhận xét

Biểu đồ cho thấy rằng phần lớn người tham gia khảo sát không sử dụng caffeine vào buổi tối, chiếm tỷ lệ 81.2%. Ngược lại, chỉ có 18.8% người tham gia có hành vi sử dụng caffeine vào khung thời gian buổi tối.

3.3 Kiểm định tính độc lập

3.3.1 Biến sleep_impacted và beverage_coffee

# Tạo bảng tần số chéo giữa sleep_impacted và beverage_coffee
tbl_sleep_bevcoffee <- table(d$sleep_impacted, d$beverage_coffee)

# Thực hiện kiểm định Chi-bình-phương
test_sleep_bevcoffee <- chisq.test(tbl_sleep_bevcoffee)

# Hiển thị kết quả
print(test_sleep_bevcoffee)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tbl_sleep_bevcoffee
## X-squared = 36.058, df = 1, p-value = 1.915e-09

Nhận xét

Kết quả kiểm định Chi-squared cho thấy p-value rất nhỏ (p ≈ 0.0000000019), chứng tỏ có mối liên hệ thống kê có ý nghĩa giữa việc uống cà phê và việc bị ảnh hưởng giấc ngủ do caffeine. Điều này cho thấy những người uống cà phê có xu hướng bị ảnh hưởng đến giấc ngủ nhiều hơn so với những người không uống, và mối quan hệ này không xảy ra một cách ngẫu nhiên.

3.3.2 Biến sleep_impacted và beverage_energy_drink

# Tạo bảng tần số chéo giữa sleep_impacted và beverage_energy_drink
tbl_sleep_energy <- table(d$sleep_impacted, d$beverage_energy_drink)

# Thực hiện kiểm định Chi-bình-phương
test_sleep_energy <- chisq.test(tbl_sleep_energy)

# Hiển thị kết quả
print(test_sleep_energy)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tbl_sleep_energy
## X-squared = 10.569, df = 1, p-value = 0.00115

Nhận xét

Kết quả kiểm định Chi-squared giữa việc uống nước tăng lực và ảnh hưởng đến giấc ngủ cho thấy p-value = 0.00115, nhỏ hơn mức ý nghĩa 0.05. Điều này cho thấy có mối liên hệ thống kê có ý nghĩa giữa hai biến, tức là việc uống nước tăng lực có liên quan đến khả năng bị ảnh hưởng giấc ngủ. Dù tỷ lệ người uống nước tăng lực không cao, kết quả vẫn cho thấy nhóm này có xu hướng bị ảnh hưởng đến giấc ngủ nhiều hơn so với nhóm không sử dụng.

3.3.3 Biến sleep_impacted và beverage_tea

# Tạo bảng tần số chéo giữa sleep_impacted và beverage_tea
tbl_sleep_tea <- table(d$sleep_impacted, d$beverage_tea)

# Thực hiện kiểm định Chi-bình-phương
test_sleep_tea <- chisq.test(tbl_sleep_tea)

# Hiển thị kết quả
print(test_sleep_tea)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tbl_sleep_tea
## X-squared = 67.897, df = 1, p-value < 2.2e-16

Nhận xét

Kết quả kiểm định Chi-squared cho thấy p-value < 2.2e-16, cực kỳ nhỏ, chứng tỏ mối liên hệ giữa việc uống trà và ảnh hưởng đến giấc ngủ là rất có ý nghĩa thống kê.Ta có thể kết luận rằng việc uống trà không độc lập với khả năng bị ảnh hưởng giấc ngủ. Nói cách khác, những người có thói quen uống trà có xu hướng bị tác động đến giấc ngủ rõ rệt hơn so với những người không uống.

3.3.4 Biến sleep_impacted và time_of_day_evening

# Tạo bảng tần số chéo giữa sleep_impacted và time_of_day_evening
tbl_sleep_evening <- table(d$sleep_impacted, d$time_of_day_evening)

# Thực hiện kiểm định Chi-bình-phương
test_sleep_evening <- chisq.test(tbl_sleep_evening)

# Hiển thị kết quả
print(test_sleep_evening)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  tbl_sleep_evening
## X-squared = 3.775, df = 1, p-value = 0.05202

Nhận xét

Nếu sử dụng mức ý nghĩa α = 0.05, ta chưa đủ bằng chứng thống kê để bác bỏ giả thuyết H₀ (giả thuyết rằng không có mối liên hệ giữa hai biến).Tuy nhiên, giá trị p chỉ nhỉnh hơn 0.05 một chút, điều này cho thấy có dấu hiệu của một mối liên hệ yếu giữa việc sử dụng caffeine vào buổi tối và việc bị ảnh hưởng giấc ngủ, nhưng chưa đạt mức ý nghĩa thống kê chặt chẽ.

3.4 Thống kê mô tả 2 biến

3.4.1 Biến sleep_impacted và beverage_coffee

# Kiểm tra các giá trị gốc của biến sleep_impacted
unique(d$sleep_impacted)
## [1] 1 0
# Kiểm tra các giá trị gốc của biến beverage_coffee
unique(d$beverage_coffee)
## [1] "True"  "False"
# Nếu sleep_impacted đã là 0 và 1 → gán nhãn rõ ràng
if (all(unique(d$sleep_impacted) %in% c(0, 1))) {
  d$SleepClear <- factor(d$sleep_impacted,
                         levels = c(0, 1),
                         labels = c("Không bị ảnh hưởng", "Bị ảnh hưởng"))
} else {
  d$SleepClear <- factor(d$sleep_impacted)
}

# Nếu beverage_coffee là TRUE/FALSE → gán nhãn rõ ràng
if (all(unique(d$beverage_coffee) %in% c(TRUE, FALSE))) {
  d$CoffeeClear <- factor(d$beverage_coffee,
                          levels = c(FALSE, TRUE),
                          labels = c("Không uống cà phê", "Có uống cà phê"))
} else {
  d$CoffeeClear <- factor(d$beverage_coffee)
}

# Tạo bảng tần số chéo
table_sleep_coffee <- table(d$SleepClear, d$CoffeeClear)

# Hiển thị bảng
print(table_sleep_coffee)
##                     
##                      False True
##   Không bị ảnh hưởng   173  124
##   Bị ảnh hưởng          62  141
# Tạo bảng tần số chéo (nếu chưa có)
table_sleep_coffee <- table(d$SleepClear, d$CoffeeClear)

# Tính tỷ lệ phần trăm theo hàng (row-wise)
prop_table_sleep_coffee <- prop.table(table_sleep_coffee, margin = 1) * 100

# Làm tròn kết quả
round(prop_table_sleep_coffee, 2)
##                     
##                      False  True
##   Không bị ảnh hưởng 58.25 41.75
##   Bị ảnh hưởng       30.54 69.46

BIểu đồ

# Load ggplot2
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
# Vẽ biểu đồ cột nhóm
ggplot(d, aes(x = SleepClear, fill = CoffeeClear)) +
  geom_bar(position = "dodge") +
  geom_text(stat = "count", aes(label = ..count..),
            position = position_dodge(width = 0.9), vjust = -0.3, color = "black", size = 4) +
  labs(title = "Biểu đồ cột nhóm: Ảnh hưởng giấc ngủ và thói quen uống cà phê",
       x = "Giấc ngủ bị ảnh hưởng bởi caffeine",
       y = "Số lượng người tham gia",
       fill = "Uống cà phê") +
  theme_minimal()
## Warning: The dot-dot notation (`..count..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(count)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Nhận xét

Biểu đồ cho thấy trong nhóm không uống cà phê, phần lớn người tham gia không bị ảnh hưởng bởi caffeine đến giấc ngủ (173 người) chiếm 74%, chỉ có 26% người bị ảnh hưởng. Ngược lại, trong nhóm có uống cà phê, số người bị ảnh hưởng giấc ngủ (141) chiếm 53% cao hơn số người không bị ảnh hưởng (124) chiếm 47%. Điều này cho thấy xu hướng rõ rệt: người uống cà phê có khả năng bị ảnh hưởng đến giấc ngủ cao hơn so với người không uống.

3.4.2 Biến sleep_impacted và beverage_energy_drink

Lập bảng tần số và tần suất

# Kiểm tra các giá trị gốc của biến sleep_impacted
unique(d$sleep_impacted)
## [1] 1 0
# Kiểm tra các giá trị gốc của biến beverage_energy_drink
unique(d$beverage_energy_drink)
## [1] "False" "True"
# Nếu sleep_impacted đã là 0 và 1 → gán nhãn rõ ràng
if (all(unique(d$sleep_impacted) %in% c(0, 1))) {
  d$SleepClear <- factor(d$sleep_impacted,
                         levels = c(0, 1),
                         labels = c("Không bị ảnh hưởng", "Bị ảnh hưởng"))
} else {
  d$SleepClear <- factor(d$sleep_impacted)
}

# Nếu beverage_energy_drink là TRUE/FALSE → gán nhãn rõ ràng
if (all(unique(d$beverage_energy_drink) %in% c(TRUE, FALSE))) {
  d$EnergyClear <- factor(d$beverage_energy_drink,
                          levels = c(FALSE, TRUE),
                          labels = c("Không uống năng lượng", "Có uống năng lượng"))
} else {
  d$EnergyClear <- factor(d$beverage_energy_drink)
}

# Tạo bảng tần số chéo
table_sleep_energy <- table(d$SleepClear, d$EnergyClear)

# Hiển thị bảng
print(table_sleep_energy)
##                     
##                      False True
##   Không bị ảnh hưởng   280   17
##   Bị ảnh hưởng         173   30

Biểu đồ

# Load ggplot2
library(ggplot2)

# Vẽ biểu đồ cột nhóm
ggplot(d, aes(x = SleepClear, fill = EnergyClear)) +
  geom_bar(position = "dodge") +
  geom_text(stat = "count", aes(label = ..count..),
            position = position_dodge(width = 0.9), 
            vjust = -0.3, color = "black", size = 4) +
  labs(title = "Biểu đồ cột nhóm: Ảnh hưởng giấc ngủ và thói quen uống nước tăng lực",
       x = "Giấc ngủ bị ảnh hưởng bởi caffeine",
       y = "Số lượng người tham gia",
       fill = "Uống nước tăng lực") +
  theme_minimal()

Nhận xét

Biểu đồ cho thấy trong nhóm có uống nước tăng lực, số người bị ảnh hưởng đến giấc ngủ (30 người) chiếm 64% cao hơn đáng kể so với số người không bị ảnh hưởng (17 người) chiếm 36%. Ngược lại, ở nhóm không uống nước tăng lực, phần lớn người tham gia không bị ảnh hưởng giấc ngủ. Mặc dù tỷ lệ người sử dụng nước tăng lực thấp, nhưng kết quả cho thấy họ có nguy cơ bị rối loạn giấc ngủ cao hơn, phản ánh mối liên hệ đáng chú ý giữa thói quen sử dụng nước tăng lực và chất lượng giấc ngủ.

3.4.3 Biến sleep_impacted và beverage_tea

Lập bảng tần số và tần suất

# Kiểm tra các giá trị gốc của biến sleep_impacted
unique(d$sleep_impacted)
## [1] 1 0
# Kiểm tra các giá trị gốc của biến beverage_tea
unique(d$beverage_tea)
## [1] "False" "True"
# Nếu sleep_impacted đã là 0 và 1 → gán nhãn rõ ràng
if (all(unique(d$sleep_impacted) %in% c(0, 1))) {
  d$SleepClear <- factor(d$sleep_impacted,
                         levels = c(0, 1),
                         labels = c("Không bị ảnh hưởng", "Bị ảnh hưởng"))
} else {
  d$SleepClear <- factor(d$sleep_impacted)
}

# Nếu beverage_tea là TRUE/FALSE → gán nhãn rõ ràng
if (all(unique(d$beverage_tea) %in% c(TRUE, FALSE))) {
  d$TeaClear <- factor(d$beverage_tea,
                       levels = c(FALSE, TRUE),
                       labels = c("Không uống trà", "Có uống trà"))
} else {
  d$TeaClear <- factor(d$beverage_tea)
}

# Tạo bảng tần số chéo
table_sleep_tea <- table(d$SleepClear, d$TeaClear)

# Hiển thị bảng
print(table_sleep_tea)
##                     
##                      False True
##   Không bị ảnh hưởng   141  156
##   Bị ảnh hưởng         171   32

Biểu đồ

# Load ggplot2
library(ggplot2)

# Vẽ biểu đồ cột nhóm
ggplot(d, aes(x = SleepClear, fill = TeaClear)) +
  geom_bar(position = "dodge") +
  geom_text(stat = "count", aes(label = ..count..),
            position = position_dodge(width = 0.9), 
            vjust = -0.3, color = "black", size = 4) +
  labs(title = "Biểu đồ cột nhóm: Ảnh hưởng giấc ngủ và thói quen uống trà",
       x = "Giấc ngủ bị ảnh hưởng bởi caffeine",
       y = "Số lượng người tham gia",
       fill = "Uống trà") +
  theme_minimal()

Nhận xét

Biểu đồ cho thấy trong nhóm uống trà, phần lớn người tham gia không bị ảnh hưởng đến giấc ngủ (156 người) chiếm 83%, chỉ có 32 người chiếm 17% bị ảnh hưởng. Ngược lại, ở nhóm không uống trà, số người bị ảnh hưởng giấc ngủ (171 người) chiếm 55% lại cao hơn số người không bị ảnh hưởng (141 người ) chiếm 45%. Điều này cho thấy những người có thói quen uống trà dường như ít bị ảnh hưởng đến giấc ngủ hơn, so với những người không uống.

3.4.4 Biến sleep_impacted và time_of_day_evening

Lập bảng tần số và tần suất

# Kiểm tra các giá trị gốc của biến sleep_impacted
unique(d$sleep_impacted)
## [1] 1 0
# Kiểm tra các giá trị gốc của biến time_of_day_evening
unique(d$time_of_day_evening)
## [1] "True"  "False"
# Gán nhãn rõ ràng cho biến sleep_impacted
if (all(unique(d$sleep_impacted) %in% c(0, 1))) {
  d$SleepClear <- factor(d$sleep_impacted,
                         levels = c(0, 1),
                         labels = c("Không bị ảnh hưởng", "Bị ảnh hưởng"))
} else {
  d$SleepClear <- factor(d$sleep_impacted)
}

# Gán nhãn rõ ràng cho biến time_of_day_evening
if (all(unique(d$time_of_day_evening) %in% c(TRUE, FALSE))) {
  d$EveningClear <- factor(d$time_of_day_evening,
                           levels = c(FALSE, TRUE),
                           labels = c("Không buổi tối", "Buổi tối"))
} else {
  d$EveningClear <- factor(d$time_of_day_evening)
}

# Tạo bảng tần số chéo
table_sleep_evening <- table(d$SleepClear, d$EveningClear)

# Hiển thị bảng
print(table_sleep_evening)
##                     
##                      False True
##   Không bị ảnh hưởng   250   47
##   Bị ảnh hưởng         156   47

Biểu đồ

# Load ggplot2
library(ggplot2)

# Vẽ biểu đồ cột nhóm: sleep_impacted vs. time_of_day_evening
ggplot(d, aes(x = SleepClear, fill = EveningClear)) +
  geom_bar(position = "dodge") +
  geom_text(stat = "count", aes(label = ..count..),
            position = position_dodge(width = 0.9), 
            vjust = -0.3, color = "black", size = 4) +
  labs(title = "Biểu đồ cột nhóm: Ảnh hưởng giấc ngủ và thời điểm sử dụng buổi tối",
       x = "Giấc ngủ bị ảnh hưởng bởi caffeine",
       y = "Số lượng người tham gia",
       fill = "Thời điểm sử dụng (buổi tối)") +
  theme_minimal()

Nhận xét

Biểu đồ cột nhóm cho thấy số lượng người không sử dụng caffeine vào buổi tối chiếm ưu thế trong cả hai nhóm giấc ngủ: 250 người không bị ảnh hưởng chiếm 61,5% và 156 người bị ảnh hưởng chiếm 38,5%. Ngược lại, số người sử dụng vào buổi tối là tương đương ở cả hai nhóm (cùng 47 người). Điều này cho thấy thời điểm sử dụng caffeine vào buổi tối không khác biệt rõ rệt giữa những người bị ảnh hưởng và không bị ảnh hưởng đến giấc ngủ. Tuy nhiên, việc có ít người sử dụng caffeine vào buổi tối trong nhóm không bị ảnh hưởng có thể gợi ý rằng sử dụng caffeine vào buổi tối có khả năng góp phần làm tăng nguy cơ rối loạn giấc ngủ. Nhận định này cần được kiểm định thêm bằng các phân tích thống kê để xác định mức độ ý nghĩa.

3.5 Risk Ratio và khoảng ước lượng cho Risk Ratio

3.5.1 Biến sleep_impacted và beverage_coffee

Trong phân tích này, chúng tôi muốn phân tích giữa chất lượng giấc ngủ (sleep_impacted) và Đồ uống cà phê (beverage_coffee).

Biến phụ thuộc: sleep_impacted

Impacted (Bị ảnh hưởng): Giá trị 1 – caffeine có ảnh hưởng đến giấc ngủ.

Not impacted (Không bị ảnh hưởng): Giá trị 0 – caffeine không ảnh hưởng đến giấc ngủ.

Đây là biến đầu ra để phân tích xem các yếu tố khác (đặc biệt là loại đồ uống) có ảnh hưởng đến giấc ngủ không.

Biến độc lập: beverage_coffee

Coffee drinker (Có uống cà phê): Giá trị 1

Non-coffee drinker (Không uống cà phê): Giá trị 0

Đây là yếu tố đầu vào, để xem liệu việc uống cà phê có liên quan đến việc bị ảnh hưởng giấc ngủ hay không.

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

H₀ (Null Hypothesis): Risk Ratio = 1 → Không có sự khác biệt về tỷ lệ bị ảnh hưởng giấc ngủ giữa người uống cà phê và không uống cà phê.

H₁ (Alternative Hypothesis): Risk Ratio ≠ 1 → Có sự khác biệt về tỷ lệ bị ảnh hưởng giấc ngủ giữa người uống cà phê và không uống cà phê.

# Cài gói nếu chưa có
# install.packages("epitools")

library(epitools)

# Đọc dữ liệu
data <- read.csv("caffeine_intake_tracker.csv")

# Tạo bảng chéo giữa sleep_impacted và beverage_coffee
tbl_sleep_coffee <- table(
  SleepImpacted = data$sleep_impacted,
  Coffee = data$beverage_coffee
)

# Hiển thị bảng chéo để kiểm tra
print(tbl_sleep_coffee)
##              Coffee
## SleepImpacted False True
##             0   173  124
##             1    62  141
# Tính Risk Ratio
riskratio(tbl_sleep_coffee)
## $data
##              Coffee
## SleepImpacted False True Total
##         0       173  124   297
##         1        62  141   203
##         Total   235  265   500
## 
## $measure
##              risk ratio with 95% C.I.
## SleepImpacted estimate   lower    upper
##             0 1.000000      NA       NA
##             1 1.663634 1.41429 1.956939
## 
## $p.value
##              two-sided
## SleepImpacted   midp.exact fisher.exact   chi.square
##             0           NA           NA           NA
##             1 8.876673e-10 1.329803e-09 1.087229e-09
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét

Kết quả phân tích cho thấy tỷ số nguy cơ (risk ratio) giữa việc uống cà phê và khả năng bị ảnh hưởng giấc ngủ là 1.66, và p_value < 0,05 ta có thể kết luận rằng sự khác biệt là có ý nghĩa thống kê. Điều này đồng nghĩa với việc những người uống cà phê có nguy cơ bị ảnh hưởng giấc ngủ cao hơn 66% so với những người không uống.

3.5.2 Biến sleep_impacted và beverage_energy_drink

Trong phân tích này, chúng tôi muốn phân tích giữa chất lượng giấc ngủ (sleep_impacted) và Đồ uống tăng lực (beverage_energy_drink).

Biến phụ thuộc: sleep_impacted

Impacted (Bị ảnh hưởng): Giá trị 1 – caffeine có ảnh hưởng đến giấc ngủ.

Not impacted (Không bị ảnh hưởng): Giá trị 0 – caffeine không ảnh hưởng đến giấc ngủ.

Đây là biến đầu ra để phân tích xem các yếu tố khác (đặc biệt là loại đồ uống) có ảnh hưởng đến giấc ngủ không.

Biến độc lập

Biến độc lập: beverage_energy_drink Energy Drink Consumer (Có uống): Giá trị 1

Non-Consumer (Không uống): Giá trị 0

Đây là yếu tố đầu vào. Mục tiêu là kiểm tra xem nhóm uống nước tăng lực có tỉ lệ bị ảnh hưởng giấc ngủ khác biệt đáng kể so với nhóm không uống hay không.

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

H₀ (Null Hypothesis): Risk Ratio = 1 → Không có sự khác biệt về tỷ lệ bị ảnh hưởng giấc ngủ giữa người uống nước tăng lực và người không uống nước tăng lực.

H₁ (Alternative Hypothesis): Risk Ratio ≠ 1 → Có sự khác biệt về tỷ lệ bị ảnh hưởng giấc ngủ giữa người uống nước tăng lực và người không uống nước tăng lực.

# Cài đặt gói nếu chưa có
# install.packages("epitools")

library(epitools)

# Đọc dữ liệu từ file CSV
data <- read.csv("caffeine_intake_tracker.csv")

# Tạo bảng chéo giữa sleep_impacted và beverage_energy_drink
tbl_sleep_energy <- table(
  SleepImpacted = data$sleep_impacted,
  EnergyDrink = data$beverage_energy_drink
)

# In bảng chéo để kiểm tra
print(tbl_sleep_energy)
##              EnergyDrink
## SleepImpacted False True
##             0   280   17
##             1   173   30
# Tính Risk Ratio
riskratio(tbl_sleep_energy)
## $data
##              EnergyDrink
## SleepImpacted False True Total
##         0       280   17   297
##         1       173   30   203
##         Total   453   47   500
## 
## $measure
##              risk ratio with 95% C.I.
## SleepImpacted estimate   lower    upper
##             0  1.00000      NA       NA
##             1  2.58186 1.46363 4.554432
## 
## $p.value
##              two-sided
## SleepImpacted   midp.exact fisher.exact   chi.square
##             0           NA           NA           NA
##             1 0.0008450139  0.000916514 0.0006567794
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét

Kết quả phân tích cho thấy tỷ số nguy cơ (risk ratio) giữa việc uống nước tăng lực và khả năng bị ảnh hưởng giấc ngủ là 2,56 và p_value < 0,05 ta có thể kết luận rằng sự khác biệt là có ý nghĩa thống kê. Điều này đồng nghĩa với việc những người uống nước tăng lực có nguy cơ bị ảnh hưởng giấc ngủ cao hơn khoảng 2,6 lần so với những người không uống.

3.5.3 Biến sleep_impacted và beverage_tea

Trong phân tích này, chúng tôi muốn phân tích giữa chất lượng giấc ngủ (sleep_impacted) và Đồ uống trà (beverage_tea).

Biến phụ thuộc: sleep_impacted

Impacted (Bị ảnh hưởng): Giá trị 1 – caffeine có ảnh hưởng đến giấc ngủ.

Not impacted (Không bị ảnh hưởng): Giá trị 0 – caffeine không ảnh hưởng đến giấc ngủ.

Đây là biến đầu ra để phân tích xem các yếu tố khác (đặc biệt là loại đồ uống) có ảnh hưởng đến giấc ngủ không.

Biến độc lập

Tea Consumer (Có uống trà): Giá trị 1

Non-Consumer (Không uống trà): Giá trị 0

Đây là biến đầu vào. Mục tiêu là kiểm tra xem nhóm uống trà có tỷ lệ bị ảnh hưởng giấc ngủ cao hơn hoặc thấp hơn so với nhóm không uống trà hay không.

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

H₀ (Null Hypothesis): Risk Ratio = 1 → Không có sự khác biệt về tỷ lệ bị ảnh hưởng giấc ngủ giữa người uống trà và người không uống trà.

H₁ (Alternative Hypothesis): Risk Ratio ≠ 1 → Có sự khác biệt về tỷ lệ bị ảnh hưởng giấc ngủ giữa người uống trà và người không uống trà.

# install.packages("epitools") # Chạy nếu bạn chưa cài thư viện
library(epitools)

# Bảng chéo 2x2: sleep_impacted (Yes / No) vs beverage_tea (Yes / No)
tbl_sleep_tea <- matrix(c(
  32, 171,   # sleep_impacted = 1: Có ảnh hưởng
  156, 141   # sleep_impacted = 0: Không ảnh hưởng
),
nrow = 2,
byrow = TRUE,
dimnames = list(
  SleepImpacted = c("Yes", "No"),
  Tea = c("Yes", "No")
))

# Tính Risk Ratio
riskratio(tbl_sleep_tea)
## $data
##              Tea
## SleepImpacted Yes  No Total
##         Yes    32 171   203
##         No    156 141   297
##         Total 188 312   500
## 
## $measure
##              risk ratio with 95% C.I.
## SleepImpacted  estimate     lower     upper
##           Yes 1.0000000        NA        NA
##           No  0.5635891 0.4931021 0.6441519
## 
## $p.value
##              two-sided
## SleepImpacted midp.exact fisher.exact   chi.square
##           Yes         NA           NA           NA
##           No           0 1.654401e-17 7.819165e-17
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét

Kết quả phân tích cho thấy tỷ số nguy cơ (risk ratio) giữa việc uống trà và khả năng bị ảnh hưởng giấc ngủ là 0.56, với khoảng tin cậy 95% từ 0.49 đến 0.64. Khoảng này nằm hoàn toàn dưới 1 và các p-value đều gần bằng 0, cho thấy sự khác biệt là có ý nghĩa thống kê rất cao. Điều này đồng nghĩa với việc người uống trà có nguy cơ bị ảnh hưởng giấc ngủ thấp hơn khoảng 44% so với người không uống, cho thấy trà không những không gây hại mà còn có thể liên quan đến giấc ngủ tốt hơn

3.5.4 Biến sleep_impacted và time_of_day_evening

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

H₀ (Giả thuyết không – Null Hypothesis): Risk Ratio = 1 → Không có sự khác biệt về tỷ lệ giấc ngủ bị ảnh hưởng giữa những người sử dụng caffeine vào buổi tối và những người không sử dụng.

H₁ (Giả thuyết đối – Alternative Hypothesis): Risk Ratio ≠ 1 → Có sự khác biệt về tỷ lệ giấc ngủ bị ảnh hưởng giữa những người sử dụng caffeine vào buổi tối và những người không sử dụng.

# install.packages("epitools") # Chạy nếu bạn chưa cài thư viện
library(epitools)

# Bảng chéo 2x2: sleep_impacted (Yes / No) vs time_of_day_evening (Yes / No)
tbl_sleep_evening <- matrix(c(
  47, 156,   # sleep_impacted = 1: Có ảnh hưởng
  47, 250    # sleep_impacted = 0: Không ảnh hưởng
),
nrow = 2,
byrow = TRUE,
dimnames = list(
  SleepImpacted = c("Yes", "No"),
  Evening = c("Yes", "No")
))

# Tính Risk Ratio
riskratio(tbl_sleep_evening)
## $data
##              Evening
## SleepImpacted Yes  No Total
##         Yes    47 156   203
##         No     47 250   297
##         Total  94 406   500
## 
## $measure
##              risk ratio with 95% C.I.
## SleepImpacted estimate    lower    upper
##           Yes 1.000000       NA       NA
##           No  1.095355 1.000896 1.198729
## 
## $p.value
##              two-sided
## SleepImpacted midp.exact fisher.exact chi.square
##           Yes         NA           NA         NA
##           No   0.0418002   0.04734846  0.0394483
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"

Nhận xét

Phân tích Risk Ratio cho thấy người dùng caffeine vào buổi tối có nguy cơ bị ảnh hưởng giấc ngủ cao hơn 9.5% so với người không dùng (RR = 1.095; p = 0.0418). Sự khác biệt này có ý nghĩa thống kê, cho thấy thời điểm sử dụng caffeine (buổi tối) có liên quan đến tình trạng mất ngủ.

3.6 Odds ratio và khoảng ước lượng cho Odds ratio

3.6.1 Biến sleep_impacted và beverage_coffee

Giả thuyết kiểm định

H₀ (Null Hypothesis): OR = 1 → Không có sự khác biệt về khả năng bị ảnh hưởng giấc ngủ giữa người uống cà phê và người không uống cà phê.

H₁ (Alternative Hypothesis): OR ≠ 1 → Có sự khác biệt về khả năng bị ảnh hưởng giấc ngủ giữa người uống cà phê và người không uống cà phê.

# Cài gói nếu cần
# install.packages("epitools")

library(epitools)

# Bước 1: Đọc dữ liệu
data <- read.csv("caffeine_intake_tracker.csv")

# Bước 2: Tạo bảng chéo 2x2
tab <- table(data$sleep_impacted, data$beverage_coffee)

# Đặt nhãn cho bảng
colnames(tab) <- c("No_Coffee", "Coffee")
rownames(tab) <- c("Not_Impacted", "Impacted")

# Bước 3: Tính Odds Ratio với khoảng tin cậy 95%
odds_result <- oddsratio(tab, conf.level = 0.95)

# Hiển thị kết quả
print(odds_result)
## $data
##               
##                No_Coffee Coffee Total
##   Not_Impacted       173    124   297
##   Impacted            62    141   203
##   Total              235    265   500
## 
## $measure
##               odds ratio with 95% C.I.
##                estimate    lower   upper
##   Not_Impacted 1.000000       NA      NA
##   Impacted     3.161851 2.175002 4.63531
## 
## $p.value
##               two-sided
##                  midp.exact fisher.exact   chi.square
##   Not_Impacted           NA           NA           NA
##   Impacted     8.876673e-10 1.329803e-09 1.087229e-09
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

Kết quả phân tích cho thấy odds ratio (tỷ số odds) giữa việc uống cà phê và khả năng bị ảnh hưởng giấc ngủ là 3.16 và các p-value đều rất nhỏ (p < 0.000001), có thể kết luận rằng mối liên hệ này có ý nghĩa thống kê cao. Nói cách khác, người uống cà phê có nguy cơ bị ảnh hưởng giấc ngủ cao gấp hơn 3 lần so với người không uống cà phê. Đây là bằng chứng mạnh mẽ cho thấy cà phê là một yếu tố đáng kể trong việc làm suy giảm chất lượng giấc ngủ của người dùng trong bộ dữ liệu khảo sát.

3.6.2 Biến sleep_impacted và beverage_energy_drink

Giả thuyết kiểm định

H₀ (Giả thuyết không có sự khác biệt – Null Hypothesis): OR = 1 → Không có sự khác biệt về tỷ lệ bị ảnh hưởng giấc ngủ giữa người uống nước tăng lực và người không uống nước tăng lực.

H₁ (Giả thuyết có sự khác biệt – Alternative Hypothesis): OR ≠ 1 → Có sự khác biệt về tỷ lệ bị ảnh hưởng giấc ngủ giữa người uống nước tăng lực và người không uống nước tăng lực.

# Cài gói nếu chưa có
# install.packages("epitools")

library(epitools)

# Bước 1: Đọc dữ liệu
data <- read.csv("caffeine_intake_tracker.csv")

# Bước 2: Tạo bảng chéo 2x2
tab <- table(data$sleep_impacted, data$beverage_energy_drink)

# Đặt tên rõ ràng cho bảng
colnames(tab) <- c("No_EnergyDrink", "EnergyDrink")
rownames(tab) <- c("Not_Impacted", "Impacted")

# Bước 3: Tính Odds Ratio với khoảng tin cậy 95%
odds_result <- oddsratio(tab, conf.level = 0.95)

# Hiển thị kết quả
print(odds_result)
## $data
##               
##                No_EnergyDrink EnergyDrink Total
##   Not_Impacted            280          17   297
##   Impacted                173          30   203
##   Total                   453          47   500
## 
## $measure
##               odds ratio with 95% C.I.
##                estimate    lower    upper
##   Not_Impacted 1.000000       NA       NA
##   Impacted     2.839138 1.532705 5.424677
## 
## $p.value
##               two-sided
##                  midp.exact fisher.exact   chi.square
##   Not_Impacted           NA           NA           NA
##   Impacted     0.0008450139  0.000916514 0.0006567794
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

Kết quả phân tích cho thấy odds ratio giữa việc uống nước tăng lực và khả năng bị ảnh hưởng giấc ngủ là 2.84 và các giá trị p đều nhỏ hơn 0.001, cho thấy mối liên hệ có ý nghĩa thống kê rõ rệt. Điều này đồng nghĩa với việc người uống nước tăng lực có nguy cơ bị ảnh hưởng giấc ngủ cao gấp gần 3 lần so với người không uống. Đây là bằng chứng đáng tin cậy cho thấy nước tăng lực là một yếu tố liên quan đáng kể đến tình trạng rối loạn giấc ngủ trong nhóm khảo sát.

3.6.3 Biến sleep_impacted và beverage_tea

Giả thuyết kiểm định

H₀ (Giả thuyết không có sự khác biệt – Null Hypothesis): OR = 1 → Không có sự khác biệt về tỷ lệ bị ảnh hưởng giấc ngủ giữa người uống trà và người không uống trà.

H₁ (Giả thuyết có sự khác biệt – Alternative Hypothesis): OR ≠ 1 → Có sự khác biệt về tỷ lệ bị ảnh hưởng giấc ngủ giữa người uống trà và người không uống trà.

# Cài gói nếu chưa có
# install.packages("epitools")

library(epitools)

# Bước 1: Đọc dữ liệu
data <- read.csv("caffeine_intake_tracker.csv")

# Bước 2: Tạo bảng chéo 2x2 giữa sleep_impacted và beverage_tea
tab <- table(data$sleep_impacted, data$beverage_tea)

# Bước 3: Gắn tên dễ đọc cho bảng
colnames(tab) <- c("No_Tea", "Tea")
rownames(tab) <- c("Not_Impacted", "Impacted")

# Bước 4: Tính Odds Ratio với khoảng tin cậy 95%
odds_result <- oddsratio(tab, conf.level = 0.95)

# Bước 5: In kết quả
print(odds_result)
## $data
##               
##                No_Tea Tea Total
##   Not_Impacted    141 156   297
##   Impacted        171  32   203
##   Total           312 188   500
## 
## $measure
##               odds ratio with 95% C.I.
##                 estimate    lower     upper
##   Not_Impacted 1.0000000       NA        NA
##   Impacted     0.1702697 0.108017 0.2619499
## 
## $p.value
##               two-sided
##                midp.exact fisher.exact   chi.square
##   Not_Impacted         NA           NA           NA
##   Impacted              0 1.654401e-17 7.819165e-17
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

Kết quả phân tích cho thấy odds ratio giữa việc uống trà và khả năng bị ảnh hưởng giấc ngủ là 0.17 và các p-value gần bằng 0, ta có thể kết luận rằng mối liên hệ có ý nghĩa thống kê rất cao. Điều này cho thấy người uống trà có nguy cơ bị ảnh hưởng giấc ngủ thấp hơn đáng kể so với người không uống, cụ thể là thấp hơn khoảng 83%. Kết quả này phản ánh rằng trà có thể ít gây ảnh hưởng tiêu cực đến giấc ngủ, thậm chí có thể liên quan đến giấc ngủ tốt hơn trong nhóm khảo sát.

3.6.4 Biến sleep_impacted và time_of_day_evening

Giả thuyết kiểm định

H₀ (Giả thuyết không): Odds Ratio (OR) = 1 → Không có sự khác biệt về khả năng bị ảnh hưởng giấc ngủ giữa người uống cà phê và người không uống cà phê.

H₁ (Giả thuyết đối): Odds Ratio (OR) ≠ 1 → Có sự khác biệt về khả năng bị ảnh hưởng giấc ngủ giữa người uống cà phê và người không uống cà phê.

# Cài gói nếu cần
# install.packages("epitools")

library(epitools)

# Bước 1: Đọc dữ liệu
data <- read.csv("caffeine_intake_tracker.csv")

# Bước 2: Tạo bảng chéo 2x2 cho sleep_impacted và time_of_day_evening
tab <- table(data$sleep_impacted, data$time_of_day_evening)

# Đặt nhãn cho bảng
colnames(tab) <- c("Not_Evening", "Evening")
rownames(tab) <- c("Not_Impacted", "Impacted")

# Bước 3: Tính Odds Ratio với khoảng tin cậy 95%
odds_result <- oddsratio(tab, conf.level = 0.95)

# Hiển thị kết quả
print(odds_result)
## $data
##               
##                Not_Evening Evening Total
##   Not_Impacted         250      47   297
##   Impacted             156      47   203
##   Total                406      94   500
## 
## $measure
##               odds ratio with 95% C.I.
##                estimate    lower    upper
##   Not_Impacted 1.000000       NA       NA
##   Impacted     1.600873 1.017705 2.519623
## 
## $p.value
##               two-sided
##                midp.exact fisher.exact chi.square
##   Not_Impacted         NA           NA         NA
##   Impacted      0.0418002   0.04734846  0.0394483
## 
## $correction
## [1] FALSE
## 
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"

Nhận xét

Kết quả cho thấy những người sử dụng caffeine vào buổi tối có khả năng bị ảnh hưởng đến giấc ngủ cao hơn so với người không sử dụng vào buổi tối, với odds ratio là 1.60 (CI 95%: 1.02–2.52). Mối liên hệ này có ý nghĩa thống kê với giá trị p là 0.0418.

3.7 Mô hình hồi quy bội

Mô hình Logit

# Bước 3: Mô hình hồi quy logit bội
model_logit_multi <- glm(
  sleep_impacted ~ beverage_coffee + beverage_energy_drink + time_of_day_evening,
  data = d,
  family = binomial(link = "logit")
)

# Bước 4: Xem kết quả
summary(model_logit_multi)
## 
## Call:
## glm(formula = sleep_impacted ~ beverage_coffee + beverage_energy_drink + 
##     time_of_day_evening, family = binomial(link = "logit"), data = d)
## 
## Coefficients:
##                           Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                -1.6703     0.2013  -8.296  < 2e-16 ***
## beverage_coffeeTrue         1.7029     0.2305   7.387 1.50e-13 ***
## beverage_energy_drinkTrue   2.1736     0.3618   6.008 1.88e-09 ***
## time_of_day_eveningTrue     0.4627     0.2493   1.856   0.0635 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 675.37  on 499  degrees of freedom
## Residual deviance: 595.88  on 496  degrees of freedom
## AIC: 603.88
## 
## Number of Fisher Scoring iterations: 4
# Bước 5: Chuyển hệ số sang Odds Ratio để dễ diễn giải
exp(coef(model_logit_multi))
##               (Intercept)       beverage_coffeeTrue beverage_energy_drinkTrue 
##                 0.1881895                 5.4899718                 8.7902368 
##   time_of_day_eveningTrue 
##                 1.5883384

Nhận xét

Kết quả mô hình hồi quy logistic cho thấy việc tiêu thụ cà phê, nước tăng lực và thời điểm uống đều có ảnh hưởng đến khả năng bị tác động tới giấc ngủ. Cụ thể, những người uống cà phê có khả năng bị ảnh hưởng giấc ngủ cao hơn khoảng 5,5 lần so với người không uống (β = 1,7029, p < 0,001), trong khi việc uống nước tăng lực làm tăng khả năng này gần 8,8 lần (β = 2,1736, p < 0,001). Đây là mức tác động mạnh hơn cà phê, phản ánh hàm lượng caffeine và đường cao trong nước tăng lực có thể gây kích thích thần kinh mạnh hơn và kéo dài thời gian khó ngủ. Uống đồ uống vào buổi tối cũng làm tăng khả năng bị ảnh hưởng giấc ngủ khoảng 59% (β = 0,4627, p ≈ 0,064)

Kết luận

Kết quả hồi quy logistic bội cho thấy việc sử dụng cà phê và nước tăng lực có ảnh hưởng rõ rệt đến khả năng bị ảnh hưởng giấc ngủ. Cụ thể, người uống cà phê có nguy cơ bị ảnh hưởng giấc ngủ cao gấp khoảng 5,5 lần so với người không uống, trong khi người uống nước tăng lực có nguy cơ cao gần gấp 9 lần. Ngoài ra, việc sử dụng caffeine vào buổi tối cũng có xu hướng làm tăng nguy cơ mất ngủ, tuy nhiên mối liên hệ này chưa đạt mức ý nghĩa thống kê (p = 0.0635). Nhìn chung, mô hình cho thấy các yếu tố tiêu thụ caffeine, đặc biệt là cà phê và nước tăng lực, là những yếu tố quan trọng liên quan đến chất lượng giấc ngủ.

Mô hình Probit

# Bước 3: Mô hình hồi quy probit bội
model_probit_multi <- glm(
  sleep_impacted ~ beverage_coffee + beverage_energy_drink + time_of_day_evening,
  data = d,
  family = binomial(link = "probit")
)

# Bước 4: Xem kết quả
summary(model_probit_multi)
## 
## Call:
## glm(formula = sleep_impacted ~ beverage_coffee + beverage_energy_drink + 
##     time_of_day_evening, family = binomial(link = "probit"), 
##     data = d)
## 
## Coefficients:
##                           Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                -0.9960     0.1120  -8.892  < 2e-16 ***
## beverage_coffeeTrue         1.0213     0.1330   7.677 1.63e-14 ***
## beverage_energy_drinkTrue   1.3137     0.2166   6.066 1.31e-09 ***
## time_of_day_eveningTrue     0.2674     0.1508   1.773   0.0762 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 675.37  on 499  degrees of freedom
## Residual deviance: 596.30  on 496  degrees of freedom
## AIC: 604.3
## 
## Number of Fisher Scoring iterations: 4
# Bước 5 (probit): Ước lượng tương đối (OR từ hệ số probit)
exp(coef(model_probit_multi))
##               (Intercept)       beverage_coffeeTrue beverage_energy_drinkTrue 
##                 0.3693503                 2.7767164                 3.7199178 
##   time_of_day_eveningTrue 
##                 1.3066200

Nhận xét

Kết quả mô hình hồi quy với hàm liên kết probit tiếp tục khẳng định tác động rõ rệt của loại đồ uống đến khả năng bị ảnh hưởng giấc ngủ. Cụ thể, uống cà phê làm tăng giá trị biến tiềm ẩn (latent variable) thêm 1,0213 đơn vị (p < 0,001) so với không uống, phản ánh xác suất bị ảnh hưởng giấc ngủ cao hơn đáng kể. Việc uống nước tăng lực có tác động mạnh hơn, với hệ số 1,3137 (p < 0,001), cho thấy nhóm này có xác suất bị ảnh hưởng giấc ngủ lớn hơn rõ rệt so với nhóm không uống. Tiêu thụ vào buổi tối có hệ số 0,2674 (p ≈ 0,076), gợi ý khả năng bị ảnh hưởng cao hơn khoảng 1,31 lần so với ban ngày, tuy nhiên kết quả chưa đạt ý nghĩa thống kê ở mức 5% (chỉ có ý nghĩa ở mức 10%). Hệ số chặn âm (-0,9960) tiếp tục phản ánh rằng ở nhóm tham chiếu — không uống cà phê, không uống nước tăng lực và tiêu thụ vào ban ngày — xác suất bị ảnh hưởng giấc ngủ ở mức thấp.

Kết luận

Mô hình hồi quy Probit bội cho thấy rằng việc uống cà phê và nước tăng lực đều làm tăng đáng kể khả năng bị ảnh hưởng giấc ngủ, với mức độ ảnh hưởng rõ ràng và có ý nghĩa thống kê cao. Việc sử dụng vào buổi tối có xu hướng làm tăng nguy cơ mất ngủ, tuy nhiên chưa đủ mạnh để kết luận chắc chắn về mặt thống kê.

Mô hình Cloglog

# Bước 3: Mô hình cloglog bội
reg_cloglog_multi <- glm(
  sleep_impacted ~ beverage_coffee + beverage_energy_drink + time_of_day_evening,
  data = d,
  family = binomial(link = "cloglog")
)

# Bước 4: Hiển thị kết quả
summary(reg_cloglog_multi)
## 
## Call:
## glm(formula = sleep_impacted ~ beverage_coffee + beverage_energy_drink + 
##     time_of_day_evening, family = binomial(link = "cloglog"), 
##     data = d)
## 
## Coefficients:
##                           Estimate Std. Error z value Pr(>|z|)    
## (Intercept)                -1.7610     0.1816  -9.699  < 2e-16 ***
## beverage_coffeeTrue         1.4040     0.1976   7.107 1.19e-12 ***
## beverage_energy_drinkTrue   1.7277     0.2609   6.623 3.53e-11 ***
## time_of_day_eveningTrue     0.3984     0.1711   2.328   0.0199 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 675.37  on 499  degrees of freedom
## Residual deviance: 594.40  on 496  degrees of freedom
## AIC: 602.4
## 
## Number of Fisher Scoring iterations: 5

Nhận xét

Những người uống cà phê có log-hazard tăng thêm 1,4040 (p < 0,001) so với nhóm không uống, tương đương mức tăng odds ước tính khoảng 4,07 lần. Việc uống nước tăng lực còn có tác động mạnh hơn, với hệ số 1,7277 (p < 0,001), tương đương odds cao hơn khoảng 5,63 lần so với nhóm không uống. Tiêu thụ đồ uống vào buổi tối cũng làm tăng khả năng bị ảnh hưởng giấc ngủ (β = 0,3984, p ≈ 0,020), với odds cao hơn khoảng 1,49 lần so với ban ngày. Hệ số chặn âm (-1,7610) phản ánh rằng ở nhóm tham chiếu — không uống cà phê, không uống nước tăng lực và tiêu thụ vào ban ngày — xác suất bị ảnh hưởng giấc ngủ là thấp.

Kết luận

Mô hình cloglog bội cho thấy cả cà phê, nước tăng lực và thời gian sử dụng vào buổi tối đều làm tăng đáng kể khả năng bị ảnh hưởng giấc ngủ do caffeine. Trong đó, nước tăng lực có tác động mạnh nhất, tiếp theo là cà phê, và uống vào buổi tối cũng là một yếu tố quan trọng. Mô hình phù hợp tốt với dữ liệu và cho thấy sự khác biệt thống kê có ý nghĩa ở cả ba yếu tố.

Đánh giá mô hình hồi quy

# Tạo các mô hình hồi quy nhị phân với 3 biến độc lập
model_logit_multi <- glm(
  sleep_impacted ~ beverage_coffee + beverage_energy_drink + time_of_day_evening,
  data = df,
  family = binomial(link = "logit")
)

model_probit_multi <- glm(
  sleep_impacted ~ beverage_coffee + beverage_energy_drink + time_of_day_evening,
  data = df,
  family = binomial(link = "probit")
)

model_cloglog_multi <- glm(
  sleep_impacted ~ beverage_coffee + beverage_energy_drink + time_of_day_evening,
  data = df,
  family = binomial(link = "cloglog")
)

# Tính AIC và BIC cho từng mô hình
results <- data.frame(
  Mô_hình = c("Logit", "Probit", "Cloglog"),
  AIC = c(
    AIC(model_logit_multi),
    AIC(model_probit_multi),
    AIC(model_cloglog_multi)
  ),
  BIC = c(
    BIC(model_logit_multi),
    BIC(model_probit_multi),
    BIC(model_cloglog_multi)
  )
)

# Làm tròn
results$AIC <- round(results$AIC, 3)
results$BIC <- round(results$BIC, 3)

# Hiển thị bảng
library(knitr)
kable(results, caption = "So sánh AIC, BIC giữa 3 mô hình hồi quy nhị phân với 3 biến độc lập")
So sánh AIC, BIC giữa 3 mô hình hồi quy nhị phân với 3 biến độc lập
Mô_hình AIC BIC
Logit 603.876 620.734
Probit 604.302 621.160
Cloglog 602.396 619.255

Nhận xét

AIC (Akaike Information Criterion):

Mô hình cloglog có AIC thấp nhất (602.396), cho thấy đây là mô hình phù hợp tốt nhất với dữ liệu trong 3 mô hình được so sánh.

Mô hình logit và probit có AIC cao hơn, nên kém phù hợp hơn một chút.

BIC (Bayesian Information Criterion):

Tương tự như AIC, cloglog có BIC thấp nhất (619.255), tiếp theo là logit (620.734) và cuối cùng là probit (621.160).

Vì BIC phạt nặng hơn khi số lượng biến tăng, nên kết luận từ BIC cũng củng cố rằng cloglog là mô hình tốt nhất trong số ba mô hình, tính theo độ phù hợp và độ phức tạp.

Kết luận

Cả hai tiêu chí AIC và BIC đều cho thấy mô hình cloglog là tối ưu nhất trong 3 mô hình hồi quy nhị phân với cùng tập biến độc lập. Do đó, nếu mục tiêu là chọn mô hình phù hợp tốt nhất với dữ liệu, cloglog nên được ưu tiên.

4 CHƯƠNG 4: Kết luận

4.1 Kết luận

Trong tiểu luận này, tác giả đã thực hiện một phân tích định lượng toàn diện dựa trên bộ dữ liệu gồm 500 quan sát và 9 biến số, nhằm làm rõ mối quan hệ giữa hành vi tiêu thụ đồ uống chứa caffeine và khả năng bị ảnh hưởng của giấc ngủ. Biến phụ thuộc là một biến nhị phân, biểu thị việc giấc ngủ có bị tác động tiêu cực bởi các yếu tố liên quan đến caffeine hay không. Các biến độc lập bao gồm loại đồ uống (cà phê, nước tăng lực, trà) và thời điểm sử dụng (vào ban đêm hoặc không).

Mở đầu bằng phân tích thống kê mô tả, tác giả đã phác họa đặc điểm phân bố của từng biến, qua đó xác định các yếu tố có khả năng ảnh hưởng đến giấc ngủ. Tiếp đến, ba mô hình hồi quy nhị phân—Logit, Probit và Cloglog—được triển khai nhằm kiểm định mức độ tác động của các biến độc lập đến biến phụ thuộc. Cách tiếp cận đa mô hình giúp tăng cường độ tin cậy của kết quả và cung cấp cái nhìn sâu sắc hơn về cơ chế tác động của caffeine lên chất lượng giấc ngủ.

Kết quả hồi quy cho thấy ba yếu tố có ảnh hưởng đáng kể đến khả năng giấc ngủ bị ảnh hưởng gồm: uống cà phê, uống nước tăng lực và tiêu thụ vào buổi tối. Trong đó, yếu tố sử dụng nước tăng lực có tác động mạnh nhất.

4.2 Hạn chế của đề bài

Mặc dù nghiên cứu đã cung cấp những góc nhìn có giá trị về mối liên hệ giữa hành vi tiêu thụ đồ uống chứa caffeine và chất lượng giấc ngủ, vẫn còn tồn tại một số hạn chế cần được thừa nhận nhằm định hướng cho các nghiên cứu tiếp theo.

Thứ nhất, bộ dữ liệu được sử dụng có quy mô tương đối nhỏ với 500 quan sát và chưa phản ánh đầy đủ các đặc điểm nhân khẩu học cũng như yếu tố sinh lý của người tham gia. Điều này làm hạn chế khả năng khái quát hóa các kết luận từ mô hình phân tích.

Thứ hai, phần lớn các biến độc lập là biến định tính và được mã hóa dưới dạng nhị phân, dẫn đến việc mất mát một phần thông tin chi tiết và sự đa dạng trong hành vi thực tế.

Thứ ba, nghiên cứu chủ yếu áp dụng các mô hình hồi quy nhị phân cổ điển như Logit, Probit và Cloglog, mà chưa khai thác các phương pháp hiện đại như hồi quy phi tuyến, kỹ thuật học máy hoặc các kỹ thuật xử lý mất cân bằng dữ liệu, vốn có thể giúp cải thiện độ chính xác và tính ứng dụng của mô hình.

Cuối cùng, do sử dụng dữ liệu quan sát thay vì dữ liệu thực nghiệm, nghiên cứu chỉ có thể xác định mối tương quan chứ chưa thể khẳng định quan hệ nhân quả giữa các biến, từ đó cần thận trọng trong việc diễn giải và vận dụng kết quả phân tích vào thực tiễn.

4.3 Hướng phát triển đề tài

Đối với cá nhân người tiêu dùng, việc điều chỉnh thói quen sử dụng đồ uống chứa caffeine là cần thiết—đặc biệt nên hạn chế tiêu thụ vào buổi tối nhằm giảm thiểu nguy cơ ảnh hưởng tiêu cực đến chất lượng giấc ngủ.

Về phía truyền thông và ngành y tế cộng đồng, cần triển khai các chương trình tuyên truyền nhằm nâng cao nhận thức cộng đồng về tác động của caffeine đối với giấc ngủ. Nội dung truyền thông nên nhấn mạnh vào tầm quan trọng của thời điểm và liều lượng tiêu thụ, từ đó giúp người dân chủ động điều chỉnh hành vi sử dụng.

Đối với các nghiên cứu trong tương lai, việc mở rộng bộ dữ liệu với các biến định lượng chi tiết hơn—chẳng hạn như thời lượng ngủ thực tế, chỉ số căng thẳng (stress level), hoặc tình trạng sức khỏe tổng quát—sẽ góp phần cải thiện độ chính xác của mô hình và mang lại cái nhìn toàn diện hơn về tác động của caffeine đến giấc ngủ con người.

LS0tDQp0aXRsZTogIlBIw4JOIFTDjUNIIEPDgUMgWeG6vlUgVOG7kCDhuqJOSCBIxq/hu55ORyDEkOG6vk4gR2nhuqRDIE5H4bumIEtISSBUScOKVSBUSOG7pCBDw4FDIENI4bqkVCBDw5MgQ0jhu6hBIENBRkZFSU5FICAiDQphdXRob3I6ICJOZ3V54buFbiBI4buvdSBC4bqjbyBMw6JtICINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHRoZW1lOiAiZGVmYXVsdCINCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZGVwdGg6IDINCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgd29yZF9kb2N1bWVudDogDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiAyDQogIHBkZl9kb2N1bWVudDogDQogICAgbGF0ZXhfZW5naW5lOiB4ZWxhdGV4DQotLS0NCg0KYGBge3J9DQpkZiA8LSByZWFkLmNzdigiY2FmZmVpbmVfaW50YWtlX3RyYWNrZXIuY3N2IikNCg0KYGBgDQoNCioqTOG7nEkgQ+G6ok0gxqBOKioNCg0KTOG7nWkgxJHhuqd1IHRpw6puLCBlbSB4aW4gZ+G7rWkgbOG7nWkgY+G6o20gxqFuIGNow6JuIHRow6BuaCDEkeG6v24gR2nhuqNuZyB2acOqbiAtIFRoUy4gVHLhuqduIE3huqFuaCBUxrDhu51uZy4gVHJvbmcgcXXDoSB0csOsbmggaOG7jWMgdOG6rXAgdsOgIHTDrG0gaGnhu4N1IG3DtG4g4oCcUGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgxJHhu4tuaCB0w61uaOKAnSwgZW0gxJHDoyBuaOG6rW4gxJHGsOG7o2Mgc+G7sSBxdWFuIHTDom0gZ2nDunAgxJHhu6EsIGjGsOG7m25nIGThuqtuIHbDoCBjaOG7iSBi4bqjbyB04bqtbiB0w6xuaCBj4bunYSB0aOG6p3kuIFRo4bqneSDEkcOjIGdpw7pwIGVtIHTDrWNoIGzFqXkgdGjDqm0gbmhp4buBdSBraeG6v24gdGjhu6ljIMSR4buDIGPDsyBjw6FpIG5ow6xuIGtow6FpIHF1w6F0IHbDoCBoaeG7g3UgaMahbiB24buBIG3DtG4gaOG7jWMgbsOgeS4gVOG7qyBuaOG7r25nIGtp4bq/biB0aOG7qWMgxJHGsOG7o2MgdGjhuqd5IHRydXnhu4FuIHThuqNpLCBlbSBk4bqnbiBoaeG7g3UgxJHGsOG7o2MgdOG6p20gcXVhbiB0cuG7jW5nIGPhu6dhIG3DtG4gaOG7jWMgbcOgIGLhuqV5IGzDonUgbmF5IGPDsm4gbmhp4buBdSB0aOG6r2MgbeG6r2MuIFRow7RuZyBxdWEgYsOgaSB0aeG7g3UgbHXhuq1uIG7DoHksIGVtIHhpbiB0csOsbmggYsOgeSBuaOG7r25nIGfDrCBlbSDEkcOjIHTDrG0gaGnhu4N1IHbhu4EgbcO0biBo4buNYywgdsOgIGPhu6UgdGjhu4MgbMOgIGVtIGzhu7FhIGNo4buNbiDEkeG7gSB0w6BpIOKAnFBow6JuIHTDrWNoIG5o4buvbmcgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gbeG7qWMgxJHhu5kgdGnDqnUgdGjhu6Ugcsaw4bujdSBj4bunYSBzaW5oIHZpw6pu4oCdLg0KDQpLaeG6v24gdGjhu6ljIGzDoCB2w7QgaOG6oW4gbmjGsG5nIHPhu7EgdGnhur9wIG5o4bqtbiBraeG6v24gdGjhu6ljIGPhu6dhIGLhuqNuIHRow6JuIGVtIGx1w7RuIGPDsyBuaOG7r25nIGjhuqFuIGNo4bq/IG5o4bqldCDEkeG7i25oLiBEbyDEkcOzLCB0cm9uZyBxdcOhIHRyw6xuaCBob8OgbiB0aMOgbmggYsOgaSB0aeG7g3UgbHXhuq1uLCBjaOG6r2MgY2jhuq9uIGVtIGtow7RuZyB0csOhbmgga2jhu49pIG5o4buvbmcgdGhp4bq/dSBzw7N0LCB24bqteSBuw6puIGVtIHLhuqV0IG1vbmcgbmjhuq1uIMSRxrDhu6NjIG5o4buvbmcgZ8OzcCDDvSB04burIHRo4bqneSDEkeG7gyBiw6BpIHRp4buDdSBsdeG6rW4gxJHGsOG7o2MgaG/DoG4gdGhp4buHbiBoxqFuLg0KDQpFbSBrw61uaCBjaMO6YyB0aOG6p3kgc+G7qWMga2jhu49lLCBo4bqhbmggcGjDumMgdsOgIHRow6BuaCBjw7RuZyB0csOqbiBjb24gxJHGsOG7nW5nIHPhu7EgbmdoaeG7h3AgY+G7p2EgbcOsbmguDQoNCg0KIyBDSMavxqBORyAxIDogVOG7lE5HIFFVQU4gTkdIScOKTiBD4buoVSANCg0KIyMgTMO9IGRvIGNo4buNbiDEkeG7gSB0w6BpIA0KDQpUcm9uZyBuaOG7i3Agc+G7kW5nIGhp4buHbiDEkeG6oWksIGPDoWMgc+G6o24gcGjhuqltIGNo4bupYSBjYWZmZWluZSBuaMawIGPDoCBwaMOqLCB0csOgLCBuxrDhu5tjIHTEg25nIGzhu7FjIGhheSBzb2NvbGEgxJFhbmcgdHLhu58gbsOqbiBwaOG7lSBiaeG6v24gdsOgIGfhuqduIG5oxrAga2jDtG5nIHRo4buDIHRoaeG6v3UgduG7m2kgbmhp4buBdSBuZ8aw4budaSwgxJHhurdjIGJp4buHdCBsw6Agc2luaCB2acOqbiB2w6AgbmfGsOG7nWkgbGFvIMSR4buZbmcgdHLDrSDDs2MuIFR1eSBuaGnDqm4sIGLDqm4gY+G6oW5oIG5o4buvbmcgbOG7o2kgw61jaCBuaMawIGdpw7pwIHThu4luaCB0w6FvIHbDoCBj4bqjaSB0aGnhu4duIGhp4buHdSBzdeG6pXQgbMOgbSB2aeG7h2MgdOG6oW0gdGjhu51pLCBjYWZmZWluZSBjxaluZyB0aeG7gW0g4bqpbiBuaGnhu4F1IOG6o25oIGjGsOG7n25nIHRpw6p1IGPhu7FjIMSR4bq/biBz4bupYyBraOG7j2UsIMSR4bq3YyBiaeG7h3QgbMOgIGNo4bqldCBsxrDhu6NuZyBnaeG6pWMgbmfhu6cuIE3huqV0IG5n4bunLCBuZ+G7pyBjaOG6rXAgY2jhu51uIGhheSBraMOzIMSRaSB2w6BvIGdp4bqlYyBuZ+G7pyBsw6Agbmjhu69uZyBo4buHIHF14bqjIGThu4UgZ+G6t3AgbmjGsG5nIHRoxrDhu51uZyBi4buLIHhlbSBuaOG6uS4gVuG7m2kgbW9uZyBtdeG7kW4gdMOsbSBoaeG7g3UgcsO1IGjGoW4gbeG7kWkgcXVhbiBo4buHIGdp4buvYSB2aeG7h2MgdGnDqnUgdGjhu6UgY2FmZmVpbmUgdsOgIGPDoWMgcuG7kWkgbG/huqFuIGdp4bqlYyBuZ+G7pywgdOG7qyDEkcOzIMSRxrBhIHJhIG5o4buvbmcga2h1eeG6v24gbmdo4buLIGtob2EgaOG7jWMgdsOgIHRoaeG6v3QgdGjhu7FjLCBlbSBxdXnhur90IMSR4buLbmggY2jhu41uIMSR4buBIHTDoGkg4oCcUGjDom4gdMOtY2ggY8OhYyB54bq/dSB04buRIOG6o25oIGjGsOG7n25nIMSR4bq/biBnaeG6pWMgbmfhu6cga2hpIHRpw6p1IHRo4bulIGPDoWMgY2jhuqV0IGPDsyBjaOG7qWEgY2FmZmVpbmXigJ0gbMOgbSBu4buZaSBkdW5nIG5naGnDqm4gY+G7qXUgdGnhu4N1IGx14bqtbiBj4bunYSBtw6xuaC4NCg0KIyMgTeG7pWMgdGnDqnUgbmdoacOqbiBj4bupdSANCg0KxJDhu4EgdMOgaSBuaOG6sW0gcGjDom4gdMOtY2ggdsOgIMSRw6FuaCBnacOhIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHZp4buHYyB0acOqdSB0aOG7pSBjw6FjIGNo4bqldCBjaOG7qWEgY2FmZmVpbmUgdsOgIGNo4bqldCBsxrDhu6NuZyBnaeG6pWMgbmfhu6cgY+G7p2EgbmfGsOG7nWkgc+G7rSBk4bulbmcuIEPhu6UgdGjhu4MsIG5naGnDqm4gY+G7qXUgdOG6rXAgdHJ1bmcgeMOhYyDEkeG7i25oIG3hu6ljIMSR4buZIOG6o25oIGjGsOG7n25nIGPhu6dhIGzGsOG7o25nIGNhZmZlaW5lIHRpw6p1IHRo4bulIMSR4bq/biBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunIHbDoCBraOG6oyBuxINuZyBi4buLIHLhu5FpIGxv4bqhbiBnaeG6pWMgbmfhu6cuIMSQ4buTbmcgdGjhu51pLCDEkeG7gSB0w6BpIGPFqW5nIHhlbSB4w6l0IHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdMOhYyDEkeG7mW5nIGPhu6dhIGNhZmZlaW5lIHTDuXkgdGhlbyBsb+G6oWkgxJHhu5MgdeG7kW5nIG5oxrAgY8OgIHBow6osIHRyw6AgaG/hurdjIG7GsOG7m2MgdMSDbmcgbOG7sWMsIGPFqW5nIG5oxrAgdGjhu51pIMSRaeG7g20gdGnDqnUgdGjhu6UgdHJvbmcgbmfDoHkgKHPDoW5nLCBjaGnhu4F1IGhv4bq3YyB04buRaSkuIE5nb8OgaSByYSwgbmdoacOqbiBj4bupdSBjw7JuIGzDoG0gcsO1IHZhaSB0csOyIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSBuaMOibiBraOG6qXUgaOG7jWMgbmjGsCDEkeG7mSB0deG7lWkgdsOgIGdp4bubaSB0w61uaCB0cm9uZyB2aeG7h2MgxJFp4buBdSBjaOG7iW5oIGto4bqjIG7Eg25nIGR1bmcgbuG6oXAgY2FmZmVpbmUgdsOgIHBo4bqjbiDhu6luZyBnaeG6pWMgbmfhu6cuIFRyw6puIGPGoSBz4bufIGvhur90IHF14bqjIHBow6JuIHTDrWNoLCDEkeG7gSB0w6BpIGvhu7MgduG7jW5nIHPhur0gxJHGsGEgcmEgY8OhYyBraHV54bq/biBuZ2jhu4sga2hvYSBo4buNYyB2w6AgdGjhu7FjIHRp4buFbiB24buBIGxp4buBdSBsxrDhu6NuZywgbG/huqFpIHRo4bupYyB14buRbmcgdsOgIHRo4budaSDEkWnhu4NtIHPhu60gZOG7pW5nIGNhZmZlaW5lIHBow7kgaOG7o3AgbmjhurFtIG7Dom5nIGNhbyBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunIHbDoCBz4bupYyBraOG7j2UgdOG7lW5nIHRo4buDLg0KDQojIyDEkOG7kWkgdMaw4bujbmcgdsOgIHBo4bqhbSB2aSBuZ2hpw6puIGPhu6l1IA0KDQotICoqxJDhu5FpIHTGsOG7o25nIG5naGnDqm4gY+G7qXU6KioNCg0KQuG7mSBk4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1IGfhu5NtIDUwMCBxdWFuIHPDoXQgdHJvbmcgbMSpbmggduG7sWMgS2hvYSBo4buNYyBE4buvIGxp4buHdS4NCg0KLSAqKlBo4bqhbSB2aSBuZ2hpw6puIGPhu6l1KioNCg0KTmdoacOqbiBj4bupdSBuw6B5IHThuq1wIHRydW5nIHBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2Egdmnhu4djIHRpw6p1IHRo4bulIGNhZmZlaW5lIHbDoCBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunIHRyw6puIG3huqt1IGThu68gbGnhu4d1IGfhu5NtIDUwMCBjw6EgbmjDom4gxJFhbmcgaG/huqF0IMSR4buZbmcgdHJvbmcgbMSpbmggduG7sWMgS2hvYSBo4buNYyBE4buvIGxp4buHdS5UaMO0bmcgdGluIMSRxrDhu6NjIHRodSB0aOG6rXAgdGjDtG5nIHF1YSBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIHbDoCDEkeG7i25oIHTDrW5oIG5oxrA6IGzGsOG7o25nIGNhZmZlaW5lIHRpw6p1IHRo4bulIChtZyksIGxv4bqhaSDEkeG7kyB14buRbmcgc+G7rSBk4bulbmcgKGPDoCBwaMOqLCB0csOgLCBuxrDhu5tjIHTEg25nIGzhu7FjKSwgdGjhu51pIMSRaeG7g20gdGnDqnUgdGjhu6UgdHJvbmcgbmfDoHkgKHPDoW5nLCBjaGnhu4F1LCB04buRaSksIG3hu6ljIMSR4buZIHThuq1wIHRydW5nLCBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunLg0KDQojIyBQaMawxqFuZyBwaMOhcCBuZ2hpw6puIGPhu6l1DQoNCkLDoGkgbmdoacOqbiBj4bupdSBz4butIGThu6VuZyBwaMawxqFuZyBwaMOhcCB0aOG7kW5nIGvDqiB2w6AgY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IMSR4buDIHBow6JuIHTDrWNoIGThu68gbGnhu4d1LCBuaOG6sW0gbMOgbSByw7UgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nhuqVjIG5n4bunIG5oxrAgbMaw4bujbmcgdGnDqnUgdGjhu6UgY8OgIHBow6ogLCB0csOgICwgbsaw4bubYyB0xINuZyBs4buxYyAuDQoNCiMjIEvhur90IGPhuqV1IGLDoGkgbmdoacOqbiBj4bupdSANCi0gQ2jGsMahbmcgMTogVOG7lW5nIHF1YW4gbmdoacOqbiBj4bupdQ0KLSBDaMawxqFuZyAyOiBE4buvIGxp4buHdSBuZ2hpw6puIGPhu6l1DQotIENoxrDGoW5nIDM6IEvhur90IHF14bqjIHBow6JuIHTDrWNoIA0KLSBDaMawxqFuZyA0OiBL4bq/dCBsdeG6rW4NCg0KIyAgQ0jGr8agTkcgMjogROG7riBMSeG7hlUgUEjDgk4gVMONQ0ggDQoNCiMjIEdp4bubaSB0aGnhu4d1IGLhu5kgZOG7ryBsaeG7h3UgDQoNCkLhu5kgZOG7ryBsaeG7h3UgYmFvIGfhu5NtIDUwMCBxdWFuIHPDoXQsIGJhbyBn4buTbSAxMyAgYmnhur9uLCB24bubaSBj4bqjIGPDoWMgYmnhur9uIMSR4buLbmggdMOtbmggdsOgIMSR4buLbmggbMaw4bujbmcuIFRhIGPDsyA5IGJp4bq/biDEkeG7i25oIHTDrW5oIHbDoCA0ICBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyANCg0KDQpgYGB7cn0NCmQgPC1yZWFkLmNzdihmaWxlLmNob29zZSgpLCBoZWFkZXI9VCkNCmBgYA0KDQpgYGB7cn0NCnN0cihkKQ0KYGBgDQoNCmBgYHtyfQ0Kc3VtKGlzLm5hKGQpKQ0KYGBgDQoNCktow7RuZyBjw7MgZ2nDoSB0cuG7iyBOQSB0cm9uZyBi4buZIGThu68gbGnhu4d1DQoNCg0KIyMgTcO0IHThuqMgY8OhYyBiaeG6v24gdHJvbmcgZOG7ryBsaeG7h3UgDQoNCmBgYHtyfQ0KIyBMb2FkIHRoxrAgdmnhu4duDQpsaWJyYXJ5KGtuaXRyKQ0KYGBgDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgbcO0IHThuqMgYmnhur9uDQp2YXJpYWJsZV9leHBsYWluIDwtIGRhdGEuZnJhbWUoDQogIFRlbl9CaWVuID0gYygNCiAgICAiY2FmZmVpbmVfbWciLA0KICAgICJhZ2UiLA0KICAgICJmb2N1c19sZXZlbCIsDQogICAgInNsZWVwX3F1YWxpdHkiLA0KICAgICJzbGVlcF9pbXBhY3RlZCIsDQogICAgImJldmVyYWdlX2NvZmZlZSIsDQogICAgImJldmVyYWdlX2VuZXJneV9kcmluayIsDQogICAgImJldmVyYWdlX3RlYSIsDQogICAgInRpbWVfb2ZfZGF5X2FmdGVybm9vbiIsDQogICAgInRpbWVfb2ZfZGF5X2V2ZW5pbmciLA0KICAgICJ0aW1lX29mX2RheV9tb3JuaW5nIiwNCiAgICAiZ2VuZGVyX2ZlbWFsZSIsDQogICAgImdlbmRlcl9tYWxlIg0KICApLA0KICBZX05naGlhID0gYygNCiAgICAiTMaw4bujbmcgY2FmZmVpbmUgdGnDqnUgdGjhu6UgKGNodeG6qW4gaMOzYSBnaeG7r2EgMCB2w6AgMSkiLA0KICAgICJUdeG7lWkgbmfGsOG7nWkgdGhhbSBnaWEgKGNodeG6qW4gaMOzYSBnaeG7r2EgMCB2w6AgMSkiLA0KICAgICJN4bupYyDEkeG7mSB04bqtcCB0cnVuZyBzYXUga2hpIHRpw6p1IHRo4bulIGNhZmZlaW5lIChjaHXhuqluIGjDs2EpIiwNCiAgICAiQ2jhuqV0IGzGsOG7o25nIGdp4bqlYyBuZ+G7pyDEkcaw4bujYyDEkcOhbmggZ2nDoSAoY2h14bqpbiBow7NhKSIsDQogICAgIkdp4bqlYyBuZ+G7pyBjw7MgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSBjYWZmZWluZSBoYXkga2jDtG5nICgxOiBDw7MsIDA6IEtow7RuZykiLA0KICAgICJMb+G6oWkgxJHhu5MgdeG7kW5nOiBDw7MgdeG7kW5nIGPDoCBwaMOqIGhheSBraMO0bmcgKFRSVUUvRkFMU0UpIiwNCiAgICAiTG/huqFpIMSR4buTIHXhu5FuZzogQ8OzIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIGhheSBraMO0bmcgKFRSVUUvRkFMU0UpIiwNCiAgICAiTG/huqFpIMSR4buTIHXhu5FuZzogQ8OzIHXhu5FuZyB0csOgIGhheSBraMO0bmcgKFRSVUUvRkFMU0UpIiwNCiAgICAiVGjhu51pIGdpYW4gdGnDqnUgdGjhu6U6IEJ14buVaSBjaGnhu4F1IChUUlVFL0ZBTFNFKSIsDQogICAgIlRo4budaSBnaWFuIHRpw6p1IHRo4bulOiBCdeG7lWkgdOG7kWkgKFRSVUUvRkFMU0UpIiwNCiAgICAiVGjhu51pIGdpYW4gdGnDqnUgdGjhu6U6IEJ14buVaSBzw6FuZyAoVFJVRS9GQUxTRSkiLA0KICAgICJHaeG7m2kgdMOtbmg6IE7hu68gKFRSVUUvRkFMU0UpIiwNCiAgICAiR2nhu5tpIHTDrW5oOiBOYW0gKFRSVUUvRkFMU0UpIg0KICApDQopDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyB24bubaSBjYXB0aW9uDQprYWJsZSh2YXJpYWJsZV9leHBsYWluLCBjYXB0aW9uID0gIkdp4bqjaSB0aMOtY2ggY8OhYyBiaeG6v24gdHJvbmcgYuG7mSBk4buvIGxp4buHdSBjYWZmZWluZV9pbnRha2VfdHJhY2tlci5jc3YiKQ0KDQpgYGANCg0KDQojIENIxq/GoE5HIDM6IEvhur5UIFFV4bqiIFBIw4JOIFTDjUNIIA0KDQojIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gcGjhu6UgdGh14buZYyhzbGVlcF9pbXBhY3RlZC1naeG6pWMgbmfhu6cgYuG7iyDhuqNuaCBoxrDhu59uZykNCg0KKipHaeG6o2kgdGjDrWNoIGJp4bq/bioqDQpgYGB7cn0NCiMgTG9hZCB0aMawIHZp4buHbg0KbGlicmFyeShrbml0cikNCg0KIyAxLiBC4bqjbmcgZ2nhuqNpIHRow61jaCBjw6FjIG3hu6ljIGPhu6dhIGJp4bq/biBzbGVlcF9pbXBhY3RlZCAoYmnhur9uIHBo4bulIHRodeG7mWMpDQpzbGVlcF9pbXBhY3RlZF9sZXZlbHMgPC0gZGF0YS5mcmFtZSgNCiAgR2lhX3RyaSA9IGMoMCwgMSksDQogIFlfbmdoaWEgPSBjKA0KICAgICJLaMO0bmcgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSBjYWZmZWluZSIsDQogICAgIkLhu4sg4bqjbmggaMaw4bufbmcgYuG7n2kgY2FmZmVpbmUiDQogICkNCikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIHbhu5tpIGNow7ogdGjDrWNoDQprYWJsZShzbGVlcF9pbXBhY3RlZF9sZXZlbHMsIGNhcHRpb24gPSAiR2nhuqNpIHRow61jaCBjw6FjIG3hu6ljIMSR4buZIHRyb25nIGJp4bq/biBzbGVlcF9pbXBhY3RlZCIpDQoNCmBgYA0KDQoNCioqTOG6rXAgYuG6o24gdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyBiaeG6v24gc2xlZXBfaW1wYWN0ZWQgKGdp4buvIG5ndXnDqm4gbeG7qWMgZ+G7kWMpDQp0c19zbGVlcF9pbXBhY3RlZCA8LSB0YWJsZShkJHNsZWVwX2ltcGFjdGVkKQ0KDQojIFThuqFvIGLhuqNuZyBk4buvIGxp4buHdQ0KdHNfc2xlZXBfaW1wYWN0ZWRfZGYgPC0gZGF0YS5mcmFtZSgNCiAgR2lhX3RyaSA9IG5hbWVzKHRzX3NsZWVwX2ltcGFjdGVkKSwNCiAgVGFuX3NvID0gYXMudmVjdG9yKHRzX3NsZWVwX2ltcGFjdGVkKSwNCiAgVHlfbGUgPSByb3VuZCgoYXMudmVjdG9yKHRzX3NsZWVwX2ltcGFjdGVkKSAvIHN1bSh0c19zbGVlcF9pbXBhY3RlZCkpICogMTAwLCAyKQ0KKQ0KDQojIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KdHNfc2xlZXBfaW1wYWN0ZWRfZGYNCg0KYGBgDQoNCg0KKipCaeG7g3UgxJHhu5MqKg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biBzbGVlcF9pbXBhY3RlZA0KdHNfc2xlZXBfaW1wYWN0ZWQgPC0gdGFibGUoZCRzbGVlcF9pbXBhY3RlZCkNCg0KIyBUw61uaCB04bu3IGzhu4cgcGjhuqduIHRyxINtDQpwZXJjZW50X3NsZWVwX2ltcGFjdGVkIDwtIHJvdW5kKCh0c19zbGVlcF9pbXBhY3RlZCAvIHN1bSh0c19zbGVlcF9pbXBhY3RlZCkpICogMTAwLCAyKQ0KDQojIFThuqFvIG5ow6NuIGPDsyB0w6puIG3hu6ljICsgdOG7tyBs4buHDQpsYWJlbHNfc2xlZXBfaW1wYWN0ZWQgPC0gcGFzdGUobmFtZXModHNfc2xlZXBfaW1wYWN0ZWQpLCAiKCIsIHBlcmNlbnRfc2xlZXBfaW1wYWN0ZWQsICIlKSIsIHNlcCA9ICIiKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUodHNfc2xlZXBfaW1wYWN0ZWQsDQogICAgbGFiZWxzID0gbGFiZWxzX3NsZWVwX2ltcGFjdGVkLA0KICAgIG1haW4gPSAiQmnhu4N1IMSR4buTIHRyw7JuOiBN4bupYyDhuqNuaCBoxrDhu59uZyBj4bunYSBjYWZmZWluZSB04bubaSBnaeG6pWMgbmfhu6cgKHNsZWVwX2ltcGFjdGVkKSIsDQogICAgY29sID0gcmFpbmJvdyhsZW5ndGgodHNfc2xlZXBfaW1wYWN0ZWQpKSkNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBjw7MgNDAsNiUgbmfGsOG7nWkgdGhhbSBnaWEgYuG7iyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nhuqVjIG5n4bunIGtoaSB0acOqdSB0aOG7pSBjYWZmZWluZSwgdHJvbmcga2hpIDU5LDQlIGtow7RuZyBi4buLIOG6o25oIGjGsOG7n25nLiBU4bu3IGzhu4cgbsOgeSBjaG8gdGjhuqV5IGNhZmZlaW5lIGPDsyB0aOG7gyBnw6J5IHTDoWMgxJHhu5luZyDEkcOhbmcga+G7gyDEkeG6v24gZ2nhuqVjIG5n4bunIOG7nyBt4buZdCBi4buZIHBo4bqtbiBs4bubbiBuZ8aw4budaSBkw7luZy4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgY+G6p24gdGhp4bq/dCBwaOG6o2kgcGjDom4gdMOtY2ggc8OidSBoxqFuIMSR4buDIGhp4buDdSByw7UgY8OhYyB54bq/dSB04buRIGzDoG0gdMSDbmcgbmd1eSBjxqEgbeG6pXQgbmfhu6cga2hpIHPhu60gZOG7pW5nIGNhZmZlaW5lLg0KDQojIyBUaOG7kW5nIGvDqiBtw7QgdOG6oyBiaeG6v24gxJHhu5ljIGzhuq1wIA0KDQojIyMgQmnhur9uIGJldmVyYWdlX2NvZmZlZQ0KDQoqKkdp4bqjaSB0aMOtY2ggYmnhur9uKioNCg0KYGBge3J9DQojIExvYWQgdGjGsCB2aeG7h24NCmxpYnJhcnkoa25pdHIpDQoNCiMgMS4gQuG6o25nIGdp4bqjaSB0aMOtY2ggY8OhYyBt4bupYyBj4bunYSBiaeG6v24gYmV2ZXJhZ2VfY29mZmVlIChiaeG6v24gbmjhu4sgcGjDom4pDQpiZXZlcmFnZV9jb2ZmZWVfbGV2ZWxzIDwtIGRhdGEuZnJhbWUoDQogIEdpYV90cmkgPSBjKCJUUlVFIiwgIkZBTFNFIiksDQogIFlfbmdoaWEgPSBjKA0KICAgICJOZ8aw4budaSB0aGFtIGdpYSBjw7MgdeG7kW5nIGPDoCBwaMOqIiwNCiAgICAiTmfGsOG7nWkgdGhhbSBnaWEga2jDtG5nIHXhu5FuZyBjw6AgcGjDqiINCiAgKQ0KKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcNCmthYmxlKGJldmVyYWdlX2NvZmZlZV9sZXZlbHMsIGNhcHRpb24gPSAiR2nhuqNpIHRow61jaCBjw6FjIG3hu6ljIMSR4buZIHRyb25nIGJp4bq/biBiZXZlcmFnZV9jb2ZmZWUiKQ0KDQpgYGANCg0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KDQpgYGB7cn0NCiMgVOG6oW8gYuG6o25nIHThuqduIHN14bqldCBjaG8gYmnhur9uIGJldmVyYWdlX2NvZmZlZSAoZ2nhu68gbmd1ecOqbiBt4bupYyBn4buRYykNCnRzX2JldmVyYWdlX2NvZmZlZSA8LSB0YWJsZShkJGJldmVyYWdlX2NvZmZlZSkNCg0KIyBU4bqhbyBi4bqjbmcgZOG7ryBsaeG7h3UNCnRzX2JldmVyYWdlX2NvZmZlZV9kZiA8LSBkYXRhLmZyYW1lKA0KICBHaWFfdHJpID0gbmFtZXModHNfYmV2ZXJhZ2VfY29mZmVlKSwNCiAgVGFuX3NvID0gYXMudmVjdG9yKHRzX2JldmVyYWdlX2NvZmZlZSksDQogIFR5X2xlID0gcm91bmQoKGFzLnZlY3Rvcih0c19iZXZlcmFnZV9jb2ZmZWUpIC8gc3VtKHRzX2JldmVyYWdlX2NvZmZlZSkpICogMTAwLCAyKQ0KKQ0KDQojIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KdHNfYmV2ZXJhZ2VfY29mZmVlX2RmDQoNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyBiaeG6v24gYmV2ZXJhZ2VfY29mZmVlDQp0c19iZXZlcmFnZV9jb2ZmZWUgPC0gdGFibGUoZCRiZXZlcmFnZV9jb2ZmZWUpDQoNCiMgVMOtbmggdOG7tyBs4buHIHBo4bqnbiB0csSDbQ0KcGVyY2VudF9iZXZlcmFnZV9jb2ZmZWUgPC0gcm91bmQoKHRzX2JldmVyYWdlX2NvZmZlZSAvIHN1bSh0c19iZXZlcmFnZV9jb2ZmZWUpKSAqIDEwMCwgMikNCg0KIyBU4bqhbyBuaMOjbiBjw7MgdMOqbiBt4bupYyArIHThu7cgbOG7hw0KbGFiZWxzX2JldmVyYWdlX2NvZmZlZSA8LSBwYXN0ZShuYW1lcyh0c19iZXZlcmFnZV9jb2ZmZWUpLCAiKCIsIHBlcmNlbnRfYmV2ZXJhZ2VfY29mZmVlLCAiJSkiLCBzZXAgPSAiIikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KcGllKHRzX2JldmVyYWdlX2NvZmZlZSwgDQogICAgbGFiZWxzID0gbGFiZWxzX2JldmVyYWdlX2NvZmZlZSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIG5nxrDhu51pIHXhu5FuZyBjw6AgcGjDqiAoYmV2ZXJhZ2VfY29mZmVlKSIsDQogICAgY29sID0gcmFpbmJvdyhsZW5ndGgodHNfYmV2ZXJhZ2VfY29mZmVlKSkpDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KiogDQoNCkJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IGPDsyA1MyUgbmfGsOG7nWkgdGhhbSBnaWEga2jhuqNvIHPDoXQgY8OzIHXhu5FuZyBjw6AgcGjDqiwgdHJvbmcga2hpIDQ3JSBraMO0bmcgc+G7rSBk4bulbmcgbG/huqFpIMSR4buTIHXhu5FuZyBuw6B5LiBU4bu3IGzhu4cgdMawxqFuZyDEkeG7kWkgY8OibiBi4bqxbmcgbsOgeSBjaG8gdGjhuqV5IGPDoCBwaMOqIGzDoCBsb+G6oWkgdGjhu6ljIHXhu5FuZyBjaOG7qWEgY2FmZmVpbmUgcGjhu5UgYmnhur9uIG5o4bqldCB0cm9uZyBt4bqrdSBraOG6o28gc8OhdCwgxJHhu5NuZyB0aOG7nWkgY8WpbmcgbMOgIHnhur91IHThu5EgxJHDoW5nIGNow7ogw70ga2hpIHBow6JuIHTDrWNoIOG6o25oIGjGsOG7n25nIGPhu6dhIGNhZmZlaW5lIMSR4bq/biBnaeG6pWMgbmfhu6cuDQoNCiMjIyBCaeG6v24gYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rIA0KDQoqKkdp4bqjaSB0aMOtY2ggYmnhur9uKioNCg0KYGBge3J9DQojIExvYWQgdGjGsCB2aeG7h24NCmxpYnJhcnkoa25pdHIpDQoNCiMgQuG6o25nIGdp4bqjaSB0aMOtY2ggY8OhYyBt4bupYyBj4bunYSBiaeG6v24gYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rIChiaeG6v24gbmjhu4sgcGjDom4pDQpiZXZlcmFnZV9lbmVyZ3lfZHJpbmtfbGV2ZWxzIDwtIGRhdGEuZnJhbWUoDQogIEdpYV90cmkgPSBjKCJUUlVFIiwgIkZBTFNFIiksDQogIFlfbmdoaWEgPSBjKA0KICAgICJOZ8aw4budaSB0aGFtIGdpYSBjw7MgdeG7kW5nIG7GsOG7m2MgdMSDbmcgbOG7sWMiLA0KICAgICJOZ8aw4budaSB0aGFtIGdpYSBraMO0bmcgdeG7kW5nIG7GsOG7m2MgdMSDbmcgbOG7sWMiDQogICkNCikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nDQprYWJsZShiZXZlcmFnZV9lbmVyZ3lfZHJpbmtfbGV2ZWxzLCBjYXB0aW9uID0gIkdp4bqjaSB0aMOtY2ggY8OhYyBt4bupYyDEkeG7mSB0cm9uZyBiaeG6v24gYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rIikNCg0KYGBgDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyBiaeG6v24gYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rDQp0c19iZXZlcmFnZV9lbmVyZ3kgPC0gdGFibGUoZCRiZXZlcmFnZV9lbmVyZ3lfZHJpbmspDQoNCiMgVMOtbmggdOG7tyBs4buHIHBo4bqnbiB0csSDbQ0KcGVyY2VudF9iZXZlcmFnZV9lbmVyZ3kgPC0gcm91bmQoKHRzX2JldmVyYWdlX2VuZXJneSAvIHN1bSh0c19iZXZlcmFnZV9lbmVyZ3kpKSAqIDEwMCwgMikNCg0KIyBU4bqhbyBi4bqjbmcgZOG7ryBsaeG7h3UNCnRzX2JldmVyYWdlX2VuZXJneV9kZiA8LSBkYXRhLmZyYW1lKA0KICBHaWFfdHJpID0gbmFtZXModHNfYmV2ZXJhZ2VfZW5lcmd5KSwNCiAgVGFuX3NvID0gYXMudmVjdG9yKHRzX2JldmVyYWdlX2VuZXJneSksDQogIFR5X2xlID0gcGVyY2VudF9iZXZlcmFnZV9lbmVyZ3kNCikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIGvhur90IHF14bqjDQp0c19iZXZlcmFnZV9lbmVyZ3lfZGYNCg0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBzdeG6pXQNCnRzX2JldmVyYWdlX2VuZXJneSA8LSB0YWJsZShkJGJldmVyYWdlX2VuZXJneV9kcmluaykNCg0KIyBUw61uaCB04bu3IGzhu4cgcGjhuqduIHRyxINtDQpwZXJjZW50X2JldmVyYWdlX2VuZXJneSA8LSByb3VuZCgodHNfYmV2ZXJhZ2VfZW5lcmd5IC8gc3VtKHRzX2JldmVyYWdlX2VuZXJneSkpICogMTAwLCAyKQ0KDQojIChUdeG7syBjaOG7jW4pIEfhuq9uIG5ow6NuIHRp4bq/bmcgVmnhu4d0IHRoYXkgY2hvIFRSVUUvRkFMU0UNCm5hbWVzKHRzX2JldmVyYWdlX2VuZXJneSkgPC0gYygiS2jDtG5nIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIiwgIkPDsyB14buRbmcgbsaw4bubYyB0xINuZyBs4buxYyIpDQoNCiMgVOG6oW8gbmjDo24gaGnhu4NuIHRo4buLOiB0w6puIG3hu6ljICsgdOG7tyBs4buHICUNCmxhYmVsc19iZXZlcmFnZV9lbmVyZ3kgPC0gcGFzdGUoDQogIG5hbWVzKHRzX2JldmVyYWdlX2VuZXJneSksIA0KICAiKCIsIHBlcmNlbnRfYmV2ZXJhZ2VfZW5lcmd5LCAiJSkiLCANCiAgc2VwID0gIiINCikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyB0csOybg0KcGllKHRzX2JldmVyYWdlX2VuZXJneSwNCiAgICBsYWJlbHMgPSBsYWJlbHNfYmV2ZXJhZ2VfZW5lcmd5LA0KICAgIG1haW4gPSAiQmnhu4N1IMSR4buTIHRyw7JuOiBU4bu3IGzhu4cgbmfGsOG7nWkgdeG7kW5nIG7GsOG7m2MgdMSDbmcgbOG7sWMgKGJldmVyYWdlX2VuZXJneV9kcmluaykiLA0KICAgIGNvbCA9IHJhaW5ib3cobGVuZ3RoKHRzX2JldmVyYWdlX2VuZXJneSkpKQ0KDQpgYGANCioqTmjhuq1uIHjDqXQqKg0KDQpCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBjaOG7iSBjw7MgOSw0JSBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCBz4butIGThu6VuZyBuxrDhu5tjIHTEg25nIGzhu7FjLCB0cm9uZyBraGkgOTAsNiUga2jDtG5nIHPhu60gZOG7pW5nIGxv4bqhaSDEkeG7kyB14buRbmcgbsOgeS4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbsaw4bubYyB0xINuZyBs4buxYyBraMO0bmcgcGjhuqNpIGzDoCBuZ3Xhu5NuIGNhZmZlaW5lIHBo4buVIGJp4bq/biB0cm9uZyBj4buZbmcgxJHhu5NuZyBraOG6o28gc8OhdCwgxJHhu5NuZyB0aOG7nWkgY2hvIHRo4bqleSBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSBsb+G6oWkgxJHhu5MgdeG7kW5nIG7DoHkgxJHhur9uIGdp4bqlYyBuZ+G7pyBjw7MgdGjhu4Mgc+G6vSBraMO0bmcgY2hp4bq/bSDGsHUgdGjhur8gdHJvbmcgcGjDom4gdMOtY2ggdOG7lW5nIHRo4buDLg0KDQojIyMgQmnhur9uIGJldmVyYWdlX3RlYQ0KDQoqKkdp4bqjaSB0aMOtY2ggYmnhur9uKioNCg0KYGBge3J9DQojIExvYWQgdGjGsCB2aeG7h24NCmxpYnJhcnkoa25pdHIpDQoNCiMgQuG6o25nIGdp4bqjaSB0aMOtY2ggY8OhYyBt4bupYyBj4bunYSBiaeG6v24gYmV2ZXJhZ2VfdGVhIChiaeG6v24gbmjhu4sgcGjDom4pDQpiZXZlcmFnZV90ZWFfbGV2ZWxzIDwtIGRhdGEuZnJhbWUoDQogIEdpYV90cmkgPSBjKCJUUlVFIiwgIkZBTFNFIiksDQogIFlfbmdoaWEgPSBjKA0KICAgICJOZ8aw4budaSB0aGFtIGdpYSBjw7MgdeG7kW5nIHRyw6AiLA0KICAgICJOZ8aw4budaSB0aGFtIGdpYSBraMO0bmcgdeG7kW5nIHRyw6AiDQogICkNCikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nDQprYWJsZShiZXZlcmFnZV90ZWFfbGV2ZWxzLCBjYXB0aW9uID0gIkdp4bqjaSB0aMOtY2ggY8OhYyBt4bupYyDEkeG7mSB0cm9uZyBiaeG6v24gYmV2ZXJhZ2VfdGVhIikNCg0KYGBgDQoNCioqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHThuqduIHN14bqldCoqDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc3XhuqV0IGNobyBiaeG6v24gYmV2ZXJhZ2VfdGVhDQp0c19iZXZlcmFnZV90ZWEgPC0gdGFibGUoZCRiZXZlcmFnZV90ZWEpDQoNCiMgVMOtbmggdOG7tyBs4buHIHBo4bqnbiB0csSDbQ0KcGVyY2VudF9iZXZlcmFnZV90ZWEgPC0gcm91bmQoKHRzX2JldmVyYWdlX3RlYSAvIHN1bSh0c19iZXZlcmFnZV90ZWEpKSAqIDEwMCwgMikNCg0KIyBU4bqhbyBi4bqjbmcgZOG7ryBsaeG7h3UNCnRzX2JldmVyYWdlX3RlYV9kZiA8LSBkYXRhLmZyYW1lKA0KICBHaWFfdHJpID0gbmFtZXModHNfYmV2ZXJhZ2VfdGVhKSwNCiAgVGFuX3NvID0gYXMudmVjdG9yKHRzX2JldmVyYWdlX3RlYSksDQogIFR5X2xlID0gcGVyY2VudF9iZXZlcmFnZV90ZWENCikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nIGvhur90IHF14bqjDQp0c19iZXZlcmFnZV90ZWFfZGYNCg0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBzdeG6pXQNCnRzX2JldmVyYWdlX3RlYSA8LSB0YWJsZShkJGJldmVyYWdlX3RlYSkNCg0KIyBUw61uaCB04bu3IGzhu4cgcGjhuqduIHRyxINtDQpwZXJjZW50X2JldmVyYWdlX3RlYSA8LSByb3VuZCgodHNfYmV2ZXJhZ2VfdGVhIC8gc3VtKHRzX2JldmVyYWdlX3RlYSkpICogMTAwLCAyKQ0KDQojIChUw7l5IGNo4buNbikgR+G6r24gbmjDo24gdGnhur9uZyBWaeG7h3QgdGhheSBjaG8gVFJVRS9GQUxTRQ0KbmFtZXModHNfYmV2ZXJhZ2VfdGVhKSA8LSBjKCJLaMO0bmcgdeG7kW5nIHRyw6AiLCAiQ8OzIHXhu5FuZyB0csOgIikNCg0KIyBU4bqhbyBuaMOjbjogdMOqbiBt4bupYyArIHThu7cgbOG7hyAlDQpsYWJlbHNfYmV2ZXJhZ2VfdGVhIDwtIHBhc3RlKA0KICBuYW1lcyh0c19iZXZlcmFnZV90ZWEpLCANCiAgIigiLCBwZXJjZW50X2JldmVyYWdlX3RlYSwgIiUpIiwgDQogIHNlcCA9ICIiDQopDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgdHLDsm4NCnBpZSh0c19iZXZlcmFnZV90ZWEsDQogICAgbGFiZWxzID0gbGFiZWxzX2JldmVyYWdlX3RlYSwNCiAgICBtYWluID0gIkJp4buDdSDEkeG7kyB0csOybjogVOG7tyBs4buHIG5nxrDhu51pIHXhu5FuZyB0csOgIChiZXZlcmFnZV90ZWEpIiwNCiAgICBjb2wgPSByYWluYm93KGxlbmd0aCh0c19iZXZlcmFnZV90ZWEpKSkNCg0KYGBgDQoqKk5o4bqtbiB4w6l0KioNCg0KQmnhu4N1IMSR4buTIGNobyB0aOG6pXkgY8OzIDM3LDYlIG5nxrDhu51pIHRoYW0gZ2lhIGto4bqjbyBzw6F0IGPDsyB14buRbmcgdHLDoCwgdHJvbmcga2hpIDYyLDQlIGtow7RuZyBz4butIGThu6VuZyBsb+G6oWkgxJHhu5MgdeG7kW5nIG7DoHkuIE3hurdjIGTDuSBraMO0bmcgcGjhu5UgYmnhur9uIGLhurFuZyBjw6AgcGjDqiwgdHLDoCB24bqrbiBsw6Agbmd14buTbiBjYWZmZWluZSB0xrDGoW5nIMSR4buRaSBwaOG7lSBiaeG6v24gdHJvbmcgY+G7mW5nIMSR4buTbmcga2jhuqNvIHPDoXQgdsOgIGPDsyB0aOG7gyDEkcOzbmcgdmFpIHRyw7IgbmjhuqV0IMSR4buLbmggdHJvbmcgdmnhu4djIOG6o25oIGjGsOG7n25nIMSR4bq/biBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunLg0KDQojIyMgdGltZV9vZl9kYXlfZXZlbm5pbmcgDQoNCioqR2nhuqNpIHRow61jaCBiaeG6v24qKg0KDQpgYGB7cn0NCiMgTG9hZCB0aMawIHZp4buHbg0KbGlicmFyeShrbml0cikNCg0KIyBC4bqjbmcgZ2nhuqNpIHRow61jaCBjw6FjIG3hu6ljIGPhu6dhIGJp4bq/biB0aW1lX29mX2RheV9ldmVuaW5nIChiaeG6v24gbmjhu4sgcGjDom4pDQp0aW1lX29mX2RheV9ldmVuaW5nX2xldmVscyA8LSBkYXRhLmZyYW1lKA0KICBHaWFfdHJpID0gYygiVFJVRSIsICJGQUxTRSIpLA0KICBZX25naGlhID0gYygNCiAgICAiVGjhu51pIGdpYW4ga2jhuqNvIHPDoXQgZGnhu4VuIHJhIHbDoG8gYnXhu5VpIHThu5FpIiwNCiAgICAiVGjhu51pIGdpYW4ga2jhuqNvIHPDoXQga2jDtG5nIGRp4buFbiByYSB2w6BvIGJ14buVaSB04buRaSINCiAgKQ0KKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcNCmthYmxlKHRpbWVfb2ZfZGF5X2V2ZW5pbmdfbGV2ZWxzLCBjYXB0aW9uID0gIkdp4bqjaSB0aMOtY2ggY8OhYyBt4bupYyDEkeG7mSB0cm9uZyBiaeG6v24gdGltZV9vZl9kYXlfZXZlbmluZyIpDQoNCmBgYA0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBzdeG6pXQgY2hvIGJp4bq/biB0aW1lX29mX2RheV9ldmVuaW5nDQp0c190aW1lX2V2ZW5pbmcgPC0gdGFibGUoZCR0aW1lX29mX2RheV9ldmVuaW5nKQ0KDQojIFTDrW5oIHThu7cgbOG7hyBwaOG6p24gdHLEg20NCnBlcmNlbnRfdGltZV9ldmVuaW5nIDwtIHJvdW5kKCh0c190aW1lX2V2ZW5pbmcgLyBzdW0odHNfdGltZV9ldmVuaW5nKSkgKiAxMDAsIDIpDQoNCiMgVOG6oW8gYuG6o25nIGThu68gbGnhu4d1DQp0c190aW1lX2V2ZW5pbmdfZGYgPC0gZGF0YS5mcmFtZSgNCiAgR2lhX3RyaSA9IG5hbWVzKHRzX3RpbWVfZXZlbmluZyksDQogIFRhbl9zbyA9IGFzLnZlY3Rvcih0c190aW1lX2V2ZW5pbmcpLA0KICBUeV9sZSA9IHBlcmNlbnRfdGltZV9ldmVuaW5nDQopDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyBr4bq/dCBxdeG6ow0KdHNfdGltZV9ldmVuaW5nX2RmDQoNCmBgYA0KDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBzdeG6pXQNCnRzX3RpbWVfZXZlbmluZyA8LSB0YWJsZShkJHRpbWVfb2ZfZGF5X2V2ZW5pbmcpDQoNCiMgVMOtbmggdOG7tyBs4buHIHBo4bqnbiB0csSDbQ0KcGVyY2VudF90aW1lX2V2ZW5pbmcgPC0gcm91bmQoKHRzX3RpbWVfZXZlbmluZyAvIHN1bSh0c190aW1lX2V2ZW5pbmcpKSAqIDEwMCwgMikNCg0KIyBH4bqvbiBuaMOjbiB0aeG6v25nIFZp4buHdCB0aGF5IGNobyBGQUxTRS9UUlVFDQpuYW1lcyh0c190aW1lX2V2ZW5pbmcpIDwtIGMoIktow7RuZyBideG7lWkgdOG7kWkiLCAiQnXhu5VpIHThu5FpIikNCg0KIyBU4bqhbyBuaMOjbjogdMOqbiBt4bupYyArIHThu7cgbOG7hyAlDQpsYWJlbHNfdGltZV9ldmVuaW5nIDwtIHBhc3RlKA0KICBuYW1lcyh0c190aW1lX2V2ZW5pbmcpLA0KICAiKCIsIHBlcmNlbnRfdGltZV9ldmVuaW5nLCAiJSkiLA0KICBzZXAgPSAiIg0KKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIHRyw7JuDQpwaWUodHNfdGltZV9ldmVuaW5nLA0KICAgIGxhYmVscyA9IGxhYmVsc190aW1lX2V2ZW5pbmcsDQogICAgbWFpbiA9ICJCaeG7g3UgxJHhu5MgdHLDsm46IFThu7cgbOG7hyB0aOG7nWkgZ2lhbiBz4butIGThu6VuZyB2w6BvIGJ14buVaSB04buRaSAodGltZV9vZl9kYXlfZXZlbmluZykiLA0KICAgIGNvbCA9IHJhaW5ib3cobGVuZ3RoKHRzX3RpbWVfZXZlbmluZykpKQ0KDQpgYGANCg0KDQoqKk5o4bqtbiB4w6l0KioNCg0KQmnhu4N1IMSR4buTIGNobyB0aOG6pXkgcuG6sW5nIHBo4bqnbiBs4bubbiBuZ8aw4budaSB0aGFtIGdpYSBraOG6o28gc8OhdCBraMO0bmcgc+G7rSBk4bulbmcgY2FmZmVpbmUgdsOgbyBideG7lWkgdOG7kWksIGNoaeG6v20gdOG7tyBs4buHIDgxLjIlLiBOZ8aw4bujYyBs4bqhaSwgY2jhu4kgY8OzIDE4LjglIG5nxrDhu51pIHRoYW0gZ2lhIGPDsyBow6BuaCB2aSBz4butIGThu6VuZyBjYWZmZWluZSB2w6BvIGtodW5nIHRo4budaSBnaWFuIGJ14buVaSB04buRaS4NCg0KIyMgS2nhu4NtIMSR4buLbmggdMOtbmggxJHhu5ljIGzhuq1wDQoNCiMjIyBCaeG6v24gc2xlZXBfaW1wYWN0ZWQgdsOgIGJldmVyYWdlX2NvZmZlZQ0KDQpgYGB7cn0NCiMgVOG6oW8gYuG6o25nIHThuqduIHPhu5EgY2jDqW8gZ2nhu69hIHNsZWVwX2ltcGFjdGVkIHbDoCBiZXZlcmFnZV9jb2ZmZWUNCnRibF9zbGVlcF9iZXZjb2ZmZWUgPC0gdGFibGUoZCRzbGVlcF9pbXBhY3RlZCwgZCRiZXZlcmFnZV9jb2ZmZWUpDQoNCiMgVGjhu7FjIGhp4buHbiBraeG7g20gxJHhu4tuaCBDaGktYsOsbmgtcGjGsMahbmcNCnRlc3Rfc2xlZXBfYmV2Y29mZmVlIDwtIGNoaXNxLnRlc3QodGJsX3NsZWVwX2JldmNvZmZlZSkNCg0KIyBIaeG7g24gdGjhu4sga+G6v3QgcXXhuqMNCnByaW50KHRlc3Rfc2xlZXBfYmV2Y29mZmVlKQ0KDQpgYGANCioqTmjhuq1uIHjDqXQqKg0KDQpL4bq/dCBxdeG6oyBraeG7g20gxJHhu4tuaCBDaGktc3F1YXJlZCBjaG8gdGjhuqV5IHAtdmFsdWUgcuG6pXQgbmjhu48gKHAg4omIIDAuMDAwMDAwMDAxOSksIGNo4bupbmcgdOG7jyBjw7MgbeG7kWkgbGnDqm4gaOG7hyB0aOG7kW5nIGvDqiBjw7Mgw70gbmdoxKlhIGdp4buvYSB2aeG7h2MgdeG7kW5nIGPDoCBwaMOqIHbDoCB2aeG7h2MgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgZG8gY2FmZmVpbmUuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG5o4buvbmcgbmfGsOG7nWkgdeG7kW5nIGPDoCBwaMOqIGPDsyB4dSBoxrDhu5tuZyBi4buLIOG6o25oIGjGsOG7n25nIMSR4bq/biBnaeG6pWMgbmfhu6cgbmhp4buBdSBoxqFuIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIHXhu5FuZywgdsOgIG3hu5FpIHF1YW4gaOG7hyBuw6B5IGtow7RuZyB44bqjeSByYSBt4buZdCBjw6FjaCBuZ+G6q3Ugbmhpw6puLg0KDQojIyMgQmnhur9uIHNsZWVwX2ltcGFjdGVkIHbDoCBiZXZlcmFnZV9lbmVyZ3lfZHJpbmsNCg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRIGNow6lvIGdp4buvYSBzbGVlcF9pbXBhY3RlZCB2w6AgYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rDQp0Ymxfc2xlZXBfZW5lcmd5IDwtIHRhYmxlKGQkc2xlZXBfaW1wYWN0ZWQsIGQkYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rKQ0KDQojIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oLXBoxrDGoW5nDQp0ZXN0X3NsZWVwX2VuZXJneSA8LSBjaGlzcS50ZXN0KHRibF9zbGVlcF9lbmVyZ3kpDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjDQpwcmludCh0ZXN0X3NsZWVwX2VuZXJneSkNCg0KYGBgDQoqKk5o4bqtbiB4w6l0KioNCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggQ2hpLXNxdWFyZWQgZ2nhu69hIHZp4buHYyB14buRbmcgbsaw4bubYyB0xINuZyBs4buxYyB2w6Ag4bqjbmggaMaw4bufbmcgxJHhur9uIGdp4bqlYyBuZ+G7pyBjaG8gdGjhuqV5IHAtdmFsdWUgPSAwLjAwMTE1LCBuaOG7jyBoxqFuIG3hu6ljIMO9IG5naMSpYSAwLjA1LiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw7MgbeG7kWkgbGnDqm4gaOG7hyB0aOG7kW5nIGvDqiBjw7Mgw70gbmdoxKlhIGdp4buvYSBoYWkgYmnhur9uLCB04bupYyBsw6Agdmnhu4djIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIGPDsyBsacOqbiBxdWFuIMSR4bq/biBraOG6oyBuxINuZyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7py4gRMO5IHThu7cgbOG7hyBuZ8aw4budaSB14buRbmcgbsaw4bubYyB0xINuZyBs4buxYyBraMO0bmcgY2FvLCBr4bq/dCBxdeG6oyB24bqrbiBjaG8gdGjhuqV5IG5ow7NtIG7DoHkgY8OzIHh1IGjGsOG7m25nIGLhu4sg4bqjbmggaMaw4bufbmcgxJHhur9uIGdp4bqlYyBuZ+G7pyBuaGnhu4F1IGjGoW4gc28gduG7m2kgbmjDs20ga2jDtG5nIHPhu60gZOG7pW5nLg0KDQojIyMgQmnhur9uIHNsZWVwX2ltcGFjdGVkIHbDoCBiZXZlcmFnZV90ZWENCg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRIGNow6lvIGdp4buvYSBzbGVlcF9pbXBhY3RlZCB2w6AgYmV2ZXJhZ2VfdGVhDQp0Ymxfc2xlZXBfdGVhIDwtIHRhYmxlKGQkc2xlZXBfaW1wYWN0ZWQsIGQkYmV2ZXJhZ2VfdGVhKQ0KDQojIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oLXBoxrDGoW5nDQp0ZXN0X3NsZWVwX3RlYSA8LSBjaGlzcS50ZXN0KHRibF9zbGVlcF90ZWEpDQoNCiMgSGnhu4NuIHRo4buLIGvhur90IHF14bqjDQpwcmludCh0ZXN0X3NsZWVwX3RlYSkNCg0KYGBgDQoqKk5o4bqtbiB4w6l0KioNCg0KS+G6v3QgcXXhuqMga2nhu4NtIMSR4buLbmggQ2hpLXNxdWFyZWQgY2hvIHRo4bqleSBwLXZhbHVlIDwgMi4yZS0xNiwgY+G7sWMga+G7syBuaOG7jywgY2jhu6luZyB04buPIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIHZp4buHYyB14buRbmcgdHLDoCB2w6Ag4bqjbmggaMaw4bufbmcgxJHhur9uIGdp4bqlYyBuZ+G7pyBsw6AgcuG6pXQgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqi5UYSBjw7MgdGjhu4Mga+G6v3QgbHXhuq1uIHLhurFuZyB2aeG7h2MgdeG7kW5nIHRyw6Aga2jDtG5nIMSR4buZYyBs4bqtcCB24bubaSBraOG6oyBuxINuZyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7py4gTsOzaSBjw6FjaCBraMOhYywgbmjhu69uZyBuZ8aw4budaSBjw7MgdGjDs2kgcXVlbiB14buRbmcgdHLDoCBjw7MgeHUgaMaw4bubbmcgYuG7iyB0w6FjIMSR4buZbmcgxJHhur9uIGdp4bqlYyBuZ+G7pyByw7UgcuG7h3QgaMahbiBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGtow7RuZyB14buRbmcuDQoNCiMjIyBCaeG6v24gc2xlZXBfaW1wYWN0ZWQgdsOgIHRpbWVfb2ZfZGF5X2V2ZW5pbmcNCg0KYGBge3J9DQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRIGNow6lvIGdp4buvYSBzbGVlcF9pbXBhY3RlZCB2w6AgdGltZV9vZl9kYXlfZXZlbmluZw0KdGJsX3NsZWVwX2V2ZW5pbmcgPC0gdGFibGUoZCRzbGVlcF9pbXBhY3RlZCwgZCR0aW1lX29mX2RheV9ldmVuaW5nKQ0KDQojIFRo4buxYyBoaeG7h24ga2nhu4NtIMSR4buLbmggQ2hpLWLDrG5oLXBoxrDGoW5nDQp0ZXN0X3NsZWVwX2V2ZW5pbmcgPC0gY2hpc3EudGVzdCh0Ymxfc2xlZXBfZXZlbmluZykNCg0KIyBIaeG7g24gdGjhu4sga+G6v3QgcXXhuqMNCnByaW50KHRlc3Rfc2xlZXBfZXZlbmluZykNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpO4bq/dSBz4butIGThu6VuZyBt4bupYyDDvSBuZ2jEqWEgzrEgPSAwLjA1LCB0YSBjaMawYSDEkeG7pyBi4bqxbmcgY2jhu6luZyB0aOG7kW5nIGvDqiDEkeG7gyBiw6FjIGLhu48gZ2nhuqMgdGh1eeG6v3QgSOKCgCAoZ2nhuqMgdGh1eeG6v3QgcuG6sW5nIGtow7RuZyBjw7MgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgaGFpIGJp4bq/bikuVHV5IG5oacOqbiwgZ2nDoSB0cuG7iyBwIGNo4buJIG5o4buJbmggaMahbiAwLjA1IG3hu5l0IGNow7p0LCDEkWnhu4F1IG7DoHkgY2hvIHRo4bqleSBjw7MgZOG6pXUgaGnhu4d1IGPhu6dhIG3hu5l0IG3hu5FpIGxpw6puIGjhu4cgeeG6v3UgZ2nhu69hIHZp4buHYyBz4butIGThu6VuZyBjYWZmZWluZSB2w6BvIGJ14buVaSB04buRaSB2w6Agdmnhu4djIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunLCBuaMawbmcgY2jGsGEgxJHhuqF0IG3hu6ljIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBjaOG6t3QgY2jhur0uDQoNCiMjIFRo4buRbmcga8OqIG3DtCB04bqjIDIgYmnhur9uIA0KDQojIyMgQmnhur9uIHNsZWVwX2ltcGFjdGVkIHbDoCBiZXZlcmFnZV9jb2ZmZWUNCg0KYGBge3J9DQojIEtp4buDbSB0cmEgY8OhYyBnacOhIHRy4buLIGfhu5FjIGPhu6dhIGJp4bq/biBzbGVlcF9pbXBhY3RlZA0KdW5pcXVlKGQkc2xlZXBfaW1wYWN0ZWQpDQoNCiMgS2nhu4NtIHRyYSBjw6FjIGdpw6EgdHLhu4sgZ+G7kWMgY+G7p2EgYmnhur9uIGJldmVyYWdlX2NvZmZlZQ0KdW5pcXVlKGQkYmV2ZXJhZ2VfY29mZmVlKQ0KDQpgYGANCg0KYGBge3J9DQojIE7hur91IHNsZWVwX2ltcGFjdGVkIMSRw6MgbMOgIDAgdsOgIDEg4oaSIGfDoW4gbmjDo24gcsO1IHLDoG5nDQppZiAoYWxsKHVuaXF1ZShkJHNsZWVwX2ltcGFjdGVkKSAlaW4lIGMoMCwgMSkpKSB7DQogIGQkU2xlZXBDbGVhciA8LSBmYWN0b3IoZCRzbGVlcF9pbXBhY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyBi4buLIOG6o25oIGjGsOG7n25nIiwgIkLhu4sg4bqjbmggaMaw4bufbmciKSkNCn0gZWxzZSB7DQogIGQkU2xlZXBDbGVhciA8LSBmYWN0b3IoZCRzbGVlcF9pbXBhY3RlZCkNCn0NCg0KIyBO4bq/dSBiZXZlcmFnZV9jb2ZmZWUgbMOgIFRSVUUvRkFMU0Ug4oaSIGfDoW4gbmjDo24gcsO1IHLDoG5nDQppZiAoYWxsKHVuaXF1ZShkJGJldmVyYWdlX2NvZmZlZSkgJWluJSBjKFRSVUUsIEZBTFNFKSkpIHsNCiAgZCRDb2ZmZWVDbGVhciA8LSBmYWN0b3IoZCRiZXZlcmFnZV9jb2ZmZWUsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoRkFMU0UsIFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJLaMO0bmcgdeG7kW5nIGPDoCBwaMOqIiwgIkPDsyB14buRbmcgY8OgIHBow6oiKSkNCn0gZWxzZSB7DQogIGQkQ29mZmVlQ2xlYXIgPC0gZmFjdG9yKGQkYmV2ZXJhZ2VfY29mZmVlKQ0KfQ0KDQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRIGNow6lvDQp0YWJsZV9zbGVlcF9jb2ZmZWUgPC0gdGFibGUoZCRTbGVlcENsZWFyLCBkJENvZmZlZUNsZWFyKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcNCnByaW50KHRhYmxlX3NsZWVwX2NvZmZlZSkNCg0KYGBgDQoNCmBgYHtyfQ0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbyAobuG6v3UgY2jGsGEgY8OzKQ0KdGFibGVfc2xlZXBfY29mZmVlIDwtIHRhYmxlKGQkU2xlZXBDbGVhciwgZCRDb2ZmZWVDbGVhcikNCg0KIyBUw61uaCB04bu3IGzhu4cgcGjhuqduIHRyxINtIHRoZW8gaMOgbmcgKHJvdy13aXNlKQ0KcHJvcF90YWJsZV9zbGVlcF9jb2ZmZWUgPC0gcHJvcC50YWJsZSh0YWJsZV9zbGVlcF9jb2ZmZWUsIG1hcmdpbiA9IDEpICogMTAwDQoNCiMgTMOgbSB0csOybiBr4bq/dCBxdeG6ow0Kcm91bmQocHJvcF90YWJsZV9zbGVlcF9jb2ZmZWUsIDIpDQoNCmBgYA0KDQoqKkJJ4buDdSDEkeG7kyoqDQoNCmBgYHtyfQ0KIyBMb2FkIGdncGxvdDINCmxpYnJhcnkoZ2dwbG90MikNCg0KIyBW4bq9IGJp4buDdSDEkeG7kyBj4buZdCBuaMOzbQ0KZ2dwbG90KGQsIGFlcyh4ID0gU2xlZXBDbGVhciwgZmlsbCA9IENvZmZlZUNsZWFyKSkgKw0KICBnZW9tX2Jhcihwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV90ZXh0KHN0YXQgPSAiY291bnQiLCBhZXMobGFiZWwgPSAuLmNvdW50Li4pLA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuOSksIHZqdXN0ID0gLTAuMywgY29sb3IgPSAiYmxhY2siLCBzaXplID0gNCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCBuaMOzbTog4bqibmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIHbDoCB0aMOzaSBxdWVuIHXhu5FuZyBjw6AgcGjDqiIsDQogICAgICAgeCA9ICJHaeG6pWMgbmfhu6cgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSBjYWZmZWluZSIsDQogICAgICAgeSA9ICJT4buRIGzGsOG7o25nIG5nxrDhu51pIHRoYW0gZ2lhIiwNCiAgICAgICBmaWxsID0gIlXhu5FuZyBjw6AgcGjDqiIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KiogDQoNCkJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IHRyb25nIG5ow7NtIGtow7RuZyB14buRbmcgY8OgIHBow6osIHBo4bqnbiBs4bubbiBuZ8aw4budaSB0aGFtIGdpYSBraMO0bmcgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSBjYWZmZWluZSDEkeG6v24gZ2nhuqVjIG5n4bunICgxNzMgbmfGsOG7nWkpIGNoaeG6v20gNzQlLCBjaOG7iSBjw7MgMjYlIG5nxrDhu51pIGLhu4sg4bqjbmggaMaw4bufbmcuIE5nxrDhu6NjIGzhuqFpLCB0cm9uZyBuaMOzbSBjw7MgdeG7kW5nIGPDoCBwaMOqLCBz4buRIG5nxrDhu51pIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunICgxNDEpIGNoaeG6v20gNTMlICBjYW8gaMahbiBz4buRIG5nxrDhu51pIGtow7RuZyBi4buLIOG6o25oIGjGsOG7n25nICgxMjQpIGNoaeG6v20gNDclLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB4dSBoxrDhu5tuZyByw7UgcuG7h3Q6IG5nxrDhu51pIHXhu5FuZyBjw6AgcGjDqiBjw7Mga2jhuqMgbsSDbmcgYuG7iyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nhuqVjIG5n4bunIGNhbyBoxqFuIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyB14buRbmcuDQoNCiMjIyBCaeG6v24gc2xlZXBfaW1wYWN0ZWQgdsOgIGJldmVyYWdlX2VuZXJneV9kcmluaw0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojIEtp4buDbSB0cmEgY8OhYyBnacOhIHRy4buLIGfhu5FjIGPhu6dhIGJp4bq/biBzbGVlcF9pbXBhY3RlZA0KdW5pcXVlKGQkc2xlZXBfaW1wYWN0ZWQpDQoNCiMgS2nhu4NtIHRyYSBjw6FjIGdpw6EgdHLhu4sgZ+G7kWMgY+G7p2EgYmnhur9uIGJldmVyYWdlX2VuZXJneV9kcmluaw0KdW5pcXVlKGQkYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rKQ0KDQpgYGANCg0KYGBge3J9DQojIE7hur91IHNsZWVwX2ltcGFjdGVkIMSRw6MgbMOgIDAgdsOgIDEg4oaSIGfDoW4gbmjDo24gcsO1IHLDoG5nDQppZiAoYWxsKHVuaXF1ZShkJHNsZWVwX2ltcGFjdGVkKSAlaW4lIGMoMCwgMSkpKSB7DQogIGQkU2xlZXBDbGVhciA8LSBmYWN0b3IoZCRzbGVlcF9pbXBhY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyBi4buLIOG6o25oIGjGsOG7n25nIiwgIkLhu4sg4bqjbmggaMaw4bufbmciKSkNCn0gZWxzZSB7DQogIGQkU2xlZXBDbGVhciA8LSBmYWN0b3IoZCRzbGVlcF9pbXBhY3RlZCkNCn0NCg0KIyBO4bq/dSBiZXZlcmFnZV9lbmVyZ3lfZHJpbmsgbMOgIFRSVUUvRkFMU0Ug4oaSIGfDoW4gbmjDo24gcsO1IHLDoG5nDQppZiAoYWxsKHVuaXF1ZShkJGJldmVyYWdlX2VuZXJneV9kcmluaykgJWluJSBjKFRSVUUsIEZBTFNFKSkpIHsNCiAgZCRFbmVyZ3lDbGVhciA8LSBmYWN0b3IoZCRiZXZlcmFnZV9lbmVyZ3lfZHJpbmssDQogICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoRkFMU0UsIFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJLaMO0bmcgdeG7kW5nIG7Eg25nIGzGsOG7o25nIiwgIkPDsyB14buRbmcgbsSDbmcgbMaw4bujbmciKSkNCn0gZWxzZSB7DQogIGQkRW5lcmd5Q2xlYXIgPC0gZmFjdG9yKGQkYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rKQ0KfQ0KDQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRIGNow6lvDQp0YWJsZV9zbGVlcF9lbmVyZ3kgPC0gdGFibGUoZCRTbGVlcENsZWFyLCBkJEVuZXJneUNsZWFyKQ0KDQojIEhp4buDbiB0aOG7iyBi4bqjbmcNCnByaW50KHRhYmxlX3NsZWVwX2VuZXJneSkNCg0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQojIExvYWQgZ2dwbG90Mg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IG5ow7NtDQpnZ3Bsb3QoZCwgYWVzKHggPSBTbGVlcENsZWFyLCBmaWxsID0gRW5lcmd5Q2xlYXIpKSArDQogIGdlb21fYmFyKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBnZW9tX3RleHQoc3RhdCA9ICJjb3VudCIsIGFlcyhsYWJlbCA9IC4uY291bnQuLiksDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgDQogICAgICAgICAgICB2anVzdCA9IC0wLjMsIGNvbG9yID0gImJsYWNrIiwgc2l6ZSA9IDQpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgY+G7mXQgbmjDs206IOG6om5oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyB2w6AgdGjDs2kgcXVlbiB14buRbmcgbsaw4bubYyB0xINuZyBs4buxYyIsDQogICAgICAgeCA9ICJHaeG6pWMgbmfhu6cgYuG7iyDhuqNuaCBoxrDhu59uZyBi4bufaSBjYWZmZWluZSIsDQogICAgICAgeSA9ICJT4buRIGzGsOG7o25nIG5nxrDhu51pIHRoYW0gZ2lhIiwNCiAgICAgICBmaWxsID0gIlXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCg0KYGBgDQoNCioqTmjhuq1uIHjDqXQqKg0KDQpCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSB0cm9uZyBuaMOzbSBjw7MgdeG7kW5nIG7GsOG7m2MgdMSDbmcgbOG7sWMsIHPhu5EgbmfGsOG7nWkgYuG7iyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nhuqVjIG5n4bunICgzMCBuZ8aw4budaSkgY2hp4bq/bSA2NCUgY2FvIGjGoW4gxJHDoW5nIGvhu4Mgc28gduG7m2kgc+G7kSBuZ8aw4budaSBraMO0bmcgYuG7iyDhuqNuaCBoxrDhu59uZyAoMTcgbmfGsOG7nWkpIGNoaeG6v20gMzYlLiBOZ8aw4bujYyBs4bqhaSwg4bufIG5ow7NtIGtow7RuZyB14buRbmcgbsaw4bubYyB0xINuZyBs4buxYywgcGjhuqduIGzhu5tuIG5nxrDhu51pIHRoYW0gZ2lhIGtow7RuZyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7py4gTeG6t2MgZMO5IHThu7cgbOG7hyBuZ8aw4budaSBz4butIGThu6VuZyBuxrDhu5tjIHTEg25nIGzhu7FjIHRo4bqlcCwgbmjGsG5nIGvhur90IHF14bqjIGNobyB0aOG6pXkgaOG7jSBjw7Mgbmd1eSBjxqEgYuG7iyBy4buRaSBsb+G6oW4gZ2nhuqVjIG5n4bunIGNhbyBoxqFuLCBwaOG6o24gw6FuaCBt4buRaSBsacOqbiBo4buHIMSRw6FuZyBjaMO6IMO9IGdp4buvYSB0aMOzaSBxdWVuIHPhu60gZOG7pW5nIG7GsOG7m2MgdMSDbmcgbOG7sWMgdsOgIGNo4bqldCBsxrDhu6NuZyBnaeG6pWMgbmfhu6cuDQoNCiMjIyBCaeG6v24gc2xlZXBfaW1wYWN0ZWQgdsOgIGJldmVyYWdlX3RlYQ0KDQoqKkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIHbDoCB04bqnbiBzdeG6pXQqKg0KYGBge3J9DQojIEtp4buDbSB0cmEgY8OhYyBnacOhIHRy4buLIGfhu5FjIGPhu6dhIGJp4bq/biBzbGVlcF9pbXBhY3RlZA0KdW5pcXVlKGQkc2xlZXBfaW1wYWN0ZWQpDQoNCiMgS2nhu4NtIHRyYSBjw6FjIGdpw6EgdHLhu4sgZ+G7kWMgY+G7p2EgYmnhur9uIGJldmVyYWdlX3RlYQ0KdW5pcXVlKGQkYmV2ZXJhZ2VfdGVhKQ0KDQpgYGANCg0KYGBge3J9DQojIE7hur91IHNsZWVwX2ltcGFjdGVkIMSRw6MgbMOgIDAgdsOgIDEg4oaSIGfDoW4gbmjDo24gcsO1IHLDoG5nDQppZiAoYWxsKHVuaXF1ZShkJHNsZWVwX2ltcGFjdGVkKSAlaW4lIGMoMCwgMSkpKSB7DQogIGQkU2xlZXBDbGVhciA8LSBmYWN0b3IoZCRzbGVlcF9pbXBhY3RlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKDAsIDEpLA0KICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyBi4buLIOG6o25oIGjGsOG7n25nIiwgIkLhu4sg4bqjbmggaMaw4bufbmciKSkNCn0gZWxzZSB7DQogIGQkU2xlZXBDbGVhciA8LSBmYWN0b3IoZCRzbGVlcF9pbXBhY3RlZCkNCn0NCg0KIyBO4bq/dSBiZXZlcmFnZV90ZWEgbMOgIFRSVUUvRkFMU0Ug4oaSIGfDoW4gbmjDo24gcsO1IHLDoG5nDQppZiAoYWxsKHVuaXF1ZShkJGJldmVyYWdlX3RlYSkgJWluJSBjKFRSVUUsIEZBTFNFKSkpIHsNCiAgZCRUZWFDbGVhciA8LSBmYWN0b3IoZCRiZXZlcmFnZV90ZWEsDQogICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoRkFMU0UsIFRSVUUpLA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJLaMO0bmcgdeG7kW5nIHRyw6AiLCAiQ8OzIHXhu5FuZyB0csOgIikpDQp9IGVsc2Ugew0KICBkJFRlYUNsZWFyIDwtIGZhY3RvcihkJGJldmVyYWdlX3RlYSkNCn0NCg0KIyBU4bqhbyBi4bqjbmcgdOG6p24gc+G7kSBjaMOpbw0KdGFibGVfc2xlZXBfdGVhIDwtIHRhYmxlKGQkU2xlZXBDbGVhciwgZCRUZWFDbGVhcikNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nDQpwcmludCh0YWJsZV9zbGVlcF90ZWEpDQoNCmBgYA0KDQoqKkJp4buDdSDEkeG7kyoqIA0KDQpgYGB7cn0NCiMgTG9hZCBnZ3Bsb3QyDQpsaWJyYXJ5KGdncGxvdDIpDQoNCiMgVuG6vSBiaeG7g3UgxJHhu5MgY+G7mXQgbmjDs20NCmdncGxvdChkLCBhZXMoeCA9IFNsZWVwQ2xlYXIsIGZpbGwgPSBUZWFDbGVhcikpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwgYWVzKGxhYmVsID0gLi5jb3VudC4uKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgY29sb3IgPSAiYmxhY2siLCBzaXplID0gNCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCBuaMOzbTog4bqibmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIHbDoCB0aMOzaSBxdWVuIHXhu5FuZyB0csOgIiwNCiAgICAgICB4ID0gIkdp4bqlYyBuZ+G7pyBi4buLIOG6o25oIGjGsOG7n25nIGLhu59pIGNhZmZlaW5lIiwNCiAgICAgICB5ID0gIlPhu5EgbMaw4bujbmcgbmfGsOG7nWkgdGhhbSBnaWEiLA0KICAgICAgIGZpbGwgPSAiVeG7kW5nIHRyw6AiKSArDQogIHRoZW1lX21pbmltYWwoKQ0KDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCkJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IHRyb25nIG5ow7NtIHXhu5FuZyB0csOgLCBwaOG6p24gbOG7m24gbmfGsOG7nWkgdGhhbSBnaWEga2jDtG5nIGLhu4sg4bqjbmggaMaw4bufbmcgxJHhur9uIGdp4bqlYyBuZ+G7pyAoMTU2IG5nxrDhu51pKSBjaGnhur9tIDgzJSwgY2jhu4kgY8OzIDMyIG5nxrDhu51pIGNoaeG6v20gMTclICBi4buLIOG6o25oIGjGsOG7n25nLiBOZ8aw4bujYyBs4bqhaSwg4bufIG5ow7NtIGtow7RuZyB14buRbmcgdHLDoCwgc+G7kSBuZ8aw4budaSBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyAoMTcxIG5nxrDhu51pKSBjaGnhur9tIDU1JSBs4bqhaSBjYW8gaMahbiBz4buRIG5nxrDhu51pIGtow7RuZyBi4buLIOG6o25oIGjGsOG7n25nICgxNDEgbmfGsOG7nWkgKSBjaGnhur9tIDQ1JS4gIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG5o4buvbmcgbmfGsOG7nWkgY8OzIHRow7NpIHF1ZW4gdeG7kW5nIHRyw6AgZMaw4budbmcgbmjGsCDDrXQgYuG7iyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nhuqVjIG5n4bunIGjGoW4sIHNvIHbhu5tpIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIHXhu5FuZy4gDQoNCiMjIyBCaeG6v24gc2xlZXBfaW1wYWN0ZWQgdsOgIHRpbWVfb2ZfZGF5X2V2ZW5pbmcNCg0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSB2w6AgdOG6p24gc3XhuqV0KioNCg0KYGBge3J9DQojIEtp4buDbSB0cmEgY8OhYyBnacOhIHRy4buLIGfhu5FjIGPhu6dhIGJp4bq/biBzbGVlcF9pbXBhY3RlZA0KdW5pcXVlKGQkc2xlZXBfaW1wYWN0ZWQpDQoNCiMgS2nhu4NtIHRyYSBjw6FjIGdpw6EgdHLhu4sgZ+G7kWMgY+G7p2EgYmnhur9uIHRpbWVfb2ZfZGF5X2V2ZW5pbmcNCnVuaXF1ZShkJHRpbWVfb2ZfZGF5X2V2ZW5pbmcpDQoNCmBgYA0KDQpgYGB7cn0NCiMgR8OhbiBuaMOjbiByw7UgcsOgbmcgY2hvIGJp4bq/biBzbGVlcF9pbXBhY3RlZA0KaWYgKGFsbCh1bmlxdWUoZCRzbGVlcF9pbXBhY3RlZCkgJWluJSBjKDAsIDEpKSkgew0KICBkJFNsZWVwQ2xlYXIgPC0gZmFjdG9yKGQkc2xlZXBfaW1wYWN0ZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygwLCAxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJLaMO0bmcgYuG7iyDhuqNuaCBoxrDhu59uZyIsICJC4buLIOG6o25oIGjGsOG7n25nIikpDQp9IGVsc2Ugew0KICBkJFNsZWVwQ2xlYXIgPC0gZmFjdG9yKGQkc2xlZXBfaW1wYWN0ZWQpDQp9DQoNCiMgR8OhbiBuaMOjbiByw7UgcsOgbmcgY2hvIGJp4bq/biB0aW1lX29mX2RheV9ldmVuaW5nDQppZiAoYWxsKHVuaXF1ZShkJHRpbWVfb2ZfZGF5X2V2ZW5pbmcpICVpbiUgYyhUUlVFLCBGQUxTRSkpKSB7DQogIGQkRXZlbmluZ0NsZWFyIDwtIGZhY3RvcihkJHRpbWVfb2ZfZGF5X2V2ZW5pbmcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKEZBTFNFLCBUUlVFKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIktow7RuZyBideG7lWkgdOG7kWkiLCAiQnXhu5VpIHThu5FpIikpDQp9IGVsc2Ugew0KICBkJEV2ZW5pbmdDbGVhciA8LSBmYWN0b3IoZCR0aW1lX29mX2RheV9ldmVuaW5nKQ0KfQ0KDQojIFThuqFvIGLhuqNuZyB04bqnbiBz4buRIGNow6lvDQp0YWJsZV9zbGVlcF9ldmVuaW5nIDwtIHRhYmxlKGQkU2xlZXBDbGVhciwgZCRFdmVuaW5nQ2xlYXIpDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZw0KcHJpbnQodGFibGVfc2xlZXBfZXZlbmluZykNCg0KYGBgDQoNCioqQmnhu4N1IMSR4buTKioNCg0KYGBge3J9DQojIExvYWQgZ2dwbG90Mg0KbGlicmFyeShnZ3Bsb3QyKQ0KDQojIFbhur0gYmnhu4N1IMSR4buTIGPhu5l0IG5ow7NtOiBzbGVlcF9pbXBhY3RlZCB2cy4gdGltZV9vZl9kYXlfZXZlbmluZw0KZ2dwbG90KGQsIGFlcyh4ID0gU2xlZXBDbGVhciwgZmlsbCA9IEV2ZW5pbmdDbGVhcikpICsNCiAgZ2VvbV9iYXIocG9zaXRpb24gPSAiZG9kZ2UiKSArDQogIGdlb21fdGV4dChzdGF0ID0gImNvdW50IiwgYWVzKGxhYmVsID0gLi5jb3VudC4uKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpLCANCiAgICAgICAgICAgIHZqdXN0ID0gLTAuMywgY29sb3IgPSAiYmxhY2siLCBzaXplID0gNCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyBj4buZdCBuaMOzbTog4bqibmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIHbDoCB0aOG7nWkgxJFp4buDbSBz4butIGThu6VuZyBideG7lWkgdOG7kWkiLA0KICAgICAgIHggPSAiR2nhuqVjIG5n4bunIGLhu4sg4bqjbmggaMaw4bufbmcgYuG7n2kgY2FmZmVpbmUiLA0KICAgICAgIHkgPSAiU+G7kSBsxrDhu6NuZyBuZ8aw4budaSB0aGFtIGdpYSIsDQogICAgICAgZmlsbCA9ICJUaOG7nWkgxJFp4buDbSBz4butIGThu6VuZyAoYnXhu5VpIHThu5FpKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KKipOaOG6rW4geMOpdCoqDQoNCkJp4buDdSDEkeG7kyBj4buZdCBuaMOzbSBjaG8gdGjhuqV5IHPhu5EgbMaw4bujbmcgbmfGsOG7nWkga2jDtG5nIHPhu60gZOG7pW5nIGNhZmZlaW5lIHbDoG8gYnXhu5VpIHThu5FpIGNoaeG6v20gxrB1IHRo4bq/IHRyb25nIGPhuqMgaGFpIG5ow7NtIGdp4bqlYyBuZ+G7pzogMjUwIG5nxrDhu51pIGtow7RuZyBi4buLIOG6o25oIGjGsOG7n25nIGNoaeG6v20gNjEsNSUgdsOgIDE1NiBuZ8aw4budaSBi4buLIOG6o25oIGjGsOG7n25nIGNoaeG6v20gMzgsNSUuIE5nxrDhu6NjIGzhuqFpLCBz4buRIG5nxrDhu51pIHPhu60gZOG7pW5nIHbDoG8gYnXhu5VpIHThu5FpIGzDoCB0xrDGoW5nIMSRxrDGoW5nIOG7nyBj4bqjIGhhaSBuaMOzbSAoY8O5bmcgNDcgbmfGsOG7nWkpLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSB0aOG7nWkgxJFp4buDbSBz4butIGThu6VuZyBjYWZmZWluZSB2w6BvIGJ14buVaSB04buRaSBraMO0bmcga2jDoWMgYmnhu4d0IHLDtSBy4buHdCBnaeG7r2Egbmjhu69uZyBuZ8aw4budaSBi4buLIOG6o25oIGjGsOG7n25nIHbDoCBraMO0bmcgYuG7iyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nhuqVjIG5n4bunLiBUdXkgbmhpw6puLCB2aeG7h2MgY8OzIMOtdCBuZ8aw4budaSBz4butIGThu6VuZyBjYWZmZWluZSB2w6BvIGJ14buVaSB04buRaSB0cm9uZyBuaMOzbSBraMO0bmcgYuG7iyDhuqNuaCBoxrDhu59uZyBjw7MgdGjhu4MgZ+G7o2kgw70gcuG6sW5nIHPhu60gZOG7pW5nIGNhZmZlaW5lIHbDoG8gYnXhu5VpIHThu5FpIGPDsyBraOG6oyBuxINuZyBnw7NwIHBo4bqnbiBsw6BtIHTEg25nIG5ndXkgY8ahIHLhu5FpIGxv4bqhbiBnaeG6pWMgbmfhu6cuIE5o4bqtbiDEkeG7i25oIG7DoHkgY+G6p24gxJHGsOG7o2Mga2nhu4NtIMSR4buLbmggdGjDqm0gYuG6sW5nIGPDoWMgcGjDom4gdMOtY2ggdGjhu5FuZyBrw6ogxJHhu4MgeMOhYyDEkeG7i25oIG3hu6ljIMSR4buZIMO9IG5naMSpYS4NCg0KIyMgUmlzayBSYXRpbyB2w6Aga2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIGNobyBSaXNrIFJhdGlvDQoNCiMjIyBCaeG6v24gc2xlZXBfaW1wYWN0ZWQgdsOgIGJldmVyYWdlX2NvZmZlZQ0KDQpUcm9uZyBwaMOibiB0w61jaCBuw6B5LCBjaMO6bmcgdMO0aSBtdeG7kW4gcGjDom4gdMOtY2ggZ2nhu69hICoqY2jhuqV0IGzGsOG7o25nIGdp4bqlYyBuZ+G7pyoqIChzbGVlcF9pbXBhY3RlZCkgdsOgICoqxJDhu5MgdeG7kW5nIGPDoCBwaMOqKiogKGJldmVyYWdlX2NvZmZlZSkuDQoNCioqQmnhur9uIHBo4bulIHRodeG7mWM6IHNsZWVwX2ltcGFjdGVkKioNCg0KSW1wYWN0ZWQgKELhu4sg4bqjbmggaMaw4bufbmcpOiBHacOhIHRy4buLIDEg4oCTIGNhZmZlaW5lIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nhuqVjIG5n4bunLg0KDQpOb3QgaW1wYWN0ZWQgKEtow7RuZyBi4buLIOG6o25oIGjGsOG7n25nKTogR2nDoSB0cuG7iyAwIOKAkyBjYWZmZWluZSBraMO0bmcg4bqjbmggaMaw4bufbmcgxJHhur9uIGdp4bqlYyBuZ+G7py4NCg0KxJDDonkgbMOgIGJp4bq/biDEkeG6p3UgcmEgxJHhu4MgcGjDom4gdMOtY2ggeGVtIGPDoWMgeeG6v3UgdOG7kSBraMOhYyAoxJHhurdjIGJp4buHdCBsw6AgbG/huqFpIMSR4buTIHXhu5FuZykgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBnaeG6pWMgbmfhu6cga2jDtG5nLg0KDQoqKkJp4bq/biDEkeG7mWMgbOG6rXA6IGJldmVyYWdlX2NvZmZlZSoqDQoNCkNvZmZlZSBkcmlua2VyIChDw7MgdeG7kW5nIGPDoCBwaMOqKTogR2nDoSB0cuG7iyAxDQoNCk5vbi1jb2ZmZWUgZHJpbmtlciAoS2jDtG5nIHXhu5FuZyBjw6AgcGjDqik6IEdpw6EgdHLhu4sgMA0KDQrEkMOieSBsw6AgeeG6v3UgdOG7kSDEkeG6p3UgdsOgbywgxJHhu4MgeGVtIGxp4buHdSB2aeG7h2MgdeG7kW5nIGPDoCBwaMOqIGPDsyBsacOqbiBxdWFuIMSR4bq/biB2aeG7h2MgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgaGF5IGtow7RuZy4NCg0KKipCw6BpIHRvw6FuIGtp4buDbSDEkeG7i25oKiogDQoNCkjigoAgKE51bGwgSHlwb3RoZXNpcyk6IFJpc2sgUmF0aW8gPSAxDQrihpIgS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBnaeG7r2EgbmfGsOG7nWkgdeG7kW5nIGPDoCBwaMOqIHbDoCBraMO0bmcgdeG7kW5nIGPDoCBwaMOqLg0KDQpI4oKBIChBbHRlcm5hdGl2ZSBIeXBvdGhlc2lzKTogUmlzayBSYXRpbyDiiaAgMQ0K4oaSIEPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBnaeG7r2EgbmfGsOG7nWkgdeG7kW5nIGPDoCBwaMOqIHbDoCBraMO0bmcgdeG7kW5nIGPDoCBwaMOqLg0KDQpgYGB7cn0NCiMgQ8OgaSBnw7NpIG7hur91IGNoxrBhIGPDsw0KIyBpbnN0YWxsLnBhY2thZ2VzKCJlcGl0b29scyIpDQoNCmxpYnJhcnkoZXBpdG9vbHMpDQoNCiMgxJDhu41jIGThu68gbGnhu4d1DQpkYXRhIDwtIHJlYWQuY3N2KCJjYWZmZWluZV9pbnRha2VfdHJhY2tlci5jc3YiKQ0KDQojIFThuqFvIGLhuqNuZyBjaMOpbyBnaeG7r2Egc2xlZXBfaW1wYWN0ZWQgdsOgIGJldmVyYWdlX2NvZmZlZQ0KdGJsX3NsZWVwX2NvZmZlZSA8LSB0YWJsZSgNCiAgU2xlZXBJbXBhY3RlZCA9IGRhdGEkc2xlZXBfaW1wYWN0ZWQsDQogIENvZmZlZSA9IGRhdGEkYmV2ZXJhZ2VfY29mZmVlDQopDQoNCiMgSGnhu4NuIHRo4buLIGLhuqNuZyBjaMOpbyDEkeG7gyBraeG7g20gdHJhDQpwcmludCh0Ymxfc2xlZXBfY29mZmVlKQ0KDQojIFTDrW5oIFJpc2sgUmF0aW8NCnJpc2tyYXRpbyh0Ymxfc2xlZXBfY29mZmVlKQ0KDQpgYGANCioqTmjhuq1uIHjDqXQqKiANCg0KS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggY2hvIHRo4bqleSB04bu3IHPhu5Egbmd1eSBjxqEgKHJpc2sgcmF0aW8pIGdp4buvYSB2aeG7h2MgdeG7kW5nIGPDoCBwaMOqIHbDoCBraOG6oyBuxINuZyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBsw6AgMS42NiwgdsOgIHBfdmFsdWUgPCAwLDA1IHRhIGPDsyB0aOG7gyBr4bq/dCBsdeG6rW4gcuG6sW5nIHPhu7Ega2jDoWMgYmnhu4d0IGzDoCBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqLiDEkGnhu4F1IG7DoHkgxJHhu5NuZyBuZ2jEqWEgduG7m2kgdmnhu4djIG5o4buvbmcgbmfGsOG7nWkgdeG7kW5nIGPDoCBwaMOqIGPDsyBuZ3V5IGPGoSBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBjYW8gaMahbiA2NiUgc28gduG7m2kgbmjhu69uZyBuZ8aw4budaSBraMO0bmcgdeG7kW5nLg0KDQojIyMgQmnhur9uIHNsZWVwX2ltcGFjdGVkIHbDoCBiZXZlcmFnZV9lbmVyZ3lfZHJpbmsNCg0KVHJvbmcgcGjDom4gdMOtY2ggbsOgeSwgY2jDum5nIHTDtGkgbXXhu5FuIHBow6JuIHTDrWNoIGdp4buvYSAqKmNo4bqldCBsxrDhu6NuZyBnaeG6pWMgbmfhu6cqKiAoc2xlZXBfaW1wYWN0ZWQpIHbDoCAqKsSQ4buTIHXhu5FuZyB0xINuZyBs4buxYyoqIChiZXZlcmFnZV9lbmVyZ3lfZHJpbmspLg0KDQoqKkJp4bq/biBwaOG7pSB0aHXhu5ljOiBzbGVlcF9pbXBhY3RlZCoqDQoNCkltcGFjdGVkIChC4buLIOG6o25oIGjGsOG7n25nKTogR2nDoSB0cuG7iyAxIOKAkyBjYWZmZWluZSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGdp4bqlYyBuZ+G7py4NCg0KTm90IGltcGFjdGVkIChLaMO0bmcgYuG7iyDhuqNuaCBoxrDhu59uZyk6IEdpw6EgdHLhu4sgMCDigJMgY2FmZmVpbmUga2jDtG5nIOG6o25oIGjGsOG7n25nIMSR4bq/biBnaeG6pWMgbmfhu6cuDQoNCsSQw6J5IGzDoCBiaeG6v24gxJHhuqd1IHJhIMSR4buDIHBow6JuIHTDrWNoIHhlbSBjw6FjIHnhur91IHThu5Ega2jDoWMgKMSR4bq3YyBiaeG7h3QgbMOgIGxv4bqhaSDEkeG7kyB14buRbmcpIGPDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nhuqVjIG5n4bunIGtow7RuZy4NCg0KKipCaeG6v24gxJHhu5ljIGzhuq1wKioNCg0KQmnhur9uIMSR4buZYyBs4bqtcDogYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rIA0KRW5lcmd5IERyaW5rIENvbnN1bWVyIChDw7MgdeG7kW5nKTogR2nDoSB0cuG7iyAxDQoNCk5vbi1Db25zdW1lciAoS2jDtG5nIHXhu5FuZyk6IEdpw6EgdHLhu4sgMA0KDQrEkMOieSBsw6AgeeG6v3UgdOG7kSDEkeG6p3UgdsOgby4gTeG7pWMgdGnDqnUgbMOgIGtp4buDbSB0cmEgeGVtIG5ow7NtIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIGPDsyB04buJIGzhu4cgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cga2jDoWMgYmnhu4d0IMSRw6FuZyBr4buDIHNvIHbhu5tpIG5ow7NtIGtow7RuZyB14buRbmcgaGF5IGtow7RuZy4NCg0KKipCw6BpIHRvw6FuIGtp4buDbSDEkeG7i25oKioNCg0KSOKCgCAoTnVsbCBIeXBvdGhlc2lzKTogUmlzayBSYXRpbyA9IDENCuKGkiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIGdp4buvYSBuZ8aw4budaSB14buRbmcgbsaw4bubYyB0xINuZyBs4buxYyB2w6AgbmfGsOG7nWkga2jDtG5nIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjLg0KDQpI4oKBIChBbHRlcm5hdGl2ZSBIeXBvdGhlc2lzKTogUmlzayBSYXRpbyDiiaAgMQ0K4oaSIEPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBnaeG7r2EgbmfGsOG7nWkgdeG7kW5nIG7GsOG7m2MgdMSDbmcgbOG7sWMgdsOgIG5nxrDhu51pIGtow7RuZyB14buRbmcgbsaw4bubYyB0xINuZyBs4buxYy4NCg0KYGBge3J9DQojIEPDoGkgxJHhurd0IGfDs2kgbuG6v3UgY2jGsGEgY8OzDQojIGluc3RhbGwucGFja2FnZXMoImVwaXRvb2xzIikNCg0KbGlicmFyeShlcGl0b29scykNCg0KIyDEkOG7jWMgZOG7ryBsaeG7h3UgdOG7qyBmaWxlIENTVg0KZGF0YSA8LSByZWFkLmNzdigiY2FmZmVpbmVfaW50YWtlX3RyYWNrZXIuY3N2IikNCg0KIyBU4bqhbyBi4bqjbmcgY2jDqW8gZ2nhu69hIHNsZWVwX2ltcGFjdGVkIHbDoCBiZXZlcmFnZV9lbmVyZ3lfZHJpbmsNCnRibF9zbGVlcF9lbmVyZ3kgPC0gdGFibGUoDQogIFNsZWVwSW1wYWN0ZWQgPSBkYXRhJHNsZWVwX2ltcGFjdGVkLA0KICBFbmVyZ3lEcmluayA9IGRhdGEkYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rDQopDQoNCiMgSW4gYuG6o25nIGNow6lvIMSR4buDIGtp4buDbSB0cmENCnByaW50KHRibF9zbGVlcF9lbmVyZ3kpDQoNCiMgVMOtbmggUmlzayBSYXRpbw0Kcmlza3JhdGlvKHRibF9zbGVlcF9lbmVyZ3kpDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KiogDQoNCkvhur90IHF14bqjIHBow6JuIHTDrWNoIGNobyB0aOG6pXkgdOG7tyBz4buRIG5ndXkgY8ahIChyaXNrIHJhdGlvKSBnaeG7r2Egdmnhu4djIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIHbDoCBraOG6oyBuxINuZyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBsw6AgMiw1NiB2w6AgcF92YWx1ZSA8IDAsMDUgdGEgY8OzIHRo4buDIGvhur90IGx14bqtbiBy4bqxbmcgc+G7sSBraMOhYyBiaeG7h3QgbMOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ouIMSQaeG7gXUgbsOgeSDEkeG7k25nIG5naMSpYSB24bubaSB2aeG7h2Mgbmjhu69uZyBuZ8aw4budaSB14buRbmcgbsaw4bubYyB0xINuZyBs4buxYyBjw7Mgbmd1eSBjxqEgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgY2FvIGjGoW4ga2hv4bqjbmcgMiw2IGzhuqduICBzbyB24bubaSBuaOG7r25nIG5nxrDhu51pIGtow7RuZyB14buRbmcuDQoNCiMjIyBCaeG6v24gc2xlZXBfaW1wYWN0ZWQgdsOgIGJldmVyYWdlX3RlYQ0KDQpUcm9uZyBwaMOibiB0w61jaCBuw6B5LCBjaMO6bmcgdMO0aSBtdeG7kW4gcGjDom4gdMOtY2ggZ2nhu69hICoqY2jhuqV0IGzGsOG7o25nIGdp4bqlYyBuZ+G7pyoqIChzbGVlcF9pbXBhY3RlZCkgdsOgICoqxJDhu5MgdeG7kW5nIHRyw6AqKiAoYmV2ZXJhZ2VfdGVhKS4NCg0KKipCaeG6v24gcGjhu6UgdGh14buZYzogc2xlZXBfaW1wYWN0ZWQqKg0KDQpJbXBhY3RlZCAoQuG7iyDhuqNuaCBoxrDhu59uZyk6IEdpw6EgdHLhu4sgMSDigJMgY2FmZmVpbmUgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBnaeG6pWMgbmfhu6cuDQoNCk5vdCBpbXBhY3RlZCAoS2jDtG5nIGLhu4sg4bqjbmggaMaw4bufbmcpOiBHacOhIHRy4buLIDAg4oCTIGNhZmZlaW5lIGtow7RuZyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nhuqVjIG5n4bunLg0KDQrEkMOieSBsw6AgYmnhur9uIMSR4bqndSByYSDEkeG7gyBwaMOibiB0w61jaCB4ZW0gY8OhYyB54bq/dSB04buRIGtow6FjICjEkeG6t2MgYmnhu4d0IGzDoCBsb+G6oWkgxJHhu5MgdeG7kW5nKSBjw7Mg4bqjbmggaMaw4bufbmcgxJHhur9uIGdp4bqlYyBuZ+G7pyBraMO0bmcuDQoNCioqQmnhur9uIMSR4buZYyBs4bqtcCoqDQoNClRlYSBDb25zdW1lciAoQ8OzIHXhu5FuZyB0csOgKTogR2nDoSB0cuG7iyAxDQoNCk5vbi1Db25zdW1lciAoS2jDtG5nIHXhu5FuZyB0csOgKTogR2nDoSB0cuG7iyAwDQoNCsSQw6J5IGzDoCBiaeG6v24gxJHhuqd1IHbDoG8uIE3hu6VjIHRpw6p1IGzDoCBraeG7g20gdHJhIHhlbSBuaMOzbSB14buRbmcgdHLDoCBjw7MgdOG7tyBs4buHIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIGNhbyBoxqFuIGhv4bq3YyB0aOG6pXAgaMahbiBzbyB24bubaSBuaMOzbSBraMO0bmcgdeG7kW5nIHRyw6AgaGF5IGtow7RuZy4NCg0KKipCw6BpIHRvw6FuIGtp4buDbSDEkeG7i25oKiogDQoNCkjigoAgKE51bGwgSHlwb3RoZXNpcyk6IFJpc2sgUmF0aW8gPSAxDQrihpIgS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIHThu7cgbOG7hyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBnaeG7r2EgbmfGsOG7nWkgdeG7kW5nIHRyw6AgdsOgIG5nxrDhu51pIGtow7RuZyB14buRbmcgdHLDoC4NCg0KSOKCgSAoQWx0ZXJuYXRpdmUgSHlwb3RoZXNpcyk6IFJpc2sgUmF0aW8g4omgIDENCuKGkiBDw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgZ2nhu69hIG5nxrDhu51pIHXhu5FuZyB0csOgIHbDoCBuZ8aw4budaSBraMO0bmcgdeG7kW5nIHRyw6AuDQoNCmBgYHtyfQ0KIyBpbnN0YWxsLnBhY2thZ2VzKCJlcGl0b29scyIpICMgQ2jhuqF5IG7hur91IGLhuqFuIGNoxrBhIGPDoGkgdGjGsCB2aeG7h24NCmxpYnJhcnkoZXBpdG9vbHMpDQoNCiMgQuG6o25nIGNow6lvIDJ4Mjogc2xlZXBfaW1wYWN0ZWQgKFllcyAvIE5vKSB2cyBiZXZlcmFnZV90ZWEgKFllcyAvIE5vKQ0KdGJsX3NsZWVwX3RlYSA8LSBtYXRyaXgoYygNCiAgMzIsIDE3MSwgICAjIHNsZWVwX2ltcGFjdGVkID0gMTogQ8OzIOG6o25oIGjGsOG7n25nDQogIDE1NiwgMTQxICAgIyBzbGVlcF9pbXBhY3RlZCA9IDA6IEtow7RuZyDhuqNuaCBoxrDhu59uZw0KKSwNCm5yb3cgPSAyLA0KYnlyb3cgPSBUUlVFLA0KZGltbmFtZXMgPSBsaXN0KA0KICBTbGVlcEltcGFjdGVkID0gYygiWWVzIiwgIk5vIiksDQogIFRlYSA9IGMoIlllcyIsICJObyIpDQopKQ0KDQojIFTDrW5oIFJpc2sgUmF0aW8NCnJpc2tyYXRpbyh0Ymxfc2xlZXBfdGVhKQ0KDQpgYGANCg0KKipOaOG6rW4geMOpdCoqIA0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaG8gdGjhuqV5IHThu7cgc+G7kSBuZ3V5IGPGoSAocmlzayByYXRpbykgZ2nhu69hIHZp4buHYyB14buRbmcgdHLDoCB2w6Aga2jhuqMgbsSDbmcgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgbMOgIDAuNTYsIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUgdOG7qyAwLjQ5IMSR4bq/biAwLjY0LiBLaG/huqNuZyBuw6B5IG7hurFtIGhvw6BuIHRvw6BuIGTGsOG7m2kgMSB2w6AgY8OhYyBwLXZhbHVlIMSR4buBdSBn4bqnbiBi4bqxbmcgMCwgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCBsw6AgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiBy4bqldCBjYW8uIMSQaeG7gXUgbsOgeSDEkeG7k25nIG5naMSpYSB24bubaSB2aeG7h2MgbmfGsOG7nWkgdeG7kW5nIHRyw6AgY8OzIG5ndXkgY8ahIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIHRo4bqlcCBoxqFuIGtob+G6o25nIDQ0JSBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgdeG7kW5nLCBjaG8gdGjhuqV5IHRyw6Aga2jDtG5nIG5o4buvbmcga2jDtG5nIGfDonkgaOG6oWkgbcOgIGPDsm4gY8OzIHRo4buDIGxpw6puIHF1YW4gxJHhur9uIGdp4bqlYyBuZ+G7pyB04buRdCBoxqFuDQoNCiMjIyBCaeG6v24gc2xlZXBfaW1wYWN0ZWQgdsOgIHRpbWVfb2ZfZGF5X2V2ZW5pbmcNCg0KKipCw6BpIHRvw6FuIGtp4buDbSDEkeG7i25oKioNCg0KSOKCgCAoR2nhuqMgdGh1eeG6v3Qga2jDtG5nIOKAkyBOdWxsIEh5cG90aGVzaXMpOg0KUmlzayBSYXRpbyA9IDENCuKGkiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIGdp4bqlYyBuZ+G7pyBi4buLIOG6o25oIGjGsOG7n25nIGdp4buvYSBuaOG7r25nIG5nxrDhu51pIHPhu60gZOG7pW5nIGNhZmZlaW5lIHbDoG8gYnXhu5VpIHThu5FpIHbDoCBuaOG7r25nIG5nxrDhu51pIGtow7RuZyBz4butIGThu6VuZy4NCg0KSOKCgSAoR2nhuqMgdGh1eeG6v3QgxJHhu5FpIOKAkyBBbHRlcm5hdGl2ZSBIeXBvdGhlc2lzKToNClJpc2sgUmF0aW8g4omgIDENCuKGkiBDw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgZ2nhuqVjIG5n4bunIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhu69hIG5o4buvbmcgbmfGsOG7nWkgc+G7rSBk4bulbmcgY2FmZmVpbmUgdsOgbyBideG7lWkgdOG7kWkgdsOgIG5o4buvbmcgbmfGsOG7nWkga2jDtG5nIHPhu60gZOG7pW5nLg0KDQpgYGB7cn0NCiMgaW5zdGFsbC5wYWNrYWdlcygiZXBpdG9vbHMiKSAjIENo4bqheSBu4bq/dSBi4bqhbiBjaMawYSBjw6BpIHRoxrAgdmnhu4duDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KDQojIELhuqNuZyBjaMOpbyAyeDI6IHNsZWVwX2ltcGFjdGVkIChZZXMgLyBObykgdnMgdGltZV9vZl9kYXlfZXZlbmluZyAoWWVzIC8gTm8pDQp0Ymxfc2xlZXBfZXZlbmluZyA8LSBtYXRyaXgoYygNCiAgNDcsIDE1NiwgICAjIHNsZWVwX2ltcGFjdGVkID0gMTogQ8OzIOG6o25oIGjGsOG7n25nDQogIDQ3LCAyNTAgICAgIyBzbGVlcF9pbXBhY3RlZCA9IDA6IEtow7RuZyDhuqNuaCBoxrDhu59uZw0KKSwNCm5yb3cgPSAyLA0KYnlyb3cgPSBUUlVFLA0KZGltbmFtZXMgPSBsaXN0KA0KICBTbGVlcEltcGFjdGVkID0gYygiWWVzIiwgIk5vIiksDQogIEV2ZW5pbmcgPSBjKCJZZXMiLCAiTm8iKQ0KKSkNCg0KIyBUw61uaCBSaXNrIFJhdGlvDQpyaXNrcmF0aW8odGJsX3NsZWVwX2V2ZW5pbmcpDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KUGjDom4gdMOtY2ggUmlzayBSYXRpbyBjaG8gdGjhuqV5IG5nxrDhu51pIGTDuW5nIGNhZmZlaW5lIHbDoG8gYnXhu5VpIHThu5FpIGPDsyBuZ3V5IGPGoSBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBjYW8gaMahbiA5LjUlIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBkw7luZyAoUlIgPSAxLjA5NTsgcCA9IDAuMDQxOCkuIFPhu7Ega2jDoWMgYmnhu4d0IG7DoHkgY8OzIMO9IG5naMSpYSB0aOG7kW5nIGvDqiwgY2hvIHRo4bqleSB0aOG7nWkgxJFp4buDbSBz4butIGThu6VuZyBjYWZmZWluZSAoYnXhu5VpIHThu5FpKSBjw7MgbGnDqm4gcXVhbiDEkeG6v24gdMOsbmggdHLhuqFuZyBt4bqldCBuZ+G7py4NCg0KIyMgT2RkcyByYXRpbyB2w6Aga2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIGNobyBPZGRzIHJhdGlvDQoNCiMjIyBCaeG6v24gc2xlZXBfaW1wYWN0ZWQgdsOgIGJldmVyYWdlX2NvZmZlZSANCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaCoqIA0KDQpI4oKAIChOdWxsIEh5cG90aGVzaXMpOiBPUiA9IDENCuKGkiBLaMO0bmcgY8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4Ega2jhuqMgbsSDbmcgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgZ2nhu69hIG5nxrDhu51pIHXhu5FuZyBjw6AgcGjDqiB2w6AgbmfGsOG7nWkga2jDtG5nIHXhu5FuZyBjw6AgcGjDqi4NCg0KSOKCgSAoQWx0ZXJuYXRpdmUgSHlwb3RoZXNpcyk6IE9SIOKJoCAxDQrihpIgQ8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4Ega2jhuqMgbsSDbmcgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgZ2nhu69hIG5nxrDhu51pIHXhu5FuZyBjw6AgcGjDqiB2w6AgbmfGsOG7nWkga2jDtG5nIHXhu5FuZyBjw6AgcGjDqi4gDQoNCmBgYHtyfQ0KIyBDw6BpIGfDs2kgbuG6v3UgY+G6p24NCiMgaW5zdGFsbC5wYWNrYWdlcygiZXBpdG9vbHMiKQ0KDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KDQojIELGsOG7m2MgMTogxJDhu41jIGThu68gbGnhu4d1DQpkYXRhIDwtIHJlYWQuY3N2KCJjYWZmZWluZV9pbnRha2VfdHJhY2tlci5jc3YiKQ0KDQojIELGsOG7m2MgMjogVOG6oW8gYuG6o25nIGNow6lvIDJ4Mg0KdGFiIDwtIHRhYmxlKGRhdGEkc2xlZXBfaW1wYWN0ZWQsIGRhdGEkYmV2ZXJhZ2VfY29mZmVlKQ0KDQojIMSQ4bq3dCBuaMOjbiBjaG8gYuG6o25nDQpjb2xuYW1lcyh0YWIpIDwtIGMoIk5vX0NvZmZlZSIsICJDb2ZmZWUiKQ0Kcm93bmFtZXModGFiKSA8LSBjKCJOb3RfSW1wYWN0ZWQiLCAiSW1wYWN0ZWQiKQ0KDQojIELGsOG7m2MgMzogVMOtbmggT2RkcyBSYXRpbyB24bubaSBraG/huqNuZyB0aW4gY+G6rXkgOTUlDQpvZGRzX3Jlc3VsdCA8LSBvZGRzcmF0aW8odGFiLCBjb25mLmxldmVsID0gMC45NSkNCg0KIyBIaeG7g24gdGjhu4sga+G6v3QgcXXhuqMNCnByaW50KG9kZHNfcmVzdWx0KQ0KDQpgYGANCg0KKipOaOG6rW4geMOpdCoqDQoNCkvhur90IHF14bqjIHBow6JuIHTDrWNoIGNobyB0aOG6pXkgb2RkcyByYXRpbyAodOG7tyBz4buRIG9kZHMpIGdp4buvYSB2aeG7h2MgdeG7kW5nIGPDoCBwaMOqIHbDoCBraOG6oyBuxINuZyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBsw6AgMy4xNiB2w6AgY8OhYyBwLXZhbHVlIMSR4buBdSBy4bqldCBuaOG7jyAocCA8IDAuMDAwMDAxKSwgY8OzIHRo4buDIGvhur90IGx14bqtbiBy4bqxbmcgbeG7kWkgbGnDqm4gaOG7hyBuw6B5IGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogY2FvLiBOw7NpIGPDoWNoIGtow6FjLCBuZ8aw4budaSB14buRbmcgY8OgIHBow6ogY8OzIG5ndXkgY8ahIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIGNhbyBn4bqlcCBoxqFuIDMgbOG6p24gc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHXhu5FuZyBjw6AgcGjDqi4gxJDDonkgbMOgIGLhurFuZyBjaOG7qW5nIG3huqFuaCBt4bq9IGNobyB0aOG6pXkgY8OgIHBow6ogbMOgIG3hu5l0IHnhur91IHThu5EgxJHDoW5nIGvhu4MgdHJvbmcgdmnhu4djIGzDoG0gc3V5IGdp4bqjbSBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunIGPhu6dhIG5nxrDhu51pIGTDuW5nIHRyb25nIGLhu5kgZOG7ryBsaeG7h3Uga2jhuqNvIHPDoXQuDQoNCiMjIyBCaeG6v24gc2xlZXBfaW1wYWN0ZWQgdsOgIGJldmVyYWdlX2VuZXJneV9kcmluaw0KDQoqKkdp4bqjIHRodXnhur90IGtp4buDbSDEkeG7i25oKiogDQoNCkjigoAgKEdp4bqjIHRodXnhur90IGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3Qg4oCTIE51bGwgSHlwb3RoZXNpcyk6IE9SID0gMQ0K4oaSIEtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgZ2nhu69hIG5nxrDhu51pIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIHbDoCBuZ8aw4budaSBraMO0bmcgdeG7kW5nIG7GsOG7m2MgdMSDbmcgbOG7sWMuDQoNCkjigoEgKEdp4bqjIHRodXnhur90IGPDsyBz4buxIGtow6FjIGJp4buHdCDigJMgQWx0ZXJuYXRpdmUgSHlwb3RoZXNpcyk6IE9SIOKJoCAxDQrihpIgQ8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIGdp4buvYSBuZ8aw4budaSB14buRbmcgbsaw4bubYyB0xINuZyBs4buxYyB2w6AgbmfGsOG7nWkga2jDtG5nIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjLg0KDQoNCmBgYHtyfQ0KIyBDw6BpIGfDs2kgbuG6v3UgY2jGsGEgY8OzDQojIGluc3RhbGwucGFja2FnZXMoImVwaXRvb2xzIikNCg0KbGlicmFyeShlcGl0b29scykNCg0KIyBCxrDhu5tjIDE6IMSQ4buNYyBk4buvIGxp4buHdQ0KZGF0YSA8LSByZWFkLmNzdigiY2FmZmVpbmVfaW50YWtlX3RyYWNrZXIuY3N2IikNCg0KIyBCxrDhu5tjIDI6IFThuqFvIGLhuqNuZyBjaMOpbyAyeDINCnRhYiA8LSB0YWJsZShkYXRhJHNsZWVwX2ltcGFjdGVkLCBkYXRhJGJldmVyYWdlX2VuZXJneV9kcmluaykNCg0KIyDEkOG6t3QgdMOqbiByw7UgcsOgbmcgY2hvIGLhuqNuZw0KY29sbmFtZXModGFiKSA8LSBjKCJOb19FbmVyZ3lEcmluayIsICJFbmVyZ3lEcmluayIpDQpyb3duYW1lcyh0YWIpIDwtIGMoIk5vdF9JbXBhY3RlZCIsICJJbXBhY3RlZCIpDQoNCiMgQsaw4bubYyAzOiBUw61uaCBPZGRzIFJhdGlvIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUNCm9kZHNfcmVzdWx0IDwtIG9kZHNyYXRpbyh0YWIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KDQojIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KcHJpbnQob2Rkc19yZXN1bHQpDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KS+G6v3QgcXXhuqMgcGjDom4gdMOtY2ggY2hvIHRo4bqleSBvZGRzIHJhdGlvIGdp4buvYSB2aeG7h2MgdeG7kW5nIG7GsOG7m2MgdMSDbmcgbOG7sWMgdsOgIGto4bqjIG7Eg25nIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIGzDoCAyLjg0IHbDoCBjw6FjIGdpw6EgdHLhu4sgcCDEkeG7gXUgbmjhu48gaMahbiAwLjAwMSwgY2hvIHRo4bqleSBt4buRaSBsacOqbiBo4buHIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogcsO1IHLhu4d0LiDEkGnhu4F1IG7DoHkgxJHhu5NuZyBuZ2jEqWEgduG7m2kgdmnhu4djIG5nxrDhu51pIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIGPDsyBuZ3V5IGPGoSBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBjYW8gZ+G6pXAgZ+G6p24gMyBs4bqnbiBzbyB24bubaSBuZ8aw4budaSBraMO0bmcgdeG7kW5nLiDEkMOieSBsw6AgYuG6sW5nIGNo4bupbmcgxJHDoW5nIHRpbiBj4bqteSBjaG8gdGjhuqV5IG7GsOG7m2MgdMSDbmcgbOG7sWMgbMOgIG3hu5l0IHnhur91IHThu5EgbGnDqm4gcXVhbiDEkcOhbmcga+G7gyDEkeG6v24gdMOsbmggdHLhuqFuZyBy4buRaSBsb+G6oW4gZ2nhuqVjIG5n4bunIHRyb25nIG5ow7NtIGto4bqjbyBzw6F0Lg0KDQojIyMgQmnhur9uIHNsZWVwX2ltcGFjdGVkIHbDoCBiZXZlcmFnZV90ZWENCg0KKipHaeG6oyB0aHV54bq/dCBraeG7g20gxJHhu4tuaCoqDQoNCkjigoAgKEdp4bqjIHRodXnhur90IGtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3Qg4oCTIE51bGwgSHlwb3RoZXNpcyk6IE9SID0gMQ0K4oaSIEtow7RuZyBjw7Mgc+G7sSBraMOhYyBiaeG7h3QgduG7gSB04bu3IGzhu4cgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgZ2nhu69hIG5nxrDhu51pIHXhu5FuZyB0csOgIHbDoCBuZ8aw4budaSBraMO0bmcgdeG7kW5nIHRyw6AuDQoNCkjigoEgKEdp4bqjIHRodXnhur90IGPDsyBz4buxIGtow6FjIGJp4buHdCDigJMgQWx0ZXJuYXRpdmUgSHlwb3RoZXNpcyk6IE9SIOKJoCAxDQrihpIgQ8OzIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgdOG7tyBs4buHIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIGdp4buvYSBuZ8aw4budaSB14buRbmcgdHLDoCB2w6AgbmfGsOG7nWkga2jDtG5nIHXhu5FuZyB0csOgLg0KDQpgYGB7cn0NCiMgQ8OgaSBnw7NpIG7hur91IGNoxrBhIGPDsw0KIyBpbnN0YWxsLnBhY2thZ2VzKCJlcGl0b29scyIpDQoNCmxpYnJhcnkoZXBpdG9vbHMpDQoNCiMgQsaw4bubYyAxOiDEkOG7jWMgZOG7ryBsaeG7h3UNCmRhdGEgPC0gcmVhZC5jc3YoImNhZmZlaW5lX2ludGFrZV90cmFja2VyLmNzdiIpDQoNCiMgQsaw4bubYyAyOiBU4bqhbyBi4bqjbmcgY2jDqW8gMngyIGdp4buvYSBzbGVlcF9pbXBhY3RlZCB2w6AgYmV2ZXJhZ2VfdGVhDQp0YWIgPC0gdGFibGUoZGF0YSRzbGVlcF9pbXBhY3RlZCwgZGF0YSRiZXZlcmFnZV90ZWEpDQoNCiMgQsaw4bubYyAzOiBH4bqvbiB0w6puIGThu4UgxJHhu41jIGNobyBi4bqjbmcNCmNvbG5hbWVzKHRhYikgPC0gYygiTm9fVGVhIiwgIlRlYSIpDQpyb3duYW1lcyh0YWIpIDwtIGMoIk5vdF9JbXBhY3RlZCIsICJJbXBhY3RlZCIpDQoNCiMgQsaw4bubYyA0OiBUw61uaCBPZGRzIFJhdGlvIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUNCm9kZHNfcmVzdWx0IDwtIG9kZHNyYXRpbyh0YWIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KDQojIELGsOG7m2MgNTogSW4ga+G6v3QgcXXhuqMNCnByaW50KG9kZHNfcmVzdWx0KQ0KDQpgYGANCg0KKipOaOG6rW4geMOpdCoqIA0KDQpL4bq/dCBxdeG6oyBwaMOibiB0w61jaCBjaG8gdGjhuqV5IG9kZHMgcmF0aW8gZ2nhu69hIHZp4buHYyB14buRbmcgdHLDoCB2w6Aga2jhuqMgbsSDbmcgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgbMOgIDAuMTcgdsOgIGPDoWMgcC12YWx1ZSBn4bqnbiBi4bqxbmcgMCwgdGEgY8OzIHRo4buDIGvhur90IGx14bqtbiBy4bqxbmcgbeG7kWkgbGnDqm4gaOG7hyBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHLhuqV0IGNhby4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkgbmfGsOG7nWkgdeG7kW5nIHRyw6AgY8OzIG5ndXkgY8ahIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIHRo4bqlcCBoxqFuIMSRw6FuZyBr4buDIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyB14buRbmcsIGPhu6UgdGjhu4MgbMOgIHRo4bqlcCBoxqFuIGtob+G6o25nIDgzJS4gS+G6v3QgcXXhuqMgbsOgeSBwaOG6o24gw6FuaCBy4bqxbmcgdHLDoCBjw7MgdGjhu4Mgw610IGfDonkg4bqjbmggaMaw4bufbmcgdGnDqnUgY+G7sWMgxJHhur9uIGdp4bqlYyBuZ+G7pywgdGjhuq1tIGNow60gY8OzIHRo4buDIGxpw6puIHF1YW4gxJHhur9uIGdp4bqlYyBuZ+G7pyB04buRdCBoxqFuIHRyb25nIG5ow7NtIGto4bqjbyBzw6F0Lg0KDQojIyMgQmnhur9uIHNsZWVwX2ltcGFjdGVkIHbDoCB0aW1lX29mX2RheV9ldmVuaW5nDQoNCioqR2nhuqMgdGh1eeG6v3Qga2nhu4NtIMSR4buLbmgqKg0KDQpI4oKAIChHaeG6oyB0aHV54bq/dCBraMO0bmcpOiBPZGRzIFJhdGlvIChPUikgPSAxDQrihpIgS2jDtG5nIGPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIGto4bqjIG7Eg25nIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIGdp4buvYSBuZ8aw4budaSB14buRbmcgY8OgIHBow6ogdsOgIG5nxrDhu51pIGtow7RuZyB14buRbmcgY8OgIHBow6ouDQoNCkjigoEgKEdp4bqjIHRodXnhur90IMSR4buRaSk6IE9kZHMgUmF0aW8gKE9SKSDiiaAgMQ0K4oaSIEPDsyBz4buxIGtow6FjIGJp4buHdCB24buBIGto4bqjIG7Eg25nIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIGdp4buvYSBuZ8aw4budaSB14buRbmcgY8OgIHBow6ogdsOgIG5nxrDhu51pIGtow7RuZyB14buRbmcgY8OgIHBow6ouDQoNCmBgYHtyfQ0KIyBDw6BpIGfDs2kgbuG6v3UgY+G6p24NCiMgaW5zdGFsbC5wYWNrYWdlcygiZXBpdG9vbHMiKQ0KDQpsaWJyYXJ5KGVwaXRvb2xzKQ0KDQojIELGsOG7m2MgMTogxJDhu41jIGThu68gbGnhu4d1DQpkYXRhIDwtIHJlYWQuY3N2KCJjYWZmZWluZV9pbnRha2VfdHJhY2tlci5jc3YiKQ0KDQojIELGsOG7m2MgMjogVOG6oW8gYuG6o25nIGNow6lvIDJ4MiBjaG8gc2xlZXBfaW1wYWN0ZWQgdsOgIHRpbWVfb2ZfZGF5X2V2ZW5pbmcNCnRhYiA8LSB0YWJsZShkYXRhJHNsZWVwX2ltcGFjdGVkLCBkYXRhJHRpbWVfb2ZfZGF5X2V2ZW5pbmcpDQoNCiMgxJDhurd0IG5ow6NuIGNobyBi4bqjbmcNCmNvbG5hbWVzKHRhYikgPC0gYygiTm90X0V2ZW5pbmciLCAiRXZlbmluZyIpDQpyb3duYW1lcyh0YWIpIDwtIGMoIk5vdF9JbXBhY3RlZCIsICJJbXBhY3RlZCIpDQoNCiMgQsaw4bubYyAzOiBUw61uaCBPZGRzIFJhdGlvIHbhu5tpIGtob+G6o25nIHRpbiBj4bqteSA5NSUNCm9kZHNfcmVzdWx0IDwtIG9kZHNyYXRpbyh0YWIsIGNvbmYubGV2ZWwgPSAwLjk1KQ0KDQojIEhp4buDbiB0aOG7iyBr4bq/dCBxdeG6ow0KcHJpbnQob2Rkc19yZXN1bHQpDQoNCmBgYA0KKipOaOG6rW4geMOpdCoqDQoNCkvhur90IHF14bqjIGNobyB0aOG6pXkgbmjhu69uZyBuZ8aw4budaSBz4butIGThu6VuZyBjYWZmZWluZSB2w6BvIGJ14buVaSB04buRaSBjw7Mga2jhuqMgbsSDbmcgYuG7iyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nhuqVjIG5n4bunIGNhbyBoxqFuIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyBz4butIGThu6VuZyB2w6BvIGJ14buVaSB04buRaSwgduG7m2kgb2RkcyByYXRpbyBsw6AgMS42MCAoQ0kgOTUlOiAxLjAy4oCTMi41MikuIE3hu5FpIGxpw6puIGjhu4cgbsOgeSBjw7Mgw70gbmdoxKlhIHRo4buRbmcga8OqIHbhu5tpIGdpw6EgdHLhu4sgcCBsw6AgMC4wNDE4Lg0KDQojIyBNw7QgaMOsbmggaOG7k2kgcXV5IGLhu5lpDQoNCjxoMiBzdHlsZT0iY29sb3I6IzFFOTBGRjsiPk3DtCBow6xuaCBMb2dpdDwvaDI+DQoNCmBgYHtyfQ0KDQojIELGsOG7m2MgMzogTcO0IGjDrG5oIGjhu5NpIHF1eSBsb2dpdCBi4buZaQ0KbW9kZWxfbG9naXRfbXVsdGkgPC0gZ2xtKA0KICBzbGVlcF9pbXBhY3RlZCB+IGJldmVyYWdlX2NvZmZlZSArIGJldmVyYWdlX2VuZXJneV9kcmluayArIHRpbWVfb2ZfZGF5X2V2ZW5pbmcsDQogIGRhdGEgPSBkLA0KICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikNCikNCg0KIyBCxrDhu5tjIDQ6IFhlbSBr4bq/dCBxdeG6ow0Kc3VtbWFyeShtb2RlbF9sb2dpdF9tdWx0aSkNCg0KYGBgDQoNCg0KYGBge3J9DQojIELGsOG7m2MgNTogQ2h1eeG7g24gaOG7hyBz4buRIHNhbmcgT2RkcyBSYXRpbyDEkeG7gyBk4buFIGRp4buFbiBnaeG6o2kNCmV4cChjb2VmKG1vZGVsX2xvZ2l0X211bHRpKSkNCg0KYGBgDQoqKk5o4bqtbiB4w6l0KioNCg0KIEvhur90IHF14bqjIG3DtCBow6xuaCBo4buTaSBxdXkgbG9naXN0aWMgY2hvIHRo4bqleSB2aeG7h2MgdGnDqnUgdGjhu6UgY8OgIHBow6osIG7GsOG7m2MgdMSDbmcgbOG7sWMgdsOgIHRo4budaSDEkWnhu4NtIHXhu5FuZyDEkeG7gXUgY8OzIOG6o25oIGjGsOG7n25nIMSR4bq/biBraOG6oyBuxINuZyBi4buLIHTDoWMgxJHhu5luZyB04bubaSBnaeG6pWMgbmfhu6cuIEPhu6UgdGjhu4MsIG5o4buvbmcgbmfGsOG7nWkgdeG7kW5nIGPDoCBwaMOqIGPDsyBraOG6oyBuxINuZyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBjYW8gaMahbiBraG/huqNuZyA1LDUgbOG6p24gc28gduG7m2kgbmfGsOG7nWkga2jDtG5nIHXhu5FuZyAozrIgPSAxLDcwMjksIHAgPCAwLDAwMSksIHRyb25nIGtoaSB2aeG7h2MgdeG7kW5nIG7GsOG7m2MgdMSDbmcgbOG7sWMgbMOgbSB0xINuZyBraOG6oyBuxINuZyBuw6B5IGfhuqduIDgsOCBs4bqnbiAozrIgPSAyLDE3MzYsIHAgPCAwLDAwMSkuIMSQw6J5IGzDoCBt4bupYyB0w6FjIMSR4buZbmcgbeG6oW5oIGjGoW4gY8OgIHBow6osIHBo4bqjbiDDoW5oIGjDoG0gbMaw4bujbmcgY2FmZmVpbmUgdsOgIMSRxrDhu51uZyBjYW8gdHJvbmcgbsaw4bubYyB0xINuZyBs4buxYyBjw7MgdGjhu4MgZ8OieSBrw61jaCB0aMOtY2ggdGjhuqduIGtpbmggbeG6oW5oIGjGoW4gdsOgIGvDqW8gZMOgaSB0aOG7nWkgZ2lhbiBraMOzIG5n4bunLiBV4buRbmcgxJHhu5MgdeG7kW5nIHbDoG8gYnXhu5VpIHThu5FpIGPFqW5nIGzDoG0gdMSDbmcga2jhuqMgbsSDbmcgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cga2hv4bqjbmcgNTklICjOsiA9IDAsNDYyNywgcCDiiYggMCwwNjQpIA0KDQoqKkvhur90IGx14bqtbioqDQoNCkvhur90IHF14bqjIGjhu5NpIHF1eSBsb2dpc3RpYyBi4buZaSBjaG8gdGjhuqV5IHZp4buHYyBz4butIGThu6VuZyBjw6AgcGjDqiB2w6Agbsaw4bubYyB0xINuZyBs4buxYyBjw7Mg4bqjbmggaMaw4bufbmcgcsO1IHLhu4d0IMSR4bq/biBraOG6oyBuxINuZyBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7py4gQ+G7pSB0aOG7gywgbmfGsOG7nWkgdeG7kW5nIGPDoCBwaMOqIGPDsyBuZ3V5IGPGoSBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBjYW8gZ+G6pXAga2hv4bqjbmcgNSw1IGzhuqduIHNvIHbhu5tpIG5nxrDhu51pIGtow7RuZyB14buRbmcsIHRyb25nIGtoaSBuZ8aw4budaSB14buRbmcgbsaw4bubYyB0xINuZyBs4buxYyBjw7Mgbmd1eSBjxqEgY2FvIGfhuqduIGfhuqVwIDkgbOG6p24uIE5nb8OgaSByYSwgdmnhu4djIHPhu60gZOG7pW5nIGNhZmZlaW5lIHbDoG8gYnXhu5VpIHThu5FpIGPFqW5nIGPDsyB4dSBoxrDhu5tuZyBsw6BtIHTEg25nIG5ndXkgY8ahIG3huqV0IG5n4bunLCB0dXkgbmhpw6puIG3hu5FpIGxpw6puIGjhu4cgbsOgeSBjaMawYSDEkeG6oXQgbeG7qWMgw70gbmdoxKlhIHRo4buRbmcga8OqIChwID0gMC4wNjM1KS4gTmjDrG4gY2h1bmcsIG3DtCBow6xuaCBjaG8gdGjhuqV5IGPDoWMgeeG6v3UgdOG7kSB0acOqdSB0aOG7pSBjYWZmZWluZSwgxJHhurdjIGJp4buHdCBsw6AgY8OgIHBow6ogdsOgIG7GsOG7m2MgdMSDbmcgbOG7sWMsIGzDoCBuaOG7r25nIHnhur91IHThu5EgcXVhbiB0cuG7jW5nIGxpw6puIHF1YW4gxJHhur9uIGNo4bqldCBsxrDhu6NuZyBnaeG6pWMgbmfhu6cuDQoNCjxoMiBzdHlsZT0iY29sb3I6IzFFOTBGRjsiPk3DtCBow6xuaCBQcm9iaXQ8L2gyPg0KDQpgYGB7cn0NCg0KDQojIELGsOG7m2MgMzogTcO0IGjDrG5oIGjhu5NpIHF1eSBwcm9iaXQgYuG7mWkNCm1vZGVsX3Byb2JpdF9tdWx0aSA8LSBnbG0oDQogIHNsZWVwX2ltcGFjdGVkIH4gYmV2ZXJhZ2VfY29mZmVlICsgYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rICsgdGltZV9vZl9kYXlfZXZlbmluZywNCiAgZGF0YSA9IGQsDQogIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikNCikNCg0KIyBCxrDhu5tjIDQ6IFhlbSBr4bq/dCBxdeG6ow0Kc3VtbWFyeShtb2RlbF9wcm9iaXRfbXVsdGkpDQoNCmBgYA0KDQpgYGB7cn0NCiMgQsaw4bubYyA1IChwcm9iaXQpOiDGr+G7m2MgbMaw4bujbmcgdMawxqFuZyDEkeG7kWkgKE9SIHThu6sgaOG7hyBz4buRIHByb2JpdCkNCmV4cChjb2VmKG1vZGVsX3Byb2JpdF9tdWx0aSkpDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KiogDQoNCkvhur90IHF14bqjIG3DtCBow6xuaCBo4buTaSBxdXkgduG7m2kgaMOgbSBsacOqbiBr4bq/dCBwcm9iaXQgdGnhur9wIHThu6VjIGto4bqzbmcgxJHhu4tuaCB0w6FjIMSR4buZbmcgcsO1IHLhu4d0IGPhu6dhIGxv4bqhaSDEkeG7kyB14buRbmcgxJHhur9uIGto4bqjIG7Eg25nIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunLiBD4bulIHRo4buDLCB14buRbmcgY8OgIHBow6ogbMOgbSB0xINuZyBnacOhIHRy4buLIGJp4bq/biB0aeG7gW0g4bqpbiAobGF0ZW50IHZhcmlhYmxlKSB0aMOqbSAxLDAyMTMgxJHGoW4gduG7iyAocCA8IDAsMDAxKSBzbyB24bubaSBraMO0bmcgdeG7kW5nLCBwaOG6o24gw6FuaCB4w6FjIHN14bqldCBi4buLIOG6o25oIGjGsOG7n25nIGdp4bqlYyBuZ+G7pyBjYW8gaMahbiDEkcOhbmcga+G7gy4gVmnhu4djIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIGPDsyB0w6FjIMSR4buZbmcgbeG6oW5oIGjGoW4sIHbhu5tpIGjhu4cgc+G7kSAxLDMxMzcgKHAgPCAwLDAwMSksIGNobyB0aOG6pXkgbmjDs20gbsOgeSBjw7MgeMOhYyBzdeG6pXQgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgbOG7m24gaMahbiByw7UgcuG7h3Qgc28gduG7m2kgbmjDs20ga2jDtG5nIHXhu5FuZy4gVGnDqnUgdGjhu6UgdsOgbyBideG7lWkgdOG7kWkgY8OzIGjhu4cgc+G7kSAwLDI2NzQgKHAg4omIIDAsMDc2KSwgZ+G7o2kgw70ga2jhuqMgbsSDbmcgYuG7iyDhuqNuaCBoxrDhu59uZyBjYW8gaMahbiBraG/huqNuZyAxLDMxIGzhuqduIHNvIHbhu5tpIGJhbiBuZ8OgeSwgdHV5IG5oacOqbiBr4bq/dCBxdeG6oyBjaMawYSDEkeG6oXQgw70gbmdoxKlhIHRo4buRbmcga8OqIOG7nyBt4bupYyA1JSAoY2jhu4kgY8OzIMO9IG5naMSpYSDhu58gbeG7qWMgMTAlKS4gSOG7hyBz4buRIGNo4bq3biDDom0gKC0wLDk5NjApIHRp4bq/cCB04bulYyBwaOG6o24gw6FuaCBy4bqxbmcg4bufIG5ow7NtIHRoYW0gY2hp4bq/dSDigJQga2jDtG5nIHXhu5FuZyBjw6AgcGjDqiwga2jDtG5nIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIHbDoCB0acOqdSB0aOG7pSB2w6BvIGJhbiBuZ8OgeSDigJQgeMOhYyBzdeG6pXQgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cg4bufIG3hu6ljIHRo4bqlcC4NCg0KKipL4bq/dCBsdeG6rW4qKg0KDQpNw7QgaMOsbmggaOG7k2kgcXV5IFByb2JpdCBi4buZaSBjaG8gdGjhuqV5IHLhurFuZyB2aeG7h2MgdeG7kW5nIGPDoCBwaMOqIHbDoCBuxrDhu5tjIHTEg25nIGzhu7FjIMSR4buBdSBsw6BtIHTEg25nIMSRw6FuZyBr4buDIGto4bqjIG7Eg25nIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunLCB24bubaSBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyByw7UgcsOgbmcgdsOgIGPDsyDDvSBuZ2jEqWEgdGjhu5FuZyBrw6ogY2FvLiBWaeG7h2Mgc+G7rSBk4bulbmcgdsOgbyBideG7lWkgdOG7kWkgY8OzIHh1IGjGsOG7m25nIGzDoG0gdMSDbmcgbmd1eSBjxqEgbeG6pXQgbmfhu6csIHR1eSBuaGnDqm4gY2jGsGEgxJHhu6cgbeG6oW5oIMSR4buDIGvhur90IGx14bqtbiBjaOG6r2MgY2jhuq9uIHbhu4EgbeG6t3QgdGjhu5FuZyBrw6ouDQoNCjxoMiBzdHlsZT0iY29sb3I6IzFFOTBGRjsiPk3DtCBow6xuaCBDbG9nbG9nPC9oMj4NCg0KYGBge3J9DQoNCg0KIyBCxrDhu5tjIDM6IE3DtCBow6xuaCBjbG9nbG9nIGLhu5lpDQpyZWdfY2xvZ2xvZ19tdWx0aSA8LSBnbG0oDQogIHNsZWVwX2ltcGFjdGVkIH4gYmV2ZXJhZ2VfY29mZmVlICsgYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rICsgdGltZV9vZl9kYXlfZXZlbmluZywNCiAgZGF0YSA9IGQsDQogIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAiY2xvZ2xvZyIpDQopDQoNCiMgQsaw4bubYyA0OiBIaeG7g24gdGjhu4sga+G6v3QgcXXhuqMNCnN1bW1hcnkocmVnX2Nsb2dsb2dfbXVsdGkpDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KTmjhu69uZyBuZ8aw4budaSB14buRbmcgY8OgIHBow6ogY8OzIGxvZy1oYXphcmQgdMSDbmcgdGjDqm0gMSw0MDQwIChwIDwgMCwwMDEpIHNvIHbhu5tpIG5ow7NtIGtow7RuZyB14buRbmcsIHTGsMahbmcgxJHGsMahbmcgbeG7qWMgdMSDbmcgb2RkcyDGsOG7m2MgdMOtbmgga2hv4bqjbmcgNCwwNyBs4bqnbi4gVmnhu4djIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIGPDsm4gY8OzIHTDoWMgxJHhu5luZyBt4bqhbmggaMahbiwgduG7m2kgaOG7hyBz4buRIDEsNzI3NyAocCA8IDAsMDAxKSwgdMawxqFuZyDEkcawxqFuZyBvZGRzIGNhbyBoxqFuIGtob+G6o25nIDUsNjMgbOG6p24gc28gduG7m2kgbmjDs20ga2jDtG5nIHXhu5FuZy4gVGnDqnUgdGjhu6UgxJHhu5MgdeG7kW5nIHbDoG8gYnXhu5VpIHThu5FpIGPFqW5nIGzDoG0gdMSDbmcga2jhuqMgbsSDbmcgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgKM6yID0gMCwzOTg0LCBwIOKJiCAwLDAyMCksIHbhu5tpIG9kZHMgY2FvIGjGoW4ga2hv4bqjbmcgMSw0OSBs4bqnbiBzbyB24bubaSBiYW4gbmfDoHkuIEjhu4cgc+G7kSBjaOG6t24gw6JtICgtMSw3NjEwKSBwaOG6o24gw6FuaCBy4bqxbmcg4bufIG5ow7NtIHRoYW0gY2hp4bq/dSDigJQga2jDtG5nIHXhu5FuZyBjw6AgcGjDqiwga2jDtG5nIHXhu5FuZyBuxrDhu5tjIHTEg25nIGzhu7FjIHbDoCB0acOqdSB0aOG7pSB2w6BvIGJhbiBuZ8OgeSDigJQgeMOhYyBzdeG6pXQgYuG7iyDhuqNuaCBoxrDhu59uZyBnaeG6pWMgbmfhu6cgbMOgIHRo4bqlcC4NCg0KKipL4bq/dCBsdeG6rW4qKg0KDQpNw7QgaMOsbmggY2xvZ2xvZyBi4buZaSBjaG8gdGjhuqV5IGPhuqMgY8OgIHBow6osIG7GsOG7m2MgdMSDbmcgbOG7sWMgdsOgIHRo4budaSBnaWFuIHPhu60gZOG7pW5nIHbDoG8gYnXhu5VpIHThu5FpIMSR4buBdSBsw6BtIHTEg25nIMSRw6FuZyBr4buDIGto4bqjIG7Eg25nIGLhu4sg4bqjbmggaMaw4bufbmcgZ2nhuqVjIG5n4bunIGRvIGNhZmZlaW5lLiBUcm9uZyDEkcOzLCBuxrDhu5tjIHTEg25nIGzhu7FjIGPDsyB0w6FjIMSR4buZbmcgbeG6oW5oIG5o4bqldCwgdGnhur9wIHRoZW8gbMOgIGPDoCBwaMOqLCB2w6AgdeG7kW5nIHbDoG8gYnXhu5VpIHThu5FpIGPFqW5nIGzDoCBt4buZdCB54bq/dSB04buRIHF1YW4gdHLhu41uZy4gTcO0IGjDrG5oIHBow7kgaOG7o3AgdOG7kXQgduG7m2kgZOG7ryBsaeG7h3UgdsOgIGNobyB0aOG6pXkgc+G7sSBraMOhYyBiaeG7h3QgdGjhu5FuZyBrw6ogY8OzIMO9IG5naMSpYSDhu58gY+G6oyBiYSB54bq/dSB04buRLg0KDQoNCjxoMiBzdHlsZT0iY29sb3I6cmVkOyI+xJDDoW5oIGdpw6EgbcO0IGjDrG5oIGjhu5NpIHF1eTwvaDI+DQoNCmBgYHtyfQ0KIyBU4bqhbyBjw6FjIG3DtCBow6xuaCBo4buTaSBxdXkgbmjhu4sgcGjDom4gduG7m2kgMyBiaeG6v24gxJHhu5ljIGzhuq1wDQptb2RlbF9sb2dpdF9tdWx0aSA8LSBnbG0oDQogIHNsZWVwX2ltcGFjdGVkIH4gYmV2ZXJhZ2VfY29mZmVlICsgYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rICsgdGltZV9vZl9kYXlfZXZlbmluZywNCiAgZGF0YSA9IGRmLA0KICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImxvZ2l0IikNCikNCg0KbW9kZWxfcHJvYml0X211bHRpIDwtIGdsbSgNCiAgc2xlZXBfaW1wYWN0ZWQgfiBiZXZlcmFnZV9jb2ZmZWUgKyBiZXZlcmFnZV9lbmVyZ3lfZHJpbmsgKyB0aW1lX29mX2RheV9ldmVuaW5nLA0KICBkYXRhID0gZGYsDQogIGZhbWlseSA9IGJpbm9taWFsKGxpbmsgPSAicHJvYml0IikNCikNCg0KbW9kZWxfY2xvZ2xvZ19tdWx0aSA8LSBnbG0oDQogIHNsZWVwX2ltcGFjdGVkIH4gYmV2ZXJhZ2VfY29mZmVlICsgYmV2ZXJhZ2VfZW5lcmd5X2RyaW5rICsgdGltZV9vZl9kYXlfZXZlbmluZywNCiAgZGF0YSA9IGRmLA0KICBmYW1pbHkgPSBiaW5vbWlhbChsaW5rID0gImNsb2dsb2ciKQ0KKQ0KDQojIFTDrW5oIEFJQyB2w6AgQklDIGNobyB04burbmcgbcO0IGjDrG5oDQpyZXN1bHRzIDwtIGRhdGEuZnJhbWUoDQogIE3DtF9ow6xuaCA9IGMoIkxvZ2l0IiwgIlByb2JpdCIsICJDbG9nbG9nIiksDQogIEFJQyA9IGMoDQogICAgQUlDKG1vZGVsX2xvZ2l0X211bHRpKSwNCiAgICBBSUMobW9kZWxfcHJvYml0X211bHRpKSwNCiAgICBBSUMobW9kZWxfY2xvZ2xvZ19tdWx0aSkNCiAgKSwNCiAgQklDID0gYygNCiAgICBCSUMobW9kZWxfbG9naXRfbXVsdGkpLA0KICAgIEJJQyhtb2RlbF9wcm9iaXRfbXVsdGkpLA0KICAgIEJJQyhtb2RlbF9jbG9nbG9nX211bHRpKQ0KICApDQopDQoNCiMgTMOgbSB0csOybg0KcmVzdWx0cyRBSUMgPC0gcm91bmQocmVzdWx0cyRBSUMsIDMpDQpyZXN1bHRzJEJJQyA8LSByb3VuZChyZXN1bHRzJEJJQywgMykNCg0KIyBIaeG7g24gdGjhu4sgYuG6o25nDQpsaWJyYXJ5KGtuaXRyKQ0Ka2FibGUocmVzdWx0cywgY2FwdGlvbiA9ICJTbyBzw6FuaCBBSUMsIEJJQyBnaeG7r2EgMyBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIHbhu5tpIDMgYmnhur9uIMSR4buZYyBs4bqtcCIpDQoNCmBgYA0KDQoqKk5o4bqtbiB4w6l0KioNCg0KQUlDIChBa2Fpa2UgSW5mb3JtYXRpb24gQ3JpdGVyaW9uKToNCg0KTcO0IGjDrG5oIGNsb2dsb2cgY8OzIEFJQyB0aOG6pXAgbmjhuqV0ICg2MDIuMzk2KSwgY2hvIHRo4bqleSDEkcOieSBsw6AgbcO0IGjDrG5oIHBow7kgaOG7o3AgdOG7kXQgbmjhuqV0IHbhu5tpIGThu68gbGnhu4d1IHRyb25nIDMgbcO0IGjDrG5oIMSRxrDhu6NjIHNvIHPDoW5oLg0KDQpNw7QgaMOsbmggbG9naXQgdsOgIHByb2JpdCBjw7MgQUlDIGNhbyBoxqFuLCBuw6puIGvDqW0gcGjDuSBo4bujcCBoxqFuIG3hu5l0IGNow7p0Lg0KDQpCSUMgKEJheWVzaWFuIEluZm9ybWF0aW9uIENyaXRlcmlvbik6DQoNClTGsMahbmcgdOG7sSBuaMawIEFJQywgY2xvZ2xvZyBjw7MgQklDIHRo4bqlcCBuaOG6pXQgKDYxOS4yNTUpLCB0aeG6v3AgdGhlbyBsw6AgbG9naXQgKDYyMC43MzQpIHbDoCBjdeG7kWkgY8O5bmcgbMOgIHByb2JpdCAoNjIxLjE2MCkuDQoNClbDrCBCSUMgcGjhuqF0IG7hurduZyBoxqFuIGtoaSBz4buRIGzGsOG7o25nIGJp4bq/biB0xINuZywgbsOqbiBr4bq/dCBsdeG6rW4gdOG7qyBCSUMgY8WpbmcgY+G7p25nIGPhu5EgcuG6sW5nIGNsb2dsb2cgbMOgIG3DtCBow6xuaCB04buRdCBuaOG6pXQgdHJvbmcgc+G7kSBiYSBtw7QgaMOsbmgsIHTDrW5oIHRoZW8gxJHhu5kgcGjDuSBo4bujcCB2w6AgxJHhu5kgcGjhu6ljIHThuqFwLg0KDQoqKkvhur90IGx14bqtbioqDQoNCkPhuqMgaGFpIHRpw6p1IGNow60gQUlDIHbDoCBCSUMgxJHhu4F1IGNobyB0aOG6pXkgbcO0IGjDrG5oIGNsb2dsb2cgbMOgIHThu5FpIMawdSBuaOG6pXQgdHJvbmcgMyBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIHbhu5tpIGPDuW5nIHThuq1wIGJp4bq/biDEkeG7mWMgbOG6rXAuIERvIMSRw7MsIG7hur91IG3hu6VjIHRpw6p1IGzDoCBjaOG7jW4gbcO0IGjDrG5oIHBow7kgaOG7o3AgdOG7kXQgbmjhuqV0IHbhu5tpIGThu68gbGnhu4d1LCBjbG9nbG9nIG7Dqm4gxJHGsOG7o2MgxrB1IHRpw6puLg0KDQojIENIxq/GoE5HIDQ6IEvhur90IGx14bqtbiANCg0KIyMgS+G6v3QgbHXhuq1uIA0KDQpUcm9uZyB0aeG7g3UgbHXhuq1uIG7DoHksIHTDoWMgZ2nhuqMgxJHDoyB0aOG7sWMgaGnhu4duIG3hu5l0IHBow6JuIHTDrWNoIMSR4buLbmggbMaw4bujbmcgdG/DoG4gZGnhu4duIGThu7FhIHRyw6puIGLhu5kgZOG7ryBsaeG7h3UgZ+G7k20gNTAwIHF1YW4gc8OhdCB2w6AgOSBiaeG6v24gc+G7kSwgbmjhurFtIGzDoG0gcsO1IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgaMOgbmggdmkgdGnDqnUgdGjhu6UgxJHhu5MgdeG7kW5nIGNo4bupYSBjYWZmZWluZSB2w6Aga2jhuqMgbsSDbmcgYuG7iyDhuqNuaCBoxrDhu59uZyBj4bunYSBnaeG6pWMgbmfhu6cuIEJp4bq/biBwaOG7pSB0aHXhu5ljIGzDoCBt4buZdCBiaeG6v24gbmjhu4sgcGjDom4sIGJp4buDdSB0aOG7iyB2aeG7h2MgZ2nhuqVjIG5n4bunIGPDsyBi4buLIHTDoWMgxJHhu5luZyB0acOqdSBj4buxYyBi4bufaSBjw6FjIHnhur91IHThu5EgbGnDqm4gcXVhbiDEkeG6v24gY2FmZmVpbmUgaGF5IGtow7RuZy4gQ8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIGJhbyBn4buTbSBsb+G6oWkgxJHhu5MgdeG7kW5nIChjw6AgcGjDqiwgbsaw4bubYyB0xINuZyBs4buxYywgdHLDoCkgdsOgIHRo4budaSDEkWnhu4NtIHPhu60gZOG7pW5nICh2w6BvIGJhbiDEkcOqbSBob+G6t2Mga2jDtG5nKS4NCg0KTeG7nyDEkeG6p3UgYuG6sW5nIHBow6JuIHTDrWNoIHRo4buRbmcga8OqIG3DtCB04bqjLCB0w6FjIGdp4bqjIMSRw6MgcGjDoWMgaOG7jWEgxJHhurdjIMSRaeG7g20gcGjDom4gYuG7kSBj4bunYSB04burbmcgYmnhur9uLCBxdWEgxJHDsyB4w6FjIMSR4buLbmggY8OhYyB54bq/dSB04buRIGPDsyBraOG6oyBuxINuZyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nhuqVjIG5n4bunLiBUaeG6v3AgxJHhur9uLCBiYSBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6Ju4oCUTG9naXQsIFByb2JpdCB2w6AgQ2xvZ2xvZ+KAlMSRxrDhu6NjIHRyaeG7g24ga2hhaSBuaOG6sW0ga2nhu4NtIMSR4buLbmggbeG7qWMgxJHhu5kgdMOhYyDEkeG7mW5nIGPhu6dhIGPDoWMgYmnhur9uIMSR4buZYyBs4bqtcCDEkeG6v24gYmnhur9uIHBo4bulIHRodeG7mWMuIEPDoWNoIHRp4bq/cCBj4bqtbiDEkWEgbcO0IGjDrG5oIGdpw7pwIHTEg25nIGPGsOG7nW5nIMSR4buZIHRpbiBj4bqteSBj4bunYSBr4bq/dCBxdeG6oyB2w6AgY3VuZyBj4bqlcCBjw6FpIG5ow6xuIHPDonUgc+G6r2MgaMahbiB24buBIGPGoSBjaOG6vyB0w6FjIMSR4buZbmcgY+G7p2EgY2FmZmVpbmUgbMOqbiBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunLg0KDQpL4bq/dCBxdeG6oyBo4buTaSBxdXkgY2hvIHRo4bqleSBiYSB54bq/dSB04buRIGPDsyDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24ga2jhuqMgbsSDbmcgZ2nhuqVjIG5n4bunIGLhu4sg4bqjbmggaMaw4bufbmcgZ+G7k206IHXhu5FuZyBjw6AgcGjDqiwgdeG7kW5nIG7GsOG7m2MgdMSDbmcgbOG7sWMgdsOgIHRpw6p1IHRo4bulIHbDoG8gYnXhu5VpIHThu5FpLiBUcm9uZyDEkcOzLCB54bq/dSB04buRIHPhu60gZOG7pW5nIG7GsOG7m2MgdMSDbmcgbOG7sWMgY8OzIHTDoWMgxJHhu5luZyBt4bqhbmggbmjhuqV0Lg0KDQojIyBI4bqhbiBjaOG6vyBj4bunYSDEkeG7gSBiw6BpDQoNCk3hurdjIGTDuSBuZ2hpw6puIGPhu6l1IMSRw6MgY3VuZyBj4bqlcCBuaOG7r25nIGfDs2MgbmjDrG4gY8OzIGdpw6EgdHLhu4sgduG7gSBt4buRaSBsacOqbiBo4buHIGdp4buvYSBow6BuaCB2aSB0acOqdSB0aOG7pSDEkeG7kyB14buRbmcgY2jhu6lhIGNhZmZlaW5lIHbDoCBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunLCB24bqrbiBjw7JuIHThu5NuIHThuqFpIG3hu5l0IHPhu5EgaOG6oW4gY2jhur8gY+G6p24gxJHGsOG7o2MgdGjhu6thIG5o4bqtbiBuaOG6sW0gxJHhu4tuaCBoxrDhu5tuZyBjaG8gY8OhYyBuZ2hpw6puIGPhu6l1IHRp4bq/cCB0aGVvLg0KDQpUaOG7qSBuaOG6pXQsIGLhu5kgZOG7ryBsaeG7h3UgxJHGsOG7o2Mgc+G7rSBk4bulbmcgY8OzIHF1eSBtw7QgdMawxqFuZyDEkeG7kWkgbmjhu48gduG7m2kgNTAwIHF1YW4gc8OhdCB2w6AgY2jGsGEgcGjhuqNuIMOhbmggxJHhuqd5IMSR4bunIGPDoWMgxJHhurdjIMSRaeG7g20gbmjDom4ga2jhuql1IGjhu41jIGPFqW5nIG5oxrAgeeG6v3UgdOG7kSBzaW5oIGzDvSBj4bunYSBuZ8aw4budaSB0aGFtIGdpYS4gxJBp4buBdSBuw6B5IGzDoG0gaOG6oW4gY2jhur8ga2jhuqMgbsSDbmcga2jDoWkgcXXDoXQgaMOzYSBjw6FjIGvhur90IGx14bqtbiB04burIG3DtCBow6xuaCBwaMOibiB0w61jaC4NCg0KVGjhu6kgaGFpLCBwaOG6p24gbOG7m24gY8OhYyBiaeG6v24gxJHhu5ljIGzhuq1wIGzDoCBiaeG6v24gxJHhu4tuaCB0w61uaCB2w6AgxJHGsOG7o2MgbcOjIGjDs2EgZMaw4bubaSBk4bqhbmcgbmjhu4sgcGjDom4sIGThuqtuIMSR4bq/biB2aeG7h2MgbeG6pXQgbcOhdCBt4buZdCBwaOG6p24gdGjDtG5nIHRpbiBjaGkgdGnhur90IHbDoCBz4buxIMSRYSBk4bqhbmcgdHJvbmcgaMOgbmggdmkgdGjhu7FjIHThur8uDQoNClRo4bupIGJhLCBuZ2hpw6puIGPhu6l1IGNo4bunIHnhur91IMOhcCBk4bulbmcgY8OhYyBtw7QgaMOsbmggaOG7k2kgcXV5IG5o4buLIHBow6JuIGPhu5UgxJFp4buDbiBuaMawIExvZ2l0LCBQcm9iaXQgdsOgIENsb2dsb2csIG3DoCBjaMawYSBraGFpIHRow6FjIGPDoWMgcGjGsMahbmcgcGjDoXAgaGnhu4duIMSR4bqhaSBuaMawIGjhu5NpIHF1eSBwaGkgdHV54bq/biwga+G7uSB0aHXhuq10IGjhu41jIG3DoXkgaG/hurdjIGPDoWMga+G7uSB0aHXhuq10IHjhu60gbMO9IG3huqV0IGPDom4gYuG6sW5nIGThu68gbGnhu4d1LCB24buRbiBjw7MgdGjhu4MgZ2nDunAgY+G6o2kgdGhp4buHbiDEkeG7mSBjaMOtbmggeMOhYyB2w6AgdMOtbmgg4bupbmcgZOG7pW5nIGPhu6dhIG3DtCBow6xuaC4NCg0KQ3Xhu5FpIGPDuW5nLCBkbyBz4butIGThu6VuZyBk4buvIGxp4buHdSBxdWFuIHPDoXQgdGhheSB2w6wgZOG7ryBsaeG7h3UgdGjhu7FjIG5naGnhu4dtLCBuZ2hpw6puIGPhu6l1IGNo4buJIGPDsyB0aOG7gyB4w6FjIMSR4buLbmggbeG7kWkgdMawxqFuZyBxdWFuIGNo4bupIGNoxrBhIHRo4buDIGto4bqzbmcgxJHhu4tuaCBxdWFuIGjhu4cgbmjDom4gcXXhuqMgZ2nhu69hIGPDoWMgYmnhur9uLCB04burIMSRw7MgY+G6p24gdGjhuq1uIHRy4buNbmcgdHJvbmcgdmnhu4djIGRp4buFbiBnaeG6o2kgdsOgIHbhuq1uIGThu6VuZyBr4bq/dCBxdeG6oyBwaMOibiB0w61jaCB2w6BvIHRo4buxYyB0aeG7hW4uDQoNCiMjIEjGsOG7m25nIHBow6F0IHRyaeG7g24gxJHhu4EgdMOgaSANCg0KxJDhu5FpIHbhu5tpIGPDoSBuaMOibiBuZ8aw4budaSB0acOqdSBkw7luZywgdmnhu4djIMSRaeG7gXUgY2jhu4luaCB0aMOzaSBxdWVuIHPhu60gZOG7pW5nIMSR4buTIHXhu5FuZyBjaOG7qWEgY2FmZmVpbmUgbMOgIGPhuqduIHRoaeG6v3TigJTEkeG6t2MgYmnhu4d0IG7Dqm4gaOG6oW4gY2jhur8gdGnDqnUgdGjhu6UgdsOgbyBideG7lWkgdOG7kWkgbmjhurFtIGdp4bqjbSB0aGnhu4N1IG5ndXkgY8ahIOG6o25oIGjGsOG7n25nIHRpw6p1IGPhu7FjIMSR4bq/biBjaOG6pXQgbMaw4bujbmcgZ2nhuqVjIG5n4bunLg0KDQpW4buBIHBow61hIHRydXnhu4FuIHRow7RuZyB2w6AgbmfDoG5oIHkgdOG6vyBj4buZbmcgxJHhu5NuZywgY+G6p24gdHJp4buDbiBraGFpIGPDoWMgY2jGsMahbmcgdHLDrG5oIHR1ecOqbiB0cnV54buBbiBuaOG6sW0gbsOibmcgY2FvIG5o4bqtbiB0aOG7qWMgY+G7mW5nIMSR4buTbmcgduG7gSB0w6FjIMSR4buZbmcgY+G7p2EgY2FmZmVpbmUgxJHhu5FpIHbhu5tpIGdp4bqlYyBuZ+G7py4gTuG7mWkgZHVuZyB0cnV54buBbiB0aMO0bmcgbsOqbiBuaOG6pW4gbeG6oW5oIHbDoG8gdOG6p20gcXVhbiB0cuG7jW5nIGPhu6dhIHRo4budaSDEkWnhu4NtIHbDoCBsaeG7gXUgbMaw4bujbmcgdGnDqnUgdGjhu6UsIHThu6sgxJHDsyBnacO6cCBuZ8aw4budaSBkw6JuIGNo4bunIMSR4buZbmcgxJFp4buBdSBjaOG7iW5oIGjDoG5oIHZpIHPhu60gZOG7pW5nLg0KDQrEkOG7kWkgduG7m2kgY8OhYyBuZ2hpw6puIGPhu6l1IHRyb25nIHTGsMahbmcgbGFpLCB2aeG7h2MgbeG7nyBy4buZbmcgYuG7mSBk4buvIGxp4buHdSB24bubaSBjw6FjIGJp4bq/biDEkeG7i25oIGzGsOG7o25nIGNoaSB0aeG6v3QgaMahbuKAlGNo4bqzbmcgaOG6oW4gbmjGsCB0aOG7nWkgbMaw4bujbmcgbmfhu6cgdGjhu7FjIHThur8sIGNo4buJIHPhu5EgY8SDbmcgdGjhurNuZyAoc3RyZXNzIGxldmVsKSwgaG/hurdjIHTDrG5oIHRy4bqhbmcgc+G7qWMga2jhu49lIHThu5VuZyBxdcOhdOKAlHPhur0gZ8OzcCBwaOG6p24gY+G6o2kgdGhp4buHbiDEkeG7mSBjaMOtbmggeMOhYyBj4bunYSBtw7QgaMOsbmggdsOgIG1hbmcgbOG6oWkgY8OhaSBuaMOsbiB0b8OgbiBkaeG7h24gaMahbiB24buBIHTDoWMgxJHhu5luZyBj4bunYSBjYWZmZWluZSDEkeG6v24gZ2nhuqVjIG5n4bunIGNvbiBuZ8aw4budaS4NCg0KDQo=