Thống kê mô tả đơn biến trong tập Supermarket
Transactions.csv
# Đọc file csv
data <- read.csv("C:/Users/HP/Downloads/Supermarket Transactions (1).csv", stringsAsFactors = FALSE)
# Lấy tên các biến định tính
categorical_vars <- c(
"Gender", "MaritalStatus", "Homeowner", "AnnualIncome",
"City", "StateorProvince", "Country",
"ProductFamily", "ProductDepartment", "ProductCategory"
)
Biến Gender (Giới tính)
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
ggplot(data, aes(x = Gender)) +
geom_bar(fill = "darkblue") +
theme_minimal() +
labs(title = "Biểu đồ tần suất theo Giới tính", x = "Giới tính", y = "Tần suất")

Tỷ lệ khách hàng theo giới tính khá cân bằng giữa nam (M) và nữ
(F).
Nữ chiếm 51%, nhỉnh hơn một chút so với nam là 49%.
Điều này cho thấy không có sự chênh lệch lớn về giới tính trong
mẫu dữ liệu này.
Cửa hàng/công ty có thể thiết kế chiến lược marketing không cần
phân biệt giới tính mạnh, vì cả hai nhóm khách hàng đều tương đương về
tỷ lệ.
Biến MaritalStatus (Tình trạng hôn nhân)
library(ggplot2)
table(data$MaritalStatus)
##
## M S
## 6866 7193
ggplot(data, aes(x = MaritalStatus)) +
geom_bar(fill = "lightblue") +
theme_minimal() +
labs(title = "Tình trạng hôn nhân", x = "Marital Status", y = "Tan suat")

Nhận xét
Số lượng khách hàng độc thân (Single – ký hiệu S) là 7.193 người
(51.16%), còn người đã kết hôn (Married – M) là 6.866 người
(48.84%).
Mặc dù tỷ lệ khá cân bằng, nhưng nhóm độc thân chiếm tỷ lệ cao
hơn một chút.
Giải thích hợp lý cho điều này có thể là:
Những người độc thân có xu hướng tự đi mua sắm nhiều hơn, không
dựa vào bạn đời.
Ngoài ra, người trẻ độc thân thường sống ở thành thị và sử dụng dịch
vụ siêu thị thường xuyên hơn, trong khi người đã kết hôn có thể mua theo
nhóm hoặc theo hộ gia đình lớn và ít giao dịch hơn trên mỗi cá nhân.
Biến Homeowner (Sở hữu nhà)
ggplot(data, aes(x = Homeowner)) +
geom_bar(fill = "darkgreen") +
theme_minimal() +
labs(title = "Sở hữu nhà", x = "Homeowner", y = "Tần suất")

Khoảng 60% khách hàng trong dữ liệu là người sở hữu nhà, trong khi
gần 40% không sở hữu nhà. Điều này phản ánh rằng phần lớn khách hàng của
siêu thị thuộc nhóm đã có điều kiện kinh tế ổn định hơn. Tuy nhiên, nhóm
không sở hữu nhà vẫn chiếm tỷ lệ đáng kể, cho thấy siêu thị cũng tiếp
cận được nhóm khách hàng thuê nhà hoặc chưa có nhà riêng.
Biến AnnualIncome (Thu nhập hàng năm – theo nhóm)
ggplot(data, aes(x = AnnualIncome)) +
geom_bar(fill = "orangered") +
theme_minimal() +
labs(title = "Thu nhập hàng năm", x = "Annual Income", y = "Tần suất") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

Điểm nổi bật:
Tập trung vào thu nhập tầm trung: Nhóm có thu
nhập trong khoảng 30K – 70K chiếm khoảng 50% tổng số
khách hàng. Đây chính là thị trường mục tiêu
chính.
Thu nhập thấp - trung (10K – 30K) vẫn chiếm gần
22%, cho thấy sự hiện diện rõ rệt của phân khúc tiết
kiệm. Nếu sản phẩm hoặc dịch vụ cần định giá, nên cân nhắc gói
giá phù hợp nhóm này.
Nhóm có thu nhập cao (> 90K) chỉ chiếm khoảng
16%. Riêng nhóm rất cao > 150K là
rất nhỏ. Do đó, các chiến dịch sản phẩm/dịch vụ cao cấp
cần nhắm đúng đối tượng, tránh lan rộng thiếu hiệu
quả.
Phân bố thu nhập bị lệch trái (left-skewed):
Phần lớn khách hàng thuộc nhóm thu nhập thấp - trung. Đỉnh phân
bố rơi vào nhóm 30K–50K, càng về mức cao thì số lượng càng
giảm.
Biến City (Thành phố)
ggplot(data, aes(x = City)) +
geom_bar(fill = "firebrick") +
theme_minimal() +
labs(title = "Thành phố", x = "Thành phố", y = "Tần suất") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

Nhận xét tổng quan:
Tập trung tại một số thành phố lớn:
Những thành phố có tỷ lệ khách hàng cao nhất bao gồm:
Salem (9.86%)
Tacoma (8.94%)
Los Angeles (6.59%)
Seattle (6.56%)
Portland (6.23%)
San Diego (6.16%)
→ Đây là những khu vực tập trung đông khách hàng
nhất, nên ưu tiên trong các chiến dịch marketing, phân
phối hoặc dịch vụ khách hàng.
Phân bố tương đối trải đều ở nhóm giữa:
Một số thành phố như Bremerton, Hidalgo, Spokane, Vancouver,… có tỷ
lệ khách hàng ở mức trung bình từ 3% đến 6%, đóng vai
trò bổ trợ quan trọng.
Nhóm có tỷ lệ thấp (dưới 2%):
Các thành phố như Guadalajara, Walla Walla, Victoria, San Francisco,
Bellingham,… có số lượng khách hàng thấp hơn, có thể không phải
là thị trường chính, nhưng có thể khai thác thêm nếu
muốn mở rộng.
Biến StateorProvince (Bang hoặc tỉnh)
ggplot(data, aes(x = StateorProvince)) +
geom_bar(fill = "gray25") +
theme_minimal() +
labs(title = "Biểu đồ tần suất theo Bang/Tỉnh", x = "Bang/Tỉnh", y = "Tần suất") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

