Email             :
RPubs            : https://rpubs.com/albert23899
Jurusan          : Statistika
Address         : ARA Center, Matana University Tower
                         Jl. CBD Barat Kav, RT.1, Curug Sangereng, Kelapa Dua, Tangerang, Banten 15810.


1 Visualisasi Data dengan R Univariat

1.1 Diagram Batang

library(ggplot2) #Untuk Visualisasi
Marriage<-read.csv("https://raw.githubusercontent.com/Bakti-Siregar/dataset/master/Bookdown-Data-Science-for-Beginners/Marriage.csv") #Memuat Data
ggplot(Marriage, aes(x=zodiacs))+ #Memplot Distribusi dari Zodiacs
  geom_bar(fill="cornflowerblue",
           color="azure4")+ #Anda dapat mengganti warna
  theme_minimal()+ #Menggunakan tema minimal
  labs(x="Zodiacs",
       y="Frequency",
       title="Marriage Participiants by Zodiacs") #Mengganti label dan juga judul chart

Menambahkan simbol persen untuk label y

library(ggplot2)
ggplot(Marriage,
       aes(
         x= zodiacs,
         y=..count../sum(..count..)))+
  geom_bar(fill=rainbow(12),color="azure4")+
  theme_minimal()+ #Menggunakan tema minimal
  labs(x="Zodiacs",
       y="Percents",
       title="Marriage Participiants in Percents")

scale_y_continuous(labels=scales::percent) #Menggunakan simbol % untuk label
## <ScaleContinuousPosition>
##  Range:  
##  Limits:    0 --    1
library(dplyr) #Untuk memanipulasi data
## 
## 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
library(ggplot2) #Untuk Visualisasi Data
plotdata<-Marriage %>% #Memuat Dataset
  count(zodiacs) #Jumlah peserta di setiap Zodiacs
#Menyusun plot batang secara meningkat
ggplot(plotdata,
       aes(
         x=reorder(zodiacs,n),
         y=n))+
  geom_bar(stat="identity",
           fill=rainbow(12),
           color="azure4")+
  theme_minimal()+ #Menggunakan tema minimal
  labs(x="Zodiacs",
       y="Frequency",
       title="Sorting Categories")

Memberi label setiap batang dengan nilai numeriknya

library(dplyr)
library(ggplot2)
library(scales)
plotdata<-Marriage %>%
  count(zodiacs) %>%
  mutate(pct=n/sum(n),
         pctlabel=paste0(round(pct*100),"%"))
#Plot batang sebagai persentase, dalam urutan menurun dengan diagram batang
ggplot(plotdata,
       aes(x=reorder(zodiacs,-pct),
           y=pct))+
  geom_bar(stat="identity",
           fill=rainbow(12),
           color="azure4")+
  geom_text(aes(label=pctlabel),
            vjust=-0.25)+
  theme_minimal()+
  scale_y_continuous(labels=percent)+
  labs(x="zodiacs",
       y="Percent",
       title="Labeling Bars")

Memutar Label Sumbu

library(ggplot2)
library(scales)
#Plot batang sebagai persentase, dalam urutan menurun dengan diagram batang
ggplot(plotdata,
       aes(x=reorder(zodiacs,-pct),
           y=pct))+
  geom_bar(stat="identity",
           fill=rainbow(12),
           color="azure4")+
  geom_text(aes(label=pctlabel),
            vjust=-0.25)+
  theme_minimal()+
  scale_y_continuous(labels=percent)+
  labs(x="Zodiacs",
       y="Percent",
       title="Overlapping Labels") +
theme(axis.text.x=element_text(angle=45,hjust=1))

Membalik sumbu x dan y

library(ggplot2)
library(scales)
#Plot batang sebagai persentase, dalam urutan menurun dengan diagram batang
ggplot(plotdata,
       aes(x=reorder(zodiacs,-pct),
           y=pct))+
  geom_bar(stat="identity",
           fill=rainbow(12),
           color="azure4")+
  geom_text(aes(label=pctlabel),
            vjust=-0.10)+
  theme_minimal()+
  scale_y_continuous(labels=percent)+
  labs(x="Zodiacs",
       y="Percent",
       title="Overlapping Labels") +
coord_flip()

## Diagram Pie

library(dplyr)
library(ggplot2)
library(scales)
#Persiapan Data
plotdata<-Marriage %>%
  count(race) %>%
  arrange(desc(race))%>%
  mutate(prop=round(n*100/sum(n),1),
         lab.ypos=cumsum(prop)-0.5*prop)
#Membuat Diagram Pie
mycols<-c("#0073C2FF","#EFC000FF","#868686FF","#CD534CFF")
  ggplot(plotdata,aes(x="",y=prop,fill=race))+
    geom_bar(width=1, stat="identity",color="white")+
    coord_polar("y",start=0)+
    geom_text(aes(y=lab.ypos,label=prop),color="white")+
    scale_fill_manual(values = mycols)+
    theme_void()+
    labs(title="Marriage Participany by Race")

Membuat lubang dalam diagram pie

library(ggplot2)
library(scales)
#Membuat diagram donat
ggplot(plotdata,aes(x=2,y=prop,fill=race))+
    geom_bar(stat="identity",color="white")+
    coord_polar(theta="y",start=0)+
    geom_text(aes(y=lab.ypos,label=prop),color="white")+
    scale_fill_manual(values = mycols)+
    theme_void()+
    xlim(0.5,2.5)+
    labs(title="Marriage Participany by Race")

Menambahkan label dan menghapus legenda

library(ggplot2)
library(scales)
#tambahkan label persen
plotdata$percent<-paste0(plotdata$race,"\n",
                         round(plotdata$prop),"%")
#membuat diagram donut dalam persen
ggplot(plotdata,aes(x=2,y=prop,fill=race))+
    geom_bar(stat="identity",color="white")+
    coord_polar(theta="y",start=0)+
    geom_text(aes(y=lab.ypos,label=percent),color="white")+
    scale_fill_manual(values = mycols)+
    theme_void()+
    xlim(0.5,2.5)+
    labs(title="Marriage Participany by Race")

## Peta Pohon

library(ggplot2)
library(treemapify)
library(scales)
plotdata <-Marriage %>%
  count(officialTitle)
ggplot(plotdata,
       aes(fill=officialTitle,
           area=n))+
  geom_treemap()+
  labs(title="Marriage Participants by Officiate")

Menggunakan Label

ggplot(plotdata,
       aes(fill=officialTitle,
           area=n,
           label=officialTitle))+
  geom_treemap()+
  geom_treemap_text(colour="white",
                    place="centre")+
  labs(title="Marriage Participants by Officiate")+
  theme(legend.position="none")

# Variabel Kontinu ## Histogram

library(ggplot2)
ggplot(Marriage,aes(x=age))+
  geom_histogram(fill="cornflowerblue",
                 color="white",bins=20)+
  theme_minimal()+
  labs(title="Marriage Participants by Age (Basic)",
       x="Age")

library(ggplot2)
library(scales)
ggplot(Marriage,
       aes(x=age,
           y=..count../sum(..count..)))+
  geom_histogram(fill="cornflowerblue",
                 color="white",
                 binwidth = 5)+
  theme_minimal()+
  labs(title = "Marriage Participants by Age(Alternative Bins and Binwidth",
       y="Percent",
       x="Age")+
  scale_y_continuous(labels=percent)

Plot Densitas Kernel

library(ggplot2)
ggplot(Marriage,aes(x=age))+
  geom_density(fill="indianred3")+
  theme_minimal()+
  labs(title="Marriage Participants by Age")

Parameter Penghalusan

library(ggplot2)
bw.nrd0(Marriage$age)
## [1] 5.181946
ggplot(Marriage,aes(x=age))+
  geom_density(fill="deepskyblue",
               bw=1)+
  theme_minimal()+
  labs(title="Participants by Age",
       subtitle = "bandwidth=1")

## Diagram Titik

library(ggplot2)
ggplot(Marriage,aes(x=age))+
  geom_dotplot(fill="gold",
               color="azure4",
               binwidth = 2)+
  theme_minimal()+
  labs(title="Participants by age",
       y="Proportion",
       x="Age")

# Data Bivariat ## Kategorikal Vs Kategorikal Diagram Batang Bertumpuk

library(ggplot2)
mpg$drv<-factor(mpg$drv,
                levels=c("f","r","4"),
                labels=c("front-wheel","rear-wheel","4-wheel"))
#membuat diagram batang bertumpuk
ggplot(mpg,
       aes(x=class,
           fill=drv))+
  geom_bar(position="fill")+
  theme_minimal()+
  labs(y="proportion")

Diagram batang yang dikelompokkan

library(ggplot2)
ggplot(mpg,aes(x=class,fill=drv))+
  theme_minimal()+
  geom_bar(position=position_dodge(preserve="single"))

Diagram Batang Tersegmentasi

library(dplyr)
library(ggplot2)
library(scales)
#membuat ringkasan dataset
plotdata<-mpg %>%
  group_by(class,drv)%>%
  dplyr::summarise(n=n())%>%
  mutate(pct=n/sum(n),
         lbl=scales::percent(pct))
## `summarise()` has grouped output by 'class'. You can override using the `.groups` argument.
#membuat diagram batang tersegmentasi
#menambahkan label untuk setiap segmen
ggplot(plotdata,
       aes(x=factor(class),
           y=pct,
           fill=factor(drv)))+
  geom_bar(stat="identity",
           position="fill")+
  scale_y_continuous(breaks=seq(0,1,.2),
                     label=percent)+
  geom_text(aes(label=lbl),
            size=3,
            position=position_stack(vjust=0.5))+
  scale_fill_brewer(palette = "Set2")+
  theme_minimal()+
  labs(y="Percent",
       fill="Drive Train",
       x="Class",
       title="Automobile Drive by Class")

