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:



1 . 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.

2 . 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.

3 . 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.

4 . 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…).

5 . 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.

6 . 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.

7 . 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.

8 . 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.

9 . 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.

10 . 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.

11 . 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.

12 . 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.

13 . 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.

14 . 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")

15 . 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.

16 . 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á.

17 . 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)

18 . 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.

19 . 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)

20 . 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.

21 . 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.

22 . 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.

23 . 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.

24 . 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.

25 . 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.

26 . 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”.

27 . 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.

28 . 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.

29 . 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.

30 . 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