GIỚI THIỆU

Bộ dữ liệu gồm 1199 quan sát và 12 biến, số liệu sau đây nói về tình trạng ô tô đã qua sử dụng

  • Year : Năm sản xuất của ô tô
  • Make: Hãng sản xuất ô tô
  • Model: Kiểu máy của ô tô
  • Trim: Phiên bản của ô tô
  • Body: Kiểu dáng xe (sedan, SUV, v.v.)
  • Condition: Tình trạng của ô tô (mới, đã qua sử dụng, v.v.)
  • Odometer: Số km đã đi của ô tô
  • Color: Màu sắc của ô tô
  • Interior: Màu sắc nội thất của ô tô
  • Seller: Người bán ô tô
  • Sellingprice: Giá bán của ô tô
library(readxl)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
p <- read_excel("C:/Users/Dell/Desktop/dữ liệu.xlsx")
library(tidyverse)
## Warning: package 'ggplot2' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.0     ✔ readr     2.1.5
## ✔ ggplot2   3.5.0     ✔ stringr   1.5.1
## ✔ lubridate 1.9.3     ✔ tibble    3.2.1
## ✔ purrr     1.0.2     ✔ tidyr     1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(scales)
## 
## Attaching package: 'scales'
## 
## The following object is masked from 'package:purrr':
## 
##     discard
## 
## The following object is masked from 'package:readr':
## 
##     col_factor
library(gganimate)
## Warning: package 'gganimate' was built under R version 4.3.3
library(magick)
## Warning: package 'magick' was built under R version 4.3.3
## Linking to ImageMagick 6.9.12.98
## Enabled features: cairo, freetype, fftw, ghostscript, heic, lcms, pango, raw, rsvg, webp
## Disabled features: fontconfig, x11
library(DT)
## Warning: package 'DT' was built under R version 4.3.3
library(readr)
p <- read_csv("C:/Users/Dell/Desktop/dữ liệu.csv") 
## Rows: 1199 Columns: 12
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (7): make, model, trim, body, color, interior, seller
## dbl (5): year, condition, odometer, mmr, sellingprice
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
datatable(p)

I.Đồ thị dạng Bar Chart

1.Hình 1.1

p %>% group_by(year) %>% summarise(n = n()) %>%
  ggplot(aes(year,n)) +
    geom_col(fill='green') +
    geom_text(aes(label = n),vjust = 2, color = 'red') +
    labs(x = 'Năm', y = 'Số lượng')

Hình 1.1 cho ta thấy số lượng sản xuất ô tô qua các năm từ 2012-2015

  • Năm 2012 chiếm 457 số lượng
  • Năm 2013 chiếm 620 số lượng (nhiều nhất)
  • Năm 2014 chiếm 66 số lượng
  • Năm 2015 chiếm 56 số lượng (ít nhất)

2. Hình 1.2

p %>% ggplot(aes(x = interior)) +
    geom_bar() +
    labs(x = 'Màu nội thất', y = 'Số lượng') +
    coord_flip()

Hình 1.2 cho ta thấy màu black chiếm số lượng nhiều nhất gần 700 trên tổng số lượng

  • Màu blue, burgundy, red, white chiếm số lượng ít

II.Đồ thị dạng Histogram

1.Hình 2.1

p %>% ggplot(aes(x = sellingprice)) +
  geom_histogram(binwidth = 5000, fill = 'blue', color = 'red')

Hình 2.1 cho ta thấy giá bán của các loại ô tô

  • cột cao nhất có giá bán khoảng 13000 với hơn 200 xe được bán
  • Cột thấp nhất có giá 150000
  • Cho thấy các loại xe đắt tiền ít được bán chạy hơn các loại xe khác có giá tầm trung

2.Hình 2.2

p %>% ggplot(aes(x = sellingprice, fill = color)) +
  geom_histogram(binwidth = 5000)

Hình 2.2 cho ta thấy giá bán của ô tô theo màu

  • Màu black chiếm số lượng nhiều nhất ### 3.Hình 2.3