theme_minimal()
## List of 93
##  $ line                      :List of 6
##   ..$ colour       : chr "black"
##   ..$ size         : num 0.5
##   ..$ linetype     : num 1
##   ..$ lineend      : chr "butt"
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ rect                      :List of 5
##   ..$ fill         : chr "white"
##   ..$ colour       : chr "black"
##   ..$ size         : num 0.5
##   ..$ linetype     : num 1
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ text                      :List of 11
##   ..$ family       : chr ""
##   ..$ face         : chr "plain"
##   ..$ colour       : chr "black"
##   ..$ size         : num 11
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : num 0
##   ..$ lineheight   : num 0.9
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ title                     : NULL
##  $ aspect.ratio              : NULL
##  $ axis.title                : NULL
##  $ axis.title.x              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.75points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.top          :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.75points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.bottom       : NULL
##  $ axis.title.y              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.75points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.y.left         : NULL
##  $ axis.title.y.right        :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.75points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text                 :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey30"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.2points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.top           :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.2points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.bottom        : NULL
##  $ axis.text.y               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 1
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.y.left          : NULL
##  $ axis.text.y.right         :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.2points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.ticks                : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.ticks.x              : NULL
##  $ axis.ticks.x.top          : NULL
##  $ axis.ticks.x.bottom       : NULL
##  $ axis.ticks.y              : NULL
##  $ axis.ticks.y.left         : NULL
##  $ axis.ticks.y.right        : NULL
##  $ axis.ticks.length         : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ axis.ticks.length.x       : NULL
##  $ axis.ticks.length.x.top   : NULL
##  $ axis.ticks.length.x.bottom: NULL
##  $ axis.ticks.length.y       : NULL
##  $ axis.ticks.length.y.left  : NULL
##  $ axis.ticks.length.y.right : NULL
##  $ axis.line                 : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.line.x               : NULL
##  $ axis.line.x.top           : NULL
##  $ axis.line.x.bottom        : NULL
##  $ axis.line.y               : NULL
##  $ axis.line.y.left          : NULL
##  $ axis.line.y.right         : NULL
##  $ legend.background         : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.margin             : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing            : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing.x          : NULL
##  $ legend.spacing.y          : NULL
##  $ legend.key                : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.key.size           : 'simpleUnit' num 1.2lines
##   ..- attr(*, "unit")= int 3
##  $ legend.key.height         : NULL
##  $ legend.key.width          : NULL
##  $ legend.text               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.text.align         : NULL
##  $ legend.title              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.title.align        : NULL
##  $ legend.position           : chr "right"
##  $ legend.direction          : NULL
##  $ legend.justification      : chr "center"
##  $ legend.box                : NULL
##  $ legend.box.just           : NULL
##  $ legend.box.margin         : 'margin' num [1:4] 0cm 0cm 0cm 0cm
##   ..- attr(*, "unit")= int 1
##  $ legend.box.background     : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.box.spacing        : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ panel.background          : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ panel.border              : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ panel.spacing             : 'simpleUnit' num 5.5points
##   ..- attr(*, "unit")= int 8
##  $ panel.spacing.x           : NULL
##  $ panel.spacing.y           : NULL
##  $ panel.grid                :List of 6
##   ..$ colour       : chr "grey92"
##   ..$ size         : NULL
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ panel.grid.major          : NULL
##  $ panel.grid.minor          :List of 6
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.5
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ panel.grid.major.x        : NULL
##  $ panel.grid.major.y        : NULL
##  $ panel.grid.minor.x        : NULL
##  $ panel.grid.minor.y        : NULL
##  $ panel.ontop               : logi FALSE
##  $ plot.background           : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ plot.title                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 1.2
##   ..$ hjust        : num 0
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.title.position       : chr "panel"
##  $ plot.subtitle             :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.caption              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : num 1
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 5.5points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.caption.position     : chr "panel"
##  $ plot.tag                  :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 1.2
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.tag.position         : chr "topleft"
##  $ plot.margin               : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ strip.background          : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ strip.background.x        : NULL
##  $ strip.background.y        : NULL
##  $ strip.placement           : chr "inside"
##  $ strip.text                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey10"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 4.4points 4.4points 4.4points 4.4points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.text.x              : NULL
##  $ strip.text.y              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.switch.pad.grid     : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ strip.switch.pad.wrap     : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ strip.text.y.left         :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi TRUE
##  - attr(*, "validate")= logi TRUE

Plot Mosaik

tbl<-xtabs(Freq~Survived+Class+Sex, Titanic)
ftable(tbl)
##                Sex Male Female
## Survived Class                
## No       1st        118      4
##          2nd        154     13
##          3rd        422    106
##          Crew       670      3
## Yes      1st         62    141
##          2nd         25     93
##          3rd         88     90
##          Crew       192     20
#Membuat plot mosaik dari tabel
library(vcd)
## Loading required package: grid
mosaic(tbl,main="Titanic data")

mosaic(tbl,
       shade=TRUE,
       legend=TRUE,
       labelin_args=list(set_varnames=c(Sex="Gender",
                                        Survived="Survived",
                                        Class="Passenger Class")),
       set_labels=list(Survived=c("No","Yes",
                       Class=c("1st","2nd","3rd","Crew"),
                       Sex=c("F","M")),
       main="Titanic data")
       )

# Kontinu Vs Kontinu Plot Sebaran

library(ggplot2)
library(hrbrthemes)
## NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
##       Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
##       if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
#Membuat data
d1<-data.frame(x=seq(1,100),
               y=rnorm(100),
               name="No trend")
d2<-d1%>%
mutate(y=x*10 +rnorm(100,sd=60))%>%
mutate(name="Linear Relationship")
d3<-d1%>%
mutate(y=x^2+rnorm(100,sd=140))%>%
mutate(name="Square")
d4<-data.frame(x=seq(1,10,0.1),
               y=sin(seq(1,10,0.1))+
                 rnorm(91,sd=0.6))%>%
mutate(name="Sin")
don<-do.call(rbind,list(d1,d2,d3,d4))
#Plot
don%>%
  ggplot(aes(x=x,y=y))+
  geom_point(color="#69b3a2",alpha=0.8)+
  theme_ipsum()+
  facet_wrap(~name, scale="free")
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): font family not
## found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, : font
## family not found in Windows font database
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## font family not found in Windows font database

library(ggplot2)
library(scales)
data(Salaries, package="carData")
#plot sebaran yang ditingkatkan
ggplot(Salaries,
       aes(x=yrs.since.phd,
           y=salary))+
  geom_point(color="cornflowerblue",
             size=2,
             alpha=.8)+
  scale_y_continuous(label=scales::dollar,
                     limits=c(50000,250000))+
  scale_x_continuous(breaks=seq(0,60,10),
                   limits = c(0,60))+
  theme_minimal()+
  labs(x="Years Since PhD",
       y="",
       title="Experience Vs. Salary",
       subtitle = "9-months salary for 2008-2009")

Plot Sebaran Menyesuaikan Garis

library(ggplot2)
ggplot(Salaries,
       aes(x=yrs.since.phd,
           y=salary)) +
  geom_point(color="cornflowerblue")+
  geom_smooth(method="lm", color="brown1")+
  theme_minimal()+
  labs(x="Years Since PhD",
       y="",
       title="Experience Vs. Salary",
       subtitle = "9-month salary for 2008-2009")
## `geom_smooth()` using formula 'y ~ x'

library(ggplot2)
ggplot(Salaries,
       aes(x=yrs.since.phd,
           y=salary))+
  geom_point(color="cornflowerblue",
             size=2,
             alpha=1)+
  geom_smooth(size=1,
              color="green")+
  scale_y_continuous(label= scales::dollar,
                     limits=c(50000,250000))+
  scale_x_continuous(breaks=seq(0,60,10),
                     limits=c(0,60))+
  theme_minimal()+
  labs(x="Years Since PhD",
       y="",
       title = "Experience vs. Salary",
       subtitle="9-month salary for 2008-2009")
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

theme_minimal()
## List of 93
##  $ line                      :List of 6
##   ..$ colour       : chr "black"
##   ..$ size         : num 0.5
##   ..$ linetype     : num 1
##   ..$ lineend      : chr "butt"
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ rect                      :List of 5
##   ..$ fill         : chr "white"
##   ..$ colour       : chr "black"
##   ..$ size         : num 0.5
##   ..$ linetype     : num 1
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_rect" "element"
##  $ text                      :List of 11
##   ..$ family       : chr ""
##   ..$ face         : chr "plain"
##   ..$ colour       : chr "black"
##   ..$ size         : num 11
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : num 0
##   ..$ lineheight   : num 0.9
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ title                     : NULL
##  $ aspect.ratio              : NULL
##  $ axis.title                : NULL
##  $ axis.title.x              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.75points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.top          :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.75points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.x.bottom       : NULL
##  $ axis.title.y              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.75points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.title.y.left         : NULL
##  $ axis.title.y.right        :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.75points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text                 :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey30"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 2.2points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.top           :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : num 0
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 2.2points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.x.bottom        : NULL
##  $ axis.text.y               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 1
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 2.2points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.text.y.left          : NULL
##  $ axis.text.y.right         :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 0points 2.2points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ axis.ticks                : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.ticks.x              : NULL
##  $ axis.ticks.x.top          : NULL
##  $ axis.ticks.x.bottom       : NULL
##  $ axis.ticks.y              : NULL
##  $ axis.ticks.y.left         : NULL
##  $ axis.ticks.y.right        : NULL
##  $ axis.ticks.length         : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ axis.ticks.length.x       : NULL
##  $ axis.ticks.length.x.top   : NULL
##  $ axis.ticks.length.x.bottom: NULL
##  $ axis.ticks.length.y       : NULL
##  $ axis.ticks.length.y.left  : NULL
##  $ axis.ticks.length.y.right : NULL
##  $ axis.line                 : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ axis.line.x               : NULL
##  $ axis.line.x.top           : NULL
##  $ axis.line.x.bottom        : NULL
##  $ axis.line.y               : NULL
##  $ axis.line.y.left          : NULL
##  $ axis.line.y.right         : NULL
##  $ legend.background         : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.margin             : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing            : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ legend.spacing.x          : NULL
##  $ legend.spacing.y          : NULL
##  $ legend.key                : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.key.size           : 'simpleUnit' num 1.2lines
##   ..- attr(*, "unit")= int 3
##  $ legend.key.height         : NULL
##  $ legend.key.width          : NULL
##  $ legend.text               :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.text.align         : NULL
##  $ legend.title              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ legend.title.align        : NULL
##  $ legend.position           : chr "right"
##  $ legend.direction          : NULL
##  $ legend.justification      : chr "center"
##  $ legend.box                : NULL
##  $ legend.box.just           : NULL
##  $ legend.box.margin         : 'margin' num [1:4] 0cm 0cm 0cm 0cm
##   ..- attr(*, "unit")= int 1
##  $ legend.box.background     : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ legend.box.spacing        : 'simpleUnit' num 11points
##   ..- attr(*, "unit")= int 8
##  $ panel.background          : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ panel.border              : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ panel.spacing             : 'simpleUnit' num 5.5points
##   ..- attr(*, "unit")= int 8
##  $ panel.spacing.x           : NULL
##  $ panel.spacing.y           : NULL
##  $ panel.grid                :List of 6
##   ..$ colour       : chr "grey92"
##   ..$ size         : NULL
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ panel.grid.major          : NULL
##  $ panel.grid.minor          :List of 6
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.5
##   ..$ linetype     : NULL
##   ..$ lineend      : NULL
##   ..$ arrow        : logi FALSE
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_line" "element"
##  $ panel.grid.major.x        : NULL
##  $ panel.grid.major.y        : NULL
##  $ panel.grid.minor.x        : NULL
##  $ panel.grid.minor.y        : NULL
##  $ panel.ontop               : logi FALSE
##  $ plot.background           : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ plot.title                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 1.2
##   ..$ hjust        : num 0
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.title.position       : chr "panel"
##  $ plot.subtitle             :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : num 0
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 0points 0points 5.5points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.caption              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : num 1
##   ..$ vjust        : num 1
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 5.5points 0points 0points 0points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.caption.position     : chr "panel"
##  $ plot.tag                  :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : 'rel' num 1.2
##   ..$ hjust        : num 0.5
##   ..$ vjust        : num 0.5
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ plot.tag.position         : chr "topleft"
##  $ plot.margin               : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
##   ..- attr(*, "unit")= int 8
##  $ strip.background          : list()
##   ..- attr(*, "class")= chr [1:2] "element_blank" "element"
##  $ strip.background.x        : NULL
##  $ strip.background.y        : NULL
##  $ strip.placement           : chr "inside"
##  $ strip.text                :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : chr "grey10"
##   ..$ size         : 'rel' num 0.8
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : NULL
##   ..$ lineheight   : NULL
##   ..$ margin       : 'margin' num [1:4] 4.4points 4.4points 4.4points 4.4points
##   .. ..- attr(*, "unit")= int 8
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.text.x              : NULL
##  $ strip.text.y              :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : num -90
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  $ strip.switch.pad.grid     : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ strip.switch.pad.wrap     : 'simpleUnit' num 2.75points
##   ..- attr(*, "unit")= int 8
##  $ strip.text.y.left         :List of 11
##   ..$ family       : NULL
##   ..$ face         : NULL
##   ..$ colour       : NULL
##   ..$ size         : NULL
##   ..$ hjust        : NULL
##   ..$ vjust        : NULL
##   ..$ angle        : num 90
##   ..$ lineheight   : NULL
##   ..$ margin       : NULL
##   ..$ debug        : NULL
##   ..$ inherit.blank: logi TRUE
##   ..- attr(*, "class")= chr [1:2] "element_text" "element"
##  - attr(*, "class")= chr [1:2] "theme" "gg"
##  - attr(*, "complete")= logi TRUE
##  - attr(*, "validate")= logi TRUE

