右上の Code マークから、ソースファイルもダウンロードすることができます。

Posit (RStudio) Cloud での実習

RNotebook ファイルを新規作成し、このページを、全選択して、コピー・ペーストします。(rmarkdown のインストールが必要です) Save As … または、フロッピーディスクマークをおして、ds-edu などとして保存。 説明を読みながら、コードチャンクと言われる、色が変わっている、の右上にある三角印を押すと、実行されます。

このあとで、RNotebook についても、少し説明します。

1 準備:Posit Cloud ログイン

Posit Cloud (https://posit.cloud/) のアカウントを作成して、ログインした状態から始めます。

無論 RStudio で R を利用できる方は、ほとんど同じですが、Posit Cloud には、ファイルや、データも入っていますので、そのまま活用することが可能です。

RStudio での、動作不良の場合の対応は省略させていただきます。できれば、上のメニューの File から、New Project を選択して、Project を作って、そこで作業をされることをお勧めします。

問題がある時は、下のサイトを参照してください。Posit Cloud についても、多少の説明が書いてあります。

https://icu-hsuzuki.github.io/ds4aj/ronrstudio.html

右上の New Project を選択して、始めることが普通ですが、本日は、

このリンクにアクセスしていただき、Save a Permanent Copy を選択してくださると、そのなかで、自分のプロジェクトとして、実行することが可能になります。

https://posit.cloud/content/5539763

2 はじめに

2.1 基本コマンド - in Console

下のコマンドを左下の窓枠(Pane)に入れてみてください。

  • head(cars)
  • str(cars)
  • summary(cars)
  • df <- cars
    • <-_%>% と ` back tick のキーボード上での位置の確認
  • head(df)
  • plot(df)
  • View(cars) または、右上の Environment から、df_cars をクリック
  • ?cars または Help 検索窓で cars, head など

2.1.1 実際の出力

head(cars)
str(cars)
'data.frame':   50 obs. of  2 variables:
 $ speed: num  4 4 7 7 8 9 10 10 10 11 ...
 $ dist : num  2 10 4 22 16 10 18 26 34 17 ...
summary(cars)
     speed           dist       
 Min.   : 4.0   Min.   :  2.00  
 1st Qu.:12.0   1st Qu.: 26.00  
 Median :15.0   Median : 36.00  
 Mean   :15.4   Mean   : 42.98  
 3rd Qu.:19.0   3rd Qu.: 56.00  
 Max.   :25.0   Max.   :120.00  
df <- cars
head(df)
plot(df)

おすすめ:Sys.setenv(LANG = "en")

システム言語を英語に設定すると、不明のエラーメッセージがでたときにも、検査で解決できることが多い。

2.1.2 参考

データーサインスをはじめましょう の中コンソールで実行 に、簡単な説明があります。

2.2 Package の確認とインストール

Rパッケージは、Rの拡張機能で、コード、データ、ドキュメントを標準化されたコレクション形式で含んでおり、標準的なものは、R Studio の Top Bar の Tool > Install Packages からインストールできます。

  • 次の三つをインストールします: tidyverse, rmarkdown, WDI
  • Tools から Install packages を選び、一つ一つ入れていくと、install できます。少し時間がかかります。

2.2.1 備考

R は、多くの方が、パッケージを開発して、それぞれの分野で、使いやすくしていった統計解析のためのコンピュータ言語です。ただ、基本をのぞいて、それぞれの好みにあわせて、開発された面もあり、統一性にはかける言語です。あとで説明する、探索的データ分析(Exploratory Data Analysis)のために必要な基本的なものを、整合性のある形で、再構築したものが、tidyverse パッケージで、中心となった、H. Wickham は、RStudio(現在の Posit) に加わりました。そのメンバーの、Y. Xie(谢益辉) たちが開発したものが、rmarkdown に関連したパッケージです。

2.3 R Markdown 入門

2.3.1 R Notebook

R Markdownはデータサイエンスのためのオーサリングフレームワーク。

コード(プログラム)とその実行結果、を記録・表示し、高品質のレポートの作成を可能にします。

R Notebook は、独立してインタラクティブに実行できるチャンクを持つR Markdownドキュメントの一つの形式で、入力のすぐ下に出力が表示することができます。

  1. File > New File > R Notebook
  2. Save with a file name, say, test-notebook
  3. Preview by [Preview] button
  4. Run Code Chunk plot(cars) and then Preview again.
  • テンプレートファイルの利用

下のリンクを開き、全部を選択し、R Notebook ファイルも全選択して貼り付ければ、日本版も見ることができます。

2.3.2 intro2rj.Rmd

右下の File タブから、intro2rj.Rmd を開きます。 Preview の右のギアマークの Preview in Viewer Pane を選択してから、Preview バタンを押すと、内容を確認することができます。

あとから使うので、ロードしておきます。最初に次のようなコードを実行します。右の三角を押します。

Posit Cloud のサイトには、data ディレクトリ(フォルダ)が作成されていますが、

2.3.3 参考

データーサインスをはじめましょう の中のR Markdown に、“Reproducible and Literate Programming” (Reproducible (再現可能)かつ、Literate な(理解できるように記述した)Program(プログラム・コード)を共有すること)をたいせつにする RMarkdown の重要性について簡単に書いてあります。

3 R Notebook での実習

3.1 準備 Setup

データディレクトリを作成しておきます。今後、データは、このディレクトリに保存します。すでに、存在する場合は、その旨メッセージが出ますが、中身が消去されることはありません。

dir.create("./data")

パッケージはインストールしてあっても、利用するときには、次のように使える状態に(ロード)します。

一つ目は、tidyverse ですが、もう一つは、あとから活用する、世界開発指標に関するデータを利用するためのパッケージです。

library(tidyverse)
── Attaching core tidyverse packages ────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.2     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.2     ✔ tibble    3.2.1
✔ lubridate 1.9.2     ✔ tidyr     1.3.0
✔ purrr     1.0.1     ── Conflicts ──────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(WDI)

3.2 世界開発指標 (WDI)

例から始めます。

次のコードは、国別に、GDP の大きい方から並べたものです。

WDI(country = "all", indicator = c(gdp = "NY.GDP.MKTP.CD"),
    extra=TRUE) %>% drop_na(gdp) %>%
  filter(year==max(year), income !="Aggregates") %>% 
  drop_na(region) %>% arrange(desc(gdp))

3兆ドルを超えている6つの国についての過去の推移をグラフにしたものです。

WDI(country = c("CN","GB","JP","IN","US","DE"), indicator = c(gdp = "NY.GDP.MKTP.CD"), extra=TRUE) %>% drop_na(gdp) %>% 
  ggplot(aes(year, gdp, col = country)) + geom_line() +
  labs(title = "WDI NY.GDP.MKTP.CD: gdp")

WDI(country = c("CN","IN","JP","US"), 
    indicator = c(gdp_growth_rate = "NY.GDP.MKTP.KD.ZG"), extra=TRUE) %>%
  drop_na(gdp_growth_rate) %>% 
  ggplot(aes(year, gdp_growth_rate, col = country)) + geom_line() +
  labs(title = paste("WDI NY.GDP.MKTP.KD.ZG: gdp growth rate"))

3.2.1 注意

一つ一つのコードを丁寧に説明し、理解することは、後回しにし、少しずつ学んでいくことにし、ここでは、それぞれの問題意識のもとで、どのようなことができるかを、理解するため、活用することを優先したいと思います。

3.2.2 上で使った指標 (WDI) コード

  • NY.GDP.MKTP.CD: GDP (current US$)
  • NY.GDP.MKTP.KD.ZG: GDP growth (annual %)

3.2.3 世界開発指標 (WDI) を探してみましょう

WDIは、世界の開発状況と、貧困との戦いに関する、適切で上質、かつ、国際的に比較可能な時系列の統計データを編纂したものです。このデータベースは、217の経済と40以上の国グループについて1,400の時系列指標を含み、指標のデータの多くは50年以上前に遡ることができます。

下の2箇所から探すことができます。

3.2.4 参考

データーサインスをはじめましょう の中の パブリックデータに、例があります。また、世界開発指標 の項に、上で紹介したサイトから、どのように、WDI コードを見つけるかの説明があります。

3.2.5 練習 1. - 調べてみたい WDI

世界開発指標のコードをいくつか、リストしてみましょう。

4 WDI パッケージ

WDI パッケージで、データをダウンロードしたり、探したり、詳細情報を得たりできます。

検索や、ダウンロード方法が理解できるように、例示してありますが、ざっと確認して、4.3.3 のテンプレートを利用すると、グラフを描くこともできます。

4.1 指標 WDI 検索

4.1.1 検索例 1(WDI名)

WDIsearch(string = "gdp", field = "name", short = TRUE, cache = NULL)
WDIsearch(string = "military expenditure", field = "name", short = TRUE, cache = NULL)

4.1.2 検索例 2(WDI)

WDIsearch(string = "NY.GDP.MKTP.CD", field = "indicator", short = TRUE, cache = NULL)

4.1.3 練習 2. - 検索(short)

名前で検索(“” の間に、(なるべく簡単な)検索文字列を入れてください。)

WDIsearch(string = "", field = "name", short = TRUE, cache = NULL)

Indicator で検索(“” の間に、調べたい indicator を入れてください。)

WDIsearch(string = "", field = "indicator", short = TRUE, cache = NULL)

4.1.4 詳しい情報を得るには

short = FALSE とします。時間がかかるので、検索は、Indicator と、名前などの情報をもったファイルを手元に持っておくことにします。

wdi_cache <- WDIcache()

右上の窓枠(pane)から、wdi_cache を探して、中身を見てみましょう。series と、country の二つのデータ・フレームからなっているリストです。三角印や、右から二番目の巻物のようなアイコンをクリックすると中身が見えます。

4.1.5 検索例 3(WDI名)

WDIsearch(string = "CPI Price", field = "name", short = FALSE, cache = wdi_cache)
  • CPTOTNSXN: CPI Price, nominal
    • The consumer price index reflects the change in prices for the average consumer of a constant basket of consumer goods. Data is not seasonally adjusted.

4.1.6 検索例 4(WDI)

WDIsearch(string = "NY.GDP.MKTP.KD.ZG", field = "indicator", short = FALSE, cache = wdi_cache)

4.1.7 練習 2 - 検索(long w/ cache)

string と、field を、ふたつとも入れてください。

WDIsearch(string = "", field = "", short = FALSE, cache = wdi_cache)

4.2 指標 WDI データのダウンロード

Indicator が決まったら、ダウンロードします。

右下の、Help Tab に WDI と入れると、使い方もわかります。

?WDI

4.2.1 ダウンロード例 1-1

df_gdp1 <- WDI(country = "all", indicator = "NY.GDP.MKTP.CD")
df_gdp1

4.2.2 ダウンロード例 1-2

df_gdp2 <- WDI(country = "all", indicator = c(gdp = "NY.GDP.MKTP.CD"))
df_gdp2

4.2.3 ダウンロード例 1-3

df_gdp3 <- WDI(country = "all", indicator = c(gdp = "NY.GDP.MKTP.CD"), extra=TRUE, cache=wdi_cache)
df_gdp3

4.2.4 ダウンロード例 1-4

df_gdp4 <- WDI(country = c("CN","GB","JP","IN","US","DE"), indicator = c(gdp = "NY.GDP.MKTP.CD"), extra=TRUE, cache=wdi_cache)
df_gdp4

4.2.4.1 ダウンロード例 2-1

  • NY.GDP.DEFL.KD.ZG: Inflation, GDP deflator (annual %)
  • CPTOTNSXN: CPI Price, nominal
df_gdp21 <- WDI(country = "all", 
                indicator = c(gdp_deflator = "NY.GDP.DEFL.KD.ZG", 
                              cpi_price = "CPTOTNSXN"), 
                extra=TRUE, cache=wdi_cache)
df_gdp21
str(df_gdp21)
'data.frame':   24238 obs. of  14 variables:
 $ country     : chr  "Advanced Economies" "Advanced Economies" "Advanced Economies" "Advanced Economies" ...
 $ iso2c       : chr  "AME" "AME" "AME" "AME" ...
 $ iso3c       : chr  "" "" "" "" ...
 $ year        : int  1987 1988 1989 1990 1991 1992 1993 1994 1995 1996 ...
 $ status      : chr  "" "" "" "" ...
 $ lastupdated : chr  "2020-07-27" "2020-07-27" "2020-07-27" "2020-07-27" ...
 $ gdp_deflator: num  NA NA NA NA NA NA NA NA NA NA ...
  ..- attr(*, "label")= chr "Inflation, GDP deflator (annual %)"
 $ cpi_price   : num  58.7 60.5 63 66 69.1 ...
  ..- attr(*, "label")= chr "CPI Price,not seas.adj,,,"
 $ region      : chr  NA NA NA NA ...
 $ capital     : chr  NA NA NA NA ...
 $ longitude   : chr  NA NA NA NA ...
 $ latitude    : chr  NA NA NA NA ...
 $ income      : chr  NA NA NA NA ...
 $ lending     : chr  NA NA NA NA ...
summary(df_gdp21)
   country             iso2c              iso3c          
 Length:24238       Length:24238       Length:24238      
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  
                                                         
                                                         
                                                         
                                                         
      year         status          lastupdated       
 Min.   :1960   Length:24238       Length:24238      
 1st Qu.:1982   Class :character   Class :character  
 Median :1997   Mode  :character   Mode  :character  
 Mean   :1995                                        
 3rd Qu.:2009                                        
 Max.   :2022                                        
                                                     
  gdp_deflator         cpi_price         region         
 Min.   :  -98.704   Min.   :  0.00   Length:24238      
 1st Qu.:    2.315   1st Qu.: 55.95   Class :character  
 Median :    5.256   Median : 83.28   Mode  :character  
 Mean   :   25.299   Mean   : 84.18                     
 3rd Qu.:   10.386   3rd Qu.:108.75                     
 Max.   :26765.858   Max.   :551.25                     
 NA's   :11881       NA's   :18676                      
   capital           longitude           latitude        
 Length:24238       Length:24238       Length:24238      
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  
                                                         
                                                         
                                                         
                                                         
    income            lending         
 Length:24238       Length:24238      
 Class :character   Class :character  
 Mode  :character   Mode  :character  
                                      
                                      
                                      
                                      

右上の窓枠の、Environment も見てみましょう。

4.3 可視化 Visualization

グラフ(Chart)を描いて視覚化しよう

4.3.1 グラフ 1

df_gdp4 %>% ggplot(aes(year, gdp, col=country)) + geom_line()

4.3.2 グラフ 2

df_gdp4 %>% drop_na(gdp) %>% 
  ggplot(aes(year, gdp, col=country)) + geom_line() +
  labs(title = paste("WDI - NY.GDP.MKTP.CD: ", "gdp"))

4.3.3 テンプレート Templates

4.3.3.1 一つの国についての、一つの指標(WDI)と、その略称から、折線グラフを作成

Line Plot with one indicator with abbreviation and one country

chosen_indicator <- "SL.UEM.TOTL.NE.ZS"
short_name <- "unemployment"
chosen_country <- "United States"
WDI(country = "all", indicator = c(short_name = chosen_indicator), extra=TRUE, cache=wdi_cache) %>%
  filter(country == chosen_country) %>% 
  ggplot(aes(year, short_name)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator, ": ", short_name, " - ", chosen_country),
       y = short_name)

4.3.3.2 一つの国についての、一つの指標(WDI)から、折線グラフを作成

Line Plot with one indicator and one country

chosen_indicator <- "SL.UEM.TOTL.NE.ZS"
chosen_country <- "United States"
WDI(country = "all", indicator = c(chosen_indicator = chosen_indicator), 
    extra=TRUE, cache=wdi_cache) %>%
  filter(country == chosen_country) %>% 
  ggplot(aes(year, chosen_indicator)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator, " - ", chosen_country), 
       y = chosen_indicator)

4.3.3.3 いくつかの国についての、一つの指標(WDI)と、その略称から、折線グラフを作成

Line Plot with one indicator with abbreviation and several countries

chosen_indicator <- "SL.UEM.TOTL.NE.ZS"
short_name <- "unemployment"
chosen_countries <- c("United States","United Kingdom", "Japan")
WDI(country = "all", indicator = c(short_name = chosen_indicator), extra=TRUE, cache=wdi_cache) %>% drop_na(short_name) %>% 
  filter(country %in% chosen_countries) %>% 
  ggplot(aes(year, short_name, col = country)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator, ": ", short_name), y = short_name)

4.3.3.4 一つの国についての、二つの指標(WDI)と、その略称から、折線グラフを作成

Line Plot with two indicators with abbreviation and one country

chosen_indicator_1 <- "NY.GDP.DEFL.KD.ZG"
short_name_1 <- "gdp_deflator"
chosen_indicator_2 <- "CPTOTSAXNZGY"
short_name_2 <- "cpi_price"
chosen_country <- "United States"
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>% 
  filter(country == chosen_country) %>% 
  pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
  ggplot(aes(year, value, col = class)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2, " - ", chosen_country)) +
  scale_color_manual(labels = c(short_name_1, short_name_2), values = scales::hue_pal()(2))

chosen_indicator_1 <- "SL.TLF.CACT.MA.NE.ZS"
short_name_1 <- "male"
chosen_indicator_2 <- "SL.TLF.CACT.FE.NE.ZS"
short_name_2 <- "female"
chosen_country <- "United States"
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>% 
  filter(country == chosen_country) %>% 
  pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
  ggplot(aes(year, value, col = class)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2, " - ", chosen_country)) +
  scale_color_manual(labels = c(short_name_1, short_name_2), values = scales::hue_pal()(2))

4.3.3.5 いくつかの国についての、二つの指標(WDI)と、その略称から、折線グラフを作成

Line Plot with two indicators with abbreviation and several countries

chosen_indicator_1 <- "NY.GDP.DEFL.KD.ZG"
short_name_1 <- "gdp_deflator"
chosen_indicator_2 <- "CPTOTSAXNZGY"
short_name_2 <- "cpi_price"
chosen_countries <- c("United States", "France", "Japan")
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>% 
  filter(country %in% chosen_countries) %>% 
  pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
  ggplot(aes(year, value, linetype = class, col = country)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2)) +
  scale_linetype_manual(labels = c(short_name_1, short_name_2), values = c("solid", "dashed"))

chosen_indicator_1 <- "SL.TLF.CACT.MA.NE.ZS"
short_name_1 <- "male"
chosen_indicator_2 <- "SL.TLF.CACT.FE.NE.ZS"
short_name_2 <- "female"
chosen_countries <- c("United States", "France", "Japan")
WDI(country = "all", indicator = c(short_name_1 = chosen_indicator_1, short_name_2 = chosen_indicator_2), extra=TRUE, cache=wdi_cache) %>% 
  filter(country %in% chosen_countries) %>% 
  pivot_longer(c(short_name_1, short_name_2), names_to = "class", values_to = "value") %>% drop_na(value) %>%
  ggplot(aes(year, value, linetype = class, col = country)) + geom_line() +
  labs(title = paste("WDI ", chosen_indicator_1, ": ", short_name_1, "\n", chosen_indicator_2, ": ", short_name_2)) +
  scale_linetype_manual(labels = c(short_name_1, short_name_2), values = c("solid", "dashed"))

4.4 課題 Assignment

上のテンプレートをコピーして、下に貼り付け、指標 indicator と、略称 short_name と、いくつかの国名 chosen_countries を、入れ替えて、試してみてください。

4.4.1 学生が選択した世界開発指標(WDI)の例

19人の受講生に、興味のある指標を選んで、テンプレートを使って、可視化をしてみてください、と課題に出した時に、調べてくれたものです。

url_indicators <- "https://ds-sl.github.io/intro2r/data/indicators.csv"
df_indicators <- read_csv(url_indicators) %>% left_join(wdi_cache$series)
Rows: 89 Columns: 5── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (5): indicator, name, description, sourceDatabase, sourceO...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.Joining with `by = join_by(indicator, name, description, sourceDatabase, sourceOrganization)`
write_csv(df_indicators, "./data/indicators.csv")
df_indicators %>% distinct(indicator, name) %>% arrange(indicator)

自分で課題を考え、データを選べることは、とても大切だということだと思います。

5 探索的データ解析 Exploratory Data Analysis (EDA)

5.1 探索的データ解析とは? (Posit Primers)

  1. EDAは、データが何を語っているかを理解するための反復的なサイクルです。

  2. まず、データに関する問いを作成します。

  3. データの可視化、変換、モデリングを行い、答えを探します。

学習したことを活用して、問いを修正したり、新しい問いを考えたりします。そして、このサイクルを繰り返していきます。

EDAはデータ分析において重要な役割を果たします。また、データの品質を保証するために、データの質を確認するために使用することもできます。

R4DS からのイメージ

問いをもちデータを取得し、視覚化などを通して、データを理解し、さらに問いを深めるサイクルが、データサイエンスの核ではないかと思います。

5.2 データの取得・読み込み - Importing Data

スタートは、本来は、データの作成・探索ですが、すでに、分析したいデータはすでにあるとして話を進めます。まずは、data フォルダ(directory)を作成しておくと良い。右下の窓枠の Files タブから、New Folder で作成してもよい。

dir.create("./data")

データの取得・読み込みを、四つの方法に分けて説明します。

  1. パッケージの利用
  • 例:WDI など。何度も、ダウンロードしなくて良いよいに、書き出しておき、2 を使うとよい。write(df_name, "./data/name.csv")
  1. コンピュータ上にある CSV などのテキストファイルを読み込む
  • 例:df_name <- read_csv("./data/file_name.csv")
  1. インターネット上のデータのアドレス(URL)を使って、CSV などのテキストファイルを読み込む。
  • 例:df_name <- read_csv(url_of_a_csv)
  1. コンピュータ上にある、Excel ファイルなどのデジタルファイルを読み込む。まず、library(readxl)
  • 例:df_name <- read_excel("./data/file_name.xlsx")
  1. サイトからダウンロードして、Project のデータフォルダに移す。または、データのアドレス(URL)がわかっていれば、直接ダウンロード。
  • 例:`download.file(url_of_a_data, destfile = “./data/data_name”)
  1. クリップボードにコピーして読み込む。
  • 例:df_name <- read_delim(clipboard())

5.3 WDIcache() の扱い

二つの、ファイルが一つになった、リストであるため、違って命令を使います。

wdi_cache <- WDIcache()
write_rds(wdi_cache, "./data/wdi_cache.RData")
wdi_cache <- read_rds("./data/wdi_cache.RData")

5.4 WDI での例

df_military6 <- WDI(country = c("CN","GB","JP","IN","US","DE"), indicator = c(military = "MS.MIL.XPND.CD"), extra=TRUE, cache=wdi_cache)
df_military6 %>% filter(year == 2021) %>% arrange(desc(military))
df_military6 %>% drop_na(military) %>%
  ggplot(aes(year, military, col=iso2c)) + geom_line()

df_military <- WDI(country = "all", indicator = c(military = "MS.MIL.XPND.CD"), extra=TRUE, cache=wdi_cache)
df_military %>% drop_na(military) %>% filter(year==2021, income=="High income", military >0) %>%
  ggplot(aes(military, fill=region)) + geom_density() + geom_vline(xintercept = 54123551702, col="red") + scale_x_log10() + geom_label(x=11.1, y=25, label = "Japan") + facet_wrap(~region) + theme(legend.position = "none") + labs(title="Military Expenses in high income countries")

df_military_gdp <- WDI(country = "all", indicator = c(military_gdp = "MS.MIL.XPND.GD.ZS"), extra=TRUE, cache=wdi_cache)
df_military_gdp %>% filter(country == "Japan", year==2021)
df_military_gdp %>% drop_na(military_gdp) %>% filter(year==2021, income!="Aggregates") %>%
  ggplot(aes(military_gdp, fill=income)) + geom_density(binwidth = 0.2, alpha=0.5) + geom_vline(xintercept = 2, col="red") + geom_vline(xintercept = 1, col="blue") + facet_wrap(~income)
Warning: Ignoring unknown parameters: `binwidth`

5.5 国際機関のデータ International Institutions’ Data

url_un_pop <- "https://data.un.org/_Docs/SYB/CSV/SYB65_1_202209_Population,%20Surface%20Area%20and%20Density.csv"
df_un_pop0 <- read_csv(url_un_pop)
New names:Rows: 7874 Columns: 7── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (7): T02, Population, density and surface area, ...3, ...4...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_un_pop0
url_un_pop <- "https://data.un.org/_Docs/SYB/CSV/SYB65_1_202209_Population,%20Surface%20Area%20and%20Density.csv"
df_un_pop <- read_csv(url_un_pop, skip=1)
New names:Rows: 7873 Columns: 7── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (4): ...2, Series, Footnotes, Source
dbl (2): Region/Country/Area, Year
num (1): Value
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_un_pop
df_un_pop %>% distinct(`Region/Country/Area`, `...2`)
df_un_pop %>% filter(`Region/Country/Area` %in% c(2,19,142,150,9), Series == "Population mid-year estimates (millions)") %>%
  ggplot(aes(Year, Value, fill = `...2`)) + geom_area(col="black") +
  labs(title = "Population mid-year estimates (millions) of the World")

5.6 OECD data

5.6.1 例:労働時間当たりGDP

労働時間当たりGDP

労働時間当たりGDPは、労働生産性の指標である。これは、労働投入量が他の生産要素と組み合わされ、生産プロセスでどれだけ効率的に利用されたかを測定するものである。労働投入量は、生産に従事するすべての人の総労働時間として定義される。労働生産性は、労働者の個人的能力や努力の強さといった労働の生産性を部分的にしか反映していない。アウトプット指標と労働投入量の比率は、他の投入物(資本、中間投入物、技術・組織・効率の変化、規模の経済など)の存在や利用に大きく左右される。この指標は、米ドル(2010年の恒常価格およびPPP)および指標で測定されています。

最初のステップ

  1. サイトから、CSV データをダウンロード。
  2. プロジェクト内のデータ格納フォルダに入れます。“./data/”
  3. 読み込みます。

上のサイトからデータ(Full indicator data)をダウンロードして、プロジェクトの data フォルダーに入れました。

df_oecd_productivity <- read_csv("./data/DP_LIVE_21022023111712065.csv")
Rows: 3894 Columns: 8── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (6): LOCATION, INDICATOR, SUBJECT, MEASURE, FREQUENCY, Fla...
dbl (2): TIME, Value
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_oecd_productivity

データの確認

列名を確認し、列ごとに、データを確認

colnames(df_oecd_productivity)
[1] "LOCATION"   "INDICATOR"  "SUBJECT"    "MEASURE"   
[5] "FREQUENCY"  "TIME"       "Value"      "Flag Codes"

unique() のかっこの中に、df_oecd_productivity$LOCATION を入れたものと同じものを出力します。次々とつづけるときに便利なので、このパイプ %>% をわたしはよく使います。unique(df_oecd_productivity$LOCATION) も試してみてください。

df_oecd_productivity$LOCATION %>% unique()
 [1] "AUS"       "AUT"       "BEL"       "CAN"       "CZE"      
 [6] "DNK"       "FIN"       "FRA"       "DEU"       "GRC"      
[11] "HUN"       "ISL"       "IRL"       "ITA"       "JPN"      
[16] "KOR"       "LUX"       "MEX"       "NLD"       "NZL"      
[21] "NOR"       "POL"       "PRT"       "SVK"       "ESP"      
[26] "SWE"       "CHE"       "TUR"       "GBR"       "USA"      
[31] "CHL"       "EST"       "ISR"       "RUS"       "SVN"      
[36] "OECD"      "EU28"      "G-7"       "LVA"       "LTU"      
[41] "EA19"      "ZAF"       "CRI"       "BGR"       "HRV"      
[46] "ROU"       "EU27_2020" "COL"      
df_oecd_productivity$INDICATOR %>% unique()
[1] "GDPHRWKD"
df_oecd_productivity$SUBJECT %>% unique()
[1] "TOT"
df_oecd_productivity$MEASURE %>% unique()
[1] "USD"     "IDX2015"
df_oecd_productivity$FREQUENCY %>% unique()
[1] "A"
df_oecd_productivity$TIME %>% unique()
 [1] 1970 1971 1972 1973 1974 1975 1976 1977 1978 1979 1980 1981
[13] 1982 1983 1984 1985 1986 1987 1988 1989 1990 1991 1992 1993
[25] 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 2005
[37] 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017
[49] 2018 2019 2020 2021
df_oecd_productivity %>% 
  filter(MEASURE == "USD", TIME == 2021) %>% # filtering rows with conditions
  select(LOCATION, Value) %>% # selecting columns
  arrange(desc(Value)) # ordering the rows in the descenting order of the column Value

いくつかの地域を選んで、折線グラフを書いてみる。

3行目がないとどうなりますか。

df_oecd_productivity %>% 
  filter(LOCATION %in% c("JPN", "OECD", "G-7", "EU28")) %>%
  filter(MEASURE == "USD") %>% # same as above up to this line
  ggplot(aes(x = TIME, y = Value, col = LOCATION)) + geom_line() + 
  labs(title="GDP per hour worked", # adding the title and the subtitle
       subtitle="Total, 2015=100, 2021 or latest available")

5.7 練習:教育 Education

成人の教育レベルに関する、次のサイトからデータをとって、調べてみてください。

Adult education level: https://data.oecd.org/eduatt/adult-education-level.htm

ダウンロードしたファイルのファイル名が DP_LIVE_21022023120132654.csv と同じであることを確認してください。

df_oecd_education_level <- read_csv("./data/DP_LIVE_21022023120132654.csv")
Rows: 7330 Columns: 8── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (5): LOCATION, INDICATOR, SUBJECT, MEASURE, FREQUENCY
dbl (2): TIME, Value
lgl (1): Flag Codes
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_oecd_education_level

上の労働時間当たりGDPの例に習って、データを調べてみてください。

colnames(df_oecd_education_level)
[1] "LOCATION"   "INDICATOR"  "SUBJECT"    "MEASURE"   
[5] "FREQUENCY"  "TIME"       "Value"      "Flag Codes"
df_oecd_education_level$SUBJECT %>% unique()
[1] "BUPPSRY"      "TRY"          "UPPSRY"       "TRY_MEN"     
[5] "TRY_WOMEN"    "UPPSRY_MEN"   "UPPSRY_WOMEN"

これらは、何を意味しているのでしょうか。サイトの Perspectives などをみてください。

他の列(変数)は、どうでしょうか。コードチャンクを挿入して、調べてみてください。

労働時間当たりGDPの例の真似をして、グラフを書いてみました。

df_oecd_education_level %>% 
  filter(LOCATION %in% c("JPN", "OECD", "G-7", "EU28")) %>%
  ggplot(aes(TIME, Value, linetype = SUBJECT, col = LOCATION)) + geom_line() + 
  labs(title="Adult education level")

なにか現れましたが、国も、SUBJECT も期待したものは現れていません。なにが問題なのでしょう。

気づいてたことを書き出してみましょう。

5.8 Excel Data の読み込み

readxl パッケージを使います。これは、tidyverse をインストールするときに、同時に、インストールされますから、インストールは必要ありませんが、tidyverse グループの主たるパッケージはないので、ロードはされていないので、使うときに、ロードする必要があります。

library(readxl) # need to load though readxl is a part of the tidyverse package and installed

実は、範囲を選択し、コピーをし、クリップボードから読む方法もありますが、二つの大きな理由から推奨しません。丁寧に、方法を記述しないと、再現性に問題があること、列のデータ・タイプなどが、適切に、読み込めない場合が多く、読み込んでからの作業が複雑になる。とっても、小さな、自分で作成したデータの場合には、有効かもしれません。

df_excel_clipboard <- read_delim(clipboard())

5.8.1 例: 世界の出生率(Fertility) UN Data

ホットなトピックですね。日本の問題、そして、自分ごととしてだけでなく、世界の状況を見る視点も持ちましょう。

UN data から、検索窓の上にある、Datamarts を選択し、下のほうにある、World Fertility Data United Nations Population Division (UNPD) の [+] 記号を開きます。右の [i] からは情報が得られます。三つのデータがあります。

まずは、“Age-specific fertility rates, Total fertility and Mean age at childbearing” データを使うことにします。

  1. サイトから、Excel データをダウンロード。
  2. プロジェクト内のデータ格納フォルダに入れます。“./data/”
  3. 試しに、読み込みます。
  4. Files から、Import Dataset を選択し、設定をして、もう一度、読み込む。
  5. 列名を修正
  6. 日本のデータを確認
  7. 年齢ごとの数を比較しやすいように、データを変形
  8. グラフを書いてみる。
  9. 出生平均年齢の表を降年齢順に見てみる。
  10. 密度分布グラフを書いてみる。
  11. 出生率の表を昇順に見てみる。
  12. 密度分布グラフを書いてみる。

Steps 1-3.

  1. サイトから、Excel データをダウンロード。
  2. プロジェクト内のデータ格納フォルダに入れます。“./data/” {-}
  3. 試しに、読み込みます。サイトから、Excel データをダウンロード。{-}

どんなシートがあるか見てみましょう。読み込みに問題があるときは、データ名からスペースを消し、下のコードも修正して読んでみてください。スペースなどがあると問題が起こる場合があります。

excel_sheets("./data/Age-specific fertility rates, Total fertility and .xls")
[1] "FERTILITY INDICATORS" "GENERAL NOTES"       
[3] "SOURCES"             

シートを指定するときは、sheet = 1 とか、sheet = "CHILDREN_EVER_BORN" とします。 指定がないときは、最初のシート。詳細は、Help で、read_excel として、確認してください。たくさんの、オプションがあります。

df_un_fertility <- read_excel("./data/Age-specific fertility rates, Total fertility and .xls")
New names:
df_un_fertility

構造が複雑そうです。

Step 4. Files から、Import Dataset を選択し、設定をして、もう一度、読み込む。

ファイル名も変更しておいが方がよい場合もあります。そのときは、変更記録を RNotebookに追記しておくと良いでしょう。下の例では、上の4行をスキップ。列が、text(文字) か、numeric(数値)かを選択。読み込まないときには、skip しています。

df_un_fertility <- read_excel("./data/Age-specific fertility rates, Total fertility and .xls", 
    col_types = c("text", "numeric", "text", 
        "numeric", "text", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "numeric", "numeric", 
        "numeric", "skip", "text", "skip", 
        "skip", "skip", "skip", "skip", "skip"), 
    skip = 4)
df_un_fertility <- read_excel("./data/Age-specific fertility rates, Total fertility and .xls", 
    col_types = c("text", "numeric", "text", 
        "numeric", "text", rep("numeric", 9), "skip", "text",rep("skip", 6)), 
    skip = 4)
df_un_fertility

Step 5. 列名を修正

修正したい列名をコピーしておく。

Country, ISO code, Period, Reference, NA, Total fertility

1列目から、6列目と、14列目と、15列目を、書き換えます。

colnames(df_un_fertility)[c(1:6,14:15)] <- c("country", "iso",  "period","year", "range",   "fertility_rate","mean_age","source")
df_un_fertility

Step 6. 日本のデータを確認

df_un_fertility_jp <- df_un_fertility %>% filter(country == "Japan")
df_un_fertility_jp

Step 7. 年齢ごとの数を比較しやすいように、データを変形

すこし、難しいですが、pivot_longer を Help で調べてください。

df_un_fertility_jp %>% pivot_longer(-c(1:6, 14:15), names_to = "age_range", values_to = "value")

Step 8. グラフを書いてみる。

df_un_fertility_jp %>% pivot_longer(-c(1:6, 14:15), names_to = "age_range", values_to = "value") %>%
  ggplot(aes(x=year, col=age_range, linetype = age_range)) + geom_line(aes(y=value)) 

いろいろなことがわかります。

Step 9. 出生平均年齢の表を降年齢順に見てみる。

df_un_fertility %>% 
  filter(year %in% c(2010)) %>% select(country, mean_age) %>% 
  drop_na(mean_age) %>%
  arrange(desc(mean_age))

Step 10. 密度分布グラフを書いてみる。

df_un_fertility %>% filter(year %in% c(1970, 1990, 2010)) %>% 
                                drop_na(mean_age) %>%
  ggplot(aes(mean_age, fill = factor(year))) + geom_density(alpha = 0.5) + 
#  scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
#  coord_cartesian(xlim=c(20,40)) + 
  labs(title="Mean age at childbearing", fill = "year")

df_un_fertility %>% drop_na(mean_age) %>% group_by(year) %>% summarise(n=n()) %>% arrange(desc(n))
df_un_fertility %>% filter(year %in% c(1970, 1985, 1995, 2005, 2010)) %>% 
                                drop_na(mean_age) %>%
  ggplot(aes(mean_age, fill = factor(year))) + geom_density(alpha = 0.3) + 
  labs(title="Mean age at childbearing", fill = "year")

df_un_fertility %>% filter(year %in% c(1970, 1985,1995, 2005,2010)) %>% 
                                drop_na(mean_age) %>%
  ggplot(aes(mean_age, fill = factor(year))) + geom_density(alpha = 0.5) + facet_wrap(~ factor(year)) +
  labs(title="Mean age at childbearing", fill = "year")

11. 出生率の表を昇順に見てみる。

df_un_fertility %>% 
  filter(year %in% c(2010)) %>% select(country, fertility_rate) %>% 
  drop_na(fertility_rate) %>%
  arrange(fertility_rate)

Step 12. 密度分布グラフを書いてみる。

df_un_fertility %>% filter(year %in% c(1970, 1990, 2010)) %>% 
                                drop_na(mean_age) %>%
  ggplot(aes(fertility_rate, fill = factor(year))) + geom_density(alpha = 0.5) + 
  labs(title="Total fertility", fill = "year")

df_un_fertility %>% drop_na(fertility_rate) %>% group_by(year) %>% summarise(n=n()) %>% arrange(desc(n))
df_un_fertility %>% filter(year %in% c(1970, 1985, 1995, 2005, 2010)) %>% 
                                drop_na(mean_age) %>%
  ggplot(aes(fertility_rate, fill = factor(year))) + geom_density(alpha = 0.5) + 
  labs(title="Total fertility", fill = "year")

df_un_fertility %>% filter(year %in% c(1970, 1985, 1995, 2005, 2010)) %>% 
                                drop_na(mean_age) %>%
  ggplot(aes(fertility_rate, fill = factor(year))) + geom_density(alpha = 0.5) + facet_wrap(~ factor(year)) +
  labs(title="Total fertility", fill = "year")

5.8.1.1 参考例1:World Inequality Report 2022

WIR2022: https://ds-sl.github.io/data-analysis/wir2022.nb.html

5.8.1.2 参考例2:学校種類別進学率の推移(日本語データ)

男女共同参画局の資料です。

学校種類別進学率の推移: https://empowerment.tsuda.ac.jp/detail/82584

url_school_jp <- "https://www.gender.go.jp/about_danjo/whitepaper/r02/zentai/html/honpen/csv/zuhyo01-04-01.csv"

エンコーディング(Encoding type)を推測することができます。

guess_encoding(url_school_jp, n_max = 10000, threshold = 0.2)
df_school_jp <- read_csv(url_school_jp, locale = locale(encoding = "Shift_JIS"), skip=2)
Rows: 70 Columns: 10── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (1): 年度
dbl (9): 高等学校等(男子), 高等学校等(女子), 専修学校(専門課程,男子), 専修学校(専門課程,女子), 大...
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_school_jp 
df_edu0 <- df_school_jp 
colnames(df_edu0) <- c("year", "highschool_m", "highschool_f", "vocational_m", "vocational_f", "university_m", "university_f", "juniorcollege_f", "gradschool_m", "gradschool_f")
df_edu00 <- df_edu0 %>% mutate(year = 1950:2019, 
                   highschool = (highschool_m + highschool_f)/2,
                   vocational = (vocational_m + vocational_f)/2,
                   university = (university_m + university_f)/2, 
                   juniorcollege = juniorcollege_f,
                   gradschool = (gradschool_m + gradschool_f)/2) 
df_edu00 %>% filter(year >= 1954) %>% select(-(2:10)) %>% 
  pivot_longer(3:5, names_to = "schools", values_to = "percentage") %>%
  mutate(types = factor(schools, levels = c("vocational", "juniorcollege", "university"))) %>%
  pivot_longer(c(highschool, gradschool), names_to = "highgrad", values_to ="value") %>%
  mutate(high_grad = factor(highgrad, levels = c("highschool", "gradschool"))) %>%
  ggplot() +
  geom_area(aes(x = year, y = percentage, fill = types)) +
  geom_line(aes(x = year, y = value, linetype = high_grad)) + 
  scale_x_continuous(breaks = round(seq(1960, 2020, by =10),1)) + 
  scale_y_continuous(breaks = round(seq(0, 100, by =10),1)) + 
  labs(title = "Tertially Education After Highschool", 
       subtitle = "with Highschool Graduates and Graduate School", 
       fill = "", linetype = "")

5.9 (続)探索的データ解析 (EDA) 

image from r4ds

NY.GDP.PCAP.CD: GDP per capita (current US$)

df_wdi_gdppcap <- WDI(country = "all", indicator = c(gdp_pcap = "NY.GDP.PCAP.CD"))
write_csv(df_wdi_gdppcap, "./data/df_wdi_gdppcap.csv")
df_wdi_gdppcap <- read_csv("./data/df_wdi_gdppcap.csv")
Rows: 16492 Columns: 5── Column specification ──────────────────────────────────────────
Delimiter: ","
chr (3): country, iso2c, iso3c
dbl (2): year, gdp_pcap
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
df_wdi_gdppcap

5.9.1 Data Transformation

5.9.1.1 列を select

df_wdi_gdppcap_small <- df_wdi_gdppcap %>% 
  select(country, year, gdp_pcap)
df_wdi_gdppcap_small

5.9.1.2 行を filter

df_wdi_gdppcap_short <- df_wdi_gdppcap %>% 
  filter(country %in% c("Japan", "Germany", "United States"))
df_wdi_gdppcap_short
df_wdi_gdppcap_small_short <- df_wdi_gdppcap %>% select(country, year, gdp_pcap) %>%
  filter(country %in% c("Japan", "Germany", "United States"))
df_wdi_gdppcap_small_short

次は、よく生じる、誤りの例で、ノコギリの歯(sawtoothed)のようなギザギザ・グラフと呼ばれます。なぜこのようなことが起きているかわかりますか。

df_wdi_gdppcap_small_short %>%
  ggplot(aes(x = year, y = gdp_pcap)) + geom_line()

df_wdi_gdppcap_small_short %>% filter(country %in% c("Japan")) %>%
  ggplot(aes(x = year, y = gdp_pcap)) + geom_line()

df_wdi_gdppcap_small_short %>%
  ggplot(aes(x = year, y = gdp_pcap)) + geom_point()

df_wdi_gdppcap_small_short %>% drop_na(gdp_pcap) %>%
  ggplot(aes(x = year, y = gdp_pcap, col = country)) + geom_line()

df_wdi_gdppcap_small_short %>% drop_na(gdp_pcap) %>%
  ggplot(aes(x = year, y = gdp_pcap, col = country)) + geom_line() +
  geom_point()

df_wdi_gdppcap_small_short %>% drop_na(gdp_pcap) %>%
  ggplot(aes(x = year, y = gdp_pcap)) + 
  geom_point(aes(color = country)) + 
  geom_smooth(method = 'loess', formula = 'y ~ x')

6 参考 - 今後の学習のために

6.1 RNotebook の活用

下のリンクを開き、右上の Code ボタンから、Download Rmd を選択すると、ダウンロードできますから、ダインロードしたものを、プロジェクト・フォールダーに移動またはコピーしてください。ダウンロードできないときは、Ctrl を押しながら、Download Rmd をクリックすると、Save As で保存できると思います。ブラウザーによって仕様が異なりますから、適切な方法を選んでください。

Windows でも、Mac でも提供されている、Google Chrome の場合には、Code ボタンから、ダンロードされるはずです。

6.2 クラウド - Posit Cloud

RStudio Cloudは、誰でもオンラインでデータサイエンスを行い、共有し、教え、学ぶことができる、軽量でクラウドベースのソリューションです。月25時間の制限がありますが、内容を共有して、他のアカウントから利用することも可能です。

クラウドサービス How to Start Posit Cloud

  1. Go to https://posit.cloud/
  2. Sign Up: top right
  3. Email address or Google account
  4. New Project: Project Name

6.3 練習問題 Posit Primers

Posit Primers https://posit.cloud/learn/primers

最初の演習

Moodle(2月22日)にリンクをつけてあります。

7 IT ツールについて

モバイルアプリでも、さまざまに可能ですが、条件付き課金など、アプリによっても、機種によっても、異なるので、ここでは、PC での利用について書きます。

7.2 Google Chrome での自動翻訳

Windows の Edge や、Mac の Safari でも可能です。翻訳エンジンが異なるので、使い勝手もありますが、いくつか試して、自分の好きな、信頼できる、翻訳エンジンを利用するのがよいと思います。

7.2.1 設定

  1. 上のバーの一番右にある、縦にならんだ三点から、一番下の設定を選択
  2. 左の帯から言語を選択
  3. 優先言語を確認:入っていなければ、日本語のつぎに、英語を入れる
  4. Google 翻訳を ON にする
  5. この言語に翻訳するを日本語に
  6. 翻訳するか確認しない言語を日本語に

7.2.2 使い方

  1. 検索窓の翻訳ボタンを利用。または、翻訳とでたときに、日本語を選択。
  2. 英語にもどしたいときは、同じボタンで戻す。

7.3 DeepL の活用

7.3.1 サイトでの翻訳

7.3.2 アプリを使っての翻訳

  • DeepL のサイトのメニューからアプリを選択または
  • アプリ

上からダウンロードしてインストールします。

  • ショートカットキーが便利です。
    1. アプリを起動する
    2. 翻訳したい箇所を選択
    3. Windows は、Ctrl + C + C (コントロールを押しながら C を2回)、Mac は、Command +C + C (初期設定でこの機能が設定されていると思います)
    4. 3 が機能しない時は、左上の、メニューから設定を選択。ショートカットキーの設定を ON

7.4 Chat GPT

  1. Try ChatGPT をクリック
  2. 人間であることを確認
  3. サインアップ
  4. メールアドレスと、パスワードを設定
  5. パソコンからだと、Short Message を受け取れる携帯電話情報を聞かれます’
  • アカウント作成のみ、携帯電話からすると、ステップが一つ減ります
  1. ログインして利用
  • ChatGPT を、Google Chrome などの、インターネットブラウザーの機能拡張として加えることも可能です。
  • 質問に関しては、かなりの確度で理解しているように思われます。質問内容の一部を無視することは少ないように思われます。
  • 質問のしかた、答えの内容を確認していく練習が必要です
  • 基本的には、2021年9月までの情報をもとに、応答します
  • 5秒ほどで、500文字程度の、応答をするモデルになっているため、その枠内で、質問に対してもっとも高い評価値の答えを選択して、応答しているようです。
  • 確認をしたり、なにを根拠としているか、根拠となるサイトなどを確認し、より、確実な情報を絞り込み、さらに、質問をする、Chat だということを認識して利用することが大切です。
  • 何にでも答えるわけではありませんが、不確実な情報も応答するため、確認が必要です。
  • 人間にも、どんな質問にも即座に、なんらかの情報を返す、知識が豊かなひともいますが、内容が、すべて正しいわけではありません。そのように、ある程度辻褄が合っている内容を、すぐ答えられることに、驚かされるということでしょうか。

7.5 Perplexity

  • サイト
  • 検索窓に、128文字までの検索語、質問などを入れると、情報のあるさいとをふくめて、教えてくれます。
  • 検索語や、質問の書き方も練習する必要があります。
LS0tCnRpdGxlOiAiUuOBp+OBr+OBmOOCgeOCi+ODh+ODvOOCv+ODu+OCteOCpOOCqOODs+OCuSIKYXV0aG9yOiAi5rCP5ZCN77yITmFtZe+8iSIKZGF0ZTogIkxhc3QgVXBkYXRlZDogYHIgU3lzLkRhdGUoKWAiCmhlYWRlci1pbmNsdWRlczoKICAtIFx1c2VwYWNrYWdle2N0ZXh9Cm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgICBoaWdobGlnaHQ6IHRhbmdvCiAgICB0aGVtZTogY2VydWxlYW4KICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgcGRmX2RvY3VtZW50OiAKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAotLS0KCuWPs+S4iuOBriBDb2RlIOODnuODvOOCr+OBi+OCieOAgeOCveODvOOCueODleOCoeOCpOODq+OCguODgOOCpuODs+ODreODvOODieOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAggoKKipQb3NpdCAoUlN0dWRpbykgQ2xvdWQg44Gn44Gu5a6f57+SKioKClJOb3RlYm9vayDjg5XjgqHjgqTjg6vjgpLmlrDopo/kvZzmiJDjgZfjgIHjgZPjga7jg5rjg7zjgrjjgpLjgIHlhajpgbjmip7jgZfjgabjgIHjgrPjg5Tjg7zjg7vjg5rjg7zjgrnjg4jjgZfjgb7jgZnjgIIoYHJtYXJrZG93bmAg44Gu44Kk44Oz44K544OI44O844Or44GM5b+F6KaB44Gn44GZKQpTYXZlIEFzIC4uLiDjgb7jgZ/jga/jgIHjg5Xjg63jg4Pjg5Tjg7zjg4fjgqPjgrnjgq/jg57jg7zjgq/jgpLjgYrjgZfjgabjgIFkcy1lZHUg44Gq44Gp44Go44GX44Gm5L+d5a2Y44CCCuiqrOaYjuOCkuiqreOBv+OBquOBjOOCieOAgeOCs+ODvOODieODgeODo+ODs+OCr+OBqOiogOOCj+OCjOOCi+OAgeiJsuOBjOWkieOCj+OBo+OBpuOBhOOCi+OAgeOBruWPs+S4iuOBq+OBguOCi+S4ieinkuWNsOOCkuaKvOOBmeOBqOOAgeWun+ihjOOBleOCjOOBvuOBmeOAggoK44GT44Gu44GC44Go44Gn44CBUk5vdGVib29rIOOBq+OBpOOBhOOBpuOCguOAgeWwkeOBl+iqrOaYjuOBl+OBvuOBmeOAggoKIyDmupblgpnvvJpQb3NpdCBDbG91ZCDjg63jgrDjgqTjg7MKClBvc2l0IENsb3VkIChodHRwczovL3Bvc2l0LmNsb3VkLykg44Gu44Ki44Kr44Km44Oz44OI44KS5L2c5oiQ44GX44Gm44CB44Ot44Kw44Kk44Oz44GX44Gf54q25oWL44GL44KJ5aeL44KB44G+44GZ44CCCgrnhKHoq5YgUlN0dWRpbyDjgacgUiDjgpLliKnnlKjjgafjgY3jgovmlrnjga/jgIHjgbvjgajjgpPjganlkIzjgZjjgafjgZnjgYzjgIFQb3NpdCBDbG91ZCDjgavjga/jgIHjg5XjgqHjgqTjg6vjgoTjgIHjg4fjg7zjgr/jgoLlhaXjgaPjgabjgYTjgb7jgZnjga7jgafjgIHjgZ3jga7jgb7jgb7mtLvnlKjjgZnjgovjgZPjgajjgYzlj6/og73jgafjgZnjgIIKClJTdHVkaW8g44Gn44Gu44CB5YuV5L2c5LiN6Imv44Gu5aC05ZCI44Gu5a++5b+c44Gv55yB55Wl44GV44Gb44Gm44GE44Gf44Gg44GN44G+44GZ44CC44Gn44GN44KM44Gw44CB5LiK44Gu44Oh44OL44Ol44O844GuIEZpbGUg44GL44KJ44CBTmV3IFByb2plY3Qg44KS6YG45oqe44GX44Gm44CBUHJvamVjdCDjgpLkvZzjgaPjgabjgIHjgZ3jgZPjgafkvZzmpa3jgpLjgZXjgozjgovjgZPjgajjgpLjgYrli6fjgoHjgZfjgb7jgZnjgIIKCuWVj+mhjOOBjOOBguOCi+aZguOBr+OAgeS4i+OBruOCteOCpOODiOOCkuWPgueFp+OBl+OBpuOBj+OBoOOBleOBhOOAglBvc2l0IENsb3VkIOOBq+OBpOOBhOOBpuOCguOAgeWkmuWwkeOBruiqrOaYjuOBjOabuOOBhOOBpuOBguOCiuOBvuOBmeOAggoKICBodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai9yb25yc3R1ZGlvLmh0bWwKCuWPs+S4iuOBriBOZXcgUHJvamVjdCDjgpLpgbjmip7jgZfjgabjgIHlp4vjgoHjgovjgZPjgajjgYzmma7pgJrjgafjgZnjgYzjgIHmnKzml6Xjga/jgIEKCuOBk+OBruODquODs+OCr+OBq+OCouOCr+OCu+OCueOBl+OBpuOBhOOBn+OBoOOBjeOAgVNhdmUgYSBQZXJtYW5lbnQgQ29weSDjgpLpgbjmip7jgZfjgabjgY/jgaDjgZXjgovjgajjgIHjgZ3jga7jgarjgYvjgafjgIHoh6rliIbjga7jg5fjg63jgrjjgqfjgq/jg4jjgajjgZfjgabjgIHlrp/ooYzjgZnjgovjgZPjgajjgYzlj6/og73jgavjgarjgorjgb7jgZnjgIIKCiAgaHR0cHM6Ly9wb3NpdC5jbG91ZC9jb250ZW50LzU1Mzk3NjMKCiMg44Gv44GY44KB44GrCiMjIOWfuuacrOOCs+ODnuODs+ODiSAtIGluIENvbnNvbGUKCuS4i+OBruOCs+ODnuODs+ODieOCkuW3puS4i+OBrueqk+aeoChQYW5lKeOBq+WFpeOCjOOBpuOBv+OBpuOBj+OBoOOBleOBhOOAggoKLSAgIGBoZWFkKGNhcnMpYAotICAgYHN0cihjYXJzKWAKLSAgIGBzdW1tYXJ5KGNhcnMpYAotICAgYGRmIDwtIGNhcnNgCiAgICAtICAgYDwtYCDjgaggYF9gIOOBqCBgJT4lYCDjgaggXGAgYmFjayB0aWNrIOOBruOCreODvOODnOODvOODieS4iuOBp+OBruS9jee9ruOBrueiuuiqjQotICAgYGhlYWQoZGYpYAotICAgYHBsb3QoZGYpYAotICAgYFZpZXcoY2FycylgIOOBvuOBn+OBr+OAgeWPs+S4iuOBriBFbnZpcm9ubWVudCDjgYvjgonjgIFgZGZfY2Fyc2Ag44KS44Kv44Oq44OD44KvCi0gICBgP2NhcnNgIOOBvuOBn+OBryBIZWxwIOaknOe0oueqk+OBpyBgY2Fyc2AsIGBoZWFkYCDjgarjgakKCiMjIyDlrp/pmpvjga7lh7rlipsKCmBgYHtyfQpoZWFkKGNhcnMpCmBgYAoKYGBge3J9CnN0cihjYXJzKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KGNhcnMpCmBgYAoKYGBge3J9CmRmIDwtIGNhcnMKYGBgCgpgYGB7cn0KaGVhZChkZikKYGBgCgpgYGB7cn0KcGxvdChkZikKYGBgCgoK44GK44GZ44GZ44KB77yaYFN5cy5zZXRlbnYoTEFORyA9ICJlbiIpYAoK44K344K544OG44Og6KiA6Kqe44KS6Iux6Kqe44Gr6Kit5a6a44GZ44KL44Go44CB5LiN5piO44Gu44Ko44Op44O844Oh44OD44K744O844K444GM44Gn44Gf44Go44GN44Gr44KC44CB5qSc5p+744Gn6Kej5rG644Gn44GN44KL44GT44Go44GM5aSa44GE44CCCgojIyMg5Y+C6ICDCgpb44OH44O844K/44O844K144Kk44Oz44K544KS44Gv44GY44KB44G+44GX44KH44GGXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai8pIOOBruS4rVvjgrPjg7Pjgr3jg7zjg6vjgaflrp/ooYxdKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RzNGFqL3JiYXNpY3MuaHRtbCPjgrPjg7Pjgr3jg7zjg6vjgaflrp/ooYwtLS1ydW4taW4tY29uc29sZSkg44Gr44CB57Ch5Y2Y44Gq6Kqs5piO44GM44GC44KK44G+44GZ44CCCgojIyBQYWNrYWdlIOOBrueiuuiqjeOBqOOCpOODs+OCueODiOODvOODqwoKUuODkeODg+OCseODvOOCuOOBr+OAgVLjga7mi6HlvLXmqZ/og73jgafjgIHjgrPjg7zjg4njgIHjg4fjg7zjgr/jgIHjg4njgq3jg6Xjg6Hjg7Pjg4jjgpLmqJnmupbljJbjgZXjgozjgZ/jgrPjg6zjgq/jgrfjg6fjg7PlvaLlvI/jgaflkKvjgpPjgafjgYrjgorjgIHmqJnmupbnmoTjgarjgoLjga7jga/jgIFSIFN0dWRpbyDjga4gVG9wIEJhciDjga4gVG9vbCBcPiBJbnN0YWxsIFBhY2thZ2VzIOOBi+OCieOCpOODs+OCueODiOODvOODq+OBp+OBjeOBvuOBmeOAggoKLSAgIOasoeOBruS4ieOBpOOCkuOCpOODs+OCueODiOODvOODq+OBl+OBvuOBmTogYHRpZHl2ZXJzZWAsIGBybWFya2Rvd25gLCBgV0RJYAotICBUb29scyDjgYvjgokgSW5zdGFsbCBwYWNrYWdlcyDjgpLpgbjjgbPjgIHkuIDjgaTkuIDjgaTlhaXjgozjgabjgYTjgY/jgajjgIFpbnN0YWxsIOOBp+OBjeOBvuOBmeOAguWwkeOBl+aZgumWk+OBjOOBi+OBi+OCiuOBvuOBmeOAggoKIyMjIOWCmeiAgwoKUiDjga/jgIHlpJrjgY/jga7mlrnjgYzjgIHjg5Hjg4PjgrHjg7zjgrjjgpLplovnmbrjgZfjgabjgIHjgZ3jgozjgZ7jgozjga7liIbph47jgafjgIHkvb/jgYTjgoTjgZnjgY/jgZfjgabjgYTjgaPjgZ/ntbHoqIjop6PmnpDjga7jgZ/jgoHjga7jgrPjg7Pjg5Tjg6Xjg7zjgr/oqIDoqp7jgafjgZnjgILjgZ/jgaDjgIHln7rmnKzjgpLjga7jgZ7jgYTjgabjgIHjgZ3jgozjgZ7jgozjga7lpb3jgb/jgavjgYLjgo/jgZvjgabjgIHplovnmbrjgZXjgozjgZ/pnaLjgoLjgYLjgorjgIHntbHkuIDmgKfjgavjga/jgYvjgZHjgovoqIDoqp7jgafjgZnjgILjgYLjgajjgafoqqzmmI7jgZnjgovjgIHmjqLntKLnmoTjg4fjg7zjgr/liIbmnpDvvIhFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lz77yJ44Gu44Gf44KB44Gr5b+F6KaB44Gq5Z+65pys55qE44Gq44KC44Gu44KS44CB5pW05ZCI5oCn44Gu44GC44KL5b2i44Gn44CB5YaN5qeL56+J44GX44Gf44KC44Gu44GM44CBYHRpZHl2ZXJzZWAg44OR44OD44Kx44O844K444Gn44CB5Lit5b+D44Go44Gq44Gj44Gf44CBSC4gV2lja2hhbSDjga/jgIFSU3R1ZGlv77yI54++5Zyo44GuIFtQb3NpdF0oaHR0cHM6Ly9wb3NpdC5jbynvvIkg44Gr5Yqg44KP44KK44G+44GX44Gf44CC44Gd44Gu44Oh44Oz44OQ44O844Gu44CBWS4gWGll77yI6LCi55uK6L6J77yJIOOBn+OBoeOBjOmWi+eZuuOBl+OBn+OCguOBruOBjOOAgWBybWFya2Rvd25gIOOBq+mWoumAo+OBl+OBn+ODkeODg+OCseODvOOCuOOBp+OBmeOAggoKIyMgUiBNYXJrZG93biDlhaXploAKCiMjIyBSIE5vdGVib29rCgpSIE1hcmtkb3du44Gv44OH44O844K/44K144Kk44Ko44Oz44K544Gu44Gf44KB44Gu44Kq44O844K144Oq44Oz44Kw44OV44Os44O844Og44Ov44O844Kv44CCCgrjgrPjg7zjg4nvvIjjg5fjg63jgrDjg6njg6DvvInjgajjgZ3jga7lrp/ooYzntZDmnpzjgIHjgpLoqJjpjLLjg7vooajnpLrjgZfjgIHpq5jlk4Hos6rjga7jg6zjg53jg7zjg4jjga7kvZzmiJDjgpLlj6/og73jgavjgZfjgb7jgZnjgIIKClIgTm90ZWJvb2sg44Gv44CB54us56uL44GX44Gm44Kk44Oz44K/44Op44Kv44OG44Kj44OW44Gr5a6f6KGM44Gn44GN44KL44OB44Oj44Oz44Kv44KS5oyB44GkUiBNYXJrZG93buODieOCreODpeODoeODs+ODiOOBruS4gOOBpOOBruW9ouW8j+OBp+OAgeWFpeWKm+OBruOBmeOBkOS4i+OBq+WHuuWKm+OBjOihqOekuuOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAggoKMS4gIEZpbGUgXD4gTmV3IEZpbGUgXD4gUiBOb3RlYm9vawoyLiAgU2F2ZSB3aXRoIGEgZmlsZSBuYW1lLCBzYXksIHRlc3Qtbm90ZWJvb2sKMy4gIFByZXZpZXcgYnkgW1ByZXZpZXddIGJ1dHRvbgo0LiAgUnVuIENvZGUgQ2h1bmsgcGxvdChjYXJzKSBhbmQgdGhlbiBQcmV2aWV3IGFnYWluLgoKKiDjg4bjg7Pjg5fjg6zjg7zjg4jjg5XjgqHjgqTjg6vjga7liKnnlKgKCuS4i+OBruODquODs+OCr+OCkumWi+OBjeOAgeWFqOmDqOOCkumBuOaKnuOBl+OAgVIgTm90ZWJvb2sg44OV44Kh44Kk44Or44KC5YWo6YG45oqe44GX44Gm6LK844KK5LuY44GR44KM44Gw44CB5pel5pys54mI44KC6KaL44KL44GT44Go44GM44Gn44GN44G+44GZ44CCCgoqIOaXpeacrOiqnuODjuODvOODiOODluODg+OCr++8mmh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvUk5vdGVib29rLUouaHRtbAoqIOOBhOOCjeOBhOOCjeOBquW9ouW8j+OBruWHuuWKm++8mmh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvUm1hcmtkb3duLUouaHRtbAoKIyMjIGBpbnRybzJyai5SbWRgCgrlj7PkuIvjga4gRmlsZSDjgr/jg5bjgYvjgonjgIFgaW50cm8ycmouUm1kYCDjgpLplovjgY3jgb7jgZnjgIIKUHJldmlldyDjga7lj7Pjga7jgq7jgqLjg57jg7zjgq/jga4gUHJldmlldyBpbiBWaWV3ZXIgUGFuZSDjgpLpgbjmip7jgZfjgabjgYvjgonjgIFQcmV2aWV3IOODkOOCv+ODs+OCkuaKvOOBmeOBqOOAgeWGheWuueOCkueiuuiqjeOBmeOCi+OBk+OBqOOBjOOBp+OBjeOBvuOBmeOAggoK44GC44Go44GL44KJ5L2/44GG44Gu44Gn44CB44Ot44O844OJ44GX44Gm44GK44GN44G+44GZ44CC5pyA5Yid44Gr5qyh44Gu44KI44GG44Gq44Kz44O844OJ44KS5a6f6KGM44GX44G+44GZ44CC5Y+z44Gu5LiJ6KeS44KS5oq844GX44G+44GZ44CCCgpQb3NpdCBDbG91ZCDjga7jgrXjgqTjg4jjgavjga/jgIFgZGF0YWAg44OH44Kj44Os44Kv44OI44Oq77yI44OV44Kp44Or44OA77yJ44GM5L2c5oiQ44GV44KM44Gm44GE44G+44GZ44GM44CBCgojIyMg5Y+C6ICDCgpb44OH44O844K/44O844K144Kk44Oz44K544KS44Gv44GY44KB44G+44GX44KH44GGXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai8pIOOBruS4reOBrltSIE1hcmtkb3duXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai9ybWFya2Rvd24uaHRtbCNybWFya2Rvd24pIOOBq+OAgeKAnFJlcHJvZHVjaWJsZSBhbmQgTGl0ZXJhdGUgUHJvZ3JhbW1pbmfigJ0g77yIUmVwcm9kdWNpYmxlIO+8iOWGjeePvuWPr+iDve+8ieOBi+OBpOOAgUxpdGVyYXRl44CA44Gq77yI55CG6Kej44Gn44GN44KL44KI44GG44Gr6KiY6L+w44GX44Gf77yJUHJvZ3Jhbe+8iOODl+ODreOCsOODqeODoOODu+OCs+ODvOODie+8ieOCkuWFseacieOBmeOCi+OBk+OBqO+8ieOCkuOBn+OBhOOBm+OBpOOBq+OBmeOCiyBSTWFya2Rvd24g44Gu6YeN6KaB5oCn44Gr44Gk44GE44Gm57Ch5Y2Y44Gr5pu444GE44Gm44GC44KK44G+44GZ44CCCgojIFIgTm90ZWJvb2sg44Gn44Gu5a6f57+SCiMjIOa6luWCmSBTZXR1cAoK44OH44O844K/44OH44Kj44Os44Kv44OI44Oq44KS5L2c5oiQ44GX44Gm44GK44GN44G+44GZ44CC5LuK5b6M44CB44OH44O844K/44Gv44CB44GT44Gu44OH44Kj44Os44Kv44OI44Oq44Gr5L+d5a2Y44GX44G+44GZ44CC44GZ44Gn44Gr44CB5a2Y5Zyo44GZ44KL5aC05ZCI44Gv44CB44Gd44Gu5peo44Oh44OD44K744O844K444GM5Ye644G+44GZ44GM44CB5Lit6Lqr44GM5raI5Y6744GV44KM44KL44GT44Go44Gv44GC44KK44G+44Gb44KT44CCCgpgYGB7ciBldmFsPUZBTFNFfQpkaXIuY3JlYXRlKCIuL2RhdGEiKQpgYGAKCuODkeODg+OCseODvOOCuOOBr+OCpOODs+OCueODiOODvOODq+OBl+OBpuOBguOBo+OBpuOCguOAgeWIqeeUqOOBmeOCi+OBqOOBjeOBq+OBr+OAgeasoeOBruOCiOOBhuOBq+S9v+OBiOOCi+eKtuaFi+OBq++8iOODreODvOODie+8ieOBl+OBvuOBmeOAggoK5LiA44Gk55uu44Gv44CBYHRpZHl2ZXJzZWAg44Gn44GZ44GM44CB44KC44GG5LiA44Gk44Gv44CB44GC44Go44GL44KJ5rS755So44GZ44KL44CB5LiW55WM6ZaL55m65oyH5qiZ44Gr6Zai44GZ44KL44OH44O844K/44KS5Yip55So44GZ44KL44Gf44KB44Gu44OR44OD44Kx44O844K444Gn44GZ44CCCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoV0RJKQpgYGAKCiMjIOS4lueVjOmWi+eZuuaMh+aomSAoV0RJKQoK5L6L44GL44KJ5aeL44KB44G+44GZ44CCCgrmrKHjga7jgrPjg7zjg4njga/jgIHlm73liKXjgavjgIFHRFAg44Gu5aSn44GN44GE5pa544GL44KJ5Lim44G544Gf44KC44Gu44Gn44GZ44CCCgpgYGB7ciBjYWNoZT1UUlVFfQpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKGdkcCA9ICJOWS5HRFAuTUtUUC5DRCIpLAogICAgZXh0cmE9VFJVRSkgJT4lIGRyb3BfbmEoZ2RwKSAlPiUKICBmaWx0ZXIoeWVhcj09bWF4KHllYXIpLCBpbmNvbWUgIT0iQWdncmVnYXRlcyIpICU+JSAKICBkcm9wX25hKHJlZ2lvbikgJT4lIGFycmFuZ2UoZGVzYyhnZHApKQpgYGAKCjPlhYbjg4njg6vjgpLotoXjgYjjgabjgYTjgos244Gk44Gu5Zu944Gr44Gk44GE44Gm44Gu6YGO5Y6744Gu5o6o56e744KS44Kw44Op44OV44Gr44GX44Gf44KC44Gu44Gn44GZ44CCCgpgYGB7ciBjYWNoZT1UUlVFfQpXREkoY291bnRyeSA9IGMoIkNOIiwiR0IiLCJKUCIsIklOIiwiVVMiLCJERSIpLCBpbmRpY2F0b3IgPSBjKGdkcCA9ICJOWS5HRFAuTUtUUC5DRCIpLCBleHRyYT1UUlVFKSAlPiUgZHJvcF9uYShnZHApICU+JSAKICBnZ3Bsb3QoYWVzKHllYXIsIGdkcCwgY29sID0gY291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiV0RJIE5ZLkdEUC5NS1RQLkNEOiBnZHAiKQpgYGAKCmBgYHtyIGNhY2hlPVRSVUV9CldESShjb3VudHJ5ID0gYygiQ04iLCJJTiIsIkpQIiwiVVMiKSwgCiAgICBpbmRpY2F0b3IgPSBjKGdkcF9ncm93dGhfcmF0ZSA9ICJOWS5HRFAuTUtUUC5LRC5aRyIpLCBleHRyYT1UUlVFKSAlPiUKICBkcm9wX25hKGdkcF9ncm93dGhfcmF0ZSkgJT4lIAogIGdncGxvdChhZXMoeWVhciwgZ2RwX2dyb3d0aF9yYXRlLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgTlkuR0RQLk1LVFAuS0QuWkc6IGdkcCBncm93dGggcmF0ZSIpKQpgYGAKCiMjIyDms6jmhI8KCuS4gOOBpOS4gOOBpOOBruOCs+ODvOODieOCkuS4geWvp+OBq+iqrOaYjuOBl+OAgeeQhuino+OBmeOCi+OBk+OBqOOBr+OAgeW+jOWbnuOBl+OBq+OBl+OAgeWwkeOBl+OBmuOBpOWtpuOCk+OBp+OBhOOBj+OBk+OBqOOBq+OBl+OAgeOBk+OBk+OBp+OBr+OAgeOBneOCjOOBnuOCjOOBruWVj+mhjOaEj+itmOOBruOCguOBqOOBp+OAgeOBqeOBruOCiOOBhuOBquOBk+OBqOOBjOOBp+OBjeOCi+OBi+OCkuOAgeeQhuino+OBmeOCi+OBn+OCgeOAgea0u+eUqOOBmeOCi+OBk+OBqOOCkuWEquWFiOOBl+OBn+OBhOOBqOaAneOBhOOBvuOBmeOAggoKIyMjIOS4iuOBp+S9v+OBo+OBn+aMh+aomSAoV0RJKSDjgrPjg7zjg4kKCi0gICBOWS5HRFAuTUtUUC5DRDogR0RQIChjdXJyZW50IFVTXCQpCi0gICBOWS5HRFAuTUtUUC5LRC5aRzogR0RQIGdyb3d0aCAoYW5udWFsICUpCgojIyMg5LiW55WM6ZaL55m65oyH5qiZIChXREkpIOOCkuaOouOBl+OBpuOBv+OBvuOBl+OCh+OBhgoKPiBXREnjga/jgIHkuJbnlYzjga7plovnmbrnirbms4HjgajjgIHosqflm7Djgajjga7miKbjgYTjgavplqLjgZnjgovjgIHpganliIfjgafkuIros6rjgIHjgYvjgaTjgIHlm73pmpvnmoTjgavmr5TovIPlj6/og73jgarmmYLns7vliJfjga7ntbHoqIjjg4fjg7zjgr/jgpLnt6jnuoLjgZfjgZ/jgoLjga7jgafjgZnjgILjgZPjga7jg4fjg7zjgr/jg5njg7zjgrnjga/jgIEyMTfjga7ntYzmuIjjgag0MOS7peS4iuOBruWbveOCsOODq+ODvOODl+OBq+OBpOOBhOOBpjEsNDAw44Gu5pmC57O75YiX5oyH5qiZ44KS5ZCr44G/44CB5oyH5qiZ44Gu44OH44O844K/44Gu5aSa44GP44GvNTDlubTku6XkuIrliY3jgavpgaHjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKCuS4i+OBru+8kueuh+aJgOOBi+OCieaOouOBmeOBk+OBqOOBjOOBp+OBjeOBvuOBmeOAggoKLSAgIFvkuJbnlYzpioDooYzvvIhXb3JsZCBCYW5r77yJ44Kq44O844OX44Oz44OH44O844K/XShodHRwczovL2RhdGEud29ybGRiYW5rLm9yZykKICAgIC0gICBDb3VudHJ5IC8gSW5kaWNhdG9yIFw+IEZlYXR1cmVkICYgQWxsIFw+IERldGFpbHMKICAgIAotICAgW+S4lueVjOmWi+eZuuaMh+aomSAoV0RJKV0oaHR0cHM6Ly9kYXRhdG9waWNzLndvcmxkYmFuay5vcmcvd29ybGQtZGV2ZWxvcG1lbnQtaW5kaWNhdG9ycy8pIDoKICAgIC0gICDjg4bjg7zjg546IOiyp+WbsOOBqOagvOW3ruOAgeS6uumWk+OAgeeSsOWig+OAgee1jOa4iOOAgeWbveWutuOBqOW4guWgtOOAgeOCsOODreODvOODkOODq+ODquODs+OCr+mbhu+8iFBvdmVydHkgYW5kIEluZXF1YWxpdHksIFBlb3BsZSwgRW52aXJvbm1lbnQsIEVjb25vbXksIFN0YXRlcyBhbmQgTWFya2V0cywgR2xvYmFsIExpbmtz77yJCgojIyMg5Y+C6ICDCgpb44OH44O844K/44O844K144Kk44Oz44K544KS44Gv44GY44KB44G+44GX44KH44GGXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai8pIOOBruS4reOBriBb44OR44OW44Oq44OD44Kv44OH44O844K/XShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai9wdWJsaWNkYXRhLmh0bWwjcHVibGljZGF0YSnjgavjgIHkvovjgYzjgYLjgorjgb7jgZnjgILjgb7jgZ/jgIFb5LiW55WM6ZaL55m65oyH5qiZXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai93b3JsZGJhbmsuaHRtbCN3b3JsZC1kZXZlbG9wbWVudC1pbmRpY2F0b3Itd2RpKSDjga7poIXjgavjgIHkuIrjgafntLnku4vjgZfjgZ/jgrXjgqTjg4jjgYvjgonjgIHjganjga7jgojjgYbjgavjgIFXREkg44Kz44O844OJ44KS6KaL44Gk44GR44KL44GL44Gu6Kqs5piO44GM44GC44KK44G+44GZ44CCCgojIyMg57e057+SIDEuIC0g6Kq/44G544Gm44G/44Gf44GEIFdESQoK5LiW55WM6ZaL55m65oyH5qiZ44Gu44Kz44O844OJ44KS44GE44GP44Gk44GL44CB44Oq44K544OI44GX44Gm44G/44G+44GX44KH44GG44CCCgojIFdESSDjg5Hjg4PjgrHjg7zjgrgKCmBXRElgIOODkeODg+OCseODvOOCuOOBp+OAgeODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOBl+OBn+OCiuOAgeaOouOBl+OBn+OCiuOAgeips+e0sOaDheWgseOCkuW+l+OBn+OCiuOBp+OBjeOBvuOBmeOAggoK5qSc57Si44KE44CB44OA44Km44Oz44Ot44O844OJ5pa55rOV44GM55CG6Kej44Gn44GN44KL44KI44GG44Gr44CB5L6L56S644GX44Gm44GC44KK44G+44GZ44GM44CB44GW44Gj44Go56K66KqN44GX44Gm44CBNC4zLjMg44Gu44OG44Oz44OX44Os44O844OI44KS5Yip55So44GZ44KL44Go44CB44Kw44Op44OV44KS5o+P44GP44GT44Go44KC44Gn44GN44G+44GZ44CCCgojIyDmjIfmqJkgV0RJIOaknOe0ogoKIyMjIOaknOe0ouS+iyAx77yIV0RJ5ZCN77yJCgpgYGB7ciBjYWNoZT1UUlVFfQpXRElzZWFyY2goc3RyaW5nID0gImdkcCIsIGZpZWxkID0gIm5hbWUiLCBzaG9ydCA9IFRSVUUsIGNhY2hlID0gTlVMTCkKYGBgCgpgYGB7cn0KV0RJc2VhcmNoKHN0cmluZyA9ICJtaWxpdGFyeSBleHBlbmRpdHVyZSIsIGZpZWxkID0gIm5hbWUiLCBzaG9ydCA9IFRSVUUsIGNhY2hlID0gTlVMTCkKYGBgCgojIyMg5qSc57Si5L6LIDLvvIhXREnvvIkKCmBgYHtyIGNhY2hlPVRSVUV9CldESXNlYXJjaChzdHJpbmcgPSAiTlkuR0RQLk1LVFAuQ0QiLCBmaWVsZCA9ICJpbmRpY2F0b3IiLCBzaG9ydCA9IFRSVUUsIGNhY2hlID0gTlVMTCkKYGBgCiAgCiMjIyDnt7Tnv5IgMi4gLSDmpJzntKLvvIhzaG9ydO+8iQoK5ZCN5YmN44Gn5qSc57Si77yIIiIg44Gu6ZaT44Gr44CB77yI44Gq44KL44G544GP57Ch5Y2Y44Gq77yJ5qSc57Si5paH5a2X5YiX44KS5YWl44KM44Gm44GP44Gg44GV44GE44CC77yJCgpgYGB7ciBjYWNoZT1UUlVFfQpXRElzZWFyY2goc3RyaW5nID0gIiIsIGZpZWxkID0gIm5hbWUiLCBzaG9ydCA9IFRSVUUsIGNhY2hlID0gTlVMTCkKYGBgCgpJbmRpY2F0b3Ig44Gn5qSc57Si77yIIiIg44Gu6ZaT44Gr44CB6Kq/44G544Gf44GEIGluZGljYXRvciDjgpLlhaXjgozjgabjgY/jgaDjgZXjgYTjgILvvIkKCmBgYHtyIGNhY2hlPVRSVUV9CldESXNlYXJjaChzdHJpbmcgPSAiIiwgZmllbGQgPSAiaW5kaWNhdG9yIiwgc2hvcnQgPSBUUlVFLCBjYWNoZSA9IE5VTEwpCmBgYAoKIyMjIOips+OBl+OBhOaDheWgseOCkuW+l+OCi+OBq+OBrwoKYHNob3J0ID0gRkFMU0VgIOOBqOOBl+OBvuOBmeOAguaZgumWk+OBjOOBi+OBi+OCi+OBruOBp+OAgeaknOe0ouOBr+OAgUluZGljYXRvciDjgajjgIHlkI3liY3jgarjganjga7mg4XloLHjgpLjgoLjgaPjgZ/jg5XjgqHjgqTjg6vjgpLmiYvlhYPjgavmjIHjgaPjgabjgYrjgY/jgZPjgajjgavjgZfjgb7jgZnjgIIKCmBgYHtyIGNhY2hlPVRSVUUsIGV2YWw9RkFMU0V9CndkaV9jYWNoZSA8LSBXREljYWNoZSgpCmBgYApgYGB7ciBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQp3cml0ZV9yZHMod2RpX2NhY2hlLCAiLi9kYXRhL3dkaV9jYWNoZS5SRGF0YSIpCmBgYApgYGB7ciBlY2hvPUZBTFNFfQp3ZGlfY2FjaGUgPC0gcmVhZF9yZHMoIi4vZGF0YS93ZGlfY2FjaGUuUkRhdGEiKQpgYGAKCgrlj7PkuIrjga7nqpPmnqDvvIhwYW5l77yJ44GL44KJ44CBYHdkaV9jYWNoZWAg44KS5o6i44GX44Gm44CB5Lit6Lqr44KS6KaL44Gm44G/44G+44GX44KH44GG44CCc2VyaWVzIOOBqOOAgWNvdW50cnkg44Gu5LqM44Gk44Gu44OH44O844K/44O744OV44Os44O844Og44GL44KJ44Gq44Gj44Gm44GE44KL44Oq44K544OI44Gn44GZ44CC5LiJ6KeS5Y2w44KE44CB5Y+z44GL44KJ5LqM55Wq55uu44Gu5be754mp44Gu44KI44GG44Gq44Ki44Kk44Kz44Oz44KS44Kv44Oq44OD44Kv44GZ44KL44Go5Lit6Lqr44GM6KaL44GI44G+44GZ44CCCiAgCiMjIyDmpJzntKLkvosgM++8iFdESeWQje+8iQoKYGBge3J9CldESXNlYXJjaChzdHJpbmcgPSAiQ1BJIFByaWNlIiwgZmllbGQgPSAibmFtZSIsIHNob3J0ID0gRkFMU0UsIGNhY2hlID0gd2RpX2NhY2hlKQpgYGAKCi0gQ1BUT1ROU1hOOiBDUEkgUHJpY2UsIG5vbWluYWwKICAtIFRoZSBjb25zdW1lciBwcmljZSBpbmRleCByZWZsZWN0cyB0aGUgY2hhbmdlIGluIHByaWNlcyBmb3IgdGhlIGF2ZXJhZ2UgY29uc3VtZXIgb2YgYSBjb25zdGFudCBiYXNrZXQgb2YgY29uc3VtZXIgZ29vZHMuIERhdGEgaXMgbm90IHNlYXNvbmFsbHkgYWRqdXN0ZWQuCgojIyMg5qSc57Si5L6LIDTvvIhXREnvvIkKCmBgYHtyfQpXRElzZWFyY2goc3RyaW5nID0gIk5ZLkdEUC5NS1RQLktELlpHIiwgZmllbGQgPSAiaW5kaWNhdG9yIiwgc2hvcnQgPSBGQUxTRSwgY2FjaGUgPSB3ZGlfY2FjaGUpCmBgYAoKICAKIyMjIOe3tOe/kiAyIC0g5qSc57Si77yIbG9uZyB3LyBjYWNoZe+8iQoKYHN0cmluZ2Ag44Go44CBYGZpZWxkYCDjgpLjgIHjgbXjgZ/jgaTjgajjgoLlhaXjgozjgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyIGV2YWw9RkFMU0V9CldESXNlYXJjaChzdHJpbmcgPSAiIiwgZmllbGQgPSAiIiwgc2hvcnQgPSBGQUxTRSwgY2FjaGUgPSB3ZGlfY2FjaGUpCmBgYAoKIyMg5oyH5qiZIFdESSDjg4fjg7zjgr/jga7jg4Djgqbjg7Pjg63jg7zjg4kKCkluZGljYXRvciDjgYzmsbrjgb7jgaPjgZ/jgonjgIHjg4Djgqbjg7Pjg63jg7zjg4njgZfjgb7jgZnjgIIKCuWPs+S4i+OBruOAgUhlbHAgVGFiIOOBqyBXREkg44Go5YWl44KM44KL44Go44CB5L2/44GE5pa544KC44KP44GL44KK44G+44GZ44CCCgpgYGB7ciBldmFsPUZBTFNFfQo/V0RJCmBgYAogIAojIyMg44OA44Km44Oz44Ot44O844OJ5L6LIDEtMQoKYGBge3IgY2FjaGU9VFJVRX0KZGZfZ2RwMSA8LSBXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSAiTlkuR0RQLk1LVFAuQ0QiKQpkZl9nZHAxCmBgYAoKICAKIyMjIOODgOOCpuODs+ODreODvOODieS+iyAxLTIKCmBgYHtyIGNhY2hlPVRSVUV9CmRmX2dkcDIgPC0gV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhnZHAgPSAiTlkuR0RQLk1LVFAuQ0QiKSkKZGZfZ2RwMgpgYGAKCiAgCiMjIyDjg4Djgqbjg7Pjg63jg7zjg4nkvosgMS0zCgpgYGB7ciBjYWNoZT1UUlVFfQpkZl9nZHAzIDwtIFdESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoZ2RwID0gIk5ZLkdEUC5NS1RQLkNEIiksIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkKZGZfZ2RwMwpgYGAKCiAgCiMjIyDjg4Djgqbjg7Pjg63jg7zjg4nkvosgMS00CgpgYGB7ciBjYWNoZT1UUlVFfQpkZl9nZHA0IDwtIFdESShjb3VudHJ5ID0gYygiQ04iLCJHQiIsIkpQIiwiSU4iLCJVUyIsIkRFIiksIGluZGljYXRvciA9IGMoZ2RwID0gIk5ZLkdEUC5NS1RQLkNEIiksIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkKZGZfZ2RwNApgYGAKCiMjIyMg44OA44Km44Oz44Ot44O844OJ5L6LIDItMQoKKiBOWS5HRFAuREVGTC5LRC5aRzogSW5mbGF0aW9uLCBHRFAgZGVmbGF0b3IgKGFubnVhbCAlKQoqIENQVE9UTlNYTjogQ1BJIFByaWNlLCBub21pbmFsCgpgYGB7ciBjYWNoZT1UUlVFfQpkZl9nZHAyMSA8LSBXREkoY291bnRyeSA9ICJhbGwiLCAKICAgICAgICAgICAgICAgIGluZGljYXRvciA9IGMoZ2RwX2RlZmxhdG9yID0gIk5ZLkdEUC5ERUZMLktELlpHIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwaV9wcmljZSA9ICJDUFRPVE5TWE4iKSwgCiAgICAgICAgICAgICAgICBleHRyYT1UUlVFLCBjYWNoZT13ZGlfY2FjaGUpCmRmX2dkcDIxCmBgYAoKYGBge3J9CnN0cihkZl9nZHAyMSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShkZl9nZHAyMSkKYGBgCgrlj7PkuIrjga7nqpPmnqDjga7jgIFFbnZpcm9ubWVudCDjgoLopovjgabjgb/jgb7jgZfjgofjgYbjgIIKCgojIyDlj6/oppbljJYgVmlzdWFsaXphdGlvbgoK44Kw44Op44OV77yIQ2hhcnTvvInjgpLmj4/jgYTjgaboppbopprljJbjgZfjgojjgYYKCiMjIyDjgrDjg6njg5UgMQoKYGBge3J9CmRmX2dkcDQgJT4lIGdncGxvdChhZXMoeWVhciwgZ2RwLCBjb2w9Y291bnRyeSkpICsgZ2VvbV9saW5lKCkKYGBgCgojIyMg44Kw44Op44OVIDIKCmBgYHtyfQpkZl9nZHA0ICU+JSBkcm9wX25hKGdkcCkgJT4lIAogIGdncGxvdChhZXMoeWVhciwgZ2RwLCBjb2w9Y291bnRyeSkpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiV0RJIC0gTlkuR0RQLk1LVFAuQ0Q6ICIsICJnZHAiKSkKYGBgCgojIyMg44OG44Oz44OX44Os44O844OIIFRlbXBsYXRlcwoKIyMjIyDkuIDjgaTjga7lm73jgavjgaTjgYTjgabjga7jgIHkuIDjgaTjga7mjIfmqJnvvIhXREnvvInjgajjgIHjgZ3jga7nlaXnp7DjgYvjgonjgIHmipjnt5rjgrDjg6njg5XjgpLkvZzmiJAKCkxpbmUgUGxvdCB3aXRoIG9uZSBpbmRpY2F0b3Igd2l0aCBhYmJyZXZpYXRpb24gYW5kIG9uZSBjb3VudHJ5CgpgYGB7ciBjYWNoZT1UUlVFfQpjaG9zZW5faW5kaWNhdG9yIDwtICJTTC5VRU0uVE9UTC5ORS5aUyIKc2hvcnRfbmFtZSA8LSAidW5lbXBsb3ltZW50IgpjaG9zZW5fY291bnRyeSA8LSAiVW5pdGVkIFN0YXRlcyIKV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhzaG9ydF9uYW1lID0gY2hvc2VuX2luZGljYXRvciksIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkgJT4lCiAgZmlsdGVyKGNvdW50cnkgPT0gY2hvc2VuX2NvdW50cnkpICU+JSAKICBnZ3Bsb3QoYWVzKHllYXIsIHNob3J0X25hbWUpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yLCAiOiAiLCBzaG9ydF9uYW1lLCAiIC0gIiwgY2hvc2VuX2NvdW50cnkpLAogICAgICAgeSA9IHNob3J0X25hbWUpCmBgYAoKIyMjIyDkuIDjgaTjga7lm73jgavjgaTjgYTjgabjga7jgIHkuIDjgaTjga7mjIfmqJnvvIhXREnvvInjgYvjgonjgIHmipjnt5rjgrDjg6njg5XjgpLkvZzmiJAKCkxpbmUgUGxvdCB3aXRoIG9uZSBpbmRpY2F0b3IgYW5kIG9uZSBjb3VudHJ5CgpgYGB7ciBjYWNoZT1UUlVFfQpjaG9zZW5faW5kaWNhdG9yIDwtICJTTC5VRU0uVE9UTC5ORS5aUyIKY2hvc2VuX2NvdW50cnkgPC0gIlVuaXRlZCBTdGF0ZXMiCldESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoY2hvc2VuX2luZGljYXRvciA9IGNob3Nlbl9pbmRpY2F0b3IpLCAKICAgIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkgJT4lCiAgZmlsdGVyKGNvdW50cnkgPT0gY2hvc2VuX2NvdW50cnkpICU+JSAKICBnZ3Bsb3QoYWVzKHllYXIsIGNob3Nlbl9pbmRpY2F0b3IpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yLCAiIC0gIiwgY2hvc2VuX2NvdW50cnkpLCAKICAgICAgIHkgPSBjaG9zZW5faW5kaWNhdG9yKQpgYGAKCiMjIyMg44GE44GP44Gk44GL44Gu5Zu944Gr44Gk44GE44Gm44Gu44CB5LiA44Gk44Gu5oyH5qiZ77yIV0RJ77yJ44Go44CB44Gd44Gu55Wl56ew44GL44KJ44CB5oqY57ea44Kw44Op44OV44KS5L2c5oiQCgpMaW5lIFBsb3Qgd2l0aCBvbmUgaW5kaWNhdG9yIHdpdGggYWJicmV2aWF0aW9uIGFuZCBzZXZlcmFsIGNvdW50cmllcwoKYGBge3IgY2FjaGU9VFJVRX0KY2hvc2VuX2luZGljYXRvciA8LSAiU0wuVUVNLlRPVEwuTkUuWlMiCnNob3J0X25hbWUgPC0gInVuZW1wbG95bWVudCIKY2hvc2VuX2NvdW50cmllcyA8LSBjKCJVbml0ZWQgU3RhdGVzIiwiVW5pdGVkIEtpbmdkb20iLCAiSmFwYW4iKQpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKHNob3J0X25hbWUgPSBjaG9zZW5faW5kaWNhdG9yKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUgZHJvcF9uYShzaG9ydF9uYW1lKSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjaG9zZW5fY291bnRyaWVzKSAlPiUgCiAgZ2dwbG90KGFlcyh5ZWFyLCBzaG9ydF9uYW1lLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgIiwgY2hvc2VuX2luZGljYXRvciwgIjogIiwgc2hvcnRfbmFtZSksIHkgPSBzaG9ydF9uYW1lKQpgYGAKCgojIyMjIOS4gOOBpOOBruWbveOBq+OBpOOBhOOBpuOBruOAgeS6jOOBpOOBruaMh+aome+8iFdESe+8ieOBqOOAgeOBneOBrueVpeensOOBi+OCieOAgeaKmOe3muOCsOODqeODleOCkuS9nOaIkAoKTGluZSBQbG90IHdpdGggdHdvIGluZGljYXRvcnMgd2l0aCBhYmJyZXZpYXRpb24gYW5kIG9uZSBjb3VudHJ5CgpgYGB7ciBjYWNoZT1UUlVFfQpjaG9zZW5faW5kaWNhdG9yXzEgPC0gIk5ZLkdEUC5ERUZMLktELlpHIgpzaG9ydF9uYW1lXzEgPC0gImdkcF9kZWZsYXRvciIKY2hvc2VuX2luZGljYXRvcl8yIDwtICJDUFRPVFNBWE5aR1kiCnNob3J0X25hbWVfMiA8LSAiY3BpX3ByaWNlIgpjaG9zZW5fY291bnRyeSA8LSAiVW5pdGVkIFN0YXRlcyIKV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhzaG9ydF9uYW1lXzEgPSBjaG9zZW5faW5kaWNhdG9yXzEsIHNob3J0X25hbWVfMiA9IGNob3Nlbl9pbmRpY2F0b3JfMiksIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkgJT4lIAogIGZpbHRlcihjb3VudHJ5ID09IGNob3Nlbl9jb3VudHJ5KSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCBuYW1lc190byA9ICJjbGFzcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSBkcm9wX25hKHZhbHVlKSAlPiUKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBjb2wgPSBjbGFzcykpICsgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSBwYXN0ZSgiV0RJICIsIGNob3Nlbl9pbmRpY2F0b3JfMSwgIjogIiwgc2hvcnRfbmFtZV8xLCAiXG4iLCBjaG9zZW5faW5kaWNhdG9yXzIsICI6ICIsIHNob3J0X25hbWVfMiwgIiAtICIsIGNob3Nlbl9jb3VudHJ5KSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChsYWJlbHMgPSBjKHNob3J0X25hbWVfMSwgc2hvcnRfbmFtZV8yKSwgdmFsdWVzID0gc2NhbGVzOjpodWVfcGFsKCkoMikpCmBgYAoKYGBge3IgY2FjaGU9VFJVRX0KY2hvc2VuX2luZGljYXRvcl8xIDwtICJTTC5UTEYuQ0FDVC5NQS5ORS5aUyIKc2hvcnRfbmFtZV8xIDwtICJtYWxlIgpjaG9zZW5faW5kaWNhdG9yXzIgPC0gIlNMLlRMRi5DQUNULkZFLk5FLlpTIgpzaG9ydF9uYW1lXzIgPC0gImZlbWFsZSIKY2hvc2VuX2NvdW50cnkgPC0gIlVuaXRlZCBTdGF0ZXMiCldESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMoc2hvcnRfbmFtZV8xID0gY2hvc2VuX2luZGljYXRvcl8xLCBzaG9ydF9uYW1lXzIgPSBjaG9zZW5faW5kaWNhdG9yXzIpLCBleHRyYT1UUlVFLCBjYWNoZT13ZGlfY2FjaGUpICU+JSAKICBmaWx0ZXIoY291bnRyeSA9PSBjaG9zZW5fY291bnRyeSkgJT4lIAogIHBpdm90X2xvbmdlcihjKHNob3J0X25hbWVfMSwgc2hvcnRfbmFtZV8yKSwgbmFtZXNfdG8gPSAiY2xhc3MiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUgZHJvcF9uYSh2YWx1ZSkgJT4lCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sID0gY2xhc3MpKSArIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gcGFzdGUoIldESSAiLCBjaG9zZW5faW5kaWNhdG9yXzEsICI6ICIsIHNob3J0X25hbWVfMSwgIlxuIiwgY2hvc2VuX2luZGljYXRvcl8yLCAiOiAiLCBzaG9ydF9uYW1lXzIsICIgLSAiLCBjaG9zZW5fY291bnRyeSkpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobGFiZWxzID0gYyhzaG9ydF9uYW1lXzEsIHNob3J0X25hbWVfMiksIHZhbHVlcyA9IHNjYWxlczo6aHVlX3BhbCgpKDIpKQpgYGAKCiMjIyMg44GE44GP44Gk44GL44Gu5Zu944Gr44Gk44GE44Gm44Gu44CB5LqM44Gk44Gu5oyH5qiZ77yIV0RJ77yJ44Go44CB44Gd44Gu55Wl56ew44GL44KJ44CB5oqY57ea44Kw44Op44OV44KS5L2c5oiQCgpMaW5lIFBsb3Qgd2l0aCB0d28gaW5kaWNhdG9ycyB3aXRoIGFiYnJldmlhdGlvbiBhbmQgc2V2ZXJhbCBjb3VudHJpZXMKCmBgYHtyIGNhY2hlPVRSVUV9CmNob3Nlbl9pbmRpY2F0b3JfMSA8LSAiTlkuR0RQLkRFRkwuS0QuWkciCnNob3J0X25hbWVfMSA8LSAiZ2RwX2RlZmxhdG9yIgpjaG9zZW5faW5kaWNhdG9yXzIgPC0gIkNQVE9UU0FYTlpHWSIKc2hvcnRfbmFtZV8yIDwtICJjcGlfcHJpY2UiCmNob3Nlbl9jb3VudHJpZXMgPC0gYygiVW5pdGVkIFN0YXRlcyIsICJGcmFuY2UiLCAiSmFwYW4iKQpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKHNob3J0X25hbWVfMSA9IGNob3Nlbl9pbmRpY2F0b3JfMSwgc2hvcnRfbmFtZV8yID0gY2hvc2VuX2luZGljYXRvcl8yKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjaG9zZW5fY291bnRyaWVzKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCBuYW1lc190byA9ICJjbGFzcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSBkcm9wX25hKHZhbHVlKSAlPiUKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBsaW5ldHlwZSA9IGNsYXNzLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgIiwgY2hvc2VuX2luZGljYXRvcl8xLCAiOiAiLCBzaG9ydF9uYW1lXzEsICJcbiIsIGNob3Nlbl9pbmRpY2F0b3JfMiwgIjogIiwgc2hvcnRfbmFtZV8yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChsYWJlbHMgPSBjKHNob3J0X25hbWVfMSwgc2hvcnRfbmFtZV8yKSwgdmFsdWVzID0gYygic29saWQiLCAiZGFzaGVkIikpCmBgYAoKCmBgYHtyIGNhY2hlPVRSVUV9CmNob3Nlbl9pbmRpY2F0b3JfMSA8LSAiU0wuVExGLkNBQ1QuTUEuTkUuWlMiCnNob3J0X25hbWVfMSA8LSAibWFsZSIKY2hvc2VuX2luZGljYXRvcl8yIDwtICJTTC5UTEYuQ0FDVC5GRS5ORS5aUyIKc2hvcnRfbmFtZV8yIDwtICJmZW1hbGUiCmNob3Nlbl9jb3VudHJpZXMgPC0gYygiVW5pdGVkIFN0YXRlcyIsICJGcmFuY2UiLCAiSmFwYW4iKQpXREkoY291bnRyeSA9ICJhbGwiLCBpbmRpY2F0b3IgPSBjKHNob3J0X25hbWVfMSA9IGNob3Nlbl9pbmRpY2F0b3JfMSwgc2hvcnRfbmFtZV8yID0gY2hvc2VuX2luZGljYXRvcl8yKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKSAlPiUgCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjaG9zZW5fY291bnRyaWVzKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKGMoc2hvcnRfbmFtZV8xLCBzaG9ydF9uYW1lXzIpLCBuYW1lc190byA9ICJjbGFzcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSBkcm9wX25hKHZhbHVlKSAlPiUKICBnZ3Bsb3QoYWVzKHllYXIsIHZhbHVlLCBsaW5ldHlwZSA9IGNsYXNzLCBjb2wgPSBjb3VudHJ5KSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9IHBhc3RlKCJXREkgIiwgY2hvc2VuX2luZGljYXRvcl8xLCAiOiAiLCBzaG9ydF9uYW1lXzEsICJcbiIsIGNob3Nlbl9pbmRpY2F0b3JfMiwgIjogIiwgc2hvcnRfbmFtZV8yKSkgKwogIHNjYWxlX2xpbmV0eXBlX21hbnVhbChsYWJlbHMgPSBjKHNob3J0X25hbWVfMSwgc2hvcnRfbmFtZV8yKSwgdmFsdWVzID0gYygic29saWQiLCAiZGFzaGVkIikpCmBgYAoKCiMjIOiqsumhjOOAgEFzc2lnbm1lbnQKCuS4iuOBruODhuODs+ODl+ODrOODvOODiOOCkuOCs+ODlOODvOOBl+OBpuOAgeS4i+OBq+iyvOOCiuS7mOOBkeOAgeaMh+aomSBgaW5kaWNhdG9yYCDjgajjgIHnlaXnp7AgYHNob3J0X25hbWVgIOOBqOOAgeOBhOOBj+OBpOOBi+OBruWbveWQjSBgY2hvc2VuX2NvdW50cmllc2Ag44KS44CB5YWl44KM5pu/44GI44Gm44CB6Kmm44GX44Gm44G/44Gm44GP44Gg44GV44GE44CCCgojIyMg5a2m55Sf44GM6YG45oqe44GX44Gf5LiW55WM6ZaL55m65oyH5qiZ77yIV0RJ77yJ44Gu5L6LCgoxOeS6uuOBruWPl+ism+eUn+OBq+OAgeiIiOWRs+OBruOBguOCi+aMh+aomeOCkumBuOOCk+OBp+OAgeODhuODs+ODl+ODrOODvOODiOOCkuS9v+OBo+OBpuOAgeWPr+imluWMluOCkuOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAgeOBqOiqsumhjOOBq+WHuuOBl+OBn+aZguOBq+OAgeiqv+OBueOBpuOBj+OCjOOBn+OCguOBruOBp+OBmeOAggoKYGBge3J9CnVybF9pbmRpY2F0b3JzIDwtICJodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2RhdGEvaW5kaWNhdG9ycy5jc3YiCmRmX2luZGljYXRvcnMgPC0gcmVhZF9jc3YodXJsX2luZGljYXRvcnMpICU+JSBsZWZ0X2pvaW4od2RpX2NhY2hlJHNlcmllcykKd3JpdGVfY3N2KGRmX2luZGljYXRvcnMsICIuL2RhdGEvaW5kaWNhdG9ycy5jc3YiKQpkZl9pbmRpY2F0b3JzICU+JSBkaXN0aW5jdChpbmRpY2F0b3IsIG5hbWUpICU+JSBhcnJhbmdlKGluZGljYXRvcikKYGBgCgroh6rliIbjgafoqrLpoYzjgpLogIPjgYjjgIHjg4fjg7zjgr/jgpLpgbjjgbnjgovjgZPjgajjga/jgIHjgajjgabjgoLlpKfliIfjgaDjgajjgYTjgYbjgZPjgajjgaDjgajmgJ3jgYTjgb7jgZnjgIIKCiMg5o6i57Si55qE44OH44O844K/6Kej5p6Q44CARXhwbG9yYXRvcnkgRGF0YSBBbmFseXNpcyAoRURBKQoKIyMg5o6i57Si55qE44OH44O844K/6Kej5p6Q44Go44Gv77yfIChbUG9zaXQgUHJpbWVyc10oaHR0cHM6Ly9wb3NpdC5jbG91ZC9sZWFybi9wcmltZXJzLzMuMSkpCgoxLiBFREHjga/jgIHjg4fjg7zjgr/jgYzkvZXjgpLoqp7jgaPjgabjgYTjgovjgYvjgpLnkIbop6PjgZnjgovjgZ/jgoHjga7lj43lvqnnmoTjgarjgrXjgqTjgq/jg6vjgafjgZnjgIIKCjIuIOOBvuOBmuOAgeODh+ODvOOCv+OBq+mWouOBmeOCi+WVj+OBhOOCkuS9nOaIkOOBl+OBvuOBmeOAggoKMy4g44OH44O844K/44Gu5Y+v6KaW5YyW44CB5aSJ5o+b44CB44Oi44OH44Oq44Oz44Kw44KS6KGM44GE44CB562U44GI44KS5o6i44GX44G+44GZ44CCCgrlrabnv5LjgZfjgZ/jgZPjgajjgpLmtLvnlKjjgZfjgabjgIHllY/jgYTjgpLkv67mraPjgZfjgZ/jgorjgIHmlrDjgZfjgYTllY/jgYTjgpLogIPjgYjjgZ/jgorjgZfjgb7jgZnjgILjgZ3jgZfjgabjgIHjgZPjga7jgrXjgqTjgq/jg6vjgpLnubDjgorov5TjgZfjgabjgYTjgY3jgb7jgZnjgIIKCkVEQeOBr+ODh+ODvOOCv+WIhuaekOOBq+OBiuOBhOOBpumHjeimgeOBquW9ueWJsuOCkuaenOOBn+OBl+OBvuOBmeOAguOBvuOBn+OAgeODh+ODvOOCv+OBruWTgeizquOCkuS/neiovOOBmeOCi+OBn+OCgeOBq+OAgeODh+ODvOOCv+OBruizquOCkueiuuiqjeOBmeOCi+OBn+OCgeOBq+S9v+eUqOOBmeOCi+OBk+OBqOOCguOBp+OBjeOBvuOBmeOAggoKIVtSNERTIOOBi+OCieOBruOCpOODoeODvOOCuF0oaHR0cHM6Ly9kMzN3dWJyZmtpMGw2OC5jbG91ZGZyb250Lm5ldC83OTVjMDM5YmEyNTIwNDU1ZDgzM2I0MDM0YmVmYzhjZjM2MGE3MGJhLzU1OGE1L2RpYWdyYW1zL2RhdGEtc2NpZW5jZS1leHBsb3JlLnBuZykKCuWVj+OBhOOCkuOCguOBoeODh+ODvOOCv+OCkuWPluW+l+OBl+OAgeimluimmuWMluOBquOBqeOCkumAmuOBl+OBpuOAgeODh+ODvOOCv+OCkueQhuino+OBl+OAgeOBleOCieOBq+WVj+OBhOOCkua3seOCgeOCi+OCteOCpOOCr+ODq+OBjOOAgeODh+ODvOOCv+OCteOCpOOCqOODs+OCueOBruaguOOBp+OBr+OBquOBhOOBi+OBqOaAneOBhOOBvuOBmeOAggoKIyMg44OH44O844K/44Gu5Y+W5b6X44O76Kqt44G/6L6844G/IC0gSW1wb3J0aW5nIERhdGEKCuOCueOCv+ODvOODiOOBr+OAgeacrOadpeOBr+OAgeODh+ODvOOCv+OBruS9nOaIkOODu+aOoue0ouOBp+OBmeOBjOOAgeOBmeOBp+OBq+OAgeWIhuaekOOBl+OBn+OBhOODh+ODvOOCv+OBr+OBmeOBp+OBq+OBguOCi+OBqOOBl+OBpuipseOCkumAsuOCgeOBvuOBmeOAguOBvuOBmuOBr+OAgWBkYXRhYCDjg5Xjgqnjg6vjg4DvvIhkaXJlY3RvcnnvvInjgpLkvZzmiJDjgZfjgabjgYrjgY/jgajoia/jgYTjgILlj7PkuIvjga7nqpPmnqDjga4gRmlsZXMg44K/44OW44GL44KJ44CBTmV3IEZvbGRlciDjgafkvZzmiJDjgZfjgabjgoLjgojjgYTjgIIKCmBgYHtyIGV2YWw9RkFMU0V9CmRpci5jcmVhdGUoIi4vZGF0YSIpCmBgYAoKCuODh+ODvOOCv+OBruWPluW+l+ODu+iqreOBv+i+vOOBv+OCkuOAgeWbm+OBpOOBruaWueazleOBq+WIhuOBkeOBpuiqrOaYjuOBl+OBvuOBmeOAggoKMS4g44OR44OD44Kx44O844K444Gu5Yip55SoCiAgLSDkvovvvJpXREkg44Gq44Gp44CC5L2V5bqm44KC44CB44OA44Km44Oz44Ot44O844OJ44GX44Gq44GP44Gm6Imv44GE44KI44GE44Gr44CB5pu444GN5Ye644GX44Gm44GK44GN44CBMiDjgpLkvb/jgYbjgajjgojjgYTjgIJgd3JpdGUoZGZfbmFtZSwgIi4vZGF0YS9uYW1lLmNzdiIpYAoyLiDjgrPjg7Pjg5Tjg6Xjg7zjgr/kuIrjgavjgYLjgosgQ1NWIOOBquOBqeOBruODhuOCreOCueODiOODleOCoeOCpOODq+OCkuiqreOBv+i+vOOCgAogIC0g5L6L77yaYGRmX25hbWUgPC0gcmVhZF9jc3YoIi4vZGF0YS9maWxlX25hbWUuY3N2IilgCjMuIOOCpOODs+OCv+ODvOODjeODg+ODiOS4iuOBruODh+ODvOOCv+OBruOCouODieODrOOCue+8iFVSTO+8ieOCkuS9v+OBo+OBpuOAgUNTViDjgarjganjga7jg4bjgq3jgrnjg4jjg5XjgqHjgqTjg6vjgpLoqq3jgb/ovrzjgoDjgIIKICAtIOS+i++8mmBkZl9uYW1lIDwtIHJlYWRfY3N2KHVybF9vZl9hX2NzdilgCjQuIOOCs+ODs+ODlOODpeODvOOCv+S4iuOBq+OBguOCi+OAgUV4Y2VsIOODleOCoeOCpOODq+OBquOBqeOBruODh+OCuOOCv+ODq+ODleOCoeOCpOODq+OCkuiqreOBv+i+vOOCgOOAguOBvuOBmuOAgWBsaWJyYXJ5KHJlYWR4bClg44CCCiAgLSDkvovvvJpgZGZfbmFtZSA8LSByZWFkX2V4Y2VsKCIuL2RhdGEvZmlsZV9uYW1lLnhsc3giKWAKNS4g44K144Kk44OI44GL44KJ44OA44Km44Oz44Ot44O844OJ44GX44Gm44CBUHJvamVjdCDjga7jg4fjg7zjgr/jg5Xjgqnjg6vjg4Djgavnp7vjgZnjgILjgb7jgZ/jga/jgIHjg4fjg7zjgr/jga7jgqLjg4njg6zjgrnvvIhVUkzvvInjgYzjgo/jgYvjgaPjgabjgYTjgozjgbDjgIHnm7TmjqXjg4Djgqbjg7Pjg63jg7zjg4njgIIKICAtIOS+i++8mmBkb3dubG9hZC5maWxlKHVybF9vZl9hX2RhdGEsIGRlc3RmaWxlID0gIi4vZGF0YS9kYXRhX25hbWUiKQo2LiDjgq/jg6rjg4Pjg5fjg5zjg7zjg4njgavjgrPjg5Tjg7zjgZfjgaboqq3jgb/ovrzjgoDjgIIKICAtIOS+i++8mmBkZl9uYW1lIDwtIHJlYWRfZGVsaW0oY2xpcGJvYXJkKCkpYAoKIyMgYFdESWNhY2hlKClgIOOBruaJseOBhAoK5LqM44Gk44Gu44CB44OV44Kh44Kk44Or44GM5LiA44Gk44Gr44Gq44Gj44Gf44CB44Oq44K544OI44Gn44GC44KL44Gf44KB44CB6YGV44Gj44Gm5ZG95Luk44KS5L2/44GE44G+44GZ44CCCgpgYGB7cn0Kd2RpX2NhY2hlIDwtIFdESWNhY2hlKCkKd3JpdGVfcmRzKHdkaV9jYWNoZSwgIi4vZGF0YS93ZGlfY2FjaGUuUkRhdGEiKQpgYGAKCmBgYHtyfQp3ZGlfY2FjaGUgPC0gcmVhZF9yZHMoIi4vZGF0YS93ZGlfY2FjaGUuUkRhdGEiKQpgYGAKCiMjIFdESSDjgafjga7kvosKCmBgYHtyIGNhY2hlPVRSVUV9CmRmX21pbGl0YXJ5NiA8LSBXREkoY291bnRyeSA9IGMoIkNOIiwiR0IiLCJKUCIsIklOIiwiVVMiLCJERSIpLCBpbmRpY2F0b3IgPSBjKG1pbGl0YXJ5ID0gIk1TLk1JTC5YUE5ELkNEIiksIGV4dHJhPVRSVUUsIGNhY2hlPXdkaV9jYWNoZSkKZGZfbWlsaXRhcnk2ICU+JSBmaWx0ZXIoeWVhciA9PSAyMDIxKSAlPiUgYXJyYW5nZShkZXNjKG1pbGl0YXJ5KSkKYGBgCgpgYGB7cn0KZGZfbWlsaXRhcnk2ICU+JSBkcm9wX25hKG1pbGl0YXJ5KSAlPiUKICBnZ3Bsb3QoYWVzKHllYXIsIG1pbGl0YXJ5LCBjb2w9aXNvMmMpKSArIGdlb21fbGluZSgpCmBgYAoKYGBge3J9CmRmX21pbGl0YXJ5IDwtIFdESShjb3VudHJ5ID0gImFsbCIsIGluZGljYXRvciA9IGMobWlsaXRhcnkgPSAiTVMuTUlMLlhQTkQuQ0QiKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKQpgYGAKCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpkZl9taWxpdGFyeSAlPiUgZHJvcF9uYShtaWxpdGFyeSkgJT4lIGZpbHRlcih5ZWFyPT0yMDIxLCBpbmNvbWU9PSJIaWdoIGluY29tZSIsIG1pbGl0YXJ5ID4wKSAlPiUKICBnZ3Bsb3QoYWVzKG1pbGl0YXJ5LCBmaWxsPXJlZ2lvbikpICsgZ2VvbV9kZW5zaXR5KCkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA1NDEyMzU1MTcwMiwgY29sPSJyZWQiKSArIHNjYWxlX3hfbG9nMTAoKSArIGdlb21fbGFiZWwoeD0xMS4xLCB5PTI1LCBsYWJlbCA9ICJKYXBhbiIpICsgZmFjZXRfd3JhcCh+cmVnaW9uKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyBsYWJzKHRpdGxlPSJNaWxpdGFyeSBFeHBlbnNlcyBpbiBoaWdoIGluY29tZSBjb3VudHJpZXMiKQpgYGAKCmBgYHtyfQpkZl9taWxpdGFyeV9nZHAgPC0gV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhtaWxpdGFyeV9nZHAgPSAiTVMuTUlMLlhQTkQuR0QuWlMiKSwgZXh0cmE9VFJVRSwgY2FjaGU9d2RpX2NhY2hlKQpkZl9taWxpdGFyeV9nZHAgJT4lIGZpbHRlcihjb3VudHJ5ID09ICJKYXBhbiIsIHllYXI9PTIwMjEpCmBgYAoKYGBge3J9CmRmX21pbGl0YXJ5X2dkcCAlPiUgZHJvcF9uYShtaWxpdGFyeV9nZHApICU+JSBmaWx0ZXIoeWVhcj09MjAyMSwgaW5jb21lIT0iQWdncmVnYXRlcyIpICU+JQogIGdncGxvdChhZXMobWlsaXRhcnlfZ2RwLCBmaWxsPWluY29tZSkpICsgZ2VvbV9kZW5zaXR5KGJpbndpZHRoID0gMC4yLCBhbHBoYT0wLjUpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMiwgY29sPSJyZWQiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDEsIGNvbD0iYmx1ZSIpICsgZmFjZXRfd3JhcCh+aW5jb21lKQpgYGAKCgojIyDlm73pmpvmqZ/plqLjga7jg4fjg7zjgr8gSW50ZXJuYXRpb25hbCBJbnN0aXR1dGlvbnMnIERhdGEKCi0gV29ybGQgQmFuazogaHR0cHM6Ly9kYXRhLndvcmxkYmFuay5vcmcKLSBVTiBEYXRhOiBodHRwczovL2RhdGEudW4ub3JnCi0gT0VDRDogaHR0cHM6Ly9kYXRhLm9lY2Qub3JnLwoKYGBge3J9CnVybF91bl9wb3AgPC0gImh0dHBzOi8vZGF0YS51bi5vcmcvX0RvY3MvU1lCL0NTVi9TWUI2NV8xXzIwMjIwOV9Qb3B1bGF0aW9uLCUyMFN1cmZhY2UlMjBBcmVhJTIwYW5kJTIwRGVuc2l0eS5jc3YiCmRmX3VuX3BvcDAgPC0gcmVhZF9jc3YodXJsX3VuX3BvcCkKZGZfdW5fcG9wMApgYGAKCmBgYHtyfQp1cmxfdW5fcG9wIDwtICJodHRwczovL2RhdGEudW4ub3JnL19Eb2NzL1NZQi9DU1YvU1lCNjVfMV8yMDIyMDlfUG9wdWxhdGlvbiwlMjBTdXJmYWNlJTIwQXJlYSUyMGFuZCUyMERlbnNpdHkuY3N2IgpkZl91bl9wb3AgPC0gcmVhZF9jc3YodXJsX3VuX3BvcCwgc2tpcD0xKQpkZl91bl9wb3AKYGBgCgpgYGB7cn0KZGZfdW5fcG9wICU+JSBkaXN0aW5jdChgUmVnaW9uL0NvdW50cnkvQXJlYWAsIGAuLi4yYCkKYGBgCgoKYGBge3J9CmRmX3VuX3BvcCAlPiUgZmlsdGVyKGBSZWdpb24vQ291bnRyeS9BcmVhYCAlaW4lIGMoMiwxOSwxNDIsMTUwLDkpLCBTZXJpZXMgPT0gIlBvcHVsYXRpb24gbWlkLXllYXIgZXN0aW1hdGVzIChtaWxsaW9ucykiKSAlPiUKICBnZ3Bsb3QoYWVzKFllYXIsIFZhbHVlLCBmaWxsID0gYC4uLjJgKSkgKyBnZW9tX2FyZWEoY29sPSJibGFjayIpICsKICBsYWJzKHRpdGxlID0gIlBvcHVsYXRpb24gbWlkLXllYXIgZXN0aW1hdGVzIChtaWxsaW9ucykgb2YgdGhlIFdvcmxkIikKYGBgCgoKIyMgT0VDRCBkYXRhCgotIGh0dHBzOi8vZGF0YS5vZWNkLm9yZy8KCiMjIyDkvovvvJrlirTlg43mmYLplpPlvZPjgZ/jgopHRFAKCi0gW+aXpeacrOOBruaZgumWk+W9k+OBn+OCiueUn+eUo+aAp+OBr09FQ0QzOOOCq+WbveS4rTI35L2N77yI5pel5pys55Sf55Sj5oCn5pys6YOo44CM5Yq05YON55Sf55Sj5oCn44Gu5Zu96Zqb5q+U6LyD44CN77yJXShodHRwczovL3d3dy5qY2NpLm9yLmpwL25ld3MvdHJlbmQtYm94LzIwMjIvMTIxOTE1NDcxMy5odG1sKQogIC0gW+WKtOWDjeeUn+eUo+aAp+OBruWbvemam+avlOi8gzIwMjJdKGh0dHBzOi8vd3d3LmpwYy1uZXQuanAvcmVzZWFyY2gvZGV0YWlsLzAwNjE3NC5odG1sKQotIFtQcm9kdWN0aXZpdHkgc3RhdGlzdGljc10oaHR0cHM6Ly93d3cub2VjZC5vcmcvc2RkL3Byb2R1Y3Rpdml0eS1zdGF0cy8pCiAgLSBbUmVhZCBNb3JlOiBJbXByb3ZpbmcgUHJvZHVjdGl2aXR5IE1lYXN1cmVtZW50IFByYWN0aWNlc10oaHR0cHM6Ly93d3cub2VjZC5vcmcvc2RkL3Byb2R1Y3Rpdml0eS1zdGF0cy9pbXByb3ZpbmctcHJvZHVjdGl2aXR5LW1lYXN1cmVtZW50LXByYWN0aWNlcy5odG0pCiAgICAtIFtMZXZlbCBvZiBHRFAgcGVyIGNhcGl0YSBhbmQgcHJvZHVjdGl2aXR5XShodHRwczovL3N0YXRzLm9lY2Qub3JnL0luZGV4LmFzcHg/RGF0YVNldENvZGU9UERCX0xWKQogICAgLSBbR0RQIHBlciBob3VyIHdvcmtlZF0oaHR0cHM6Ly9kYXRhLm9lY2Qub3JnL2xwcmR0eS9nZHAtcGVyLWhvdXItd29ya2VkLmh0bSNpbmRpY2F0b3ItY2hhcnQpCiAgICAKCioq5Yq05YON5pmC6ZaT5b2T44Gf44KKR0RQKioKCuWKtOWDjeaZgumWk+W9k+OBn+OCikdEUOOBr+OAgeWKtOWDjeeUn+eUo+aAp+OBruaMh+aomeOBp+OBguOCi+OAguOBk+OCjOOBr+OAgeWKtOWDjeaKleWFpemHj+OBjOS7luOBrueUn+eUo+imgee0oOOBqOe1hOOBv+WQiOOCj+OBleOCjOOAgeeUn+eUo+ODl+ODreOCu+OCueOBp+OBqeOCjOOBoOOBkeWKueeOh+eahOOBq+WIqeeUqOOBleOCjOOBn+OBi+OCkua4rOWumuOBmeOCi+OCguOBruOBp+OBguOCi+OAguWKtOWDjeaKleWFpemHj+OBr+OAgeeUn+eUo+OBq+W+k+S6i+OBmeOCi+OBmeOBueOBpuOBruS6uuOBrue3j+WKtOWDjeaZgumWk+OBqOOBl+OBpuWumue+qeOBleOCjOOCi+OAguWKtOWDjeeUn+eUo+aAp+OBr+OAgeWKtOWDjeiAheOBruWAi+S6uueahOiDveWKm+OChOWKquWKm+OBruW8t+OBleOBqOOBhOOBo+OBn+WKtOWDjeOBrueUn+eUo+aAp+OCkumDqOWIhueahOOBq+OBl+OBi+WPjeaYoOOBl+OBpuOBhOOBquOBhOOAguOCouOCpuODiOODl+ODg+ODiOaMh+aomeOBqOWKtOWDjeaKleWFpemHj+OBruavlOeOh+OBr+OAgeS7luOBruaKleWFpeeJqe+8iOizh+acrOOAgeS4remWk+aKleWFpeeJqeOAgeaKgOihk+ODu+e1hOe5lOODu+WKueeOh+OBruWkieWMluOAgeimj+aooeOBrue1jOa4iOOBquOBqe+8ieOBruWtmOWcqOOChOWIqeeUqOOBq+Wkp+OBjeOBj+W3puWPs+OBleOCjOOCi+OAguOBk+OBruaMh+aomeOBr+OAgeexs+ODieODq++8iDIwMTDlubTjga7mgZLluLjkvqHmoLzjgYrjgojjgbNQUFDvvInjgYrjgojjgbPmjIfmqJnjgafmuKzlrprjgZXjgozjgabjgYTjgb7jgZnjgIIKCiMjIyMg5pyA5Yid44Gu44K544OG44OD44OXIHstfQoKMS4gW+OCteOCpOODiF0oaHR0cHM6Ly9kYXRhLm9lY2Qub3JnL2xwcmR0eS9nZHAtcGVyLWhvdXItd29ya2VkLmh0bSNpbmRpY2F0b3ItY2hhcnQp44GL44KJ44CBQ1NWIOODh+ODvOOCv+OCkuODgOOCpuODs+ODreODvOODieOAggoyLiDjg5fjg63jgrjjgqfjgq/jg4jlhoXjga7jg4fjg7zjgr/moLzntI3jg5Xjgqnjg6vjg4DjgavlhaXjgozjgb7jgZnjgIIiLi9kYXRhLyIKMy4g6Kqt44G/6L6844G/44G+44GZ44CCCgrkuIrjga5b44K144Kk44OIXShodHRwczovL2RhdGEub2VjZC5vcmcvbHByZHR5L2dkcC1wZXItaG91ci13b3JrZWQuaHRtI2luZGljYXRvci1jaGFydCnjgYvjgonjg4fjg7zjgr/vvIhGdWxsIGluZGljYXRvciBkYXRh77yJ44KS44OA44Km44Oz44Ot44O844OJ44GX44Gm44CB44OX44Ot44K444Kn44Kv44OI44GuIGRhdGEg44OV44Kp44Or44OA44O844Gr5YWl44KM44G+44GX44Gf44CCCgpgYGB7cn0KZGZfb2VjZF9wcm9kdWN0aXZpdHkgPC0gcmVhZF9jc3YoIi4vZGF0YS9EUF9MSVZFXzIxMDIyMDIzMTExNzEyMDY1LmNzdiIpCmRmX29lY2RfcHJvZHVjdGl2aXR5CmBgYAoKIyMjIOODh+ODvOOCv+OBrueiuuiqjSB7LX0KCuWIl+WQjeOCkueiuuiqjeOBl+OAgeWIl+OBlOOBqOOBq+OAgeODh+ODvOOCv+OCkueiuuiqjQoKYGBge3J9CmNvbG5hbWVzKGRmX29lY2RfcHJvZHVjdGl2aXR5KQpgYGAKCmB1bmlxdWUoKWAg44Gu44GL44Gj44GT44Gu5Lit44Gr44CBYGRmX29lY2RfcHJvZHVjdGl2aXR5JExPQ0FUSU9OYCDjgpLlhaXjgozjgZ/jgoLjga7jgajlkIzjgZjjgoLjga7jgpLlh7rlipvjgZfjgb7jgZnjgILmrKHjgIXjgajjgaTjgaXjgZHjgovjgajjgY3jgavkvr/liKnjgarjga7jgafjgIHjgZPjga7jg5HjgqTjg5cgYCU+JWAg44KS44KP44Gf44GX44Gv44KI44GP5L2/44GE44G+44GZ44CCYHVuaXF1ZShkZl9vZWNkX3Byb2R1Y3Rpdml0eSRMT0NBVElPTilgIOOCguippuOBl+OBpuOBv+OBpuOBj+OBoOOBleOBhOOAggoKCmBgYHtyfQpkZl9vZWNkX3Byb2R1Y3Rpdml0eSRMT0NBVElPTiAlPiUgdW5pcXVlKCkKYGBgCmBgYHtyfQpkZl9vZWNkX3Byb2R1Y3Rpdml0eSRJTkRJQ0FUT1IgJT4lIHVuaXF1ZSgpCmBgYAoKYGBge3J9CmRmX29lY2RfcHJvZHVjdGl2aXR5JFNVQkpFQ1QgJT4lIHVuaXF1ZSgpCmBgYAoKYGBge3J9CmRmX29lY2RfcHJvZHVjdGl2aXR5JE1FQVNVUkUgJT4lIHVuaXF1ZSgpCmBgYAoKYGBge3J9CmRmX29lY2RfcHJvZHVjdGl2aXR5JEZSRVFVRU5DWSAlPiUgdW5pcXVlKCkKYGBgCgpgYGB7cn0KZGZfb2VjZF9wcm9kdWN0aXZpdHkkVElNRSAlPiUgdW5pcXVlKCkKYGBgCgpgYGB7cn0KZGZfb2VjZF9wcm9kdWN0aXZpdHkgJT4lIAogIGZpbHRlcihNRUFTVVJFID09ICJVU0QiLCBUSU1FID09IDIwMjEpICU+JSAjIGZpbHRlcmluZyByb3dzIHdpdGggY29uZGl0aW9ucwogIHNlbGVjdChMT0NBVElPTiwgVmFsdWUpICU+JSAjIHNlbGVjdGluZyBjb2x1bW5zCiAgYXJyYW5nZShkZXNjKFZhbHVlKSkgIyBvcmRlcmluZyB0aGUgcm93cyBpbiB0aGUgZGVzY2VudGluZyBvcmRlciBvZiB0aGUgY29sdW1uIFZhbHVlCmBgYAoKIyMjIOOBhOOBj+OBpOOBi+OBruWcsOWfn+OCkumBuOOCk+OBp+OAgeaKmOe3muOCsOODqeODleOCkuabuOOBhOOBpuOBv+OCi+OAgnstfQoK77yT6KGM55uu44GM44Gq44GE44Go44Gp44GG44Gq44KK44G+44GZ44GL44CCCgpgYGB7cn0KZGZfb2VjZF9wcm9kdWN0aXZpdHkgJT4lIAogIGZpbHRlcihMT0NBVElPTiAlaW4lIGMoIkpQTiIsICJPRUNEIiwgIkctNyIsICJFVTI4IikpICU+JQogIGZpbHRlcihNRUFTVVJFID09ICJVU0QiKSAlPiUgIyBzYW1lIGFzIGFib3ZlIHVwIHRvIHRoaXMgbGluZQogIGdncGxvdChhZXMoeCA9IFRJTUUsIHkgPSBWYWx1ZSwgY29sID0gTE9DQVRJT04pKSArIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZT0iR0RQIHBlciBob3VyIHdvcmtlZCIsICMgYWRkaW5nIHRoZSB0aXRsZSBhbmQgdGhlIHN1YnRpdGxlCiAgICAgICBzdWJ0aXRsZT0iVG90YWwsIDIwMTU9MTAwLCAyMDIxIG9yIGxhdGVzdCBhdmFpbGFibGUiKQpgYGAKCgojIyDnt7Tnv5LvvJrmlZnogrIgRWR1Y2F0aW9uCgrmiJDkurrjga7mlZnogrLjg6zjg5njg6vjgavplqLjgZnjgovjgIHmrKHjga7jgrXjgqTjg4jjgYvjgonjg4fjg7zjgr/jgpLjgajjgaPjgabjgIHoqr/jgbnjgabjgb/jgabjgY/jgaDjgZXjgYTjgIIKCkFkdWx0IGVkdWNhdGlvbiBsZXZlbDogaHR0cHM6Ly9kYXRhLm9lY2Qub3JnL2VkdWF0dC9hZHVsdC1lZHVjYXRpb24tbGV2ZWwuaHRtCgrjg4Djgqbjg7Pjg63jg7zjg4njgZfjgZ/jg5XjgqHjgqTjg6vjga7jg5XjgqHjgqTjg6vlkI3jgYwgYERQX0xJVkVfMjEwMjIwMjMxMjAxMzI2NTQuY3N2YCDjgajlkIzjgZjjgafjgYLjgovjgZPjgajjgpLnorroqo3jgZfjgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyfQpkZl9vZWNkX2VkdWNhdGlvbl9sZXZlbCA8LSByZWFkX2NzdigiLi9kYXRhL0RQX0xJVkVfMjEwMjIwMjMxMjAxMzI2NTQuY3N2IikKZGZfb2VjZF9lZHVjYXRpb25fbGV2ZWwKYGBgCgrkuIrjga7lirTlg43mmYLplpPlvZPjgZ/jgopHRFDjga7kvovjgavnv5LjgaPjgabjgIHjg4fjg7zjgr/jgpLoqr/jgbnjgabjgb/jgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyfQpjb2xuYW1lcyhkZl9vZWNkX2VkdWNhdGlvbl9sZXZlbCkKYGBgCgoKYGBge3J9CmRmX29lY2RfZWR1Y2F0aW9uX2xldmVsJFNVQkpFQ1QgJT4lIHVuaXF1ZSgpCmBgYAoK44GT44KM44KJ44Gv44CB5L2V44KS5oSP5ZGz44GX44Gm44GE44KL44Gu44Gn44GX44KH44GG44GL44CC44K144Kk44OI44GuIFBlcnNwZWN0aXZlcyDjgarjganjgpLjgb/jgabjgY/jgaDjgZXjgYTjgIIKCuS7luOBruWIl++8iOWkieaVsO+8ieOBr+OAgeOBqeOBhuOBp+OBl+OCh+OBhuOBi+OAguOCs+ODvOODieODgeODo+ODs+OCr+OCkuaMv+WFpeOBl+OBpuOAgeiqv+OBueOBpuOBv+OBpuOBj+OBoOOBleOBhOOAggoK5Yq05YON5pmC6ZaT5b2T44Gf44KKR0RQ44Gu5L6L44Gu55yf5Ly844KS44GX44Gm44CB44Kw44Op44OV44KS5pu444GE44Gm44G/44G+44GX44Gf44CCCgpgYGB7cn0KZGZfb2VjZF9lZHVjYXRpb25fbGV2ZWwgJT4lIAogIGZpbHRlcihMT0NBVElPTiAlaW4lIGMoIkpQTiIsICJPRUNEIiwgIkctNyIsICJFVTI4IikpICU+JQogIGdncGxvdChhZXMoVElNRSwgVmFsdWUsIGxpbmV0eXBlID0gU1VCSkVDVCwgY29sID0gTE9DQVRJT04pKSArIGdlb21fbGluZSgpICsgCiAgbGFicyh0aXRsZT0iQWR1bHQgZWR1Y2F0aW9uIGxldmVsIikKYGBgCgrjgarjgavjgYvnj77jgozjgb7jgZfjgZ/jgYzjgIHlm73jgoLjgIFTVUJKRUNUIOOCguacn+W+heOBl+OBn+OCguOBruOBr+ePvuOCjOOBpuOBhOOBvuOBm+OCk+OAguOBquOBq+OBjOWVj+mhjOOBquOBruOBp+OBl+OCh+OBhuOAggoK5rCX44Gl44GE44Gm44Gf44GT44Go44KS5pu444GN5Ye644GX44Gm44G/44G+44GX44KH44GG44CCCgojIyBFeGNlbCBEYXRhIOOBruiqreOBv+i+vOOBvwoKYHJlYWR4bGAg44OR44OD44Kx44O844K444KS5L2/44GE44G+44GZ44CC44GT44KM44Gv44CBYHRpZHl2ZXJzZWAg44KS44Kk44Oz44K544OI44O844Or44GZ44KL44Go44GN44Gr44CB5ZCM5pmC44Gr44CB44Kk44Oz44K544OI44O844Or44GV44KM44G+44GZ44GL44KJ44CB44Kk44Oz44K544OI44O844Or44Gv5b+F6KaB44GC44KK44G+44Gb44KT44GM44CBYHRpZHl2ZXJzZWAg44Kw44Or44O844OX44Gu5Li744Gf44KL44OR44OD44Kx44O844K444Gv44Gq44GE44Gu44Gn44CB44Ot44O844OJ44Gv44GV44KM44Gm44GE44Gq44GE44Gu44Gn44CB5L2/44GG44Go44GN44Gr44CB44Ot44O844OJ44GZ44KL5b+F6KaB44GM44GC44KK44G+44GZ44CCCgpgYGB7cn0KbGlicmFyeShyZWFkeGwpICMgbmVlZCB0byBsb2FkIHRob3VnaCByZWFkeGwgaXMgYSBwYXJ0IG9mIHRoZSB0aWR5dmVyc2UgcGFja2FnZSBhbmQgaW5zdGFsbGVkCmBgYAoK5a6f44Gv44CB56+E5Zuy44KS6YG45oqe44GX44CB44Kz44OU44O844KS44GX44CB44Kv44Oq44OD44OX44Oc44O844OJ44GL44KJ6Kqt44KA5pa55rOV44KC44GC44KK44G+44GZ44GM44CB5LqM44Gk44Gu5aSn44GN44Gq55CG55Sx44GL44KJ5o6o5aWo44GX44G+44Gb44KT44CC5LiB5a+n44Gr44CB5pa55rOV44KS6KiY6L+w44GX44Gq44GE44Go44CB5YaN54++5oCn44Gr5ZWP6aGM44GM44GC44KL44GT44Go44CB5YiX44Gu44OH44O844K/44O744K/44Kk44OX44Gq44Gp44GM44CB6YGp5YiH44Gr44CB6Kqt44G/6L6844KB44Gq44GE5aC05ZCI44GM5aSa44GP44CB6Kqt44G/6L6844KT44Gn44GL44KJ44Gu5L2c5qWt44GM6KSH6ZuR44Gr44Gq44KL44CC44Go44Gj44Gm44KC44CB5bCP44GV44Gq44CB6Ieq5YiG44Gn5L2c5oiQ44GX44Gf44OH44O844K/44Gu5aC05ZCI44Gr44Gv44CB5pyJ5Yq544GL44KC44GX44KM44G+44Gb44KT44CCCgpgYGB7ciBldmFsPUZBTFNFfQpkZl9leGNlbF9jbGlwYm9hcmQgPC0gcmVhZF9kZWxpbShjbGlwYm9hcmQoKSkKYGBgCgoKIyMjIOS+izog5LiW55WM44Gu5Ye655Sf546H77yIRmVydGlsaXR577yJIFVOIERhdGEKCuODm+ODg+ODiOOBquODiOODlOODg+OCr+OBp+OBmeOBreOAguaXpeacrOOBruWVj+mhjOOAgeOBneOBl+OBpuOAgeiHquWIhuOBlOOBqOOBqOOBl+OBpuOBoOOBkeOBp+OBquOBj+OAgeS4lueVjOOBrueKtuazgeOCkuimi+OCi+imlueCueOCguaMgeOBoeOBvuOBl+OCh+OBhuOAggoKW1VOIGRhdGFdKGh0dHBzOi8vZGF0YS51bi5vcmcvKSDjgYvjgonjgIHmpJzntKLnqpPjga7kuIrjgavjgYLjgovjgIFbRGF0YW1hcnRzXShodHRwOi8vZGF0YS51bi5vcmcvRXhwbG9yZXIuYXNweCkg44KS6YG45oqe44GX44CB5LiL44Gu44G744GG44Gr44GC44KL44CBV29ybGQgRmVydGlsaXR5IERhdGEgVW5pdGVkIE5hdGlvbnMgUG9wdWxhdGlvbiBEaXZpc2lvbiAoVU5QRCkg44GuIFsrXSDoqJjlj7fjgpLplovjgY3jgb7jgZnjgILlj7Pjga4gW2ldIOOBi+OCieOBr+aDheWgseOBjOW+l+OCieOCjOOBvuOBmeOAguS4ieOBpOOBruODh+ODvOOCv+OBjOOBguOCiuOBvuOBmeOAggoKKiBbQWdlLXNwZWNpZmljIGZlcnRpbGl0eSByYXRlcywgVG90YWwgZmVydGlsaXR5IGFuZCBNZWFuIGFnZSBhdCBjaGlsZGJlYXJpbmddKGh0dHA6Ly9kYXRhLnVuLm9yZy9Eb2N1bWVudERhdGEuYXNweD9pZD0zMTkpCiogW0FubnVhbCBudW1iZXIgb2YgbGl2ZSBiaXJ0aHMgYW5kIENydWRlIGJpcnRoIHJhdGVdKGh0dHA6Ly9kYXRhLnVuLm9yZy9Eb2N1bWVudERhdGEuYXNweD9pZD0zMTYpCiogW0NoaWxkcmVuIGV2ZXIgYm9ybl0oaHR0cDovL2RhdGEudW4ub3JnL0RvY3VtZW50RGF0YS5hc3B4P2lkPTMxOCkKCuOBvuOBmuOBr+OAgSJBZ2Utc3BlY2lmaWMgZmVydGlsaXR5IHJhdGVzLCBUb3RhbCBmZXJ0aWxpdHkgYW5kIE1lYW4gYWdlIGF0IGNoaWxkYmVhcmluZyIg44OH44O844K/44KS5L2/44GG44GT44Go44Gr44GX44G+44GZ44CCCgoxLiDjgrXjgqTjg4jjgYvjgonjgIFFeGNlbCDjg4fjg7zjgr/jgpLjg4Djgqbjg7Pjg63jg7zjg4njgIIKMi4g44OX44Ot44K444Kn44Kv44OI5YaF44Gu44OH44O844K/5qC857SN44OV44Kp44Or44OA44Gr5YWl44KM44G+44GZ44CCIi4vZGF0YS8iCjMuIOippuOBl+OBq+OAgeiqreOBv+i+vOOBv+OBvuOBmeOAggo0LiBGaWxlcyDjgYvjgonjgIFJbXBvcnQgRGF0YXNldCDjgpLpgbjmip7jgZfjgIHoqK3lrprjgpLjgZfjgabjgIHjgoLjgYbkuIDluqbjgIHoqq3jgb/ovrzjgoDjgIIKNS4g5YiX5ZCN44KS5L+u5q2jCjYuIOaXpeacrOOBruODh+ODvOOCv+OCkueiuuiqjQo3LiDlubTpvaLjgZTjgajjga7mlbDjgpLmr5TovIPjgZfjgoTjgZnjgYTjgojjgYbjgavjgIHjg4fjg7zjgr/jgpLlpInlvaIKOC4g44Kw44Op44OV44KS5pu444GE44Gm44G/44KL44CCCjkuIOWHuueUn+W5s+Wdh+W5tOm9ouOBruihqOOCkumZjeW5tOm9oumghuOBq+imi+OBpuOBv+OCi+OAggoxMC4g5a+G5bqm5YiG5biD44Kw44Op44OV44KS5pu444GE44Gm44G/44KL44CCCjExLiDlh7rnlJ/njofjga7ooajjgpLmmIfpoIbjgavopovjgabjgb/jgovjgIIKMTIuIOWvhuW6puWIhuW4g+OCsOODqeODleOCkuabuOOBhOOBpuOBv+OCi+OAggoKIyMjIyBTdGVwcyAxLTMuIHstfQoKMS4g44K144Kk44OI44GL44KJ44CBRXhjZWwg44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44CCCjIuIOODl+ODreOCuOOCp+OCr+ODiOWGheOBruODh+ODvOOCv+agvOe0jeODleOCqeODq+ODgOOBq+WFpeOCjOOBvuOBmeOAgiIuL2RhdGEvIiB7LX0KMy4g6Kmm44GX44Gr44CB6Kqt44G/6L6844G/44G+44GZ44CC44K144Kk44OI44GL44KJ44CBRXhjZWwg44OH44O844K/44KS44OA44Km44Oz44Ot44O844OJ44CCey19CgrjganjgpPjgarjgrfjg7zjg4jjgYzjgYLjgovjgYvopovjgabjgb/jgb7jgZfjgofjgYbjgILoqq3jgb/ovrzjgb/jgavllY/poYzjgYzjgYLjgovjgajjgY3jga/jgIHjg4fjg7zjgr/lkI3jgYvjgonjgrnjg5rjg7zjgrnjgpLmtojjgZfjgIHkuIvjga7jgrPjg7zjg4njgoLkv67mraPjgZfjgaboqq3jgpPjgafjgb/jgabjgY/jgaDjgZXjgYTjgILjgrnjg5rjg7zjgrnjgarjganjgYzjgYLjgovjgajllY/poYzjgYzotbfjgZPjgovloLTlkIjjgYzjgYLjgorjgb7jgZnjgIIKCmBgYHtyfQpleGNlbF9zaGVldHMoIi4vZGF0YS9BZ2Utc3BlY2lmaWMgZmVydGlsaXR5IHJhdGVzLCBUb3RhbCBmZXJ0aWxpdHkgYW5kIC54bHMiKQpgYGAKCuOCt+ODvOODiOOCkuaMh+WumuOBmeOCi+OBqOOBjeOBr+OAgWBzaGVldCA9IDFgIOOBqOOBi+OAgWBzaGVldCA9ICJDSElMRFJFTl9FVkVSX0JPUk4iYCDjgajjgZfjgb7jgZnjgIIK5oyH5a6a44GM44Gq44GE44Go44GN44Gv44CB5pyA5Yid44Gu44K344O844OI44CC6Kmz57Sw44Gv44CBSGVscCDjgafjgIFgcmVhZF9leGNlbGAg44Go44GX44Gm44CB56K66KqN44GX44Gm44GP44Gg44GV44GE44CC44Gf44GP44GV44KT44Gu44CB44Kq44OX44K344On44Oz44GM44GC44KK44G+44GZ44CCCgpgYGB7cn0KZGZfdW5fZmVydGlsaXR5IDwtIHJlYWRfZXhjZWwoIi4vZGF0YS9BZ2Utc3BlY2lmaWMgZmVydGlsaXR5IHJhdGVzLCBUb3RhbCBmZXJ0aWxpdHkgYW5kIC54bHMiKQpkZl91bl9mZXJ0aWxpdHkKYGBgCgrmp4vpgKDjgYzopIfpm5HjgZ3jgYbjgafjgZnjgIIKCiMjIyMgU3RlcCA0LiBGaWxlcyDjgYvjgonjgIFJbXBvcnQgRGF0YXNldCDjgpLpgbjmip7jgZfjgIHoqK3lrprjgpLjgZfjgabjgIHjgoLjgYbkuIDluqbjgIHoqq3jgb/ovrzjgoDjgIJ7LX0KCuODleOCoeOCpOODq+WQjeOCguWkieabtOOBl+OBpuOBiuOBhOOBjOaWueOBjOOCiOOBhOWgtOWQiOOCguOBguOCiuOBvuOBmeOAguOBneOBruOBqOOBjeOBr+OAgeWkieabtOiomOmMsuOCkiBSTm90ZWJvb2vjgavov73oqJjjgZfjgabjgYrjgY/jgajoia/jgYTjgafjgZfjgofjgYbjgILkuIvjga7kvovjgafjga/jgIHkuIrjga7vvJTooYzjgpLjgrnjgq3jg4Pjg5fjgILliJfjgYzjgIF0ZXh077yI5paH5a2X77yJIOOBi+OAgW51bWVyaWPvvIjmlbDlgKTvvInjgYvjgpLpgbjmip7jgILoqq3jgb/ovrzjgb7jgarjgYTjgajjgY3jgavjga/jgIFza2lwIOOBl+OBpuOBhOOBvuOBmeOAggoJCQkKYGBge3Igd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KZGZfdW5fZmVydGlsaXR5IDwtIHJlYWRfZXhjZWwoIi4vZGF0YS9BZ2Utc3BlY2lmaWMgZmVydGlsaXR5IHJhdGVzLCBUb3RhbCBmZXJ0aWxpdHkgYW5kIC54bHMiLCAKICAgIGNvbF90eXBlcyA9IGMoInRleHQiLCAibnVtZXJpYyIsICJ0ZXh0IiwgCiAgICAgICAgIm51bWVyaWMiLCAidGV4dCIsICJudW1lcmljIiwgIm51bWVyaWMiLCAKICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAKICAgICAgICAibnVtZXJpYyIsICJudW1lcmljIiwgIm51bWVyaWMiLCAKICAgICAgICAibnVtZXJpYyIsICJza2lwIiwgInRleHQiLCAic2tpcCIsIAogICAgICAgICJza2lwIiwgInNraXAiLCAic2tpcCIsICJza2lwIiwgInNraXAiKSwgCiAgICBza2lwID0gNCkKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQpkZl91bl9mZXJ0aWxpdHkgPC0gcmVhZF9leGNlbCgiLi9kYXRhL0FnZS1zcGVjaWZpYyBmZXJ0aWxpdHkgcmF0ZXMsIFRvdGFsIGZlcnRpbGl0eSBhbmQgLnhscyIsIAogICAgY29sX3R5cGVzID0gYygidGV4dCIsICJudW1lcmljIiwgInRleHQiLCAKICAgICAgICAibnVtZXJpYyIsICJ0ZXh0IiwgcmVwKCJudW1lcmljIiwgOSksICJza2lwIiwgInRleHQiLHJlcCgic2tpcCIsIDYpKSwgCiAgICBza2lwID0gNCkKYGBgCgpgYGB7cn0KZGZfdW5fZmVydGlsaXR5CmBgYAoKIyMjIyBTdGVwIDUuIOWIl+WQjeOCkuS/ruatoyB7LX0KCuS/ruato+OBl+OBn+OBhOWIl+WQjeOCkuOCs+ODlOODvOOBl+OBpuOBiuOBj+OAggoKQ291bnRyeSwgSVNPIGNvZGUsIFBlcmlvZCwgUmVmZXJlbmNlLCBOQSwgVG90YWwgZmVydGlsaXR5Cgox5YiX55uu44GL44KJ44CBNuWIl+ebruOBqOOAgTE05YiX55uu44Go44CBMTXliJfnm67jgpLjgIHmm7jjgY3mj5vjgYjjgb7jgZnjgIIKCmBgYHtyfQpjb2xuYW1lcyhkZl91bl9mZXJ0aWxpdHkpW2MoMTo2LDE0OjE1KV0gPC0gYygiY291bnRyeSIsCSJpc28iLAkicGVyaW9kIiwieWVhciIsICJyYW5nZSIsCSJmZXJ0aWxpdHlfcmF0ZSIsIm1lYW5fYWdlIiwic291cmNlIikKZGZfdW5fZmVydGlsaXR5CmBgYAoKIyMjIyBTdGVwIDYuIOaXpeacrOOBruODh+ODvOOCv+OCkueiuuiqjSB7LX0KCgpgYGB7cn0KZGZfdW5fZmVydGlsaXR5X2pwIDwtIGRmX3VuX2ZlcnRpbGl0eSAlPiUgZmlsdGVyKGNvdW50cnkgPT0gIkphcGFuIikKZGZfdW5fZmVydGlsaXR5X2pwCmBgYAoKIyMjIyBTdGVwIDcuIOW5tOm9ouOBlOOBqOOBruaVsOOCkuavlOi8g+OBl+OChOOBmeOBhOOCiOOBhuOBq+OAgeODh+ODvOOCv+OCkuWkieW9oiB7LX0KCuOBmeOBk+OBl+OAgembo+OBl+OBhOOBp+OBmeOBjOOAgWBwaXZvdF9sb25nZXJgIOOCkiBIZWxwIOOBp+iqv+OBueOBpuOBj+OBoOOBleOBhOOAggoKYGBge3J9CmRmX3VuX2ZlcnRpbGl0eV9qcCAlPiUgcGl2b3RfbG9uZ2VyKC1jKDE6NiwgMTQ6MTUpLCBuYW1lc190byA9ICJhZ2VfcmFuZ2UiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKQpgYGAKCiMjIyMgU3RlcCA4LiDjgrDjg6njg5XjgpLmm7jjgYTjgabjgb/jgovjgIJ7LX0KCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHlfanAgJT4lIHBpdm90X2xvbmdlcigtYygxOjYsIDE0OjE1KSwgbmFtZXNfdG8gPSAiYWdlX3JhbmdlIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lCiAgZ2dwbG90KGFlcyh4PXllYXIsIGNvbD1hZ2VfcmFuZ2UsIGxpbmV0eXBlID0gYWdlX3JhbmdlKSkgKyBnZW9tX2xpbmUoYWVzKHk9dmFsdWUpKSAKYGBgCgrjgYTjgo3jgYTjgo3jgarjgZPjgajjgYzjgo/jgYvjgorjgb7jgZnjgIIKCiMjIyMgU3RlcCA5LiDlh7rnlJ/lubPlnYflubTpvaLjga7ooajjgpLpmY3lubTpvaLpoIbjgavopovjgabjgb/jgovjgIJ7LX0KCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIAogIGZpbHRlcih5ZWFyICVpbiUgYygyMDEwKSkgJT4lIHNlbGVjdChjb3VudHJ5LCBtZWFuX2FnZSkgJT4lIAogIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGFycmFuZ2UoZGVzYyhtZWFuX2FnZSkpCmBgYAoKIyMjIyBTdGVwIDEwLiDlr4bluqbliIbluIPjgrDjg6njg5XjgpLmm7jjgYTjgabjgb/jgovjgIJ7LX0KCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygxOTcwLCAxOTkwLCAyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMobWVhbl9hZ2UsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKyAKIyAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IHNjYWxlczo6cGVyY2VudF9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKwojICBjb29yZF9jYXJ0ZXNpYW4oeGxpbT1jKDIwLDQwKSkgKyAKICBsYWJzKHRpdGxlPSJNZWFuIGFnZSBhdCBjaGlsZGJlYXJpbmciLCBmaWxsID0gInllYXIiKQpgYGAKYGBge3J9CmRmX3VuX2ZlcnRpbGl0eSAlPiUgZHJvcF9uYShtZWFuX2FnZSkgJT4lIGdyb3VwX2J5KHllYXIpICU+JSBzdW1tYXJpc2Uobj1uKCkpICU+JSBhcnJhbmdlKGRlc2MobikpCmBgYAoKCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygxOTcwLCAxOTg1LCAxOTk1LCAyMDA1LCAyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMobWVhbl9hZ2UsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuMykgKyAKICBsYWJzKHRpdGxlPSJNZWFuIGFnZSBhdCBjaGlsZGJlYXJpbmciLCBmaWxsID0gInllYXIiKQpgYGAKYGBge3J9CmRmX3VuX2ZlcnRpbGl0eSAlPiUgZmlsdGVyKHllYXIgJWluJSBjKDE5NzAsIDE5ODUsMTk5NSwgMjAwNSwyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMobWVhbl9hZ2UsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKyBmYWNldF93cmFwKH4gZmFjdG9yKHllYXIpKSArCiAgbGFicyh0aXRsZT0iTWVhbiBhZ2UgYXQgY2hpbGRiZWFyaW5nIiwgZmlsbCA9ICJ5ZWFyIikKYGBgCgojIyMjIDExLiDlh7rnlJ/njofjga7ooajjgpLmmIfpoIbjgavopovjgabjgb/jgovjgIJ7LX0KCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIAogIGZpbHRlcih5ZWFyICVpbiUgYygyMDEwKSkgJT4lIHNlbGVjdChjb3VudHJ5LCBmZXJ0aWxpdHlfcmF0ZSkgJT4lIAogIGRyb3BfbmEoZmVydGlsaXR5X3JhdGUpICU+JQogIGFycmFuZ2UoZmVydGlsaXR5X3JhdGUpCmBgYAoKIyMjIyBTdGVwIDEyLiDlr4bluqbliIbluIPjgrDjg6njg5XjgpLmm7jjgYTjgabjgb/jgovjgIJ7LX0KCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygxOTcwLCAxOTkwLCAyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMoZmVydGlsaXR5X3JhdGUsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKyAKICBsYWJzKHRpdGxlPSJUb3RhbCBmZXJ0aWxpdHkiLCBmaWxsID0gInllYXIiKQpgYGAKCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGRyb3BfbmEoZmVydGlsaXR5X3JhdGUpICU+JSBncm91cF9ieSh5ZWFyKSAlPiUgc3VtbWFyaXNlKG49bigpKSAlPiUgYXJyYW5nZShkZXNjKG4pKQpgYGAKCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygxOTcwLCAxOTg1LCAxOTk1LCAyMDA1LCAyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMoZmVydGlsaXR5X3JhdGUsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKyAKICBsYWJzKHRpdGxlPSJUb3RhbCBmZXJ0aWxpdHkiLCBmaWxsID0gInllYXIiKQpgYGAKCmBgYHtyfQpkZl91bl9mZXJ0aWxpdHkgJT4lIGZpbHRlcih5ZWFyICVpbiUgYygxOTcwLCAxOTg1LCAxOTk1LCAyMDA1LCAyMDEwKSkgJT4lIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BfbmEobWVhbl9hZ2UpICU+JQogIGdncGxvdChhZXMoZmVydGlsaXR5X3JhdGUsIGZpbGwgPSBmYWN0b3IoeWVhcikpKSArIGdlb21fZGVuc2l0eShhbHBoYSA9IDAuNSkgKyBmYWNldF93cmFwKH4gZmFjdG9yKHllYXIpKSArCiAgbGFicyh0aXRsZT0iVG90YWwgZmVydGlsaXR5IiwgZmlsbCA9ICJ5ZWFyIikKYGBgCgojIyMjIOWPguiAg+S+i++8ke+8mldvcmxkIEluZXF1YWxpdHkgUmVwb3J0IDIwMjIKCldJUjIwMjI6IGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2RhdGEtYW5hbHlzaXMvd2lyMjAyMi5uYi5odG1sCgojIyMjIOWPguiAg+S+i++8kjrlrabmoKHnqK7poZ7liKXpgLLlrabnjofjga7mjqjnp7so5pel5pys6Kqe44OH44O844K/KQoKW+eUt+Wls+WFseWQjOWPgueUu+WxgF0oaHR0cHM6Ly93d3cuZ2VuZGVyLmdvLmpwKeOBruizh+aWmeOBp+OBmeOAggoK5a2m5qCh56iu6aGe5Yil6YCy5a2m546H44Gu5o6o56e7OiBodHRwczovL2VtcG93ZXJtZW50LnRzdWRhLmFjLmpwL2RldGFpbC84MjU4NAoKYGBge3J9CnVybF9zY2hvb2xfanAgPC0gImh0dHBzOi8vd3d3LmdlbmRlci5nby5qcC9hYm91dF9kYW5qby93aGl0ZXBhcGVyL3IwMi96ZW50YWkvaHRtbC9ob25wZW4vY3N2L3p1aHlvMDEtMDQtMDEuY3N2IgpgYGAKCuOCqOODs+OCs+ODvOODh+OCo+ODs+OCsO+8iEVuY29kaW5nIHR5cGXvvInjgpLmjqjmuKzjgZnjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgIIKCmBgYHtyfQpndWVzc19lbmNvZGluZyh1cmxfc2Nob29sX2pwLCBuX21heCA9IDEwMDAwLCB0aHJlc2hvbGQgPSAwLjIpCmBgYAoKCmBgYHtyfQpkZl9zY2hvb2xfanAgPC0gcmVhZF9jc3YodXJsX3NjaG9vbF9qcCwgbG9jYWxlID0gbG9jYWxlKGVuY29kaW5nID0gIlNoaWZ0X0pJUyIpLCBza2lwPTIpCmRmX3NjaG9vbF9qcCAKYGBgCgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpkZl9lZHUwIDwtIGRmX3NjaG9vbF9qcCAKY29sbmFtZXMoZGZfZWR1MCkgPC0gYygieWVhciIsICJoaWdoc2Nob29sX20iLCAiaGlnaHNjaG9vbF9mIiwgInZvY2F0aW9uYWxfbSIsICJ2b2NhdGlvbmFsX2YiLCAidW5pdmVyc2l0eV9tIiwgInVuaXZlcnNpdHlfZiIsICJqdW5pb3Jjb2xsZWdlX2YiLCAiZ3JhZHNjaG9vbF9tIiwgImdyYWRzY2hvb2xfZiIpCmRmX2VkdTAwIDwtIGRmX2VkdTAgJT4lIG11dGF0ZSh5ZWFyID0gMTk1MDoyMDE5LCAKICAgICAgICAgICAgICAgICAgIGhpZ2hzY2hvb2wgPSAoaGlnaHNjaG9vbF9tICsgaGlnaHNjaG9vbF9mKS8yLAogICAgICAgICAgICAgICAgICAgdm9jYXRpb25hbCA9ICh2b2NhdGlvbmFsX20gKyB2b2NhdGlvbmFsX2YpLzIsCiAgICAgICAgICAgICAgICAgICB1bml2ZXJzaXR5ID0gKHVuaXZlcnNpdHlfbSArIHVuaXZlcnNpdHlfZikvMiwgCiAgICAgICAgICAgICAgICAgICBqdW5pb3Jjb2xsZWdlID0ganVuaW9yY29sbGVnZV9mLAogICAgICAgICAgICAgICAgICAgZ3JhZHNjaG9vbCA9IChncmFkc2Nob29sX20gKyBncmFkc2Nob29sX2YpLzIpIApkZl9lZHUwMCAlPiUgZmlsdGVyKHllYXIgPj0gMTk1NCkgJT4lIHNlbGVjdCgtKDI6MTApKSAlPiUgCiAgcGl2b3RfbG9uZ2VyKDM6NSwgbmFtZXNfdG8gPSAic2Nob29scyIsIHZhbHVlc190byA9ICJwZXJjZW50YWdlIikgJT4lCiAgbXV0YXRlKHR5cGVzID0gZmFjdG9yKHNjaG9vbHMsIGxldmVscyA9IGMoInZvY2F0aW9uYWwiLCAianVuaW9yY29sbGVnZSIsICJ1bml2ZXJzaXR5IikpKSAlPiUKICBwaXZvdF9sb25nZXIoYyhoaWdoc2Nob29sLCBncmFkc2Nob29sKSwgbmFtZXNfdG8gPSAiaGlnaGdyYWQiLCB2YWx1ZXNfdG8gPSJ2YWx1ZSIpICU+JQogIG11dGF0ZShoaWdoX2dyYWQgPSBmYWN0b3IoaGlnaGdyYWQsIGxldmVscyA9IGMoImhpZ2hzY2hvb2wiLCAiZ3JhZHNjaG9vbCIpKSkgJT4lCiAgZ2dwbG90KCkgKwogIGdlb21fYXJlYShhZXMoeCA9IHllYXIsIHkgPSBwZXJjZW50YWdlLCBmaWxsID0gdHlwZXMpKSArCiAgZ2VvbV9saW5lKGFlcyh4ID0geWVhciwgeSA9IHZhbHVlLCBsaW5ldHlwZSA9IGhpZ2hfZ3JhZCkpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHJvdW5kKHNlcSgxOTYwLCAyMDIwLCBieSA9MTApLDEpKSArIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSByb3VuZChzZXEoMCwgMTAwLCBieSA9MTApLDEpKSArIAogIGxhYnModGl0bGUgPSAiVGVydGlhbGx5IEVkdWNhdGlvbiBBZnRlciBIaWdoc2Nob29sIiwgCiAgICAgICBzdWJ0aXRsZSA9ICJ3aXRoIEhpZ2hzY2hvb2wgR3JhZHVhdGVzIGFuZCBHcmFkdWF0ZSBTY2hvb2wiLCAKICAgICAgIGZpbGwgPSAiIiwgbGluZXR5cGUgPSAiIikKYGBgCgoKIyMg77yI57aa77yJ5o6i57Si55qE44OH44O844K/6Kej5p6QIChFREEp44CACgohW2ltYWdlIGZyb20gcjRkc10oaHR0cHM6Ly9kMzN3dWJyZmtpMGw2OC5jbG91ZGZyb250Lm5ldC81NzFiMDU2NzU3ZDY4ZTZkZjgxYTNlMzg1M2Y1NGQzYzc2YWQ2ZWZjLzMyZDM3L2RpYWdyYW1zL2RhdGEtc2NpZW5jZS5wbmcpCgpOWS5HRFAuUENBUC5DRDogR0RQIHBlciBjYXBpdGEgKGN1cnJlbnQgVVMkKQoKYGBge3IgZXZhbD1GQUxTRX0KZGZfd2RpX2dkcHBjYXAgPC0gV0RJKGNvdW50cnkgPSAiYWxsIiwgaW5kaWNhdG9yID0gYyhnZHBfcGNhcCA9ICJOWS5HRFAuUENBUC5DRCIpKQp3cml0ZV9jc3YoZGZfd2RpX2dkcHBjYXAsICIuL2RhdGEvZGZfd2RpX2dkcHBjYXAuY3N2IikKYGBgCgpgYGB7cn0KZGZfd2RpX2dkcHBjYXAgPC0gcmVhZF9jc3YoIi4vZGF0YS9kZl93ZGlfZ2RwcGNhcC5jc3YiKQpgYGAKCmBgYHtyfQpkZl93ZGlfZ2RwcGNhcApgYGAKCiMjIyBEYXRhIFRyYW5zZm9ybWF0aW9uCgojIyMjIOWIl+OCkiBgc2VsZWN0YAoKYGBge3J9CmRmX3dkaV9nZHBwY2FwX3NtYWxsIDwtIGRmX3dkaV9nZHBwY2FwICU+JSAKICBzZWxlY3QoY291bnRyeSwgeWVhciwgZ2RwX3BjYXApCmRmX3dkaV9nZHBwY2FwX3NtYWxsCmBgYAoKIyMjIyDooYzjgpIgYGZpbHRlcmAKCmBgYHtyfQpkZl93ZGlfZ2RwcGNhcF9zaG9ydCA8LSBkZl93ZGlfZ2RwcGNhcCAlPiUgCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJKYXBhbiIsICJHZXJtYW55IiwgIlVuaXRlZCBTdGF0ZXMiKSkKZGZfd2RpX2dkcHBjYXBfc2hvcnQKYGBgCgpgYGB7cn0KZGZfd2RpX2dkcHBjYXBfc21hbGxfc2hvcnQgPC0gZGZfd2RpX2dkcHBjYXAgJT4lIHNlbGVjdChjb3VudHJ5LCB5ZWFyLCBnZHBfcGNhcCkgJT4lCiAgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJKYXBhbiIsICJHZXJtYW55IiwgIlVuaXRlZCBTdGF0ZXMiKSkKZGZfd2RpX2dkcHBjYXBfc21hbGxfc2hvcnQKYGBgCgrmrKHjga/jgIHjgojjgY/nlJ/jgZjjgovjgIHoqqTjgorjga7kvovjgafjgIHjg47jgrPjgq7jg6rjga7mra/vvIhzYXd0b290aGVk77yJ44Gu44KI44GG44Gq44Ku44K244Ku44K244O744Kw44Op44OV44Go5ZG844Gw44KM44G+44GZ44CC44Gq44Gc44GT44Gu44KI44GG44Gq44GT44Go44GM6LW344GN44Gm44GE44KL44GL44KP44GL44KK44G+44GZ44GL44CCCgpgYGB7cn0KZGZfd2RpX2dkcHBjYXBfc21hbGxfc2hvcnQgJT4lCiAgZ2dwbG90KGFlcyh4ID0geWVhciwgeSA9IGdkcF9wY2FwKSkgKyBnZW9tX2xpbmUoKQpgYGAKCmBgYHtyfQpkZl93ZGlfZ2RwcGNhcF9zbWFsbF9zaG9ydCAlPiUgZmlsdGVyKGNvdW50cnkgJWluJSBjKCJKYXBhbiIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwX3BjYXApKSArIGdlb21fbGluZSgpCmBgYAoKYGBge3J9CmRmX3dkaV9nZHBwY2FwX3NtYWxsX3Nob3J0ICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBnZHBfcGNhcCkpICsgZ2VvbV9wb2ludCgpCmBgYAoKYGBge3J9CmRmX3dkaV9nZHBwY2FwX3NtYWxsX3Nob3J0ICU+JSBkcm9wX25hKGdkcF9wY2FwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwX3BjYXAsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpCmBgYAoKYGBge3J9CmRmX3dkaV9nZHBwY2FwX3NtYWxsX3Nob3J0ICU+JSBkcm9wX25hKGdkcF9wY2FwKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSB5ZWFyLCB5ID0gZ2RwX3BjYXAsIGNvbCA9IGNvdW50cnkpKSArIGdlb21fbGluZSgpICsKICBnZW9tX3BvaW50KCkKYGBgCgpgYGB7cn0KZGZfd2RpX2dkcHBjYXBfc21hbGxfc2hvcnQgJT4lIGRyb3BfbmEoZ2RwX3BjYXApICU+JQogIGdncGxvdChhZXMoeCA9IHllYXIsIHkgPSBnZHBfcGNhcCkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBjb3VudHJ5KSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAnbG9lc3MnLCBmb3JtdWxhID0gJ3kgfiB4JykKYGBgCgojIOWPguiAgyAtIOS7iuW+jOOBruWtpue/kuOBruOBn+OCgeOBqwoKIyMgUk5vdGVib29rIOOBrua0u+eUqAoK5LiL44Gu44Oq44Oz44Kv44KS6ZaL44GN44CB5Y+z5LiK44GuIENvZGUg44Oc44K/44Oz44GL44KJ44CBRG93bmxvYWQgUm1kIOOCkumBuOaKnuOBmeOCi+OBqOOAgeODgOOCpuODs+ODreODvOODieOBp+OBjeOBvuOBmeOBi+OCieOAgeODgOOCpOODs+ODreODvOODieOBl+OBn+OCguOBruOCkuOAgeODl+ODreOCuOOCp+OCr+ODiOODu+ODleOCqeODvOODq+ODgOODvOOBq+enu+WLleOBvuOBn+OBr+OCs+ODlOODvOOBl+OBpuOBj+OBoOOBleOBhOOAguODgOOCpuODs+ODreODvOODieOBp+OBjeOBquOBhOOBqOOBjeOBr+OAgUN0cmwg44KS5oq844GX44Gq44GM44KJ44CBRG93bmxvYWQgUm1kIOOCkuOCr+ODquODg+OCr+OBmeOCi+OBqOOAgVNhdmUgQXMg44Gn5L+d5a2Y44Gn44GN44KL44Go5oCd44GE44G+44GZ44CC44OW44Op44Km44K244O844Gr44KI44Gj44Gm5LuV5qeY44GM55Ww44Gq44KK44G+44GZ44GL44KJ44CB6YGp5YiH44Gq5pa55rOV44KS6YG444KT44Gn44GP44Gg44GV44GE44CCCgotICAgPGh0dHBzOi8vZHMtc2wuZ2l0aHViLmlvL2ludHJvMnIvUk5vdGVib29rLUoubmIuaHRtbD4KLSAgIDxodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL1JtYXJrZG93bi1KLm5iLmh0bWw+CgpXaW5kb3dzIOOBp+OCguOAgU1hYyDjgafjgoLmj5DkvpvjgZXjgozjgabjgYTjgovjgIFHb29nbGUgQ2hyb21lIOOBruWgtOWQiOOBq+OBr+OAgUNvZGUg44Oc44K/44Oz44GL44KJ44CB44OA44Oz44Ot44O844OJ44GV44KM44KL44Gv44Ga44Gn44GZ44CCCgojIyDjgq/jg6njgqbjg4kgLSBQb3NpdCBDbG91ZAoKUlN0dWRpbyBDbG91ZOOBr+OAgeiqsOOBp+OCguOCquODs+ODqeOCpOODs+OBp+ODh+ODvOOCv+OCteOCpOOCqOODs+OCueOCkuihjOOBhOOAgeWFseacieOBl+OAgeaVmeOBiOOAgeWtpuOBtuOBk+OBqOOBjOOBp+OBjeOCi+OAgei7vemHj+OBp+OCr+ODqeOCpuODieODmeODvOOCueOBruOCveODquODpeODvOOCt+ODp+ODs+OBp+OBmeOAguaciDI15pmC6ZaT44Gu5Yi26ZmQ44GM44GC44KK44G+44GZ44GM44CB5YaF5a6544KS5YWx5pyJ44GX44Gm44CB5LuW44Gu44Ki44Kr44Km44Oz44OI44GL44KJ5Yip55So44GZ44KL44GT44Go44KC5Y+v6IO944Gn44GZ44CCCgojIyMg44Kv44Op44Km44OJ44K144O844OT44K544CASG93IHRvIFN0YXJ0IFBvc2l0IENsb3VkIHstfQoKMS4gIEdvIHRvIDxodHRwczovL3Bvc2l0LmNsb3VkLz4KMi4gIFNpZ24gVXA6IHRvcCByaWdodAozLiAgRW1haWwgYWRkcmVzcyBvciBHb29nbGUgYWNjb3VudAo0LiAgTmV3IFByb2plY3Q6IFByb2plY3QgTmFtZQoKIyMg57e057+S5ZWP6aGMIFBvc2l0IFByaW1lcnMKClBvc2l0IFByaW1lcnMgPGh0dHBzOi8vcG9zaXQuY2xvdWQvbGVhcm4vcHJpbWVycz4KCiMjIyDmnIDliJ3jga7mvJTnv5Igey19CgpNb29kbGXvvIgy5pyIMjLml6XvvInjgavjg6rjg7Pjgq/jgpLjgaTjgZHjgabjgYLjgorjgb7jgZnjgIIKCi0gICBbVmlzdWFsaXphdGlvbiBCYXNpY3NdKGh0dHBzOi8vcnN0dWRpby5jbG91ZC9sZWFybi9wcmltZXJzLzEuMSkKLSAgIFtQcm9ncmFtbWluZyBCYXNpY3NdKGh0dHBzOi8vcnN0dWRpby5jbG91ZC9sZWFybi9wcmltZXJzLzEuMikKCiMjIOWPguiAg+aWh+eMriBSZWZlcmVuY2VzCgotICAgUiBGb3IgRGF0YSBTY2llbmNlLCBieSBILiBXaWNraGFtOiA8aHR0cHM6Ly9yNGRzLmhhZC5jby5uej4KCiAgICAtICAgSW50cm9kdWN0aW9uOiA8aHR0cHM6Ly9yNGRzLmhhZC5jby5uei9leHBsb3JlLWludHJvLmh0bWwjZXhwbG9yZS1pbnRybz4KCi0gICBCb29rZG93bjogPGh0dHBzOi8vYm9va2Rvd24ub3JnPiwgW0FyY2hpdmVdKGh0dHBzOi8vYm9va2Rvd24ub3JnL2hvbWUvYXJjaGl2ZS8pCgotICAgW0dldCBTdGFydGVkOiBSIFN0dWRpbyDjgacgUiDjgpLjga/jgZjjgoHjgojjgYbjgIFSIE1hcmtkb3duXShodHRwczovL2RzLXNsLmdpdGh1Yi5pby9pbnRybzJyL2dldHN0YXJ0ZWQuaHRtbCkKCi0gICBbSW50cm9kdWN0b24gdG8gUl0oaHR0cHM6Ly9kcy1zbC5naXRodWIuaW8vaW50cm8yci9pbnRybzJyLm5iLmh0bWwjM19EYXRhX0FuYWx5c2lzX1VzaW5nX1JTdHVkaW8pCgotICAgW0RhdGEgQW5hbHlzaXMgZm9yIFJlc2VhcmNoZXJzIDIwMjJdKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RhNHIyMDIyLykKCi0gICBb44OH44O844K/44O744K144Kk44Ko44Oz44K544KS5aeL44KB44G+44GX44KH44GGIC0gRGF0YSBTY2llbmNlIGZvciBBbGxdKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RzNGFqLykKCiMgSVQg44OE44O844Or44Gr44Gk44GE44GmCgrjg6Ljg5DjgqTjg6vjgqLjg5fjg6rjgafjgoLjgIHjgZXjgb7jgZbjgb7jgavlj6/og73jgafjgZnjgYzjgIHmnaHku7bku5jjgY3oqrLph5HjgarjganjgIHjgqLjg5fjg6rjgavjgojjgaPjgabjgoLjgIHmqZ/nqK7jgavjgojjgaPjgabjgoLjgIHnlbDjgarjgovjga7jgafjgIHjgZPjgZPjgafjga/jgIFQQyDjgafjga7liKnnlKjjgavjgaTjgYTjgabmm7jjgY3jgb7jgZnjgIIKCiMjIFJTdHVkaW8g44G+44Gf44GvIFBvc2l0IFN0dWRpbyDjgacgUgoKLSBb44OH44O844K/44O744K144Kk44Ko44Oz44K544KS5aeL44KB44G+44GX44KH44GGIC0gRGF0YSBTY2llbmNlIGZvciBBbGxdKGh0dHBzOi8vaWN1LWhzdXp1a2kuZ2l0aHViLmlvL2RzNGFqLykKICAtIFtSU3R1ZGlvIOOBpyBSXShodHRwczovL2ljdS1oc3V6dWtpLmdpdGh1Yi5pby9kczRhai9yb25yc3R1ZGlvLmh0bWwjcm9ucnN0dWRpbykKICAKIyMgR29vZ2xlIENocm9tZSDjgafjga7oh6rli5Xnv7voqLMKCldpbmRvd3Mg44GuIEVkZ2Ug44KE44CBTWFjIOOBriBTYWZhcmkg44Gn44KC5Y+v6IO944Gn44GZ44CC57+76Kiz44Ko44Oz44K444Oz44GM55Ww44Gq44KL44Gu44Gn44CB5L2/44GE5Yud5omL44KC44GC44KK44G+44GZ44GM44CB44GE44GP44Gk44GL6Kmm44GX44Gm44CB6Ieq5YiG44Gu5aW944GN44Gq44CB5L+h6aC844Gn44GN44KL44CB57+76Kiz44Ko44Oz44K444Oz44KS5Yip55So44GZ44KL44Gu44GM44KI44GE44Go5oCd44GE44G+44GZ44CCCgojIyMg6Kit5a6aCgoxLiDkuIrjga7jg5Djg7zjga7kuIDnlarlj7PjgavjgYLjgovjgIHnuKbjgavjgarjgonjgpPjgaDkuInngrnjgYvjgonjgIHkuIDnlarkuIvjga7oqK3lrprjgpLpgbjmip4KMi4g5bem44Gu5biv44GL44KJ6KiA6Kqe44KS6YG45oqeCjMuIOWEquWFiOiogOiqnuOCkueiuuiqje+8muWFpeOBo+OBpuOBhOOBquOBkeOCjOOBsOOAgeaXpeacrOiqnuOBruOBpOOBjuOBq+OAgeiLseiqnuOCkuWFpeOCjOOCiwo0LiBHb29nbGUg57+76Kiz44KSIE9OIOOBq+OBmeOCiwo1LiDjgZPjga7oqIDoqp7jgavnv7voqLPjgZnjgovjgpLml6XmnKzoqp7jgasKNi4g57+76Kiz44GZ44KL44GL56K66KqN44GX44Gq44GE6KiA6Kqe44KS5pel5pys6Kqe44GrCgojIyMg5L2/44GE5pa5CgoxLiDmpJzntKLnqpPjga7nv7voqLPjg5zjgr/jg7PjgpLliKnnlKjjgILjgb7jgZ/jga/jgIHnv7voqLPjgajjgafjgZ/jgajjgY3jgavjgIHml6XmnKzoqp7jgpLpgbjmip7jgIIKMi4g6Iux6Kqe44Gr44KC44Gp44GX44Gf44GE44Go44GN44Gv44CB5ZCM44GY44Oc44K/44Oz44Gn5oi744GZ44CCCgojIyMg5Y+C6ICD44K144Kk44OICgpbQ2hyb21lIOOBruiogOiqnuOBruWkieabtOOBqOOCpuOCp+ODluODmuODvOOCuOOBrue/u+ios10oaHR0cHM6Ly9zdXBwb3J0Lmdvb2dsZS5jb20vY2hyb21lL2Fuc3dlci8xNzM0MjQ/aGw9amEmY289R0VOSUUuUGxhdGZvcm0lM0REZXNrdG9wKQoKCiMjIERlZXBMIOOBrua0u+eUqAoKIyMjIOOCteOCpOODiOOBp+OBrue/u+ioswoKKiBb44K144Kk44OIXShodHRwczovL3d3dy5kZWVwbC5jb20vamEvdHJhbnNsYXRvcikKCiMjIyDjgqLjg5fjg6rjgpLkvb/jgaPjgabjga7nv7voqLMKCiogRGVlcEwg44Gu44K144Kk44OI44Gu44Oh44OL44Ol44O844GL44KJ44Ki44OX44Oq44KS6YG45oqe44G+44Gf44GvCiogW+OCouODl+ODql0oaHR0cHM6Ly93d3cuZGVlcGwuY29tL2phL2FwcC8pCgrkuIrjgYvjgonjg4Djgqbjg7Pjg63jg7zjg4njgZfjgabjgqTjg7Pjgrnjg4jjg7zjg6vjgZfjgb7jgZnjgIIKCiog44K344On44O844OI44Kr44OD44OI44Kt44O844GM5L6/5Yip44Gn44GZ44CCCiAgMS4g44Ki44OX44Oq44KS6LW35YuV44GZ44KLCiAgMi4g57+76Kiz44GX44Gf44GE566H5omA44KS6YG45oqeCiAgMy4gV2luZG93cyDjga/jgIFDdHJsICsgQyArIEMgKOOCs+ODs+ODiOODreODvOODq+OCkuaKvOOBl+OBquOBjOOCiSBDIOOCkjLlm54p44CBTWFjIOOBr+OAgUNvbW1hbmQg77yLQyArIEMg77yI5Yid5pyf6Kit5a6a44Gn44GT44Gu5qmf6IO944GM6Kit5a6a44GV44KM44Gm44GE44KL44Go5oCd44GE44G+44GZ77yJCiAgNC4gMyDjgYzmqZ/og73jgZfjgarjgYTmmYLjga/jgIHlt6bkuIrjga7jgIHjg6Hjg4vjg6Xjg7zjgYvjgonoqK3lrprjgpLpgbjmip7jgILjgrfjg6fjg7zjg4jjgqvjg4Pjg4jjgq3jg7zjga7oqK3lrprjgpIgT04KCgojIyBDaGF0IEdQVAoKKiBb44K144Kk44OIXShodHRwczovL29wZW5haS5jb20vYmxvZy9jaGF0Z3B0KQoKMS4gVHJ5IENoYXRHUFQg44KS44Kv44Oq44OD44KvCjIuIOS6uumWk+OBp+OBguOCi+OBk+OBqOOCkueiuuiqjQozLiDjgrXjgqTjg7PjgqLjg4Pjg5cKNC4g44Oh44O844Or44Ki44OJ44Os44K544Go44CB44OR44K544Ov44O844OJ44KS6Kit5a6aCjUuIOODkeOCveOCs+ODs+OBi+OCieOBoOOBqOOAgVNob3J0IE1lc3NhZ2Ug44KS5Y+X44GR5Y+W44KM44KL5pC65biv6Zu76Kmx5oOF5aCx44KS6IGe44GL44KM44G+44GZ4oCZCiAgLSDjgqLjgqvjgqbjg7Pjg4jkvZzmiJDjga7jgb/jgIHmkLrluK/pm7voqbHjgYvjgonjgZnjgovjgajjgIHjgrnjg4bjg4Pjg5fjgYzkuIDjgaTmuJvjgorjgb7jgZkKNi4g44Ot44Kw44Kk44Oz44GX44Gm5Yip55SoCgoqIENoYXRHUFQg44KS44CBR29vZ2xlIENocm9tZSDjgarjganjga7jgIHjgqTjg7Pjgr/jg7zjg43jg4Pjg4jjg5bjg6njgqbjgrbjg7zjga7mqZ/og73mi6HlvLXjgajjgZfjgabliqDjgYjjgovjgZPjgajjgoLlj6/og73jgafjgZnjgIIKICAtIFtHb29nbGUgQ2hyb21lIOOCteOCpOODiF0oaHR0cHM6Ly9jaHJvbWUuZ29vZ2xlLmNvbS93ZWJzdG9yZS9kZXRhaWwvY2hhdGdwdC1mb3ItZ29vZ2xlL2pnamFlYWNka29uYW9hZmVubGZra2ttYmFvcGtiaWxmP2hsPWphKQogIC0g44Gf44Gg44GX44CB5Yip55So44Gr44Gv44CBQ2hhdEdQVCDjgbjjga7jg63jgrDjgqTjg7PjgYzlv4XopoHjgafjgZkKCiog6LOq5ZWP44Gr6Zai44GX44Gm44Gv44CB44GL44Gq44KK44Gu56K65bqm44Gn55CG6Kej44GX44Gm44GE44KL44KI44GG44Gr5oCd44KP44KM44G+44GZ44CC6LOq5ZWP5YaF5a6544Gu5LiA6YOo44KS54Sh6KaW44GZ44KL44GT44Go44Gv5bCR44Gq44GE44KI44GG44Gr5oCd44KP44KM44G+44GZ44CCCiog6LOq5ZWP44Gu44GX44GL44Gf44CB562U44GI44Gu5YaF5a6544KS56K66KqN44GX44Gm44GE44GP57e057+S44GM5b+F6KaB44Gn44GZCiog5Z+65pys55qE44Gr44Gv44CBMjAyMeW5tDnmnIjjgb7jgafjga7mg4XloLHjgpLjgoLjgajjgavjgIHlv5znrZTjgZfjgb7jgZkKKiA156eS44G744Gp44Gn44CBNTAw5paH5a2X56iL5bqm44Gu44CB5b+c562U44KS44GZ44KL44Oi44OH44Or44Gr44Gq44Gj44Gm44GE44KL44Gf44KB44CB44Gd44Gu5p6g5YaF44Gn44CB6LOq5ZWP44Gr5a++44GX44Gm44KC44Gj44Go44KC6auY44GE6KmV5L6h5YCk44Gu562U44GI44KS6YG45oqe44GX44Gm44CB5b+c562U44GX44Gm44GE44KL44KI44GG44Gn44GZ44CCCiog56K66KqN44KS44GX44Gf44KK44CB44Gq44Gr44KS5qC55oug44Go44GX44Gm44GE44KL44GL44CB5qC55oug44Go44Gq44KL44K144Kk44OI44Gq44Gp44KS56K66KqN44GX44CB44KI44KK44CB56K65a6f44Gq5oOF5aCx44KS57We44KK6L6844G/44CB44GV44KJ44Gr44CB6LOq5ZWP44KS44GZ44KL44CBQ2hhdCDjgaDjgajjgYTjgYbjgZPjgajjgpLoqo3orZjjgZfjgabliKnnlKjjgZnjgovjgZPjgajjgYzlpKfliIfjgafjgZnjgIIKKiDkvZXjgavjgafjgoLnrZTjgYjjgovjgo/jgZHjgafjga/jgYLjgorjgb7jgZvjgpPjgYzjgIHkuI3norrlrp/jgarmg4XloLHjgoLlv5znrZTjgZnjgovjgZ/jgoHjgIHnorroqo3jgYzlv4XopoHjgafjgZnjgIIKKiDkurrplpPjgavjgoLjgIHjganjgpPjgaros6rllY/jgavjgoLljbPluqfjgavjgIHjgarjgpPjgonjgYvjga7mg4XloLHjgpLov5TjgZnjgIHnn6XorZjjgYzosYrjgYvjgarjgbLjgajjgoLjgYTjgb7jgZnjgYzjgIHlhoXlrrnjgYzjgIHjgZnjgbnjgabmraPjgZfjgYTjgo/jgZHjgafjga/jgYLjgorjgb7jgZvjgpPjgILjgZ3jga7jgojjgYbjgavjgIHjgYLjgovnqIvluqbovrvopITjgYzlkIjjgaPjgabjgYTjgovlhoXlrrnjgpLjgIHjgZnjgZDnrZTjgYjjgonjgozjgovjgZPjgajjgavjgIHpqZrjgYvjgZXjgozjgovjgajjgYTjgYbjgZPjgajjgafjgZfjgofjgYbjgYvjgIIKCiMjIFBlcnBsZXhpdHkKCiogW+OCteOCpOODiF0oaHR0cHM6Ly93d3cucGVycGxleGl0eS5haSkKKiDmpJzntKLnqpPjgavjgIExMjjmloflrZfjgb7jgafjga7mpJzntKLoqp7jgIHos6rllY/jgarjganjgpLlhaXjgozjgovjgajjgIHmg4XloLHjga7jgYLjgovjgZXjgYTjgajjgpLjgbXjgY/jgoHjgabjgIHmlZnjgYjjgabjgY/jgozjgb7jgZnjgIIKKiDmpJzntKLoqp7jgoTjgIHos6rllY/jga7mm7jjgY3mlrnjgoLnt7Tnv5LjgZnjgovlv4XopoHjgYzjgYLjgorjgb7jgZnjgIIKCgoKCgo=