GIỚI THIỆU BỘ DỮ LIỆU
Diamond là một bộ dữ liệu về kim cương được tích hợp
sẵn trong R, gồm 53.940 quan sát tương ứng với 53.940 hàng và 10 biến
ứng với 10 cột dữ liệu, và bao gồm thông tin về 53.940 viên kim cương,
với các thuộc tính sau:
carat: Trọng lượng carat của viên kim cương
cut: Chất lượng của vết cắt của viên kim cương (Ideal, Premium,
Very Good, Good, Fair)
color: Màu sắc của viên kim cương (D, E, F, G, H, I, J)
clarity: Độ tinh khiết của viên kim cương (IF, VVS1, VVS2, VS1,
VS2, SI1, SI2, I1)
depth: Tỷ lệ chiều sâu của viên kim cương
table (Diamond Table): bề mặt của viên kim cương
price: Giá bán của viên kim cương (USD)
x: chiều dài của viên kim cương (mm)
y: chiều rộng của viên kim cương (mm)
z: chiều cao của viên kim cương (mm)
Bộ dữ liệu kim cương thường được sử dụng trong các ví dụ về R
Markdown để minh họa cách phân tích dữ liệu và tạo báo cáo. Từ bộ dữ
liệu diamond này ta có thể khai thác và phân tích được
rất nhiều thông tin của những viên kim cương. Và phân tích dựa trên việc
lập những đồ thị như sau:
. Phân tích đồ thị số
lượng viên kim cương theo từng mức chất lượng
Việc phân tích đồ thị số lượng viên kim cương theo từng mức chất
lượng để đánh giá thị trường kim cương:
Về nhu cầu: Phân tích xu hướng nhu cầu cho từng mức độ phổ biến:
Đồ thị thể hiện số lượng viên kim cương ở mỗi mức chất lượng, giúp đánh
giá mức độ phổ biến của từng loại.
Cung: Đồ thị thể hiện số lượng viên kim cương được cung cấp ra
thị trường ở mỗi mức chất lượng, giúp đánh giá mức độ cạnh tranh và đưa
ra chiến lược giá cả hợp lý.
Phân khúc thị trường: Xác định các phân khúc thị trường tiềm năng
dựa trên nhu cầu về mức chất lượng kim cương, giúp doanh nghiệp tập
trung nguồn lực và chiến lược marketing hiệu quả.
Ngoài ra, việc phân tích đồ thị số lượng viên kim cương theo từng mức
chất lượng còn có thể ứng dụng trong nhiều lĩnh vực khác như: quản lý
kho hàng, dự báo giá cả, đánh giá rủi ro đầu tư, v.v. Việc sử dụng hiệu
quả công cụ phân tích này sẽ giúp các doanh nghiệp, nhà đầu tư và người
tiêu dùng đưa ra quyết định sáng suốt trong thị trường kim cương đầy
tiềm năng nhưng cũng không kém phần cạnh tranh.
Đây là đồ thị Bar chart thể hiện số lượng viên kim cương theo theo
từng mức chất lượng (Ideal, Premium, Very Good, Good, Fair).
tmp <- diamonds
tmp %>% ggplot(aes(x = cut)) + geom_bar() + labs(x = 'Chất lượng', y = 'Số lượng') + labs(title = "Đồ thị số lượng viên kim cương theo từng mức chất lượng")

#tmp là một dataframe chứa dữ liệu về các viên kim cương, bao gồm biến cut thể hiện mức chất lượng cắt.
#ggplot(aes(x = cut)) tạo ra một ggplot object với trục hoành là biến cut.
#geom_bar() thêm một biểu đồ thanh vào ggplot object.
#labs(x = 'Chất lượng', y = 'Số lượng') đặt nhãn cho trục x và y.
#labs(title = "Đồ thị số lượng viên kim cương theo từng mức chất lượng") đặt tiêu đề cho biểu đồ.
Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
Những viên kim cương có chất lượng cắt “Ideal” chiếm phần lớn
trong tổng số viên kim cương, hơn 20.000 viên: Điều này cho thấy
majority kim cương có chất lượng cắt rất tốt.
Số lượng kim cương giảm dần theo chất lượng cắt: Càng xuống cấp
độ thấp, số lượng kim cương càng ít.
Những viên kim cương có chất lượng cắt “Fair” có số lượng kim
cương ít nhất, khoảng 2.000 viên: Chất lượng cắt “Fair” có thể ảnh hưởng
đến vẻ đẹp và giá trị của kim cương, dẫn đến số lượng ít hơn.
. Phân tích đồ thị số
lượng viên kim cương theo từng màu sắc
Việc phân tích đồ thị số lượng viên kim cương theo từng màu sắc để
nắm bắt được số lượng của từng nhóm màu sắc của những viên kim cương, từ
đó:
Nắm bắt xu hướng thị trường: Xác định màu sắc nào được ưa chuộng
nhất, từ đó dự đoán nhu cầu thị trường trong tương lai. Phân tích xu
hướng thay đổi sở thích theo thời gian để đưa ra chiến lược kinh doanh
phù hợp.
Phân tích thị hiếu khách hàng: Sở thích theo khu vực: Phân tích
sở thích về màu sắc theo khu vực, quốc gia để điều chỉnh chiến lược
marketing phù hợp. Nhóm khách hàng: Xác định nhóm khách hàng ưa chuộng
từng màu sắc để cá nhân hóa trải nghiệm mua sắm.
Phân khúc thị trường: Lựa chọn thị trường mục tiêu: phù hợp với
màu sắc kim cương mà bạn cung cấp. Đa dạng hóa sản phẩm: Đa dạng hóa sản
phẩm theo màu sắc để đáp ứng nhu cầu của nhiều nhóm khách hàng.
Dưới đây là đồ thị Bar chart thể hiện số lượng viên kim cương theo
từng màu sắc.
tmp <- diamonds
tmp %>% ggplot(aes(x = color)) + geom_bar() + labs(x = 'Màu sắc', y = 'Số lượng') + labs( title = "Đồ thị số lượng viên kim cương theo từng màu sắc")

#tmp là một dataframe chứa dữ liệu về các viên kim cương, bao gồm biến color thể hiện màu sắc của viên kim cương.
#ggplot(aes(x = color)) tạo ra một ggplot object với trục hoành là biến color.
#geom_bar() thêm một biểu đồ thanh vào ggplot object.
#labs(x = 'Màu sắc', y = 'Số lượng') đặt nhãn cho trục x và y.
#labs(title = "Đồ thị số lượng viên kim cương theo từng màu sắc") đặt tiêu đề cho biểu đồ.
Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
Số lượng kim cương theo từng nhóm màu từ màu D đến màu J phân bố
không đồng đều.
Số lượng những viên kim cương có màu G chiếm số lượng nhiều nhất,
khoảng 11.000 viên, tiếp đến là những viên kim cương có màu E và số
lượng những viên kim cương có màu J có số lượng ít nhất trong tổng số
lượng viên kim cương, dưới 3.000 viên.
. Phân tích đồ thị số
lượng kim cương theo độ tinh khiết
Việc phân tích đồ thị số lượng kim cương theo độ tinh khiết mang để
nắm bắt được thị trường kim cương, bao gồm:
Mức độ phổ biến: Xác định độ tinh khiết phổ biến nhất và ít phổ
biến nhất của kim cương.
Giá trị và nhu cầu: Mức độ khan hiếm: Phân tích mối liên hệ giữa
độ tinh khiết và mức độ khan hiếm, từ đó ảnh hưởng đến giá trị. Nhu cầu
thị trường: Đánh giá nhu cầu thị trường đối với kim cương theo từng mức
độ tinh khiết, giúp đưa ra quyết định kinh doanh phù hợp.
Xu hướng thị trường: Xu hướng thay đổi: Phân tích xu hướng thay
đổi nhu cầu theo thời gian cho từng mức độ tinh khiết. Dự đoán: Dự đoán
xu hướng tương lai của nhu cầu thị trường dựa trên xu hướng hiện
tại.
Đây là đồ thị Bar chart thể hiện số lượng viên kim cương theo từng
mức độ tinh khiết (IF, VVS1, VVS2, VS1, VS2, SI1, SI2, I1).
tmp <- diamonds
tmp %>% ggplot(aes(x = clarity)) + geom_bar() + labs(x = 'Độ tinh khiết', y = 'Số lượng') + labs(title = "Đồ thị số lượng kim cương theo độ tinh khiết")