1.2 Kategorikal vs .Kontinu

Diagram Batang

library(dplyr)
library(ggplot2)
library(scales)
data(Salaries, package = "carData")
#Menghitung gaji rata-rata untuk setiap jabatan
plotdata <-Salaries %>%
  group_by(rank) %>%
  dplyr::summarize(mean_salary=mean(salary))
#Plot gaji rata-rata dengan cara yang lebih menarik
mycols<-c("#CD534CFF","#EFC000FF","#0073C2FF")
ggplot(plotdata,
       aes(x=factor(rank,
                    labels=c("Assistant\nProfessor",
                             "Associate\nProfessor",
                             "Full\nProfessor")),
           y=mean_salary))+
  geom_bar(stat = "identity",
           fill=mycols)+
  geom_text(aes(label=dollar(mean_salary)),
            vjust=-0.25) +
  scale_y_continuous(breaks=seq(0,130000,20000),
                     label=dollar)+
  theme_minimal()+
  labs(title="Mean Salary by Rank",
       subtitle="9-month academic salary for 2008-2009",
       x="",
       y="")

Plot densitas Kernel yang dikelompokan

ggplot(Salaries,
       aes(x=salary,
           fill=rank))+
  geom_density(alpha=0.4)+
  theme_minimal()+
  labs(title="Salary distribution by rank")

Boxplot

mycols<-c("#CD534CFF","#EFC000FF","#0073C2FF")
ggplot(Salaries,aes(x=rank,
                    y=salary))+
  geom_boxplot(notch=TRUE,
               fill=mycols,
               alpha=.7)+
  theme_minimal()+
  labs(title="Salary Distribution by Rank")

Plot Biola

ggplot(Salaries,
       aes(x=rank,
           y=salary))+
  geom_violin(fill="azure1")+
  geom_boxplot(width=.2,
               fill=mycols,
               outlier.color="red",
               outlier.size = 2)+
  theme_minimal()+
  labs(title="Salary Distribution by Rank")

Plot Garis Punggung

library(dplyr)
library(ggplot2)
library(ggridges)
ggplot(mpg,
       aes(x=cty,
           y=class,
           fill=class))+
  geom_density_ridges(alpha=0.7)+
  theme_ridges()+
  labs("Highway mileage by auto class")+
  theme(legend.position = "none")
## Picking joint bandwidth of 0.929

Plot Garis

library(dplyr)
library(ggplot2)
library(ggridges)
#Menghitung rata-rata, deviasi standar,
#Kesalahan standar, dan 95% interval kepercayaan
#Berdasarkan Jabatan
plotdata<-Salaries %>%
  group_by(rank,sex)%>%
  dplyr::summarize(n=n(),
                   mean=mean(salary),
                   sd=sd(salary),
                   se=sd/sqrt(n),
                   ci=qt(0.975,df =n-1)*sd/sqrt(n))
## `summarise()` has grouped output by 'rank'. You can override using the `.groups` argument.
#Meningkatkan plot rata-rata kesalahan
pd<-position_dodge(0.2)
ggplot(plotdata,
       aes(x=factor(rank,
                    labels=c("Assistant\nProfessor",
                             "Associate\nProfessor",
                             "Full\nProfessor")),
           y=mean,
           group=sex,
           color=sex))+
  geom_point(position = pd,
             size=3)+
  geom_line(position=pd,
            size=1)+
  geom_errorbar(aes(ymin=mean-se,
                    ymax=mean+se),
                    width=.1,
                    position=pd,
                    size=1)+
  scale_y_continuous(label=scales::dollar)+
  scale_color_brewer(palette = "Set1")+
  theme_minimal()+
  labs(title="Mean salary by rank and sex",
       subtitle = "(mean +/- standard error)",
       x="",
       y="",
       color="Gender")

Plot Strip

library(ggplot2)
library(scales)
ggplot(Salaries,
       aes(y=factor(rank,
                    labels=c("Assistant\nProfessor",
                             "Associate\nProfessor",
                             "Full\nProfessor")),
           x=salary,
           color=rank))+
  geom_jitter(alpha=0.7,
              size=1.5)+
  scale_x_continuous(label=dollar)+
  labs(title="Academic Salary by Rank",
       subtitle="9-month salarty for 2008-2009",
       x="",
       y="")+
  theme_minimal()+
  theme(legend.position = "none")

Menggabungkan Jitter dan PlotKotak

library(ggplot2)
library(scales)
ggplot(Salaries,
       aes(y=factor(rank,
                    labels=c("Assistant\nProfessor",
                             "Associate\nProfessor",
                             "Full\nProfessor")),
           x=salary,
           color=rank))+
  geom_boxplot(size=1,
               outlier.shape = 1,
               outlier.color="black",
               outlier.size = 3)+
  geom_jitter(alpha=0.5,
              size=.2)+
  scale_x_continuous(label=dollar)+
  labs(title="Academic Salary by Rank",
       subtitle="9-month salarty for 2008-2009",
       x="",
       y="")+
  theme_minimal()+
  theme(legend.position = "none")+
  coord_flip()

Hibrid Geom Plot Jitter dan Box

library(ggplot2)
library(scales)
library(ggpol)
ggplot(Salaries,
       aes(x=factor(rank,
                    labels=c("Assistant\nProfessor",
                             "Associate\nProfessor",
                             "Full\nProfessor")),
           y=salary,
           fill=rank))+
  geom_boxjitter(color="black",
                 jitter.color="darkgrey",
                 errorbar.draw=TRUE)+
  scale_y_continuous(label=dollar)+
  labs(title="Academic Salary by Rank",
       subtitle="9-month salarty for 2008-2009",
       x="",
       y="")+
  theme_minimal()+
  theme(legend.position = "none")

Plot Kawanan Lebah

library(ggplot2)
library(scales)
library(ggbeeswarm)
ggplot(Salaries,
       aes(x=factor(rank,
                    labels=c("Assistant\nProfessor",
                             "Associate\nProfessor",
                             "Full\nProfessor")),
           y=salary,
           color=rank))+
  geom_quasirandom(alpha=0.7,
                   size=1.5)+
  scale_y_continuous(label=dollar)+
  labs(title="Academic Salary by Rank",
       subtitle="9-month salarty for 2008-2009",
       x="",
       y="")+
  theme_minimal()+
  theme(legend.position = "none")

Diagram Titik Cleveland

library(dplyr)
library(ggplot2)
library(scales)
library(ggbeeswarm)
library(gapminder)
data(gapminder,package="gapminder")
#Subset negara-negara Asian 2007
library(dplyr)
plotdata<-gapminder %>%
  filter(continent=="Asia"&
           year==2007)
#Plot Cleveland
ggplot(plotdata,
       aes(x=lifeExp,
           y=reorder(country,lifeExp)))+
  geom_point(color="blue",
             size=2)+
  geom_segment(aes(x=40,
                   xend=lifeExp,
                   y=reorder(country,lifeExp),
                   yend=reorder(country,lifeExp)),
               color="azure3")+
  labs(x="Life Expectancy (years)",
       y="",
       title="Life Expectancy by Country",
       subtitle="GapMinder data for Asia-2007")+
  theme_minimal()+
  theme(panel.grid.major=element_blank(),
        panel.grid.minor=element_blank())

# Data Multivariat Pengelompokan

library(carData)
library(ggplot2)
data(Salaries,package="carData")
ggplot(Salaries,aes(x=yrs.since.phd,
       y=salary,
       color=rank))+
  geom_point()+
  theme_minimal()+
  labs(title="Academic salary by rank and years since degree")

Menambahkan Jenis Kelamin

library(carData)
library(ggplot2)
ggplot(Salaries,aes(x=yrs.since.phd,
       y=salary,
       color=rank,
       shape=sex))+
  geom_point(size=3, alpha=.6)+
  theme_minimal()+
  labs(title="Academic salary by rank and years since degree")

Membedakan pria dan wanita

library(carData)
library(ggplot2)
ggplot(Salaries,aes(x=yrs.since.phd,
       y=salary,
       color=rank,
       size=yrs.service))+
  geom_point(alpha=.8)+
  theme_minimal()+
  labs(title="Academic salary by rank and years since degree")

Menambahkan garis kuadrat yang cukup

library(carData)
library(ggplot2)
ggplot(Salaries,aes(x=yrs.since.phd,
       y= salary,
       color=sex))+
  geom_point(alpha=.4,
             size=3)+
  geom_smooth(se=FALSE,
              method = "lm",
              formula=y~poly(x,2),
              size=1.5)+
  labs(x="Years Since Ph.D",
       title="Academic salary by rank and years since degree",
       subtitle = "9-month salary for 2008-2009",
       y="",
       color="Sex")+
    scale_y_continuous(label=scales::dollar)+
    scale_color_brewer(palette="Set1")+
    theme_minimal()

Pembagian Faset

library(carData)
library(ggplot2)
ggplot(Salaries,aes(x=salary))+
  geom_histogram(fill="cornflowerblue",
                 color="white")+
  facet_wrap(~rank,ncol=1)+
  theme_minimal()+
  labs(title="Salary Histograms by Rank")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Menetapkan jenis kelamin ke baris dan jabatan ke kolom

library(carData)
library(ggplot2)
ggplot(Salaries,aes(x=salary/10000))+
  geom_histogram(fill="cornflowerblue",
                 color="white")+
  facet_grid(sex~rank)+
  theme_minimal()+
  labs(title="Salary Histograms by Rank")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Menggunakan warna pada pembagian faset

library(carData)
library(ggplot2)
library(dplyr)
#Menghitung rata-rata dan kesalahan standar berdasarkan
#jenis kelamin, jabatan dan disiplin ilmu
plotdata<-Salaries %>%
  group_by(sex,rank,discipline)%>%
  dplyr::summarize(n=n(),
                   mean=mean(salary),
                   sd=sd(salary),
                   se=sd/sqrt(n))
## `summarise()` has grouped output by 'sex', 'rank'. You can override using the `.groups` argument.
#Membuat label yang lebih baik untuk disiplin ilmu
plotdata$discipline<-factor(plotdata$discipline,
                            labels=c("Theoretical",
                                     "Applied"))
#Membuat plot
ggplot(plotdata,
       aes(x=sex,
           y=mean,
           color=sex))+
  geom_point(size=3)+
  geom_errorbar(aes(ymin=mean-se,
                    ymax=mean+se),
                width=.1)+
  scale_y_continuous(breaks=seq(70000,140000,10000),
                     label=scales::dollar)+
  facet_grid(.~rank+discipline)+
  theme_bw()+
  theme(legend.position = "none",
        panel.grid.major.x = element_blank(),
        panel.grid.major.y = element_blank())+
  labs(x="",
       y="",
       title="Nine month academic salaries by gender, discipline, and rank",
       subtitle = "(Means and standard errors)")+
  scale_color_brewer(palette = "Set1")

Memodifikasi sumbu x memperkecil tulisan dan menyederhanakan warna background

