準備

  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 ファイルと両方提出してください、

課題1について

  • 課題1:解説 リンク

  • 課題1:解答例 リンク

  • 探索的データ分析(課題2の解説にかえて)in progress リンク

課題1・課題2 追加提出ボックスについて

期限:2023年2月17日23時59分(特別な理由がある場合は連絡してください)

第8週

02/08(TH) 紛争と貧困の連鎖1

            紛争と貧困の連鎖2

第8週と第9週では、戦争、気候変動、COVID-19の複合的要因が世界的な食糧危機を引き起こし、格差と貧困を加速させている現状について、議論します。

02/13(TU) Rでデータサイエンス8:難民、軍事支出  [Main]・[授業]

Global Link-Refugees

Refugee population by country or territory of asylum:SM.POP.REFG [Link]

Refugee population by country or territory of origin:SM.POP.REFG.OR [Link]

Net ODA received (% of GNI):DT.ODA.ODAT.GN.ZS [Link]

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

Net ODA received (% of central government expense):DT.ODA.ODAT.XP.ZS [Link]

Military expenditure (current USD):MS.MIL.XPND.CD [Link]

Military expenditure (% of general government expenditure):MS.MIL.XPND.ZS [Link]

Arms imports (SIPRI trend indicator values):MS.MIL.MPRT.KD [Link]

Arms exports (SIPRI trend indicator values):MS.MIL.XPRT.KD [Link]

探索的データ分析(EDA)ワークフロー


探索的データ分析(Exploratory Data Analysis)ワークフロー(続き)

  • 分析・視覚化
    • 各年毎のデータの数の棒グラフ
    • 経年変化
      • 日本(身近な馴染みのあるデータを確認)
      • 南部アフリカ関税同盟、選択した国・地域
    • 分布
      • ヒストグラム(年を指定した度数分布)
      • 値が大きい10カ国とその値の棒グラフ
      • 値が小さい10カ国とその値の棒グラフ
    • 相関
      • 散布図(scatter plot)x-軸と、y-軸に、それぞれの変数をとる
      • 相関係数

演習 2月13日(火)

