Bộ dữ liệu DIAMONDS gồm:
Trong bộ dữ liệu này ta có 53940 quan sát với 10 biến tương ứng với
53940 viên kim cương với 10 đặc tính của nó.
-Carat: Trọng lương của viên kim cương.
-Cut: Chất lượng kim cương với 5 mức độ ‘Fair, Good, Very Good,
Premium, Ideal’.
-Color: MÀu sắc kim cương với 7 mức độ
‘D<E<F<G<H<I<J’.
-Clarity: Độ tinh khiết viên kim cương với 8 mức độ ‘IF< VVS1<
VVS2< VS1< VS2< SI1< SI2< I1’.
-Depth: chiều sâu của viên kim cương.
-Table: bề mặt kim cương
-Price: giá bán kim cương
-X chiều dài
-Y chiều rộng
-Z chiều cao
names(d)
## [1] "carat" "cut" "color" "clarity" "depth" "table" "price"
## [8] "x" "y" "z"
Phân tích dữ liệu diamonds với dạng biểu đồ
A.Biểu đồ của dữ liệu CUT như sau
library(tidyverse)
library(scales)
d <- diamonds
d %>% ggplot(aes(x = cut)) +
labs(title= "Biểu đồ thể hiện 5 mức độ của Carat") +
geom_bar() +
labs(x = 'Loại', y = 'Số lượng')

- Trong biểu đồ này ta có thể thấy sự chênh lệch số lượng kim cuong
của 5 mức độ là không đồng điều.
-Cao nhất là Ideal với 21551 viên, và loại thấp nhất
là Fair với 1610 viên.
-Để dễ dàng quan sát thì ta có thể dựa vào biểu đồ bên dưới.
1.Biểu đồ này cho thấy số lương của từng loại kim cương
d %>% group_by(cut) %>% summarise(freq= n()) %>%
ggplot(aes(x = cut,y = freq)) +
geom_col(fill='orange') +
labs(title="Biểu đồ cụ thể 5 mức độ CUT") +
geom_text(aes(label =freq),vjust =2, color ='black') +
labs(x= 'Loại', y='Số lượng')

2.Và chúng ta có thể thấy rõ hơn số lượng kim cương qua biểu đỏ
này
d%>% group_by(cut,color) %>% summarise(n=n()) %>%
ggplot(aes(x = cut,y = n)) +
geom_col(fill='orange') +
facet_wrap(~color) +
geom_text(aes(label = n),vjust = 2, color = 'black')

labs(x = 'Loại', y = 'Số lượng')
## $x
## [1] "Loại"
##
## $y
## [1] "Số lượng"
##
## attr(,"class")
## [1] "labels"
3.Biểu đồ trên hiển thị số lượng kim cương theo từng loại cắt, được
phân loại theo màu sắc của kim cương. Các biểu đồ con tương ứng cho từng
màu sắc của kim cương. Đồng thời, các chú thích số lượng kim cương được
thêm vào để làm cho biểu đồ trở nên dễ hiểu hơn.
d %>% ggplot(aes(x = cut)) +
geom_density(fill = 'orange') +
facet_wrap(~cut)

4.Đây là biểu đồ mật độ của giá kim cương, với mỗi cách cắt khác
nhau của kim cương được hiển thị trong một bảng biểu đồ riêng biệt. Điều
này giúp so sánh phân phối giá của kim cương giữa các loại cắt khác
nhau.
d %>% 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 = 'orange') +
labs(x ='Loại', y = 'Mean')

d<- diamonds
d<- d %>% group_by(cut, color) %>% summarise( n= n())
5.giá trị trung bình của trọng lượng cut cho mỗi loại cắt của kim
cương được thể hiện qua biểu đồ trên. Đồng thời, các chú thích số liệu
được thêm vào để làm cho biểu đồ trở nên dễ hiểu hơn.
d %>% ggplot(aes(x = cut, y = n)) +
geom_col(data = d %>% filter(color == 'H'), fill = 'orange') +
geom_col(data = d %>% filter(color == 'I'), fill = 'blue')

6. Biểu đồ nay cho ta biết số lượng kim cương theo từng loại cắt và
mà sắc của nó. Trên trục x nó thể hiện chất lượng cắt của kim cương,
trục y cho biết sô lượng kim cương. Màu ’Blue thể hiện số kim cương có
màu I, ’Orange thể hiện số kim cương có màu
H.
B.Biểu đồ của dữ liệu CARAT như sau
d <-diamonds
d %>% ggplot(aes(x = carat)) +
geom_density(fill = 'pink')

d <- diamonds
d <- d %>% mutate(caratC = cut(carat,5, label = c('rất nhỏ', 'nhỏ','vừa','lớn','rất lớn')))
d %>% ggplot(aes(x = caratC)) +
labs(title= "Biểu đồ Carat") +
geom_bar(fill = 'pink')

1.Trọng lượng carat được phân loại thành 5 nhóm : rất nhỏ, nhỏ, vừa,
lớn, rất lớn.
d1 <- d%>% mutate (tlcarat = cut(carat,5, label = c("Rất nhẹ", "Nhẹ", "Vừa", "Nặng", "Rất năng")))
d1 %>% group_by(tlcarat) %>% summarise(n = n()) %>%
ggplot(aes(tlcarat,n)) +
geom_col(fill= 'pink') +
labs(title= "Biểu đồ thể hiện carat")+
geom_text (aes(label = n), vjust=-0.5, color= 'black')+
labs(x= "Trọng lượng", y= "Số lượng")

