はじめに
まずは、謝るところから始めないといけません。テンプレートをそのまま、使うと、エラーが出てしまいます。問題なかったかたもおられると思いますが、それは、今回の授業の作業をしたプロジェイウトに続けて、作業をしたからだと思われます。スクリプトの中で、wdi_cache
をもう一度読み込むことを忘れていました。それが、どこに保存されているかも確認していなかったので、テンプレートには、最初の、setup
と書いてある、コードチャンクの次に、wdi_cache <- WDIcache()
をしておかないといけませんでした。それを追加した上で、コメントを書きます。
気づいて、しっかり読み込んでくださった方もおられました。申し訳ありません。
まだ、data
フォルダを作成していなければ、次のコード・チャンクを実行します。作成してあれば不要です。
dir.create("./data")
次も、もし、data
フォルダーに、wdi_cache.RData
が入っていれば実行する必要はありません。
wdi_cache <- WDIcache()
write_rds(wdi_cache, "./data/wdi_cache.RData")
おそらく、すでに、wdi_cache.RData
は、data
フォルダにあると思うのでこの下のコードだけで十分なはずです。
wdi_cache <- read_rds("./data/wdi_cache.RData")
本来は、皆さんが課題で取り組んでくださったことに対して、しっかりと応答を書くべきところですが、しばらく、時間が取れないので、皆さんが、調べてくださった、WDI
コードのリストだけ、書いておきたいと思います。ひょっとすると、漏れているものもあるかと思いますが、それは、お許しください。最初のリストは、コピー・ペーストをしたので、見落とした可能性は大です。しかし、他のクラスメートがどんな指標について調べたのかを知ることは、勉強になると思います。
実は、わたし自身、非常に感銘を受けました。流石に、中級マクロの受講生ですね。調べたい、インディケータをたくさん持っておられる。それを、わたしも確認したいということも、このリストを作った、目的です。
最初のリストを作ってから、やはり、WDI Name
と言われる名前や、概要などの情報も欲しいですよね。それをつけたものを、下で作成しています。今回は、そこまでとして、応答は、また時間があればとさせてください。
実は、テンプレートからコピーをするときに、最初の行が落ちているために、Preview
ができていなかった人。Notebook ではなく、R Markdown から、HTML
を作ったために、コードをみることができなかったもの。
また、OECD
などから、データを取ってきて調べてくださった方もおられましたが、そのサイトの
URL
が書いてなかったので、わたしは、探せなかったものなどもありました。
まあ、それも、練習ですし、今回が最初ですから、そのようなことが起こることは、織り込み済みですから、気にしないでください。少しずつ、質が上がると良いですね。最初の始めてみようには、R
Markdown の説明もビデオとともに付けてあります。
そのようなものも見てみると良いでしょう。
海蔵寺先生も言っておられましたが、基本は、
身近なデータを取ってきて図にする。一連の作業を文書化する。
だと、思っています。Posit Primers も最初は、Visualization
から始めています。わたしも、それがよいと思っています。そして、再現性
(Reproducibility)
と、コードチャンクで実行していることを、説明していく、Literate
Programming のためのものが、この RNotebook
です。再現性は、とても、大切です。自分のためにも。特に、データをどのように取得するかは、丁寧に、書いておいてください。WDI
の場合は、コードだけで十分ですが、本来は、取得した日にちも必要です。ただ、それは、上の、Date
のところに書いてあり、自動的に、更新されます。
少しずつ進んでいっていただけると嬉しいです。
みなさんが、選んでくださった、WDI コード
url_indicators <- "https://ds-sl.github.io/intro2r/data/indicators.csv"
df_indicators <- read_csv(url_indicators) %>% left_join(wdi_cache$series)
Rows: 89 Columns: 1── Column specification ───────────────────────────────────────────────────
Delimiter: ","
chr (1): indicator
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.Joining with `by = join_by(indicator)`
write_csv(df_indicators, "./data/indicators.csv")
df_indicators
下のコードを実行してもみることができます。
View(df_indicators)
この続きは、いずれ時間があればと、させてください。
課題 1 - Assignment
1
下に4種類、6個のテンプレートがあります。指標 indicator
と、略称 short_name
と、いくつかの国名
chosen_countries
を、入れ替えて、試してみてください。
コピー・ペーストしてもっと増やしても構いません。最低4種類、4個。テンプレートと同じものは不可。
<!- - indicator は、WDI コード、short_name は、WDI
コードの簡単な名前(英数のみスペースもない方がよい。underscore _
は可。chosen_country はデータに含まれる country 名。wdi_cache
でも確認可能) –>
テンプレート Templates
一つの国についての、一つの指標(WDI)と、その略称から、折線グラフ
Line Plot with one indicator with abbreviation and one country
chosen_indicator <- "SL.UEM.TOTL.NE.ZS"
short_name <- "unemployment"
chosen_country <- "United States"
WDI(country = "all", indicator = c(short_name = chosen_indicator), extra=TRUE, cache=wdi_cache) %>%
filter(country == chosen_country) %>%
ggplot(aes(year, short_name)) + geom_line() +
labs(title = paste("WDI ", chosen_indicator, ": ", short_name, " - ", chosen_country),
y = short_name)
いくつかの国についての、一つの指標(WDI)と、その略称から、折線グラフ
Line Plot with one indicator with abbreviation and several
countries
chosen_indicator <- "SL.UEM.TOTL.NE.ZS"
short_name <- "unemployment"
chosen_countries <- c("United States","United Kingdom", "Japan")
WDI(country = "all", indicator = c(short_name = chosen_indicator), extra=TRUE, cache=wdi_cache) %>% drop_na(short_name) %>%
filter(country %in% chosen_countries) %>%
ggplot(aes(year, short_name, col = country)) + geom_line() +
labs(title = paste("WDI ", chosen_indicator, ": ", short_name), y = short_name)
一つの国についての、二つの指標(WDI)と、その略称から、折線グラフ
Line Plot with two indicators with abbreviation and one country
chosen_indicator_1 <- "NY.GDP.DEFL.KD.ZG"
short_name_1 <- "gdp_deflator"
chosen_indicator_2 <- "CPTOTSAXNZGY"
short_name_2 <- "cpi_price"
chosen_country <- "United States"
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>%
filter(country == chosen_country) %>%
pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
ggplot(aes(year, value, col = class)) + geom_line() +
labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2, " - ", chosen_country)) +
scale_color_manual(labels = c(short_name_1, short_name_2), values = scales::hue_pal()(2))
chosen_indicator_1 <- "SL.TLF.CACT.MA.NE.ZS"
short_name_1 <- "male"
chosen_indicator_2 <- "SL.TLF.CACT.FE.NE.ZS"
short_name_2 <- "female"
chosen_country <- "United States"
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>%
filter(country == chosen_country) %>%
pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
ggplot(aes(year, value, col = class)) + geom_line() +
labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2, " - ", chosen_country)) +
scale_color_manual(labels = c(short_name_1, short_name_2), values = scales::hue_pal()(2))
いくつかの国についての、二つの指標(WDI)と、その略称から、折線グラフ
Line Plot with two indicators with abbreviation and several
countries
chosen_indicator_1 <- "NY.GDP.DEFL.KD.ZG"
short_name_1 <- "gdp_deflator"
chosen_indicator_2 <- "CPTOTSAXNZGY"
short_name_2 <- "cpi_price"
chosen_countries <- c("United States", "France", "Japan")
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>%
filter(country %in% chosen_countries) %>%
pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
ggplot(aes(year, value, linetype = class, col = country)) + geom_line() +
labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2)) +
scale_linetype_manual(labels = c(short_name_1, short_name_2), values = c("solid", "dashed"))
chosen_indicator_1 <- "SL.TLF.CACT.MA.NE.ZS"
short_name_1 <- "male"
chosen_indicator_2 <- "SL.TLF.CACT.FE.NE.ZS"
short_name_2 <- "female"
chosen_countries <- c("United States", "France", "Japan")
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>%
filter(country %in% chosen_countries) %>%
pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
ggplot(aes(year, value, linetype = class, col = country)) + geom_line() +
labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2)) +
scale_linetype_manual(labels = c(short_name_1, short_name_2), values = c("solid", "dashed"))
LS0tCnRpdGxlOiAiRUNPMjMyIFIg44Gn5aeL44KB44KL44OH44O844K/44K144Kk44Oz44Ko44K56Kqy6aGM77ya5b+c562UIgphdXRob3I6ICJIaXJvc2hpIFN1enVrae+8iOmItOacqOWvm++8iSIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcwotLS0KCiMg44Gv44GY44KB44Gr44CACgrjgb7jgZrjga/jgIHorJ3jgovjgajjgZPjgo3jgYvjgonlp4vjgoHjgarjgYTjgajjgYTjgZHjgb7jgZvjgpPjgILjg4bjg7Pjg5fjg6zjg7zjg4jjgpLjgZ3jga7jgb7jgb7jgIHkvb/jgYbjgajjgIHjgqjjg6njg7zjgYzlh7rjgabjgZfjgb7jgYTjgb7jgZnjgILllY/poYzjgarjgYvjgaPjgZ/jgYvjgZ/jgoLjgYrjgonjgozjgovjgajmgJ3jgYTjgb7jgZnjgYzjgIHjgZ3jgozjga/jgIHku4rlm57jga7mjojmpa3jga7kvZzmpa3jgpLjgZfjgZ/jg5fjg63jgrjjgqfjgqTjgqbjg4jjgavntprjgZHjgabjgIHkvZzmpa3jgpLjgZfjgZ/jgYvjgonjgaDjgajmgJ3jgo/jgozjgb7jgZnjgILjgrnjgq/jg6rjg5fjg4jjga7kuK3jgafjgIFgd2RpX2NhY2hlYCDjgpLjgoLjgYbkuIDluqboqq3jgb/ovrzjgoDjgZPjgajjgpLlv5jjgozjgabjgYTjgb7jgZfjgZ/jgILjgZ3jgozjgYzjgIHjganjgZPjgavkv53lrZjjgZXjgozjgabjgYTjgovjgYvjgoLnorroqo3jgZfjgabjgYTjgarjgYvjgaPjgZ/jga7jgafjgIHjg4bjg7Pjg5fjg6zjg7zjg4jjgavjga/jgIHmnIDliJ3jga7jgIFzZXR1cCDjgajmm7jjgYTjgabjgYLjgovjgIHjgrPjg7zjg4njg4Hjg6Pjg7Pjgq/jga7mrKHjgavjgIFgd2RpX2NhY2hlIDwtIFdESWNhY2hlKClgIOOCkuOBl+OBpuOBiuOBi+OBquOBhOOBqOOBhOOBkeOBvuOBm+OCk+OBp+OBl+OBn+OAguOBneOCjOOCkui/veWKoOOBl+OBn+S4iuOBp+OAgeOCs+ODoeODs+ODiOOCkuabuOOBjeOBvuOBmeOAggoK5rCX44Gl44GE44Gm44CB44GX44Gj44GL44KK6Kqt44G/6L6844KT44Gn44GP44Gg44GV44Gj44Gf5pa544KC44GK44KJ44KM44G+44GX44Gf44CC55Sz44GX6Kiz44GC44KK44G+44Gb44KT44CCCgo8IS0tIDEuIOOCv+OCpOODiOODq++8iHRpdGxl77yJ44KS5pu444GN5o+b44GI44KLIC0tPgo8IS0tIDIuIOWtpuexjeeVquWPt+OBqOOAgeWQjeWJjeOCkuiHquWIhuOBruOCguOBruOBq+abuOOBjeaPm+OBiOOCi+OAgiAtLT4KPCEtLSAzLuOAgOS4i+OBruOAgeOCs+ODvOODieODgeODo+ODs+OCryBzZXR1cCDjgpLlrp/ooYzjgZnjgovjgIIgLS0+CgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocmVhZHhsKQpsaWJyYXJ5KFdESSkKYGBgCgrjgb7jgaDjgIFgZGF0YWAg44OV44Kp44Or44OA44KS5L2c5oiQ44GX44Gm44GE44Gq44GR44KM44Gw44CB5qyh44Gu44Kz44O844OJ44O744OB44Oj44Oz44Kv44KS5a6f6KGM44GX44G+44GZ44CC5L2c5oiQ44GX44Gm44GC44KM44Gw5LiN6KaB44Gn44GZ44CCCgpgYGB7ciBldmFsPUZBTFNFfQpkaXIuY3JlYXRlKCIuL2RhdGEiKQpgYGAKCuasoeOCguOAgeOCguOBl+OAgWBkYXRhYCDjg5Xjgqnjg6vjg4Djg7zjgavjgIFgd2RpX2NhY2hlLlJEYXRhYCDjgYzlhaXjgaPjgabjgYTjgozjgbDlrp/ooYzjgZnjgovlv4XopoHjga/jgYLjgorjgb7jgZvjgpPjgIIKCmBgYHtyIGV2YWw9RkFMU0V9CndkaV9jYWNoZSA8LSBXREljYWNoZSgpCndyaXRlX3Jkcyh3ZGlfY2FjaGUsICIuL2RhdGEvd2RpX2NhY2hlLlJEYXRhIikKYGBgCgrjgYrjgZ3jgonjgY/jgIHjgZnjgafjgavjgIFgd2RpX2NhY2hlLlJEYXRhYCDjga/jgIFgZGF0YWAg44OV44Kp44Or44OA44Gr44GC44KL44Go5oCd44GG44Gu44Gn44GT44Gu5LiL44Gu44Kz44O844OJ44Gg44GR44Gn5Y2B5YiG44Gq44Gv44Ga44Gn44GZ44CCCgpgYGB7cn0Kd2RpX2NhY2hlIDwtIHJlYWRfcmRzKCIuL2RhdGEvd2RpX2NhY2hlLlJEYXRhIikKYGBgCgrmnKzmnaXjga/jgIHnmobjgZXjgpPjgYzoqrLpoYzjgaflj5bjgorntYTjgpPjgafjgY/jgaDjgZXjgaPjgZ/jgZPjgajjgavlr77jgZfjgabjgIHjgZfjgaPjgYvjgorjgajlv5znrZTjgpLmm7jjgY/jgbnjgY3jgajjgZPjgo3jgafjgZnjgYzjgIHjgZfjgbDjgonjgY/jgIHmmYLplpPjgYzlj5bjgozjgarjgYTjga7jgafjgIHnmobjgZXjgpPjgYzjgIHoqr/jgbnjgabjgY/jgaDjgZXjgaPjgZ/jgIFXREkg44Kz44O844OJ44Gu44Oq44K544OI44Gg44GR44CB5pu444GE44Gm44GK44GN44Gf44GE44Go5oCd44GE44G+44GZ44CC44Gy44KH44Gj44Go44GZ44KL44Go44CB5ryP44KM44Gm44GE44KL44KC44Gu44KC44GC44KL44GL44Go5oCd44GE44G+44GZ44GM44CB44Gd44KM44Gv44CB44GK6Kix44GX44GP44Gg44GV44GE44CC5pyA5Yid44Gu44Oq44K544OI44Gv44CB44Kz44OU44O844O744Oa44O844K544OI44KS44GX44Gf44Gu44Gn44CB6KaL6JC944Go44GX44Gf5Y+v6IO95oCn44Gv5aSn44Gn44GZ44CC44GX44GL44GX44CB5LuW44Gu44Kv44Op44K544Oh44O844OI44GM44Gp44KT44Gq5oyH5qiZ44Gr44Gk44GE44Gm6Kq/44G544Gf44Gu44GL44KS55+l44KL44GT44Go44Gv44CB5YuJ5by344Gr44Gq44KL44Go5oCd44GE44G+44GZ44CCCgrlrp/jga/jgIHjgo/jgZ/jgZfoh6rouqvjgIHpnZ7luLjjgavmhJ/pipjjgpLlj5fjgZHjgb7jgZfjgZ/jgILmtYHnn7PjgavjgIHkuK3ntJrjg57jgq/jg63jga7lj5forJvnlJ/jgafjgZnjga3jgILoqr/jgbnjgZ/jgYTjgIHjgqTjg7Pjg4fjgqPjgrHjg7zjgr/jgpLjgZ/jgY/jgZXjgpPmjIHjgaPjgabjgYrjgonjgozjgovjgILjgZ3jgozjgpLjgIHjgo/jgZ/jgZfjgoLnorroqo3jgZfjgZ/jgYTjgajjgYTjgYbjgZPjgajjgoLjgIHjgZPjga7jg6rjgrnjg4jjgpLkvZzjgaPjgZ/jgIHnm67nmoTjgafjgZnjgIIKCuacgOWIneOBruODquOCueODiOOCkuS9nOOBo+OBpuOBi+OCieOAgeOChOOBr+OCiuOAgVdESSBOYW1lIOOBqOiogOOCj+OCjOOCi+WQjeWJjeOChOOAgeamguimgeOBquOBqeOBruaDheWgseOCguassuOBl+OBhOOBp+OBmeOCiOOBreOAguOBneOCjOOCkuOBpOOBkeOBn+OCguOBruOCkuOAgeS4i+OBp+S9nOaIkOOBl+OBpuOBhOOBvuOBmeOAguS7iuWbnuOBr+OAgeOBneOBk+OBvuOBp+OBqOOBl+OBpuOAgeW/nOetlOOBr+OAgeOBvuOBn+aZgumWk+OBjOOBguOCjOOBsOOBqOOBleOBm+OBpuOBj+OBoOOBleOBhOOAggoK5a6f44Gv44CB44OG44Oz44OX44Os44O844OI44GL44KJ44Kz44OU44O844KS44GZ44KL44Go44GN44Gr44CB5pyA5Yid44Gu6KGM44GM6JC944Gh44Gm44GE44KL44Gf44KB44Gr44CBUHJldmlldyDjgYzjgafjgY3jgabjgYTjgarjgYvjgaPjgZ/kurrjgIJOb3RlYm9vayDjgafjga/jgarjgY/jgIFSIE1hcmtkb3duIOOBi+OCieOAgUhUTUwg44KS5L2c44Gj44Gf44Gf44KB44Gr44CB44Kz44O844OJ44KS44G/44KL44GT44Go44GM44Gn44GN44Gq44GL44Gj44Gf44KC44Gu44CCCgrjgb7jgZ/jgIFPRUNEIOOBquOBqeOBi+OCieOAgeODh+ODvOOCv+OCkuWPluOBo+OBpuOBjeOBpuiqv+OBueOBpuOBj+OBoOOBleOBo+OBn+aWueOCguOBiuOCieOCjOOBvuOBl+OBn+OBjOOAgeOBneOBruOCteOCpOODiOOBriBVUkwg44GM5pu444GE44Gm44Gq44GL44Gj44Gf44Gu44Gn44CB44KP44Gf44GX44Gv44CB5o6i44Gb44Gq44GL44Gj44Gf44KC44Gu44Gq44Gp44KC44GC44KK44G+44GX44Gf44CCCgrjgb7jgYLjgIHjgZ3jgozjgoLjgIHnt7Tnv5LjgafjgZnjgZfjgIHku4rlm57jgYzmnIDliJ3jgafjgZnjgYvjgonjgIHjgZ3jga7jgojjgYbjgarjgZPjgajjgYzotbfjgZPjgovjgZPjgajjga/jgIHnuZTjgorovrzjgb/muIjjgb/jgafjgZnjgYvjgonjgIHmsJfjgavjgZfjgarjgYTjgafjgY/jgaDjgZXjgYTjgILlsJHjgZfjgZrjgaTjgIHos6rjgYzkuIrjgYzjgovjgajoia/jgYTjgafjgZnjga3jgILmnIDliJ3jga7lp4vjgoHjgabjgb/jgojjgYbjgavjga/jgIFSIE1hcmtkb3duIOOBruiqrOaYjuOCguODk+ODh+OCquOBqOOBqOOCguOBq+S7mOOBkeOBpuOBguOCiuOBvuOBmeOAggoK44Gd44Gu44KI44GG44Gq44KC44Gu44KC6KaL44Gm44G/44KL44Go6Imv44GE44Gn44GX44KH44GG44CCCgrmtbfolLXlr7rlhYjnlJ/jgoLoqIDjgaPjgabjgYrjgonjgozjgb7jgZfjgZ/jgYzjgIHln7rmnKzjga/jgIEKCj4g6Lqr6L+R44Gq44OH44O844K/44KS5Y+W44Gj44Gm44GN44Gm5Zuz44Gr44GZ44KL44CC5LiA6YCj44Gu5L2c5qWt44KS5paH5pu45YyW44GZ44KL44CCCgrjgaDjgajjgIHmgJ3jgaPjgabjgYTjgb7jgZnjgIJQb3NpdCBQcmltZXJzIOOCguacgOWIneOBr+OAgVZpc3VhbGl6YXRpb24g44GL44KJ5aeL44KB44Gm44GE44G+44GZ44CC44KP44Gf44GX44KC44CB44Gd44KM44GM44KI44GE44Go5oCd44Gj44Gm44GE44G+44GZ44CC44Gd44GX44Gm44CB5YaN54++5oCnIChSZXByb2R1Y2liaWxpdHkpIOOBqOOAgeOCs+ODvOODieODgeODo+ODs+OCr+OBp+Wun+ihjOOBl+OBpuOBhOOCi+OBk+OBqOOCkuOAgeiqrOaYjuOBl+OBpuOBhOOBj+OAgUxpdGVyYXRlIFByb2dyYW1taW5nIOOBruOBn+OCgeOBruOCguOBruOBjOOAgeOBk+OBriBSTm90ZWJvb2sg44Gn44GZ44CC5YaN54++5oCn44Gv44CB44Go44Gm44KC44CB5aSn5YiH44Gn44GZ44CC6Ieq5YiG44Gu44Gf44KB44Gr44KC44CC54m544Gr44CB44OH44O844K/44KS44Gp44Gu44KI44GG44Gr5Y+W5b6X44GZ44KL44GL44Gv44CB5LiB5a+n44Gr44CB5pu444GE44Gm44GK44GE44Gm44GP44Gg44GV44GE44CCV0RJIOOBruWgtOWQiOOBr+OAgeOCs+ODvOODieOBoOOBkeOBp+WNgeWIhuOBp+OBmeOBjOOAgeacrOadpeOBr+OAgeWPluW+l+OBl+OBn+aXpeOBq+OBoeOCguW/heimgeOBp+OBmeOAguOBn+OBoOOAgeOBneOCjOOBr+OAgeS4iuOBruOAgURhdGUg44Gu44Go44GT44KN44Gr5pu444GE44Gm44GC44KK44CB6Ieq5YuV55qE44Gr44CB5pu05paw44GV44KM44G+44GZ44CCCgrlsJHjgZfjgZrjgaTpgLLjgpPjgafjgYTjgaPjgabjgYTjgZ/jgaDjgZHjgovjgajlrInjgZfjgYTjgafjgZnjgIIKCiMjIOOBv+OBquOBleOCk+OBjOOAgemBuOOCk+OBp+OBj+OBoOOBleOBo+OBn+OAgVdESSDjgrPjg7zjg4kKCmBgYHtyfQp1cmxfaW5kaWNhdG9ycyA8LSAiaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9kYXRhL2luZGljYXRvcnMuY3N2IgpkZl9pbmRpY2F0b3JzIDwtIHJlYWRfY3N2KHVybF9pbmRpY2F0b3JzKSAlPiUgbGVmdF9qb2luKHdkaV9jYWNoZSRzZXJpZXMpCndyaXRlX2NzdihkZl9pbmRpY2F0b3JzLCAiLi9kYXRhL2luZGljYXRvcnMuY3N2IikKZGZfaW5kaWNhdG9ycwpgYGAKCuS4i+OBruOCs+ODvOODieOCkuWun+ihjOOBl+OBpuOCguOBv+OCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAggoKYGBge3IgZXZhbD1GQUxTRX0KVmlldyhkZl9pbmRpY2F0b3JzKQpgYGAKCuOBk+OBrue2muOBjeOBr+OAgeOBhOOBmuOCjOaZgumWk+OBjOOBguOCjOOBsOOBqOOAgeOBleOBm+OBpuOBj+OBoOOBleOBhOOAggoKIyDoqrLpoYwgMSAt44CAQXNzaWdubWVudCAxCgrkuIvjgavvvJTnqK7poZ7jgIHvvJblgIvjga7jg4bjg7Pjg5fjg6zjg7zjg4jjgYzjgYLjgorjgb7jgZnjgILmjIfmqJkgYGluZGljYXRvcmAg44Go44CB55Wl56ewIGBzaG9ydF9uYW1lYCDjgajjgIHjgYTjgY/jgaTjgYvjga7lm73lkI0gYGNob3Nlbl9jb3VudHJpZXNgIOOCkuOAgeWFpeOCjOabv+OBiOOBpuOAgeippuOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAggrjgrPjg5Tjg7zjg7vjg5rjg7zjgrnjg4jjgZfjgabjgoLjgaPjgajlopfjgoTjgZfjgabjgoLmp4vjgYTjgb7jgZvjgpPjgILmnIDkvY7vvJTnqK7poZ7jgIHvvJTlgIvjgILjg4bjg7Pjg5fjg6zjg7zjg4jjgajlkIzjgZjjgoLjga7jga/kuI3lj6/jgIIKCjwhLS0gMS4g6Kq/44G544Gm44G/44Gf44GEIFdESSDjga7mjIfmqJnjgpLjgYTjgY/jgaTjgYvmjqLjgZfjgabjgIHjg6rjgrnjg4jjgZnjgovjgIIgLS0+CjwhLS0gMi4g5LiL44Gu44OG44Oz44OX44Os44O844OI44Gu44CAaW5kaWNhdG9yLCBzaG9ydF9uYW1lLCBjaG9zZW5fY291bnRyeSDjgarjganjgpLoqr/jgbnjgZ/jgYTjgoLjga7jgavlpInmm7TjgZfjgIHlrp/ooYzjgZnjgovjgIIgLS0+CjwhLSAtIGluZGljYXRvciDjga/jgIFXREkg44Kz44O844OJ44CBc2hvcnRfbmFtZSDjga/jgIFXREkg44Kz44O844OJ44Gu57Ch5Y2Y44Gq5ZCN5YmN77yI6Iux5pWw44Gu44G/44K544Oa44O844K544KC44Gq44GE5pa544GM44KI44GE44CCdW5kZXJzY29yZSBfIOOBr+WPr+OAgmNob3Nlbl9jb3VudHJ5IOOBr+ODh+ODvOOCv+OBq+WQq+OBvuOCjOOCiyBjb3VudHJ5IOWQjeOAgndkaV9jYWNoZSDjgafjgoLnorroqo3lj6/og73vvIkgLS0+CgoKIyMg44OG44Oz44OX44Os44O844OIIFRlbXBsYXRlcyB7LX0KCiMjIOS4gOOBpOOBruWbveOBq+OBpOOBhOOBpuOBruOAgeS4gOOBpOOBruaMh+aome+8iFdESe+8ieOBqOOAgeOBneOBrueVpeensOOBi+OCieOAgeaKmOe3muOCsOODqeODlQoKTGluZSBQbG90IHdpdGggb25lIGluZGljYXRvciB3aXRoIGFiYnJldmlhdGlvbiBhbmQgb25lIGNvdW50cnkKCmBgYHtyIGNhY2hlPVRSVUV9CmNob3Nlbl9pbmRpY2F0b3IgPC0gIlNMLlVFTS5UT1RMLk5FLlpTIgpzaG9ydF9uYW1lIDwtICJ1bmVtcGxveW1lbnQiCmNob3Nlbl9jb3VudHJ5IDwtICJVbml0ZWQgU3RhdGVzIgpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKHNob3J0X25hbWUgPSBjaG9zZW5faW5kaWNhdG9yKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUKICBmaWx0ZXIoY291bnRyeSA9PSBjaG9zZW5fY291bnRyeSkgJT4lIAogIGdncGxvdChhZXMoeWVhciwgc2hvcnRfbmFtZSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiV0RJICIsIGNob3Nlbl9pbmRpY2F0b3IsICI6ICIsIHNob3J0X25hbWUsICIgLSAiLCBjaG9zZW5fY291bnRyeSksCiAgICAgICB5ID0gc2hvcnRfbmFtZSkKYGBgCgoKIyMg44GE44GP44Gk44GL44Gu5Zu944Gr44Gk44GE44Gm44Gu44CB5LiA44Gk44Gu5oyH5qiZ77yIV0RJ77yJ44Go44CB44Gd44Gu55Wl56ew44GL44KJ44CB5oqY57ea44Kw44Op44OVCgpMaW5lIFBsb3Qgd2l0aCBvbmUgaW5kaWNhdG9yIHdpdGggYWJicmV2aWF0aW9uIGFuZCBzZXZlcmFsIGNvdW50cmllcwoKYGBge3IgY2FjaGU9VFJVRX0KY2hvc2VuX2luZGljYXRvciA8LSAiU0wuVUVNLlRPVEwuTkUuWlMiCnNob3J0X25hbWUgPC0gInVuZW1wbG95bWVudCIKY2hvc2VuX2NvdW50cmllcyA8LSBjKCJVbml0ZWQgU3RhdGVzIiwiVW5pdGVkIEtpbmdkb20iLCAiSmFwYW4iKQpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKHNob3J0X25hbWUgPSBjaG9zZW5faW5kaWNhdG9yKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUgZHJvcF9uYShzaG9ydF9uYW1lKSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjaG9zZW5fY291bnRyaWVzKSAlPiUgCiAgZ2dwbG90KGFlcyh5ZWFyLCBzaG9ydF9uYW1lLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgIiwgY2hvc2VuX2luZGljYXRvciwgIjogIiwgc2hvcnRfbmFtZSksIHkgPSBzaG9ydF9uYW1lKQpgYGAKCgojIyDkuIDjgaTjga7lm73jgavjgaTjgYTjgabjga7jgIHkuozjgaTjga7mjIfmqJnvvIhXREnvvInjgajjgIHjgZ3jga7nlaXnp7DjgYvjgonjgIHmipjnt5rjgrDjg6njg5UKCkxpbmUgUGxvdCB3aXRoIHR3byBpbmRpY2F0b3JzIHdpdGggYWJicmV2aWF0aW9uIGFuZCBvbmUgY291bnRyeQoKYGBge3IgY2FjaGU9VFJVRX0KY2hvc2VuX2luZGljYXRvcl8xIDwtICJOWS5HRFAuREVGTC5LRC5aRyIKc2hvcnRfbmFtZV8xIDwtICJnZHBfZGVmbGF0b3IiCmNob3Nlbl9pbmRpY2F0b3JfMiA8LSAiQ1BUT1RTQVhOWkdZIgpzaG9ydF9uYW1lXzIgPC0gImNwaV9wcmljZSIKY2hvc2VuX2NvdW50cnkgPC0gIlVuaXRlZCBTdGF0ZXMiCldESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoc2hvcnRfbmFtZV8xID0gY2hvc2VuX2luZGljYXRvcl8xLCBzaG9ydF9uYW1lXzIgPSBjaG9zZW5faW5kaWNhdG9yXzIpLCBleHRyYT1UUlVFLCBjYWNoZT13ZGlfY2FjaGUpICU+JSAKICBmaWx0ZXIoY291bnRyeSA9PSBjaG9zZW5fY291bnRyeSkgJT4lIAogIHBpdm90X2xvbmdlcihjKHNob3J0X25hbWVfMSwgc2hvcnRfbmFtZV8yKSwgbmFtZXNfdG8gPSAiY2xhc3MiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUgZHJvcF9uYSh2YWx1ZSkgJT4lCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY2xhc3MpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yXzEsICI6ICIsIHNob3J0X25hbWVfMSwgIlxuIiwgY2hvc2VuX2luZGljYXRvcl8yLCAiOiAiLCBzaG9ydF9uYW1lXzIsICIgLSAiLCBjaG9zZW5fY291bnRyeSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYyhzaG9ydF9uYW1lXzEsIHNob3J0X25hbWVfMiksIHZhbHVlcyA9IHNjYWxlczo6aHVlX3BhbCgpKDIpKQpgYGAKCmBgYHtyIGNhY2hlPVRSVUV9CmNob3Nlbl9pbmRpY2F0b3JfMSA8LSAiU0wuVExGLkNBQ1QuTUEuTkUuWlMiCnNob3J0X25hbWVfMSA8LSAibWFsZSIKY2hvc2VuX2luZGljYXRvcl8yIDwtICJTTC5UTEYuQ0FDVC5GRS5ORS5aUyIKc2hvcnRfbmFtZV8yIDwtICJmZW1hbGUiCmNob3Nlbl9jb3VudHJ5IDwtICJVbml0ZWQgU3RhdGVzIgpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKHNob3J0X25hbWVfMSA9IGNob3Nlbl9pbmRpY2F0b3JfMSwgc2hvcnRfbmFtZV8yID0gY2hvc2VuX2luZGljYXRvcl8yKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgPT0gY2hvc2VuX2NvdW50cnkpICU+JSAKICBwaXZvdF9sb25nZXIoYyhzaG9ydF9uYW1lXzEsIHNob3J0X25hbWVfMiksIG5hbWVzX3RvID0gImNsYXNzIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIGRyb3BfbmEodmFsdWUpICU+JQogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGNsYXNzKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgIiwgY2hvc2VuX2luZGljYXRvcl8xLCAiOiAiLCBzaG9ydF9uYW1lXzEsICJcbiIsIGNob3Nlbl9pbmRpY2F0b3JfMiwgIjogIiwgc2hvcnRfbmFtZV8yLCAiIC0gIiwgY2hvc2VuX2NvdW50cnkpKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKGxhYmVscyA9IGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCB2YWx1ZXMgPSBzY2FsZXM6Omh1ZV9wYWwoKSgyKSkKYGBgCgojIyDjgYTjgY/jgaTjgYvjga7lm73jgavjgaTjgYTjgabjga7jgIHkuozjgaTjga7mjIfmqJnvvIhXREnvvInjgajjgIHjgZ3jga7nlaXnp7DjgYvjgonjgIHmipjnt5rjgrDjg6njg5UKCkxpbmUgUGxvdCB3aXRoIHR3byBpbmRpY2F0b3JzIHdpdGggYWJicmV2aWF0aW9uIGFuZCBzZXZlcmFsIGNvdW50cmllcwoKYGBge3IgY2FjaGU9VFJVRX0KY2hvc2VuX2luZGljYXRvcl8xIDwtICJOWS5HRFAuREVGTC5LRC5aRyIKc2hvcnRfbmFtZV8xIDwtICJnZHBfZGVmbGF0b3IiCmNob3Nlbl9pbmRpY2F0b3JfMiA8LSAiQ1BUT1RTQVhOWkdZIgpzaG9ydF9uYW1lXzIgPC0gImNwaV9wcmljZSIKY2hvc2VuX2NvdW50cmllcyA8LSBjKCJVbml0ZWQgU3RhdGVzIiwgIkZyYW5jZSIsICJKYXBhbiIpCldESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoc2hvcnRfbmFtZV8xID0gY2hvc2VuX2luZGljYXRvcl8xLCBzaG9ydF9uYW1lXzIgPSBjaG9zZW5faW5kaWNhdG9yXzIpLCBleHRyYT1UUlVFLCBjYWNoZT13ZGlfY2FjaGUpICU+JSAKICBmaWx0ZXIoY291bnRyeSAlaW4lIGNob3Nlbl9jb3VudHJpZXMpICU+JSAKICBwaXZvdF9sb25nZXIoYyhzaG9ydF9uYW1lXzEsIHNob3J0X25hbWVfMiksIG5hbWVzX3RvID0gImNsYXNzIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIGRyb3BfbmEodmFsdWUpICU+JQogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGxpbmV0eXBlID0gY2xhc3MsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yXzEsICI6ICIsIHNob3J0X25hbWVfMSwgIlxuIiwgY2hvc2VuX2luZGljYXRvcl8yLCAiOiAiLCBzaG9ydF9uYW1lXzIpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKGxhYmVscyA9IGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCB2YWx1ZXMgPSBjKCJzb2xpZCIsICJkYXNoZWQiKSkKYGBgCgoKYGBge3IgY2FjaGU9VFJVRX0KY2hvc2VuX2luZGljYXRvcl8xIDwtICJTTC5UTEYuQ0FDVC5NQS5ORS5aUyIKc2hvcnRfbmFtZV8xIDwtICJtYWxlIgpjaG9zZW5faW5kaWNhdG9yXzIgPC0gIlNMLlRMRi5DQUNULkZFLk5FLlpTIgpzaG9ydF9uYW1lXzIgPC0gImZlbWFsZSIKY2hvc2VuX2NvdW50cmllcyA8LSBjKCJVbml0ZWQgU3RhdGVzIiwgIkZyYW5jZSIsICJKYXBhbiIpCldESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoc2hvcnRfbmFtZV8xID0gY2hvc2VuX2luZGljYXRvcl8xLCBzaG9ydF9uYW1lXzIgPSBjaG9zZW5faW5kaWNhdG9yXzIpLCBleHRyYT1UUlVFLCBjYWNoZT13ZGlfY2FjaGUpICU+JSAKICBmaWx0ZXIoY291bnRyeSAlaW4lIGNob3Nlbl9jb3VudHJpZXMpICU+JSAKICBwaXZvdF9sb25nZXIoYyhzaG9ydF9uYW1lXzEsIHNob3J0X25hbWVfMiksIG5hbWVzX3RvID0gImNsYXNzIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lIGRyb3BfbmEodmFsdWUpICU+JQogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGxpbmV0eXBlID0gY2xhc3MsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yXzEsICI6ICIsIHNob3J0X25hbWVfMSwgIlxuIiwgY2hvc2VuX2luZGljYXRvcl8yLCAiOiAiLCBzaG9ydF9uYW1lXzIpKSArCiAgc2NhbGVfbGluZXR5cGVfbWFudWFsKGxhYmVscyA9IGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCB2YWx1ZXMgPSBjKCJzb2xpZCIsICJkYXNoZWQiKSkKYGBgCgoKIyDoqrLpoYwgMiAtIEFzc2lnbm1lbnQgMgoK5o6i57Si55qE44OH44O844K/6Kej5p6Q44KS57WM6aiT44GX44Gm44G/44KI44GG44CCCgoxLiDoiIjlkbPjga7jgYLjgovjg4fjg7zjgr/vvIjjgb7jgZ/jga/plqLpgKPjgZnjgovjgYTjgY/jgaTjgYvjga7jg4fjg7zjgr/vvInjgpLopovjgaTjgZHjgovjgIIKICAtIFvph43opoFdIOOBquOBnOOAgeOBneOBruODh+ODvOOCv+OBq+iIiOWRs+OCkuaMgeOBo+OBn+OBi+OAggogIC0gV0RJIOOChOOAgU9FQ0Qg44KE44CBVU4gRGF0YeOAggogIC0g6Kqy6aGMMSDjgajlkIzjgZjjgoLjga7jgafjgoLmp4vjgYTjgb7jgZvjgpPjgILjgZfjgYvjgZfjgIHpgbjjgpPjgaDnkIbnlLHjgpLmm7jjgY/jgZPjgajjgIIKMi4g44OH44O844K/44KS6Kqt44G/6L6844KA44CCCjMuIFvph43opoFdIOODh+ODvOOCv+OBq+mWouOBmeOCi+WVj+OBhOOAggo0LiBb6YeN6KaBXSDlj6/og73jgarnr4Tlm7LjgafjgIHjg4fjg7zjgr/jga7lj6/oppbljJbjgpLjgZfjgabjgIHlvpfjgonjgozjgZ/jgZPjgajjgIIKNS4g6Zuj44GX44GL44Gj44Gf44GT44Go44CB44Gn44GN44Gq44GL44Gj44Gf44GT44Go44CCCgoKCgoK6Kqy6aGMIDEg44Go44CA6Kqy6aGMIDIg44KS44CB6Kqy6aGMIOODhuODs+ODl+ODrOODvOODiOOCkueUqOOBhOOBpuOAgeabuOOBjeOAgUlELm5iLmh0bWwg44OV44Kh44Kk44OrIOOCkuOAgTLmnIgyNOaXpe+8iOWcn++8iea3seWknOOBvuOBp+OBqyBNb29kbGUg5LiK44Gr5o+Q5Ye644CCCg==