t <- diamonds

BIỂU ĐỒ 1

t %>% group_by(clarity) %>% summarise(m= mean(price)) %>%
  ggplot(aes(x = clarity,y = m)) +
  geom_col(position = 'dodge') +
  geom_text(aes(label = round(m,1)), vjust = 2, color = 'green') +
  labs(x = 'độ trong suốt', y = 'giá')

Ta phân loại kim cương theo độ trong suốt và tính giá trung bình của từng loại . Ở biểu đồ trên thì ta gắn x là độ trong suốt, y là giá trung bình của từng loại; các số liệu sẽ có màu xanh lá cây, được làm tròn 01 chữ số thập phân và được điều chỉnh ở vị trí dọc cách cột với đơn vị là 2. Qua biểu đồ trên ta thấy kim cương có độ trong suốt SI2 là có giá trung bình cao nhất, tiếp đến là SI2, thấp hơn nữa lần lượt là VS2, I1, VS1, WS2, IF và thấp nhất là Ws1

BIỂU ĐỒ 2

t %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(color,n)) +
    geom_col(fill='red') +
    geom_text(aes(label = n),vjust = 2, color = 'black') +
    xlab('Color') +
    ylab('Số lượng') +
    labs(title ='số lượng kim cương theo màu sắc')

Ta Phân loại kim cương theo màu sắc và tính số lượng của từng màu sắc. x là màu sắc của kim cương, y là số lượng của từng loại màu sắc. Các số liệu có màu đen, được điều chỉnh ở vị trí dọc cách cột 2 đơn vị. Màu của các cột là màu đỏ . Qua biểu đồ trên ta thấy được nhiều nhất là màu G với 11292 viên, tiếp đến là E với 9797 viên, F với 9542 viên, H với 8304 viên,D với 6775 viên, I với 5422 viên và ít nhất là màu J với 2808 viên # BIỂU ĐỒ 3

t %>% ggplot(aes(x = cut)) +
    geom_bar() +
    labs(x = 'Loại', y = 'Số lượng') +
    coord_flip() +
    labs(title = 'Số kim cương theo kiểu cắt(biểu đồ ngang)')

Ta phân loại kim cương theo kiểu cắt. Biểu đồ ngang trên cho ta thấy được kiểu Gía của kim cương theo từng kiểu cắt. Ta thấy số kim cương sẽ tăng dần từ Fair, Good, Very Good, Premium, Ideal

BIỂU ĐỒ 4

t %>% ggplot(aes(x = cut)) +
    geom_bar() +
    labs(x = 'Loại', y = 'Số lượng') +
    labs(title = 'Số kim cương theo kiểu cắt(biểu đồ dọc)')

Ta phân loại kim cương theo kiểu cắt. Biểu đồ dọc trên cho ta thấy được kiểu Gía của kim cương theo từng kiểu cắt. Ta thấy số kim cương sẽ tăng dần từ Fair, Good, Very Good, Premium, Ideal

BIỂU ĐỒ 5

t %>% group_by(carat) %>% filter(carat == 0.5 | carat == 1.00 | carat == 1.5 | carat == 2.05) %>% summarise(n = n()) %>%
  ggplot(aes(carat,n)) +
    geom_col(fill='blue') +
     geom_text(aes(label = n),vjust = 2, color = 'white') +
    xlab('Carat') +
    ylab('Số lượng')

*Ta phân loại kim cương theo trọng lượng carat ở các mốc 0.5, 1.0, 1.5, 2.0 và tính số lượng của từng mốc khối lương. ta gắn x là carat và y là số lượng từng mốc carat. Các cột biểu đồ có màu xanh lá cây, các số liệu có màu trắng, được điều chỉnh ở vị trí dọc cách cột 2 đơn vị . Qua biểu đồ trên ta thấy được số kim cương có trọng lượng 1.0 carat là nhiều nhất và thấp nhất là 2.0

BIỂU ĐỒ 6

t %>% group_by(cut) %>% summarise(n = mean(price)) %>%
  ggplot(aes(cut,n)) +
  geom_col(fill='green') +
  geom_text(aes(label = round(n,2)),vjust = 2, color = 'red') +
  labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo kiểu cắt và tính giá trung bình. Ta gắn x là kiểu cắt, y là số lượng. Các số liệu sẽ có màu đỏ, được làm tròn đến 2 chữ thập phân và được điều chỉnh ở vị trí dọc cách cột với đơn vị là 2; cột biểu đồ có màu xanh lá cây. Qua biểu đồ ta thấy giá trung bình của từng kiểu cắt sẽ tăng dần từ Ideal, Good, Very Good, Fair, Premium

BIỂU ĐỒ 7

t %>% 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 = 'red') +
  labs(x = 'Kiểu cắt', y = 'Trọng lượng trung bình')

Ta phân loại kiểu cắt kim cương và tính trọng lượng trung bình (carat). ta gắn x là kiểu cắt, y là trọng lượng trung bình. Các số liệu sẽ có màu đỏ, được làm tròn đến 2 chữ thập phân và được điều chỉnh ở vị trí dọc cách cột với đơn vị là 2. Qua biểu đồ ta thấy được trọng lương trung bình của kim cương tăng từ Ideal(0.7 carat), Very Good(0.81 carat), Good(0.85 carat), Premium(0.89 carat) và Fair(1.05 carat)

BIỂU ĐỒ 8

t %>% 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 = 'green') +
  labs(x = 'Màu', y = 'Trọng lượng trung bình')

Ta phân loại kim cương theo màu sắc và tính trọng lượng trung bình theo đơn vị carat của từng loại . Ở biểu đồ trên thì ta gắn x là màu sắc, y là trọng lượng trung bình của từng loại; các số liệu sẽ có màu xanh lá cây, được làm tròn 2 chữ số thập phân và được điều chỉnh ở vị trí dọc cách cột với đơn vị là 2. Qua biểu đồ trên ta thấy màu J có trọng lượng trung bình cao nhất là giảm dần từ I, H , G , F, màu D Và E có trọng lượng trung bình thấp nhất.

BIỂU ĐỒ 9

t %>% group_by(color) %>% summarise(m= mean(price)) %>%
  ggplot(aes(x = color,y = m)) +
  geom_col(position = 'dodge') +
  geom_text(aes(label = round(m,0)), vjust = 2, color = 'green') +
  labs(x = 'màu sắc', y = 'Gía trung bình')

Ta phân loại kim cương theo màu sắc và tính giá trung bình của từng loại . Ở biểu đồ trên thì ta gắn x là màu sắc, y là giá trung bình của từng loại; các số liệu sẽ có màu xanh lá cây, được làm tròn 0 chữ số thập phân và được điều chỉnh ở vị trí dọc cách cột với đơn vị là 2. Qua biểu đồ trên Ta thấy màu J có giá trung bình cao nhất và giảm dần từ I, H, G, F, D và thấp nhất là màu D VỚI 3170 Đơn vị giá # BIỂU ĐỒ 10

ggplot(diamonds , aes_string(x = "cut", y = "price")) +
  geom_bar(stat = "identity") +
  labs(title = "Giá kim cương theo kiểu cắt",
       x = "Kiểu cắt",
       y = "Giá")

Ta phân loại kim cương theo tổng giá và kiểu cắt. Biểu đồ trên cho ta thấy được kiểu Gía của kim cương theo từng kiểu cắt. Ta thấy kiểu cắt Ideal thì giá kim cương sẽ tăng dần từ Fair, Good, Very Good, Premium, Ideal

BIỂU ĐỒ 11

t %>% group_by(cut) %>% summarise(n = n()) %>%
  ggplot(aes(cut,n)) +
  geom_col(fill='green') +
  geom_text(aes(label = n),vjust = 2, color = 'red') +
  labs(x = 'Kiểu Cắt', y = 'Số lượng')

Ta phân loại kim cương theo kiểu cắt và tính số lượng của từng màu . Ở biểu đồ trên thì ta gắn x là kiểu cắt, y là số lượng của từng loại; các số liệu sẽ có màu đỏ và được điều chỉnh ở vị trí dọc cách cột với đơn vị là 2; các cột sẽ có màu xanh lá cây. Qua biểu đồ trên ta thấy loại Fair có số lượng ít nhất và tăng dần theo kiểu cắt Good, Very Good, Premium và kiểu cắt Premium là cố số lượng nhiều nhất # BIỂU ĐỒ 12

t %>% group_by(clarity) %>% summarise(n = n()) %>%
  ggplot(aes(x = clarity,y = n)) +
  geom_col(position = 'dodge') +
  geom_text(aes(label = round(n,2)), vjust = 2, color = 'green') +
  labs(x = 'độ trong suốt', y = 'số lượng')

Ta phân loại kim cương theo độ trong suốt và tính số lượng . Ở biểu đồ trên thì ta gắn x là độ trong suốt, y là số lượng của từng loại; các số liệu sẽ có màu xanh lá cây, được làm tròn 5 chữ số thập phân và được điều chỉnh ở vị trí dọc cách cột với đơn vị là 2. Qua biểu đồ trên ta thấy độ trong suốt có số lượng nhiều nhất là SI1, giảm dần từ VS2 ,SI2, VS1, WS2, WS1, IF và I1 là độ trong suốt có số lượng thấp nhất

BIỂU ĐỒ 13

t %>% group_by(clarity) %>% summarise(m= mean(carat)) %>%
  ggplot(aes(x = clarity,y = m)) +
  geom_col(position = 'dodge') +
  geom_text(aes(label = round(m,5)), vjust = 2, color = 'green') +
  labs(x = 'độ trong suốt', y = 'trọng lượng trung bình')

Ta phân loại kim cương theo độ trong suốt và tính trọng lượng trung bình của chúng theo đơn vị carat. Ở biểu đồ trên thì ta gắn x là độ trong suốt, y là khối lượng trung bình của từng loại; các số liệu sẽ có màu xanh lá cây, được làm tròn 5 chữ số thập phân và được điều chỉnh ở vị trí dọc cách cột với đơn vị là 2. Và ta thấy được kim cương có độ trong suốt cao nhất là I1, thấp hơn đó là SI2 và giảm dần từ SI1, VS2, VS1, WS2, WS1, và thấp nhất là IF.