2. Khi nhìn vào biểu đồ này ta vẫn thấy có sự chênh lênh nhất định ở
từng loai:
-“Rất nhẹ” chiếm đại đa số với số lượng 43781 viên. “Rất nặng” chiếm
thiểu số với số lượng là 3 nhỏ hơn rất nhiều so với các cột khác. Điều
này cho thấy rằng kim cương càng có trọng lượng lớn thì càng hiếm.
-Để dễ dàng so sáng thì ta có thể nhìn vào số phần trăm của chúng có
thể chiếm băng biểu đồ kế tiếp.
d1 <- d%>% mutate (tlcarat = cut(carat,5, label = c("Rất nhẹ", "Nhẹ", "Vừa", "Nặng", "Rất năng")))
d1 %>% group_by(tlcarat) %>% summarise(n = n()) %>%
ggplot(aes(tlcarat,n)) +
geom_col(fill= 'pink') +
labs(title= "Biểu đồ thể hiện carat")+
geom_text (aes(label = percent(n/length(d$carat))), vjust=-0.5, color= 'black')+
labs(x= "Trọng lượng", y= "Số lượng")

d%>% ggplot(aes(x = carat)) +
geom_density(fill = 'pink') +
facet_wrap(~cut)

3.Mật độ của trọng lượng carat của kim cương. Biểu đồ được phân loại
thành các bảng con dựa trên các loại cắt khác nhau của kim cương, giúp
so sánh phân phối của trọng lượng carat giữa các loại cắt.
C. Biểu đồ của dữ liệu COLOR
- Màu sắc của kim cương được phân chia gôm 7 màu: D,E,F,G,H,I,J. Được
thể hiện như sau.
d %>% group_by(color) %>% summarise(freq= n()) %>%
ggplot(aes(x = color,y = freq)) +
geom_col(fill='brown') +
labs(title="Biểu đồ cụ thể 5 mức độ Color") +
geom_text(aes(label =freq),vjust =-0.5, color ='black') +
labs(x= 'Màu sắt', y='Số lượng')

-Tổng thể ta có thể thấy sự bố của kim cương với 7 màu sắc cũng không
quá chênh lệch. Với G chiếm 11292 viên là màu sắc có số
lượng đa số, và màu J là loại chiếm số lượng thấp nhất
với 2808 viên. Các màu còn lại có sự chệnh lệch xem xem nhau.
d %>% group_by(color) %>% summarise(n=n()) %>% ggplot(aes(color,n)) +
geom_col(fill= "brown")+
labs(title ="Biểu đồ thể hiện COLOR") +
geom_text(aes(label= percent(n/length(d$color))), vjusst= 1, color= "black") +
labs(x="Màu sắc", y="Số lượng")

D.Biểu đồ của dữ liệu PRICE như sau
d %>% ggplot(aes(x = price)) +
labs(title=" Biểu đồ Price")+
geom_histogram(binwidth = 500, fill = 'blue', color = 'red')

d %>% ggplot(aes(x = price, fill = color)) +
labs(title="Biểu đồ Price")+
geom_histogram(binwidth = 500)

1.Biểu đồ của giá kim cương, với mỗi khoảng giá được phân loại dựa
trên màu sắc của kim cương. Biểu diễn số lượng kim cương có giá trong
một khoảng giá cố định là 500 đơn vị.
d %>% ggplot(aes(x = price, fill = cut)) +
labs(title=" Biểu đồ Price") +
geom_density()

2.Mật độ của giá kim cương, với các plot mật độ được phân biệt bởi
loại cắt của kim cương. Điều này giúp nhìn nhận sự phân phối của giá kim
cương theo từng loại cắt khác nhau.
d %>% ggplot(aes(x = price)) +
geom_density(fill = 'blue')

d %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(x = '', y = n,fill = color)) +
labs(title= "Biểu đồ Price") +
geom_col() +
coord_polar('y')

3.Số lượng mẫu kim cương theo màu sắc. Điều này cho phép so sánh tỉ
lệ phân phối của mẫu kim cương theo màu sắc một cách trực quan.
d%>% ggplot(aes(x = price)) +
labs(title=" Biểu đồ Price H&I") +
geom_histogram(data = d %>% filter(color == 'H'), binwidth = 500, fill = 'purple') +
geom_histogram(data = d %>% filter(color == 'I'), binwidth = 500, fill = 'blue')

4. Biểu đồ giá kim cương, với biểu đồ phân loại dựa trên màu sắc của
kim cương. Mỗi thanh biểu diễn số lượng kim cương có giá trong một
khoảng giá cố định, và có hai histogram riêng biệt cho màu H và I với
màu sắc tương ứng là blue và green.
d %>% ggplot(aes(x = price)) +
labs(title="Biểu đồ Price")+
geom_histogram (data = d %>% filter(color == 'F'), fill = 'purple') +
geom_histogram(data = d %>% filter(color == 'H'), fill = 'blue')

d %>% ggplot(aes(x = price)) +
geom_density(fill = 'blue') +
facet_wrap(~cut)

5.biểu đồ mật độ của giá kim cương, với mỗi nhóm biểu diễn dữ liệu
được phân loại dựa trên loại cắt của kim cương. Mỗi nhóm có một mật độ
riêng biệt của nó, và phân loại được thực hiện để so sánh phân phối của
giá kim cương giữa các loại cắt.
d %>% group_by(color) %>% summarise(n = n()) %>%
ggplot(aes(x = '', y = n,fill = color)) +
geom_col() +
geom_text(aes(label = n),position = position_stack(vjust = 1))

E. Biểu đồ thể hiện CLARITY
d %>% group_by(clarity) %>% summarise(freq= n()) %>%
ggplot(aes(x = clarity,y = freq)) +
geom_col(fill='purple') +
labs(title="Biểu đồ 8 mức độ tinh khiết ") +
geom_text(aes(label =freq),vjust = -0.5, color ='black') +
labs(x= 'Loại', y='Số lượng')

1.Với 8 mức độ tinh khiêt của kim cương thì ta có thể thấy
SI1 chiếm số lượng nhiều nhất, tiếp theo đó là
VS2. Mức độ tinh khiết thấp nhất là *I1**. Và dưới đây
là biểu đồ thể hiện số phần trằm mà từng mức độ tinh khiết có thể chiếm
được.
d %>% group_by(clarity) %>% summarise(n = n()) %>%
ggplot(aes(clarity,n)) +
geom_col(fill= 'purple') +
labs(title= "Biểu đồ thể hiện mức độ tinh khiết")+
geom_text (aes(label = percent(n/length(d$clarity))), vjust=-0.3, color= 'black')+
labs(x= "Loại ", y= "Số lượng")