p %>% ggplot(aes(x = sellingprice)) +
  geom_histogram(binwidth = 5000, fill = 'blue', color = 'red') +
  facet_wrap(~color)

Hình 2.3 phân tích biểu đồ cột theo giá của từng màu

  • Màu black và white chiếm số lượng nhiều nhất với giá bán dưới 50000

4.Hình 2.4

p %>% ggplot(aes(x = sellingprice)) +
  geom_histogram(data = p %>% filter(color == 'black'), binwidth = 5000, fill = 'salmon') +
  geom_histogram(data = p %>% filter(color == 'white'), binwidth = 5000, fill = 'yellow')

Hình 2.4 cho ta thấy các xe màu white chiếm số lượng mua nhiều hơn các xe màu black với giá cao nhất khoảng 10000

  • Số lượng ít nhất là xe màu black với giá hơn 75000

III. Đồ thị dạng Density

1. Hình 3.1

p %>% ggplot(aes(x =sellingprice)) +
  geom_density(fill = 'red')

2. Hình 3.2

p %>% ggplot(aes(x = condition, fill = make )) +
  geom_density()
## Warning: Removed 41 rows containing non-finite outside the scale range
## (`stat_density()`).
## Warning: Groups with fewer than two data points have been dropped.
## Groups with fewer than two data points have been dropped.
## Groups with fewer than two data points have been dropped.
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf

## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf

## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf

Hình 3.2 cho thấy tình trạng của ô tô đã qua sử dụng, trong đó Honda chiếm số lượng nhiều nhất, qua đó ta biết được

  • Honda có tuổi đời khoảng 35 năm dài hơn các loại xe khác
  • Thấp nhất là Volvo khoảng 5 năm

3. Hình 3.3

p %>% ggplot(aes(x = sellingprice)) +
  geom_density(fill = 'green') +
  facet_wrap(~color)
## Warning: Groups with fewer than two data points have been dropped.
## Groups with fewer than two data points have been dropped.
## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf

## Warning in max(ids, na.rm = TRUE): no non-missing arguments to max; returning
## -Inf

Hình 3.3 cho thấy giá bán của xe theo các màu

  • Màu purple cao nhất
  • Màu thấp nhất là gold
  • Hầu như k có là màu yellow

IV. Đồ thị dạng Pie Chart

1. Hình 4.1

p <- p %>% filter(make == 'Audi' )
p %>% group_by(interior) %>% summarise(n = n()) %>%
  ggplot(aes(x = '', y = n,fill = interior)) +
    geom_col() +
    geom_text(aes(label = n),position = position_stack(vjust = 0.75))

Hình 4.1 cho thấy xe hãng Audi có màu black chiếm sồ lương nhiều nhất chiếm 21

  • Còn lại là các màu beige, brown, gray có ít chỉ chiếm 1

2. Hình 4.2

p %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(x = '', y = n,fill = color)) +
    geom_col() +
    coord_polar('y')

Hình 4.2 cho ta thấy biểu đồ tròn thể hiện số lượng theo từng màu

  • Chiếm phần lớn là màu black

3. Hình 4.3

p %>% group_by(color) %>% summarise(n = n()) %>%
  ggplot(aes(x = '', y = n,fill = color )) +
    geom_col(color = 'white') +
    coord_polar('y') +
    geom_text(aes(x = 1.3, label = n),position = position_stack(vjust = 0.5)) +
    theme_void()

  • Cũng giống như hình 4.2 thì hình 4.3 thể hiện số liệu cụ thể hơn
  • Nhiều nhất là màu white và black
  • Qua đó cho thấy đa số người mua sẽ chuộng màu white và black hơn

V. Đồ thị dạng Scatter

1. Hình 5.1

p %>% ggplot(aes(x = year, y = interior)) +
  geom_point() +
  xlab('Năm') + 
  ylab('Màu sắc nội thất')

