準備

  1. (自分のPCまたは教室のPCに)ログイン

  2. ウェッブ・ブラウザー(Google Chrome など)を起動

  3. (別のタブまたは ウィンドウで)PositCloud にログイン[Posit.cloud]

    • アカウントのない人はサイン・アップ [共有プロジェクト] から、Save a Permanent Copy)

    • RStudio を自分のコンピュータにインストールしている人は起動

  4. リンクの右上の Raw ボタンの右の Copy a raw file からコピーして演習用 R Markdown ファイルを作成(あとで再度解説します)[Rmd]

ファイル

ファイルを作成するときの注意

  1. Posit Cloud のときは、まず、Login し、intro2rj のプロジェクトに入り、 ファイルから、ges001 のフォルダーを選択して、それを選択して、移動します。この中に、data フォルダが作成されていることを確認し、このges001 に、新しく作成したファイルを保存します。新しく作成したファイルの入っているフォルダーの中に、data フォルダがあることが大切です。そこに、データを書き込みます。

  2. RStudio の場合には、まずは、あたらしい Project を作成します。File > New Project から作成します。すでに、作成してある場合は、それを、Open Project や、Recent Project から開きます。その中に、新しいファイルを作成します。作成したフォルダーに、data フォルダがあることを確認してください。新しく作成したファイルの入っているフォルダーの中に、data フォルダがあることが大切です。そこに、データを書き込みます。


ファイルを提出するときの注意

RStudio の場合には、自分の PC に作成したファイルがありますから、問題ないと思いますが、Posit Cloud で作成した場合には、提出したいファイルの左にあるチェックボックスをチェックします。Files の 右端にある、ギアマークの Export を押すと、ダウンロードできます。それを提出してください。末尾が、nb.html となっているものを提出していただくのがよいですが、よくわからないときは、nb.html ファイルと、Rmd ファイルと両方提出してください、

第5週

01/18(TH) 南部アフリカ諸国の貧困と不平等に対する対策

      COVID-19が貧困に与えた影響     

01/23(TU) Rでデータサイエンス5  [Main]

演習 1月24日(火)

内容

  • Poverty headcount ratio at $6.85 a day (2017 PPP) (% of population):SI.POV.UMIC [Link]

  • Government expenditure on education, total (% of GDP):SE.XPD.TOTL.GD.ZS [Link]

  • School enrollment, primary (% gross):SE.PRM.ENRR [Link]

  • School enrollment, secondary (% gross):SE.SEC.ENRR [Link]

  • School enrollment, tertiary (% gross):SE.TER.ENRR [Link]


  • Mortality rate, under-5 (per 1,000 live births):SH.DYN.MORT [Link]

  • Incidence of HIV (% of uninfected population ages 15-49):SH.HIV.INCD.ZS [Link]

  • School enrollment, primary and secondary (gross), gender parity index (GPI):SE.ENR.PRSC.FM.ZS [Link]

  • Ratio of female to male labor force participation rate (%) (modeled ILO estimate):SL.TLF.CACT.FM.ZS [Link]

  • Unemployment, female (% of female labor force) (modeled ILO estimate):SL.UEM.TOTL.FE.ZS [Link]

  • Unemployment, male (% of male labor force) (modeled ILO estimate):SL.UEM.TOTL.MA.ZS [Link]

  • Net official development assistance and official aid received (current US$) DT.ODA.ALLD.CD [Link]


準備

library(tidyverse)
library(WDI)

データの読み込み(importing)

df_poverty_inequality <- WDI(
  indicator = c(gini = "SI.POV.GINI",
                under_6.85 = "SI.POV.UMIC",
                ed_exp = "SE.XPD.TOTL.GD.ZS",
                primary = "SE.PRM.ENRR",
                secondary = "SE.SEC.ENRR",
                tertiary = "SE.TER.ENRR",
                under5 = "SH.DYN.MORT",
                new_hiv = "SH.HIV.INCD.ZS",
                school_gpi = "SE.ENR.PRSC.FM.ZS",
                job_gpi = "SL.TLF.CACT.FM.ZS",
                female_unemploy = "SL.UEM.TOTL.FE.ZS",
                male_unemploy = "SL.UEM.TOTL.FE.ZS",
                oda = "DT.ODA.ALLD.CD"), extra = TRUE)

保存と読み込み

2回目からは、data から読み込めるようにしておきます。

最初の1回目は、かならず実行してください。

write_csv(df_poverty_inequality, "data/poverty_inequality.csv")
df_poverty_inequality <- read_csv("data/poverty_inequality.csv")
Rows: 16758 Columns: 24── Column specification ─────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr   (7): country, iso2c, iso3c, region, capital, income, lending
dbl  (15): year, gini, under_6.85, ed_exp, primary, secondary, tertiary, under5, new_hiv, sch...
lgl   (1): status
date  (1): lastupdated
ℹ 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.

データを見てみよう (viewing)

df_poverty_inequality 

変数の選択(selecting)

df_pov_ineq <- df_poverty_inequality |> 
  select(country, iso2c, year, gini:oda, region, income, lending)
df_pov_ineq

変数同士の相関関係: NA ではないところのみ選択

df_pov_ineq |> drop_na(gini:oda) |> select(gini:oda)

cor(cars$speed,cars$dist)
[1] 0.8068949
cars |> ggplot(aes(speed, dist)) + geom_point() + 
  geom_smooth(formula = 'y~x',method = "lm", se=FALSE)

相関係数:直線の傾きが正なら正、負なら負、直線に近い程、1 または-1 に近い


変数相互の相関係数を一度に求める

df_pov_ineq |> drop_na(gini:oda) |> select(gini:oda) |> cor() |> 
  round(digits = 2) |> as.data.frame()


df_pov_ineq |> drop_na(gini:oda) |>
  ggplot(aes(gini, primary)) + geom_point(aes(col = income)) + 
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE) +
  labs(title = "cor(gini,primary) = 0.34")


df_pov_ineq |> drop_na(gini:oda) |>
  ggplot(aes(gini, tertiary)) + geom_point(aes(col = income)) + 
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE) +
  labs(title = "cor(gini,tertiary) = -0.29")


df_pov_ineq |> drop_na(gini:oda) |>
  ggplot(aes(under_6.85, tertiary)) + geom_point(aes(col = income)) + 
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE) +
  labs(title = "cor(under_6.85,tertiary) = -0.77")


df_pov_ineq |> drop_na(gini:oda) |>
  ggplot(aes(under_6.85, under5)) + geom_point(aes(col = income)) + 
  geom_smooth(formula = 'y~x', method = "lm", se = FALSE) +
  labs(title = "cor(under_6.85,under5) = 0.71")

ファイルリンクと課題

基本的には、PositCloud(https://posit.cloud/)を使って実習

  • 探索的データ分析(EDA) -
    • 練習と一つ目の課題(w5eda.Rmd) [リンク], [Rmd]
    • 二つ目以降の課題:w5eda1.Rmd [リンク], [Rmd]
  • 課題:2023.1.27. 23:59 までに Moodle の演習の課題ボックスに提出したものについては、なるべく、早く見て、フィードバックを書きます。それ以降に提出されたものも見ますが、フィードバックは遅くなると思ってください。

R Notebook のソースファイル(Rmd)を取得方法

  • Rmd のリンクをクリックし Raw の横の Copy a raw file からコピー、新規 RMarkdown ファイルを PositCloud または RStudio のプロジェクト内に作成しペースト

課題

以下の指標の中から、一つを選択して、データの概要(description)を記録し、データを WDI で取得し、以下の分析をする。

  1. 各年毎のデータの数の棒グラフ
  2. 日本のデータの年の降順での表示
  3. 経年変化を表す折れ線グラフ
    1. 日本
    2. 南部アフリカ関税同盟の5カ国
    3. 選択したいくつかの国
  4. データが十分ある最近の年の値のヒストグラム
  5. データが十分ある最近の年の値の10カ国の値の棒グラフ
    1. 値が大きい方から
    2. 値が小さい方から

それぞれについて考察(気づいたこと、疑問など)を記す

2023.1.27. 23:59 までに Moodle の演習の課題ボックスに提出したものについては、なるべく、早く見て、フィードバックを書きます。それ以降に提出されたものも見ますが、フィードバックは遅くなると思ってください。


提出前の確認

  • Preview で確認。

  • Web Browser で、w5_c123456.nb.html など、R Notebook を見て確認。

  • もし、問題があれば、Run ボタンの右の三角から、Run All を選択し、エラーがでないか確認。

  • 最初にもどる。


途中でのエラー

  • 入力したときには、例を参照して、スペルなどを確認してください。全角になっていると問題がおきます。() がペアでマッチしているか、確認してください。
  • 引用符が入っていなかったり、== のところが、= だったり、いろいろな可能性があります。Error message を読むこともたいせつです。エラーがでた、Code Chunk と、Error message を、ChatGPT や、Google Bard, Google Search に入れると、解決方法を教えてくれることもあります。
  • File not found の、エラーがでたときには、上から順に、Run (Code Chunk の右上の三角印を押して実行)してみてください。または、エラーが出たところに、カーソルを置き、上の、Run ボタンの右の三角から、Run All Chunks Above を選択すると、そこまでのすべての Code Chunk を実行してくれます。
  • 上の方法でうまくいかないときは、data フォルダに、データ(***.csv)が入っているかを確認、なければ、data フォルダがあることを確認して、最初のデータ読み込みのところを実行してみてください。
  • 実行できていても、結果が見えないこともあります。そのときは、Code Chunk の下にある、山二つの記号を押してみてください。これは、結果を表示、非表示にします。それが原因で隠れている場合があります。

データ(全体で11:最初のリスト参照)

  1. Government expenditure on education, total (% of GDP):SE.XPD.TOTL.GD.ZS [Link] 変数名:ed_exp

  2. School enrollment, primary (% gross):SE.PRM.ENRR [Link] 変数名:primary

  3. School enrollment, secondary (% gross):SE.SEC.ENRR [Link] 変数名:secondary

  4. School enrollment, tertiary (% gross):SE.TER.ENRR [Link] 変数名:tertiary

  5. Mortality rate, under-5 (per 1,000 live births):SH.DYN.MORT [Link] 変数名:under5

  6. Incidence of HIV (% of uninfected population ages 15-49):SH.HIV.INCD.ZS [Link] 変数名:new_hiv

  7. School enrollment, primary and secondary (gross), gender parity index (GPI):SE.ENR.PRSC.FM.ZS [Link] 変数名:school_gpi

  8. Ratio of female to male labor force participation rate (%) (modeled ILO estimate):SL.TLF.CACT.FM.ZS [Link] 変数名:job_gpi

  9. Unemployment, female (% of female labor force) (modeled ILO estimate):SL.UEM.TOTL.FE.ZS [Link] 変数名:female_unemploy

  10. Unemployment, male (% of male labor force) (modeled ILO estimate):SL.UEM.TOTL.MA.ZS [Link] 変数名:male_unemploy

  11. Net official development assistance and official aid received (current US$) DT.ODA.ALLD.CD [Link] 変数名:oda

例:国の教育に関する支出

スライドで見ている方は、RNotebook ファイルで見てください [リンク]

概要:国内総生産(GDP)に対する、国の教育に関する支出(Government expenditure on education, total (% of GDP))のデータの分析を行う

データ

Government expenditure on education, total (% of GDP):SE.XPD.TOTL.GD.ZS [Link]

データ情報

  • データ名:

  • データコード:

  • 変数名:

  • 概要:


データの取得

準備

library(tidyverse)
library(WDI)

WDI パッケージを使って、直接データをダウンロードし、変数名を、ed_exp に指定。

df_ed_exp <- WDI(indicator = c(ed_exp = "SE.XPD.TOTL.GD.ZS"))
write_csv(df_ed_exp, "data/ed_exp.csv")
df_ed_exp <- read_csv("data/ed_exp.csv")
Rows: 16758 Columns: 5── Column specification ─────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, ed_exp
ℹ 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_ed_exp
str(df_ed_exp)
spc_tbl_ [16,758 × 5] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country: chr [1:16758] "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" "Africa Eastern and Southern" ...
 $ iso2c  : chr [1:16758] "ZH" "ZH" "ZH" "ZH" ...
 $ iso3c  : chr [1:16758] "AFE" "AFE" "AFE" "AFE" ...
 $ year   : num [1:16758] 2022 2021 2020 2019 2018 ...
 $ ed_exp : num [1:16758] 3.91 4.63 4.35 4.54 4.74 ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   ed_exp = col_double()
  .. )
 - attr(*, "problems")=<externalptr> 

