GIỚI THIỆU
1. Nhiệm vụ
Yêu cầu: Vẽ 20 đồ thị (khác nhau) để mô tả và phân tích cho dữ liệu
tự tìm được.
2. Bộ dữ liệu Student Spending Habits Dataset
a <- read.csv(file = 'C:/Users/Admin/Downloads/Student Spending Habits Dataset.csv', header = T) #gán dữ liệu vào a
dim(a)
## [1] 1000 17
names(a)
## [1] "age" "gender"
## [3] "year_in_school" "major"
## [5] "monthly_income" "financial_aid"
## [7] "tuition" "housing"
## [9] "food" "transportation"
## [11] "books_supplies" "entertainment"
## [13] "personal_care" "technology"
## [15] "health_wellness" "miscellaneous"
## [17] "preferred_payment_method"
Bộ dữ liệu Student Spending Habits chứa thông tin
giả tưởng về thói quen chi tiêu của 1000 sinh viên thuộc nhiều nhóm dân
số và nền học vụ khác nhau.
Bộ dữ liệu bao gồm thông tin như tuổi, giới tính, năm học, ngành học,
thu nhập hàng tháng, hỗ trợ tài chính nhận được, và các chi phí trong
các danh mục chi tiêu khác nhau. Các danh mục chi tiêu bao gồm học phí,
nhà ở, thức ăn, giao thông, sách & vật liệu học tập, giải trí, chăm
sóc cá nhân, công nghệ, sức khỏe & phúc lợi, và các chi phí đa dạng
khác. Ngoài ra, bộ dữ liệu cũng bao gồm phương thức thanh toán ưa thích
của từng sinh viên.
Các nhà nghiên cứu, giáo viên, và sinh viên có thể tận dụng bộ dữ
liệu này để thực hiện phân tích dữ liệu thám hiểm, mô hình dự đoán, và
phát triển thông tin về hành vi tài chính của sinh viên.
Các biến của bộ dữ liệu bao gồm:
Aae: Tuổi của sinh viên (theo năm)
gender : Giới tính của sinh viên (Nam, Nữ,
Khác)
year_in_school: Năm học của sinh viên (Năm nhất,
Năm hai, Năm ba, Năm tư)
major: Lĩnh vực học hoặc chuyên ngành
monthly_income: Thu nhập hàng tháng của sinh
viên (bằng đô la)
financial_aid: Hỗ trợ tài chính nhận được bởi
sinh viên (bằng đô la)
tuition: Chi phí học phí (bằng đô la)
housing: Chi phí nhà ở (bằng đô la)
food: Chi phí thức ăn (bằng đô la)
transportation: Chi phí giao thông (bằng đô
la)
books_supplies: Chi phí sách và vật liệu học tập
(bằng đô la)
entertainment: Chi phí giải trí (bằng đô
la)
personal_care: Chi phí sản phẩm chăm sóc cá nhân
(bằng đô la)
technology: Chi phí công nghệ (bằng đô
la)
health_wellness: Chi phí sức khỏe và phúc lợi
(bằng đô la)
miscellaneous: Các chi phí đa dạng khác (bằng đô
la)
preferred_payment_method: Phương thức thanh toán
ưa thích (Tiền mặt, Thẻ tín dụng/Thẻ ghi nợ, Ứng dụng thanh toán di
động)
PHÂN TÍCH BỘ DỮ LIỆU
Biểu đồ 1
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
a %>% group_by(gender) %>% summarise(n = n()) %>%
ggplot(aes(x = '', y = n,fill = gender)) +
geom_col(color = 'black') +
coord_polar('y') +
geom_text(aes(x = 1.3, label = n),position = position_stack(vjust = .5)) +
theme_void() +
labs(title = 'Hình 1: Biểu đồ tròn thể hiện số sinh viên tham gia khảo sát theo giới tính', x = ' ', y = ' ')

Theo kết quả ta thấy có:
323 sinh viên là Nữ tham gia khảo sát.
356 sinh viên là Nam tham gia khảo sát.
321 sinh viên tham gia khảo sát chưa xác định giới tính.
Biểu đồ 2
a %>% group_by(preferred_payment_method) %>% summarise(n = n()) %>%
ggplot(aes(x = '', y = n,fill = preferred_payment_method)) +
geom_col(color = 'black') +
coord_polar('y') +
geom_text(aes(x = 1.3, label = n),position = position_stack(vjust = .5)) +
theme_void() +
labs(title = 'Hình 2: Biểu đồ tròn thể hiện các phương thức thanh toán yêu thích của sinh viên', x = ' ', y = ' ')

