library(readr)
mice_weights <- read_csv("mice_weights.csv")
## Rows: 780 Columns: 8
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (2): sex, diet
## dbl (6): rownames, body_weight, bone_density, percent_fat, gen, litter
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
data1 <- mice_weights
Dữ liệu được cung cấp bởi Karen Svenson từ Phòng thí nghiệm Jackson.
Nguồn tài trợ để tạo ra những dữ liệu này đến từ khoản trợ cấp P50
GM070683 của NIH được trao cho Gary Churchill.
dateset gồm 7 biến:
body_weight: Trọng lượng cơ thể tính bằng gam ở tuần thứ
19.
bone_density: Mật độ cơ thể.
percent_fat: Phần trăm chất béo.
sex: Giới tính của chuột.
diet: Chế độ ăn của chuột: chow hoặc nhiều chất béo.
gen. Đây là những con chuột outbread. Biến này biểu thị thế
hệ.
liiter: Con nào trong hai lứa chuột thuộc về.
Lập bảng tần số và vẽ đồ thị
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ purrr 1.0.1
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.5.1 ✔ tibble 3.2.1
## ✔ lubridate 1.9.3 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library("scales")
##
## Attaching package: 'scales'
##
## The following object is masked from 'package:purrr':
##
## discard
##
## The following object is masked from 'package:readr':
##
## col_factor
d <- data_frame(data1)
df <- d %>%
mutate(body_weight = case_when(
body_weight <= 35 ~ "Underweight",
body_weight <= 66 ~ "Overweight",
TRUE ~ "Obese"
))
tt <- table(df$body_weight)
barplot(tt, type = "o", main = "Bảng tần số theo thể trạng", xlab = "Thể trạng", ylab = "Tần số", col = c("black","purple"))

Ở đây phân chia biến Body Weight (thể trạng) thành hai nhóm
“underweight” (thiếu cân) và “overweight” (thừa cân) để biến định lượng
thành biến định tính giúp dễ dàng phân tích và đưa ra các kết luận về
tình trạng dinh dưỡng và sức khỏe của các quan sát trong mẫu nghiên cứu.
Sau đó, ta tạo bảng tần số để thể hiện số lượng đối tượng trong mỗi
nhóm. Mẫu nghiên cứu có 320 quan sát được xếp vào loại thiếu cân và có
460 quan sát được xếp vào loại thừa cân. Bảng tần số cung cấp một cái
nhìn rõ ràng về sự phân bố của các nhóm này, giúp định hướng cho các
biện pháp can thiệp y tế và dinh dưỡng phù hợp.
tu <- table(df$diet)
barplot(tu,
main = "Bảng tần số theo chế độ ăn",
xlab = "Chế độ ăn",
ylab = "Tần số",
col = c("skyblue", "red"))

Bảng tần số cho biến diet cho thấy sự phân bố khá đều giữa
hai nhóm “chow” và “hf”. Với số lượng gần như tương đương (394 và
386).
ti <- table(df$sex)
barplot(ti,
main = "Lập bảng tần số cho Giới tính",
xlab = "Giới tính",
ylab = "Tần số",
col = c("blue", "pink"),
legend.text = TRUE)
Biến này bao gồm 398 đối tượng nữ, 382 đối tượng nam, chỉ ít hơn một
chút so với nhóm nữ. Số lượng nam gần tương đương với nữ cho thấy mẫu
nghiên cứu khá cân đối về giới tính.
Lập bảng tần số cho 2 biến
df %>% group_by(body_weight,sex) %>% summarise(n=n()) %>%
ggplot(aes(x=body_weight,y=n,fill= sex)) +
geom_col(position = "dodge") +
theme_bw()+
labs(x="Thể trạng",y="Số lượng",title = "Bảng tần số theo thể trạng và giới tính")

Lập bảng tần số cho 2 biến body_weight và sex (thể trạng và giới
tính).Với những quan sát mang giới tính nữ thì có thể trạng thiếu cân
nhiều hơn những quan sát mang giới tính nam và ngược lại với thể trạng
thiếu cân.
df %>% group_by(body_weight,diet) %>% summarise(n=n()) %>%
ggplot(aes(x=body_weight,y=n,fill= diet)) +
geom_col(position = "dodge") +
theme_bw()+
labs(x="Thể trạng",y="Số lượng",title = "Bảng tần số theo thể trạng và chế độ ăn")

