2. Biểu đồ
2.1. Biểu đồ cột dân số 10 nước đứng top 10
d1 <- d[d$Rank <= 10,]
d1 %>% ggplot(aes(x = Name, y = X2022)) +
geom_bar(stat = "identity", fill = "pink") +
geom_text(aes(label = round(X2022)), vjust = 2, color = 'white')+
labs(title = "Biểu đồ dân số năm 2022",x = "Nước",y = "Số dân")

China có số dân cao nhất năm 2022 là 1425887 triệu
người.
India có số dân cao thứ 2 là 1417173 triệu người
Mexico có số dân thấp nhất là 127504 triệu người.
2.2. Mật độ dân số của các quốc gia thuộc top
10
d1 %>% ggplot(aes(x = Name, y = Density..per.km..,fill = Name))+
geom_bar(stat = "identity") +
labs(x = "Quốc gia", y = "Mật độ dân số", title = "Mật độ dân số của các quốc gia hàng đầu") +
geom_text(aes(label = round(Density..per.km..,3)), vjust = 2, color = 'red')+
theme(axis.text.x = element_text(angle = 45, hjust = 1))

Bangladesh có mật độ dân số khoảng 1160 người/km vuông, mật độ
dân số cao.
Ngược lại, Russia lại có mật đô dân số thấp khoảng 8 người/km
vuông.
Trong 2 nước có dân số đông, India lại có mật độ dân số cao hơn
China khoảng 2.9 lần.
2.3: Tỷ lệ tăng trưởng dân số của các quốc gia
d1 %>%ggplot(aes(x = Name, y = GrowthRate, fill = Name)) +
geom_bar(stat = "identity") +
labs(x = "Quốc gia", y = "Tỷ lệ tăng trưởng dân số", title = "Tỷ lệ tăng trưởng dân số của các quốc gia ") +
geom_text(aes(label = round(GrowthRate,3)), vjust = 2, color = 'red')+
theme(axis.text.x = element_text(angle = 45, hjust = 1))

- Tỷ lệ tăng trường các nước không có sự biến động nhiều. Trong đó,
biểu đồ dự báo Nigeria và Pakistan sẽ có mức độ tăng trưởng cao hơn so
với các nước còn lại là 1.02.
2.4.Phần trăm dân số thế giới của các quốc gia
d1 %>% ggplot( aes(x = Name, y = World.Population.Percentage, fill = Name)) +
geom_bar(stat = "identity") +
labs(x = "Quốc gia", y = "Phần trăm dân số thế giới", title = "Phần trăm dân số thế giới của các quốc gia ") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

- Phần trăm dân số thế giới của United States cao nhất so với các nước
khoảng 4.24%. Sau đó là Indonesia khoảng 3.45%. Ngược lại Mexico có phần
trăm dân số thấp nhất khoảng 1.6%.
2.5.Diện tích của các quốc gia
d1 %>%ggplot(aes(x = Name, y = Area..km.., fill = Name)) +
geom_bar(stat = "identity") +
labs(x = "Quốc gia", y = "Diện tích (km²)", title = "Diện tích của các quốc gia ") +
geom_text(aes(label = round(Area..km..,3)), vjust = 2, color = 'black')+
theme(axis.text.x = element_text(angle = 45, hjust = 1))

Trung Quốc (China): Diện tích là 9.706.961 km².
Ấn Độ (India): Diện tích là 3.287.590 km².
Hoa Kỳ (United States): Diện tích là 9.372.610 km².
Indonesia: Diện tích là 1.904.569 km².
Pakistan: Diện tích là 881.912 km².
Nigeria: Diện tích là 923.768 km².
Brazil: Diện tích là 8.515.767 km².
Bangladesh: Diện tích là 147.570 km².
Nga (Russia): Diện tích là 17.098.242 km².
Mexico : Diện tích là 964.375 km².
2.6.Biểu đồ cho diện tích một số quốc gia ở
ĐNÁ
d3 <- d%>% filter(Name %in% c('Indonesia','Philippines','Vietnam','Thailand', 'Myanmar','Laos','Singapore','Brunei'))
d3 %>% ggplot(aes(x = " ", y = Area..km.., fill = Name)) +
geom_bar(stat = "identity") +
coord_polar("y",) +
labs(title = "Biểu đồ diện tích một số nước ĐNÁ",fill = "Quốc gia",x = NULL, y = NULL) +
theme_minimal() +
geom_text(aes(label = paste0(round(Area..km.. / sum(Area..km..) * 100, 1), "%")),position = position_stack(vjust = 0.5),size = 4)

Indonesia có diện tích cao nhất so với các nước khác trong khu
vực.
Trong khi đó, Brunei có diện tích thấp nhất.
Vietnam có diện tích là 8.3%
2.7. Biểu đồ mật độ dân số của một số quốc gia thuộc
ĐNÁ
d3 %>% ggplot(aes(x = "", y = Density..per.km.., fill = Name)) +
geom_bar(stat = "identity") +
coord_polar("y", start = 0) +
labs(title = "Biểu đồ mật độ dân số của một số nước ĐNÁ",fill = "Quốc gia",x = NULL, y = NULL) +
theme_minimal() +
geom_text(aes(label = paste0(round(Density..per.km.. / sum(Density..per.km..) * 100, 1), "%")),
position = position_stack(vjust = 0.5),
size = 4)

- Mật độ dân số của Singapore là cao nhất 88.4%
2.8. Biểu đồ Histogram Population_2022
d %>% ggplot(aes(x = X2022)) +
geom_histogram(binwidth = 10000, fill = 'lightgreen',color='black') +
labs(title = "Histogram of Population 2022",x = "Population",y = "Frequency")

2.9. Biểu đồ Density Population_2022
d %>% ggplot(aes(x = X2022)) +
geom_density(fill = 'lightblue')+
labs(title = "Density of Population 2022",x = "Population",y = "Frequency")

- Dân số năm 2022 của các nước có sự biến động mạnh.
2.10. Biểu đồ Histogram Area
d %>% ggplot(aes(x = Area..km..)) +
geom_histogram(binwidth = 500000, fill = "lightgreen", color = "black") +
labs(title = "Histogram of Area", x = "Area (km²)",y = "Frequency")

2.11. Biểu đồ Density Area
d %>% ggplot(aes(x = Area..km..)) +
geom_density(fill = 'lightblue')+
labs(title = "Density of Area",x = "Area (km²)",y = "Frequency")

- Diện tích các nước có sự chênh lệch lớn do đó dựa vào số dân và diện
tích ta có thể thấy được mật độ dân số các nước đều có sự khác biệt rõ
ràng và từ đó có thể suy đoán rằng dân số các nước ở những năm 2023,2024
và về sau nữa đều sẽ tăng trưởng mạnh nhưng diện tích không đổi do đó
mật độ dân số ngày một đông. Trong khi đó điều kiện y tế phát triển số
người lớn tuổi cao, nguy cơ già hóa dân số toàn cầu.
2.12. Biểu đồ Histogram Density
d %>% ggplot( aes(x = Density..per.km..)) +
geom_histogram(binwidth = 100, fill = "red", color = "black") +
labs(title = "Histogram of Density",
x = "Density (per km²)",
y = "Frequency")