BIỂU ĐỒ 14

t <- t %>% mutate(caratC = cut(carat,4, label = c('rất nhỏ', 'nhỏ','vừa','lớn')))
t %>% ggplot(aes(x = caratC)) +
  geom_bar(fill = 'red') +
  labs(x = 'phân loại', y = 'số lượng')

Ta thêm 1 cột dữ liêu caratC vào bộ dữ liệu t để đánh giá trọng lượng của các viên kim cương theo mức độ ‘rất nhỏ’ ‘nhỏ’, ‘vừa’ và ‘lớn’. Các cột biểu đồ có màu đỏ. Qua biểu đồ trên ta thấy số lượng kim cương có trọng lượng ‘rất nhỏ’ là lớn nhất và giảm dần từ ‘nhỏ’, ‘vừa’ và thấp nhất là loại ‘lớn’

BIỂU ĐỒ 15

t <- t %>% mutate(priceC = cut(price,5, label = c('rất thấp', 'thấp','vừa','cao','rất cao')))
t %>% ggplot(aes(x = priceC)) +
  geom_bar(fill = 'red') +
  labs(x = 'phân loại', y = 'số lượng')

Ta thêm 1 cột dữ liêu priceC vào bộ dữ liệu t để đánh giá Gía cả của các viên kim cương theo mức độ ‘rất thấp’ ‘thấp’, ‘vừa’, ‘cao’ và ‘rất cao’. Các cột biểu đồ có màu đỏ. Qua biểu đồ trên ta thấy số lượng kim cương có giá ‘rất thấp’ là lớn nhất và giảm dần từ ‘thấp’, ‘vừa’, ‘cao’ và thấp nhất là loại ‘rất cao’

BIỂU ĐỒ 16

t <- diamonds 
b <- t %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
b %>% ggplot(aes(x = cut, y = n)) +
  geom_col(data = b %>% filter(color == 'D'), fill = 'red') +
  geom_col(data = b %>% filter(color == 'J'), fill = 'blue')

Ta phân loại kim cương theo kiểu cắt và màu sắc sau đó tính số lượng . Ở biểu đồ trên thì ta gắn x là kiểu cắt, y là số lượng của từng loại; ta sẽ lọc các loại kim cương có màu D,cột biểu đồ có màu đỏ và lọc các loại kim cương có màu J, biểu đồ có màu xanh dương. Qua biểu đồ trên ta đã lọc được số lượng kim cương màu D phân bổ ít nhất ở kiểu cắt Fair và tăng dần lên từ Good, Very Good, Premium, và nhiều nhất là Ideal. Và số lượng kim cương có màu J cũng phẩn bổ tương tự như kim cương có màu D # BIỂU ĐỒ 17

t <- diamonds 
b <- t %>% group_by(cut, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.
b %>% ggplot(aes(x = cut, y = n)) +
  geom_col(data = b %>% filter(color == 'E'), fill = 'red') +
  geom_col(data = b %>% filter(color == 'H'), fill = 'blue')

***Tương tự như biểu đồ số 17, lần này thay vì lọc các kim cương có màu ‘D’ VÀ ‘J’ thì ta sẽ lọc các kim cương có màu ‘E’ VÀ ‘H’. Ở biểu đồ này ta thấy màu E không phân bổ ở loại kim cương có kiểu cắt Fair, Premium, và màu sắc này phân bổ nhiều nhất ở kiểu cắt Ideal giảm dần từ Very Good, Good. Màu H phân bổ ở các kiểu cắt, nhiều nhất là Ideal và giảm dần từ Premium, Very Good, Good và thấp nhất là Fair # BIỂU ĐỒ 18

b <- t %>% group_by(clarity, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
b %>% ggplot(aes(x = clarity, y = n)) +
  geom_col(data = b %>% filter(color == 'F'), fill = 'red') +
  geom_col(data = b %>% filter(color == 'J'), fill = 'blue')

Ta phân loại kim cương theo kiểu độ trong suốt và màu sắc sau đó tính số lượng . Ở biểu đồ trên thì ta gắn x là độ trong suốt, y là số lượng của từng loại; ta sẽ lọc các loại kim cương có màu ‘F’,cột biểu đồ có màu đỏ và lọc các loại kim cương có màu J, biểu đồ có màu xanh dương. Qua biểu đồ trên ta thấy các màu phân bổ ở tất cả độ trong suốt. Trong đó màu J sẽ phân bổ nhiều nhất ở SI1 rồi giảm dần từ VS2, VS1, SI2, WS2, WS1, IF và thấp nhất là I1. Còn màu F Phân bổ nhiều nhất ở VS2 rồi giảm dần từ SI1, SI2, VS1, WS2, WS1, IF và tháp nhất là I1.

BIỂU ĐỒ 19

b <- t %>% group_by(clarity, color) %>% summarise(n = n())
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
b %>% ggplot(aes(x = clarity, y = n)) +
  geom_col(data = b %>% filter(color == 'E'), fill = 'red') +
  geom_col(data = b %>% filter(color == 'G'), fill = 'blue')

Tương tự như biểu đồ số 18, lần này thay vì lọc các kim cương có màu ‘F’ VÀ ‘J’ thì ta sẽ lọc các kim cương có màu ‘E’ VÀ ‘G’. Ở biểu đồ này ta thấy màu E chỉ phân bổ ở loại kim cương độ trong suốt là SI2,VS2 và SI1. Còn kim cương màu G phân bổ ở tất cả độ trong suốt, trong đó nhiều nhất là VS2, giảm dần từ VS1, SI1, SI2, VVS2, VVS1, IF và phân bổ ít nhất ở I1.

BIỂU ĐỒ 20

c <- t %>% group_by(clarity, cut) %>% summarise(n = n())
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
c %>% ggplot(aes(x = cut, y = n)) +
  geom_col(data = c %>% filter(clarity == 'IF'), fill = 'red') +
  geom_col(data = c %>% filter(clarity == 'I1'), fill = 'blue')

Ta phân loại kim cương theo kiểu độ trong suốt và kiểu cắt sau đó tính số lượng . Ở biểu đồ trên thì ta gắn x là kiểu cắt, y là số lượng của từng loại; Ta lọc các kim cương có độ trong suốt ‘IF’ là các cột màu đỏ, các kim cương có độ trong suốt ‘I1’ là các cột màu xanh. Qua biểu đồ trên ta thấy kim cương có độ trong suốt ‘IF’ chỉ phân bổ ở kiểu cắt Ideal, Very Good, Premium theo số lượng giảm dần. Trong khi đó độ trong suốt I1 phân bổ ở mọi kiểu cắt, nhiều nhất là Premium và giảm dần từ Fair, Idea, Good, thấp nhất là Very Good.

BIỂU ĐỒ 21

f <- t %>% group_by(clarity, cut) %>% summarise(n = n())
## `summarise()` has grouped output by 'clarity'. You can override using the
## `.groups` argument.
f %>% ggplot(aes(x = cut, y = n)) +
  geom_col(data = f %>% filter(clarity == 'SI1'), fill = 'red') +
  geom_col(data = f %>% filter(clarity == 'SI2'), fill = 'blue')

Tương tự như biểu đồ số 20, lần này thay vì lọc các kim cương có độ trong suốt ‘iF’ VÀ ‘i1’ thì ta sẽ lọc các kim cương có độ trong suốt ‘SI1’ VÀ ‘SI2’. Ở biểu đồ này ta thấy độ trong suốt SI1 không phân bổ ở loại kim cương có kiểu cắt Fair, phân bố nhiều nhất ở kiểu cắt Ideal giảm dần từ Very Good, Premium và phân bổ ít nhất ở kiểu cắt Good. Kim cương có độ trong suốt SI2 phân bổ ở tất cả kiểu cắt, nhiều nhất ở kiểu cắt Premium giảm dần từ Ideal, Very Good, Good và phân bổ ít nhất ở kiểu cắt Fair.

BIỂU ĐỒ 22

t %>% group_by(cut) %>% summarise(n = n()) %>%
  ggplot(aes(cut,n)) +
  geom_col(fill='green') +
  geom_text(aes(label = percent(n/length(t$carat))),vjust = 2, color = 'red') +
  labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo kiểu cắt và tính số lượng của các kiểu cắt. ta gắn x là ‘Loại’, y là ‘Số Lượng’. Các cột biểu đồ được tô màu xanh lá cây, các số liệu là tỷ khối lượng của mỗi kiểu cắt, các số liệu này có màu đỏ và được điều chỉnh vị trí dọc các cột dữ liệu với đơn vị là 2. Qua biểu đồ trên ta thấy Kiểu cắt Ideal chiếm tỷ lệ cao nhất về trọng lượng (đơn vị carat) và giảm dần từ Premium, Very Good, Good và kiểu cắt Fair có tỷ lệ trọng lượng thấp nhất

BIỂU ĐỒ 23

t %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(color,n)) +
  geom_col(fill='green') +
  geom_text(aes(label = percent(n/length(t$carat))),vjust = 2, color = 'red') +
  labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo kiểu màu sắc và tính số lượng của các màu. ta gắn x là ‘Loại’, y là ‘Số Lượng’. Các cột biểu đồ được tô màu xanh lá cây, các số liệu là tỷ lệ khối lượng của mỗi kiểu cắt, các số liệu này có màu đỏ và được điều chỉnh vị trí dọc các cột dữ liệu với đơn vị là 2. Qua biểu đồ trên ta thấy kim cương màu G chiếm tỷ lệ cao nhất về trọng lượng(20,93), giảm dần là E, F, H, D, I và kim cương màu J chiếm tỷ lệ thấp nhất (5,21%)

BIỂU ĐỒ 24

t %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(color,n)) +
  geom_col(fill='green') +
  geom_text(aes(label = percent(n/length(t$price))),vjust = 2, color = 'red') +
  labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo kiểu màu sắc và tính số lượng của các màu. ta gắn x là ‘Loại’, y là ‘Số Lượng’. Các cột biểu đồ được tô màu xanh lá cây, các số liệu là tỷ lệ giá tiền của mỗi kiểu cắt, các số liệu này có màu đỏ và được điều chỉnh vị trí dọc các cột dữ liệu với đơn vị là 2. Qua biểu đồ trên ta thấy kim cương màu G chiếm tỷ lệ cao nhất về giá(20,93%), giảm dần là E, F, H, D, I và kim cương màu J chiếm tỷ lệ thấp nhất (5,21%)