Theo kết quả ta có:
Có 310 sinh viên thích trả bằng tiền mặt.
Có 340 sinh viên thích trả bằng tiền thẻ.
Có 350 sinh viên thích trả bằng qua app.
Biểu đồ 3
library(ggplot2)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.0
## ✔ readr 2.1.5
## ── 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(dplyr)
a %>% group_by(major) %>% summarise(n = n()) %>%
ggplot(aes(major,n)) +
geom_col(fill='maroon') +
geom_text(aes(label = n),vjust = 2, color = 'white') +
labs(title = 'Hình 3: Biểu đồ bar chart tổng số lượng sinh viên theo ngành', x = 'Ngành học', y = 'Số lượng')

Theo kết quả trả về:
Có 228 sinh viên là ngành Sinh học tham gia khảo sát
Có 192 sinh viên là ngành Khoa học Máy tính tham gia khảo
sát
Có 204 sinh viên là ngành Kinh tế tham gia khảo sát
Có 192 sinh viên là ngành Kiến trúc tham gia khảo sát
Có 184 sinh viên là ngành Tâm lý tham gia khảo sát
Biểu đồ 4
a %>% ggplot(aes(x = monthly_income)) +
geom_histogram(binwidth = 100, fill = 'khaki', color = 'black') +
labs(title = 'Hình 4: Biểu đồ Histogram thể hiện lương tháng của sinh viên', x = 'Lương tháng', y = 'Số tiền')

Biểu đồ Histogram thể hiện tần số lương tháng của sinh viên tính bằng
đô la.
Biểu đồ 5
a %>% ggplot(aes(x = financial_aid)) +
geom_histogram(binwidth = 100, fill = 'green', color = 'black') +
labs(title = 'Hình 5: Biểu đồ Histogram thể hiện mức hỗ trợ tài chính nhận được bởi sinh viên', x = 'Mức hỗ trợ', y = 'Số tiền')

Biểu đồ Histogram thể hiện tần số mức độ hỗ trợ mà sinh viên nhận
được tính bằng đô la.
Biểu đồ 6
a %>% ggplot(aes(x = tuition)) +
geom_density(fill = 'navy') +
labs(title = 'Hình 6: Biểu đồ mật độ chi phí học phí của sinh viên', x = 'Chi phí học phí', y = 'Tỉ trọng' )

Biểu đồ 7
library(dplyr)
a %>% ggplot(aes(x = entertainment, y = monthly_income, color = year_in_school)) +
labs(title = 'Hình 7: Biểu đồ phân tán chi phí giải trí so với lương tháng của từng sinh viên', x = 'Chi phí giải trí', y = 'Lương tháng') +
geom_point()

Biểu đồ phân tán thể hiện mức độ sinh viên chi vào lĩnh vực giải trí.
Kết quả trả về cho chúng ta thấy, dù là sinh viên năm mấy thì nhu cầu
giải trí cũng phân bố đều (không tùy thuộc vào lương tháng).
Biểu đồ 8
library(ggplot2)
density_plot <- ggplot(a, aes(x = food, fill = gender)) +
geom_density(alpha = 0.75) +
labs(title = 'Hình 8: Đồ thị desity plot chi phí ăn uống của sinh viên theo giới tính', x = 'Chi phí ăn uống', y = 'Density', fill = 'Species')
print(density_plot)

Kết quả trả về cho thấy sinh viên là nữ thường có xu hướng trả chi
phí nhiều cho bữa ăn hơn với các giới tính còn lại. Giới tính là nam và
chưa xác định được giới tính có mức độ trả chi phí ăn uống gần như là
đều nhau.
Biểu đồ 9
a %>% ggplot(aes(x = as.factor(major), y = transportation, fill = as.factor(major))) +
geom_violin() +
labs(x = "Chi phí di chuyển", y = "Số tiền") +
ggtitle("Hình 9: Biểu đồ violin plot chi phí di chuyển của sinh viên theo ngành học") +
theme_minimal()
Biểu đồ cho ta thấy mật độ phân phối của chi phí di chuyển của sinh viên
theo 5 ngành học khác nhau. Cả 5 ngành học đều có chi phí di chuyển cao,
phân bố chủ yếu đều nhau.
Biểu đồ 10
a %>% ggplot(aes(x = year_in_school, y = tuition, fill = year_in_school)) +
geom_violin() +
labs(x = "Năm học", y = "Học phí",
title = "Hình 10: Học phí của sinh viên theo năm")

Biểu đồ thể hiện mức độ học phí theo từng năm của sinh viên. Kết quả
trả về cho thấy sinh viên năm 2 vào những khoảng thời gian đầu có mức
học phí khá ít so với 3 năm còn lại. Tuy vậy nhưng học phí của 4 năm lại
phân bố khá đều nhau.
Biểu đồ 11
a %>% ggplot(aes(x = factor(gender), y =entertainment, fill = factor(gender))) +
geom_boxplot() +
labs(x = "Giới tính", y = "Chi phí giải trí", fill = "Giới tính") +
ggtitle("Hình 11: Biểu đồ Boxplot của chi phí giải trí theo giới tính sinh viên")