- Mật độ dân số các nước đều có sự chênh lệch và mật độ ở các nước
đứng đầu danh sách đều dày đặc.
2.13. Biểu đồ scatterplot cho dữ liệu Population_2022 và
Area
d %>% ggplot(aes(x = X2022, y = Area..km..)) +
geom_point(color = "purple") +
labs(title = "Scatterplot of Population 2022 and Area",
x = "Population",
y = "Area (km²)")

Biểu đồ scatterplot cho dữ liệu Population_2022 và Area cho thấy
mối quan hệ giữa dân số và diện tích của các quốc gia trong bộ dữ
liệu.
Nhìn vào biểu đồ, chúng ta có thể thấy rằng các điểm dữ liệu được
phân tán trên không gian biểu đồ một cách ngẫu nhiên. Điều này cho thấy
không có một mẫu quy luật rõ ràng về mối quan hệ giữa dân số và diện
tích.
Tuy nhiên, chúng ta có thể nhận thấy rằng có một số quốc gia có
diện tích nhỏ và dân số lớn, trong khi một số quốc gia khác có diện tích
lớn nhưng dân số thấp hơn. Điều này cho thấy rằng không chỉ diện tích mà
còn các yếu tố khác có thể ảnh hưởng đến mật độ dân số của mỗi quốc
gia.
2.14. Biểu đồ scatterplot cho dữ liệu Population_2022 và
Density
d %>% ggplot(aes(x = X2022, y = Density..per.km..)) +
geom_point(color = "green") +
labs(title = "Scatterplot of Population 2022 and Density",
x = "Population",
y = "Density (per km²)")

Biểu đồ scatterplot cho dữ liệu Population_2022 và Density thể
hiện mối quan hệ giữa dân số và mật độ dân số của các quốc gia trong bộ
dữ liệu.
Có một số quốc gia có dân số lớn và mật độ dân số cao, trong khi
một số quốc gia khác có dân số lớn nhưng mật độ dân số thấp hơn. Điều
này chỉ ra rằng mật độ dân số không chỉ phụ thuộc vào dân số mà còn phụ
thuộc vào các yếu tố khác như diện tích.
2.15. Biểu đồ scatterplot cho dữ liệu Area và
Density
d %>% ggplot(aes(x = Area..km.., y = Density..per.km..)) +
geom_point(color = "red") +
labs(title = "Scatterplot of Area and Density",
x = "Area (km²)",
y = "Density (per km²)")

Chúng ta có thể nhận thấy một số quốc gia có diện tích nhỏ và mật
độ dân số cao, trong khi một số quốc gia khác có diện tích lớn nhưng mật
độ dân số thấp hơn. Điều này cho thấy rằng mật độ dân số không chỉ phụ
thuộc vào diện tích mà còn phụ thuộc vào các yếu tố khác như dân số và
các yếu tố địa lý khác.
Ngoài ra, biểu đồ cũng cho thấy rằng có một số quốc gia có mật độ
dân số rất cao với diện tích nhỏ, trong khi có một số quốc gia khác có
diện tích lớn nhưng mật độ dân số thấp hơn. Điều này có thể chỉ ra sự
khác biệt về sự phân bố dân số và diện tích giữa các quốc gia.
Tuy nhiên, để hiểu rõ hơn về mối quan hệ giữa diện tích và mật độ
dân số, cần xem xét thêm các yếu tố khác như dân số, cơ cấu dân số, và
các yếu tố kinh tế, xã hội khác của từng quốc gia. Điều này giúp ta có
cái nhìn tổng quan và chi tiết hơn về mối quan hệ này trong bộ dữ
liệu.
2.16. Biểu đồ đường thể hiện mật độ dân số của các quốc gia
ĐNÁ
d3 %>% ggplot( aes(x = Name, y = Density..per.km..)) +
geom_line() +
geom_point() +
labs(title = "Population Density of Countries", x = "Country", y = "Density (per km²)") +
theme_minimal()

Nhìn vào biểu đồ, chúng ta có thể thấy rằng Philippines có mật độ
dân số cao nhất, tiếp theo là Vietnam và Indonesia. Thái Lan và Myanmar
có mật độ dân số thấp hơn so với các quốc gia khác trong số
này.
Biểu đồ sử dụng các điểm để biểu thị dữ liệu từng quốc gia cụ
thể, trong khi đường thẳng nối các điểm giúp chúng ta nhìn thấy xu hướng
tổng quan của mật độ dân số.
2.17. Biểu đồ cột đối chiếu diện tích các quốc gia
ĐNÁ
d3 %>% ggplot(aes(x = Name, y = Area..km..)) +
geom_bar(stat = "identity", fill = "steelblue") +
labs(title = "Comparison of Country Areas", x = "Country", y = "Area (km²)") +
theme_minimal()

- Qua biểu đồ, chúng ta có thể nhìn thấy rằng Indonesia có diện tích
lớn nhất trong số các quốc gia được so sánh, tiếp theo là Myanmar,
Thailand, Philippines và Vietnam.
2.18. Biểu đồ cột thể hiện tỷ lệ tăng trưởng dân số của các
quốc gia ĐNÁ
d3 %>% ggplot(aes(x = Name, y = GrowthRate)) +
geom_bar(stat = "identity", fill = "steelblue") +
labs(title = "Population Growth Rate of Countries", x = "Country", y = "Growth Rate") +
theme_minimal()

- Dựa vào biểu đồ, chúng ta có thể nhận thấy rằng Indonesia,
Philippines và Vietnam có tỷ lệ tăng trưởng dân số cao nhất trong số các
quốc gia được so sánh. Thái Lan và Myanmar có tỷ lệ tăng trưởng dân số
thấp hơn so với các quốc gia khác trong nhóm này.
2.19. Biểu đồ cột thể hiện tỉ lệ dân số của các quốc gia
ĐNÁ
d3 %>% ggplot(aes(x = Name, y = World.Population.Percentage)) +
geom_bar(stat = "identity", fill = "steelblue") +
labs(title = "World Population Percentage Rank of Countries", x = "Country", y = "Rank") +
theme_minimal()

- Dựa vào biểu đồ, chúng ta có thể nhìn thấy rằng Indonesia có dân số
chiếm phần trăm lớn nhất trên thế giới trong số các quốc gia được so
sánh. Philippines và Vietnam cũng có dân số chiếm phần trăm khá cao.
Brunei và Singapore có dân số chiếm phần trăm thấp hơn so với các quốc
gia khác trong nhóm này.
2.20. Biểu đồ cột thể hiện diện tích và mật độ dân số của
các quốc gia ĐNÁ
d3 %>% ggplot(aes(x = Name)) +
geom_col(aes(y = Area..km..), fill = "steelblue", width = 0.4, position = "dodge") +
geom_line(aes(y = Density..per.km.. * 5000), color = "red", size = 1, group = 1) +
labs(title = "Comparison of Area and Population Density", x = "Country", y = "Area / Density") +
scale_y_continuous(sec.axis = sec_axis(~./5000, name = "Density (per km²)")) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))