BIỂU ĐỒ 25

t %>% group_by(clarity) %>% summarise(n = n()) %>%
  ggplot(aes(clarity,n)) +
  geom_col(fill='green') +
  geom_text(aes(label = percent(n/length(t$price))),vjust = 2, color = 'red') +
  labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo độ trong suốt và tính số lượng của các màu. ta gắn x là ‘Loại’, y là ‘Số Lượng’. Các cột biểu đồ được tô màu xanh lá cây, các số liệu là tỷ lệ giá tiền của mỗi loại kim cương, các số liệu này có màu đỏ và được điều chỉnh vị trí dọc các cột dữ liệu với đơn vị là 2. Qua biểu đồ trên ta thấy kim cương có độ trong suốt SI1 chiếm tỷ lệ giá cao nhất (24,2%), giảm dần từ VS2, SI2, VS1, VVS2, VVS1, IF, I1(1,4%)

BIỂU ĐỒ 26

t %>% group_by(cut) %>% summarise(n = n()) %>%
  ggplot(aes(cut,n)) +
  geom_col(fill='green') +
  geom_text(aes(label = percent(n/length(t$price))),vjust = 2, color = 'red') +
  labs(x = 'Loại', y = 'Số lượng')

BIỂU ĐỒ 27

t %>% group_by(cut,color) %>% summarise(n=n()) %>%
  ggplot(aes(x = cut,y = n)) +
    geom_col(position = 'dodge') +
    facet_wrap(~color) +
    labs(x = 'Loại', y = 'Số lượng')
## `summarise()` has grouped output by 'cut'. You can override using the `.groups`
## argument.

Ta phân loại kim cương theo kiểu cắt và màu sắc sau đó tính số lượng. ta gắn x là loại, y la số lượng và ta chia thành 7 biểu đồ theo 7 loại màu sắc để so sánh. Qua 7 biểu đồ ta nhận xét các màu sắc phân bổ nhiều nhất ở kim cương có kiểu cắt Ideal, giảm dần qua các kiểu cắt Premium, Very Good, Good và phân bổ ít nhất ở kiểu cắt Fair

BIỂU ĐỒ 28

t %>% group_by(color) %>% summarise(m = mean(depth)) %>%
  ggplot(aes(color,m)) +
  geom_col(fill='green') +
  geom_text(aes(label = round(m,2)),vjust = 2, color = 'red') +
  labs(x = 'Loại', y = 'Số lượng')

Ta phân loại kim cương theo màu sắc và tính trung bình tỷ lệ độ sâu của từng loại. Các cột biểu đồ có màu xanh lá cây, các dữ liệu có màu đỏ, được làm tròn đến 2 chữ số thập phân và được điều chỉnh ở vị trí dọc cách cột 2 đơn vị. Qua biểu đồ trên ta thấy các loại màu của kim cương sẽ có xấp xỉ trung bình tỷ lệ độ sâu bằng nhau. Trong đó cao nhất là màu J và thấp nhất là màu E.

BIỂU ĐỒ 29

t %>% ggplot(aes(x = clarity)) +
  geom_bar() +
  labs(x = 'Cấp độ tinh khiết', y = 'Số lượng') +
  coord_flip() +
  labs(title = 'Cấp độ tinh khiết của kim cương (biểu đồ ngang)')

Ta phân loại kim cương theo độ trong suốt. ta gắn x là cấp độ tinh khiết, y là số lượng Và đây là biểu đồ ngang. Qua biểu đồ trên ta thấy SI1 có độ tinh khiết cao nhất, giảm dần từ VS2, SI2, VS1, VVS2, IF và I1 là kim cương có độ trong suốt thấp nhất

BIỂU ĐỒ 30

t %>% group_by(cut) %>% summarise(m= mean(depth)) %>%
  ggplot(aes(x = cut,y = m)) +
  geom_col(position = 'dodge') +
  geom_text(aes(label = round(m,2)), vjust = 2, color = 'green') +
  labs(x = 'Kiểu cắt', y = 'Mean')

Ta phân loại kim cương theo kiểu cắt và tính trung bình tỷ lệ độ sâu (trung bình z/x). ta gắn x là kiểu cắt, y là trung bình. các số liệu được làm tròn 2 chữ số thập phân, được điều chỉnh ở vị trí cách cột dọc 2 đơn vị và có màu xanh lá cây. Qua biểu đồ trên ta thấy kiểu cắt Fair có độ sâu trung bình lớn nhất, giảm dần từ Good, Very Good, Ideal và thấp nhất là Premium