Hình 5.1 thể hiện màu sắc nội thất qua các năm

2. Hình 5.2

p %>% ggplot(aes(x = year, y = interior, color = make)) +
  geom_point()

  • Hình 5.2 thể hiện màu nội thất của các hãng xe qua từng năm

  • Màu gray, brown, black chiếm số lượng nhiều ở các hãng xe

3. Hình 5.3

p %>% ggplot(aes(x = year , y = make , shape = color)) +
  geom_point()

Hình 5.3 thể hiện các màu như white, silver, red, gray, brown, blue, black, beige của các loại xe qua từng năm từ 2012-2015 bằng kí hiệu

4. Hình 5.4

p %>% ggplot(aes(x = year, y = color, size = sellingprice)) +
  geom_point()

  • Hình 5.4 cho ta thấy giá của các xe theo màu sắc qua từng năm
  • Chấm càng lớn thì giá càng cao
  • Và ngược lại chấm càng nhỏ thì giá càng thấp
  • Năm 2012 giá cao nhất là màu gray
  • Các năm còn lại giá tương đối ổn định

5. Hình 5.5

p %>% ggplot(aes(x = year, y = interior, alpha = sellingprice)) +
  geom_point()

  • Hình 5.5 cho ta biết được giá bán xe tưng năm theo màu bằng độ đậm nhạt
  • Chấm càng đậm thì giá càng cao
  • Chấm càng nhạt thì giá càng thấp

6. Hình 5.6

p %>% ggplot(aes(x = year, y = condition)) +
  geom_point(color = 'red') +
  geom_smooth(method = 'lm', color = 'green')
## `geom_smooth()` using formula = 'y ~ x'

7. Hình 5.7

p %>% ggplot(aes(x = year, y = condition)) +
  geom_point(color = 'red') +
  geom_smooth(method = 'lm', color = 'green') +
  facet_wrap(~color)
## `geom_smooth()` using formula = 'y ~ x'