d %>% group_by(color,clarity) %>% summarise(n=n()) %>%
ggplot(aes(x = clarity,y = n)) +
geom_col(fill = 'purple') +
facet_wrap(~color) +
geom_text(aes(label = n),vjust = 0, color = 'black') +
labs(x = 'Mức độ tinh khiết', y = 'Số lượng')

Biểu đồ cho thấy tần suất của các nhóm mức độ tinh khiết trong từng
màu sắc. Biểu đồ giúp chúng ta hiểu được mối quan hệ giữa mức độ tinh
khiết và màu sắc của kim cương trong tập dữ liệu.
d %>% ggplot(aes(x = clarity)) +
geom_density(fill = 'purple') +
facet_wrap(~cut)

2.Đây là biểu đồ mật độ của tinh khiết kim cương, với mỗi cách cắt
khác nhau của kim cương được hiển thị trong một bảng biểu đồ riêng biệt.
Điều này giúp so sánh độ tinh khiết của kim cương giữa các loại cắt khác
nhau.
d %>% ggplot(aes(x = clarity)) +
labs(title= "Biểu đồ Clarity")+
geom_density(fill = 'purple')

F. Biểu đồ thể hiện DEPTH
d %>% ggplot(aes(x = depth)) +
labs(title= "Biểu đồ thể hiện độ sâu ") +
geom_bar() +
labs(x = 'Loại', y = 'Số lượng')

d %>% ggplot(aes(x = depth)) +
labs(title ="Biểu đồ Deth ") +
geom_density(fill = 'green') +
facet_wrap(~cut)

Thể hiện chất lường chiều sâu của kim cương ở từng biểu đồ riêng
biệt
d %>% ggplot(aes(x = depth)) +
geom_density(fill = 'green')