Nhận xét tổng quan:
Tập trung mạnh tại bang WA (Washington):
Với 32.48% tổng số khách hàng (tương đương
4,567 khách), bang WA là thị trường trọng
điểm, cần được ưu tiên cao nhất trong các
chiến lược kinh doanh và tiếp thị.
Nhóm quan trọng thứ hai:
→ Tổng cộng ba bang WA, CA, OR đã chiếm đến
gần 70% tổng số khách hàng.
Đây là vùng thị trường cốt lõi, nên đầu tư mạnh về
nhân lực, quảng bá, dịch vụ hậu mãi tại khu vực này.
Bang có mức độ khách hàng trung bình:
Zacatecas (9.23%)
DF (5.80%)
BC (5.75%)
→ Đây là những khu vực phụ trợ đáng chú ý, có thể
cân nhắc triển khai các chương trình marketing khu vực nhỏ (regional
marketing).
Bang có tỷ lệ thấp (<5%):
Guerrero, Jalisco, Veracruz, Yucatan — tuy có số lượng khách ít hơn,
vẫn có thể cân nhắc tăng nhận diện thương hiệu, đặc
biệt nếu muốn mở rộng thị trường về phía Mexico.
Biến Country (Quốc gia)
ggplot(data, aes(x = Country)) +
geom_bar(fill = "deeppink") +
theme_minimal() +
labs(title = "Biểu đồ tần suất theo Quốc gia", x = "Quốc gia", y = "Tần suất") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

Nhận xét tổng quan:
Mỹ (USA) chiếm 68.01% tổng số
khách hàng – đây là thị trường chính yếu và áp đảo tuyệt
đối.
→ Các chiến lược kinh doanh, marketing, sản phẩm cần ưu tiên
tối đa cho khách hàng Hoa Kỳ.
Mexico chiếm 26.23% – là
thị trường phụ nhưng rất đáng chú ý với gần 1/4
tổng khách hàng.
→ Có thể cân nhắc bản địa hoá thông điệp, ưu đãi
hoặc sản phẩm dành riêng cho khu vực này.
Canada chỉ chiếm 5.75% – số
lượng tương đối nhỏ.
→ Không phải thị trường trọng tâm hiện tại, nhưng vẫn có thể được duy
trì như một khu vực vệ tinh hỗ trợ hoặc để thử
nghiệm sản phẩm mới.
Biến ProductFamily (Nhóm sản phẩm lớn)
ggplot(data, aes(x = ProductFamily)) +
geom_bar(fill = "darkslategray") +
theme_minimal() +
labs(title = "Nhóm sản phẩm", x = "Nhóm sản phẩm", y = "Tần suất") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:
Nhóm Food (thực phẩm) chiếm trên
72% tổng giao dịch, là mảng sản phẩm cốt lõi và chủ
đạo.
→ Các quyết định về danh mục, chất lượng, giá, khuyến mãi… nên
ưu tiên nhóm này.
Non-Consumable (phi tiêu dùng, như đồ gia dụng,
điện tử…) chiếm gần 19% – là mảng phụ nhưng
tiềm năng.
→ Có thể khai thác thêm về upsell hoặc
cross-sell với nhóm khách hàng mua Food.
Drink (thức uống) chỉ chiếm gần
9% – là mảng nhỏ, nên cân nhắc tập
trung vào các sản phẩm có biên lợi nhuận cao hoặc
liên kết combo với Food.
Biến ProductDepartment (Phòng ban sản phẩm)
ggplot(data, aes(x = ProductDepartment)) +
geom_bar(fill = "midnightblue") +
theme_minimal() +
labs(title = "Biểu đồ tần suất theo Bộ phận sản phẩm", x = "Bộ phận", y = "Tần suất") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

Nhận xét:
Produce (Rau quả tươi) là phòng ban
chiếm tỷ trọng lớn nhất (14.18%), thể hiện xu
hướng tiêu dùng thực phẩm tươi sống cao.
Snack Foods và Frozen Foods chiếm tỷ trọng lớn
thứ 2 và 3 → cho thấy nhu cầu cao với đồ ăn nhanh, tiện
lợi, thích hợp cho khách bận rộn hoặc gia đình.
Household (Đồ gia dụng) cũng chiếm hơn
10%, là sản phẩm thiết yếu trong đời sống → có thể kết
hợp bán chéo.
Các nhóm như Meat, Seafood,
Periodicals, Checkout,
Carousel… chiếm tỷ trọng rất nhỏ → không phải trọng tâm
hiện tại.
Biến ProductCategory (Danh mục sản phẩm cụ thể)
ggplot(data, aes(x = ProductCategory)) +
geom_bar(fill = "dodgerblue4") +
theme_minimal() +
labs(title = "Biểu đồ tần suất theo Loại sản phẩm", x = "Loại sản phẩm", y = "Tần suất") +
theme(axis.text.x = element_text(angle = 90, hjust = 1))