国と地域

country には、国と地域両方が入っています。地域の iso2c は以下のものです。

REGION <- c("1A", "1W", "4E", "7E", "8S", "B8", "EU", "F1", "OE", "S1", 
"S2", "S3", "S4", "T2", "T3", "T4", "T5", "T6", "T7", "V1", "V2", 
"V3", "V4", "XC", "XD", "XE", "XF", "XG", "XH", "XI", "XJ", "XL", 
"XM", "XN", "XO", "XP", "XQ", "XT", "XU", "XY", "Z4", "Z7", "ZF", 
"ZG", "ZH", "ZI", "ZJ", "ZQ", "ZT")
df_ed_exp |> filter(iso2c %in% REGION) |> distinct(country, iso2c)
df_ed_exp |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c)

分析する国のリスト

南部アフリカ関税同盟 The Southern African Customs Union (SACU)

SOUTH_AFRICA_FIVE <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")

ラテンアメリカでジニ指数が大きい4カ国

CHOSEN_GINI_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

分析

1. 各年毎のデータの数の棒グラフ

df_ed_exp |> drop_na(ed_exp) |> filter(!(iso2c %in% REGION)) |>
  ggplot(aes(year)) + geom_bar()

視覚化

2. 日本の教育費(% of GDP)

df_ed_exp |> filter(country == "Japan") |> 
  drop_na(ed_exp) |> arrange(desc(year))

3. 経年変化

a. 日本

df_ed_exp |> filter(country == "Japan") |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line()

気づいたこと・疑問

  • 1970年代の急激な上昇、1990年ごろの急激な現象は、何が原因なのだろう。

  • 2014年ごろから減少、2018年ごろから増加、2020年から2021年は減少。

b. 南部アフリカ関税同盟

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% SOUTH_AFRICA_FIVE) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)

気づいたこと・疑問

  • 平均で見ると、上昇してきており、7% 程度という大きな割合になっている。

c. ラテンアメリカ4カ国

df_ed_exp |> filter(country %in% CHOSEN_GINI_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country))

参考:平均的な値を曲線で表すことも可能です。loess を使うと滑らかな曲線で近似してくれます。

df_ed_exp |> filter(country %in% CHOSEN_GINI_COUNTRIES) |> drop_na(ed_exp) |>
  ggplot(aes(year, ed_exp)) + geom_line(aes(col = country)) +
  geom_smooth(formula = 'y~x', method = "loess", se = FALSE)


分布

データの数から、まずは、2020年について見てみる。

df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot(aes(ed_exp)) + geom_histogram(binwidth = 1)

参考:SACU の5カ国の値を縦線で書き込むには下のようにします。

df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) 

参考:日本とSACU の5カ国の値を縦線で書き込むには下のようにします。

JP <- 3.416981
SAF <- df_ed_exp |> filter(year == 2020) |> filter(country %in% SOUTH_AFRICA_FIVE) |> pull(ed_exp)
df_ed_exp |> filter(year == 2020) |> filter(!(country %in% REGION))|>
  drop_na(ed_exp) |>
  ggplot() + geom_histogram(aes(ed_exp), binwidth = 1) +
  geom_vline(xintercept = SAF, col = "red") + geom_vline(xintercept = JP, col = "blue") +labs(title = "2020年の教育費の対GDP百分率", subtitle = "日本:青、SACU:赤")


データが十分ある最近の年の値の10カ国の値の棒グラフ