library(gapminder)
library(ggplot2)
library(dplyr)
#Memplot harapan hidup berdasarkan tahun secara terpisah
#Untuk setiap negara di Asia
data(gapminder,package="gapminder")
#Pilih data Asia
plotdata<-dplyr::filter(gapminder,
                        continent=="Asia")
#Memplot harapan hidup berdasarkan tahun, untuk setiap negara
ggplot(plotdata, aes(x=year,y=lifeExp))+
  geom_line(color="grey")+
  geom_point(color="blue")+
  facet_wrap(~country)+
  theme_minimal(base_size=9)+
  theme(axis.text.x = element_text(angle = 45,
                                   hjust=1))+
  labs(title="Change in Life Expectancy",
       x="Year",
       y="Life Expectancy")

LS0tDQp0aXRsZTogIlR1Z2FzIDYiDQpzdWJ0aXRsZTogIkFsZ29yaXRtYSBkYW4gU3R1cmt0dXIgRGF0YSINCmF1dGhvcjogIkFsYmVydCBBZ3VuZyBQcmF5b2dvICgyMDIwNDkyMDAxOSkiDQpkYXRlOiAiYHIgZm9ybWF0KFN5cy5EYXRlKCksICclQiAlZCwgJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50OiANCiAgICBodG1sX2RvY3VtZW50OiBudWxsDQogICAgY29kZV9mb2xkaW5nOiBoaWRlDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6DQogICAgICBjb2xsYXBzZWQ6IHllcw0KICAgIG51bWJlcl9zZWN0aW9uczogeWVzDQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgdGhlbWU6IHNhbmRzdG9uZQ0KICAgIGNzczogc3R5bGUxLmNzcw0KICAgIGhpZ2hsaWdodDogbW9ub2Nocm9tZQ0KLS0tDQoNCg0KPGltZyBzdHlsZT0iZmxvYXQ6IHJpZ2h0OyBtYXJnaW46IDBweCAxMDBweCAwcHggMHB4OyB3aWR0aDoyNSUiIHNyYz0ibWUuanBnIi8+IA0KDQpgYGB7ciBsb2dvLCBlY2hvPUZBTFNFLGZpZy5hbGlnbj0nY2VudGVyJywgb3V0LndpZHRoID0gJzMwJSd9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygibG9nb21hdGFuYS5wbmciKQ0KYGBgDQoNCkVtYWlsICZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyZuYnNwOzogIGFsYmVydC5wcmF5b2dvOTlAZ21haWwuY29tIDxicj4NClJQdWJzICAmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDs6IGh0dHBzOi8vcnB1YnMuY29tL2FsYmVydDIzODk5IDxicj4NCkp1cnVzYW4gJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOzogW1N0YXRpc3Rpa2FdKGh0dHBzOi8vbWF0YW5hdW5pdmVyc2l0eS5hYy5pZC8/bHk9YWNhZGVtaWMmYz1zYikgPGJyPg0KQWRkcmVzcyAgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IDogQVJBIENlbnRlciwgTWF0YW5hIFVuaXZlcnNpdHkgVG93ZXIgPGJyPg0KJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsmbmJzcDsgSmwuIENCRCBCYXJhdCBLYXYsIFJULjEsIEN1cnVnIFNhbmdlcmVuZywgS2VsYXBhIER1YSwgVGFuZ2VyYW5nLCBCYW50ZW4gMTU4MTAuDQoNCioqKioNCiMgVmlzdWFsaXNhc2kgRGF0YSBkZW5nYW4gUiBVbml2YXJpYXQNCiMjIERpYWdyYW0gQmF0YW5nDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikgI1VudHVrIFZpc3VhbGlzYXNpDQpNYXJyaWFnZTwtcmVhZC5jc3YoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9CYWt0aS1TaXJlZ2FyL2RhdGFzZXQvbWFzdGVyL0Jvb2tkb3duLURhdGEtU2NpZW5jZS1mb3ItQmVnaW5uZXJzL01hcnJpYWdlLmNzdiIpICNNZW11YXQgRGF0YQ0KZ2dwbG90KE1hcnJpYWdlLCBhZXMoeD16b2RpYWNzKSkrICNNZW1wbG90IERpc3RyaWJ1c2kgZGFyaSBab2RpYWNzDQogIGdlb21fYmFyKGZpbGw9ImNvcm5mbG93ZXJibHVlIiwNCiAgICAgICAgICAgY29sb3I9ImF6dXJlNCIpKyAjQW5kYSBkYXBhdCBtZW5nZ2FudGkgd2FybmENCiAgdGhlbWVfbWluaW1hbCgpKyAjTWVuZ2d1bmFrYW4gdGVtYSBtaW5pbWFsDQogIGxhYnMoeD0iWm9kaWFjcyIsDQogICAgICAgeT0iRnJlcXVlbmN5IiwNCiAgICAgICB0aXRsZT0iTWFycmlhZ2UgUGFydGljaXBpYW50cyBieSBab2RpYWNzIikgI01lbmdnYW50aSBsYWJlbCBkYW4ganVnYSBqdWR1bCBjaGFydA0KYGBgDQpNZW5hbWJhaGthbiBzaW1ib2wgcGVyc2VuIHVudHVrIGxhYmVsIHkNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KE1hcnJpYWdlLA0KICAgICAgIGFlcygNCiAgICAgICAgIHg9IHpvZGlhY3MsDQogICAgICAgICB5PS4uY291bnQuLi9zdW0oLi5jb3VudC4uKSkpKw0KICBnZW9tX2JhcihmaWxsPXJhaW5ib3coMTIpLGNvbG9yPSJhenVyZTQiKSsNCiAgdGhlbWVfbWluaW1hbCgpKyAjTWVuZ2d1bmFrYW4gdGVtYSBtaW5pbWFsDQogIGxhYnMoeD0iWm9kaWFjcyIsDQogICAgICAgeT0iUGVyY2VudHMiLA0KICAgICAgIHRpdGxlPSJNYXJyaWFnZSBQYXJ0aWNpcGlhbnRzIGluIFBlcmNlbnRzIikNCnNjYWxlX3lfY29udGludW91cyhsYWJlbHM9c2NhbGVzOjpwZXJjZW50KSAjTWVuZ2d1bmFrYW4gc2ltYm9sICUgdW50dWsgbGFiZWwNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGRwbHlyKSAjVW50dWsgbWVtYW5pcHVsYXNpIGRhdGENCmxpYnJhcnkoZ2dwbG90MikgI1VudHVrIFZpc3VhbGlzYXNpIERhdGENCnBsb3RkYXRhPC1NYXJyaWFnZSAlPiUgI01lbXVhdCBEYXRhc2V0DQogIGNvdW50KHpvZGlhY3MpICNKdW1sYWggcGVzZXJ0YSBkaSBzZXRpYXAgWm9kaWFjcw0KI01lbnl1c3VuIHBsb3QgYmF0YW5nIHNlY2FyYSBtZW5pbmdrYXQNCmdncGxvdChwbG90ZGF0YSwNCiAgICAgICBhZXMoDQogICAgICAgICB4PXJlb3JkZXIoem9kaWFjcyxuKSwNCiAgICAgICAgIHk9bikpKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGw9cmFpbmJvdygxMiksDQogICAgICAgICAgIGNvbG9yPSJhenVyZTQiKSsNCiAgdGhlbWVfbWluaW1hbCgpKyAjTWVuZ2d1bmFrYW4gdGVtYSBtaW5pbWFsDQogIGxhYnMoeD0iWm9kaWFjcyIsDQogICAgICAgeT0iRnJlcXVlbmN5IiwNCiAgICAgICB0aXRsZT0iU29ydGluZyBDYXRlZ29yaWVzIikNCmBgYA0KTWVtYmVyaSBsYWJlbCBzZXRpYXAgYmF0YW5nIGRlbmdhbiBuaWxhaSBudW1lcmlrbnlhDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCnBsb3RkYXRhPC1NYXJyaWFnZSAlPiUNCiAgY291bnQoem9kaWFjcykgJT4lDQogIG11dGF0ZShwY3Q9bi9zdW0obiksDQogICAgICAgICBwY3RsYWJlbD1wYXN0ZTAocm91bmQocGN0KjEwMCksIiUiKSkNCiNQbG90IGJhdGFuZyBzZWJhZ2FpIHBlcnNlbnRhc2UsIGRhbGFtIHVydXRhbiBtZW51cnVuIGRlbmdhbiBkaWFncmFtIGJhdGFuZw0KZ2dwbG90KHBsb3RkYXRhLA0KICAgICAgIGFlcyh4PXJlb3JkZXIoem9kaWFjcywtcGN0KSwNCiAgICAgICAgICAgeT1wY3QpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLA0KICAgICAgICAgICBmaWxsPXJhaW5ib3coMTIpLA0KICAgICAgICAgICBjb2xvcj0iYXp1cmU0IikrDQogIGdlb21fdGV4dChhZXMobGFiZWw9cGN0bGFiZWwpLA0KICAgICAgICAgICAgdmp1c3Q9LTAuMjUpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9cGVyY2VudCkrDQogIGxhYnMoeD0iem9kaWFjcyIsDQogICAgICAgeT0iUGVyY2VudCIsDQogICAgICAgdGl0bGU9IkxhYmVsaW5nIEJhcnMiKQ0KYGBgDQpNZW11dGFyIExhYmVsIFN1bWJ1DQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KI1Bsb3QgYmF0YW5nIHNlYmFnYWkgcGVyc2VudGFzZSwgZGFsYW0gdXJ1dGFuIG1lbnVydW4gZGVuZ2FuIGRpYWdyYW0gYmF0YW5nDQpnZ3Bsb3QocGxvdGRhdGEsDQogICAgICAgYWVzKHg9cmVvcmRlcih6b2RpYWNzLC1wY3QpLA0KICAgICAgICAgICB5PXBjdCkpKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGw9cmFpbmJvdygxMiksDQogICAgICAgICAgIGNvbG9yPSJhenVyZTQiKSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wY3RsYWJlbCksDQogICAgICAgICAgICB2anVzdD0tMC4yNSkrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1wZXJjZW50KSsNCiAgbGFicyh4PSJab2RpYWNzIiwNCiAgICAgICB5PSJQZXJjZW50IiwNCiAgICAgICB0aXRsZT0iT3ZlcmxhcHBpbmcgTGFiZWxzIikgKw0KdGhlbWUoYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KGFuZ2xlPTQ1LGhqdXN0PTEpKQ0KYGBgDQpNZW1iYWxpayBzdW1idSB4IGRhbiB5DQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KI1Bsb3QgYmF0YW5nIHNlYmFnYWkgcGVyc2VudGFzZSwgZGFsYW0gdXJ1dGFuIG1lbnVydW4gZGVuZ2FuIGRpYWdyYW0gYmF0YW5nDQpnZ3Bsb3QocGxvdGRhdGEsDQogICAgICAgYWVzKHg9cmVvcmRlcih6b2RpYWNzLC1wY3QpLA0KICAgICAgICAgICB5PXBjdCkpKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsDQogICAgICAgICAgIGZpbGw9cmFpbmJvdygxMiksDQogICAgICAgICAgIGNvbG9yPSJhenVyZTQiKSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1wY3RsYWJlbCksDQogICAgICAgICAgICB2anVzdD0tMC4xMCkrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscz1wZXJjZW50KSsNCiAgbGFicyh4PSJab2RpYWNzIiwNCiAgICAgICB5PSJQZXJjZW50IiwNCiAgICAgICB0aXRsZT0iT3ZlcmxhcHBpbmcgTGFiZWxzIikgKw0KY29vcmRfZmxpcCgpDQpgYGANCiMjIERpYWdyYW0gUGllDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCiNQZXJzaWFwYW4gRGF0YQ0KcGxvdGRhdGE8LU1hcnJpYWdlICU+JQ0KICBjb3VudChyYWNlKSAlPiUNCiAgYXJyYW5nZShkZXNjKHJhY2UpKSU+JQ0KICBtdXRhdGUocHJvcD1yb3VuZChuKjEwMC9zdW0obiksMSksDQogICAgICAgICBsYWIueXBvcz1jdW1zdW0ocHJvcCktMC41KnByb3ApDQojTWVtYnVhdCBEaWFncmFtIFBpZQ0KbXljb2xzPC1jKCIjMDA3M0MyRkYiLCIjRUZDMDAwRkYiLCIjODY4Njg2RkYiLCIjQ0Q1MzRDRkYiKQ0KICBnZ3Bsb3QocGxvdGRhdGEsYWVzKHg9IiIseT1wcm9wLGZpbGw9cmFjZSkpKw0KICAgIGdlb21fYmFyKHdpZHRoPTEsIHN0YXQ9ImlkZW50aXR5Iixjb2xvcj0id2hpdGUiKSsNCiAgICBjb29yZF9wb2xhcigieSIsc3RhcnQ9MCkrDQogICAgZ2VvbV90ZXh0KGFlcyh5PWxhYi55cG9zLGxhYmVsPXByb3ApLGNvbG9yPSJ3aGl0ZSIpKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG15Y29scykrDQogICAgdGhlbWVfdm9pZCgpKw0KICAgIGxhYnModGl0bGU9Ik1hcnJpYWdlIFBhcnRpY2lwYW55IGJ5IFJhY2UiKQ0KYGBgDQpNZW1idWF0IGx1YmFuZyBkYWxhbSBkaWFncmFtIHBpZQ0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCiNNZW1idWF0IGRpYWdyYW0gZG9uYXQNCmdncGxvdChwbG90ZGF0YSxhZXMoeD0yLHk9cHJvcCxmaWxsPXJhY2UpKSsNCiAgICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsY29sb3I9IndoaXRlIikrDQogICAgY29vcmRfcG9sYXIodGhldGE9InkiLHN0YXJ0PTApKw0KICAgIGdlb21fdGV4dChhZXMoeT1sYWIueXBvcyxsYWJlbD1wcm9wKSxjb2xvcj0id2hpdGUiKSsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBteWNvbHMpKw0KICAgIHRoZW1lX3ZvaWQoKSsNCiAgICB4bGltKDAuNSwyLjUpKw0KICAgIGxhYnModGl0bGU9Ik1hcnJpYWdlIFBhcnRpY2lwYW55IGJ5IFJhY2UiKQ0KYGBgDQpNZW5hbWJhaGthbiBsYWJlbCBkYW4gbWVuZ2hhcHVzIGxlZ2VuZGENCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzY2FsZXMpDQojdGFtYmFoa2FuIGxhYmVsIHBlcnNlbg0KcGxvdGRhdGEkcGVyY2VudDwtcGFzdGUwKHBsb3RkYXRhJHJhY2UsIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZChwbG90ZGF0YSRwcm9wKSwiJSIpDQojbWVtYnVhdCBkaWFncmFtIGRvbnV0IGRhbGFtIHBlcnNlbg0KZ2dwbG90KHBsb3RkYXRhLGFlcyh4PTIseT1wcm9wLGZpbGw9cmFjZSkpKw0KICAgIGdlb21fYmFyKHN0YXQ9ImlkZW50aXR5Iixjb2xvcj0id2hpdGUiKSsNCiAgICBjb29yZF9wb2xhcih0aGV0YT0ieSIsc3RhcnQ9MCkrDQogICAgZ2VvbV90ZXh0KGFlcyh5PWxhYi55cG9zLGxhYmVsPXBlcmNlbnQpLGNvbG9yPSJ3aGl0ZSIpKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IG15Y29scykrDQogICAgdGhlbWVfdm9pZCgpKw0KICAgIHhsaW0oMC41LDIuNSkrDQogICAgbGFicyh0aXRsZT0iTWFycmlhZ2UgUGFydGljaXBhbnkgYnkgUmFjZSIpDQpgYGANCiMjIFBldGEgUG9ob24NCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeSh0cmVlbWFwaWZ5KQ0KbGlicmFyeShzY2FsZXMpDQpwbG90ZGF0YSA8LU1hcnJpYWdlICU+JQ0KICBjb3VudChvZmZpY2lhbFRpdGxlKQ0KZ2dwbG90KHBsb3RkYXRhLA0KICAgICAgIGFlcyhmaWxsPW9mZmljaWFsVGl0bGUsDQogICAgICAgICAgIGFyZWE9bikpKw0KICBnZW9tX3RyZWVtYXAoKSsNCiAgbGFicyh0aXRsZT0iTWFycmlhZ2UgUGFydGljaXBhbnRzIGJ5IE9mZmljaWF0ZSIpDQpgYGANCk1lbmdndW5ha2FuIExhYmVsDQpgYGB7cn0NCmdncGxvdChwbG90ZGF0YSwNCiAgICAgICBhZXMoZmlsbD1vZmZpY2lhbFRpdGxlLA0KICAgICAgICAgICBhcmVhPW4sDQogICAgICAgICAgIGxhYmVsPW9mZmljaWFsVGl0bGUpKSsNCiAgZ2VvbV90cmVlbWFwKCkrDQogIGdlb21fdHJlZW1hcF90ZXh0KGNvbG91cj0id2hpdGUiLA0KICAgICAgICAgICAgICAgICAgICBwbGFjZT0iY2VudHJlIikrDQogIGxhYnModGl0bGU9Ik1hcnJpYWdlIFBhcnRpY2lwYW50cyBieSBPZmZpY2lhdGUiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikNCmBgYA0KIyBWYXJpYWJlbCBLb250aW51DQojIyBIaXN0b2dyYW0NCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KE1hcnJpYWdlLGFlcyh4PWFnZSkpKw0KICBnZW9tX2hpc3RvZ3JhbShmaWxsPSJjb3JuZmxvd2VyYmx1ZSIsDQogICAgICAgICAgICAgICAgIGNvbG9yPSJ3aGl0ZSIsYmlucz0yMCkrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0iTWFycmlhZ2UgUGFydGljaXBhbnRzIGJ5IEFnZSAoQmFzaWMpIiwNCiAgICAgICB4PSJBZ2UiKQ0KYGBgDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KZ2dwbG90KE1hcnJpYWdlLA0KICAgICAgIGFlcyh4PWFnZSwNCiAgICAgICAgICAgeT0uLmNvdW50Li4vc3VtKC4uY291bnQuLikpKSsNCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbD0iY29ybmZsb3dlcmJsdWUiLA0KICAgICAgICAgICAgICAgICBjb2xvcj0id2hpdGUiLA0KICAgICAgICAgICAgICAgICBiaW53aWR0aCA9IDUpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGUgPSAiTWFycmlhZ2UgUGFydGljaXBhbnRzIGJ5IEFnZShBbHRlcm5hdGl2ZSBCaW5zIGFuZCBCaW53aWR0aCIsDQogICAgICAgeT0iUGVyY2VudCIsDQogICAgICAgeD0iQWdlIikrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHM9cGVyY2VudCkNCmBgYA0KUGxvdCBEZW5zaXRhcyBLZXJuZWwNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KE1hcnJpYWdlLGFlcyh4PWFnZSkpKw0KICBnZW9tX2RlbnNpdHkoZmlsbD0iaW5kaWFucmVkMyIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9Ik1hcnJpYWdlIFBhcnRpY2lwYW50cyBieSBBZ2UiKQ0KYGBgDQpQYXJhbWV0ZXIgUGVuZ2hhbHVzYW4NCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KYncubnJkMChNYXJyaWFnZSRhZ2UpDQpnZ3Bsb3QoTWFycmlhZ2UsYWVzKHg9YWdlKSkrDQogIGdlb21fZGVuc2l0eShmaWxsPSJkZWVwc2t5Ymx1ZSIsDQogICAgICAgICAgICAgICBidz0xKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSJQYXJ0aWNpcGFudHMgYnkgQWdlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICJiYW5kd2lkdGg9MSIpDQpgYGANCiMjIERpYWdyYW0gVGl0aWsNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZ2dwbG90KE1hcnJpYWdlLGFlcyh4PWFnZSkpKw0KICBnZW9tX2RvdHBsb3QoZmlsbD0iZ29sZCIsDQogICAgICAgICAgICAgICBjb2xvcj0iYXp1cmU0IiwNCiAgICAgICAgICAgICAgIGJpbndpZHRoID0gMikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0iUGFydGljaXBhbnRzIGJ5IGFnZSIsDQogICAgICAgeT0iUHJvcG9ydGlvbiIsDQogICAgICAgeD0iQWdlIikNCg0KYGBgDQojIERhdGEgQml2YXJpYXQNCiMjIEthdGVnb3Jpa2FsIFZzIEthdGVnb3Jpa2FsDQpEaWFncmFtIEJhdGFuZyBCZXJ0dW1wdWsNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbXBnJGRydjwtZmFjdG9yKG1wZyRkcnYsDQogICAgICAgICAgICAgICAgbGV2ZWxzPWMoImYiLCJyIiwiNCIpLA0KICAgICAgICAgICAgICAgIGxhYmVscz1jKCJmcm9udC13aGVlbCIsInJlYXItd2hlZWwiLCI0LXdoZWVsIikpDQojbWVtYnVhdCBkaWFncmFtIGJhdGFuZyBiZXJ0dW1wdWsNCmdncGxvdChtcGcsDQogICAgICAgYWVzKHg9Y2xhc3MsDQogICAgICAgICAgIGZpbGw9ZHJ2KSkrDQogIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh5PSJwcm9wb3J0aW9uIikNCmBgYA0KRGlhZ3JhbSBiYXRhbmcgeWFuZyBkaWtlbG9tcG9ra2FuDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChtcGcsYWVzKHg9Y2xhc3MsZmlsbD1kcnYpKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBnZW9tX2Jhcihwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZShwcmVzZXJ2ZT0ic2luZ2xlIikpDQpgYGANCkRpYWdyYW0gQmF0YW5nIFRlcnNlZ21lbnRhc2kNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KI21lbWJ1YXQgcmluZ2thc2FuIGRhdGFzZXQNCnBsb3RkYXRhPC1tcGcgJT4lDQogIGdyb3VwX2J5KGNsYXNzLGRydiklPiUNCiAgZHBseXI6OnN1bW1hcmlzZShuPW4oKSklPiUNCiAgbXV0YXRlKHBjdD1uL3N1bShuKSwNCiAgICAgICAgIGxibD1zY2FsZXM6OnBlcmNlbnQocGN0KSkNCiNtZW1idWF0IGRpYWdyYW0gYmF0YW5nIHRlcnNlZ21lbnRhc2kNCiNtZW5hbWJhaGthbiBsYWJlbCB1bnR1ayBzZXRpYXAgc2VnbWVuDQpnZ3Bsb3QocGxvdGRhdGEsDQogICAgICAgYWVzKHg9ZmFjdG9yKGNsYXNzKSwNCiAgICAgICAgICAgeT1wY3QsDQogICAgICAgICAgIGZpbGw9ZmFjdG9yKGRydikpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLA0KICAgICAgICAgICBwb3NpdGlvbj0iZmlsbCIpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDEsLjIpLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWw9cGVyY2VudCkrDQogIGdlb21fdGV4dChhZXMobGFiZWw9bGJsKSwNCiAgICAgICAgICAgIHNpemU9MywNCiAgICAgICAgICAgIHBvc2l0aW9uPXBvc2l0aW9uX3N0YWNrKHZqdXN0PTAuNSkpKw0KICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHk9IlBlcmNlbnQiLA0KICAgICAgIGZpbGw9IkRyaXZlIFRyYWluIiwNCiAgICAgICB4PSJDbGFzcyIsDQogICAgICAgdGl0bGU9IkF1dG9tb2JpbGUgRHJpdmUgYnkgQ2xhc3MiKQ0KdGhlbWVfbWluaW1hbCgpDQoNCmBgYA0KUGxvdCBNb3NhaWsNCmBgYHtyfQ0KdGJsPC14dGFicyhGcmVxflN1cnZpdmVkK0NsYXNzK1NleCwgVGl0YW5pYykNCmZ0YWJsZSh0YmwpDQojTWVtYnVhdCBwbG90IG1vc2FpayBkYXJpIHRhYmVsDQpsaWJyYXJ5KHZjZCkNCm1vc2FpYyh0YmwsbWFpbj0iVGl0YW5pYyBkYXRhIikNCmBgYA0KYGBge3J9DQptb3NhaWModGJsLA0KICAgICAgIHNoYWRlPVRSVUUsDQogICAgICAgbGVnZW5kPVRSVUUsDQogICAgICAgbGFiZWxpbl9hcmdzPWxpc3Qoc2V0X3Zhcm5hbWVzPWMoU2V4PSJHZW5kZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cnZpdmVkPSJTdXJ2aXZlZCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M9IlBhc3NlbmdlciBDbGFzcyIpKSwNCiAgICAgICBzZXRfbGFiZWxzPWxpc3QoU3Vydml2ZWQ9YygiTm8iLCJZZXMiLA0KICAgICAgICAgICAgICAgICAgICAgICBDbGFzcz1jKCIxc3QiLCIybmQiLCIzcmQiLCJDcmV3IiksDQogICAgICAgICAgICAgICAgICAgICAgIFNleD1jKCJGIiwiTSIpKSwNCiAgICAgICBtYWluPSJUaXRhbmljIGRhdGEiKQ0KICAgICAgICkNCiAgICAgICANCmBgYA0KIyBLb250aW51IFZzIEtvbnRpbnUNClBsb3QgU2ViYXJhbg0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGhyYnJ0aGVtZXMpDQojTWVtYnVhdCBkYXRhDQpkMTwtZGF0YS5mcmFtZSh4PXNlcSgxLDEwMCksDQogICAgICAgICAgICAgICB5PXJub3JtKDEwMCksDQogICAgICAgICAgICAgICBuYW1lPSJObyB0cmVuZCIpDQpkMjwtZDElPiUNCm11dGF0ZSh5PXgqMTAgK3Jub3JtKDEwMCxzZD02MCkpJT4lDQptdXRhdGUobmFtZT0iTGluZWFyIFJlbGF0aW9uc2hpcCIpDQpkMzwtZDElPiUNCm11dGF0ZSh5PXheMitybm9ybSgxMDAsc2Q9MTQwKSklPiUNCm11dGF0ZShuYW1lPSJTcXVhcmUiKQ0KZDQ8LWRhdGEuZnJhbWUoeD1zZXEoMSwxMCwwLjEpLA0KICAgICAgICAgICAgICAgeT1zaW4oc2VxKDEsMTAsMC4xKSkrDQogICAgICAgICAgICAgICAgIHJub3JtKDkxLHNkPTAuNikpJT4lDQptdXRhdGUobmFtZT0iU2luIikNCmRvbjwtZG8uY2FsbChyYmluZCxsaXN0KGQxLGQyLGQzLGQ0KSkNCiNQbG90DQpkb24lPiUNCiAgZ2dwbG90KGFlcyh4PXgseT15KSkrDQogIGdlb21fcG9pbnQoY29sb3I9IiM2OWIzYTIiLGFscGhhPTAuOCkrDQogIHRoZW1lX2lwc3VtKCkrDQogIGZhY2V0X3dyYXAofm5hbWUsIHNjYWxlPSJmcmVlIikNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCmRhdGEoU2FsYXJpZXMsIHBhY2thZ2U9ImNhckRhdGEiKQ0KI3Bsb3Qgc2ViYXJhbiB5YW5nIGRpdGluZ2thdGthbg0KZ2dwbG90KFNhbGFyaWVzLA0KICAgICAgIGFlcyh4PXlycy5zaW5jZS5waGQsDQogICAgICAgICAgIHk9c2FsYXJ5KSkrDQogIGdlb21fcG9pbnQoY29sb3I9ImNvcm5mbG93ZXJibHVlIiwNCiAgICAgICAgICAgICBzaXplPTIsDQogICAgICAgICAgICAgYWxwaGE9LjgpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWw9c2NhbGVzOjpkb2xsYXIsDQogICAgICAgICAgICAgICAgICAgICBsaW1pdHM9Yyg1MDAwMCwyNTAwMDApKSsNCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcz1zZXEoMCw2MCwxMCksDQogICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygwLDYwKSkrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh4PSJZZWFycyBTaW5jZSBQaEQiLA0KICAgICAgIHk9IiIsDQogICAgICAgdGl0bGU9IkV4cGVyaWVuY2UgVnMuIFNhbGFyeSIsDQogICAgICAgc3VidGl0bGUgPSAiOS1tb250aHMgc2FsYXJ5IGZvciAyMDA4LTIwMDkiKQ0KYGBgDQpQbG90IFNlYmFyYW4gTWVueWVzdWFpa2FuIEdhcmlzDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChTYWxhcmllcywNCiAgICAgICBhZXMoeD15cnMuc2luY2UucGhkLA0KICAgICAgICAgICB5PXNhbGFyeSkpICsNCiAgZ2VvbV9wb2ludChjb2xvcj0iY29ybmZsb3dlcmJsdWUiKSsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSJicm93bjEiKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHg9IlllYXJzIFNpbmNlIFBoRCIsDQogICAgICAgeT0iIiwNCiAgICAgICB0aXRsZT0iRXhwZXJpZW5jZSBWcy4gU2FsYXJ5IiwNCiAgICAgICBzdWJ0aXRsZSA9ICI5LW1vbnRoIHNhbGFyeSBmb3IgMjAwOC0yMDA5IikNCmBgYA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoU2FsYXJpZXMsDQogICAgICAgYWVzKHg9eXJzLnNpbmNlLnBoZCwNCiAgICAgICAgICAgeT1zYWxhcnkpKSsNCiAgZ2VvbV9wb2ludChjb2xvcj0iY29ybmZsb3dlcmJsdWUiLA0KICAgICAgICAgICAgIHNpemU9MiwNCiAgICAgICAgICAgICBhbHBoYT0xKSsNCiAgZ2VvbV9zbW9vdGgoc2l6ZT0xLA0KICAgICAgICAgICAgICBjb2xvcj0iZ3JlZW4iKSsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVsPSBzY2FsZXM6OmRvbGxhciwNCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKDUwMDAwLDI1MDAwMCkpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzPXNlcSgwLDYwLDEwKSwNCiAgICAgICAgICAgICAgICAgICAgIGxpbWl0cz1jKDAsNjApKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHg9IlllYXJzIFNpbmNlIFBoRCIsDQogICAgICAgeT0iIiwNCiAgICAgICB0aXRsZSA9ICJFeHBlcmllbmNlIHZzLiBTYWxhcnkiLA0KICAgICAgIHN1YnRpdGxlPSI5LW1vbnRoIHNhbGFyeSBmb3IgMjAwOC0yMDA5IikNCnRoZW1lX21pbmltYWwoKQ0KYGBgDQojIyBLYXRlZ29yaWthbCB2cyAuS29udGludQ0KRGlhZ3JhbSBCYXRhbmcNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KZGF0YShTYWxhcmllcywgcGFja2FnZSA9ICJjYXJEYXRhIikNCiNNZW5naGl0dW5nIGdhamkgcmF0YS1yYXRhIHVudHVrIHNldGlhcCBqYWJhdGFuDQpwbG90ZGF0YSA8LVNhbGFyaWVzICU+JQ0KICBncm91cF9ieShyYW5rKSAlPiUNCiAgZHBseXI6OnN1bW1hcml6ZShtZWFuX3NhbGFyeT1tZWFuKHNhbGFyeSkpDQojUGxvdCBnYWppIHJhdGEtcmF0YSBkZW5nYW4gY2FyYSB5YW5nIGxlYmloIG1lbmFyaWsNCm15Y29sczwtYygiI0NENTM0Q0ZGIiwiI0VGQzAwMEZGIiwiIzAwNzNDMkZGIikNCmdncGxvdChwbG90ZGF0YSwNCiAgICAgICBhZXMoeD1mYWN0b3IocmFuaywNCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzPWMoIkFzc2lzdGFudFxuUHJvZmVzc29yIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFzc29jaWF0ZVxuUHJvZmVzc29yIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZ1bGxcblByb2Zlc3NvciIpKSwNCiAgICAgICAgICAgeT1tZWFuX3NhbGFyeSkpKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwNCiAgICAgICAgICAgZmlsbD1teWNvbHMpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPWRvbGxhcihtZWFuX3NhbGFyeSkpLA0KICAgICAgICAgICAgdmp1c3Q9LTAuMjUpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcz1zZXEoMCwxMzAwMDAsMjAwMDApLA0KICAgICAgICAgICAgICAgICAgICAgbGFiZWw9ZG9sbGFyKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSJNZWFuIFNhbGFyeSBieSBSYW5rIiwNCiAgICAgICBzdWJ0aXRsZT0iOS1tb250aCBhY2FkZW1pYyBzYWxhcnkgZm9yIDIwMDgtMjAwOSIsDQogICAgICAgeD0iIiwNCiAgICAgICB5PSIiKQ0KDQpgYGANClBsb3QgZGVuc2l0YXMgS2VybmVsIHlhbmcgZGlrZWxvbXBva2FuDQpgYGB7cn0NCmdncGxvdChTYWxhcmllcywNCiAgICAgICBhZXMoeD1zYWxhcnksDQogICAgICAgICAgIGZpbGw9cmFuaykpKw0KICBnZW9tX2RlbnNpdHkoYWxwaGE9MC40KSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSJTYWxhcnkgZGlzdHJpYnV0aW9uIGJ5IHJhbmsiKQ0KYGBgDQpCb3hwbG90DQpgYGB7cn0NCm15Y29sczwtYygiI0NENTM0Q0ZGIiwiI0VGQzAwMEZGIiwiIzAwNzNDMkZGIikNCmdncGxvdChTYWxhcmllcyxhZXMoeD1yYW5rLA0KICAgICAgICAgICAgICAgICAgICB5PXNhbGFyeSkpKw0KICBnZW9tX2JveHBsb3Qobm90Y2g9VFJVRSwNCiAgICAgICAgICAgICAgIGZpbGw9bXljb2xzLA0KICAgICAgICAgICAgICAgYWxwaGE9LjcpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9IlNhbGFyeSBEaXN0cmlidXRpb24gYnkgUmFuayIpDQpgYGANClBsb3QgQmlvbGENCmBgYHtyfQ0KZ2dwbG90KFNhbGFyaWVzLA0KICAgICAgIGFlcyh4PXJhbmssDQogICAgICAgICAgIHk9c2FsYXJ5KSkrDQogIGdlb21fdmlvbGluKGZpbGw9ImF6dXJlMSIpKw0KICBnZW9tX2JveHBsb3Qod2lkdGg9LjIsDQogICAgICAgICAgICAgICBmaWxsPW15Y29scywNCiAgICAgICAgICAgICAgIG91dGxpZXIuY29sb3I9InJlZCIsDQogICAgICAgICAgICAgICBvdXRsaWVyLnNpemUgPSAyKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSJTYWxhcnkgRGlzdHJpYnV0aW9uIGJ5IFJhbmsiKQ0KYGBgDQpQbG90IEdhcmlzIFB1bmdndW5nDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdncmlkZ2VzKQ0KZ2dwbG90KG1wZywNCiAgICAgICBhZXMoeD1jdHksDQogICAgICAgICAgIHk9Y2xhc3MsDQogICAgICAgICAgIGZpbGw9Y2xhc3MpKSsNCiAgZ2VvbV9kZW5zaXR5X3JpZGdlcyhhbHBoYT0wLjcpKw0KICB0aGVtZV9yaWRnZXMoKSsNCiAgbGFicygiSGlnaHdheSBtaWxlYWdlIGJ5IGF1dG8gY2xhc3MiKSsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KYGBgDQpQbG90IEdhcmlzDQpgYGB7cn0NCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGdncmlkZ2VzKQ0KI01lbmdoaXR1bmcgcmF0YS1yYXRhLCBkZXZpYXNpIHN0YW5kYXIsDQojS2VzYWxhaGFuIHN0YW5kYXIsIGRhbiA5NSUgaW50ZXJ2YWwga2VwZXJjYXlhYW4NCiNCZXJkYXNhcmthbiBKYWJhdGFuDQpwbG90ZGF0YTwtU2FsYXJpZXMgJT4lDQogIGdyb3VwX2J5KHJhbmssc2V4KSU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG49bigpLA0KICAgICAgICAgICAgICAgICAgIG1lYW49bWVhbihzYWxhcnkpLA0KICAgICAgICAgICAgICAgICAgIHNkPXNkKHNhbGFyeSksDQogICAgICAgICAgICAgICAgICAgc2U9c2Qvc3FydChuKSwNCiAgICAgICAgICAgICAgICAgICBjaT1xdCgwLjk3NSxkZiA9bi0xKSpzZC9zcXJ0KG4pKQ0KI01lbmluZ2thdGthbiBwbG90IHJhdGEtcmF0YSBrZXNhbGFoYW4NCnBkPC1wb3NpdGlvbl9kb2RnZSgwLjIpDQpnZ3Bsb3QocGxvdGRhdGEsDQogICAgICAgYWVzKHg9ZmFjdG9yKHJhbmssDQogICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJBc3Npc3RhbnRcblByb2Zlc3NvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NvY2lhdGVcblByb2Zlc3NvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdWxsXG5Qcm9mZXNzb3IiKSksDQogICAgICAgICAgIHk9bWVhbiwNCiAgICAgICAgICAgZ3JvdXA9c2V4LA0KICAgICAgICAgICBjb2xvcj1zZXgpKSsNCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBkLA0KICAgICAgICAgICAgIHNpemU9MykrDQogIGdlb21fbGluZShwb3NpdGlvbj1wZCwNCiAgICAgICAgICAgIHNpemU9MSkrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bWVhbi1zZSwNCiAgICAgICAgICAgICAgICAgICAgeW1heD1tZWFuK3NlKSwNCiAgICAgICAgICAgICAgICAgICAgd2lkdGg9LjEsDQogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPXBkLA0KICAgICAgICAgICAgICAgICAgICBzaXplPTEpKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWw9c2NhbGVzOjpkb2xsYXIpKw0KICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQxIikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0iTWVhbiBzYWxhcnkgYnkgcmFuayBhbmQgc2V4IiwNCiAgICAgICBzdWJ0aXRsZSA9ICIobWVhbiArLy0gc3RhbmRhcmQgZXJyb3IpIiwNCiAgICAgICB4PSIiLA0KICAgICAgIHk9IiIsDQogICAgICAgY29sb3I9IkdlbmRlciIpDQpgYGANClBsb3QgU3RyaXANCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzY2FsZXMpDQpnZ3Bsb3QoU2FsYXJpZXMsDQogICAgICAgYWVzKHk9ZmFjdG9yKHJhbmssDQogICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJBc3Npc3RhbnRcblByb2Zlc3NvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NvY2lhdGVcblByb2Zlc3NvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdWxsXG5Qcm9mZXNzb3IiKSksDQogICAgICAgICAgIHg9c2FsYXJ5LA0KICAgICAgICAgICBjb2xvcj1yYW5rKSkrDQogIGdlb21faml0dGVyKGFscGhhPTAuNywNCiAgICAgICAgICAgICAgc2l6ZT0xLjUpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWw9ZG9sbGFyKSsNCiAgbGFicyh0aXRsZT0iQWNhZGVtaWMgU2FsYXJ5IGJ5IFJhbmsiLA0KICAgICAgIHN1YnRpdGxlPSI5LW1vbnRoIHNhbGFydHkgZm9yIDIwMDgtMjAwOSIsDQogICAgICAgeD0iIiwNCiAgICAgICB5PSIiKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCk1lbmdnYWJ1bmdrYW4gSml0dGVyIGRhbiBQbG90S290YWsNCmBgYHtyfQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShzY2FsZXMpDQpnZ3Bsb3QoU2FsYXJpZXMsDQogICAgICAgYWVzKHk9ZmFjdG9yKHJhbmssDQogICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJBc3Npc3RhbnRcblByb2Zlc3NvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NvY2lhdGVcblByb2Zlc3NvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdWxsXG5Qcm9mZXNzb3IiKSksDQogICAgICAgICAgIHg9c2FsYXJ5LA0KICAgICAgICAgICBjb2xvcj1yYW5rKSkrDQogIGdlb21fYm94cGxvdChzaXplPTEsDQogICAgICAgICAgICAgICBvdXRsaWVyLnNoYXBlID0gMSwNCiAgICAgICAgICAgICAgIG91dGxpZXIuY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgIG91dGxpZXIuc2l6ZSA9IDMpKw0KICBnZW9tX2ppdHRlcihhbHBoYT0wLjUsDQogICAgICAgICAgICAgIHNpemU9LjIpKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWw9ZG9sbGFyKSsNCiAgbGFicyh0aXRsZT0iQWNhZGVtaWMgU2FsYXJ5IGJ5IFJhbmsiLA0KICAgICAgIHN1YnRpdGxlPSI5LW1vbnRoIHNhbGFydHkgZm9yIDIwMDgtMjAwOSIsDQogICAgICAgeD0iIiwNCiAgICAgICB5PSIiKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpKw0KICBjb29yZF9mbGlwKCkNCmBgYA0KSGlicmlkIEdlb20gUGxvdCBKaXR0ZXIgZGFuIEJveA0KYGBge3J9DQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkoZ2dwb2wpDQpnZ3Bsb3QoU2FsYXJpZXMsDQogICAgICAgYWVzKHg9ZmFjdG9yKHJhbmssDQogICAgICAgICAgICAgICAgICAgIGxhYmVscz1jKCJBc3Npc3RhbnRcblByb2Zlc3NvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NvY2lhdGVcblByb2Zlc3NvciIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGdWxsXG5Qcm9mZXNzb3IiKSksDQogICAgICAgICAgIHk9c2FsYXJ5LA0KICAgICAgICAgICBmaWxsPXJhbmspKSsNCiAgZ2VvbV9ib3hqaXR0ZXIoY29sb3I9ImJsYWNrIiwNCiAgICAgICAgICAgICAgICAgaml0dGVyLmNvbG9yPSJkYXJrZ3JleSIsDQogICAgICAgICAgICAgICAgIGVycm9yYmFyLmRyYXc9VFJVRSkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1kb2xsYXIpKw0KICBsYWJzKHRpdGxlPSJBY2FkZW1pYyBTYWxhcnkgYnkgUmFuayIsDQogICAgICAgc3VidGl0bGU9IjktbW9udGggc2FsYXJ0eSBmb3IgMjAwOC0yMDA5IiwNCiAgICAgICB4PSIiLA0KICAgICAgIHk9IiIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KUGxvdCBLYXdhbmFuIExlYmFoDQpgYGB7cn0NCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShnZ2JlZXN3YXJtKQ0KZ2dwbG90KFNhbGFyaWVzLA0KICAgICAgIGFlcyh4PWZhY3RvcihyYW5rLA0KICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiQXNzaXN0YW50XG5Qcm9mZXNzb3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzb2NpYXRlXG5Qcm9mZXNzb3IiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRnVsbFxuUHJvZmVzc29yIikpLA0KICAgICAgICAgICB5PXNhbGFyeSwNCiAgICAgICAgICAgY29sb3I9cmFuaykpKw0KICBnZW9tX3F1YXNpcmFuZG9tKGFscGhhPTAuNywNCiAgICAgICAgICAgICAgICAgICBzaXplPTEuNSkrDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbD1kb2xsYXIpKw0KICBsYWJzKHRpdGxlPSJBY2FkZW1pYyBTYWxhcnkgYnkgUmFuayIsDQogICAgICAgc3VidGl0bGU9IjktbW9udGggc2FsYXJ0eSBmb3IgMjAwOC0yMDA5IiwNCiAgICAgICB4PSIiLA0KICAgICAgIHk9IiIpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikNCmBgYA0KRGlhZ3JhbSBUaXRpayBDbGV2ZWxhbmQNCmBgYHtyfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShnZ2JlZXN3YXJtKQ0KbGlicmFyeShnYXBtaW5kZXIpDQpkYXRhKGdhcG1pbmRlcixwYWNrYWdlPSJnYXBtaW5kZXIiKQ0KI1N1YnNldCBuZWdhcmEtbmVnYXJhIEFzaWFuIDIwMDcNCmxpYnJhcnkoZHBseXIpDQpwbG90ZGF0YTwtZ2FwbWluZGVyICU+JQ0KICBmaWx0ZXIoY29udGluZW50PT0iQXNpYSImDQogICAgICAgICAgIHllYXI9PTIwMDcpDQojUGxvdCBDbGV2ZWxhbmQNCmdncGxvdChwbG90ZGF0YSwNCiAgICAgICBhZXMoeD1saWZlRXhwLA0KICAgICAgICAgICB5PXJlb3JkZXIoY291bnRyeSxsaWZlRXhwKSkpKw0KICBnZW9tX3BvaW50KGNvbG9yPSJibHVlIiwNCiAgICAgICAgICAgICBzaXplPTIpKw0KICBnZW9tX3NlZ21lbnQoYWVzKHg9NDAsDQogICAgICAgICAgICAgICAgICAgeGVuZD1saWZlRXhwLA0KICAgICAgICAgICAgICAgICAgIHk9cmVvcmRlcihjb3VudHJ5LGxpZmVFeHApLA0KICAgICAgICAgICAgICAgICAgIHllbmQ9cmVvcmRlcihjb3VudHJ5LGxpZmVFeHApKSwNCiAgICAgICAgICAgICAgIGNvbG9yPSJhenVyZTMiKSsNCiAgbGFicyh4PSJMaWZlIEV4cGVjdGFuY3kgKHllYXJzKSIsDQogICAgICAgeT0iIiwNCiAgICAgICB0aXRsZT0iTGlmZSBFeHBlY3RhbmN5IGJ5IENvdW50cnkiLA0KICAgICAgIHN1YnRpdGxlPSJHYXBNaW5kZXIgZGF0YSBmb3IgQXNpYS0yMDA3IikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvcj1lbGVtZW50X2JsYW5rKCksDQogICAgICAgIHBhbmVsLmdyaWQubWlub3I9ZWxlbWVudF9ibGFuaygpKQ0KYGBgDQojIERhdGEgTXVsdGl2YXJpYXQNClBlbmdlbG9tcG9rYW4NCmBgYHtyfQ0KbGlicmFyeShjYXJEYXRhKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KZGF0YShTYWxhcmllcyxwYWNrYWdlPSJjYXJEYXRhIikNCmdncGxvdChTYWxhcmllcyxhZXMoeD15cnMuc2luY2UucGhkLA0KICAgICAgIHk9c2FsYXJ5LA0KICAgICAgIGNvbG9yPXJhbmspKSsNCiAgZ2VvbV9wb2ludCgpKw0KICB0aGVtZV9taW5pbWFsKCkrDQogIGxhYnModGl0bGU9IkFjYWRlbWljIHNhbGFyeSBieSByYW5rIGFuZCB5ZWFycyBzaW5jZSBkZWdyZWUiKQ0KYGBgDQpNZW5hbWJhaGthbiBKZW5pcyBLZWxhbWluDQpgYGB7cn0NCmxpYnJhcnkoY2FyRGF0YSkNCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChTYWxhcmllcyxhZXMoeD15cnMuc2luY2UucGhkLA0KICAgICAgIHk9c2FsYXJ5LA0KICAgICAgIGNvbG9yPXJhbmssDQogICAgICAgc2hhcGU9c2V4KSkrDQogIGdlb21fcG9pbnQoc2l6ZT0zLCBhbHBoYT0uNikrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0iQWNhZGVtaWMgc2FsYXJ5IGJ5IHJhbmsgYW5kIHllYXJzIHNpbmNlIGRlZ3JlZSIpDQpgYGANCk1lbWJlZGFrYW4gcHJpYSBkYW4gd2FuaXRhDQpgYGB7cn0NCmxpYnJhcnkoY2FyRGF0YSkNCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChTYWxhcmllcyxhZXMoeD15cnMuc2luY2UucGhkLA0KICAgICAgIHk9c2FsYXJ5LA0KICAgICAgIGNvbG9yPXJhbmssDQogICAgICAgc2l6ZT15cnMuc2VydmljZSkpKw0KICBnZW9tX3BvaW50KGFscGhhPS44KSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSJBY2FkZW1pYyBzYWxhcnkgYnkgcmFuayBhbmQgeWVhcnMgc2luY2UgZGVncmVlIikNCmBgYA0KTWVuYW1iYWhrYW4gZ2FyaXMga3VhZHJhdCB5YW5nIGN1a3VwDQpgYGB7cn0NCmxpYnJhcnkoY2FyRGF0YSkNCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChTYWxhcmllcyxhZXMoeD15cnMuc2luY2UucGhkLA0KICAgICAgIHk9IHNhbGFyeSwNCiAgICAgICBjb2xvcj1zZXgpKSsNCiAgZ2VvbV9wb2ludChhbHBoYT0uNCwNCiAgICAgICAgICAgICBzaXplPTMpKw0KICBnZW9tX3Ntb290aChzZT1GQUxTRSwNCiAgICAgICAgICAgICAgbWV0aG9kID0gImxtIiwNCiAgICAgICAgICAgICAgZm9ybXVsYT15fnBvbHkoeCwyKSwNCiAgICAgICAgICAgICAgc2l6ZT0xLjUpKw0KICBsYWJzKHg9IlllYXJzIFNpbmNlIFBoLkQiLA0KICAgICAgIHRpdGxlPSJBY2FkZW1pYyBzYWxhcnkgYnkgcmFuayBhbmQgeWVhcnMgc2luY2UgZGVncmVlIiwNCiAgICAgICBzdWJ0aXRsZSA9ICI5LW1vbnRoIHNhbGFyeSBmb3IgMjAwOC0yMDA5IiwNCiAgICAgICB5PSIiLA0KICAgICAgIGNvbG9yPSJTZXgiKSsNCiAgICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWw9c2NhbGVzOjpkb2xsYXIpKw0KICAgIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlPSJTZXQxIikrDQogICAgdGhlbWVfbWluaW1hbCgpDQpgYGANClBlbWJhZ2lhbiBGYXNldA0KYGBge3J9DQpsaWJyYXJ5KGNhckRhdGEpDQpsaWJyYXJ5KGdncGxvdDIpDQpnZ3Bsb3QoU2FsYXJpZXMsYWVzKHg9c2FsYXJ5KSkrDQogIGdlb21faGlzdG9ncmFtKGZpbGw9ImNvcm5mbG93ZXJibHVlIiwNCiAgICAgICAgICAgICAgICAgY29sb3I9IndoaXRlIikrDQogIGZhY2V0X3dyYXAofnJhbmssbmNvbD0xKSsNCiAgdGhlbWVfbWluaW1hbCgpKw0KICBsYWJzKHRpdGxlPSJTYWxhcnkgSGlzdG9ncmFtcyBieSBSYW5rIikNCmBgYA0KTWVuZXRhcGthbiBqZW5pcyBrZWxhbWluIGtlIGJhcmlzIGRhbiBqYWJhdGFuIGtlIGtvbG9tDQpgYGB7cn0NCmxpYnJhcnkoY2FyRGF0YSkNCmxpYnJhcnkoZ2dwbG90MikNCmdncGxvdChTYWxhcmllcyxhZXMoeD1zYWxhcnkvMTAwMDApKSsNCiAgZ2VvbV9oaXN0b2dyYW0oZmlsbD0iY29ybmZsb3dlcmJsdWUiLA0KICAgICAgICAgICAgICAgICBjb2xvcj0id2hpdGUiKSsNCiAgZmFjZXRfZ3JpZChzZXh+cmFuaykrDQogIHRoZW1lX21pbmltYWwoKSsNCiAgbGFicyh0aXRsZT0iU2FsYXJ5IEhpc3RvZ3JhbXMgYnkgUmFuayIpDQpgYGANCk1lbmdndW5ha2FuIHdhcm5hIHBhZGEgcGVtYmFnaWFuIGZhc2V0DQpgYGB7cn0NCmxpYnJhcnkoY2FyRGF0YSkNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZHBseXIpDQojTWVuZ2hpdHVuZyByYXRhLXJhdGEgZGFuIGtlc2FsYWhhbiBzdGFuZGFyIGJlcmRhc2Fya2FuDQojamVuaXMga2VsYW1pbiwgamFiYXRhbiBkYW4gZGlzaXBsaW4gaWxtdQ0KcGxvdGRhdGE8LVNhbGFyaWVzICU+JQ0KICBncm91cF9ieShzZXgscmFuayxkaXNjaXBsaW5lKSU+JQ0KICBkcGx5cjo6c3VtbWFyaXplKG49bigpLA0KICAgICAgICAgICAgICAgICAgIG1lYW49bWVhbihzYWxhcnkpLA0KICAgICAgICAgICAgICAgICAgIHNkPXNkKHNhbGFyeSksDQogICAgICAgICAgICAgICAgICAgc2U9c2Qvc3FydChuKSkNCiNNZW1idWF0IGxhYmVsIHlhbmcgbGViaWggYmFpayB1bnR1ayBkaXNpcGxpbiBpbG11DQpwbG90ZGF0YSRkaXNjaXBsaW5lPC1mYWN0b3IocGxvdGRhdGEkZGlzY2lwbGluZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHM9YygiVGhlb3JldGljYWwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcHBsaWVkIikpDQojTWVtYnVhdCBwbG90DQpnZ3Bsb3QocGxvdGRhdGEsDQogICAgICAgYWVzKHg9c2V4LA0KICAgICAgICAgICB5PW1lYW4sDQogICAgICAgICAgIGNvbG9yPXNleCkpKw0KICBnZW9tX3BvaW50KHNpemU9MykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49bWVhbi1zZSwNCiAgICAgICAgICAgICAgICAgICAgeW1heD1tZWFuK3NlKSwNCiAgICAgICAgICAgICAgICB3aWR0aD0uMSkrDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3M9c2VxKDcwMDAwLDE0MDAwMCwxMDAwMCksDQogICAgICAgICAgICAgICAgICAgICBsYWJlbD1zY2FsZXM6OmRvbGxhcikrDQogIGZhY2V0X2dyaWQoLn5yYW5rK2Rpc2NpcGxpbmUpKw0KICB0aGVtZV9idygpKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwNCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci55ID0gZWxlbWVudF9ibGFuaygpKSsNCiAgbGFicyh4PSIiLA0KICAgICAgIHk9IiIsDQogICAgICAgdGl0bGU9Ik5pbmUgbW9udGggYWNhZGVtaWMgc2FsYXJpZXMgYnkgZ2VuZGVyLCBkaXNjaXBsaW5lLCBhbmQgcmFuayIsDQogICAgICAgc3VidGl0bGUgPSAiKE1lYW5zIGFuZCBzdGFuZGFyZCBlcnJvcnMpIikrDQogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDEiKQ0KICANCmBgYA0KTWVtb2RpZmlrYXNpIHN1bWJ1IHggbWVtcGVya2VjaWwgdHVsaXNhbiBkYW4gbWVueWVkZXJoYW5ha2FuIHdhcm5hIGJhY2tncm91bmQNCmBgYHtyfQ0KbGlicmFyeShnYXBtaW5kZXIpDQpsaWJyYXJ5KGdncGxvdDIpDQpsaWJyYXJ5KGRwbHlyKQ0KI01lbXBsb3QgaGFyYXBhbiBoaWR1cCBiZXJkYXNhcmthbiB0YWh1biBzZWNhcmEgdGVycGlzYWgNCiNVbnR1ayBzZXRpYXAgbmVnYXJhIGRpIEFzaWENCmRhdGEoZ2FwbWluZGVyLHBhY2thZ2U9ImdhcG1pbmRlciIpDQojUGlsaWggZGF0YSBBc2lhDQpwbG90ZGF0YTwtZHBseXI6OmZpbHRlcihnYXBtaW5kZXIsDQogICAgICAgICAgICAgICAgICAgICAgICBjb250aW5lbnQ9PSJBc2lhIikNCiNNZW1wbG90IGhhcmFwYW4gaGlkdXAgYmVyZGFzYXJrYW4gdGFodW4sIHVudHVrIHNldGlhcCBuZWdhcmENCmdncGxvdChwbG90ZGF0YSwgYWVzKHg9eWVhcix5PWxpZmVFeHApKSsNCiAgZ2VvbV9saW5lKGNvbG9yPSJncmV5IikrDQogIGdlb21fcG9pbnQoY29sb3I9ImJsdWUiKSsNCiAgZmFjZXRfd3JhcCh+Y291bnRyeSkrDQogIHRoZW1lX21pbmltYWwoYmFzZV9zaXplPTkpKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoanVzdD0xKSkrDQogIGxhYnModGl0bGU9IkNoYW5nZSBpbiBMaWZlIEV4cGVjdGFuY3kiLA0KICAgICAgIHg9IlllYXIiLA0KICAgICAgIHk9IkxpZmUgRXhwZWN0YW5jeSIpDQpgYGANCg==