LS0tDQp0aXRsZTogIkJhcnRjaGF0Ig0KYXV0aG9yOiAibnRudCINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgIHRvY19mbG9hdDogdHJ1ZQ0KICAgdG9jOiB0cnVlDQotLS0NCg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSwgd2FybmluZyA9IEZBTFNFLCBtZXNzYWdlID0gRkFMU0UpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmQgPC0gZGlhbW9uZHMNCg0Kc3RyKGQpDQpgYGANCg0KDQoNCg0KDQoNCiMgKipC4buZIGThu68gbGnhu4d1IERJQU1PTkRTIGfhu5NtOioqDQoNCiMjIyMgVHJvbmcgYuG7mSBk4buvIGxp4buHdSBuw6B5IHRhIGPDsyA1Mzk0MCBxdWFuIHPDoXQgduG7m2kgMTAgYmnhur9uIHTGsMahbmcg4bupbmcgduG7m2kgNTM5NDAgdmnDqm4ga2ltIGPGsMahbmcgduG7m2kgMTAgxJHhurdjIHTDrW5oIGPhu6dhIG7Dsy4gDQoNCiAtQ2FyYXQ6IFRy4buNbmcgbMawxqFuZyBj4bunYSB2acOqbiBraW0gY8awxqFuZy4NCiAgICANCiAtQ3V0OiBDaOG6pXQgbMaw4bujbmcga2ltIGPGsMahbmcgduG7m2kgNSBt4bupYyDEkeG7mSAnRmFpciwgR29vZCwgVmVyeSBHb29kLCBQcmVtaXVtLCBJZGVhbCcuDQogICAgDQogLUNvbG9yOiBNw4B1IHPhuq9jIGtpbSBjxrDGoW5nIHbhu5tpIDcgbeG7qWMgxJHhu5kgJ0Q8RTxGPEc8SDxJPEonLg0KICAgIA0KIC1DbGFyaXR5OiDEkOG7mSB0aW5oIGtoaeG6v3QgdmnDqm4ga2ltIGPGsMahbmcgduG7m2kgOCBt4bupYyDEkeG7mSAnSUY8IFZWUzE8IFZWUzI8IFZTMTwgVlMyPCBTSTE8IFNJMjwgSTEnLg0KICAgIA0KIC1EZXB0aDogY2hp4buBdSBzw6J1IGPhu6dhIHZpw6puIGtpbSBjxrDGoW5nLg0KICAgIA0KIC1UYWJsZTogYuG7gSBt4bq3dCBraW0gY8awxqFuZw0KICAgIA0KIC1QcmljZTogZ2nDoSBiw6FuIGtpbSBjxrDGoW5nIA0KICAgIA0KIC1YIGNoaeG7gXUgZMOgaSANCiAgICANCiAtWSBjaGnhu4F1IHLhu5luZw0KICAgIA0KIC1aIGNoaeG7gXUgY2FvDQogICAgDQogICAgDQoNCmBgYHtyfQ0KbmFtZXMoZCkNCmBgYA0KDQoNCg0KIyAqKlBow6JuIHTDrWNoIGThu68gbGnhu4d1IGRpYW1vbmRzIHbhu5tpIGThuqFuZyBiaeG7g3UgxJHhu5MqKg0KDQoNCiMjICoqQS5CaeG7g3UgxJHhu5MgY+G7p2EgZOG7ryBsaeG7h3UgKkNVVCogbmjGsCBzYXUqKg0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShzY2FsZXMpDQogZCA8LSBkaWFtb25kcw0KIGQgJT4lIGdncGxvdChhZXMoeCA9IGN1dCkpICsgDQogICAgICAgICAgbGFicyh0aXRsZT0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gNSBt4bupYyDEkeG7mSBj4bunYSBDYXJhdCIpICsNCiAgICAgICAgICBnZW9tX2JhcigpICsNCiAgICAgICAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KICANCiAgDQogIC0gVHJvbmcgYmnhu4N1IMSR4buTIG7DoHkgdGEgY8OzIHRo4buDIHRo4bqleSBz4buxIGNow6puaCBs4buHY2ggc+G7kSBsxrDhu6NuZyBraW0gY3VvbmcgY+G7p2EgNSBt4bupYyDEkeG7mSBsw6Aga2jDtG5nIMSR4buTbmcgxJFp4buBdS4NCiAgICANCiAgLUNhbyBuaOG6pXQgbMOgICoqSWRlYWwqKiB24bubaSAyMTU1MSB2acOqbiwgdsOgIGxv4bqhaSB0aOG6pXAgbmjhuqV0IGzDoCAqKkZhaXIqKiB24bubaSAxNjEwIHZpw6puLg0KICAgIA0KLcSQ4buDIGThu4UgZMOgbmcgcXVhbiBzw6F0IHRow6wgdGEgY8OzIHRo4buDIGThu7FhIHbDoG8gYmnhu4N1IMSR4buTIGLDqm4gZMaw4bubaS4NCg0KDQoNCiMjIyMgMS5CaeG7g3UgxJHhu5MgbsOgeSBjaG8gdGjhuqV5IHPhu5EgbMawxqFuZyBj4bunYSB04burbmcgbG/huqFpIGtpbSBjxrDGoW5nIA0KDQoNCg0KYGBge3J9DQpkICU+JSAgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKGZyZXE9IG4oKSkgJT4lDQpnZ3Bsb3QoYWVzKHggPSBjdXQseSA9IGZyZXEpKSArDQogIGdlb21fY29sKGZpbGw9J29yYW5nZScpICsNCiAgbGFicyh0aXRsZT0iQmnhu4N1IMSR4buTIGPhu6UgdGjhu4MgNSBt4bupYyDEkeG7mSBDVVQiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPWZyZXEpLHZqdXN0ID0yLCBjb2xvciA9J2JsYWNrJykgKw0KICBsYWJzKHg9ICdMb+G6oWknLCB5PSdT4buRIGzGsOG7o25nJykNCg0KYGBgDQoNCg0KDQojIyMjIDIuVsOgIGNow7puZyB0YSBjw7MgdGjhu4MgdGjhuqV5IHLDtSBoxqFuIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgcXVhIGJp4buDdSDEkeG7jyBuw6B5IA0KDQoNCg0KDQpgYGB7cn0NCmQlPiUgZ3JvdXBfYnkoY3V0LGNvbG9yKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY3V0LHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J29yYW5nZScpICArDQogICAgZmFjZXRfd3JhcCh+Y29sb3IpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdibGFjaycpDQogICAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KDQojIyMjIDMuQmnhu4N1IMSR4buTIHRyw6puIGhp4buDbiB0aOG7iyBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIGxv4bqhaSBj4bqvdCwgxJHGsOG7o2MgcGjDom4gbG/huqFpIHRoZW8gbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZy4gQ8OhYyBiaeG7g3UgxJHhu5MgY29uIHTGsMahbmcg4bupbmcgY2hvIHThu6tuZyBtw6B1IHPhuq9jIGPhu6dhIGtpbSBjxrDGoW5nLiDEkOG7k25nIHRo4budaSwgY8OhYyBjaMO6IHRow61jaCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIMSRxrDhu6NjIHRow6ptIHbDoG8gxJHhu4MgbMOgbSBjaG8gYmnhu4N1IMSR4buTIHRy4bufIG7Dqm4gZOG7hSBoaeG7g3UgaMahbi4NCg0KDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0KSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdvcmFuZ2UnKSArDQogIGZhY2V0X3dyYXAofmN1dCkNCmBgYA0KDQoNCiMjIyMgNC7EkMOieSBsw6AgYmnhu4N1IMSR4buTIG3huq10IMSR4buZIGPhu6dhIGdpw6Ega2ltIGPGsMahbmcsIHbhu5tpIG3hu5dpIGPDoWNoIGPhuq90IGtow6FjIG5oYXUgY+G7p2Ega2ltIGPGsMahbmcgxJHGsOG7o2MgaGnhu4NuIHRo4buLIHRyb25nIG3hu5l0IGLhuqNuZyBiaeG7g3UgxJHhu5MgcmnDqm5nIGJp4buHdC4gxJBp4buBdSBuw6B5IGdpw7pwIHNvIHPDoW5oIHBow6JuIHBo4buRaSBnacOhIGPhu6dhIGtpbSBjxrDGoW5nIGdp4buvYSBjw6FjIGxv4bqhaSBj4bqvdCBraMOhYyBuaGF1Lg0KDQoNCg0KYGBge3J9DQpkICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobT0gbWVhbihjYXJhdCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjdXQseSA9IG0pKSArDQogICAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHJvdW5kKG0sMikpLCB2anVzdCA9IDIsIGNvbG9yID0gJ29yYW5nZScpICsNCiAgICBsYWJzKHggPSdMb+G6oWknLCB5ID0gJ01lYW4nKQ0KDQpgYGANCg0KYGBge3J9DQpkPC0gZGlhbW9uZHMNCmQ8LSBkICU+JSBncm91cF9ieShjdXQsIGNvbG9yKSAlPiUgc3VtbWFyaXNlKCBuPSBuKCkpDQoNCmBgYA0KDQoNCiMjIyMgNS5nacOhIHRy4buLIHRydW5nIGLDrG5oIGPhu6dhIHRy4buNbmcgbMaw4bujbmcgY3V0IGNobyBt4buXaSBsb+G6oWkgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcgxJHGsOG7o2MgdGjhu4MgaGnhu4duIHF1YSBiaeG7g3UgxJHhu5MgdHLDqm4uIMSQ4buTbmcgdGjhu51pLCBjw6FjIGNow7ogdGjDrWNoIHPhu5EgbGnhu4d1IMSRxrDhu6NjIHRow6ptIHbDoG8gxJHhu4MgbMOgbSBjaG8gYmnhu4N1IMSR4buTIHRy4bufIG7Dqm4gZOG7hSBoaeG7g3UgaMahbi4NCg0KDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGQgJT4lIGZpbHRlcihjb2xvciA9PSAnSCcpLCBmaWxsID0gJ29yYW5nZScpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGQgJT4lIGZpbHRlcihjb2xvciA9PSAnSScpLCBmaWxsID0gJ2JsdWUnKQ0KYGBgDQoNCiMjIyMgNi4gQmnhu4N1IMSR4buTIG5heSBjaG8gdGEgYmnhur90IHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgdGhlbyB04burbmcgbG/huqFpIGPhuq90IHbDoCBtw6Agc+G6r2MgY+G7p2EgbsOzLiBUcsOqbiB0cuG7pWMgeCBuw7MgdGjhu4MgaGnhu4duIGNo4bqldCBsxrDhu6NuZyBj4bqvdCBj4bunYSBraW0gY8awxqFuZywgdHLhu6VjIHkgY2hvIGJp4bq/dCBzw7QgbMaw4bujbmcga2ltIGPGsMahbmcuIE3DoHUgJ0JsdWUgdGjhu4MgaGnhu4duIHPhu5Ega2ltIGPGsMahbmcgY8OzIG3DoHUgKipJKiosICdPcmFuZ2UgdGjhu4MgaGnhu4duIHPhu5Ega2ltIGPGsMahbmcgY8OzIG3DoHUgKipIKiouIA0KDQoNCg0KIyMgKipCLkJp4buDdSDEkeG7kyBj4bunYSBk4buvIGxp4buHdSAqQ0FSQVQqIG5oxrAgc2F1KioNCg0KYGBge3J9DQpkIDwtZGlhbW9uZHMNCmQgJT4lIGdncGxvdChhZXMoeCA9IGNhcmF0KSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdwaW5rJykNCg0KYGBgDQoNCg0KYGBge3J9DQpkIDwtIGRpYW1vbmRzIA0KZCA8LSBkICU+JSBtdXRhdGUoY2FyYXRDID0gY3V0KGNhcmF0LDUsIGxhYmVsID0gYygncuG6pXQgbmjhu48nLCAnbmjhu48nLCd24burYScsJ2zhu5tuJywncuG6pXQgbOG7m24nKSkpDQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBjYXJhdEMpKSArDQogIGxhYnModGl0bGU9ICJCaeG7g3UgxJHhu5MgQ2FyYXQiKSArDQogIGdlb21fYmFyKGZpbGwgPSAncGluaycpDQoNCmBgYA0KDQoNCiMjIyMgMS5UcuG7jW5nIGzGsOG7o25nIGNhcmF0IMSRxrDhu6NjIHBow6JuIGxv4bqhaSB0aMOgbmggNSBuaMOzbSA6IHLhuqV0IG5o4buPLCBuaOG7jywgduG7q2EsIGzhu5tuLCBy4bqldCBs4bubbi4NCg0KDQoNCmBgYHtyfQ0KZDEgPC0gZCU+JSBtdXRhdGUgKHRsY2FyYXQgPSBjdXQoY2FyYXQsNSwgbGFiZWwgPSBjKCJS4bqldCBuaOG6uSIsICJOaOG6uSIsICJW4burYSIsICJO4bq3bmciLCAiUuG6pXQgbsSDbmciKSkpDQpkMSAlPiUgZ3JvdXBfYnkodGxjYXJhdCkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh0bGNhcmF0LG4pKSArDQogICBnZW9tX2NvbChmaWxsPSAncGluaycpICsNCiAgIGxhYnModGl0bGU9ICJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIGNhcmF0IikrDQogICBnZW9tX3RleHQgKGFlcyhsYWJlbCA9IG4pLCB2anVzdD0tMC41LCBjb2xvcj0gJ2JsYWNrJykrDQogICBsYWJzKHg9ICJUcuG7jW5nIGzGsOG7o25nIiwgeT0gIlPhu5EgbMaw4bujbmciKQ0KDQpgYGANCg0KDQoNCiMjIyMgMi4gS2hpIG5ow6xuIHbDoG8gYmnhu4N1IMSR4buTIG7DoHkgdGEgduG6q24gdGjhuqV5IGPDsyBz4buxIGNow6puaCBsw6puaCBuaOG6pXQgxJHhu4tuaCDhu58gdOG7q25nIGxvYWk6DQoNCiAgIC0iUuG6pXQgbmjhurkiIGNoaeG6v20gxJHhuqFpIMSRYSBz4buRIHbhu5tpIHPhu5EgbMaw4bujbmcgNDM3ODEgdmnDqm4uICJS4bqldCBu4bq3bmciIGNoaeG6v20gdGhp4buDdSBz4buRIHbhu5tpIHPhu5EgbMaw4bujbmcgbMOgIDMgbmjhu48gaMahbiBy4bqldCBuaGnhu4F1IHNvIHbhu5tpIGPDoWMgY+G7mXQga2jDoWMuIMSQaeG7gXUgbsOgeSBjaG8gdGjhuqV5IHLhurFuZyBraW0gY8awxqFuZyBjw6BuZyBjw7MgdHLhu41uZyBsxrDhu6NuZyBs4bubbiB0aMOsIGPDoG5nIGhp4bq/bS4NCiAgICANCiAgLcSQ4buDIGThu4UgZMOgbmcgc28gc8OhbmcgdGjDrCB0YSBjw7MgdGjhu4MgbmjDrG4gdsOgbyBz4buRIHBo4bqnbiB0csSDbSBj4bunYSBjaMO6bmcgY8OzIHRo4buDIGNoaeG6v20gYsSDbmcgYmnhu4N1IMSR4buTIGvhur8gdGnhur9wLg0KDQoNCg0KYGBge3J9DQpkMSA8LSBkJT4lIG11dGF0ZSAodGxjYXJhdCA9IGN1dChjYXJhdCw1LCBsYWJlbCA9IGMoIlLhuqV0IG5o4bq5IiwgIk5o4bq5IiwgIlbhu6thIiwgIk7hurduZyIsICJS4bqldCBuxINuZyIpKSkNCmQxICU+JSBncm91cF9ieSh0bGNhcmF0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHRsY2FyYXQsbikpICsNCiAgIGdlb21fY29sKGZpbGw9ICdwaW5rJykgKw0KICAgbGFicyh0aXRsZT0gIkJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gY2FyYXQiKSsNCiAgIGdlb21fdGV4dCAoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aChkJGNhcmF0KSkpLCB2anVzdD0tMC41LCBjb2xvcj0gJ2JsYWNrJykrDQogICBsYWJzKHg9ICJUcuG7jW5nIGzGsOG7o25nIiwgeT0gIlPhu5EgbMaw4bujbmciKQ0KDQpgYGANCg0KDQoNCmBgYHtyfQ0KZCU+JSBnZ3Bsb3QoYWVzKHggPSBjYXJhdCkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAncGluaycpICsNCiAgZmFjZXRfd3JhcCh+Y3V0KQ0KYGBgDQoNCg0KIyMjIyAzLk3huq10IMSR4buZIGPhu6dhIHRy4buNbmcgbMaw4bujbmcgY2FyYXQgY+G7p2Ega2ltIGPGsMahbmcuIEJp4buDdSDEkeG7kyDEkcaw4bujYyBwaMOibiBsb+G6oWkgdGjDoG5oIGPDoWMgYuG6o25nIGNvbiBk4buxYSB0csOqbiBjw6FjIGxv4bqhaSBj4bqvdCBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nLCBnacO6cCBzbyBzw6FuaCBwaMOibiBwaOG7kWkgY+G7p2EgdHLhu41uZyBsxrDhu6NuZyBjYXJhdCBnaeG7r2EgY8OhYyBsb+G6oWkgY+G6r3QuDQoNCg0KIyMgKipDLiBCaeG7g3UgxJHhu5MgY+G7p2EgZOG7ryBsaeG7h3UgQ09MT1IqKg0KDQogLSBNw6B1IHPhuq9jIGPhu6dhIGtpbSBjxrDGoW5nIMSRxrDhu6NjIHBow6JuIGNoaWEgZ8O0bSA3IG3DoHU6IEQsRSxGLEcsSCxJLEouIMSQxrDhu6NjIHRo4buDIGhp4buHbiBuaMawIHNhdS4NCg0KDQpgYGB7cn0NCmQgJT4lICBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShmcmVxPSBuKCkpICU+JQ0KZ2dwbG90KGFlcyh4ID0gY29sb3IseSA9IGZyZXEpKSArDQogIGdlb21fY29sKGZpbGw9J2Jyb3duJykgKw0KICBsYWJzKHRpdGxlPSJCaeG7g3UgxJHhu5MgY+G7pSB0aOG7gyA1IG3hu6ljIMSR4buZIENvbG9yIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID1mcmVxKSx2anVzdCA9LTAuNSwgY29sb3IgPSdibGFjaycpICsNCiAgbGFicyh4PSAnTcOgdSBz4bqvdCcsIHk9J1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCiAgIC1U4buVbmcgdGjhu4MgdGEgY8OzIHRo4buDIHRo4bqleSBz4buxIGLhu5EgY+G7p2Ega2ltIGPGsMahbmcgduG7m2kgNyBtw6B1IHPhuq9jIGPFqW5nIGtow7RuZyBxdcOhIGNow6puaCBs4buHY2guIFbhu5tpICoqRyoqIGNoaeG6v20gMTEyOTIgdmnDqm4gbMOgIG3DoHUgc+G6r2MgY8OzIHPhu5EgbMaw4bujbmcgxJFhIHPhu5EsIHbDoCBtw6B1ICAqKkoqKiBsw6AgbG/huqFpIGNoaeG6v20gc+G7kSBsxrDhu6NuZyB0aOG6pXAgbmjhuqV0IHbhu5tpIDI4MDggdmnDqm4uIEPDoWMgbcOgdSBjw7JuIGzhuqFpIGPDsyBz4buxIGNo4buHbmggbOG7h2NoIHhlbSB4ZW0gbmhhdS4gDQoNCg0KYGBge3J9DQpkICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lIGdncGxvdChhZXMoY29sb3IsbikpICsNCiAgZ2VvbV9jb2woZmlsbD0gImJyb3duIikrDQogIGxhYnModGl0bGUgPSJCaeG7g3UgxJHhu5MgdGjhu4MgaGnhu4duIENPTE9SIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPSBwZXJjZW50KG4vbGVuZ3RoKGQkY29sb3IpKSksIHZqdXNzdD0gMSwgY29sb3I9ICJibGFjayIpICsNCiAgbGFicyh4PSJNw6B1IHPhuq9jIiwgeT0iU+G7kSBsxrDhu6NuZyIpDQpgYGANCg0KDQoNCg0KIyMgKipELkJp4buDdSDEkeG7kyBj4bunYSBk4buvIGxp4buHdSAqUFJJQ0UqIG5oxrAgc2F1KioNCg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IHByaWNlKSkgKw0KICBsYWJzKHRpdGxlPSIgQmnhu4N1IMSR4buTIFByaWNlIikrDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwLCBmaWxsID0gJ2JsdWUnLCBjb2xvciA9ICdyZWQnKQ0KYGBgDQoNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBwcmljZSwgZmlsbCA9IGNvbG9yKSkgKw0KICBsYWJzKHRpdGxlPSJCaeG7g3UgxJHhu5MgUHJpY2UiKSsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDApDQpgYGANCg0KDQoNCiMjIyMgMS5CaeG7g3UgxJHhu5MgY+G7p2EgZ2nDoSBraW0gY8awxqFuZywgduG7m2kgbeG7l2kga2hv4bqjbmcgZ2nDoSDEkcaw4bujYyBwaMOibiBsb+G6oWkgZOG7sWEgdHLDqm4gbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZy4gQmnhu4N1IGRp4buFbiBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDsyBnacOhIHRyb25nIG3hu5l0IGtob+G6o25nIGdpw6EgY+G7kSDEkeG7i25oIGzDoCA1MDAgxJHGoW4gduG7iy4NCg0KDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gcHJpY2UsIGZpbGwgPSBjdXQpKSArDQogIGxhYnModGl0bGU9IiBCaeG7g3UgxJHhu5MgUHJpY2UiKSArDQogIGdlb21fZGVuc2l0eSgpDQpgYGANCg0KDQojIyMjIDIuTeG6rXQgxJHhu5kgY+G7p2EgZ2nDoSBraW0gY8awxqFuZywgduG7m2kgY8OhYyBwbG90IG3huq10IMSR4buZIMSRxrDhu6NjIHBow6JuIGJp4buHdCBi4bufaSBsb+G6oWkgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcuIMSQaeG7gXUgbsOgeSBnacO6cCBuaMOsbiBuaOG6rW4gc+G7sSBwaMOibiBwaOG7kWkgY+G7p2EgZ2nDoSBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBsb+G6oWkgY+G6r3Qga2jDoWMgbmhhdS4NCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBwcmljZSkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAnYmx1ZScpDQpgYGANCg0KDQpgYGB7cn0NCmQgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSAnJywgeSA9IG4sZmlsbCA9IGNvbG9yKSkgKw0KICBsYWJzKHRpdGxlPSAiQmnhu4N1IMSR4buTIFByaWNlIikgKw0KICAgIGdlb21fY29sKCkgKw0KICAgIGNvb3JkX3BvbGFyKCd5JykNCmBgYA0KDQoNCiMjIyMgMy5T4buRIGzGsOG7o25nIG3huqt1IGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYy4gxJBp4buBdSBuw6B5IGNobyBwaMOpcCBzbyBzw6FuaCB04buJIGzhu4cgcGjDom4gcGjhu5FpIGPhu6dhIG3huqt1IGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYyBt4buZdCBjw6FjaCB0cuG7sWMgcXVhbi4NCg0KYGBge3J9DQpkJT4lIGdncGxvdChhZXMoeCA9IHByaWNlKSkgKw0KICBsYWJzKHRpdGxlPSIgQmnhu4N1IMSR4buTIFByaWNlIEgmSSIpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZGF0YSA9IGQgJT4lIGZpbHRlcihjb2xvciA9PSAnSCcpLCBiaW53aWR0aCA9IDUwMCwgZmlsbCA9ICdwdXJwbGUnKSArDQogIGdlb21faGlzdG9ncmFtKGRhdGEgPSBkICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0knKSwgYmlud2lkdGggPSA1MDAsIGZpbGwgPSAnYmx1ZScpDQpgYGANCg0KDQojIyMjIDQuIEJp4buDdSDEkeG7kyBnacOhIGtpbSBjxrDGoW5nLCB24bubaSBiaeG7g3UgxJHhu5MgcGjDom4gbG/huqFpIGThu7FhIHRyw6puIG3DoHUgc+G6r2MgY+G7p2Ega2ltIGPGsMahbmcuIE3hu5dpIHRoYW5oIGJp4buDdSBkaeG7hW4gc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyBjw7MgZ2nDoSB0cm9uZyBt4buZdCBraG/huqNuZyBnacOhIGPhu5EgxJHhu4tuaCwgdsOgIGPDsyBoYWkgaGlzdG9ncmFtIHJpw6puZyBiaeG7h3QgY2hvIG3DoHUgSCB2w6AgSSB24bubaSBtw6B1IHPhuq9jIHTGsMahbmcg4bupbmcgbMOgIGJsdWUgdsOgIGdyZWVuLg0KDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gcHJpY2UpKSArDQogIGxhYnModGl0bGU9IkJp4buDdSDEkeG7kyBQcmljZSIpKw0KICBnZW9tX2hpc3RvZ3JhbSAoZGF0YSA9IGQgJT4lIGZpbHRlcihjb2xvciA9PSAnRicpLCBmaWxsID0gJ3B1cnBsZScpICsNCiAgZ2VvbV9oaXN0b2dyYW0oZGF0YSA9IGQgJT4lIGZpbHRlcihjb2xvciA9PSAnSCcpLCBmaWxsID0gJ2JsdWUnKQ0KYGBgDQoNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBwcmljZSkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAnYmx1ZScpICsNCiAgZmFjZXRfd3JhcCh+Y3V0KQ0KYGBgDQoNCg0KIyMjIyA1LmJp4buDdSDEkeG7kyBt4bqtdCDEkeG7mSBj4bunYSBnacOhIGtpbSBjxrDGoW5nLCB24bubaSBt4buXaSBuaMOzbSBiaeG7g3UgZGnhu4VuIGThu68gbGnhu4d1IMSRxrDhu6NjIHBow6JuIGxv4bqhaSBk4buxYSB0csOqbiBsb+G6oWkgY+G6r3QgY+G7p2Ega2ltIGPGsMahbmcuIE3hu5dpIG5ow7NtIGPDsyBt4buZdCBt4bqtdCDEkeG7mSByacOqbmcgYmnhu4d0IGPhu6dhIG7DsywgdsOgIHBow6JuIGxv4bqhaSDEkcaw4bujYyB0aOG7sWMgaGnhu4duIMSR4buDIHNvIHPDoW5oIHBow6JuIHBo4buRaSBj4bunYSBnacOhIGtpbSBjxrDGoW5nIGdp4buvYSBjw6FjIGxv4bqhaSBj4bqvdC4NCg0KYGBge3J9DQpkICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBuLGZpbGwgPSBjb2xvcikpICsNCiAgICBnZW9tX2NvbCgpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbikscG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDEpKQ0KYGBgDQoNCg0KDQojIyAqKkUuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gQ0xBUklUWSoqDQoNCg0KYGBge3J9DQpkICU+JSAgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShmcmVxPSBuKCkpICU+JQ0KZ2dwbG90KGFlcyh4ID0gY2xhcml0eSx5ID0gZnJlcSkpICsNCiAgZ2VvbV9jb2woZmlsbD0ncHVycGxlJykgKw0KICBsYWJzKHRpdGxlPSJCaeG7g3UgxJHhu5MgOCBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID1mcmVxKSx2anVzdCA9IC0wLjUsIGNvbG9yID0nYmxhY2snKSArDQogIGxhYnMoeD0gJ0xv4bqhaScsIHk9J1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCg0KIyMjIyAxLlbhu5tpIDggbeG7qWMgxJHhu5kgdGluaCBraGnDqnQgY+G7p2EgIGtpbSBjxrDGoW5nIHRow6wgdGEgY8OzIHRo4buDIHRo4bqleSAqKlNJMSoqIGNoaeG6v20gc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCwgdGnhur9wIHRoZW8gxJHDsyBsw6AgKipWUzIqKi4gTeG7qWMgxJHhu5kgdGluaCBraGnhur90IHRo4bqlcCBuaOG6pXQgbMOgICpJMSoqLiBWw6AgZMaw4bubaSDEkcOieSBsw6AgYmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBz4buRIHBo4bqnbiB0cuG6sW0gbcOgIHThu6tuZyBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgY8OzIHRo4buDIGNoaeG6v20gxJHGsOG7o2MuDQogICAgDQoNCg0KYGBge3J9DQpkICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKGNsYXJpdHksbikpICsNCiAgIGdlb21fY29sKGZpbGw9ICdwdXJwbGUnKSArDQogICBsYWJzKHRpdGxlPSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QiKSsNCiAgIGdlb21fdGV4dCAoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aChkJGNsYXJpdHkpKSksIHZqdXN0PS0wLjMsIGNvbG9yPSAnYmxhY2snKSsNCiAgIGxhYnMoeD0gIkxv4bqhaSAiLCB5PSAiU+G7kSBsxrDhu6NuZyIpDQpgYGANCg0KDQpgYGB7cn0NCmQgJT4lIGdyb3VwX2J5KGNvbG9yLGNsYXJpdHkpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LHkgPSBuKSkgKw0KICAgIGdlb21fY29sKGZpbGwgPSAncHVycGxlJykgKw0KICAgIGZhY2V0X3dyYXAofmNvbG9yKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMCwgY29sb3IgPSAnYmxhY2snKSArDQogICAgbGFicyh4ID0gJ03hu6ljIMSR4buZIHRpbmgga2hp4bq/dCcsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KDQojIyMjIEJp4buDdSDEkeG7kyBjaG8gdGjhuqV5IHThuqduIHN14bqldCBj4bunYSBjw6FjIG5ow7NtIG3hu6ljIMSR4buZIHRpbmgga2hp4bq/dCB0cm9uZyB04burbmcgbcOgdSBz4bqvYy4gQmnhu4N1IMSR4buTIGdpw7pwIGNow7puZyB0YSBoaeG7g3UgxJHGsOG7o2MgbeG7kWkgcXVhbiBo4buHIGdp4buvYSBt4bupYyDEkeG7mSB0aW5oIGtoaeG6v3QgdsOgIG3DoHUgc+G6r2MgY+G7p2Ega2ltIGPGsMahbmcgdHJvbmcgdOG6rXAgZOG7ryBsaeG7h3UuDQoNCg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IGNsYXJpdHkpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gJ3B1cnBsZScpICsNCiAgZmFjZXRfd3JhcCh+Y3V0KQ0KYGBgDQogICAgICAgICANCg0KIyMjIyAyLsSQw6J5IGzDoCBiaeG7g3UgxJHhu5MgbeG6rXQgxJHhu5kgY+G7p2EgdGluaCBraGnhur90IGtpbSBjxrDGoW5nLCB24bubaSBt4buXaSBjw6FjaCBj4bqvdCBraMOhYyBuaGF1IGPhu6dhIGtpbSBjxrDGoW5nIMSRxrDhu6NjIGhp4buDbiB0aOG7iyB0cm9uZyBt4buZdCBi4bqjbmcgYmnhu4N1IMSR4buTIHJpw6puZyBiaeG7h3QuIMSQaeG7gXUgbsOgeSBnacO6cCBzbyBzw6FuaCDEkeG7mSB0aW5oIGtoaeG6v3QgY+G7p2Ega2ltIGPGsMahbmcgZ2nhu69hIGPDoWMgbG/huqFpIGPhuq90IGtow6FjIG5oYXUuDQoNCmBgYHtyfQ0KZCAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSkpICsNCiAgbGFicyh0aXRsZT0gIkJp4buDdSDEkeG7kyBDbGFyaXR5IikrDQogIGdlb21fZGVuc2l0eShmaWxsID0gJ3B1cnBsZScpDQpgYGANCg0KDQojIyAqKkYuIEJp4buDdSDEkeG7kyB0aOG7gyBoaeG7h24gREVQVEgqKg0KDQpgYGB7cn0NCmQgJT4lIGdncGxvdChhZXMoeCA9IGRlcHRoKSkgKyANCiAgICAgICAgICBsYWJzKHRpdGxlPSAiQmnhu4N1IMSR4buTIHRo4buDIGhp4buHbiDEkeG7mSBzw6J1ICIpICsNCiAgICAgICAgICBnZW9tX2JhcigpICsNCiAgICAgICAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBkZXB0aCkpICsNCiAgbGFicyh0aXRsZSA9IkJp4buDdSDEkeG7kyBEZXRoICIpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAnZ3JlZW4nKSArDQogIGZhY2V0X3dyYXAofmN1dCkNCmBgYA0KDQojIyMjIFRo4buDIGhp4buHbiBjaOG6pXQgbMaw4budbmcgY2hp4buBdSBzw6J1IGPhu6dhIGtpbSBjxrDGoW5nIOG7nyB04burbmcgYmnhu4N1IMSR4buTIHJpw6puZyBiaeG7h3QNCg0KDQoNCg0KYGBge3J9DQpkICU+JSBnZ3Bsb3QoYWVzKHggPSBkZXB0aCkpICsNCiAgZ2VvbV9kZW5zaXR5KGZpbGwgPSAnZ3JlZW4nKQ0KYGBgDQoNCg0KDQoNCg==