a. 値が大きい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(desc(ed_exp)) |> head(10) |> 
  ggplot(aes(fct_reorder(country, ed_exp), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Top 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")

b. 値が小さい方から

df_ed_exp |> filter(year == 2020) |> drop_na(ed_exp) |> 
  filter(!(iso2c %in% REGION))|>
  arrange(ed_exp) |> head(10) |> 
  ggplot(aes(fct_rev(fct_reorder(country, ed_exp)), ed_exp)) + geom_col() + 
  coord_flip() + labs(title = "Lowest 10 Countries", x = "country", y = "Government expenditure on education, total (% of GDP)")


演習の内容と課題

基本的には、PositCloud(https://posit.cloud/)を使って実習

  • 探索的データ分析(EDA) -
    • 練習と一つ目の課題(w5eda.Rmd) [リンク], [Rmd]
    • 二つ目以降の課題:w5eda1.Rmd [リンク], [Rmd]
  • 課題:2023.1.27. 23:59 までに Moodle の演習の課題ボックスに提出したものについては、なるべく、早く見て、フィードバックを書きます。それ以降に提出されたものも見ますが、フィードバックは遅くなると思ってください。

参考文献

  1. 「みんなのデータサイエンス - Data Science for All」[はじめてのデータサイエンス]

    • 導入として、GDP(国内総生産)のデータを使って説明しています。
  2. Posit Recipes(旧 Posit Primers): The Basics 対話型の演習サイトの最初 [Link]

  3. Posit Cheat Sheet. 早見表です。印刷して使うために、PDF も提供しています。[Site Link]

  4. DataCamp Cheat Sheet: Tidyverse for Biginners. データサイエンスの教育をしている会社の早見表の一つです。基本が簡単にまとまっています。[Link]

LS0tCnRpdGxlOiAiR0VTIDAwMSDmvJTnv5I1IgphdXRob3I6ICJILiBTdXp1a2kiCmRhdGU6ICIyMDI05bm0MeaciDI05pelIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICBpb3NsaWRlc19wcmVzZW50YXRpb246CiAgICB3aWRlc2NyZWVuOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKLS0tCgojIyDmupblgpkKCjEuICDvvIjoh6rliIbjga5QQ+OBvuOBn+OBr+aVmeWupOOBrlBD44Gr77yJ44Ot44Kw44Kk44OzCgoyLiAg44Km44Kn44OD44OW44O744OW44Op44Km44K244O877yIR29vZ2xlIENocm9tZSDjgarjganvvInjgpLotbfli5UKCiAgICAtICAgTW9vZGxlIOOBriBHRVMwMDEg57WM5riI44Go57WM5riI5a2m44Gu44K144Kk44OI44GL44KJ44CB44GT44Gu44K544Op44Kk44OJ44Gu44Oa44O844K444KS6KGo56S677yI44Oq44Oz44Kv44CMUuOBp+ODh+ODvOOCv+OCteOCpOOCqOODs+OCueOAjVsqKmh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxLyoqXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS8p77yJCgozLiAg77yI5Yil44Gu44K/44OW44G+44Gf44GvIOOCpuOCo+ODs+ODieOCpuOBp++8iVBvc2l0Q2xvdWQg44Gr44Ot44Kw44Kk44OzW1tQb3NpdC5jbG91ZF0oaHR0cHM6Ly9wb3NpdC5jbG91ZC8pXQoKICAgIC0gICDjgqLjgqvjgqbjg7Pjg4jjga7jgarjgYTkurrjga/jgrXjgqTjg7Pjg7vjgqLjg4Pjg5cgW1vlhbHmnInjg5fjg63jgrjjgqfjgq/jg4hdKGh0dHBzOi8vcG9zaXQuY2xvdWQvY29udGVudC81NTM5NzYzKV0g44GL44KJ44CBU2F2ZSBhIFBlcm1hbmVudCBDb3B577yJCgogICAgLSAgIFJTdHVkaW8g44KS6Ieq5YiG44Gu44Kz44Oz44OU44Ol44O844K/44Gr44Kk44Oz44K544OI44O844Or44GX44Gm44GE44KL5Lq644Gv6LW35YuVCgo0LiAg44Oq44Oz44Kv44Gu5Y+z5LiK44GuIFJhdyDjg5zjgr/jg7Pjga7lj7Pjga4gQ29weSBhIHJhdyBmaWxlIOOBi+OCieOCs+ODlOODvOOBl+OBpua8lOe/kueUqCBSIE1hcmtkb3duIOODleOCoeOCpOODq+OCkuS9nOaIkO+8iOOBguOBqOOBp+WGjeW6puino+iqrOOBl+OBvuOBme+8iVtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvdzVlZGEuUm1kKV0KCiMjIOODleOCoeOCpOODqwoKIyMjIOODleOCoeOCpOODq+OCkuS9nOaIkOOBmeOCi+OBqOOBjeOBruazqOaEjwoKMS4gIFBvc2l0IENsb3VkIOOBruOBqOOBjeOBr+OAgeOBvuOBmuOAgUxvZ2luIOOBl+OAgWludHJvMnJqIOOBruODl+ODreOCuOOCp+OCr+ODiOOBq+WFpeOCiuOAgSDjg5XjgqHjgqTjg6vjgYvjgonjgIFnZXMwMDEg44Gu44OV44Kp44Or44OA44O844KS6YG45oqe44GX44Gm44CB44Gd44KM44KS6YG45oqe44GX44Gm44CB56e75YuV44GX44G+44GZ44CC44GT44Gu5Lit44Gr44CBZGF0YSDjg5Xjgqnjg6vjg4DjgYzkvZzmiJDjgZXjgozjgabjgYTjgovjgZPjgajjgpLnorroqo3jgZfjgIHjgZPjga5nZXMwMDEg44Gr44CB5paw44GX44GP5L2c5oiQ44GX44Gf44OV44Kh44Kk44Or44KS5L+d5a2Y44GX44G+44GZ44CC5paw44GX44GP5L2c5oiQ44GX44Gf44OV44Kh44Kk44Or44Gu5YWl44Gj44Gm44GE44KL44OV44Kp44Or44OA44O844Gu5Lit44Gr44CBZGF0YSDjg5Xjgqnjg6vjg4DjgYzjgYLjgovjgZPjgajjgYzlpKfliIfjgafjgZnjgILjgZ3jgZPjgavjgIHjg4fjg7zjgr/jgpLmm7jjgY3ovrzjgb/jgb7jgZnjgIIKCjIuICBSU3R1ZGlvIOOBruWgtOWQiOOBq+OBr+OAgeOBvuOBmuOBr+OAgeOBguOBn+OCieOBl+OBhOOAgFByb2plY3Qg44KS5L2c5oiQ44GX44G+44GZ44CCRmlsZSBcPiBOZXcgUHJvamVjdCDjgYvjgonkvZzmiJDjgZfjgb7jgZnjgILjgZnjgafjgavjgIHkvZzmiJDjgZfjgabjgYLjgovloLTlkIjjga/jgIHjgZ3jgozjgpLjgIFPcGVuIFByb2plY3Qg44KE44CBUmVjZW50IFByb2plY3Qg44GL44KJ6ZaL44GN44G+44GZ44CC44Gd44Gu5Lit44Gr44CB5paw44GX44GE44OV44Kh44Kk44Or44KS5L2c5oiQ44GX44G+44GZ44CC5L2c5oiQ44GX44Gf44OV44Kp44Or44OA44O844Gr44CBZGF0YSDjg5Xjgqnjg6vjg4DjgYzjgYLjgovjgZPjgajjgpLnorroqo3jgZfjgabjgY/jgaDjgZXjgYTjgILmlrDjgZfjgY/kvZzmiJDjgZfjgZ/jg5XjgqHjgqTjg6vjga7lhaXjgaPjgabjgYTjgovjg5Xjgqnjg6vjg4Djg7zjga7kuK3jgavjgIFkYXRhIOODleOCqeODq+ODgOOBjOOBguOCi+OBk+OBqOOBjOWkp+WIh+OBp+OBmeOAguOBneOBk+OBq+OAgeODh+ODvOOCv+OCkuabuOOBjei+vOOBv+OBvuOBmeOAggoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg44OV44Kh44Kk44Or44KS5o+Q5Ye644GZ44KL44Go44GN44Gu5rOo5oSPCgpSU3R1ZGlvIOOBruWgtOWQiOOBq+OBr+OAgeiHquWIhuOBriBQQyDjgavkvZzmiJDjgZfjgZ/jg5XjgqHjgqTjg6vjgYzjgYLjgorjgb7jgZnjgYvjgonjgIHllY/poYzjgarjgYTjgajmgJ3jgYTjgb7jgZnjgYzjgIFQb3NpdCBDbG91ZCDjgafkvZzmiJDjgZfjgZ/loLTlkIjjgavjga/jgIHmj5Dlh7rjgZfjgZ/jgYTjg5XjgqHjgqTjg6vjga7lt6bjgavjgYLjgovjg4Hjgqfjg4Pjgq/jg5zjg4Pjgq/jgrnjgpLjg4Hjgqfjg4Pjgq/jgZfjgb7jgZnjgIJGaWxlcyDjga4g5Y+z56uv44Gr44GC44KL44CB44Ku44Ki44Oe44O844Kv44GuIEV4cG9ydCDjgpLmirzjgZnjgajjgIHjg4Djgqbjg7Pjg63jg7zjg4njgafjgY3jgb7jgZnjgILjgZ3jgozjgpLmj5Dlh7rjgZfjgabjgY/jgaDjgZXjgYTjgILmnKvlsL7jgYzjgIFuYi5odG1sIOOBqOOBquOBo+OBpuOBhOOCi+OCguOBruOCkuaPkOWHuuOBl+OBpuOBhOOBn+OBoOOBj+OBruOBjOOCiOOBhOOBp+OBmeOBjOOAgeOCiOOBj+OCj+OBi+OCieOBquOBhOOBqOOBjeOBr+OAgW5iLmh0bWwg44OV44Kh44Kk44Or44Go44CBUm1kIOODleOCoeOCpOODq+OBqOS4oeaWueaPkOWHuuOBl+OBpuOBj+OBoOOBleOBhOOAgQoKIyMg56ysNemAsQoKMDEvMTgoVEgp44CA5Y2X6YOo44Ki44OV44Oq44Kr6Ku45Zu944Gu6LKn5Zuw44Go5LiN5bmz562J44Gr5a++44GZ44KL5a++562WCgrjgIDjgIDjgIDjgIDjgIDjgIBDT1ZJRC0xOeOBjOiyp+WbsOOBq+S4juOBiOOBn+W9semfvyDjgIDjgIDjgIDjgIAKCi0gICDmqZ/kvJrjga7kuI3lubPnrYnjgajmiJDmnpzjga7kuI3lubPnrYnjgYznm7jkupLjgavplqLkv4LjgZfjgIHplbfmnJ/jgavjgo/jgZ/jgaPjgabmjIHntprjgZfjgabjgYTjgovjgIIKCi0gICDkurrnlJ/jga7liJ3mnJ/jgavlh7rnj77jgZnjgovkuI3lubPnrYnjgpLmnIDlsI/ljJbjgZnjgovjgZ/jgoHjga7mlL/nrZbjgYzph43opoHjgafjgYLjgovjgIIKCi0gICDopoHlm6DvvJrmlZnogrLjgIHlirTlg43luILloLTjgIHlpLHmpa3njofjgIHnlLflpbPplpPmoLzlt67jgIHlnJ/lnLDmiYDmnInmqKnjgIHjgarjganjgarjganjgIDjgIAKCjAxLzIzKFRVKeOAgFLjgafjg4fjg7zjgr/jgrXjgqTjgqjjg7Pjgrk144CAIFtbTWFpbl0oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvKV0KCiMg5ryU57+SIDHmnIgyNOaXpe+8iOeBq++8iQoKIyMg5YaF5a65CgotICAgUG92ZXJ0eSBoZWFkY291bnQgcmF0aW8gYXQgXCQ2Ljg1IGEgZGF5ICgyMDE3IFBQUCkgKCUgb2YgcG9wdWxhdGlvbinvvJpTSS5QT1YuVU1JQyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSS5QT1YuVU1JQyldCgotICAgR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCnvvJpTRS5YUEQuVE9UTC5HRC5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5YUEQuVE9UTC5HRC5aUyldCgotICAgU2Nob29sIGVucm9sbG1lbnQsIHByaW1hcnkgKCUgZ3Jvc3Mp77yaU0UuUFJNLkVOUlIgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0UuUFJNLkVOUlIpXQoKLSAgIFNjaG9vbCBlbnJvbGxtZW50LCBzZWNvbmRhcnkgKCUgZ3Jvc3Mp77yaU0UuU0VDLkVOUlIgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0UuU0VDLkVOUlIpXQoKLSAgIFNjaG9vbCBlbnJvbGxtZW50LCB0ZXJ0aWFyeSAoJSBncm9zcynvvJpTRS5URVIuRU5SUiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5URVIuRU5SUildCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi0gICBNb3J0YWxpdHkgcmF0ZSwgdW5kZXItNSAocGVyIDEsMDAwIGxpdmUgYmlydGhzKe+8mlNILkRZTi5NT1JUIFtbTGlua10oaHR0cHM6Ly9kYXRhYmFuay53b3JsZGJhbmsub3JnL21ldGFkYXRhZ2xvc3Nhcnkvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycy9zZXJpZXMvU0guRFlOLk1PUlQpXQoKLSAgIEluY2lkZW5jZSBvZiBISVYgKCUgb2YgdW5pbmZlY3RlZCBwb3B1bGF0aW9uIGFnZXMgMTUtNDkp77yaU0guSElWLklOQ0QuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0guSElWLklOQ0QuWlM/bG9jYXRpb25zPVNaKV0KCi0gICBTY2hvb2wgZW5yb2xsbWVudCwgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IChncm9zcyksIGdlbmRlciBwYXJpdHkgaW5kZXggKEdQSSnvvJpTRS5FTlIuUFJTQy5GTS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5FTlIuUFJTQy5GTS5aUyldCgotICAgUmF0aW8gb2YgZmVtYWxlIHRvIG1hbGUgbGFib3IgZm9yY2UgcGFydGljaXBhdGlvbiByYXRlICglKSAobW9kZWxlZCBJTE8gZXN0aW1hdGUp77yaU0wuVExGLkNBQ1QuRk0uWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0wuVExGLkNBQ1QuRk0uWlMpXQoKLSAgIFVuZW1wbG95bWVudCwgZmVtYWxlICglIG9mIGZlbWFsZSBsYWJvciBmb3JjZSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlVFTS5UT1RMLkZFLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlVFTS5UT1RMLkZFLlpTKV0KCi0gICBVbmVtcGxveW1lbnQsIG1hbGUgKCUgb2YgbWFsZSBsYWJvciBmb3JjZSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlVFTS5UT1RMLk1BLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlVFTS5UT1RMLk1BLlpTKV0KCi0gICBOZXQgb2ZmaWNpYWwgZGV2ZWxvcG1lbnQgYXNzaXN0YW5jZSBhbmQgb2ZmaWNpYWwgYWlkIHJlY2VpdmVkIChjdXJyZW50IFVTXCQpIERULk9EQS5BTExELkNEIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0RULk9EQS5BTExELkNEKV0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOa6luWCmQoKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KFdESSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDjg4fjg7zjgr/jga7oqq3jgb/ovrzjgb/vvIhpbXBvcnRpbmfvvIkKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfcG92ZXJ0eV9pbmVxdWFsaXR5IDwtIFdESSgKICBpbmRpY2F0b3IgPSBjKGdpbmkgPSAiU0kuUE9WLkdJTkkiLAogICAgICAgICAgICAgICAgdW5kZXJfNi44NSA9ICJTSS5QT1YuVU1JQyIsCiAgICAgICAgICAgICAgICBlZF9leHAgPSAiU0UuWFBELlRPVEwuR0QuWlMiLAogICAgICAgICAgICAgICAgcHJpbWFyeSA9ICJTRS5QUk0uRU5SUiIsCiAgICAgICAgICAgICAgICBzZWNvbmRhcnkgPSAiU0UuU0VDLkVOUlIiLAogICAgICAgICAgICAgICAgdGVydGlhcnkgPSAiU0UuVEVSLkVOUlIiLAogICAgICAgICAgICAgICAgdW5kZXI1ID0gIlNILkRZTi5NT1JUIiwKICAgICAgICAgICAgICAgIG5ld19oaXYgPSAiU0guSElWLklOQ0QuWlMiLAogICAgICAgICAgICAgICAgc2Nob29sX2dwaSA9ICJTRS5FTlIuUFJTQy5GTS5aUyIsCiAgICAgICAgICAgICAgICBqb2JfZ3BpID0gIlNMLlRMRi5DQUNULkZNLlpTIiwKICAgICAgICAgICAgICAgIGZlbWFsZV91bmVtcGxveSA9ICJTTC5VRU0uVE9UTC5GRS5aUyIsCiAgICAgICAgICAgICAgICBtYWxlX3VuZW1wbG95ID0gIlNMLlVFTS5UT1RMLkZFLlpTIiwKICAgICAgICAgICAgICAgIG9kYSA9ICJEVC5PREEuQUxMRC5DRCIpLCBleHRyYSA9IFRSVUUpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMjIOS/neWtmOOBqOiqreOBv+i+vOOBvwoK77yS5Zue55uu44GL44KJ44Gv44CBYGRhdGFgIOOBi+OCieiqreOBv+i+vOOCgeOCi+OCiOOBhuOBq+OBl+OBpuOBiuOBjeOBvuOBmeOAggoKKioq5pyA5Yid44Gu77yR5Zue55uu44Gv44CB44GL44Gq44KJ44Ga5a6f6KGM44GX44Gm44GP44Gg44GV44GE44CCKioqCgpgYGB7ciBldmFsID0gRkFMU0V9CndyaXRlX2NzdihkZl9wb3ZlcnR5X2luZXF1YWxpdHksICJkYXRhL3BvdmVydHlfaW5lcXVhbGl0eS5jc3YiKQpgYGAKCmBgYHtyfQpkZl9wb3ZlcnR5X2luZXF1YWxpdHkgPC0gcmVhZF9jc3YoImRhdGEvcG92ZXJ0eV9pbmVxdWFsaXR5LmNzdiIpCmBgYAoKPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+Cgo8IS0tIGBgYHtyfSAtLT4KCjwhLS0gUkVHSU9OIDwtIGMoIjFBIiwgIjFXIiwgIjRFIiwgIjdFIiwgIjhTIiwgIkI4IiwgIkVVIiwgIkYxIiwgIk9FIiwgIlMxIiwgIC0tPgoKPCEtLSAiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAgLS0+Cgo8IS0tICJWMyIsICJWNCIsICJYQyIsICJYRCIsICJYRSIsICJYRiIsICJYRyIsICJYSCIsICJYSSIsICJYSiIsICJYTCIsICAtLT4KCjwhLS0gIlhNIiwgIlhOIiwgIlhPIiwgIlhQIiwgIlhRIiwgIlhUIiwgIlhVIiwgIlhZIiwgIlo0IiwgIlo3IiwgIlpGIiwgIC0tPgoKPCEtLSAiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKSAtLT4KCjwhLS0gYGBgIC0tPgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg44OH44O844K/44KS6KaL44Gm44G/44KI44GGICh2aWV3aW5nKQoKYGBge3J9CmRmX3BvdmVydHlfaW5lcXVhbGl0eSAKYGBgCgo8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT4KCjwhLS0gYGBge3J9IC0tPgoKPCEtLSBkZl9wb3ZlcnR5X2luZXF1YWxpdHkgfD4gZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykgLS0+Cgo8IS0tIGBgYCAtLT4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOWkieaVsOOBrumBuOaKnu+8iHNlbGVjdGluZ++8iQoKYGBge3J9CmRmX3Bvdl9pbmVxIDwtIGRmX3BvdmVydHlfaW5lcXVhbGl0eSB8PiAKICBzZWxlY3QoY291bnRyeSwgaXNvMmMsIHllYXIsIGdpbmk6b2RhLCByZWdpb24sIGluY29tZSwgbGVuZGluZykKZGZfcG92X2luZXEKYGBgCgo8IS0tICMjIyDlpInlvaLvvIhXaWRlIHRvIExvbmcgRGF0Ye+8iSAtLT4KCjwhLS0g44GE44GP44Gk44KC44Gu5oyH5qiZ44KS5ZCM5pmC44Gr44GE44GP44Gk44GL6YG45oqe44GX5q+U6LyD44GX44Gf44GE44Gu44Gn44CB5LiA44Gk44Gu5YiX77yI5aSJ5pWw77yJ44Gr44Gq44KJ44G544Gf44CB57im6ZW344OH44O844K/77yIbG9uZyBkYXRh77yJ44KC5L2c5oiQ44GX44Gm44GK44GN44G+44GZ44CCIC0tPgoKPCEtLSBgcGl2b3RfbG9uZ2VyKGdpbmk6b2RhKWAgLS0+Cgo8IS0tIOOBk+OBk+OBp+OBr+OAgWByYXRpb2Ag44GL44KJIGB1bmRlcl82Ljg1YCDjgpLjgIFgbGV2ZWxgIOOBqOOBhOOBhuWQjeWJjeOBruWIl+OBq+OBquOCieOBueOAgeWApOOCkiBgdmFsdWVgIOOBqOOBhOOBhuWIl+OBq+S4puOBueOCi+OCiOOBhuOBq+OBl+OBpuOBguOCiuOBvuOBmeOAgiAtLT4KCjwhLS0g56K66KqN44GZ44KL44Go44GN44Gv44CBdmFsdWUg44GMIE5BIOOBruOCguOBruOBr+mZpOOBjeOAgWNvdW50cnkg44Go44CBaXNvMmMg44Go44CBbGV2ZWwg44GoIHZhbHVlIOOBrumDqOWIhuOBoOOBkeWPluOCiuWHuuOBl+OBpueiuuiqjeOBl+OBpuOBhOOBvuOBmeOAgiAtLT4KCjwhLS0gYGBge3J9IC0tPgoKPCEtLSBkZl9wb3ZfaW5lcV9sb25nIDwtIGRmX3Bvdl9pbmVxIHw+IHBpdm90X2xvbmdlcihnaW5pOm9kYSkgLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPgoKPCEtLSAjIyMg5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu56K66KqN77yIbnVtYmVyIG9mIGRhdGEgaW4gZWFjaCB5ZWFy77yJIC0tPgoKPCEtLSBgYGB7cn0gLS0+Cgo8IS0tIGRmX3Bvdl9pbmVxX2xvbmcgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gIC0tPgoKPCEtLSAgIGdyb3VwX2J5KHllYXIsIG5hbWUpIHw+IHN1bW1hcml6ZShuID0gbigpKSB8PiBhcnJhbmdlKGRlc2MoeWVhcikpIC0tPgoKPCEtLSBgYGAgLS0+Cgo8IS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOWkieaVsOWQjOWjq+OBruebuOmWoumWouS/gjogTkEg44Gn44Gv44Gq44GE44Go44GT44KN44Gu44G/6YG45oqeCgpgYGB7cn0KZGZfcG92X2luZXEgfD4gZHJvcF9uYShnaW5pOm9kYSkgfD4gc2VsZWN0KGdpbmk6b2RhKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmNvcihjYXJzJHNwZWVkLGNhcnMkZGlzdCkKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTMsIGZpZy53aWR0aD03fQpjYXJzIHw+IGdncGxvdChhZXMoc3BlZWQsIGRpc3QpKSArIGdlb21fcG9pbnQoKSArIAogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JyxtZXRob2QgPSAibG0iLCBzZT1GQUxTRSkKYGBgCgoqKuebuOmWouS/guaVsO+8mioq55u057ea44Gu5YK+44GN44GM5q2j44Gq44KJ5q2j44CB6LKg44Gq44KJ6LKg44CB55u057ea44Gr6L+R44GE56iL44CBMSDjgb7jgZ/jga8tMSDjgavov5HjgYQKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOWkieaVsOebuOS6kuOBruebuOmWouS/guaVsOOCkuS4gOW6puOBq+axguOCgeOCiwoKYGBge3IgZWNobz1UUlVFLCBldmFsPUZBTFNFfQpkZl9wb3ZfaW5lcSB8PiBkcm9wX25hKGdpbmk6b2RhKSB8PiBzZWxlY3QoZ2luaTpvZGEpIHw+IGNvcigpIHw+IAogIHJvdW5kKGRpZ2l0cyA9IDIpIHw+IGFzLmRhdGEuZnJhbWUoKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3IgZWNobz1GQUxTRX0KZGZfcG92X2luZXEgfD4gZHJvcF9uYShnaW5pOm9kYSkgfD4gc2VsZWN0KGdpbmk6b2RhKSB8PiBjb3IoKSB8PiAKICByb3VuZChkaWdpdHMgPSAyKSB8PiBhcy5kYXRhLmZyYW1lKCkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3ZfaW5lcSB8PiBkcm9wX25hKGdpbmk6b2RhKSB8PgogIGdncGxvdChhZXMoZ2luaSwgcHJpbWFyeSkpICsgZ2VvbV9wb2ludChhZXMoY29sID0gaW5jb21lKSkgKyAKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBsYWJzKHRpdGxlID0gImNvcihnaW5pLHByaW1hcnkpID0gMC4zNCIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KZGZfcG92X2luZXEgfD4gZHJvcF9uYShnaW5pOm9kYSkgfD4KICBnZ3Bsb3QoYWVzKGdpbmksIHRlcnRpYXJ5KSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSBpbmNvbWUpKSArIAogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnModGl0bGUgPSAiY29yKGdpbmksdGVydGlhcnkpID0gLTAuMjkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3Bvdl9pbmVxIHw+IGRyb3BfbmEoZ2luaTpvZGEpIHw+CiAgZ2dwbG90KGFlcyh1bmRlcl82Ljg1LCB0ZXJ0aWFyeSkpICsgZ2VvbV9wb2ludChhZXMoY29sID0gaW5jb21lKSkgKyAKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsbSIsIHNlID0gRkFMU0UpICsKICBsYWJzKHRpdGxlID0gImNvcih1bmRlcl82Ljg1LHRlcnRpYXJ5KSA9IC0wLjc3IikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wb3ZfaW5lcSB8PiBkcm9wX25hKGdpbmk6b2RhKSB8PgogIGdncGxvdChhZXModW5kZXJfNi44NSwgdW5kZXI1KSkgKyBnZW9tX3BvaW50KGFlcyhjb2wgPSBpbmNvbWUpKSArIAogIGdlb21fc21vb3RoKGZvcm11bGEgPSAneX54JywgbWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGxhYnModGl0bGUgPSAiY29yKHVuZGVyXzYuODUsdW5kZXI1KSA9IDAuNzEiKQpgYGAKCjwhLS0gYGBge3J9IC0tPgoKPCEtLSBkZl9lZHVjYXRpb25fbG9uZyB8PiAgLS0+Cgo8IS0tICAgZ3JvdXBfYnkoeWVhciwgbmFtZSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4gLS0+Cgo8IS0tICAgc3VtbWFyaXplKG51bSA9IG4oKSkgfD4gIC0tPgoKPCEtLSAgIGdncGxvdChhZXMoeWVhciwgbnVtLCBjb2wgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKSArIC0tPgoKPCEtLSAgIGxhYnModGl0bGUgPSAi5ZCE5oyH5qiZ44Gu5bm05q+O44Gu44OH44O844K/5pWwIiwgeSA9ICLjg4fjg7zjgr/mlbAiLCB4ID0gIuW5tCIpIC0tPgoKPCEtLSBgYGAgLS0+Cgo8IS0tIFdvcmxkIERldmVsb3BtZW50IEluZGljYXRvcnM6IFtbTGlua10oaHR0cHM6Ly9kYXRhY2F0YWxvZy53b3JsZGJhbmsub3JnL3NlYXJjaC9kYXRhc2V0LzAwMzc3MTIvV29ybGQtRGV2ZWxvcG1lbnQtSW5kaWNhdG9ycyldIC0tPgoKPCEtLSAjIyMgV29ybGQgKDFXKSwgU3ViLVNhaGFyYW4gQWZyaWNh44CAKGV4Y2x1ZGluZyBoaWdoIGluY29tZSkgKFpGKSwgYW5kIFN1Yi1TYWhhcmFuIEFmcmljYSAoWkcpIC0tPgoKPCEtLSBgYGB7cn0gLS0+Cgo8IS0tIGRmX2VkdWNhdGlvbl9sb25nIHw+ICAtLT4KCjwhLS0gICBmaWx0ZXIobmFtZSAlaW4lIGMoInByaW1hcnkiLCAic2Vjb25kYXJ5IiwgInRlcnRpYXJ5IikpIHw+IC0tPgoKPCEtLSAgIGZpbHRlcihpc28yYyAlaW4lIGMoIjFXIiwgIlpGIiwgIlpHIikpIHw+IGRyb3BfbmEodmFsdWUpIHw+IC0tPgoKPCEtLSAgIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IG5hbWUsIGxpbmV0eXBlID0gaXNvMmMpKSArIGdlb21fbGluZSgpIC0tPgoKPCEtLSBgYGAgLS0+Cgo8IS0tIGBgYHtyfSAtLT4KCjwhLS0gZGZfZWR1Y2F0aW9uIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+ICAtLT4KCjwhLS0gICBzZWxlY3QoZWR1Y2F0aW9uLCBwcmltYXJ5LCBzZWNvbmRhcnksIHRlcnRpYXJ5KSB8PiAgLS0+Cgo8IS0tICAgZHJvcF9uYSgpIHw+IGNvcigpIC0tPgoKPCEtLSBgYGAgLS0+Cgo8IS0tIGBgYHtyfSAtLT4KCjwhLS0gZGZfZWR1Y2F0aW9uIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGFycmFuZ2UoZGVzYyh5ZWFyKSkgLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge3J9IC0tPgoKPCEtLSBkZl9lZHVjYXRpb24gfD4gZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpIHw+IC0tPgoKPCEtLSAgIGZpbHRlcih5ZWFyID09IDIwMjApIHw+IC0tPgoKPCEtLSAgIGRyb3BfbmEoZWR1Y2F0aW9uKSB8PiAgLS0+Cgo8IS0tICAgZ2dwbG90KGFlcyhlZHVjYXRpb24sIGZpbGwgPSByZWdpb24pKSArIGdlb21faGlzdG9ncmFtKGNvbCA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMSwgYmlud2lkdGggPSAxKSArIC0tPgoKPCEtLSAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDMuNDE2OTgxKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSAtLT4KCjwhLS0gYGBgIC0tPgoKPCEtLSBgYGB7cn0gLS0+Cgo8IS0tIGRmX2VkdWNhdGlvbiB8PiAgLS0+Cgo8IS0tICAgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJXb3JsZCIsICJKYXBhbiIsICJTb3V0aCBBZnJpY2EiKSkgfD4gLS0+Cgo8IS0tICAgZHJvcF9uYShlZHVjYXRpb24pIHw+IC0tPgoKPCEtLSAgIGdncGxvdChhZXMoeWVhciwgZWR1Y2F0aW9uLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSAgLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gYGBge3J9IC0tPgoKPCEtLSBkZl9lZHVjYXRpb24gfD4gIC0tPgoKPCEtLSAgIGZpbHRlcihjb3VudHJ5ICVpbiUgYygiV29ybGQiLCAiSmFwYW4iLCAiS29yZWEsIFJlcC4iLCAiQ2hpbmEiKSkgfD4gLS0+Cgo8IS0tICAgZHJvcF9uYShlZHVjYXRpb24pIHw+IC0tPgoKPCEtLSAgIGdncGxvdChhZXMoeWVhciwgZWR1Y2F0aW9uLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSAgLS0+Cgo8IS0tIGBgYCAtLT4KCjwhLS0gIyMg44OV44Kh44Kk44Or44Oq44Oz44KvIC0tPgoKPCEtLSAtICAgUG9zaXRDbG91ZCDlhbHmnInjg6rjg7Pjgq/vvJo8aHR0cHM6Ly9wb3NpdC5jbG91ZC9jb250ZW50LzU1Mzk3NjM+IC0tPgoKPCEtLSAgICAgLSAgIOiyp+WbsOeOhyAtIFBvdmVydHkgUmF0Ze+8iHBvdmVydHlfcmF0ZS5SbWTvvIkgW1vjg6rjg7Pjgq9dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3BvdmVydHlfcmF0ZS5uYi5odG1sKV0sIFtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvcG92ZXJ0eV9yYXRlLlJtZCldIC0tPgoKPCEtLSAgICAgICAgIC0gICDjgojjgoroqbPntLDjgarjgoLjga7vvJpwb3ZlcnR5X3JhdGVfbG9uZy5SbWQgW1vjg6rjg7Pjgq9dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3BvdmVydHlfcmF0ZV9sb25nLm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS9wb3ZlcnR5X3JhdGVfbG9uZy5SbWQpXSAtLT4KCjwhLS0gICAgICAgICAgICAgLSAgIFBvc2l0Q2xvdWQg44Gn44Gv44CB44Oh44Oi44Oq44O844Kq44O844OQ44O8IC0tPgoKPCEtLSAtICAgUiBOb3RlYm9vayDjga7jgr3jg7zjgrnjg5XjgqHjgqTjg6vvvIhSbWTvvInjgpLlj5blvpfjgZnjgovkuInjgaTjga7mlrnms5UgLS0+Cgo8IS0tICAgICAxLiAgKipSbWQg44Gu44Oq44Oz44Kv44KS44Kv44Oq44OD44Kv44GXIFJhdyDjga7mqKrjga4gQ29weSBhIHJhdyBmaWxlIOOBi+OCieOCs+ODlOODvOOAgeaWsOimjyBSTWFya2Rvd24g44OV44Kh44Kk44Or44KSIFBvc2l0Q2xvdWQg44G+44Gf44GvIFJTdHVkaW8g44Gu44OX44Ot44K444Kn44Kv44OI5YaF44Gr5L2c5oiQ44GX44Oa44O844K544OIKiogLS0+Cgo8IS0tICAgICAyLiAgUG9zaXRDbG91ZCDlhbHmnInjg6rjg7Pjgq/jga4gZ2VzMDAxIOOBruODh+OCo+ODrOOCr+ODiOODqu+8iOODleOCqeODq+ODgOOBi+OCieaOouOBme+8ieODleOCoeOCpOODq+OCkumWi+OBjeOAgeWFqOS9k+OCkumBuOaKnuOBl+OBpuOCs+ODlOODvOOBl+OAgeiHquWIhuOBriBSU3R1ZGlvIOOBvuOBn+OBr+OAgVBvc2l0Q2xvdWQg44Gu44OV44Kh44Kk44Or44Gn44CBUk1hcmtkb3duIOODleOCoeOCpOODq+OCkuaWsOimj+S9nOaIkOOBl+ODmuODvOOCueODiCAtLT4KCjwhLS0gICAgIDMuICDjg6rjg7Pjgq/jgpLplovjgY3jgIHlj7PkuIrjga4gQ29kZSDjgYvjgonjgIFSbWQg44OV44Kh44Kk44Or44KS44OA44Km44Oz44Ot44O844OJ44Go44GX44CB44Gd44KM44KS44CB6Ieq5YiG44GuIFJTdHVkaW8g44G+44Gf44Gv44CBUG9zaXRDbG91ZCDjga7jg5fjg63jgrjjgqfjgq/jg4jjgavnp7vli5XvvIhVcGxvYWTvvIkgLS0+Cgo8IS0tICMjIOS9nOalreaJi+mghuOBqOOBvuOBqOOCgSAtLT4KCjwhLS0gLSAgIOODkeODg+OCseODvOOCuO+8iFBhY2thZ2XvvInjga7liKnnlKjvvJogLS0+Cgo8IS0tICAgICAtICAg44Kk44Oz44K544OI44O844Or77yIaW5zdGFsbGF0aW9u77yJ77yaVG9vbHMgXD4gSW5zdGFsbCBQYWNrYWdlcyAtLT4KCjwhLS0gICAgIC0gICDjg63jg7zjg4nvvIhsb2Fk77yJYGxpYnJhcnkodGlkeXZlcnNlKTsgbGlicmFyeShXREkpOyBsaWJyYXJ5KHNob3d0ZXh0KTsgbGlicmFyeShEZXNjVG9vbHMpYCAtLT4KCjwhLS0gLSAgIOODh+ODvOOCv+OBruWPluW+l++8mmBXREkoaW5kaWNhdG9yID0gYyhwb3AgPSAiU1AuUE9QLlRPVEwiKSlgIC0tPgoKPCEtLSAgICAgLSAgIGBXREkoaW5kaWNhdG9yID0gYyhyYXRpbyA9ICJTSS5QT1YuTkFIQyIsIHVuZGVyXzIuMTUgPSAiU0kuUE9WLkREQVkiLCB1bmRlcl8zLjY1ID0gIlNJLlBPVi5MTUlDIiwgdW5kZXJfNi44NSA9ICJTSS5QT1YuVU1JQyIpLCBleHRyYSA9IFRSVUUpYCAtLT4KCjwhLS0gICAgIC0gICBkYXRhIOOBq+abuOOBjeWHuuOBl+OAgeOBneOBk+OBi+OCieiqreOBv+i+vOOCgOOBqOiJr+OBhOOAgiAtLT4KCjwhLS0gICAgICAgICAtICAgYHdyaXRlX2NzdihkZl9wb3ZlcnR5X3JhdGUsICJkYXRhL3BvdmVydHlfcmF0ZS5jc3YiKWAgLS0+Cgo8IS0tICAgICAgICAgLSAgIGByZWFkX2NzdigiZGF0YS9wb3ZlcnR5X3JhdGUuY3N2IilgIC0tPgoKPCEtLSAtICAg44OH44O844K/44KS6KaL44KL77yaYGRmX3BvdmVydHlfcmF0ZWAgLCBgaGVhZChkZl9wb3ZlcnR5X3JhdGUpYCwgYHN0cihkZl9wb3ZlcnR5X3JhdGUpYCAtLT4KCjwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPgoKPCEtLSAjIyMg44OH44O844K/44Gu5aSJ5b2iIC0tPgoKPCEtLSAtICAg5aSJ5pWw44Gu6YG45oqe77yaYHNlbGVjdChjb3VudHJ5LCB5ZWFyLCByYXRpbywgdW5kZXJfMi4xNSwgdW5kZXJfMy42NSwgdW5kZXJfNi44NSwgcmVnaW9uKWAgLS0+Cgo8IS0tIC0gICDjg4fjg7zjgr/jga7lpInlvaLvvIhMb25nIGRhdGHvvInvvJpgcGl2b3RfbG9uZ2VyKHJhdGlvOnVuZGVyXzYuODUsIG5hbWVzX3RvID0gImxldmVsIiwgdmFsdWVzX3RvID0gInZhbHVlIilgIC0tPgoKPCEtLSAtICAg54m55a6a44Gu6KGM44Gu5Y+W5b6X77yaYGZpbHRlcigpLCBkcm9wX25hKCksIGRpc3RpbmN0KClgIC0tPgoKPCEtLSAtICAg6KGM44Gu6aCG55Wq44Gu5Lim44Gz5pu/44GI77yaYGFycmFuZ2UoZGVzYyh5ZWFyKSlgIC0tPgoKPCEtLSAtICAg44Kw44Or44O844OX5YiG44GR77yaYGdyb3VwX2J5KClgICwgYGdyb3VwX2J5KHllYXIsIGxldmVsKSB8PiBzdW1tYXJpemUobiA9IG4oKSlgIC0tPgoKPCEtLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLS0+Cgo8IS0tICMjIyDlj6/oppbljJYgLS0+Cgo8IS0tIC0gICDmipjjgoznt5rjgrDjg6njg5UgLS0+Cgo8IS0tICAgICAtICAgYGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSB1bmRlcl8yLjE1KSArIGdlb21fbGluZSgpYCAtLT4KCjwhLS0gICAgIC0gICBgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IHVuZGVyXzIuMTUsIGNvbCA9IGNvdW50cnkpICsgZ2VvbV9saW5lKClgIC0tPgoKPCEtLSAtICAg44OS44K544OI44Kw44Op44Og77yI5bqm5pWw5YiG5biD77yJIC0tPgoKPCEtLSAgICAgLSAgIGBnZ3Bsb3QoYWVzKHVuZGVyXzIuMTUsIGZpbGwgPSByZWdpb24pKSArIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxNSlgIC0tPgoKPCEtLSAtICAg566x44Gy44GS5Zuz77yIQm94cGxvdO+8iSAtLT4KCjwhLS0gICAgIC0gICBgZ2dwbG90KGFlcyh1bmRlcl8yLjE1LCByZWdpb24sIGZpbGwgPSByZWdpb24pKSArIGdlb21fYm94cGxvdCgpYCAtLT4KCjwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC0tPgoKPCEtLSAtICAg5qOS44Kw44Op44OVIC0tPgoKPCEtLSAgICAgLSAgIGBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKClgIC0tPgoKPCEtLSAgICAgLSAgIGBnZ3Bsb3QoYWVzKGxldmVscywgdmFsdWUpKSArIGdlb21fY29sKClgIC0tPgoKPCEtLSAgICAgLSAgIGBnZ3Bsb3QoYWVzKHggPSBsZXZlbHMsIHkgPSB2YWx1ZSwgZmlsbCA9IGNvdW50cnkpKSArIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIilgIC0tPgoKPCEtLSAgICAgLSAgIGBnZ3Bsb3QoYWVzKHggPSBnaW5pLCBmaWxsID0gcmVnaW9uKSkgKyBnZW9tX2hpc3RvZ3JhbSgpYCAtLT4KCjwhLS0gLSAgIOaVo+W4g+Wbs++8iCvlm57luLDnm7Tnt5rvvIkgLS0+Cgo8IS0tICAgICAtICAgYGdncGxvdChhZXMoZ2luaSwgOTAtMTAwKSkgKyBnZW9tX3BvaW50KClgIC0tPgoKPCEtLSAgICAgLSAgIGBnZ3Bsb3QoYWVzKGdpbmksIDgwLTEwMCkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5IH4geCcsIG1ldGhvZCA9ICJsbSIpYCAtLT4KCjwhLS0gKioq5bi444Gr44CB6ICD5a+f44CB5rCX44Gl44GE44Gf44GT44Go44KS44CB6KiY6Yyy44GX44Gm44GP44Gg44GV44GE44CCKioqIC0tPgoKIyMg44OV44Kh44Kk44Or44Oq44Oz44Kv44Go6Kqy6aGMCgrln7rmnKznmoTjgavjga/jgIFQb3NpdENsb3Vk77yIPGh0dHBzOi8vcG9zaXQuY2xvdWQvPu+8ieOCkuS9v+OBo+OBpuWun+e/kgoKLSAgIOaOoue0oueahOODh+ODvOOCv+WIhuaekO+8iEVEQe+8iSAtCiAgICAtICAg57e057+S44Go5LiA44Gk55uu44Gu6Kqy6aGM77yIdzVlZGEuUm1k77yJIFtb44Oq44Oz44KvXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS93NWVkYS5uYi5odG1sKV0sIFtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvdzVlZGEuUm1kKV0KICAgIC0gICDkuozjgaTnm67ku6XpmY3jga7oqrLpoYzvvJp3NWVkYTEuUm1kIFtb44Oq44Oz44KvXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS93NWVkYTEubmIuaHRtbCldLCBbW1JtZF0oaHR0cHM6Ly9naXRodWIuY29tL2RzLXNsL2ludHJvMnIvYmxvYi9tYWluL2RvY3MvZ2VzMDAxL3c1ZWRhMS5SbWQpXQotICAg6Kqy6aGM77yaKioyMDIzLjEuMjcuIDIzOjU5Kiog44G+44Gn44GrIE1vb2RsZSDjga7mvJTnv5Ljga7oqrLpoYzjg5zjg4Pjgq/jgrnjgavmj5Dlh7rjgZfjgZ/jgoLjga7jgavjgaTjgYTjgabjga/jgIHjgarjgovjgbnjgY/jgIHml6njgY/opovjgabjgIHjg5XjgqPjg7zjg4njg5Djg4Pjgq/jgpLmm7jjgY3jgb7jgZnjgILjgZ3jgozku6XpmY3jgavmj5Dlh7rjgZXjgozjgZ/jgoLjga7jgoLopovjgb7jgZnjgYzjgIHjg5XjgqPjg7zjg4njg5Djg4Pjgq/jga/pgYXjgY/jgarjgovjgajmgJ3jgaPjgabjgY/jgaDjgZXjgYTjgIIKClIgTm90ZWJvb2sg44Gu44K944O844K544OV44Kh44Kk44Or77yIUm1k77yJ44KS5Y+W5b6X5pa55rOVCgotICAgKipSbWQg44Gu44Oq44Oz44Kv44KS44Kv44Oq44OD44Kv44GXIFJhdyDjga7mqKrjga4gQ29weSBhIHJhdyBmaWxlIOOBi+OCieOCs+ODlOODvOOAgeaWsOimjyBSTWFya2Rvd24g44OV44Kh44Kk44Or44KSIFBvc2l0Q2xvdWQg44G+44Gf44GvIFJTdHVkaW8g44Gu44OX44Ot44K444Kn44Kv44OI5YaF44Gr5L2c5oiQ44GX44Oa44O844K544OIKioKCiMjIOiqsumhjAoK5Lul5LiL44Gu5oyH5qiZ44Gu5Lit44GL44KJ44CB5LiA44Gk44KS6YG45oqe44GX44Gm44CB44OH44O844K/44Gu5qaC6KaB77yIZGVzY3JpcHRpb27vvInjgpLoqJjpjLLjgZfjgIHjg4fjg7zjgr/jgpIgV0RJIOOBp+WPluW+l+OBl+OAgeS7peS4i+OBruWIhuaekOOCkuOBmeOCi+OAggoKMS4gIOWQhOW5tOavjuOBruODh+ODvOOCv+OBruaVsOOBruajkuOCsOODqeODlQoyLiAg5pel5pys44Gu44OH44O844K/44Gu5bm044Gu6ZmN6aCG44Gn44Gu6KGo56S6CjMuICDntYzlubTlpInljJbjgpLooajjgZnmipjjgoznt5rjgrDjg6njg5UKICAgIGEuICDml6XmnKwKICAgIGIuICDljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm5/jga7vvJXjgqvlm70KICAgIGMuICDpgbjmip7jgZfjgZ/jgYTjgY/jgaTjgYvjga7lm70KNC4gIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBruODkuOCueODiOOCsOODqeODoAo1LiAg44OH44O844K/44GM5Y2B5YiG44GC44KL5pyA6L+R44Gu5bm044Gu5YCk44GuMTDjgqvlm73jga7lgKTjga7mo5LjgrDjg6njg5UKICAgIGEuICDlgKTjgYzlpKfjgY3jgYTmlrnjgYvjgokKICAgIGIuICDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCuOBneOCjOOBnuOCjOOBq+OBpOOBhOOBpuiAg+Wvn++8iOawl+OBpeOBhOOBn+OBk+OBqOOAgeeWkeWVj+OBquOBqe+8ieOCkuiomOOBmQoKKioyMDIzLjEuMjcuIDIzOjU5Kiog44G+44Gn44GrIE1vb2RsZSDjga7mvJTnv5Ljga7oqrLpoYzjg5zjg4Pjgq/jgrnjgavmj5Dlh7rjgZfjgZ/jgoLjga7jgavjgaTjgYTjgabjga/jgIHjgarjgovjgbnjgY/jgIHml6njgY/opovjgabjgIHjg5XjgqPjg7zjg4njg5Djg4Pjgq/jgpLmm7jjgY3jgb7jgZnjgILjgZ3jgozku6XpmY3jgavmj5Dlh7rjgZXjgozjgZ/jgoLjga7jgoLopovjgb7jgZnjgYzjgIHjg5XjgqPjg7zjg4njg5Djg4Pjgq/jga/pgYXjgY/jgarjgovjgajmgJ3jgaPjgabjgY/jgaDjgZXjgYTjgIIKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOaPkOWHuuWJjeOBrueiuuiqjQoKLSAgIFByZXZpZXcg44Gn56K66KqN44CCCgotICAgV2ViIEJyb3dzZXIg44Gn44CBdzVfYzEyMzQ1Ni5uYi5odG1sIOOBquOBqeOAgVIgTm90ZWJvb2sg44KS6KaL44Gm56K66KqN44CCCgotICAg44KC44GX44CB5ZWP6aGM44GM44GC44KM44Gw44CBUnVuIOODnOOCv+ODs+OBruWPs+OBruS4ieinkuOBi+OCieOAgVJ1biBBbGwg44KS6YG45oqe44GX44CB44Ko44Op44O844GM44Gn44Gq44GE44GL56K66KqN44CCCgotICAg5pyA5Yid44Gr44KC44Gp44KL44CCCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDpgJTkuK3jgafjga7jgqjjg6njg7wKCi0gICDlhaXlipvjgZfjgZ/jgajjgY3jgavjga/jgIHkvovjgpLlj4LnhafjgZfjgabjgIHjgrnjg5rjg6vjgarjganjgpLnorroqo3jgZfjgabjgY/jgaDjgZXjgYTjgILlhajop5LjgavjgarjgaPjgabjgYTjgovjgajllY/poYzjgYzjgYrjgY3jgb7jgZnjgIIoKSDjgYzjg5rjgqLjgafjg57jg4Pjg4HjgZfjgabjgYTjgovjgYvjgIHnorroqo3jgZfjgabjgY/jgaDjgZXjgYTjgIIKLSAgIOW8leeUqOespuOBjOWFpeOBo+OBpuOBhOOBquOBi+OBo+OBn+OCiuOAgT09IOOBruOBqOOBk+OCjeOBjOOAgT0g44Gg44Gj44Gf44KK44CB44GE44KN44GE44KN44Gq5Y+v6IO95oCn44GM44GC44KK44G+44GZ44CCRXJyb3IgbWVzc2FnZSDjgpLoqq3jgoDjgZPjgajjgoLjgZ/jgYTjgZvjgaTjgafjgZnjgILjgqjjg6njg7zjgYzjgafjgZ/jgIFDb2RlIENodW5rIOOBqOOAgUVycm9yIG1lc3NhZ2Ug44KS44CBQ2hhdEdQVCDjgoTjgIFHb29nbGUgQmFyZCwgR29vZ2xlIFNlYXJjaCDjgavlhaXjgozjgovjgajjgIHop6Pmsbrmlrnms5XjgpLmlZnjgYjjgabjgY/jgozjgovjgZPjgajjgoLjgYLjgorjgb7jgZnjgIIKLSAgIEZpbGUgbm90IGZvdW5kIOOBruOAgeOCqOODqeODvOOBjOOBp+OBn+OBqOOBjeOBq+OBr+OAgeS4iuOBi+OCiemghuOBq+OAgVJ1biDvvIhDb2RlIENodW5rIOOBruWPs+S4iuOBruS4ieinkuWNsOOCkuaKvOOBl+OBpuWun+ihjO+8ieOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAguOBvuOBn+OBr+OAgeOCqOODqeODvOOBjOWHuuOBn+OBqOOBk+OCjeOBq+OAgeOCq+ODvOOCveODq+OCkue9ruOBjeOAgeS4iuOBruOAgVJ1biDjg5zjgr/jg7Pjga7lj7Pjga7kuInop5LjgYvjgonjgIFSdW4gQWxsIENodW5rcyBBYm92ZSDjgpLpgbjmip7jgZnjgovjgajjgIHjgZ3jgZPjgb7jgafjga7jgZnjgbnjgabjga7jgIBDb2RlIENodW5rIOOCkuWun+ihjOOBl+OBpuOBj+OCjOOBvuOBmeOAggotICAg5LiK44Gu5pa55rOV44Gn44GG44G+44GP44GE44GL44Gq44GE44Go44GN44Gv44CBZGF0YSDjg5Xjgqnjg6vjg4DjgavjgIHjg4fjg7zjgr/vvIhcKlwqXCouY3N277yJ44GM5YWl44Gj44Gm44GE44KL44GL44KS56K66KqN44CB44Gq44GR44KM44Gw44CBZGF0YSDjg5Xjgqnjg6vjg4DjgYzjgYLjgovjgZPjgajjgpLnorroqo3jgZfjgabjgIHmnIDliJ3jga7jg4fjg7zjgr/oqq3jgb/ovrzjgb/jga7jgajjgZPjgo3jgpLlrp/ooYzjgZfjgabjgb/jgabjgY/jgaDjgZXjgYTjgIIKLSAgIOWun+ihjOOBp+OBjeOBpuOBhOOBpuOCguOAgee1kOaenOOBjOimi+OBiOOBquOBhOOBk+OBqOOCguOBguOCiuOBvuOBmeOAguOBneOBruOBqOOBjeOBr+OAgUNvZGUgQ2h1bmsg44Gu5LiL44Gr44GC44KL44CB5bGx5LqM44Gk44Gu6KiY5Y+344KS5oq844GX44Gm44G/44Gm44GP44Gg44GV44GE44CC44GT44KM44Gv44CB57WQ5p6c44KS6KGo56S644CB6Z2e6KGo56S644Gr44GX44G+44GZ44CC44Gd44KM44GM5Y6f5Zug44Gn6Zqg44KM44Gm44GE44KL5aC05ZCI44GM44GC44KK44G+44GZ44CCCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDjg4fjg7zjgr/vvIjlhajkvZPjgacxMe+8muacgOWIneOBruODquOCueODiOWPgueFp++8iQoKMS4gIEdvdmVybm1lbnQgZXhwZW5kaXR1cmUgb24gZWR1Y2F0aW9uLCB0b3RhbCAoJSBvZiBHRFAp77yaU0UuWFBELlRPVEwuR0QuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0UuWFBELlRPVEwuR0QuWlMpXSDlpInmlbDlkI3vvJpgZWRfZXhwYAoKMi4gIFNjaG9vbCBlbnJvbGxtZW50LCBwcmltYXJ5ICglIGdyb3NzKe+8mlNFLlBSTS5FTlJSIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLlBSTS5FTlJSKV0g5aSJ5pWw5ZCN77yaYHByaW1hcnlgCgozLiAgU2Nob29sIGVucm9sbG1lbnQsIHNlY29uZGFyeSAoJSBncm9zcynvvJpTRS5TRUMuRU5SUiBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5TRUMuRU5SUildIOWkieaVsOWQje+8mmBzZWNvbmRhcnlgCgo0LiAgU2Nob29sIGVucm9sbG1lbnQsIHRlcnRpYXJ5ICglIGdyb3NzKe+8mlNFLlRFUi5FTlJSIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NFLlRFUi5FTlJSKV0g5aSJ5pWw5ZCN77yaYHRlcnRpYXJ5YAoKNS4gIE1vcnRhbGl0eSByYXRlLCB1bmRlci01IChwZXIgMSwwMDAgbGl2ZSBiaXJ0aHMp77yaU0guRFlOLk1PUlQgW1tMaW5rXShodHRwczovL2RhdGFiYW5rLndvcmxkYmFuay5vcmcvbWV0YWRhdGFnbG9zc2FyeS93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzL3Nlcmllcy9TSC5EWU4uTU9SVCldIOWkieaVsOWQje+8mmB1bmRlcjVgCgo2LiAgSW5jaWRlbmNlIG9mIEhJViAoJSBvZiB1bmluZmVjdGVkIHBvcHVsYXRpb24gYWdlcyAxNS00OSnvvJpTSC5ISVYuSU5DRC5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TSC5ISVYuSU5DRC5aUz9sb2NhdGlvbnM9U1opXSDlpInmlbDlkI3vvJpgbmV3X2hpdmAKCjcuICBTY2hvb2wgZW5yb2xsbWVudCwgcHJpbWFyeSBhbmQgc2Vjb25kYXJ5IChncm9zcyksIGdlbmRlciBwYXJpdHkgaW5kZXggKEdQSSnvvJpTRS5FTlIuUFJTQy5GTS5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5FTlIuUFJTQy5GTS5aUyldIOWkieaVsOWQje+8mmBzY2hvb2xfZ3BpYAoKOC4gIFJhdGlvIG9mIGZlbWFsZSB0byBtYWxlIGxhYm9yIGZvcmNlIHBhcnRpY2lwYXRpb24gcmF0ZSAoJSkgKG1vZGVsZWQgSUxPIGVzdGltYXRlKe+8mlNMLlRMRi5DQUNULkZNLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NMLlRMRi5DQUNULkZNLlpTKV0g5aSJ5pWw5ZCN77yaYGpvYl9ncGlgCgo5LiAgVW5lbXBsb3ltZW50LCBmZW1hbGUgKCUgb2YgZmVtYWxlIGxhYm9yIGZvcmNlKSAobW9kZWxlZCBJTE8gZXN0aW1hdGUp77yaU0wuVUVNLlRPVEwuRkUuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0wuVUVNLlRPVEwuRkUuWlMpXSDlpInmlbDlkI3vvJpgZmVtYWxlX3VuZW1wbG95YAoKMTAuIFVuZW1wbG95bWVudCwgbWFsZSAoJSBvZiBtYWxlIGxhYm9yIGZvcmNlKSAobW9kZWxlZCBJTE8gZXN0aW1hdGUp77yaU0wuVUVNLlRPVEwuTUEuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU0wuVUVNLlRPVEwuTUEuWlMpXSDlpInmlbDlkI3vvJpgbWFsZV91bmVtcGxveWAKCjExLiBOZXQgb2ZmaWNpYWwgZGV2ZWxvcG1lbnQgYXNzaXN0YW5jZSBhbmQgb2ZmaWNpYWwgYWlkIHJlY2VpdmVkIChjdXJyZW50IFVTXCQpIERULk9EQS5BTExELkNEIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0RULk9EQS5BTExELkNEKV0g5aSJ5pWw5ZCN77yaYG9kYWAKCiMjIOS+i++8muWbveOBruaVmeiCsuOBq+mWouOBmeOCi+aUr+WHugoKKuOCueODqeOCpOODieOBp+imi+OBpuOBhOOCi+aWueOBr+OAgVJOb3RlYm9vayDjg5XjgqHjgqTjg6vjgafopovjgabjgY/jgaDjgZXjgYQqIFtb44Oq44Oz44KvXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9nZXMwMDExMS5uYi5odG1sKV0KCj4g5qaC6KaB77ya5Zu95YaF57eP55Sf55Sj77yIR0RQ77yJ44Gr5a++44GZ44KL44CB5Zu944Gu5pWZ6IKy44Gr6Zai44GZ44KL5pSv5Ye677yIR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCnvvInjga7jg4fjg7zjgr/jga7liIbmnpDjgpLooYzjgYYKCiMjIOODh+ODvOOCvwoKR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCnvvJpTRS5YUEQuVE9UTC5HRC5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TRS5YUEQuVE9UTC5HRC5aUyldCgojIyMg44OH44O844K/5oOF5aCxCgotICAg44OH44O844K/5ZCN77yaCgotICAg44OH44O844K/44Kz44O844OJ77yaCgotICAg5aSJ5pWw5ZCN77yaCgotICAg5qaC6KaB77yaCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDjg4fjg7zjgr/jga7lj5blvpcKCiMjIyMg5rqW5YKZCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCldESSDjg5Hjg4PjgrHjg7zjgrjjgpLkvb/jgaPjgabjgIHnm7TmjqXjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgZfjgIHlpInmlbDlkI3jgpLjgIFgZWRfZXhwYCDjgavmjIflrprjgIIKCmBgYHtyIGV2YWwgPSBGQUxTRX0KZGZfZWRfZXhwIDwtIFdESShpbmRpY2F0b3IgPSBjKGVkX2V4cCA9ICJTRS5YUEQuVE9UTC5HRC5aUyIpKQpgYGAKCmBgYHtyIGV2YWwgPSBGQUxTRX0Kd3JpdGVfY3N2KGRmX2VkX2V4cCwgImRhdGEvZWRfZXhwLmNzdiIpCmBgYAoKYGBge3J9CmRmX2VkX2V4cCA8LSByZWFkX2NzdigiZGF0YS9lZF9leHAuY3N2IikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl9lZF9leHAKYGBgCgpgYGB7cn0Kc3RyKGRmX2VkX2V4cCkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDlm73jgajlnLDln58KCmNvdW50cnkg44Gr44Gv44CB5Zu944Go5Zyw5Z+f5Lih5pa544GM5YWl44Gj44Gm44GE44G+44GZ44CC5Zyw5Z+f44GuIGlzbzJjIOOBr+S7peS4i+OBruOCguOBruOBp+OBmeOAggoKYGBge3J9ClJFR0lPTiA8LSBjKCIxQSIsICIxVyIsICI0RSIsICI3RSIsICI4UyIsICJCOCIsICJFVSIsICJGMSIsICJPRSIsICJTMSIsIAoiUzIiLCAiUzMiLCAiUzQiLCAiVDIiLCAiVDMiLCAiVDQiLCAiVDUiLCAiVDYiLCAiVDciLCAiVjEiLCAiVjIiLCAKIlYzIiwgIlY0IiwgIlhDIiwgIlhEIiwgIlhFIiwgIlhGIiwgIlhHIiwgIlhIIiwgIlhJIiwgIlhKIiwgIlhMIiwgCiJYTSIsICJYTiIsICJYTyIsICJYUCIsICJYUSIsICJYVCIsICJYVSIsICJYWSIsICJaNCIsICJaNyIsICJaRiIsIAoiWkciLCAiWkgiLCAiWkkiLCAiWkoiLCAiWlEiLCAiWlQiKQpgYGAKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4gZGlzdGluY3QoY291bnRyeSwgaXNvMmMpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg5YiG5p6Q44GZ44KL5Zu944Gu44Oq44K544OICgojIyMjICoq5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufKiogVGhlIFNvdXRoZXJuIEFmcmljYW4gQ3VzdG9tcyBVbmlvbiAoU0FDVSkKCmBgYHtyfQpTT1VUSF9BRlJJQ0FfRklWRSA8LSBjKCJTb3V0aCBBZnJpY2EiLCAiTmFtaWJpYSIsICJFc3dhdGluaSIsICJCb3Rzd2FuYSIsICJMZXNvdGhvIikKYGBgCgojIyMjIOODqeODhuODs+OCouODoeODquOCq+OBp+OCuOODi+aMh+aVsOOBjOWkp+OBjeOBhO+8lOOCq+WbvQoKYGBge3J9CkNIT1NFTl9HSU5JX0NPVU5UUklFUyA8LSBjKCJTdXJpbmFtZSIsICJCZWxpemUiLCAiQnJhemlsIiwgIkNvbG9tYmlhIikKYGBgCgojIyDliIbmnpAKCiMjIyAxLiDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKCmBgYHtyfQpkZl9lZF9leHAgfD4gZHJvcF9uYShlZF9leHApIHw+IGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIpKSArIGdlb21fYmFyKCkKYGBgCgojIyDoppbopprljJYKCiMjIyAyLiDml6XmnKzjga7mlZnogrLosrvvvIglIG9mIEdEUO+8iQoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiAKICBkcm9wX25hKGVkX2V4cCkgfD4gYXJyYW5nZShkZXNjKHllYXIpKQpgYGAKCiMjIyAzLiDntYzlubTlpInljJYKCiMjIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoKQpgYGAKCioq5rCX44Gl44GE44Gf44GT44Go44O755aR5ZWPKioKCi0gICAxOTcw5bm05Luj44Gu5oCl5r+A44Gq5LiK5piH44CBMTk5MOW5tOOBlOOCjeOBruaApea/gOOBquePvuixoeOBr+OAgeS9leOBjOWOn+WboOOBquOBruOBoOOCjeOBhuOAggoKLSAgIDIwMTTlubTjgZTjgo3jgYvjgonmuJvlsJHjgIEyMDE45bm044GU44KN44GL44KJ5aKX5Yqg44CBMjAyMOW5tOOBi+OCiTIwMjHlubTjga/muJvlsJHjgIIKCiMjIyMgYi4g5Y2X6YOo44Ki44OV44Oq44Kr6Zai56iO5ZCM55ufCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gZHJvcF9uYShlZF9leHApIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCBlZF9leHApKSArIGdlb21fbGluZShhZXMoY29sID0gY291bnRyeSkpICsKICBnZW9tX3Ntb290aChmb3JtdWxhID0gJ3l+eCcsIG1ldGhvZCA9ICJsb2VzcyIsIHNlID0gRkFMU0UpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjg7vnlpHllY8qKgoKLSAgIOW5s+Wdh+OBp+imi+OCi+OBqOOAgeS4iuaYh+OBl+OBpuOBjeOBpuOBiuOCiuOAgTclIOeoi+W6puOBqOOBhOOBhuWkp+OBjeOBquWJsuWQiOOBq+OBquOBo+OBpuOBhOOCi+OAggoKIyMjIyBjLiDjg6njg4bjg7PjgqLjg6Hjg6rjgqvvvJTjgqvlm70KCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fR0lOSV9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKQpgYGAKCioq5Y+C6ICD77ya5bmz5Z2H55qE44Gq5YCk44KS5puy57ea44Gn6KGo44GZ44GT44Go44KC5Y+v6IO944Gn44GZ44CCbG9lc3Mg44KS5L2/44GG44Go5ruR44KJ44GL44Gq5puy57ea44Gn6L+R5Ly844GX44Gm44GP44KM44G+44GZ44CCKioKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBDSE9TRU5fR0lOSV9DT1VOVFJJRVMpIHw+IGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoeWVhciwgZWRfZXhwKSkgKyBnZW9tX2xpbmUoYWVzKGNvbCA9IGNvdW50cnkpKSArCiAgZ2VvbV9zbW9vdGgoZm9ybXVsYSA9ICd5fngnLCBtZXRob2QgPSAibG9lc3MiLCBzZSA9IEZBTFNFKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOWIhuW4gwoK44OH44O844K/44Gu5pWw44GL44KJ44CB44G+44Ga44Gv44CBMjAyMOW5tOOBq+OBpOOBhOOBpuimi+OBpuOBv+OCi+OAggoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdChhZXMoZWRfZXhwKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aCA9IDEpCmBgYAoKKirlj4LogIPvvJoqKlNBQ1Ug44Gu77yV44Kr5Zu944Gu5YCk44KS57im57ea44Gn5pu444GN6L6844KA44Gr44Gv5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KZGZfZWRfZXhwIHw+IGZpbHRlcih5ZWFyID09IDIwMjApIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU09VVEhfQUZSSUNBX0ZJVkUpIApgYGAKCioq5Y+C6ICD77ya5pel5pys44GoKipTQUNVIOOBru+8leOCq+WbveOBruWApOOCkue4pue3muOBp+abuOOBjei+vOOCgOOBq+OBr+S4i+OBruOCiOOBhuOBq+OBl+OBvuOBmeOAggoKYGBge3J9CkpQIDwtIDMuNDE2OTgxClNBRiA8LSBkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZmlsdGVyKGNvdW50cnkgJWluJSBTT1VUSF9BRlJJQ0FfRklWRSkgfD4gcHVsbChlZF9leHApCmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBmaWx0ZXIoIShjb3VudHJ5ICVpbiUgUkVHSU9OKSl8PgogIGRyb3BfbmEoZWRfZXhwKSB8PgogIGdncGxvdCgpICsgZ2VvbV9oaXN0b2dyYW0oYWVzKGVkX2V4cCksIGJpbndpZHRoID0gMSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IFNBRiwgY29sID0gInJlZCIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gSlAsIGNvbCA9ICJibHVlIikgK2xhYnModGl0bGUgPSAiMjAyMOW5tOOBruaVmeiCsuiyu+OBruWvvkdEUOeZvuWIhueOhyIsIHN1YnRpdGxlID0gIuaXpeacrO+8mumdkuOAgVNBQ1XvvJrotaQiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOODh+ODvOOCv+OBjOWNgeWIhuOBguOCi+acgOi/keOBruW5tOOBruWApOOBrjEw44Kr5Zu944Gu5YCk44Gu5qOS44Kw44Op44OVCgojIyMjIGEuIOWApOOBjOWkp+OBjeOBhOaWueOBi+OCiQoKYGBge3J9CmRmX2VkX2V4cCB8PiBmaWx0ZXIoeWVhciA9PSAyMDIwKSB8PiBkcm9wX25hKGVkX2V4cCkgfD4gCiAgZmlsdGVyKCEoaXNvMmMgJWluJSBSRUdJT04pKXw+CiAgYXJyYW5nZShkZXNjKGVkX2V4cCkpIHw+IGhlYWQoMTApIHw+IAogIGdncGxvdChhZXMoZmN0X3Jlb3JkZXIoY291bnRyeSwgZWRfZXhwKSwgZWRfZXhwKSkgKyBnZW9tX2NvbCgpICsgCiAgY29vcmRfZmxpcCgpICsgbGFicyh0aXRsZSA9ICJUb3AgMTAgQ291bnRyaWVzIiwgeCA9ICJjb3VudHJ5IiwgeSA9ICJHb3Zlcm5tZW50IGV4cGVuZGl0dXJlIG9uIGVkdWNhdGlvbiwgdG90YWwgKCUgb2YgR0RQKSIpCmBgYAoKIyMjIyBiLiDlgKTjgYzlsI/jgZXjgYTmlrnjgYvjgokKCmBgYHtyfQpkZl9lZF9leHAgfD4gZmlsdGVyKHllYXIgPT0gMjAyMCkgfD4gZHJvcF9uYShlZF9leHApIHw+IAogIGZpbHRlcighKGlzbzJjICVpbiUgUkVHSU9OKSl8PgogIGFycmFuZ2UoZWRfZXhwKSB8PiBoZWFkKDEwKSB8PiAKICBnZ3Bsb3QoYWVzKGZjdF9yZXYoZmN0X3Jlb3JkZXIoY291bnRyeSwgZWRfZXhwKSksIGVkX2V4cCkpICsgZ2VvbV9jb2woKSArIAogIGNvb3JkX2ZsaXAoKSArIGxhYnModGl0bGUgPSAiTG93ZXN0IDEwIENvdW50cmllcyIsIHggPSAiY291bnRyeSIsIHkgPSAiR292ZXJubWVudCBleHBlbmRpdHVyZSBvbiBlZHVjYXRpb24sIHRvdGFsICglIG9mIEdEUCkiKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOa8lOe/kuOBruWGheWuueOBqOiqsumhjAoK5Z+65pys55qE44Gr44Gv44CBUG9zaXRDbG91ZO+8iDxodHRwczovL3Bvc2l0LmNsb3VkLz7vvInjgpLkvb/jgaPjgablrp/nv5IKCi0gICDmjqLntKLnmoTjg4fjg7zjgr/liIbmnpDvvIhFREHvvIkgLQogICAgLSAgIOe3tOe/kuOBqOS4gOOBpOebruOBruiqsumhjO+8iHc1ZWRhLlJtZO+8iSBbW+ODquODs+OCr10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvdzVlZGEubmIuaHRtbCldLCBbW1JtZF0oaHR0cHM6Ly9naXRodWIuY29tL2RzLXNsL2ludHJvMnIvYmxvYi9tYWluL2RvY3MvZ2VzMDAxL3c1ZWRhLlJtZCldCiAgICAtICAg5LqM44Gk55uu5Lul6ZmN44Gu6Kqy6aGM77yadzVlZGExLlJtZCBbW+ODquODs+OCr10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvdzVlZGExLm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS93NWVkYTEuUm1kKV0KLSAgIOiqsumhjO+8mioqMjAyMy4xLjI3LiAyMzo1OSoqIOOBvuOBp+OBqyBNb29kbGUg44Gu5ryU57+S44Gu6Kqy6aGM44Oc44OD44Kv44K544Gr5o+Q5Ye644GX44Gf44KC44Gu44Gr44Gk44GE44Gm44Gv44CB44Gq44KL44G544GP44CB5pep44GP6KaL44Gm44CB44OV44Kj44O844OJ44OQ44OD44Kv44KS5pu444GN44G+44GZ44CC44Gd44KM5Lul6ZmN44Gr5o+Q5Ye644GV44KM44Gf44KC44Gu44KC6KaL44G+44GZ44GM44CB44OV44Kj44O844OJ44OQ44OD44Kv44Gv6YGF44GP44Gq44KL44Go5oCd44Gj44Gm44GP44Gg44GV44GE44CCCgojIyDlj4LogIPmlofnjK4KCjEuICDjgIzjgb/jgpPjgarjga7jg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrkgLSBEYXRhIFNjaWVuY2UgZm9yIEFsbOOAjVtb44Gv44GY44KB44Gm44Gu44OH44O844K/44K144Kk44Ko44Oz44K5XShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai9maXJzdC1leGFtcGxlLmh0bWwjZmlyc3QtZXhhbXBsZSldCgogICAgLSAgIOWwjuWFpeOBqOOBl+OBpuOAgUdEUO+8iOWbveWGhee3j+eUn+eUo++8ieOBruODh+ODvOOCv+OCkuS9v+OBo+OBpuiqrOaYjuOBl+OBpuOBhOOBvuOBmeOAggoKMi4gIFBvc2l0IFJlY2lwZXPvvIjml6cgUG9zaXQgUHJpbWVyc++8iTogVGhlIEJhc2ljcyDlr77oqbHlnovjga7mvJTnv5LjgrXjgqTjg4jjga7mnIDliJ0gW1tMaW5rXShodHRwczovL3Bvc2l0LmNsb3VkL2xlYXJuL3JlY2lwZXMpXQoKMy4gIFBvc2l0IENoZWF0IFNoZWV0LiDml6nopovooajjgafjgZnjgILljbDliLfjgZfjgabkvb/jgYbjgZ/jgoHjgavjgIFQREYg44KC5o+Q5L6b44GX44Gm44GE44G+44GZ44CCW1tTaXRlIExpbmtdKGh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vY2hlYXRzaGVldHMvKV0KCjQuICBEYXRhQ2FtcCBDaGVhdCBTaGVldDogVGlkeXZlcnNlIGZvciBCaWdpbm5lcnMuIOODh+ODvOOCv+OCteOCpOOCqOODs+OCueOBruaVmeiCsuOCkuOBl+OBpuOBhOOCi+S8muekvuOBruaXqeimi+ihqOOBruS4gOOBpOOBp+OBmeOAguWfuuacrOOBjOewoeWNmOOBq+OBvuOBqOOBvuOBo+OBpuOBhOOBvuOBmeOAgltbTGlua10oaHR0cHM6Ly9pbWFnZXMuZGF0YWNhbXAuY29tL2ltYWdlL3VwbG9hZC92MTY3NjMwMjY5Ny9NYXJrZXRpbmcvQmxvZy9UaWR5dmVyc2VfQ2hlYXRfU2hlZXQucGRmKV0K