- Dựa vào biểu đồ, chúng ta có thể thấy rằng Indonesia có diện tích
lớn nhất trong số các quốc gia được so sánh, trong khi Philippines có
mật độ dân số cao nhất. Vietnam và Thailand có diện tích tương đối lớn,
nhưng mật độ dân số thấp hơn so với Indonesia và Philippines. Myanmar có
diện tích và mật độ dân số thấp nhất trong số các quốc gia này.
LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiTMOqIFRo4buLIE5n4buNYyDDgW5oIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDogDQogaHRtbF9kb2N1bWVudDogDQogICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgdG9jOiB0cnVlDQotLS0NCg0KYGBge3Igc2V0dXAsaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KGZsZXh0YWJsZSkNCmBgYA0KDQojICoqMS4gVMOzbSB04bqvdCBi4buZIGThu68gbGnhu4d1KioNCg0KLSDGr+G7m2MgdMOtbmggZMOibiBz4buRIHRo4bq/IGdp4bubaSBj4bunYSBD4bulYyDEkWnhu4F1IHRyYSBkw6JuIHPhu5EgSG9hIEvhu7MgdsOgbyB0aMOhbmcgNiBuxINtIDIwMTkgY2hvIHRo4bqleSBkw6JuIHPhu5EgdG/DoG4gY+G6p3UgaGnhu4duIHThuqFpIGzDoCA3LjU3Ny4xMzAuNDAwIG5nxrDhu51pIHRyw6puIHRyw6FpIMSR4bqldCwgdsaw4bujdCB4YSBkw6JuIHPhu5EgdGjhur8gZ2nhu5tpIDcsMiB04bu3IG5nxrDhu51pIG7Eg20gMjAxNS4gDQoNCi0gU+G7sSBnaWEgdMSDbmcgZMOibiBz4buRIG7DoHkgc+G6vSBi4buLIOG6o25oIGjGsOG7n25nIMSRw6FuZyBr4buDIGLhu59pIGNow61uIHF14buRYyBnaWEgY+G7pSB0aOG7gyBjw7MgeHUgaMaw4bubbmcgxJHDs25nIGfDs3AgdsOgbyB0xINuZyB0csaw4bufbmcgZMOibiBz4buRIG5oYW5oIGjGoW4gc28gduG7m2kgY8OhYyBxdeG7kWMgZ2lhIGtow6FjLiBDw6FjIHF14buRYyBnaWEgbsOgeSBiYW8gZ+G7k1Ro4bq/IGdp4bubaSDEkWFuZyBwaOG6o2kgxJHhu5FpIG3hurd0IHbhu5tpIHF1w6EgdHLDrG5oIGdpw6AgaMOzYSBkw6JuIHPhu5EsIMSRaeG7gXUgbsOgeSDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24ga2jhuqMgbsSDbmcgZHV5IHRyw6wgdOG7tyBs4buHIGjhu5cgdHLhu6MgZMOibiBz4buRLiBN4buZdCBr4bq/dCBxdeG6oyBxdWFuIHRy4buNbmcgdOG7qyBuxINtIDIwMTcgbMOgIGjhuqd1IGjhur90IGPDoWMgcXXhu5FjIGdpYSB0csOqbiB0aOG6vyBnaeG7m2kgc+G6vSDEkeG7kWkgbeG6t3QgduG7m2kgc+G7sSB0xINuZyB0csaw4bufbmcgxJHDoW5nIGvhu4MgdHJvbmcgbmjDs20gdHXhu5VpIHThu6sgNjAgdHLhu58gbMOqbi4gxJBp4buBdSBuw6B5IMSR4bq3dCDDoXAgbOG7sWMgbOG7m24gbMOqbiBuaMOzbSB0deG7lWkgdHLhursgdsOsIGTDom4gc+G7kSBuZ8aw4budaSBjYW8gdHXhu5VpIHRy4bufIG7Dqm4gcXXDoSBs4bubbiBtw6Aga2jDtG5nIGPDsyDEkeG7pyBz4buRIGzGsOG7o25nIHNpbmggxJHhu4MgZHV5IHRyw6wgdOG7tyBs4buHIGjhu5cgdHLhu6Mga2jhu49lIG3huqFuaC4NCg0KKioqQ2hpIHRp4bq/dCBjw6FjIGJp4bq/biBjw7MgdHJvbmcgYuG7mSBk4buvIGxp4buHdToqKioNCg0KKkLhu5kgZOG7ryBsaeG7h3UgY8OzIDIzNCBxdWFuIHPDoXQgdsOgIDE1IGJp4bq/bioNCg0KLSBDQ0EzIDogTcOjIHF14buRYyBnaWEvdsO5bmcgbMOjbmggdGjhu5UgZ+G7k20gMyBjaOG7ryBz4buRDQoNCi0gTmFtZSA6IFTDqm4gcXXhu5FjIGdpYS92w7luZyBsw6NuaCB0aOG7lQ0KDQotIDIwMjIgOiBEw6JuIHPhu5EgY+G7p2EgUXXhu5FjIGdpYS9Ww7luZyBsw6NuaCB0aOG7lSB2w6BvIG7Eg20gMjAyMi4NCg0KLSAyMDIwIDogRMOibiBz4buRIGPhu6dhIFF14buRYyBnaWEvVsO5bmcgbMOjbmggdGjhu5UgdsOgbyBuxINtIDIwMjAuIA0KDQotIDIwMTUgOiBEw6JuIHPhu5EgY+G7p2EgUXXhu5FjIGdpYS9Ww7luZyBsw6NuaCB0aOG7lSB2w6BvIG7Eg20gMjAxNS4NCg0KLSAyMDEwIDogRMOibiBz4buRIGPhu6dhIFF14buRYyBnaWEvVsO5bmcgbMOjbmggdGjhu5UgdsOgbyBuxINtIDIwMTAuDQoNCi0gMjAwMCA6IETDom4gc+G7kSBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIHbDoG8gbsSDbSAyMDAwLg0KDQotIDE5OTAgOiBEw6JuIHPhu5EgY+G7p2EgUXXhu5FjIGdpYS9Ww7luZyBsw6NuaCB0aOG7lSB2w6BvIG7Eg20gMTk5MC4NCg0KLSAxOTgwIDogRMOibiBz4buRIGPhu6dhIFF14buRYyBnaWEvVsO5bmcgbMOjbmggdGjhu5UgdsOgbyBuxINtIDE5ODAuDQoNCi0gMTk3MCA6IETDom4gc+G7kSBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIHbDoG8gbsSDbSAxOTcwLg0KIA0KLSBBcmVhIChrbcKyKSA6IERp4buHbiB0w61jaCBj4bunYSBRdeG7kWMgZ2lhL1bDuW5nIGzDo25oIHRo4buVIHTDrW5oIGLhurFuZyBrbSB2dcO0bmcuDQoNCi0gRGVuc2l0eSAocGVyIGttwrIpCTogTeG6rXQgxJHhu5kgZMOibiBz4buRIHRyw6puIGttIHZ1w7RuZy4NCg0KLSBHcm93dGggUmF0ZSA6IFThu7cgbOG7hyB0xINuZyB0csaw4bufbmcgZMOibiBz4buRIHRoZW8gcXXhu5FjIGdpYS92w7luZyBsw6NuaCB0aOG7lS4NCg0KLSBXb3JsZCBQb3B1bGF0aW9uIFBlcmNlbnRhZ2UJOiBU4bu3IGzhu4cgZMOibiBz4buRIHRoZW8gdOG7q25nIHF14buRYyBnaWEvdsO5bmcgbMOjbmggdGjhu5UuDQoNCi0gUmFuayA6IFjhur9wIGjhuqFuZyB0aGVvIGTDom4gc+G7kQ0KYGBge3J9DQpkIDwtIHJlYWQuY3N2KCJEOi9OZ8O0biBOZ+G7ryBM4bqtcCBUcsOsbmgvTmhp4buHbSB24bulIDUvV29ybGQgUG9wdWxhdGlvbiBMaXZlIERhdGFzZXQuY3N2IikNCmRpbShkKQ0KYGBgDQoNCiMgKioyLiBCaeG7g3UgxJHhu5MqKg0KDQojIyAqKjIuMS4gQmnhu4N1IMSR4buTIGPhu5l0IGTDom4gc+G7kSAxMCBuxrDhu5tjIMSR4bupbmcgdG9wIDEwKioNCmBgYHtyfQ0KZDEgPC0gZFtkJFJhbmsgPD0gMTAsXQ0KZDEgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBYMjAyMikpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIGZpbGwgPSAicGluayIpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKFgyMDIyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKSsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgZMOibiBz4buRIG7Eg20gMjAyMiIseCA9ICJOxrDhu5tjIix5ID0gIlPhu5EgZMOibiIpDQpgYGANCg0KLSBDaGluYSBjw7Mgc+G7kSBkw6JuIGNhbyBuaOG6pXQgbsSDbSAyMDIyIGzDoCAxNDI1ODg3IHRyaeG7h3UgbmfGsOG7nWkuDQoNCi0gSW5kaWEgY8OzIHPhu5EgZMOibiBjYW8gdGjhu6kgMiBsw6AgMTQxNzE3MyB0cmnhu4d1IG5nxrDhu51pDQoNCi0gTWV4aWNvIGPDsyBz4buRIGTDom4gdGjhuqVwIG5o4bqldCBsw6AgMTI3NTA0IHRyaeG7h3UgbmfGsOG7nWkuDQoNCiMjICoqMi4yLiBN4bqtdCDEkeG7mSBkw6JuIHPhu5EgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHRodeG7mWMgdG9wIDEwKioNCmBgYHtyfQ0KZDEgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBEZW5zaXR5Li5wZXIua20uLixmaWxsID0gTmFtZSkpKyANCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgbGFicyh4ID0gIlF14buRYyBnaWEiLCB5ID0gIk3huq10IMSR4buZIGTDom4gc+G7kSIsIHRpdGxlID0gIk3huq10IMSR4buZIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgaMOgbmcgxJHhuqd1IikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoRGVuc2l0eS4ucGVyLmttLi4sMykpLCB2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCi0gQmFuZ2xhZGVzaCBjw7MgbeG6rXQgxJHhu5kgZMOibiBz4buRIGtob+G6o25nIDExNjAgbmfGsOG7nWkva20gdnXDtG5nLCBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgY2FvLg0KDQotIE5nxrDhu6NjIGzhuqFpLCBSdXNzaWEgbOG6oWkgY8OzIG3huq10IMSRw7QgZMOibiBz4buRIHRo4bqlcCBraG/huqNuZyA4IG5nxrDhu51pL2ttIHZ1w7RuZy4NCg0KLSBUcm9uZyAyIG7GsOG7m2MgY8OzIGTDom4gc+G7kSDEkcO0bmcsIEluZGlhIGzhuqFpIGPDsyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgY2FvIGjGoW4gQ2hpbmEga2hv4bqjbmcgMi45IGzhuqduLg0KDQojIyAqKjIuMzogVOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBkw6JuIHPhu5EgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhKioNCmBgYHtyfQ0KZDEgJT4lZ2dwbG90KGFlcyh4ID0gTmFtZSwgeSA9IEdyb3d0aFJhdGUsIGZpbGwgPSBOYW1lKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHggPSAiUXXhu5FjIGdpYSIsIHkgPSAiVOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBkw6JuIHPhu5EiLCB0aXRsZSA9ICJU4bu3IGzhu4cgdMSDbmcgdHLGsOG7n25nIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoR3Jvd3RoUmF0ZSwzKSksIHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykrDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KLSBU4bu3IGzhu4cgdMSDbmcgdHLGsOG7nW5nIGPDoWMgbsaw4bubYyBraMO0bmcgY8OzIHPhu7EgYmnhur9uIMSR4buZbmcgbmhp4buBdS4gVHJvbmcgxJHDsywgYmnhu4N1IMSR4buTIGThu7EgYsOhbyBOaWdlcmlhIHbDoCBQYWtpc3RhbiBz4bq9IGPDsyBt4bupYyDEkeG7mSB0xINuZyB0csaw4bufbmcgY2FvIGjGoW4gc28gduG7m2kgY8OhYyBuxrDhu5tjIGPDsm4gbOG6oWkgbMOgIDEuMDIuDQoNCiMjICoqMi40LlBo4bqnbiB0csSDbSBkw6JuIHPhu5EgdGjhur8gZ2nhu5tpIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSoqDQpgYGB7cn0NCmQxICU+JSBnZ3Bsb3QoIGFlcyh4ID0gTmFtZSwgeSA9IFdvcmxkLlBvcHVsYXRpb24uUGVyY2VudGFnZSwgZmlsbCA9IE5hbWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnMoeCA9ICJRdeG7kWMgZ2lhIiwgeSA9ICJQaOG6p24gdHLEg20gZMOibiBz4buRIHRo4bq/IGdp4bubaSIsIHRpdGxlID0gIlBo4bqnbiB0csSDbSBkw6JuIHPhu5EgdGjhur8gZ2nhu5tpIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSAiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KLSBQaOG6p24gdHLEg20gZMOibiBz4buRIHRo4bq/IGdp4bubaSBj4bunYSBVbml0ZWQgU3RhdGVzIGNhbyBuaOG6pXQgc28gduG7m2kgY8OhYyBuxrDhu5tjIGtob+G6o25nIDQuMjQlLiBTYXUgxJHDsyBsw6AgSW5kb25lc2lhIGtob+G6o25nIDMuNDUlLiBOZ8aw4bujYyBs4bqhaSBNZXhpY28gY8OzIHBo4bqnbiB0csSDbSBkw6JuIHPhu5EgdGjhuqVwIG5o4bqldCBraG/huqNuZyAxLjYlLg0KDQojIyAqKjIuNS5EaeG7h24gdMOtY2ggY+G7p2EgY8OhYyBxdeG7kWMgZ2lhKioNCg0KYGBge3J9DQpkMSAlPiVnZ3Bsb3QoYWVzKHggPSBOYW1lLCB5ID0gQXJlYS4ua20uLiwgZmlsbCA9IE5hbWUpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnMoeCA9ICJRdeG7kWMgZ2lhIiwgeSA9ICJEaeG7h24gdMOtY2ggKGttwrIpIiwgdGl0bGUgPSAiRGnhu4duIHTDrWNoIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSAiKSArDQogICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQoQXJlYS4ua20uLiwzKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnYmxhY2snKSsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCiAgICANCmBgYA0KDQotIFRydW5nIFF14buRYyAoQ2hpbmEpOiBEaeG7h24gdMOtY2ggbMOgIDkuNzA2Ljk2MSBrbcKyLg0KDQotIOG6pG4gxJDhu5kgKEluZGlhKTogRGnhu4duIHTDrWNoIGzDoCAzLjI4Ny41OTAga23Csi4NCg0KLSBIb2EgS+G7syAoVW5pdGVkIFN0YXRlcyk6IERp4buHbiB0w61jaCBsw6AgOS4zNzIuNjEwIGttwrIuDQoNCi0gSW5kb25lc2lhOiBEaeG7h24gdMOtY2ggbMOgIDEuOTA0LjU2OSBrbcKyLg0KDQotIFBha2lzdGFuOiBEaeG7h24gdMOtY2ggbMOgIDg4MS45MTIga23Csi4NCg0KLSBOaWdlcmlhOiBEaeG7h24gdMOtY2ggbMOgIDkyMy43Njgga23Csi4NCg0KLSBCcmF6aWw6IERp4buHbiB0w61jaCBsw6AgOC41MTUuNzY3IGttwrIuDQoNCi0gQmFuZ2xhZGVzaDogRGnhu4duIHTDrWNoIGzDoCAxNDcuNTcwIGttwrIuDQoNCi0gTmdhIChSdXNzaWEpOiBEaeG7h24gdMOtY2ggbMOgIDE3LjA5OC4yNDIga23Csi4NCg0KLSBNZXhpY28gOiBEaeG7h24gdMOtY2ggbMOgIDk2NC4zNzUga23Csi4gDQoNCiMjICoqMi42LkJp4buDdSDEkeG7kyBjaG8gZGnhu4duIHTDrWNoIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSDhu58gxJBOw4EqKg0KYGBge3J9DQpkMyA8LSBkJT4lIGZpbHRlcihOYW1lICVpbiUgYygnSW5kb25lc2lhJywnUGhpbGlwcGluZXMnLCdWaWV0bmFtJywnVGhhaWxhbmQnLCAnTXlhbm1hcicsJ0xhb3MnLCdTaW5nYXBvcmUnLCdCcnVuZWknKSkNCmBgYA0KDQoNCmBgYHtyfQ0KZDMgJT4lIGdncGxvdChhZXMoeCA9ICIgIiwgeSA9IEFyZWEuLmttLi4sIGZpbGwgPSBOYW1lKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBjb29yZF9wb2xhcigieSIsKSArDQogIGxhYnModGl0bGUgPSAiQmnhu4N1IMSR4buTIGRp4buHbiB0w61jaCBt4buZdCBz4buRIG7GsOG7m2MgxJBOw4EiLGZpbGwgPSAiUXXhu5FjIGdpYSIseCA9IE5VTEwsIHkgPSBOVUxMKSArDQogIHRoZW1lX21pbmltYWwoKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAocm91bmQoQXJlYS4ua20uLiAvIHN1bShBcmVhLi5rbS4uKSAqIDEwMCwgMSksICIlIikpLHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLHNpemUgPSA0KQ0KYGBgDQoNCi0gSW5kb25lc2lhIGPDsyBkaeG7h24gdMOtY2ggY2FvIG5o4bqldCBzbyB24bubaSBjw6FjIG7GsOG7m2Mga2jDoWMgdHJvbmcga2h1IHbhu7FjLg0KDQotIFRyb25nIGtoaSDEkcOzLCBCcnVuZWkgY8OzIGRp4buHbiB0w61jaCB0aOG6pXAgbmjhuqV0Lg0KDQotIFZpZXRuYW0gY8OzIGRp4buHbiB0w61jaCBsw6AgOC4zJQ0KDQojIyAqKjIuNy4gQmnhu4N1IMSR4buTIG3huq10IMSR4buZIGTDom4gc+G7kSBj4bunYSBt4buZdCBz4buRIHF14buRYyBnaWEgdGh14buZYyDEkE7DgSoqDQpgYGB7cn0NCmQzICU+JSBnZ3Bsb3QoYWVzKHggPSAiIiwgeSA9IERlbnNpdHkuLnBlci5rbS4uLCBmaWxsID0gTmFtZSkpICsNCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsNCiAgY29vcmRfcG9sYXIoInkiLCBzdGFydCA9IDApICsNCiAgbGFicyh0aXRsZSA9ICJCaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgZMOibiBz4buRIGPhu6dhIG3hu5l0IHPhu5Egbsaw4bubYyDEkE7DgSIsZmlsbCA9ICJRdeG7kWMgZ2lhIix4ID0gTlVMTCwgeSA9IE5VTEwpICsNCiAgdGhlbWVfbWluaW1hbCgpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChyb3VuZChEZW5zaXR5Li5wZXIua20uLiAvIHN1bShEZW5zaXR5Li5wZXIua20uLikgKiAxMDAsIDEpLCAiJSIpKSwNCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpLA0KICAgICAgICAgICAgc2l6ZSA9IDQpDQpgYGANCg0KLSBN4bqtdCDEkeG7mSBkw6JuIHPhu5EgY+G7p2EgU2luZ2Fwb3JlIGzDoCBjYW8gbmjhuqV0IDg4LjQlDQoNCiMjICoqMi44LiBCaeG7g3UgxJHhu5MgSGlzdG9ncmFtIFBvcHVsYXRpb25fMjAyMioqDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IFgyMDIyKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEwMDAwLCBmaWxsID0gJ2xpZ2h0Z3JlZW4nLGNvbG9yPSdibGFjaycpICsNCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gb2YgUG9wdWxhdGlvbiAyMDIyIix4ID0gIlBvcHVsYXRpb24iLHkgPSAiRnJlcXVlbmN5IikNCg0KYGBgDQoNCg0KKioyLjkuIEJp4buDdSDEkeG7kyBEZW5zaXR5IFBvcHVsYXRpb25fMjAyMioqDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IFgyMDIyKSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdsaWdodGJsdWUnKSsNCiAgIGxhYnModGl0bGUgPSAiRGVuc2l0eSBvZiBQb3B1bGF0aW9uIDIwMjIiLHggPSAiUG9wdWxhdGlvbiIseSA9ICJGcmVxdWVuY3kiKQ0KDQpgYGANCg0KLSBEw6JuIHPhu5EgbsSDbSAyMDIyIGPhu6dhIGPDoWMgbsaw4bubYyBjw7Mgc+G7sSBiaeG6v24gxJHhu5luZyBt4bqhbmguIA0KDQojIyAqKjIuMTAuIEJp4buDdSDEkeG7kyBIaXN0b2dyYW0gQXJlYSoqDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IEFyZWEuLmttLi4pKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMDAwLCBmaWxsID0gImxpZ2h0Z3JlZW4iLCBjb2xvciA9ICJibGFjayIpICsNCiAgbGFicyh0aXRsZSA9ICJIaXN0b2dyYW0gb2YgQXJlYSIsIHggPSAiQXJlYSAoa23CsikiLHkgPSAiRnJlcXVlbmN5IikNCg0KYGBgDQoNCioqMi4xMS4gQmnhu4N1IMSR4buTIERlbnNpdHkgQXJlYSoqDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IEFyZWEuLmttLi4pKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gJ2xpZ2h0Ymx1ZScpKw0KICAgbGFicyh0aXRsZSA9ICJEZW5zaXR5IG9mIEFyZWEiLHggPSAiQXJlYSAoa23CsikiLHkgPSAiRnJlcXVlbmN5IikNCg0KYGBgDQoNCi0gRGnhu4duIHTDrWNoIGPDoWMgbsaw4bubYyBjw7Mgc+G7sSBjaMOqbmggbOG7h2NoIGzhu5tuIGRvIMSRw7MgZOG7sWEgdsOgbyBz4buRIGTDom4gdsOgIGRp4buHbiB0w61jaCB0YSBjw7MgdGjhu4MgdGjhuqV5IMSRxrDhu6NjIG3huq10IMSR4buZIGTDom4gc+G7kSBjw6FjIG7GsOG7m2MgxJHhu4F1IGPDsyBz4buxIGtow6FjIGJp4buHdCByw7UgcsOgbmcgdsOgIHThu6sgxJHDsyBjw7MgdGjhu4Mgc3V5IMSRb8OhbiBy4bqxbmcgZMOibiBz4buRIGPDoWMgbsaw4bubYyDhu58gbmjhu69uZyBuxINtIDIwMjMsMjAyNCB2w6AgduG7gSBzYXUgbuG7r2EgxJHhu4F1IHPhur0gdMSDbmcgdHLGsOG7n25nIG3huqFuaCBuaMawbmcgZGnhu4duIHTDrWNoIGtow7RuZyDEkeG7lWkgZG8gxJHDsyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgbmfDoHkgbeG7mXQgxJHDtG5nLiBUcm9uZyBraGkgxJHDsyDEkWnhu4F1IGtp4buHbiB5IHThur8gcGjDoXQgdHJp4buDbiBz4buRIG5nxrDhu51pIGzhu5tuIHR14buVaSBjYW8sIG5ndXkgY8ahIGdpw6AgaMOzYSBkw6JuIHPhu5EgdG/DoG4gY+G6p3UuDQoNCiMjICoqMi4xMi4gQmnhu4N1IMSR4buTIEhpc3RvZ3JhbSBEZW5zaXR5KioNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoIGFlcyh4ID0gRGVuc2l0eS4ucGVyLmttLi4pKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTAwLCBmaWxsID0gInJlZCIsIGNvbG9yID0gImJsYWNrIikgKw0KICBsYWJzKHRpdGxlID0gIkhpc3RvZ3JhbSBvZiBEZW5zaXR5IiwNCiAgICAgICB4ID0gIkRlbnNpdHkgKHBlciBrbcKyKSIsDQogICAgICAgeSA9ICJGcmVxdWVuY3kiKQ0KYGBgDQoNCi0gTeG6rXQgxJHhu5kgZMOibiBz4buRIGPDoWMgbsaw4bubYyDEkeG7gXUgY8OzIHPhu7EgY2jDqm5oIGzhu4djaCB2w6AgbeG6rXQgxJHhu5kg4bufIGPDoWMgbsaw4bubYyDEkeG7qW5nIMSR4bqndSBkYW5oIHPDoWNoIMSR4buBdSBkw6B5IMSR4bq3Yy4NCg0KIyMgKioyLjEzLiBCaeG7g3UgxJHhu5Mgc2NhdHRlcnBsb3QgY2hvIGThu68gbGnhu4d1IFBvcHVsYXRpb25fMjAyMiB2w6AgQXJlYSoqDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IFgyMDIyLCB5ID0gQXJlYS4ua20uLikpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJwdXJwbGUiKSArDQogIGxhYnModGl0bGUgPSAiU2NhdHRlcnBsb3Qgb2YgUG9wdWxhdGlvbiAyMDIyIGFuZCBBcmVhIiwNCiAgICAgICB4ID0gIlBvcHVsYXRpb24iLA0KICAgICAgIHkgPSAiQXJlYSAoa23CsikiKQ0KDQpgYGANCg0KLSBCaeG7g3UgxJHhu5Mgc2NhdHRlcnBsb3QgY2hvIGThu68gbGnhu4d1IFBvcHVsYXRpb25fMjAyMiB2w6AgQXJlYSBjaG8gdGjhuqV5IG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZMOibiBz4buRIHbDoCBkaeG7h24gdMOtY2ggY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuDQoNCi0gTmjDrG4gdsOgbyBiaeG7g3UgxJHhu5MsIGNow7puZyB0YSBjw7MgdGjhu4MgdGjhuqV5IHLhurFuZyBjw6FjIMSRaeG7g20gZOG7ryBsaeG7h3UgxJHGsOG7o2MgcGjDom4gdMOhbiB0csOqbiBraMO0bmcgZ2lhbiBiaeG7g3UgxJHhu5MgbeG7mXQgY8OhY2ggbmfhuqt1IG5oacOqbi4gxJBp4buBdSBuw6B5IGNobyB0aOG6pXkga2jDtG5nIGPDsyBt4buZdCBt4bqrdSBxdXkgbHXhuq10IHLDtSByw6BuZyB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZMOibiBz4buRIHbDoCBkaeG7h24gdMOtY2guDQoNCi0gVHV5IG5oacOqbiwgY2jDum5nIHRhIGPDsyB0aOG7gyBuaOG6rW4gdGjhuqV5IHLhurFuZyBjw7MgbeG7mXQgc+G7kSBxdeG7kWMgZ2lhIGPDsyBkaeG7h24gdMOtY2ggbmjhu48gdsOgIGTDom4gc+G7kSBs4bubbiwgdHJvbmcga2hpIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSBraMOhYyBjw7MgZGnhu4duIHTDrWNoIGzhu5tuIG5oxrBuZyBkw6JuIHPhu5EgdGjhuqVwIGjGoW4uIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBraMO0bmcgY2jhu4kgZGnhu4duIHTDrWNoIG3DoCBjw7JuIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIG3huq10IMSR4buZIGTDom4gc+G7kSBj4bunYSBt4buXaSBxdeG7kWMgZ2lhLg0KDQojIyAqKjIuMTQuIEJp4buDdSDEkeG7kyBzY2F0dGVycGxvdCBjaG8gZOG7ryBsaeG7h3UgUG9wdWxhdGlvbl8yMDIyIHbDoCBEZW5zaXR5KioNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gWDIwMjIsIHkgPSBEZW5zaXR5Li5wZXIua20uLikpICsNCiAgZ2VvbV9wb2ludChjb2xvciA9ICJncmVlbiIpICsNCiAgbGFicyh0aXRsZSA9ICJTY2F0dGVycGxvdCBvZiBQb3B1bGF0aW9uIDIwMjIgYW5kIERlbnNpdHkiLA0KICAgICAgIHggPSAiUG9wdWxhdGlvbiIsDQogICAgICAgeSA9ICJEZW5zaXR5IChwZXIga23CsikiKQ0KYGBgDQoNCi0gQmnhu4N1IMSR4buTIHNjYXR0ZXJwbG90IGNobyBk4buvIGxp4buHdSBQb3B1bGF0aW9uXzIwMjIgdsOgIERlbnNpdHkgdGjhu4MgaGnhu4duIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZMOibiBz4buRIHbDoCBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIHRyb25nIGLhu5kgZOG7ryBsaeG7h3UuDQoNCi0gQ8OzIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSBjw7MgZMOibiBz4buRIGzhu5tuIHbDoCBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgY2FvLCB0cm9uZyBraGkgbeG7mXQgc+G7kSBxdeG7kWMgZ2lhIGtow6FjIGPDsyBkw6JuIHPhu5EgbOG7m24gbmjGsG5nIG3huq10IMSR4buZIGTDom4gc+G7kSB0aOG6pXAgaMahbi4gxJBp4buBdSBuw6B5IGNo4buJIHJhIHLhurFuZyBt4bqtdCDEkeG7mSBkw6JuIHPhu5Ega2jDtG5nIGNo4buJIHBo4bulIHRodeG7mWMgdsOgbyBkw6JuIHPhu5EgbcOgIGPDsm4gcGjhu6UgdGh14buZYyB2w6BvIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBuaMawIGRp4buHbiB0w61jaC4NCg0KIyMgKioyLjE1LiBCaeG7g3UgxJHhu5Mgc2NhdHRlcnBsb3QgY2hvIGThu68gbGnhu4d1IEFyZWEgdsOgIERlbnNpdHkqKg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBBcmVhLi5rbS4uLCB5ID0gRGVuc2l0eS4ucGVyLmttLi4pKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAicmVkIikgKw0KICBsYWJzKHRpdGxlID0gIlNjYXR0ZXJwbG90IG9mIEFyZWEgYW5kIERlbnNpdHkiLA0KICAgICAgIHggPSAiQXJlYSAoa23CsikiLA0KICAgICAgIHkgPSAiRGVuc2l0eSAocGVyIGttwrIpIikNCmBgYA0KDQotIENow7puZyB0YSBjw7MgdGjhu4Mgbmjhuq1uIHRo4bqleSBt4buZdCBz4buRIHF14buRYyBnaWEgY8OzIGRp4buHbiB0w61jaCBuaOG7jyB2w6AgbeG6rXQgxJHhu5kgZMOibiBz4buRIGNhbywgdHJvbmcga2hpIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSBraMOhYyBjw7MgZGnhu4duIHTDrWNoIGzhu5tuIG5oxrBuZyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgdGjhuqVwIGjGoW4uIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBt4bqtdCDEkeG7mSBkw6JuIHPhu5Ega2jDtG5nIGNo4buJIHBo4bulIHRodeG7mWMgdsOgbyBkaeG7h24gdMOtY2ggbcOgIGPDsm4gcGjhu6UgdGh14buZYyB2w6BvIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBuaMawIGTDom4gc+G7kSB2w6AgY8OhYyB54bq/dSB04buRIMSR4buLYSBsw70ga2jDoWMuDQoNCi0gTmdvw6BpIHJhLCBiaeG7g3UgxJHhu5MgY8WpbmcgY2hvIHRo4bqleSBy4bqxbmcgY8OzIG3hu5l0IHPhu5EgcXXhu5FjIGdpYSBjw7MgbeG6rXQgxJHhu5kgZMOibiBz4buRIHLhuqV0IGNhbyB24bubaSBkaeG7h24gdMOtY2ggbmjhu48sIHRyb25nIGtoaSBjw7MgbeG7mXQgc+G7kSBxdeG7kWMgZ2lhIGtow6FjIGPDsyBkaeG7h24gdMOtY2ggbOG7m24gbmjGsG5nIG3huq10IMSR4buZIGTDom4gc+G7kSB0aOG6pXAgaMahbi4gxJBp4buBdSBuw6B5IGPDsyB0aOG7gyBjaOG7iSByYSBz4buxIGtow6FjIGJp4buHdCB24buBIHPhu7EgcGjDom4gYuG7kSBkw6JuIHPhu5EgdsOgIGRp4buHbiB0w61jaCBnaeG7r2EgY8OhYyBxdeG7kWMgZ2lhLg0KDQotIFR1eSBuaGnDqm4sIMSR4buDIGhp4buDdSByw7UgaMahbiB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgZGnhu4duIHTDrWNoIHbDoCBt4bqtdCDEkeG7mSBkw6JuIHPhu5EsIGPhuqduIHhlbSB4w6l0IHRow6ptIGPDoWMgeeG6v3UgdOG7kSBraMOhYyBuaMawIGTDom4gc+G7kSwgY8ahIGPhuqV1IGTDom4gc+G7kSwgdsOgIGPDoWMgeeG6v3UgdOG7kSBraW5oIHThur8sIHjDoyBo4buZaSBraMOhYyBj4bunYSB04burbmcgcXXhu5FjIGdpYS4gxJBp4buBdSBuw6B5IGdpw7pwIHRhIGPDsyBjw6FpIG5ow6xuIHThu5VuZyBxdWFuIHbDoCBjaGkgdGnhur90IGjGoW4gduG7gSBt4buRaSBxdWFuIGjhu4cgbsOgeSB0cm9uZyBi4buZIGThu68gbGnhu4d1Lg0KDQojIyAqKjIuMTYuIEJp4buDdSDEkeG7kyDEkcaw4budbmcgdGjhu4MgaGnhu4duIG3huq10IMSR4buZIGTDom4gc+G7kSBj4bunYSBjw6FjIHF14buRYyBnaWEgxJBOw4EqKg0KYGBge3J9DQpkMyAlPiUgZ2dwbG90KCBhZXMoeCA9IE5hbWUsIHkgPSBEZW5zaXR5Li5wZXIua20uLikpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBnZW9tX3BvaW50KCkgKw0KICBsYWJzKHRpdGxlID0gIlBvcHVsYXRpb24gRGVuc2l0eSBvZiBDb3VudHJpZXMiLCB4ID0gIkNvdW50cnkiLCB5ID0gIkRlbnNpdHkgKHBlciBrbcKyKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KLSBOaMOsbiB2w6BvIGJp4buDdSDEkeG7kywgY2jDum5nIHRhIGPDsyB0aOG7gyB0aOG6pXkgcuG6sW5nIFBoaWxpcHBpbmVzIGPDsyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgY2FvIG5o4bqldCwgdGnhur9wIHRoZW8gbMOgIFZpZXRuYW0gdsOgIEluZG9uZXNpYS4gVGjDoWkgTGFuIHbDoCBNeWFubWFyIGPDsyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgdGjhuqVwIGjGoW4gc28gduG7m2kgY8OhYyBxdeG7kWMgZ2lhIGtow6FjIHRyb25nIHPhu5EgbsOgeS4NCg0KLSBCaeG7g3UgxJHhu5Mgc+G7rSBk4bulbmcgY8OhYyDEkWnhu4NtIMSR4buDIGJp4buDdSB0aOG7iyBk4buvIGxp4buHdSB04burbmcgcXXhu5FjIGdpYSBj4bulIHRo4buDLCB0cm9uZyBraGkgxJHGsOG7nW5nIHRo4bqzbmcgbuG7kWkgY8OhYyDEkWnhu4NtIGdpw7pwIGNow7puZyB0YSBuaMOsbiB0aOG6pXkgeHUgaMaw4bubbmcgdOG7lW5nIHF1YW4gY+G7p2EgbeG6rXQgxJHhu5kgZMOibiBz4buRLg0KDQojIyAqKjIuMTcuIEJp4buDdSDEkeG7kyBj4buZdCDEkeG7kWkgY2hp4bq/dSBkaeG7h24gdMOtY2ggY8OhYyBxdeG7kWMgZ2lhIMSQTsOBKioNCmBgYHtyfQ0KZDMgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBBcmVhLi5rbS4uKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnModGl0bGUgPSAiQ29tcGFyaXNvbiBvZiBDb3VudHJ5IEFyZWFzIiwgeCA9ICJDb3VudHJ5IiwgeSA9ICJBcmVhIChrbcKyKSIpICsNCiAgdGhlbWVfbWluaW1hbCgpDQpgYGANCg0KLSBRdWEgYmnhu4N1IMSR4buTLCBjaMO6bmcgdGEgY8OzIHRo4buDIG5ow6xuIHRo4bqleSBy4bqxbmcgSW5kb25lc2lhIGPDsyBkaeG7h24gdMOtY2ggbOG7m24gbmjhuqV0IHRyb25nIHPhu5EgY8OhYyBxdeG7kWMgZ2lhIMSRxrDhu6NjIHNvIHPDoW5oLCB0aeG6v3AgdGhlbyBsw6AgTXlhbm1hciwgVGhhaWxhbmQsIFBoaWxpcHBpbmVzIHbDoCBWaWV0bmFtLg0KDQojIyAqKjIuMTguIEJp4buDdSDEkeG7kyBj4buZdCB0aOG7gyBoaeG7h24gdOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBkw6JuIHPhu5EgY+G7p2EgY8OhYyBxdeG7kWMgZ2lhIMSQTsOBKioNCmBgYHtyfQ0KZDMgJT4lIGdncGxvdChhZXMoeCA9IE5hbWUsIHkgPSBHcm93dGhSYXRlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnModGl0bGUgPSAiUG9wdWxhdGlvbiBHcm93dGggUmF0ZSBvZiBDb3VudHJpZXMiLCB4ID0gIkNvdW50cnkiLCB5ID0gIkdyb3d0aCBSYXRlIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQotIEThu7FhIHbDoG8gYmnhu4N1IMSR4buTLCBjaMO6bmcgdGEgY8OzIHRo4buDIG5o4bqtbiB0aOG6pXkgcuG6sW5nIEluZG9uZXNpYSwgUGhpbGlwcGluZXMgdsOgIFZpZXRuYW0gY8OzIHThu7cgbOG7hyB0xINuZyB0csaw4bufbmcgZMOibiBz4buRIGNhbyBuaOG6pXQgdHJvbmcgc+G7kSBjw6FjIHF14buRYyBnaWEgxJHGsOG7o2Mgc28gc8OhbmguIFRow6FpIExhbiB2w6AgTXlhbm1hciBjw7MgdOG7tyBs4buHIHTEg25nIHRyxrDhu59uZyBkw6JuIHPhu5EgdGjhuqVwIGjGoW4gc28gduG7m2kgY8OhYyBxdeG7kWMgZ2lhIGtow6FjIHRyb25nIG5ow7NtIG7DoHkuDQoNCiMjICoqMi4xOS4gQmnhu4N1IMSR4buTIGPhu5l0IHRo4buDIGhp4buHbiB04buJIGzhu4cgZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSDEkE7DgSoqDQpgYGB7cn0NCmQzICU+JSBnZ3Bsb3QoYWVzKHggPSBOYW1lLCB5ID0gV29ybGQuUG9wdWxhdGlvbi5QZXJjZW50YWdlKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgZmlsbCA9ICJzdGVlbGJsdWUiKSArDQogIGxhYnModGl0bGUgPSAiV29ybGQgUG9wdWxhdGlvbiBQZXJjZW50YWdlIFJhbmsgb2YgQ291bnRyaWVzIiwgeCA9ICJDb3VudHJ5IiwgeSA9ICJSYW5rIikgKw0KICB0aGVtZV9taW5pbWFsKCkNCmBgYA0KDQotIEThu7FhIHbDoG8gYmnhu4N1IMSR4buTLCBjaMO6bmcgdGEgY8OzIHRo4buDIG5ow6xuIHRo4bqleSBy4bqxbmcgSW5kb25lc2lhIGPDsyBkw6JuIHPhu5EgY2hp4bq/bSBwaOG6p24gdHLEg20gbOG7m24gbmjhuqV0IHRyw6puIHRo4bq/IGdp4bubaSB0cm9uZyBz4buRIGPDoWMgcXXhu5FjIGdpYSDEkcaw4bujYyBzbyBzw6FuaC4gUGhpbGlwcGluZXMgdsOgIFZpZXRuYW0gY8WpbmcgY8OzIGTDom4gc+G7kSBjaGnhur9tIHBo4bqnbiB0csSDbSBraMOhIGNhby4gQnJ1bmVpIHbDoCBTaW5nYXBvcmUgY8OzIGTDom4gc+G7kSBjaGnhur9tIHBo4bqnbiB0csSDbSB0aOG6pXAgaMahbiBzbyB24bubaSBjw6FjIHF14buRYyBnaWEga2jDoWMgdHJvbmcgbmjDs20gbsOgeS4NCg0KIyMgKioyLjIwLiBCaeG7g3UgxJHhu5MgY+G7mXQgdGjhu4MgaGnhu4duIGRp4buHbiB0w61jaCB2w6AgbeG6rXQgxJHhu5kgZMOibiBz4buRIGPhu6dhIGPDoWMgcXXhu5FjIGdpYSDEkE7DgSoqDQpgYGB7cn0NCmQzICU+JSBnZ3Bsb3QoYWVzKHggPSBOYW1lKSkgKw0KICBnZW9tX2NvbChhZXMoeSA9IEFyZWEuLmttLi4pLCBmaWxsID0gInN0ZWVsYmx1ZSIsIHdpZHRoID0gMC40LCBwb3NpdGlvbiA9ICJkb2RnZSIpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gRGVuc2l0eS4ucGVyLmttLi4gKiA1MDAwKSwgY29sb3IgPSAicmVkIiwgc2l6ZSA9IDEsIGdyb3VwID0gMSkgKw0KICBsYWJzKHRpdGxlID0gIkNvbXBhcmlzb24gb2YgQXJlYSBhbmQgUG9wdWxhdGlvbiBEZW5zaXR5IiwgeCA9ICJDb3VudHJ5IiwgeSA9ICJBcmVhIC8gRGVuc2l0eSIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKHNlYy5heGlzID0gc2VjX2F4aXMofi4vNTAwMCwgbmFtZSA9ICJEZW5zaXR5IChwZXIga23CsikiKSkgKw0KICB0aGVtZV9taW5pbWFsKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCi0gROG7sWEgdsOgbyBiaeG7g3UgxJHhu5MsIGNow7puZyB0YSBjw7MgdGjhu4MgdGjhuqV5IHLhurFuZyBJbmRvbmVzaWEgY8OzIGRp4buHbiB0w61jaCBs4bubbiBuaOG6pXQgdHJvbmcgc+G7kSBjw6FjIHF14buRYyBnaWEgxJHGsOG7o2Mgc28gc8OhbmgsIHRyb25nIGtoaSBQaGlsaXBwaW5lcyBjw7MgbeG6rXQgxJHhu5kgZMOibiBz4buRIGNhbyBuaOG6pXQuIFZpZXRuYW0gdsOgIFRoYWlsYW5kIGPDsyBkaeG7h24gdMOtY2ggdMawxqFuZyDEkeG7kWkgbOG7m24sIG5oxrBuZyBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgdGjhuqVwIGjGoW4gc28gduG7m2kgSW5kb25lc2lhIHbDoCBQaGlsaXBwaW5lcy4gTXlhbm1hciBjw7MgZGnhu4duIHTDrWNoIHbDoCBt4bqtdCDEkeG7mSBkw6JuIHPhu5EgdGjhuqVwIG5o4bqldCB0cm9uZyBz4buRIGPDoWMgcXXhu5FjIGdpYSBuw6B5Lg==