Call packages and define ggplot theme.
library(data.table);library(tidyverse);library(lubridate);library(viridis);library(ggthemes);library(patchwork)
my_theme<-function(){
theme_clean()+theme(plot.background = element_blank())+
theme(text=element_text(family="Palatino"),
legend.title = element_text(family="Palatino"),
legend.text = element_text(family="Palatino"),
legend.position = "right",
plot.title.position = "plot")
}
Deadlines timing
deadlines<-fread("deadlines.csv")
deadlines<-deadlines%>%
replace(.=="", NA)%>%
mutate(deadline=mdy(deadline),
applied=mdy(applied))
What percentage were in Nov?
nrow(subset(deadlines, !is.na(deadline) & deadline>="2021-11-01" & deadline<="2021-12-01"))/nrow(subset(deadlines, !is.na(deadline)))
[1] 0.6031746
Plot histogram of deadlines
deadlines%>%
ggplot()+
geom_histogram(aes(x=deadline), binwidth=1)+
scale_x_date(breaks = "month", date_labels="%b '%y", limits=c(as.Date("2021-07-30"), as.Date("2022-04-16")))+
labs(x="", y="", caption="Sample: all my job applications that specified a deadline")+
my_theme()+
ggtitle("Number of job application deadlines over time")
ggsave("plots/deadline-histogram.png", dpi=250, width=7, height=4)

Applications timing
What % were submitted in Nov?
nrow(subset(deadlines, !is.na(applied) & applied>="2021-11-01" & applied<="2021-12-01"))/nrow(subset(deadlines, !is.na(applied)))
[1] 0.7862069
Plot histogram of application submissions
deadlines%>%
ggplot()+
geom_histogram(aes(x=applied), binwidth=1)+
scale_x_date(breaks = "month", date_labels="%b '%y", limits=c(as.Date("2021-07-30"), as.Date("2022-04-16")))+
labs(x="", y="")+
my_theme()+
ggtitle("Number of job applications submitted over time")
ggsave("plots/apps-histogram.png", dpi=250, width=7, height=4)

Phases of the market
Compare the timing of: sending applications, doing 1st round interviews, doing flyouts, getting offers
dates<-fread("job-dates.csv")
dates<-dates%>%
replace(.=="", NA)%>%
mutate(date=mdy(date))
dates%>%ggplot()+
geom_density(aes(x=date, fill=type), adjust=3, size=.25)+
scale_fill_viridis_d(option="inferno", alpha=0.7, end = .9,
limits=c("applications", "1st rounds", "flyouts", "offers"), name="JM phase")+
scale_x_date(breaks = "month", date_labels="%b '%y")+
labs(x="", y="")+
my_theme()+
ggtitle("When was each phase of the job market?", subtitle="Density plot of each phase")
ggsave("plots/jm-phase-density.png", dpi=250, width=8, height=4.5)

An alternative way of seeing the timing: cumulative count for each phase
ggplot(dates, aes(x=date,color=type)) +
stat_bin(data=subset(dates, type=="applications"),aes(y=cumsum(..count..)),geom="step", binwidth = 5)+
stat_bin(data=subset(dates, type=="1st rounds"),aes(y=cumsum(..count..)),geom="step", binwidth = 5)+
stat_bin(data=subset(dates, type=="flyouts"),aes(y=cumsum(..count..)),geom="step", binwidth = 5)+
stat_bin(data=subset(dates, type=="offers"),aes(y=cumsum(..count..)),geom="step", binwidth = 5)+
scale_color_viridis_d(option="inferno", alpha=1, end = .9,
limits=c("applications", "1st rounds", "flyouts", "offers"), name="JM phase")+
scale_x_date(breaks = "month", date_labels="%b '%y")+
labs(x="", y="")+ggtitle("Cumulative counts of JM milestones")+
my_theme()
ggsave("plots/phase-step-counts.png", dpi=250, width=7, height=3.5)