変形(transformation)

  • 行の選択filter(country %in% c("Japan", "China"), distinct(country), drop_na(value)

  • 列の選択select(country, iso2c, year, var1, var2, region)

  • 横並びの変数を縦並びに:name 列と、value 列を作り、var_1, var_2, … , var_n を name 列に、対応する値を value 列に

    • pivot_longer(cols = c(var_1, var_2, ... , var_n))

    • pivot_longer(cols = c(female_unemploy, male_unemploy))

    • pivot_longer(cols = c(electricity_urban, electricity_rural))

    • pivot_longer(cols = electricity_urban:sanitation_rural))

  • 活用:pivot_longer(cols = c(var1, var2))|> ggplot(aes(year, value, col = name) + geom_line()

箱ひげ図(boxplot)

カテゴリ変数(country, region, income など)毎の分布を描く

  • ggplot(aes(categorical_var, numerical_var)) + geom_boxplot()

  • ggplot(aes(region, electricity_urban)) + geom_boxplot()

  • ggplot(aes(income, electricity_rural)) + geom_boxplot()

  • pivot_longer(cols = c(var1, var2)) |> ggplot(aes(name, value)) + geom_boxplot()

  • year は、整数なので数値変数(numerical variable)。これを カテゴリー変数として扱うためには、factor(year) を使う。x 軸のラベルなどはあとから修正が必要。

    • filter(year %in% c(1960,1990,2020))|> ggplot(aes(factor(year), var)) + geom_boxplot()

内容

  • Refugee population by country or territory of asylum:SM.POP.REFG [Link]

  • Refugee population by country or territory of origin:SM.POP.REFG.OR [Link]

  • Net ODA received (% of GNI):DT.ODA.ODAT.GN.ZS [Link]

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

  • Net ODA received (% of central government expense):DT.ODA.ODAT.XP.ZS [Link]

  • Military expenditure (current USD):MS.MIL.XPND.CD [Link]

  • Military expenditure (% of general government expenditure):MS.MIL.XPND.ZS [Link]

  • Arms imports (SIPRI trend indicator values):MS.MIL.MPRT.KD [Link]

  • Arms exports (SIPRI trend indicator values):MS.MIL.XPRT.KD [Link]


データの取得

準備

library(tidyverse)
library(WDI)

df_peace <- WDI(
  indicator = c(refugee_asylum = "SM.POP.REFG",
                refugee_origin = "SM.POP.REFG.OR",
                oda_gni = "DT.ODA.ODAT.GN.ZS",
                oda_usd = "DT.ODA.ALLD.CD",
                oda_gov = "DT.ODA.ODAT.XP.ZS",
                military_usd = "MS.MIL.XPND.CD",
                military_gov = "MS.MIL.XPND.ZS",
                arms_imports = "MS.MIL.MPRT.KD",
                arms_exports = "MS.MIL.XPRT.KD"), extra = TRUE)
write_csv(df_peace, "data/peace.csv")
df_peace <- read_csv("data/peace.csv")
Rows: 16758 Columns: 21── Column specification ─────────────────────────────────────────────────────────────────
Delimiter: ","
chr   (7): country, iso2c, iso3c, region, capital, income, lending
dbl  (12): year, refugee_asylum, refugee_origin, oda_gni, oda_usd, oda_gov, military_...
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.

データの確認

df_peace

データの変数(列)の確認

str(df_peace)
spc_tbl_ [16,758 × 21] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
 $ country       : chr [1:16758] "Afghanistan" "Afghanistan" "Afghanistan" "Afghanistan" ...
 $ iso2c         : chr [1:16758] "AF" "AF" "AF" "AF" ...
 $ iso3c         : chr [1:16758] "AFG" "AFG" "AFG" "AFG" ...
 $ year          : num [1:16758] 2014 1971 2006 2013 1995 ...
 $ status        : logi [1:16758] NA NA NA NA NA NA ...
 $ lastupdated   : Date[1:16758], format: "2023-12-18" "2023-12-18" ...
 $ refugee_asylum: num [1:16758] 300421 NA 34 16861 19605 ...
 $ refugee_origin: num [1:16758] 2596259 NA 2107510 2556483 2679132 ...
 $ oda_gni       : num [1:16758] 24.04 2.38 NA 25.5 NA ...
 $ oda_usd       : num [1:16758] 4.94e+09 4.44e+07 2.90e+09 5.15e+09 2.13e+08 ...
 $ oda_gov       : num [1:16758] 54.1 NA 201.8 60.8 NA ...
 $ military_usd  : num [1:16758] 2.68e+08 NA 1.31e+08 2.17e+08 NA ...
 $ military_gov  : num [1:16758] 5.11 NA 10.36 4.31 NA ...
 $ arms_imports  : num [1:16758] 3.17e+08 1.49e+08 3.00e+06 2.55e+08 NA 3.30e+07 NA NA NA NA ...
 $ arms_exports  : num [1:16758] NA NA NA NA NA NA NA NA NA NA ...
 $ region        : chr [1:16758] "South Asia" "South Asia" "South Asia" "South Asia" ...
 $ capital       : chr [1:16758] "Kabul" "Kabul" "Kabul" "Kabul" ...
 $ longitude     : num [1:16758] 69.2 69.2 69.2 69.2 69.2 ...
 $ latitude      : num [1:16758] 34.5 34.5 34.5 34.5 34.5 ...
 $ income        : chr [1:16758] "Low income" "Low income" "Low income" "Low income" ...
 $ lending       : chr [1:16758] "IDA" "IDA" "IDA" "IDA" ...
 - attr(*, "spec")=
  .. cols(
  ..   country = col_character(),
  ..   iso2c = col_character(),
  ..   iso3c = col_character(),
  ..   year = col_double(),
  ..   status = col_logical(),
  ..   lastupdated = col_date(format = ""),
  ..   refugee_asylum = col_double(),
  ..   refugee_origin = col_double(),
  ..   oda_gni = col_double(),
  ..   oda_usd = col_double(),
  ..   oda_gov = col_double(),
  ..   military_usd = col_double(),
  ..   military_gov = col_double(),
  ..   arms_imports = col_double(),
  ..   arms_exports = col_double(),
  ..   region = col_character(),
  ..   capital = col_character(),
  ..   longitude = col_double(),
  ..   latitude = col_double(),
  ..   income = col_character(),
  ..   lending = col_character()
  .. )
 - attr(*, "problems")=<externalptr> 

変形

変数の選択(selecting)

df_pc <- df_peace |> 
  select(country, iso2c, year, refugee_asylum:arms_exports, region, income)
df_pc

縦長の表(Long Table)に変換

df_pc_long <- df_pc |> 
  pivot_longer(refugee_asylum:arms_exports)
df_pc_long

各年毎のデータの数の確認

df_pc_long |> drop_na(value) |> 
  ggplot(aes(year)) + geom_bar()


各指標ごとに積み上げ棒グラフにしてみます

fillcol に変えるとどうなるでしょうか。

df_pc_long |> drop_na(value) |> 
  ggplot(aes(year, fill = name)) + geom_bar()

気づいたこと、疑問


国と地域

地域の iso2c コード

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

REGION <- c("1A", "1W", "4E", "6F", "6N", "6X", "7E", "8S", "A4", "A5", 
"A9", "B1", "B2", "B3", "B4", "B6", "B7", "B8", "C4", "C5", "C6", 
"C7", "C8", "C9", "D2", "D3", "D4", "D5", "D6", "D7", "EU", "F1", 
"F6", "M1", "M2", "N6", "OE", "R6", "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", "ZB", "ZF", "ZG", "ZH", "ZI", 
"ZJ", "ZQ", "ZT")

地域のリストを表示

df_pc |> filter(iso2c %in% REGION) |> distinct(country, iso2c)

国名とその地域・所得レベルを表示

df_pc |> filter(!(iso2c %in% REGION)) |> distinct(country, iso2c,region,income)

国や地域の選択

ASEAN <- c("BN", "KH", "ID", "LA", "MY", "MM", "PH", "SG", "VN")
BRICS <- c("Brazil", "Russian Federation", "India", "China", "South Africa")
SACU <- c("South Africa", "Namibia", "Eswatini", "Botswana", "Lesotho")
CHOSEN_COUNTRIES <- c("Suriname", "Belize", "Brazil", "Colombia")

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

df_peace |> filter(!(iso2c %in% REGION)) |> # 地域以外(国のみ選択)
  drop_na(refugee_asylum:arms_exports) |> 
  select(refugee_asylum:arms_exports) |> cor()
               refugee_asylum refugee_origin      oda_gni     oda_usd     oda_gov
refugee_asylum     1.00000000     0.09529925  0.277803615  0.19080685  0.20651969
refugee_origin     0.09529925     1.00000000 -0.055259672  0.02793923 -0.06003550
oda_gni            0.27780361    -0.05525967  1.000000000  0.18238369  0.93403995
oda_usd            0.19080685     0.02793923  0.182383686  1.00000000  0.15519192
oda_gov            0.20651969    -0.06003550  0.934039951  0.15519192  1.00000000
military_usd      -0.04219972    -0.03483676 -0.297119009  0.45219438 -0.27186566
military_gov       0.10960070    -0.08599254 -0.002842719 -0.19992294 -0.01528389
arms_imports      -0.08180642    -0.11327444 -0.208204700  0.46577548 -0.17489375
arms_exports       0.15657351     0.28715525 -0.066830867  0.16262742 -0.09637824
               military_usd military_gov arms_imports arms_exports
refugee_asylum  -0.04219972  0.109600697 -0.081806419   0.15657351
refugee_origin  -0.03483676 -0.085992543 -0.113274438   0.28715525
oda_gni         -0.29711901 -0.002842719 -0.208204700  -0.06683087
oda_usd          0.45219438 -0.199922938  0.465775477   0.16262742
oda_gov         -0.27186566 -0.015283892 -0.174893747  -0.09637824
military_usd     1.00000000 -0.186778574  0.659515539   0.02278056
military_gov    -0.18677857  1.000000000 -0.005298621  -0.01080562
arms_imports     0.65951554 -0.005298621  1.000000000  -0.13894503
arms_exports     0.02278056 -0.010805616 -0.138945034   1.00000000

値の正負:正の相関・負の相関、1に近いと強い正の相関、-1に近いと強い負の相関

相関係数:散布図の近似(回帰)直線の傾きが正なら正、負なら負、直線に近い程、1 または-1 に近い


経年変化

a. 日本

df_pc_long |> filter(country == "Japan") |> drop_na(value) |>
  ggplot(aes(year, value, col = name)) + geom_line()


df_pc_long |> filter(country == "Japan") |> drop_na(value)

df_pc_long |> filter(iso2c %in% ASEAN) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line()


df_pc_long |> filter(iso2c %in% ASEAN) |> drop_na(value) |> 
  filter(value < 80) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line()


df_pc_long |> filter(country %in% SACU) |> drop_na(value) |>
  ggplot(aes(year, value, col = country, linetype = name)) + geom_line()


箱ひげ図(Boxplot)

df_pc_long |> filter(name == "refugee_asylum") |> 
  filter(region != "Aggregates") |> drop_na(value) |>
  ggplot(aes(region, value)) + geom_boxplot() + coord_flip()


df_pc_long |> filter(name == "refugee_asylum") |> 
  filter(region != "Aggregates") |> drop_na(value) |>
  ggplot(aes(region, value)) + geom_boxplot() + scale_y_log10() + coord_flip()


df_peace |> filter(region != "Aggregates") |> drop_na(refugee_asylum) |>
  ggplot(aes(region, refugee_asylum)) + geom_boxplot() + scale_y_log10() + coord_flip()


df_pc_long |> filter(name %in% c("refugee_asylum", "refugee_origin")) |> 
  filter(income != "Aggregates") |> drop_na(value) |>
  ggplot(aes(income, value, fill = name)) + geom_boxplot() + scale_y_log10() + coord_flip()


df_pc_long |> filter(income != "Aggregates", income != "Not classified") |> drop_na(value) |>
  ggplot(aes(income, value, fill = name)) + geom_boxplot() + scale_y_log10() + coord_flip()

ファイルリンク

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

  • 探索的データ分析(EDA) -
    • 課題1+2:例 平和(peace.Rmd) [リンク], [Rmd]
    • 課題1+2:テンプレート:w8eda_template.Rmd [リンク], [Rmd]

2023.2.17.23:59 までに Moodle の課題2提出ボックスに提出してください。

できたグラフだけでも構いませんから、期限までに提出してください。解説を加え、課題2再提出ボックスを作成する予定です。

課題2

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

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

2 経年変化を表す折れ線グラフ a. 日本、またはデータがある国 b. 選択したいくつかの国

3 複数の指標の値を一列に含む縦長の表(Long Table)を作成し   a. 日本、またはデータがある国の、複数の指標を色分けした経年変化のグラフ   b. 選択したいくつかの国についての経年変化のグラフを、国を色分けし、指標は線の種類を変えたグラフ


課題2 つづき

4 二つのデータの散布図- NA は取り除くこと。(log10 スケールを用いる場合は値が正のもののみに限定) a. (地域を除き)国のみの散布図 (近似(回帰)直線を表示) b. 最近の年の(地域を除き)国のみの散布図 (近似(回帰)直線を表示) c. b に対応する相関係数

5 カテゴリー変数(Categorical Variable: region, income, year など)と、数値変数(Numberical Variable)一組についての箱ヒゲ図(Boxplot)

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

2023.2.17.23:59 までに Moodle の課題2追加提出ボックスに提出してください。


確認作業

  • Preview で確認。

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

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

  • 最初にもどる。


エラー対応

  • 入力したときには、例を参照して、スペルを確認。全角や変数名の空白は問題を起こす。括弧 () や引用符がペアでマッチしているか、確認。引用符が入っていなかったり、== のところが、= だったり、Error は様々。
  • File not found のときは、データを読み込むコードを再実行。それでもうまくいかないときは、data フォルダに、データ(***.csv)が入っているかを確認、なければ、data フォルダがあることを確認、なければ作成して読み込みを実行。
  • Object not found のエラーがでたときには、上から順に、Run (Code Chunk の右上の三角印を押して実行)。または、エラー箇所にカーソルを置き、Run ボタンの右の三角から、Run All Chunks Above を選択して実行。
  • 実行できていても、結果が見えないことがある。そのときは、Code Chunk の下にある、山二つの記号を押す。結果の表示、非表示の切り替え。
  • Error message を読む。エラーが出た Code Chunk と、Error message を、ChatGPT や、Google Bard, Google Search に入れ解決方法を探る。
  • Posit.Cloud で、Error 137 が出た時はメモリーオーバーなので、例など不要な部分を削除。ただし、一番上の、YAML は、かならず残すこと。

参考文献

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

  2. Posit Recipes(旧 Posit Primers): The Basics 対話型の演習サイトの最初 [Link]

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

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

  5. 箱ひげ図の見方 Link、外れ値検出のある箱ひげ図 Link

  6. Video: Histogram, Boxplot

LS0tCnRpdGxlOiAiR0VTIDAwMSDmvJTnv5I4IgphdXRob3I6ICJILiBTdXp1a2kiCmRhdGU6ICIyMDI05bm0MuaciDEz5pelIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogIGh0bWxfZG9jdW1lbnQ6CiAgICBkZl9wcmludDogcGFnZWQKICBpb3NsaWRlc19wcmVzZW50YXRpb246CiAgICB3aWRlc2NyZWVuOiB0cnVlCiAgICBkZl9wcmludDogcGFnZWQKLS0tCgojIyDmupblgpkKCjEuICDvvIjoh6rliIbjga5QQ+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+8iVtbUm1kXShodHRwczovL2dpdGh1Yi5jb20vZHMtc2wvaW50cm8yci9ibG9iL21haW4vZG9jcy9nZXMwMDEvcGVhY2UuUm1kKV0KCiMjIOODleOCoeOCpOODqwoKIyMjIOODleOCoeOCpOODq+OCkuS9nOaIkOOBmeOCi+OBqOOBjeOBruazqOaEjwoKMS4gIFBvc2l0IENsb3VkIOOBruOBqOOBjeOBr+OAgeOBvuOBmuOAgUxvZ2luIOOBl+OAgWludHJvMnJqIOOBruODl+ODreOCuOOCp+OCr+ODiOOBq+WFpeOCiuOAgSDjg5XjgqHjgqTjg6vjgYvjgonjgIFnZXMwMDEg44Gu44OV44Kp44Or44OA44O844KS6YG45oqe44GX44Gm44CB56e75YuV44GX44G+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+OBoOOBleOBhOOAgQoKIyMjIOiqsumhjDHjgavjgaTjgYTjgaYKCi0gICDoqrLpoYwx77ya6Kej6KqsIFvjg6rjg7Pjgq9dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3c1YV9yZXNwb25zZS5uYi5odG1sKQotICAg6Kqy6aGMMe+8muino+etlOS+iyBb44Oq44Oz44KvXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS93NWVkYTAubmIuaHRtbCkKCi0gICDmjqLntKLnmoTjg4fjg7zjgr/liIbmnpDvvIjoqrLpoYwy44Gu6Kej6Kqs44Gr44GL44GI44Gm77yJaW4gcHJvZ3Jlc3MgW+ODquODs+OCr10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvZWRhLm5iLmh0bWwpCgojIyMg6Kqy6aGMMeODu+iqsumhjDIg6L+95Yqg5o+Q5Ye644Oc44OD44Kv44K544Gr44Gk44GE44GmCgrmnJ/pmZDvvJoyMDIz5bm0MuaciDE35pelMjPmmYI1OeWIhu+8iOeJueWIpeOBqueQhueUseOBjOOBguOCi+WgtOWQiOOBr+mAo+e1oeOBl+OBpuOBj+OBoOOBleOBhO+8iQoKIyMg56ysOOmAsQoKMDIvMDgoVEgp44CA57Sb5LqJ44Go6LKn5Zuw44Gu6YCj6Y6WMQoKwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCDntJvkuonjgajosqflm7Djga7pgKPpjpYyCgrnrKw46YCx44Go56ysOemAseOBp+OBr+OAgeaIpuS6ieOAgeawl+WAmeWkieWLleOAgUNPVklELTE544Gu6KSH5ZCI55qE6KaB5Zug44GM5LiW55WM55qE44Gq6aOf57On5Y2x5qmf44KS5byV44GN6LW344GT44GX44CB5qC85beu44Go6LKn5Zuw44KS5Yqg6YCf44GV44Gb44Gm44GE44KL54++54q244Gr44Gk44GE44Gm44CB6K2w6KuW44GX44G+44GZ44CCCgowMi8xMyhUVSnjgIBS44Gn44OH44O844K/44K144Kk44Ko44Oz44K5OO+8mumbo+awkeOAgei7jeS6i+aUr+WHuuOAgCBbW01haW5dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL2dlczAwMS1tYWluLm5iLmh0bWwpXeODu1vmjojmpa1dCgoqKkdsb2JhbCBMaW5rLVJlZnVnZWVzKioKClJlZnVnZWUgcG9wdWxhdGlvbiBieSBjb3VudHJ5IG9yIHRlcnJpdG9yeSBvZiBhc3lsdW3vvJpTTS5QT1AuUkVGRyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TTS5QT1AuUkVGRyldCgpSZWZ1Z2VlIHBvcHVsYXRpb24gYnkgY291bnRyeSBvciB0ZXJyaXRvcnkgb2Ygb3JpZ2lu77yaU00uUE9QLlJFRkcuT1IgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvU00uUE9QLlJFRkcuT1IpXQoKTmV0IE9EQSByZWNlaXZlZCAoJSBvZiBHTkkp77yaRFQuT0RBLk9EQVQuR04uWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRFQuT0RBLk9EQVQuR04uWlMpXQoKTmV0IG9mZmljaWFsIGRldmVsb3BtZW50IGFzc2lzdGFuY2UgYW5kIG9mZmljaWFsIGFpZCByZWNlaXZlZCAoY3VycmVudCBVU1wkKe+8mkRULk9EQS5BTExELkNEIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0RULk9EQS5BTExELkNEKV0KCk5ldCBPREEgcmVjZWl2ZWQgKCUgb2YgY2VudHJhbCBnb3Zlcm5tZW50IGV4cGVuc2Up77yaRFQuT0RBLk9EQVQuWFAuWlMgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvRFQuT0RBLk9EQVQuWFAuWlMpXQoKTWlsaXRhcnkgZXhwZW5kaXR1cmUgKGN1cnJlbnQgVVNEKe+8mk1TLk1JTC5YUE5ELkNEIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL01TLk1JTC5YUE5ELkNEKV0KCk1pbGl0YXJ5IGV4cGVuZGl0dXJlICglIG9mIGdlbmVyYWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSnvvJpNUy5NSUwuWFBORC5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9NUy5NSUwuWFBORC5aUyldCgpBcm1zIGltcG9ydHMgKFNJUFJJIHRyZW5kIGluZGljYXRvciB2YWx1ZXMp77yaTVMuTUlMLk1QUlQuS0QgW1tMaW5rXShodHRwczovL2RhdGFiYW5rLndvcmxkYmFuay5vcmcvbWV0YWRhdGFnbG9zc2FyeS93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzL3Nlcmllcy9NUy5NSUwuTVBSVC5LRCldCgpBcm1zIGV4cG9ydHMgKFNJUFJJIHRyZW5kIGluZGljYXRvciB2YWx1ZXMp77yaTVMuTUlMLlhQUlQuS0QgW1tMaW5rXShodHRwczovL2RhdGFiYW5rLndvcmxkYmFuay5vcmcvbWV0YWRhdGFnbG9zc2FyeS93b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3JzL3Nlcmllcy9NUy5NSUwuWFBSVC5LRCldCgoKCiMjIOaOoue0oueahOODh+ODvOOCv+WIhuaekO+8iEVEQe+8ieODr+ODvOOCr+ODleODreODvAoKLSAgIOihqOmhjCBUaXRsZQotICAg5qaC6KaBIEFic3RyYWN0Ci0gICDjg4fjg7zjgr/mg4XloLHvvJrjg4fjg7zjgr/lkI3jgIHjg4fjg7zjgr/jgrPjg7zjg4njgIHlpInmlbDlkI3jgIHjg4fjg7zjgr/mpoLopoEKLSAgIOWQhOmgheebruOBq+OAgeawl+OBpeOBhOOBn+OBk+OBqOOAgeeWkeWVj+OBquOBqeOCkuiomOmMsu+8iEVEQeOBruaguOOBqOOBquOCi+mDqOWIhuOBp+OBme+8iQotICAg44OH44O844K/44Gu5Y+W5b6XIC0g44OA44Km44Oz44Ot44O844OJ44GX44Gm5L+d5a2Y44GX44Gm44GK44GPCiAgICAtICAg5rqW5YKZ77yaYGxpYnJhcnkodGlkeXZlcnNlKTsgbGlicmFyeShXREkpYAogICAgLSAgIGBkZl93NmVkYSA8LSBXREkoaW5kaWNhdG9yID0gYyhjbzJwY2FwID0gIkVOLkFUTS5DTzJFLlBDIiwgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Jlc3QgPSAiQUcuTE5ELkZSU1QuWlMiKSwgZXh0cmEgPSBUUlVFKWAKICAgIC0gICAq5LqM44Gk5Lul5LiK44Gu5oyH5qiZ44CB44Gd44KM44Ge44KM44Gr5aSJ5pWw5ZCNKiBgY28ycGNhcGAsIGBmb3Jlc3RgCiAgICAtICAg6L+95Yqg5oOF5aCx77yaYGV4dHJhID0gVFJVRWA7IGByZWdpb25gIOWcsOWfn+aDheWgsSwgYGluY29tZWAg5Y+O5YWl44Os44OZ44OrCiAgICAtICAg44OH44O844K/44Gu56K66KqN77ya44OH44O844K/44GM5Y2B5YiG44GC44KL44GL44CB5Zu95ZCN44Oq44K544OI44CB5Zyw5Z+f5ZCN44Oq44K544OICi0gICDliIbmnpDjgZnjgovlm73jga7jg6rjgrnjg4jvvJrljZfpg6jjgqLjg5Xjg6rjgqvplqLnqI7lkIznm5/jgIHlm73jgoTlnLDln5/jgpLpgbjmip4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOaOoue0oueahOODh+ODvOOCv+WIhuaekO+8iEV4cGxvcmF0b3J5IERhdGEgQW5hbHlzaXPvvInjg6/jg7zjgq/jg5Xjg63jg7zvvIjntprjgY3vvIkKCi0gICDliIbmnpDjg7voppbopprljJYKICAgIC0gICDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7mo5LjgrDjg6njg5UKICAgIC0gICDntYzlubTlpInljJYKICAgICAgICAtICAg5pel5pys77yI6Lqr6L+R44Gq6aa05p+T44G/44Gu44GC44KL44OH44O844K/44KS56K66KqN77yJCiAgICAgICAgLSAgIOWNl+mDqOOCouODleODquOCq+mWoueojuWQjOebn+OAgemBuOaKnuOBl+OBn+WbveODu+WcsOWfnwogICAgLSAgIOWIhuW4gwogICAgICAgIC0gICDjg5Ljgrnjg4jjgrDjg6njg6DvvIjlubTjgpLmjIflrprjgZfjgZ/luqbmlbDliIbluIPvvIkKICAgICAgICAtICAg5YCk44GM5aSn44GN44GEMTDjgqvlm73jgajjgZ3jga7lgKTjga7mo5LjgrDjg6njg5UKICAgICAgICAtICAg5YCk44GM5bCP44GV44GEMTDjgqvlm73jgajjgZ3jga7lgKTjga7mo5LjgrDjg6njg5UKICAgIC0gICDnm7jplqIKICAgICAgICAtICAg5pWj5biD5Zuz77yIc2NhdHRlciBwbG9077yJeC3ou7jjgajjgIF5Lei7uOOBq+OAgeOBneOCjOOBnuOCjOOBruWkieaVsOOCkuOBqOOCiwogICAgICAgIC0gICDnm7jplqLkv4LmlbAKCgojIOa8lOe/kiAy5pyIMTPml6XvvIjngavvvIkKCiMjIOWkieW9ou+8iHRyYW5zZm9ybWF0aW9u77yJCgotICAgKirooYzjga7pgbjmip4qKu+8mmBmaWx0ZXIoY291bnRyeSAlaW4lIGMoIkphcGFuIiwgIkNoaW5hIilgLCBgZGlzdGluY3QoY291bnRyeSlgLCBgZHJvcF9uYSh2YWx1ZSlgCgotICAgKirliJfjga7pgbjmip4qKu+8mmBzZWxlY3QoY291bnRyeSwgaXNvMmMsIHllYXIsIHZhcjEsIHZhcjIsIHJlZ2lvbilgCgotICAgKirmqKrkuKbjgbPjga7lpInmlbDjgpLnuKbkuKbjgbPjgasqKu+8mm5hbWUg5YiX44Go44CBdmFsdWUg5YiX44KS5L2c44KK44CBdmFyXzEsIHZhcl8yLCAuLi4gLCB2YXJfbiDjgpIgbmFtZSDliJfjgavjgIHlr77lv5zjgZnjgovlgKTjgpLjgIB2YWx1ZSDliJfjgasKCiAgICAtICAgYHBpdm90X2xvbmdlcihjb2xzID0gYyh2YXJfMSwgdmFyXzIsIC4uLiAsIHZhcl9uKSlgCgogICAgLSAgIGBwaXZvdF9sb25nZXIoY29scyA9IGMoZmVtYWxlX3VuZW1wbG95LCBtYWxlX3VuZW1wbG95KSlgCgogICAgLSAgIGBwaXZvdF9sb25nZXIoY29scyA9IGMoZWxlY3RyaWNpdHlfdXJiYW4sIGVsZWN0cmljaXR5X3J1cmFsKSlgCgogICAgLSAgIGBwaXZvdF9sb25nZXIoY29scyA9IGVsZWN0cmljaXR5X3VyYmFuOnNhbml0YXRpb25fcnVyYWwpKWAKCi0gICAqKua0u+eUqO+8mioqYHBpdm90X2xvbmdlcihjb2xzID0gYyh2YXIxLCB2YXIyKSl8PiBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBuYW1lKSArIGdlb21fbGluZSgpYAoKIyMg566x44Gy44GS5Zuz77yIYm94cGxvdO+8iQoK44Kr44OG44K044Oq5aSJ5pWw77yIY291bnRyeSwgcmVnaW9uLCBpbmNvbWUg44Gq44Gp77yJ5q+O44Gu5YiG5biD44KS5o+P44GPCgotICAgYGdncGxvdChhZXMoY2F0ZWdvcmljYWxfdmFyLCBudW1lcmljYWxfdmFyKSkgKyBnZW9tX2JveHBsb3QoKWAKCi0gICBgZ2dwbG90KGFlcyhyZWdpb24sIGVsZWN0cmljaXR5X3VyYmFuKSkgKyBnZW9tX2JveHBsb3QoKWAKCi0gICBgZ2dwbG90KGFlcyhpbmNvbWUsIGVsZWN0cmljaXR5X3J1cmFsKSkgKyBnZW9tX2JveHBsb3QoKWAKCi0gICBgcGl2b3RfbG9uZ2VyKGNvbHMgPSBjKHZhcjEsIHZhcjIpKSB8PiBnZ3Bsb3QoYWVzKG5hbWUsIHZhbHVlKSkgKyBnZW9tX2JveHBsb3QoKWAKCi0gICB5ZWFyIOOBr+OAgeaVtOaVsOOBquOBruOBp+aVsOWApOWkieaVsO+8iG51bWVyaWNhbCB2YXJpYWJsZe+8ieOAguOBk+OCjOOCkiDjgqvjg4bjgrTjg6rjg7zlpInmlbDjgajjgZfjgabmibHjgYbjgZ/jgoHjgavjga/jgIFgZmFjdG9yKHllYWByKSDjgpLkvb/jgYbjgIJgeGAg6Lu444Gu44Op44OZ44Or44Gq44Gp44Gv44GC44Go44GL44KJ5L+u5q2j44GM5b+F6KaB44CCCgogICAgLSAgIGBmaWx0ZXIoeWVhciAlaW4lIGMoMTk2MCwxOTkwLDIwMjApKXw+IGdncGxvdChhZXMoZmFjdG9yKHllYXIpLCB2YXIpKSArIGdlb21fYm94cGxvdCgpYAoKCiMjIOWGheWuuQoKLSAgIFJlZnVnZWUgcG9wdWxhdGlvbiBieSBjb3VudHJ5IG9yIHRlcnJpdG9yeSBvZiBhc3lsdW3vvJpTTS5QT1AuUkVGRyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9TTS5QT1AuUkVGRyldCgotICAgUmVmdWdlZSBwb3B1bGF0aW9uIGJ5IGNvdW50cnkgb3IgdGVycml0b3J5IG9mIG9yaWdpbu+8mlNNLlBPUC5SRUZHLk9SIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL1NNLlBPUC5SRUZHLk9SKV0KCi0gICBOZXQgT0RBIHJlY2VpdmVkICglIG9mIEdOSSnvvJpEVC5PREEuT0RBVC5HTi5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9EVC5PREEuT0RBVC5HTi5aUyldCgotICAgTmV0IG9mZmljaWFsIGRldmVsb3BtZW50IGFzc2lzdGFuY2UgYW5kIG9mZmljaWFsIGFpZCByZWNlaXZlZCAoY3VycmVudCBVU1wkKe+8mkRULk9EQS5BTExELkNEIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0RULk9EQS5BTExELkNEKV0KCi0gICBOZXQgT0RBIHJlY2VpdmVkICglIG9mIGNlbnRyYWwgZ292ZXJubWVudCBleHBlbnNlKe+8mkRULk9EQS5PREFULlhQLlpTIFtbTGlua10oaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcvaW5kaWNhdG9yL0RULk9EQS5PREFULlhQLlpTKV0KCi0gICBNaWxpdGFyeSBleHBlbmRpdHVyZSAoY3VycmVudCBVU0Qp77yaTVMuTUlMLlhQTkQuQ0QgW1tMaW5rXShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZy9pbmRpY2F0b3IvTVMuTUlMLlhQTkQuQ0QpXQoKLSAgIE1pbGl0YXJ5IGV4cGVuZGl0dXJlICglIG9mIGdlbmVyYWwgZ292ZXJubWVudCBleHBlbmRpdHVyZSnvvJpNUy5NSUwuWFBORC5aUyBbW0xpbmtdKGh0dHBzOi8vZGF0YS53b3JsZGJhbmsub3JnL2luZGljYXRvci9NUy5NSUwuWFBORC5aUyldCgotICAgQXJtcyBpbXBvcnRzIChTSVBSSSB0cmVuZCBpbmRpY2F0b3IgdmFsdWVzKe+8mk1TLk1JTC5NUFJULktEIFtbTGlua10oaHR0cHM6Ly9kYXRhYmFuay53b3JsZGJhbmsub3JnL21ldGFkYXRhZ2xvc3Nhcnkvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycy9zZXJpZXMvTVMuTUlMLk1QUlQuS0QpXQoKLSAgIEFybXMgZXhwb3J0cyAoU0lQUkkgdHJlbmQgaW5kaWNhdG9yIHZhbHVlcynvvJpNUy5NSUwuWFBSVC5LRCBbW0xpbmtdKGh0dHBzOi8vZGF0YWJhbmsud29ybGRiYW5rLm9yZy9tZXRhZGF0YWdsb3NzYXJ5L3dvcmxkLWRldmVsb3BtZW50LWluZGljYXRvcnMvc2VyaWVzL01TLk1JTC5YUFJULktEKV0KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOODh+ODvOOCv+OBruWPluW+lwoKIyMjIyDmupblgpkKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShXREkpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7ciBldmFsPUZBTFNFfQpkZl9wZWFjZSA8LSBXREkoCiAgaW5kaWNhdG9yID0gYyhyZWZ1Z2VlX2FzeWx1bSA9ICJTTS5QT1AuUkVGRyIsCiAgICAgICAgICAgICAgICByZWZ1Z2VlX29yaWdpbiA9ICJTTS5QT1AuUkVGRy5PUiIsCiAgICAgICAgICAgICAgICBvZGFfZ25pID0gIkRULk9EQS5PREFULkdOLlpTIiwKICAgICAgICAgICAgICAgIG9kYV91c2QgPSAiRFQuT0RBLkFMTEQuQ0QiLAogICAgICAgICAgICAgICAgb2RhX2dvdiA9ICJEVC5PREEuT0RBVC5YUC5aUyIsCiAgICAgICAgICAgICAgICBtaWxpdGFyeV91c2QgPSAiTVMuTUlMLlhQTkQuQ0QiLAogICAgICAgICAgICAgICAgbWlsaXRhcnlfZ292ID0gIk1TLk1JTC5YUE5ELlpTIiwKICAgICAgICAgICAgICAgIGFybXNfaW1wb3J0cyA9ICJNUy5NSUwuTVBSVC5LRCIsCiAgICAgICAgICAgICAgICBhcm1zX2V4cG9ydHMgPSAiTVMuTUlMLlhQUlQuS0QiKSwgZXh0cmEgPSBUUlVFKQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9CndyaXRlX2NzdihkZl9wZWFjZSwgImRhdGEvcGVhY2UuY3N2IikKYGBgCgpgYGB7cn0KZGZfcGVhY2UgPC0gcmVhZF9jc3YoImRhdGEvcGVhY2UuY3N2IikKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDjg4fjg7zjgr/jga7norroqo0KCmBgYHtyfQpkZl9wZWFjZQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOODh+ODvOOCv+OBruWkieaVsO+8iOWIl++8ieOBrueiuuiqjQoKYGBge3J9CnN0cihkZl9wZWFjZSkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDlpInlvaIKCiMjIyMg5aSJ5pWw44Gu6YG45oqe77yIc2VsZWN0aW5n77yJCgpgYGB7cn0KZGZfcGMgPC0gZGZfcGVhY2UgfD4gCiAgc2VsZWN0KGNvdW50cnksIGlzbzJjLCB5ZWFyLCByZWZ1Z2VlX2FzeWx1bTphcm1zX2V4cG9ydHMsIHJlZ2lvbiwgaW5jb21lKQpkZl9wYwpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOe4pumVt+OBruihqO+8iExvbmcgVGFibGXvvInjgavlpInmj5sKCmBgYHtyfQpkZl9wY19sb25nIDwtIGRmX3BjIHw+IAogIHBpdm90X2xvbmdlcihyZWZ1Z2VlX2FzeWx1bTphcm1zX2V4cG9ydHMpCmRmX3BjX2xvbmcKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDlkITlubTmr47jga7jg4fjg7zjgr/jga7mlbDjga7norroqo0KCmBgYHtyfQpkZl9wY19sb25nIHw+IGRyb3BfbmEodmFsdWUpIHw+IAogIGdncGxvdChhZXMoeWVhcikpICsgZ2VvbV9iYXIoKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIyDlkITmjIfmqJnjgZTjgajjgavnqY3jgb/kuIrjgZLmo5LjgrDjg6njg5XjgavjgZfjgabjgb/jgb7jgZkKCmBmaWxsYCDjgpIgYGNvbGAg44Gr5aSJ44GI44KL44Go44Gp44GG44Gq44KL44Gn44GX44KH44GG44GL44CCCgpgYGB7cn0KZGZfcGNfbG9uZyB8PiBkcm9wX25hKHZhbHVlKSB8PiAKICBnZ3Bsb3QoYWVzKHllYXIsIGZpbGwgPSBuYW1lKSkgKyBnZW9tX2JhcigpCmBgYAoKKirmsJfjgaXjgYTjgZ/jgZPjgajjgIHnlpHllY8qKgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg5Zu944Go5Zyw5Z+fCgojIyMjIOWcsOWfn+OBriBgaXNvMmNgIOOCs+ODvOODiQoKY291bnRyeSDjgavjga/jgIHlm73jgajlnLDln5/kuKHmlrnjgYzlhaXjgaPjgabjgYTjgb7jgZnjgILlnLDln5/jga4gaXNvMmMg44Gv5Lul5LiL44Gu44KC44Gu44Gn44GZ44CCCgpgYGB7cn0KUkVHSU9OIDwtIGMoIjFBIiwgIjFXIiwgIjRFIiwgIjZGIiwgIjZOIiwgIjZYIiwgIjdFIiwgIjhTIiwgIkE0IiwgIkE1IiwgCiJBOSIsICJCMSIsICJCMiIsICJCMyIsICJCNCIsICJCNiIsICJCNyIsICJCOCIsICJDNCIsICJDNSIsICJDNiIsIAoiQzciLCAiQzgiLCAiQzkiLCAiRDIiLCAiRDMiLCAiRDQiLCAiRDUiLCAiRDYiLCAiRDciLCAiRVUiLCAiRjEiLCAKIkY2IiwgIk0xIiwgIk0yIiwgIk42IiwgIk9FIiwgIlI2IiwgIlMxIiwgIlMyIiwgIlMzIiwgIlM0IiwgIlQyIiwgCiJUMyIsICJUNCIsICJUNSIsICJUNiIsICJUNyIsICJWMSIsICJWMiIsICJWMyIsICJWNCIsICJYQyIsICJYRCIsIAoiWEUiLCAiWEYiLCAiWEciLCAiWEgiLCAiWEkiLCAiWEoiLCAiWEwiLCAiWE0iLCAiWE4iLCAiWE8iLCAiWFAiLCAKIlhRIiwgIlhUIiwgIlhVIiwgIlhZIiwgIlo0IiwgIlo3IiwgIlpCIiwgIlpGIiwgIlpHIiwgIlpIIiwgIlpJIiwgCiJaSiIsICJaUSIsICJaVCIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMjIOWcsOWfn+OBruODquOCueODiOOCkuihqOekugoKYGBge3IgZXZhbD1GQUxTRX0KZGZfcGMgfD4gZmlsdGVyKGlzbzJjICVpbiUgUkVHSU9OKSB8PiBkaXN0aW5jdChjb3VudHJ5LCBpc28yYykKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyMg5Zu95ZCN44Go44Gd44Gu5Zyw5Z+f44O75omA5b6X44Os44OZ44Or44KS6KGo56S6CgpgYGB7ciBldmFsPUZBTFNFfQpkZl9wYyB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+IGRpc3RpbmN0KGNvdW50cnksIGlzbzJjLHJlZ2lvbixpbmNvbWUpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg5Zu944KE5Zyw5Z+f44Gu6YG45oqeCgpgYGB7cn0KQVNFQU4gPC0gYygiQk4iLCAiS0giLCAiSUQiLCAiTEEiLCAiTVkiLCAiTU0iLCAiUEgiLCAiU0ciLCAiVk4iKQpgYGAKCmBgYHtyfQpCUklDUyA8LSBjKCJCcmF6aWwiLCAiUnVzc2lhbiBGZWRlcmF0aW9uIiwgIkluZGlhIiwgIkNoaW5hIiwgIlNvdXRoIEFmcmljYSIpCmBgYAoKYGBge3J9ClNBQ1UgPC0gYygiU291dGggQWZyaWNhIiwgIk5hbWliaWEiLCAiRXN3YXRpbmkiLCAiQm90c3dhbmEiLCAiTGVzb3RobyIpCmBgYAoKYGBge3J9CkNIT1NFTl9DT1VOVFJJRVMgPC0gYygiU3VyaW5hbWUiLCAiQmVsaXplIiwgIkJyYXppbCIsICJDb2xvbWJpYSIpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg5aSJ5pWw5ZCM5aOr44Gu55u46Zai6Zai5L+COiBOQSDjgafjga/jgarjgYTjgajjgZPjgo3jga7jgb/pgbjmip4KCmBgYHtyfQpkZl9wZWFjZSB8PiBmaWx0ZXIoIShpc28yYyAlaW4lIFJFR0lPTikpIHw+ICMg5Zyw5Z+f5Lul5aSW77yI5Zu944Gu44G/6YG45oqe77yJCiAgZHJvcF9uYShyZWZ1Z2VlX2FzeWx1bTphcm1zX2V4cG9ydHMpIHw+IAogIHNlbGVjdChyZWZ1Z2VlX2FzeWx1bTphcm1zX2V4cG9ydHMpIHw+IGNvcigpCmBgYAoK5YCk44Gu5q2j6LKg77ya5q2j44Gu55u46Zai44O76LKg44Gu55u46Zai44CBMeOBq+i/keOBhOOBqOW8t+OBhOato+OBruebuOmWouOAgS0x44Gr6L+R44GE44Go5by344GE6LKg44Gu55u46ZaiCgrnm7jplqLkv4LmlbDvvJrmlaPluIPlm7Pjga7ov5HkvLzvvIjlm57luLDvvInnm7Tnt5rjga7lgr7jgY3jgYzmraPjgarjgonmraPjgIHosqDjgarjgonosqDjgIHnm7Tnt5rjgavov5HjgYTnqIvjgIExIOOBvuOBn+OBry0xIOOBq+i/keOBhAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg57WM5bm05aSJ5YyWCgojIyMgYS4g5pel5pysCgpgYGB7cn0KZGZfcGNfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IG5hbWUpKSArIGdlb21fbGluZSgpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpgYGB7cn0KZGZfcGNfbG9uZyB8PiBmaWx0ZXIoY291bnRyeSA9PSAiSmFwYW4iKSB8PiBkcm9wX25hKHZhbHVlKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BjX2xvbmcgfD4gZmlsdGVyKGlzbzJjICVpbiUgQVNFQU4pIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY291bnRyeSwgbGluZXR5cGUgPSBuYW1lKSkgKyBnZW9tX2xpbmUoKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BjX2xvbmcgfD4gZmlsdGVyKGlzbzJjICVpbiUgQVNFQU4pIHw+IGRyb3BfbmEodmFsdWUpIHw+IAogIGZpbHRlcih2YWx1ZSA8IDgwKSB8PgogIGdncGxvdChhZXMoeWVhciwgdmFsdWUsIGNvbCA9IGNvdW50cnksIGxpbmV0eXBlID0gbmFtZSkpICsgZ2VvbV9saW5lKCkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wY19sb25nIHw+IGZpbHRlcihjb3VudHJ5ICVpbiUgU0FDVSkgfD4gZHJvcF9uYSh2YWx1ZSkgfD4KICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjb3VudHJ5LCBsaW5ldHlwZSA9IG5hbWUpKSArIGdlb21fbGluZSgpCmBgYAoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg566x44Gy44GS5Zuz77yIQm94cGxvdO+8iQoKYGBge3J9CmRmX3BjX2xvbmcgfD4gZmlsdGVyKG5hbWUgPT0gInJlZnVnZWVfYXN5bHVtIikgfD4gCiAgZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyhyZWdpb24sIHZhbHVlKSkgKyBnZW9tX2JveHBsb3QoKSArIGNvb3JkX2ZsaXAoKQpgYGAKCi0tLQoKYGBge3J9CmRmX3BjX2xvbmcgfD4gZmlsdGVyKG5hbWUgPT0gInJlZnVnZWVfYXN5bHVtIikgfD4gCiAgZmlsdGVyKHJlZ2lvbiAhPSAiQWdncmVnYXRlcyIpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyhyZWdpb24sIHZhbHVlKSkgKyBnZW9tX2JveHBsb3QoKSArIHNjYWxlX3lfbG9nMTAoKSArIGNvb3JkX2ZsaXAoKQpgYGAKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3J9CmRmX3BlYWNlIHw+IGZpbHRlcihyZWdpb24gIT0gIkFnZ3JlZ2F0ZXMiKSB8PiBkcm9wX25hKHJlZnVnZWVfYXN5bHVtKSB8PgogIGdncGxvdChhZXMocmVnaW9uLCByZWZ1Z2VlX2FzeWx1bSkpICsgZ2VvbV9ib3hwbG90KCkgKyBzY2FsZV95X2xvZzEwKCkgKyBjb29yZF9mbGlwKCkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyfQpkZl9wY19sb25nIHw+IGZpbHRlcihuYW1lICVpbiUgYygicmVmdWdlZV9hc3lsdW0iLCAicmVmdWdlZV9vcmlnaW4iKSkgfD4gCiAgZmlsdGVyKGluY29tZSAhPSAiQWdncmVnYXRlcyIpIHw+IGRyb3BfbmEodmFsdWUpIHw+CiAgZ2dwbG90KGFlcyhpbmNvbWUsIHZhbHVlLCBmaWxsID0gbmFtZSkpICsgZ2VvbV9ib3hwbG90KCkgKyBzY2FsZV95X2xvZzEwKCkgKyBjb29yZF9mbGlwKCkKYGBgCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmBgYHtyIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTd9CmRmX3BjX2xvbmcgfD4gZmlsdGVyKGluY29tZSAhPSAiQWdncmVnYXRlcyIsIGluY29tZSAhPSAiTm90IGNsYXNzaWZpZWQiKSB8PiBkcm9wX25hKHZhbHVlKSB8PgogIGdncGxvdChhZXMoaW5jb21lLCB2YWx1ZSwgZmlsbCA9IG5hbWUpKSArIGdlb21fYm94cGxvdCgpICsgc2NhbGVfeV9sb2cxMCgpICsgY29vcmRfZmxpcCgpCmBgYAoKIyMg44OV44Kh44Kk44Or44Oq44Oz44KvCgrln7rmnKznmoTjgavjga/jgIFQb3NpdENsb3Vk77yIPGh0dHBzOi8vcG9zaXQuY2xvdWQvPu+8ieOCkuS9v+OBo+OBpuWun+e/kgoKLSAgIOaOoue0oueahOODh+ODvOOCv+WIhuaekO+8iEVEQe+8iSAtCiAgICAtICAg6Kqy6aGMMSsyOuS+iyDlubPlkozvvIhwZWFjZS5SbWTvvIkgW1vjg6rjg7Pjgq9dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3BlYWNlLm5iLmh0bWwpXSwgW1tSbWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcy1zbC9pbnRybzJyL2Jsb2IvbWFpbi9kb2NzL2dlczAwMS9wZWFjZS5SbWQpXQogICAgLSAgIOiqsumhjDErMu+8muODhuODs+ODl+ODrOODvOODiO+8mnc4ZWRhX3RlbXBsYXRlLlJtZCBbW+ODquODs+OCr10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvdzhlZGFfdGVtcGxhdGUubmIuaHRtbCldLCBbW1JtZF0oaHR0cHM6Ly9naXRodWIuY29tL2RzLXNsL2ludHJvMnIvYmxvYi9tYWluL2RvY3MvZ2VzMDAxL3c4ZWRhX3RlbXBsYXRlLlJtZCldCgoqKjIwMjMuMi4xNy4yMzo1OSoqIOOBvuOBp+OBqyBNb29kbGUg44Gu6Kqy6aGM77yS5o+Q5Ye644Oc44OD44Kv44K544Gr5o+Q5Ye644GX44Gm44GP44Gg44GV44GE44CCCgrjgafjgY3jgZ/jgrDjg6njg5XjgaDjgZHjgafjgoLmp4vjgYTjgb7jgZvjgpPjgYvjgonjgIHmnJ/pmZDjgb7jgafjgavmj5Dlh7rjgZfjgabjgY/jgaDjgZXjgYTjgILop6PoqqzjgpLliqDjgYjjgIHoqrLpoYzvvJLlho3mj5Dlh7rjg5zjg4Pjgq/jgrnjgpLkvZzmiJDjgZnjgovkuojlrprjgafjgZnjgIIKCiMjIOiqsumhjDIKCuS7peS4i+OBruaMh+aomeOBruS4reOBi+OCieOAgeS6jOOBpOS7peS4iu+8iOikh+aVsO+8ieOCkumBuOaKnuOBl+OBpuOAgeODh+ODvOOCv+OBruamguimge+8iGRlc2NyaXB0aW9u77yJ44KS6KiY6Yyy44GX44CB44OH44O844K/44KSIFdESSDjgaflj5blvpfjgZfjgIHku6XkuIvjga7liIbmnpDjgpLjgZnjgovjgIIKCjEg5ZCE5bm05q+O44Gu44OH44O844K/44Gu5pWw44Gu5qOS44Kw44Op44OVCgoyIOe1jOW5tOWkieWMluOCkuihqOOBmeaKmOOCjOe3muOCsOODqeODlSBhLiDml6XmnKzjgIHjgb7jgZ/jga/jg4fjg7zjgr/jgYzjgYLjgovlm70gYi4g6YG45oqe44GX44Gf44GE44GP44Gk44GL44Gu5Zu9CgozIOikh+aVsOOBruaMh+aomeOBruWApOOCkuS4gOWIl+OBq+WQq+OCgOe4pumVt+OBruihqO+8iExvbmcgVGFibGXvvInjgpLkvZzmiJDjgZcg44CAIGEuIOaXpeacrOOAgeOBvuOBn+OBr+ODh+ODvOOCv+OBjOOBguOCi+WbveOBruOAgeikh+aVsOOBruaMh+aomeOCkuiJsuWIhuOBkeOBl+OBn+e1jOW5tOWkieWMluOBruOCsOODqeODlSDjgIAgYi4g6YG45oqe44GX44Gf44GE44GP44Gk44GL44Gu5Zu944Gr44Gk44GE44Gm44Gu57WM5bm05aSJ5YyW44Gu44Kw44Op44OV44KS44CB5Zu944KS6Imy5YiG44GR44GX44CB5oyH5qiZ44Gv57ea44Gu56iu6aGe44KS5aSJ44GI44Gf44Kw44Op44OVCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIyDoqrLpoYwyIOOBpOOBpeOBjQoKNCDkuozjgaTjga7jg4fjg7zjgr/jga7mlaPluIPlm7MtIE5BIOOBr+WPluOCiumZpOOBj+OBk+OBqOOAgu+8iGxvZzEwIOOCueOCseODvOODq+OCkueUqOOBhOOCi+WgtOWQiOOBr+WApOOBjOato+OBruOCguOBruOBruOBv+OBq+mZkOWumu+8iSBhLiDvvIjlnLDln5/jgpLpmaTjgY3vvInlm73jga7jgb/jga7mlaPluIPlm7Mg77yI6L+R5Ly877yI5Zue5biw77yJ55u057ea44KS6KGo56S677yJIGIuIOacgOi/keOBruW5tOOBru+8iOWcsOWfn+OCkumZpOOBje+8ieWbveOBruOBv+OBruaVo+W4g+Wbs+OAgO+8iOi/keS8vO+8iOWbnuW4sO+8ieebtOe3muOCkuihqOekuu+8iSBjLiBiIOOBq+WvvuW/nOOBmeOCi+ebuOmWouS/guaVsAoKNSDjgqvjg4bjgrTjg6rjg7zlpInmlbDvvIhDYXRlZ29yaWNhbCBWYXJpYWJsZTogcmVnaW9uLCBpbmNvbWUsIHllYXIg44Gq44Gp77yJ44Go44CB5pWw5YCk5aSJ5pWw77yITnVtYmVyaWNhbCBWYXJpYWJsZe+8ieS4gOe1hOOBq+OBpOOBhOOBpuOBrueuseODkuOCsuWbs++8iEJveHBsb3TvvIkKCuOBneOCjOOBnuOCjOOBq+OBpOOBhOOBpuiAg+Wvn++8iOawl+OBpeOBhOOBn+OBk+OBqOOAgeeWkeWVj+OBquOBqe+8ieOCkuiomOOBmQoKKioyMDIzLjIuMTcuMjM6NTkqKiDjgb7jgafjgasgTW9vZGxlIOOBruiqsumhjO+8kui/veWKoOaPkOWHuuODnOODg+OCr+OCueOBq+aPkOWHuuOBl+OBpuOBj+OBoOOBleOBhOOAggoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyMg56K66KqN5L2c5qWtCgotICAgUHJldmlldyDjgafnorroqo3jgIIKCi0gICBXZWIgQnJvd3NlciDjgafjgIF3NV9jMTIzNDU2Lm5iLmh0bWwg44Gq44Gp44CBUiBOb3RlYm9vayDjgpLopovjgabnorroqo3jgIIKCi0gICDjgoLjgZfjgIHllY/poYzjgYzjgYLjgozjgbDjgIFSdW4g44Oc44K/44Oz44Gu5Y+z44Gu5LiJ6KeS44GL44KJ44CBUnVuIEFsbCDjgpLpgbjmip7jgZfjgIHjgqjjg6njg7zjgYzjgafjgarjgYTjgYvnorroqo3jgIIKCi0gICDmnIDliJ3jgavjgoLjganjgovjgIIKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMjIOOCqOODqeODvOWvvuW/nAoKLSAgIOWFpeWKm+OBl+OBn+OBqOOBjeOBq+OBr+OAgeS+i+OCkuWPgueFp+OBl+OBpuOAgeOCueODmuODq+OCkueiuuiqjeOAguWFqOinkuOChOWkieaVsOWQjeOBruepuueZveOBr+WVj+mhjOOCkui1t+OBk+OBmeOAguaLrOW8p+OAgCgpIOOChOW8leeUqOespuOBjOODmuOCouOBp+ODnuODg+ODgeOBl+OBpuOBhOOCi+OBi+OAgeeiuuiqjeOAguW8leeUqOespuOBjOWFpeOBo+OBpuOBhOOBquOBi+OBo+OBn+OCiuOAgT09IOOBruOBqOOBk+OCjeOBjOOAgT0g44Gg44Gj44Gf44KK44CBRXJyb3Ig44Gv5qeY44CF44CCCi0gICBGaWxlIG5vdCBmb3VuZCDjga7jgajjgY3jga/jgIHjg4fjg7zjgr/jgpLoqq3jgb/ovrzjgoDjgrPjg7zjg4njgpLlho3lrp/ooYzjgILjgZ3jgozjgafjgoLjgYbjgb7jgY/jgYTjgYvjgarjgYTjgajjgY3jga/jgIFkYXRhIOODleOCqeODq+ODgOOBq+OAgeODh+ODvOOCv++8iFwqXCpcKi5jc3bvvInjgYzlhaXjgaPjgabjgYTjgovjgYvjgpLnorroqo3jgIHjgarjgZHjgozjgbDjgIFkYXRhIOODleOCqeODq+ODgOOBjOOBguOCi+OBk+OBqOOCkueiuuiqjeOAgeOBquOBkeOCjOOBsOS9nOaIkOOBl+OBpuiqreOBv+i+vOOBv+OCkuWun+ihjOOAggotICAgT2JqZWN0IG5vdCBmb3VuZCDjga7jgqjjg6njg7zjgYzjgafjgZ/jgajjgY3jgavjga/jgIHkuIrjgYvjgonpoIbjgavjgIFSdW4g77yIQ29kZSBDaHVuayDjga7lj7PkuIrjga7kuInop5LljbDjgpLmirzjgZfjgablrp/ooYzvvInjgILjgb7jgZ/jga/jgIHjgqjjg6njg7znrofmiYDjgavjgqvjg7zjgr3jg6vjgpLnva7jgY3jgIFSdW4g44Oc44K/44Oz44Gu5Y+z44Gu5LiJ6KeS44GL44KJ44CBUnVuIEFsbCBDaHVua3MgQWJvdmUg44KS6YG45oqe44GX44Gm5a6f6KGM44CCCi0gICDlrp/ooYzjgafjgY3jgabjgYTjgabjgoLjgIHntZDmnpzjgYzopovjgYjjgarjgYTjgZPjgajjgYzjgYLjgovjgILjgZ3jga7jgajjgY3jga/jgIFDb2RlIENodW5rIOOBruS4i+OBq+OBguOCi+OAgeWxseS6jOOBpOOBruiomOWPt+OCkuaKvOOBmeOAgue1kOaenOOBruihqOekuuOAgemdnuihqOekuuOBruWIh+OCiuabv+OBiOOAggotICAgRXJyb3IgbWVzc2FnZSDjgpLoqq3jgoDjgILjgqjjg6njg7zjgYzlh7rjgZ8gQ29kZSBDaHVuayDjgajjgIFFcnJvciBtZXNzYWdlIOOCkuOAgUNoYXRHUFQg44KE44CBR29vZ2xlIEJhcmQsIEdvb2dsZSBTZWFyY2gg44Gr5YWl44KM6Kej5rG65pa55rOV44KS5o6i44KL44CCCi0gICBQb3NpdC5DbG91ZCDjgafjgIFFcnJvciAxMzcg44GM5Ye644Gf5pmC44Gv44Oh44Oi44Oq44O844Kq44O844OQ44O844Gq44Gu44Gn44CB5L6L44Gq44Gp5LiN6KaB44Gq6YOo5YiG44KS5YmK6Zmk44CC44Gf44Gg44GX44CB5LiA55Wq5LiK44Gu44CBWUFNTCDjga/jgIHjgYvjgarjgonjgZrmrovjgZnjgZPjgajjgIIKCiMjIOWPguiAg+aWh+eMrgoKLSAgIOiqsumhjDHvvJrop6PoqqwgW+ODquODs+OCr10oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9nZXMwMDEvdzVhX3Jlc3BvbnNlLm5iLmh0bWwp44O76Kej562U5L6LIFvjg6rjg7Pjgq9dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3c1ZWRhMC5uYi5odG1sKQo8IS0tIC0gICDnrKw26YCx5ryU57+S77ya6Kej562U5L6LIFvjg6rjg7Pjgq9dKGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvZ2VzMDAxL3c2ZWRhMC5uYi5odG1sKSAtLT4KLSAgIOaOoue0oueahOODh+ODvOOCv+WIhuaekO+8iOiqsumhjDLjga7op6PoqqzjgavjgYvjgYjjgabvvIlpbiBwcm9ncmVzcyBb44Oq44Oz44KvXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dlczAwMS9lZGEubmIuaHRtbCkKCjEuICDjgIzjgb/jgpPjgarjga7jg4fjg7zjgr/jgrXjgqTjgqjjg7PjgrkgLSBEYXRhIFNjaWVuY2UgZm9yIEFsbOOAjVtb44Gv44GY44KB44Gm44Gu44OH44O844K/44K144Kk44Ko44Oz44K5XShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai9maXJzdC1leGFtcGxlLmh0bWwjZmlyc3QtZXhhbXBsZSldCgogICAgPCEtLSAtICAg5bCO5YWl44Go44GX44Gm44CBR0RQ77yI5Zu95YaF57eP55Sf55Sj77yJ44Gu44OH44O844K/44KS5L2/44Gj44Gm6Kqs5piO44GX44Gm44GE44G+44GZ44CCIC0tPgoKMi4gIFBvc2l0IFJlY2lwZXPvvIjml6cgUG9zaXQgUHJpbWVyc++8iTogVGhlIEJhc2ljcyDlr77oqbHlnovjga7mvJTnv5LjgrXjgqTjg4jjga7mnIDliJ0gW1tMaW5rXShodHRwczovL3Bvc2l0LmNsb3VkL2xlYXJuL3JlY2lwZXMpXQoKMy4gIFBvc2l0IENoZWF0IFNoZWV0LiDml6nopovooajjgafjgZnjgILljbDliLfjgZfjgabkvb/jgYbjgZ/jgoHjgavjgIFQREYg44KC5o+Q5L6b44GX44Gm44GE44G+44GZ44CCW1tTaXRlIExpbmtdKGh0dHBzOi8vcnN0dWRpby5naXRodWIuaW8vY2hlYXRzaGVldHMvKV0KCjQuICBEYXRhQ2FtcCBDaGVhdCBTaGVldDogVGlkeXZlcnNlIGZvciBCaWdpbm5lcnMuIOODh+ODvOOCv+OCteOCpOOCqOODs+OCueOBruaVmeiCsuOCkuOBl+OBpuOBhOOCi+S8muekvuOBruaXqeimi+ihqOOBruS4gOOBpOOBp+OBmeOAguWfuuacrOOBjOewoeWNmOOBq+OBvuOBqOOBvuOBo+OBpuOBhOOBvuOBmeOAgltbTGlua10oaHR0cHM6Ly9pbWFnZXMuZGF0YWNhbXAuY29tL2ltYWdlL3VwbG9hZC92MTY3NjMwMjY5Ny9NYXJrZXRpbmcvQmxvZy9UaWR5dmVyc2VfQ2hlYXRfU2hlZXQucGRmKV0KCjUuICDnrrHjgbLjgZLlm7Pjga7opovmlrkgW0xpbmtdKGh0dHBzOi8vYmVsbGN1cnZlLmpwL3N0YXRpc3RpY3MvY291cnNlLzUyMjAuaHRtbCnjgIHlpJbjgozlgKTmpJzlh7rjga7jgYLjgovnrrHjgbLjgZLlm7MgW0xpbmtdKGh0dHBzOi8vYmVsbGN1cnZlLmpwL3N0YXRpc3RpY3MvY291cnNlLzUyMjIuaHRtbCkKCjYuICBWaWRlbzogW0hpc3RvZ3JhbV0oaHR0cHM6Ly92aW1lby5jb20vMjIxNjA3MzQxKSwgW0JveHBsb3RdKGh0dHBzOi8vdmltZW8uY29tLzIyMjM1ODAzNCkK