Biểu đồ cho thấy các giá trị như trung vị, tứ phân vị và các giá trị
ngoại vi có thể xuất hiện
Biểu đồ 12
a %>% group_by(major) %>% summarise(n = n()) %>%
ggplot(aes(x = '', y = n,fill = major)) +
geom_col() +
geom_text(aes(label = n),position = position_stack(vjust = 1)) +
labs(title = 'Hình 12 Biểu đồ pie thể hiện số sinh viên tham gia khảo sát theo 5 ngành học', x = 'Ngành học', y = 'Số lượng')

Biểu đồ 12 giống biểu đồ số 3, nhưng khác nhau về mặt hình thucws để
giúp người nghiên cứu có cái nhìn tổng quát hơn.
Biểu đồ 13
a %>% ggplot(aes(x= food, color=year_in_school)) +
geom_freqpoly(linewidth = 1) +
labs(title = "Hình 13: Biểu đồ tần số chi tiêu ăn uống của sinh viên theo năm học") +
labs(x = 'Sinh viên theo năm học', y = 'Chi phí ăn uống')
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiTmd1eeG7hW4gUGjhuqFtIFRow7p5IEFuIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogdHJ1ZQ0KICAgIG51bWJlciBzZWN0aW9uOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojICoqR0nhu5pJIFRISeG7hlUqKg0KKioqDQojIyAqKjEuIE5oaeG7h20gduG7pSoqDQoNClnDqnUgY+G6p3U6IFbhur0gMjAgxJHhu5MgdGjhu4sgKGtow6FjIG5oYXUpIMSR4buDIG3DtCB04bqjIHbDoCBwaMOibiB0w61jaCBjaG8gZOG7ryBsaeG7h3UgdOG7sSB0w6xtIMSRxrDhu6NjLg0KDQojIyAqKjIuIELhu5kgZOG7ryBsaeG7h3UgU3R1ZGVudCBTcGVuZGluZyBIYWJpdHMgRGF0YXNldCoqDQoNCmBgYHtyfQ0KYSA8LSByZWFkLmNzdihmaWxlID0gJ0M6L1VzZXJzL0FkbWluL0Rvd25sb2Fkcy9TdHVkZW50IFNwZW5kaW5nIEhhYml0cyBEYXRhc2V0LmNzdicsIGhlYWRlciA9IFQpICNnw6FuIGThu68gbGnhu4d1IHbDoG8gYQ0KDQpkaW0oYSkNCm5hbWVzKGEpDQpgYGANCg0KQuG7mSBk4buvIGxp4buHdSAqKlN0dWRlbnQgU3BlbmRpbmcgSGFiaXRzKiogY2jhu6lhIHRow7RuZyB0aW4gZ2nhuqMgdMaw4bufbmcgduG7gSB0aMOzaSBxdWVuIGNoaSB0acOqdSBj4bunYSAxMDAwIHNpbmggdmnDqm4gdGh14buZYyBuaGnhu4F1IG5ow7NtIGTDom4gc+G7kSB2w6AgbuG7gW4gaOG7jWMgduG7pSBraMOhYyBuaGF1LiANCg0KQuG7mSBk4buvIGxp4buHdSBiYW8gZ+G7k20gdGjDtG5nIHRpbiBuaMawIHR14buVaSwgZ2nhu5tpIHTDrW5oLCBuxINtIGjhu41jLCBuZ8OgbmggaOG7jWMsIHRodSBuaOG6rXAgaMOgbmcgdGjDoW5nLCBo4buXIHRy4bujIHTDoGkgY2jDrW5oIG5o4bqtbiDEkcaw4bujYywgdsOgIGPDoWMgY2hpIHBow60gdHJvbmcgY8OhYyBkYW5oIG3hu6VjIGNoaSB0acOqdSBraMOhYyBuaGF1LiBDw6FjIGRhbmggbeG7pWMgY2hpIHRpw6p1IGJhbyBn4buTbSBo4buNYyBwaMOtLCBuaMOgIOG7nywgdGjhu6ljIMSDbiwgZ2lhbyB0aMO0bmcsIHPDoWNoICYgduG6rXQgbGnhu4d1IGjhu41jIHThuq1wLCBnaeG6o2kgdHLDrSwgY2jEg20gc8OzYyBjw6EgbmjDom4sIGPDtG5nIG5naOG7hywgc+G7qWMga2jhu49lICYgcGjDumMgbOG7o2ksIHbDoCBjw6FjIGNoaSBwaMOtIMSRYSBk4bqhbmcga2jDoWMuDQpOZ2/DoGkgcmEsIGLhu5kgZOG7ryBsaeG7h3UgY8WpbmcgYmFvIGfhu5NtIHBoxrDGoW5nIHRo4bupYyB0aGFuaCB0b8OhbiDGsGEgdGjDrWNoIGPhu6dhIHThu6tuZyBzaW5oIHZpw6puLg0KDQpDw6FjIG5ow6AgbmdoacOqbiBj4bupdSwgZ2nDoW8gdmnDqm4sIHbDoCBzaW5oIHZpw6puIGPDsyB0aOG7gyB04bqtbiBk4bulbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IMSR4buDIHRo4buxYyBoaeG7h24gcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdGjDoW0gaGnhu4NtLCBtw7QgaMOsbmggZOG7sSDEkW/DoW4sIHbDoCBwaMOhdCB0cmnhu4NuIHRow7RuZyB0aW4gduG7gSBow6BuaCB2aSB0w6BpIGNow61uaCBj4bunYSBzaW5oIHZpw6puLg0KDQpDw6FjIGJp4bq/biBj4bunYSBi4buZIGThu68gbGnhu4d1IGJhbyBn4buTbToNCg0KKiAqKkFhZSoqOiBUdeG7lWkgY+G7p2Egc2luaCB2acOqbiAodGhlbyBuxINtKQ0KDQoqICoqZ2VuZGVyKiogOiBHaeG7m2kgdMOtbmggY+G7p2Egc2luaCB2acOqbiAoTmFtLCBO4buvLCBLaMOhYykNCg0KKiAqKnllYXJfaW5fc2Nob29sKio6IE7Eg20gaOG7jWMgY+G7p2Egc2luaCB2acOqbiAoTsSDbSBuaOG6pXQsIE7Eg20gaGFpLCBOxINtIGJhLCBOxINtIHTGsCkNCg0KKiAqKm1ham9yKio6IEzEqW5oIHbhu7FjIGjhu41jIGhv4bq3YyBjaHV5w6puIG5nw6BuaA0KDQoqICoqbW9udGhseV9pbmNvbWUqKjogVGh1IG5o4bqtcCBow6BuZyB0aMOhbmcgY+G7p2Egc2luaCB2acOqbiAoYuG6sW5nIMSRw7QgbGEpDQoNCiogKipmaW5hbmNpYWxfYWlkKio6IEjhu5cgdHLhu6MgdMOgaSBjaMOtbmggbmjhuq1uIMSRxrDhu6NjIGLhu59pIHNpbmggdmnDqm4gKGLhurFuZyDEkcO0IGxhKQ0KDQoqICoqdHVpdGlvbioqOiBDaGkgcGjDrSBo4buNYyBwaMOtIChi4bqxbmcgxJHDtCBsYSkNCg0KKiAqKmhvdXNpbmcqKjogQ2hpIHBow60gbmjDoCDhu58gKGLhurFuZyDEkcO0IGxhKQ0KDQoqICoqZm9vZCoqOiBDaGkgcGjDrSB0aOG7qWMgxINuIChi4bqxbmcgxJHDtCBsYSkNCg0KKiAqKnRyYW5zcG9ydGF0aW9uKio6IENoaSBwaMOtIGdpYW8gdGjDtG5nIChi4bqxbmcgxJHDtCBsYSkNCg0KKiAqKmJvb2tzX3N1cHBsaWVzKio6IENoaSBwaMOtIHPDoWNoIHbDoCB24bqtdCBsaeG7h3UgaOG7jWMgdOG6rXAgKGLhurFuZyDEkcO0IGxhKQ0KDQoqICoqZW50ZXJ0YWlubWVudCoqOiBDaGkgcGjDrSBnaeG6o2kgdHLDrSAoYuG6sW5nIMSRw7QgbGEpDQoNCiogKipwZXJzb25hbF9jYXJlKio6IENoaSBwaMOtIHPhuqNuIHBo4bqpbSBjaMSDbSBzw7NjIGPDoSBuaMOibiAoYuG6sW5nIMSRw7QgbGEpDQoNCiogKip0ZWNobm9sb2d5Kio6IENoaSBwaMOtIGPDtG5nIG5naOG7hyAoYuG6sW5nIMSRw7QgbGEpDQoNCiogKipoZWFsdGhfd2VsbG5lc3MqKjogQ2hpIHBow60gc+G7qWMga2jhu49lIHbDoCBwaMO6YyBs4bujaSAoYuG6sW5nIMSRw7QgbGEpDQoNCiogKiptaXNjZWxsYW5lb3VzKio6IEPDoWMgY2hpIHBow60gxJFhIGThuqFuZyBraMOhYyAoYuG6sW5nIMSRw7QgbGEpDQoNCiogKipwcmVmZXJyZWRfcGF5bWVudF9tZXRob2QqKjogUGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIMawYSB0aMOtY2ggKFRp4buBbiBt4bq3dCwgVGjhursgdMOtbiBk4bulbmcvVGjhursgZ2hpIG7hu6MsIOG7qG5nIGThu6VuZyB0aGFuaCB0b8OhbiBkaSDEkeG7mW5nKQ0KDQojICoqUEjDgk4gVMONQ0ggQuG7mCBE4buuIExJ4buGVSoqDQojIyMgQmnhu4N1IMSR4buTIDENCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCg0KYSAlPiUgZ3JvdXBfYnkoZ2VuZGVyKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAnJywgeSA9IG4sZmlsbCA9IGdlbmRlcikpICsNCiAgICBnZW9tX2NvbChjb2xvciA9ICdibGFjaycpICsNCiAgICBjb29yZF9wb2xhcigneScpICsNCiAgICBnZW9tX3RleHQoYWVzKHggPSAxLjMsIGxhYmVsID0gbikscG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IC41KSkgKw0KICAgIHRoZW1lX3ZvaWQoKSArDQogbGFicyh0aXRsZSA9ICdIw6xuaCAxOiBCaeG7g3UgxJHhu5MgdHLDsm4gdGjhu4MgaGnhu4duIHPhu5Egc2luaCB2acOqbiB0aGFtIGdpYSBraOG6o28gc8OhdCB0aGVvIGdp4bubaSB0w61uaCcsIHggPSAnICcsIHkgPSAnICcpDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0YSB0aOG6pXkgY8OzOg0KDQoqIDMyMyBzaW5oIHZpw6puIGzDoCBO4buvIHRoYW0gZ2lhIGto4bqjbyBzw6F0Lg0KDQoqIDM1NiBzaW5oIHZpw6puIGzDoCBOYW0gdGhhbSBnaWEga2jhuqNvIHPDoXQuDQoNCiogMzIxIHNpbmggdmnDqm4gdGhhbSBnaWEga2jhuqNvIHPDoXQgY2jGsGEgeMOhYyDEkeG7i25oIGdp4bubaSB0w61uaC4NCg0KIyMjIEJp4buDdSDEkeG7kyAyDQoNCmBgYHtyfQ0KYSAlPiUgZ3JvdXBfYnkocHJlZmVycmVkX3BheW1lbnRfbWV0aG9kKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAnJywgeSA9IG4sZmlsbCA9IHByZWZlcnJlZF9wYXltZW50X21ldGhvZCkpICsNCiAgICBnZW9tX2NvbChjb2xvciA9ICdibGFjaycpICsNCiAgICBjb29yZF9wb2xhcigneScpICsNCiAgICBnZW9tX3RleHQoYWVzKHggPSAxLjMsIGxhYmVsID0gbikscG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IC41KSkgKw0KICAgIHRoZW1lX3ZvaWQoKSArDQogbGFicyh0aXRsZSA9ICdIw6xuaCAyOiBCaeG7g3UgxJHhu5MgdHLDsm4gdGjhu4MgaGnhu4duIGPDoWMgcGjGsMahbmcgdGjhu6ljIHRoYW5oIHRvw6FuIHnDqnUgdGjDrWNoIGPhu6dhIHNpbmggdmnDqm4nLCB4ID0gJyAnLCB5ID0gJyAnKQ0KYGBgDQoNClRoZW8ga+G6v3QgcXXhuqMgdGEgY8OzOg0KDQoqIEPDsyAzMTAgc2luaCB2acOqbiB0aMOtY2ggdHLhuqMgYuG6sW5nIHRp4buBbiBt4bq3dC4NCg0KKiBDw7MgMzQwICBzaW5oIHZpw6puIHRow61jaCB0cuG6oyBi4bqxbmcgdGnhu4FuIHRo4bq7Lg0KDQoqIEPDsyAzNTAgc2luaCB2acOqbiB0aMOtY2ggdHLhuqMgYuG6sW5nIHF1YSBhcHAuDQoNCiMjIyBCaeG7g3UgxJHhu5MgMw0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShkcGx5cikNCg0KYSAlPiUgZ3JvdXBfYnkobWFqb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMobWFqb3IsbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdtYXJvb24nKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKSArDQogICAgbGFicyh0aXRsZSA9ICdIw6xuaCAzOiBCaeG7g3UgxJHhu5MgYmFyIGNoYXJ0IHThu5VuZyBz4buRIGzGsOG7o25nIHNpbmggdmnDqm4gdGhlbyBuZ8OgbmgnLCB4ID0gJ05nw6BuaCBo4buNYycsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KVGhlbyBr4bq/dCBxdeG6oyB0cuG6oyB24buBOg0KDQoqIEPDsyAyMjggc2luaCB2acOqbiBsw6AgbmfDoG5oIFNpbmggaOG7jWMgdGhhbSBnaWEga2jhuqNvIHPDoXQNCg0KKiBDw7MgMTkyIHNpbmggdmnDqm4gbMOgIG5nw6BuaCBLaG9hIGjhu41jIE3DoXkgdMOtbmggdGhhbSBnaWEga2jhuqNvIHPDoXQNCg0KKiBDw7MgMjA0IHNpbmggdmnDqm4gbMOgIG5nw6BuaCBLaW5oIHThur8gdGhhbSBnaWEga2jhuqNvIHPDoXQNCg0KKiBDw7MgMTkyIHNpbmggdmnDqm4gbMOgIG5nw6BuaCBLaeG6v24gdHLDumMgdGhhbSBnaWEga2jhuqNvIHPDoXQNCg0KKiBDw7MgMTg0IHNpbmggdmnDqm4gbMOgIG5nw6BuaCBUw6JtIGzDvSB0aGFtIGdpYSBraOG6o28gc8OhdA0KDQojIyMgQmnhu4N1IMSR4buTIDQNCg0KYGBge3J9DQphICU+JSBnZ3Bsb3QoYWVzKHggPSBtb250aGx5X2luY29tZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMDAsIGZpbGwgPSAna2hha2knLCBjb2xvciA9ICdibGFjaycpICsNCiAgbGFicyh0aXRsZSA9ICdIw6xuaCA0OiBCaeG7g3UgxJHhu5MgSGlzdG9ncmFtIHRo4buDIGhp4buHbiBsxrDGoW5nIHRow6FuZyBj4bunYSBzaW5oIHZpw6puJywgeCA9ICdMxrDGoW5nIHRow6FuZycsIHkgPSAnU+G7kSB0aeG7gW4nKQ0KYGBgDQoNCkJp4buDdSDEkeG7kyBIaXN0b2dyYW0gdGjhu4MgaGnhu4duIHThuqduIHPhu5EgbMawxqFuZyB0aMOhbmcgY+G7p2Egc2luaCB2acOqbiB0w61uaCBi4bqxbmcgxJHDtCBsYS4NCg0KIyMjIEJp4buDdSDEkeG7kyA1DQoNCmBgYHtyfQ0KYSAlPiUgZ2dwbG90KGFlcyh4ID0gZmluYW5jaWFsX2FpZCkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAxMDAsIGZpbGwgPSAnZ3JlZW4nLCBjb2xvciA9ICdibGFjaycpICsNCiAgbGFicyh0aXRsZSA9ICdIw6xuaCA1OiBCaeG7g3UgxJHhu5MgSGlzdG9ncmFtIHRo4buDIGhp4buHbiBt4bupYyBo4buXIHRy4bujIHTDoGkgY2jDrW5oIG5o4bqtbiDEkcaw4bujYyBi4bufaSBzaW5oIHZpw6puJywgeCA9ICdN4bupYyBo4buXIHRy4bujJywgeSA9ICdT4buRIHRp4buBbicpDQpgYGANCg0KQmnhu4N1IMSR4buTIEhpc3RvZ3JhbSB0aOG7gyBoaeG7h24gdOG6p24gc+G7kSBt4bupYyDEkeG7mSBo4buXIHRy4bujIG3DoCBzaW5oIHZpw6puIG5o4bqtbiDEkcaw4bujYyB0w61uaCBi4bqxbmcgxJHDtCBsYS4NCg0KIyMjIEJp4buDdSDEkeG7kyA2DQoNCmBgYHtyfQ0KYSAlPiUgZ2dwbG90KGFlcyh4ID0gdHVpdGlvbikpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAnbmF2eScpICsgDQogIGxhYnModGl0bGUgPSAnSMOsbmggNjogQmnhu4N1IMSR4buTIG3huq10IMSR4buZIGNoaSBwaMOtIGjhu41jIHBow60gY+G7p2Egc2luaCB2acOqbicsIHggPSAnQ2hpIHBow60gaOG7jWMgcGjDrScsIHkgPSAnVOG7iSB0cuG7jW5nJyApDQpgYGANCg0KIyMjIEJp4buDdSDEkeG7kyA3DQoNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCg0KYSAlPiUgZ2dwbG90KGFlcyh4ID0gZW50ZXJ0YWlubWVudCwgeSA9IG1vbnRobHlfaW5jb21lLCBjb2xvciA9IHllYXJfaW5fc2Nob29sKSkgKw0KICBsYWJzKHRpdGxlID0gJ0jDrG5oIDc6IEJp4buDdSDEkeG7kyBwaMOibiB0w6FuIGNoaSBwaMOtIGdp4bqjaSB0csOtIHNvIHbhu5tpIGzGsMahbmcgdGjDoW5nIGPhu6dhIHThu6tuZyBzaW5oIHZpw6puJywgeCA9ICdDaGkgcGjDrSBnaeG6o2kgdHLDrScsIHkgPSAnTMawxqFuZyB0aMOhbmcnKSArDQogIGdlb21fcG9pbnQoKSANCmBgYA0KDQpCaeG7g3UgxJHhu5MgcGjDom4gdMOhbiB0aOG7gyBoaeG7h24gbeG7qWMgxJHhu5kgc2luaCB2acOqbiBjaGkgdsOgbyBsxKluaCB24buxYyBnaeG6o2kgdHLDrS4gS+G6v3QgcXXhuqMgdHLhuqMgduG7gSBjaG8gY2jDum5nIHRhIHRo4bqleSwgZMO5IGzDoCBzaW5oIHZpw6puIG7Eg20gbeG6pXkgdGjDrCBuaHUgY+G6p3UgZ2nhuqNpIHRyw60gY8WpbmcgcGjDom4gYuG7kSDEkeG7gXUgKGtow7RuZyB0w7l5IHRodeG7mWMgdsOgbyBsxrDGoW5nIHRow6FuZykuDQoNCiMjIyBCaeG7g3UgxJHhu5MgOA0KDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCg0KZGVuc2l0eV9wbG90IDwtIGdncGxvdChhLCBhZXMoeCA9IGZvb2QsIGZpbGwgPSBnZW5kZXIpKSArDQogIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNzUpICsNCiAgbGFicyh0aXRsZSA9ICdIw6xuaCA4OiDEkOG7kyB0aOG7iyBkZXNpdHkgcGxvdCBjaGkgcGjDrSDEg24gdeG7kW5nIGPhu6dhIHNpbmggdmnDqm4gdGhlbyBnaeG7m2kgdMOtbmgnLCB4ID0gJ0NoaSBwaMOtIMSDbiB14buRbmcnLCB5ID0gJ0RlbnNpdHknLCBmaWxsID0gJ1NwZWNpZXMnKQ0KDQpwcmludChkZW5zaXR5X3Bsb3QpDQpgYGANCg0KS+G6v3QgcXXhuqMgdHLhuqMgduG7gSBjaG8gdGjhuqV5IHNpbmggdmnDqm4gbMOgIG7hu68gdGjGsOG7nW5nIGPDsyB4dSBoxrDhu5tuZyB0cuG6oyBjaGkgcGjDrSBuaGnhu4F1IGNobyBi4buvYSDEg24gaMahbiB24bubaSBjw6FjIGdp4bubaSB0w61uaCBjw7JuIGzhuqFpLiBHaeG7m2kgdMOtbmggbMOgIG5hbSB2w6AgY2jGsGEgeMOhYyDEkeG7i25oIMSRxrDhu6NjIGdp4bubaSB0w61uaCBjw7MgbeG7qWMgxJHhu5kgdHLhuqMgY2hpIHBow60gxINuIHXhu5FuZyBn4bqnbiBuaMawIGzDoCDEkeG7gXUgbmhhdS4NCg0KIyMjIEJp4buDdSDEkeG7kyA5DQoNCmBgYHtyfQ0KYSAlPiUgZ2dwbG90KGFlcyh4ID0gYXMuZmFjdG9yKG1ham9yKSwgeSA9IHRyYW5zcG9ydGF0aW9uLCBmaWxsID0gYXMuZmFjdG9yKG1ham9yKSkpICsNCiAgZ2VvbV92aW9saW4oKSArIA0KICBsYWJzKHggPSAiQ2hpIHBow60gZGkgY2h1eeG7g24iLCB5ID0gIlPhu5EgdGnhu4FuIikgKw0KICBnZ3RpdGxlKCJIw6xuaCA5OiBCaeG7g3UgxJHhu5MgdmlvbGluIHBsb3QgY2hpIHBow60gZGkgY2h1eeG7g24gY+G7p2Egc2luaCB2acOqbiB0aGVvIG5nw6BuaCBo4buNYyIpICsgDQogIHRoZW1lX21pbmltYWwoKSANCmBgYA0KQmnhu4N1IMSR4buTIGNobyB0YSB0aOG6pXkgbeG6rXQgxJHhu5kgcGjDom4gcGjhu5FpIGPhu6dhIGNoaSBwaMOtIGRpIGNodXnhu4NuIGPhu6dhIHNpbmggdmnDqm4gdGhlbyA1IG5nw6BuaCBo4buNYyBraMOhYyBuaGF1LiBD4bqjIDUgbmfDoG5oIGjhu41jIMSR4buBdSBjw7MgY2hpIHBow60gZGkgY2h1eeG7g24gY2FvLCBwaMOibiBi4buRIGNo4bunIHnhur91IMSR4buBdSBuaGF1LiANCg0KIyMjIEJp4buDdSDEkeG7kyAxMA0KDQpgYGB7cn0NCmEgJT4lIGdncGxvdChhZXMoeCA9IHllYXJfaW5fc2Nob29sLCB5ID0gdHVpdGlvbiwgZmlsbCA9IHllYXJfaW5fc2Nob29sKSkgKyANCiAgZ2VvbV92aW9saW4oKSArDQogIGxhYnMoeCA9ICJOxINtIGjhu41jIiwgeSA9ICJI4buNYyBwaMOtIiwNCiAgICAgICB0aXRsZSA9ICJIw6xuaCAxMDogSOG7jWMgcGjDrSBj4bunYSBzaW5oIHZpw6puIHRoZW8gbsSDbSIpIA0KYGBgDQoNCkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gbeG7qWMgxJHhu5kgaOG7jWMgcGjDrSB0aGVvIHThu6tuZyBuxINtIGPhu6dhIHNpbmggdmnDqm4uIEvhur90IHF14bqjIHRy4bqjIHbhu4EgY2hvIHRo4bqleSBzaW5oIHZpw6puIG7Eg20gMiB2w6BvIG5o4buvbmcga2hv4bqjbmcgdGjhu51pIGdpYW4gxJHhuqd1IGPDsyBt4bupYyBo4buNYyBwaMOtIGtow6Egw610IHNvIHbhu5tpIDMgbsSDbSBjw7JuIGzhuqFpLiBUdXkgduG6rXkgbmjGsG5nIGjhu41jIHBow60gY+G7p2EgNCBuxINtIGzhuqFpIHBow6JuIGLhu5Ega2jDoSDEkeG7gXUgbmhhdS4NCg0KIyMjIEJp4buDdSDEkeG7kyAxMQ0KDQpgYGB7cn0NCmEgJT4lIGdncGxvdChhZXMoeCA9IGZhY3RvcihnZW5kZXIpLCB5ID1lbnRlcnRhaW5tZW50LCBmaWxsID0gZmFjdG9yKGdlbmRlcikpKSArIA0KICBnZW9tX2JveHBsb3QoKSArIA0KICBsYWJzKHggPSAiR2nhu5tpIHTDrW5oIiwgeSA9ICJDaGkgcGjDrSBnaeG6o2kgdHLDrSIsIGZpbGwgPSAiR2nhu5tpIHTDrW5oIikgKyANCiAgZ2d0aXRsZSgiSMOsbmggMTE6IEJp4buDdSDEkeG7kyBCb3hwbG90IGPhu6dhIGNoaSBwaMOtIGdp4bqjaSB0csOtIHRoZW8gZ2nhu5tpIHTDrW5oIHNpbmggdmnDqm4iKSANCmBgYA0KDQpCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBjw6FjIGdpw6EgdHLhu4sgbmjGsCB0cnVuZyB24buLLCB04bupIHBow6JuIHbhu4sgdsOgIGPDoWMgZ2nDoSB0cuG7iyBuZ2/huqFpIHZpIGPDsyB0aOG7gyB4deG6pXQgaGnhu4duDQoNCiMjIyBCaeG7g3UgxJHhu5MgMTINCmBgYHtyfQ0KYSAlPiUgZ3JvdXBfYnkobWFqb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9ICcnLCB5ID0gbixmaWxsID0gbWFqb3IpKSArDQogICAgZ2VvbV9jb2woKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAxKSkgKw0KICBsYWJzKHRpdGxlID0gJ0jDrG5oIDEyIEJp4buDdSDEkeG7kyBwaWUgdGjhu4MgaGnhu4duIHPhu5Egc2luaCB2acOqbiB0aGFtIGdpYSBraOG6o28gc8OhdCB0aGVvIDUgbmfDoG5oIGjhu41jJywgeCA9ICdOZ8OgbmggaOG7jWMnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCkJp4buDdSDEkeG7kyAxMiBnaeG7kW5nIGJp4buDdSDEkeG7kyBz4buRIDMsIG5oxrBuZyBraMOhYyBuaGF1IHbhu4EgbeG6t3QgaMOsbmggdGh1Y3dzIMSR4buDIGdpw7pwIG5nxrDhu51pIG5naGnDqm4gY+G7qXUgY8OzIGPDoWkgbmjDrG4gdOG7lW5nIHF1w6F0IGjGoW4uDQoNCiMjIyBCaeG7g3UgxJHhu5MgMTMNCg0KYGBge3J9DQphICU+JSBnZ3Bsb3QoYWVzKHg9IGZvb2QsIGNvbG9yPXllYXJfaW5fc2Nob29sKSkgKyANCiAgZ2VvbV9mcmVxcG9seShsaW5ld2lkdGggPSAxKSArDQogIGxhYnModGl0bGUgPSAiSMOsbmggMTM6IEJp4buDdSDEkeG7kyB04bqnbiBz4buRIGNoaSB0acOqdSDEg24gdeG7kW5nIGPhu6dhIHNpbmggdmnDqm4gdGhlbyBuxINtIGjhu41jIikgKw0KICBsYWJzKHggPSAnU2luaCB2acOqbiB0aGVvIG7Eg20gaOG7jWMnLCB5ID0gJ0NoaSBwaMOtIMSDbiB14buRbmcnKQ0KYGBgDQo=