Lập bảng tần số cho 2 biến body_weigbt và diet(thể trạng và chế độ
ăn).Với chế độ ăn chow(tiêu chuẩn), số lượng mẫu quan sát có thể trạng
thiếu cân nhiều hơn. Với chế độ ăn hf (nhiều chất béo) thì số lượng mãu
quan sát có thể trạng thừa cân nhiều hơn.
Ước lượng tỷ lệ
Tỷ lệ thành công
d_bd <- table(df$body_weight,d$diet)
d_bd
##
## chow hf
## Overweight 106 214
## Underweight 288 172
pi1 <- d_bd[1,1]/sum(d_bd[1,])
pi2 <- d_bd[2,1]/sum(d_bd[2,])
data.frame(pi1,pi2)
p1: tỷ lệ thành công của thừa cân khi ăn chế độ bình thường p2: tỷ lệ
thành công của thiếu cân khi ăn chế độ nhiều chất béo
Tỷ lệ thất bại
pi3 <- (1-pi1)/(1-pi2)
Relative risk
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.3.3
ii <- table(df$body_weight,df$diet)
addmargins(ii)
##
## chow hf Sum
## Overweight 106 214 320
## Underweight 288 172 460
## Sum 394 386 780
RelRisk(ii)
## [1] 0.5290799
Rủi ro tương đối giữa 2 biểu hiện khác nhau của biến phụ thuộc, cụ
thể ở thiếu cân và thừa cân của biến thể trạng. RR < 1 giá trị rủi ro
tương đối nhỏ hơn 1 (0.5290799).
** Khoảng ước lượng cho Relative Risk**
table(df$body_weight, df$sex)
##
## F M
## Overweight 76 244
## Underweight 322 138
m <- matrix(c(76,322,244,138),nrow = 2)
RelRisk(m, conf.level = .95)
## rel. risk lwr.ci upr.ci
## 0.3392857 0.2751131 0.4142015
Ước lượng cho Tỷ lệ Rủi ro Tương đối giữa 2 biến là 0.3392857 Giá trị
thực sự của Tỷ lệ Rủi ro Tương đối nằm trong khoảng từ 0.2751131 đến
0.4142015.
Odds ratio
pp <- table(df$body_weight,df$sex)
OddsRatio(pp)
## [1] 0.1334895
G iá trị Odds Ratio dưới 1 (trong trường hợp này là 0.1334895) cho
biết một mối quan hệ nghịch giữa các biến.
LS0tDQp0aXRsZTogIkJUVk4gQlVPSSAzX05nb2NIYSINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgdG9jOiBUUlVFDQogICAgdG9jX2Zsb2F0OiBUUlVFDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICBwZGZfZG9jdW1lbnQ6DQogICAgZXh0cmFfZGVwZW5kZW5jaWVzOg0KICAgICAgdmlldG5hbTogdXRmOA0KICAgIHRvYzogeWVzDQogICAgbnVtYmVyX3NlY3Rpb25zOiB5ZXMNCiAgd29yZF9kb2N1bWVudDoNCiAgICB0b2M6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQpnZW9tZXRyeToNCiAgICAgIC0gaW5uZXI9M2NtDQogICAgICAtIG91dGVyPTRjbQ0KICAgICAgLSB0b3A9M2NtDQogICAgICAtIGJvdHRvbT00Y20NCiAgICAgIC0gaGVhZHNlcD0yMnB0DQogICAgICAtIGhlYWRoZWlnaHQ9MTFwdA0KICAgICAgLSBmb290c2tpcD0zM3B0DQogICAgICAtIGlnbm9yZWhlYWQNCiAgICAgIC0gaWdub3JlZm9vdA0KICAgICAgLSBoZWlnaHRyb3VuZGVkDQotLS0NCmBgYHtyfQ0KbGlicmFyeShyZWFkcikNCm1pY2Vfd2VpZ2h0cyA8LSByZWFkX2NzdigibWljZV93ZWlnaHRzLmNzdiIpDQpkYXRhMSA8LSAgbWljZV93ZWlnaHRzDQpgYGANCg0KROG7ryBsaeG7h3UgxJHGsOG7o2MgY3VuZyBj4bqlcCBi4bufaSBLYXJlbiBTdmVuc29uIHThu6sgUGjDsm5nIHRow60gbmdoaeG7h20gSmFja3Nvbi4gTmd14buTbiB0w6BpIHRy4bujIMSR4buDIHThuqFvIHJhIG5o4buvbmcgZOG7ryBsaeG7h3UgbsOgeSDEkeG6v24gdOG7qyBraG/huqNuIHRy4bujIGPhuqVwIFA1MCBHTTA3MDY4MyBj4bunYSBOSUggxJHGsOG7o2MgdHJhbyBjaG8gR2FyeSBDaHVyY2hpbGwuDQoNCmRhdGVzZXQgZ+G7k20gNyBiaeG6v246DQoNCi0gYm9keV93ZWlnaHQ6IFRy4buNbmcgbMaw4bujbmcgY8ahIHRo4buDIHTDrW5oIGLhurFuZyBnYW0g4bufIHR14bqnbiB0aOG7qSAxOS4NCg0KLSBib25lX2RlbnNpdHk6IE3huq10IMSR4buZIGPGoSB0aOG7gy4NCg0KLSBwZXJjZW50X2ZhdDogUGjhuqduIHRyxINtIGNo4bqldCBiw6lvLg0KDQotIHNleDogR2nhu5tpIHTDrW5oIGPhu6dhIGNodeG7mXQuDQoNCi0gZGlldDogQ2jhur8gxJHhu5kgxINuIGPhu6dhIGNodeG7mXQ6IGNob3cgaG/hurdjIG5oaeG7gXUgY2jhuqV0IGLDqW8uDQoNCi0gZ2VuLiDEkMOieSBsw6Agbmjhu69uZyBjb24gY2h14buZdCBvdXRicmVhZC4gQmnhur9uIG7DoHkgYmnhu4N1IHRo4buLIHRo4bq/IGjhu4cuDQoNCi0gbGlpdGVyOiAgQ29uIG7DoG8gdHJvbmcgaGFpIGzhu6lhIGNodeG7mXQgdGh14buZYyB24buBLg0KDQojICoqTOG6rXAgYuG6o25nIHThuqduIHPhu5EgdsOgIHbhur0gxJHhu5MgdGjhu4sqKg0KDQpgYGB7ciB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KCJzY2FsZXMiKQ0KDQpkIDwtIGRhdGFfZnJhbWUoZGF0YTEpDQpkZiA8LSBkICU+JQ0KICBtdXRhdGUoYm9keV93ZWlnaHQgPSBjYXNlX3doZW4oDQogICAgYm9keV93ZWlnaHQgPD0gMzUgfiAiVW5kZXJ3ZWlnaHQiLA0KICAgIGJvZHlfd2VpZ2h0IDw9IDY2IH4gIk92ZXJ3ZWlnaHQiLA0KICAgIFRSVUUgfiAiT2Jlc2UiDQogICkpDQoNCnR0IDwtIHRhYmxlKGRmJGJvZHlfd2VpZ2h0KQ0KYmFycGxvdCh0dCwgdHlwZSA9ICJvIiwgbWFpbiA9ICJC4bqjbmcgdOG6p24gc+G7kSB0aGVvIHRo4buDIHRy4bqhbmciLCB4bGFiID0gIlRo4buDIHRy4bqhbmciLCB5bGFiID0gIlThuqduIHPhu5EiLCBjb2wgPSBjKCJibGFjayIsInB1cnBsZSIpKQ0KDQpgYGANCiANCiDhu54gxJHDonkgcGjDom4gY2hpYSBiaeG6v24gX0JvZHkgV2VpZ2h0XyAodGjhu4MgdHLhuqFuZykgdGjDoG5oIGhhaSBuaMOzbSAidW5kZXJ3ZWlnaHQiICh0aGnhur91IGPDom4pIHbDoCAib3ZlcndlaWdodCIgKHRo4burYSBjw6JuKSDEkeG7gyBiaeG6v24gxJHhu4tuaCBsxrDhu6NuZyB0aMOgbmggYmnhur9uIMSR4buLbmggdMOtbmggZ2nDunAgZOG7hSBkw6BuZyBwaMOibiB0w61jaCB2w6AgxJHGsGEgcmEgY8OhYyBr4bq/dCBsdeG6rW4gduG7gSB0w6xuaCB0cuG6oW5nIGRpbmggZMaw4buhbmcgdsOgIHPhu6ljIGto4buPZSBj4bunYSBjw6FjIHF1YW4gc8OhdCB0cm9uZyBt4bqrdSBuZ2hpw6puIGPhu6l1LiBTYXUgxJHDsywgdGEgdOG6oW8gYuG6o25nIHThuqduIHPhu5EgxJHhu4MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgxJHhu5FpIHTGsOG7o25nIHRyb25nIG3hu5dpIG5ow7NtLiBN4bqrdSBuZ2hpw6puIGPhu6l1IGPDsyAzMjAgcXVhbiBzw6F0IMSRxrDhu6NjIHjhur9wIHbDoG8gbG/huqFpIHRoaeG6v3UgY8OibiB2w6AgY8OzIDQ2MCBxdWFuIHPDoXQgxJHGsOG7o2MgeOG6v3AgdsOgbyBsb+G6oWkgdGjhu6thIGPDom4uIELhuqNuZyB04bqnbiBz4buRIGN1bmcgY+G6pXAgbeG7mXQgY8OhaSBuaMOsbiByw7UgcsOgbmcgduG7gSBz4buxIHBow6JuIGLhu5EgY+G7p2EgY8OhYyBuaMOzbSBuw6B5LCBnacO6cCDEkeG7i25oIGjGsOG7m25nIGNobyBjw6FjIGJp4buHbiBwaMOhcCBjYW4gdGhp4buHcCB5IHThur8gdsOgIGRpbmggZMaw4buhbmcgcGjDuSBo4bujcC4NCiANCmBgYHtyfQ0KdHUgPC0gdGFibGUoZGYkZGlldCkNCmJhcnBsb3QodHUsIA0KICAgICAgICBtYWluID0gIkLhuqNuZyB04bqnbiBz4buRIHRoZW8gY2jhur8gxJHhu5kgxINuIiwgDQogICAgICAgIHhsYWIgPSAiQ2jhur8gxJHhu5kgxINuIiwgDQogICAgICAgIHlsYWIgPSAiVOG6p24gc+G7kSIsDQogICAgICAgIGNvbCA9IGMoInNreWJsdWUiLCAicmVkIikpDQpgYGANCg0KICBC4bqjbmcgdOG6p24gc+G7kSBjaG8gYmnhur9uIF9kaWV0XyBjaG8gdGjhuqV5IHPhu7EgcGjDom4gYuG7kSBraMOhIMSR4buBdSBnaeG7r2EgaGFpIG5ow7NtICJjaG93IiB2w6AgImhmIi4gVuG7m2kgc+G7kSBsxrDhu6NuZyBn4bqnbiBuaMawIHTGsMahbmcgxJHGsMahbmcgKDM5NCB2w6AgMzg2KS4gDQpgYGB7cn0NCnRpIDwtIHRhYmxlKGRmJHNleCkNCmJhcnBsb3QodGksIA0KICAgICAgICBtYWluID0gIkzhuq1wIGLhuqNuZyB04bqnbiBz4buRIGNobyBHaeG7m2kgdMOtbmgiLCANCiAgICAgICAgeGxhYiA9ICJHaeG7m2kgdMOtbmgiLCANCiAgICAgICAgeWxhYiA9ICJU4bqnbiBz4buRIiwNCiAgICAgICAgY29sID0gYygiYmx1ZSIsICJwaW5rIiksDQogICAgICAgIGxlZ2VuZC50ZXh0ID0gVFJVRSkNCmBgYA0KICBCaeG6v24gbsOgeSBiYW8gZ+G7k20gMzk4IMSR4buRaSB0xrDhu6NuZyBu4buvLCAzODIgxJHhu5FpIHTGsOG7o25nIG5hbSwgY2jhu4kgw610IGjGoW4gbeG7mXQgY2jDunQgc28gduG7m2kgbmjDs20gbuG7ry4gU+G7kSBsxrDhu6NuZyBuYW0gZ+G6p24gdMawxqFuZyDEkcawxqFuZyB24bubaSBu4buvIGNobyB0aOG6pXkgbeG6q3UgbmdoacOqbiBj4bupdSBraMOhIGPDom4gxJHhu5FpIHbhu4EgZ2nhu5tpIHTDrW5oLiANCg0KKipM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaG8gMiBiaeG6v24qKiANCmBgYHtyIG1lc3NhZ2U9RkFMU0V9DQpkZiAlPiUgZ3JvdXBfYnkoYm9keV93ZWlnaHQsc2V4KSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4PWJvZHlfd2VpZ2h0LHk9bixmaWxsPSBzZXgpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgdGhlbWVfYncoKSsNCiAgbGFicyh4PSJUaOG7gyB0cuG6oW5nIix5PSJT4buRIGzGsOG7o25nIix0aXRsZSA9ICJC4bqjbmcgdOG6p24gc+G7kSB0aGVvIHRo4buDIHRy4bqhbmcgdsOgIGdp4bubaSB0w61uaCIpDQpgYGANCg0KICBM4bqtcCBi4bqjbmcgdOG6p24gc+G7kSBjaG8gMiBiaeG6v24gYm9keV93ZWlnaHQgdsOgIHNleCAodGjhu4MgdHLhuqFuZyB2w6AgZ2nhu5tpIHTDrW5oKS5W4bubaSBuaOG7r25nIHF1YW4gc8OhdCBtYW5nIGdp4bubaSB0w61uaCBu4buvIHRow6wgY8OzIHRo4buDIHRy4bqhbmcgdGhp4bq/dSBjw6JuIG5oaeG7gXUgaMahbiBuaOG7r25nIHF1YW4gc8OhdCBtYW5nIGdp4bubaSB0w61uaCBuYW0gdsOgIG5nxrDhu6NjIGzhuqFpIHbhu5tpIHRo4buDIHRy4bqhbmcgdGhp4bq/dSBjw6JuLg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KZGYgJT4lIGdyb3VwX2J5KGJvZHlfd2VpZ2h0LGRpZXQpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHg9Ym9keV93ZWlnaHQseT1uLGZpbGw9IGRpZXQpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKyANCiAgdGhlbWVfYncoKSsNCiAgbGFicyh4PSJUaOG7gyB0cuG6oW5nIix5PSJT4buRIGzGsOG7o25nIix0aXRsZSA9ICJC4bqjbmcgdOG6p24gc+G7kSB0aGVvIHRo4buDIHRy4bqhbmcgdsOgIGNo4bq/IMSR4buZIMSDbiIpDQogIA0KYGBgDQogDQogTOG6rXAgYuG6o25nIHThuqduIHPhu5EgY2hvIDIgYmnhur9uIGJvZHlfd2VpZ2J0IHbDoCBkaWV0KHRo4buDIHRy4bqhbmcgdsOgIGNo4bq/IMSR4buZIMSDbikuVuG7m2kgY2jhur8gxJHhu5kgxINuIGNob3codGnDqnUgY2h14bqpbiksIHPhu5EgbMaw4bujbmcgbeG6q3UgcXVhbiBzw6F0IGPDsyB0aOG7gyB0cuG6oW5nIHRoaeG6v3UgY8OibiBuaGnhu4F1IGjGoW4uIFbhu5tpIGNo4bq/IMSR4buZIMSDbiBoZiAobmhp4buBdSBjaOG6pXQgYsOpbykgdGjDrCBz4buRIGzGsOG7o25nIG3Do3UgcXVhbiBzw6F0IGPDsyB0aOG7gyB0cuG6oW5nIHRo4burYSBjw6JuIG5oaeG7gXUgaMahbi4NCg0KIyDGr+G7m2MgbMaw4bujbmcgdOG7tyBs4buHIA0KDQoqKlThu7cgbOG7hyB0aMOgbmggY8O0bmcqKg0KDQpgYGB7ciBtZXNzYWdlPUZBTFNFfQ0KZF9iZCA8LSB0YWJsZShkZiRib2R5X3dlaWdodCxkJGRpZXQpDQpkX2JkDQpwaTEgPC0gZF9iZFsxLDFdL3N1bShkX2JkWzEsXSkNCnBpMiA8LSBkX2JkWzIsMV0vc3VtKGRfYmRbMixdKQ0KZGF0YS5mcmFtZShwaTEscGkyKQ0KYGBgDQoNCiAgcDE6IHThu7cgbOG7hyB0aMOgbmggY8O0bmcgY+G7p2EgdGjhu6thIGPDom4ga2hpIMSDbiBjaOG6vyDEkeG7mSBiw6xuaCB0aMaw4budbmcNCiAgcDI6IHThu7cgbOG7hyB0aMOgbmggY8O0bmcgY+G7p2EgdGhp4bq/dSBjw6JuIGtoaSDEg24gY2jhur8gxJHhu5kgbmhp4buBdSBjaOG6pXQgYsOpbw0KICANCg0KKipU4bu3IGzhu4cgdGjhuqV0IGLhuqFpKioNCg0KYGBge3J9DQpwaTMgPC0gKDEtcGkxKS8oMS1waTIpDQoNCmBgYA0KDQojIFJlbGF0aXZlIHJpc2sNCmBgYHtyfQ0KbGlicmFyeShEZXNjVG9vbHMpDQppaSA8LSB0YWJsZShkZiRib2R5X3dlaWdodCxkZiRkaWV0KQ0KYWRkbWFyZ2lucyhpaSkNClJlbFJpc2soaWkpDQpgYGANCg0KUuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgZ2nhu69hIDIgYmnhu4N1IGhp4buHbiBraMOhYyBuaGF1IGPhu6dhIGJp4bq/biBwaOG7pSB0aHXhu5ljLCBj4bulIHRo4buDIOG7nyB0aGnhur91IGPDom4gdsOgIHRo4burYSBjw6JuIGPhu6dhIGJp4bq/biB0aOG7gyB0cuG6oW5nLg0KUlIgPCAxIGdpw6EgdHLhu4sgcuG7p2kgcm8gdMawxqFuZyDEkeG7kWkgbmjhu48gaMahbiAxICgwLjUyOTA3OTkpLiANCg0KKiogS2hv4bqjbmcgxrDhu5tjIGzGsOG7o25nIGNobyBSZWxhdGl2ZSBSaXNrKioNCg0KYGBge3J9DQp0YWJsZShkZiRib2R5X3dlaWdodCwgZGYkc2V4KQ0KbSA8LSBtYXRyaXgoYyg3NiwzMjIsMjQ0LDEzOCksbnJvdyA9IDIpDQpSZWxSaXNrKG0sIGNvbmYubGV2ZWwgPSAuOTUpDQpgYGANCiDGr+G7m2MgbMaw4bujbmcgY2hvIFThu7cgbOG7hyBS4bunaSBybyBUxrDGoW5nIMSR4buRaSBnaeG7r2EgMiBiaeG6v24gbMOgIDAuMzM5Mjg1Nw0KIEdpw6EgdHLhu4sgdGjhu7FjIHPhu7EgY+G7p2EgVOG7tyBs4buHIFLhu6dpIHJvIFTGsMahbmcgxJHhu5FpIG7hurFtIHRyb25nIGtob+G6o25nIHThu6sgMC4yNzUxMTMxIMSR4bq/biAwLjQxNDIwMTUuIA0KDQojIE9kZHMgcmF0aW8NCg0KYGBge3J9DQpwcCA8LSB0YWJsZShkZiRib2R5X3dlaWdodCxkZiRzZXgpDQpPZGRzUmF0aW8ocHApDQpgYGANCg0KRyBpw6EgdHLhu4sgT2RkcyBSYXRpbyBkxrDhu5tpIDEgKHRyb25nIHRyxrDhu51uZyBo4bujcCBuw6B5IGzDoCAwLjEzMzQ4OTUpIGNobyBiaeG6v3QgbeG7mXQgbeG7kWkgcXVhbiBo4buHIG5naOG7i2NoIGdp4buvYSBjw6FjIGJp4bq/bi4g