Raster plot of job market
I need to take the raw spreadsheet and create a data frame that is 145 jobs x 170 dates with categorical information for each cell. Ie, what is the status of each job at each date? This can then be visualized as a raster plot.
#define dates for each of the 145 jobs i applied to
jpaths<-fread("job-paths.csv")
jpaths<-jpaths%>%
replace(.=="", NA)%>%
mutate(applied=mdy(applied),
invite1=mdy(invite1),
interview1done=mdy(interview1done),
flyoutinvite=mdy(flyoutinvite),
flyoutdone=mdy(flyoutdone),
offer=mdy(offer), accepted=mdy(accepted))%>%
mutate(jobn=row_number())%>%
arrange(applied)%>%mutate(appnum=row_number())
#make repeated set of dates
date<-seq(as.Date("2021-09-01"), as.Date("2022-02-17"), by="days")
df<-as.data.frame(date)
df<-df%>%slice(rep(row_number(), 145))%>%
mutate(row=row_number())%>%
mutate(jobn=ceiling(row/170))%>%select(-row)
# get the full 170 dates x 145 jobs df
df1<-inner_join(df, jpaths)
Joining, by = "jobn"
df1<-df1%>%
mutate(status=ifelse(date<applied, "have not applied yet", "applied"))%>%
mutate(status=ifelse(date>=invite1 & !is.na(invite1), "invited to 1st round interview", status))%>%
mutate(status=ifelse(date>=interview1done & !is.na(interview1done), "1st round interview done", status))%>%
mutate(status=ifelse(date>=flyoutinvite & !is.na(flyoutinvite), "invited to flyout", status))%>%
mutate(status=ifelse(date>=flyoutdone & !is.na(flyoutdone), "flyout done", status))%>%
mutate(status=ifelse(date>=offer & !is.na(offer), "offer made", status))%>%
mutate(status=ifelse(date>=accepted & !is.na(accepted), "offer accepted", status))
Make raster plot
df1%>%
ggplot(aes(x=date, y=appnum)) +
#ggplot(aes(x=date, y=reorder(jobn, applied))) +
geom_raster(aes(fill=factor(status)))+
scale_fill_viridis_d(option="inferno", alpha=1, end = .9,
limits=c("have not applied yet", "applied", "invited to 1st round interview",
"1st round interview done", "invited to flyout", "flyout done", "offer made", "offer accepted"), name="JM phase")+
my_theme()+
theme(axis.text.y=element_text(size=0))+
labs(x="", y="")+
scale_x_date(breaks = "month", date_labels="%b '%y")+
ggtitle('The Job Market')
ggsave("plots/raster-jm.png", dpi=250, width=9, height=5)

Make void raster plot (art-y one)
df1%>%
ggplot(aes(x=date, y=appnum)) +
#ggplot(aes(x=date, y=reorder(jobn, applied))) +
geom_raster(aes(fill=factor(status)))+
scale_fill_viridis_d(option="inferno", alpha=1, end = .9,
limits=c("have not applied yet", "applied", "invited to 1st round interview",
"1st round interview done", "invited to flyout", "flyout done", "offer made", "offer accepted"), name="JM phase")+
theme_void()+theme(legend.position = "none", plot.background = element_blank())+
theme(axis.text.y=element_text(size=0))+
labs(x="", y="")+
scale_x_date(breaks = "month", date_labels="%b '%y")
ggsave("plots/raster-jm-void1.png", dpi=500, width=5, height=5)