Nhận xét:
Vegetables là danh mục chiếm tỷ lệ cao nhất
(12.29%) → cho thấy ưu tiên hàng đầu với nhóm thực phẩm tươi
sống.
Snack Foods tiếp tục là danh mục chủ lực
(11.38%) → xu hướng tiêu dùng đồ ăn nhanh, tiện dụng rất rõ
ràng.
Dairy, Fruit và Meat đều nằm trong nhóm top 5 →
đây là những sản phẩm thiết yếu, tiêu dùng hàng
ngày.
Các danh mục như Canned Seafood (Canned Sardines, Tuna,
Shrimp…) có tỷ trọng thấp (~0.3–0.6%) → ít được quan tâm, có
thể là do khẩu vị, thói quen tiêu dùng.
Các danh mục có tỷ trọng rất thấp (<1%):
- Candles, Canned Clams, Miscellaneous, Electrical…
có lượng mua cực kỳ thấp → không phải ưu tiên chính trong chiến lược
kinh doanh.
LS0tDQp0aXRsZTogIkJUMiINCmF1dGhvcjogIlZvSGlldSINCmRhdGU6ICIyMDI1LTA1LTIwIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50OiANCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgdG9jOiB0cnVlDQogIHBkZl9kb2N1bWVudDoNCiAgICBsYXRleF9lbmdpbmU6IHhlbGF0ZXgNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQo8c3R5bGU+DQpib2R5IHsNCiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBzYW5zLXNlcmlmOw0KICBmb250LXNpemU6IDE1cHg7DQogIHRleHQtYWxpZ246IGp1c3RpZnk7DQogIGxpbmUtaGVpZ2h0OiAxLjU7DQo8L3N0eWxlPg0KDQojICoqVGjhu5FuZyBrw6ogbcO0IHThuqMgxJHGoW4gYmnhur9uIHRyb25nIHThuq1wIFN1cGVybWFya2V0IFRyYW5zYWN0aW9ucy5jc3YqKg0KDQpgYGB7cn0NCiMgxJDhu41jIGZpbGUgY3N2DQpkYXRhIDwtIHJlYWQuY3N2KCJDOi9Vc2Vycy9IUC9Eb3dubG9hZHMvU3VwZXJtYXJrZXQgVHJhbnNhY3Rpb25zICgxKS5jc3YiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQojIEzhuqV5IHTDqm4gY8OhYyBiaeG6v24gxJHhu4tuaCB0w61uaA0KY2F0ZWdvcmljYWxfdmFycyA8LSBjKA0KICAiR2VuZGVyIiwgIk1hcml0YWxTdGF0dXMiLCAiSG9tZW93bmVyIiwgIkFubnVhbEluY29tZSIsDQogICJDaXR5IiwgIlN0YXRlb3JQcm92aW5jZSIsICJDb3VudHJ5IiwNCiAgIlByb2R1Y3RGYW1pbHkiLCAiUHJvZHVjdERlcGFydG1lbnQiLCAiUHJvZHVjdENhdGVnb3J5Ig0KKQ0KYGBgDQojIEJp4bq/biBHZW5kZXIgKEdp4bubaSB0w61uaCkNCg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBHZW5kZXIpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZGFya2JsdWUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCB0aGVvIEdp4bubaSB0w61uaCIsIHggPSAiR2nhu5tpIHTDrW5oIiwgeSA9ICJU4bqnbiBzdeG6pXQiKQ0KYGBgDQoNCi0gVOG7tyBs4buHIGtow6FjaCBow6BuZyB0aGVvIGdp4bubaSB0w61uaCBraMOhIGPDom4gYuG6sW5nIGdp4buvYSBuYW0gKE0pIHbDoCBu4buvIChGKS4NCg0KLSBO4buvIGNoaeG6v20gNTElLCBuaOG7iW5oIGjGoW4gbeG7mXQgY2jDunQgc28gduG7m2kgbmFtIGzDoCA0OSUuDQoNCi0gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBz4buxIGNow6puaCBs4buHY2ggbOG7m24gduG7gSBnaeG7m2kgdMOtbmggdHJvbmcgbeG6q3UgZOG7ryBsaeG7h3UgbsOgeS4NCg0KLSBD4butYSBow6BuZy9jw7RuZyB0eSBjw7MgdGjhu4MgdGhp4bq/dCBr4bq/IGNoaeG6v24gbMaw4bujYyBtYXJrZXRpbmcga2jDtG5nIGPhuqduIHBow6JuIGJp4buHdCBnaeG7m2kgdMOtbmggbeG6oW5oLCB2w6wgY+G6oyBoYWkgbmjDs20ga2jDoWNoIGjDoG5nIMSR4buBdSB0xrDGoW5nIMSRxrDGoW5nIHbhu4EgdOG7tyBs4buHLg0KDQojIEJp4bq/biBNYXJpdGFsU3RhdHVzIChUw6xuaCB0cuG6oW5nIGjDtG4gbmjDom4pDQoNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KdGFibGUoZGF0YSRNYXJpdGFsU3RhdHVzKQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gTWFyaXRhbFN0YXR1cykpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJsaWdodGJsdWUiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiVMOsbmggdHLhuqFuZyBow7RuIG5ow6JuIiwgeCA9ICJNYXJpdGFsIFN0YXR1cyIsIHkgPSAiVGFuIHN1YXQiKQ0KYGBgDQoNCk5o4bqtbiB4w6l0DQoNCi0gU+G7kSBsxrDhu6NuZyBraMOhY2ggaMOgbmcgxJHhu5ljIHRow6JuIChTaW5nbGUg4oCTIGvDvSBoaeG7h3UgUykgbMOgIDcuMTkzIG5nxrDhu51pICg1MS4xNiUpLCBjw7JuIG5nxrDhu51pIMSRw6Mga+G6v3QgaMO0biAoTWFycmllZCDigJMgTSkgbMOgIDYuODY2IG5nxrDhu51pICg0OC44NCUpLg0KDQotIE3hurdjIGTDuSB04bu3IGzhu4cga2jDoSBjw6JuIGLhurFuZywgbmjGsG5nIG5ow7NtIMSR4buZYyB0aMOibiBjaGnhur9tIHThu7cgbOG7hyBjYW8gaMahbiBt4buZdCBjaMO6dC4NCg0KLSBHaeG6o2kgdGjDrWNoIGjhu6NwIGzDvSBjaG8gxJFp4buBdSBuw6B5IGPDsyB0aOG7gyBsw6A6DQoNCi0gTmjhu69uZyBuZ8aw4budaSDEkeG7mWMgdGjDom4gY8OzIHh1IGjGsOG7m25nIHThu7EgxJFpIG11YSBz4bqvbSBuaGnhu4F1IGjGoW4sIGtow7RuZyBk4buxYSB2w6BvIGLhuqFuIMSR4budaS4NCg0KTmdvw6BpIHJhLCBuZ8aw4budaSB0cuG6uyDEkeG7mWMgdGjDom4gdGjGsOG7nW5nIHPhu5FuZyDhu58gdGjDoG5oIHRo4buLIHbDoCBz4butIGThu6VuZyBk4buLY2ggduG7pSBzacOqdSB0aOG7iyB0aMaw4budbmcgeHV5w6puIGjGoW4sIHRyb25nIGtoaSBuZ8aw4budaSDEkcOjIGvhur90IGjDtG4gY8OzIHRo4buDIG11YSB0aGVvIG5ow7NtIGhv4bq3YyB0aGVvIGjhu5kgZ2lhIMSRw6xuaCBs4bubbiB2w6Agw610IGdpYW8gZOG7i2NoIGjGoW4gdHLDqm4gbeG7l2kgY8OhIG5ow6JuLg0KDQojIEJp4bq/biBIb21lb3duZXIgKFPhu58gaOG7r3UgbmjDoCkNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBIb21lb3duZXIpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZGFya2dyZWVuIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIlPhu58gaOG7r3UgbmjDoCIsIHggPSAiSG9tZW93bmVyIiwgeSA9ICJU4bqnbiBzdeG6pXQiKQ0KYGBgDQoNCktob+G6o25nIDYwJSBraMOhY2ggaMOgbmcgdHJvbmcgZOG7ryBsaeG7h3UgbMOgIG5nxrDhu51pIHPhu58gaOG7r3UgbmjDoCwgdHJvbmcga2hpIGfhuqduIDQwJSBraMO0bmcgc+G7nyBo4buvdSBuaMOgLiDEkGnhu4F1IG7DoHkgcGjhuqNuIMOhbmggcuG6sW5nIHBo4bqnbiBs4bubbiBraMOhY2ggaMOgbmcgY+G7p2Egc2nDqnUgdGjhu4sgdGh14buZYyBuaMOzbSDEkcOjIGPDsyDEkWnhu4F1IGtp4buHbiBraW5oIHThur8g4buVbiDEkeG7i25oIGjGoW4uDQpUdXkgbmhpw6puLCBuaMOzbSBraMO0bmcgc+G7nyBo4buvdSBuaMOgIHbhuqtuIGNoaeG6v20gdOG7tyBs4buHIMSRw6FuZyBr4buDLCBjaG8gdGjhuqV5IHNpw6p1IHRo4buLIGPFqW5nIHRp4bq/cCBj4bqtbiDEkcaw4bujYyBuaMOzbSBraMOhY2ggaMOgbmcgdGh1w6ogbmjDoCBob+G6t2MgY2jGsGEgY8OzIG5ow6AgcmnDqm5nLg0KDQojIEJp4bq/biBBbm51YWxJbmNvbWUgKFRodSBuaOG6rXAgaMOgbmcgbsSDbSDigJMgdGhlbyBuaMOzbSkNCg0KYGBge3J9DQpnZ3Bsb3QoZGF0YSwgYWVzKHggPSBBbm51YWxJbmNvbWUpKSArDQogIGdlb21fYmFyKGZpbGwgPSAib3JhbmdlcmVkIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIlRodSBuaOG6rXAgaMOgbmcgbsSDbSIsIHggPSAiQW5udWFsIEluY29tZSIsIHkgPSAiVOG6p24gc3XhuqV0IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCioqxJBp4buDbSBu4buVaSBi4bqtdDoqKg0KDQotICoqVOG6rXAgdHJ1bmcgdsOgbyB0aHUgbmjhuq1wIHThuqdtIHRydW5nOioqIE5ow7NtIGPDsyB0aHUgbmjhuq1wIHRyb25nIGtob+G6o25nICoqMzBL4oCv4oCT4oCvNzBLIGNoaeG6v20ga2hv4bqjbmcgNTAlKiogdOG7lW5nIHPhu5Ega2jDoWNoIGjDoG5nLiDEkMOieSBjaMOtbmggbMOgICoqdGjhu4sgdHLGsOG7nW5nIG3hu6VjIHRpw6p1IGNow61uaCoqLg0KDQotICoqVGh1IG5o4bqtcCB0aOG6pXAgLSB0cnVuZyAoMTBL4oCv4oCT4oCvMzBLKSoqIHbhuqtuIGNoaeG6v20gZ+G6p24gKioyMiUqKiwgY2hvIHRo4bqleSBz4buxIGhp4buHbiBkaeG7h24gcsO1IHLhu4d0IGPhu6dhIHBow6JuIGtow7pjIHRp4bq/dCBraeG7h20uIE7hur91IHPhuqNuIHBo4bqpbSBob+G6t2MgZOG7i2NoIHbhu6UgY+G6p24gxJHhu4tuaCBnacOhLCAqKm7Dqm4gY8OibiBuaOG6r2MgZ8OzaSBnacOhIHBow7kgaOG7o3AgbmjDs20gbsOgeSoqLg0KDQotIE5ow7NtIGPDsyAqKnRodSBuaOG6rXAgY2FvICg+4oCvOTBLKSoqIGNo4buJIGNoaeG6v20ga2hv4bqjbmcgKioxNiUqKi4gUmnDqm5nIG5ow7NtIHLhuqV0IGNhbyAqKj7igK8xNTBLKiogbMOgICoqcuG6pXQgbmjhu48qKi4gRG8gxJHDsywgY8OhYyBjaGnhur9uIGThu4tjaCBz4bqjbiBwaOG6qW0vZOG7i2NoIHbhu6UgY2FvIGPhuqVwICoqY+G6p24gbmjhuq9tIMSRw7puZyDEkeG7kWkgdMaw4bujbmcsIHRyw6FuaCBsYW4gcuG7mW5nIHRoaeG6v3UgaGnhu4d1IHF14bqjKiouDQoNCi0gKipQaMOibiBi4buRIHRodSBuaOG6rXAgYuG7iyBs4buHY2ggdHLDoWkgKGxlZnQtc2tld2VkKToqKiBQaOG6p24gbOG7m24ga2jDoWNoIGjDoG5nIHRodeG7mWMgbmjDs20gdGh1IG5o4bqtcCB0aOG6pXAgLSB0cnVuZy4gKirEkOG7iW5oIHBow6JuIGLhu5EgcsahaSB2w6BvIG5ow7NtIDMwS+KAkzUwSyoqLCBjw6BuZyB24buBIG3hu6ljIGNhbyB0aMOsIHPhu5EgbMaw4bujbmcgY8OgbmcgZ2nhuqNtLg0KDQojIEJp4bq/biBDaXR5IChUaMOgbmggcGjhu5EpDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gQ2l0eSkpICsNCiAgZ2VvbV9iYXIoZmlsbCA9ICJmaXJlYnJpY2siKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiVGjDoG5oIHBo4buRIiwgeCA9ICJUaMOgbmggcGjhu5EiLCB5ID0gIlThuqduIHN14bqldCIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0IHThu5VuZyBxdWFuOioqDQoNCi0gKipU4bqtcCB0cnVuZyB04bqhaSBt4buZdCBz4buRIHRow6BuaCBwaOG7kSBs4bubbjoqKiAgDQoNCiAgTmjhu69uZyB0aMOgbmggcGjhu5EgY8OzIHThu7cgbOG7hyBraMOhY2ggaMOgbmcgY2FvIG5o4bqldCBiYW8gZ+G7k206DQogIC0gKipTYWxlbSAoOS44NiUpKioNCiAgDQogIC0gKipUYWNvbWEgKDguOTQlKSoqDQogIA0KICAtICoqTG9zIEFuZ2VsZXMgKDYuNTklKSoqDQogIA0KICAtICoqU2VhdHRsZSAoNi41NiUpKioNCiAgDQogIC0gKipQb3J0bGFuZCAoNi4yMyUpKioNCiAgDQogIC0gKipTYW4gRGllZ28gKDYuMTYlKSoqDQoNCiAg4oaSIMSQw6J5IGzDoCBuaOG7r25nIGtodSB24buxYyAqKnThuq1wIHRydW5nIMSRw7RuZyBraMOhY2ggaMOgbmcgbmjhuqV0KiosIG7Dqm4gKirGsHUgdGnDqm4gdHJvbmcgY8OhYyBjaGnhur9uIGThu4tjaCBtYXJrZXRpbmcsIHBow6JuIHBo4buRaSBob+G6t2MgZOG7i2NoIHbhu6Uga2jDoWNoIGjDoG5nKiouDQoNCi0gKipQaMOibiBi4buRIHTGsMahbmcgxJHhu5FpIHRy4bqjaSDEkeG7gXUg4bufIG5ow7NtIGdp4buvYToqKiANCg0KICBN4buZdCBz4buRIHRow6BuaCBwaOG7kSBuaMawIEJyZW1lcnRvbiwgSGlkYWxnbywgU3Bva2FuZSwgVmFuY291dmVyLOKApiBjw7MgdOG7tyBs4buHIGtow6FjaCBow6BuZyDhu58gbeG7qWMgdHJ1bmcgYsOsbmggdOG7qyAqKjMlIMSR4bq/biA2JSoqLCDEkcOzbmcgdmFpIHRyw7IgYuG7lSB0cuG7oyBxdWFuIHRy4buNbmcuDQoNCi0gKipOaMOzbSBjw7MgdOG7tyBs4buHIHRo4bqlcCAoZMaw4bubaSAyJSkqKjogIA0KDQogIEPDoWMgdGjDoG5oIHBo4buRIG5oxrAgR3VhZGFsYWphcmEsIFdhbGxhIFdhbGxhLCBWaWN0b3JpYSwgU2FuIEZyYW5jaXNjbywgQmVsbGluZ2hhbSzigKYgY8OzIHPhu5EgbMaw4bujbmcga2jDoWNoIGjDoG5nIHRo4bqlcCBoxqFuLCBjw7MgdGjhu4MgKipraMO0bmcgcGjhuqNpIGzDoCB0aOG7iyB0csaw4budbmcgY2jDrW5oKiosIG5oxrBuZyAqKmPDsyB0aOG7gyBraGFpIHRow6FjIHRow6ptIG7hur91IG114buRbiBt4bufIHLhu5luZyoqLg0KDQojIyBCaeG6v24gU3RhdGVvclByb3ZpbmNlIChCYW5nIGhv4bq3YyB04buJbmgpDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gU3RhdGVvclByb3ZpbmNlKSkgKw0KICBnZW9tX2JhcihmaWxsID0gImdyYXkyNSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgdOG6p24gc3XhuqV0IHRoZW8gQmFuZy9U4buJbmgiLCB4ID0gIkJhbmcvVOG7iW5oIiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpDQpgYGANCg0KKipOaOG6rW4geMOpdCB04buVbmcgcXVhbjoqKg0KDQotICoqVOG6rXAgdHJ1bmcgbeG6oW5oIHThuqFpIGJhbmcgV0EgKFdhc2hpbmd0b24pOioqIA0KDQogIFbhu5tpICoqMzIuNDglKiogdOG7lW5nIHPhu5Ega2jDoWNoIGjDoG5nICh0xrDGoW5nIMSRxrDGoW5nICoqNCw1Njcga2jDoWNoKiopLCBiYW5nIFdBIGzDoCAqKnRo4buLIHRyxrDhu51uZyB0cuG7jW5nIMSRaeG7g20qKiwgY+G6p24gxJHGsOG7o2MgKirGsHUgdGnDqm4gY2FvIG5o4bqldCoqIHRyb25nIGPDoWMgY2hp4bq/biBsxrDhu6NjIGtpbmggZG9hbmggdsOgIHRp4bq/cCB0aOG7iy4NCg0KLSAqKk5ow7NtIHF1YW4gdHLhu41uZyB0aOG7qSBoYWk6KiogIA0KDQogIC0gKipDQSAoQ2FsaWZvcm5pYSkqKiBjaGnhur9tICoqMTkuNDQlKioNCiAgDQogIC0gKipPUiAoT3JlZ29uKSoqIGNoaeG6v20gKioxNi4wOSUqKg0KDQogIOKGkiBU4buVbmcgY+G7mW5nIGJhIGJhbmcgKipXQSwgQ0EsIE9SKiogxJHDoyBjaGnhur9tIMSR4bq/biAqKmfhuqduIDcwJSoqIHThu5VuZyBz4buRIGtow6FjaCBow6BuZy4gIA0KICANCiAgxJDDonkgbMOgICoqdsO5bmcgdGjhu4sgdHLGsOG7nW5nIGPhu5F0IGzDtWkqKiwgbsOqbiDEkeG6p3UgdMawIG3huqFuaCB24buBIG5ow6JuIGzhu7FjLCBxdeG6o25nIGLDoSwgZOG7i2NoIHbhu6UgaOG6rXUgbcOjaSB04bqhaSBraHUgduG7sWMgbsOgeS4NCg0KLSAqKkJhbmcgY8OzIG3hu6ljIMSR4buZIGtow6FjaCBow6BuZyB0cnVuZyBiw6xuaDoqKiAgDQogIC0gWmFjYXRlY2FzICgqKjkuMjMlKiopDQogIA0KICAtIERGICgqKjUuODAlKiopDQogIA0KICAtIEJDICgqKjUuNzUlKiopDQoNCiAg4oaSIMSQw6J5IGzDoCBuaOG7r25nIGtodSB24buxYyAqKnBo4bulIHRy4bujIMSRw6FuZyBjaMO6IMO9KiosIGPDsyB0aOG7gyBjw6JuIG5o4bqvYyB0cmnhu4NuIGtoYWkgY8OhYyBjaMawxqFuZyB0csOsbmggbWFya2V0aW5nIGtodSB24buxYyBuaOG7jyAocmVnaW9uYWwgbWFya2V0aW5nKS4NCg0KLSAqKkJhbmcgY8OzIHThu7cgbOG7hyB0aOG6pXAgKDw1JSkqKjogIA0KDQogIEd1ZXJyZXJvLCBKYWxpc2NvLCBWZXJhY3J1eiwgWXVjYXRhbiDigJQgdHV5IGPDsyBz4buRIGzGsOG7o25nIGtow6FjaCDDrXQgaMahbiwgduG6q24gY8OzIHRo4buDIGPDom4gbmjhuq9jICoqdMSDbmcgbmjhuq1uIGRp4buHbiB0aMawxqFuZyBoaeG7h3UqKiwgxJHhurdjIGJp4buHdCBu4bq/dSBtdeG7kW4gbeG7nyBy4buZbmcgdGjhu4sgdHLGsOG7nW5nIHbhu4EgcGjDrWEgTWV4aWNvLg0KDQojIEJp4bq/biBDb3VudHJ5IChRdeG7kWMgZ2lhKQ0KDQpgYGB7cn0NCmdncGxvdChkYXRhLCBhZXMoeCA9IENvdW50cnkpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZGVlcHBpbmsiKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIHThuqduIHN14bqldCB0aGVvIFF14buRYyBnaWEiLCB4ID0gIlF14buRYyBnaWEiLCB5ID0gIlThuqduIHN14bqldCIpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSkNCmBgYA0KDQoqKk5o4bqtbiB4w6l0IHThu5VuZyBxdWFuOioqDQoNCi0gKipN4bu5IChVU0EpKiogY2hp4bq/bSAqKjY4LjAxJSoqIHThu5VuZyBz4buRIGtow6FjaCBow6BuZyDigJMgxJHDonkgbMOgICoqdGjhu4sgdHLGsOG7nW5nIGNow61uaCB54bq/dSB2w6Agw6FwIMSR4bqjbyB0dXnhu4d0IMSR4buRaSoqLiANCg0KICDihpIgQ8OhYyBjaGnhur9uIGzGsOG7o2Mga2luaCBkb2FuaCwgbWFya2V0aW5nLCBz4bqjbiBwaOG6qW0gY+G6p24gKirGsHUgdGnDqm4gdOG7kWkgxJFhIGNobyBraMOhY2ggaMOgbmcgSG9hIEvhu7MqKi4NCg0KLSAqKk1leGljbyoqIGNoaeG6v20gKioyNi4yMyUqKiDigJMgbMOgICoqdGjhu4sgdHLGsOG7nW5nIHBo4bulIG5oxrBuZyBy4bqldCDEkcOhbmcgY2jDuiDDvSoqIHbhu5tpIGfhuqduICoqMS80IHThu5VuZyBraMOhY2ggaMOgbmcqKi4gDQoNCiAg4oaSIEPDsyB0aOG7gyBjw6JuIG5o4bqvYyAqKmLhuqNuIMSR4buLYSBob8OhIHRow7RuZyDEkWnhu4dwKiosIMawdSDEkcOjaSBob+G6t2Mgc+G6o24gcGjhuqltIGTDoG5oIHJpw6puZyBjaG8ga2h1IHbhu7FjIG7DoHkuDQoNCi0gKipDYW5hZGEqKiBjaOG7iSBjaGnhur9tICoqNS43NSUqKiDigJMgc+G7kSBsxrDhu6NuZyB0xrDGoW5nIMSR4buRaSBuaOG7jy4gIA0KDQogIOKGkiBLaMO0bmcgcGjhuqNpIHRo4buLIHRyxrDhu51uZyB0cuG7jW5nIHTDom0gaGnhu4duIHThuqFpLCBuaMawbmcgduG6q24gY8OzIHRo4buDIMSRxrDhu6NjIGR1eSB0csOsIG5oxrAgbeG7mXQgKipraHUgduG7sWMgduG7hyB0aW5oIGjhu5cgdHLhu6MqKiBob+G6t2MgxJHhu4MgKip0aOG7rSBuZ2hp4buHbSBz4bqjbiBwaOG6qW0gbeG7m2kqKi4NCg0KIyBCaeG6v24gUHJvZHVjdEZhbWlseSAoTmjDs20gc+G6o24gcGjhuqltIGzhu5tuKQ0KDQpgYGB7cn0NCmdncGxvdChkYXRhLCBhZXMoeCA9IFByb2R1Y3RGYW1pbHkpKSArDQogIGdlb21fYmFyKGZpbGwgPSAiZGFya3NsYXRlZ3JheSIpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgbGFicyh0aXRsZSA9ICJOaMOzbSBz4bqjbiBwaOG6qW0iLCB4ID0gIk5ow7NtIHPhuqNuIHBo4bqpbSIsIHkgPSAiVOG6p24gc3XhuqV0IikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCioqTmjhuq1uIHjDqXQ6KioNCg0KLSAqKk5ow7NtIEZvb2QgKHRo4buxYyBwaOG6qW0pKiogY2hp4bq/bSAqKnRyw6puIDcyJSoqIHThu5VuZyBnaWFvIGThu4tjaCwgbMOgICoqbeG6o25nIHPhuqNuIHBo4bqpbSBj4buRdCBsw7VpIHbDoCBjaOG7pyDEkeG6oW8qKi4NCg0KICDihpIgQ8OhYyBxdXnhur90IMSR4buLbmggduG7gSBkYW5oIG3hu6VjLCBjaOG6pXQgbMaw4bujbmcsIGdpw6EsIGtodXnhur9uIG3Do2nigKYgbsOqbiAqKsawdSB0acOqbiBuaMOzbSBuw6B5KiouDQoNCi0gKipOb24tQ29uc3VtYWJsZSoqIChwaGkgdGnDqnUgZMO5bmcsIG5oxrAgxJHhu5MgZ2lhIGThu6VuZywgxJFp4buHbiB04but4oCmKSBjaGnhur9tIGfhuqduICoqMTklKiog4oCTIGzDoCAqKm3huqNuZyBwaOG7pSBuaMawbmcgdGnhu4FtIG7Eg25nKiouICANCg0KICDihpIgQ8OzIHRo4buDIGtoYWkgdGjDoWMgdGjDqm0gduG7gSAqKnVwc2VsbCoqIGhv4bq3YyAqKmNyb3NzLXNlbGwqKiB24bubaSBuaMOzbSBraMOhY2ggaMOgbmcgbXVhIEZvb2QuDQoNCi0gKipEcmluayAodGjhu6ljIHXhu5FuZykqKiBjaOG7iSBjaGnhur9tIGfhuqduICoqOSUqKiDigJMgbMOgICoqbeG6o25nIG5o4buPKiosIG7Dqm4gY8OibiBuaOG6r2MgdOG6rXAgdHJ1bmcgdsOgbyBjw6FjICoqc+G6o24gcGjhuqltIGPDsyBiacOqbiBs4bujaSBuaHXhuq1uIGNhbyoqIGhv4bq3YyAqKmxpw6puIGvhur90IGNvbWJvIHbhu5tpIEZvb2QqKi4NCg0KDQojIEJp4bq/biBQcm9kdWN0RGVwYXJ0bWVudCAoUGjDsm5nIGJhbiBz4bqjbiBwaOG6qW0pDQoNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gUHJvZHVjdERlcGFydG1lbnQpKSArDQogIGdlb21fYmFyKGZpbGwgPSAibWlkbmlnaHRibHVlIikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgdGhlbyBC4buZIHBo4bqtbiBz4bqjbiBwaOG6qW0iLCB4ID0gIkLhu5kgcGjhuq1uIiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotICoqUHJvZHVjZSAoUmF1IHF14bqjIHTGsMahaSkqKiBsw6AgcGjDsm5nIGJhbiAqKmNoaeG6v20gdOG7tyB0cuG7jW5nIGzhu5tuIG5o4bqldCAoMTQuMTglKSoqLCB0aOG7gyBoaeG7h24gKip4dSBoxrDhu5tuZyB0acOqdSBkw7luZyB0aOG7sWMgcGjhuqltIHTGsMahaSBz4buRbmcgY2FvKiouDQoNCi0gKipTbmFjayBGb29kcyB2w6AgRnJvemVuIEZvb2RzKiogY2hp4bq/bSB04bu3IHRy4buNbmcgbOG7m24gdGjhu6kgMiB2w6AgMyDihpIgY2hvIHRo4bqleSBuaHUgY+G6p3UgY2FvIHbhu5tpICoqxJHhu5MgxINuIG5oYW5oLCB0aeG7h24gbOG7o2kqKiwgdGjDrWNoIGjhu6NwIGNobyBraMOhY2ggYuG6rW4gcuG7mW4gaG/hurdjIGdpYSDEkcOsbmguDQoNCi0gKipIb3VzZWhvbGQgKMSQ4buTIGdpYSBk4bulbmcpKiogY8WpbmcgY2hp4bq/bSBoxqFuICoqMTAlKiosIGzDoCBz4bqjbiBwaOG6qW0gdGhp4bq/dCB54bq/dSB0cm9uZyDEkeG7nWkgc+G7kW5nIOKGkiBjw7MgdGjhu4Mga+G6v3QgaOG7o3AgYsOhbiBjaMOpby4NCg0KLSBDw6FjIG5ow7NtIG5oxrAgKipNZWF0KiosICoqU2VhZm9vZCoqLCAqKlBlcmlvZGljYWxzKiosICoqQ2hlY2tvdXQqKiwgKipDYXJvdXNlbCoqLi4uIGNoaeG6v20gdOG7tyB0cuG7jW5nIHLhuqV0IG5o4buPIOKGkiBraMO0bmcgcGjhuqNpIHRy4buNbmcgdMOibSBoaeG7h24gdOG6oWkuDQoNCiMgQmnhur9uIFByb2R1Y3RDYXRlZ29yeSAoRGFuaCBt4bulYyBz4bqjbiBwaOG6qW0gY+G7pSB0aOG7gykNCmBgYHtyfQ0KZ2dwbG90KGRhdGEsIGFlcyh4ID0gUHJvZHVjdENhdGVnb3J5KSkgKw0KICBnZW9tX2JhcihmaWxsID0gImRvZGdlcmJsdWU0IikgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICBsYWJzKHRpdGxlID0gIkJp4buDdSDEkeG7kyB04bqnbiBzdeG6pXQgdGhlbyBMb+G6oWkgc+G6o24gcGjhuqltIiwgeCA9ICJMb+G6oWkgc+G6o24gcGjhuqltIiwgeSA9ICJU4bqnbiBzdeG6pXQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSkpDQpgYGANCg0KKipOaOG6rW4geMOpdDoqKg0KDQotICoqVmVnZXRhYmxlcyoqIGzDoCBkYW5oIG3hu6VjIGNoaeG6v20gdOG7tyBs4buHIGNhbyBuaOG6pXQgKDEyLjI5JSkg4oaSIGNobyB0aOG6pXkgKirGsHUgdGnDqm4gaMOgbmcgxJHhuqd1IHbhu5tpIG5ow7NtIHRo4buxYyBwaOG6qW0gdMawxqFpIHPhu5FuZyoqLg0KDQotICoqU25hY2sgRm9vZHMqKiB0aeG6v3AgdOG7pWMgbMOgIGRhbmggbeG7pWMgY2jhu6cgbOG7sWMgKDExLjM4JSkg4oaSIHh1IGjGsOG7m25nIHRpw6p1IGTDuW5nIMSR4buTIMSDbiBuaGFuaCwgdGnhu4duIGThu6VuZyBy4bqldCByw7UgcsOgbmcuDQoNCi0gKipEYWlyeSwgRnJ1aXQgdsOgIE1lYXQqKiDEkeG7gXUgbuG6sW0gdHJvbmcgbmjDs20gdG9wIDUg4oaSIMSRw6J5IGzDoCBuaOG7r25nICoqc+G6o24gcGjhuqltIHRoaeG6v3QgeeG6v3UsIHRpw6p1IGTDuW5nIGjDoG5nIG5nw6B5KiouDQoNCi0gQ8OhYyBkYW5oIG3hu6VjIG5oxrAgKipDYW5uZWQgU2VhZm9vZCAoQ2FubmVkIFNhcmRpbmVzLCBUdW5hLCBTaHJpbXAuLi4pKiogY8OzIHThu7cgdHLhu41uZyB0aOG6pXAgKH4wLjPigJMwLjYlKSDihpIgw610IMSRxrDhu6NjIHF1YW4gdMOibSwgY8OzIHRo4buDIGzDoCBkbyBraOG6qXUgduG7iywgdGjDs2kgcXVlbiB0acOqdSBkw7luZy4NCg0KKipDw6FjIGRhbmggbeG7pWMgY8OzIHThu7cgdHLhu41uZyBy4bqldCB0aOG6pXAgKDwxJSk6KioNCg0KLSAqKkNhbmRsZXMsIENhbm5lZCBDbGFtcywgTWlzY2VsbGFuZW91cywgRWxlY3RyaWNhbC4uLioqIGPDsyBsxrDhu6NuZyBtdWEgY+G7sWMga+G7syB0aOG6pXAg4oaSIGtow7RuZyBwaOG6o2kgxrB1IHRpw6puIGNow61uaCB0cm9uZyBjaGnhur9uIGzGsOG7o2Mga2luaCBkb2FuaC4NCg0K