#tmp là một dataframe chứa dữ liệu về các viên kim cương, bao gồm biến clarity thể hiện mức độ tinh khiết của viên kim cương.
#ggplot(aes(x = clarity)) tạo ra một ggplot object với trục hoành là biến clarity.
#geom_bar() thêm một biểu đồ thanh vào ggplot object.
#labs(x = 'Độ tinh khiết', y = 'Số lượng') đặt nhãn cho trục x và y.
#labs(title = " ") đặt tiêu đề cho biểu đồ.
Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
Số lượng viên kim cương phân bố ở từng mức độ tinh khiết là khác
nhau, số lượng viên kim cương càng ít cho thấy độ tinh khiết của viên
kim cương càng cao.
Những viên kim cương có độ tinh khiết I1 có độ tinh khiết rất
cao, những viên kim cương có độ tinh khiết IF cao và những viên kim
cương có độ tinh khiết là VS2 là những viên có độ tinh khiết thấp, những
viên kim cương có độ tinh khiết là SI1 là những viên có độ tinh khiết
rất thấp.
Số lượng những viên kim cương có độ tinh khiết là SI2 chiếm số
lượng lớn trong tổng số viên kim cương, trên 12.000 viên, tiếp đó là
những viên kim cương có độ tinh khiết là VS2 và những viên kim cương
chiếm số lượng ít nhất trong tổng số viên kim cương là Những viên có độ
tinh khiết là I1, dưới 1.000 viên.
Ví dụ: Độ tinh khiết cao: Nếu “I1” có số lượng ít nhất, cho thấy đây
là độ tinh khiết cao nhất và có giá trị cao.
. Phân tích số lượng
kim cương theo độ tinh khiết cho nhóm kim cương có màu D
Mức độ tinh khiết là một trong những yếu tố quan trọng ảnh hưởng đến
giá trị của kim cương. Việc phân tích này cho thấy số lượng kim cương ở
mỗi mức độ tinh khiết, giúp người mua so sánh giá trị giữa các viên kim
cương có màu D. Ví dụ, một viên kim cương D với độ tinh khiết “IF” sẽ có
giá cao hơn so với viên kim cương D với độ tinh khiết “I1”.
tmp <- diamonds
tmp <- tmp %>% group_by(clarity, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
tmp %>% ggplot(aes(x = clarity, y = n)) + geom_col(data = tmp %>% filter(color == 'D'), fill = 'darkgreen')+labs(x="Độ tinh khiết",y="Số lượng") + labs( title = "Đồ thị số lượng kim cương theo độ tinh khiết cho nhóm kim cương có màu D")

#câu lệnh 1:
#group_by(clarity, color): Nhóm dữ liệu theo hai biến clarity (độ tinh khiết) và color (màu sắc). summarise(n = n()): Tính tổng số lượng (n) cho mỗi nhóm được tạo bởi group_by
#câu lệnh 2:
#ggplot(aes(x = clarity, y = n)): Tạo biểu đồ ggplot2 với trục x là clarity và trục y là n.
#geom_col(data = tmp %>% filter(color == 'D'), fill = 'darkgreen'): Thêm hình chữ nhật vào biểu đồ cho mỗi nhóm clarity với màu darkgreen cho nhóm color == 'D'.
#labs(x = "Độ tinh khiết", y = "Số lượng"): Thêm nhãn cho trục x và y.
#labs(title = " "): Thêm tiêu đề cho biểu đồ.
Biểu đồ cho thấy sự phổ biến của các mức độ tinh khiết khác nhau
trong nhóm kim cương màu D. Thông tin này có thể giúp người mua kim
cương đánh giá giá trị của một viên kim cương cụ thể. Ví dụ, một viên
kim cương D với độ tinh khiết “IF” sẽ hiếm hơn và đắt hơn một viên kim
cương D với độ tinh khiết “SI1”.
Nhận xét:
Nhìn chung, Xu hướng Số lượng kim cương giảm dần khi độ tinh
khiết tăng của kim cương màu D.
Có sự chênh lệch đáng kể về số lượng kim cương giữa các mức độ
tinh khiết của màu D.
Sự phân bố số lượng kim cương màu D: SI1 là mức độ tinh khiết phổ
biến nhất với số lượng kim cương cao nhất (trên 2.000 viên). I1 là mức
độ tinh khiết hiếm nhất với số lượng kim cương thấp nhất (dưới 100
viên).
Mức độ ảnh hưởng của độ tinh khiết: Có thể thấy rằng độ tinh
khiết ảnh hưởng đến số lượng kim cương. Nhóm kim cương có độ tinh khiết
cao (VVS1, IF) có số lượng ít hơn nhiều so với nhóm kim cương có độ tinh
khiết thấp (SI2, SI1,VS2…).
. Phân tích đồ thị số
lượng kim cương theo chất lượng
Việc phân tích đồ thị số lượng viên kim cương theo chất lượng để nắm
bắt được thị trường kim cương.
Đây là đồ thị Bar chart ngang thể hiện số lượng viên kim cương theo
từng loại cắt (Ideal, premium, Very Good, Good, Fair).
tmp <- diamonds
tmp %>% ggplot(aes(x = cut)) + geom_bar() + labs(x = 'Loại', y = 'Số lượng') + coord_flip() + labs(title = "Đồ thị số lượng kim cương theo chất lượng")

#tmp là một dataframe chứa dữ liệu về các viên kim cương, bao gồm biến cut thể hiện mức chất lượng cắt.
#ggplot(aes(x = cut)) tạo ra một ggplot object với trục hoành là biến cut.
#geom_bar() thêm một biểu đồ thanh vào ggplot object.
#labs(x = 'Loại', y = 'Số lượng') đặt nhãn cho trục x và y.
#coord_flip() đổi vị trí của trục hoành và trục tung.
#labs(title = " ") đặt tiêu đề cho biểu đồ.
Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
Những viên kim cương có chất lượng cắt “Ideal” chiếm phần lớn
trong tổng số viên kim cương, hơn 20.000 viên: Điều này cho thấy
majority kim cương có chất lượng cắt rất tốt.
Số lượng kim cương giảm dần theo chất lượng cắt: Càng xuống cấp
độ thấp, số lượng kim cương càng ít.
Những viên kim cương có chất lượng cắt “Fair” có số lượng kim
cương ít nhất, khoảng 2.000 viên: Chất lượng cắt “Fair” có thể ảnh hưởng
đến vẻ đẹp và giá trị của kim cương, dẫn đến số lượng ít hơn.
. Phân tích đồ thị số
lượng kim cương theo chất lượng của 2 màu G và J
Việc so sánh này có thể mang lại nhiều lợi ích cho nhiều đối tượng
trong thị trường kim cương:
Hiểu rõ hơn về sự phổ biến của các màu sắc kim cương khác nhau.
So sánh giá bán của kim cương G và J trong cùng nhóm chất lượng. Lựa
chọn kim cương phù hợp với nhu cầu và ngân sách.
Giúp việc định giá kim cương G và J chính xác hơn, dựa trên dữ
liệu thị trường. Tăng khả năng cạnh tranh trên thị trường. Tạo dựng uy
tín với khách hàng.
Giúp thu thập dữ liệu về thị trường kim cương. Xác định xu hướng
về số lượng và giá bán của kim cương G và J. Phát triển các mô hình dự
đoán số lượng và giá bán của kim cương G và J.
Giúp các nhà kinh doanh lập kế hoạch kinh doanh hiệu quả hơn, dựa
trên dữ liệu về thị trường. Xác định phân khúc thị trường mục tiêu. Phát
triển các chiến lược marketing phù hợp.
tmp <- diamonds
tmp <- tmp %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
tmp %>% ggplot(aes(x = cut, y = n)) + geom_col(data = tmp %>% filter(color == 'G'), fill = 'darkgreen') + geom_col(data = tmp %>% filter(color == 'J'), fill = 'blue')+ labs(x = 'Loại', y = 'Số lượng') + coord_flip() + labs(title = "Đồ thị số lượng kim cương theo chất lượng của 2 màu G và J ")

Biểu đồ cho thấy sự khác biệt về số lượng kim cương giữa các chất
lượng cắt cho cả hai màu G và J. Dữ liệu được nhóm theo 5 mức độ chất
lượng cắt: Ideal, Premium, Very Good, Good, Fair. Số lượng kim cương cho
mỗi mức độ cắt được biểu thị bằng hai nhóm cột: Cột màu xanh lá đậm thể
hiện số lượng kim cương màu G và cột màu xanh lam thể hiện số lượng kim
cương màu J.
Nhìn chung, kim cương màu J có xu hướng có số lượng nhiều hơn kim
cương màu G cùng chất lượng cắt và số lượng kim cương giảm dần khi chất
lượng cắt giảm ( từ Ideal đến Fair): nhóm kim cương Ideal có số lượng
nhiều nhất cho cả hai màu và kim cương Fair có số lượng ít nhất cho cả
hai màu.
Chất lượng cắt Ideal có số lượng kim cương cao nhất ( gần 5.000
viên): trong đó số lượng kim cương màu J có số lượng nhiều gấp 4 lần màu
G.
Chất lượng cắt Fair có số lượng kim cương thấp nhất (dưới 500
viên): trong đó, số lượng kim cương màu G và màu J có số lượng xấp xỉ
bằng nhau.
Tóm lại, chất lượng cắt ảnh hưởng đến số lượng kim cương. Kim cương
có chất lượng cắt tốt (Ideal, Premium, Very Good, Good) có số lượng
nhiều hơn và giá thành cao hơn so với kim cương có chất lượng cắt thấp
(Fair). Cho thấy rằng kỹ thuật cắt kim cương rất tiên tiến và hiện đại,
cho ra được đa số sản phẩm tốt.
. Phân tích số lượng
kim cương theo chất lượng của màu D, I và J
Việc phân tích số lượng viên kim cương theo độ tinh khiết giữa ba màu
sắc ‘D’, ‘I’ và ‘J’ có thể quan sát các đặc điểm như:
Xu hướng chung của số lượng viên kim cương theo độ tinh
khiết.
Sự khác biệt về số lượng viên kim cương giữa các màu sắc tại mỗi
mức độ tinh khiết.
Màu sắc nào có nhiều viên kim cương nhất ở các mức độ tinh khiết
khác nhau.
tmp <- diamonds
tmp <- tmp %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
tmp %>% ggplot(aes(x = cut, y = n)) + geom_col(data = tmp %>% filter(color == 'D'), fill = 'black') + geom_col(data = tmp %>% filter(color == 'I'), fill = 'darkgreen')+ geom_col(data = tmp %>% filter(color == 'J'), fill = 'brown')+ labs(x = 'Loại', y = 'Số lượng') + coord_flip() + labs(title = "Đồ thị số lượng kim cương theo chất lượng của màu J , I và D")

# coord_flip(): Đảo ngược trục x và y.
Biểu đồ thu được thể hiện số lượng viên kim cương theo từng mức chất
lượng (cut) cho ba màu sắc ‘D’, ‘I’ và ‘J’. Biểu đồ có ba cột chồng nằm
ngang, với mỗi cột thể hiện số lượng viên kim cương cho một màu sắc
tương ứng. Chiều dài của mỗi cột tại mỗi mức chất lượng biểu thị số
lượng viên kim cương có màu sắc đó ở mức chất lượng đó.
Nhận xét về dữ liệu trong biểu đồ:
Nhìn chung, số lượng viên kim cương D ít nhất ở hầu hết các mức
chất lượng của kim cương.
Số lượng viên kim cương giảm dần theo chất lượng của kim cương (
từ Ideal đến Fair) cho cả ba màu sắc.
Phân bố số lượng viên kim cương theo màu sắc: Màu ‘I’ và ‘J’ có
xu hướng phân bố đều hơn giữa các mức chất lượng của kim cương, còn màu
‘D’ có xu hướng tập trung nhiều hơn ở các mức chất lượng của kim cương
trừ Fair.
. Phân tích đồ thị số
lượng kim cương theo chất lượng
Đây là đồ thị Bar chart thể hiện chi tiết số lượng viên kim cương
theo từng mức chất lượng cắt (Ideal, Premium, Very Good, Good,
Fair).
tmp <- diamonds
tmp %>% group_by(cut) %>% summarise(n = n()) %>% ggplot(aes(cut,n)) + geom_col(fill='purple') + geom_text(aes(label = n),vjust = 2, color = 'black') + labs(x = 'Chất lượng', y = 'Số lượng') + labs( title = "Đồ thị số lượng kim cương theo chất lượng")

#Thêm chú thích (geom_text) hiển thị số lượng (n) cho mỗi thanh.
#vjust = 2: Di chuyển chú thích lên trên một chút để dễ nhìn hơn.
#color = 'black': Chọn màu đen cho chú thích.
Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
Những viên kim cương có chất lượng cắt “Ideal” chiếm phần lớn
trong tổng số viên kim cương, 21.551 viên: Điều này cho thấy majority
kim cương có chất lượng cắt rất tốt.
Số lượng kim cương giảm dần theo chất lượng cắt, từ 21.551 viên
(Ideal) và 1.610 viên (Fair): Càng xuống cấp độ thấp, số lượng kim cương
càng ít.
Những viên kim cương có chất lượng Premium, có 13.791 viên; những
viên có chất lượng là Very Good có 12.082 viên và những viên kim cương
có chất lượng Good có 4.906 viên.
Những viên kim cương có chất lượng cắt “Fair” có số lượng kim
cương ít nhất, 1.610 viên: Chất lượng cắt “Fair” có thể ảnh hưởng đến vẻ
đẹp và giá trị của kim cương, dẫn đến số lượng ít hơn.
. Phân tích đồ thị số
lượng kim cương theo màu sắc
Đây là đồ thị Bar chart thể hiện chi tiết số lượng kim cương theo
từng màu sắc (D, E, F, G, H, I, J).
tmp <- diamonds
tmp %>% group_by(color) %>% summarise(n = n()) %>% ggplot(aes(color,n)) + geom_col(fill='purple') + geom_text(aes(label = n),vjust = 2, color = 'black') + labs(x = 'Màu sắc', y = 'Số lượng') + labs(title = "Đồ thị số lượng kim cương theo màu sắc")

#Thêm chú thích (geom_text) hiển thị số lượng (n) cho mỗi thanh.
#vjust = 2: Di chuyển chú thích lên trên một chút để dễ nhìn hơn.
#color = 'black': Chọn màu đen cho chú thích.
Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
Số lượng kim cương theo từng nhóm màu từ màu D đến màu J phân bố
không đồng đều.
Số lượng những viên kim cương có màu G chiếm số lượng nhiều nhất
có 11.292 viên ( chiếm 20,93% trong tổng số viên kim cương), tiếp đến là
những viên kim cương có màu E, 9.797 viên (chiếm 18,16% trong tổng số)
và số lượng những viên kim cương có màu J có số lượng ít nhất trong tổng
số lượng viên kim cương, 2.808 viên (chiếm 5,2% trong tổng số kim
cương).
Những viên kim cương màu G có số lượng nhiều nhất, điều này cho
thấy kim cương có màu G là phổ biến nhất. Và những viên kim cương màu J
có số lượng ít nhất cho thấy nó ít phổ biến hơn kim cương có màu
G.
. Phân tích đồ thị tỷ
lệ phần trăm số lượng kim cương theo chất lượng
Đây là đồ thị Bar chart thể hiện tỷ lệ phần trăm số lượng viên kim
cương theo từng mức chất lượng (Ideal, Premium, Very Good, Good,
Fair).
tmp <- diamonds
tmp %>% group_by(cut) %>% summarise(n = n()) %>% ggplot(aes(cut,n)) + geom_col(fill='green') + geom_text(aes(label = percent(n/length(tmp$carat))),vjust = 2, color = 'red') + labs(x = 'Chất lượng', y = 'Số lượng') + labs(title = "Đồ thị tỷ lệ phần trăm số lượng kim cương theo chất lượng")

#Thêm chú thích (geom_text) hiển thị tỷ lệ phần trăm (percent) số lượng kim cương cho mỗi mức chất lượng (cut).
#vjust = 2: Di chuyển chú thích lên trên một chút để dễ nhìn hơn.
#color = 'red': Chọn màu đỏ cho chú thích.
#length(tmp$carat): Lấy tổng số lượng kim cương.
Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
Tỷ lệ phần trăm kim cương Ideal chiếm đa số: Có 40% số lượng kim
cương trong tổng số kim cương.
Tỷ lệ phần trăm kim cương giảm dần theo chất lượng cắt: Càng
xuống cấp độ thấp, tỷ lệ phần trăm kim cương càng ít.
Chất lượng cắt Fair có tỷ lệ phần trăm thấp nhất: Chất lượng cắt
Fair có thể ảnh hưởng đến vẻ đẹp và giá trị của kim cương, dẫn đến tỷ lệ
phần trăm thấp, chỉ chiếm 3% trong tổng số kim cương.
. Phân tích đồ thị tỷ
lệ phần trăm số lượng kim cương theo màu sắc
Đây là đồ thị Bar chart thể hiện tỷ lệ phần trăm số lượng viên kim
cương theo từng màu sắc (D, E, F, G, H, I, J).
tmp <- diamonds
tmp %>% group_by(color) %>% summarise(n = n()) %>% ggplot(aes(color,n)) + geom_col(fill='green') + geom_text(aes(label = percent(n/length(tmp$carat))),vjust = 2, color = 'red') + labs(x = 'Màu sắc', y = 'Số lượng') + labs(title = "Đồ thị tỷ lệ phần trăm số lượng kim cương theo màu sắc")

Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
Tỷ lệ phần trăm kim cương màu G cao nhất: chiếm 20,93% trong tổng
số kim cương.
Những viên kim cương màu J có tỷ lệ phần trăm thấp nhất: Chỉ
chiếm 5,21% trong tổng số viên kim cương.
. Phân tích đồ thị tỷ
lệ phần trăm số lượng kim cương theo độ tinh khiết
Đây là đồ thị Bar chart thể hiện tỷ lệ phần trăm số lượng viên kim
cương theo từng mức độ tinh khiết (IF, VVS1, VVS2, VS1, VS2, SI1, SI2,
I1)
tmp <- diamonds
tmp %>% group_by(clarity) %>% summarise(n = n()) %>% ggplot(aes(clarity,n)) + geom_col(fill='green') + geom_text(aes(label = percent(n/length(tmp$carat))),vjust = 2, color = 'red') + labs(x = 'Độ tinh khiết', y = 'Số lượng') + labs(title = "Đồ thị tỷ lệ phần trăm số lượng kim cương theo độ tinh khiết")

Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
Tỷ lệ phần trăm kim cương SI2,SI1,VS2 cao: Chiếm gần 64% trong
tổng số kim cương, trong đó cao nhất là SI1, chiếm 24,2%, tiếp đến là
VS2, chiếm 22,7% và SI2, chiếm 17%. Thấp nhất là I1, chiếm 1,4% trong
tổng số kim cương.
Tỷ lệ phần trăm kim cương giảm dần từ SI2 đến IF.
Những viên kim cương có độ tinh khiết là SI1 chiếm tỷ lệ cao nhất
(24,2%), cho thấy độ tinh khiết của nó là rất thấp, tiếp đến là VS2
(22,7%) có độ tinh khiết thấp.
Những viên kim cương có độ tinh khiết là I1 chiếm tỷ lệ thấp nhất
(1,4%), cho thấy độ tinh khiết của nó là rất cao, tiếp đến là IF có độ
tinh khiết cao (3,3%), những viên kim cương còn lại có độ tinh khiết
trung bình.
. Phân tích đồ thị số
lượng kim cương theo chất lượng và màu sắc
Đây là đồ thị Bar chart thể hiện số lượng viên kim cương theo từng
mức chất lượng cắt (Ideal, Premium, Very Good, Good, Fair) và màu sắc
(D, E, F, G, H, I, J).
tmp <- diamonds
tmp %>% group_by(cut,color) %>% summarise(n=n()) %>% ggplot(aes(x = cut,y = n)) + geom_col(position = 'dodge') + facet_wrap(~color) + labs(x = 'Chất lượng', y = 'Số lượng') + labs(title = "Đồ thị số lượng kim cương theo chất lượng và màu sắc")
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

#geom_col(position = 'dodge'):Thêm lớp hình chữ nhật (geom_col) với vị trí dodge giúp các thanh không chồng lên nhau
#facet_wrap(~color):Chia biểu đồ thành các phân trang theo biến color
Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
Ở tất cả các nhóm màu, số lượng giảm dần theo chất lượng cắt của
kim cương (từ Ideal đến Fair).
Những viên kim cương có chất lượng là Ideal phổ biến nhất, Fair
hiến hoi nhất: Hầu hết các nhóm màu sắc đều có số lượng viên kim cương
có chất lượng Ideal cao nhất và những viên kim cương có chất lượng Fair
thấp nhất.
Số lượng kim cương đạt chất lượng Ideal thuộc nhóm màu G là nhiều
nhất (khoảng 5.000 viên), tiếp đến là ở nhóm màu E (khoảng 4.000 viên)
và số lượng kim cương đạt chất lượng Fair thuộc nhóm màu G là nhiều nhất
(khoảng 300 viên).
Có sự khác biệt đáng kể về số lượng viên kim cương giữa các nhóm màu
sắc và chất lượng cắt. Qua các đồ thị trên, ta có thể nhận thấy công
nghệ cắt gọt kim cương ở đây khá là tiên tiến và hiện đại, đa số những
viên kim cương được tao ra đều đạt chất lượng từ tốt trở lên và chỉ có 1
lượng ít viên kim cương lỗi.
. Phân tích số lượng
về chất lượng kim cương theo màu D
Đánh giá giá trị kim cương: Giúp người mua kim cương hiểu rõ hơn về
mối liên hệ giữa chất lượng cắt và giá bán trung bình của kim cương màu
D. Cung cấp thông tin để so sánh giá bán của các viên kim cương có chất
lượng cắt khác nhau. Hỗ trợ người mua đưa ra quyết định sáng suốt khi
lựa chọn kim cương phù hợp với nhu cầu và ngân sách.
Hỗ trợ định giá kim cương: Cung cấp dữ liệu tham khảo cho các nhà kim
hoàn và chuyên gia định giá kim cương. Giúp xác định giá trị hợp lý của
kim cương dựa trên chất lượng cắt và màu sắc. Hạn chế tình trạng mua bán
kim cương với giá cao hơn giá trị thực.
Nghiên cứu thị trường kim cương: Phân tích xu hướng giá bán của kim
cương theo thời gian. So sánh giá bán của kim cương ở các khu vực khác
nhau. Đánh giá ảnh hưởng của các yếu tố khác như kích thước, độ tinh
khiết, v.v. đến giá bán của kim cương.
tmp <- diamonds
tmp <- tmp %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
tmp %>% ggplot(aes(x = cut, y = n)) + geom_col(data = tmp %>% filter(color == 'D'), fill = 'darkgreen')+labs(x="Chất lượng",y="Số lượng") + labs( title = " Đồ thị chất lượng kim cương theo màu D")

. Phân tích đồ thị số
lượng kim cương theo chất lượng và màu sắc
Đây là đồ thị Bar chart biểu thị chi tiết, cụ thể số lượng viên kim
cương theo từng mức chất lượng (Ideal, Premium, Very Good, Good, Fair)
và Màu sắc (D, E, F, G, H, I, J). Ở đồ thị này ta có thể phân tích cụ
thể và chính xác các số liệu hơn.
tmp <- diamonds
tmp %>% group_by(cut,color) %>% summarise(n=n()) %>% ggplot(aes(x = cut,y = n)) + geom_col(position = 'dodge') + facet_wrap(~color) + geom_text(aes(label = n),vjust = 0, color = 'green') + labs(x = 'Chất lượng', y = 'Số lượng') + labs(title = "Đồ thị số lượng kim cương theo chất lượng và màu sắc")
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

#geom_col(position = 'dodge'):Thêm lớp hình chữ nhật (geom_col) với vị trí dodge giúp các thanh không chồng lên nhau.
#facet_wrap(~color):Chia biểu đồ thành các phân trang theo biến color
Dựa trên các đồ thị, ta có thể nhận xét một số điểm sau:
Chất lượng cắt Ideal phổ biến nhất: Hầu hết các nhóm màu sắc đều
có số lượng viên kim cương có chất lượng là Ideal là cao nhất.
Số lượng viên kim cương tăng dần theo chất lượng cắt: Từ Fair đến
Ideal, số lượng viên kim cương tăng dần.
Ở nhóm những viên kim cương màu G, tỷ lệ viên kim cương có chất
lượng là Ideal cao nhất (4.484 viên), cao hơn so với các nhóm màu khác
và số lượng gấp 15,55 lần số lượng viên kim cương màu G có chất lượng là
Fair.
. Phân tích đồ thị thể
hiện khối lượng trung bình của kim cương theo chất lượng
Khối lượng (carat) là một trong những yếu tố quan trọng quyết định
giá trị của kim cương. Việc phân tích này giúp ta so sánh khối lượng
trung bình của kim cương theo từng cấp chất lượng, từ đó đánh giá giá
trị tương đối của chúng.
Đối với khách hàng: Hiểu rõ hơn về mối quan hệ giữa chất lượng cắt và
khối lượng trung bình của kim cương. So sánh khối lượng trung bình giữa
các mức chất lượng cắt khác nhau. Lựa chọn kim cương thông minh hơn dựa
trên nhu cầu và ngân sách.
Đối với người bán: Cung cấp thông tin chi tiết cho khách hàng về giá
trị của kim cương và định giá kim cương chính xác hơn.
Đối với ngành công nghiệp kim cương: Nâng cao hiểu biết về các yếu tố
ảnh hưởng đến giá trị kim cương, phát triển các tiêu chuẩn và quy định
cho ngành kim cương, thúc đẩy sự phát triển bền vững của ngành kim
cương.
tmp <- diamonds
tmp %>% group_by(cut) %>% summarise(m= mean(carat)) %>% ggplot(aes(x = cut,y = m)) + geom_col(position = 'dodge') + geom_text(aes(label = round(m,2)), vjust = 2, color = 'green') + labs(x = 'Chất lượng', y = 'Trung bình') + labs(title = "Đồ thị khối lượng trung bình của kim cương theo chất lượng")

#Thêm lớp hình chữ nhật (geom_col) với vị trí dodge giúp các thanh không chồng lên nhau.
#Thêm chú thích (geom_text) hiển thị giá trị trung bình (m) được làm tròn đến 2 chữ số thập phân.
Biểu đồ này thể hiện mối quan hệ giữa chất lượng cắt (cut) và trung
bình carat (Mean) của kim cương trong tập dữ liệu diamonds. Trục x hiển
thị các mức chất lượng cắt khác nhau, trục y hiển thị giá trị trung bình
carat cho mỗi mức chất lượng cắt.
Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
Nhìn chung, trung bình carat có xu hướng giảm khi chất lượng cắt
cao hơn.
Những viên kim cương có chất lượng Fair có khối lượng trung bình
cao nhất 1.05 carat và những viên kim cương có chất lượng là Ideal có
khối lượng trung bình nhỏ nhất là 0.7 carat, Good 0.85 carat, Very Good
0.81 carat và Premium 0.89 carat.
Từ đồ thị này cho thấy rằng chất lượng cắt có ảnh hưởng đáng kể đến
trung bình carat của kim cương. Kim cương có chất lượng cắt càng cao thì
sẽ có xu hướng trung bình carat càng nhỏ hơn. Ngoài ra thì biến động của
trung bình carat có thể do nhiều yếu tố khác nhau, chẳng hạn như nguồn
gốc kim cương, phương pháp cắt và kỹ thuật đánh giá.
. Phân tích ảnh hưởng
của màu sắc đến trung bình carat
Việc phân tích này giúp ta:
Đánh giá chất lượng của kim cương: Màu sắc là một trong những yếu
tố quan trọng quyết định chất lượng của kim cương. Việc phân tích ảnh
hưởng của màu sắc đến trung bình carat có thể giúp đánh giá chất lượng
của kim cương một cách chính xác hơn.
Xác định giá trị của kim cương: Màu sắc ảnh hưởng đến giá trị của
kim cương. Việc phân tích ảnh hưởng của màu sắc đến trung bình carat có
thể giúp xác định giá trị của kim cương một cách chính xác hơn.
Cải thiện quy trình cắt kim cương: Việc phân tích ảnh hưởng của
màu sắc đến trung bình carat có thể giúp cải thiện quy trình cắt kim
cương để tối đa hóa giá trị của kim cương.
tmp <- diamonds
tmp %>% group_by(color) %>% summarise(m= mean(carat)) %>% ggplot(aes(x = color,y = m)) + geom_col(position = 'dodge') + geom_text(aes(label = round(m,2)), vjust = 2, color = 'white') + labs(x = 'Màu sắc', y = 'Trung bình') + labs(title = "Mối quan hệ giữa màu sắc và trung bình carat của kim cương")

#tmp %>% group_by(color) %>% summarise(m = mean(carat)):
##Nhóm dữ liệu theo màu sắc (color).
##Tính toán giá trị trung bình carat (m) cho mỗi nhóm màu.
#ggplot(aes(x = color, y = m)):Khởi tạo biểu đồ ggplot2 với trục hoành (x) thể hiện màu sắc và trục tung (y) thể hiện giá trị trung bình carat (m).
#geom_col(position = 'dodge'): Thêm các cột vào biểu đồ, sử dụng vị trí dodge để tránh chồng chéo các cột khi có nhiều nhóm màu.
#geom_text(aes(label = round(m, 2)), vjust = 2, color = 'white'): Thêm nhãn văn bản vào các cột, hiển thị giá trị trung bình carat được làm tròn đến 2 chữ số thập phân (round(m, 2)), dịch chuyển lên một chút (vjust = 2) và đặt màu trắng (color = 'white').
#labs(x = 'Màu sắc', y = 'Trung bình'): Thêm nhãn cho trục hoành (x) là "Màu sắc" và trục tung (y) là "Trung bình".
#labs(caption = "Mối quan hệ giữa màu sắc và trung bình carat của kim cương"): Thêm chú thích cho đồ thị là "Mối quan hệ giữa màu sắc và trung bình carat của kim cương".
Biểu đồ này thể hiện mối quan hệ giữa màu sắc (color) và trung bình
carat (Mean) của kim cương trong tập dữ liệu diamonds. Trục x hiển thị
các màu sắc khác nhau, trục y hiển thị giá trị trung bình carat cho mỗi
màu sắc.
Dựa trên đồ thị, ta có thể nhận xét một số điểm sau:
nhìn chung, giá trị trung bình carat dao động trong các nhóm màu
sắc khác nhau.
Khối lượng trung bình của kim cương tăng dần theo nhóm màu sắc từ
D đến J, tăng từ 0.66 carat đến 1.16 carat.
Sự khác biệt về giá trị trung bình carat giữa các nhóm không quá
lớn. Những viên kim cương thuộc nhóm màu D có khối lượng trung bình thấp
nhất (0.66 carat), những viên thuộc nhóm màu J có khối lượng trung bình
cao nhất (1.16 carat)
. Phân tích mối quan
hệ giữa độ tinh khiết của kim cương và giá trị trung bình của khối
lượng.
Việc phân tích này có thể mang lại nhiều lợi ích cho các bên liên
quan trong ngành kim cương, bao gồm:
Đánh giá giá trị kim cương: Giúp người mua và người bán kim cương
hiểu rõ hơn về ảnh hưởng của độ tinh khiết đến giá trị của viên kim
cương. Dựa vào thông tin này, người mua có thể đưa ra quyết định sáng
suốt hơn khi lựa chọn kim cương phù hợp với nhu cầu và ngân sách của họ.
Người bán có thể định giá kim cương chính xác hơn, đảm bảo lợi nhuận và
sự hài lòng của khách hàng. Hỗ trợ phân loại kim cương: Giúp thiết lập
tiêu chuẩn phân loại kim cương dựa trên độ tinh khiết và giá trị trung
bình của khối lượng. Điều này giúp đơn giản hóa quá trình phân loại, đảm
bảo tính nhất quán và minh bạch trong ngành kim cương.
Nghiên cứu thị trường: Phân tích mối quan hệ này cung cấp thông
tin quan trọng về xu hướng thị trường kim cương. Các nhà nghiên cứu, nhà
đầu tư và doanh nghiệp có thể sử dụng thông tin này để đưa ra chiến lược
kinh doanh hiệu quả.
Ngoài ra, việc phân tích mối quan hệ này còn có thể giúp: So sánh giá
trị của các loại kim cương khác nhau, xác định giá trị của kim cương cũ
hoặc đã qua sử dụng, dự đoán giá trị của kim cương trong tương lai.
tmp <- diamonds
tmp %>% group_by(clarity) %>% summarise(m= mean(carat)) %>% ggplot(aes(x = clarity,y = m)) + geom_col(position = 'dodge') + geom_text(aes(label = round(m,2)), vjust = 2, color = 'green') + labs(x = 'Độ tinh khiết', y = 'Mean') + labs(title = "Mối quan hệ giữa độ tinh khiết của kim cương và giá trị trung bình của khối lượng")

#tmp %>%: Biểu diễn toán tử ống (%>) để thực hiện chuỗi các tác vụ trên dữ liệu tmp.
#group_by(clarity): Nhóm dữ liệu theo thuộc tính clarity (độ tinh khiết) của kim cương.
#summarise(m = mean(carat)): Tính toán giá trị trung bình của thuộc tính carat (khối lượng) cho mỗi nhóm clarity và lưu trữ kết quả trong biến mới m.
#ggplot(aes(x = clarity, y = m)): Khởi tạo biểu đồ bằng ggplot2, ánh xạ trục hoành x với clarity và trục tung y với giá trị trung bình m.
#geom_col(position = 'dodge'): Thêm các cột hình chữ nhật vào biểu đồ, sử dụng vị trí dodge để tránh chồng chéo các cột khi có nhiều nhóm clarity.
#geom_text(aes(label = round(m, 2)), vjust = 2, color = 'green'): Thêm nhãn văn bản vào các cột, hiển thị giá trị trung bình được làm tròn đến 2 chữ số thập phân (round(m, 2)), dịch chuyển lên một chút (vjust = 2) và đặt màu xanh (color = 'green').
#labs(x = 'Màu', y = 'Mean'): Thêm nhãn cho trục hoành (x) là "Màu" và trục tung (y) là "Mean" (giá trị trung bình).
Dựa vào đồ thị trên, ta có thể nhận xét một số điểm sau:
Giá trị trung bình khối lượng kim cương có xu hướng giảm khi độ
tinh khiết tăng từ I1 đến IF (từ 1.28 carat xuống 0.51 carat).
Nhóm kim cương có độ tinh khiết I1 có giá trị trung bình khối
lượng cao nhất (1.28 carat). Nhóm kim cương có độ tinh khiết IF có giá
trị trung bình khối lượng thấp nhất (0.51 carat). Điều này cho thấy sự
khác biệt về giá trị trung bình khối lượng giữa các nhóm khá
lớn.
Tóm lại, biểu đồ cột cho thấy mối quan hệ tiêu cực giữa độ tinh khiết
và giá trị trung bình khối lượng kim cương. Khi độ tinh khiết của kim
cương càng tăng, giá trị trung bình khối lượng carat của kim cương càng
giảm. Mức độ tương quan khá mạnh.
. Phân tích mối quan
hệ giữa màu sắc và giá trị trung bình giá bán của kim cương
Việc phân tích này có thể mang lại nhiều lợi ích cho các bên liên
quan như:
Hiểu rõ hơn về thị trường kim cương: Phân tích mối quan hệ này
giúp xác định mức độ ảnh hưởng của màu sắc đến giá trị của kim cương. Từ
đó, có thể dự đoán giá trị của kim cương dựa trên màu sắc của
nó.
Hỗ trợ việc mua bán kim cương: Người mua có thể lựa chọn kim
cương phù hợp với nhu cầu và ngân sách dựa trên thông tin về mối quan hệ
giữa màu sắc và giá trị. Người bán có thể định giá kim cương chính xác
hơn bằng cách cân nhắc yếu tố màu sắc.
Tăng cường sự minh bạch trong thị trường kim cương: Việc phân
tích mối quan hệ này giúp nâng cao nhận thức của người tiêu dùng về giá
trị của kim cương. Từ đó, giảm thiểu nguy cơ bị lừa đảo khi mua bán kim
cương.
Đề xuất chiến lược kinh doanh: Các nhà kinh doanh kim cương có
thể sử dụng thông tin về mối quan hệ này để lập kế hoạch kinh doanh hiệu
quả hơn. Ví dụ, họ có thể tập trung vào phân khúc thị trường ưa chuộng
kim cương có màu sắc nhất định.
Ngoài ra, việc phân tích mối quan hệ giữa màu sắc và giá trị trung
bình giá bán của kim cương còn có thể giúp các nhà nghiên cứu hiểu rõ
hơn về các yếu tố ảnh hưởng đến giá trị của kim cương và cung cấp dữ
liệu hữu ích cho việc phát triển các mô hình dự đoán giá kim cương.
tmp <- diamonds
tmp %>% group_by(color) %>% summarise(m= mean(price)) %>% ggplot(aes(x = color,y = m)) + geom_col(position = 'dodge') + geom_text(aes(label = round(m,1)), vjust = 2, color = 'white') + labs(x = 'Màu sắc', y = 'Trung bình') + labs( title = "Mối quan hệ giữa màu sắc và giá trị trung bình giá bán của kim cương")

#Giải thích:
#tmp %>% group_by(color) %>% summarise(m = mean(price)):
##Nhóm dữ liệu theo màu sắc (color).
##Tính toán giá trị trung bình giá bán (m) cho mỗi nhóm màu.
#ggplot(aes(x = color, y = m)): Khởi tạo biểu đồ ggplot2 với trục hoành (x) thể hiện màu sắc và trục tung (y) thể hiện giá trị trung bình giá bán (m).
#geom_col(position = 'dodge'): Thêm các cột vào biểu đồ, sử dụng vị trí dodge để tránh chồng chéo các cột khi có nhiều nhóm màu.
#geom_text(aes(label = round(m, 2)), vjust = 2, color = 'green'): Thêm nhãn văn bản vào các cột, hiển thị giá trị trung bình giá bán được làm tròn đến 2 chữ số thập phân (round(m, 2)), dịch chuyển lên một chút (vjust = 2) và đặt màu xanh lá (color = 'green').
#labs(x = 'Màu sắc', y = 'Trung bình'): Thêm nhãn cho trục hoành (x) là "Màu sắc" và trục tung (y) là "Trung bình".
Biểu đồ này có thể được sử dụng để so sánh giá trị trung bình giá bán
giữa các nhóm màu sắc khác nhau và để xác định xem có mối liên hệ nào
giữa hai biến này hay không.
Nhận xét biểu đồ:
Nhìn chung, không có xu hướng rõ ràng giữa màu sắc và giá trị
trung bình giá bán. Giá bán dao động trong các nhóm màu sắc khác
nhau.
Xu hướng giá bán theo nhóm màu của kim cương tăng (từ màu ‘E’ đến
‘J’).
Những viên kim cương màu ‘D’ có mức giá bán trung bình là 3.170
USD, ‘E’ có giá bán trung bình là 3.076.8 USD, ‘F’ có giá bán trung bình
là 3.724,9 USD, ‘G’ có giá bán trung bình là 3.999,1 USD, ‘H’ có giá bán
trung bình là 4.486,7 USD, ‘I’ có giá bán trung bình là 5.091,9 USD và
‘J’ có giá bán trung bình là 5.323,8 USD.
Giá bán trung bình của kim cương màu ‘J’ là cao nhất (5.323,8
USD), gấp 1,73 lần giá của ‘E’, giá bán trung bình của ‘E’ là thấp nhất
(3.076,8 USD)
. Phân tích mối quan
hệ giữa chất lượng, màu sắc và giá bán trung bình của kim cương
Việc phân tích này mang lại nhiều lợi ích cho nhiều đối tượng:
Người mua:Hiểu rõ hơn về các yếu tố ảnh hưởng đến giá trị của kim
cương. So sánh giá bán của các loại kim cương khác nhau để lựa chọn phù
hợp với nhu cầu và ngân sách. Tránh mua phải kim cương giá cao nhưng
chất lượng thấp.
Người bán: Định giá kim cương chính xác hơn, dựa trên các yếu tố
khách quan. Tăng khả năng cạnh tranh trên thị trường. Tạo dựng uy tín
với khách hàng.
Nhà nghiên cứu: Thu thập dữ liệu về thị trường kim cương. Xác
định các xu hướng trong giá bán của kim cương. Phát triển các mô hình dự
đoán giá bán của kim cương.
Nhà kinh doanh: Lập kế hoạch kinh doanh hiệu quả hơn, dựa trên dữ
liệu về thị trường. Xác định phân khúc thị trường mục tiêu. Phát triển
các chiến lược marketing phù hợp.
Ngoài ra, việc phân tích mối quan hệ giữa chất lượng, màu sắc và giá
bán trung bình của kim cương còn có thể: Giúp nâng cao nhận thức của
người tiêu dùng về giá trị của kim cương. Tăng cường sự minh bạch trong
thị trường kim cương. Giảm thiểu nguy cơ bị lừa đảo khi mua bán kim
cương.
tmp <- diamonds
tmp %>% group_by(cut,color) %>% summarise(m = mean(price)) %>% ggplot(aes(x = cut,y = m)) + geom_col(position = 'dodge') + facet_wrap(~color) + geom_text(aes(label = round(m), vjust = 2, color = 'green')) + labs(x = 'Chất lượng', y = 'Giá bán') + labs(title = "Mối quan hệ giữa chất lượng, màu sắc và giá bán trung bình của kim cương")
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

#Giải thích:
#tmp %>% group_by(cut, color) %>% summarise(m = mean(price)):
##Nhóm dữ liệu theo chất lượng (cut) và màu sắc (color).
##Tính toán giá trị trung bình giá bán (m) cho mỗi nhóm chất lượng và màu sắc.
#ggplot(aes(x = cut, y = m)): Khởi tạo biểu đồ ggplot2 với trục hoành (x) thể hiện chất lượng và trục tung (y) thể hiện giá trị trung bình giá bán (m).
#geom_col(position = 'dodge'): Thêm các cột vào biểu đồ, sử dụng vị trí dodge để tránh chồng chéo các cột khi có nhiều nhóm chất lượng.
#facet_wrap(~color): Chia biểu đồ thành các nhóm con theo màu sắc (color).
#geom_text(aes(label = round(m))): Thêm nhãn văn bản vào các cột, hiển thị giá trị trung bình giá bán được làm tròn (round(m)).
#labs(x = 'Chất lượng', y = 'Số lượng'): Thêm nhãn cho trục hoành (x) là "Chất lượng" và trục tung (y) là "Số lượng".
Biểu đồ này có thể được sử dụng để:
So sánh giá bán trung bình của kim cương cùng chất lượng nhưng
khác màu sắc.
So sánh giá bán trung bình của kim cương cùng màu sắc nhưng khác
chất lượng.
Xác định màu sắc nào có giá bán trung bình cao nhất cho mỗi nhóm
chất lượng.
Xác định chất lượng nào có giá bán trung bình cao nhất cho mỗi
nhóm màu sắc.
Dự đoán giá bán trung bình của kim cương dựa trên chất lượng và
màu sắc.
Một số nhận xét từ đồ thị như sau:
Mối quan hệ giữa màu sắc và giá bán: Không có xu hướng rõ ràng
giữa màu sắc và giá bán trung bình. Giá bán trung bình dao động trong
các nhóm màu sắc khác nhau. Sự khác biệt về giá bán trung bình giữa các
nhóm không quá lớn.
Mối quan hệ tương tác giữa chất lượng và màu sắc: Mức độ ảnh
hưởng của màu sắc đến giá bán phụ thuộc vào chất lượng kim cương. Đối
với kim cương chất lượng cao, sự khác biệt về giá bán giữa các nhóm màu
nhỏ hơn. Đối với kim cương chất lượng thấp, sự khác biệt về giá bán giữa
các nhóm màu lớn hơn.
. Phân tích giá bán
trung bình của kim cương theo màu D
Đánh giá giá trị kim cương: Biết được giá bán trung bình của kim
cương theo màu D giúp người mua ước tính giá trị viên kim cương họ muốn
mua.
So sánh giá bán trung bình của các viên kim cương có cùng màu D
nhưng khác về chất lượng cắt, độ tinh khiết, kích thước để đưa ra lựa
chọn phù hợp nhất.
Phân biệt kim cương thật và kim cương giả bằng cách so sánh giá
bán thực tế với giá bán trung bình.
Phân tích giá bán trung bình theo thời gian để dự đoán xu hướng
giá cả trong tương lai. Nghiên cứu các yếu tố khác ảnh hưởng đến giá bán
trung bình như chất lượng cắt, độ tinh khiết, kích thước, v.v.
tmp <- diamonds
tmp <- tmp %>% group_by(cut, color) %>% summarise(n = mean(price))
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
tmp %>% ggplot(aes(x = cut, y = n)) + geom_col(data = tmp %>% filter(color == 'D'), fill = 'darkgreen')+labs(x="Chất lượng",y="Giá bán") + labs( title = " Đồ thị giá bán trung bình của kim cương theo màu D")

Biểu đồ hiển thị giá bán trung bình của kim cương theo chất lượng cắt
cho nhóm kim cương có màu D. Dữ liệu được nhóm theo 5 mức độ chất lượng
cắt: Ideal, Premium, Very Good, Good, Fair. Giá bán trung bình cho mỗi
mức độ cắt được biểu thị bằng cột màu xanh lá đậm.
Mức độ chênh lệch giá bán trung bình giữa các nhóm kim cương có chất
lượng cắt khác nhau không đáng kể. So sánh giá bán trung bình của kim
cương D với các màu khác để đánh giá mức độ ảnh hưởng của màu sắc đến
giá trị kim cương.
. So sánh số lượng kim
cương giữa hai màu D và J trong các nhóm chất lượng khác nhau
Việc so sánh này có thể mang lại nhiều lợi ích cho nhiều đối
tượng:
Người mua: Hiểu rõ hơn về sự phổ biến của các màu sắc kim cương
khác nhau. So sánh giá bán của kim cương D và J trong cùng nhóm chất
lượng. Lựa chọn kim cương phù hợp với nhu cầu và ngân sách.
Người bán: Định giá kim cương D và J chính xác hơn, dựa trên dữ
liệu thị trường. Tăng khả năng cạnh tranh trên thị trường. Tạo dựng uy
tín với khách hàng.
Nhà nghiên cứu: Thu thập dữ liệu về thị trường kim cương. Xác
định xu hướng về số lượng và giá bán của kim cương D và J. Phát triển
các mô hình dự đoán số lượng và giá bán của kim cương D và J.
Nhà kinh doanh: Lập kế hoạch kinh doanh hiệu quả hơn, dựa trên dữ
liệu về thị trường. Xác định phân khúc thị trường mục tiêu. Phát triển
các chiến lược marketing phù hợp.
tmp <- diamonds
tmp <- tmp %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
tmp %>% ggplot(aes(x = cut, y = n)) + geom_col(data = tmp %>% filter(color == 'D'), fill = 'red') + geom_col(data = tmp %>% filter(color == 'J'), fill = 'blue') + labs(x = "CHất lượng", y = " Số lượng") + labs( title = "Đồ thị số lượng kim cương giữa hai màu D và J trong các nhóm chất lượng khác nhau")

#Giải thích:
#tmp <- tmp %>% group_by(cut, color) %>% summarise(n = n()):
##Nhóm dữ liệu theo chất lượng (cut) và màu sắc (color).
##Tính toán số lượng (n) kim cương trong mỗi nhóm chất lượng và màu sắc.
#tmp %>% ggplot(aes(x = cut, y = n)): Khởi tạo biểu đồ ggplot2 với trục hoành (x) thể hiện chất lượng và trục tung (y) thể hiện số lượng (n).
#geom_col(data = tmp %>% filter(color == 'D'), fill = 'red'): Thêm cột màu đỏ vào biểu đồ cho các nhóm chất lượng với màu D.
#geom_col(data = tmp %>% filter(color == 'J'), fill = 'blue'): Thêm cột màu xanh vào biểu đồ cho các nhóm chất lượng với màu J.
#labs(x = "Chất lượng", y = "Số lượng"):Thêm nhãn cho trục hoành (x) là "Chất lượng" và trục tung (y) là "Số lượng".
Biểu đồ thể hiện số lượng viên kim cương theo từng mức độ chất lượng
(cut) cho hai màu D và J.
Nhận xét về dữ liệu trong biểu đồ:
Nhìn chung, số lượng viên kim cương ‘D’ cao hơn ‘J’ cho tất cả
các mức chất lượng cắt.
Cả hai màu đều có xu hướng giảm số lượng viên kim cương khi chất
lượng cắt giảm.
Phân bố số lượng viên kim cương theo màu sắc: Màu ‘D’ có xu hướng
phân bố đều hơn giữa các mức chất lượng cắt.
. So sánh số lượng
viên kim cương theo từng mức chất lượng cắt cho hai màu sắc ‘G’ và
‘F’
Nghiên cứu thị trường:
Phân tích xu hướng thị trường trong việc lựa chọn chất lượng cắt
và màu sắc cho kim cương.
So sánh mức độ phổ biến của các mức chất lượng cắt và màu sắc
khác nhau.
Xác định các phân khúc thị trường tiềm năng cho các loại kim
cương khác nhau.
Đánh giá giá trị:
So sánh giá trị của viên kim cương dựa trên chất lượng cắt và màu
sắc.
Xác định mức độ ảnh hưởng của chất lượng cắt và màu sắc đến giá
trị của viên kim cương.
Giúp người mua đưa ra quyết định sáng suốt khi lựa chọn kim
cương.
tmp <- diamonds
tmp <- tmp %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
#group_by(cut, color): Nhóm dữ liệu theo hai biến cut và color.
#summarise(n = n()): Tính số lượng viên kim cương trong mỗi nhóm (sử dụng hàm n()).
tmp %>% ggplot(aes(x = cut, y = n)) + geom_col(data = tmp %>% filter(color == 'G'), fill = 'black') + geom_col(data = tmp %>% filter(color == 'F'), fill = 'gray') + labs( x="Chất lượng",y="Số lượng")+ labs( title = "Đồ thị số lượng viên kim cương theo chất lượng của 2 nàu G và F")

#ggplot(aes(x = cut, y = n)): Tạo khung vẽ cho biểu đồ với trục x là cut và trục y là n.
#geom_col(data = tmp %>% filter(color == 'G'), fill = 'black'): Thêm cột màu đen cho các nhóm có color là 'G'.
#geom_col(data = tmp %>% filter(color == 'F'), fill = 'gray'): Thêm cột màu xám cho các nhóm có color là 'F'.
#labs(x="Chất lượng",y="Số lượng"): Ghi chú nhãn cho trục x là "Chất lượng" và trục y là "Số lượng".
Nhận xét về dữ liệu trong biểu đồ:
Nhìn chung, số lượng viên kim cương ‘F’ cao hơn ‘G’ trong tất cả
các mức chất lượng cắt.
Cả hai màu đều có xu hướng giảm số lượng viên kim cương khi chất
lượng cắt giảm.
Dữ liệu trong biểu đồ cho thấy chất lượng cắt ảnh hưởng đến số lượng
viên kim cương. Màu sắc cũng ảnh hưởng đến số lượng viên kim cương,
nhưng mức độ ảnh hưởng thấp hơn so với chất lượng cắt.
. So sánh Số lượng
viên kim cương theo chất lượng cắt và màu sắc (H và I)
Việc phân tích này có thể được sử dụng cho nhiều mục đích khác nhau,
bao gồm:
Nghiên cứu thị trường: Phân tích xu hướng thị trường trong việc
lựa chọn chất lượng cắt và màu sắc cho kim cương. So sánh mức độ phổ
biến của các mức chất lượng cắt và màu sắc khác nhau. Xác định các phân
khúc thị trường tiềm năng cho các loại kim cương khác nhau.
Đánh giá giá trị: So sánh giá trị của viên kim cương dựa trên
chất lượng cắt và màu sắc. Xác định mức độ ảnh hưởng của chất lượng cắt
và màu sắc đến giá trị của viên kim cương. Giúp người mua đưa ra quyết
định sáng suốt khi lựa chọn kim cương.
Lập kế hoạch sản xuất:Xác định nhu cầu thị trường cho các loại
kim cương khác nhau dựa trên chất lượng cắt và màu sắc. Lập kế hoạch sản
xuất phù hợp để đáp ứng nhu cầu thị trường. Tối ưu hóa việc sử dụng
nguyên liệu và nguồn lực.
Marketing và bán hàng: Phát triển chiến lược marketing phù hợp
cho các loại kim cương khác nhau dựa trên chất lượng cắt và màu sắc.
Tiếp cận khách hàng tiềm năng với thông tin phù hợp về các loại kim
cương. Tăng hiệu quả bán hàng và doanh thu.
tmp <- diamonds
tmp <- tmp %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
#group_by(cut, color): Nhóm dữ liệu theo hai biến cut và color.
#summarise(n = n()): Tính số lượng viên kim cương trong mỗi nhóm (sử dụng hàm n()).
tmp %>% ggplot(aes(x = cut, y = n)) + geom_col(data = tmp %>% filter(color == 'H'), fill = 'gray') + geom_col(data = tmp %>% filter(color == 'I'), fill = 'blue')+labs(x="Chất lượng",y="Số lượng")+ labs( title = "Đồ thị Số lượng viên kim cương theo chất lượng cắt và màu sắc (H và I)")

#ggplot(aes(x = cut, y = n)): Tạo khung vẽ cho biểu đồ với trục x là cut và trục y là n.
#geom_col(data = tmp %>% filter(color == 'H'), fill = 'gray'): Thêm cột màu xám cho các nhóm có color là 'H'.
#geom_col(data = tmp %>% filter(color == 'I'), fill = 'blue'): Thêm cột màu xanh lam cho các nhóm có color là 'I'.
#labs(x="Chất lượng",y="Số lượng"): Ghi chú nhãn cho trục x là "Chất lượng" và trục y là "Số lượng".
Biểu đồ thu được thể hiện số lượng viên kim cương theo từng mức chất
lượng cắt (cut) cho hai màu sắc ‘H’ và ‘I’. Biểu đồ có hai cột, màu xám
cho ‘H’ và màu xanh cho ‘I’. Chiều cao của mỗi cột biểu thị số lượng
viên kim cương tương ứng.
Nhận xét về dữ liệu trong biểu đồ:
Nhìn chung, số lượng viên kim cương ‘I’ cao hơn ‘H’ cho tất cả
các mức chất lượng cắt. Cả hai màu đều có xu hướng giảm số lượng viên
kim cương khi chất lượng cắt giảm.
Phân bố số lượng viên kim cương theo màu sắc: Màu ‘H’ có xu hướng
phân bố đều hơn giữa các mức chất lượng cắt. Màu ‘I’ có xu hướng tập
trung nhiều hơn ở các mức chất lượng cắt ‘Good’ và ‘Fair’.
Dữ liệu trong biểu đồ cho thấy chất lượng cắt ảnh hưởng đến số lượng
viên kim cương. Màu sắc cũng ảnh hưởng đến số lượng viên kim cương,
nhưng mức độ ảnh hưởng thấp hơn so với chất lượng cắt.
. So sánh số lượng
viên kim cương theo từng mức chất lượng cắt (cut) cho hai màu sắc ‘E’ và
‘D’
Việc phân tích số lượng viên kim cương theo từng mức chất lượng cắt
(cut) cho hai màu sắc ‘E’ và ‘D’ có thể được sử dụng cho nhiều mục đích
khác nhau, bao gồm:
Nghiên cứu thị trường: Phân tích xu hướng thị trường trong việc
lựa chọn chất lượng cắt và màu sắc cho kim cương. So sánh mức độ phổ
biến của các mức chất lượng cắt và màu sắc khác nhau. Xác định các phân
khúc thị trường tiềm năng cho các loại kim cương khác nhau.
Đánh giá giá trị: So sánh giá trị của viên kim cương dựa trên
chất lượng cắt và màu sắc. Xác định mức độ ảnh hưởng của chất lượng cắt
và màu sắc đến giá trị của viên kim cương. Giúp người mua đưa ra quyết
định sáng suốt khi lựa chọn kim cương.
tmp <- diamonds
tmp <- tmp %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
tmp %>% ggplot(aes(x = cut, y = n)) + geom_col(data = tmp %>% filter(color == 'E'), fill = 'black') + geom_col(data = tmp %>% filter(color == 'D'), fill = 'red')+ labs(x="Chất lượng",y="Số lượng")+labs( title = "Đồ thị số lượng viên kim cương theo từng mức chất lượng cắt (cut) cho hai màu sắc 'E' và 'D'")

#ggplot(aes(x = cut, y = n)): Tạo khung vẽ cho biểu đồ với trục x là cut và trục y là n.
#geom_col(data = tmp %>% filter(color == 'E'), fill = 'black'): Thêm cột màu đen cho các nhóm có color (màu sắc) là 'E'.
#geom_col(data = tmp %>% filter(color == 'D'), fill = 'red'): Thêm cột màu đỏ cho các nhóm có color là 'D'.
#labs(x = "Chất lượng", y = "Số lượng"): Ghi chú nhãn cho trục x là "Chất lượng" và trục y là "Số lượng"
Biểu đồ thu được thể hiện số lượng viên kim cương theo từng mức chất
lượng cắt (cut) cho hai màu sắc ‘E’ và ‘D’. Biểu đồ có hai cột, màu đen
cho ‘E’ và màu đỏ cho ‘D’. Chiều cao của mỗi cột biểu thị số lượng viên
kim cương tương ứng.
Nhận xét về dữ liệu trong biểu đồ:
Nhìn chung, số lượng viên kim cương ‘D’ cao hơn ‘E’ cho tất cả
các mức chất lượng cắt.
Cả hai màu đều có xu hướng giảm số lượng viên kim cương khi chất
lượng cắt giảm từ Ideal đến Fair.
. Phân tích số lượng
viên kim cương theo từng mức độ tinh khiết (clarity) cho ba màu sắc ‘D’,
‘I’ và ‘J’
Việc phân tích số lượng viên kim cương theo độ tinh khiết giữa ba màu
sắc ‘D’, ‘I’ và ‘J’ có thể quan sát các đặc điểm như:
Xu hướng chung của số lượng viên kim cương theo độ tinh
khiết.
Sự khác biệt về số lượng viên kim cương giữa các màu sắc tại mỗi
mức độ tinh khiết.
Màu sắc nào có nhiều viên kim cương nhất ở các mức độ tinh khiết
khác nhau.
tmp <- diamonds
tmp <- tmp %>% group_by(clarity, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
#group_by(clarity, color): Nhóm dữ liệu theo hai biến clarity (độ tinh khiết) và color (màu sắc).
#summarise(n = n()): Tính số lượng viên kim cương (n) trong mỗi nhóm.
tmp %>% ggplot(aes(x = clarity, y = n)) + geom_col(data = tmp %>% filter(color == 'D'), fill = 'red') + geom_col(data = tmp %>% filter(color == 'I'),fill = 'blue') + geom_col(data = tmp %>% filter(color == 'J'), fill = 'darkgreen') + labs(x = "Độ tinh khiết", y = "Số lượng") + labs( title = "Đồ thị số lượng viên kim cương theo từng mức độ tinh khiết (clarity) cho ba màu sắc 'D', 'I' và 'J'")

#ggplot(aes(x = clarity, y = n)): Tạo khung vẽ cho biểu đồ với trục x là clarity và trục y là n.
#geom_col(data = tmp %>% filter(color == 'D'), fill = 'red'): Thêm cột màu đỏ cho các nhóm có color (màu sắc) là 'D'.
#geom_col(data = tmp %>% filter(color == 'I'), fill = 'blue'): Thêm cột màu xanh lam cho các nhóm có color là 'I'.
#geom_col(data = tmp %>% filter(color == 'J'), fill = 'darkgreen'): Thêm cột màu xanh lá đậm cho các nhóm có color là 'J'.
#(x = "Độ tinh khiết", y = "Số lượng"): Ghi chú nhãn cho trục x là "Độ tinh khiết" và trục y là "Số lượng"
Biểu đồ thu được thể hiện số lượng viên kim cương theo từng mức độ
tinh khiết (clarity) cho ba màu sắc ‘D’, ‘I’ và ‘J’. Biểu đồ có ba cột,
với mỗi cột thể hiện số lượng viên kim cương cho một màu sắc tương ứng.
Chiều cao của mỗi cột tại mỗi mức độ tinh khiết biểu thị số lượng viên
kim cương có màu sắc đó ở mức độ tinh khiết đó.
Nhận xét về dữ liệu trong biểu đồ:
Nhìn chung, số lượng viên kim cương ‘J’ cao hơn ‘D’ và ‘I’ cho
hầu hết các mức độ tinh khiết.
Số lượng viên kim cương giảm dần theo độ tinh khiết từ “SI1” đến
“IF” cho cả ba màu sắc.
Phân bố số lượng viên kim cương theo màu sắc: Màu ‘I’ và ‘J’ có
xu hướng phân bố đều hơn giữa các mức độ tinh khiết, còn màu ‘D’ có xu
hướng tập trung nhiều hơn ở các mức độ tinh khiết “SI2” , “SI1” , “VS2”,
và “VVS2”.
. Phân tích số lượng
viên kim cương theo từng nhóm trọng lượng (caratC)
Việc phân tích này giúp so sánh số lượng viên kim cương theo trọng
lượng, có thể quan sát các đặc điểm như:
Nhóm trọng lượng nào có nhiều viên kim cương nhất.
Nhóm trọng lượng nào có ít viên kim cương nhất.
Xu hướng chung của số lượng viên kim cương theo trọng
lượng.
tmp <- diamonds
tmp <- tmp %>% mutate(caratC = cut(carat,5, label = c('rất nhỏ', 'nhỏ','vừa','lớn','rất lớn')))
#mutate(): Thêm một biến mới vào bảng dữ liệu. cut(): Chia dữ liệu thành các nhóm dựa trên các khoảng giá trị.
tmp %>% ggplot(aes(x = caratC)) + geom_bar(fill = 'darkgreen') + labs(x= "Loại", y = "Số lượng")+ labs(x="Loại",y="Số lượng")+ labs( title = "Đồ thị số lượng viên kim cương theo từng nhóm trọng lượng (caratC)")

#ggplot(aes(x = caratC)): Tạo khung vẽ cho biểu đồ với trục x là caratC.
#geom_bar(fill = 'darkgreen'): Thêm biểu đồ dạng thanh với màu xanh lá đậm.
#labs(x= "Loại", y = "Số lượng"): Ghi chú nhãn cho trục x là "Loại" và trục y là "Số lượng".
Biểu đồ thu được thể hiện số lượng viên kim cương theo từng nhóm
trọng lượng (caratC). Biểu đồ có 5 thanh, với mỗi thanh thể hiện số
lượng viên kim cương cho một nhóm trọng lượng tương ứng. Chiều cao của
mỗi thanh biểu thị số lượng viên kim cương thuộc nhóm trọng lượng
đó.
Nhận xét về dữ liệu trong biểu đồ:
Phân bố số lượng viên kim cương theo trọng lượng: Nhóm trọng
lượng “rất nhỏ” có số lượng viên kim cương cao nhất( trên 40.000 viên).
Nhóm trọng lượng “nhỏ”, khoảng gần 10.000 viên và “vừa” có số lượng viên
kim cương thấp nhất, dưới 1.000 viên, .
Số lượng viên kim cương giảm dần từ nhóm “rất nhỏ”, “nhỏ” và
“vừa”, còn viên kim cương có khối lượng “lớn” và “rất lớn” thì cực kỳ
ít.
Có nhiều viên kim cương loại “nhỏ” và “rất nhỏ”. Có ít viên kim
cương loại “vừa” và rất ít kim cương xếp loại “lớn” và “rất lớn”. Điều
này cho thấy đa số những viên kim cương có khối lượng “nhỏ” và “rất nhỏ”
thường xuất hiện phổ biến, còn những viên kim cương có khối lượng “lớn”
và “rất lớn” thì xuất hiện rất hiếm.
. Phân tích số lượng
viên kim cương theo từng mức chất lượng (cut) cho hai màu sắc “H” và
“I”
Việc phân tích số lượng viên kim cương theo chất lượng và màu sắc.
Bạn có thể quan sát các đặc điểm như:
Mức độ chất lượng nào có nhiều viên kim cương nhất.
Mức độ chất lượng nào có ít viên kim cương nhất.
Màu sắc nào có nhiều viên kim cương nhất cho từng mức độ chất
lượng.
Xu hướng chung của số lượng viên kim cương theo chất lượng và màu
sắc.
df_new <- diamonds %>% group_by(cut, color) %>% summarise(n = n()) %>% mutate(color = factor(color, levels = c("H", "I")))
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
df_new %>% ggplot(aes(x = cut, y = n, fill = color)) + geom_col(position = position_dodge()) + labs(title = "Đồ thị số lượng viên kim cương theo từng mức chất lượng (cut) cho hai màu sắc 'H' và 'I')") + labs(x = "Chất lượng", y = "Số lượng")

#Câu lệnh 1:
#group_by(): Nhóm dữ liệu theo hai biến cut (chất lượng) và color (màu sắc).
#summarise(n = n()): Tính số lượng viên kim cương (n) trong mỗi nhóm.
#mutate(color = factor(color, levels = c("H", "I"))): Chuyển đổi biến color thành kiểu dữ liệu factor với hai mức độ là "H" và "I".
#câu lệnh 2:
#ggplot(aes(x = cut, y = n, fill = color)): Tạo khung vẽ cho biểu đồ với trục x là cut, trục y là n, và màu sắc theo biến color.
#geom_col(position = position_dodge()): Thêm biểu đồ dạng thanh xếp cạnh nhau.
Biểu đồ thu được thể hiện số lượng viên kim cương theo từng mức chất
lượng (cut) cho hai màu sắc “H” và “I”. Biểu đồ có hai thanh cho mỗi mức
chất lượng, với mỗi thanh thể hiện số lượng viên kim cương cho một màu
sắc tương ứng. Chiều cao của mỗi thanh biểu thị số lượng viên kim cương
thuộc nhóm chất lượng và màu sắc đó.
Nhận xét về dữ liệu trong biểu đồ:
Nhìn chung, số lượng viên kim cương tăng dần khi chất lượng tăng
(từ Fair đến Ideal). Xu hướng giảm này xảy ra cho cả hai màu sắc “H” và
“I”.
Mức độ giảm số lượng viên kim cương giữa các mức độ chất lượng có
thể khác nhau giữa các màu sắc.
Phân bố số lượng viên kim cương theo màu sắc: Màu “H” có số lượng
viên kim cương cao hơn so với màu “I” cho hầu hết các mức độ chất lượng.
Mức độ chênh lệch số lượng viên kim cương giữa hai màu sắc có thể khác
nhau giữa các mức độ chất lượng.
. Phân tích số lượng
viên kim cương theo từng mức độ tinh khiết (clarity) cho hai màu sắc “G”
và “J”
Việc phân tích này giúp so sánh số lượng viên kim cương theo độ tinh
khiết và màu sắc, ta có thể quan sát các đặc điểm như:
Mức độ tinh khiết nào có nhiều viên kim cương nhất.
Mức độ tinh khiết nào có ít viên kim cương nhất.
Màu sắc nào có nhiều viên kim cương nhất cho từng mức độ tinh
khiết.
Xu hướng chung của số lượng viên kim cương theo độ tinh khiết và
màu sắc.
df_new <- diamonds %>%
group_by(clarity, color) %>%
summarise(n = n()) %>%
mutate(color = factor(color, levels = c("G", "J")))
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
df_new %>%
ggplot(aes(x = clarity, y = n, fill = color)) +
geom_col(position = position_dodge()) +
labs(title = "Đồ thị số lượng viên kim cương theo từng mức độ tinh khiết (clarity) cho hai màu sắc 'G' và 'J'") + labs(x = "Độ tinh khiết", y = "Số lượng")

#Câu lệnh 1:
#diamonds: Tên của tập dữ liệu chứa thông tin về kim cương.
#group_by(clarity, color): Nhóm dữ liệu theo hai biến clarity (độ tinh khiết) và color (màu sắc).
#summarise(n = n()): Tính số lượng viên kim cương (n) trong mỗi nhóm.
#mutate(color = factor(color, levels = c("G", "J"))): Chuyển đổi biến color thành kiểu dữ liệu factor với hai mức độ là "G" và "J".
#Câu lệnh 2:
#ggplot(aes(x = clarity, y = n, fill = color)): Tạo khung vẽ cho biểu đồ với trục x là clarity, trục y là n, và màu sắc theo biến color.
#geom_col(position = position_dodge()): Thêm biểu đồ dạng thanh xếp cạnh nhau.
Biểu đồ thể hiện số lượng viên kim cương theo từng mức độ tinh khiết
(clarity) cho hai màu sắc “G” và “J”. Biểu đồ có hai thanh cho mỗi mức
độ tinh khiết, với mỗi thanh thể hiện số lượng viên kim cương cho một
màu sắc tương ứng. Chiều cao của mỗi thanh biểu thị số lượng viên kim
cương thuộc nhóm độ tinh khiết và màu sắc đó.
Nhận xét về dữ liệu trong biểu đồ:
Nhìn chung, số lượng viên kim cương giảm dần khi độ tinh khiết
tăng (từ SI2 đến IF). Xu hướng giảm này xảy ra cho cả hai màu sắc “G” và
“J”.
Mức độ giảm số lượng viên kim cương giữa các mức độ tinh khiết có
thể khác nhau giữa các màu sắc.
Phân bố số lượng viên kim cương theo màu sắc: Màu “G” có số lượng
viên kim cương cao hơn so với màu “J” cho hầu hết các mức độ tinh
khiết.
Mức độ chênh lệch số lượng viên kim cương giữa hai màu sắc có thể
khác nhau giữa các mức độ tinh khiết.
. Phân tích số lượng
viên kim cương theo từng mức độ tinh khiết (clarity) cho bốn màu sắc
“D”, “G”, “I” và “J”
Việc phân tích này giúp so sánh số lượng viên kim cương theo độ tinh
khiết và màu sắc, có thể quan sát các đặc điểm như:
Mức độ tinh khiết nào có nhiều viên kim cương nhất.
Mức độ tinh khiết nào có ít viên kim cương nhất.
Màu sắc nào có nhiều viên kim cương nhất cho từng mức độ tinh
khiết.
Xu hướng chung của số lượng viên kim cương theo độ tinh khiết và
màu sắc.
df_new <- diamonds %>%
group_by(clarity, color) %>%
summarise(n = n()) %>%
mutate(color = factor(color, levels = c("D","G", "I","J")))
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
df_new %>%
ggplot(aes(x = clarity, y = n, fill = color)) +
geom_col(position = position_dodge()) + labs(x = "Độ tinh khiết", y = "Số lượng")+
labs(title = "Đồ thị số lượng viên kim cương theo từng mức độ tinh khiết (clarity) cho bốn màu sắc 'D','G','I' và 'J'")

#câu lệnh 1:
#group_by(clarity, color): Nhóm dữ liệu theo hai biến clarity (độ tinh khiết) và color (màu sắc).
#(n = n()): Tính số lượng viên kim cương (n) trong mỗi nhóm.
#mutate(color = factor(color, levels = c("D","G", "I","J"))): Chuyển đổi biến color thành kiểu dữ liệu factor với bốn mức độ là "D", "G", "I" và "J".
#Một bảng dữ liệu mới df_new được tạo với các cột: clarity: Độ tinh khiết, color: Màu sắc (bao gồm "D", "G", "I" và "J") ,n: Số lượng viên kim cương
#Câu lệnh 2:
#ggplot(aes(x = clarity, y = n, fill = color)): Tạo khung vẽ cho biểu đồ với trục x là clarity, trục y là n, và màu sắc theo biến color.
#geom_col(position = position_dodge()): Thêm biểu đồ dạng thanh xếp cạnh nhau.
Biểu đồ thể hiện số lượng viên kim cương theo từng mức độ tinh khiết
(clarity) cho bốn màu sắc “D”, “G”, “I” và “J”. Biểu đồ có bốn thanh cho
mỗi mức độ tinh khiết, với mỗi thanh thể hiện số lượng viên kim cương
cho một màu sắc tương ứng. Chiều cao của mỗi thanh biểu thị số lượng
viên kim cương thuộc nhóm độ tinh khiết và màu sắc đó.
Nhận xét về dữ liệu trong biểu đồ:
Nhìn chung, số lượng viên kim cương giảm dần khi độ tinh khiết
tăng (từ SI2 đến IF).
Xu hướng giảm này xảy ra cho cả bốn màu sắc “D”, “G”, “I” và “J”.
Mức độ giảm số lượng viên kim cương giữa các mức độ tinh khiết có thể
khác nhau giữa các màu sắc.
Phân bố số lượng viên kim cương theo màu sắc: Màu “G” có số lượng
viên kim cương cao nhất cho hầu hết các mức độ tinh khiết. Màu “J” có số
lượng viên kim cương thấp nhất cho hầu hết các mức độ tinh khiết ( dưới
500 viên).
Mức độ chênh lệch số lượng viên kim cương giữa các màu sắc có thể
khác nhau giữa các mức độ tinh khiết.
LS0tDQp0aXRsZTogIk5ISeG7hk0gVuG7pCA0Ig0KYXV0aG9yOiAiTmd1eeG7hW4gVGjhu4sgSG/DoG5nIFnhur9uIg0KZGF0ZTogImByIGZvcm1hdChTeXMudGltZSgpLCAnJUg6JU06JVMsICVkIC0gJW0gLSAlWScpYCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6IA0KICAgIHRvY19kZXB0aDogMg0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICB0b2M6IHRydWUNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICBudW1iZXJfc2VjdGlvbnM6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzY2FsZXMpDQpsaWJyYXJ5KGRwbHlyKQ0KYGBgDQoNCl9fXw0KDQoqKkdJ4buaSSBUSEnhu4ZVIELhu5ggROG7riBMSeG7hlUqKg0KDQoqKkRpYW1vbmQqKiBsw6AgbeG7mXQgYuG7mSBk4buvIGxp4buHdSB24buBIGtpbSBjxrDGoW5nIMSRxrDhu6NjIHTDrWNoIGjhu6NwIHPhurVuIHRyb25nIFIsIGfhu5NtIDUzLjk0MCBxdWFuIHPDoXQgdMawxqFuZyDhu6luZyB24bubaSA1My45NDAgaMOgbmcgdsOgIDEwIGJp4bq/biDhu6luZyB24bubaSAxMCBj4buZdCBk4buvIGxp4buHdSwgdsOgIGJhbyBn4buTbSB0aMO0bmcgdGluIHbhu4EgNTMuOTQwIHZpw6puIGtpbSBjxrDGoW5nLCB24bubaSBjw6FjIHRodeG7mWMgdMOtbmggc2F1Og0KDQotIGNhcmF0OiBUcuG7jW5nIGzGsOG7o25nIGNhcmF0IGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nDQoNCi0gY3V0OiBDaOG6pXQgbMaw4bujbmcgY+G7p2EgduG6v3QgY+G6r3QgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKElkZWFsLCBQcmVtaXVtLCBWZXJ5IEdvb2QsIEdvb2QsIEZhaXIpDQoNCi0gY29sb3I6IE3DoHUgc+G6r2MgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKEQsIEUsIEYsIEcsIEgsIEksIEopDQoNCi0gY2xhcml0eTogxJDhu5kgdGluaCBraGnhur90IGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIChJRiwgVlZTMSwgVlZTMiwgVlMxLCBWUzIsIFNJMSwgU0kyLCBJMSkNCg0KLSBkZXB0aDogVOG7tyBs4buHIGNoaeG7gXUgc8OidSBj4bunYSB2acOqbiBraW0gY8awxqFuZw0KDQotIHRhYmxlIChEaWFtb25kIFRhYmxlKTogYuG7gSBt4bq3dCBj4bunYSB2acOqbiBraW0gY8awxqFuZw0KDQotIHByaWNlOiBHacOhIGLDoW4gY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKFVTRCkNCg0KLSB4OiBjaGnhu4F1IGTDoGkgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcgKG1tKQ0KDQotIHk6IGNoaeG7gXUgcuG7mW5nIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIChtbSkNCg0KLSB6OiBjaGnhu4F1IGNhbyBj4bunYSB2acOqbiBraW0gY8awxqFuZyAobW0pDQoNCkLhu5kgZOG7ryBsaeG7h3Uga2ltIGPGsMahbmcgdGjGsOG7nW5nIMSRxrDhu6NjIHPhu60gZOG7pW5nIHRyb25nIGPDoWMgdsOtIGThu6UgduG7gSBSIE1hcmtkb3duIMSR4buDIG1pbmggaOG7jWEgY8OhY2ggcGjDom4gdMOtY2ggZOG7ryBsaeG7h3UgdsOgIHThuqFvIGLDoW8gY8Ohby4gVOG7qyBi4buZIGThu68gbGnhu4d1ICoqZGlhbW9uZCoqIG7DoHkgdGEgY8OzIHRo4buDIGtoYWkgdGjDoWMgdsOgIHBow6JuIHTDrWNoIMSRxrDhu6NjIHLhuqV0IG5oaeG7gXUgdGjDtG5nIHRpbiBj4bunYSBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nLiBWw6AgcGjDom4gdMOtY2ggZOG7sWEgdHLDqm4gdmnhu4djIGzhuq1wIG5o4buvbmcgxJHhu5MgdGjhu4sgbmjGsCBzYXU6DQoNCl9fXw0KX19fDQoNCiMgLiBQaMOibiB0w61jaCDEkeG7kyB0aOG7iyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIGNo4bqldCBsxrDhu6NuZyANCg0KVmnhu4djIHBow6JuIHTDrWNoIMSR4buTIHRo4buLIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgY2jhuqV0IGzGsOG7o25nIMSR4buDIMSRw6FuaCBnacOhIHRo4buLIHRyxrDhu51uZyBraW0gY8awxqFuZzoNCg0KLSBW4buBIG5odSBj4bqndTogUGjDom4gdMOtY2ggeHUgaMaw4bubbmcgbmh1IGPhuqd1IGNobyB04burbmcgbeG7qWMgxJHhu5kgcGjhu5UgYmnhur9uOiDEkOG7kyB0aOG7iyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyDhu58gbeG7l2kgbeG7qWMgY2jhuqV0IGzGsOG7o25nLCBnacO6cCDEkcOhbmggZ2nDoSBt4bupYyDEkeG7mSBwaOG7lSBiaeG6v24gY+G7p2EgdOG7q25nIGxv4bqhaS4NCg0KLSBDdW5nOiDEkOG7kyB0aOG7iyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyDEkcaw4bujYyBjdW5nIGPhuqVwIHJhIHRo4buLIHRyxrDhu51uZyDhu58gbeG7l2kgbeG7qWMgY2jhuqV0IGzGsOG7o25nLCBnacO6cCDEkcOhbmggZ2nDoSBt4bupYyDEkeG7mSBj4bqhbmggdHJhbmggdsOgIMSRxrBhIHJhIGNoaeG6v24gbMaw4bujYyBnacOhIGPhuqMgaOG7o3AgbMO9Lg0KDQotIFBow6JuIGtow7pjIHRo4buLIHRyxrDhu51uZzogWMOhYyDEkeG7i25oIGPDoWMgcGjDom4ga2jDumMgdGjhu4sgdHLGsOG7nW5nIHRp4buBbSBuxINuZyBk4buxYSB0csOqbiBuaHUgY+G6p3UgduG7gSBt4bupYyBjaOG6pXQgbMaw4bujbmcga2ltIGPGsMahbmcsIGdpw7pwIGRvYW5oIG5naGnhu4dwIHThuq1wIHRydW5nIG5ndeG7k24gbOG7sWMgdsOgIGNoaeG6v24gbMaw4bujYyBtYXJrZXRpbmcgaGnhu4d1IHF14bqjLg0KDQpOZ2/DoGkgcmEsIHZp4buHYyBwaMOibiB0w61jaCDEkeG7kyB0aOG7iyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIGNo4bqldCBsxrDhu6NuZyBjw7JuIGPDsyB0aOG7gyDhu6luZyBk4bulbmcgdHJvbmcgbmhp4buBdSBsxKluaCB24buxYyBraMOhYyBuaMawOiBxdeG6o24gbMO9IGtobyBow6BuZywgZOG7sSBiw6FvIGdpw6EgY+G6oywgxJHDoW5oIGdpw6EgcuG7p2kgcm8gxJHhuqd1IHTGsCwgdi52LiBWaeG7h2Mgc+G7rSBk4bulbmcgaGnhu4d1IHF14bqjIGPDtG5nIGPhu6UgcGjDom4gdMOtY2ggbsOgeSBz4bq9IGdpw7pwIGPDoWMgZG9hbmggbmdoaeG7h3AsIG5ow6AgxJHhuqd1IHTGsCB2w6AgbmfGsOG7nWkgdGnDqnUgZMO5bmcgxJHGsGEgcmEgcXV54bq/dCDEkeG7i25oIHPDoW5nIHN14buRdCB0cm9uZyB0aOG7iyB0csaw4budbmcga2ltIGPGsMahbmcgxJHhuqd5IHRp4buBbSBuxINuZyBuaMawbmcgY8Wpbmcga2jDtG5nIGvDqW0gcGjhuqduIGPhuqFuaCB0cmFuaC4NCg0KxJDDonkgbMOgIMSR4buTIHRo4buLIEJhciBjaGFydCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHRoZW8gdOG7q25nIG3hu6ljIGNo4bqldCBsxrDhu6NuZyAoSWRlYWwsIFByZW1pdW0sIFZlcnkgR29vZCwgR29vZCwgRmFpcikuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0KSkgKyBnZW9tX2JhcigpICsgbGFicyh4ID0gJ0No4bqldCBsxrDhu6NuZycsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsgbGFicyh0aXRsZSA9ICLEkOG7kyB0aOG7iyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIGNo4bqldCBsxrDhu6NuZyIpDQoNCiN0bXAgbMOgIG3hu5l0IGRhdGFmcmFtZSBjaOG7qWEgZOG7ryBsaeG7h3UgduG7gSBjw6FjIHZpw6puIGtpbSBjxrDGoW5nLCBiYW8gZ+G7k20gYmnhur9uIGN1dCB0aOG7gyBoaeG7h24gbeG7qWMgY2jhuqV0IGzGsOG7o25nIGPhuq90Lg0KI2dncGxvdChhZXMoeCA9IGN1dCkpIHThuqFvIHJhIG3hu5l0IGdncGxvdCBvYmplY3QgduG7m2kgdHLhu6VjIGhvw6BuaCBsw6AgYmnhur9uIGN1dC4NCiNnZW9tX2JhcigpIHRow6ptIG3hu5l0IGJp4buDdSDEkeG7kyB0aGFuaCB2w6BvIGdncGxvdCBvYmplY3QuDQojbGFicyh4ID0gJ0No4bqldCBsxrDhu6NuZycsIHkgPSAnU+G7kSBsxrDhu6NuZycpIMSR4bq3dCBuaMOjbiBjaG8gdHLhu6VjIHggdsOgIHkuDQojbGFicyh0aXRsZSA9ICLEkOG7kyB0aOG7iyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIGNo4bqldCBsxrDhu6NuZyIpIMSR4bq3dCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KYGBgDQoNCkThu7FhIHRyw6puIMSR4buTIHRo4buLLCB0YSBjw7MgdGjhu4Mgbmjhuq1uIHjDqXQgbeG7mXQgc+G7kSDEkWnhu4NtIHNhdToNCg0KLSBOaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgIklkZWFsIiBjaGnhur9tIHBo4bqnbiBs4bubbiB0cm9uZyB04buVbmcgc+G7kSB2acOqbiBraW0gY8awxqFuZywgaMahbiAyMC4wMDAgdmnDqm46IMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG1ham9yaXR5IGtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgcuG6pXQgdOG7kXQuDQoNCi0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBnaeG6o20gZOG6p24gdGhlbyBjaOG6pXQgbMaw4bujbmcgY+G6r3Q6IEPDoG5nIHh14buRbmcgY+G6pXAgxJHhu5kgdGjhuqVwLCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDoG5nIMOtdC4NCg0KLSBOaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgIkZhaXIiIGPDsyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIMOtdCBuaOG6pXQsIGtob+G6o25nIDIuMDAwIHZpw6puOiBDaOG6pXQgbMaw4bujbmcgY+G6r3QgIkZhaXIiIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24gduG6uyDEkeG6uXAgdsOgIGdpw6EgdHLhu4sgY+G7p2Ega2ltIGPGsMahbmcsIGThuqtuIMSR4bq/biBz4buRIGzGsOG7o25nIMOtdCBoxqFuLg0KDQojIC4gUGjDom4gdMOtY2ggxJHhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBtw6B1IHPhuq9jDQoNClZp4buHYyBwaMOibiB0w61jaCDEkeG7kyB0aOG7iyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3DoHUgc+G6r2MgxJHhu4MgbuG6r20gYuG6r3QgxJHGsOG7o2Mgc+G7kSBsxrDhu6NuZyBj4bunYSB04burbmcgbmjDs20gbcOgdSBz4bqvYyBj4bunYSBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nLCB04burIMSRw7M6DQoNCi0gTuG6r20gYuG6r3QgeHUgaMaw4bubbmcgdGjhu4sgdHLGsOG7nW5nOiBYw6FjIMSR4buLbmggbcOgdSBz4bqvYyBuw6BvIMSRxrDhu6NjIMawYSBjaHXhu5luZyBuaOG6pXQsIHThu6sgxJHDsyBk4buxIMSRb8OhbiBuaHUgY+G6p3UgdGjhu4sgdHLGsOG7nW5nIHRyb25nIHTGsMahbmcgbGFpLiBQaMOibiB0w61jaCB4dSBoxrDhu5tuZyB0aGF5IMSR4buVaSBz4bufIHRow61jaCB0aGVvIHRo4budaSBnaWFuIMSR4buDIMSRxrBhIHJhIGNoaeG6v24gbMaw4bujYyBraW5oIGRvYW5oIHBow7kgaOG7o3AuDQoNCi0gUGjDom4gdMOtY2ggdGjhu4sgaGnhur91IGtow6FjaCBow6BuZzogU+G7nyB0aMOtY2ggdGhlbyBraHUgduG7sWM6IFBow6JuIHTDrWNoIHPhu58gdGjDrWNoIHbhu4EgbcOgdSBz4bqvYyB0aGVvIGtodSB24buxYywgcXXhu5FjIGdpYSDEkeG7gyDEkWnhu4F1IGNo4buJbmggY2hp4bq/biBsxrDhu6NjIG1hcmtldGluZyBwaMO5IGjhu6NwLiBOaMOzbSBraMOhY2ggaMOgbmc6IFjDoWMgxJHhu4tuaCBuaMOzbSBraMOhY2ggaMOgbmcgxrBhIGNodeG7mW5nIHThu6tuZyBtw6B1IHPhuq9jIMSR4buDIGPDoSBuaMOibiBow7NhIHRy4bqjaSBuZ2hp4buHbSBtdWEgc+G6r20uDQoNCi0gUGjDom4ga2jDumMgdGjhu4sgdHLGsOG7nW5nOiBM4buxYSBjaOG7jW4gdGjhu4sgdHLGsOG7nW5nIG3hu6VjIHRpw6p1OiBwaMO5IGjhu6NwIHbhu5tpIG3DoHUgc+G6r2Mga2ltIGPGsMahbmcgbcOgIGLhuqFuIGN1bmcgY+G6pXAuIMSQYSBk4bqhbmcgaMOzYSBz4bqjbiBwaOG6qW06IMSQYSBk4bqhbmcgaMOzYSBz4bqjbiBwaOG6qW0gdGhlbyBtw6B1IHPhuq9jIMSR4buDIMSRw6FwIOG7qW5nIG5odSBj4bqndSBj4bunYSBuaGnhu4F1IG5ow7NtIGtow6FjaCBow6BuZy4NCg0KRMaw4bubaSDEkcOieSBsw6AgxJHhu5MgdGjhu4sgQmFyIGNoYXJ0IHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3DoHUgc+G6r2MuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCAlPiUgZ2dwbG90KGFlcyh4ID0gY29sb3IpKSArIGdlb21fYmFyKCkgKyBsYWJzKHggPSAnTcOgdSBz4bqvYycsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsgbGFicyggdGl0bGUgPSAixJDhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBtw6B1IHPhuq9jIikNCg0KI3RtcCBsw6AgbeG7mXQgZGF0YWZyYW1lIGNo4bupYSBk4buvIGxp4buHdSB24buBIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcsIGJhbyBn4buTbSBiaeG6v24gY29sb3IgdGjhu4MgaGnhu4duIG3DoHUgc+G6r2MgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcuDQojZ2dwbG90KGFlcyh4ID0gY29sb3IpKSB04bqhbyByYSBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHbhu5tpIHRy4bulYyBob8OgbmggbMOgIGJp4bq/biBjb2xvci4NCiNnZW9tX2JhcigpIHRow6ptIG3hu5l0IGJp4buDdSDEkeG7kyB0aGFuaCB2w6BvIGdncGxvdCBvYmplY3QuDQojbGFicyh4ID0gJ03DoHUgc+G6r2MnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSDEkeG6t3QgbmjDo24gY2hvIHRy4bulYyB4IHbDoCB5Lg0KI2xhYnModGl0bGUgPSAixJDhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBtw6B1IHPhuq9jIikgxJHhurd0IHRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQpgYGANCg0KROG7sWEgdHLDqm4gxJHhu5MgdGjhu4ssIHRhIGPDsyB0aOG7gyBuaOG6rW4geMOpdCBt4buZdCBz4buRIMSRaeG7g20gc2F1Og0KDQotIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyB04burbmcgbmjDs20gbcOgdSB04burIG3DoHUgRCDEkeG6v24gbcOgdSBKIHBow6JuIGLhu5Ega2jDtG5nIMSR4buTbmcgxJHhu4F1Lg0KDQotIFPhu5EgbMaw4bujbmcgbmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBjw7MgbcOgdSBHIGNoaeG6v20gc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCwga2hv4bqjbmcgMTEuMDAwIHZpw6puLCB0aeG6v3AgxJHhur9uIGzDoCBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBtw6B1IEUgdsOgIHPhu5EgbMaw4bujbmcgbmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBjw7MgbcOgdSBKIGPDsyBz4buRIGzGsOG7o25nIMOtdCBuaOG6pXQgdHJvbmcgdOG7lW5nIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcsIGTGsOG7m2kgMy4wMDAgdmnDqm4uDQoNCiMgLiBQaMOibiB0w61jaCDEkeG7kyB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdGluaCBraGnhur90DQoNClZp4buHYyBwaMOibiB0w61jaCDEkeG7kyB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdGluaCBraGnhur90IG1hbmcgxJHhu4MgbuG6r20gYuG6r3QgxJHGsOG7o2MgdGjhu4sgdHLGsOG7nW5nIGtpbSBjxrDGoW5nLCBiYW8gZ+G7k206DQoNCi0gTeG7qWMgxJHhu5kgcGjhu5UgYmnhur9uOiBYw6FjIMSR4buLbmggxJHhu5kgdGluaCBraGnhur90IHBo4buVIGJp4bq/biBuaOG6pXQgdsOgIMOtdCBwaOG7lSBiaeG6v24gbmjhuqV0IGPhu6dhIGtpbSBjxrDGoW5nLg0KDQotIEdpw6EgdHLhu4sgdsOgIG5odSBj4bqndTogTeG7qWMgxJHhu5kga2hhbiBoaeG6v206IFBow6JuIHTDrWNoIG3hu5FpIGxpw6puIGjhu4cgZ2nhu69hIMSR4buZIHRpbmgga2hp4bq/dCB2w6AgbeG7qWMgxJHhu5kga2hhbiBoaeG6v20sIHThu6sgxJHDsyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nDoSB0cuG7iy4gTmh1IGPhuqd1IHRo4buLIHRyxrDhu51uZzogxJDDoW5oIGdpw6Egbmh1IGPhuqd1IHRo4buLIHRyxrDhu51uZyDEkeG7kWkgduG7m2kga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgxJHhu5kgdGluaCBraGnhur90LCBnacO6cCDEkcawYSByYSBxdXnhur90IMSR4buLbmgga2luaCBkb2FuaCBwaMO5IGjhu6NwLg0KDQotIFh1IGjGsOG7m25nIHRo4buLIHRyxrDhu51uZzogWHUgaMaw4bubbmcgdGhheSDEkeG7lWk6IFBow6JuIHTDrWNoIHh1IGjGsOG7m25nIHRoYXkgxJHhu5VpIG5odSBj4bqndSB0aGVvIHRo4budaSBnaWFuIGNobyB04burbmcgbeG7qWMgxJHhu5kgdGluaCBraGnhur90LiBE4buxIMSRb8OhbjogROG7sSDEkW/DoW4geHUgaMaw4bubbmcgdMawxqFuZyBsYWkgY+G7p2Egbmh1IGPhuqd1IHRo4buLIHRyxrDhu51uZyBk4buxYSB0csOqbiB4dSBoxrDhu5tuZyBoaeG7h24gdOG6oWkuDQoNCsSQw6J5IGzDoCDEkeG7kyB0aOG7iyBCYXIgY2hhcnQgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgxJHhu5kgdGluaCBraGnhur90IChJRiwgVlZTMSwgVlZTMiwgVlMxLCBWUzIsIFNJMSwgU0kyLCBJMSkuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSkpICsgZ2VvbV9iYXIoKSArIGxhYnMoeCA9ICfEkOG7mSB0aW5oIGtoaeG6v3QnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArIGxhYnModGl0bGUgPSAixJDhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRpbmgga2hp4bq/dCIpDQoNCiN0bXAgbMOgIG3hu5l0IGRhdGFmcmFtZSBjaOG7qWEgZOG7ryBsaeG7h3UgduG7gSBjw6FjIHZpw6puIGtpbSBjxrDGoW5nLCBiYW8gZ+G7k20gYmnhur9uIGNsYXJpdHkgdGjhu4MgaGnhu4duIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSB2acOqbiBraW0gY8awxqFuZy4NCiNnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5KSkgdOG6oW8gcmEgbeG7mXQgZ2dwbG90IG9iamVjdCB24bubaSB0cuG7pWMgaG/DoG5oIGzDoCBiaeG6v24gY2xhcml0eS4NCiNnZW9tX2JhcigpIHRow6ptIG3hu5l0IGJp4buDdSDEkeG7kyB0aGFuaCB2w6BvIGdncGxvdCBvYmplY3QuDQojbGFicyh4ID0gJ8SQ4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpIMSR4bq3dCBuaMOjbiBjaG8gdHLhu6VjIHggdsOgIHkuDQojbGFicyh0aXRsZSA9ICIgIikgxJHhurd0IHRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQpgYGANCg0KDQpE4buxYSB0csOqbiDEkeG7kyB0aOG7iywgdGEgY8OzIHRo4buDIG5o4bqtbiB4w6l0IG3hu5l0IHPhu5EgxJFp4buDbSBzYXU6DQoNCi0gU+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBwaMOibiBi4buRIOG7nyB04burbmcgbeG7qWMgxJHhu5kgdGluaCBraGnhur90IGzDoCBraMOhYyBuaGF1LCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGPDoG5nIMOtdCBjaG8gdGjhuqV5IMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSB2acOqbiBraW0gY8awxqFuZyBjw6BuZyBjYW8uDQoNCi0gTmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBjw7MgxJHhu5kgdGluaCBraGnhur90IEkxIGPDsyDEkeG7mSB0aW5oIGtoaeG6v3QgcuG6pXQgY2FvLCBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyDEkeG7mSB0aW5oIGtoaeG6v3QgSUYgY2FvIHbDoCBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyDEkeG7mSB0aW5oIGtoaeG6v3QgbMOgIFZTMiBsw6Agbmjhu69uZyB2acOqbiBjw7MgxJHhu5kgdGluaCBraGnhur90IHRo4bqlcCwgbmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBjw7MgxJHhu5kgdGluaCBraGnhur90IGzDoCBTSTEgbMOgIG5o4buvbmcgdmnDqm4gY8OzIMSR4buZIHRpbmgga2hp4bq/dCBy4bqldCB0aOG6pXAuIA0KDQotIFPhu5EgbMaw4bujbmcgbmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBjw7MgxJHhu5kgdGluaCBraGnhur90IGzDoCBTSTIgY2hp4bq/bSBz4buRIGzGsOG7o25nIGzhu5tuIHRyb25nIHThu5VuZyBz4buRIHZpw6puIGtpbSBjxrDGoW5nLCB0csOqbiAxMi4wMDAgdmnDqm4sIHRp4bq/cCDEkcOzIGzDoCBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyDEkeG7mSB0aW5oIGtoaeG6v3QgbMOgIFZTMiB2w6Agbmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBjaGnhur9tIHPhu5EgbMaw4bujbmcgw610IG5o4bqldCB0cm9uZyB04buVbmcgc+G7kSB2acOqbiBraW0gY8awxqFuZyBsw6AgTmjhu69uZyB2acOqbiBjw7MgxJHhu5kgdGluaCBraGnhur90IGzDoCBJMSwgZMaw4bubaSAxLjAwMCB2acOqbi4NCg0KVsOtIGThu6U6IMSQ4buZIHRpbmgga2hp4bq/dCBjYW86IE7hur91ICJJMSIgY8OzIHPhu5EgbMaw4bujbmcgw610IG5o4bqldCwgY2hvIHRo4bqleSDEkcOieSBsw6AgxJHhu5kgdGluaCBraGnhur90IGNhbyBuaOG6pXQgdsOgIGPDsyBnacOhIHRy4buLIGNhby4NCg0KIyAuIFBow6JuIHTDrWNoIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QgY2hvIG5ow7NtIGtpbSBjxrDGoW5nIGPDsyBtw6B1IEQNCg0KTeG7qWMgxJHhu5kgdGluaCBraGnhur90IGzDoCBt4buZdCB0cm9uZyBuaOG7r25nIHnhur91IHThu5EgcXVhbiB0cuG7jW5nIOG6o25oIGjGsOG7n25nIMSR4bq/biBnacOhIHRy4buLIGPhu6dhIGtpbSBjxrDGoW5nLiBWaeG7h2MgcGjDom4gdMOtY2ggbsOgeSBjaG8gdGjhuqV5IHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcg4bufIG3hu5dpIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCwgZ2nDunAgbmfGsOG7nWkgbXVhIHNvIHPDoW5oIGdpw6EgdHLhu4sgZ2nhu69hIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgY8OzIG3DoHUgRC4NClbDrSBk4bulLCBt4buZdCB2acOqbiBraW0gY8awxqFuZyBEIHbhu5tpIMSR4buZIHRpbmgga2hp4bq/dCAiSUYiIHPhur0gY8OzIGdpw6EgY2FvIGjGoW4gc28gduG7m2kgdmnDqm4ga2ltIGPGsMahbmcgRCB24bubaSDEkeG7mSB0aW5oIGtoaeG6v3QgIkkxIi4NCg0KDQpgYGB7cn0NCnRtcCA8LSBkaWFtb25kcw0KdG1wIDwtIHRtcCAlPiUgZ3JvdXBfYnkoY2xhcml0eSwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCnRtcCAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSwgeSA9IG4pKSArIGdlb21fY29sKGRhdGEgPSB0bXAgJT4lIGZpbHRlcihjb2xvciA9PSAnRCcpLCBmaWxsID0gJ2RhcmtncmVlbicpK2xhYnMoeD0ixJDhu5kgdGluaCBraGnhur90Iix5PSJT4buRIGzGsOG7o25nIikgKyBsYWJzKCB0aXRsZSA9ICLEkOG7kyB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdGluaCBraGnhur90IGNobyBuaMOzbSBraW0gY8awxqFuZyBjw7MgbcOgdSBEIikgDQoNCiNjw6J1IGzhu4duaCAxOg0KI2dyb3VwX2J5KGNsYXJpdHksIGNvbG9yKTogTmjDs20gZOG7ryBsaeG7h3UgdGhlbyBoYWkgYmnhur9uIGNsYXJpdHkgKMSR4buZIHRpbmgga2hp4bq/dCkgdsOgIGNvbG9yIChtw6B1IHPhuq9jKS4gc3VtbWFyaXNlKG4gPSBuKCkpOiBUw61uaCB04buVbmcgc+G7kSBsxrDhu6NuZyAobikgY2hvIG3hu5dpIG5ow7NtIMSRxrDhu6NjIHThuqFvIGLhu59pIGdyb3VwX2J5DQoNCiNjw6J1IGzhu4duaCAyOg0KI2dncGxvdChhZXMoeCA9IGNsYXJpdHksIHkgPSBuKSk6IFThuqFvIGJp4buDdSDEkeG7kyBnZ3Bsb3QyIHbhu5tpIHRy4bulYyB4IGzDoCBjbGFyaXR5IHbDoCB0cuG7pWMgeSBsw6Agbi4NCiNnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0QnKSwgZmlsbCA9ICdkYXJrZ3JlZW4nKTogVGjDqm0gaMOsbmggY2jhu68gbmjhuq10IHbDoG8gYmnhu4N1IMSR4buTIGNobyBt4buXaSBuaMOzbSBjbGFyaXR5IHbhu5tpIG3DoHUgZGFya2dyZWVuIGNobyBuaMOzbSBjb2xvciA9PSAnRCcuDQojbGFicyh4ID0gIsSQ4buZIHRpbmgga2hp4bq/dCIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpOiBUaMOqbSBuaMOjbiBjaG8gdHLhu6VjIHggdsOgIHkuDQojbGFicyh0aXRsZSA9ICIgIik6IFRow6ptIHRpw6p1IMSR4buBIGNobyBiaeG7g3UgxJHhu5MuDQpgYGANCg0KQmnhu4N1IMSR4buTIGNobyB0aOG6pXkgc+G7sSBwaOG7lSBiaeG6v24gY+G7p2EgY8OhYyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3Qga2jDoWMgbmhhdSB0cm9uZyBuaMOzbSBraW0gY8awxqFuZyBtw6B1IEQuIFRow7RuZyB0aW4gbsOgeSBjw7MgdGjhu4MgZ2nDunAgbmfGsOG7nWkgbXVhIGtpbSBjxrDGoW5nIMSRw6FuaCBnacOhIGdpw6EgdHLhu4sgY+G7p2EgbeG7mXQgdmnDqm4ga2ltIGPGsMahbmcgY+G7pSB0aOG7gy4gVsOtIGThu6UsIG3hu5l0IHZpw6puIGtpbSBjxrDGoW5nIEQgduG7m2kgxJHhu5kgdGluaCBraGnhur90ICJJRiIgc+G6vSBoaeG6v20gaMahbiB2w6AgxJHhuq90IGjGoW4gbeG7mXQgdmnDqm4ga2ltIGPGsMahbmcgRCB24bubaSDEkeG7mSB0aW5oIGtoaeG6v3QgIlNJMSIuDQoNCk5o4bqtbiB4w6l0Og0KDQotIE5ow6xuIGNodW5nLCBYdSBoxrDhu5tuZyBT4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGdp4bqjbSBk4bqnbiBraGkgxJHhu5kgdGluaCBraGnhur90IHTEg25nIGPhu6dhIGtpbSBjxrDGoW5nIG3DoHUgRC4NCg0KLSBDw7Mgc+G7sSBjaMOqbmggbOG7h2NoIMSRw6FuZyBr4buDIHbhu4Egc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBnaeG7r2EgY8OhYyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2EgbcOgdSBELg0KDQotIFPhu7EgcGjDom4gYuG7kSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIG3DoHUgRDogU0kxIGzDoCBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgcGjhu5UgYmnhur9uIG5o4bqldCB24bubaSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGNhbyBuaOG6pXQgKHRyw6puIDIuMDAwIHZpw6puKS4gSTEgbMOgIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCBoaeG6v20gbmjhuqV0IHbhu5tpIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGjhuqVwIG5o4bqldCAoZMaw4bubaSAxMDAgdmnDqm4pLg0KDQotIE3hu6ljIMSR4buZIOG6o25oIGjGsOG7n25nIGPhu6dhIMSR4buZIHRpbmgga2hp4bq/dDogQ8OzIHRo4buDIHRo4bqleSBy4bqxbmcgxJHhu5kgdGluaCBraGnhur90IOG6o25oIGjGsOG7n25nIMSR4bq/biBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nLg0KTmjDs20ga2ltIGPGsMahbmcgY8OzIMSR4buZIHRpbmgga2hp4bq/dCBjYW8gKFZWUzEsIElGKSBjw7Mgc+G7kSBsxrDhu6NuZyDDrXQgaMahbiBuaGnhu4F1IHNvIHbhu5tpIG5ow7NtIGtpbSBjxrDGoW5nIGPDsyDEkeG7mSB0aW5oIGtoaeG6v3QgdGjhuqVwIChTSTIsIFNJMSxWUzIuLi4pLg0KDQojIC4gUGjDom4gdMOtY2ggxJHhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIGNo4bqldCBsxrDhu6NuZw0KDQpWaeG7h2MgcGjDom4gdMOtY2ggxJHhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIGNo4bqldCBsxrDhu6NuZyDEkeG7gyBu4bqvbSBi4bqvdCDEkcaw4bujYyB0aOG7iyB0csaw4budbmcga2ltIGPGsMahbmcuDQoNCsSQw6J5IGzDoCDEkeG7kyB0aOG7iyBCYXIgY2hhcnQgbmdhbmcgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbG/huqFpIGPhuq90IChJZGVhbCwgcHJlbWl1bSwgVmVyeSBHb29kLCBHb29kLCBGYWlyKS4NCg0KDQpgYGB7cn0NCnRtcCA8LSBkaWFtb25kcw0KdG1wICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQpKSArIGdlb21fYmFyKCkgKyBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykgKyBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIsSQ4buTIHRo4buLIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBjaOG6pXQgbMaw4bujbmciKQ0KDQojdG1wIGzDoCBt4buZdCBkYXRhZnJhbWUgY2jhu6lhIGThu68gbGnhu4d1IHbhu4EgY8OhYyB2acOqbiBraW0gY8awxqFuZywgYmFvIGfhu5NtIGJp4bq/biBjdXQgdGjhu4MgaGnhu4duIG3hu6ljIGNo4bqldCBsxrDhu6NuZyBj4bqvdC4NCiNnZ3Bsb3QoYWVzKHggPSBjdXQpKSB04bqhbyByYSBt4buZdCBnZ3Bsb3Qgb2JqZWN0IHbhu5tpIHRy4bulYyBob8OgbmggbMOgIGJp4bq/biBjdXQuDQojZ2VvbV9iYXIoKSB0aMOqbSBt4buZdCBiaeG7g3UgxJHhu5MgdGhhbmggdsOgbyBnZ3Bsb3Qgb2JqZWN0Lg0KI2xhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSDEkeG6t3QgbmjDo24gY2hvIHRy4bulYyB4IHbDoCB5Lg0KI2Nvb3JkX2ZsaXAoKSDEkeG7lWkgduG7iyB0csOtIGPhu6dhIHRy4bulYyBob8OgbmggdsOgIHRy4bulYyB0dW5nLg0KI2xhYnModGl0bGUgPSAiICIpIMSR4bq3dCB0acOqdSDEkeG7gSBjaG8gYmnhu4N1IMSR4buTLg0KYGBgDQoNCkThu7FhIHRyw6puIMSR4buTIHRo4buLLCB0YSBjw7MgdGjhu4Mgbmjhuq1uIHjDqXQgbeG7mXQgc+G7kSDEkWnhu4NtIHNhdToNCg0KLSBOaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgIklkZWFsIiBjaGnhur9tIHBo4bqnbiBs4bubbiB0cm9uZyB04buVbmcgc+G7kSB2acOqbiBraW0gY8awxqFuZywgaMahbiAyMC4wMDAgdmnDqm46IMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG1ham9yaXR5IGtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgcuG6pXQgdOG7kXQuDQoNCi0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBnaeG6o20gZOG6p24gdGhlbyBjaOG6pXQgbMaw4bujbmcgY+G6r3Q6IEPDoG5nIHh14buRbmcgY+G6pXAgxJHhu5kgdGjhuqVwLCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDoG5nIMOtdC4NCg0KLSBOaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgIkZhaXIiIGPDsyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIMOtdCBuaOG6pXQsIGtob+G6o25nIDIuMDAwIHZpw6puOiBDaOG6pXQgbMaw4bujbmcgY+G6r3QgIkZhaXIiIGPDsyB0aOG7gyDhuqNuaCBoxrDhu59uZyDEkeG6v24gduG6uyDEkeG6uXAgdsOgIGdpw6EgdHLhu4sgY+G7p2Ega2ltIGPGsMahbmcsIGThuqtuIMSR4bq/biBz4buRIGzGsOG7o25nIMOtdCBoxqFuLg0KDQojIC4gUGjDom4gdMOtY2ggxJHhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIGNo4bqldCBsxrDhu6NuZyBj4bunYSAyIG3DoHUgRyB2w6AgSg0KDQpWaeG7h2Mgc28gc8OhbmggbsOgeSBjw7MgdGjhu4MgbWFuZyBs4bqhaSBuaGnhu4F1IGzhu6NpIMOtY2ggY2hvIG5oaeG7gXUgxJHhu5FpIHTGsOG7o25nIHRyb25nIHRo4buLIHRyxrDhu51uZyBraW0gY8awxqFuZzoNCg0KLSBIaeG7g3UgcsO1IGjGoW4gduG7gSBz4buxIHBo4buVIGJp4bq/biBj4bunYSBjw6FjIG3DoHUgc+G6r2Mga2ltIGPGsMahbmcga2jDoWMgbmhhdS4gU28gc8OhbmggZ2nDoSBiw6FuIGPhu6dhIGtpbSBjxrDGoW5nIEcgdsOgIEogdHJvbmcgY8O5bmcgbmjDs20gY2jhuqV0IGzGsOG7o25nLiBM4buxYSBjaOG7jW4ga2ltIGPGsMahbmcgcGjDuSBo4bujcCB24bubaSBuaHUgY+G6p3UgdsOgIG5nw6JuIHPDoWNoLg0KDQotIEdpw7pwIHZp4buHYyDEkeG7i25oIGdpw6Ega2ltIGPGsMahbmcgRyB2w6AgSiBjaMOtbmggeMOhYyBoxqFuLCBk4buxYSB0csOqbiBk4buvIGxp4buHdSB0aOG7iyB0csaw4budbmcuIFTEg25nIGto4bqjIG7Eg25nIGPhuqFuaCB0cmFuaCB0csOqbiB0aOG7iyB0csaw4budbmcuIFThuqFvIGThu7FuZyB1eSB0w61uIHbhu5tpIGtow6FjaCBow6BuZy4NCg0KLSBHacO6cCB0aHUgdGjhuq1wIGThu68gbGnhu4d1IHbhu4EgdGjhu4sgdHLGsOG7nW5nIGtpbSBjxrDGoW5nLiBYw6FjIMSR4buLbmggeHUgaMaw4bubbmcgduG7gSBz4buRIGzGsOG7o25nIHbDoCBnacOhIGLDoW4gY+G7p2Ega2ltIGPGsMahbmcgRyB2w6AgSi4gUGjDoXQgdHJp4buDbiBjw6FjIG3DtCBow6xuaCBk4buxIMSRb8OhbiBz4buRIGzGsOG7o25nIHbDoCBnacOhIGLDoW4gY+G7p2Ega2ltIGPGsMahbmcgRyB2w6AgSi4NCg0KLSBHacO6cCBjw6FjIG5ow6Aga2luaCBkb2FuaCBs4bqtcCBr4bq/IGhv4bqhY2gga2luaCBkb2FuaCBoaeG7h3UgcXXhuqMgaMahbiwgZOG7sWEgdHLDqm4gZOG7ryBsaeG7h3UgduG7gSB0aOG7iyB0csaw4budbmcuIFjDoWMgxJHhu4tuaCBwaMOibiBraMO6YyB0aOG7iyB0csaw4budbmcgbeG7pWMgdGnDqnUuIFBow6F0IHRyaeG7g24gY8OhYyBjaGnhur9uIGzGsOG7o2MgbWFya2V0aW5nIHBow7kgaOG7o3AuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCA8LSB0bXAgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCnRtcCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsgZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdHJyksIGZpbGwgPSAnZGFya2dyZWVuJykgKyBnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0onKSwgZmlsbCA9ICdibHVlJykrIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAixJDhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIGNo4bqldCBsxrDhu6NuZyBj4bunYSAyIG3DoHUgRyB2w6AgSiAiKQ0KDQoNCmBgYA0KDQpCaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCB24buBIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgZ2nhu69hIGPDoWMgY2jhuqV0IGzGsOG7o25nIGPhuq90IGNobyBj4bqjIGhhaSBtw6B1IEcgdsOgIEouIEThu68gbGnhu4d1IMSRxrDhu6NjIG5ow7NtIHRoZW8gNSBt4bupYyDEkeG7mSBjaOG6pXQgbMaw4bujbmcgY+G6r3Q6IElkZWFsLCBQcmVtaXVtLCBWZXJ5IEdvb2QsIEdvb2QsIEZhaXIuIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY2hvIG3hu5dpIG3hu6ljIMSR4buZIGPhuq90IMSRxrDhu6NjIGJp4buDdSB0aOG7iyBi4bqxbmcgaGFpIG5ow7NtIGPhu5l0OiBD4buZdCBtw6B1IHhhbmggbMOhIMSR4bqtbSB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBtw6B1IEcgdsOgIGPhu5l0IG3DoHUgeGFuaCBsYW0gdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbcOgdSBKLg0KDQotIE5ow6xuIGNodW5nLCBraW0gY8awxqFuZyBtw6B1IEogY8OzIHh1IGjGsOG7m25nIGPDsyBz4buRIGzGsOG7o25nIG5oaeG7gXUgaMahbiBraW0gY8awxqFuZyBtw6B1IEcgY8O5bmcgY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGdp4bqjbSBk4bqnbiBraGkgY2jhuqV0IGzGsOG7o25nIGPhuq90IGdp4bqjbSAoIHThu6sgSWRlYWwgxJHhur9uIEZhaXIpOiBuaMOzbSBraW0gY8awxqFuZyBJZGVhbCBjw7Mgc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCBjaG8gY+G6oyBoYWkgbcOgdSB2w6Aga2ltIGPGsMahbmcgRmFpciBjw7Mgc+G7kSBsxrDhu6NuZyDDrXQgbmjhuqV0IGNobyBj4bqjIGhhaSBtw6B1Lg0KDQotIENo4bqldCBsxrDhu6NuZyBj4bqvdCBJZGVhbCBjw7Mgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjYW8gbmjhuqV0ICggZ+G6p24gNS4wMDAgdmnDqm4pOiB0cm9uZyDEkcOzIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbcOgdSBKIGPDsyBz4buRIGzGsOG7o25nIG5oaeG7gXUgZ+G6pXAgNCBs4bqnbiBtw6B1IEcuDQoNCi0gQ2jhuqV0IGzGsOG7o25nIGPhuq90IEZhaXIgY8OzIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGjhuqVwIG5o4bqldCAoZMaw4bubaSA1MDAgdmnDqm4pOiB0cm9uZyDEkcOzLCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIG3DoHUgRyB2w6AgbcOgdSBKIGPDsyBz4buRIGzGsOG7o25nIHjhuqVwIHjhu4kgYuG6sW5nIG5oYXUuDQoNClTDs20gbOG6oWksIGNo4bqldCBsxrDhu6NuZyBj4bqvdCDhuqNuaCBoxrDhu59uZyDEkeG6v24gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZy4gS2ltIGPGsMahbmcgY8OzIGNo4bqldCBsxrDhu6NuZyBj4bqvdCB04buRdCAoSWRlYWwsIFByZW1pdW0sIFZlcnkgR29vZCwgR29vZCkgY8OzIHPhu5EgbMaw4bujbmcgbmhp4buBdSBoxqFuIHbDoCBnacOhIHRow6BuaCBjYW8gaMahbiBzbyB24bubaSBraW0gY8awxqFuZyBjw7MgY2jhuqV0IGzGsOG7o25nIGPhuq90IHRo4bqlcCAoRmFpcikuIENobyB0aOG6pXkgcuG6sW5nIGvhu7kgdGh14bqtdCBj4bqvdCBraW0gY8awxqFuZyBy4bqldCB0acOqbiB0aeG6v24gdsOgIGhp4buHbiDEkeG6oWksIGNobyByYSDEkcaw4bujYyDEkWEgc+G7kSBz4bqjbiBwaOG6qW0gdOG7kXQuDQoNCiMgLiBQaMOibiB0w61jaCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gY2jhuqV0IGzGsOG7o25nIGPhu6dhIG3DoHUgRCwgSSB2w6AgSg0KDQpWaeG7h2MgcGjDom4gdMOtY2ggc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRpbmgga2hp4bq/dCBnaeG7r2EgYmEgbcOgdSBz4bqvYyAnRCcsICdJJyB2w6AgJ0onIGPDsyB0aOG7gyBxdWFuIHPDoXQgY8OhYyDEkeG6t2MgxJFp4buDbSBuaMawOg0KDQotIFh1IGjGsOG7m25nIGNodW5nIGPhu6dhIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QuDQoNCi0gU+G7sSBraMOhYyBiaeG7h3QgduG7gSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGdp4buvYSBjw6FjIG3DoHUgc+G6r2MgdOG6oWkgbeG7l2kgbeG7qWMgxJHhu5kgdGluaCBraGnhur90Lg0KDQotIE3DoHUgc+G6r2MgbsOgbyBjw7Mgbmhp4buBdSB2acOqbiBraW0gY8awxqFuZyBuaOG6pXQg4bufIGPDoWMgbeG7qWMgxJHhu5kgdGluaCBraGnhur90IGtow6FjIG5oYXUuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCA8LSB0bXAgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCnRtcCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsgZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdEJyksIGZpbGwgPSAnYmxhY2snKSArIGdlb21fY29sKGRhdGEgPSB0bXAgJT4lIGZpbHRlcihjb2xvciA9PSAnSScpLCBmaWxsID0gJ2RhcmtncmVlbicpKyBnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0onKSwgZmlsbCA9ICdicm93bicpKyBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykgKyBjb29yZF9mbGlwKCkgKyBsYWJzKHRpdGxlID0gIsSQ4buTIHRo4buLIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBjaOG6pXQgbMaw4bujbmcgY+G7p2EgbcOgdSBKICwgSSB2w6AgRCIpDQoNCiMgY29vcmRfZmxpcCgpOiDEkOG6o28gbmfGsOG7o2MgdHLhu6VjIHggdsOgIHkuDQpgYGANCg0KQmnhu4N1IMSR4buTIHRodSDEkcaw4bujYyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBt4bupYyBjaOG6pXQgbMaw4bujbmcgKGN1dCkgY2hvIGJhIG3DoHUgc+G6r2MgJ0QnLCAnSScgdsOgICdKJy4gQmnhu4N1IMSR4buTIGPDsyBiYSBj4buZdCBjaOG7k25nIG7hurFtIG5nYW5nLCB24bubaSBt4buXaSBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBjaG8gbeG7mXQgbcOgdSBz4bqvYyB0xrDGoW5nIOG7qW5nLiBDaGnhu4F1IGTDoGkgY+G7p2EgbeG7l2kgY+G7mXQgdOG6oWkgbeG7l2kgbeG7qWMgY2jhuqV0IGzGsOG7o25nIGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBtw6B1IHPhuq9jIMSRw7Mg4bufIG3hu6ljIGNo4bqldCBsxrDhu6NuZyDEkcOzLg0KDQpOaOG6rW4geMOpdCB24buBIGThu68gbGnhu4d1IHRyb25nIGJp4buDdSDEkeG7kzoNCg0KLSBOaMOsbiBjaHVuZywgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBEIMOtdCBuaOG6pXQg4bufIGjhuqd1IGjhur90IGPDoWMgbeG7qWMgY2jhuqV0IGzGsOG7o25nIGPhu6dhIGtpbSBjxrDGoW5nLg0KDQotIFPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgZ2nhuqNtIGThuqduIHRoZW8gY2jhuqV0IGzGsOG7o25nIGPhu6dhIGtpbSBjxrDGoW5nICggdOG7qyBJZGVhbCDEkeG6v24gRmFpcikgY2hvIGPhuqMgYmEgbcOgdSBz4bqvYy4NCg0KLSBQaMOibiBi4buRIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jOiBNw6B1ICdJJyB2w6AgJ0onIGPDsyB4dSBoxrDhu5tuZyBwaMOibiBi4buRIMSR4buBdSBoxqFuIGdp4buvYSBjw6FjIG3hu6ljIGNo4bqldCBsxrDhu6NuZyBj4bunYSBraW0gY8awxqFuZywgY8OybiBtw6B1ICdEJyBjw7MgeHUgaMaw4bubbmcgdOG6rXAgdHJ1bmcgbmhp4buBdSBoxqFuIOG7nyBjw6FjIG3hu6ljIGNo4bqldCBsxrDhu6NuZyBj4bunYSBraW0gY8awxqFuZyB0cuG7qyBGYWlyLg0KDQojIC4gUGjDom4gdMOtY2ggxJHhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIGNo4bqldCBsxrDhu6NuZw0KDQrEkMOieSBsw6AgxJHhu5MgdGjhu4sgQmFyIGNoYXJ0IHRo4buDIGhp4buHbiBjaGkgdGnhur90IHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgY2jhuqV0IGzGsOG7o25nIGPhuq90IChJZGVhbCwgUHJlbWl1bSwgVmVyeSBHb29kLCBHb29kLCBGYWlyKS4NCg0KDQpgYGB7cn0NCnRtcCA8LSBkaWFtb25kcw0KdG1wICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIGdncGxvdChhZXMoY3V0LG4pKSArIGdlb21fY29sKGZpbGw9J3B1cnBsZScpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnYmxhY2snKSArIGxhYnMoeCA9ICdDaOG6pXQgbMaw4bujbmcnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArIGxhYnMoIHRpdGxlID0gIsSQ4buTIHRo4buLIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBjaOG6pXQgbMaw4bujbmciKQ0KDQojVGjDqm0gY2jDuiB0aMOtY2ggKGdlb21fdGV4dCkgaGnhu4NuIHRo4buLIHPhu5EgbMaw4bujbmcgKG4pIGNobyBt4buXaSB0aGFuaC4NCiN2anVzdCA9IDI6IERpIGNodXnhu4NuIGNow7ogdGjDrWNoIGzDqm4gdHLDqm4gbeG7mXQgY2jDunQgxJHhu4MgZOG7hSBuaMOsbiBoxqFuLg0KI2NvbG9yID0gJ2JsYWNrJzogQ2jhu41uIG3DoHUgxJFlbiBjaG8gY2jDuiB0aMOtY2guDQpgYGANCg0KROG7sWEgdHLDqm4gxJHhu5MgdGjhu4ssIHRhIGPDsyB0aOG7gyBuaOG6rW4geMOpdCBt4buZdCBz4buRIMSRaeG7g20gc2F1Og0KDQotIE5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgY8OzIGNo4bqldCBsxrDhu6NuZyBj4bqvdCAiSWRlYWwiIGNoaeG6v20gcGjhuqduIGzhu5tuIHRyb25nIHThu5VuZyBz4buRIHZpw6puIGtpbSBjxrDGoW5nLCAyMS41NTEgdmnDqm46IMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IG1ham9yaXR5IGtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgcuG6pXQgdOG7kXQuDQoNCi0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBnaeG6o20gZOG6p24gdGhlbyBjaOG6pXQgbMaw4bujbmcgY+G6r3QsIHThu6sgMjEuNTUxIHZpw6puIChJZGVhbCkgdsOgIDEuNjEwIHZpw6puIChGYWlyKTogQ8OgbmcgeHXhu5FuZyBj4bqlcCDEkeG7mSB0aOG6pXAsIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY8Ogbmcgw610Lg0KDQotIE5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgY8OzIGNo4bqldCBsxrDhu6NuZyBQcmVtaXVtLCBjw7MgMTMuNzkxIHZpw6puOyBuaOG7r25nIHZpw6puIGPDsyBjaOG6pXQgbMaw4bujbmcgbMOgIFZlcnkgR29vZCBjw7MgMTIuMDgyIHZpw6puIHbDoCBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgR29vZCBjw7MgNC45MDYgdmnDqm4uDQoNCi0gTmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBjw7MgY2jhuqV0IGzGsOG7o25nIGPhuq90ICJGYWlyIiBjw7Mgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyDDrXQgbmjhuqV0LCAxLjYxMCB2acOqbjogQ2jhuqV0IGzGsOG7o25nIGPhuq90ICJGYWlyIiBjw7MgdGjhu4Mg4bqjbmggaMaw4bufbmcgxJHhur9uIHbhursgxJHhurlwIHbDoCBnacOhIHRy4buLIGPhu6dhIGtpbSBjxrDGoW5nLCBk4bqrbiDEkeG6v24gc+G7kSBsxrDhu6NuZyDDrXQgaMahbi4NCg0KIyAuIFBow6JuIHTDrWNoIMSR4buTIHRo4buLIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jDQoNCsSQw6J5IGzDoCDEkeG7kyB0aOG7iyBCYXIgY2hhcnQgdGjhu4MgaGnhu4duIGNoaSB0aeG6v3Qgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBtw6B1IHPhuq9jIChELCBFLCBGLCBHLCBILCBJLCBKKS4NCg0KDQpgYGB7cn0NCnRtcCA8LSBkaWFtb25kcw0KdG1wICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUgZ2dwbG90KGFlcyhjb2xvcixuKSkgKyBnZW9tX2NvbChmaWxsPSdwdXJwbGUnKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ2JsYWNrJykgKyBsYWJzKHggPSAnTcOgdSBz4bqvYycsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsgbGFicyh0aXRsZSA9ICLEkOG7kyB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYyIpDQoNCiNUaMOqbSBjaMO6IHRow61jaCAoZ2VvbV90ZXh0KSBoaeG7g24gdGjhu4sgc+G7kSBsxrDhu6NuZyAobikgY2hvIG3hu5dpIHRoYW5oLg0KI3ZqdXN0ID0gMjogRGkgY2h1eeG7g24gY2jDuiB0aMOtY2ggbMOqbiB0csOqbiBt4buZdCBjaMO6dCDEkeG7gyBk4buFIG5ow6xuIGjGoW4uDQojY29sb3IgPSAnYmxhY2snOiBDaOG7jW4gbcOgdSDEkWVuIGNobyBjaMO6IHRow61jaC4NCmBgYA0KDQpE4buxYSB0csOqbiDEkeG7kyB0aOG7iywgdGEgY8OzIHRo4buDIG5o4bqtbiB4w6l0IG3hu5l0IHPhu5EgxJFp4buDbSBzYXU6DQoNCi0gU+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBuaMOzbSBtw6B1IHThu6sgbcOgdSBEIMSR4bq/biBtw6B1IEogcGjDom4gYuG7kSBraMO0bmcgxJHhu5NuZyDEkeG7gXUuDQoNCi0gU+G7kSBsxrDhu6NuZyBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBtw6B1IEcgY2hp4bq/bSBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0IGPDsyAxMS4yOTIgdmnDqm4gKCBjaGnhur9tIDIwLDkzJSB0cm9uZyB04buVbmcgc+G7kSB2acOqbiBraW0gY8awxqFuZyksIHRp4bq/cCDEkeG6v24gbMOgIG5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgY8OzIG3DoHUgRSwgOS43OTcgdmnDqm4gKGNoaeG6v20gMTgsMTYlIHRyb25nIHThu5VuZyBz4buRKSB2w6Agc+G7kSBsxrDhu6NuZyBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBtw6B1IEogY8OzIHPhu5EgbMaw4bujbmcgw610IG5o4bqldCB0cm9uZyB04buVbmcgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZywgMi44MDggdmnDqm4gKGNoaeG6v20gNSwyJSB0cm9uZyB04buVbmcgc+G7kSBraW0gY8awxqFuZykuDQoNCi0gTmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBtw6B1IEcgY8OzIHPhu5EgbMaw4bujbmcgbmhp4buBdSBuaOG6pXQsIMSRaeG7gXUgbsOgeSBjaG8gdGjhuqV5IGtpbSBjxrDGoW5nIGPDsyBtw6B1IEcgbMOgIHBo4buVIGJp4bq/biBuaOG6pXQuIFbDoCBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIG3DoHUgSiBjw7Mgc+G7kSBsxrDhu6NuZyDDrXQgbmjhuqV0IGNobyB0aOG6pXkgbsOzIMOtdCBwaOG7lSBiaeG6v24gaMahbiBraW0gY8awxqFuZyBjw7MgbcOgdSBHLg0KDQojIC4gUGjDom4gdMOtY2ggxJHhu5MgdGjhu4sgdOG7tyBs4buHIHBo4bqnbiB0csSDbSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gY2jhuqV0IGzGsOG7o25nDQoNCsSQw6J5IGzDoCDEkeG7kyB0aOG7iyBCYXIgY2hhcnQgdGjhu4MgaGnhu4duIHThu7cgbOG7hyBwaOG6p24gdHLEg20gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBt4bupYyBjaOG6pXQgbMaw4bujbmcgKElkZWFsLCBQcmVtaXVtLCBWZXJ5IEdvb2QsIEdvb2QsIEZhaXIpLg0KDQoNCmBgYHtyfQ0KdG1wIDwtIGRpYW1vbmRzDQp0bXAgJT4lIGdyb3VwX2J5KGN1dCkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUgZ2dwbG90KGFlcyhjdXQsbikpICsgZ2VvbV9jb2woZmlsbD0nZ3JlZW4nKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KG4vbGVuZ3RoKHRtcCRjYXJhdCkpKSx2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpICsgbGFicyh4ID0gJ0No4bqldCBsxrDhu6NuZycsIHkgPSAnU+G7kSBsxrDhu6NuZycpICsgbGFicyh0aXRsZSA9ICLEkOG7kyB0aOG7iyB04bu3IGzhu4cgcGjhuqduIHRyxINtIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBjaOG6pXQgbMaw4bujbmciKQ0KDQojVGjDqm0gY2jDuiB0aMOtY2ggKGdlb21fdGV4dCkgaGnhu4NuIHRo4buLIHThu7cgbOG7hyBwaOG6p24gdHLEg20gKHBlcmNlbnQpIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgY2hvIG3hu5dpIG3hu6ljIGNo4bqldCBsxrDhu6NuZyAoY3V0KS4NCiN2anVzdCA9IDI6IERpIGNodXnhu4NuIGNow7ogdGjDrWNoIGzDqm4gdHLDqm4gbeG7mXQgY2jDunQgxJHhu4MgZOG7hSBuaMOsbiBoxqFuLg0KI2NvbG9yID0gJ3JlZCc6IENo4buNbiBtw6B1IMSR4buPIGNobyBjaMO6IHRow61jaC4NCiNsZW5ndGgodG1wJGNhcmF0KTogTOG6pXkgdOG7lW5nIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcuDQpgYGANCg0KROG7sWEgdHLDqm4gxJHhu5MgdGjhu4ssIHRhIGPDsyB0aOG7gyBuaOG6rW4geMOpdCBt4buZdCBz4buRIMSRaeG7g20gc2F1Og0KDQotIFThu7cgbOG7hyBwaOG6p24gdHLEg20ga2ltIGPGsMahbmcgSWRlYWwgY2hp4bq/bSDEkWEgc+G7kTogQ8OzIDQwJSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRyb25nIHThu5VuZyBz4buRIGtpbSBjxrDGoW5nLg0KDQotIFThu7cgbOG7hyBwaOG6p24gdHLEg20ga2ltIGPGsMahbmcgZ2nhuqNtIGThuqduIHRoZW8gY2jhuqV0IGzGsOG7o25nIGPhuq90OiBDw6BuZyB4deG7kW5nIGPhuqVwIMSR4buZIHRo4bqlcCwgdOG7tyBs4buHIHBo4bqnbiB0csSDbSBraW0gY8awxqFuZyBjw6BuZyDDrXQuDQoNCi0gQ2jhuqV0IGzGsOG7o25nIGPhuq90IEZhaXIgY8OzIHThu7cgbOG7hyBwaOG6p24gdHLEg20gdGjhuqVwIG5o4bqldDogQ2jhuqV0IGzGsOG7o25nIGPhuq90IEZhaXIgY8OzIHRo4buDIOG6o25oIGjGsOG7n25nIMSR4bq/biB24bq7IMSR4bq5cCB2w6AgZ2nDoSB0cuG7iyBj4bunYSBraW0gY8awxqFuZywgZOG6q24gxJHhur9uIHThu7cgbOG7hyBwaOG6p24gdHLEg20gdGjhuqVwLCBjaOG7iSBjaGnhur9tIDMlIHRyb25nIHThu5VuZyBz4buRIGtpbSBjxrDGoW5nLg0KDQojIC4gUGjDom4gdMOtY2ggxJHhu5MgdGjhu4sgdOG7tyBs4buHIHBo4bqnbiB0csSDbSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYw0KDQrEkMOieSBsw6AgxJHhu5MgdGjhu4sgQmFyIGNoYXJ0IHRo4buDIGhp4buHbiB04bu3IGzhu4cgcGjhuqduIHRyxINtIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbcOgdSBz4bqvYyAoRCwgRSwgRiwgRywgSCwgSSwgSikuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIGdncGxvdChhZXMoY29sb3IsbikpICsgZ2VvbV9jb2woZmlsbD0nZ3JlZW4nKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KG4vbGVuZ3RoKHRtcCRjYXJhdCkpKSx2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpICsgbGFicyh4ID0gJ03DoHUgc+G6r2MnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArIGxhYnModGl0bGUgPSAixJDhu5MgdGjhu4sgdOG7tyBs4buHIHBo4bqnbiB0csSDbSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYyIpDQpgYGANCg0KROG7sWEgdHLDqm4gxJHhu5MgdGjhu4ssIHRhIGPDsyB0aOG7gyBuaOG6rW4geMOpdCBt4buZdCBz4buRIMSRaeG7g20gc2F1Og0KDQotIFThu7cgbOG7hyBwaOG6p24gdHLEg20ga2ltIGPGsMahbmcgbcOgdSBHIGNhbyBuaOG6pXQ6IGNoaeG6v20gMjAsOTMlIHRyb25nIHThu5VuZyBz4buRIGtpbSBjxrDGoW5nLg0KDQotIE5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgbcOgdSBKIGPDsyB04bu3IGzhu4cgcGjhuqduIHRyxINtIHRo4bqlcCBuaOG6pXQ6IENo4buJIGNoaeG6v20gNSwyMSUgdHJvbmcgdOG7lW5nIHPhu5EgdmnDqm4ga2ltIGPGsMahbmcuDQoNCiMgLiBQaMOibiB0w61jaCDEkeG7kyB0aOG7iyB04bu3IGzhu4cgcGjhuqduIHRyxINtIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QNCg0KxJDDonkgbMOgIMSR4buTIHRo4buLIEJhciBjaGFydCB0aOG7gyBoaeG7h24gdOG7tyBs4buHIHBo4bqnbiB0csSDbSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCAoSUYsIFZWUzEsIFZWUzIsIFZTMSwgVlMyLCBTSTEsIFNJMiwgSTEpDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUgZ2dwbG90KGFlcyhjbGFyaXR5LG4pKSArIGdlb21fY29sKGZpbGw9J2dyZWVuJykgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aCh0bXAkY2FyYXQpKSksdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArIGxhYnMoeCA9ICfEkOG7mSB0aW5oIGtoaeG6v3QnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArIGxhYnModGl0bGUgPSAixJDhu5MgdGjhu4sgdOG7tyBs4buHIHBo4bqnbiB0csSDbSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdGluaCBraGnhur90IikNCmBgYA0KDQpE4buxYSB0csOqbiDEkeG7kyB0aOG7iywgdGEgY8OzIHRo4buDIG5o4bqtbiB4w6l0IG3hu5l0IHPhu5EgxJFp4buDbSBzYXU6DQoNCi0gVOG7tyBs4buHIHBo4bqnbiB0csSDbSBraW0gY8awxqFuZyBTSTIsU0kxLFZTMiBjYW86IENoaeG6v20gZ+G6p24gNjQlIHRyb25nIHThu5VuZyBz4buRIGtpbSBjxrDGoW5nLCB0cm9uZyDEkcOzIGNhbyBuaOG6pXQgbMOgIFNJMSwgY2hp4bq/bSAyNCwyJSwgdGnhur9wIMSR4bq/biBsw6AgVlMyLCBjaGnhur9tIDIyLDclIHbDoCBTSTIsIGNoaeG6v20gMTclLiBUaOG6pXAgbmjhuqV0IGzDoCBJMSwgY2hp4bq/bSAxLDQlIHRyb25nIHThu5VuZyBz4buRIGtpbSBjxrDGoW5nLg0KDQotIFThu7cgbOG7hyBwaOG6p24gdHLEg20ga2ltIGPGsMahbmcgZ2nhuqNtIGThuqduIHThu6sgU0kyIMSR4bq/biBJRi4NCg0KLSBOaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyDEkeG7mSB0aW5oIGtoaeG6v3QgbMOgIFNJMSBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0ICgyNCwyJSksIGNobyB0aOG6pXkgxJHhu5kgdGluaCBraGnhur90IGPhu6dhIG7DsyBsw6AgcuG6pXQgdGjhuqVwLCB0aeG6v3AgxJHhur9uIGzDoCBWUzIgKDIyLDclKSBjw7MgxJHhu5kgdGluaCBraGnhur90IHRo4bqlcC4NCg0KLSBOaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyDEkeG7mSB0aW5oIGtoaeG6v3QgbMOgIEkxIGNoaeG6v20gdOG7tyBs4buHIHRo4bqlcCBuaOG6pXQgKDEsNCUpLCBjaG8gdGjhuqV5IMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBuw7MgbMOgIHLhuqV0IGNhbywgdGnhur9wIMSR4bq/biBsw6AgSUYgY8OzIMSR4buZIHRpbmgga2hp4bq/dCBjYW8gKDMsMyUpLCBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsm4gbOG6oWkgY8OzIMSR4buZIHRpbmgga2hp4bq/dCB0cnVuZyBiw6xuaC4NCg0KIyAuIFBow6JuIHTDrWNoIMSR4buTIHRo4buLIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBjaOG6pXQgbMaw4bujbmcgdsOgIG3DoHUgc+G6r2MNCg0KxJDDonkgbMOgIMSR4buTIHRo4buLIEJhciBjaGFydCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBt4bupYyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgKElkZWFsLCBQcmVtaXVtLCBWZXJ5IEdvb2QsIEdvb2QsIEZhaXIpIHbDoCBtw6B1IHPhuq9jIChELCBFLCBGLCBHLCBILCBJLCBKKS4NCg0KDQpgYGB7cn0NCnRtcCA8LSBkaWFtb25kcw0KdG1wICU+JSBncm91cF9ieShjdXQsY29sb3IpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQseSA9IG4pKSArIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKyBmYWNldF93cmFwKH5jb2xvcikgKyBsYWJzKHggPSAnQ2jhuqV0IGzGsOG7o25nJywgeSA9ICdT4buRIGzGsOG7o25nJykgKyBsYWJzKHRpdGxlID0gIsSQ4buTIHRo4buLIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBjaOG6pXQgbMaw4bujbmcgdsOgIG3DoHUgc+G6r2MiKQ0KDQojZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKTpUaMOqbSBs4bubcCBow6xuaCBjaOG7ryBuaOG6rXQgKGdlb21fY29sKSB24bubaSB24buLIHRyw60gZG9kZ2UgZ2nDunAgY8OhYyB0aGFuaCBraMO0bmcgY2jhu5NuZyBsw6puIG5oYXUNCg0KI2ZhY2V0X3dyYXAofmNvbG9yKTpDaGlhIGJp4buDdSDEkeG7kyB0aMOgbmggY8OhYyBwaMOibiB0cmFuZyB0aGVvIGJp4bq/biBjb2xvcg0KYGBgDQoNCkThu7FhIHRyw6puIMSR4buTIHRo4buLLCB0YSBjw7MgdGjhu4Mgbmjhuq1uIHjDqXQgbeG7mXQgc+G7kSDEkWnhu4NtIHNhdToNCg0KLSDhu54gdOG6pXQgY+G6oyBjw6FjIG5ow7NtIG3DoHUsIHPhu5EgbMaw4bujbmcgZ2nhuqNtIGThuqduIHRoZW8gY2jhuqV0IGzGsOG7o25nIGPhuq90IGPhu6dhIGtpbSBjxrDGoW5nICh04burIElkZWFsIMSR4bq/biBGYWlyKS4NCg0KLSBOaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgbMOgIElkZWFsIHBo4buVIGJp4bq/biBuaOG6pXQsIEZhaXIgaGnhur9uIGhvaSBuaOG6pXQ6IEjhuqd1IGjhur90IGPDoWMgbmjDs20gbcOgdSBz4bqvYyDEkeG7gXUgY8OzIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgY8OzIGNo4bqldCBsxrDhu6NuZyBJZGVhbCBjYW8gbmjhuqV0IHbDoCBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgRmFpciB0aOG6pXAgbmjhuqV0Lg0KDQotIFPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgxJHhuqF0IGNo4bqldCBsxrDhu6NuZyBJZGVhbCB0aHXhu5ljIG5ow7NtIG3DoHUgRyBsw6Agbmhp4buBdSBuaOG6pXQgKGtob+G6o25nIDUuMDAwIHZpw6puKSwgdGnhur9wIMSR4bq/biBsw6Ag4bufIG5ow7NtIG3DoHUgRSAoa2hv4bqjbmcgNC4wMDAgdmnDqm4pIHbDoCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIMSR4bqhdCBjaOG6pXQgbMaw4bujbmcgRmFpciB0aHXhu5ljIG5ow7NtIG3DoHUgRyBsw6Agbmhp4buBdSBuaOG6pXQgKGtob+G6o25nIDMwMCB2acOqbikuDQoNCkPDsyBz4buxIGtow6FjIGJp4buHdCDEkcOhbmcga+G7gyB24buBIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgZ2nhu69hIGPDoWMgbmjDs20gbcOgdSBz4bqvYyB2w6AgY2jhuqV0IGzGsOG7o25nIGPhuq90LiBRdWEgY8OhYyDEkeG7kyB0aOG7iyB0csOqbiwgdGEgY8OzIHRo4buDIG5o4bqtbiB0aOG6pXkgY8O0bmcgbmdo4buHIGPhuq90IGfhu410IGtpbSBjxrDGoW5nIOG7nyDEkcOieSBraMOhIGzDoCB0acOqbiB0aeG6v24gdsOgIGhp4buHbiDEkeG6oWksIMSRYSBz4buRIG5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgxJHGsOG7o2MgdGFvIHJhIMSR4buBdSDEkeG6oXQgY2jhuqV0IGzGsOG7o25nIHThu6sgdOG7kXQgdHLhu58gbMOqbiB2w6AgY2jhu4kgY8OzIDEgbMaw4bujbmcgw610IHZpw6puIGtpbSBjxrDGoW5nIGzhu5dpLg0KDQojIC4gUGjDom4gdMOtY2ggc+G7kSBsxrDhu6NuZyB24buBIGNo4bqldCBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIG3DoHUgRA0KDQrEkMOhbmggZ2nDoSBnacOhIHRy4buLIGtpbSBjxrDGoW5nOiBHacO6cCBuZ8aw4budaSBtdWEga2ltIGPGsMahbmcgaGnhu4N1IHLDtSBoxqFuIHbhu4EgbeG7kWkgbGnDqm4gaOG7hyBnaeG7r2EgY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBnacOhIGLDoW4gdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgbcOgdSBELiBDdW5nIGPhuqVwIHRow7RuZyB0aW4gxJHhu4Mgc28gc8OhbmggZ2nDoSBiw6FuIGPhu6dhIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgY8OzIGNo4bqldCBsxrDhu6NuZyBj4bqvdCBraMOhYyBuaGF1LiBI4buXIHRy4bujIG5nxrDhu51pIG11YSDEkcawYSByYSBxdXnhur90IMSR4buLbmggc8Ohbmcgc3Xhu5F0IGtoaSBs4buxYSBjaOG7jW4ga2ltIGPGsMahbmcgcGjDuSBo4bujcCB24bubaSBuaHUgY+G6p3UgdsOgIG5nw6JuIHPDoWNoLg0KDQpI4buXIHRy4bujIMSR4buLbmggZ2nDoSBraW0gY8awxqFuZzogQ3VuZyBj4bqlcCBk4buvIGxp4buHdSB0aGFtIGto4bqjbyBjaG8gY8OhYyBuaMOgIGtpbSBob8OgbiB2w6AgY2h1ecOqbiBnaWEgxJHhu4tuaCBnacOhIGtpbSBjxrDGoW5nLiBHacO6cCB4w6FjIMSR4buLbmggZ2nDoSB0cuG7iyBo4bujcCBsw70gY+G7p2Ega2ltIGPGsMahbmcgZOG7sWEgdHLDqm4gY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBtw6B1IHPhuq9jLiBI4bqhbiBjaOG6vyB0w6xuaCB0cuG6oW5nIG11YSBiw6FuIGtpbSBjxrDGoW5nIHbhu5tpIGdpw6EgY2FvIGjGoW4gZ2nDoSB0cuG7iyB0aOG7sWMuDQoNCk5naGnDqm4gY+G7qXUgdGjhu4sgdHLGsOG7nW5nIGtpbSBjxrDGoW5nOiBQaMOibiB0w61jaCB4dSBoxrDhu5tuZyBnacOhIGLDoW4gY+G7p2Ega2ltIGPGsMahbmcgdGhlbyB0aOG7nWkgZ2lhbi4gU28gc8OhbmggZ2nDoSBiw6FuIGPhu6dhIGtpbSBjxrDGoW5nIOG7nyBjw6FjIGtodSB24buxYyBraMOhYyBuaGF1LiDEkMOhbmggZ2nDoSDhuqNuaCBoxrDhu59uZyBj4bunYSBjw6FjIHnhur91IHThu5Ega2jDoWMgbmjGsCBrw61jaCB0aMaw4bubYywgxJHhu5kgdGluaCBraGnhur90LCB2LnYuIMSR4bq/biBnacOhIGLDoW4gY+G7p2Ega2ltIGPGsMahbmcuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCA8LSB0bXAgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCnRtcCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsgZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdEJyksIGZpbGwgPSAnZGFya2dyZWVuJykrbGFicyh4PSJDaOG6pXQgbMaw4bujbmciLHk9IlPhu5EgbMaw4bujbmciKSArIGxhYnMoIHRpdGxlID0gIiDEkOG7kyB0aOG7iyBjaOG6pXQgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyBtw6B1IEQiKQ0KYGBgDQoNCg0KDQojIC4gUGjDom4gdMOtY2ggxJHhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIGNo4bqldCBsxrDhu6NuZyB2w6AgbcOgdSBz4bqvYw0KDQrEkMOieSBsw6AgxJHhu5MgdGjhu4sgQmFyIGNoYXJ0IGJp4buDdSB0aOG7iyBjaGkgdGnhur90LCBj4bulIHRo4buDIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgY2jhuqV0IGzGsOG7o25nIChJZGVhbCwgUHJlbWl1bSwgVmVyeSBHb29kLCBHb29kLCBGYWlyKSB2w6AgTcOgdSBz4bqvYyAoRCwgRSwgRiwgRywgSCwgSSwgSikuIOG7niDEkeG7kyB0aOG7iyBuw6B5IHRhIGPDsyB0aOG7gyBwaMOibiB0w61jaCBj4bulIHRo4buDIHbDoCBjaMOtbmggeMOhYyBjw6FjIHPhu5EgbGnhu4d1IGjGoW4uDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCAlPiUgZ3JvdXBfYnkoY3V0LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LHkgPSBuKSkgKyBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsgZmFjZXRfd3JhcCh+Y29sb3IpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMCwgY29sb3IgPSAnZ3JlZW4nKSArIGxhYnMoeCA9ICdDaOG6pXQgbMaw4bujbmcnLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArIGxhYnModGl0bGUgPSAixJDhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIGNo4bqldCBsxrDhu6NuZyB2w6AgbcOgdSBz4bqvYyIpDQoNCiNnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpOlRow6ptIGzhu5twIGjDrG5oIGNo4buvIG5o4bqtdCAoZ2VvbV9jb2wpIHbhu5tpIHbhu4sgdHLDrSBkb2RnZSBnacO6cCBjw6FjIHRoYW5oIGtow7RuZyBjaOG7k25nIGzDqm4gbmhhdS4NCiNmYWNldF93cmFwKH5jb2xvcik6Q2hpYSBiaeG7g3UgxJHhu5MgdGjDoG5oIGPDoWMgcGjDom4gdHJhbmcgdGhlbyBiaeG6v24gY29sb3INCmBgYA0KDQpE4buxYSB0csOqbiBjw6FjIMSR4buTIHRo4buLLCB0YSBjw7MgdGjhu4Mgbmjhuq1uIHjDqXQgbeG7mXQgc+G7kSDEkWnhu4NtIHNhdToNCg0KLSBDaOG6pXQgbMaw4bujbmcgY+G6r3QgSWRlYWwgcGjhu5UgYmnhur9uIG5o4bqldDogSOG6p3UgaOG6v3QgY8OhYyBuaMOzbSBtw6B1IHPhuq9jIMSR4buBdSBjw7Mgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBjw7MgY2jhuqV0IGzGsOG7o25nIGzDoCBJZGVhbCBsw6AgY2FvIG5o4bqldC4NCg0KLSBT4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHTEg25nIGThuqduIHRoZW8gY2jhuqV0IGzGsOG7o25nIGPhuq90OiBU4burIEZhaXIgxJHhur9uIElkZWFsLCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHTEg25nIGThuqduLg0KDQotIOG7niBuaMOzbSBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIG3DoHUgRywgdOG7tyBs4buHIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgbMOgIElkZWFsIGNhbyBuaOG6pXQgKDQuNDg0IHZpw6puKSwgY2FvIGjGoW4gc28gduG7m2kgY8OhYyBuaMOzbSBtw6B1IGtow6FjIHbDoCBz4buRIGzGsOG7o25nIGfhuqVwIDE1LDU1IGzhuqduIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgbcOgdSBHIGPDsyBjaOG6pXQgbMaw4bujbmcgbMOgIEZhaXIuDQoNCiMgLiBQaMOibiB0w61jaCDEkeG7kyB0aOG7iyB0aOG7gyBoaeG7h24ga2jhu5FpIGzGsOG7o25nIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIHRoZW8gY2jhuqV0IGzGsOG7o25nDQoNCkto4buRaSBsxrDhu6NuZyAoY2FyYXQpIGzDoCBt4buZdCB0cm9uZyBuaOG7r25nIHnhur91IHThu5EgcXVhbiB0cuG7jW5nIHF1eeG6v3QgxJHhu4tuaCBnacOhIHRy4buLIGPhu6dhIGtpbSBjxrDGoW5nLiBWaeG7h2MgcGjDom4gdMOtY2ggbsOgeSBnacO6cCB0YSBzbyBzw6FuaCBraOG7kWkgbMaw4bujbmcgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyB04burbmcgY+G6pXAgY2jhuqV0IGzGsOG7o25nLCB04burIMSRw7MgxJHDoW5oIGdpw6EgZ2nDoSB0cuG7iyB0xrDGoW5nIMSR4buRaSBj4bunYSBjaMO6bmcuDQoNCsSQ4buRaSB24bubaSBraMOhY2ggaMOgbmc6IEhp4buDdSByw7UgaMahbiB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBraOG7kWkgbMaw4bujbmcgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcuIFNvIHPDoW5oIGto4buRaSBsxrDhu6NuZyB0cnVuZyBiw6xuaCBnaeG7r2EgY8OhYyBt4bupYyBjaOG6pXQgbMaw4bujbmcgY+G6r3Qga2jDoWMgbmhhdS4gTOG7sWEgY2jhu41uIGtpbSBjxrDGoW5nIHRow7RuZyBtaW5oIGjGoW4gZOG7sWEgdHLDqm4gbmh1IGPhuqd1IHbDoCBuZ8OibiBzw6FjaC4NCg0KxJDhu5FpIHbhu5tpIG5nxrDhu51pIGLDoW46IEN1bmcgY+G6pXAgdGjDtG5nIHRpbiBjaGkgdGnhur90IGNobyBraMOhY2ggaMOgbmcgduG7gSBnacOhIHRy4buLIGPhu6dhIGtpbSBjxrDGoW5nIHbDoCDEkeG7i25oIGdpw6Ega2ltIGPGsMahbmcgY2jDrW5oIHjDoWMgaMahbi4NCg0KxJDhu5FpIHbhu5tpIG5nw6BuaCBjw7RuZyBuZ2hp4buHcCBraW0gY8awxqFuZzogTsOibmcgY2FvIGhp4buDdSBiaeG6v3QgduG7gSBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGdpw6EgdHLhu4sga2ltIGPGsMahbmcsIHBow6F0IHRyaeG7g24gY8OhYyB0acOqdSBjaHXhuqluIHbDoCBxdXkgxJHhu4tuaCBjaG8gbmfDoG5oIGtpbSBjxrDGoW5nLCB0aMO6YyDEkeG6qXkgc+G7sSBwaMOhdCB0cmnhu4NuIGLhu4FuIHbhu69uZyBj4bunYSBuZ8Ogbmgga2ltIGPGsMahbmcuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCAlPiUgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKG09IG1lYW4oY2FyYXQpKSAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LHkgPSBtKSkgKyBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sMikpLCB2anVzdCA9IDIsIGNvbG9yID0gJ2dyZWVuJykgKyBsYWJzKHggPSAnQ2jhuqV0IGzGsOG7o25nJywgeSA9ICdUcnVuZyBiw6xuaCcpICsgbGFicyh0aXRsZSA9ICLEkOG7kyB0aOG7iyBraOG7kWkgbMaw4bujbmcgdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBjaOG6pXQgbMaw4bujbmciKQ0KDQojVGjDqm0gbOG7m3AgaMOsbmggY2jhu68gbmjhuq10IChnZW9tX2NvbCkgduG7m2kgduG7iyB0csOtIGRvZGdlIGdpw7pwIGPDoWMgdGhhbmgga2jDtG5nIGNo4buTbmcgbMOqbiBuaGF1Lg0KI1Row6ptIGNow7ogdGjDrWNoIChnZW9tX3RleHQpIGhp4buDbiB0aOG7iyBnacOhIHRy4buLIHRydW5nIGLDrG5oIChtKSDEkcaw4bujYyBsw6BtIHRyw7JuIMSR4bq/biAyIGNo4buvIHPhu5EgdGjhuq1wIHBow6JuLg0KYGBgDQoNCkJp4buDdSDEkeG7kyBuw6B5IHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGNo4bqldCBsxrDhu6NuZyBj4bqvdCAoY3V0KSB2w6AgdHJ1bmcgYsOsbmggY2FyYXQgKE1lYW4pIGPhu6dhIGtpbSBjxrDGoW5nIHRyb25nIHThuq1wIGThu68gbGnhu4d1IGRpYW1vbmRzLiBUcuG7pWMgeCBoaeG7g24gdGjhu4sgY8OhYyBt4bupYyBjaOG6pXQgbMaw4bujbmcgY+G6r3Qga2jDoWMgbmhhdSwgdHLhu6VjIHkgaGnhu4NuIHRo4buLIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY2FyYXQgY2hvIG3hu5dpIG3hu6ljIGNo4bqldCBsxrDhu6NuZyBj4bqvdC4NCg0KROG7sWEgdHLDqm4gxJHhu5MgdGjhu4ssIHRhIGPDsyB0aOG7gyBuaOG6rW4geMOpdCBt4buZdCBz4buRIMSRaeG7g20gc2F1Og0KDQotIE5ow6xuIGNodW5nLCB0cnVuZyBiw6xuaCBjYXJhdCBjw7MgeHUgaMaw4bubbmcgZ2nhuqNtIGtoaSBjaOG6pXQgbMaw4bujbmcgY+G6r3QgY2FvIGjGoW4uDQoNCi0gTmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBjw7MgY2jhuqV0IGzGsOG7o25nIEZhaXIgY8OzIGto4buRaSBsxrDhu6NuZyB0cnVuZyBiw6xuaCBjYW8gbmjhuqV0IDEuMDUgY2FyYXQgdsOgIG5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgY8OzIGNo4bqldCBsxrDhu6NuZyBsw6AgSWRlYWwgY8OzIGto4buRaSBsxrDhu6NuZyB0cnVuZyBiw6xuaCBuaOG7jyBuaOG6pXQgbMOgIDAuNyBjYXJhdCwgR29vZCAwLjg1IGNhcmF0LCBWZXJ5IEdvb2QgMC44MSBjYXJhdCB2w6AgUHJlbWl1bSAwLjg5IGNhcmF0Lg0KDQpU4burIMSR4buTIHRo4buLIG7DoHkgY2hvIHRo4bqleSBy4bqxbmcgY2jhuqV0IGzGsOG7o25nIGPhuq90IGPDsyDhuqNuaCBoxrDhu59uZyDEkcOhbmcga+G7gyDEkeG6v24gdHJ1bmcgYsOsbmggY2FyYXQgY+G7p2Ega2ltIGPGsMahbmcuIEtpbSBjxrDGoW5nIGPDsyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgY8OgbmcgY2FvIHRow6wgc+G6vSBjw7MgeHUgaMaw4bubbmcgdHJ1bmcgYsOsbmggY2FyYXQgY8Ogbmcgbmjhu48gaMahbi4gTmdvw6BpIHJhIHRow6wgYmnhur9uIMSR4buZbmcgY+G7p2EgdHJ1bmcgYsOsbmggY2FyYXQgY8OzIHRo4buDIGRvIG5oaeG7gXUgeeG6v3UgdOG7kSBraMOhYyBuaGF1LCBjaOG6s25nIGjhuqFuIG5oxrAgbmd14buTbiBn4buRYyBraW0gY8awxqFuZywgcGjGsMahbmcgcGjDoXAgY+G6r3QgdsOgIGvhu7kgdGh14bqtdCDEkcOhbmggZ2nDoS4NCg0KIyAuIFBow6JuIHTDrWNoIOG6o25oIGjGsOG7n25nIGPhu6dhIG3DoHUgc+G6r2MgxJHhur9uIHRydW5nIGLDrG5oIGNhcmF0DQoNClZp4buHYyBwaMOibiB0w61jaCBuw6B5IGdpw7pwIHRhOg0KDQotIMSQw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyBj4bunYSBraW0gY8awxqFuZzogTcOgdSBz4bqvYyBsw6AgbeG7mXQgdHJvbmcgbmjhu69uZyB54bq/dSB04buRIHF1YW4gdHLhu41uZyBxdXnhur90IMSR4buLbmggY2jhuqV0IGzGsOG7o25nIGPhu6dhIGtpbSBjxrDGoW5nLiBWaeG7h2MgcGjDom4gdMOtY2gg4bqjbmggaMaw4bufbmcgY+G7p2EgbcOgdSBz4bqvYyDEkeG6v24gdHJ1bmcgYsOsbmggY2FyYXQgY8OzIHRo4buDIGdpw7pwIMSRw6FuaCBnacOhIGNo4bqldCBsxrDhu6NuZyBj4bunYSBraW0gY8awxqFuZyBt4buZdCBjw6FjaCBjaMOtbmggeMOhYyBoxqFuLg0KDQotIFjDoWMgxJHhu4tuaCBnacOhIHRy4buLIGPhu6dhIGtpbSBjxrDGoW5nOiBNw6B1IHPhuq9jIOG6o25oIGjGsOG7n25nIMSR4bq/biBnacOhIHRy4buLIGPhu6dhIGtpbSBjxrDGoW5nLiBWaeG7h2MgcGjDom4gdMOtY2gg4bqjbmggaMaw4bufbmcgY+G7p2EgbcOgdSBz4bqvYyDEkeG6v24gdHJ1bmcgYsOsbmggY2FyYXQgY8OzIHRo4buDIGdpw7pwIHjDoWMgxJHhu4tuaCBnacOhIHRy4buLIGPhu6dhIGtpbSBjxrDGoW5nIG3hu5l0IGPDoWNoIGNow61uaCB4w6FjIGjGoW4uDQoNCi0gQ+G6o2kgdGhp4buHbiBxdXkgdHLDrG5oIGPhuq90IGtpbSBjxrDGoW5nOiBWaeG7h2MgcGjDom4gdMOtY2gg4bqjbmggaMaw4bufbmcgY+G7p2EgbcOgdSBz4bqvYyDEkeG6v24gdHJ1bmcgYsOsbmggY2FyYXQgY8OzIHRo4buDIGdpw7pwIGPhuqNpIHRoaeG7h24gcXV5IHRyw6xuaCBj4bqvdCBraW0gY8awxqFuZyDEkeG7gyB04buRaSDEkWEgaMOzYSBnacOhIHRy4buLIGPhu6dhIGtpbSBjxrDGoW5nLg0KDQoNCmBgYHtyfQ0KdG1wIDwtIGRpYW1vbmRzDQp0bXAgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG09IG1lYW4oY2FyYXQpKSAlPiUgZ2dwbG90KGFlcyh4ID0gY29sb3IseSA9IG0pKSArIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKSArIGxhYnMoeCA9ICdNw6B1IHPhuq9jJywgeSA9ICdUcnVuZyBiw6xuaCcpICsgbGFicyh0aXRsZSA9ICJN4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3DoHUgc+G6r2MgdsOgIHRydW5nIGLDrG5oIGNhcmF0IGPhu6dhIGtpbSBjxrDGoW5nIikNCg0KI3RtcCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobSA9IG1lYW4oY2FyYXQpKToNCg0KIyNOaMOzbSBk4buvIGxp4buHdSB0aGVvIG3DoHUgc+G6r2MgKGNvbG9yKS4NCiMjVMOtbmggdG/DoW4gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBjYXJhdCAobSkgY2hvIG3hu5dpIG5ow7NtIG3DoHUuDQoNCiNnZ3Bsb3QoYWVzKHggPSBjb2xvciwgeSA9IG0pKTpLaOG7n2kgdOG6oW8gYmnhu4N1IMSR4buTIGdncGxvdDIgduG7m2kgdHLhu6VjIGhvw6BuaCAoeCkgdGjhu4MgaGnhu4duIG3DoHUgc+G6r2MgdsOgIHRy4bulYyB0dW5nICh5KSB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBjYXJhdCAobSkuDQoNCiNnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpOiBUaMOqbSBjw6FjIGPhu5l0IHbDoG8gYmnhu4N1IMSR4buTLCBz4butIGThu6VuZyB24buLIHRyw60gZG9kZ2UgxJHhu4MgdHLDoW5oIGNo4buTbmcgY2jDqW8gY8OhYyBj4buZdCBraGkgY8OzIG5oaeG7gXUgbmjDs20gbcOgdS4NCg0KI2dlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLCAyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKTogVGjDqm0gbmjDo24gdsSDbiBi4bqjbiB2w6BvIGPDoWMgY+G7mXQsIGhp4buDbiB0aOG7iyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGNhcmF0IMSRxrDhu6NjIGzDoG0gdHLDsm4gxJHhur9uIDIgY2jhu68gc+G7kSB0aOG6rXAgcGjDom4gKHJvdW5kKG0sIDIpKSwgZOG7i2NoIGNodXnhu4NuIGzDqm4gbeG7mXQgY2jDunQgKHZqdXN0ID0gMikgdsOgIMSR4bq3dCBtw6B1IHRy4bqvbmcgKGNvbG9yID0gJ3doaXRlJykuDQoNCiNsYWJzKHggPSAnTcOgdSBz4bqvYycsIHkgPSAnVHJ1bmcgYsOsbmgnKTogVGjDqm0gbmjDo24gY2hvIHRy4bulYyBob8OgbmggKHgpIGzDoCAiTcOgdSBz4bqvYyIgdsOgIHRy4bulYyB0dW5nICh5KSBsw6AgIlRydW5nIGLDrG5oIi4NCg0KI2xhYnMoY2FwdGlvbiA9ICJN4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3DoHUgc+G6r2MgdsOgIHRydW5nIGLDrG5oIGNhcmF0IGPhu6dhIGtpbSBjxrDGoW5nIik6IFRow6ptIGNow7ogdGjDrWNoIGNobyDEkeG7kyB0aOG7iyBsw6AgIk3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbcOgdSBz4bqvYyB2w6AgdHJ1bmcgYsOsbmggY2FyYXQgY+G7p2Ega2ltIGPGsMahbmciLg0KYGBgDQoNCkJp4buDdSDEkeG7kyBuw6B5IHRo4buDIGhp4buHbiBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3DoHUgc+G6r2MgKGNvbG9yKSB2w6AgdHJ1bmcgYsOsbmggY2FyYXQgKE1lYW4pIGPhu6dhIGtpbSBjxrDGoW5nIHRyb25nIHThuq1wIGThu68gbGnhu4d1IGRpYW1vbmRzLiBUcuG7pWMgeCBoaeG7g24gdGjhu4sgY8OhYyBtw6B1IHPhuq9jIGtow6FjIG5oYXUsIHRy4bulYyB5IGhp4buDbiB0aOG7iyBnacOhIHRy4buLIHRydW5nIGLDrG5oIGNhcmF0IGNobyBt4buXaSBtw6B1IHPhuq9jLg0KDQpE4buxYSB0csOqbiDEkeG7kyB0aOG7iywgdGEgY8OzIHRo4buDIG5o4bqtbiB4w6l0IG3hu5l0IHPhu5EgxJFp4buDbSBzYXU6DQoNCi0gbmjDrG4gY2h1bmcsIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY2FyYXQgZGFvIMSR4buZbmcgdHJvbmcgY8OhYyBuaMOzbSBtw6B1IHPhuq9jIGtow6FjIG5oYXUuDQoNCi0gS2jhu5FpIGzGsOG7o25nIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIHTEg25nIGThuqduIHRoZW8gbmjDs20gbcOgdSBz4bqvYyB04burIEQgxJHhur9uIEosIHTEg25nIHThu6sgMC42NiBjYXJhdCDEkeG6v24gMS4xNiBjYXJhdC4NCg0KLSBT4buxIGtow6FjIGJp4buHdCB24buBIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggY2FyYXQgZ2nhu69hIGPDoWMgbmjDs20ga2jDtG5nIHF1w6EgbOG7m24uIE5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgdGh14buZYyBuaMOzbSBtw6B1IEQgY8OzIGto4buRaSBsxrDhu6NuZyB0cnVuZyBiw6xuaCB0aOG6pXAgbmjhuqV0ICgwLjY2IGNhcmF0KSwgbmjhu69uZyB2acOqbiB0aHXhu5ljIG5ow7NtIG3DoHUgSiBjw7Mga2jhu5FpIGzGsOG7o25nIHRydW5nIGLDrG5oIGNhbyBuaOG6pXQgKDEuMTYgY2FyYXQpDQoNCiMgLiBQaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyB2w6AgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBraOG7kWkgbMaw4bujbmcuDQoNClZp4buHYyBwaMOibiB0w61jaCBuw6B5IGPDsyB0aOG7gyBtYW5nIGzhuqFpIG5oaeG7gXUgbOG7o2kgw61jaCBjaG8gY8OhYyBiw6puIGxpw6puIHF1YW4gdHJvbmcgbmfDoG5oIGtpbSBjxrDGoW5nLCBiYW8gZ+G7k206DQoNCi0gxJDDoW5oIGdpw6EgZ2nDoSB0cuG7iyBraW0gY8awxqFuZzogR2nDunAgbmfGsOG7nWkgbXVhIHbDoCBuZ8aw4budaSBiw6FuIGtpbSBjxrDGoW5nIGhp4buDdSByw7UgaMahbiB24buBIOG6o25oIGjGsOG7n25nIGPhu6dhIMSR4buZIHRpbmgga2hp4bq/dCDEkeG6v24gZ2nDoSB0cuG7iyBj4bunYSB2acOqbiBraW0gY8awxqFuZy4gROG7sWEgdsOgbyB0aMO0bmcgdGluIG7DoHksIG5nxrDhu51pIG11YSBjw7MgdGjhu4MgxJHGsGEgcmEgcXV54bq/dCDEkeG7i25oIHPDoW5nIHN14buRdCBoxqFuIGtoaSBs4buxYSBjaOG7jW4ga2ltIGPGsMahbmcgcGjDuSBo4bujcCB24bubaSBuaHUgY+G6p3UgdsOgIG5nw6JuIHPDoWNoIGPhu6dhIGjhu40uIE5nxrDhu51pIGLDoW4gY8OzIHRo4buDIMSR4buLbmggZ2nDoSBraW0gY8awxqFuZyBjaMOtbmggeMOhYyBoxqFuLCDEkeG6o20gYuG6o28gbOG7o2kgbmh14bqtbiB2w6Agc+G7sSBow6BpIGzDsm5nIGPhu6dhIGtow6FjaCBow6BuZy4gSOG7lyB0cuG7oyBwaMOibiBsb+G6oWkga2ltIGPGsMahbmc6IEdpw7pwIHRoaeG6v3QgbOG6rXAgdGnDqnUgY2h14bqpbiBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgZOG7sWEgdHLDqm4gxJHhu5kgdGluaCBraGnhur90IHbDoCBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIGto4buRaSBsxrDhu6NuZy4gxJBp4buBdSBuw6B5IGdpw7pwIMSRxqFuIGdp4bqjbiBow7NhIHF1w6EgdHLDrG5oIHBow6JuIGxv4bqhaSwgxJHhuqNtIGLhuqNvIHTDrW5oIG5o4bqldCBxdcOhbiB2w6AgbWluaCBi4bqhY2ggdHJvbmcgbmfDoG5oIGtpbSBjxrDGoW5nLg0KDQotIE5naGnDqm4gY+G7qXUgdGjhu4sgdHLGsOG7nW5nOiBQaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgbsOgeSBjdW5nIGPhuqVwIHRow7RuZyB0aW4gcXVhbiB0cuG7jW5nIHbhu4EgeHUgaMaw4bubbmcgdGjhu4sgdHLGsOG7nW5nIGtpbSBjxrDGoW5nLiBDw6FjIG5ow6AgbmdoacOqbiBj4bupdSwgbmjDoCDEkeG6p3UgdMawIHbDoCBkb2FuaCBuZ2hp4buHcCBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgdGjDtG5nIHRpbiBuw6B5IMSR4buDIMSRxrBhIHJhIGNoaeG6v24gbMaw4bujYyBraW5oIGRvYW5oIGhp4buHdSBxdeG6oy4NCg0KTmdvw6BpIHJhLCB2aeG7h2MgcGjDom4gdMOtY2ggbeG7kWkgcXVhbiBo4buHIG7DoHkgY8OybiBjw7MgdGjhu4MgZ2nDunA6IFNvIHPDoW5oIGdpw6EgdHLhu4sgY+G7p2EgY8OhYyBsb+G6oWkga2ltIGPGsMahbmcga2jDoWMgbmhhdSwgeMOhYyDEkeG7i25oIGdpw6EgdHLhu4sgY+G7p2Ega2ltIGPGsMahbmcgY8WpIGhv4bq3YyDEkcOjIHF1YSBz4butIGThu6VuZywgZOG7sSDEkW/DoW4gZ2nDoSB0cuG7iyBj4bunYSBraW0gY8awxqFuZyB0cm9uZyB0xrDGoW5nIGxhaS4NCg0KDQpgYGB7cn0NCnRtcCA8LSBkaWFtb25kcw0KdG1wICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG09IG1lYW4oY2FyYXQpKSAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSx5ID0gbSkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDIpKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpICsgbGFicyh4ID0gJ8SQ4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnTWVhbicpICsgbGFicyh0aXRsZSA9ICJN4buRaSBxdWFuIGjhu4cgZ2nhu69hIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyB2w6AgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBj4bunYSBraOG7kWkgbMaw4bujbmciKQ0KI3RtcCAlPiU6IEJp4buDdSBkaeG7hW4gdG/DoW4gdOG7rSDhu5FuZyAoJT4pIMSR4buDIHRo4buxYyBoaeG7h24gY2h14buXaSBjw6FjIHTDoWMgduG7pSB0csOqbiBk4buvIGxp4buHdSB0bXAuDQojZ3JvdXBfYnkoY2xhcml0eSk6IE5ow7NtIGThu68gbGnhu4d1IHRoZW8gdGh14buZYyB0w61uaCBjbGFyaXR5ICjEkeG7mSB0aW5oIGtoaeG6v3QpIGPhu6dhIGtpbSBjxrDGoW5nLg0KI3N1bW1hcmlzZShtID0gbWVhbihjYXJhdCkpOiBUw61uaCB0b8OhbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHRodeG7mWMgdMOtbmggY2FyYXQgKGto4buRaSBsxrDhu6NuZykgY2hvIG3hu5dpIG5ow7NtIGNsYXJpdHkgdsOgIGzGsHUgdHLhu68ga+G6v3QgcXXhuqMgdHJvbmcgYmnhur9uIG3hu5tpIG0uDQojZ2dwbG90KGFlcyh4ID0gY2xhcml0eSwgeSA9IG0pKTogS2jhu59pIHThuqFvIGJp4buDdSDEkeG7kyBi4bqxbmcgZ2dwbG90Miwgw6FuaCB44bqhIHRy4bulYyBob8OgbmggeCB24bubaSBjbGFyaXR5IHbDoCB0cuG7pWMgdHVuZyB5IHbhu5tpIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggbS4NCiNnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpOiBUaMOqbSBjw6FjIGPhu5l0IGjDrG5oIGNo4buvIG5o4bqtdCB2w6BvIGJp4buDdSDEkeG7kywgc+G7rSBk4bulbmcgduG7iyB0csOtIGRvZGdlIMSR4buDIHRyw6FuaCBjaOG7k25nIGNow6lvIGPDoWMgY+G7mXQga2hpIGPDsyBuaGnhu4F1IG5ow7NtIGNsYXJpdHkuDQojZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sIDIpKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpOiBUaMOqbSBuaMOjbiB2xINuIGLhuqNuIHbDoG8gY8OhYyBj4buZdCwgaGnhu4NuIHRo4buLIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggxJHGsOG7o2MgbMOgbSB0csOybiDEkeG6v24gMiBjaOG7ryBz4buRIHRo4bqtcCBwaMOibiAocm91bmQobSwgMikpLCBk4buLY2ggY2h1eeG7g24gbMOqbiBt4buZdCBjaMO6dCAodmp1c3QgPSAyKSB2w6AgxJHhurd0IG3DoHUgeGFuaCAoY29sb3IgPSAnZ3JlZW4nKS4NCiNsYWJzKHggPSAnTcOgdScsIHkgPSAnTWVhbicpOiBUaMOqbSBuaMOjbiBjaG8gdHLhu6VjIGhvw6BuaCAoeCkgbMOgICJNw6B1IiB2w6AgdHLhu6VjIHR1bmcgKHkpIGzDoCAiTWVhbiIgKGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmgpLg0KYGBgDQoNCkThu7FhIHbDoG8gxJHhu5MgdGjhu4sgdHLDqm4sIHRhIGPDsyB0aOG7gyBuaOG6rW4geMOpdCBt4buZdCBz4buRIMSRaeG7g20gc2F1Og0KDQotIEdpw6EgdHLhu4sgdHJ1bmcgYsOsbmgga2jhu5FpIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDsyB4dSBoxrDhu5tuZyBnaeG6o20ga2hpIMSR4buZIHRpbmgga2hp4bq/dCB0xINuZyB04burIEkxIMSR4bq/biBJRiAodOG7qyAxLjI4IGNhcmF0IHh14buRbmcgMC41MSBjYXJhdCkuDQoNCi0gTmjDs20ga2ltIGPGsMahbmcgY8OzIMSR4buZIHRpbmgga2hp4bq/dCBJMSBjw7MgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBraOG7kWkgbMaw4bujbmcgY2FvIG5o4bqldCAoMS4yOCBjYXJhdCkuIE5ow7NtIGtpbSBjxrDGoW5nIGPDsyDEkeG7mSB0aW5oIGtoaeG6v3QgSUYgY8OzIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmgga2jhu5FpIGzGsOG7o25nIHRo4bqlcCBuaOG6pXQgKDAuNTEgY2FyYXQpLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSBz4buxIGtow6FjIGJp4buHdCB24buBIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmgga2jhu5FpIGzGsOG7o25nIGdp4buvYSBjw6FjIG5ow7NtIGtow6EgbOG7m24uDQoNClTDs20gbOG6oWksIGJp4buDdSDEkeG7kyBj4buZdCBjaG8gdGjhuqV5IG3hu5FpIHF1YW4gaOG7hyB0acOqdSBj4buxYyBnaeG7r2EgxJHhu5kgdGluaCBraGnhur90IHbDoCBnacOhIHRy4buLIHRydW5nIGLDrG5oIGto4buRaSBsxrDhu6NuZyBraW0gY8awxqFuZy4gS2hpIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyBjw6BuZyB0xINuZywgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBraOG7kWkgbMaw4bujbmcgY2FyYXQgY+G7p2Ega2ltIGPGsMahbmcgY8OgbmcgZ2nhuqNtLiBN4bupYyDEkeG7mSB0xrDGoW5nIHF1YW4ga2jDoSBt4bqhbmguDQoNCiMgLiBQaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3DoHUgc+G6r2MgdsOgIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggZ2nDoSBiw6FuIGPhu6dhIGtpbSBjxrDGoW5nDQoNClZp4buHYyBwaMOibiB0w61jaCBuw6B5IGPDsyB0aOG7gyBtYW5nIGzhuqFpIG5oaeG7gXUgbOG7o2kgw61jaCBjaG8gY8OhYyBiw6puIGxpw6puIHF1YW4gbmjGsDoNCg0KLSBIaeG7g3UgcsO1IGjGoW4gduG7gSB0aOG7iyB0csaw4budbmcga2ltIGPGsMahbmc6IFBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBuw6B5IGdpw7pwIHjDoWMgxJHhu4tuaCBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSBtw6B1IHPhuq9jIMSR4bq/biBnacOhIHRy4buLIGPhu6dhIGtpbSBjxrDGoW5nLiBU4burIMSRw7MsIGPDsyB0aOG7gyBk4buxIMSRb8OhbiBnacOhIHRy4buLIGPhu6dhIGtpbSBjxrDGoW5nIGThu7FhIHRyw6puIG3DoHUgc+G6r2MgY+G7p2EgbsOzLg0KDQotIEjhu5cgdHLhu6Mgdmnhu4djIG11YSBiw6FuIGtpbSBjxrDGoW5nOiBOZ8aw4budaSBtdWEgY8OzIHRo4buDIGzhu7FhIGNo4buNbiBraW0gY8awxqFuZyBwaMO5IGjhu6NwIHbhu5tpIG5odSBj4bqndSB2w6AgbmfDom4gc8OhY2ggZOG7sWEgdHLDqm4gdGjDtG5nIHRpbiB24buBIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgbcOgdSBz4bqvYyB2w6AgZ2nDoSB0cuG7iy4gTmfGsOG7nWkgYsOhbiBjw7MgdGjhu4MgxJHhu4tuaCBnacOhIGtpbSBjxrDGoW5nIGNow61uaCB4w6FjIGjGoW4gYuG6sW5nIGPDoWNoIGPDom4gbmjhuq9jIHnhur91IHThu5EgbcOgdSBz4bqvYy4NCg0KLSBUxINuZyBjxrDhu51uZyBz4buxIG1pbmggYuG6oWNoIHRyb25nIHRo4buLIHRyxrDhu51uZyBraW0gY8awxqFuZzogVmnhu4djIHBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBuw6B5IGdpw7pwIG7Dom5nIGNhbyBuaOG6rW4gdGjhu6ljIGPhu6dhIG5nxrDhu51pIHRpw6p1IGTDuW5nIHbhu4EgZ2nDoSB0cuG7iyBj4bunYSBraW0gY8awxqFuZy4gVOG7qyDEkcOzLCBnaeG6o20gdGhp4buDdSBuZ3V5IGPGoSBi4buLIGzhu6thIMSR4bqjbyBraGkgbXVhIGLDoW4ga2ltIGPGsMahbmcuDQoNCi0gxJDhu4EgeHXhuqV0IGNoaeG6v24gbMaw4bujYyBraW5oIGRvYW5oOiBDw6FjIG5ow6Aga2luaCBkb2FuaCBraW0gY8awxqFuZyBjw7MgdGjhu4Mgc+G7rSBk4bulbmcgdGjDtG5nIHRpbiB24buBIG3hu5FpIHF1YW4gaOG7hyBuw6B5IMSR4buDIGzhuq1wIGvhur8gaG/huqFjaCBraW5oIGRvYW5oIGhp4buHdSBxdeG6oyBoxqFuLiBWw60gZOG7pSwgaOG7jSBjw7MgdGjhu4MgdOG6rXAgdHJ1bmcgdsOgbyBwaMOibiBraMO6YyB0aOG7iyB0csaw4budbmcgxrBhIGNodeG7mW5nIGtpbSBjxrDGoW5nIGPDsyBtw6B1IHPhuq9jIG5o4bqldCDEkeG7i25oLg0KDQpOZ2/DoGkgcmEsIHZp4buHYyBwaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIG3DoHUgc+G6r2MgdsOgIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggZ2nDoSBiw6FuIGPhu6dhIGtpbSBjxrDGoW5nIGPDsm4gY8OzIHRo4buDIGdpw7pwIGPDoWMgbmjDoCBuZ2hpw6puIGPhu6l1IGhp4buDdSByw7UgaMahbiB24buBIGPDoWMgeeG6v3UgdOG7kSDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nDoSB0cuG7iyBj4bunYSBraW0gY8awxqFuZyB2w6AgY3VuZyBj4bqlcCBk4buvIGxp4buHdSBo4buvdSDDrWNoIGNobyB2aeG7h2MgcGjDoXQgdHJp4buDbiBjw6FjIG3DtCBow6xuaCBk4buxIMSRb8OhbiBnacOhIGtpbSBjxrDGoW5nLg0KDQoNCmBgYHtyfQ0KdG1wIDwtIGRpYW1vbmRzDQp0bXAgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG09IG1lYW4ocHJpY2UpKSAlPiUgZ2dwbG90KGFlcyh4ID0gY29sb3IseSA9IG0pKSArIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKyBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwxKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnd2hpdGUnKSArIGxhYnMoeCA9ICdNw6B1IHPhuq9jJywgeSA9ICdUcnVuZyBiw6xuaCcpICsgbGFicyggdGl0bGUgPSAiTeG7kWkgcXVhbiBo4buHIGdp4buvYSBtw6B1IHPhuq9jIHbDoCBnacOhIHRy4buLIHRydW5nIGLDrG5oIGdpw6EgYsOhbiBj4bunYSBraW0gY8awxqFuZyIpDQoNCiNHaeG6o2kgdGjDrWNoOg0KDQojdG1wICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShtID0gbWVhbihwcmljZSkpOg0KDQojI05ow7NtIGThu68gbGnhu4d1IHRoZW8gbcOgdSBz4bqvYyAoY29sb3IpLg0KIyNUw61uaCB0b8OhbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGdpw6EgYsOhbiAobSkgY2hvIG3hu5dpIG5ow7NtIG3DoHUuDQoNCiNnZ3Bsb3QoYWVzKHggPSBjb2xvciwgeSA9IG0pKTogS2jhu59pIHThuqFvIGJp4buDdSDEkeG7kyBnZ3Bsb3QyIHbhu5tpIHRy4bulYyBob8OgbmggKHgpIHRo4buDIGhp4buHbiBtw6B1IHPhuq9jIHbDoCB0cuG7pWMgdHVuZyAoeSkgdGjhu4MgaGnhu4duIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggZ2nDoSBiw6FuIChtKS4NCg0KI2dlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJyk6IFRow6ptIGPDoWMgY+G7mXQgdsOgbyBiaeG7g3UgxJHhu5MsIHPhu60gZOG7pW5nIHbhu4sgdHLDrSBkb2RnZSDEkeG7gyB0csOhbmggY2jhu5NuZyBjaMOpbyBjw6FjIGPhu5l0IGtoaSBjw7Mgbmhp4buBdSBuaMOzbSBtw6B1Lg0KDQojZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sIDIpKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpOiBUaMOqbSBuaMOjbiB2xINuIGLhuqNuIHbDoG8gY8OhYyBj4buZdCwgaGnhu4NuIHRo4buLIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggZ2nDoSBiw6FuIMSRxrDhu6NjIGzDoG0gdHLDsm4gxJHhur9uIDIgY2jhu68gc+G7kSB0aOG6rXAgcGjDom4gKHJvdW5kKG0sIDIpKSwgZOG7i2NoIGNodXnhu4NuIGzDqm4gbeG7mXQgY2jDunQgKHZqdXN0ID0gMikgdsOgIMSR4bq3dCBtw6B1IHhhbmggbMOhIChjb2xvciA9ICdncmVlbicpLg0KDQojbGFicyh4ID0gJ03DoHUgc+G6r2MnLCB5ID0gJ1RydW5nIGLDrG5oJyk6IFRow6ptIG5ow6NuIGNobyB0cuG7pWMgaG/DoG5oICh4KSBsw6AgIk3DoHUgc+G6r2MiIHbDoCB0cuG7pWMgdHVuZyAoeSkgbMOgICJUcnVuZyBiw6xuaCIuDQpgYGANCg0KQmnhu4N1IMSR4buTIG7DoHkgY8OzIHRo4buDIMSRxrDhu6NjIHPhu60gZOG7pW5nIMSR4buDIHNvIHPDoW5oIGdpw6EgdHLhu4sgdHJ1bmcgYsOsbmggZ2nDoSBiw6FuIGdp4buvYSBjw6FjIG5ow7NtIG3DoHUgc+G6r2Mga2jDoWMgbmhhdSB2w6AgxJHhu4MgeMOhYyDEkeG7i25oIHhlbSBjw7MgbeG7kWkgbGnDqm4gaOG7hyBuw6BvIGdp4buvYSBoYWkgYmnhur9uIG7DoHkgaGF5IGtow7RuZy4NCg0KTmjhuq1uIHjDqXQgYmnhu4N1IMSR4buTOg0KDQotIE5ow6xuIGNodW5nLCBraMO0bmcgY8OzIHh1IGjGsOG7m25nIHLDtSByw6BuZyBnaeG7r2EgbcOgdSBz4bqvYyB2w6AgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBnacOhIGLDoW4uIEdpw6EgYsOhbiBkYW8gxJHhu5luZyB0cm9uZyBjw6FjIG5ow7NtIG3DoHUgc+G6r2Mga2jDoWMgbmhhdS4NCg0KLSBYdSBoxrDhu5tuZyBnacOhIGLDoW4gdGhlbyBuaMOzbSBtw6B1IGPhu6dhIGtpbSBjxrDGoW5nIHTEg25nICh04burIG3DoHUgJ0UnIMSR4bq/biAnSicpLg0KDQotIE5o4buvbmcgdmnDqm4ga2ltIGPGsMahbmcgbcOgdSAnRCcgY8OzIG3hu6ljIGdpw6EgYsOhbiB0cnVuZyBiw6xuaCBsw6AgMy4xNzAgVVNELCAnRScgY8OzIGdpw6EgYsOhbiB0cnVuZyBiw6xuaCBsw6AgMy4wNzYuOCBVU0QsICdGJyBjw7MgZ2nDoSBiw6FuIHRydW5nIGLDrG5oIGzDoCAzLjcyNCw5IFVTRCwgJ0cnIGPDsyBnacOhIGLDoW4gdHJ1bmcgYsOsbmggbMOgIDMuOTk5LDEgVVNELCAnSCcgY8OzIGdpw6EgYsOhbiB0cnVuZyBiw6xuaCBsw6AgNC40ODYsNyBVU0QsICdJJyBjw7MgZ2nDoSBiw6FuIHRydW5nIGLDrG5oIGzDoCA1LjA5MSw5IFVTRCB2w6AgJ0onIGPDsyBnacOhIGLDoW4gdHJ1bmcgYsOsbmggbMOgIDUuMzIzLDggVVNELg0KDQotIEdpw6EgYsOhbiB0cnVuZyBiw6xuaCBj4bunYSBraW0gY8awxqFuZyBtw6B1ICdKJyBsw6AgY2FvIG5o4bqldCAoNS4zMjMsOCBVU0QpLCBn4bqlcCAxLDczIGzhuqduIGdpw6EgY+G7p2EgJ0UnLCBnacOhIGLDoW4gdHJ1bmcgYsOsbmggY+G7p2EgJ0UnIGzDoCB0aOG6pXAgbmjhuqV0ICgzLjA3Niw4IFVTRCkNCg0KIyAuIFBow6JuIHTDrWNoIG3hu5FpIHF1YW4gaOG7hyBnaeG7r2EgY2jhuqV0IGzGsOG7o25nLCBtw6B1IHPhuq9jIHbDoCBnacOhIGLDoW4gdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcNCg0KVmnhu4djIHBow6JuIHTDrWNoIG7DoHkgbWFuZyBs4bqhaSBuaGnhu4F1IGzhu6NpIMOtY2ggY2hvIG5oaeG7gXUgxJHhu5FpIHTGsOG7o25nOg0KDQotIE5nxrDhu51pIG11YTpIaeG7g3UgcsO1IGjGoW4gduG7gSBjw6FjIHnhur91IHThu5Eg4bqjbmggaMaw4bufbmcgxJHhur9uIGdpw6EgdHLhu4sgY+G7p2Ega2ltIGPGsMahbmcuIFNvIHPDoW5oIGdpw6EgYsOhbiBj4bunYSBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyBraMOhYyBuaGF1IMSR4buDIGzhu7FhIGNo4buNbiBwaMO5IGjhu6NwIHbhu5tpIG5odSBj4bqndSB2w6AgbmfDom4gc8OhY2guIFRyw6FuaCBtdWEgcGjhuqNpIGtpbSBjxrDGoW5nIGdpw6EgY2FvIG5oxrBuZyBjaOG6pXQgbMaw4bujbmcgdGjhuqVwLg0KDQotIE5nxrDhu51pIGLDoW46IMSQ4buLbmggZ2nDoSBraW0gY8awxqFuZyBjaMOtbmggeMOhYyBoxqFuLCBk4buxYSB0csOqbiBjw6FjIHnhur91IHThu5Ega2jDoWNoIHF1YW4uIFTEg25nIGto4bqjIG7Eg25nIGPhuqFuaCB0cmFuaCB0csOqbiB0aOG7iyB0csaw4budbmcuIFThuqFvIGThu7FuZyB1eSB0w61uIHbhu5tpIGtow6FjaCBow6BuZy4NCg0KLSBOaMOgIG5naGnDqm4gY+G7qXU6IFRodSB0aOG6rXAgZOG7ryBsaeG7h3UgduG7gSB0aOG7iyB0csaw4budbmcga2ltIGPGsMahbmcuIFjDoWMgxJHhu4tuaCBjw6FjIHh1IGjGsOG7m25nIHRyb25nIGdpw6EgYsOhbiBj4bunYSBraW0gY8awxqFuZy4gUGjDoXQgdHJp4buDbiBjw6FjIG3DtCBow6xuaCBk4buxIMSRb8OhbiBnacOhIGLDoW4gY+G7p2Ega2ltIGPGsMahbmcuDQoNCi0gTmjDoCBraW5oIGRvYW5oOiBM4bqtcCBr4bq/IGhv4bqhY2gga2luaCBkb2FuaCBoaeG7h3UgcXXhuqMgaMahbiwgZOG7sWEgdHLDqm4gZOG7ryBsaeG7h3UgduG7gSB0aOG7iyB0csaw4budbmcuIFjDoWMgxJHhu4tuaCBwaMOibiBraMO6YyB0aOG7iyB0csaw4budbmcgbeG7pWMgdGnDqnUuIFBow6F0IHRyaeG7g24gY8OhYyBjaGnhur9uIGzGsOG7o2MgbWFya2V0aW5nIHBow7kgaOG7o3AuIA0KDQpOZ2/DoGkgcmEsIHZp4buHYyBwaMOibiB0w61jaCBt4buRaSBxdWFuIGjhu4cgZ2nhu69hIGNo4bqldCBsxrDhu6NuZywgbcOgdSBz4bqvYyB2w6AgZ2nDoSBiw6FuIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIGPDsm4gY8OzIHRo4buDOiBHacO6cCBuw6JuZyBjYW8gbmjhuq1uIHRo4bupYyBj4bunYSBuZ8aw4budaSB0acOqdSBkw7luZyB24buBIGdpw6EgdHLhu4sgY+G7p2Ega2ltIGPGsMahbmcuIFTEg25nIGPGsOG7nW5nIHPhu7EgbWluaCBi4bqhY2ggdHJvbmcgdGjhu4sgdHLGsOG7nW5nIGtpbSBjxrDGoW5nLiBHaeG6o20gdGhp4buDdSBuZ3V5IGPGoSBi4buLIGzhu6thIMSR4bqjbyBraGkgbXVhIGLDoW4ga2ltIGPGsMahbmcuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCAlPiUgZ3JvdXBfYnkoY3V0LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKHByaWNlKSkgJT4lIGdncGxvdChhZXMoeCA9IGN1dCx5ID0gbSkpICsgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArIGZhY2V0X3dyYXAofmNvbG9yKSArIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpKSArIGxhYnMoeCA9ICdDaOG6pXQgbMaw4bujbmcnLCB5ID0gJ0dpw6EgYsOhbicpICsgbGFicyh0aXRsZSA9ICJN4buRaSBxdWFuIGjhu4cgZ2nhu69hIGNo4bqldCBsxrDhu6NuZywgbcOgdSBz4bqvYyB2w6AgZ2nDoSBiw6FuIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIikNCg0KI0dp4bqjaSB0aMOtY2g6DQoNCiN0bXAgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobSA9IG1lYW4ocHJpY2UpKToNCg0KIyNOaMOzbSBk4buvIGxp4buHdSB0aGVvIGNo4bqldCBsxrDhu6NuZyAoY3V0KSB2w6AgbcOgdSBz4bqvYyAoY29sb3IpLg0KIyNUw61uaCB0b8OhbiBnacOhIHRy4buLIHRydW5nIGLDrG5oIGdpw6EgYsOhbiAobSkgY2hvIG3hu5dpIG5ow7NtIGNo4bqldCBsxrDhu6NuZyB2w6AgbcOgdSBz4bqvYy4NCg0KI2dncGxvdChhZXMoeCA9IGN1dCwgeSA9IG0pKTogS2jhu59pIHThuqFvIGJp4buDdSDEkeG7kyBnZ3Bsb3QyIHbhu5tpIHRy4bulYyBob8OgbmggKHgpIHRo4buDIGhp4buHbiBjaOG6pXQgbMaw4bujbmcgdsOgIHRy4bulYyB0dW5nICh5KSB0aOG7gyBoaeG7h24gZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBnacOhIGLDoW4gKG0pLg0KDQojZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKTogVGjDqm0gY8OhYyBj4buZdCB2w6BvIGJp4buDdSDEkeG7kywgc+G7rSBk4bulbmcgduG7iyB0csOtIGRvZGdlIMSR4buDIHRyw6FuaCBjaOG7k25nIGNow6lvIGPDoWMgY+G7mXQga2hpIGPDsyBuaGnhu4F1IG5ow7NtIGNo4bqldCBsxrDhu6NuZy4NCg0KI2ZhY2V0X3dyYXAofmNvbG9yKTogQ2hpYSBiaeG7g3UgxJHhu5MgdGjDoG5oIGPDoWMgbmjDs20gY29uIHRoZW8gbcOgdSBz4bqvYyAoY29sb3IpLg0KDQojZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0pKSk6IFRow6ptIG5ow6NuIHbEg24gYuG6o24gdsOgbyBjw6FjIGPhu5l0LCBoaeG7g24gdGjhu4sgZ2nDoSB0cuG7iyB0cnVuZyBiw6xuaCBnacOhIGLDoW4gxJHGsOG7o2MgbMOgbSB0csOybiAocm91bmQobSkpLg0KDQojbGFicyh4ID0gJ0No4bqldCBsxrDhu6NuZycsIHkgPSAnU+G7kSBsxrDhu6NuZycpOiBUaMOqbSBuaMOjbiBjaG8gdHLhu6VjIGhvw6BuaCAoeCkgbMOgICJDaOG6pXQgbMaw4bujbmciIHbDoCB0cuG7pWMgdHVuZyAoeSkgbMOgICJT4buRIGzGsOG7o25nIi4NCmBgYA0KDQpCaeG7g3UgxJHhu5MgbsOgeSBjw7MgdGjhu4MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgxJHhu4M6DQoNCi0gU28gc8OhbmggZ2nDoSBiw6FuIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIGPDuW5nIGNo4bqldCBsxrDhu6NuZyBuaMawbmcga2jDoWMgbcOgdSBz4bqvYy4NCg0KLSBTbyBzw6FuaCBnacOhIGLDoW4gdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgY8O5bmcgbcOgdSBz4bqvYyBuaMawbmcga2jDoWMgY2jhuqV0IGzGsOG7o25nLg0KDQotIFjDoWMgxJHhu4tuaCBtw6B1IHPhuq9jIG7DoG8gY8OzIGdpw6EgYsOhbiB0cnVuZyBiw6xuaCBjYW8gbmjhuqV0IGNobyBt4buXaSBuaMOzbSBjaOG6pXQgbMaw4bujbmcuDQoNCi0gWMOhYyDEkeG7i25oIGNo4bqldCBsxrDhu6NuZyBuw6BvIGPDsyBnacOhIGLDoW4gdHJ1bmcgYsOsbmggY2FvIG5o4bqldCBjaG8gbeG7l2kgbmjDs20gbcOgdSBz4bqvYy4NCg0KLSBE4buxIMSRb8OhbiBnacOhIGLDoW4gdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgZOG7sWEgdHLDqm4gY2jhuqV0IGzGsOG7o25nIHbDoCBtw6B1IHPhuq9jLg0KDQpN4buZdCBz4buRIG5o4bqtbiB4w6l0IHThu6sgxJHhu5MgdGjhu4sgbmjGsCBzYXU6DQoNCi0gTeG7kWkgcXVhbiBo4buHIGdp4buvYSBtw6B1IHPhuq9jIHbDoCBnacOhIGLDoW46IEtow7RuZyBjw7MgeHUgaMaw4bubbmcgcsO1IHLDoG5nIGdp4buvYSBtw6B1IHPhuq9jIHbDoCBnacOhIGLDoW4gdHJ1bmcgYsOsbmguIEdpw6EgYsOhbiB0cnVuZyBiw6xuaCBkYW8gxJHhu5luZyB0cm9uZyBjw6FjIG5ow7NtIG3DoHUgc+G6r2Mga2jDoWMgbmhhdS4gU+G7sSBraMOhYyBiaeG7h3QgduG7gSBnacOhIGLDoW4gdHJ1bmcgYsOsbmggZ2nhu69hIGPDoWMgbmjDs20ga2jDtG5nIHF1w6EgbOG7m24uDQoNCi0gTeG7kWkgcXVhbiBo4buHIHTGsMahbmcgdMOhYyBnaeG7r2EgY2jhuqV0IGzGsOG7o25nIHbDoCBtw6B1IHPhuq9jOiBN4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSBtw6B1IHPhuq9jIMSR4bq/biBnacOhIGLDoW4gcGjhu6UgdGh14buZYyB2w6BvIGNo4bqldCBsxrDhu6NuZyBraW0gY8awxqFuZy4gxJDhu5FpIHbhu5tpIGtpbSBjxrDGoW5nIGNo4bqldCBsxrDhu6NuZyBjYW8sIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgZ2nDoSBiw6FuIGdp4buvYSBjw6FjIG5ow7NtIG3DoHUgbmjhu48gaMahbi4gxJDhu5FpIHbhu5tpIGtpbSBjxrDGoW5nIGNo4bqldCBsxrDhu6NuZyB0aOG6pXAsIHPhu7Ega2jDoWMgYmnhu4d0IHbhu4EgZ2nDoSBiw6FuIGdp4buvYSBjw6FjIG5ow7NtIG3DoHUgbOG7m24gaMahbi4NCg0KIyAuIFBow6JuIHTDrWNoIGdpw6EgYsOhbiB0cnVuZyBiw6xuaCBj4bunYSBraW0gY8awxqFuZyB0aGVvIG3DoHUgRA0KDQotIMSQw6FuaCBnacOhIGdpw6EgdHLhu4sga2ltIGPGsMahbmc6IEJp4bq/dCDEkcaw4bujYyBnacOhIGLDoW4gdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBtw6B1IEQgZ2nDunAgbmfGsOG7nWkgbXVhIMaw4bubYyB0w61uaCBnacOhIHRy4buLIHZpw6puIGtpbSBjxrDGoW5nIGjhu40gbXXhu5FuIG11YS4NCg0KLSBTbyBzw6FuaCBnacOhIGLDoW4gdHJ1bmcgYsOsbmggY+G7p2EgY8OhYyB2acOqbiBraW0gY8awxqFuZyBjw7MgY8O5bmcgbcOgdSBEIG5oxrBuZyBraMOhYyB24buBIGNo4bqldCBsxrDhu6NuZyBj4bqvdCwgxJHhu5kgdGluaCBraGnhur90LCBrw61jaCB0aMaw4bubYyDEkeG7gyDEkcawYSByYSBs4buxYSBjaOG7jW4gcGjDuSBo4bujcCBuaOG6pXQuDQoNCi0gUGjDom4gYmnhu4d0IGtpbSBjxrDGoW5nIHRo4bqtdCB2w6Aga2ltIGPGsMahbmcgZ2nhuqMgYuG6sW5nIGPDoWNoIHNvIHPDoW5oIGdpw6EgYsOhbiB0aOG7sWMgdOG6vyB24bubaSBnacOhIGLDoW4gdHJ1bmcgYsOsbmguDQoNCi0gUGjDom4gdMOtY2ggZ2nDoSBiw6FuIHRydW5nIGLDrG5oIHRoZW8gdGjhu51pIGdpYW4gxJHhu4MgZOG7sSDEkW/DoW4geHUgaMaw4bubbmcgZ2nDoSBj4bqjIHRyb25nIHTGsMahbmcgbGFpLiBOZ2hpw6puIGPhu6l1IGPDoWMgeeG6v3UgdOG7kSBraMOhYyDhuqNuaCBoxrDhu59uZyDEkeG6v24gZ2nDoSBiw6FuIHRydW5nIGLDrG5oIG5oxrAgY2jhuqV0IGzGsOG7o25nIGPhuq90LCDEkeG7mSB0aW5oIGtoaeG6v3QsIGvDrWNoIHRoxrDhu5tjLCB2LnYuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCA8LSB0bXAgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG1lYW4ocHJpY2UpKQ0KdG1wICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuKSkgKyBnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0QnKSwgZmlsbCA9ICdkYXJrZ3JlZW4nKStsYWJzKHg9IkNo4bqldCBsxrDhu6NuZyIseT0iR2nDoSBiw6FuIikgKyBsYWJzKCB0aXRsZSA9ICIgxJDhu5MgdGjhu4sgZ2nDoSBiw6FuIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBEIikgDQpgYGANCg0KQmnhu4N1IMSR4buTIGhp4buDbiB0aOG7iyBnacOhIGLDoW4gdHJ1bmcgYsOsbmggY+G7p2Ega2ltIGPGsMahbmcgdGhlbyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgY2hvIG5ow7NtIGtpbSBjxrDGoW5nIGPDsyBtw6B1IEQuIEThu68gbGnhu4d1IMSRxrDhu6NjIG5ow7NtIHRoZW8gNSBt4bupYyDEkeG7mSBjaOG6pXQgbMaw4bujbmcgY+G6r3Q6IElkZWFsLCBQcmVtaXVtLCBWZXJ5IEdvb2QsIEdvb2QsIEZhaXIuIEdpw6EgYsOhbiB0cnVuZyBiw6xuaCBjaG8gbeG7l2kgbeG7qWMgxJHhu5kgY+G6r3QgxJHGsOG7o2MgYmnhu4N1IHRo4buLIGLhurFuZyBj4buZdCBtw6B1IHhhbmggbMOhIMSR4bqtbS4NCg0KTeG7qWMgxJHhu5kgY2jDqm5oIGzhu4djaCBnacOhIGLDoW4gdHJ1bmcgYsOsbmggZ2nhu69hIGPDoWMgbmjDs20ga2ltIGPGsMahbmcgY8OzIGNo4bqldCBsxrDhu6NuZyBj4bqvdCBraMOhYyBuaGF1IGtow7RuZyDEkcOhbmcga+G7gy4gU28gc8OhbmggZ2nDoSBiw6FuIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIEQgduG7m2kgY8OhYyBtw6B1IGtow6FjIMSR4buDIMSRw6FuaCBnacOhIG3hu6ljIMSR4buZIOG6o25oIGjGsOG7n25nIGPhu6dhIG3DoHUgc+G6r2MgxJHhur9uIGdpw6EgdHLhu4sga2ltIGPGsMahbmcuDQoNCiMgLiBTbyBzw6FuaCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGdp4buvYSBoYWkgbcOgdSBEIHbDoCBKIHRyb25nIGPDoWMgbmjDs20gY2jhuqV0IGzGsOG7o25nIGtow6FjIG5oYXUNCg0KVmnhu4djIHNvIHPDoW5oIG7DoHkgY8OzIHRo4buDIG1hbmcgbOG6oWkgbmhp4buBdSBs4bujaSDDrWNoIGNobyBuaGnhu4F1IMSR4buRaSB0xrDhu6NuZzoNCg0KLSBOZ8aw4budaSBtdWE6IEhp4buDdSByw7UgaMahbiB24buBIHPhu7EgcGjhu5UgYmnhur9uIGPhu6dhIGPDoWMgbcOgdSBz4bqvYyBraW0gY8awxqFuZyBraMOhYyBuaGF1LiBTbyBzw6FuaCBnacOhIGLDoW4gY+G7p2Ega2ltIGPGsMahbmcgRCB2w6AgSiB0cm9uZyBjw7luZyBuaMOzbSBjaOG6pXQgbMaw4bujbmcuIEzhu7FhIGNo4buNbiBraW0gY8awxqFuZyBwaMO5IGjhu6NwIHbhu5tpIG5odSBj4bqndSB2w6AgbmfDom4gc8OhY2guDQoNCi0gTmfGsOG7nWkgYsOhbjogxJDhu4tuaCBnacOhIGtpbSBjxrDGoW5nIEQgdsOgIEogY2jDrW5oIHjDoWMgaMahbiwgZOG7sWEgdHLDqm4gZOG7ryBsaeG7h3UgdGjhu4sgdHLGsOG7nW5nLiBUxINuZyBraOG6oyBuxINuZyBj4bqhbmggdHJhbmggdHLDqm4gdGjhu4sgdHLGsOG7nW5nLiBU4bqhbyBk4buxbmcgdXkgdMOtbiB24bubaSBraMOhY2ggaMOgbmcuDQoNCi0gTmjDoCBuZ2hpw6puIGPhu6l1OiBUaHUgdGjhuq1wIGThu68gbGnhu4d1IHbhu4EgdGjhu4sgdHLGsOG7nW5nIGtpbSBjxrDGoW5nLiBYw6FjIMSR4buLbmggeHUgaMaw4bubbmcgduG7gSBz4buRIGzGsOG7o25nIHbDoCBnacOhIGLDoW4gY+G7p2Ega2ltIGPGsMahbmcgRCB2w6AgSi4gUGjDoXQgdHJp4buDbiBjw6FjIG3DtCBow6xuaCBk4buxIMSRb8OhbiBz4buRIGzGsOG7o25nIHbDoCBnacOhIGLDoW4gY+G7p2Ega2ltIGPGsMahbmcgRCB2w6AgSi4NCg0KLSBOaMOgIGtpbmggZG9hbmg6IEzhuq1wIGvhur8gaG/huqFjaCBraW5oIGRvYW5oIGhp4buHdSBxdeG6oyBoxqFuLCBk4buxYSB0csOqbiBk4buvIGxp4buHdSB24buBIHRo4buLIHRyxrDhu51uZy4gWMOhYyDEkeG7i25oIHBow6JuIGtow7pjIHRo4buLIHRyxrDhu51uZyBt4bulYyB0acOqdS4gUGjDoXQgdHJp4buDbiBjw6FjIGNoaeG6v24gbMaw4bujYyBtYXJrZXRpbmcgcGjDuSBo4bujcC4NCg0KDQpgYGB7cn0NCnRtcCA8LSBkaWFtb25kcw0KdG1wIDwtIHRtcCAlPiUgZ3JvdXBfYnkoY3V0LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KdG1wICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuKSkgKyBnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0QnKSwgZmlsbCA9ICdyZWQnKSArIGdlb21fY29sKGRhdGEgPSB0bXAgJT4lIGZpbHRlcihjb2xvciA9PSAnSicpLCBmaWxsID0gJ2JsdWUnKSArIGxhYnMoeCA9ICJDSOG6pXQgbMaw4bujbmciLCB5ID0gIiBT4buRIGzGsOG7o25nIikgKyBsYWJzKCB0aXRsZSA9ICLEkOG7kyB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGdp4buvYSBoYWkgbcOgdSBEIHbDoCBKIHRyb25nIGPDoWMgbmjDs20gY2jhuqV0IGzGsOG7o25nIGtow6FjIG5oYXUiKQ0KDQojR2nhuqNpIHRow61jaDoNCg0KI3RtcCA8LSB0bXAgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSk6DQoNCiMjTmjDs20gZOG7ryBsaeG7h3UgdGhlbyBjaOG6pXQgbMaw4bujbmcgKGN1dCkgdsOgIG3DoHUgc+G6r2MgKGNvbG9yKS4NCiMjVMOtbmggdG/DoW4gc+G7kSBsxrDhu6NuZyAobikga2ltIGPGsMahbmcgdHJvbmcgbeG7l2kgbmjDs20gY2jhuqV0IGzGsOG7o25nIHbDoCBtw6B1IHPhuq9jLg0KDQojdG1wICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuKSk6IEto4bufaSB04bqhbyBiaeG7g3UgxJHhu5MgZ2dwbG90MiB24bubaSB0cuG7pWMgaG/DoG5oICh4KSB0aOG7gyBoaeG7h24gY2jhuqV0IGzGsOG7o25nIHbDoCB0cuG7pWMgdHVuZyAoeSkgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgKG4pLg0KDQojZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdEJyksIGZpbGwgPSAncmVkJyk6IFRow6ptIGPhu5l0IG3DoHUgxJHhu48gdsOgbyBiaeG7g3UgxJHhu5MgY2hvIGPDoWMgbmjDs20gY2jhuqV0IGzGsOG7o25nIHbhu5tpIG3DoHUgRC4NCg0KI2dlb21fY29sKGRhdGEgPSB0bXAgJT4lIGZpbHRlcihjb2xvciA9PSAnSicpLCBmaWxsID0gJ2JsdWUnKTogVGjDqm0gY+G7mXQgbcOgdSB4YW5oIHbDoG8gYmnhu4N1IMSR4buTIGNobyBjw6FjIG5ow7NtIGNo4bqldCBsxrDhu6NuZyB24bubaSBtw6B1IEouDQoNCiNsYWJzKHggPSAiQ2jhuqV0IGzGsOG7o25nIiwgeSA9ICJT4buRIGzGsOG7o25nIik6VGjDqm0gbmjDo24gY2hvIHRy4bulYyBob8OgbmggKHgpIGzDoCAiQ2jhuqV0IGzGsOG7o25nIiB2w6AgdHLhu6VjIHR1bmcgKHkpIGzDoCAiU+G7kSBsxrDhu6NuZyIuDQpgYGANCg0KQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIMSR4buZIGNo4bqldCBsxrDhu6NuZyAoY3V0KSBjaG8gaGFpIG3DoHUgRCB2w6AgSi4gDQoNCk5o4bqtbiB4w6l0IHbhu4EgZOG7ryBsaeG7h3UgdHJvbmcgYmnhu4N1IMSR4buTOg0KDQotIE5ow6xuIGNodW5nLCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nICdEJyBjYW8gaMahbiAnSicgY2hvIHThuqV0IGPhuqMgY8OhYyBt4bupYyBjaOG6pXQgbMaw4bujbmcgY+G6r3QuDQoNCi0gQ+G6oyBoYWkgbcOgdSDEkeG7gXUgY8OzIHh1IGjGsOG7m25nIGdp4bqjbSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGtoaSBjaOG6pXQgbMaw4bujbmcgY+G6r3QgZ2nhuqNtLg0KDQotIFBow6JuIGLhu5Egc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2M6IE3DoHUgJ0QnIGPDsyB4dSBoxrDhu5tuZyBwaMOibiBi4buRIMSR4buBdSBoxqFuIGdp4buvYSBjw6FjIG3hu6ljIGNo4bqldCBsxrDhu6NuZyBj4bqvdC4NCg0KIyAuIFNvIHPDoW5oIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgY2jhuqV0IGzGsOG7o25nIGPhuq90IGNobyBoYWkgbcOgdSBz4bqvYyAnRycgdsOgICdGJw0KDQotIE5naGnDqm4gY+G7qXUgdGjhu4sgdHLGsOG7nW5nOg0KDQogKyBQaMOibiB0w61jaCB4dSBoxrDhu5tuZyB0aOG7iyB0csaw4budbmcgdHJvbmcgdmnhu4djIGzhu7FhIGNo4buNbiBjaOG6pXQgbMaw4bujbmcgY+G6r3QgdsOgIG3DoHUgc+G6r2MgY2hvIGtpbSBjxrDGoW5nLg0KDQogKyBTbyBzw6FuaCBt4bupYyDEkeG7mSBwaOG7lSBiaeG6v24gY+G7p2EgY8OhYyBt4bupYyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgdsOgIG3DoHUgc+G6r2Mga2jDoWMgbmhhdS4NCg0KICsgWMOhYyDEkeG7i25oIGPDoWMgcGjDom4ga2jDumMgdGjhu4sgdHLGsOG7nW5nIHRp4buBbSBuxINuZyBjaG8gY8OhYyBsb+G6oWkga2ltIGPGsMahbmcga2jDoWMgbmhhdS4NCg0KLSDEkMOhbmggZ2nDoSBnacOhIHRy4buLOg0KDQogKyBTbyBzw6FuaCBnacOhIHRy4buLIGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nIGThu7FhIHRyw6puIGNo4bqldCBsxrDhu6NuZyBj4bqvdCB2w6AgbcOgdSBz4bqvYy4NCg0KICsgWMOhYyDEkeG7i25oIG3hu6ljIMSR4buZIOG6o25oIGjGsOG7n25nIGPhu6dhIGNo4bqldCBsxrDhu6NuZyBj4bqvdCB2w6AgbcOgdSBz4bqvYyDEkeG6v24gZ2nDoSB0cuG7iyBj4bunYSB2acOqbiBraW0gY8awxqFuZy4NCg0KICsgR2nDunAgbmfGsOG7nWkgbXVhIMSRxrBhIHJhIHF1eeG6v3QgxJHhu4tuaCBzw6FuZyBzdeG7kXQga2hpIGzhu7FhIGNo4buNbiBraW0gY8awxqFuZy4NCg0KDQpgYGB7cn0NCnRtcCA8LSBkaWFtb25kcw0KdG1wIDwtIHRtcCAlPiUgZ3JvdXBfYnkoY3V0LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KDQojZ3JvdXBfYnkoY3V0LCBjb2xvcik6IE5ow7NtIGThu68gbGnhu4d1IHRoZW8gaGFpIGJp4bq/biBjdXQgdsOgIGNvbG9yLg0KI3N1bW1hcmlzZShuID0gbigpKTogVMOtbmggc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0cm9uZyBt4buXaSBuaMOzbSAoc+G7rSBk4bulbmcgaMOgbSBuKCkpLg0KDQp0bXAgJT4lIGdncGxvdChhZXMoeCA9IGN1dCwgeSA9IG4pKSArIGdlb21fY29sKGRhdGEgPSB0bXAgJT4lIGZpbHRlcihjb2xvciA9PSAnRycpLCBmaWxsID0gJ2JsYWNrJykgKyBnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0YnKSwgZmlsbCA9ICdncmF5JykgKyBsYWJzKCB4PSJDaOG6pXQgbMaw4bujbmciLHk9IlPhu5EgbMaw4bujbmciKSsgbGFicyggdGl0bGUgPSAixJDhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIGNo4bqldCBsxrDhu6NuZyBj4bunYSAyIG7DoHUgRyB2w6AgRiIpDQoNCiNnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuKSk6IFThuqFvIGtodW5nIHbhur0gY2hvIGJp4buDdSDEkeG7kyB24bubaSB0cuG7pWMgeCBsw6AgY3V0IHbDoCB0cuG7pWMgeSBsw6Agbi4NCiNnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0cnKSwgZmlsbCA9ICdibGFjaycpOiBUaMOqbSBj4buZdCBtw6B1IMSRZW4gY2hvIGPDoWMgbmjDs20gY8OzIGNvbG9yIGzDoCAnRycuDQojZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdGJyksIGZpbGwgPSAnZ3JheScpOiBUaMOqbSBj4buZdCBtw6B1IHjDoW0gY2hvIGPDoWMgbmjDs20gY8OzIGNvbG9yIGzDoCAnRicuDQojbGFicyh4PSJDaOG6pXQgbMaw4bujbmciLHk9IlPhu5EgbMaw4bujbmciKTogR2hpIGNow7ogbmjDo24gY2hvIHRy4bulYyB4IGzDoCAiQ2jhuqV0IGzGsOG7o25nIiB2w6AgdHLhu6VjIHkgbMOgICJT4buRIGzGsOG7o25nIi4NCmBgYA0KDQpOaOG6rW4geMOpdCB24buBIGThu68gbGnhu4d1IHRyb25nIGJp4buDdSDEkeG7kzoNCg0KLSBOaMOsbiBjaHVuZywgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyAnRicgY2FvIGjGoW4gJ0cnIHRyb25nIHThuqV0IGPhuqMgY8OhYyBt4bupYyBjaOG6pXQgbMaw4bujbmcgY+G6r3QuDQoNCi0gQ+G6oyBoYWkgbcOgdSDEkeG7gXUgY8OzIHh1IGjGsOG7m25nIGdp4bqjbSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGtoaSBjaOG6pXQgbMaw4bujbmcgY+G6r3QgZ2nhuqNtLg0KDQpE4buvIGxp4buHdSB0cm9uZyBiaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBjaOG6pXQgbMaw4bujbmcgY+G6r3Qg4bqjbmggaMaw4bufbmcgxJHhur9uIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcuIE3DoHUgc+G6r2MgY8Wpbmcg4bqjbmggaMaw4bufbmcgxJHhur9uIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcsIG5oxrBuZyBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyB0aOG6pXAgaMahbiBzbyB24bubaSBjaOG6pXQgbMaw4bujbmcgY+G6r3QuDQoNCiMgLiBTbyBzw6FuaCBT4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBtw6B1IHPhuq9jIChIIHbDoCBJKQ0KDQpWaeG7h2MgcGjDom4gdMOtY2ggbsOgeSBjw7MgdGjhu4MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgY2hvIG5oaeG7gXUgbeG7pWMgxJHDrWNoIGtow6FjIG5oYXUsIGJhbyBn4buTbToNCg0KLSBOZ2hpw6puIGPhu6l1IHRo4buLIHRyxrDhu51uZzogUGjDom4gdMOtY2ggeHUgaMaw4bubbmcgdGjhu4sgdHLGsOG7nW5nIHRyb25nIHZp4buHYyBs4buxYSBjaOG7jW4gY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBtw6B1IHPhuq9jIGNobyBraW0gY8awxqFuZy4gU28gc8OhbmggbeG7qWMgxJHhu5kgcGjhu5UgYmnhur9uIGPhu6dhIGPDoWMgbeG7qWMgY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBtw6B1IHPhuq9jIGtow6FjIG5oYXUuIFjDoWMgxJHhu4tuaCBjw6FjIHBow6JuIGtow7pjIHRo4buLIHRyxrDhu51uZyB0aeG7gW0gbsSDbmcgY2hvIGPDoWMgbG/huqFpIGtpbSBjxrDGoW5nIGtow6FjIG5oYXUuDQoNCi0gxJDDoW5oIGdpw6EgZ2nDoSB0cuG7izogU28gc8OhbmggZ2nDoSB0cuG7iyBj4bunYSB2acOqbiBraW0gY8awxqFuZyBk4buxYSB0csOqbiBjaOG6pXQgbMaw4bujbmcgY+G6r3QgdsOgIG3DoHUgc+G6r2MuIFjDoWMgxJHhu4tuaCBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSBjaOG6pXQgbMaw4bujbmcgY+G6r3QgdsOgIG3DoHUgc+G6r2MgxJHhur9uIGdpw6EgdHLhu4sgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcuIEdpw7pwIG5nxrDhu51pIG11YSDEkcawYSByYSBxdXnhur90IMSR4buLbmggc8Ohbmcgc3Xhu5F0IGtoaSBs4buxYSBjaOG7jW4ga2ltIGPGsMahbmcuDQoNCi0gTOG6rXAga+G6vyBob+G6oWNoIHPhuqNuIHh14bqldDpYw6FjIMSR4buLbmggbmh1IGPhuqd1IHRo4buLIHRyxrDhu51uZyBjaG8gY8OhYyBsb+G6oWkga2ltIGPGsMahbmcga2jDoWMgbmhhdSBk4buxYSB0csOqbiBjaOG6pXQgbMaw4bujbmcgY+G6r3QgdsOgIG3DoHUgc+G6r2MuIEzhuq1wIGvhur8gaG/huqFjaCBz4bqjbiB4deG6pXQgcGjDuSBo4bujcCDEkeG7gyDEkcOhcCDhu6luZyBuaHUgY+G6p3UgdGjhu4sgdHLGsOG7nW5nLiBU4buRaSDGsHUgaMOzYSB2aeG7h2Mgc+G7rSBk4bulbmcgbmd1ecOqbiBsaeG7h3UgdsOgIG5ndeG7k24gbOG7sWMuDQoNCi0gTWFya2V0aW5nIHbDoCBiw6FuIGjDoG5nOiBQaMOhdCB0cmnhu4NuIGNoaeG6v24gbMaw4bujYyBtYXJrZXRpbmcgcGjDuSBo4bujcCBjaG8gY8OhYyBsb+G6oWkga2ltIGPGsMahbmcga2jDoWMgbmhhdSBk4buxYSB0csOqbiBjaOG6pXQgbMaw4bujbmcgY+G6r3QgdsOgIG3DoHUgc+G6r2MuIFRp4bq/cCBj4bqtbiBraMOhY2ggaMOgbmcgdGnhu4FtIG7Eg25nIHbhu5tpIHRow7RuZyB0aW4gcGjDuSBo4bujcCB24buBIGPDoWMgbG/huqFpIGtpbSBjxrDGoW5nLiBUxINuZyBoaeG7h3UgcXXhuqMgYsOhbiBow6BuZyB2w6AgZG9hbmggdGh1Lg0KDQoNCmBgYHtyfQ0KdG1wIDwtIGRpYW1vbmRzDQp0bXAgPC0gdG1wICU+JSBncm91cF9ieShjdXQsIGNvbG9yKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpDQoNCiNncm91cF9ieShjdXQsIGNvbG9yKTogTmjDs20gZOG7ryBsaeG7h3UgdGhlbyBoYWkgYmnhur9uIGN1dCB2w6AgY29sb3IuDQojc3VtbWFyaXNlKG4gPSBuKCkpOiBUw61uaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRyb25nIG3hu5dpIG5ow7NtIChz4butIGThu6VuZyBow6BtIG4oKSkuDQoNCnRtcCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsgZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdIJyksIGZpbGwgPSAnZ3JheScpICsgZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdJJyksIGZpbGwgPSAnYmx1ZScpK2xhYnMoeD0iQ2jhuqV0IGzGsOG7o25nIix5PSJT4buRIGzGsOG7o25nIikrIGxhYnMoIHRpdGxlID0gIsSQ4buTIHRo4buLIFPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyBjaOG6pXQgbMaw4bujbmcgY+G6r3QgdsOgIG3DoHUgc+G6r2MgKEggdsOgIEkpIikNCg0KI2dncGxvdChhZXMoeCA9IGN1dCwgeSA9IG4pKTogVOG6oW8ga2h1bmcgduG6vSBjaG8gYmnhu4N1IMSR4buTIHbhu5tpIHRy4bulYyB4IGzDoCBjdXQgdsOgIHRy4bulYyB5IGzDoCBuLg0KDQojZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdIJyksIGZpbGwgPSAnZ3JheScpOiBUaMOqbSBj4buZdCBtw6B1IHjDoW0gY2hvIGPDoWMgbmjDs20gY8OzIGNvbG9yIGzDoCAnSCcuDQoNCiNnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0knKSwgZmlsbCA9ICdibHVlJyk6IFRow6ptIGPhu5l0IG3DoHUgeGFuaCBsYW0gY2hvIGPDoWMgbmjDs20gY8OzIGNvbG9yIGzDoCAnSScuDQoNCiNsYWJzKHg9IkNo4bqldCBsxrDhu6NuZyIseT0iU+G7kSBsxrDhu6NuZyIpOiBHaGkgY2jDuiBuaMOjbiBjaG8gdHLhu6VjIHggbMOgICJDaOG6pXQgbMaw4bujbmciIHbDoCB0cuG7pWMgeSBsw6AgIlPhu5EgbMaw4bujbmciLg0KYGBgDQoNCkJp4buDdSDEkeG7kyB0aHUgxJHGsOG7o2MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgY2jhuqV0IGzGsOG7o25nIGPhuq90IChjdXQpIGNobyBoYWkgbcOgdSBz4bqvYyAnSCcgdsOgICdJJy4gQmnhu4N1IMSR4buTIGPDsyBoYWkgY+G7mXQsIG3DoHUgeMOhbSBjaG8gJ0gnIHbDoCBtw6B1IHhhbmggY2hvICdJJy4gQ2hp4buBdSBjYW8gY+G7p2EgbeG7l2kgY+G7mXQgYmnhu4N1IHRo4buLIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdMawxqFuZyDhu6luZy4NCg0KTmjhuq1uIHjDqXQgduG7gSBk4buvIGxp4buHdSB0cm9uZyBiaeG7g3UgxJHhu5M6DQoNCi0gTmjDrG4gY2h1bmcsIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgJ0knIGNhbyBoxqFuICdIJyBjaG8gdOG6pXQgY+G6oyBjw6FjIG3hu6ljIGNo4bqldCBsxrDhu6NuZyBj4bqvdC4gQ+G6oyBoYWkgbcOgdSDEkeG7gXUgY8OzIHh1IGjGsOG7m25nIGdp4bqjbSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGtoaSBjaOG6pXQgbMaw4bujbmcgY+G6r3QgZ2nhuqNtLg0KDQotIFBow6JuIGLhu5Egc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2M6IE3DoHUgJ0gnIGPDsyB4dSBoxrDhu5tuZyBwaMOibiBi4buRIMSR4buBdSBoxqFuIGdp4buvYSBjw6FjIG3hu6ljIGNo4bqldCBsxrDhu6NuZyBj4bqvdC4NCk3DoHUgJ0knIGPDsyB4dSBoxrDhu5tuZyB04bqtcCB0cnVuZyBuaGnhu4F1IGjGoW4g4bufIGPDoWMgbeG7qWMgY2jhuqV0IGzGsOG7o25nIGPhuq90ICdHb29kJyB2w6AgJ0ZhaXInLg0KDQpE4buvIGxp4buHdSB0cm9uZyBiaeG7g3UgxJHhu5MgY2hvIHRo4bqleSBjaOG6pXQgbMaw4bujbmcgY+G6r3Qg4bqjbmggaMaw4bufbmcgxJHhur9uIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcuIE3DoHUgc+G6r2MgY8Wpbmcg4bqjbmggaMaw4bufbmcgxJHhur9uIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcsIG5oxrBuZyBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyB0aOG6pXAgaMahbiBzbyB24bubaSBjaOG6pXQgbMaw4bujbmcgY+G6r3QuDQoNCiMgLiBTbyBzw6FuaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIGNo4bqldCBsxrDhu6NuZyBj4bqvdCAoY3V0KSBjaG8gaGFpIG3DoHUgc+G6r2MgJ0UnIHbDoCAnRCcNCg0KVmnhu4djIHBow6JuIHTDrWNoIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgY2jhuqV0IGzGsOG7o25nIGPhuq90IChjdXQpIGNobyBoYWkgbcOgdSBz4bqvYyAnRScgdsOgICdEJyBjw7MgdGjhu4MgxJHGsOG7o2Mgc+G7rSBk4bulbmcgY2hvIG5oaeG7gXUgbeG7pWMgxJHDrWNoIGtow6FjIG5oYXUsIGJhbyBn4buTbToNCg0KLSBOZ2hpw6puIGPhu6l1IHRo4buLIHRyxrDhu51uZzogUGjDom4gdMOtY2ggeHUgaMaw4bubbmcgdGjhu4sgdHLGsOG7nW5nIHRyb25nIHZp4buHYyBs4buxYSBjaOG7jW4gY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBtw6B1IHPhuq9jIGNobyBraW0gY8awxqFuZy4gU28gc8OhbmggbeG7qWMgxJHhu5kgcGjhu5UgYmnhur9uIGPhu6dhIGPDoWMgbeG7qWMgY2jhuqV0IGzGsOG7o25nIGPhuq90IHbDoCBtw6B1IHPhuq9jIGtow6FjIG5oYXUuIFjDoWMgxJHhu4tuaCBjw6FjIHBow6JuIGtow7pjIHRo4buLIHRyxrDhu51uZyB0aeG7gW0gbsSDbmcgY2hvIGPDoWMgbG/huqFpIGtpbSBjxrDGoW5nIGtow6FjIG5oYXUuDQoNCi0gxJDDoW5oIGdpw6EgZ2nDoSB0cuG7izogU28gc8OhbmggZ2nDoSB0cuG7iyBj4bunYSB2acOqbiBraW0gY8awxqFuZyBk4buxYSB0csOqbiBjaOG6pXQgbMaw4bujbmcgY+G6r3QgdsOgIG3DoHUgc+G6r2MuIFjDoWMgxJHhu4tuaCBt4bupYyDEkeG7mSDhuqNuaCBoxrDhu59uZyBj4bunYSBjaOG6pXQgbMaw4bujbmcgY+G6r3QgdsOgIG3DoHUgc+G6r2MgxJHhur9uIGdpw6EgdHLhu4sgY+G7p2EgdmnDqm4ga2ltIGPGsMahbmcuIEdpw7pwIG5nxrDhu51pIG11YSDEkcawYSByYSBxdXnhur90IMSR4buLbmggc8Ohbmcgc3Xhu5F0IGtoaSBs4buxYSBjaOG7jW4ga2ltIGPGsMahbmcuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCA8LSB0bXAgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCnRtcCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsgZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdFJyksIGZpbGwgPSAnYmxhY2snKSArIGdlb21fY29sKGRhdGEgPSB0bXAgJT4lIGZpbHRlcihjb2xvciA9PSAnRCcpLCBmaWxsID0gJ3JlZCcpKyBsYWJzKHg9IkNo4bqldCBsxrDhu6NuZyIseT0iU+G7kSBsxrDhu6NuZyIpK2xhYnMoIHRpdGxlID0gIsSQ4buTIHRo4buLIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgY2jhuqV0IGzGsOG7o25nIGPhuq90IChjdXQpIGNobyBoYWkgbcOgdSBz4bqvYyAnRScgdsOgICdEJyIpDQoNCiNnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuKSk6IFThuqFvIGtodW5nIHbhur0gY2hvIGJp4buDdSDEkeG7kyB24bubaSB0cuG7pWMgeCBsw6AgY3V0IHbDoCB0cuG7pWMgeSBsw6Agbi4NCiNnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0UnKSwgZmlsbCA9ICdibGFjaycpOiBUaMOqbSBj4buZdCBtw6B1IMSRZW4gY2hvIGPDoWMgbmjDs20gY8OzIGNvbG9yIChtw6B1IHPhuq9jKSBsw6AgJ0UnLg0KI2dlb21fY29sKGRhdGEgPSB0bXAgJT4lIGZpbHRlcihjb2xvciA9PSAnRCcpLCBmaWxsID0gJ3JlZCcpOiBUaMOqbSBj4buZdCBtw6B1IMSR4buPIGNobyBjw6FjIG5ow7NtIGPDsyBjb2xvciBsw6AgJ0QnLg0KI2xhYnMoeCA9ICJDaOG6pXQgbMaw4bujbmciLCB5ID0gIlPhu5EgbMaw4bujbmciKTogR2hpIGNow7ogbmjDo24gY2hvIHRy4bulYyB4IGzDoCAiQ2jhuqV0IGzGsOG7o25nIiB2w6AgdHLhu6VjIHkgbMOgICJT4buRIGzGsOG7o25nIg0KYGBgDQoNCkJp4buDdSDEkeG7kyB0aHUgxJHGsOG7o2MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgY2jhuqV0IGzGsOG7o25nIGPhuq90IChjdXQpIGNobyBoYWkgbcOgdSBz4bqvYyAnRScgdsOgICdEJy4gQmnhu4N1IMSR4buTIGPDsyBoYWkgY+G7mXQsIG3DoHUgxJFlbiBjaG8gJ0UnIHbDoCBtw6B1IMSR4buPIGNobyAnRCcuIENoaeG7gXUgY2FvIGPhu6dhIG3hu5dpIGPhu5l0IGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHTGsMahbmcg4bupbmcuDQoNCk5o4bqtbiB4w6l0IHbhu4EgZOG7ryBsaeG7h3UgdHJvbmcgYmnhu4N1IMSR4buTOg0KDQotIE5ow6xuIGNodW5nLCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nICdEJyBjYW8gaMahbiAnRScgY2hvIHThuqV0IGPhuqMgY8OhYyBt4bupYyBjaOG6pXQgbMaw4bujbmcgY+G6r3QuDQoNCi0gQ+G6oyBoYWkgbcOgdSDEkeG7gXUgY8OzIHh1IGjGsOG7m25nIGdp4bqjbSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGtoaSBjaOG6pXQgbMaw4bujbmcgY+G6r3QgZ2nhuqNtIHThu6sgSWRlYWwgxJHhur9uIEZhaXIuDQoNCiMgLiBQaMOibiB0w61jaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCAoY2xhcml0eSkgY2hvIGJhIG3DoHUgc+G6r2MgJ0QnLCAnSScgdsOgICdKJw0KDQpWaeG7h2MgcGjDom4gdMOtY2ggc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRpbmgga2hp4bq/dCBnaeG7r2EgYmEgbcOgdSBz4bqvYyAnRCcsICdJJyB2w6AgJ0onIGPDsyB0aOG7gyBxdWFuIHPDoXQgY8OhYyDEkeG6t2MgxJFp4buDbSBuaMawOg0KDQotIFh1IGjGsOG7m25nIGNodW5nIGPhu6dhIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QuDQoNCi0gU+G7sSBraMOhYyBiaeG7h3QgduG7gSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGdp4buvYSBjw6FjIG3DoHUgc+G6r2MgdOG6oWkgbeG7l2kgbeG7qWMgxJHhu5kgdGluaCBraGnhur90Lg0KDQotIE3DoHUgc+G6r2MgbsOgbyBjw7Mgbmhp4buBdSB2acOqbiBraW0gY8awxqFuZyBuaOG6pXQg4bufIGPDoWMgbeG7qWMgxJHhu5kgdGluaCBraGnhur90IGtow6FjIG5oYXUuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMNCnRtcCA8LSB0bXAgJT4lIGdyb3VwX2J5KGNsYXJpdHksIGNvbG9yKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpDQoNCiNncm91cF9ieShjbGFyaXR5LCBjb2xvcik6IE5ow7NtIGThu68gbGnhu4d1IHRoZW8gaGFpIGJp4bq/biBjbGFyaXR5ICjEkeG7mSB0aW5oIGtoaeG6v3QpIHbDoCBjb2xvciAobcOgdSBz4bqvYykuDQojc3VtbWFyaXNlKG4gPSBuKCkpOiBUw61uaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIChuKSB0cm9uZyBt4buXaSBuaMOzbS4NCg0KdG1wICU+JSBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LCB5ID0gbikpICsgZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdEJyksIGZpbGwgPSAncmVkJykgKyBnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0knKSxmaWxsID0gJ2JsdWUnKSArIGdlb21fY29sKGRhdGEgPSB0bXAgJT4lIGZpbHRlcihjb2xvciA9PSAnSicpLCBmaWxsID0gJ2RhcmtncmVlbicpICsgbGFicyh4ID0gIsSQ4buZIHRpbmgga2hp4bq/dCIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpICsgbGFicyggdGl0bGUgPSAixJDhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgKGNsYXJpdHkpIGNobyBiYSBtw6B1IHPhuq9jICdEJywgJ0knIHbDoCAnSiciKQ0KDQojZ2dwbG90KGFlcyh4ID0gY2xhcml0eSwgeSA9IG4pKTogVOG6oW8ga2h1bmcgduG6vSBjaG8gYmnhu4N1IMSR4buTIHbhu5tpIHRy4bulYyB4IGzDoCBjbGFyaXR5IHbDoCB0cuG7pWMgeSBsw6Agbi4NCiNnZW9tX2NvbChkYXRhID0gdG1wICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0QnKSwgZmlsbCA9ICdyZWQnKTogVGjDqm0gY+G7mXQgbcOgdSDEkeG7jyBjaG8gY8OhYyBuaMOzbSBjw7MgY29sb3IgKG3DoHUgc+G6r2MpIGzDoCAnRCcuDQojZ2VvbV9jb2woZGF0YSA9IHRtcCAlPiUgZmlsdGVyKGNvbG9yID09ICdJJyksIGZpbGwgPSAnYmx1ZScpOiBUaMOqbSBj4buZdCBtw6B1IHhhbmggbGFtIGNobyBjw6FjIG5ow7NtIGPDsyBjb2xvciBsw6AgJ0knLg0KI2dlb21fY29sKGRhdGEgPSB0bXAgJT4lIGZpbHRlcihjb2xvciA9PSAnSicpLCBmaWxsID0gJ2RhcmtncmVlbicpOiBUaMOqbSBj4buZdCBtw6B1IHhhbmggbMOhIMSR4bqtbSBjaG8gY8OhYyBuaMOzbSBjw7MgY29sb3IgbMOgICdKJy4NCiMoeCA9ICLEkOG7mSB0aW5oIGtoaeG6v3QiLCB5ID0gIlPhu5EgbMaw4bujbmciKTogR2hpIGNow7ogbmjDo24gY2hvIHRy4bulYyB4IGzDoCAixJDhu5kgdGluaCBraGnhur90IiB2w6AgdHLhu6VjIHkgbMOgICJT4buRIGzGsOG7o25nIg0KYGBgDQoNCkJp4buDdSDEkeG7kyB0aHUgxJHGsOG7o2MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgxJHhu5kgdGluaCBraGnhur90IChjbGFyaXR5KSBjaG8gYmEgbcOgdSBz4bqvYyAnRCcsICdJJyB2w6AgJ0onLiBCaeG7g3UgxJHhu5MgY8OzIGJhIGPhu5l0LCB24bubaSBt4buXaSBj4buZdCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBjaG8gbeG7mXQgbcOgdSBz4bqvYyB0xrDGoW5nIOG7qW5nLiBDaGnhu4F1IGNhbyBj4bunYSBt4buXaSBj4buZdCB04bqhaSBt4buXaSBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgYmnhu4N1IHRo4buLIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgY8OzIG3DoHUgc+G6r2MgxJHDsyDhu58gbeG7qWMgxJHhu5kgdGluaCBraGnhur90IMSRw7MuDQoNCk5o4bqtbiB4w6l0IHbhu4EgZOG7ryBsaeG7h3UgdHJvbmcgYmnhu4N1IMSR4buTOg0KDQotIE5ow6xuIGNodW5nLCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nICdKJyBjYW8gaMahbiAnRCcgdsOgICdJJyBjaG8gaOG6p3UgaOG6v3QgY8OhYyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QuDQoNCi0gU+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBnaeG6o20gZOG6p24gdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QgdOG7qyAiU0kxIiDEkeG6v24gIklGIiBjaG8gY+G6oyBiYSBtw6B1IHPhuq9jLg0KDQotIFBow6JuIGLhu5Egc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2M6IE3DoHUgJ0knIHbDoCAnSicgY8OzIHh1IGjGsOG7m25nIHBow6JuIGLhu5EgxJHhu4F1IGjGoW4gZ2nhu69hIGPDoWMgbeG7qWMgxJHhu5kgdGluaCBraGnhur90LCBjw7JuIG3DoHUgJ0QnIGPDsyB4dSBoxrDhu5tuZyB04bqtcCB0cnVuZyBuaGnhu4F1IGjGoW4g4bufIGPDoWMgbeG7qWMgxJHhu5kgdGluaCBraGnhur90ICJTSTIiICwgIlNJMSIgLCAiVlMyIiwgdsOgICJWVlMyIi4NCg0KIyAuIFBow6JuIHTDrWNoIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbmjDs20gdHLhu41uZyBsxrDhu6NuZyAoY2FyYXRDKQ0KDQpWaeG7h2MgcGjDom4gdMOtY2ggbsOgeSBnacO6cCBzbyBzw6FuaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdHLhu41uZyBsxrDhu6NuZywgY8OzIHRo4buDIHF1YW4gc8OhdCBjw6FjIMSR4bq3YyDEkWnhu4NtIG5oxrA6DQoNCi0gTmjDs20gdHLhu41uZyBsxrDhu6NuZyBuw6BvIGPDsyBuaGnhu4F1IHZpw6puIGtpbSBjxrDGoW5nIG5o4bqldC4NCg0KLSBOaMOzbSB0cuG7jW5nIGzGsOG7o25nIG7DoG8gY8OzIMOtdCB2acOqbiBraW0gY8awxqFuZyBuaOG6pXQuDQoNCi0gWHUgaMaw4bubbmcgY2h1bmcgY+G7p2Egc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHRy4buNbmcgbMaw4bujbmcuDQoNCg0KYGBge3J9DQp0bXAgPC0gZGlhbW9uZHMgDQp0bXAgPC0gdG1wICU+JSBtdXRhdGUoY2FyYXRDID0gY3V0KGNhcmF0LDUsIGxhYmVsID0gYygncuG6pXQgbmjhu48nLCAnbmjhu48nLCd24burYScsJ2zhu5tuJywncuG6pXQgbOG7m24nKSkpDQoNCiNtdXRhdGUoKTogVGjDqm0gbeG7mXQgYmnhur9uIG3hu5tpIHbDoG8gYuG6o25nIGThu68gbGnhu4d1LiBjdXQoKTogQ2hpYSBk4buvIGxp4buHdSB0aMOgbmggY8OhYyBuaMOzbSBk4buxYSB0csOqbiBjw6FjIGtob+G6o25nIGdpw6EgdHLhu4suDQp0bXAgJT4lIGdncGxvdChhZXMoeCA9IGNhcmF0QykpICsgZ2VvbV9iYXIoZmlsbCA9ICdkYXJrZ3JlZW4nKSArIGxhYnMoeD0gIkxv4bqhaSIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpKyBsYWJzKHg9Ikxv4bqhaSIseT0iU+G7kSBsxrDhu6NuZyIpKyBsYWJzKCB0aXRsZSA9ICLEkOG7kyB0aOG7iyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG5ow7NtIHRy4buNbmcgbMaw4bujbmcgKGNhcmF0QykiKQ0KDQojZ2dwbG90KGFlcyh4ID0gY2FyYXRDKSk6IFThuqFvIGtodW5nIHbhur0gY2hvIGJp4buDdSDEkeG7kyB24bubaSB0cuG7pWMgeCBsw6AgY2FyYXRDLg0KI2dlb21fYmFyKGZpbGwgPSAnZGFya2dyZWVuJyk6IFRow6ptIGJp4buDdSDEkeG7kyBk4bqhbmcgdGhhbmggduG7m2kgbcOgdSB4YW5oIGzDoSDEkeG6rW0uDQojbGFicyh4PSAiTG/huqFpIiwgeSA9ICJT4buRIGzGsOG7o25nIik6IEdoaSBjaMO6IG5ow6NuIGNobyB0cuG7pWMgeCBsw6AgIkxv4bqhaSIgdsOgIHRy4bulYyB5IGzDoCAiU+G7kSBsxrDhu6NuZyIuDQpgYGANCg0KQmnhu4N1IMSR4buTIHRodSDEkcaw4bujYyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBuaMOzbSB0cuG7jW5nIGzGsOG7o25nIChjYXJhdEMpLiBCaeG7g3UgxJHhu5MgY8OzIDUgdGhhbmgsIHbhu5tpIG3hu5dpIHRoYW5oIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGNobyBt4buZdCBuaMOzbSB0cuG7jW5nIGzGsOG7o25nIHTGsMahbmcg4bupbmcuIENoaeG7gXUgY2FvIGPhu6dhIG3hu5dpIHRoYW5oIGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRodeG7mWMgbmjDs20gdHLhu41uZyBsxrDhu6NuZyDEkcOzLg0KDQpOaOG6rW4geMOpdCB24buBIGThu68gbGnhu4d1IHRyb25nIGJp4buDdSDEkeG7kzoNCg0KLSBQaMOibiBi4buRIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB0cuG7jW5nIGzGsOG7o25nOiBOaMOzbSB0cuG7jW5nIGzGsOG7o25nICJy4bqldCBuaOG7jyIgY8OzIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgY2FvIG5o4bqldCggdHLDqm4gNDAuMDAwIHZpw6puKS4gTmjDs20gdHLhu41uZyBsxrDhu6NuZyAibmjhu48iLCBraG/huqNuZyBn4bqnbiAxMC4wMDAgdmnDqm4gdsOgICJ24burYSIgY8OzIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGjhuqVwIG5o4bqldCwgZMaw4bubaSAxLjAwMCB2acOqbiwgLg0KDQotIFPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgZ2nhuqNtIGThuqduIHThu6sgbmjDs20gInLhuqV0IG5o4buPIiwgIm5o4buPIiB2w6AgInbhu6thIiwgY8OybiB2acOqbiBraW0gY8awxqFuZyBjw7Mga2jhu5FpIGzGsOG7o25nICJs4bubbiIgdsOgICJy4bqldCBs4bubbiIgdGjDrCBj4buxYyBr4buzIMOtdC4NCg0KLSBDw7Mgbmhp4buBdSB2acOqbiBraW0gY8awxqFuZyBsb+G6oWkgIm5o4buPIiB2w6AgInLhuqV0IG5o4buPIi4gQ8OzIMOtdCB2acOqbiBraW0gY8awxqFuZyBsb+G6oWkgInbhu6thIiB2w6AgcuG6pXQgw610IGtpbSBjxrDGoW5nIHjhur9wIGxv4bqhaSAibOG7m24iIHbDoCAicuG6pXQgbOG7m24iLiDEkGnhu4F1IG7DoHkgY2hvIHRo4bqleSDEkWEgc+G7kSBuaOG7r25nIHZpw6puIGtpbSBjxrDGoW5nIGPDsyBraOG7kWkgbMaw4bujbmcgIm5o4buPIiB2w6AgInLhuqV0IG5o4buPIiB0aMaw4budbmcgeHXhuqV0IGhp4buHbiBwaOG7lSBiaeG6v24sIGPDsm4gbmjhu69uZyB2acOqbiBraW0gY8awxqFuZyBjw7Mga2jhu5FpIGzGsOG7o25nICJs4bubbiIgdsOgICJy4bqldCBs4bubbiAiIHRow6wgeHXhuqV0IGhp4buHbiBy4bqldCBoaeG6v20uDQoNCiMgLiBQaMOibiB0w61jaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIGNo4bqldCBsxrDhu6NuZyAoY3V0KSBjaG8gaGFpIG3DoHUgc+G6r2MgIkgiIHbDoCAiSSINCg0KVmnhu4djIHBow6JuIHTDrWNoIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyBjaOG6pXQgbMaw4bujbmcgdsOgIG3DoHUgc+G6r2MuIELhuqFuIGPDsyB0aOG7gyBxdWFuIHPDoXQgY8OhYyDEkeG6t2MgxJFp4buDbSBuaMawOg0KDQotIE3hu6ljIMSR4buZIGNo4bqldCBsxrDhu6NuZyBuw6BvIGPDsyBuaGnhu4F1IHZpw6puIGtpbSBjxrDGoW5nIG5o4bqldC4NCg0KLSBN4bupYyDEkeG7mSBjaOG6pXQgbMaw4bujbmcgbsOgbyBjw7Mgw610IHZpw6puIGtpbSBjxrDGoW5nIG5o4bqldC4NCg0KLSBNw6B1IHPhuq9jIG7DoG8gY8OzIG5oaeG7gXUgdmnDqm4ga2ltIGPGsMahbmcgbmjhuqV0IGNobyB04burbmcgbeG7qWMgxJHhu5kgY2jhuqV0IGzGsOG7o25nLg0KDQotIFh1IGjGsOG7m25nIGNodW5nIGPhu6dhIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyBjaOG6pXQgbMaw4bujbmcgdsOgIG3DoHUgc+G6r2MuDQoNCg0KYGBge3J9DQpkZl9uZXcgPC0gZGlhbW9uZHMgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIG11dGF0ZShjb2xvciA9IGZhY3Rvcihjb2xvciwgbGV2ZWxzID0gYygiSCIsICJJIikpKQ0KZGZfbmV3ICU+JSBnZ3Bsb3QoYWVzKHggPSBjdXQsIHkgPSBuLCBmaWxsID0gY29sb3IpKSArIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKyBsYWJzKHRpdGxlID0gIsSQ4buTIHRo4buLIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgY2jhuqV0IGzGsOG7o25nIChjdXQpIGNobyBoYWkgbcOgdSBz4bqvYyAnSCcgdsOgICdJJykiKSArIGxhYnMoeCA9ICJDaOG6pXQgbMaw4bujbmciLCB5ID0gIlPhu5EgbMaw4bujbmciKQ0KDQojQ8OidSBs4buHbmggMToNCiNncm91cF9ieSgpOiBOaMOzbSBk4buvIGxp4buHdSB0aGVvIGhhaSBiaeG6v24gY3V0IChjaOG6pXQgbMaw4bujbmcpIHbDoCBjb2xvciAobcOgdSBz4bqvYykuDQojc3VtbWFyaXNlKG4gPSBuKCkpOiBUw61uaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIChuKSB0cm9uZyBt4buXaSBuaMOzbS4NCiNtdXRhdGUoY29sb3IgPSBmYWN0b3IoY29sb3IsIGxldmVscyA9IGMoIkgiLCAiSSIpKSk6IENodXnhu4NuIMSR4buVaSBiaeG6v24gY29sb3IgdGjDoG5oIGtp4buDdSBk4buvIGxp4buHdSBmYWN0b3IgduG7m2kgaGFpIG3hu6ljIMSR4buZIGzDoCAiSCIgdsOgICJJIi4NCg0KI2PDonUgbOG7h25oIDI6DQojZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbiwgZmlsbCA9IGNvbG9yKSk6IFThuqFvIGtodW5nIHbhur0gY2hvIGJp4buDdSDEkeG7kyB24bubaSB0cuG7pWMgeCBsw6AgY3V0LCB0cuG7pWMgeSBsw6AgbiwgdsOgIG3DoHUgc+G6r2MgdGhlbyBiaeG6v24gY29sb3IuDQojZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKTogVGjDqm0gYmnhu4N1IMSR4buTIGThuqFuZyB0aGFuaCB44bq/cCBj4bqhbmggbmhhdS4NCmBgYA0KDQpCaeG7g3UgxJHhu5MgdGh1IMSRxrDhu6NjIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIGNo4bqldCBsxrDhu6NuZyAoY3V0KSBjaG8gaGFpIG3DoHUgc+G6r2MgIkgiIHbDoCAiSSIuIEJp4buDdSDEkeG7kyBjw7MgaGFpIHRoYW5oIGNobyBt4buXaSBt4bupYyBjaOG6pXQgbMaw4bujbmcsIHbhu5tpIG3hu5dpIHRoYW5oIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGNobyBt4buZdCBtw6B1IHPhuq9jIHTGsMahbmcg4bupbmcuIENoaeG7gXUgY2FvIGPhu6dhIG3hu5dpIHRoYW5oIGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRodeG7mWMgbmjDs20gY2jhuqV0IGzGsOG7o25nIHbDoCBtw6B1IHPhuq9jIMSRw7MuDQoNCk5o4bqtbiB4w6l0IHbhu4EgZOG7ryBsaeG7h3UgdHJvbmcgYmnhu4N1IMSR4buTOg0KDQotIE5ow6xuIGNodW5nLCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHTEg25nIGThuqduIGtoaSBjaOG6pXQgbMaw4bujbmcgdMSDbmcgKHThu6sgRmFpciDEkeG6v24gSWRlYWwpLiBYdSBoxrDhu5tuZyBnaeG6o20gbsOgeSB44bqjeSByYSBjaG8gY+G6oyBoYWkgbcOgdSBz4bqvYyAiSCIgdsOgICJJIi4NCg0KLSBN4bupYyDEkeG7mSBnaeG6o20gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBnaeG7r2EgY8OhYyBt4bupYyDEkeG7mSBjaOG6pXQgbMaw4bujbmcgY8OzIHRo4buDIGtow6FjIG5oYXUgZ2nhu69hIGPDoWMgbcOgdSBz4bqvYy4NCg0KLSBQaMOibiBi4buRIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jOiBNw6B1ICJIIiBjw7Mgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBjYW8gaMahbiBzbyB24bubaSBtw6B1ICJJIiBjaG8gaOG6p3UgaOG6v3QgY8OhYyBt4bupYyDEkeG7mSBjaOG6pXQgbMaw4bujbmcuIE3hu6ljIMSR4buZIGNow6puaCBs4buHY2ggc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBnaeG7r2EgaGFpIG3DoHUgc+G6r2MgY8OzIHRo4buDIGtow6FjIG5oYXUgZ2nhu69hIGPDoWMgbeG7qWMgxJHhu5kgY2jhuqV0IGzGsOG7o25nLg0KDQojIC4gUGjDom4gdMOtY2ggc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgKGNsYXJpdHkpIGNobyBoYWkgbcOgdSBz4bqvYyAiRyIgdsOgICJKIg0KDQpWaeG7h2MgcGjDom4gdMOtY2ggbsOgeSBnacO6cCBzbyBzw6FuaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdGluaCBraGnhur90IHbDoCBtw6B1IHPhuq9jLCB0YSBjw7MgdGjhu4MgcXVhbiBzw6F0IGPDoWMgxJHhurdjIMSRaeG7g20gbmjGsDoNCg0KLSBN4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgbsOgbyBjw7Mgbmhp4buBdSB2acOqbiBraW0gY8awxqFuZyBuaOG6pXQuDQoNCi0gTeG7qWMgxJHhu5kgdGluaCBraGnhur90IG7DoG8gY8OzIMOtdCB2acOqbiBraW0gY8awxqFuZyBuaOG6pXQuDQoNCi0gTcOgdSBz4bqvYyBuw6BvIGPDsyBuaGnhu4F1IHZpw6puIGtpbSBjxrDGoW5nIG5o4bqldCBjaG8gdOG7q25nIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dC4NCg0KLSBYdSBoxrDhu5tuZyBjaHVuZyBj4bunYSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdGluaCBraGnhur90IHbDoCBtw6B1IHPhuq9jLg0KDQoNCmBgYHtyfQ0KZGZfbmV3IDwtIGRpYW1vbmRzICU+JQ0KICBncm91cF9ieShjbGFyaXR5LCBjb2xvcikgJT4lDQogIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgbXV0YXRlKGNvbG9yID0gZmFjdG9yKGNvbG9yLCBsZXZlbHMgPSBjKCJHIiwgIkoiKSkpDQoNCmRmX25ldyAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSwgeSA9IG4sIGZpbGwgPSBjb2xvcikpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSgpKSArDQogIGxhYnModGl0bGUgPSAixJDhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgKGNsYXJpdHkpIGNobyBoYWkgbcOgdSBz4bqvYyAnRycgdsOgICdKJyIpICsgbGFicyh4ID0gIsSQ4buZIHRpbmgga2hp4bq/dCIsIHkgPSAiU+G7kSBsxrDhu6NuZyIpDQoNCiNDw6J1IGzhu4duaCAxOiANCiNkaWFtb25kczogVMOqbiBj4bunYSB04bqtcCBk4buvIGxp4buHdSBjaOG7qWEgdGjDtG5nIHRpbiB24buBIGtpbSBjxrDGoW5nLg0KI2dyb3VwX2J5KGNsYXJpdHksIGNvbG9yKTogTmjDs20gZOG7ryBsaeG7h3UgdGhlbyBoYWkgYmnhur9uIGNsYXJpdHkgKMSR4buZIHRpbmgga2hp4bq/dCkgdsOgIGNvbG9yIChtw6B1IHPhuq9jKS4NCiNzdW1tYXJpc2UobiA9IG4oKSk6IFTDrW5oIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgKG4pIHRyb25nIG3hu5dpIG5ow7NtLg0KI211dGF0ZShjb2xvciA9IGZhY3Rvcihjb2xvciwgbGV2ZWxzID0gYygiRyIsICJKIikpKTogQ2h1eeG7g24gxJHhu5VpIGJp4bq/biBjb2xvciB0aMOgbmgga2nhu4N1IGThu68gbGnhu4d1IGZhY3RvciB24bubaSBoYWkgbeG7qWMgxJHhu5kgbMOgICJHIiB2w6AgIkoiLg0KDQojQ8OidSBs4buHbmggMjoNCiNnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LCB5ID0gbiwgZmlsbCA9IGNvbG9yKSk6IFThuqFvIGtodW5nIHbhur0gY2hvIGJp4buDdSDEkeG7kyB24bubaSB0cuG7pWMgeCBsw6AgY2xhcml0eSwgdHLhu6VjIHkgbMOgIG4sIHbDoCBtw6B1IHPhuq9jIHRoZW8gYmnhur9uIGNvbG9yLg0KI2dlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSk6IFRow6ptIGJp4buDdSDEkeG7kyBk4bqhbmcgdGhhbmggeOG6v3AgY+G6oW5oIG5oYXUuDQoNCmBgYA0KDQpCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyB04burbmcgbeG7qWMgxJHhu5kgdGluaCBraGnhur90IChjbGFyaXR5KSBjaG8gaGFpIG3DoHUgc+G6r2MgIkciIHbDoCAiSiIuIEJp4buDdSDEkeG7kyBjw7MgaGFpIHRoYW5oIGNobyBt4buXaSBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QsIHbhu5tpIG3hu5dpIHRoYW5oIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGNobyBt4buZdCBtw6B1IHPhuq9jIHTGsMahbmcg4bupbmcuIENoaeG7gXUgY2FvIGPhu6dhIG3hu5dpIHRoYW5oIGJp4buDdSB0aOG7iyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRodeG7mWMgbmjDs20gxJHhu5kgdGluaCBraGnhur90IHbDoCBtw6B1IHPhuq9jIMSRw7MuDQoNCk5o4bqtbiB4w6l0IHbhu4EgZOG7ryBsaeG7h3UgdHJvbmcgYmnhu4N1IMSR4buTOg0KDQotIE5ow6xuIGNodW5nLCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGdp4bqjbSBk4bqnbiBraGkgxJHhu5kgdGluaCBraGnhur90IHTEg25nICh04burIFNJMiDEkeG6v24gSUYpLiBYdSBoxrDhu5tuZyBnaeG6o20gbsOgeSB44bqjeSByYSBjaG8gY+G6oyBoYWkgbcOgdSBz4bqvYyAiRyIgdsOgICJKIi4NCg0KLSBN4bupYyDEkeG7mSBnaeG6o20gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBnaeG7r2EgY8OhYyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgY8OzIHRo4buDIGtow6FjIG5oYXUgZ2nhu69hIGPDoWMgbcOgdSBz4bqvYy4NCg0KLSBQaMOibiBi4buRIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jOiBNw6B1ICJHIiBjw7Mgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBjYW8gaMahbiBzbyB24bubaSBtw6B1ICJKIiBjaG8gaOG6p3UgaOG6v3QgY8OhYyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QuDQoNCi0gTeG7qWMgxJHhu5kgY2jDqm5oIGzhu4djaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIGdp4buvYSBoYWkgbcOgdSBz4bqvYyBjw7MgdGjhu4Mga2jDoWMgbmhhdSBnaeG7r2EgY8OhYyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QuDQoNCiMgLiBQaMOibiB0w61jaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCAoY2xhcml0eSkgY2hvIGLhu5FuIG3DoHUgc+G6r2MgIkQiLCAiRyIsICJJIiB2w6AgIkoiDQoNClZp4buHYyBwaMOibiB0w61jaCBuw6B5IGdpw7pwIHNvIHPDoW5oIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QgdsOgIG3DoHUgc+G6r2MsIGPDsyB0aOG7gyBxdWFuIHPDoXQgY8OhYyDEkeG6t2MgxJFp4buDbSBuaMawOg0KDQotIE3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCBuw6BvIGPDsyBuaGnhu4F1IHZpw6puIGtpbSBjxrDGoW5nIG5o4bqldC4NCg0KLSBN4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgbsOgbyBjw7Mgw610IHZpw6puIGtpbSBjxrDGoW5nIG5o4bqldC4NCg0KLSBNw6B1IHPhuq9jIG7DoG8gY8OzIG5oaeG7gXUgdmnDqm4ga2ltIGPGsMahbmcgbmjhuqV0IGNobyB04burbmcgbeG7qWMgxJHhu5kgdGluaCBraGnhur90Lg0KDQotIFh1IGjGsOG7m25nIGNodW5nIGPhu6dhIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0aW5oIGtoaeG6v3QgdsOgIG3DoHUgc+G6r2MuDQoNCg0KYGBge3J9DQpkZl9uZXcgPC0gZGlhbW9uZHMgJT4lDQogIGdyb3VwX2J5KGNsYXJpdHksIGNvbG9yKSAlPiUNCiAgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBtdXRhdGUoY29sb3IgPSBmYWN0b3IoY29sb3IsIGxldmVscyA9IGMoIkQiLCJHIiwgIkkiLCJKIikpKQ0KDQpkZl9uZXcgJT4lDQogIGdncGxvdChhZXMoeCA9IGNsYXJpdHksIHkgPSBuLCBmaWxsID0gY29sb3IpKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKyBsYWJzKHggPSAixJDhu5kgdGluaCBraGnhur90IiwgeSA9ICJT4buRIGzGsOG7o25nIikrDQogIGxhYnModGl0bGUgPSAixJDhu5MgdGjhu4sgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgKGNsYXJpdHkpIGNobyBi4buRbiBtw6B1IHPhuq9jICdEJywnRycsJ0knIHbDoCAnSiciKQ0KDQojY8OidSBs4buHbmggMToNCiNncm91cF9ieShjbGFyaXR5LCBjb2xvcik6IE5ow7NtIGThu68gbGnhu4d1IHRoZW8gaGFpIGJp4bq/biBjbGFyaXR5ICjEkeG7mSB0aW5oIGtoaeG6v3QpIHbDoCBjb2xvciAobcOgdSBz4bqvYykuDQojKG4gPSBuKCkpOiBUw61uaCBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIChuKSB0cm9uZyBt4buXaSBuaMOzbS4NCiNtdXRhdGUoY29sb3IgPSBmYWN0b3IoY29sb3IsIGxldmVscyA9IGMoIkQiLCJHIiwgIkkiLCJKIikpKTogQ2h1eeG7g24gxJHhu5VpIGJp4bq/biBjb2xvciB0aMOgbmgga2nhu4N1IGThu68gbGnhu4d1IGZhY3RvciB24bubaSBi4buRbiBt4bupYyDEkeG7mSBsw6AgIkQiLCAiRyIsICJJIiB2w6AgIkoiLg0KI03hu5l0IGLhuqNuZyBk4buvIGxp4buHdSBt4bubaSBkZl9uZXcgxJHGsOG7o2MgdOG6oW8gduG7m2kgY8OhYyBj4buZdDogY2xhcml0eTogxJDhu5kgdGluaCBraGnhur90LCBjb2xvcjogTcOgdSBz4bqvYyAoYmFvIGfhu5NtICJEIiwgIkciLCAiSSIgdsOgICJKIikgLG46IFPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcNCg0KI0PDonUgbOG7h25oIDI6DQojZ2dwbG90KGFlcyh4ID0gY2xhcml0eSwgeSA9IG4sIGZpbGwgPSBjb2xvcikpOiBU4bqhbyBraHVuZyB24bq9IGNobyBiaeG7g3UgxJHhu5MgduG7m2kgdHLhu6VjIHggbMOgIGNsYXJpdHksIHRy4bulYyB5IGzDoCBuLCB2w6AgbcOgdSBz4bqvYyB0aGVvIGJp4bq/biBjb2xvci4NCiNnZW9tX2NvbChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKCkpOiBUaMOqbSBiaeG7g3UgxJHhu5MgZOG6oW5nIHRoYW5oIHjhur9wIGPhuqFuaCBuaGF1Lg0KYGBgDQoNCkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgKGNsYXJpdHkpIGNobyBi4buRbiBtw6B1IHPhuq9jICJEIiwgIkciLCAiSSIgdsOgICJKIi4gQmnhu4N1IMSR4buTIGPDsyBi4buRbiB0aGFuaCBjaG8gbeG7l2kgbeG7qWMgxJHhu5kgdGluaCBraGnhur90LCB24bubaSBt4buXaSB0aGFuaCB0aOG7gyBoaeG7h24gc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBjaG8gbeG7mXQgbcOgdSBz4bqvYyB0xrDGoW5nIOG7qW5nLiBDaGnhu4F1IGNhbyBj4bunYSBt4buXaSB0aGFuaCBiaeG7g3UgdGjhu4sgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyB0aHXhu5ljIG5ow7NtIMSR4buZIHRpbmgga2hp4bq/dCB2w6AgbcOgdSBz4bqvYyDEkcOzLg0KDQpOaOG6rW4geMOpdCB24buBIGThu68gbGnhu4d1IHRyb25nIGJp4buDdSDEkeG7kzoNCg0KLSBOaMOsbiBjaHVuZywgc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBnaeG6o20gZOG6p24ga2hpIMSR4buZIHRpbmgga2hp4bq/dCB0xINuZyAodOG7qyBTSTIgxJHhur9uIElGKS4NCg0KLSBYdSBoxrDhu5tuZyBnaeG6o20gbsOgeSB44bqjeSByYSBjaG8gY+G6oyBi4buRbiBtw6B1IHPhuq9jICJEIiwgIkciLCAiSSIgdsOgICJKIi4gTeG7qWMgxJHhu5kgZ2nhuqNtIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgZ2nhu69hIGPDoWMgbeG7qWMgxJHhu5kgdGluaCBraGnhur90IGPDsyB0aOG7gyBraMOhYyBuaGF1IGdp4buvYSBjw6FjIG3DoHUgc+G6r2MuDQoNCi0gUGjDom4gYuG7kSBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYzogTcOgdSAiRyIgY8OzIHPhu5EgbMaw4bujbmcgdmnDqm4ga2ltIGPGsMahbmcgY2FvIG5o4bqldCBjaG8gaOG6p3UgaOG6v3QgY8OhYyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QuIE3DoHUgIkoiIGPDsyBz4buRIGzGsOG7o25nIHZpw6puIGtpbSBjxrDGoW5nIHRo4bqlcCBuaOG6pXQgY2hvIGjhuqd1IGjhur90IGPDoWMgbeG7qWMgxJHhu5kgdGluaCBraGnhur90ICggZMaw4bubaSA1MDAgdmnDqm4pLg0KDQotIE3hu6ljIMSR4buZIGNow6puaCBs4buHY2ggc+G7kSBsxrDhu6NuZyB2acOqbiBraW0gY8awxqFuZyBnaeG7r2EgY8OhYyBtw6B1IHPhuq9jIGPDsyB0aOG7gyBraMOhYyBuaGF1IGdp4buvYSBjw6FjIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dC4NCg0KDQoNCg0K