LS0tCnRpdGxlOiAiSm9iIE1hcmtldCBWaXN1YWxpemF0aW9ucyIKYXV0aG9yOiBBbGV4IEFsYnJpZ2h0CmRhdGU6ICIzLzIxLzIyIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpDYWxsIHBhY2thZ2VzIGFuZCBkZWZpbmUgZ2dwbG90IHRoZW1lLgoKYGBge3J9CmxpYnJhcnkoZGF0YS50YWJsZSk7bGlicmFyeSh0aWR5dmVyc2UpO2xpYnJhcnkobHVicmlkYXRlKTtsaWJyYXJ5KHZpcmlkaXMpO2xpYnJhcnkoZ2d0aGVtZXMpO2xpYnJhcnkocGF0Y2h3b3JrKQoKbXlfdGhlbWU8LWZ1bmN0aW9uKCl7CiAgdGhlbWVfY2xlYW4oKSt0aGVtZShwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCkpKwogICAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoZmFtaWx5PSJQYWxhdGlubyIpLAogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYW1pbHk9IlBhbGF0aW5vIiksCiAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoZmFtaWx5PSJQYWxhdGlubyIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIsCiAgICAgICAgcGxvdC50aXRsZS5wb3NpdGlvbiA9ICJwbG90IikKfQpgYGAKCiMgRGVhZGxpbmVzIHRpbWluZwoKYGBge3J9CmRlYWRsaW5lczwtZnJlYWQoImRlYWRsaW5lcy5jc3YiKQpkZWFkbGluZXM8LWRlYWRsaW5lcyU+JQogIHJlcGxhY2UoLj09IiIsIE5BKSU+JQogIG11dGF0ZShkZWFkbGluZT1tZHkoZGVhZGxpbmUpLAogICAgICAgICBhcHBsaWVkPW1keShhcHBsaWVkKSkKYGBgCgpXaGF0IHBlcmNlbnRhZ2Ugd2VyZSBpbiBOb3Y/CgpgYGB7cn0KbnJvdyhzdWJzZXQoZGVhZGxpbmVzLCAhaXMubmEoZGVhZGxpbmUpICYgZGVhZGxpbmU+PSIyMDIxLTExLTAxIiAmIGRlYWRsaW5lPD0iMjAyMS0xMi0wMSIpKS9ucm93KHN1YnNldChkZWFkbGluZXMsICFpcy5uYShkZWFkbGluZSkpKQpgYGAKClBsb3QgaGlzdG9ncmFtIG9mIGRlYWRsaW5lcwpgYGB7cn0KZGVhZGxpbmVzJT4lCiAgZ2dwbG90KCkrCiAgZ2VvbV9oaXN0b2dyYW0oYWVzKHg9ZGVhZGxpbmUpLCBiaW53aWR0aD0xKSsKICBzY2FsZV94X2RhdGUoYnJlYWtzID0gIm1vbnRoIiwgZGF0ZV9sYWJlbHM9IiViICcleSIsIGxpbWl0cz1jKGFzLkRhdGUoIjIwMjEtMDctMzAiKSwgYXMuRGF0ZSgiMjAyMi0wNC0xNiIpKSkrCiAgbGFicyh4PSIiLCB5PSIiLCBjYXB0aW9uPSJTYW1wbGU6IGFsbCBteSBqb2IgYXBwbGljYXRpb25zIHRoYXQgc3BlY2lmaWVkIGEgZGVhZGxpbmUiKSsKICBteV90aGVtZSgpKwogIGdndGl0bGUoIk51bWJlciBvZiBqb2IgYXBwbGljYXRpb24gZGVhZGxpbmVzIG92ZXIgdGltZSIpCmdnc2F2ZSgicGxvdHMvZGVhZGxpbmUtaGlzdG9ncmFtLnBuZyIsIGRwaT0yNTAsIHdpZHRoPTcsIGhlaWdodD00KQpgYGAKCiMgQXBwbGljYXRpb25zIHRpbWluZwoKV2hhdCAlIHdlcmUgc3VibWl0dGVkIGluIE5vdj8KYGBge3J9Cm5yb3coc3Vic2V0KGRlYWRsaW5lcywgIWlzLm5hKGFwcGxpZWQpICYgYXBwbGllZD49IjIwMjEtMTEtMDEiICYgYXBwbGllZDw9IjIwMjEtMTItMDEiKSkvbnJvdyhzdWJzZXQoZGVhZGxpbmVzLCAhaXMubmEoYXBwbGllZCkpKQpgYGAKClBsb3QgaGlzdG9ncmFtIG9mIGFwcGxpY2F0aW9uIHN1Ym1pc3Npb25zCmBgYHtyfQpkZWFkbGluZXMlPiUKICBnZ3Bsb3QoKSsKICBnZW9tX2hpc3RvZ3JhbShhZXMoeD1hcHBsaWVkKSwgYmlud2lkdGg9MSkrCiAgc2NhbGVfeF9kYXRlKGJyZWFrcyA9ICJtb250aCIsIGRhdGVfbGFiZWxzPSIlYiAnJXkiLCBsaW1pdHM9Yyhhcy5EYXRlKCIyMDIxLTA3LTMwIiksIGFzLkRhdGUoIjIwMjItMDQtMTYiKSkpKwogIGxhYnMoeD0iIiwgeT0iIikrCiAgbXlfdGhlbWUoKSsKICBnZ3RpdGxlKCJOdW1iZXIgb2Ygam9iIGFwcGxpY2F0aW9ucyBzdWJtaXR0ZWQgb3ZlciB0aW1lIikKZ2dzYXZlKCJwbG90cy9hcHBzLWhpc3RvZ3JhbS5wbmciLCBkcGk9MjUwLCB3aWR0aD03LCBoZWlnaHQ9NCkKYGBgCgojIFBoYXNlcyBvZiB0aGUgbWFya2V0CgpDb21wYXJlIHRoZSB0aW1pbmcgb2Y6IHNlbmRpbmcgYXBwbGljYXRpb25zLCBkb2luZyAxc3Qgcm91bmQgaW50ZXJ2aWV3cywgZG9pbmcgZmx5b3V0cywgZ2V0dGluZyBvZmZlcnMKCmBgYHtyfQpkYXRlczwtZnJlYWQoImpvYi1kYXRlcy5jc3YiKQpkYXRlczwtZGF0ZXMlPiUKICByZXBsYWNlKC49PSIiLCBOQSklPiUKICBtdXRhdGUoZGF0ZT1tZHkoZGF0ZSkpCgpkYXRlcyU+JWdncGxvdCgpKwogIGdlb21fZGVuc2l0eShhZXMoeD1kYXRlLCBmaWxsPXR5cGUpLCBhZGp1c3Q9Mywgc2l6ZT0uMjUpKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbj0iaW5mZXJubyIsIGFscGhhPTAuNywgZW5kID0gLjksCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRzPWMoImFwcGxpY2F0aW9ucyIsICIxc3Qgcm91bmRzIiwgImZseW91dHMiLCAib2ZmZXJzIiksIG5hbWU9IkpNIHBoYXNlIikrCiAgc2NhbGVfeF9kYXRlKGJyZWFrcyA9ICJtb250aCIsIGRhdGVfbGFiZWxzPSIlYiAnJXkiKSsKICBsYWJzKHg9IiIsIHk9IiIpKwogIG15X3RoZW1lKCkrCiAgZ2d0aXRsZSgiV2hlbiB3YXMgZWFjaCBwaGFzZSBvZiB0aGUgam9iIG1hcmtldD8iLCBzdWJ0aXRsZT0iRGVuc2l0eSBwbG90IG9mIGVhY2ggcGhhc2UiKQoKZ2dzYXZlKCJwbG90cy9qbS1waGFzZS1kZW5zaXR5LnBuZyIsIGRwaT0yNTAsIHdpZHRoPTgsIGhlaWdodD00LjUpCmBgYApBbiBhbHRlcm5hdGl2ZSB3YXkgb2Ygc2VlaW5nIHRoZSB0aW1pbmc6IGN1bXVsYXRpdmUgY291bnQgZm9yIGVhY2ggcGhhc2UKCmBgYHtyfQpnZ3Bsb3QoZGF0ZXMsIGFlcyh4PWRhdGUsY29sb3I9dHlwZSkpICsKICBzdGF0X2JpbihkYXRhPXN1YnNldChkYXRlcywgdHlwZT09ImFwcGxpY2F0aW9ucyIpLGFlcyh5PWN1bXN1bSguLmNvdW50Li4pKSxnZW9tPSJzdGVwIiwgYmlud2lkdGggPSA1KSsKICBzdGF0X2JpbihkYXRhPXN1YnNldChkYXRlcywgdHlwZT09IjFzdCByb3VuZHMiKSxhZXMoeT1jdW1zdW0oLi5jb3VudC4uKSksZ2VvbT0ic3RlcCIsICBiaW53aWR0aCA9IDUpKwogIHN0YXRfYmluKGRhdGE9c3Vic2V0KGRhdGVzLCB0eXBlPT0iZmx5b3V0cyIpLGFlcyh5PWN1bXN1bSguLmNvdW50Li4pKSxnZW9tPSJzdGVwIiwgIGJpbndpZHRoID0gNSkrCiAgc3RhdF9iaW4oZGF0YT1zdWJzZXQoZGF0ZXMsIHR5cGU9PSJvZmZlcnMiKSxhZXMoeT1jdW1zdW0oLi5jb3VudC4uKSksZ2VvbT0ic3RlcCIsICBiaW53aWR0aCA9IDUpKwogIHNjYWxlX2NvbG9yX3ZpcmlkaXNfZChvcHRpb249ImluZmVybm8iLCBhbHBoYT0xLCBlbmQgPSAuOSwKICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHM9YygiYXBwbGljYXRpb25zIiwgIjFzdCByb3VuZHMiLCAiZmx5b3V0cyIsICJvZmZlcnMiKSwgbmFtZT0iSk0gcGhhc2UiKSsKICBzY2FsZV94X2RhdGUoYnJlYWtzID0gIm1vbnRoIiwgZGF0ZV9sYWJlbHM9IiViICcleSIpKwogIGxhYnMoeD0iIiwgeT0iIikrZ2d0aXRsZSgiQ3VtdWxhdGl2ZSBjb3VudHMgb2YgSk0gbWlsZXN0b25lcyIpKwogIG15X3RoZW1lKCkKCmdnc2F2ZSgicGxvdHMvcGhhc2Utc3RlcC1jb3VudHMucG5nIiwgZHBpPTI1MCwgd2lkdGg9NywgaGVpZ2h0PTMuNSkKYGBgCgojIFJhc3RlciBwbG90IG9mIGpvYiBtYXJrZXQKCkkgbmVlZCB0byB0YWtlIHRoZSByYXcgc3ByZWFkc2hlZXQgYW5kIGNyZWF0ZSBhIGRhdGEgZnJhbWUgdGhhdCBpcyAxNDUgam9icyB4IDE3MCBkYXRlcyB3aXRoIGNhdGVnb3JpY2FsIGluZm9ybWF0aW9uIGZvciBlYWNoIGNlbGwuIEllLCB3aGF0IGlzIHRoZSBzdGF0dXMgb2YgZWFjaCBqb2IgYXQgZWFjaCBkYXRlPyBUaGlzIGNhbiB0aGVuIGJlIHZpc3VhbGl6ZWQgYXMgYSByYXN0ZXIgcGxvdC4KCmBgYHtyfQojZGVmaW5lIGRhdGVzIGZvciBlYWNoIG9mIHRoZSAxNDUgam9icyBpIGFwcGxpZWQgdG8KanBhdGhzPC1mcmVhZCgiam9iLXBhdGhzLmNzdiIpCmpwYXRoczwtanBhdGhzJT4lCiAgcmVwbGFjZSguPT0iIiwgTkEpJT4lCiAgbXV0YXRlKGFwcGxpZWQ9bWR5KGFwcGxpZWQpLAogICAgICAgIGludml0ZTE9bWR5KGludml0ZTEpLCAKICAgICAgICBpbnRlcnZpZXcxZG9uZT1tZHkoaW50ZXJ2aWV3MWRvbmUpLAogICAgICAgIGZseW91dGludml0ZT1tZHkoZmx5b3V0aW52aXRlKSwKICAgICAgICBmbHlvdXRkb25lPW1keShmbHlvdXRkb25lKSwKICAgICAgICBvZmZlcj1tZHkob2ZmZXIpLCBhY2NlcHRlZD1tZHkoYWNjZXB0ZWQpKSU+JQogIG11dGF0ZShqb2JuPXJvd19udW1iZXIoKSklPiUKICBhcnJhbmdlKGFwcGxpZWQpJT4lbXV0YXRlKGFwcG51bT1yb3dfbnVtYmVyKCkpCgojbWFrZSByZXBlYXRlZCBzZXQgb2YgZGF0ZXMKZGF0ZTwtc2VxKGFzLkRhdGUoIjIwMjEtMDktMDEiKSwgYXMuRGF0ZSgiMjAyMi0wMi0xNyIpLCBieT0iZGF5cyIpCmRmPC1hcy5kYXRhLmZyYW1lKGRhdGUpCgpkZjwtZGYlPiVzbGljZShyZXAocm93X251bWJlcigpLCAxNDUpKSU+JQogIG11dGF0ZShyb3c9cm93X251bWJlcigpKSU+JQogIG11dGF0ZShqb2JuPWNlaWxpbmcocm93LzE3MCkpJT4lc2VsZWN0KC1yb3cpCgojIGdldCB0aGUgZnVsbCAxNzAgZGF0ZXMgeCAxNDUgam9icyBkZgpkZjE8LWlubmVyX2pvaW4oZGYsIGpwYXRocykKCmRmMTwtZGYxJT4lCiAgbXV0YXRlKHN0YXR1cz1pZmVsc2UoZGF0ZTxhcHBsaWVkLCAiaGF2ZSBub3QgYXBwbGllZCB5ZXQiLCAiYXBwbGllZCIpKSU+JQogIG11dGF0ZShzdGF0dXM9aWZlbHNlKGRhdGU+PWludml0ZTEgJiAhaXMubmEoaW52aXRlMSksICJpbnZpdGVkIHRvIDFzdCByb3VuZCBpbnRlcnZpZXciLCBzdGF0dXMpKSU+JQogIG11dGF0ZShzdGF0dXM9aWZlbHNlKGRhdGU+PWludGVydmlldzFkb25lICYgIWlzLm5hKGludGVydmlldzFkb25lKSwgIjFzdCByb3VuZCBpbnRlcnZpZXcgZG9uZSIsIHN0YXR1cykpJT4lCiAgbXV0YXRlKHN0YXR1cz1pZmVsc2UoZGF0ZT49Zmx5b3V0aW52aXRlICYgIWlzLm5hKGZseW91dGludml0ZSksICJpbnZpdGVkIHRvIGZseW91dCIsIHN0YXR1cykpJT4lCiAgbXV0YXRlKHN0YXR1cz1pZmVsc2UoZGF0ZT49Zmx5b3V0ZG9uZSAmICFpcy5uYShmbHlvdXRkb25lKSwgImZseW91dCBkb25lIiwgc3RhdHVzKSklPiUKICBtdXRhdGUoc3RhdHVzPWlmZWxzZShkYXRlPj1vZmZlciAmICFpcy5uYShvZmZlciksICJvZmZlciBtYWRlIiwgc3RhdHVzKSklPiUKICBtdXRhdGUoc3RhdHVzPWlmZWxzZShkYXRlPj1hY2NlcHRlZCAmICFpcy5uYShhY2NlcHRlZCksICJvZmZlciBhY2NlcHRlZCIsIHN0YXR1cykpCmBgYAoKTWFrZSByYXN0ZXIgcGxvdAoKYGBge3J9CmRmMSU+JQogIGdncGxvdChhZXMoeD1kYXRlLCB5PWFwcG51bSkpICsKICAjZ2dwbG90KGFlcyh4PWRhdGUsIHk9cmVvcmRlcihqb2JuLCBhcHBsaWVkKSkpICsKICBnZW9tX3Jhc3RlcihhZXMoZmlsbD1mYWN0b3Ioc3RhdHVzKSkpKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbj0iaW5mZXJubyIsIGFscGhhPTEsIGVuZCA9IC45LAogIGxpbWl0cz1jKCJoYXZlIG5vdCBhcHBsaWVkIHlldCIsICJhcHBsaWVkIiwgImludml0ZWQgdG8gMXN0IHJvdW5kIGludGVydmlldyIsIAogICAgICAgICAgICIxc3Qgcm91bmQgaW50ZXJ2aWV3IGRvbmUiLCAiaW52aXRlZCB0byBmbHlvdXQiLCAiZmx5b3V0IGRvbmUiLCAib2ZmZXIgbWFkZSIsICJvZmZlciBhY2NlcHRlZCIpLCBuYW1lPSJKTSBwaGFzZSIpKwogIG15X3RoZW1lKCkrCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MCkpKwogIGxhYnMoeD0iIiwgeT0iIikrCiAgc2NhbGVfeF9kYXRlKGJyZWFrcyA9ICJtb250aCIsIGRhdGVfbGFiZWxzPSIlYiAnJXkiKSsKICBnZ3RpdGxlKCdUaGUgSm9iIE1hcmtldCcpCmdnc2F2ZSgicGxvdHMvcmFzdGVyLWptLnBuZyIsIGRwaT0yNTAsIHdpZHRoPTksIGhlaWdodD01KQpgYGAKCk1ha2Ugdm9pZCByYXN0ZXIgcGxvdCAoYXJ0LXkgb25lKQoKYGBge3J9CmRmMSU+JQogIGdncGxvdChhZXMoeD1kYXRlLCB5PWFwcG51bSkpICsKICAjZ2dwbG90KGFlcyh4PWRhdGUsIHk9cmVvcmRlcihqb2JuLCBhcHBsaWVkKSkpICsKICBnZW9tX3Jhc3RlcihhZXMoZmlsbD1mYWN0b3Ioc3RhdHVzKSkpKwogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbj0iaW5mZXJubyIsIGFscGhhPTEsIGVuZCA9IC45LAogIGxpbWl0cz1jKCJoYXZlIG5vdCBhcHBsaWVkIHlldCIsICJhcHBsaWVkIiwgImludml0ZWQgdG8gMXN0IHJvdW5kIGludGVydmlldyIsIAogICAgICAgICAgICIxc3Qgcm91bmQgaW50ZXJ2aWV3IGRvbmUiLCAiaW52aXRlZCB0byBmbHlvdXQiLCAiZmx5b3V0IGRvbmUiLCAib2ZmZXIgbWFkZSIsICJvZmZlciBhY2NlcHRlZCIpLCBuYW1lPSJKTSBwaGFzZSIpKwogIHRoZW1lX3ZvaWQoKSt0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIHBsb3QuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSkrCiAgdGhlbWUoYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9MCkpKwogIGxhYnMoeD0iIiwgeT0iIikrCiAgc2NhbGVfeF9kYXRlKGJyZWFrcyA9ICJtb250aCIsIGRhdGVfbGFiZWxzPSIlYiAnJXkiKQpnZ3NhdmUoInBsb3RzL3Jhc3Rlci1qbS12b2lkMS5wbmciLCBkcGk9NTAwLCB3aWR0aD01LCBoZWlnaHQ9NSkKYGBgCgo=