Cảm ơn thầy đã đọc, chúc thầy 1 ngày làm việc vui vẻ

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA0Ig0KYXV0aG9yOiAiTmd1eeG7hW4gUGjDumMgVGjhu4tuaCINCmRhdGU6ICJgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVIOiVNOiVTLCAlZCAtICVtIC0gJVknKWAiDQpvdXRwdXQ6DQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIHRoZW1lOiAiZGVmYXVsdCINCiAgICB0b2NfZGVwdGg6IDMNCiAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICB0b2M6IHRydWUNCi0tLQ0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsaWJyYXJ5KGRwbHlyKQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoRFQpDQpgYGANCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCA8LSBkaWFtb25kcw0KYGBgDQoNCiMgQknhu4JVIMSQ4buSIDENCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShtPSBtZWFuKHByaWNlKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGNsYXJpdHkseSA9IG0pKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwxKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnZ3JlZW4nKSArDQogIGxhYnMoeCA9ICfEkeG7mSB0cm9uZyBzdeG7kXQnLCB5ID0gJ2dpw6EnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRyb25nIHN14buRdCB2w6AgdMOtbmggZ2nDoSB0cnVuZyBiw6xuaCBj4bunYSB04burbmcgbG/huqFpIC4g4bueIGJp4buDdSDEkeG7kyB0csOqbiB0aMOsIHRhIGfhuq9uIHggbMOgIMSR4buZIHRyb25nIHN14buRdCwgeSBsw6AgZ2nDoSB0cnVuZyBiw6xuaCBj4bunYSB04burbmcgbG/huqFpOyBjw6FjIHPhu5EgbGnhu4d1IHPhur0gY8OzIG3DoHUgeGFuaCBsw6EgY8OieSwgxJHGsOG7o2MgbMOgbSB0csOybiAwMSBjaOG7ryBz4buRIHRo4bqtcCBwaMOibiB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgduG7m2kgxJHGoW4gduG7iyBsw6AgMi4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkga2ltIGPGsMahbmcgY8OzIMSR4buZIHRyb25nIHN14buRdCBTSTIgbMOgIGPDsyBnacOhIHRydW5nIGLDrG5oIGNhbyBuaOG6pXQsIHRp4bq/cCDEkeG6v24gbMOgIFNJMiwgdGjhuqVwIGjGoW4gbuG7r2EgbOG6p24gbMaw4bujdCBsw6AgVlMyLCBJMSwgVlMxLCBXUzIsIElGIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBXczEqKioNCg0KIyBCSeG7glUgxJDhu5IgMg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY29sb3IsbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdyZWQnKSArDQogICAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAnYmxhY2snKSArDQogICAgeGxhYignQ29sb3InKSArDQogICAgeWxhYignU+G7kSBsxrDhu6NuZycpICsNCiAgICBsYWJzKHRpdGxlID0nc+G7kSBsxrDhu6NuZyBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2MnKQ0KYGBgDQoNCg0KKioqVGEgUGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYyB2w6AgdMOtbmggc+G7kSBsxrDhu6NuZyBj4bunYSB04burbmcgbcOgdSBz4bqvYy4geCBsw6AgbcOgdSBz4bqvYyBj4bunYSBraW0gY8awxqFuZywgeSBsw6Agc+G7kSBsxrDhu6NuZyBj4bunYSB04burbmcgbG/huqFpIG3DoHUgc+G6r2MuIEPDoWMgc+G7kSBsaeG7h3UgY8OzIG3DoHUgxJFlbiwgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgMiDEkcahbiB24buLLiBNw6B1IGPhu6dhIGPDoWMgY+G7mXQgbMOgIG3DoHUgxJHhu48gIC4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkgxJHGsOG7o2Mgbmhp4buBdSBuaOG6pXQgbMOgIG3DoHUgRyB24bubaSAxMTI5MiB2acOqbiwgdGnhur9wIMSR4bq/biBsw6AgRSB24bubaSA5Nzk3IHZpw6puLCBGIHbhu5tpIDk1NDIgdmnDqm4sIEggduG7m2kgODMwNCB2acOqbixEIHbhu5tpIDY3NzUgdmnDqm4sIEkgduG7m2kgNTQyMiB2acOqbiB2w6Agw610IG5o4bqldCBsw6AgbcOgdSBKIHbhu5tpIDI4MDggdmnDqm4qKioNCiMgQknhu4JVIMSQ4buSIDMNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0KSkgKw0KICAgIGdlb21fYmFyKCkgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKSArDQogICAgY29vcmRfZmxpcCgpICsNCiAgICBsYWJzKHRpdGxlID0gJ1Phu5Ega2ltIGPGsMahbmcgdGhlbyBraeG7g3UgY+G6r3QoYmnhu4N1IMSR4buTIG5nYW5nKScpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8ga2nhu4N1IGPhuq90LiBCaeG7g3UgxJHhu5MgbmdhbmcgdHLDqm4gY2hvIHRhIHRo4bqleSDEkcaw4bujYyBraeG7g3UgR8OtYSBj4bunYSBraW0gY8awxqFuZyB0aGVvIHThu6tuZyBraeG7g3UgY+G6r3QuIFRhIHRo4bqleSBz4buRIGtpbSBjxrDGoW5nIHPhur0gdMSDbmcgZOG6p24gdOG7qyBGYWlyLCBHb29kLCBWZXJ5IEdvb2QsIFByZW1pdW0sIElkZWFsKioqDQoNCiMgQknhu4JVIMSQ4buSIDQNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdncGxvdChhZXMoeCA9IGN1dCkpICsNCiAgICBnZW9tX2JhcigpICsNCiAgICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykgKw0KICAgIGxhYnModGl0bGUgPSAnU+G7kSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSBj4bqvdChiaeG7g3UgxJHhu5MgZOG7jWMpJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBraeG7g3UgY+G6r3QuIEJp4buDdSDEkeG7kyBk4buNYyB0csOqbiBjaG8gdGEgdGjhuqV5IMSRxrDhu6NjIGtp4buDdSBHw61hIGPhu6dhIGtpbSBjxrDGoW5nIHRoZW8gdOG7q25nIGtp4buDdSBj4bqvdC4gVGEgdGjhuqV5IHPhu5Ega2ltIGPGsMahbmcgc+G6vSB0xINuZyBk4bqnbiB04burIEZhaXIsIEdvb2QsIFZlcnkgR29vZCwgUHJlbWl1bSwgSWRlYWwqKioNCg0KIyBCSeG7glUgxJDhu5IgNQ0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjYXJhdCkgJT4lIGZpbHRlcihjYXJhdCA9PSAwLjUgfCBjYXJhdCA9PSAxLjAwIHwgY2FyYXQgPT0gMS41IHwgY2FyYXQgPT0gMi4wNSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhjYXJhdCxuKSkgKw0KICAgIGdlb21fY29sKGZpbGw9J2JsdWUnKSArDQogICAgIGdlb21fdGV4dChhZXMobGFiZWwgPSBuKSx2anVzdCA9IDIsIGNvbG9yID0gJ3doaXRlJykgKw0KICAgIHhsYWIoJ0NhcmF0JykgKw0KICAgIHlsYWIoJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIHRy4buNbmcgbMaw4bujbmcgY2FyYXQg4bufIGPDoWMgbeG7kWMgMC41LCAxLjAsIDEuNSwgMi4wIHbDoCB0w61uaCBz4buRIGzGsOG7o25nIGPhu6dhIHThu6tuZyBt4buRYyBraOG7kWkgbMawxqFuZy4gdGEgZ+G6r24geCBsw6AgY2FyYXQgdsOgIHkgbMOgIHPhu5EgbMaw4bujbmcgdOG7q25nIG3hu5FjIGNhcmF0LiBDw6FjIGPhu5l0IGJp4buDdSDEkeG7kyBjw7MgbcOgdSB4YW5oIGzDoSBjw6J5LCBjw6FjIHPhu5EgbGnhu4d1IGPDsyBtw6B1IHRy4bqvbmcsIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCDhu58gduG7iyB0csOtIGThu41jIGPDoWNoIGPhu5l0IDIgxJHGoW4gduG7iyAuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IMSRxrDhu6NjIHPhu5Ega2ltIGPGsMahbmcgY8OzIHRy4buNbmcgbMaw4bujbmcgMS4wIGNhcmF0IGzDoCBuaGnhu4F1IG5o4bqldCB2w6AgdGjhuqVwIG5o4bqldCBsw6AgMi4wKioNCg0KIyBCSeG7glUgxJDhu5IgNg0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobiA9IG1lYW4ocHJpY2UpKSAlPiUNCiAgZ2dwbG90KGFlcyhjdXQsbikpICsNCiAgZ2VvbV9jb2woZmlsbD0nZ3JlZW4nKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChuLDIpKSx2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpICsNCiAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8ga2nhu4N1IGPhuq90IHbDoCB0w61uaCBnacOhIHRydW5nIGLDrG5oLiBUYSBn4bqvbiB4IGzDoCBraeG7g3UgY+G6r3QsIHkgbMOgIHPhu5EgbMaw4bujbmcuIEPDoWMgc+G7kSBsaeG7h3Ugc+G6vSBjw7MgbcOgdSDEkeG7jywgxJHGsOG7o2MgbMOgbSB0csOybiDEkeG6v24gMiBjaOG7ryB0aOG6rXAgcGjDom4gdsOgIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCDhu58gduG7iyB0csOtIGThu41jIGPDoWNoIGPhu5l0IHbhu5tpIMSRxqFuIHbhu4sgbMOgIDI7IGPhu5l0IGJp4buDdSDEkeG7kyBjw7MgbcOgdSB4YW5oIGzDoSBjw6J5LiBRdWEgYmnhu4N1IMSR4buTIHRhIHRo4bqleSBnacOhIHRydW5nIGLDrG5oIGPhu6dhIHThu6tuZyBraeG7g3UgY+G6r3Qgc+G6vSB0xINuZyBk4bqnbiB04burIElkZWFsLCBHb29kLCBWZXJ5IEdvb2QsIEZhaXIsIFByZW1pdW0qKioNCg0KIyBCSeG7glUgxJDhu5IgNw0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobT0gbWVhbihjYXJhdCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjdXQseSA9IG0pKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHggPSAnS2nhu4N1IGPhuq90JywgeSA9ICdUcuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2nhu4N1IGPhuq90IGtpbSBjxrDGoW5nIHbDoCB0w61uaCB0cuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oIChjYXJhdCkuIHRhIGfhuq9uIHggbMOgIGtp4buDdSBj4bqvdCwgeSBsw6AgdHLhu41uZyBsxrDhu6NuZyB0cnVuZyBiw6xuaC4gQ8OhYyBz4buRIGxp4buHdSBz4bq9IGPDsyBtw6B1IMSR4buPLCDEkcaw4bujYyBsw6BtIHRyw7JuIMSR4bq/biAyIGNo4buvIHRo4bqtcCBwaMOibiB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgduG7m2kgxJHGoW4gduG7iyBsw6AgMi4gUXVhIGJp4buDdSDEkeG7kyB0YSB0aOG6pXkgxJHGsOG7o2MgdHLhu41uZyBsxrDGoW5nIHRydW5nIGLDrG5oIGPhu6dhIGtpbSBjxrDGoW5nIHTEg25nIHThu6sgSWRlYWwoMC43IGNhcmF0KSwgVmVyeSBHb29kKDAuODEgY2FyYXQpLCBHb29kKDAuODUgY2FyYXQpLCBQcmVtaXVtKDAuODkgY2FyYXQpIHbDoCBGYWlyKDEuMDUgY2FyYXQpKioqDQoNCiMgQknhu4JVIMSQ4buSIDgNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG09IG1lYW4oY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY29sb3IseSA9IG0pKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobSwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnZ3JlZW4nKSArDQogIGxhYnMoeCA9ICdNw6B1JywgeSA9ICdUcuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBtw6B1IHPhuq9jIHbDoCB0w61uaCB0cuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oIHRoZW8gxJHGoW4gduG7iyBjYXJhdCBj4bunYSB04burbmcgbG/huqFpIC4g4bueIGJp4buDdSDEkeG7kyB0csOqbiB0aMOsIHRhIGfhuq9uIHggbMOgIG3DoHUgc+G6r2MsIHkgbMOgIHRy4buNbmcgbMaw4bujbmcgdHJ1bmcgYsOsbmggY+G7p2EgdOG7q25nIGxv4bqhaTsgY8OhYyBz4buRIGxp4buHdSBz4bq9IGPDsyBtw6B1IHhhbmggbMOhIGPDonksIMSRxrDhu6NjIGzDoG0gdHLDsm4gMiBjaOG7ryBz4buRIHRo4bqtcCBwaMOibiB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgduG7m2kgxJHGoW4gduG7iyBsw6AgMi4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkgbcOgdSBKIGPDsyB0cuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oIGNhbyBuaOG6pXQgbMOgIGdp4bqjbSBk4bqnbiB04burIEksIEggLCBHICwgRiwgbcOgdSBEIFbDoCBFIGPDsyB0cuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oIHRo4bqlcCBuaOG6pXQuKioqDQoNCiMgQknhu4JVIMSQ4buSIDkNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobT0gbWVhbihwcmljZSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBjb2xvcix5ID0gbSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDApKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpICsNCiAgbGFicyh4ID0gJ23DoHUgc+G6r2MnLCB5ID0gJ0fDrWEgdHJ1bmcgYsOsbmgnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIG3DoHUgc+G6r2MgdsOgIHTDrW5oIGdpw6EgdHJ1bmcgYsOsbmggY+G7p2EgdOG7q25nIGxv4bqhaSAuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCBtw6B1IHPhuq9jLCB5IGzDoCBnacOhIHRydW5nIGLDrG5oIGPhu6dhIHThu6tuZyBsb+G6oWk7IGPDoWMgc+G7kSBsaeG7h3Ugc+G6vSBjw7MgbcOgdSB4YW5oIGzDoSBjw6J5LCDEkcaw4bujYyBsw6BtIHRyw7JuIDAgY2jhu68gc+G7kSB0aOG6rXAgcGjDom4gdsOgIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCDhu58gduG7iyB0csOtIGThu41jIGPDoWNoIGPhu5l0IHbhu5tpIMSRxqFuIHbhu4sgbMOgIDIuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gVGEgdGjhuqV5IG3DoHUgSiBjw7MgZ2nDoSB0cnVuZyBiw6xuaCBjYW8gbmjhuqV0IHbDoCBnaeG6o20gZOG6p24gdOG7qyBJLCBILCBHLCBGLCBEIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBtw6B1IEQgVuG7mkkgMzE3MCDEkMahbiB24buLIGdpw6EqKioNCiMgQknhu4JVIMSQ4buSIDEwDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpnZ3Bsb3QoZGlhbW9uZHMgLCBhZXNfc3RyaW5nKHggPSAiY3V0IiwgeSA9ICJwcmljZSIpKSArDQogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArDQogIGxhYnModGl0bGUgPSAiR2nDoSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSBj4bqvdCIsDQogICAgICAgeCA9ICJLaeG7g3UgY+G6r3QiLA0KICAgICAgIHkgPSAiR2nDoSIpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8gdOG7lW5nIGdpw6EgdsOgIGtp4buDdSBj4bqvdC4gQmnhu4N1IMSR4buTIHRyw6puIGNobyB0YSB0aOG6pXkgxJHGsOG7o2Mga2nhu4N1IEfDrWEgY+G7p2Ega2ltIGPGsMahbmcgdGhlbyB04burbmcga2nhu4N1IGPhuq90LiBUYSB0aOG6pXkga2nhu4N1IGPhuq90ICBJZGVhbCB0aMOsIGdpw6Ega2ltIGPGsMahbmcgc+G6vSB0xINuZyBk4bqnbiB04burIEZhaXIsIEdvb2QsIFZlcnkgR29vZCwgUHJlbWl1bSwgSWRlYWwqKioNCg0KDQojIEJJ4buCVSDEkOG7kiAxMQ0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY3V0KSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKGN1dCxuKSkgKw0KICBnZW9tX2NvbChmaWxsPSdncmVlbicpICsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IG4pLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHggPSAnS2nhu4N1IEPhuq90JywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBraeG7g3UgY+G6r3QgdsOgIHTDrW5oIHPhu5EgbMaw4bujbmcgY+G7p2EgdOG7q25nIG3DoHUgLiDhu54gYmnhu4N1IMSR4buTIHRyw6puIHRow6wgdGEgZ+G6r24geCBsw6Aga2nhu4N1IGPhuq90LCB5IGzDoCBz4buRIGzGsOG7o25nIGPhu6dhIHThu6tuZyBsb+G6oWk7IGPDoWMgc+G7kSBsaeG7h3Ugc+G6vSBjw7MgbcOgdSDEkeG7jyB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgduG7m2kgxJHGoW4gduG7iyBsw6AgMjsgY8OhYyBj4buZdCBz4bq9IGPDsyBtw6B1IHhhbmggbMOhIGPDonkuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IGxv4bqhaSBGYWlyIGPDsyBz4buRIGzGsOG7o25nIMOtdCBuaOG6pXQgdsOgIHTEg25nIGThuqduIHRoZW8ga2nhu4N1IGPhuq90IEdvb2QsIFZlcnkgR29vZCwgUHJlbWl1bSB2w6Aga2nhu4N1IGPhuq90IFByZW1pdW0gbMOgIGPhu5Egc+G7kSBsxrDhu6NuZyBuaGnhu4F1IG5o4bqldCoqKg0KIyBCSeG7glUgxJDhu5IgMTINCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdyb3VwX2J5KGNsYXJpdHkpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGNsYXJpdHkseSA9IG4pKSArDQogIGdlb21fY29sKHBvc2l0aW9uID0gJ2RvZGdlJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobiwyKSksIHZqdXN0ID0gMiwgY29sb3IgPSAnZ3JlZW4nKSArDQogIGxhYnMoeCA9ICfEkeG7mSB0cm9uZyBzdeG7kXQnLCB5ID0gJ3Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIMSR4buZIHRyb25nIHN14buRdCB2w6AgdMOtbmggc+G7kSBsxrDhu6NuZyAuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCDEkeG7mSB0cm9uZyBzdeG7kXQsIHkgbMOgIHPhu5EgbMaw4bujbmcgY+G7p2EgdOG7q25nIGxv4bqhaTsgY8OhYyBz4buRIGxp4buHdSBz4bq9IGPDsyBtw6B1IHhhbmggbMOhIGPDonksIMSRxrDhu6NjIGzDoG0gdHLDsm4gNSBjaOG7ryBz4buRIHRo4bqtcCBwaMOibiB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgduG7m2kgxJHGoW4gduG7iyBsw6AgMi4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkgxJHhu5kgdHJvbmcgc3Xhu5F0IGPDsyBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0IGzDoCBTSTEsIGdp4bqjbSBk4bqnbiB04burIFZTMiAsU0kyLCBWUzEsIFdTMiwgV1MxLCBJRiB2w6AgSTEgbMOgIMSR4buZIHRyb25nIHN14buRdCBjw7Mgc+G7kSBsxrDhu6NuZyB0aOG6pXAgbmjhuqV0KioqDQoNCiMgQknhu4JVIMSQ4buSIDEzDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjbGFyaXR5KSAlPiUgc3VtbWFyaXNlKG09IG1lYW4oY2FyYXQpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSx5ID0gbSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDUpKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpICsNCiAgbGFicyh4ID0gJ8SR4buZIHRyb25nIHN14buRdCcsIHkgPSAndHLhu41uZyBsxrDhu6NuZyB0cnVuZyBiw6xuaCcpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdHJvbmcgc3Xhu5F0IHbDoCB0w61uaCB0cuG7jW5nIGzGsOG7o25nIHRydW5nIGLDrG5oIGPhu6dhIGNow7puZyB0aGVvIMSRxqFuIHbhu4sgY2FyYXQuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCDEkeG7mSB0cm9uZyBzdeG7kXQsIHkgbMOgIGto4buRaSBsxrDhu6NuZyB0cnVuZyBiw6xuaCBj4bunYSB04burbmcgbG/huqFpOyBjw6FjIHPhu5EgbGnhu4d1IHPhur0gY8OzIG3DoHUgeGFuaCBsw6EgY8OieSwgxJHGsOG7o2MgbMOgbSB0csOybiA1IGNo4buvIHPhu5EgdGjhuq1wIHBow6JuIHbDoCDEkcaw4bujYyDEkWnhu4F1IGNo4buJbmgg4bufIHbhu4sgdHLDrSBk4buNYyBjw6FjaCBj4buZdCB24bubaSDEkcahbiB24buLIGzDoCAyLiBWw6AgdGEgdGjhuqV5IMSRxrDhu6NjIGtpbSBjxrDGoW5nIGPDsyDEkeG7mSB0cm9uZyBzdeG7kXQgY2FvIG5o4bqldCBsw6AgSTEsIHRo4bqlcCBoxqFuIMSRw7MgbMOgIFNJMiB2w6AgZ2nhuqNtIGThuqduIHThu6sgU0kxLCBWUzIsIFZTMSwgV1MyLCBXUzEsIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBJRi4qKioNCg0KIyBCSeG7glUgxJDhu5IgMTQNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCA8LSB0ICU+JSBtdXRhdGUoY2FyYXRDID0gY3V0KGNhcmF0LDQsIGxhYmVsID0gYygncuG6pXQgbmjhu48nLCAnbmjhu48nLCd24burYScsJ2zhu5tuJykpKQ0KdCAlPiUgZ2dwbG90KGFlcyh4ID0gY2FyYXRDKSkgKw0KICBnZW9tX2JhcihmaWxsID0gJ3JlZCcpICsNCiAgbGFicyh4ID0gJ3Bow6JuIGxv4bqhaScsIHkgPSAnc+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKioqVGEgdGjDqm0gMSBj4buZdCBk4buvIGxpw6p1IGNhcmF0QyB2w6BvIGLhu5kgZOG7ryBsaeG7h3UgdCDEkeG7gyDEkcOhbmggZ2nDoSB0cuG7jW5nIGzGsOG7o25nIGPhu6dhIGPDoWMgdmnDqm4ga2ltIGPGsMahbmcgdGhlbyBt4bupYyDEkeG7mSAncuG6pXQgbmjhu48nICduaOG7jycsICd24burYScgdsOgICds4bubbicuIEPDoWMgY+G7mXQgYmnhu4N1IMSR4buTIGPDsyBtw6B1IMSR4buPLiBRdWEgYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDsyB0cuG7jW5nIGzGsOG7o25nICdy4bqldCBuaOG7jycgbMOgIGzhu5tuIG5o4bqldCB2w6AgZ2nhuqNtIGThuqduIHThu6sgJ25o4buPJywgJ3bhu6thJyB2w6AgdGjhuqVwIG5o4bqldCBsw6AgbG/huqFpICds4bubbicqKioNCg0KIyBCSeG7glUgxJDhu5IgMTUNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCA8LSB0ICU+JSBtdXRhdGUocHJpY2VDID0gY3V0KHByaWNlLDUsIGxhYmVsID0gYygncuG6pXQgdGjhuqVwJywgJ3Ro4bqlcCcsJ3bhu6thJywnY2FvJywncuG6pXQgY2FvJykpKQ0KdCAlPiUgZ2dwbG90KGFlcyh4ID0gcHJpY2VDKSkgKw0KICBnZW9tX2JhcihmaWxsID0gJ3JlZCcpICsNCiAgbGFicyh4ID0gJ3Bow6JuIGxv4bqhaScsIHkgPSAnc+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKioqVGEgdGjDqm0gMSBj4buZdCBk4buvIGxpw6p1IHByaWNlQyB2w6BvIGLhu5kgZOG7ryBsaeG7h3UgdCDEkeG7gyDEkcOhbmggZ2nDoSBHw61hIGPhuqMgY+G7p2EgY8OhYyB2acOqbiBraW0gY8awxqFuZyB0aGVvIG3hu6ljIMSR4buZICdy4bqldCB0aOG6pXAnICd0aOG6pXAnLCAnduG7q2EnLCAnY2FvJyB2w6AgJ3LhuqV0IGNhbycuIEPDoWMgY+G7mXQgYmnhu4N1IMSR4buTIGPDsyBtw6B1IMSR4buPLiBRdWEgYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDsyBnacOhICdy4bqldCB0aOG6pXAnIGzDoCBs4bubbiBuaOG6pXQgdsOgIGdp4bqjbSBk4bqnbiB04burICd0aOG6pXAnLCAnduG7q2EnLCAnY2FvJyB2w6AgdGjhuqVwIG5o4bqldCBsw6AgbG/huqFpICdy4bqldCBjYW8nKioqDQoNCiMgQknhu4JVIMSQ4buSIDE2DQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgPC0gZGlhbW9uZHMgDQpiIDwtIHQgJT4lIGdyb3VwX2J5KGN1dCwgY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCmIgJT4lIGdncGxvdChhZXMoeCA9IGN1dCwgeSA9IG4pKSArDQogIGdlb21fY29sKGRhdGEgPSBiICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0QnKSwgZmlsbCA9ICdyZWQnKSArDQogIGdlb21fY29sKGRhdGEgPSBiICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0onKSwgZmlsbCA9ICdibHVlJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBraeG7g3UgY+G6r3QgdsOgIG3DoHUgc+G6r2Mgc2F1IMSRw7MgdMOtbmggc+G7kSBsxrDhu6NuZyAuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCBraeG7g3UgY+G6r3QsIHkgbMOgIHPhu5EgbMaw4bujbmcgY+G7p2EgdOG7q25nIGxv4bqhaTsgdGEgc+G6vSBs4buNYyBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyBjw7MgbcOgdSBELGPhu5l0IGJp4buDdSDEkeG7kyBjw7MgbcOgdSDEkeG7jyB2w6AgbOG7jWMgY8OhYyBsb+G6oWkga2ltIGPGsMahbmcgY8OzIG3DoHUgSiwgYmnhu4N1IMSR4buTIGPDsyBtw6B1IHhhbmggZMawxqFuZy4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSDEkcOjIGzhu41jIMSRxrDhu6NjIHPhu5EgbMaw4bujbmcga2ltIGPGsMahbmcgbcOgdSBEIHBow6JuIGLhu5Ugw610IG5o4bqldCDhu58ga2nhu4N1IGPhuq90IEZhaXIgdsOgIHTEg25nIGThuqduIGzDqm4gdOG7qyBHb29kLCBWZXJ5IEdvb2QsIFByZW1pdW0sIHbDoCBuaGnhu4F1IG5o4bqldCBsw6AgSWRlYWwuIFbDoCBz4buRIGzGsOG7o25nIGtpbSBjxrDGoW5nIGPDsyBtw6B1IEogY8WpbmcgcGjhuqluIGLhu5UgdMawxqFuZyB04buxIG5oxrAga2ltIGPGsMahbmcgY8OzIG3DoHUgRCoqKg0KIyBCSeG7glUgxJDhu5IgMTcNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCA8LSBkaWFtb25kcyANCmIgPC0gdCAlPiUgZ3JvdXBfYnkoY3V0LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KYiAlPiUgZ2dwbG90KGFlcyh4ID0gY3V0LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGIgJT4lIGZpbHRlcihjb2xvciA9PSAnRScpLCBmaWxsID0gJ3JlZCcpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGIgJT4lIGZpbHRlcihjb2xvciA9PSAnSCcpLCBmaWxsID0gJ2JsdWUnKQ0KDQpgYGANCg0KKioqVMawxqFuZyB04buxIG5oxrAgYmnhu4N1IMSR4buTIHPhu5EgMTcsIGzhuqduIG7DoHkgdGhheSB2w6wgbOG7jWMgY8OhYyBraW0gY8awxqFuZyBjw7MgbcOgdSAnRCcgVsOAICdKJyB0aMOsIHRhIHPhur0gbOG7jWMgY8OhYyBraW0gY8awxqFuZyBjw7MgbcOgdSAnRScgVsOAICdIJy4g4bueIGJp4buDdSDEkeG7kyBuw6B5IHRhIHRo4bqleSBtw6B1IEUga2jDtG5nIHBow6JuIGLhu5Ug4bufIGxv4bqhaSBraW0gY8awxqFuZyBjw7Mga2nhu4N1IGPhuq90IEZhaXIsIFByZW1pdW0sIHbDoCBtw6B1IHPhuq9jIG7DoHkgcGjDom4gYuG7lSBuaGnhu4F1IG5o4bqldCDhu58ga2nhu4N1IGPhuq90IElkZWFsIGdp4bqjbSBk4bqnbiB04burIFZlcnkgR29vZCwgR29vZC4gTcOgdSBIIHBow6JuIGLhu5Ug4bufIGPDoWMga2nhu4N1IGPhuq90LCBuaGnhu4F1IG5o4bqldCBsw6AgSWRlYWwgdsOgIGdp4bqjbSBk4bqnbiB04burIFByZW1pdW0sIFZlcnkgR29vZCwgR29vZCB2w6AgdGjhuqVwIG5o4bqldCBsw6AgRmFpcg0KIyBCSeG7glUgxJDhu5IgMTgNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KYiA8LSB0ICU+JSBncm91cF9ieShjbGFyaXR5LCBjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKQ0KYiAlPiUgZ2dwbG90KGFlcyh4ID0gY2xhcml0eSwgeSA9IG4pKSArDQogIGdlb21fY29sKGRhdGEgPSBiICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0YnKSwgZmlsbCA9ICdyZWQnKSArDQogIGdlb21fY29sKGRhdGEgPSBiICU+JSBmaWx0ZXIoY29sb3IgPT0gJ0onKSwgZmlsbCA9ICdibHVlJykNCg0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSDEkeG7mSB0cm9uZyBzdeG7kXQgdsOgIG3DoHUgc+G6r2Mgc2F1IMSRw7MgdMOtbmggc+G7kSBsxrDhu6NuZyAuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCDEkeG7mSB0cm9uZyBzdeG7kXQsIHkgbMOgIHPhu5EgbMaw4bujbmcgY+G7p2EgdOG7q25nIGxv4bqhaTsgdGEgc+G6vSBs4buNYyBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyBjw7MgbcOgdSAnRicsY+G7mXQgYmnhu4N1IMSR4buTIGPDsyBtw6B1IMSR4buPIHbDoCBs4buNYyBjw6FjIGxv4bqhaSBraW0gY8awxqFuZyBjw7MgbcOgdSBKLCBiaeG7g3UgxJHhu5MgY8OzIG3DoHUgeGFuaCBkxrDGoW5nLiAgUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkgY8OhYyBtw6B1IHBow6JuIGLhu5Ug4bufIHThuqV0IGPhuqMgxJHhu5kgdHJvbmcgc3Xhu5F0LiBUcm9uZyDEkcOzIG3DoHUgSiBz4bq9IHBow6JuIGLhu5Ugbmhp4buBdSBuaOG6pXQg4bufIFNJMSBy4buTaSBnaeG6o20gZOG6p24gdOG7qyBWUzIsIFZTMSwgU0kyLCBXUzIsIFdTMSwgSUYgdsOgIHRo4bqlcCBuaOG6pXQgbMOgIEkxLiBDw7JuIG3DoHUgRiBQaMOibiBi4buVIG5oaeG7gXUgbmjhuqV0IOG7nyBWUzIgcuG7k2kgZ2nhuqNtIGThuqduIHThu6sgU0kxLCBTSTIsIFZTMSwgV1MyLCBXUzEsIElGIHbDoCB0aMOhcCBuaOG6pXQgbMOgIEkxLioqKg0KDQojIEJJ4buCVSDEkOG7kiAxOQ0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQpiIDwtIHQgJT4lIGdyb3VwX2J5KGNsYXJpdHksIGNvbG9yKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpDQpiICU+JSBnZ3Bsb3QoYWVzKHggPSBjbGFyaXR5LCB5ID0gbikpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGIgJT4lIGZpbHRlcihjb2xvciA9PSAnRScpLCBmaWxsID0gJ3JlZCcpICsNCiAgZ2VvbV9jb2woZGF0YSA9IGIgJT4lIGZpbHRlcihjb2xvciA9PSAnRycpLCBmaWxsID0gJ2JsdWUnKQ0KYGBgDQoNCioqKlTGsMahbmcgdOG7sSBuaMawIGJp4buDdSDEkeG7kyBz4buRIDE4LCBs4bqnbiBuw6B5IHRoYXkgdsOsIGzhu41jIGPDoWMga2ltIGPGsMahbmcgY8OzIG3DoHUgJ0YnIFbDgCAnSicgdGjDrCB0YSBz4bq9IGzhu41jIGPDoWMga2ltIGPGsMahbmcgY8OzIG3DoHUgJ0UnIFbDgCAnRycuIOG7niBiaeG7g3UgxJHhu5MgbsOgeSB0YSB0aOG6pXkgbcOgdSBFIGNo4buJIHBow6JuIGLhu5Ug4bufIGxv4bqhaSBraW0gY8awxqFuZyDEkeG7mSB0cm9uZyBzdeG7kXQgbMOgIFNJMixWUzIgdsOgIFNJMS4gQ8OybiBraW0gY8awxqFuZyBtw6B1IEcgcGjDom4gYuG7lSDhu58gdOG6pXQgY+G6oyDEkeG7mSB0cm9uZyBzdeG7kXQsIHRyb25nIMSRw7Mgbmhp4buBdSBuaOG6pXQgbMOgIFZTMiwgZ2nhuqNtIGThuqduIHThu6sgVlMxLCBTSTEsIFNJMiwgVlZTMiwgVlZTMSwgSUYgdsOgIHBow6JuIGLhu5Ugw610IG5o4bqldCDhu58gSTEuKioqDQoNCiMgQknhu4JVIMSQ4buSIDIwDQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCg0KYyA8LSB0ICU+JSBncm91cF9ieShjbGFyaXR5LCBjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCmMgJT4lIGdncGxvdChhZXMoeCA9IGN1dCwgeSA9IG4pKSArDQogIGdlb21fY29sKGRhdGEgPSBjICU+JSBmaWx0ZXIoY2xhcml0eSA9PSAnSUYnKSwgZmlsbCA9ICdyZWQnKSArDQogIGdlb21fY29sKGRhdGEgPSBjICU+JSBmaWx0ZXIoY2xhcml0eSA9PSAnSTEnKSwgZmlsbCA9ICdibHVlJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBraeG7g3UgxJHhu5kgdHJvbmcgc3Xhu5F0IHbDoCBraeG7g3UgY+G6r3Qgc2F1IMSRw7MgdMOtbmggc+G7kSBsxrDhu6NuZyAuIOG7niBiaeG7g3UgxJHhu5MgdHLDqm4gdGjDrCB0YSBn4bqvbiB4IGzDoCBraeG7g3UgY+G6r3QsIHkgbMOgIHPhu5EgbMaw4bujbmcgY+G7p2EgdOG7q25nIGxv4bqhaTsgVGEgbOG7jWMgY8OhYyBraW0gY8awxqFuZyBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0ICdJRicgbMOgIGPDoWMgY+G7mXQgbcOgdSDEkeG7jywgY8OhYyBraW0gY8awxqFuZyBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0ICdJMScgbMOgIGPDoWMgY+G7mXQgbcOgdSB4YW5oLiBRdWEgYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSBraW0gY8awxqFuZyBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0ICdJRicgY2jhu4kgcGjDom4gYuG7lSDhu58ga2nhu4N1IGPhuq90IElkZWFsLCBWZXJ5IEdvb2QsIFByZW1pdW0gdGhlbyBz4buRIGzGsOG7o25nIGdp4bqjbSBk4bqnbi4gVHJvbmcga2hpIMSRw7MgxJHhu5kgdHJvbmcgc3Xhu5F0IEkxIHBow6JuIGLhu5Ug4bufIG3hu41pIGtp4buDdSBj4bqvdCwgbmhp4buBdSBuaOG6pXQgbMOgIFByZW1pdW0gdsOgIGdp4bqjbSBk4bqnbiB04burIEZhaXIsIElkZWEsIEdvb2QsIHRo4bqlcCBuaOG6pXQgbMOgIFZlcnkgR29vZC4qKioNCg0KIyBCSeG7glUgxJDhu5IgMjENCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KZiA8LSB0ICU+JSBncm91cF9ieShjbGFyaXR5LCBjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkNCmYgJT4lIGdncGxvdChhZXMoeCA9IGN1dCwgeSA9IG4pKSArDQogIGdlb21fY29sKGRhdGEgPSBmICU+JSBmaWx0ZXIoY2xhcml0eSA9PSAnU0kxJyksIGZpbGwgPSAncmVkJykgKw0KICBnZW9tX2NvbChkYXRhID0gZiAlPiUgZmlsdGVyKGNsYXJpdHkgPT0gJ1NJMicpLCBmaWxsID0gJ2JsdWUnKQ0KDQpgYGANCg0KKioqVMawxqFuZyB04buxIG5oxrAgYmnhu4N1IMSR4buTIHPhu5EgMjAsIGzhuqduIG7DoHkgdGhheSB2w6wgbOG7jWMgY8OhYyBraW0gY8awxqFuZyBjw7MgxJHhu5kgdHJvbmcgc3Xhu5F0ICdpRicgVsOAICdpMScgdGjDrCB0YSBz4bq9IGzhu41jIGPDoWMga2ltIGPGsMahbmcgY8OzIMSR4buZIHRyb25nIHN14buRdCAnU0kxJyBWw4AgJ1NJMicuIOG7niBiaeG7g3UgxJHhu5MgbsOgeSB0YSB0aOG6pXkgxJHhu5kgdHJvbmcgc3Xhu5F0IFNJMSBraMO0bmcgcGjDom4gYuG7lSDhu58gbG/huqFpIGtpbSBjxrDGoW5nIGPDsyBraeG7g3UgY+G6r3QgRmFpciwgcGjDom4gYuG7kSBuaGnhu4F1IG5o4bqldCDhu58ga2nhu4N1IGPhuq90IElkZWFsIGdp4bqjbSBk4bqnbiB04burIFZlcnkgR29vZCwgUHJlbWl1bSB2w6AgcGjDom4gYuG7lSDDrXQgbmjhuqV0IOG7nyBraeG7g3UgY+G6r3QgR29vZC4gS2ltIGPGsMahbmcgY8OzIMSR4buZIHRyb25nIHN14buRdCBTSTIgcGjDom4gYuG7lSDhu58gdOG6pXQgY+G6oyBraeG7g3UgY+G6r3QsIG5oaeG7gXUgbmjhuqV0IOG7nyBraeG7g3UgY+G6r3QgUHJlbWl1bSBnaeG6o20gZOG6p24gdOG7qyBJZGVhbCwgVmVyeSBHb29kLCBHb29kIHbDoCBwaMOibiBi4buVIMOtdCBuaOG6pXQg4bufIGtp4buDdSBj4bqvdCBGYWlyLioqKg0KDQojIEJJ4buCVSDEkOG7kiAyMg0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY3V0LG4pKSArDQogIGdlb21fY29sKGZpbGw9J2dyZWVuJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aCh0JGNhcmF0KSkpLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyBraeG7g3UgY+G6r3QgdsOgIHTDrW5oIHPhu5EgbMaw4bujbmcgY+G7p2EgY8OhYyBraeG7g3UgY+G6r3QuIHRhIGfhuq9uIHggbMOgICdMb+G6oWknLCB5IGzDoCAnU+G7kSBMxrDhu6NuZycuIEPDoWMgY+G7mXQgYmnhu4N1IMSR4buTIMSRxrDhu6NjIHTDtCBtw6B1IHhhbmggbMOhIGPDonksIGPDoWMgc+G7kSBsaeG7h3UgbMOgIHThu7cga2jhu5FpIGzGsOG7o25nIGPhu6dhIG3hu5dpIGtp4buDdSBj4bqvdCwgY8OhYyBz4buRIGxp4buHdSBuw6B5IGPDsyBtw6B1IMSR4buPIHbDoCDEkcaw4bujYyDEkWnhu4F1IGNo4buJbmggIHbhu4sgdHLDrSBk4buNYyBjw6FjIGPhu5l0IGThu68gbGnhu4d1IHbhu5tpIMSRxqFuIHbhu4sgbMOgIDIuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IEtp4buDdSBj4bqvdCBJZGVhbCBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IHbhu4EgdHLhu41uZyBsxrDhu6NuZyAoxJHGoW4gduG7iyBjYXJhdCkgdsOgIGdp4bqjbSBk4bqnbiB04burIFByZW1pdW0sIFZlcnkgR29vZCwgR29vZCB2w6Aga2nhu4N1IGPhuq90IEZhaXIgY8OzIHThu7cgbOG7hyB0cuG7jW5nIGzGsOG7o25nIHRo4bqlcCBuaOG6pXQqKioNCg0KIyBCSeG7glUgxJDhu5IgMjMNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY29sb3IsbikpICsNCiAgZ2VvbV9jb2woZmlsbD0nZ3JlZW4nKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KG4vbGVuZ3RoKHQkY2FyYXQpKSksdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArDQogIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSBtw6B1IHPhuq9jIHbDoCB0w61uaCBz4buRIGzGsOG7o25nIGPhu6dhIGPDoWMgbcOgdS4gdGEgZ+G6r24geCBsw6AgJ0xv4bqhaScsIHkgbMOgICdT4buRIEzGsOG7o25nJy4gQ8OhYyBj4buZdCBiaeG7g3UgxJHhu5MgxJHGsOG7o2MgdMO0IG3DoHUgeGFuaCBsw6EgY8OieSwgY8OhYyBz4buRIGxp4buHdSBsw6AgdOG7tyBs4buHIGto4buRaSBsxrDhu6NuZyBj4bunYSBt4buXaSBraeG7g3UgY+G6r3QsIGPDoWMgc+G7kSBsaeG7h3UgbsOgeSBjw7MgbcOgdSDEkeG7jyB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oICB24buLIHRyw60gZOG7jWMgY8OhYyBj4buZdCBk4buvIGxp4buHdSB24bubaSDEkcahbiB24buLIGzDoCAyLiBRdWEgYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSBraW0gY8awxqFuZyBtw6B1IEcgY2hp4bq/bSB04bu3IGzhu4cgY2FvIG5o4bqldCB24buBIHRy4buNbmcgbMaw4bujbmcoMjAsOTMpLCBnaeG6o20gZOG6p24gbMOgIEUsIEYsIEgsIEQsIEkgdsOgIGtpbSBjxrDGoW5nIG3DoHUgSiBjaGnhur9tIHThu7cgbOG7hyB0aOG6pXAgbmjhuqV0ICg1LDIxJSkqKioNCg0KIyBCSeG7glUgxJDhu5IgMjQNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY29sb3IpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY29sb3IsbikpICsNCiAgZ2VvbV9jb2woZmlsbD0nZ3JlZW4nKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwZXJjZW50KG4vbGVuZ3RoKHQkcHJpY2UpKSksdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArDQogIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSBtw6B1IHPhuq9jIHbDoCB0w61uaCBz4buRIGzGsOG7o25nIGPhu6dhIGPDoWMgbcOgdS4gdGEgZ+G6r24geCBsw6AgJ0xv4bqhaScsIHkgbMOgICdT4buRIEzGsOG7o25nJy4gQ8OhYyBj4buZdCBiaeG7g3UgxJHhu5MgxJHGsOG7o2MgdMO0IG3DoHUgeGFuaCBsw6EgY8OieSwgY8OhYyBz4buRIGxp4buHdSBsw6AgdOG7tyBs4buHIGdpw6EgdGnhu4FuIGPhu6dhIG3hu5dpIGtp4buDdSBj4bqvdCwgY8OhYyBz4buRIGxp4buHdSBuw6B5IGPDsyBtw6B1IMSR4buPIHbDoCDEkcaw4bujYyDEkWnhu4F1IGNo4buJbmggIHbhu4sgdHLDrSBk4buNYyBjw6FjIGPhu5l0IGThu68gbGnhu4d1IHbhu5tpIMSRxqFuIHbhu4sgbMOgIDIuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IGtpbSBjxrDGoW5nIG3DoHUgRyBjaGnhur9tIHThu7cgbOG7hyBjYW8gbmjhuqV0IHbhu4EgZ2nDoSgyMCw5MyUpLCBnaeG6o20gZOG6p24gbMOgIEUsIEYsIEgsIEQsIEkgdsOgIGtpbSBjxrDGoW5nIG3DoHUgSiBjaGnhur9tIHThu7cgbOG7hyB0aOG6pXAgbmjhuqV0ICg1LDIxJSkqKioNCg0KIyBCSeG7glUgxJDhu5IgMjUNCg0KYGBge3IgZWNobz1UUlVFLCB3YXJuaW5nPUZBTFNFfQ0KdCAlPiUgZ3JvdXBfYnkoY2xhcml0eSkgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyhjbGFyaXR5LG4pKSArDQogIGdlb21fY29sKGZpbGw9J2dyZWVuJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aCh0JHByaWNlKSkpLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCmBgYA0KDQoqKipUYSBwaMOibiBsb+G6oWkga2ltIGPGsMahbmcgdGhlbyDEkeG7mSB0cm9uZyBzdeG7kXQgdsOgIHTDrW5oIHPhu5EgbMaw4bujbmcgY+G7p2EgY8OhYyBtw6B1LiB0YSBn4bqvbiB4IGzDoCAnTG/huqFpJywgeSBsw6AgJ1Phu5EgTMaw4bujbmcnLiBDw6FjIGPhu5l0IGJp4buDdSDEkeG7kyDEkcaw4bujYyB0w7QgbcOgdSB4YW5oIGzDoSBjw6J5LCBjw6FjIHPhu5EgbGnhu4d1IGzDoCB04bu3IGzhu4cgZ2nDoSB0aeG7gW4gY+G7p2EgbeG7l2kgbG/huqFpIGtpbSBjxrDGoW5nLCBjw6FjIHPhu5EgbGnhu4d1IG7DoHkgY8OzIG3DoHUgxJHhu48gdsOgIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCAgduG7iyB0csOtIGThu41jIGPDoWMgY+G7mXQgZOG7ryBsaeG7h3UgduG7m2kgxJHGoW4gduG7iyBsw6AgMi4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkga2ltIGPGsMahbmcgY8OzIMSR4buZIHRyb25nIHN14buRdCBTSTEgY2hp4bq/bSB04bu3IGzhu4cgZ2nDoSBjYW8gbmjhuqV0ICgyNCwyJSksIGdp4bqjbSBk4bqnbiB04burIFZTMiwgU0kyLCBWUzEsIFZWUzIsIFZWUzEsIElGLCBJMSgxLDQlKSoqKg0KDQojIEJJ4buCVSDEkOG7kiAyNg0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQp0ICU+JSBncm91cF9ieShjdXQpICU+JSBzdW1tYXJpc2UobiA9IG4oKSkgJT4lDQogIGdncGxvdChhZXMoY3V0LG4pKSArDQogIGdlb21fY29sKGZpbGw9J2dyZWVuJykgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcGVyY2VudChuL2xlbmd0aCh0JHByaWNlKSkpLHZqdXN0ID0gMiwgY29sb3IgPSAncmVkJykgKw0KICBsYWJzKHggPSAnTG/huqFpJywgeSA9ICdT4buRIGzGsOG7o25nJykNCg0KYGBgDQoNCiMgQknhu4JVIMSQ4buSIDI3DQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdyb3VwX2J5KGN1dCxjb2xvcikgJT4lIHN1bW1hcmlzZShuPW4oKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGN1dCx5ID0gbikpICsNCiAgICBnZW9tX2NvbChwb3NpdGlvbiA9ICdkb2RnZScpICsNCiAgICBmYWNldF93cmFwKH5jb2xvcikgKw0KICAgIGxhYnMoeCA9ICdMb+G6oWknLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCioqKlRhIHBow6JuIGxv4bqhaSBraW0gY8awxqFuZyB0aGVvIGtp4buDdSBj4bqvdCB2w6AgbcOgdSBz4bqvYyBzYXUgxJHDsyB0w61uaCBz4buRIGzGsOG7o25nLiB0YSBn4bqvbiB4IGzDoCBsb+G6oWksIHkgbGEgc+G7kSBsxrDhu6NuZyB2w6AgdGEgY2hpYSB0aMOgbmggNyBiaeG7g3UgxJHhu5MgdGhlbyA3IGxv4bqhaSBtw6B1IHPhuq9jIMSR4buDIHNvIHPDoW5oLiBRdWEgNyBiaeG7g3UgxJHhu5MgdGEgbmjhuq1uIHjDqXQgY8OhYyBtw6B1IHPhuq9jIHBow6JuIGLhu5Ugbmhp4buBdSBuaOG6pXQg4bufIGtpbSBjxrDGoW5nIGPDsyBraeG7g3UgY+G6r3QgSWRlYWwsIGdp4bqjbSBk4bqnbiBxdWEgY8OhYyBraeG7g3UgY+G6r3QgUHJlbWl1bSwgVmVyeSBHb29kLCBHb29kIHbDoCBwaMOibiBi4buVIMOtdCBuaOG6pXQg4bufIGtp4buDdSBj4bqvdCBGYWlyICoqKg0KDQojIEJJ4buCVSDEkOG7kiAyOA0KDQpgYGB7ciBlY2hvPVRSVUUsIHdhcm5pbmc9RkFMU0V9DQoNCnQgJT4lIGdyb3VwX2J5KGNvbG9yKSAlPiUgc3VtbWFyaXNlKG0gPSBtZWFuKGRlcHRoKSkgJT4lDQogIGdncGxvdChhZXMoY29sb3IsbSkpICsNCiAgZ2VvbV9jb2woZmlsbD0nZ3JlZW4nKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDIpKSx2anVzdCA9IDIsIGNvbG9yID0gJ3JlZCcpICsNCiAgbGFicyh4ID0gJ0xv4bqhaScsIHkgPSAnU+G7kSBsxrDhu6NuZycpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8gbcOgdSBz4bqvYyB2w6AgdMOtbmggdHJ1bmcgYsOsbmggdOG7tyBs4buHIMSR4buZIHPDonUgY+G7p2EgdOG7q25nIGxv4bqhaS4gQ8OhYyBj4buZdCBiaeG7g3UgxJHhu5MgY8OzIG3DoHUgeGFuaCBsw6EgY8OieSwgY8OhYyBk4buvIGxp4buHdSBjw7MgbcOgdSDEkeG7jywgxJHGsOG7o2MgbMOgbSB0csOybiDEkeG6v24gMiBjaOG7ryBz4buRIHRo4bqtcCBwaMOibiB2w6AgxJHGsOG7o2MgxJFp4buBdSBjaOG7iW5oIOG7nyB24buLIHRyw60gZOG7jWMgY8OhY2ggY+G7mXQgMiDEkcahbiB24buLLiBRdWEgYmnhu4N1IMSR4buTIHRyw6puIHRhIHRo4bqleSBjw6FjIGxv4bqhaSBtw6B1IGPhu6dhIGtpbSBjxrDGoW5nIHPhur0gY8OzIHjhuqVwIHjhu4kgdHJ1bmcgYsOsbmggdOG7tyBs4buHIMSR4buZIHPDonUgYuG6sW5nIG5oYXUuIFRyb25nIMSRw7MgY2FvIG5o4bqldCBsw6AgbcOgdSBKIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBtw6B1IEUuKioqDQoNCiMgQknhu4JVIMSQ4buSIDI5DQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdncGxvdChhZXMoeCA9IGNsYXJpdHkpKSArDQogIGdlb21fYmFyKCkgKw0KICBsYWJzKHggPSAnQ+G6pXAgxJHhu5kgdGluaCBraGnhur90JywgeSA9ICdT4buRIGzGsOG7o25nJykgKw0KICBjb29yZF9mbGlwKCkgKw0KICBsYWJzKHRpdGxlID0gJ0PhuqVwIMSR4buZIHRpbmgga2hp4bq/dCBj4bunYSBraW0gY8awxqFuZyAoYmnhu4N1IMSR4buTIG5nYW5nKScpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8gxJHhu5kgdHJvbmcgc3Xhu5F0LiB0YSBn4bqvbiB4IGzDoCBj4bqlcCDEkeG7mSB0aW5oIGtoaeG6v3QsIHkgbMOgIHPhu5EgbMaw4bujbmcgVsOgIMSRw6J5IGzDoCBiaeG7g3UgxJHhu5MgbmdhbmcuIFF1YSBiaeG7g3UgxJHhu5MgdHLDqm4gdGEgdGjhuqV5IFNJMSBjw7MgxJHhu5kgdGluaCBraGnhur90IGNhbyBuaOG6pXQsIGdp4bqjbSBk4bqnbiB04burIFZTMiwgU0kyLCBWUzEsIFZWUzIsIElGIHbDoCBJMSBsw6Aga2ltIGPGsMahbmcgY8OzIMSR4buZIHRyb25nIHN14buRdCB0aOG6pXAgbmjhuqV0KioqDQoNCiMgQknhu4JVIMSQ4buSIDMwDQoNCmBgYHtyIGVjaG89VFJVRSwgd2FybmluZz1GQUxTRX0NCnQgJT4lIGdyb3VwX2J5KGN1dCkgJT4lIHN1bW1hcmlzZShtPSBtZWFuKGRlcHRoKSkgJT4lDQogIGdncGxvdChhZXMoeCA9IGN1dCx5ID0gbSkpICsNCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAnZG9kZ2UnKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSByb3VuZChtLDIpKSwgdmp1c3QgPSAyLCBjb2xvciA9ICdncmVlbicpICsNCiAgbGFicyh4ID0gJ0tp4buDdSBj4bqvdCcsIHkgPSAnTWVhbicpDQpgYGANCg0KKioqVGEgcGjDom4gbG/huqFpIGtpbSBjxrDGoW5nIHRoZW8ga2nhu4N1IGPhuq90IHbDoCB0w61uaCB0cnVuZyBiw6xuaCB04bu3IGzhu4cgxJHhu5kgc8OidSAodHJ1bmcgYsOsbmggei94KS4gdGEgZ+G6r24geCBsw6Aga2nhu4N1IGPhuq90LCB5IGzDoCB0cnVuZyBiw6xuaC4gY8OhYyBz4buRIGxp4buHdSDEkcaw4bujYyBsw6BtIHRyw7JuIDIgY2jhu68gc+G7kSB0aOG6rXAgcGjDom4sIMSRxrDhu6NjIMSRaeG7gXUgY2jhu4luaCDhu58gduG7iyB0csOtIGPDoWNoIGPhu5l0IGThu41jIDIgxJHGoW4gduG7iyB2w6AgY8OzIG3DoHUgeGFuaCBsw6EgY8OieS4gUXVhIGJp4buDdSDEkeG7kyB0csOqbiB0YSB0aOG6pXkga2nhu4N1IGPhuq90IEZhaXIgY8OzIMSR4buZIHPDonUgdHJ1bmcgYsOsbmggbOG7m24gbmjhuqV0LCBnaeG6o20gZOG6p24gdOG7qyBHb29kLCBWZXJ5IEdvb2QsIElkZWFsIHbDoCB0aOG6pXAgbmjhuqV0IGzDoCBQcmVtaXVtKioqDQoNCg0KKioqQ+G6o20gxqFuIHRo4bqneSDEkcOjIMSR4buNYywgY2jDumMgdGjhuqd5IDEgbmfDoHkgbMOgbSB2aeG7h2MgdnVpIHbhursqKio=