LS0tDQp0aXRsZTogIk5oaeG7h20gduG7pSA1Ig0KYXV0aG9yOiAiTMOqIFRo4buLIFRoYW5oIFBow7oiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy50aW1lKCksICclSDolTTolUywgJWQgLSAlbSAtICVZJylgIg0Kb3V0cHV0Og0KICAgIGh0bWxfZG9jdW1lbnQ6IA0KICAgICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICAgICBjb2RlX2ZvbGRpbmc6IGhpZGUNCiAgICAgICB0b2NfZmxvYXQ6IHRydWUNCiAgICAgICB0b2M6IHRydWUNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQojIyAqKkdJ4buaSSBUSEnhu4ZVKioNCg0KQuG7mSBk4buvIGxp4buHdSBn4buTbSAxMTk5IHF1YW4gc8OhdCB2w6AgMTIgYmnhur9uLCBz4buRIGxp4buHdSBzYXUgxJHDonkgbsOzaSB24buBIHTDrG5oIHRy4bqhbmcgw7QgdMO0IMSRw6MgcXVhIHPhu60gZOG7pW5nDQoNCi0gWWVhciA6IE7Eg20gc+G6o24geHXhuqV0IGPhu6dhIMO0IHTDtA0KLSBNYWtlOiBIw6NuZyBz4bqjbiB4deG6pXQgw7QgdMO0DQotIE1vZGVsOiBLaeG7g3UgbcOheSBj4bunYSDDtCB0w7QNCi0gVHJpbTogUGhpw6puIGLhuqNuIGPhu6dhIMO0IHTDtA0KLSBCb2R5OiBLaeG7g3UgZMOhbmcgeGUgKHNlZGFuLCBTVVYsIHYudi4pDQotIENvbmRpdGlvbjogVMOsbmggdHLhuqFuZyBj4bunYSDDtCB0w7QgKG3hu5tpLCDEkcOjIHF1YSBz4butIGThu6VuZywgdi52LikNCi0gT2RvbWV0ZXI6IFPhu5Ega20gxJHDoyDEkWkgY+G7p2Egw7QgdMO0DQotIENvbG9yOiBNw6B1IHPhuq9jIGPhu6dhIMO0IHTDtA0KLSBJbnRlcmlvcjogTcOgdSBz4bqvYyBu4buZaSB0aOG6pXQgY+G7p2Egw7QgdMO0DQotIFNlbGxlcjogTmfGsOG7nWkgYsOhbiDDtCB0w7QNCi0gU2VsbGluZ3ByaWNlOiBHacOhIGLDoW4gY+G7p2Egw7QgdMO0DQoNCmBgYHtyfQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGRwbHlyKQ0KcCA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9EZWxsL0Rlc2t0b3AvZOG7ryBsaeG7h3UueGxzeCIpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShnZ2FuaW1hdGUpDQpsaWJyYXJ5KG1hZ2ljaykNCmBgYA0KDQpgYGB7cn0NCmxpYnJhcnkoRFQpDQpsaWJyYXJ5KHJlYWRyKQ0KcCA8LSByZWFkX2NzdigiQzovVXNlcnMvRGVsbC9EZXNrdG9wL2Thu68gbGnhu4d1LmNzdiIpIA0KZGF0YXRhYmxlKHApDQpgYGANCg0KIyMgKipJLsSQ4buTIHRo4buLIGThuqFuZyBCYXIgQ2hhcnQqKg0KIyMjICoqMS5Iw6xuaCAxLjEqKg0KYGBge3J9DQpwICU+JSBncm91cF9ieSh5ZWFyKSAlPiUgc3VtbWFyaXNlKG4gPSBuKCkpICU+JQ0KICBnZ3Bsb3QoYWVzKHllYXIsbikpICsNCiAgICBnZW9tX2NvbChmaWxsPSdncmVlbicpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbiksdmp1c3QgPSAyLCBjb2xvciA9ICdyZWQnKSArDQogICAgbGFicyh4ID0gJ07Eg20nLCB5ID0gJ1Phu5EgbMaw4bujbmcnKQ0KYGBgDQoNCg0KSMOsbmggMS4xIGNobyB0YSB0aOG6pXkgc+G7kSBsxrDhu6NuZyBz4bqjbiB4deG6pXQgw7QgdMO0IHF1YSBjw6FjIG7Eg20gdOG7qyAyMDEyLTIwMTUNCg0KKyBOxINtIDIwMTIgY2hp4bq/bSA0NTcgc+G7kSBsxrDhu6NuZw0KKyBOxINtIDIwMTMgY2hp4bq/bSA2MjAgc+G7kSBsxrDhu6NuZyAobmhp4buBdSBuaOG6pXQpDQorIE7Eg20gMjAxNCBjaGnhur9tIDY2IHPhu5EgbMaw4bujbmcNCisgTsSDbSAyMDE1IGNoaeG6v20gNTYgc+G7kSBsxrDhu6NuZyAow610IG5o4bqldCkNCg0KIyMjICoqMi4gSMOsbmggMS4yKioNCmBgYHtyfQ0KcCAlPiUgZ2dwbG90KGFlcyh4ID0gaW50ZXJpb3IpKSArDQogICAgZ2VvbV9iYXIoKSArDQogICAgbGFicyh4ID0gJ03DoHUgbuG7mWkgdGjhuqV0JywgeSA9ICdT4buRIGzGsOG7o25nJykgKw0KICAgIGNvb3JkX2ZsaXAoKQ0KYGBgDQoNCkjDrG5oIDEuMiBjaG8gdGEgdGjhuqV5IG3DoHUgYmxhY2sgY2hp4bq/bSBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0IGfhuqduIDcwMCB0csOqbiB04buVbmcgc+G7kSBsxrDhu6NuZw0KDQotIE3DoHUgYmx1ZSwgYnVyZ3VuZHksIHJlZCwgd2hpdGUgY2hp4bq/bSBz4buRIGzGsOG7o25nIMOtdA0KDQojIyAqKklJLsSQ4buTIHRo4buLIGThuqFuZyBIaXN0b2dyYW0qKg0KIyMjICoqMS5Iw6xuaCAyLjEqKg0KYGBge3J9DQpwICU+JSBnZ3Bsb3QoYWVzKHggPSBzZWxsaW5ncHJpY2UpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMCwgZmlsbCA9ICdibHVlJywgY29sb3IgPSAncmVkJykNCmBgYA0KDQpIw6xuaCAyLjEgY2hvIHRhIHRo4bqleSBnacOhIGLDoW4gY+G7p2EgY8OhYyBsb+G6oWkgw7QgdMO0DQoNCisgY+G7mXQgY2FvIG5o4bqldCBjw7MgZ2nDoSBiw6FuIGtob+G6o25nIDEzMDAwIHbhu5tpIGjGoW4gMjAwIHhlIMSRxrDhu6NjIGLDoW4NCisgQ+G7mXQgdGjhuqVwIG5o4bqldCBjw7MgZ2nDoSAxNTAwMDANCisgQ2hvIHRo4bqleSBjw6FjIGxv4bqhaSB4ZSDEkeG6r3QgdGnhu4FuIMOtdCDEkcaw4bujYyBiw6FuIGNo4bqheSBoxqFuIGPDoWMgbG/huqFpIHhlIGtow6FjIGPDsyBnacOhIHThuqdtIHRydW5nDQoNCiMjIyAqKjIuSMOsbmggMi4yKioNCmBgYHtyfQ0KcCAlPiUgZ2dwbG90KGFlcyh4ID0gc2VsbGluZ3ByaWNlLCBmaWxsID0gY29sb3IpKSArDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gNTAwMCkNCmBgYA0KDQpIw6xuaCAyLjIgY2hvIHRhIHRo4bqleSBnacOhIGLDoW4gY+G7p2Egw7QgdMO0IHRoZW8gbcOgdQ0KDQotIE3DoHUgYmxhY2sgY2hp4bq/bSBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0DQojIyMgKiozLkjDrG5oIDIuMyoqDQpgYGB7cn0NCnAgJT4lIGdncGxvdChhZXMoeCA9IHNlbGxpbmdwcmljZSkpICsNCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSA1MDAwLCBmaWxsID0gJ2JsdWUnLCBjb2xvciA9ICdyZWQnKSArDQogIGZhY2V0X3dyYXAofmNvbG9yKQ0KYGBgDQoNCkjDrG5oIDIuMyBwaMOibiB0w61jaCBiaeG7g3UgxJHhu5MgY+G7mXQgdGhlbyBnacOhIGPhu6dhIHThu6tuZyBtw6B1DQoNCi0gTcOgdSBibGFjayB2w6Agd2hpdGUgY2hp4bq/bSBz4buRIGzGsOG7o25nIG5oaeG7gXUgbmjhuqV0IHbhu5tpIGdpw6EgYsOhbiBkxrDhu5tpIDUwMDAwDQoNCiMjIyAqKjQuSMOsbmggMi40KioNCmBgYHtyfQ0KcCAlPiUgZ2dwbG90KGFlcyh4ID0gc2VsbGluZ3ByaWNlKSkgKw0KICBnZW9tX2hpc3RvZ3JhbShkYXRhID0gcCAlPiUgZmlsdGVyKGNvbG9yID09ICdibGFjaycpLCBiaW53aWR0aCA9IDUwMDAsIGZpbGwgPSAnc2FsbW9uJykgKw0KICBnZW9tX2hpc3RvZ3JhbShkYXRhID0gcCAlPiUgZmlsdGVyKGNvbG9yID09ICd3aGl0ZScpLCBiaW53aWR0aCA9IDUwMDAsIGZpbGwgPSAneWVsbG93JykNCmBgYA0KDQpIw6xuaCAyLjQgY2hvIHRhIHRo4bqleSBjw6FjIHhlIG3DoHUgd2hpdGUgY2hp4bq/bSBz4buRIGzGsOG7o25nIG11YSBuaGnhu4F1IGjGoW4gY8OhYyB4ZSBtw6B1IGJsYWNrIHbhu5tpIGdpw6EgY2FvIG5o4bqldCBraG/huqNuZyAxMDAwMA0KDQotIFPhu5EgbMaw4bujbmcgw610IG5o4bqldCBsw6AgeGUgbcOgdSBibGFjayB24bubaSBnacOhIGjGoW4gNzUwMDANCg0KIyMgKipJSUkuIMSQ4buTIHRo4buLIGThuqFuZyBEZW5zaXR5KioNCiMjIyAqKjEuIEjDrG5oIDMuMSoqDQpgYGB7cn0NCnAgJT4lIGdncGxvdChhZXMoeCA9c2VsbGluZ3ByaWNlKSkgKw0KICBnZW9tX2RlbnNpdHkoZmlsbCA9ICdyZWQnKQ0KYGBgDQoNCg0KDQojIyMgKioyLiBIw6xuaCAzLjIqKg0KYGBge3J9DQpwICU+JSBnZ3Bsb3QoYWVzKHggPSBjb25kaXRpb24sIGZpbGwgPSBtYWtlICkpICsNCiAgZ2VvbV9kZW5zaXR5KCkNCmBgYA0KDQpIw6xuaCAzLjIgY2hvIHRo4bqleSB0w6xuaCB0cuG6oW5nIGPhu6dhIMO0IHTDtCDEkcOjIHF1YSBz4butIGThu6VuZywgdHJvbmcgxJHDsyBIb25kYSBjaGnhur9tIHPhu5EgbMaw4bujbmcgbmhp4buBdSBuaOG6pXQsIHF1YSDEkcOzIHRhIGJp4bq/dCDEkcaw4bujYw0KDQotIEhvbmRhIGPDsyB0deG7lWkgxJHhu51pIGtob+G6o25nIDM1IG7Eg20gZMOgaSBoxqFuIGPDoWMgbG/huqFpIHhlIGtow6FjDQotIFRo4bqlcCBuaOG6pXQgbMOgIFZvbHZvIGtob+G6o25nIDUgbsSDbQ0KDQojIyMgKiozLiBIw6xuaCAzLjMqKg0KYGBge3J9DQpwICU+JSBnZ3Bsb3QoYWVzKHggPSBzZWxsaW5ncHJpY2UpKSArDQogIGdlb21fZGVuc2l0eShmaWxsID0gJ2dyZWVuJykgKw0KICBmYWNldF93cmFwKH5jb2xvcikNCmBgYA0KDQpIw6xuaCAzLjMgY2hvIHRo4bqleSBnacOhIGLDoW4gY+G7p2EgeGUgdGhlbyBjw6FjIG3DoHUgDQoNCi0gTcOgdSBwdXJwbGUgY2FvIG5o4bqldA0KLSBNw6B1IHRo4bqlcCBuaOG6pXQgbMOgIGdvbGQNCi0gSOG6p3UgbmjGsCBrIGPDsyBsw6AgbcOgdSB5ZWxsb3cNCg0KIyMgKipJVi4gxJDhu5MgdGjhu4sgZOG6oW5nIFBpZSBDaGFydCoqDQojIyMgKioxLiBIw6xuaCA0LjEqKg0KYGBge3J9DQpwIDwtIHAgJT4lIGZpbHRlcihtYWtlID09ICdBdWRpJyApDQpwICU+JSBncm91cF9ieShpbnRlcmlvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBuLGZpbGwgPSBpbnRlcmlvcikpICsNCiAgICBnZW9tX2NvbCgpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gbikscG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNzUpKQ0KYGBgDQoNCkjDrG5oIDQuMSBjaG8gdGjhuqV5IHhlIGjDo25nIEF1ZGkgY8OzIG3DoHUgYmxhY2sgY2hp4bq/bSBz4buTIGzGsMahbmcgbmhp4buBdSBuaOG6pXQgY2hp4bq/bSAyMQ0KDQotIEPDsm4gbOG6oWkgbMOgIGPDoWMgbcOgdSBiZWlnZSwgYnJvd24sIGdyYXkgY8OzIMOtdCBjaOG7iSBjaGnhur9tIDENCiAgICAgDQojIyMgKioyLiBIw6xuaCA0LjIqKg0KYGBge3J9DQpwICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBuLGZpbGwgPSBjb2xvcikpICsNCiAgICBnZW9tX2NvbCgpICsNCiAgICBjb29yZF9wb2xhcigneScpDQpgYGANCg0KSMOsbmggNC4yIGNobyB0YSB0aOG6pXkgYmnhu4N1IMSR4buTIHRyw7JuIHRo4buDIGhp4buHbiBz4buRIGzGsOG7o25nIHRoZW8gdOG7q25nIG3DoHUNCg0KLSBDaGnhur9tIHBo4bqnbiBs4bubbiBsw6AgbcOgdSBibGFjaw0KDQojIyMgKiozLiBIw6xuaCA0LjMqKg0KYGBge3J9DQpwICU+JSBncm91cF9ieShjb2xvcikgJT4lIHN1bW1hcmlzZShuID0gbigpKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gJycsIHkgPSBuLGZpbGwgPSBjb2xvciApKSArDQogICAgZ2VvbV9jb2woY29sb3IgPSAnd2hpdGUnKSArDQogICAgY29vcmRfcG9sYXIoJ3knKSArDQogICAgZ2VvbV90ZXh0KGFlcyh4ID0gMS4zLCBsYWJlbCA9IG4pLHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArDQogICAgdGhlbWVfdm9pZCgpDQpgYGANCg0KLSBDxaluZyBnaeG7kW5nIG5oxrAgaMOsbmggNC4yIHRow6wgaMOsbmggNC4zIHRo4buDIGhp4buHbiBz4buRIGxp4buHdSBj4bulIHRo4buDIGjGoW4NCi0gTmhp4buBdSBuaOG6pXQgbMOgIG3DoHUgd2hpdGUgdsOgIGJsYWNrDQotIFF1YSDEkcOzIGNobyB0aOG6pXkgxJFhIHPhu5EgbmfGsOG7nWkgbXVhIHPhur0gY2h14buZbmcgbcOgdSB3aGl0ZSB2w6AgYmxhY2sgaMahbg0KDQojIyAqKlYuIMSQ4buTIHRo4buLIGThuqFuZyBTY2F0dGVyKioNCiMjIyAqKjEuIEjDrG5oIDUuMSoqDQpgYGB7cn0NCnAgJT4lIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBpbnRlcmlvcikpICsNCiAgZ2VvbV9wb2ludCgpICsNCiAgeGxhYignTsSDbScpICsgDQogIHlsYWIoJ03DoHUgc+G6r2MgbuG7mWkgdGjhuqV0JykNCmBgYA0KDQpIw6xuaCA1LjEgdGjhu4MgaGnhu4duIG3DoHUgc+G6r2MgbuG7mWkgdGjhuqV0IHF1YSBjw6FjIG7Eg20NCg0KIyMjICoqMi4gSMOsbmggNS4yKioNCmBgYHtyfQ0KcCAlPiUgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGludGVyaW9yLCBjb2xvciA9IG1ha2UpKSArDQogIGdlb21fcG9pbnQoKQ0KYGBgDQoNCi0gSMOsbmggNS4yIHRo4buDIGhp4buHbiBtw6B1IG7hu5lpIHRo4bqldCBj4bunYSBjw6FjIGjDo25nIHhlIHF1YSB04burbmcgbsSDbSANCg0KLSBNw6B1IGdyYXksIGJyb3duLCBibGFjayBjaGnhur9tIHPhu5EgbMaw4bujbmcgbmhp4buBdSDhu58gY8OhYyBow6NuZyB4ZQ0KDQojIyMgKiozLiBIw6xuaCA1LjMqKg0KYGBge3J9DQpwICU+JSBnZ3Bsb3QoYWVzKHggPSB5ZWFyICwgeSA9IG1ha2UgLCBzaGFwZSA9IGNvbG9yKSkgKw0KICBnZW9tX3BvaW50KCkNCmBgYA0KDQpIw6xuaCA1LjMgdGjhu4MgaGnhu4duIGPDoWMgbcOgdSBuaMawIHdoaXRlLCBzaWx2ZXIsIHJlZCwgZ3JheSwgYnJvd24sIGJsdWUsIGJsYWNrLCBiZWlnZSBj4bunYSBjw6FjIGxv4bqhaSB4ZSBxdWEgdOG7q25nIG7Eg20gdOG7qyAyMDEyLTIwMTUgYuG6sW5nIGvDrSBoaeG7h3UNCg0KIyMjICoqNC4gSMOsbmggNS40KioNCmBgYHtyfQ0KcCAlPiUgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGNvbG9yLCBzaXplID0gc2VsbGluZ3ByaWNlKSkgKw0KICBnZW9tX3BvaW50KCkNCmBgYA0KDQotIEjDrG5oIDUuNCBjaG8gdGEgdGjhuqV5IGdpw6EgY+G7p2EgY8OhYyB4ZSB0aGVvIG3DoHUgc+G6r2MgcXVhIHThu6tuZyBuxINtIA0KLSBDaOG6pW0gY8OgbmcgbOG7m24gdGjDrCBnacOhIGPDoG5nIGNhbw0KLSBWw6AgbmfGsOG7o2MgbOG6oWkgY2jhuqVtIGPDoG5nIG5o4buPIHRow6wgZ2nDoSBjw6BuZyB0aOG6pXANCi0gTsSDbSAyMDEyIGdpw6EgY2FvIG5o4bqldCBsw6AgbcOgdSBncmF5DQotIEPDoWMgbsSDbSBjw7JuIGzhuqFpIGdpw6EgdMawxqFuZyDEkeG7kWkg4buVbiDEkeG7i25oDQoNCiMjIyAqKjUuIEjDrG5oIDUuNSoqDQpgYGB7cn0NCnAgJT4lIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBpbnRlcmlvciwgYWxwaGEgPSBzZWxsaW5ncHJpY2UpKSArDQogIGdlb21fcG9pbnQoKQ0KYGBgDQoNCi0gSMOsbmggNS41IGNobyB0YSBiaeG6v3QgxJHGsOG7o2MgZ2nDoSBiw6FuIHhlIHTGsG5nIG7Eg20gdGhlbyBtw6B1IGLhurFuZyDEkeG7mSDEkeG6rW0gbmjhuqF0DQotIENo4bqlbSBjw6BuZyDEkeG6rW0gdGjDrCBnacOhIGPDoG5nIGNhbyANCi0gQ2jhuqVtIGPDoG5nIG5o4bqhdCB0aMOsIGdpw6EgY8OgbmcgdGjhuqVwDQoNCiMjIyAqKjYuIEjDrG5oIDUuNioqDQpgYGB7cn0NCnAgJT4lIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBjb25kaXRpb24pKSArDQogIGdlb21fcG9pbnQoY29sb3IgPSAncmVkJykgKw0KICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG0nLCBjb2xvciA9ICdncmVlbicpDQpgYGANCg0KDQojIyMgKio3LiBIw6xuaCA1LjcqKg0KYGBge3J9DQpwICU+JSBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gY29uZGl0aW9uKSkgKw0KICBnZW9tX3BvaW50KGNvbG9yID0gJ3JlZCcpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gJ2xtJywgY29sb3IgPSAnZ3JlZW4nKSArDQogIGZhY2V0X3dyYXAofmNvbG9yKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQo=