右上の Code
マークから、ソースファイルもダウンロードすることができます。
Posit (RStudio) Cloud での実習
RNotebook
ファイルを新規作成し、このページを、全選択して、コピー・ペーストします。(rmarkdown
のインストールが必要です) Save As …
または、フロッピーディスクマークをおして、ds-edu などとして保存。
説明を読みながら、コードチャンクと言われる、色が変わっている、の右上にある三角印を押すと、実行されます。
このあとで、RNotebook についても、少し説明します。
準備:Posit Cloud
ログイン
Posit Cloud (https://posit.cloud/)
のアカウントを作成して、ログインした状態から始めます。
無論 RStudio で R を利用できる方は、ほとんど同じですが、Posit Cloud
には、ファイルや、データも入っていますので、そのまま活用することが可能です。
RStudio
での、動作不良の場合の対応は省略させていただきます。できれば、上のメニューの
File から、New Project を選択して、Project
を作って、そこで作業をされることをお勧めします。
問題がある時は、下のサイトを参照してください。Posit Cloud
についても、多少の説明が書いてあります。
https://icu-hsuzuki.github.io/ds4aj/ronrstudio.html
右上の New Project を選択して、始めることが普通ですが、本日は、
このリンクにアクセスしていただき、Save a Permanent Copy
を選択してくださると、そのなかで、自分のプロジェクトとして、実行することが可能になります。
https://posit.cloud/content/5539763
はじめに
基本コマンド - in
Console
下のコマンドを左下の窓枠(Pane)に入れてみてください。
head(cars)
str(cars)
summary(cars)
df <- cars
<-
と _
と %>%
と `
back tick のキーボード上での位置の確認
head(df)
plot(df)
View(cars)
または、右上の Environment
から、df_cars
をクリック
?cars
または Help 検索窓で cars
,
head
など
実際の出力
'data.frame': 50 obs. of 2 variables:
$ speed: num 4 4 7 7 8 9 10 10 10 11 ...
$ dist : num 2 10 4 22 16 10 18 26 34 17 ...
speed dist
Min. : 4.0 Min. : 2.00
1st Qu.:12.0 1st Qu.: 26.00
Median :15.0 Median : 36.00
Mean :15.4 Mean : 42.98
3rd Qu.:19.0 3rd Qu.: 56.00
Max. :25.0 Max. :120.00
おすすめ:Sys.setenv(LANG = "en")
システム言語を英語に設定すると、不明のエラーメッセージがでたときにも、検査で解決できることが多い。
Package
の確認とインストール
Rパッケージは、Rの拡張機能で、コード、データ、ドキュメントを標準化されたコレクション形式で含んでおり、標準的なものは、R
Studio の Top Bar の Tool > Install Packages
からインストールできます。
- 次の三つをインストールします:
tidyverse
,
rmarkdown
, WDI
- Tools から Install packages を選び、一つ一つ入れていくと、install
できます。少し時間がかかります。
備考
R
は、多くの方が、パッケージを開発して、それぞれの分野で、使いやすくしていった統計解析のためのコンピュータ言語です。ただ、基本をのぞいて、それぞれの好みにあわせて、開発された面もあり、統一性にはかける言語です。あとで説明する、探索的データ分析(Exploratory
Data
Analysis)のために必要な基本的なものを、整合性のある形で、再構築したものが、tidyverse
パッケージで、中心となった、H. Wickham は、RStudio(現在の Posit) に加わりました。そのメンバーの、Y.
Xie(谢益辉) たちが開発したものが、rmarkdown
に関連したパッケージです。
R Markdown 入門
R Notebook
R Markdownはデータサイエンスのためのオーサリングフレームワーク。
コード(プログラム)とその実行結果、を記録・表示し、高品質のレポートの作成を可能にします。
R Notebook は、独立してインタラクティブに実行できるチャンクを持つR
Markdownドキュメントの一つの形式で、入力のすぐ下に出力が表示することができます。
- File > New File > R Notebook
- Save with a file name, say, test-notebook
- Preview by [Preview] button
- Run Code Chunk plot(cars) and then Preview again.
下のリンクを開き、全部を選択し、R Notebook
ファイルも全選択して貼り付ければ、日本版も見ることができます。
intro2rj.Rmd
右下の File タブから、intro2rj.Rmd
を開きます。 Preview
の右のギアマークの Preview in Viewer Pane を選択してから、Preview
バタンを押すと、内容を確認することができます。
あとから使うので、ロードしておきます。最初に次のようなコードを実行します。右の三角を押します。
Posit Cloud のサイトには、data
ディレクトリ(フォルダ)が作成されていますが、
参考
データーサインスをはじめましょう
の中のR
Markdown に、“Reproducible and Literate Programming” (Reproducible
(再現可能)かつ、Literate な(理解できるように記述した)Program(プログラム・コード)を共有すること)をたいせつにする
RMarkdown の重要性について簡単に書いてあります。
R Notebook
での実習
準備 Setup
データディレクトリを作成しておきます。今後、データは、このディレクトリに保存します。すでに、存在する場合は、その旨メッセージが出ますが、中身が消去されることはありません。
パッケージはインストールしてあっても、利用するときには、次のように使える状態に(ロード)します。
一つ目は、tidyverse
ですが、もう一つは、あとから活用する、世界開発指標に関するデータを利用するためのパッケージです。
── Attaching core tidyverse packages ────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.2 ✔ readr 2.1.4
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.4.2 ✔ tibble 3.2.1
✔ lubridate 1.9.2 ✔ tidyr 1.3.0
✔ purrr 1.0.1 ── Conflicts ──────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
世界開発指標
(WDI)
例から始めます。
次のコードは、国別に、GDP の大きい方から並べたものです。
WDI(country = "all", indicator = c(gdp = "NY.GDP.MKTP.CD"),
extra=TRUE) %>% drop_na(gdp) %>%
filter(year==max(year), income !="Aggregates") %>%
drop_na(region) %>% arrange(desc(gdp))
3兆ドルを超えている6つの国についての過去の推移をグラフにしたものです。
WDI(country = c("CN","GB","JP","IN","US","DE"), indicator = c(gdp = "NY.GDP.MKTP.CD"), extra=TRUE) %>% drop_na(gdp) %>%
ggplot(aes(year, gdp, col = country)) + geom_line() +
labs(title = "WDI NY.GDP.MKTP.CD: gdp")
WDI(country = c("CN","IN","JP","US"),
indicator = c(gdp_growth_rate = "NY.GDP.MKTP.KD.ZG"), extra=TRUE) %>%
drop_na(gdp_growth_rate) %>%
ggplot(aes(year, gdp_growth_rate, col = country)) + geom_line() +
labs(title = paste("WDI NY.GDP.MKTP.KD.ZG: gdp growth rate"))
注意
一つ一つのコードを丁寧に説明し、理解することは、後回しにし、少しずつ学んでいくことにし、ここでは、それぞれの問題意識のもとで、どのようなことができるかを、理解するため、活用することを優先したいと思います。
上で使った指標
(WDI) コード
- NY.GDP.MKTP.CD: GDP (current US$)
- NY.GDP.MKTP.KD.ZG: GDP growth (annual %)
世界開発指標 (WDI)
を探してみましょう
WDIは、世界の開発状況と、貧困との戦いに関する、適切で上質、かつ、国際的に比較可能な時系列の統計データを編纂したものです。このデータベースは、217の経済と40以上の国グループについて1,400の時系列指標を含み、指標のデータの多くは50年以上前に遡ることができます。
下の2箇所から探すことができます。
- 世界銀行(World
Bank)オープンデータ
- Country / Indicator > Featured & All > Details
- 世界開発指標
(WDI) :
- テーマ:
貧困と格差、人間、環境、経済、国家と市場、グローバルリンク集(Poverty
and Inequality, People, Environment, Economy, States and Markets, Global
Links)
練習 1. -
調べてみたい WDI
世界開発指標のコードをいくつか、リストしてみましょう。
WDI パッケージ
WDI
パッケージで、データをダウンロードしたり、探したり、詳細情報を得たりできます。
検索や、ダウンロード方法が理解できるように、例示してありますが、ざっと確認して、4.3.3
のテンプレートを利用すると、グラフを描くこともできます。
指標 WDI 検索
検索例
1(WDI名)
WDIsearch(string = "gdp", field = "name", short = TRUE, cache = NULL)
WDIsearch(string = "military expenditure", field = "name", short = TRUE, cache = NULL)
検索例
2(WDI)
WDIsearch(string = "NY.GDP.MKTP.CD", field = "indicator", short = TRUE, cache = NULL)
練習 2. -
検索(short)
名前で検索(“”
の間に、(なるべく簡単な)検索文字列を入れてください。)
WDIsearch(string = "", field = "name", short = TRUE, cache = NULL)
Indicator で検索(“” の間に、調べたい indicator
を入れてください。)
WDIsearch(string = "", field = "indicator", short = TRUE, cache = NULL)
詳しい情報を得るには
short = FALSE
とします。時間がかかるので、検索は、Indicator
と、名前などの情報をもったファイルを手元に持っておくことにします。
右上の窓枠(pane)から、wdi_cache
を探して、中身を見てみましょう。series と、country
の二つのデータ・フレームからなっているリストです。三角印や、右から二番目の巻物のようなアイコンをクリックすると中身が見えます。
検索例
3(WDI名)
WDIsearch(string = "CPI Price", field = "name", short = FALSE, cache = wdi_cache)
- CPTOTNSXN: CPI Price, nominal
- The consumer price index reflects the change in prices for the
average consumer of a constant basket of consumer goods. Data is not
seasonally adjusted.
検索例
4(WDI)
WDIsearch(string = "NY.GDP.MKTP.KD.ZG", field = "indicator", short = FALSE, cache = wdi_cache)
練習 2 - 検索(long
w/ cache)
string
と、field
を、ふたつとも入れてください。
WDIsearch(string = "", field = "", short = FALSE, cache = wdi_cache)
指標 WDI
データのダウンロード
Indicator が決まったら、ダウンロードします。
右下の、Help Tab に WDI と入れると、使い方もわかります。
ダウンロード例
1-1
df_gdp1 <- WDI(country = "all", indicator = "NY.GDP.MKTP.CD")
df_gdp1
ダウンロード例
1-2
df_gdp2 <- WDI(country = "all", indicator = c(gdp = "NY.GDP.MKTP.CD"))
df_gdp2
ダウンロード例
1-3
df_gdp3 <- WDI(country = "all", indicator = c(gdp = "NY.GDP.MKTP.CD"), extra=TRUE, cache=wdi_cache)
df_gdp3
ダウンロード例
1-4
df_gdp4 <- WDI(country = c("CN","GB","JP","IN","US","DE"), indicator = c(gdp = "NY.GDP.MKTP.CD"), extra=TRUE, cache=wdi_cache)
df_gdp4
ダウンロード例
2-1
- NY.GDP.DEFL.KD.ZG: Inflation, GDP deflator (annual %)
- CPTOTNSXN: CPI Price, nominal
df_gdp21 <- WDI(country = "all",
indicator = c(gdp_deflator = "NY.GDP.DEFL.KD.ZG",
cpi_price = "CPTOTNSXN"),
extra=TRUE, cache=wdi_cache)
df_gdp21
'data.frame': 24238 obs. of 14 variables:
$ country : chr "Advanced Economies" "Advanced Economies" "Advanced Economies" "Advanced Economies" ...
$ iso2c : chr "AME" "AME" "AME" "AME" ...
$ iso3c : chr "" "" "" "" ...
$ year : int 1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 ...
$ status : chr "" "" "" "" ...
$ lastupdated : chr "2020-07-27" "2020-07-27" "2020-07-27" "2020-07-27" ...
$ gdp_deflator: num NA NA NA NA NA NA NA NA NA NA ...
..- attr(*, "label")= chr "Inflation, GDP deflator (annual %)"
$ cpi_price : num 58.7 60.5 63 66 69.1 ...
..- attr(*, "label")= chr "CPI Price,not seas.adj,,,"
$ region : chr NA NA NA NA ...
$ capital : chr NA NA NA NA ...
$ longitude : chr NA NA NA NA ...
$ latitude : chr NA NA NA NA ...
$ income : chr NA NA NA NA ...
$ lending : chr NA NA NA NA ...
country iso2c iso3c
Length:24238 Length:24238 Length:24238
Class :character Class :character Class :character
Mode :character Mode :character Mode :character
year status lastupdated
Min. :1960 Length:24238 Length:24238
1st Qu.:1982 Class :character Class :character
Median :1997 Mode :character Mode :character
Mean :1995
3rd Qu.:2009
Max. :2022
gdp_deflator cpi_price region
Min. : -98.704 Min. : 0.00 Length:24238
1st Qu.: 2.315 1st Qu.: 55.95 Class :character
Median : 5.256 Median : 83.28 Mode :character
Mean : 25.299 Mean : 84.18
3rd Qu.: 10.386 3rd Qu.:108.75
Max. :26765.858 Max. :551.25
NA's :11881 NA's :18676
capital longitude latitude
Length:24238 Length:24238 Length:24238
Class :character Class :character Class :character
Mode :character Mode :character Mode :character
income lending
Length:24238 Length:24238
Class :character Class :character
Mode :character Mode :character
右上の窓枠の、Environment も見てみましょう。
可視化
Visualization
グラフ(Chart)を描いて視覚化しよう
グラフ 1
df_gdp4 %>% ggplot(aes(year, gdp, col=country)) + geom_line()
グラフ 2
df_gdp4 %>% drop_na(gdp) %>%
ggplot(aes(year, gdp, col=country)) + geom_line() +
labs(title = paste("WDI - NY.GDP.MKTP.CD: ", "gdp"))
テンプレート
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 and one country
chosen_indicator <- "SL.UEM.TOTL.NE.ZS"
chosen_country <- "United States"
WDI(country = "all", indicator = c(chosen_indicator = chosen_indicator),
extra=TRUE, cache=wdi_cache) %>%
filter(country == chosen_country) %>%
ggplot(aes(year, chosen_indicator)) + geom_line() +
labs(title = paste("WDI ", chosen_indicator, " - ", chosen_country),
y = chosen_indicator)
いくつかの国についての、一つの指標(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"))
課題 Assignment
上のテンプレートをコピーして、下に貼り付け、指標
indicator
と、略称 short_name
と、いくつかの国名 chosen_countries
を、入れ替えて、試してみてください。
学生が選択した世界開発指標(WDI)の例
19人の受講生に、興味のある指標を選んで、テンプレートを使って、可視化をしてみてください、と課題に出した時に、調べてくれたものです。
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: 5── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (5): indicator, name, description, sourceDatabase, sourceO...
ℹ 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, name, description, sourceDatabase, sourceOrganization)`
write_csv(df_indicators, "./data/indicators.csv")
df_indicators %>% distinct(indicator, name) %>% arrange(indicator)
自分で課題を考え、データを選べることは、とても大切だということだと思います。
探索的データ解析 Exploratory Data Analysis (EDA)
EDAは、データが何を語っているかを理解するための反復的なサイクルです。
まず、データに関する問いを作成します。
データの可視化、変換、モデリングを行い、答えを探します。
学習したことを活用して、問いを修正したり、新しい問いを考えたりします。そして、このサイクルを繰り返していきます。
EDAはデータ分析において重要な役割を果たします。また、データの品質を保証するために、データの質を確認するために使用することもできます。
問いをもちデータを取得し、視覚化などを通して、データを理解し、さらに問いを深めるサイクルが、データサイエンスの核ではないかと思います。
データの取得・読み込み - Importing Data
スタートは、本来は、データの作成・探索ですが、すでに、分析したいデータはすでにあるとして話を進めます。まずは、data
フォルダ(directory)を作成しておくと良い。右下の窓枠の Files
タブから、New Folder で作成してもよい。
データの取得・読み込みを、四つの方法に分けて説明します。
- パッケージの利用
- 例:WDI
など。何度も、ダウンロードしなくて良いよいに、書き出しておき、2
を使うとよい。
write(df_name, "./data/name.csv")
- コンピュータ上にある CSV などのテキストファイルを読み込む
- 例:
df_name <- read_csv("./data/file_name.csv")
- インターネット上のデータのアドレス(URL)を使って、CSV
などのテキストファイルを読み込む。
- 例:
df_name <- read_csv(url_of_a_csv)
- コンピュータ上にある、Excel
ファイルなどのデジタルファイルを読み込む。まず、
library(readxl)
。
- 例:
df_name <- read_excel("./data/file_name.xlsx")
- サイトからダウンロードして、Project
のデータフォルダに移す。または、データのアドレス(URL)がわかっていれば、直接ダウンロード。
- 例:`download.file(url_of_a_data, destfile =
“./data/data_name”)
- クリップボードにコピーして読み込む。
- 例:
df_name <- read_delim(clipboard())
WDIcache()
の扱い
二つの、ファイルが一つになった、リストであるため、違って命令を使います。
wdi_cache <- WDIcache()
write_rds(wdi_cache, "./data/wdi_cache.RData")
wdi_cache <- read_rds("./data/wdi_cache.RData")
WDI での例
df_military6 <- WDI(country = c("CN","GB","JP","IN","US","DE"), indicator = c(military = "MS.MIL.XPND.CD"), extra=TRUE, cache=wdi_cache)
df_military6 %>% filter(year == 2021) %>% arrange(desc(military))
df_military6 %>% drop_na(military) %>%
ggplot(aes(year, military, col=iso2c)) + geom_line()
df_military <- WDI(country = "all", indicator = c(military = "MS.MIL.XPND.CD"), extra=TRUE, cache=wdi_cache)
df_military %>% drop_na(military) %>% filter(year==2021, income=="High income", military >0) %>%
ggplot(aes(military, fill=region)) + geom_density() + geom_vline(xintercept = 54123551702, col="red") + scale_x_log10() + geom_label(x=11.1, y=25, label = "Japan") + facet_wrap(~region) + theme(legend.position = "none") + labs(title="Military Expenses in high income countries")
df_military_gdp <- WDI(country = "all", indicator = c(military_gdp = "MS.MIL.XPND.GD.ZS"), extra=TRUE, cache=wdi_cache)
df_military_gdp %>% filter(country == "Japan", year==2021)
df_military_gdp %>% drop_na(military_gdp) %>% filter(year==2021, income!="Aggregates") %>%
ggplot(aes(military_gdp, fill=income)) + geom_density(binwidth = 0.2, alpha=0.5) + geom_vline(xintercept = 2, col="red") + geom_vline(xintercept = 1, col="blue") + facet_wrap(~income)
Warning: Ignoring unknown parameters: `binwidth`
国際機関のデータ
International Institutions’ Data
url_un_pop <- "https://data.un.org/_Docs/SYB/CSV/SYB65_1_202209_Population,%20Surface%20Area%20and%20Density.csv"
df_un_pop0 <- read_csv(url_un_pop)
New names:Rows: 7874 Columns: 7── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (7): T02, Population, density and surface area, ...3, ...4...
ℹ 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.
url_un_pop <- "https://data.un.org/_Docs/SYB/CSV/SYB65_1_202209_Population,%20Surface%20Area%20and%20Density.csv"
df_un_pop <- read_csv(url_un_pop, skip=1)
New names:Rows: 7873 Columns: 7── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (4): ...2, Series, Footnotes, Source
dbl (2): Region/Country/Area, Year
num (1): Value
ℹ 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.
df_un_pop %>% distinct(`Region/Country/Area`, `...2`)
df_un_pop %>% filter(`Region/Country/Area` %in% c(2,19,142,150,9), Series == "Population mid-year estimates (millions)") %>%
ggplot(aes(Year, Value, fill = `...2`)) + geom_area(col="black") +
labs(title = "Population mid-year estimates (millions) of the World")
OECD data
例:労働時間当たりGDP
労働時間当たりGDP
労働時間当たりGDPは、労働生産性の指標である。これは、労働投入量が他の生産要素と組み合わされ、生産プロセスでどれだけ効率的に利用されたかを測定するものである。労働投入量は、生産に従事するすべての人の総労働時間として定義される。労働生産性は、労働者の個人的能力や努力の強さといった労働の生産性を部分的にしか反映していない。アウトプット指標と労働投入量の比率は、他の投入物(資本、中間投入物、技術・組織・効率の変化、規模の経済など)の存在や利用に大きく左右される。この指標は、米ドル(2010年の恒常価格およびPPP)および指標で測定されています。
最初のステップ
- サイトから、CSV
データをダウンロード。
- プロジェクト内のデータ格納フォルダに入れます。“./data/”
- 読み込みます。
上のサイトからデータ(Full
indicator data)をダウンロードして、プロジェクトの data
フォルダーに入れました。
df_oecd_productivity <- read_csv("./data/DP_LIVE_21022023111712065.csv")
Rows: 3894 Columns: 8── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (6): LOCATION, INDICATOR, SUBJECT, MEASURE, FREQUENCY, Fla...
dbl (2): TIME, Value
ℹ 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.
データの確認
列名を確認し、列ごとに、データを確認
colnames(df_oecd_productivity)
[1] "LOCATION" "INDICATOR" "SUBJECT" "MEASURE"
[5] "FREQUENCY" "TIME" "Value" "Flag Codes"
unique()
のかっこの中に、df_oecd_productivity$LOCATION
を入れたものと同じものを出力します。次々とつづけるときに便利なので、このパイプ
%>%
をわたしはよく使います。unique(df_oecd_productivity$LOCATION)
も試してみてください。
df_oecd_productivity$LOCATION %>% unique()
[1] "AUS" "AUT" "BEL" "CAN" "CZE"
[6] "DNK" "FIN" "FRA" "DEU" "GRC"
[11] "HUN" "ISL" "IRL" "ITA" "JPN"
[16] "KOR" "LUX" "MEX" "NLD" "NZL"
[21] "NOR" "POL" "PRT" "SVK" "ESP"
[26] "SWE" "CHE" "TUR" "GBR" "USA"
[31] "CHL" "EST" "ISR" "RUS" "SVN"
[36] "OECD" "EU28" "G-7" "LVA" "LTU"
[41] "EA19" "ZAF" "CRI" "BGR" "HRV"
[46] "ROU" "EU27_2020" "COL"
df_oecd_productivity$INDICATOR %>% unique()
[1] "GDPHRWKD"
df_oecd_productivity$SUBJECT %>% unique()
[1] "TOT"
df_oecd_productivity$MEASURE %>% unique()
[1] "USD" "IDX2015"
df_oecd_productivity$FREQUENCY %>% unique()
[1] "A"
df_oecd_productivity$TIME %>% unique()
[1] 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981
[13] 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993
[25] 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005
[37] 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017
[49] 2018 2019 2020 2021
df_oecd_productivity %>%
filter(MEASURE == "USD", TIME == 2021) %>% # filtering rows with conditions
select(LOCATION, Value) %>% # selecting columns
arrange(desc(Value)) # ordering the rows in the descenting order of the column Value
いくつかの地域を選んで、折線グラフを書いてみる。
3行目がないとどうなりますか。
df_oecd_productivity %>%
filter(LOCATION %in% c("JPN", "OECD", "G-7", "EU28")) %>%
filter(MEASURE == "USD") %>% # same as above up to this line
ggplot(aes(x = TIME, y = Value, col = LOCATION)) + geom_line() +
labs(title="GDP per hour worked", # adding the title and the subtitle
subtitle="Total, 2015=100, 2021 or latest available")
練習:教育
Education
成人の教育レベルに関する、次のサイトからデータをとって、調べてみてください。
Adult education level: https://data.oecd.org/eduatt/adult-education-level.htm
ダウンロードしたファイルのファイル名が
DP_LIVE_21022023120132654.csv
と同じであることを確認してください。
df_oecd_education_level <- read_csv("./data/DP_LIVE_21022023120132654.csv")
Rows: 7330 Columns: 8── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (5): LOCATION, INDICATOR, SUBJECT, MEASURE, FREQUENCY
dbl (2): TIME, Value
lgl (1): Flag Codes
ℹ 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.
上の労働時間当たりGDPの例に習って、データを調べてみてください。
colnames(df_oecd_education_level)
[1] "LOCATION" "INDICATOR" "SUBJECT" "MEASURE"
[5] "FREQUENCY" "TIME" "Value" "Flag Codes"
df_oecd_education_level$SUBJECT %>% unique()
[1] "BUPPSRY" "TRY" "UPPSRY" "TRY_MEN"
[5] "TRY_WOMEN" "UPPSRY_MEN" "UPPSRY_WOMEN"
これらは、何を意味しているのでしょうか。サイトの Perspectives
などをみてください。
他の列(変数)は、どうでしょうか。コードチャンクを挿入して、調べてみてください。
労働時間当たりGDPの例の真似をして、グラフを書いてみました。
df_oecd_education_level %>%
filter(LOCATION %in% c("JPN", "OECD", "G-7", "EU28")) %>%
ggplot(aes(TIME, Value, linetype = SUBJECT, col = LOCATION)) + geom_line() +
labs(title="Adult education level")
なにか現れましたが、国も、SUBJECT
も期待したものは現れていません。なにが問題なのでしょう。
気づいてたことを書き出してみましょう。
Excel Data
の読み込み
readxl
パッケージを使います。これは、tidyverse
をインストールするときに、同時に、インストールされますから、インストールは必要ありませんが、tidyverse
グループの主たるパッケージはないので、ロードはされていないので、使うときに、ロードする必要があります。
library(readxl) # need to load though readxl is a part of the tidyverse package and installed
実は、範囲を選択し、コピーをし、クリップボードから読む方法もありますが、二つの大きな理由から推奨しません。丁寧に、方法を記述しないと、再現性に問題があること、列のデータ・タイプなどが、適切に、読み込めない場合が多く、読み込んでからの作業が複雑になる。とっても、小さな、自分で作成したデータの場合には、有効かもしれません。
df_excel_clipboard <- read_delim(clipboard())
例:
世界の出生率(Fertility) UN Data
ホットなトピックですね。日本の問題、そして、自分ごととしてだけでなく、世界の状況を見る視点も持ちましょう。
UN data から、検索窓の上にある、Datamarts
を選択し、下のほうにある、World Fertility Data United Nations Population
Division (UNPD) の [+] 記号を開きます。右の [i]
からは情報が得られます。三つのデータがあります。
まずは、“Age-specific fertility rates, Total fertility and Mean age
at childbearing” データを使うことにします。
- サイトから、Excel データをダウンロード。
- プロジェクト内のデータ格納フォルダに入れます。“./data/”
- 試しに、読み込みます。
- Files から、Import Dataset
を選択し、設定をして、もう一度、読み込む。
- 列名を修正
- 日本のデータを確認
- 年齢ごとの数を比較しやすいように、データを変形
- グラフを書いてみる。
- 出生平均年齢の表を降年齢順に見てみる。
- 密度分布グラフを書いてみる。
- 出生率の表を昇順に見てみる。
- 密度分布グラフを書いてみる。
Steps 1-3.
- サイトから、Excel データをダウンロード。
- プロジェクト内のデータ格納フォルダに入れます。“./data/” {-}
- 試しに、読み込みます。サイトから、Excel
データをダウンロード。{-}
どんなシートがあるか見てみましょう。読み込みに問題があるときは、データ名からスペースを消し、下のコードも修正して読んでみてください。スペースなどがあると問題が起こる場合があります。
excel_sheets("./data/Age-specific fertility rates, Total fertility and .xls")
[1] "FERTILITY INDICATORS" "GENERAL NOTES"
[3] "SOURCES"
シートを指定するときは、sheet = 1
とか、sheet = "CHILDREN_EVER_BORN"
とします。
指定がないときは、最初のシート。詳細は、Help で、read_excel
として、確認してください。たくさんの、オプションがあります。
df_un_fertility <- read_excel("./data/Age-specific fertility rates, Total fertility and .xls")
New names:
構造が複雑そうです。
Step 4. Files から、Import Dataset
を選択し、設定をして、もう一度、読み込む。
ファイル名も変更しておいが方がよい場合もあります。そのときは、変更記録を
RNotebookに追記しておくと良いでしょう。下の例では、上の4行をスキップ。列が、text(文字)
か、numeric(数値)かを選択。読み込まないときには、skip しています。
df_un_fertility <- read_excel("./data/Age-specific fertility rates, Total fertility and .xls",
col_types = c("text", "numeric", "text",
"numeric", "text", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "numeric", "numeric",
"numeric", "skip", "text", "skip",
"skip", "skip", "skip", "skip", "skip"),
skip = 4)
df_un_fertility <- read_excel("./data/Age-specific fertility rates, Total fertility and .xls",
col_types = c("text", "numeric", "text",
"numeric", "text", rep("numeric", 9), "skip", "text",rep("skip", 6)),
skip = 4)
Step 5. 列名を修正
修正したい列名をコピーしておく。
Country, ISO code, Period, Reference, NA, Total fertility
1列目から、6列目と、14列目と、15列目を、書き換えます。
colnames(df_un_fertility)[c(1:6,14:15)] <- c("country", "iso", "period","year", "range", "fertility_rate","mean_age","source")
df_un_fertility
Step 6. 日本のデータを確認
df_un_fertility_jp <- df_un_fertility %>% filter(country == "Japan")
df_un_fertility_jp
Step 7.
年齢ごとの数を比較しやすいように、データを変形
すこし、難しいですが、pivot_longer
を Help
で調べてください。
df_un_fertility_jp %>% pivot_longer(-c(1:6, 14:15), names_to = "age_range", values_to = "value")
Step 8. グラフを書いてみる。
df_un_fertility_jp %>% pivot_longer(-c(1:6, 14:15), names_to = "age_range", values_to = "value") %>%
ggplot(aes(x=year, col=age_range, linetype = age_range)) + geom_line(aes(y=value))
いろいろなことがわかります。
Step 9.
出生平均年齢の表を降年齢順に見てみる。
df_un_fertility %>%
filter(year %in% c(2010)) %>% select(country, mean_age) %>%
drop_na(mean_age) %>%
arrange(desc(mean_age))
Step 10. 密度分布グラフを書いてみる。
df_un_fertility %>% filter(year %in% c(1970, 1990, 2010)) %>%
drop_na(mean_age) %>%
ggplot(aes(mean_age, fill = factor(year))) + geom_density(alpha = 0.5) +
# scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
# coord_cartesian(xlim=c(20,40)) +
labs(title="Mean age at childbearing", fill = "year")
df_un_fertility %>% drop_na(mean_age) %>% group_by(year) %>% summarise(n=n()) %>% arrange(desc(n))
df_un_fertility %>% filter(year %in% c(1970, 1985, 1995, 2005, 2010)) %>%
drop_na(mean_age) %>%
ggplot(aes(mean_age, fill = factor(year))) + geom_density(alpha = 0.3) +
labs(title="Mean age at childbearing", fill = "year")
df_un_fertility %>% filter(year %in% c(1970, 1985,1995, 2005,2010)) %>%
drop_na(mean_age) %>%
ggplot(aes(mean_age, fill = factor(year))) + geom_density(alpha = 0.5) + facet_wrap(~ factor(year)) +
labs(title="Mean age at childbearing", fill = "year")
11. 出生率の表を昇順に見てみる。
df_un_fertility %>%
filter(year %in% c(2010)) %>% select(country, fertility_rate) %>%
drop_na(fertility_rate) %>%
arrange(fertility_rate)
Step 12. 密度分布グラフを書いてみる。
df_un_fertility %>% filter(year %in% c(1970, 1990, 2010)) %>%
drop_na(mean_age) %>%
ggplot(aes(fertility_rate, fill = factor(year))) + geom_density(alpha = 0.5) +
labs(title="Total fertility", fill = "year")
df_un_fertility %>% drop_na(fertility_rate) %>% group_by(year) %>% summarise(n=n()) %>% arrange(desc(n))
df_un_fertility %>% filter(year %in% c(1970, 1985, 1995, 2005, 2010)) %>%
drop_na(mean_age) %>%
ggplot(aes(fertility_rate, fill = factor(year))) + geom_density(alpha = 0.5) +
labs(title="Total fertility", fill = "year")
df_un_fertility %>% filter(year %in% c(1970, 1985, 1995, 2005, 2010)) %>%
drop_na(mean_age) %>%
ggplot(aes(fertility_rate, fill = factor(year))) + geom_density(alpha = 0.5) + facet_wrap(~ factor(year)) +
labs(title="Total fertility", fill = "year")
参考例2:学校種類別進学率の推移(日本語データ)
男女共同参画局の資料です。
学校種類別進学率の推移: https://empowerment.tsuda.ac.jp/detail/82584
url_school_jp <- "https://www.gender.go.jp/about_danjo/whitepaper/r02/zentai/html/honpen/csv/zuhyo01-04-01.csv"
エンコーディング(Encoding type)を推測することができます。
guess_encoding(url_school_jp, n_max = 10000, threshold = 0.2)
df_school_jp <- read_csv(url_school_jp, locale = locale(encoding = "Shift_JIS"), skip=2)
Rows: 70 Columns: 10── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (1): 年度
dbl (9): 高等学校等(男子), 高等学校等(女子), 専修学校(専門課程,男子), 専修学校(専門課程,女子), 大...
ℹ 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.
df_edu0 <- df_school_jp
colnames(df_edu0) <- c("year", "highschool_m", "highschool_f", "vocational_m", "vocational_f", "university_m", "university_f", "juniorcollege_f", "gradschool_m", "gradschool_f")
df_edu00 <- df_edu0 %>% mutate(year = 1950:2019,
highschool = (highschool_m + highschool_f)/2,
vocational = (vocational_m + vocational_f)/2,
university = (university_m + university_f)/2,
juniorcollege = juniorcollege_f,
gradschool = (gradschool_m + gradschool_f)/2)
df_edu00 %>% filter(year >= 1954) %>% select(-(2:10)) %>%
pivot_longer(3:5, names_to = "schools", values_to = "percentage") %>%
mutate(types = factor(schools, levels = c("vocational", "juniorcollege", "university"))) %>%
pivot_longer(c(highschool, gradschool), names_to = "highgrad", values_to ="value") %>%
mutate(high_grad = factor(highgrad, levels = c("highschool", "gradschool"))) %>%
ggplot() +
geom_area(aes(x = year, y = percentage, fill = types)) +
geom_line(aes(x = year, y = value, linetype = high_grad)) +
scale_x_continuous(breaks = round(seq(1960, 2020, by =10),1)) +
scale_y_continuous(breaks = round(seq(0, 100, by =10),1)) +
labs(title = "Tertially Education After Highschool",
subtitle = "with Highschool Graduates and Graduate School",
fill = "", linetype = "")
(続)探索的データ解析 (EDA)
NY.GDP.PCAP.CD: GDP per capita (current US$)
df_wdi_gdppcap <- WDI(country = "all", indicator = c(gdp_pcap = "NY.GDP.PCAP.CD"))
write_csv(df_wdi_gdppcap, "./data/df_wdi_gdppcap.csv")
df_wdi_gdppcap <- read_csv("./data/df_wdi_gdppcap.csv")
Rows: 16492 Columns: 5── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, gdp_pcap
ℹ 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.
参考 -
今後の学習のために
RNotebook の活用
下のリンクを開き、右上の Code ボタンから、Download Rmd
を選択すると、ダウンロードできますから、ダインロードしたものを、プロジェクト・フォールダーに移動またはコピーしてください。ダウンロードできないときは、Ctrl
を押しながら、Download Rmd をクリックすると、Save As
で保存できると思います。ブラウザーによって仕様が異なりますから、適切な方法を選んでください。
Windows でも、Mac でも提供されている、Google Chrome の場合には、Code
ボタンから、ダンロードされるはずです。
クラウド - Posit
Cloud
RStudio
Cloudは、誰でもオンラインでデータサイエンスを行い、共有し、教え、学ぶことができる、軽量でクラウドベースのソリューションです。月25時間の制限がありますが、内容を共有して、他のアカウントから利用することも可能です。
クラウドサービス How to Start Posit Cloud
- Go to https://posit.cloud/
- Sign Up: top right
- Email address or Google account
- New Project: Project Name
IT ツールについて
モバイルアプリでも、さまざまに可能ですが、条件付き課金など、アプリによっても、機種によっても、異なるので、ここでは、PC
での利用について書きます。
RStudio または Posit
Studio で R
Google Chrome
での自動翻訳
Windows の Edge や、Mac の Safari
でも可能です。翻訳エンジンが異なるので、使い勝手もありますが、いくつか試して、自分の好きな、信頼できる、翻訳エンジンを利用するのがよいと思います。
設定
- 上のバーの一番右にある、縦にならんだ三点から、一番下の設定を選択
- 左の帯から言語を選択
- 優先言語を確認:入っていなければ、日本語のつぎに、英語を入れる
- Google 翻訳を ON にする
- この言語に翻訳するを日本語に
- 翻訳するか確認しない言語を日本語に
使い方
- 検索窓の翻訳ボタンを利用。または、翻訳とでたときに、日本語を選択。
- 英語にもどしたいときは、同じボタンで戻す。
DeepL の活用
アプリを使っての翻訳
- DeepL のサイトのメニューからアプリを選択または
- アプリ
上からダウンロードしてインストールします。
- ショートカットキーが便利です。
- アプリを起動する
- 翻訳したい箇所を選択
- Windows は、Ctrl + C + C (コントロールを押しながら C を2回)、Mac
は、Command +C + C
(初期設定でこの機能が設定されていると思います)
- 3
が機能しない時は、左上の、メニューから設定を選択。ショートカットキーの設定を
ON
Chat GPT
- Try ChatGPT をクリック
- 人間であることを確認
- サインアップ
- メールアドレスと、パスワードを設定
- パソコンからだと、Short Message
を受け取れる携帯電話情報を聞かれます’
- アカウント作成のみ、携帯電話からすると、ステップが一つ減ります
- ログインして利用
- ChatGPT を、Google Chrome
などの、インターネットブラウザーの機能拡張として加えることも可能です。
- 質問に関しては、かなりの確度で理解しているように思われます。質問内容の一部を無視することは少ないように思われます。
- 質問のしかた、答えの内容を確認していく練習が必要です
- 基本的には、2021年9月までの情報をもとに、応答します
- 5秒ほどで、500文字程度の、応答をするモデルになっているため、その枠内で、質問に対してもっとも高い評価値の答えを選択して、応答しているようです。
- 確認をしたり、なにを根拠としているか、根拠となるサイトなどを確認し、より、確実な情報を絞り込み、さらに、質問をする、Chat
だということを認識して利用することが大切です。
- 何にでも答えるわけではありませんが、不確実な情報も応答するため、確認が必要です。
- 人間にも、どんな質問にも即座に、なんらかの情報を返す、知識が豊かなひともいますが、内容が、すべて正しいわけではありません。そのように、ある程度辻褄が合っている内容を、すぐ答えられることに、驚かされるということでしょうか。
Perplexity
- サイト
- 検索窓に、128文字までの検索語、質問などを入れると、情報のあるさいとをふくめて、教えてくれます。
- 検索語や、質問の書き方も練習する必要があります。
LS0tCnRpdGxlOiAiUuOBp+OBr+OBmOOCgeOCi+ODh+ODvOOCv+ODu+OCteOCpOOCqOODs+OCuSIKYXV0aG9yOiAi5rCP5ZCN77yITmFtZe+8iSIKZGF0ZTogIkxhc3QgVXBkYXRlZDogYHIgU3lzLkRhdGUoKWAiCmhlYWRlci1pbmNsdWRlczoKICAtIFx1c2VwYWNrYWdle2N0ZXh9Cm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0aGVtZTogY2VydWxlYW4KICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgcGRmX2RvY3VtZW50OiAKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAotLS0KCuWPs+S4iuOBriBDb2RlIOODnuODvOOCr+OBi+OCieOAgeOCveODvOOCueODleOCoeOCpOODq+OCguODgOOCpuODs+ODreODvOODieOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAggoKKipQb3NpdCAoUlN0dWRpbykgQ2xvdWQg44Gn44Gu5a6f57+SKioKClJOb3RlYm9vayDjg5XjgqHjgqTjg6vjgpLmlrDopo/kvZzmiJDjgZfjgIHjgZPjga7jg5rjg7zjgrjjgpLjgIHlhajpgbjmip7jgZfjgabjgIHjgrPjg5Tjg7zjg7vjg5rjg7zjgrnjg4jjgZfjgb7jgZnjgIIoYHJtYXJrZG93bmAg44Gu44Kk44Oz44K544OI44O844Or44GM5b+F6KaB44Gn44GZKQpTYXZlIEFzIC4uLiDjgb7jgZ/jga/jgIHjg5Xjg63jg4Pjg5Tjg7zjg4fjgqPjgrnjgq/jg57jg7zjgq/jgpLjgYrjgZfjgabjgIFkcy1lZHUg44Gq44Gp44Go44GX44Gm5L+d5a2Y44CCCuiqrOaYjuOCkuiqreOBv+OBquOBjOOCieOAgeOCs+ODvOODieODgeODo+ODs+OCr+OBqOiogOOCj+OCjOOCi+OAgeiJsuOBjOWkieOCj+OBo+OBpuOBhOOCi+OAgeOBruWPs+S4iuOBq+OBguOCi+S4ieinkuWNsOOCkuaKvOOBmeOBqOOAgeWun+ihjOOBleOCjOOBvuOBmeOAggoK44GT44Gu44GC44Go44Gn44CBUk5vdGVib29rIOOBq+OBpOOBhOOBpuOCguOAgeWwkeOBl+iqrOaYjuOBl+OBvuOBmeOAggoKIyDmupblgpnvvJpQb3NpdCBDbG91ZCDjg63jgrDjgqTjg7MKClBvc2l0IENsb3VkIChodHRwczovL3Bvc2l0LmNsb3VkLykg44Gu44Ki44Kr44Km44Oz44OI44KS5L2c5oiQ44GX44Gm44CB44Ot44Kw44Kk44Oz44GX44Gf54q25oWL44GL44KJ5aeL44KB44G+44GZ44CCCgrnhKHoq5YgUlN0dWRpbyDjgacgUiDjgpLliKnnlKjjgafjgY3jgovmlrnjga/jgIHjgbvjgajjgpPjganlkIzjgZjjgafjgZnjgYzjgIFQb3NpdCBDbG91ZCDjgavjga/jgIHjg5XjgqHjgqTjg6vjgoTjgIHjg4fjg7zjgr/jgoLlhaXjgaPjgabjgYTjgb7jgZnjga7jgafjgIHjgZ3jga7jgb7jgb7mtLvnlKjjgZnjgovjgZPjgajjgYzlj6/og73jgafjgZnjgIIKClJTdHVkaW8g44Gn44Gu44CB5YuV5L2c5LiN6Imv44Gu5aC05ZCI44Gu5a++5b+c44Gv55yB55Wl44GV44Gb44Gm44GE44Gf44Gg44GN44G+44GZ44CC44Gn44GN44KM44Gw44CB5LiK44Gu44Oh44OL44Ol44O844GuIEZpbGUg44GL44KJ44CBTmV3IFByb2plY3Qg44KS6YG45oqe44GX44Gm44CBUHJvamVjdCDjgpLkvZzjgaPjgabjgIHjgZ3jgZPjgafkvZzmpa3jgpLjgZXjgozjgovjgZPjgajjgpLjgYrli6fjgoHjgZfjgb7jgZnjgIIKCuWVj+mhjOOBjOOBguOCi+aZguOBr+OAgeS4i+OBruOCteOCpOODiOOCkuWPgueFp+OBl+OBpuOBj+OBoOOBleOBhOOAglBvc2l0IENsb3VkIOOBq+OBpOOBhOOBpuOCguOAgeWkmuWwkeOBruiqrOaYjuOBjOabuOOBhOOBpuOBguOCiuOBvuOBmeOAggoKICBodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai9yb25yc3R1ZGlvLmh0bWwKCuWPs+S4iuOBriBOZXcgUHJvamVjdCDjgpLpgbjmip7jgZfjgabjgIHlp4vjgoHjgovjgZPjgajjgYzmma7pgJrjgafjgZnjgYzjgIHmnKzml6Xjga/jgIEKCuOBk+OBruODquODs+OCr+OBq+OCouOCr+OCu+OCueOBl+OBpuOBhOOBn+OBoOOBjeOAgVNhdmUgYSBQZXJtYW5lbnQgQ29weSDjgpLpgbjmip7jgZfjgabjgY/jgaDjgZXjgovjgajjgIHjgZ3jga7jgarjgYvjgafjgIHoh6rliIbjga7jg5fjg63jgrjjgqfjgq/jg4jjgajjgZfjgabjgIHlrp/ooYzjgZnjgovjgZPjgajjgYzlj6/og73jgavjgarjgorjgb7jgZnjgIIKCiAgaHR0cHM6Ly9wb3NpdC5jbG91ZC9jb250ZW50LzU1Mzk3NjMKCiMg44Gv44GY44KB44GrCiMjIOWfuuacrOOCs+ODnuODs+ODiSAtIGluIENvbnNvbGUKCuS4i+OBruOCs+ODnuODs+ODieOCkuW3puS4i+OBrueqk+aeoChQYW5lKeOBq+WFpeOCjOOBpuOBv+OBpuOBj+OBoOOBleOBhOOAggoKLSAgIGBoZWFkKGNhcnMpYAotICAgYHN0cihjYXJzKWAKLSAgIGBzdW1tYXJ5KGNhcnMpYAotICAgYGRmIDwtIGNhcnNgCiAgICAtICAgYDwtYCDjgaggYF9gIOOBqCBgJT4lYCDjgaggXGAgYmFjayB0aWNrIOOBruOCreODvOODnOODvOODieS4iuOBp+OBruS9jee9ruOBrueiuuiqjQotICAgYGhlYWQoZGYpYAotICAgYHBsb3QoZGYpYAotICAgYFZpZXcoY2FycylgIOOBvuOBn+OBr+OAgeWPs+S4iuOBriBFbnZpcm9ubWVudCDjgYvjgonjgIFgZGZfY2Fyc2Ag44KS44Kv44Oq44OD44KvCi0gICBgP2NhcnNgIOOBvuOBn+OBryBIZWxwIOaknOe0oueqk+OBpyBgY2Fyc2AsIGBoZWFkYCDjgarjgakKCiMjIyDlrp/pmpvjga7lh7rlipsKCmBgYHtyfQpoZWFkKGNhcnMpCmBgYAoKYGBge3J9CnN0cihjYXJzKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGNhcnMpCmBgYAoKYGBge3J9CmRmIDwtIGNhcnMKYGBgCgpgYGB7cn0KaGVhZChkZikKYGBgCgpgYGB7cn0KcGxvdChkZikKYGBgCgoK44GK44GZ44GZ44KB77yaYFN5cy5zZXRlbnYoTEFORyA9ICJlbiIpYAoK44K344K544OG44Og6KiA6Kqe44KS6Iux6Kqe44Gr6Kit5a6a44GZ44KL44Go44CB5LiN5piO44Gu44Ko44Op44O844Oh44OD44K744O844K444GM44Gn44Gf44Go44GN44Gr44KC44CB5qSc5p+744Gn6Kej5rG644Gn44GN44KL44GT44Go44GM5aSa44GE44CCCgojIyMg5Y+C6ICDCgpb44OH44O844K/44O844K144Kk44Oz44K544KS44Gv44GY44KB44G+44GX44KH44GGXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai8pIOOBruS4rVvjgrPjg7Pjgr3jg7zjg6vjgaflrp/ooYxdKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RzNGFqL3JiYXNpY3MuaHRtbCPjgrPjg7Pjgr3jg7zjg6vjgaflrp/ooYwtLS1ydW4taW4tY29uc29sZSkg44Gr44CB57Ch5Y2Y44Gq6Kqs5piO44GM44GC44KK44G+44GZ44CCCgojIyBQYWNrYWdlIOOBrueiuuiqjeOBqOOCpOODs+OCueODiOODvOODqwoKUuODkeODg+OCseODvOOCuOOBr+OAgVLjga7mi6HlvLXmqZ/og73jgafjgIHjgrPjg7zjg4njgIHjg4fjg7zjgr/jgIHjg4njgq3jg6Xjg6Hjg7Pjg4jjgpLmqJnmupbljJbjgZXjgozjgZ/jgrPjg6zjgq/jgrfjg6fjg7PlvaLlvI/jgaflkKvjgpPjgafjgYrjgorjgIHmqJnmupbnmoTjgarjgoLjga7jga/jgIFSIFN0dWRpbyDjga4gVG9wIEJhciDjga4gVG9vbCBcPiBJbnN0YWxsIFBhY2thZ2VzIOOBi+OCieOCpOODs+OCueODiOODvOODq+OBp+OBjeOBvuOBmeOAggoKLSAgIOasoeOBruS4ieOBpOOCkuOCpOODs+OCueODiOODvOODq+OBl+OBvuOBmTogYHRpZHl2ZXJzZWAsIGBybWFya2Rvd25gLCBgV0RJYAotICBUb29scyDjgYvjgokgSW5zdGFsbCBwYWNrYWdlcyDjgpLpgbjjgbPjgIHkuIDjgaTkuIDjgaTlhaXjgozjgabjgYTjgY/jgajjgIFpbnN0YWxsIOOBp+OBjeOBvuOBmeOAguWwkeOBl+aZgumWk+OBjOOBi+OBi+OCiuOBvuOBmeOAggoKIyMjIOWCmeiAgwoKUiDjga/jgIHlpJrjgY/jga7mlrnjgYzjgIHjg5Hjg4PjgrHjg7zjgrjjgpLplovnmbrjgZfjgabjgIHjgZ3jgozjgZ7jgozjga7liIbph47jgafjgIHkvb/jgYTjgoTjgZnjgY/jgZfjgabjgYTjgaPjgZ/ntbHoqIjop6PmnpDjga7jgZ/jgoHjga7jgrPjg7Pjg5Tjg6Xjg7zjgr/oqIDoqp7jgafjgZnjgILjgZ/jgaDjgIHln7rmnKzjgpLjga7jgZ7jgYTjgabjgIHjgZ3jgozjgZ7jgozjga7lpb3jgb/jgavjgYLjgo/jgZvjgabjgIHplovnmbrjgZXjgozjgZ/pnaLjgoLjgYLjgorjgIHntbHkuIDmgKfjgavjga/jgYvjgZHjgovoqIDoqp7jgafjgZnjgILjgYLjgajjgafoqqzmmI7jgZnjgovjgIHmjqLntKLnmoTjg4fjg7zjgr/liIbmnpDvvIhFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lz77yJ44Gu44Gf44KB44Gr5b+F6KaB44Gq5Z+65pys55qE44Gq44KC44Gu44KS44CB5pW05ZCI5oCn44Gu44GC44KL5b2i44Gn44CB5YaN5qeL56+J44GX44Gf44KC44Gu44GM44CBYHRpZHl2ZXJzZWAg44OR44OD44Kx44O844K444Gn44CB5Lit5b+D44Go44Gq44Gj44Gf44CBSC4gV2lja2hhbSDjga/jgIFSU3R1ZGlv77yI54++5Zyo44GuIFtQb3NpdF0oaHR0cHM6Ly9wb3NpdC5jbynvvIkg44Gr5Yqg44KP44KK44G+44GX44Gf44CC44Gd44Gu44Oh44Oz44OQ44O844Gu44CBWS4gWGll77yI6LCi55uK6L6J77yJIOOBn+OBoeOBjOmWi+eZuuOBl+OBn+OCguOBruOBjOOAgWBybWFya2Rvd25gIOOBq+mWoumAo+OBl+OBn+ODkeODg+OCseODvOOCuOOBp+OBmeOAggoKIyMgUiBNYXJrZG93biDlhaXploAKCiMjIyBSIE5vdGVib29rCgpSIE1hcmtkb3du44Gv44OH44O844K/44K144Kk44Ko44Oz44K544Gu44Gf44KB44Gu44Kq44O844K144Oq44Oz44Kw44OV44Os44O844Og44Ov44O844Kv44CCCgrjgrPjg7zjg4nvvIjjg5fjg63jgrDjg6njg6DvvInjgajjgZ3jga7lrp/ooYzntZDmnpzjgIHjgpLoqJjpjLLjg7vooajnpLrjgZfjgIHpq5jlk4Hos6rjga7jg6zjg53jg7zjg4jjga7kvZzmiJDjgpLlj6/og73jgavjgZfjgb7jgZnjgIIKClIgTm90ZWJvb2sg44Gv44CB54us56uL44GX44Gm44Kk44Oz44K/44Op44Kv44OG44Kj44OW44Gr5a6f6KGM44Gn44GN44KL44OB44Oj44Oz44Kv44KS5oyB44GkUiBNYXJrZG93buODieOCreODpeODoeODs+ODiOOBruS4gOOBpOOBruW9ouW8j+OBp+OAgeWFpeWKm+OBruOBmeOBkOS4i+OBq+WHuuWKm+OBjOihqOekuuOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAggoKMS4gIEZpbGUgXD4gTmV3IEZpbGUgXD4gUiBOb3RlYm9vawoyLiAgU2F2ZSB3aXRoIGEgZmlsZSBuYW1lLCBzYXksIHRlc3Qtbm90ZWJvb2sKMy4gIFByZXZpZXcgYnkgW1ByZXZpZXddIGJ1dHRvbgo0LiAgUnVuIENvZGUgQ2h1bmsgcGxvdChjYXJzKSBhbmQgdGhlbiBQcmV2aWV3IGFnYWluLgoKKiDjg4bjg7Pjg5fjg6zjg7zjg4jjg5XjgqHjgqTjg6vjga7liKnnlKgKCuS4i+OBruODquODs+OCr+OCkumWi+OBjeOAgeWFqOmDqOOCkumBuOaKnuOBl+OAgVIgTm90ZWJvb2sg44OV44Kh44Kk44Or44KC5YWo6YG45oqe44GX44Gm6LK844KK5LuY44GR44KM44Gw44CB5pel5pys54mI44KC6KaL44KL44GT44Go44GM44Gn44GN44G+44GZ44CCCgoqIOaXpeacrOiqnuODjuODvOODiOODluODg+OCr++8mmh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvUk5vdGVib29rLUouaHRtbAoqIOOBhOOCjeOBhOOCjeOBquW9ouW8j+OBruWHuuWKm++8mmh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvUm1hcmtkb3duLUouaHRtbAoKIyMjIGBpbnRybzJyai5SbWRgCgrlj7PkuIvjga4gRmlsZSDjgr/jg5bjgYvjgonjgIFgaW50cm8ycmouUm1kYCDjgpLplovjgY3jgb7jgZnjgIIKUHJldmlldyDjga7lj7Pjga7jgq7jgqLjg57jg7zjgq/jga4gUHJldmlldyBpbiBWaWV3ZXIgUGFuZSDjgpLpgbjmip7jgZfjgabjgYvjgonjgIFQcmV2aWV3IOODkOOCv+ODs+OCkuaKvOOBmeOBqOOAgeWGheWuueOCkueiuuiqjeOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAggoK44GC44Go44GL44KJ5L2/44GG44Gu44Gn44CB44Ot44O844OJ44GX44Gm44GK44GN44G+44GZ44CC5pyA5Yid44Gr5qyh44Gu44KI44GG44Gq44Kz44O844OJ44KS5a6f6KGM44GX44G+44GZ44CC5Y+z44Gu5LiJ6KeS44KS5oq844GX44G+44GZ44CCCgpQb3NpdCBDbG91ZCDjga7jgrXjgqTjg4jjgavjga/jgIFgZGF0YWAg44OH44Kj44Os44Kv44OI44Oq77yI44OV44Kp44Or44OA77yJ44GM5L2c5oiQ44GV44KM44Gm44GE44G+44GZ44GM44CBCgojIyMg5Y+C6ICDCgpb44OH44O844K/44O844K144Kk44Oz44K544KS44Gv44GY44KB44G+44GX44KH44GGXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai8pIOOBruS4reOBrltSIE1hcmtkb3duXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai9ybWFya2Rvd24uaHRtbCNybWFya2Rvd24pIOOBq+OAgeKAnFJlcHJvZHVjaWJsZSBhbmQgTGl0ZXJhdGUgUHJvZ3JhbW1pbmfigJ0g77yIUmVwcm9kdWNpYmxlIO+8iOWGjeePvuWPr+iDve+8ieOBi+OBpOOAgUxpdGVyYXRl44CA44Gq77yI55CG6Kej44Gn44GN44KL44KI44GG44Gr6KiY6L+w44GX44Gf77yJUHJvZ3Jhbe+8iOODl+ODreOCsOODqeODoOODu+OCs+ODvOODie+8ieOCkuWFseacieOBmeOCi+OBk+OBqO+8ieOCkuOBn+OBhOOBm+OBpOOBq+OBmeOCiyBSTWFya2Rvd24g44Gu6YeN6KaB5oCn44Gr44Gk44GE44Gm57Ch5Y2Y44Gr5pu444GE44Gm44GC44KK44G+44GZ44CCCgojIFIgTm90ZWJvb2sg44Gn44Gu5a6f57+SCiMjIOa6luWCmSBTZXR1cAoK44OH44O844K/44OH44Kj44Os44Kv44OI44Oq44KS5L2c5oiQ44GX44Gm44GK44GN44G+44GZ44CC5LuK5b6M44CB44OH44O844K/44Gv44CB44GT44Gu44OH44Kj44Os44Kv44OI44Oq44Gr5L+d5a2Y44GX44G+44GZ44CC44GZ44Gn44Gr44CB5a2Y5Zyo44GZ44KL5aC05ZCI44Gv44CB44Gd44Gu5peo44Oh44OD44K744O844K444GM5Ye644G+44GZ44GM44CB5Lit6Lqr44GM5raI5Y6744GV44KM44KL44GT44Go44Gv44GC44KK44G+44Gb44KT44CCCgpgYGB7ciBldmFsPUZBTFNFfQpkaXIuY3JlYXRlKCIuL2RhdGEiKQpgYGAKCuODkeODg+OCseODvOOCuOOBr+OCpOODs+OCueODiOODvOODq+OBl+OBpuOBguOBo+OBpuOCguOAgeWIqeeUqOOBmeOCi+OBqOOBjeOBq+OBr+OAgeasoeOBruOCiOOBhuOBq+S9v+OBiOOCi+eKtuaFi+OBq++8iOODreODvOODie+8ieOBl+OBvuOBmeOAggoK5LiA44Gk55uu44Gv44CBYHRpZHl2ZXJzZWAg44Gn44GZ44GM44CB44KC44GG5LiA44Gk44Gv44CB44GC44Go44GL44KJ5rS755So44GZ44KL44CB5LiW55WM6ZaL55m65oyH5qiZ44Gr6Zai44GZ44KL44OH44O844K/44KS5Yip55So44GZ44KL44Gf44KB44Gu44OR44OD44Kx44O844K444Gn44GZ44CCCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCiMjIOS4lueVjOmWi+eZuuaMh+aomSAoV0RJKQoK5L6L44GL44KJ5aeL44KB44G+44GZ44CCCgrmrKHjga7jgrPjg7zjg4njga/jgIHlm73liKXjgavjgIFHRFAg44Gu5aSn44GN44GE5pa544GL44KJ5Lim44G544Gf44KC44Gu44Gn44GZ44CCCgpgYGB7ciBjYWNoZT1UUlVFfQpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKGdkcCA9ICJOWS5HRFAuTUtUUC5DRCIpLAogICAgZXh0cmE9VFJVRSkgJT4lIGRyb3BfbmEoZ2RwKSAlPiUKICBmaWx0ZXIoeWVhcj09bWF4KHllYXIpLCBpbmNvbWUgIT0iQWdncmVnYXRlcyIpICU+JSAKICBkcm9wX25hKHJlZ2lvbikgJT4lIGFycmFuZ2UoZGVzYyhnZHApKQpgYGAKCjPlhYbjg4njg6vjgpLotoXjgYjjgabjgYTjgos244Gk44Gu5Zu944Gr44Gk44GE44Gm44Gu6YGO5Y6744Gu5o6o56e744KS44Kw44Op44OV44Gr44GX44Gf44KC44Gu44Gn44GZ44CCCgpgYGB7ciBjYWNoZT1UUlVFfQpXREkoY291bnRyeSA9IGMoIkNOIiwiR0IiLCJKUCIsIklOIiwiVVMiLCJERSIpLCBpbmRpY2F0b3IgPSBjKGdkcCA9ICJOWS5HRFAuTUtUUC5DRCIpLCBleHRyYT1UUlVFKSAlPiUgZHJvcF9uYShnZHApICU+JSAKICBnZ3Bsb3QoYWVzKHllYXIsIGdkcCwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiV0RJIE5ZLkdEUC5NS1RQLkNEOiBnZHAiKQpgYGAKCmBgYHtyIGNhY2hlPVRSVUV9CldESShjb3VudHJ5ID0gYygiQ04iLCJJTiIsIkpQIiwiVVMiKSwgCiAgICBpbmRpY2F0b3IgPSBjKGdkcF9ncm93dGhfcmF0ZSA9ICJOWS5HRFAuTUtUUC5LRC5aRyIpLCBleHRyYT1UUlVFKSAlPiUKICBkcm9wX25hKGdkcF9ncm93dGhfcmF0ZSkgJT4lIAogIGdncGxvdChhZXMoeWVhciwgZ2RwX2dyb3d0aF9yYXRlLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgTlkuR0RQLk1LVFAuS0QuWkc6IGdkcCBncm93dGggcmF0ZSIpKQpgYGAKCiMjIyDms6jmhI8KCuS4gOOBpOS4gOOBpOOBruOCs+ODvOODieOCkuS4geWvp+OBq+iqrOaYjuOBl+OAgeeQhuino+OBmeOCi+OBk+OBqOOBr+OAgeW+jOWbnuOBl+OBq+OBl+OAgeWwkeOBl+OBmuOBpOWtpuOCk+OBp+OBhOOBj+OBk+OBqOOBq+OBl+OAgeOBk+OBk+OBp+OBr+OAgeOBneOCjOOBnuOCjOOBruWVj+mhjOaEj+itmOOBruOCguOBqOOBp+OAgeOBqeOBruOCiOOBhuOBquOBk+OBqOOBjOOBp+OBjeOCi+OBi+OCkuOAgeeQhuino+OBmeOCi+OBn+OCgeOAgea0u+eUqOOBmeOCi+OBk+OBqOOCkuWEquWFiOOBl+OBn+OBhOOBqOaAneOBhOOBvuOBmeOAggoKIyMjIOS4iuOBp+S9v+OBo+OBn+aMh+aomSAoV0RJKSDjgrPjg7zjg4kKCi0gICBOWS5HRFAuTUtUUC5DRDogR0RQIChjdXJyZW50IFVTXCQpCi0gICBOWS5HRFAuTUtUUC5LRC5aRzogR0RQIGdyb3d0aCAoYW5udWFsICUpCgojIyMg5LiW55WM6ZaL55m65oyH5qiZIChXREkpIOOCkuaOouOBl+OBpuOBv+OBvuOBl+OCh+OBhgoKPiBXREnjga/jgIHkuJbnlYzjga7plovnmbrnirbms4HjgajjgIHosqflm7Djgajjga7miKbjgYTjgavplqLjgZnjgovjgIHpganliIfjgafkuIros6rjgIHjgYvjgaTjgIHlm73pmpvnmoTjgavmr5TovIPlj6/og73jgarmmYLns7vliJfjga7ntbHoqIjjg4fjg7zjgr/jgpLnt6jnuoLjgZfjgZ/jgoLjga7jgafjgZnjgILjgZPjga7jg4fjg7zjgr/jg5njg7zjgrnjga/jgIEyMTfjga7ntYzmuIjjgag0MOS7peS4iuOBruWbveOCsOODq+ODvOODl+OBq+OBpOOBhOOBpjEsNDAw44Gu5pmC57O75YiX5oyH5qiZ44KS5ZCr44G/44CB5oyH5qiZ44Gu44OH44O844K/44Gu5aSa44GP44GvNTDlubTku6XkuIrliY3jgavpgaHjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKCuS4i+OBru+8kueuh+aJgOOBi+OCieaOouOBmeOBk+OBqOOBjOOBp+OBjeOBvuOBmeOAggoKLSAgIFvkuJbnlYzpioDooYzvvIhXb3JsZCBCYW5r77yJ44Kq44O844OX44Oz44OH44O844K/XShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZykKICAgIC0gICBDb3VudHJ5IC8gSW5kaWNhdG9yIFw+IEZlYXR1cmVkICYgQWxsIFw+IERldGFpbHMKICAgIAotICAgW+S4lueVjOmWi+eZuuaMh+aomSAoV0RJKV0oaHR0cHM6Ly9kYXRhdG9waWNzLndvcmxkYmFuay5vcmcvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycy8pIDoKICAgIC0gICDjg4bjg7zjg546IOiyp+WbsOOBqOagvOW3ruOAgeS6uumWk+OAgeeSsOWig+OAgee1jOa4iOOAgeWbveWutuOBqOW4guWgtOOAgeOCsOODreODvOODkOODq+ODquODs+OCr+mbhu+8iFBvdmVydHkgYW5kIEluZXF1YWxpdHksIFBlb3BsZSwgRW52aXJvbm1lbnQsIEVjb25vbXksIFN0YXRlcyBhbmQgTWFya2V0cywgR2xvYmFsIExpbmtz77yJCgojIyMg5Y+C6ICDCgpb44OH44O844K/44O844K144Kk44Oz44K544KS44Gv44GY44KB44G+44GX44KH44GGXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai8pIOOBruS4reOBriBb44OR44OW44Oq44OD44Kv44OH44O844K/XShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai9wdWJsaWNkYXRhLmh0bWwjcHVibGljZGF0YSnjgavjgIHkvovjgYzjgYLjgorjgb7jgZnjgILjgb7jgZ/jgIFb5LiW55WM6ZaL55m65oyH5qiZXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai93b3JsZGJhbmsuaHRtbCN3b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3Itd2RpKSDjga7poIXjgavjgIHkuIrjgafntLnku4vjgZfjgZ/jgrXjgqTjg4jjgYvjgonjgIHjganjga7jgojjgYbjgavjgIFXREkg44Kz44O844OJ44KS6KaL44Gk44GR44KL44GL44Gu6Kqs5piO44GM44GC44KK44G+44GZ44CCCgojIyMg57e057+SIDEuIC0g6Kq/44G544Gm44G/44Gf44GEIFdESQoK5LiW55WM6ZaL55m65oyH5qiZ44Gu44Kz44O844OJ44KS44GE44GP44Gk44GL44CB44Oq44K544OI44GX44Gm44G/44G+44GX44KH44GG44CCCgojIFdESSDjg5Hjg4PjgrHjg7zjgrgKCmBXRElgIOODkeODg+OCseODvOOCuOOBp+OAgeODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOBl+OBn+OCiuOAgeaOouOBl+OBn+OCiuOAgeips+e0sOaDheWgseOCkuW+l+OBn+OCiuOBp+OBjeOBvuOBmeOAggoK5qSc57Si44KE44CB44OA44Km44Oz44Ot44O844OJ5pa55rOV44GM55CG6Kej44Gn44GN44KL44KI44GG44Gr44CB5L6L56S644GX44Gm44GC44KK44G+44GZ44GM44CB44GW44Gj44Go56K66KqN44GX44Gm44CBNC4zLjMg44Gu44OG44Oz44OX44Os44O844OI44KS5Yip55So44GZ44KL44Go44CB44Kw44Op44OV44KS5o+P44GP44GT44Go44KC44Gn44GN44G+44GZ44CCCgojIyDmjIfmqJkgV0RJIOaknOe0ogoKIyMjIOaknOe0ouS+iyAx77yIV0RJ5ZCN77yJCgpgYGB7ciBjYWNoZT1UUlVFfQpXRElzZWFyY2goc3RyaW5nID0gImdkcCIsIGZpZWxkID0gIm5hbWUiLCBzaG9ydCA9IFRSVUUsIGNhY2hlID0gTlVMTCkKYGBgCgpgYGB7cn0KV0RJc2VhcmNoKHN0cmluZyA9ICJtaWxpdGFyeSBleHBlbmRpdHVyZSIsIGZpZWxkID0gIm5hbWUiLCBzaG9ydCA9IFRSVUUsIGNhY2hlID0gTlVMTCkKYGBgCgojIyMg5qSc57Si5L6LIDLvvIhXREnvvIkKCmBgYHtyIGNhY2hlPVRSVUV9CldESXNlYXJjaChzdHJpbmcgPSAiTlkuR0RQLk1LVFAuQ0QiLCBmaWVsZCA9ICJpbmRpY2F0b3IiLCBzaG9ydCA9IFRSVUUsIGNhY2hlID0gTlVMTCkKYGBgCiAgCiMjIyDnt7Tnv5IgMi4gLSDmpJzntKLvvIhzaG9ydO+8iQoK5ZCN5YmN44Gn5qSc57Si77yIIiIg44Gu6ZaT44Gr44CB77yI44Gq44KL44G544GP57Ch5Y2Y44Gq77yJ5qSc57Si5paH5a2X5YiX44KS5YWl44KM44Gm44GP44Gg44GV44GE44CC77yJCgpgYGB7ciBjYWNoZT1UUlVFfQpXRElzZWFyY2goc3RyaW5nID0gIiIsIGZpZWxkID0gIm5hbWUiLCBzaG9ydCA9IFRSVUUsIGNhY2hlID0gTlVMTCkKYGBgCgpJbmRpY2F0b3Ig44Gn5qSc57Si77yIIiIg44Gu6ZaT44Gr44CB6Kq/44G544Gf44GEIGluZGljYXRvciDjgpLlhaXjgozjgabjgY/jgaDjgZXjgYTjgILvvIkKCmBgYHtyIGNhY2hlPVRSVUV9CldESXNlYXJjaChzdHJpbmcgPSAiIiwgZmllbGQgPSAiaW5kaWNhdG9yIiwgc2hvcnQgPSBUUlVFLCBjYWNoZSA9IE5VTEwpCmBgYAoKIyMjIOips+OBl+OBhOaDheWgseOCkuW+l+OCi+OBq+OBrwoKYHNob3J0ID0gRkFMU0VgIOOBqOOBl+OBvuOBmeOAguaZgumWk+OBjOOBi+OBi+OCi+OBruOBp+OAgeaknOe0ouOBr+OAgUluZGljYXRvciDjgajjgIHlkI3liY3jgarjganjga7mg4XloLHjgpLjgoLjgaPjgZ/jg5XjgqHjgqTjg6vjgpLmiYvlhYPjgavmjIHjgaPjgabjgYrjgY/jgZPjgajjgavjgZfjgb7jgZnjgIIKCmBgYHtyIGNhY2hlPVRSVUUsIGV2YWw9RkFMU0V9CndkaV9jYWNoZSA8LSBXREljYWNoZSgpCmBgYApgYGB7ciBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQp3cml0ZV9yZHMod2RpX2NhY2hlLCAiLi9kYXRhL3dkaV9jYWNoZS5SRGF0YSIpCmBgYApgYGB7ciBlY2hvPUZBTFNFfQp3ZGlfY2FjaGUgPC0gcmVhZF9yZHMoIi4vZGF0YS93ZGlfY2FjaGUuUkRhdGEiKQpgYGAKCgrlj7PkuIrjga7nqpPmnqDvvIhwYW5l77yJ44GL44KJ44CBYHdkaV9jYWNoZWAg44KS5o6i44GX44Gm44CB5Lit6Lqr44KS6KaL44Gm44G/44G+44GX44KH44GG44CCc2VyaWVzIOOBqOOAgWNvdW50cnkg44Gu5LqM44Gk44Gu44OH44O844K/44O744OV44Os44O844Og44GL44KJ44Gq44Gj44Gm44GE44KL44Oq44K544OI44Gn44GZ44CC5LiJ6KeS5Y2w44KE44CB5Y+z44GL44KJ5LqM55Wq55uu44Gu5be754mp44Gu44KI44GG44Gq44Ki44Kk44Kz44Oz44KS44Kv44Oq44OD44Kv44GZ44KL44Go5Lit6Lqr44GM6KaL44GI44G+44GZ44CCCiAgCiMjIyDmpJzntKLkvosgM++8iFdESeWQje+8iQoKYGBge3J9CldESXNlYXJjaChzdHJpbmcgPSAiQ1BJIFByaWNlIiwgZmllbGQgPSAibmFtZSIsIHNob3J0ID0gRkFMU0UsIGNhY2hlID0gd2RpX2NhY2hlKQpgYGAKCi0gQ1BUT1ROU1hOOiBDUEkgUHJpY2UsIG5vbWluYWwKICAtIFRoZSBjb25zdW1lciBwcmljZSBpbmRleCByZWZsZWN0cyB0aGUgY2hhbmdlIGluIHByaWNlcyBmb3IgdGhlIGF2ZXJhZ2UgY29uc3VtZXIgb2YgYSBjb25zdGFudCBiYXNrZXQgb2YgY29uc3VtZXIgZ29vZHMuIERhdGEgaXMgbm90IHNlYXNvbmFsbHkgYWRqdXN0ZWQuCgojIyMg5qSc57Si5L6LIDTvvIhXREnvvIkKCmBgYHtyfQpXRElzZWFyY2goc3RyaW5nID0gIk5ZLkdEUC5NS1RQLktELlpHIiwgZmllbGQgPSAiaW5kaWNhdG9yIiwgc2hvcnQgPSBGQUxTRSwgY2FjaGUgPSB3ZGlfY2FjaGUpCmBgYAoKICAKIyMjIOe3tOe/kiAyIC0g5qSc57Si77yIbG9uZyB3LyBjYWNoZe+8iQoKYHN0cmluZ2Ag44Go44CBYGZpZWxkYCDjgpLjgIHjgbXjgZ/jgaTjgajjgoLlhaXjgozjgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyIGV2YWw9RkFMU0V9CldESXNlYXJjaChzdHJpbmcgPSAiIiwgZmllbGQgPSAiIiwgc2hvcnQgPSBGQUxTRSwgY2FjaGUgPSB3ZGlfY2FjaGUpCmBgYAoKIyMg5oyH5qiZIFdESSDjg4fjg7zjgr/jga7jg4Djgqbjg7Pjg63jg7zjg4kKCkluZGljYXRvciDjgYzmsbrjgb7jgaPjgZ/jgonjgIHjg4Djgqbjg7Pjg63jg7zjg4njgZfjgb7jgZnjgIIKCuWPs+S4i+OBruOAgUhlbHAgVGFiIOOBqyBXREkg44Go5YWl44KM44KL44Go44CB5L2/44GE5pa544KC44KP44GL44KK44G+44GZ44CCCgpgYGB7ciBldmFsPUZBTFNFfQo/V0RJCmBgYAogIAojIyMg44OA44Km44Oz44Ot44O844OJ5L6LIDEtMQoKYGBge3IgY2FjaGU9VFJVRX0KZGZfZ2RwMSA8LSBXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSAiTlkuR0RQLk1LVFAuQ0QiKQpkZl9nZHAxCmBgYAoKICAKIyMjIOODgOOCpuODs+ODreODvOODieS+iyAxLTIKCmBgYHtyIGNhY2hlPVRSVUV9CmRmX2dkcDIgPC0gV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhnZHAgPSAiTlkuR0RQLk1LVFAuQ0QiKSkKZGZfZ2RwMgpgYGAKCiAgCiMjIyDjg4Djgqbjg7Pjg63jg7zjg4nkvosgMS0zCgpgYGB7ciBjYWNoZT1UUlVFfQpkZl9nZHAzIDwtIFdESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoZ2RwID0gIk5ZLkdEUC5NS1RQLkNEIiksIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkKZGZfZ2RwMwpgYGAKCiAgCiMjIyDjg4Djgqbjg7Pjg63jg7zjg4nkvosgMS00CgpgYGB7ciBjYWNoZT1UUlVFfQpkZl9nZHA0IDwtIFdESShjb3VudHJ5ID0gYygiQ04iLCJHQiIsIkpQIiwiSU4iLCJVUyIsIkRFIiksIGluZGljYXRvciA9IGMoZ2RwID0gIk5ZLkdEUC5NS1RQLkNEIiksIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkKZGZfZ2RwNApgYGAKCiMjIyMg44OA44Km44Oz44Ot44O844OJ5L6LIDItMQoKKiBOWS5HRFAuREVGTC5LRC5aRzogSW5mbGF0aW9uLCBHRFAgZGVmbGF0b3IgKGFubnVhbCAlKQoqIENQVE9UTlNYTjogQ1BJIFByaWNlLCBub21pbmFsCgpgYGB7ciBjYWNoZT1UUlVFfQpkZl9nZHAyMSA8LSBXREkoY291bnRyeSA9ICJhbGwiLCAKICAgICAgICAgICAgICAgIGluZGljYXRvciA9IGMoZ2RwX2RlZmxhdG9yID0gIk5ZLkdEUC5ERUZMLktELlpHIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaV9wcmljZSA9ICJDUFRPVE5TWE4iKSwgCiAgICAgICAgICAgICAgICBleHRyYT1UUlVFLCBjYWNoZT13ZGlfY2FjaGUpCmRmX2dkcDIxCmBgYAoKYGBge3J9CnN0cihkZl9nZHAyMSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShkZl9nZHAyMSkKYGBgCgrlj7PkuIrjga7nqpPmnqDjga7jgIFFbnZpcm9ubWVudCDjgoLopovjgabjgb/jgb7jgZfjgofjgYbjgIIKCgojIyDlj6/oppbljJYgVmlzdWFsaXphdGlvbgoK44Kw44Op44OV77yIQ2hhcnTvvInjgpLmj4/jgYTjgaboppbopprljJbjgZfjgojjgYYKCiMjIyDjgrDjg6njg5UgMQoKYGBge3J9CmRmX2dkcDQgJT4lIGdncGxvdChhZXMoeWVhciwgZ2RwLCBjb2w9Y291bnRyeSkpICsgZ2VvbV9saW5lKCkKYGBgCgojIyMg44Kw44Op44OVIDIKCmBgYHtyfQpkZl9nZHA0ICU+JSBkcm9wX25hKGdkcCkgJT4lIAogIGdncGxvdChhZXMoeWVhciwgZ2RwLCBjb2w9Y291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiV0RJIC0gTlkuR0RQLk1LVFAuQ0Q6ICIsICJnZHAiKSkKYGBgCgojIyMg44OG44Oz44OX44Os44O844OIIFRlbXBsYXRlcwoKIyMjIyDkuIDjgaTjga7lm73jgavjgaTjgYTjgabjga7jgIHkuIDjgaTjga7mjIfmqJnvvIhXREnvvInjgajjgIHjgZ3jga7nlaXnp7DjgYvjgonjgIHmipjnt5rjgrDjg6njg5XjgpLkvZzmiJAKCkxpbmUgUGxvdCB3aXRoIG9uZSBpbmRpY2F0b3Igd2l0aCBhYmJyZXZpYXRpb24gYW5kIG9uZSBjb3VudHJ5CgpgYGB7ciBjYWNoZT1UUlVFfQpjaG9zZW5faW5kaWNhdG9yIDwtICJTTC5VRU0uVE9UTC5ORS5aUyIKc2hvcnRfbmFtZSA8LSAidW5lbXBsb3ltZW50IgpjaG9zZW5fY291bnRyeSA8LSAiVW5pdGVkIFN0YXRlcyIKV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhzaG9ydF9uYW1lID0gY2hvc2VuX2luZGljYXRvciksIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkgJT4lCiAgZmlsdGVyKGNvdW50cnkgPT0gY2hvc2VuX2NvdW50cnkpICU+JSAKICBnZ3Bsb3QoYWVzKHllYXIsIHNob3J0X25hbWUpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yLCAiOiAiLCBzaG9ydF9uYW1lLCAiIC0gIiwgY2hvc2VuX2NvdW50cnkpLAogICAgICAgeSA9IHNob3J0X25hbWUpCmBgYAoKIyMjIyDkuIDjgaTjga7lm73jgavjgaTjgYTjgabjga7jgIHkuIDjgaTjga7mjIfmqJnvvIhXREnvvInjgYvjgonjgIHmipjnt5rjgrDjg6njg5XjgpLkvZzmiJAKCkxpbmUgUGxvdCB3aXRoIG9uZSBpbmRpY2F0b3IgYW5kIG9uZSBjb3VudHJ5CgpgYGB7ciBjYWNoZT1UUlVFfQpjaG9zZW5faW5kaWNhdG9yIDwtICJTTC5VRU0uVE9UTC5ORS5aUyIKY2hvc2VuX2NvdW50cnkgPC0gIlVuaXRlZCBTdGF0ZXMiCldESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoY2hvc2VuX2luZGljYXRvciA9IGNob3Nlbl9pbmRpY2F0b3IpLCAKICAgIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkgJT4lCiAgZmlsdGVyKGNvdW50cnkgPT0gY2hvc2VuX2NvdW50cnkpICU+JSAKICBnZ3Bsb3QoYWVzKHllYXIsIGNob3Nlbl9pbmRpY2F0b3IpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yLCAiIC0gIiwgY2hvc2VuX2NvdW50cnkpLCAKICAgICAgIHkgPSBjaG9zZW5faW5kaWNhdG9yKQpgYGAKCiMjIyMg44GE44GP44Gk44GL44Gu5Zu944Gr44Gk44GE44Gm44Gu44CB5LiA44Gk44Gu5oyH5qiZ77yIV0RJ77yJ44Go44CB44Gd44Gu55Wl56ew44GL44KJ44CB5oqY57ea44Kw44Op44OV44KS5L2c5oiQCgpMaW5lIFBsb3Qgd2l0aCBvbmUgaW5kaWNhdG9yIHdpdGggYWJicmV2aWF0aW9uIGFuZCBzZXZlcmFsIGNvdW50cmllcwoKYGBge3IgY2FjaGU9VFJVRX0KY2hvc2VuX2luZGljYXRvciA8LSAiU0wuVUVNLlRPVEwuTkUuWlMiCnNob3J0X25hbWUgPC0gInVuZW1wbG95bWVudCIKY2hvc2VuX2NvdW50cmllcyA8LSBjKCJVbml0ZWQgU3RhdGVzIiwiVW5pdGVkIEtpbmdkb20iLCAiSmFwYW4iKQpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKHNob3J0X25hbWUgPSBjaG9zZW5faW5kaWNhdG9yKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUgZHJvcF9uYShzaG9ydF9uYW1lKSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjaG9zZW5fY291bnRyaWVzKSAlPiUgCiAgZ2dwbG90KGFlcyh5ZWFyLCBzaG9ydF9uYW1lLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgIiwgY2hvc2VuX2luZGljYXRvciwgIjogIiwgc2hvcnRfbmFtZSksIHkgPSBzaG9ydF9uYW1lKQpgYGAKCgojIyMjIOS4gOOBpOOBruWbveOBq+OBpOOBhOOBpuOBruOAgeS6jOOBpOOBruaMh+aome+8iFdESe+8ieOBqOOAgeOBneOBrueVpeensOOBi+OCieOAgeaKmOe3muOCsOODqeODleOCkuS9nOaIkAoKTGluZSBQbG90IHdpdGggdHdvIGluZGljYXRvcnMgd2l0aCBhYmJyZXZpYXRpb24gYW5kIG9uZSBjb3VudHJ5CgpgYGB7ciBjYWNoZT1UUlVFfQpjaG9zZW5faW5kaWNhdG9yXzEgPC0gIk5ZLkdEUC5ERUZMLktELlpHIgpzaG9ydF9uYW1lXzEgPC0gImdkcF9kZWZsYXRvciIKY2hvc2VuX2luZGljYXRvcl8yIDwtICJDUFRPVFNBWE5aR1kiCnNob3J0X25hbWVfMiA8LSAiY3BpX3ByaWNlIgpjaG9zZW5fY291bnRyeSA8LSAiVW5pdGVkIFN0YXRlcyIKV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhzaG9ydF9uYW1lXzEgPSBjaG9zZW5faW5kaWNhdG9yXzEsIHNob3J0X25hbWVfMiA9IGNob3Nlbl9pbmRpY2F0b3JfMiksIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkgJT4lIAogIGZpbHRlcihjb3VudHJ5ID09IGNob3Nlbl9jb3VudHJ5KSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCBuYW1lc190byA9ICJjbGFzcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSBkcm9wX25hKHZhbHVlKSAlPiUKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjbGFzcykpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiV0RJICIsIGNob3Nlbl9pbmRpY2F0b3JfMSwgIjogIiwgc2hvcnRfbmFtZV8xLCAiXG4iLCBjaG9zZW5faW5kaWNhdG9yXzIsICI6ICIsIHNob3J0X25hbWVfMiwgIiAtICIsIGNob3Nlbl9jb3VudHJ5KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKHNob3J0X25hbWVfMSwgc2hvcnRfbmFtZV8yKSwgdmFsdWVzID0gc2NhbGVzOjpodWVfcGFsKCkoMikpCmBgYAoKYGBge3IgY2FjaGU9VFJVRX0KY2hvc2VuX2luZGljYXRvcl8xIDwtICJTTC5UTEYuQ0FDVC5NQS5ORS5aUyIKc2hvcnRfbmFtZV8xIDwtICJtYWxlIgpjaG9zZW5faW5kaWNhdG9yXzIgPC0gIlNMLlRMRi5DQUNULkZFLk5FLlpTIgpzaG9ydF9uYW1lXzIgPC0gImZlbWFsZSIKY2hvc2VuX2NvdW50cnkgPC0gIlVuaXRlZCBTdGF0ZXMiCldESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoc2hvcnRfbmFtZV8xID0gY2hvc2VuX2luZGljYXRvcl8xLCBzaG9ydF9uYW1lXzIgPSBjaG9zZW5faW5kaWNhdG9yXzIpLCBleHRyYT1UUlVFLCBjYWNoZT13ZGlfY2FjaGUpICU+JSAKICBmaWx0ZXIoY291bnRyeSA9PSBjaG9zZW5fY291bnRyeSkgJT4lIAogIHBpdm90X2xvbmdlcihjKHNob3J0X25hbWVfMSwgc2hvcnRfbmFtZV8yKSwgbmFtZXNfdG8gPSAiY2xhc3MiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUgZHJvcF9uYSh2YWx1ZSkgJT4lCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY2xhc3MpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yXzEsICI6ICIsIHNob3J0X25hbWVfMSwgIlxuIiwgY2hvc2VuX2luZGljYXRvcl8yLCAiOiAiLCBzaG9ydF9uYW1lXzIsICIgLSAiLCBjaG9zZW5fY291bnRyeSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYyhzaG9ydF9uYW1lXzEsIHNob3J0X25hbWVfMiksIHZhbHVlcyA9IHNjYWxlczo6aHVlX3BhbCgpKDIpKQpgYGAKCiMjIyMg44GE44GP44Gk44GL44Gu5Zu944Gr44Gk44GE44Gm44Gu44CB5LqM44Gk44Gu5oyH5qiZ77yIV0RJ77yJ44Go44CB44Gd44Gu55Wl56ew44GL44KJ44CB5oqY57ea44Kw44Op44OV44KS5L2c5oiQCgpMaW5lIFBsb3Qgd2l0aCB0d28gaW5kaWNhdG9ycyB3aXRoIGFiYnJldmlhdGlvbiBhbmQgc2V2ZXJhbCBjb3VudHJpZXMKCmBgYHtyIGNhY2hlPVRSVUV9CmNob3Nlbl9pbmRpY2F0b3JfMSA8LSAiTlkuR0RQLkRFRkwuS0QuWkciCnNob3J0X25hbWVfMSA8LSAiZ2RwX2RlZmxhdG9yIgpjaG9zZW5faW5kaWNhdG9yXzIgPC0gIkNQVE9UU0FYTlpHWSIKc2hvcnRfbmFtZV8yIDwtICJjcGlfcHJpY2UiCmNob3Nlbl9jb3VudHJpZXMgPC0gYygiVW5pdGVkIFN0YXRlcyIsICJGcmFuY2UiLCAiSmFwYW4iKQpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKHNob3J0X25hbWVfMSA9IGNob3Nlbl9pbmRpY2F0b3JfMSwgc2hvcnRfbmFtZV8yID0gY2hvc2VuX2luZGljYXRvcl8yKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjaG9zZW5fY291bnRyaWVzKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCBuYW1lc190byA9ICJjbGFzcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSBkcm9wX25hKHZhbHVlKSAlPiUKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBsaW5ldHlwZSA9IGNsYXNzLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgIiwgY2hvc2VuX2luZGljYXRvcl8xLCAiOiAiLCBzaG9ydF9uYW1lXzEsICJcbiIsIGNob3Nlbl9pbmRpY2F0b3JfMiwgIjogIiwgc2hvcnRfbmFtZV8yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChsYWJlbHMgPSBjKHNob3J0X25hbWVfMSwgc2hvcnRfbmFtZV8yKSwgdmFsdWVzID0gYygic29saWQiLCAiZGFzaGVkIikpCmBgYAoKCmBgYHtyIGNhY2hlPVRSVUV9CmNob3Nlbl9pbmRpY2F0b3JfMSA8LSAiU0wuVExGLkNBQ1QuTUEuTkUuWlMiCnNob3J0X25hbWVfMSA8LSAibWFsZSIKY2hvc2VuX2luZGljYXRvcl8yIDwtICJTTC5UTEYuQ0FDVC5GRS5ORS5aUyIKc2hvcnRfbmFtZV8yIDwtICJmZW1hbGUiCmNob3Nlbl9jb3VudHJpZXMgPC0gYygiVW5pdGVkIFN0YXRlcyIsICJGcmFuY2UiLCAiSmFwYW4iKQpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKHNob3J0X25hbWVfMSA9IGNob3Nlbl9pbmRpY2F0b3JfMSwgc2hvcnRfbmFtZV8yID0gY2hvc2VuX2luZGljYXRvcl8yKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjaG9zZW5fY291bnRyaWVzKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCBuYW1lc190byA9ICJjbGFzcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSBkcm9wX25hKHZhbHVlKSAlPiUKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBsaW5ldHlwZSA9IGNsYXNzLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgIiwgY2hvc2VuX2luZGljYXRvcl8xLCAiOiAiLCBzaG9ydF9uYW1lXzEsICJcbiIsIGNob3Nlbl9pbmRpY2F0b3JfMiwgIjogIiwgc2hvcnRfbmFtZV8yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChsYWJlbHMgPSBjKHNob3J0X25hbWVfMSwgc2hvcnRfbmFtZV8yKSwgdmFsdWVzID0gYygic29saWQiLCAiZGFzaGVkIikpCmBgYAoKCiMjIOiqsumhjOOAgEFzc2lnbm1lbnQKCuS4iuOBruODhuODs+ODl+ODrOODvOODiOOCkuOCs+ODlOODvOOBl+OBpuOAgeS4i+OBq+iyvOOCiuS7mOOBkeOAgeaMh+aomSBgaW5kaWNhdG9yYCDjgajjgIHnlaXnp7AgYHNob3J0X25hbWVgIOOBqOOAgeOBhOOBj+OBpOOBi+OBruWbveWQjSBgY2hvc2VuX2NvdW50cmllc2Ag44KS44CB5YWl44KM5pu/44GI44Gm44CB6Kmm44GX44Gm44G/44Gm44GP44Gg44GV44GE44CCCgojIyMg5a2m55Sf44GM6YG45oqe44GX44Gf5LiW55WM6ZaL55m65oyH5qiZ77yIV0RJ77yJ44Gu5L6LCgoxOeS6uuOBruWPl+ism+eUn+OBq+OAgeiIiOWRs+OBruOBguOCi+aMh+aomeOCkumBuOOCk+OBp+OAgeODhuODs+ODl+ODrOODvOODiOOCkuS9v+OBo+OBpuOAgeWPr+imluWMluOCkuOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAgeOBqOiqsumhjOOBq+WHuuOBl+OBn+aZguOBq+OAgeiqv+OBueOBpuOBj+OCjOOBn+OCguOBruOBp+OBmeOAggoKYGBge3J9CnVybF9pbmRpY2F0b3JzIDwtICJodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2RhdGEvaW5kaWNhdG9ycy5jc3YiCmRmX2luZGljYXRvcnMgPC0gcmVhZF9jc3YodXJsX2luZGljYXRvcnMpICU+JSBsZWZ0X2pvaW4od2RpX2NhY2hlJHNlcmllcykKd3JpdGVfY3N2KGRmX2luZGljYXRvcnMsICIuL2RhdGEvaW5kaWNhdG9ycy5jc3YiKQpkZl9pbmRpY2F0b3JzICU+JSBkaXN0aW5jdChpbmRpY2F0b3IsIG5hbWUpICU+JSBhcnJhbmdlKGluZGljYXRvcikKYGBgCgroh6rliIbjgafoqrLpoYzjgpLogIPjgYjjgIHjg4fjg7zjgr/jgpLpgbjjgbnjgovjgZPjgajjga/jgIHjgajjgabjgoLlpKfliIfjgaDjgajjgYTjgYbjgZPjgajjgaDjgajmgJ3jgYTjgb7jgZnjgIIKCiMg5o6i57Si55qE44OH44O844K/6Kej5p6Q44CARXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyAoRURBKQoKIyMg5o6i57Si55qE44OH44O844K/6Kej5p6Q44Go44Gv77yfIChbUG9zaXQgUHJpbWVyc10oaHR0cHM6Ly9wb3NpdC5jbG91ZC9sZWFybi9wcmltZXJzLzMuMSkpCgoxLiBFREHjga/jgIHjg4fjg7zjgr/jgYzkvZXjgpLoqp7jgaPjgabjgYTjgovjgYvjgpLnkIbop6PjgZnjgovjgZ/jgoHjga7lj43lvqnnmoTjgarjgrXjgqTjgq/jg6vjgafjgZnjgIIKCjIuIOOBvuOBmuOAgeODh+ODvOOCv+OBq+mWouOBmeOCi+WVj+OBhOOCkuS9nOaIkOOBl+OBvuOBmeOAggoKMy4g44OH44O844K/44Gu5Y+v6KaW5YyW44CB5aSJ5o+b44CB44Oi44OH44Oq44Oz44Kw44KS6KGM44GE44CB562U44GI44KS5o6i44GX44G+44GZ44CCCgrlrabnv5LjgZfjgZ/jgZPjgajjgpLmtLvnlKjjgZfjgabjgIHllY/jgYTjgpLkv67mraPjgZfjgZ/jgorjgIHmlrDjgZfjgYTllY/jgYTjgpLogIPjgYjjgZ/jgorjgZfjgb7jgZnjgILjgZ3jgZfjgabjgIHjgZPjga7jgrXjgqTjgq/jg6vjgpLnubDjgorov5TjgZfjgabjgYTjgY3jgb7jgZnjgIIKCkVEQeOBr+ODh+ODvOOCv+WIhuaekOOBq+OBiuOBhOOBpumHjeimgeOBquW9ueWJsuOCkuaenOOBn+OBl+OBvuOBmeOAguOBvuOBn+OAgeODh+ODvOOCv+OBruWTgeizquOCkuS/neiovOOBmeOCi+OBn+OCgeOBq+OAgeODh+ODvOOCv+OBruizquOCkueiuuiqjeOBmeOCi+OBn+OCgeOBq+S9v+eUqOOBmeOCi+OBk+OBqOOCguOBp+OBjeOBvuOBmeOAggoKIVtSNERTIOOBi+OCieOBruOCpOODoeODvOOCuF0oaHR0cHM6Ly9kMzN3dWJyZmtpMGw2OC5jbG91ZGZyb250Lm5ldC83OTVjMDM5YmEyNTIwNDU1ZDgzM2I0MDM0YmVmYzhjZjM2MGE3MGJhLzU1OGE1L2RpYWdyYW1zL2RhdGEtc2NpZW5jZS1leHBsb3JlLnBuZykKCuWVj+OBhOOCkuOCguOBoeODh+ODvOOCv+OCkuWPluW+l+OBl+OAgeimluimmuWMluOBquOBqeOCkumAmuOBl+OBpuOAgeODh+ODvOOCv+OCkueQhuino+OBl+OAgeOBleOCieOBq+WVj+OBhOOCkua3seOCgeOCi+OCteOCpOOCr+ODq+OBjOOAgeODh+ODvOOCv+OCteOCpOOCqOODs+OCueOBruaguOOBp+OBr+OBquOBhOOBi+OBqOaAneOBhOOBvuOBmeOAggoKIyMg44OH44O844K/44Gu5Y+W5b6X44O76Kqt44G/6L6844G/IC0gSW1wb3J0aW5nIERhdGEKCuOCueOCv+ODvOODiOOBr+OAgeacrOadpeOBr+OAgeODh+ODvOOCv+OBruS9nOaIkOODu+aOoue0ouOBp+OBmeOBjOOAgeOBmeOBp+OBq+OAgeWIhuaekOOBl+OBn+OBhOODh+ODvOOCv+OBr+OBmeOBp+OBq+OBguOCi+OBqOOBl+OBpuipseOCkumAsuOCgeOBvuOBmeOAguOBvuOBmuOBr+OAgWBkYXRhYCDjg5Xjgqnjg6vjg4DvvIhkaXJlY3RvcnnvvInjgpLkvZzmiJDjgZfjgabjgYrjgY/jgajoia/jgYTjgILlj7PkuIvjga7nqpPmnqDjga4gRmlsZXMg44K/44OW44GL44KJ44CBTmV3IEZvbGRlciDjgafkvZzmiJDjgZfjgabjgoLjgojjgYTjgIIKCmBgYHtyIGV2YWw9RkFMU0V9CmRpci5jcmVhdGUoIi4vZGF0YSIpCmBgYAoKCuODh+ODvOOCv+OBruWPluW+l+ODu+iqreOBv+i+vOOBv+OCkuOAgeWbm+OBpOOBruaWueazleOBq+WIhuOBkeOBpuiqrOaYjuOBl+OBvuOBmeOAggoKMS4g44OR44OD44Kx44O844K444Gu5Yip55SoCiAgLSDkvovvvJpXREkg44Gq44Gp44CC5L2V5bqm44KC44CB44OA44Km44Oz44Ot44O844OJ44GX44Gq44GP44Gm6Imv44GE44KI44GE44Gr44CB5pu444GN5Ye644GX44Gm44GK44GN44CBMiDjgpLkvb/jgYbjgajjgojjgYTjgIJgd3JpdGUoZGZfbmFtZSwgIi4vZGF0YS9uYW1lLmNzdiIpYAoyLiDjgrPjg7Pjg5Tjg6Xjg7zjgr/kuIrjgavjgYLjgosgQ1NWIOOBquOBqeOBruODhuOCreOCueODiOODleOCoeOCpOODq+OCkuiqreOBv+i+vOOCgAogIC0g5L6L77yaYGRmX25hbWUgPC0gcmVhZF9jc3YoIi4vZGF0YS9maWxlX25hbWUuY3N2IilgCjMuIOOCpOODs+OCv+ODvOODjeODg+ODiOS4iuOBruODh+ODvOOCv+OBruOCouODieODrOOCue+8iFVSTO+8ieOCkuS9v+OBo+OBpuOAgUNTViDjgarjganjga7jg4bjgq3jgrnjg4jjg5XjgqHjgqTjg6vjgpLoqq3jgb/ovrzjgoDjgIIKICAtIOS+i++8mmBkZl9uYW1lIDwtIHJlYWRfY3N2KHVybF9vZl9hX2NzdilgCjQuIOOCs+ODs+ODlOODpeODvOOCv+S4iuOBq+OBguOCi+OAgUV4Y2VsIOODleOCoeOCpOODq+OBquOBqeOBruODh+OCuOOCv+ODq+ODleOCoeOCpOODq+OCkuiqreOBv+i+vOOCgOOAguOBvuOBmuOAgWBsaWJyYXJ5KHJlYWR4bClg44CCCiAgLSDkvovvvJpgZGZfbmFtZSA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvZmlsZV9uYW1lLnhsc3giKWAKNS4g44K144Kk44OI44GL44KJ44OA44Km44Oz44Ot44O844OJ44GX44Gm44CBUHJvamVjdCDjga7jg4fjg7zjgr/jg5Xjgqnjg6vjg4Djgavnp7vjgZnjgILjgb7jgZ/jga/jgIHjg4fjg7zjgr/jga7jgqLjg4njg6zjgrnvvIhVUkzvvInjgYzjgo/jgYvjgaPjgabjgYTjgozjgbDjgIHnm7TmjqXjg4Djgqbjg7Pjg63jg7zjg4njgIIKICAtIOS+i++8mmBkb3dubG9hZC5maWxlKHVybF9vZl9hX2RhdGEsIGRlc3RmaWxlID0gIi4vZGF0YS9kYXRhX25hbWUiKQo2LiDjgq/jg6rjg4Pjg5fjg5zjg7zjg4njgavjgrPjg5Tjg7zjgZfjgaboqq3jgb/ovrzjgoDjgIIKICAtIOS+i++8mmBkZl9uYW1lIDwtIHJlYWRfZGVsaW0oY2xpcGJvYXJkKCkpYAoKIyMgYFdESWNhY2hlKClgIOOBruaJseOBhAoK5LqM44Gk44Gu44CB44OV44Kh44Kk44Or44GM5LiA44Gk44Gr44Gq44Gj44Gf44CB44Oq44K544OI44Gn44GC44KL44Gf44KB44CB6YGV44Gj44Gm5ZG95Luk44KS5L2/44GE44G+44GZ44CCCgpgYGB7cn0Kd2RpX2NhY2hlIDwtIFdESWNhY2hlKCkKd3JpdGVfcmRzKHdkaV9jYWNoZSwgIi4vZGF0YS93ZGlfY2FjaGUuUkRhdGEiKQpgYGAKCmBgYHtyfQp3ZGlfY2FjaGUgPC0gcmVhZF9yZHMoIi4vZGF0YS93ZGlfY2FjaGUuUkRhdGEiKQpgYGAKCiMjIFdESSDjgafjga7kvosKCmBgYHtyIGNhY2hlPVRSVUV9CmRmX21pbGl0YXJ5NiA8LSBXREkoY291bnRyeSA9IGMoIkNOIiwiR0IiLCJKUCIsIklOIiwiVVMiLCJERSIpLCBpbmRpY2F0b3IgPSBjKG1pbGl0YXJ5ID0gIk1TLk1JTC5YUE5ELkNEIiksIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkKZGZfbWlsaXRhcnk2ICU+JSBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgYXJyYW5nZShkZXNjKG1pbGl0YXJ5KSkKYGBgCgpgYGB7cn0KZGZfbWlsaXRhcnk2ICU+JSBkcm9wX25hKG1pbGl0YXJ5KSAlPiUKICBnZ3Bsb3QoYWVzKHllYXIsIG1pbGl0YXJ5LCBjb2w9aXNvMmMpKSArIGdlb21fbGluZSgpCmBgYAoKYGBge3J9CmRmX21pbGl0YXJ5IDwtIFdESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMobWlsaXRhcnkgPSAiTVMuTUlMLlhQTkQuQ0QiKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKQpgYGAKCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpkZl9taWxpdGFyeSAlPiUgZHJvcF9uYShtaWxpdGFyeSkgJT4lIGZpbHRlcih5ZWFyPT0yMDIxLCBpbmNvbWU9PSJIaWdoIGluY29tZSIsIG1pbGl0YXJ5ID4wKSAlPiUKICBnZ3Bsb3QoYWVzKG1pbGl0YXJ5LCBmaWxsPXJlZ2lvbikpICsgZ2VvbV9kZW5zaXR5KCkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1NDEyMzU1MTcwMiwgY29sPSJyZWQiKSArIHNjYWxlX3hfbG9nMTAoKSArIGdlb21fbGFiZWwoeD0xMS4xLCB5PTI1LCBsYWJlbCA9ICJKYXBhbiIpICsgZmFjZXRfd3JhcCh+cmVnaW9uKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyBsYWJzKHRpdGxlPSJNaWxpdGFyeSBFeHBlbnNlcyBpbiBoaWdoIGluY29tZSBjb3VudHJpZXMiKQpgYGAKCmBgYHtyfQpkZl9taWxpdGFyeV9nZHAgPC0gV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhtaWxpdGFyeV9nZHAgPSAiTVMuTUlMLlhQTkQuR0QuWlMiKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKQpkZl9taWxpdGFyeV9nZHAgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIsIHllYXI9PTIwMjEpCmBgYAoKYGBge3J9CmRmX21pbGl0YXJ5X2dkcCAlPiUgZHJvcF9uYShtaWxpdGFyeV9nZHApICU+JSBmaWx0ZXIoeWVhcj09MjAyMSwgaW5jb21lIT0iQWdncmVnYXRlcyIpICU+JQogIGdncGxvdChhZXMobWlsaXRhcnlfZ2RwLCBmaWxsPWluY29tZSkpICsgZ2VvbV9kZW5zaXR5KGJpbndpZHRoID0gMC4yLCBhbHBoYT0wLjUpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMiwgY29sPSJyZWQiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEsIGNvbD0iYmx1ZSIpICsgZmFjZXRfd3JhcCh+aW5jb21lKQpgYGAKCgojIyDlm73pmpvmqZ/plqLjga7jg4fjg7zjgr8gSW50ZXJuYXRpb25hbCBJbnN0aXR1dGlvbnMnIERhdGEKCi0gV29ybGQgQmFuazogaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcKLSBVTiBEYXRhOiBodHRwczovL2RhdGEudW4ub3JnCi0gT0VDRDogaHR0cHM6Ly9kYXRhLm9lY2Qub3JnLwoKYGBge3J9CnVybF91bl9wb3AgPC0gImh0dHBzOi8vZGF0YS51bi5vcmcvX0RvY3MvU1lCL0NTVi9TWUI2NV8xXzIwMjIwOV9Qb3B1bGF0aW9uLCUyMFN1cmZhY2UlMjBBcmVhJTIwYW5kJTIwRGVuc2l0eS5jc3YiCmRmX3VuX3BvcDAgPC0gcmVhZF9jc3YodXJsX3VuX3BvcCkKZGZfdW5fcG9wMApgYGAKCmBgYHtyfQp1cmxfdW5fcG9wIDwtICJodHRwczovL2RhdGEudW4ub3JnL19Eb2NzL1NZQi9DU1YvU1lCNjVfMV8yMDIyMDlfUG9wdWxhdGlvbiwlMjBTdXJmYWNlJTIwQXJlYSUyMGFuZCUyMERlbnNpdHkuY3N2IgpkZl91bl9wb3AgPC0gcmVhZF9jc3YodXJsX3VuX3BvcCwgc2tpcD0xKQpkZl91bl9wb3AKYGBgCgpgYGB7cn0KZGZfdW5fcG9wICU+JSBkaXN0aW5jdChgUmVnaW9uL0NvdW50cnkvQXJlYWAsIGAuLi4yYCkKYGBgCgoKYGBge3J9CmRmX3VuX3BvcCAlPiUgZmlsdGVyKGBSZWdpb24vQ291bnRyeS9BcmVhYCAlaW4lIGMoMiwxOSwxNDIsMTUwLDkpLCBTZXJpZXMgPT0gIlBvcHVsYXRpb24gbWlkLXllYXIgZXN0aW1hdGVzIChtaWxsaW9ucykiKSAlPiUKICBnZ3Bsb3QoYWVzKFllYXIsIFZhbHVlLCBmaWxsID0gYC4uLjJgKSkgKyBnZW9tX2FyZWEoY29sPSJibGFjayIpICsKICBsYWJzKHRpdGxlID0gIlBvcHVsYXRpb24gbWlkLXllYXIgZXN0aW1hdGVzIChtaWxsaW9ucykgb2YgdGhlIFdvcmxkIikKYGBgCgoKIyMgT0VDRCBkYXRhCgotIGh0dHBzOi8vZGF0YS5vZWNkLm9yZy8KCiMjIyDkvovvvJrlirTlg43mmYLplpPlvZPjgZ/jgopHRFAKCi0gW+aXpeacrOOBruaZgumWk+W9k+OBn+OCiueUn+eUo+aAp+OBr09FQ0QzOOOCq+WbveS4rTI35L2N77yI5pel5pys55Sf55Sj5oCn5pys6YOo44CM5Yq05YON55Sf55Sj5oCn44Gu5Zu96Zqb5q+U6LyD44CN77yJXShodHRwczovL3d3dy5qY2NpLm9yLmpwL25ld3MvdHJlbmQtYm94LzIwMjIvMTIxOTE1NDcxMy5odG1sKQogIC0gW+WKtOWDjeeUn+eUo+aAp+OBruWbvemam+avlOi8gzIwMjJdKGh0dHBzOi8vd3d3LmpwYy1uZXQuanAvcmVzZWFyY2gvZGV0YWlsLzAwNjE3NC5odG1sKQotIFtQcm9kdWN0aXZpdHkgc3RhdGlzdGljc10oaHR0cHM6Ly93d3cub2VjZC5vcmcvc2RkL3Byb2R1Y3Rpdml0eS1zdGF0cy8pCiAgLSBbUmVhZCBNb3JlOiBJbXByb3ZpbmcgUHJvZHVjdGl2aXR5IE1lYXN1cmVtZW50IFByYWN0aWNlc10oaHR0cHM6Ly93d3cub2VjZC5vcmcvc2RkL3Byb2R1Y3Rpdml0eS1zdGF0cy9pbXByb3ZpbmctcHJvZHVjdGl2aXR5LW1lYXN1cmVtZW50LXByYWN0aWNlcy5odG0pCiAgICAtIFtMZXZlbCBvZiBHRFAgcGVyIGNhcGl0YSBhbmQgcHJvZHVjdGl2aXR5XShodHRwczovL3N0YXRzLm9lY2Qub3JnL0luZGV4LmFzcHg/RGF0YVNldENvZGU9UERCX0xWKQogICAgLSBbR0RQIHBlciBob3VyIHdvcmtlZF0oaHR0cHM6Ly9kYXRhLm9lY2Qub3JnL2xwcmR0eS9nZHAtcGVyLWhvdXItd29ya2VkLmh0bSNpbmRpY2F0b3ItY2hhcnQpCiAgICAKCioq5Yq05YON5pmC6ZaT5b2T44Gf44KKR0RQKioKCuWKtOWDjeaZgumWk+W9k+OBn+OCikdEUOOBr+OAgeWKtOWDjeeUn+eUo+aAp+OBruaMh+aomeOBp+OBguOCi+OAguOBk+OCjOOBr+OAgeWKtOWDjeaKleWFpemHj+OBjOS7luOBrueUn+eUo+imgee0oOOBqOe1hOOBv+WQiOOCj+OBleOCjOOAgeeUn+eUo+ODl+ODreOCu+OCueOBp+OBqeOCjOOBoOOBkeWKueeOh+eahOOBq+WIqeeUqOOBleOCjOOBn+OBi+OCkua4rOWumuOBmeOCi+OCguOBruOBp+OBguOCi+OAguWKtOWDjeaKleWFpemHj+OBr+OAgeeUn+eUo+OBq+W+k+S6i+OBmeOCi+OBmeOBueOBpuOBruS6uuOBrue3j+WKtOWDjeaZgumWk+OBqOOBl+OBpuWumue+qeOBleOCjOOCi+OAguWKtOWDjeeUn+eUo+aAp+OBr+OAgeWKtOWDjeiAheOBruWAi+S6uueahOiDveWKm+OChOWKquWKm+OBruW8t+OBleOBqOOBhOOBo+OBn+WKtOWDjeOBrueUn+eUo+aAp+OCkumDqOWIhueahOOBq+OBl+OBi+WPjeaYoOOBl+OBpuOBhOOBquOBhOOAguOCouOCpuODiOODl+ODg+ODiOaMh+aomeOBqOWKtOWDjeaKleWFpemHj+OBruavlOeOh+OBr+OAgeS7luOBruaKleWFpeeJqe+8iOizh+acrOOAgeS4remWk+aKleWFpeeJqeOAgeaKgOihk+ODu+e1hOe5lOODu+WKueeOh+OBruWkieWMluOAgeimj+aooeOBrue1jOa4iOOBquOBqe+8ieOBruWtmOWcqOOChOWIqeeUqOOBq+Wkp+OBjeOBj+W3puWPs+OBleOCjOOCi+OAguOBk+OBruaMh+aomeOBr+OAgeexs+ODieODq++8iDIwMTDlubTjga7mgZLluLjkvqHmoLzjgYrjgojjgbNQUFDvvInjgYrjgojjgbPmjIfmqJnjgafmuKzlrprjgZXjgozjgabjgYTjgb7jgZnjgIIKCiMjIyMg5pyA5Yid44Gu44K544OG44OD44OXIHstfQoKMS4gW+OCteOCpOODiF0oaHR0cHM6Ly9kYXRhLm9lY2Qub3JnL2xwcmR0eS9nZHAtcGVyLWhvdXItd29ya2VkLmh0bSNpbmRpY2F0b3ItY2hhcnQp44GL44KJ44CBQ1NWIOODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOAggoyLiDjg5fjg63jgrjjgqfjgq/jg4jlhoXjga7jg4fjg7zjgr/moLzntI3jg5Xjgqnjg6vjg4DjgavlhaXjgozjgb7jgZnjgIIiLi9kYXRhLyIKMy4g6Kqt44G/6L6844G/44G+44GZ44CCCgrkuIrjga5b44K144Kk44OIXShodHRwczovL2RhdGEub2VjZC5vcmcvbHByZHR5L2dkcC1wZXItaG91ci13b3JrZWQuaHRtI2luZGljYXRvci1jaGFydCnjgYvjgonjg4fjg7zjgr/vvIhGdWxsIGluZGljYXRvciBkYXRh77yJ44KS44OA44Km44Oz44Ot44O844OJ44GX44Gm44CB44OX44Ot44K444Kn44Kv44OI44GuIGRhdGEg44OV44Kp44Or44OA44O844Gr5YWl44KM44G+44GX44Gf44CCCgpgYGB7cn0KZGZfb2VjZF9wcm9kdWN0aXZpdHkgPC0gcmVhZF9jc3YoIi4vZGF0YS9EUF9MSVZFXzIxMDIyMDIzMTExNzEyMDY1LmNzdiIpCmRmX29lY2RfcHJvZHVjdGl2aXR5CmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjSB7LX0KCuWIl+WQjeOCkueiuuiqjeOBl+OAgeWIl+OBlOOBqOOBq+OAgeODh+ODvOOCv+OCkueiuuiqjQoKYGBge3J9CmNvbG5hbWVzKGRmX29lY2RfcHJvZHVjdGl2aXR5KQpgYGAKCmB1bmlxdWUoKWAg44Gu44GL44Gj44GT44Gu5Lit44Gr44CBYGRmX29lY2RfcHJvZHVjdGl2aXR5JExPQ0FUSU9OYCDjgpLlhaXjgozjgZ/jgoLjga7jgajlkIzjgZjjgoLjga7jgpLlh7rlipvjgZfjgb7jgZnjgILmrKHjgIXjgajjgaTjgaXjgZHjgovjgajjgY3jgavkvr/liKnjgarjga7jgafjgIHjgZPjga7jg5HjgqTjg5cgYCU+JWAg44KS44KP44Gf44GX44Gv44KI44GP5L2/44GE44G+44GZ44CCYHVuaXF1ZShkZl9vZWNkX3Byb2R1Y3Rpdml0eSRMT0NBVElPTilgIOOCguippuOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAggoKCmBgYHtyfQpkZl9vZWNkX3Byb2R1Y3Rpdml0eSRMT0NBVElPTiAlPiUgdW5pcXVlKCkKYGBgCmBgYHtyfQpkZl9vZWNkX3Byb2R1Y3Rpdml0eSRJTkRJQ0FUT1IgJT4lIHVuaXF1ZSgpCmBgYAoKYGBge3J9CmRmX29lY2RfcHJvZHVjdGl2aXR5JFNVQkpFQ1QgJT4lIHVuaXF1ZSgpCmBgYAoKYGBge3J9CmRmX29lY2RfcHJvZHVjdGl2aXR5JE1FQVNVUkUgJT4lIHVuaXF1ZSgpCmBgYAoKYGBge3J9CmRmX29lY2RfcHJvZHVjdGl2aXR5JEZSRVFVRU5DWSAlPiUgdW5pcXVlKCkKYGBgCgpgYGB7cn0KZGZfb2VjZF9wcm9kdWN0aXZpdHkkVElNRSAlPiUgdW5pcXVlKCkKYGBgCgpgYGB7cn0KZGZfb2VjZF9wcm9kdWN0aXZpdHkgJT4lIAogIGZpbHRlcihNRUFTVVJFID09ICJVU0QiLCBUSU1FID09IDIwMjEpICU+JSAjIGZpbHRlcmluZyByb3dzIHdpdGggY29uZGl0aW9ucwogIHNlbGVjdChMT0NBVElPTiwgVmFsdWUpICU+JSAjIHNlbGVjdGluZyBjb2x1bW5zCiAgYXJyYW5nZShkZXNjKFZhbHVlKSkgIyBvcmRlcmluZyB0aGUgcm93cyBpbiB0aGUgZGVzY2VudGluZyBvcmRlciBvZiB0aGUgY29sdW1uIFZhbHVlCmBgYAoKIyMjIOOBhOOBj+OBpOOBi+OBruWcsOWfn+OCkumBuOOCk+OBp+OAgeaKmOe3muOCsOODqeODleOCkuabuOOBhOOBpuOBv+OCi+OAgnstfQoK77yT6KGM55uu44GM44Gq44GE44Go44Gp44GG44Gq44KK44G+44GZ44GL44CCCgpgYGB7cn0KZGZfb2VjZF9wcm9kdWN0aXZpdHkgJT4lIAogIGZpbHRlcihMT0NBVElPTiAlaW4lIGMoIkpQTiIsICJPRUNEIiwgIkctNyIsICJFVTI4IikpICU+JQogIGZpbHRlcihNRUFTVVJFID09ICJVU0QiKSAlPiUgIyBzYW1lIGFzIGFib3ZlIHVwIHRvIHRoaXMgbGluZQogIGdncGxvdChhZXMoeCA9IFRJTUUsIHkgPSBWYWx1ZSwgY29sID0gTE9DQVRJT04pKSArIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZT0iR0RQIHBlciBob3VyIHdvcmtlZCIsICMgYWRkaW5nIHRoZSB0aXRsZSBhbmQgdGhlIHN1YnRpdGxlCiAgICAgICBzdWJ0aXRsZT0iVG90YWwsIDIwMTU9MTAwLCAyMDIxIG9yIGxhdGVzdCBhdmFpbGFibGUiKQpgYGAKCgojIyDnt7Tnv5LvvJrmlZnogrIgRWR1Y2F0aW9uCgrmiJDkurrjga7mlZnogrLjg6zjg5njg6vjgavplqLjgZnjgovjgIHmrKHjga7jgrXjgqTjg4jjgYvjgonjg4fjg7zjgr/jgpLjgajjgaPjgabjgIHoqr/jgbnjgabjgb/jgabjgY/jgaDjgZXjgYTjgIIKCkFkdWx0IGVkdWNhdGlvbiBsZXZlbDogaHR0cHM6Ly9kYXRhLm9lY2Qub3JnL2VkdWF0dC9hZHVsdC1lZHVjYXRpb24tbGV2ZWwuaHRtCgrjg4Djgqbjg7Pjg63jg7zjg4njgZfjgZ/jg5XjgqHjgqTjg6vjga7jg5XjgqHjgqTjg6vlkI3jgYwgYERQX0xJVkVfMjEwMjIwMjMxMjAxMzI2NTQuY3N2YCDjgajlkIzjgZjjgafjgYLjgovjgZPjgajjgpLnorroqo3jgZfjgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyfQpkZl9vZWNkX2VkdWNhdGlvbl9sZXZlbCA8LSByZWFkX2NzdigiLi9kYXRhL0RQX0xJVkVfMjEwMjIwMjMxMjAxMzI2NTQuY3N2IikKZGZfb2VjZF9lZHVjYXRpb25fbGV2ZWwKYGBgCgrkuIrjga7lirTlg43mmYLplpPlvZPjgZ/jgopHRFDjga7kvovjgavnv5LjgaPjgabjgIHjg4fjg7zjgr/jgpLoqr/jgbnjgabjgb/jgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyfQpjb2xuYW1lcyhkZl9vZWNkX2VkdWNhdGlvbl9sZXZlbCkKYGBgCgoKYGBge3J9CmRmX29lY2RfZWR1Y2F0aW9uX2xldmVsJFNVQkpFQ1QgJT4lIHVuaXF1ZSgpCmBgYAoK44GT44KM44KJ44Gv44CB5L2V44KS5oSP5ZGz44GX44Gm44GE44KL44Gu44Gn44GX44KH44GG44GL44CC44K144Kk44OI44GuIFBlcnNwZWN0aXZlcyDjgarjganjgpLjgb/jgabjgY/jgaDjgZXjgYTjgIIKCuS7luOBruWIl++8iOWkieaVsO+8ieOBr+OAgeOBqeOBhuOBp+OBl+OCh+OBhuOBi+OAguOCs+ODvOODieODgeODo+ODs+OCr+OCkuaMv+WFpeOBl+OBpuOAgeiqv+OBueOBpuOBv+OBpuOBj+OBoOOBleOBhOOAggoK5Yq05YON5pmC6ZaT5b2T44Gf44KKR0RQ44Gu5L6L44Gu55yf5Ly844KS44GX44Gm44CB44Kw44Op44OV44KS5pu444GE44Gm44G/44G+44GX44Gf44CCCgpgYGB7cn0KZGZfb2VjZF9lZHVjYXRpb25fbGV2ZWwgJT4lIAogIGZpbHRlcihMT0NBVElPTiAlaW4lIGMoIkpQTiIsICJPRUNEIiwgIkctNyIsICJFVTI4IikpICU+JQogIGdncGxvdChhZXMoVElNRSwgVmFsdWUsIGxpbmV0eXBlID0gU1VCSkVDVCwgY29sID0gTE9DQVRJT04pKSArIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZT0iQWR1bHQgZWR1Y2F0aW9uIGxldmVsIikKYGBgCgrjgarjgavjgYvnj77jgozjgb7jgZfjgZ/jgYzjgIHlm73jgoLjgIFTVUJKRUNUIOOCguacn+W+heOBl+OBn+OCguOBruOBr+ePvuOCjOOBpuOBhOOBvuOBm+OCk+OAguOBquOBq+OBjOWVj+mhjOOBquOBruOBp+OBl+OCh+OBhuOAggoK5rCX44Gl44GE44Gm44Gf44GT44Go44KS5pu444GN5Ye644GX44Gm44G/44G+44GX44KH44GG44CCCgojIyBFeGNlbCBEYXRhIOOBruiqreOBv+i+vOOBvwoKYHJlYWR4bGAg44OR44OD44Kx44O844K444KS5L2/44GE44G+44GZ44CC44GT44KM44Gv44CBYHRpZHl2ZXJzZWAg44KS44Kk44Oz44K544OI44O844Or44GZ44KL44Go44GN44Gr44CB5ZCM5pmC44Gr44CB44Kk44Oz44K544OI44O844Or44GV44KM44G+44GZ44GL44KJ44CB44Kk44Oz44K544OI44O844Or44Gv5b+F6KaB44GC44KK44G+44Gb44KT44GM44CBYHRpZHl2ZXJzZWAg44Kw44Or44O844OX44Gu5Li744Gf44KL44OR44OD44Kx44O844K444Gv44Gq44GE44Gu44Gn44CB44Ot44O844OJ44Gv44GV44KM44Gm44GE44Gq44GE44Gu44Gn44CB5L2/44GG44Go44GN44Gr44CB44Ot44O844OJ44GZ44KL5b+F6KaB44GM44GC44KK44G+44GZ44CCCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpICMgbmVlZCB0byBsb2FkIHRob3VnaCByZWFkeGwgaXMgYSBwYXJ0IG9mIHRoZSB0aWR5dmVyc2UgcGFja2FnZSBhbmQgaW5zdGFsbGVkCmBgYAoK5a6f44Gv44CB56+E5Zuy44KS6YG45oqe44GX44CB44Kz44OU44O844KS44GX44CB44Kv44Oq44OD44OX44Oc44O844OJ44GL44KJ6Kqt44KA5pa55rOV44KC44GC44KK44G+44GZ44GM44CB5LqM44Gk44Gu5aSn44GN44Gq55CG55Sx44GL44KJ5o6o5aWo44GX44G+44Gb44KT44CC5LiB5a+n44Gr44CB5pa55rOV44KS6KiY6L+w44GX44Gq44GE44Go44CB5YaN54++5oCn44Gr5ZWP6aGM44GM44GC44KL44GT44Go44CB5YiX44Gu44OH44O844K/44O744K/44Kk44OX44Gq44Gp44GM44CB6YGp5YiH44Gr44CB6Kqt44G/6L6844KB44Gq44GE5aC05ZCI44GM5aSa44GP44CB6Kqt44G/6L6844KT44Gn44GL44KJ44Gu5L2c5qWt44GM6KSH6ZuR44Gr44Gq44KL44CC44Go44Gj44Gm44KC44CB5bCP44GV44Gq44CB6Ieq5YiG44Gn5L2c5oiQ44GX44Gf44OH44O844K/44Gu5aC05ZCI44Gr44Gv44CB5pyJ5Yq544GL44KC44GX44KM44G+44Gb44KT44CCCgpgYGB7ciBldmFsPUZBTFNFfQpkZl9leGNlbF9jbGlwYm9hcmQgPC0gcmVhZF9kZWxpbShjbGlwYm9hcmQoKSkKYGBgCgoKIyMjIOS+izog5LiW55WM44Gu5Ye655Sf546H77yIRmVydGlsaXR577yJIFVOIERhdGEKCuODm+ODg+ODiOOBquODiOODlOODg+OCr+OBp+OBmeOBreOAguaXpeacrOOBruWVj+mhjOOAgeOBneOBl+OBpuOAgeiHquWIhuOBlOOBqOOBqOOBl+OBpuOBoOOBkeOBp+OBquOBj+OAgeS4lueVjOOBrueKtuazgeOCkuimi+OCi+imlueCueOCguaMgeOBoeOBvuOBl+OCh+OBhuOAggoKW1VOIGRhdGFdKGh0dHBzOi8vZGF0YS51bi5vcmcvKSDjgYvjgonjgIHmpJzntKLnqpPjga7kuIrjgavjgYLjgovjgIFbRGF0YW1hcnRzXShodHRwOi8vZGF0YS51bi5vcmcvRXhwbG9yZXIuYXNweCkg44KS6YG45oqe44GX44CB5LiL44Gu44G744GG44Gr44GC44KL44CBV29ybGQgRmVydGlsaXR5IERhdGEgVW5pdGVkIE5hdGlvbnMgUG9wdWxhdGlvbiBEaXZpc2lvbiAoVU5QRCkg44GuIFsrXSDoqJjlj7fjgpLplovjgY3jgb7jgZnjgILlj7Pjga4gW2ldIOOBi+OCieOBr+aDheWgseOBjOW+l+OCieOCjOOBvuOBmeOAguS4ieOBpOOBruODh+ODvOOCv+OBjOOBguOCiuOBvuOBmeOAggoKKiBbQWdlLXNwZWNpZmljIGZlcnRpbGl0eSByYXRlcywgVG90YWwgZmVydGlsaXR5IGFuZCBNZWFuIGFnZSBhdCBjaGlsZGJlYXJpbmddKGh0dHA6Ly9kYXRhLnVuLm9yZy9Eb2N1bWVudERhdGEuYXNweD9pZD0zMTkpCiogW0FubnVhbCBudW1iZXIgb2YgbGl2ZSBiaXJ0aHMgYW5kIENydWRlIGJpcnRoIHJhdGVdKGh0dHA6Ly9kYXRhLnVuLm9yZy9Eb2N1bWVudERhdGEuYXNweD9pZD0zMTYpCiogW0NoaWxkcmVuIGV2ZXIgYm9ybl0oaHR0cDovL2RhdGEudW4ub3JnL0RvY3VtZW50RGF0YS5hc3B4P2lkPTMxOCkKCuOBvuOBmuOBr+OAgSJBZ2Utc3BlY2lmaWMgZmVydGlsaXR5IHJhdGVzLCBUb3RhbCBmZXJ0aWxpdHkgYW5kIE1lYW4gYWdlIGF0IGNoaWxkYmVhcmluZyIg44OH44O844K/44KS5L2/44GG44GT44Go44Gr44GX44G+44GZ44CCCgoxLiDjgrXjgqTjg4jjgYvjgonjgIFFeGNlbCDjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgIIKMi4g44OX44Ot44K444Kn44Kv44OI5YaF44Gu44OH44O844K/5qC857SN44OV44Kp44Or44OA44Gr5YWl44KM44G+44GZ44CCIi4vZGF0YS8iCjMuIOippuOBl+OBq+OAgeiqreOBv+i+vOOBv+OBvuOBmeOAggo0LiBGaWxlcyDjgYvjgonjgIFJbXBvcnQgRGF0YXNldCDjgpLpgbjmip7jgZfjgIHoqK3lrprjgpLjgZfjgabjgIHjgoLjgYbkuIDluqbjgIHoqq3jgb/ovrzjgoDjgIIKNS4g5YiX5ZCN44KS5L+u5q2jCjYuIOaXpeacrOOBruODh+ODvOOCv+OCkueiuuiqjQo3LiDlubTpvaLjgZTjgajjga7mlbDjgpLmr5TovIPjgZfjgoTjgZnjgYTjgojjgYbjgavjgIHjg4fjg7zjgr/jgpLlpInlvaIKOC4g44Kw44Op44OV44KS5pu444GE44Gm44G/44KL44CCCjkuIOWHuueUn+W5s+Wdh+W5tOm9ouOBruihqOOCkumZjeW5tOm9oumghuOBq+imi+OBpuOBv+OCi+OAggoxMC4g5a+G5bqm5YiG5biD44Kw44Op44OV44KS5pu444GE44Gm44G/44KL44CCCjExLiDlh7rnlJ/njofjga7ooajjgpLmmIfpoIbjgavopovjgabjgb/jgovjgIIKMTIuIOWvhuW6puWIhuW4g+OCsOODqeODleOCkuabuOOBhOOBpuOBv+OCi+OAggoKIyMjIyBTdGVwcyAxLTMuIHstfQoKMS4g44K144Kk44OI44GL44KJ44CBRXhjZWwg44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44CCCjIuIOODl+ODreOCuOOCp+OCr+ODiOWGheOBruODh+ODvOOCv+agvOe0jeODleOCqeODq+ODgOOBq+WFpeOCjOOBvuOBmeOAgiIuL2RhdGEvIiB7LX0KMy4g6Kmm44GX44Gr44CB6Kqt44G/6L6844G/44G+44GZ44CC44K144Kk44OI44GL44KJ44CBRXhjZWwg44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44CCey19CgrjganjgpPjgarjgrfjg7zjg4jjgYzjgYLjgovjgYvopovjgabjgb/jgb7jgZfjgofjgYbjgILoqq3jgb/ovrzjgb/jgavllY/poYzjgYzjgYLjgovjgajjgY3jga/jgIHjg4fjg7zjgr/lkI3jgYvjgonjgrnjg5rjg7zjgrnjgpLmtojjgZfjgIHkuIvjga7jgrPjg7zjg4njgoLkv67mraPjgZfjgaboqq3jgpPjgafjgb/jgabjgY/jgaDjgZXjgYTjgILjgrnjg5rjg7zjgrnjgarjganjgYzjgYLjgovjgajllY/poYzjgYzotbfjgZPjgovloLTlkIjjgYzjgYLjgorjgb7jgZnjgIIKCmBgYHtyfQpleGNlbF9zaGVldHMoIi4vZGF0YS9BZ2Utc3BlY2lmaWMgZmVydGlsaXR5IHJhdGVzLCBUb3RhbCBmZXJ0aWxpdHkgYW5kIC54bHMiKQpgYGAKCuOCt+ODvOODiOOCkuaMh+WumuOBmeOCi+OBqOOBjeOBr+OAgWBzaGVldCA9IDFgIOOBqOOBi+OAgWBzaGVldCA9ICJDSElMRFJFTl9FVkVSX0JPUk4iYCDjgajjgZfjgb7jgZnjgIIK5oyH5a6a44GM44Gq44GE44Go44GN44Gv44CB5pyA5Yid44Gu44K344O844OI44CC6Kmz57Sw44Gv44CBSGVscCDjgafjgIFgcmVhZF9leGNlbGAg44Go44GX44Gm44CB56K66KqN44GX44Gm44GP44Gg44GV44GE44CC44Gf44GP44GV44KT44Gu44CB44Kq44OX44K344On44Oz44GM44GC44KK44G+44GZ44CCCgpgYGB7cn0KZGZfdW5fZmVydGlsaXR5IDwtIHJlYWRfZXhjZWwoIi4vZGF0YS9BZ2Utc3BlY2lmaWMgZmVydGlsaXR5IHJhdGVzLCBUb3RhbCBmZXJ0aWxpdHkgYW5kIC54bHMiKQpkZl91bl9mZXJ0aWxpdHkKYGBgCgrmp4vpgKDjgYzopIfpm5HjgZ3jgYbjgafjgZnjgIIKCiMjIyMgU3RlcCA0LiBGaWxlcyDjgYvjgonjgIFJbXBvcnQgRGF0YXNldCDjgpLpgbjmip7jgZfjgIHoqK3lrprjgpLjgZfjgabjgIHjgoLjgYbkuIDluqbjgIHoqq3jgb/ovrzjgoDjgIJ7LX0KCuODleOCoeOCpOODq+WQjeOCguWkieabtOOBl+OBpuOBiuOBhOOBjOaWueOBjOOCiOOBhOWgtOWQiOOCguOBguOCiuOBvuOBmeOAguOBneOBruOBqOOBjeOBr+OAgeWkieabtOiomOmMsuOCkiBSTm90ZWJvb2vjgavov73oqJjjgZfjgabjgYrjgY/jgajoia/jgYTjgafjgZfjgofjgYbjgILkuIvjga7kvovjgafjga/jgIHkuIrjga7vvJTooYzjgpLjgrnjgq3jg4Pjg5fjgILliJfjgYzjgIF0ZXh077yI5paH5a2X77yJIOOBi+OAgW51bWVyaWPvvIjmlbDlgKTvvInjgYvjgpLpgbjmip7jgILoqq3jgb/ovrzjgb7jgarjgYTjgajjgY3jgavjga/jgIFza2lwIOOBl+OBpuOBhOOBvuOBmeOAggoJCQkKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZGZfdW5fZmVydGlsaXR5IDwtIHJlYWRfZXhjZWwoIi4vZGF0YS9BZ2Utc3BlY2lmaWMgZmVydGlsaXR5IHJhdGVzLCBUb3RhbCBmZXJ0aWxpdHkgYW5kIC54bHMiLCAKICAgIGNvbF90eXBlcyA9IGMoInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgCiAgICAgICAgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAKICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAKICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAKICAgICAgICAibnVtZXJpYyIsICJza2lwIiwgInRleHQiLCAic2tpcCIsIAogICAgICAgICJza2lwIiwgInNraXAiLCAic2tpcCIsICJza2lwIiwgInNraXAiKSwgCiAgICBza2lwID0gNCkKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpkZl91bl9mZXJ0aWxpdHkgPC0gcmVhZF9leGNlbCgiLi9kYXRhL0FnZS1zcGVjaWZpYyBmZXJ0aWxpdHkgcmF0ZXMsIFRvdGFsIGZlcnRpbGl0eSBhbmQgLnhscyIsIAogICAgY29sX3R5cGVzID0gYygidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAKICAgICAgICAibnVtZXJpYyIsICJ0ZXh0IiwgcmVwKCJudW1lcmljIiwgOSksICJza2lwIiwgInRleHQiLHJlcCgic2tpcCIsIDYpKSwgCiAgICBza2lwID0gNCkKYGBgCgpgYGB7cn0KZGZfdW5fZmVydGlsaXR5CmBgYAoKIyMjIyBTdGVwIDUuIOWIl+WQjeOCkuS/ruatoyB7LX0KCuS/ruato+OBl+OBn+OBhOWIl+WQjeOCkuOCs+ODlOODvOOBl+OBpuOBiuOBj+OAggoKQ291bnRyeSwgSVNPIGNvZGUsIFBlcmlvZCwgUmVmZXJlbmNlLCBOQSwgVG90YWwgZmVydGlsaXR5Cgox5YiX55uu44GL44KJ44CBNuWIl+ebruOBqOOAgTE05YiX55uu44Go44CBMTXliJfnm67jgpLjgIHmm7jjgY3mj5vjgYjjgb7jgZnjgIIKCmBgYHtyfQpjb2xuYW1lcyhkZl91bl9mZXJ0aWxpdHkpW2MoMTo2LDE0OjE1KV0gPC0gYygiY291bnRyeSIsCSJpc28iLAkicGVyaW9kIiwieWVhciIsICJyYW5nZSIsCSJmZXJ0aWxpdHlfcmF0ZSIsIm1lYW5fYWdlIiwic291cmNlIikKZGZfdW5fZmVydGlsaXR5CmBgYAoKIyMjIyBTdGVwIDYuIOaXpeacrOOBruODh+ODvOOCv+OCkueiuuiqjSB7LX0KCgpgYGB7cn0KZGZfdW5fZmVydGlsaXR5X2pwIDwtIGRmX3VuX2ZlcnRpbGl0eSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikKZGZfdW5fZmVydGlsaXR5X2pwCmBgYAoKIyMjIyBTdGVwIDcuIOW5tOm9ouOBlOOBqOOBruaVsOOCkuavlOi8g+OBl+OChOOBmeOBhOOCiOOBhuOBq+OAgeODh+ODvOOCv+OCkuWkieW9oiB7LX0KCuOBmeOBk+OBl+OAgembo+OBl+OBhOOBp+OBmeOBjOOAgWBwaXZvdF9sb25nZXJgIOOCkiBIZWxwIOOBp+iqv+OBueOBpuOBj+OBoOOBleOBhOOAggoKYGBge3J9CmRmX3VuX2ZlcnRpbGl0eV9qcCAlPiUgcGl2b3RfbG9uZ2VyKC1jKDE6NiwgMTQ6MTUpLCBuYW1lc190byA9ICJhZ2VfcmFuZ2UiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKQpgYGAKCiMjIyMgU3RlcCA4LiDjgrDjg6njg5XjgpLmm7jjgYTjgabjgb/jgovjgIJ7LX0KCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHlfanAgJT4lIHBpdm90X2xvbmdlcigtYygxOjYsIDE0OjE1KSwgbmFtZXNfdG8gPSAiYWdlX3JhbmdlIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lCiAgZ2dwbG90KGFlcyh4PXllYXIsIGNvbD1hZ2VfcmFuZ2UsIGxpbmV0eXBlID0gYWdlX3JhbmdlKSkgKyBnZW9tX2xpbmUoYWVzKHk9dmFsdWUpKSAKYGBgCgrjgYTjgo3jgYTjgo3jgarjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgIIKCiMjIyMgU3RlcCA5LiDlh7rnlJ/lubPlnYflubTpvaLjga7ooajjgpLpmY3lubTpvaLpoIbjgavopovjgabjgb/jgovjgIJ7LX0KCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIAogIGZpbHRlcih5ZWFyICVpbiUgYygyMDEwKSkgJT4lIHNlbGVjdChjb3VudHJ5LCBtZWFuX2FnZSkgJT4lIAogIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGFycmFuZ2UoZGVzYyhtZWFuX2FnZSkpCmBgYAoKIyMjIyBTdGVwIDEwLiDlr4bluqbliIbluIPjgrDjg6njg5XjgpLmm7jjgYTjgabjgb/jgovjgIJ7LX0KCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygxOTcwLCAxOTkwLCAyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMobWVhbl9hZ2UsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwojICBjb29yZF9jYXJ0ZXNpYW4oeGxpbT1jKDIwLDQwKSkgKyAKICBsYWJzKHRpdGxlPSJNZWFuIGFnZSBhdCBjaGlsZGJlYXJpbmciLCBmaWxsID0gInllYXIiKQpgYGAKYGBge3J9CmRmX3VuX2ZlcnRpbGl0eSAlPiUgZHJvcF9uYShtZWFuX2FnZSkgJT4lIGdyb3VwX2J5KHllYXIpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JSBhcnJhbmdlKGRlc2MobikpCmBgYAoKCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygxOTcwLCAxOTg1LCAxOTk1LCAyMDA1LCAyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMobWVhbl9hZ2UsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuMykgKyAKICBsYWJzKHRpdGxlPSJNZWFuIGFnZSBhdCBjaGlsZGJlYXJpbmciLCBmaWxsID0gInllYXIiKQpgYGAKYGBge3J9CmRmX3VuX2ZlcnRpbGl0eSAlPiUgZmlsdGVyKHllYXIgJWluJSBjKDE5NzAsIDE5ODUsMTk5NSwgMjAwNSwyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMobWVhbl9hZ2UsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKyBmYWNldF93cmFwKH4gZmFjdG9yKHllYXIpKSArCiAgbGFicyh0aXRsZT0iTWVhbiBhZ2UgYXQgY2hpbGRiZWFyaW5nIiwgZmlsbCA9ICJ5ZWFyIikKYGBgCgojIyMjIDExLiDlh7rnlJ/njofjga7ooajjgpLmmIfpoIbjgavopovjgabjgb/jgovjgIJ7LX0KCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIAogIGZpbHRlcih5ZWFyICVpbiUgYygyMDEwKSkgJT4lIHNlbGVjdChjb3VudHJ5LCBmZXJ0aWxpdHlfcmF0ZSkgJT4lIAogIGRyb3BfbmEoZmVydGlsaXR5X3JhdGUpICU+JQogIGFycmFuZ2UoZmVydGlsaXR5X3JhdGUpCmBgYAoKIyMjIyBTdGVwIDEyLiDlr4bluqbliIbluIPjgrDjg6njg5XjgpLmm7jjgYTjgabjgb/jgovjgIJ7LX0KCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygxOTcwLCAxOTkwLCAyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMoZmVydGlsaXR5X3JhdGUsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKyAKICBsYWJzKHRpdGxlPSJUb3RhbCBmZXJ0aWxpdHkiLCBmaWxsID0gInllYXIiKQpgYGAKCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGRyb3BfbmEoZmVydGlsaXR5X3JhdGUpICU+JSBncm91cF9ieSh5ZWFyKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUgYXJyYW5nZShkZXNjKG4pKQpgYGAKCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygxOTcwLCAxOTg1LCAxOTk1LCAyMDA1LCAyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMoZmVydGlsaXR5X3JhdGUsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKyAKICBsYWJzKHRpdGxlPSJUb3RhbCBmZXJ0aWxpdHkiLCBmaWxsID0gInllYXIiKQpgYGAKCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygxOTcwLCAxOTg1LCAxOTk1LCAyMDA1LCAyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMoZmVydGlsaXR5X3JhdGUsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKyBmYWNldF93cmFwKH4gZmFjdG9yKHllYXIpKSArCiAgbGFicyh0aXRsZT0iVG90YWwgZmVydGlsaXR5IiwgZmlsbCA9ICJ5ZWFyIikKYGBgCgojIyMjIOWPguiAg+S+i++8ke+8mldvcmxkIEluZXF1YWxpdHkgUmVwb3J0IDIwMjIKCldJUjIwMjI6IGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2RhdGEtYW5hbHlzaXMvd2lyMjAyMi5uYi5odG1sCgojIyMjIOWPguiAg+S+i++8kjrlrabmoKHnqK7poZ7liKXpgLLlrabnjofjga7mjqjnp7so5pel5pys6Kqe44OH44O844K/KQoKW+eUt+Wls+WFseWQjOWPgueUu+WxgF0oaHR0cHM6Ly93d3cuZ2VuZGVyLmdvLmpwKeOBruizh+aWmeOBp+OBmeOAggoK5a2m5qCh56iu6aGe5Yil6YCy5a2m546H44Gu5o6o56e7OiBodHRwczovL2VtcG93ZXJtZW50LnRzdWRhLmFjLmpwL2RldGFpbC84MjU4NAoKYGBge3J9CnVybF9zY2hvb2xfanAgPC0gImh0dHBzOi8vd3d3LmdlbmRlci5nby5qcC9hYm91dF9kYW5qby93aGl0ZXBhcGVyL3IwMi96ZW50YWkvaHRtbC9ob25wZW4vY3N2L3p1aHlvMDEtMDQtMDEuY3N2IgpgYGAKCuOCqOODs+OCs+ODvOODh+OCo+ODs+OCsO+8iEVuY29kaW5nIHR5cGXvvInjgpLmjqjmuKzjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKCmBgYHtyfQpndWVzc19lbmNvZGluZyh1cmxfc2Nob29sX2pwLCBuX21heCA9IDEwMDAwLCB0aHJlc2hvbGQgPSAwLjIpCmBgYAoKCmBgYHtyfQpkZl9zY2hvb2xfanAgPC0gcmVhZF9jc3YodXJsX3NjaG9vbF9qcCwgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gIlNoaWZ0X0pJUyIpLCBza2lwPTIpCmRmX3NjaG9vbF9qcCAKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpkZl9lZHUwIDwtIGRmX3NjaG9vbF9qcCAKY29sbmFtZXMoZGZfZWR1MCkgPC0gYygieWVhciIsICJoaWdoc2Nob29sX20iLCAiaGlnaHNjaG9vbF9mIiwgInZvY2F0aW9uYWxfbSIsICJ2b2NhdGlvbmFsX2YiLCAidW5pdmVyc2l0eV9tIiwgInVuaXZlcnNpdHlfZiIsICJqdW5pb3Jjb2xsZWdlX2YiLCAiZ3JhZHNjaG9vbF9tIiwgImdyYWRzY2hvb2xfZiIpCmRmX2VkdTAwIDwtIGRmX2VkdTAgJT4lIG11dGF0ZSh5ZWFyID0gMTk1MDoyMDE5LCAKICAgICAgICAgICAgICAgICAgIGhpZ2hzY2hvb2wgPSAoaGlnaHNjaG9vbF9tICsgaGlnaHNjaG9vbF9mKS8yLAogICAgICAgICAgICAgICAgICAgdm9jYXRpb25hbCA9ICh2b2NhdGlvbmFsX20gKyB2b2NhdGlvbmFsX2YpLzIsCiAgICAgICAgICAgICAgICAgICB1bml2ZXJzaXR5ID0gKHVuaXZlcnNpdHlfbSArIHVuaXZlcnNpdHlfZikvMiwgCiAgICAgICAgICAgICAgICAgICBqdW5pb3Jjb2xsZWdlID0ganVuaW9yY29sbGVnZV9mLAogICAgICAgICAgICAgICAgICAgZ3JhZHNjaG9vbCA9IChncmFkc2Nob29sX20gKyBncmFkc2Nob29sX2YpLzIpIApkZl9lZHUwMCAlPiUgZmlsdGVyKHllYXIgPj0gMTk1NCkgJT4lIHNlbGVjdCgtKDI6MTApKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKDM6NSwgbmFtZXNfdG8gPSAic2Nob29scyIsIHZhbHVlc190byA9ICJwZXJjZW50YWdlIikgJT4lCiAgbXV0YXRlKHR5cGVzID0gZmFjdG9yKHNjaG9vbHMsIGxldmVscyA9IGMoInZvY2F0aW9uYWwiLCAianVuaW9yY29sbGVnZSIsICJ1bml2ZXJzaXR5IikpKSAlPiUKICBwaXZvdF9sb25nZXIoYyhoaWdoc2Nob29sLCBncmFkc2Nob29sKSwgbmFtZXNfdG8gPSAiaGlnaGdyYWQiLCB2YWx1ZXNfdG8gPSJ2YWx1ZSIpICU+JQogIG11dGF0ZShoaWdoX2dyYWQgPSBmYWN0b3IoaGlnaGdyYWQsIGxldmVscyA9IGMoImhpZ2hzY2hvb2wiLCAiZ3JhZHNjaG9vbCIpKSkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fYXJlYShhZXMoeCA9IHllYXIsIHkgPSBwZXJjZW50YWdlLCBmaWxsID0gdHlwZXMpKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IHZhbHVlLCBsaW5ldHlwZSA9IGhpZ2hfZ3JhZCkpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHJvdW5kKHNlcSgxOTYwLCAyMDIwLCBieSA9MTApLDEpKSArIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSByb3VuZChzZXEoMCwgMTAwLCBieSA9MTApLDEpKSArIAogIGxhYnModGl0bGUgPSAiVGVydGlhbGx5IEVkdWNhdGlvbiBBZnRlciBIaWdoc2Nob29sIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJ3aXRoIEhpZ2hzY2hvb2wgR3JhZHVhdGVzIGFuZCBHcmFkdWF0ZSBTY2hvb2wiLCAKICAgICAgIGZpbGwgPSAiIiwgbGluZXR5cGUgPSAiIikKYGBgCgoKIyMg77yI57aa77yJ5o6i57Si55qE44OH44O844K/6Kej5p6QIChFREEp44CACgohW2ltYWdlIGZyb20gcjRkc10oaHR0cHM6Ly9kMzN3dWJyZmtpMGw2OC5jbG91ZGZyb250Lm5ldC81NzFiMDU2NzU3ZDY4ZTZkZjgxYTNlMzg1M2Y1NGQzYzc2YWQ2ZWZjLzMyZDM3L2RpYWdyYW1zL2RhdGEtc2NpZW5jZS5wbmcpCgpOWS5HRFAuUENBUC5DRDogR0RQIHBlciBjYXBpdGEgKGN1cnJlbnQgVVMkKQoKYGBge3IgZXZhbD1GQUxTRX0KZGZfd2RpX2dkcHBjYXAgPC0gV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhnZHBfcGNhcCA9ICJOWS5HRFAuUENBUC5DRCIpKQp3cml0ZV9jc3YoZGZfd2RpX2dkcHBjYXAsICIuL2RhdGEvZGZfd2RpX2dkcHBjYXAuY3N2IikKYGBgCgpgYGB7cn0KZGZfd2RpX2dkcHBjYXAgPC0gcmVhZF9jc3YoIi4vZGF0YS9kZl93ZGlfZ2RwcGNhcC5jc3YiKQpgYGAKCmBgYHtyfQpkZl93ZGlfZ2RwcGNhcApgYGAKCiMjIyBEYXRhIFRyYW5zZm9ybWF0aW9uCgojIyMjIOWIl+OCkiBgc2VsZWN0YAoKYGBge3J9CmRmX3dkaV9nZHBwY2FwX3NtYWxsIDwtIGRmX3dkaV9nZHBwY2FwICU+JSAKICBzZWxlY3QoY291bnRyeSwgeWVhciwgZ2RwX3BjYXApCmRmX3dkaV9nZHBwY2FwX3NtYWxsCmBgYAoKIyMjIyDooYzjgpIgYGZpbHRlcmAKCmBgYHtyfQpkZl93ZGlfZ2RwcGNhcF9zaG9ydCA8LSBkZl93ZGlfZ2RwcGNhcCAlPiUgCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJKYXBhbiIsICJHZXJtYW55IiwgIlVuaXRlZCBTdGF0ZXMiKSkKZGZfd2RpX2dkcHBjYXBfc2hvcnQKYGBgCgpgYGB7cn0KZGZfd2RpX2dkcHBjYXBfc21hbGxfc2hvcnQgPC0gZGZfd2RpX2dkcHBjYXAgJT4lIHNlbGVjdChjb3VudHJ5LCB5ZWFyLCBnZHBfcGNhcCkgJT4lCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJKYXBhbiIsICJHZXJtYW55IiwgIlVuaXRlZCBTdGF0ZXMiKSkKZGZfd2RpX2dkcHBjYXBfc21hbGxfc2hvcnQKYGBgCgrmrKHjga/jgIHjgojjgY/nlJ/jgZjjgovjgIHoqqTjgorjga7kvovjgafjgIHjg47jgrPjgq7jg6rjga7mra/vvIhzYXd0b290aGVk77yJ44Gu44KI44GG44Gq44Ku44K244Ku44K244O744Kw44Op44OV44Go5ZG844Gw44KM44G+44GZ44CC44Gq44Gc44GT44Gu44KI44GG44Gq44GT44Go44GM6LW344GN44Gm44GE44KL44GL44KP44GL44KK44G+44GZ44GL44CCCgpgYGB7cn0KZGZfd2RpX2dkcHBjYXBfc21hbGxfc2hvcnQgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcF9wY2FwKSkgKyBnZW9tX2xpbmUoKQpgYGAKCmBgYHtyfQpkZl93ZGlfZ2RwcGNhcF9zbWFsbF9zaG9ydCAlPiUgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJKYXBhbiIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwX3BjYXApKSArIGdlb21fbGluZSgpCmBgYAoKYGBge3J9CmRmX3dkaV9nZHBwY2FwX3NtYWxsX3Nob3J0ICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBnZHBfcGNhcCkpICsgZ2VvbV9wb2ludCgpCmBgYAoKYGBge3J9CmRmX3dkaV9nZHBwY2FwX3NtYWxsX3Nob3J0ICU+JSBkcm9wX25hKGdkcF9wY2FwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwX3BjYXAsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpCmBgYAoKYGBge3J9CmRmX3dkaV9nZHBwY2FwX3NtYWxsX3Nob3J0ICU+JSBkcm9wX25hKGdkcF9wY2FwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwX3BjYXAsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkKYGBgCgpgYGB7cn0KZGZfd2RpX2dkcHBjYXBfc21hbGxfc2hvcnQgJT4lIGRyb3BfbmEoZ2RwX3BjYXApICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBnZHBfcGNhcCkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG9lc3MnLCBmb3JtdWxhID0gJ3kgfiB4JykKYGBgCgojIOWPguiAgyAtIOS7iuW+jOOBruWtpue/kuOBruOBn+OCgeOBqwoKIyMgUk5vdGVib29rIOOBrua0u+eUqAoK5LiL44Gu44Oq44Oz44Kv44KS6ZaL44GN44CB5Y+z5LiK44GuIENvZGUg44Oc44K/44Oz44GL44KJ44CBRG93bmxvYWQgUm1kIOOCkumBuOaKnuOBmeOCi+OBqOOAgeODgOOCpuODs+ODreODvOODieOBp+OBjeOBvuOBmeOBi+OCieOAgeODgOOCpOODs+ODreODvOODieOBl+OBn+OCguOBruOCkuOAgeODl+ODreOCuOOCp+OCr+ODiOODu+ODleOCqeODvOODq+ODgOODvOOBq+enu+WLleOBvuOBn+OBr+OCs+ODlOODvOOBl+OBpuOBj+OBoOOBleOBhOOAguODgOOCpuODs+ODreODvOODieOBp+OBjeOBquOBhOOBqOOBjeOBr+OAgUN0cmwg44KS5oq844GX44Gq44GM44KJ44CBRG93bmxvYWQgUm1kIOOCkuOCr+ODquODg+OCr+OBmeOCi+OBqOOAgVNhdmUgQXMg44Gn5L+d5a2Y44Gn44GN44KL44Go5oCd44GE44G+44GZ44CC44OW44Op44Km44K244O844Gr44KI44Gj44Gm5LuV5qeY44GM55Ww44Gq44KK44G+44GZ44GL44KJ44CB6YGp5YiH44Gq5pa55rOV44KS6YG444KT44Gn44GP44Gg44GV44GE44CCCgotICAgPGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvUk5vdGVib29rLUoubmIuaHRtbD4KLSAgIDxodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL1JtYXJrZG93bi1KLm5iLmh0bWw+CgpXaW5kb3dzIOOBp+OCguOAgU1hYyDjgafjgoLmj5DkvpvjgZXjgozjgabjgYTjgovjgIFHb29nbGUgQ2hyb21lIOOBruWgtOWQiOOBq+OBr+OAgUNvZGUg44Oc44K/44Oz44GL44KJ44CB44OA44Oz44Ot44O844OJ44GV44KM44KL44Gv44Ga44Gn44GZ44CCCgojIyDjgq/jg6njgqbjg4kgLSBQb3NpdCBDbG91ZAoKUlN0dWRpbyBDbG91ZOOBr+OAgeiqsOOBp+OCguOCquODs+ODqeOCpOODs+OBp+ODh+ODvOOCv+OCteOCpOOCqOODs+OCueOCkuihjOOBhOOAgeWFseacieOBl+OAgeaVmeOBiOOAgeWtpuOBtuOBk+OBqOOBjOOBp+OBjeOCi+OAgei7vemHj+OBp+OCr+ODqeOCpuODieODmeODvOOCueOBruOCveODquODpeODvOOCt+ODp+ODs+OBp+OBmeOAguaciDI15pmC6ZaT44Gu5Yi26ZmQ44GM44GC44KK44G+44GZ44GM44CB5YaF5a6544KS5YWx5pyJ44GX44Gm44CB5LuW44Gu44Ki44Kr44Km44Oz44OI44GL44KJ5Yip55So44GZ44KL44GT44Go44KC5Y+v6IO944Gn44GZ44CCCgojIyMg44Kv44Op44Km44OJ44K144O844OT44K544CASG93IHRvIFN0YXJ0IFBvc2l0IENsb3VkIHstfQoKMS4gIEdvIHRvIDxodHRwczovL3Bvc2l0LmNsb3VkLz4KMi4gIFNpZ24gVXA6IHRvcCByaWdodAozLiAgRW1haWwgYWRkcmVzcyBvciBHb29nbGUgYWNjb3VudAo0LiAgTmV3IFByb2plY3Q6IFByb2plY3QgTmFtZQoKIyMg57e057+S5ZWP6aGMIFBvc2l0IFByaW1lcnMKClBvc2l0IFByaW1lcnMgPGh0dHBzOi8vcG9zaXQuY2xvdWQvbGVhcm4vcHJpbWVycz4KCiMjIyDmnIDliJ3jga7mvJTnv5Igey19CgpNb29kbGXvvIgy5pyIMjLml6XvvInjgavjg6rjg7Pjgq/jgpLjgaTjgZHjgabjgYLjgorjgb7jgZnjgIIKCi0gICBbVmlzdWFsaXphdGlvbiBCYXNpY3NdKGh0dHBzOi8vcnN0dWRpby5jbG91ZC9sZWFybi9wcmltZXJzLzEuMSkKLSAgIFtQcm9ncmFtbWluZyBCYXNpY3NdKGh0dHBzOi8vcnN0dWRpby5jbG91ZC9sZWFybi9wcmltZXJzLzEuMikKCiMjIOWPguiAg+aWh+eMriBSZWZlcmVuY2VzCgotICAgUiBGb3IgRGF0YSBTY2llbmNlLCBieSBILiBXaWNraGFtOiA8aHR0cHM6Ly9yNGRzLmhhZC5jby5uej4KCiAgICAtICAgSW50cm9kdWN0aW9uOiA8aHR0cHM6Ly9yNGRzLmhhZC5jby5uei9leHBsb3JlLWludHJvLmh0bWwjZXhwbG9yZS1pbnRybz4KCi0gICBCb29rZG93bjogPGh0dHBzOi8vYm9va2Rvd24ub3JnPiwgW0FyY2hpdmVdKGh0dHBzOi8vYm9va2Rvd24ub3JnL2hvbWUvYXJjaGl2ZS8pCgotICAgW0dldCBTdGFydGVkOiBSIFN0dWRpbyDjgacgUiDjgpLjga/jgZjjgoHjgojjgYbjgIFSIE1hcmtkb3duXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dldHN0YXJ0ZWQuaHRtbCkKCi0gICBbSW50cm9kdWN0b24gdG8gUl0oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9pbnRybzJyLm5iLmh0bWwjM19EYXRhX0FuYWx5c2lzX1VzaW5nX1JTdHVkaW8pCgotICAgW0RhdGEgQW5hbHlzaXMgZm9yIFJlc2VhcmNoZXJzIDIwMjJdKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RhNHIyMDIyLykKCi0gICBb44OH44O844K/44O744K144Kk44Ko44Oz44K544KS5aeL44KB44G+44GX44KH44GGIC0gRGF0YSBTY2llbmNlIGZvciBBbGxdKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RzNGFqLykKCiMgSVQg44OE44O844Or44Gr44Gk44GE44GmCgrjg6Ljg5DjgqTjg6vjgqLjg5fjg6rjgafjgoLjgIHjgZXjgb7jgZbjgb7jgavlj6/og73jgafjgZnjgYzjgIHmnaHku7bku5jjgY3oqrLph5HjgarjganjgIHjgqLjg5fjg6rjgavjgojjgaPjgabjgoLjgIHmqZ/nqK7jgavjgojjgaPjgabjgoLjgIHnlbDjgarjgovjga7jgafjgIHjgZPjgZPjgafjga/jgIFQQyDjgafjga7liKnnlKjjgavjgaTjgYTjgabmm7jjgY3jgb7jgZnjgIIKCiMjIFJTdHVkaW8g44G+44Gf44GvIFBvc2l0IFN0dWRpbyDjgacgUgoKLSBb44OH44O844K/44O744K144Kk44Ko44Oz44K544KS5aeL44KB44G+44GX44KH44GGIC0gRGF0YSBTY2llbmNlIGZvciBBbGxdKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RzNGFqLykKICAtIFtSU3R1ZGlvIOOBpyBSXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai9yb25yc3R1ZGlvLmh0bWwjcm9ucnN0dWRpbykKICAKIyMgR29vZ2xlIENocm9tZSDjgafjga7oh6rli5Xnv7voqLMKCldpbmRvd3Mg44GuIEVkZ2Ug44KE44CBTWFjIOOBriBTYWZhcmkg44Gn44KC5Y+v6IO944Gn44GZ44CC57+76Kiz44Ko44Oz44K444Oz44GM55Ww44Gq44KL44Gu44Gn44CB5L2/44GE5Yud5omL44KC44GC44KK44G+44GZ44GM44CB44GE44GP44Gk44GL6Kmm44GX44Gm44CB6Ieq5YiG44Gu5aW944GN44Gq44CB5L+h6aC844Gn44GN44KL44CB57+76Kiz44Ko44Oz44K444Oz44KS5Yip55So44GZ44KL44Gu44GM44KI44GE44Go5oCd44GE44G+44GZ44CCCgojIyMg6Kit5a6aCgoxLiDkuIrjga7jg5Djg7zjga7kuIDnlarlj7PjgavjgYLjgovjgIHnuKbjgavjgarjgonjgpPjgaDkuInngrnjgYvjgonjgIHkuIDnlarkuIvjga7oqK3lrprjgpLpgbjmip4KMi4g5bem44Gu5biv44GL44KJ6KiA6Kqe44KS6YG45oqeCjMuIOWEquWFiOiogOiqnuOCkueiuuiqje+8muWFpeOBo+OBpuOBhOOBquOBkeOCjOOBsOOAgeaXpeacrOiqnuOBruOBpOOBjuOBq+OAgeiLseiqnuOCkuWFpeOCjOOCiwo0LiBHb29nbGUg57+76Kiz44KSIE9OIOOBq+OBmeOCiwo1LiDjgZPjga7oqIDoqp7jgavnv7voqLPjgZnjgovjgpLml6XmnKzoqp7jgasKNi4g57+76Kiz44GZ44KL44GL56K66KqN44GX44Gq44GE6KiA6Kqe44KS5pel5pys6Kqe44GrCgojIyMg5L2/44GE5pa5CgoxLiDmpJzntKLnqpPjga7nv7voqLPjg5zjgr/jg7PjgpLliKnnlKjjgILjgb7jgZ/jga/jgIHnv7voqLPjgajjgafjgZ/jgajjgY3jgavjgIHml6XmnKzoqp7jgpLpgbjmip7jgIIKMi4g6Iux6Kqe44Gr44KC44Gp44GX44Gf44GE44Go44GN44Gv44CB5ZCM44GY44Oc44K/44Oz44Gn5oi744GZ44CCCgojIyMg5Y+C6ICD44K144Kk44OICgpbQ2hyb21lIOOBruiogOiqnuOBruWkieabtOOBqOOCpuOCp+ODluODmuODvOOCuOOBrue/u+ios10oaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vY2hyb21lL2Fuc3dlci8xNzM0MjQ/aGw9amEmY289R0VOSUUuUGxhdGZvcm0lM0REZXNrdG9wKQoKCiMjIERlZXBMIOOBrua0u+eUqAoKIyMjIOOCteOCpOODiOOBp+OBrue/u+ioswoKKiBb44K144Kk44OIXShodHRwczovL3d3dy5kZWVwbC5jb20vamEvdHJhbnNsYXRvcikKCiMjIyDjgqLjg5fjg6rjgpLkvb/jgaPjgabjga7nv7voqLMKCiogRGVlcEwg44Gu44K144Kk44OI44Gu44Oh44OL44Ol44O844GL44KJ44Ki44OX44Oq44KS6YG45oqe44G+44Gf44GvCiogW+OCouODl+ODql0oaHR0cHM6Ly93d3cuZGVlcGwuY29tL2phL2FwcC8pCgrkuIrjgYvjgonjg4Djgqbjg7Pjg63jg7zjg4njgZfjgabjgqTjg7Pjgrnjg4jjg7zjg6vjgZfjgb7jgZnjgIIKCiog44K344On44O844OI44Kr44OD44OI44Kt44O844GM5L6/5Yip44Gn44GZ44CCCiAgMS4g44Ki44OX44Oq44KS6LW35YuV44GZ44KLCiAgMi4g57+76Kiz44GX44Gf44GE566H5omA44KS6YG45oqeCiAgMy4gV2luZG93cyDjga/jgIFDdHJsICsgQyArIEMgKOOCs+ODs+ODiOODreODvOODq+OCkuaKvOOBl+OBquOBjOOCiSBDIOOCkjLlm54p44CBTWFjIOOBr+OAgUNvbW1hbmQg77yLQyArIEMg77yI5Yid5pyf6Kit5a6a44Gn44GT44Gu5qmf6IO944GM6Kit5a6a44GV44KM44Gm44GE44KL44Go5oCd44GE44G+44GZ77yJCiAgNC4gMyDjgYzmqZ/og73jgZfjgarjgYTmmYLjga/jgIHlt6bkuIrjga7jgIHjg6Hjg4vjg6Xjg7zjgYvjgonoqK3lrprjgpLpgbjmip7jgILjgrfjg6fjg7zjg4jjgqvjg4Pjg4jjgq3jg7zjga7oqK3lrprjgpIgT04KCgojIyBDaGF0IEdQVAoKKiBb44K144Kk44OIXShodHRwczovL29wZW5haS5jb20vYmxvZy9jaGF0Z3B0KQoKMS4gVHJ5IENoYXRHUFQg44KS44Kv44Oq44OD44KvCjIuIOS6uumWk+OBp+OBguOCi+OBk+OBqOOCkueiuuiqjQozLiDjgrXjgqTjg7PjgqLjg4Pjg5cKNC4g44Oh44O844Or44Ki44OJ44Os44K544Go44CB44OR44K544Ov44O844OJ44KS6Kit5a6aCjUuIOODkeOCveOCs+ODs+OBi+OCieOBoOOBqOOAgVNob3J0IE1lc3NhZ2Ug44KS5Y+X44GR5Y+W44KM44KL5pC65biv6Zu76Kmx5oOF5aCx44KS6IGe44GL44KM44G+44GZ4oCZCiAgLSDjgqLjgqvjgqbjg7Pjg4jkvZzmiJDjga7jgb/jgIHmkLrluK/pm7voqbHjgYvjgonjgZnjgovjgajjgIHjgrnjg4bjg4Pjg5fjgYzkuIDjgaTmuJvjgorjgb7jgZkKNi4g44Ot44Kw44Kk44Oz44GX44Gm5Yip55SoCgoqIENoYXRHUFQg44KS44CBR29vZ2xlIENocm9tZSDjgarjganjga7jgIHjgqTjg7Pjgr/jg7zjg43jg4Pjg4jjg5bjg6njgqbjgrbjg7zjga7mqZ/og73mi6HlvLXjgajjgZfjgabliqDjgYjjgovjgZPjgajjgoLlj6/og73jgafjgZnjgIIKICAtIFtHb29nbGUgQ2hyb21lIOOCteOCpOODiF0oaHR0cHM6Ly9jaHJvbWUuZ29vZ2xlLmNvbS93ZWJzdG9yZS9kZXRhaWwvY2hhdGdwdC1mb3ItZ29vZ2xlL2pnamFlYWNka29uYW9hZmVubGZra2ttYmFvcGtiaWxmP2hsPWphKQogIC0g44Gf44Gg44GX44CB5Yip55So44Gr44Gv44CBQ2hhdEdQVCDjgbjjga7jg63jgrDjgqTjg7PjgYzlv4XopoHjgafjgZkKCiog6LOq5ZWP44Gr6Zai44GX44Gm44Gv44CB44GL44Gq44KK44Gu56K65bqm44Gn55CG6Kej44GX44Gm44GE44KL44KI44GG44Gr5oCd44KP44KM44G+44GZ44CC6LOq5ZWP5YaF5a6544Gu5LiA6YOo44KS54Sh6KaW44GZ44KL44GT44Go44Gv5bCR44Gq44GE44KI44GG44Gr5oCd44KP44KM44G+44GZ44CCCiog6LOq5ZWP44Gu44GX44GL44Gf44CB562U44GI44Gu5YaF5a6544KS56K66KqN44GX44Gm44GE44GP57e057+S44GM5b+F6KaB44Gn44GZCiog5Z+65pys55qE44Gr44Gv44CBMjAyMeW5tDnmnIjjgb7jgafjga7mg4XloLHjgpLjgoLjgajjgavjgIHlv5znrZTjgZfjgb7jgZkKKiA156eS44G744Gp44Gn44CBNTAw5paH5a2X56iL5bqm44Gu44CB5b+c562U44KS44GZ44KL44Oi44OH44Or44Gr44Gq44Gj44Gm44GE44KL44Gf44KB44CB44Gd44Gu5p6g5YaF44Gn44CB6LOq5ZWP44Gr5a++44GX44Gm44KC44Gj44Go44KC6auY44GE6KmV5L6h5YCk44Gu562U44GI44KS6YG45oqe44GX44Gm44CB5b+c562U44GX44Gm44GE44KL44KI44GG44Gn44GZ44CCCiog56K66KqN44KS44GX44Gf44KK44CB44Gq44Gr44KS5qC55oug44Go44GX44Gm44GE44KL44GL44CB5qC55oug44Go44Gq44KL44K144Kk44OI44Gq44Gp44KS56K66KqN44GX44CB44KI44KK44CB56K65a6f44Gq5oOF5aCx44KS57We44KK6L6844G/44CB44GV44KJ44Gr44CB6LOq5ZWP44KS44GZ44KL44CBQ2hhdCDjgaDjgajjgYTjgYbjgZPjgajjgpLoqo3orZjjgZfjgabliKnnlKjjgZnjgovjgZPjgajjgYzlpKfliIfjgafjgZnjgIIKKiDkvZXjgavjgafjgoLnrZTjgYjjgovjgo/jgZHjgafjga/jgYLjgorjgb7jgZvjgpPjgYzjgIHkuI3norrlrp/jgarmg4XloLHjgoLlv5znrZTjgZnjgovjgZ/jgoHjgIHnorroqo3jgYzlv4XopoHjgafjgZnjgIIKKiDkurrplpPjgavjgoLjgIHjganjgpPjgaros6rllY/jgavjgoLljbPluqfjgavjgIHjgarjgpPjgonjgYvjga7mg4XloLHjgpLov5TjgZnjgIHnn6XorZjjgYzosYrjgYvjgarjgbLjgajjgoLjgYTjgb7jgZnjgYzjgIHlhoXlrrnjgYzjgIHjgZnjgbnjgabmraPjgZfjgYTjgo/jgZHjgafjga/jgYLjgorjgb7jgZvjgpPjgILjgZ3jga7jgojjgYbjgavjgIHjgYLjgovnqIvluqbovrvopITjgYzlkIjjgaPjgabjgYTjgovlhoXlrrnjgpLjgIHjgZnjgZDnrZTjgYjjgonjgozjgovjgZPjgajjgavjgIHpqZrjgYvjgZXjgozjgovjgajjgYTjgYbjgZPjgajjgafjgZfjgofjgYbjgYvjgIIKCiMjIFBlcnBsZXhpdHkKCiogW+OCteOCpOODiF0oaHR0cHM6Ly93d3cucGVycGxleGl0eS5haSkKKiDmpJzntKLnqpPjgavjgIExMjjmloflrZfjgb7jgafjga7mpJzntKLoqp7jgIHos6rllY/jgarjganjgpLlhaXjgozjgovjgajjgIHmg4XloLHjga7jgYLjgovjgZXjgYTjgajjgpLjgbXjgY/jgoHjgabjgIHmlZnjgYjjgabjgY/jgozjgb7jgZnjgIIKKiDmpJzntKLoqp7jgoTjgIHos6rllY/jga7mm7jjgY3mlrnjgoLnt7Tnv5LjgZnjgovlv4XopoHjgYzjgYLjgorjgb7jgZnjgIIKCgoKCgo=