0.はじめに
この資料は「大学評価・IR担当者集会2019(R24 IR実務担当者セッション)」にて西山が発表予定の「R言語を用いた教学IRデータの分析と可視化」の補助資料です.
この資料はR言語のレポーティングパッケージであるRmarkdownを使用して作られています.背景が黒色の部分はRscriptとなっており,これを実行して得られた結果がその下に表示されてます.
また,この資料にあるRscriptはtidyverseパッケージにある関数を使用して書かれています.Rの記法にはBase関数によるものと,Hadley Wickhamを筆頭とするRstudioのチームによって開発されたtidyverseがありますが,後者の方がデータを直感的に扱うことができ,SQLなどのデータベース言語とも似ているため使いやすいと思います.もし,Rに関する書籍や,web上にあるTipsを参照する際にはこのことを念頭において見るようにしてください.
まず最初に使用するパッケージを呼び出します.
これらのパッケージがインストールされていない場合には,事前にインストールを行ってください.
1.データの確認と前処理(初級者向け)
それではまず使用するデータを確認します.
使用するデータは「3.疑似データの作成」の部分にで発生させた疑似データです.疑似データの生成はやや複雑なコードを必要としますので,R言語に初めて触れる方や初級者の方についてはその過程は一度無視して,ここからのドキュメントを見てください.まずはデータセットその内容を確認します.
使用するデータは“dat”というオブジェクトに格納されています.
1−1.データセットの確認
## GPA credit grade school department sID
## 1 3.655970 39.33727 1 法学部 国際法学科 法国1-1
## 2 1.080138 24.95090 1 情報学部 人間情報学科 情人1-2
## 3 2.123896 27.62155 1 農学部 環境保全学科 農環1-3
## 4 3.276074 25.15632 1 人間科学部 心理学科 人心1-4
## 5 1.363549 21.01430 1 情報学部 応用情報学科 情応1-5
## 6 1.912534 26.47703 1 人文学部 言語学科 人言1-6
これをみると,GPA,credit,grade,school,department,sIDという6つの列にデータが格納させていることがわかります.(creditは修得単位数,schoolは学部,departmentは学科,sIDは学籍番号としてデータを生成しています)
それではもう少し詳しく見ていきます.
## 'data.frame': 12000 obs. of 6 variables:
## $ GPA : num 3.66 1.08 2.12 3.28 1.36 ...
## $ credit : num 39.3 25 27.6 25.2 21 ...
## $ grade : num 1 1 1 1 1 1 1 1 1 1 ...
## $ school : chr "法学部" "情報学部" "農学部" "人間科学部" ...
## $ department: chr "国際法学科" "人間情報学科" "環境保全学科" "心理学科" ...
## $ sID : chr "法国1-1" "情人1-2" "農環1-3" "人心1-4" ...
まずstr()の結果です,12000行6列のデータフレームであることがわかります.また,GPAはnumericつまり数値としてデータが格納されています.creditとgradeはintegerつまり整数値,schoolとdepartment,sIDはcharactorつまり文字列として格納されています.
## GPA credit grade school
## Min. :0.004584 Min. : 0.4743 Min. :1.00 Length:12000
## 1st Qu.:1.701858 1st Qu.: 35.9624 1st Qu.:1.75 Class :character
## Median :2.289248 Median : 67.0436 Median :2.50 Mode :character
## Mean :2.247746 Mean : 70.8189 Mean :2.50
## 3rd Qu.:2.831419 3rd Qu.:100.6758 3rd Qu.:3.25
## Max. :3.999394 Max. :159.9896 Max. :4.00
## department sID
## Length:12000 Length:12000
## Class :character Class :character
## Mode :character Mode :character
##
##
##
つづいてsummary()の結果はそれぞれの変数ごとに,最小値,1/4位点,中央値,平均値,3/4位点,最大値が表示されます.また文字列などの計算が出来ない変数については属性とデータ数が表示されます.
1−2.グループごとのGPA順位(ランク)の計算
データの構造等が把握できたので,早速ですがGPA順位の計算に移ります.
文部科学省から出されている修学支援新制度の支援打切りや警告に関する基準の内,「GPA(平均成績)等が下位1/4に属すること」という基準があります.よって特定のグループ内でGPAの順位づけをする必要があります.
まずは,学部,学年の2要因で計算してみます.
| 3.655970 |
39.33727 |
1 |
法学部 |
国際法学科 |
法国1-1 |
0.9690367 |
| 1.080138 |
24.95090 |
1 |
情報学部 |
人間情報学科 |
情人1-2 |
0.0659898 |
| 2.123896 |
27.62155 |
1 |
農学部 |
環境保全学科 |
農環1-3 |
0.4115226 |
| 3.276074 |
25.15632 |
1 |
人間科学部 |
心理学科 |
人心1-4 |
0.8782609 |
| 1.363549 |
21.01430 |
1 |
情報学部 |
応用情報学科 |
情応1-5 |
0.1370558 |
| 1.912534 |
26.47703 |
1 |
人文学部 |
言語学科 |
人言1-6 |
0.3571429 |
結果は上の通りです.必要なコードはたったこれだけです.
実場面ではカリキュラムと学年ごとにこれを計算する必要があるため,次は学部,学科,学年の3要因で計算してみます.
| 3.655970 |
39.33727 |
1 |
法学部 |
国際法学科 |
法国1-1 |
0.9729730 |
| 1.080138 |
24.95090 |
1 |
情報学部 |
人間情報学科 |
情人1-2 |
0.0550459 |
| 2.123896 |
27.62155 |
1 |
農学部 |
環境保全学科 |
農環1-3 |
0.4000000 |
| 3.276074 |
25.15632 |
1 |
人間科学部 |
心理学科 |
人心1-4 |
0.8205128 |
| 1.363549 |
21.01430 |
1 |
情報学部 |
応用情報学科 |
情応1-5 |
0.1149425 |
| 1.912534 |
26.47703 |
1 |
人文学部 |
言語学科 |
人言1-6 |
0.3739837 |
結果は上記のとおりです.一つ前のコードからgroup_by()の中にdepartmentを追加しただけです.
このようにR言語ではこうしたデータの前処理がとても簡単に,そして高速に実行できます.
1−3.前処理済みデータの保存
以上のようにGPAの順位を計算出来たので,処理した結果を新たなオブジェクトに保存します.ここでは“dat_2”という名前に格納しておきます.
また,作成したデータセットをファイル出力することも可能です.
1−4.境界線スコアの算出と保存
上の例では各グループごとのGPA順位を全データが格納されているデータテーブルに列として追加し,保存までしました.
しかし,グループごとの統計量を求められることもありますし,次項から説明する可視化のコードを書く際にも,グループごとの統計量テーブルがあると便利なので,この章の最後にこれを作成しておきます.
このままだと見にくいので,ヘッダー名を変えたり,基データから必要情報をくっつけたりして,データを整えます
#統計量テーブルの作成
dat_2 %>%
mutate(war = if_else(GPARank<=0.25,1,0)) %>%
group_by(school,grade) %>%
summarize(サンプルサイズ= n(),
GPA警告対象者= sum(war),
年度内GPAの平均値=mean(GPA),
年度内GPAの標準偏差=sd(GPA),
累積修得単位の平均値=mean(credit),
累積修得単位の標準偏差=sd(credit)) %>%
left_join(GPA_sep %>% filter(GPA_ec=="(1)上位1/2") %>% select(school,grade,GPA_upper),
by = c("school","grade")) %>% rename("GPA上位1/2境界スコア" = GPA_upper) %>%
left_join(GPA_sep %>% filter(GPA_ec=="(2)下位1/4") %>% select(school,grade,GPA_under),
by = c("school","grade")) %>% rename("GPA下位1/4境界スコア" = GPA_under) -> result
結果をresult変数に格納しました.中身は↓
DTパッケージのdatatable関数でインタラクティブな表を作成しています.
内容を確かめたら,csvファイルで保存しておきます.文科省への提出書類で使ったりすることが出来るかと思います.
データの前処理はここまでです.細かい部分はRでやらなくてもOKです.ただ,グルーピングと順位の計算はRでの処理が圧倒的に楽です.
2.データの可視化(中級者向け)
2−1.ヒストグラム
ここからは,一章で作成したデータを可視化します.文部科学省から示された参考例ではじょうごグラフが使用されていましたが,連続値の分布を確認する場合,通常はヒストグラムを使用します.
これを作成するには一章で前処理したデータすら必要ありません.基データであるdat変数を使用して書いてみます.



ここに1/4線を引いてやれば,分布と境界線の可視化はOKになります.
2−2.散布図
しかし,高等教育の修学支援新制度には,GPAの下位1/4の警告要件の他に,標準単位数の5割以下で打切り,6割以下で警告という要件もあります.また,在学生採用にはGPAの上位1/2という要件もあるので,これらの基準値を念頭に,GPAと修得単位数の二変数を用いて,散布図を書いてみます.
2−2−1.1年次のGPAと取得単位数の分布と基準点(散布図)
##1年次
dat_2 %>%
filter(grade==1) %>%
ggplot(aes(GPA, credit))+
geom_point(size = 1)+
geom_vline(data = GPA_sep %>% filter(grade==1 & GPA_ec=="(1)上位1/2"),
mapping = aes(xintercept = GPA_upper), linetype="twodash", color="green")+
geom_vline(data = GPA_sep %>% filter(grade==1 & GPA_ec=="(2)下位1/4"),
mapping = aes(xintercept = GPA_under), linetype="dashed", color="blue")+
geom_hline(yintercept = ((124/4)*1)*0.6, linetype="dashed", color = "blue")+
geom_hline(yintercept = ((124/4)*1)*0.5, linetype="solid", color = "red")+
facet_wrap(~school,nrow = 5, ncol = 4)+
ggtitle("2018年度 1年次")+xlab("年度内GPA")+ylab("修得単位数")+
labs(caption = "赤実線:支援打ち切り,青点線:警告,緑ダッシュ:GPA1/2")+
theme_gray (base_family = "HiraKakuPro-W3")

2−2−2.2年次のGPAと取得単位数の分布と基準点(散布図)
##2年次
dat_2 %>%
filter(grade==2) %>%
ggplot(aes(GPA, credit))+
geom_point(size = 1)+
geom_vline(data = GPA_sep %>% filter(grade==2 & GPA_ec=="(1)上位1/2"),
mapping = aes(xintercept = GPA_upper), linetype="twodash", color="green")+
geom_vline(data = GPA_sep %>% filter(grade==2 & GPA_ec=="(2)下位1/4"),
mapping = aes(xintercept = GPA_under), linetype="dashed", color="blue")+
geom_hline(yintercept = ((124/4)*2)*0.6, linetype="dashed", color = "blue")+
geom_hline(yintercept = ((124/4)*2)*0.5, linetype="solid", color = "red")+
facet_wrap(~school,nrow = 5, ncol = 4)+
ggtitle("2018年度 2年次")+xlab("年度内GPA")+ylab("修得単位数")+
labs(caption = "赤実線:支援打ち切り,青点線:警告,緑ダッシュ:GPA1/2") +
theme_gray (base_family = "HiraKakuPro-W3")

2−2−3.3年次のGPAと取得単位数の分布と基準点(散布図)
##3年次
dat_2 %>%
filter(grade==3) %>%
ggplot(aes(GPA, credit))+
geom_point(size = 1)+
geom_vline(data = GPA_sep %>% filter(grade==3 & GPA_ec=="(1)上位1/2"),
mapping = aes(xintercept = GPA_upper), linetype="twodash", color="green")+
geom_vline(data = GPA_sep %>% filter(grade==3 & GPA_ec=="(2)下位1/4"),
mapping = aes(xintercept = GPA_under), linetype="dashed", color="blue")+
geom_hline(yintercept = ((124/4)*3)*0.6, linetype="dashed", color = "blue")+
geom_hline(yintercept = ((124/4)*3)*0.5, linetype="solid", color = "red")+
facet_wrap(~school,nrow = 5, ncol = 4)+
ggtitle("2018年度 3年次")+xlab("年度内GPA")+ylab("修得単位数")+
labs(caption = "赤実線:支援打ち切り,青点線:警告,緑ダッシュ:GPA1/2") +
theme_gray (base_family = "HiraKakuPro-W3")

2−2−4.4年次のGPAと取得単位数の分布と基準点(散布図)
##4年次
dat_2 %>%
filter(grade==4) %>%
ggplot(aes(GPA, credit))+
geom_point(size = 1)+
geom_vline(data = GPA_sep %>% filter(grade==4 & GPA_ec=="(1)上位1/2"),
mapping = aes(xintercept = GPA_upper), linetype="twodash", color="green")+
geom_vline(data = GPA_sep %>% filter(grade==4 & GPA_ec=="(2)下位1/4"),
mapping = aes(xintercept = GPA_under), linetype="dashed", color="blue")+
geom_hline(yintercept = ((124/4)*4)*0.6, linetype="dashed", color = "blue")+
geom_hline(yintercept = ((124/4)*4)*0.5, linetype="solid", color = "red")+
facet_wrap(~school,nrow = 5, ncol = 4)+
ggtitle("2018年度 4年次")+xlab("年度内GPA")+ylab("修得単位数")+
labs(caption = "赤実線:支援打ち切り,青点線:警告,緑ダッシュ:GPA1/2") +
theme_gray (base_family = "HiraKakuPro-W3")

これで,学部,学年ごとの可視化ができました.
R言語でデータ処理をすると,このように基データから前処理,統計処理,可視化,レポーティングまで,すべてRstudio上で行う事ができます.
加えて,このようなデータ処理はルーチンワークとして毎年行う必要がありますが,Rscriptとして保存しておくと,inputするデータを変えるだけで同じ処理を行うことができます.Excelで処理を行った場合,毎年グループ数×学年の処理が必要となり,業務量が増えるだけでなく,ヒューマンエラーの原因にもなります.
Rを使って業務の効率化を図り,データ処理の再生性を高めることは,大学事務組織にとって有益であると考えられます.
3.疑似データの生成(上級者向け)
以下は,上記1.2.で使用した疑似データの作成スクリプト
#ライブラリの読み込み
library(tidyverse) #tidyverseパッケージの読込
library(knitr) #knitrパッケージの読込
library(MASS) #MASSパッケージの読込
###擬似データの作成
#GPAの平均値と標準偏差(GPA疑似データのパラメタ)
gpa <- c(2.5,1)
#二変数間の相関係数(GPAと修得単位の相関係数を0.8に設定して,疑似データを発生させる)
r <- c(0.8)
#1~4年次の標準修得単位数とその標準偏差,CAPを1年40単位にそれぞれ設定
f <- c(31,10,40)
s <- c(62,20,80)
j <- c(93,30,120)
g <- c(124,30,160)
#GPAと修得単位の疑似データを学年ごとに作成
##1年次
# 平均値ベクタ
Mu <- c(gpa[1], f[1])
# 分散共分散行列
Si <- matrix(c(gpa[2]^2,
r*gpa[2]*f[2],
r*gpa[2]*f[2],
f[2]^2), ncol=2)
# 疑似データを1万サンプル生成(ガウス分布で)
dat <- mvrnorm(10000, Mu, Si)
#GPA範囲とCAP範囲でフィルタをかけて,3000人分のデータを保存
dat_1 <- data.frame(GPA=dat[,1], credit=dat[,2]) %>%
filter(GPA<=4 & GPA >=0 & credit <= f[3] & credit >=0) %>%
sample_n(size = 3000)
##2年次
# 平均値ベクタ
Mu <- c(gpa[1], s[1])
# 分散共分散行列
Si <- matrix(c(gpa[2]^2,
r*gpa[2]*s[2],
r*gpa[2]*s[2],
s[2]^2), ncol=2)
# 疑似データを1万サンプル生成(ガウス分布で)
dat <- mvrnorm(10000, Mu, Si)
#GPA範囲とCAP範囲でフィルタをかけて,3000人分のデータを保存
dat_2 <- data.frame(GPA=dat[,1], credit=dat[,2]) %>%
filter(GPA<=4 & GPA >=0 & credit <= s[3] & credit >=0) %>%
sample_n(size = 3000)
##3年次
# 平均値ベクタ
Mu <- c(gpa[1], j[1])
# 分散共分散行列
Si <- matrix(c(gpa[2]^2,
r*gpa[2]*j[2],
r*gpa[2]*j[2],
j[2]^2), ncol=2)
# 疑似データを1万サンプル生成(ガウス分布で)
dat <- mvrnorm(10000, Mu, Si)
#GPA範囲とCAP範囲でフィルタをかけて,3000人分のデータを保存
dat_3 <- data.frame(GPA=dat[,1], credit=dat[,2]) %>%
filter(GPA<=4 & GPA >=0 & credit <= j[3] & credit >=0) %>%
sample_n(size = 3000)
##4年次
# 平均値ベクタ
Mu <- c(gpa[1], g[1])
# 分散共分散行列
Si <- matrix(c(gpa[2]^2,
r*gpa[2]*g[2],
r*gpa[2]*g[2],
g[2]^2), ncol=2)
# 疑似データを1万サンプル生成(ガウス分布で)
dat <- mvrnorm(10000, Mu, Si)
#GPA範囲とCAP範囲でフィルタをかけて,3000人分のデータを保存
dat_4 <- data.frame(GPA=dat[,1], credit=dat[,2]) %>%
filter(GPA<=4 & GPA >=0 & credit <= g[3] & credit >=0) %>%
sample_n(size = 3000)
#dplyrの関数を邪魔することがあるので,MASSパッケージを無効にしておく
detach("package:MASS", unload=TRUE)
##データの確認
#1年次
dat_1 %>%
ggplot(aes(x = GPA, y = credit))+
geom_point()




##生成された疑似データに学年列を追加し,データを結合
rbind(
dat_1 %>% mutate(grade = 1),
dat_2 %>% mutate(grade = 2),
dat_3 %>% mutate(grade = 3),
dat_4 %>% mutate(grade = 4)
) -> dat
##学部名の文字列を作成
#7つの学部とそれぞれの学部定員が合計1.2万人になるように作成
school <- rep(c("人文学部", "情報学部", "工学部",
"社会科学部","農学部","法学部","人間科学部"),
times = c(2000,750,1250,
3000,1000,3500,500)) %>%
as.tibble() %>% rename(school = value) #列名をschoolに
##学科名の文字列を作成
#7つの学部の下に学科名を作成
department <- rep(c("哲学科", "言語学科", "歴史学科", "地理学科","芸術学科",
"人間情報学科","応用情報学科",
"機会工学科","建築学科","土木工学科",
"経済学科","経営学科","商学科","応用ファイナンス学科",
"森林学科","水産学科","環境保全学科",
"法律学科","政治学科","国際法学科","新領域法学科",
"心理学科","社会学科"),
times = c(300,500,500,500,200,
400,350,
500,500,250,
800,800,800,600,
300,300,400,
1000,800,1000,700,
150,350)) %>%
as.tibble() %>% rename(department = value) #列名をdepartmentに
##学部名と学科名のデータを結合して,ランダムに並べかえる
school <- cbind(school, department) %>%
mutate(no = rnorm(12000,10,5)) %>%
arrange(no) %>% select(-no)
##GPA情報・修得単位の疑似データと,学部・学科データを結合
dat <- cbind(dat, school)
##ダミーの学籍番号を追加
dat %>%
mutate(sID = str_c(str_sub(school,1,1),
str_sub(department,1,1),
grade,
"-",
row_number())) -> dat
##学部,学年ごとの統計量を確認
dat %>%
select(-sID) %>%
group_by(school, grade,department) %>%
summarise_all(funs(mean,sd)) %>% datatable(filter = "top",
extensions = 'Scroller', options = list(
deferRender = TRUE,
dom = "frtiS",
scrollY = 200,
scrollCollapse = TRUE
))
補助資料は以上で終了です.
ここに記載したプログラム等は2次利用していただいてOKです.ただし,実際の大学業務に使用する際には,自己責任でお願いします.プログラムを使用したことによる不利益等は責任を負いかねますので予めご了承ください.
また,不備等もあろうかと思いますので,ご質問等は西山(k.nis80[at]gmail.com)までお願いします.
LS0tCnRpdGxlOiAiUuiogOiqnuOCkueUqOOBhOOBn+aVmeWtpklS44OH44O844K/44Gu5YiG5p6Q44Go5Y+v6KaW5YyWX+ijnOWKqeizh+aWmSIKYXV0aG9yOiAi5bCC5L+u5aSn5a2m5pWZ5YuZ6Kqy44CA6KW/5bGx5oW25aSqIgpkYXRlOiAiV2VkIEp1bCAzMSAxNTo1NjoxOSAyMDE5IgpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIGNvZGVfZG93bmxvYWQ6IHllcwogICAgIyBjb2RlX2ZvbGRpbmc6IGhpZGUKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAgdGhlbWU6IGZsYXRseQogICAgdG9jOiB5ZXMKICAgIHRvY19mbG9hdDogeWVzCiAgd29yZF9kb2N1bWVudDoKICAgIHRvYzogeWVzCi0tLQpgYGB7ciBzZXR1cCwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0UsaW5jbHVkZT1GQUxTRX0KI2xpYnJhcnkodGlkeXZlcnNlKQojbGlicmFyeShrbml0cikKI2xpYnJhcnkoRFQpCiNsb2FkKCJkYXRhc2V0LlJEYXRhIikKI+azqOaEj++8ge+8ge+8muacrOadpeOBr+S4iuiomOOBrmxvYWTplqLmlbDjgafliY3lh6bnkIbmuIjjgb/jga7jg4fjg7zjgr/jgpLoqq3jgb/ovrzjgpPjgaDmlrnjgYzjgrPjg7zjg4njga/jgrnjg4Pjgq3jg6rjgZnjgovvvI4KI+OBl+OBi+OBl+OBk+OBrnJtZOODleOCoeOCpOODq+OBp+OBr+eWkeS8vOODh+ODvOOCv+OBrueUn+aIkOOCkuODieOCreODpeODoeODs+ODiOOBruacgOW+jOOBq+ioreWumuOBl+OBpuOBl+OBvuOBo+OBn+OBn+OCge+8jAoj44GT44GT44Gr4oCd77yT77yO55aR5Ly844OH44O844K/44Gu55Sf5oiQ77yI5LiK57Sa6ICF5ZCR44GR77yJIOKAneOBqOWQjOOBmOOCs+ODvOODieOCkue9ruOBhOOBpuOBiuOBj++8jgoj44GT44GG44GZ44KL44GT44Go44Gn77yMaHRtbOODleOCoeOCpOODq+OBruWPs+S4iumDqOOBruOCv+ODluOBi+OCiVJtZOODleOCoeOCpOODq+OCkuODgOOCpuODs+ODreODvOODieOBl++8jOWQhOiHquOBrlLnkrDlooPjgYvjgokKI+OBk+OBrue1kOaenOOCkuWujOWFqOOBq+WGjeeUn+WHuuadpeOCi+OCiOOBhuOBq+OBquOCi++8jgoj44KC44Gj44Go44K544Oe44O844OI44Gq5pa55rOV44GM44GC44KL44Go5oCd44KP44KM44KL44GM77yM5pmC6ZaT44GM44Gq44GP56eB44Gv44GT44GT44G+44Gn77yO6Kmz44GX44GE5Lq644GM44GE44Gf44KJ5pWZ44GI44Gm5LiL44GV44GECiPjg6njgqTjg5bjg6njg6rjga7oqq3jgb/ovrzjgb8KbGlicmFyeShEVCkKbGlicmFyeSh0aWR5dmVyc2UpICN0aWR5dmVyc2Xjg5Hjg4PjgrHjg7zjgrjjga7oqq3ovrwKbGlicmFyeShrbml0cikgI2tuaXRy44OR44OD44Kx44O844K444Gu6Kqt6L68CmxpYnJhcnkoTUFTUykJI01BU1Pjg5Hjg4PjgrHjg7zjgrjjga7oqq3ovrwKCgoKIyMj5pOs5Ly844OH44O844K/44Gu5L2c5oiQCiNHUEHjga7lubPlnYflgKTjgajmqJnmupblgY/lt67vvIhHUEHnlpHkvLzjg4fjg7zjgr/jga7jg5Hjg6njg6Hjgr/vvIkKZ3BhIDwtIGMoMi41LDEpCiPkuozlpInmlbDplpPjga7nm7jplqLkv4LmlbDvvIhHUEHjgajkv67lvpfljZjkvY3jga7nm7jplqLkv4LmlbDjgpIwLjjjgavoqK3lrprjgZfjgabvvIznlpHkvLzjg4fjg7zjgr/jgpLnmbrnlJ/jgZXjgZvjgovvvIkKciA8LSBjKDAuOCkKCiPvvJHvvZ7vvJTlubTmrKHjga7mqJnmupbkv67lvpfljZjkvY3mlbDjgajjgZ3jga7mqJnmupblgY/lt67vvIxDQVDjgpIx5bm0NDDljZjkvY3jgavjgZ3jgozjgZ7jgozoqK3lrpoKZiA8LSBjKDMxLDEwLDQwKQpzIDwtIGMoNjIsMjAsODApCmogPC0gYyg5MywzMCwxMjApCmcgPC0gYygxMjQsMzAsMTYwKQoKI0dQQeOBqOS/ruW+l+WNmOS9jeOBrueWkeS8vOODh+ODvOOCv+OCkuWtpuW5tOOBlOOBqOOBq+S9nOaIkAojI++8keW5tOasoQojIOW5s+Wdh+WApOODmeOCr+OCvwpNdSA8LSBjKGdwYVsxXSwgZlsxXSkJCiMg5YiG5pWj5YWx5YiG5pWj6KGM5YiXClNpIDwtIG1hdHJpeChjKGdwYVsyXV4yLAogICAgICAgICAgICAgICByKmdwYVsyXSpmWzJdLAogICAgICAgICAgICAgICByKmdwYVsyXSpmWzJdLAogICAgICAgICAgICAgICBmWzJdXjIpLCBuY29sPTIpCQoKIyDnlpHkvLzjg4fjg7zjgr/jgpIx5LiH44K144Oz44OX44Or55Sf5oiQ77yI44Ks44Km44K55YiG5biD44Gn77yJCmRhdCA8LSBtdnJub3JtKDEwMDAwLCBNdSwgU2kpCQoKI0dQQeevhOWbsuOBqENBUOevhOWbsuOBp+ODleOCo+ODq+OCv+OCkuOBi+OBkeOBpu+8jDMwMDDkurrliIbjga7jg4fjg7zjgr/jgpLkv53lrZgKZGF0XzEgPC0gZGF0YS5mcmFtZShHUEE9ZGF0WywxXSwgY3JlZGl0PWRhdFssMl0pICU+JSAKICBmaWx0ZXIoR1BBPD00ICYgR1BBID49MCAmIGNyZWRpdCA8PSBmWzNdICYgY3JlZGl0ID49MCkgJT4lIAogIHNhbXBsZV9uKHNpemUgPSAzMDAwKQkKCiMj77yS5bm05qyhCiMg5bmz5Z2H5YCk44OZ44Kv44K/Ck11IDwtIGMoZ3BhWzFdLCBzWzFdKQkKIyDliIbmlaPlhbHliIbmlaPooYzliJcKU2kgPC0gbWF0cml4KGMoZ3BhWzJdXjIsCiAgICAgICAgICAgICAgIHIqZ3BhWzJdKnNbMl0sCiAgICAgICAgICAgICAgIHIqZ3BhWzJdKnNbMl0sCiAgICAgICAgICAgICAgIHNbMl1eMiksIG5jb2w9MikJCiMg55aR5Ly844OH44O844K/44KSMeS4h+OCteODs+ODl+ODq+eUn+aIkO+8iOOCrOOCpuOCueWIhuW4g+OBp++8iQpkYXQgPC0gbXZybm9ybSgxMDAwMCwgTXUsIFNpKQkKI0dQQeevhOWbsuOBqENBUOevhOWbsuOBp+ODleOCo+ODq+OCv+OCkuOBi+OBkeOBpu+8jDMwMDDkurrliIbjga7jg4fjg7zjgr/jgpLkv53lrZgKZGF0XzIgPC0gZGF0YS5mcmFtZShHUEE9ZGF0WywxXSwgY3JlZGl0PWRhdFssMl0pICU+JSAKICBmaWx0ZXIoR1BBPD00ICYgR1BBID49MCAmIGNyZWRpdCA8PSBzWzNdICYgY3JlZGl0ID49MCkgJT4lIAogIHNhbXBsZV9uKHNpemUgPSAzMDAwKQkKCiMj77yT5bm05qyhCiMg5bmz5Z2H5YCk44OZ44Kv44K/Ck11IDwtIGMoZ3BhWzFdLCBqWzFdKQkKIyDliIbmlaPlhbHliIbmlaPooYzliJcKU2kgPC0gbWF0cml4KGMoZ3BhWzJdXjIsCiAgICAgICAgICAgICAgIHIqZ3BhWzJdKmpbMl0sCiAgICAgICAgICAgICAgIHIqZ3BhWzJdKmpbMl0sCiAgICAgICAgICAgICAgIGpbMl1eMiksIG5jb2w9MikJCgojIOeWkeS8vOODh+ODvOOCv+OCkjHkuIfjgrXjg7Pjg5fjg6vnlJ/miJDvvIjjgqzjgqbjgrnliIbluIPjgafvvIkKZGF0IDwtIG12cm5vcm0oMTAwMDAsIE11LCBTaSkKI0dQQeevhOWbsuOBqENBUOevhOWbsuOBp+ODleOCo+ODq+OCv+OCkuOBi+OBkeOBpu+8jDMwMDDkurrliIbjga7jg4fjg7zjgr/jgpLkv53lrZgKZGF0XzMgPC0gZGF0YS5mcmFtZShHUEE9ZGF0WywxXSwgY3JlZGl0PWRhdFssMl0pICU+JSAKICBmaWx0ZXIoR1BBPD00ICYgR1BBID49MCAmIGNyZWRpdCA8PSBqWzNdICYgY3JlZGl0ID49MCkgJT4lIAogIHNhbXBsZV9uKHNpemUgPSAzMDAwKQkKCiMj77yU5bm05qyhCiMg5bmz5Z2H5YCk44OZ44Kv44K/Ck11IDwtIGMoZ3BhWzFdLCBnWzFdKQkKIyDliIbmlaPlhbHliIbmlaPooYzliJcKU2kgPC0gbWF0cml4KGMoZ3BhWzJdXjIsCiAgICAgICAgICAgICAgIHIqZ3BhWzJdKmdbMl0sCiAgICAgICAgICAgICAgIHIqZ3BhWzJdKmdbMl0sCiAgICAgICAgICAgICAgIGdbMl1eMiksIG5jb2w9MikJCiMg55aR5Ly844OH44O844K/44KSMeS4h+OCteODs+ODl+ODq+eUn+aIkO+8iOOCrOOCpuOCueWIhuW4g+OBp++8iQpkYXQgPC0gbXZybm9ybSgxMDAwMCwgTXUsIFNpKQkKI0dQQeevhOWbsuOBqENBUOevhOWbsuOBp+ODleOCo+ODq+OCv+OCkuOBi+OBkeOBpu+8jDMwMDDkurrliIbjga7jg4fjg7zjgr/jgpLkv53lrZgKZGF0XzQgPC0gZGF0YS5mcmFtZShHUEE9ZGF0WywxXSwgY3JlZGl0PWRhdFssMl0pICU+JSAKICBmaWx0ZXIoR1BBPD00ICYgR1BBID49MCAmIGNyZWRpdCA8PSBnWzNdICYgY3JlZGl0ID49MCkgJT4lIAogIHNhbXBsZV9uKHNpemUgPSAzMDAwKQkKCiNkcGx5cuOBrumWouaVsOOCkumCqumtlOOBmeOCi+OBk+OBqOOBjOOBguOCi+OBruOBp++8jE1BU1Pjg5Hjg4PjgrHjg7zjgrjjgpLnhKHlirnjgavjgZfjgabjgYrjgY8KZGV0YWNoKCJwYWNrYWdlOk1BU1MiLCB1bmxvYWQ9VFJVRSkKCiMj44OH44O844K/44Gu56K66KqNCiMx5bm05qyhCmRhdF8xICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBHUEEsIHkgPSBjcmVkaXQpKSsKICBnZW9tX3BvaW50KCkKIzLlubTmrKEKZGF0XzIgJT4lIAogIGdncGxvdChhZXMoeCA9IEdQQSwgeSA9IGNyZWRpdCkpKwogIGdlb21fcG9pbnQoKQojM+W5tOasoQpkYXRfMyAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gR1BBLCB5ID0gY3JlZGl0KSkrCiAgZ2VvbV9wb2ludCgpCiM05bm05qyhCmRhdF80ICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBHUEEsIHkgPSBjcmVkaXQpKSsKICBnZW9tX3BvaW50KCkKCgojI+eUn+aIkOOBleOCjOOBn+eWkeS8vOODh+ODvOOCv+OBq+WtpuW5tOWIl+OCkui/veWKoOOBl++8jOODh+ODvOOCv+OCkue1kOWQiApyYmluZCgKICBkYXRfMSAlPiUgbXV0YXRlKGdyYWRlID0gMSksCiAgZGF0XzIgJT4lIG11dGF0ZShncmFkZSA9IDIpLAogIGRhdF8zICU+JSBtdXRhdGUoZ3JhZGUgPSAzKSwKICBkYXRfNCAlPiUgbXV0YXRlKGdyYWRlID0gNCkKKSAtPiBkYXQKCiMj5a2m6YOo5ZCN44Gu5paH5a2X5YiX44KS5L2c5oiQCiM344Gk44Gu5a2m6YOo44Go44Gd44KM44Ge44KM44Gu5a2m6YOo5a6a5ZOh44GM5ZCI6KiIMS4y5LiH5Lq644Gr44Gq44KL44KI44GG44Gr5L2c5oiQCnNjaG9vbCA8LSByZXAoYygi5Lq65paH5a2m6YOoIiwgIuaDheWgseWtpumDqCIsICLlt6Xlrabpg6giLAogICAgICAgICAgICAgICAgIuekvuS8muenkeWtpumDqCIsIui+suWtpumDqCIsIuazleWtpumDqCIsIuS6uumWk+enkeWtpumDqCIpLCAKICAgICAgICAgICAgICB0aW1lcyA9IGMoMjAwMCw3NTAsMTI1MCwKICAgICAgICAgICAgICAgICAgICAgICAgMzAwMCwxMDAwLDM1MDAsNTAwKSkgJT4lIAogIGFzLnRpYmJsZSgpICU+JSByZW5hbWUoc2Nob29sID0gdmFsdWUpICPliJflkI3jgpJzY2hvb2zjgasKCiMj5a2m56eR5ZCN44Gu5paH5a2X5YiX44KS5L2c5oiQCiPvvJfjgaTjga7lrabpg6jjga7kuIvjgavlrabnp5HlkI3jgpLkvZzmiJAKZGVwYXJ0bWVudCA8LSByZXAoYygi5ZOy5a2m56eRIiwgIuiogOiqnuWtpuenkSIsICLmrbTlj7Llrabnp5EiLCAi5Zyw55CG5a2m56eRIiwi6Iq46KGT5a2m56eRIiwKICAgICAgICAgICAgICAgICAgICAi5Lq66ZaT5oOF5aCx5a2m56eRIiwi5b+c55So5oOF5aCx5a2m56eRIiwKICAgICAgICAgICAgICAgICAgICAi5qmf5Lya5bel5a2m56eRIiwi5bu656+J5a2m56eRIiwi5Zyf5pyo5bel5a2m56eRIiwKICAgICAgICAgICAgICAgICAgICAi57WM5riI5a2m56eRIiwi57WM5Za25a2m56eRIiwi5ZWG5a2m56eRIiwi5b+c55So44OV44Kh44Kk44OK44Oz44K55a2m56eRIiwKICAgICAgICAgICAgICAgICAgICAi5qOu5p6X5a2m56eRIiwi5rC055Sj5a2m56eRIiwi55Kw5aKD5L+d5YWo5a2m56eRIiwKICAgICAgICAgICAgICAgICAgICAi5rOV5b6L5a2m56eRIiwi5pS/5rK75a2m56eRIiwi5Zu96Zqb5rOV5a2m56eRIiwi5paw6aCY5Z+f5rOV5a2m56eRIiwKICAgICAgICAgICAgICAgICAgICAi5b+D55CG5a2m56eRIiwi56S+5Lya5a2m56eRIiksIAogICAgICAgICAgICAgICAgICB0aW1lcyA9IGMoMzAwLDUwMCw1MDAsNTAwLDIwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMCwzNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAsNTAwLDI1MCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMCw4MDAsODAwLDYwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwMCwzMDAsNDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCw4MDAsMTAwMCw3MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTAsMzUwKSkgJT4lIAogIGFzLnRpYmJsZSgpICU+JSByZW5hbWUoZGVwYXJ0bWVudCA9IHZhbHVlKSAj5YiX5ZCN44KSZGVwYXJ0bWVudOOBqwoKIyPlrabpg6jlkI3jgajlrabnp5HlkI3jga7jg4fjg7zjgr/jgpLntZDlkIjjgZfjgabvvIzjg6njg7Pjg4Djg6DjgavkuKbjgbnjgYvjgYjjgosKc2Nob29sIDwtIGNiaW5kKHNjaG9vbCwgZGVwYXJ0bWVudCkgJT4lIAogIG11dGF0ZShubyA9IHJub3JtKDEyMDAwLDEwLDUpKSAlPiUgCiAgYXJyYW5nZShubykgJT4lIHNlbGVjdCgtbm8pCgojI0dQQeaDheWgseODu+S/ruW+l+WNmOS9jeOBrueWkeS8vOODh+ODvOOCv+OBqO+8jOWtpumDqOODu+WtpuenkeODh+ODvOOCv+OCkue1kOWQiApkYXQgPC0gY2JpbmQoZGF0LCBzY2hvb2wpCgojI+ODgOODn+ODvOOBruWtpuexjeeVquWPt+OCkui/veWKoApkYXQgJT4lIAogIG11dGF0ZShzSUQgPSBzdHJfYyhzdHJfc3ViKHNjaG9vbCwxLDEpLAogICAgICAgICAgICAgICAgICAgICBzdHJfc3ViKGRlcGFydG1lbnQsMSwxKSwKICAgICAgICAgICAgICAgICAgICAgZ3JhZGUsCiAgICAgICAgICAgICAgICAgICAgICItIiwKICAgICAgICAgICAgICAgICAgICAgcm93X251bWJlcigpKSkgLT4gZGF0CgojI+WtpumDqO+8jOWtpuW5tOOBlOOBqOOBrue1seioiOmHj+OCkueiuuiqjQpkYXQgJT4lIAogIHNlbGVjdCgtc0lEKSAlPiUgCiAgZ3JvdXBfYnkoc2Nob29sLCBncmFkZSxkZXBhcnRtZW50KSAlPiUgCiAgc3VtbWFyaXNlX2FsbChmdW5zKG1lYW4sc2QpKSAlPiUgZGF0YXRhYmxlKGZpbHRlciA9ICAidG9wIiwgCiAgICAgICAgICBleHRlbnNpb25zID0gJ1Njcm9sbGVyJywgb3B0aW9ucyA9IGxpc3QoCiAgZGVmZXJSZW5kZXIgPSBUUlVFLAogIGRvbSA9ICJmcnRpUyIsCiAgc2Nyb2xsWSA9IDIwMCwKICBzY3JvbGxDb2xsYXBzZSA9IFRSVUUKKSkKCmBgYAoKIyDvvJDvvI7jga/jgZjjgoHjgasgIArjgIDjgZPjga7os4fmlpnjga/jgIzlpKflraboqZXkvqHjg7tJUuaLheW9k+iAhembhuS8mjIwMTnvvIhSMjQgSVLlrp/li5nmi4XlvZPogIXjgrvjg4Pjgrfjg6fjg7PvvInjgI3jgavjgabopb/lsbHjgYznmbrooajkuojlrprjga7jgIxS6KiA6Kqe44KS55So44GE44Gf5pWZ5a2mSVLjg4fjg7zjgr/jga7liIbmnpDjgajlj6/oppbljJbjgI3jga7oo5zliqnos4fmlpnjgafjgZnvvI4gIArjgIDjgZPjga7os4fmlpnjga9S6KiA6Kqe44Gu44Os44Od44O844OG44Kj44Oz44Kw44OR44OD44Kx44O844K444Gn44GC44KLUm1hcmtkb3du44KS5L2/55So44GX44Gm5L2c44KJ44KM44Gm44GE44G+44GZ77yO6IOM5pmv44GM6buS6Imy44Gu6YOo5YiG44GvUnNjcmlwdOOBqOOBquOBo+OBpuOBiuOCiu+8jOOBk+OCjOOCkuWun+ihjOOBl+OBpuW+l+OCieOCjOOBn+e1kOaenOOBjOOBneOBruS4i+OBq+ihqOekuuOBleOCjOOBpuOBvuOBme+8jiAgCuOAgOOBvuOBn++8jOOBk+OBruizh+aWmeOBq+OBguOCi1JzY3JpcHTjga90aWR5dmVyc2Xjg5Hjg4PjgrHjg7zjgrjjgavjgYLjgovplqLmlbDjgpLkvb/nlKjjgZfjgabmm7jjgYvjgozjgabjgYTjgb7jgZnvvI5S44Gu6KiY5rOV44Gr44GvQmFzZemWouaVsOOBq+OCiOOCi+OCguOBruOBqO+8jEhhZGxleSBXaWNraGFt44KS562G6aCt44Go44GZ44KLUnN0dWRpb+OBruODgeODvOODoOOBq+OCiOOBo+OBpumWi+eZuuOBleOCjOOBn3RpZHl2ZXJzZeOBjOOBguOCiuOBvuOBmeOBjO+8jOW+jOiAheOBruaWueOBjOODh+ODvOOCv+OCkuebtOaEn+eahOOBq+aJseOBhuOBk+OBqOOBjOOBp+OBje+8jFNRTOOBquOBqeOBruODh+ODvOOCv+ODmeODvOOCueiogOiqnuOBqOOCguS8vOOBpuOBhOOCi+OBn+OCgeS9v+OBhOOChOOBmeOBhOOBqOaAneOBhOOBvuOBme+8juOCguOBl++8jFLjgavplqLjgZnjgovmm7jnsY3jgoTvvIx3ZWLkuIrjgavjgYLjgotUaXBz44KS5Y+C54Wn44GZ44KL6Zqb44Gr44Gv44GT44Gu44GT44Go44KS5b+16aCt44Gr44GK44GE44Gm6KaL44KL44KI44GG44Gr44GX44Gm44GP44Gg44GV44GE77yOICAK44CA44G+44Ga5pyA5Yid44Gr5L2/55So44GZ44KL44OR44OD44Kx44O844K444KS5ZG844Gz5Ye644GX44G+44GZ77yOCgpgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9CiN0aWR5dmVyc2Xjg5Hjg4PjgrHjg7zjgrjjga7lkbzjgbPlh7rjgZcKbGlicmFyeSh0aWR5dmVyc2UpCiNrbml0cuODkeODg+OCseODvOOCuOOBruWRvOOBs+WHuuOBlwpsaWJyYXJ5KGtuaXRyKQojRFTjg5Hjg4PjgrHjg7zjgrjjga7lkbzjgbPlh7rjgZcKbGlicmFyeShEVCkKYGBgCuOAgOOBk+OCjOOCieOBruODkeODg+OCseODvOOCuOOBjOOCpOODs+OCueODiOODvOODq+OBleOCjOOBpuOBhOOBquOBhOWgtOWQiOOBq+OBr++8jOS6i+WJjeOBq+OCpOODs+OCueODiOODvOODq+OCkuihjOOBo+OBpuOBj+OBoOOBleOBhO+8jgoKCiMg77yR77yO44OH44O844K/44Gu56K66KqN44Go5YmN5Yem55CG77yI5Yid57Sa6ICF5ZCR44GR77yJICAKCuOAgOOBneOCjOOBp+OBr+OBvuOBmuS9v+eUqOOBmeOCi+ODh+ODvOOCv+OCkueiuuiqjeOBl+OBvuOBme+8jiAgCuOAgOS9v+eUqOOBmeOCi+ODh+ODvOOCv+OBr+OAjO+8k++8jueWkeS8vOODh+ODvOOCv+OBruS9nOaIkOOAjeOBrumDqOWIhuOBq+OBp+eZuueUn+OBleOBm+OBn+eWkeS8vOODh+ODvOOCv+OBp+OBme+8jueWkeS8vOODh+ODvOOCv+OBrueUn+aIkOOBr+OChOOChOikh+mbkeOBquOCs+ODvOODieOCkuW/heimgeOBqOOBl+OBvuOBmeOBruOBp++8jFLoqIDoqp7jgavliJ3jgoHjgabop6bjgozjgovmlrnjgoTliJ3ntJrogIXjga7mlrnjgavjgaTjgYTjgabjga/jgZ3jga7pgY7nqIvjga/kuIDluqbnhKHoppbjgZfjgabvvIzjgZPjgZPjgYvjgonjga7jg4njgq3jg6Xjg6Hjg7Pjg4jjgpLopovjgabjgY/jgaDjgZXjgYTvvI7jgb7jgZrjga/jg4fjg7zjgr/jgrvjg4Pjg4jjgZ3jga7lhoXlrrnjgpLnorroqo3jgZfjgb7jgZnvvI4gIArjgIDkvb/nlKjjgZnjgovjg4fjg7zjgr/jga8iZGF0IuOBqOOBhOOBhuOCquODluOCuOOCp+OCr+ODiOOBq+agvOe0jeOBleOCjOOBpuOBhOOBvuOBme+8jiAgCgojIyDvvJHiiJLvvJHvvI7jg4fjg7zjgr/jgrvjg4Pjg4jjga7norroqo3jgIAKCmBgYHtyLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KI2RhdOOBruWFiOmgreihjOOCkuihqOekuuOBleOBm+OCiwpkYXQgJT4lIAogIGhlYWQoKQpgYGAK44CA44GT44KM44KS44G/44KL44Go77yMR1BB77yMY3JlZGl077yMZ3JhZGUsc2Nob29sLGRlcGFydG1lbnQsc0lE44Go44GE44GG77yW44Gk44Gu5YiX44Gr44OH44O844K/44GM5qC857SN44GV44Gb44Gm44GE44KL44GT44Go44GM44KP44GL44KK44G+44GZ77yO77yIY3JlZGl044Gv5L+u5b6X5Y2Y5L2N5pWw77yMc2Nob29s44Gv5a2m6YOo77yMZGVwYXJ0bWVudOOBr+Wtpuenke+8jHNJROOBr+WtpuexjeeVquWPt+OBqOOBl+OBpuODh+ODvOOCv+OCkueUn+aIkOOBl+OBpuOBhOOBvuOBme+8iSAgCuOAgOOBneOCjOOBp+OBr+OCguOBhuWwkeOBl+ips+OBl+OBj+imi+OBpuOBhOOBjeOBvuOBme+8jgoKYGBge3IsIGVycm9yPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFfQojZGF044Gu5qeL6YCg44KS44G/44KLCmRhdCAlPiUgCiAgc3RyKCkKYGBgCuOAgOOBvuOBmnN0cigp44Gu57WQ5p6c44Gn44GZ77yMMTIwMDDooYw25YiX44Gu44OH44O844K/44OV44Os44O844Og44Gn44GC44KL44GT44Go44GM44KP44GL44KK44G+44GZ77yO44G+44Gf77yMR1BB44GvbnVtZXJpY+OBpOOBvuOCiuaVsOWApOOBqOOBl+OBpuODh+ODvOOCv+OBjOagvOe0jeOBleOCjOOBpuOBhOOBvuOBme+8jmNyZWRpdOOBqGdyYWRl44GvaW50ZWdlcuOBpOOBvuOCiuaVtOaVsOWApO+8jHNjaG9vbOOBqGRlcGFydG1lbnTvvIxzSUTjga9jaGFyYWN0b3LjgaTjgb7jgormloflrZfliJfjgajjgZfjgabmoLzntI3jgZXjgozjgabjgYTjgb7jgZnvvI4gIArjgIAKYGBge3IsIGVycm9yPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFfQojZGF044Gu6KaB57SE57Wx6KiI6YeP44KS44G/44KLCmRhdCAlPiUgCiAgc3VtbWFyeSgpCmBgYArjgIDjgaTjgaXjgYTjgaZzdW1tYXJ5KCnjga7ntZDmnpzjga/jgZ3jgozjgZ7jgozjga7lpInmlbDjgZTjgajjgavvvIzmnIDlsI/lgKTvvIwxLzTkvY3ngrnvvIzkuK3lpK7lgKTvvIzlubPlnYflgKTvvIwzLzTkvY3ngrnvvIzmnIDlpKflgKTjgYzooajnpLrjgZXjgozjgb7jgZnvvI7jgb7jgZ/mloflrZfliJfjgarjganjga7oqIjnrpfjgYzlh7rmnaXjgarjgYTlpInmlbDjgavjgaTjgYTjgabjga/lsZ7mgKfjgajjg4fjg7zjgr/mlbDjgYzooajnpLrjgZXjgozjgb7jgZnvvI4gIAoKIyMg77yR4oiS77yS77yO44Kw44Or44O844OX44GU44Go44GuR1BB6aCG5L2N77yI44Op44Oz44Kv77yJ44Gu6KiI566X44CACgrjgIDjg4fjg7zjgr/jga7mp4vpgKDnrYnjgYzmiormj6HjgafjgY3jgZ/jga7jgafvvIzml6npgJ/jgafjgZnjgYxHUEHpoIbkvY3jga7oqIjnrpfjgavnp7vjgorjgb7jgZnvvI4gIArjgIAgIArjgIDmlofpg6jnp5HlrabnnIHjgYvjgonlh7rjgZXjgozjgabjgYTjgovkv67lrabmlK/mj7TmlrDliLbluqbjga7mlK/mj7TmiZPliIfjgorjgoTorablkYrjgavplqLjgZnjgovln7rmupbjga7lhoXvvIzjgIxHUEHvvIjlubPlnYfmiJDnuL7vvInnrYnjgYzkuIvkvY0xLzTjgavlsZ7jgZnjgovjgZPjgajjgI3jgajjgYTjgYbln7rmupbjgYzjgYLjgorjgb7jgZnvvI7jgojjgaPjgabnibnlrprjga7jgrDjg6vjg7zjg5flhoXjgadHUEHjga7poIbkvY3jgaXjgZHjgpLjgZnjgovlv4XopoHjgYzjgYLjgorjgb7jgZnvvI4gIArjgIDjgb7jgZrjga/vvIzlrabpg6jvvIzlrablubTjga7vvJLopoHlm6DjgafoqIjnrpfjgZfjgabjgb/jgb7jgZnvvI4K44CACmBgYHtyLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KI+WtpumDqO+8jOWtpuW5tOOBlOOBqOOBrkdQQeODqeODs+OCr+OCkuS7mOS4jgpkYXQgJT4lICNkYXTjgajjgYTjgYbjg4fjg7zjgr/jg5Xjg6zjg7zjg6DjgYvjgokKICBncm91cF9ieShzY2hvb2wsZ3JhZGUpICU+JSAjc2Nob29s44GoZ3JhZGXjgafjgrDjg6vjg7zjg5fljJbjgZcKICBtdXRhdGUoR1BBUmFuayA9IHBlcmNlbnRfcmFuayhHUEEpKSAlPiUgI+OCsOODq+ODvOODl+OBlOOBqOOBq0dQQeOBruODkeODvOOCu+ODs+ODiOODqeODs+OCr+OCkuioiOeul+OBl++8jOaWsOOBl+OBj+Wumue+qeOBl+OBn0dQQVJhbmvliJfjgavmoLzntI0KICBoZWFkKCkgJT4lIGthYmxlKCkgI+WFiOmgre+8luihjOOBruOBv+ihqOekugpgYGAKICAK44CA57WQ5p6c44Gv5LiK44Gu6YCa44KK44Gn44GZ77yO5b+F6KaB44Gq44Kz44O844OJ44Gv44Gf44Gj44Gf44GT44KM44Gg44GR44Gn44GZ77yOICAK44CA5a6f5aC06Z2i44Gn44Gv44Kr44Oq44Kt44Ol44Op44Og44Go5a2m5bm044GU44Go44Gr44GT44KM44KS6KiI566X44GZ44KL5b+F6KaB44GM44GC44KL44Gf44KB77yM5qyh44Gv5a2m6YOo77yM5a2m56eR77yM5a2m5bm044Gu77yT6KaB5Zug44Gn6KiI566X44GX44Gm44G/44G+44GZ77yOCuOAgApgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9CiPlrabpg6jvvIzlrabnp5HvvIzlrablubTjgZTjgajjga5HUEHjg6njg7Pjgq/jgpLku5jkuI4KZGF0ICU+JSAjZGF044Go44GE44GG44OH44O844K/44OV44Os44O844Og44GL44KJCiAgZ3JvdXBfYnkoc2Nob29sLGRlcGFydG1lbnQsZ3JhZGUpICU+JSAjc2Nob29s44GoZGVwYXJ0bWVudOOBqGdyYWRl44Gn44Kw44Or44O844OX5YyW44GXCiAgbXV0YXRlKEdQQVJhbmsgPSBwZXJjZW50X3JhbmsoR1BBKSkgJT4lICPjgrDjg6vjg7zjg5fjgZTjgajjgatHUEHjga7jg5Hjg7zjgrvjg7Pjg4jjg6njg7Pjgq/jgpLoqIjnrpfjgZfvvIzmlrDjgZfjgY/lrprnvqnjgZfjgZ9HUEFSYW5r5YiX44Gr5qC857SNCiAgaGVhZCgpICU+JSBrYWJsZSgpICPlhYjpoK3vvJbooYzjga7jgb/ooajnpLoKCmBgYAogIArjgIDntZDmnpzjga/kuIroqJjjga7jgajjgYrjgorjgafjgZnvvI7kuIDjgaTliY3jga7jgrPjg7zjg4njgYvjgolncm91cF9ieSgp44Gu5Lit44GrZGVwYXJ0bWVudOOCkui/veWKoOOBl+OBn+OBoOOBkeOBp+OBme+8jiAgCiAgIArjgIDjgZPjga7jgojjgYbjgatS6KiA6Kqe44Gn44Gv44GT44GG44GX44Gf44OH44O844K/44Gu5YmN5Yem55CG44GM44Go44Gm44KC57Ch5Y2Y44Gr77yM44Gd44GX44Gm6auY6YCf44Gr5a6f6KGM44Gn44GN44G+44GZ77yOCgojIyDvvJHiiJLvvJPvvI7liY3lh6bnkIbmuIjjgb/jg4fjg7zjgr/jga7kv53lrZggIArjgIDku6XkuIrjga7jgojjgYbjgatHUEHjga7poIbkvY3jgpLoqIjnrpflh7rmnaXjgZ/jga7jgafvvIzlh6bnkIbjgZfjgZ/ntZDmnpzjgpLmlrDjgZ/jgarjgqrjg5bjgrjjgqfjgq/jg4jjgavkv53lrZjjgZfjgb7jgZnvvI7jgZPjgZPjgafjga8iZGF0XzIi44Go44GE44GG5ZCN5YmN44Gr5qC857SN44GX44Gm44GK44GN44G+44GZ77yOCgpgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9CiPlrabpg6jvvIzlrabnp5HvvIzlrablubTjgZTjgajjga5HUEHjg6njg7Pjgq/jgpLku5jkuI4KZGF0ICU+JSAKICBncm91cF9ieShzY2hvb2wsZGVwYXJ0bWVudCxncmFkZSkgJT4lIAogIG11dGF0ZShHUEFSYW5rID0gcGVyY2VudF9yYW5rKEdQQSkpIC0+IGRhdF8yICNkYXRfMuOBq+e1kOaenOOCkuS/neWtmApgYGAKCuOAgOOBvuOBn++8jOS9nOaIkOOBl+OBn+ODh+ODvOOCv+OCu+ODg+ODiOOCkuODleOCoeOCpOODq+WHuuWKm+OBmeOCi+OBk+OBqOOCguWPr+iDveOBp+OBme+8jgpgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9CiNyZXN1bHQuY3N244Go44GE44GG5ZCN5YmN44KS44Gk44GR44Gm44OH44O844K/44KSY3N244OV44Kh44Kk44Or44Go44GX44Gm5L+d5a2YCmRhdF8yICU+JSB3cml0ZV9jc3YoInJlc3VsdC5jc3YiKQpgYGAKCiMjIO+8keKIku+8lO+8juWig+eVjOe3muOCueOCs+OCouOBrueul+WHuuOBqOS/neWtmCAgCuOAgOS4iuOBruS+i+OBp+OBr+WQhOOCsOODq+ODvOODl+OBlOOBqOOBrkdQQemghuS9jeOCkuWFqOODh+ODvOOCv+OBjOagvOe0jeOBleOCjOOBpuOBhOOCi+ODh+ODvOOCv+ODhuODvOODluODq+OBq+WIl+OBqOOBl+OBpui/veWKoOOBl++8jOS/neWtmOOBvuOBp+OBl+OBvuOBl+OBn++8jiAgCuOAgOOBl+OBi+OBl++8jOOCsOODq+ODvOODl+OBlOOBqOOBrue1seioiOmHj+OCkuaxguOCgeOCieOCjOOCi+OBk+OBqOOCguOBguOCiuOBvuOBmeOBl++8jOasoemgheOBi+OCieiqrOaYjuOBmeOCi+WPr+imluWMluOBruOCs+ODvOODieOCkuabuOOBj+mam+OBq+OCgu+8jOOCsOODq+ODvOODl+OBlOOBqOOBrue1seioiOmHj+ODhuODvOODluODq+OBjOOBguOCi+OBqOS+v+WIqeOBquOBruOBp++8jOOBk+OBrueroOOBruacgOW+jOOBq+OBk+OCjOOCkuS9nOaIkOOBl+OBpuOBiuOBjeOBvuOBme+8jiAgCgpgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9CiNHUEExLzTvvIYxLzLngrnjga7oqIjnrpcKZGF0XzIgJT4lIAogIGdyb3VwX2J5KHNjaG9vbCxncmFkZSkgJT4lIAogIG11dGF0ZShHUEFfZWMgPSBpZl9lbHNlKEdQQVJhbmsgPD0wLjI1LCIoMinkuIvkvY0xLzQiLAogICAgICAgICAgICAgICAgICAgICAgICAgIGlmX2Vsc2UoR1BBUmFuaz49MC41LCIoMSnkuIrkvY0xLzIiLCIoMynkuK3plpMiKSkpICU+JSAKICBncm91cF9ieShzY2hvb2wsZ3JhZGUsR1BBX2VjKSAlPiUgCiAgc3VtbWFyaXplKEdQQV91bmRlciA9IG1heChHUEEpLEdQQV91cHBlciA9IG1pbihHUEEpKSAtPuOAgEdQQV9zZXAgCmBgYAogIAogIOOBk+OBruOBvuOBvuOBoOOBqOimi+OBq+OBj+OBhOOBruOBp++8jOODmOODg+ODgOODvOWQjeOCkuWkieOBiOOBn+OCiu+8jOWfuuODh+ODvOOCv+OBi+OCieW/heimgeaDheWgseOCkuOBj+OBo+OBpOOBkeOBn+OCiuOBl+OBpu+8jOODh+ODvOOCv+OCkuaVtOOBiOOBvuOBmQoKYGBge3IsIGVycm9yPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFfQoj57Wx6KiI6YeP44OG44O844OW44Or44Gu5L2c5oiQCmRhdF8yICU+JSAKICBtdXRhdGUod2FyID0gaWZfZWxzZShHUEFSYW5rPD0wLjI1LDEsMCkpICU+JSAKICBncm91cF9ieShzY2hvb2wsZ3JhZGUpICU+JSAKICBzdW1tYXJpemUo44K144Oz44OX44Or44K144Kk44K6PSBuKCksCiAgICAgICAgICAgICAgICAgICBHUEHorablkYrlr77osaHogIU9IHN1bSh3YXIpLAogICAgICAgICAgICAgICAgICAg5bm05bqm5YaFR1BB44Gu5bmz5Z2H5YCkPW1lYW4oR1BBKSwKICAgICAgICAgICAgICAgICAgIOW5tOW6puWGhUdQQeOBruaomea6luWBj+W3rj1zZChHUEEpLAogICAgICAgICAgICAgICAgICAg57Sv56mN5L+u5b6X5Y2Y5L2N44Gu5bmz5Z2H5YCkPW1lYW4oY3JlZGl0KSwKICAgICAgICAgICAgICAgICAgIOe0r+epjeS/ruW+l+WNmOS9jeOBruaomea6luWBj+W3rj1zZChjcmVkaXQpKSAlPiUgCiAgbGVmdF9qb2luKEdQQV9zZXAgJT4lIGZpbHRlcihHUEFfZWM9PSIoMSnkuIrkvY0xLzIiKSAlPiUgc2VsZWN0KHNjaG9vbCxncmFkZSxHUEFfdXBwZXIpLCAKICAgICAgICAgICAgYnkgPSBjKCJzY2hvb2wiLCJncmFkZSIpKSAlPiUgcmVuYW1lKCJHUEHkuIrkvY0xLzLlooPnlYzjgrnjgrPjgqIiID0gR1BBX3VwcGVyKSAlPiUgCiAgbGVmdF9qb2luKEdQQV9zZXAgJT4lIGZpbHRlcihHUEFfZWM9PSIoMinkuIvkvY0xLzQiKSAlPiUgc2VsZWN0KHNjaG9vbCxncmFkZSxHUEFfdW5kZXIpLCAKICAgICAgICAgICAgYnkgPSBjKCJzY2hvb2wiLCJncmFkZSIpKSAlPiUgcmVuYW1lKCJHUEHkuIvkvY0xLzTlooPnlYzjgrnjgrPjgqIiID0gR1BBX3VuZGVyKSAtPiByZXN1bHQKYGBgCiAgCiAg57WQ5p6c44KScmVzdWx05aSJ5pWw44Gr5qC857SN44GX44G+44GX44Gf77yO5Lit6Lqr44Gv4oaTICAKICBEVOODkeODg+OCseODvOOCuOOBrmRhdGF0YWJsZemWouaVsOOBp+OCpOODs+OCv+ODqeOCr+ODhuOCo+ODluOBquihqOOCkuS9nOaIkOOBl+OBpuOBhOOBvuOBme+8jiAKCgpgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9CmRhdGF0YWJsZShyZXN1bHQsIGZpbHRlciA9ICJ0b3AiLCAKICAgICAgICAgIGV4dGVuc2lvbnMgPSAnU2Nyb2xsZXInLCBvcHRpb25zID0gbGlzdCgKICBkZWZlclJlbmRlciA9IFRSVUUsCiAgZG9tID0gImZydGlTIiwKICBzY3JvbGxZID0gMjAwLAogIHNjcm9sbENvbGxhcHNlID0gVFJVRQopKQpgYGAKICAKICDlhoXlrrnjgpLnorrjgYvjgoHjgZ/jgonvvIxjc3bjg5XjgqHjgqTjg6vjgafkv53lrZjjgZfjgabjgYrjgY3jgb7jgZnvvI7mlofnp5HnnIHjgbjjga7mj5Dlh7rmm7jpoZ7jgafkvb/jgaPjgZ/jgorjgZnjgovjgZPjgajjgYzlh7rmnaXjgovjgYvjgajmgJ3jgYTjgb7jgZnvvI4KCmBgYHtyLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KI3Jlc3VsdC5jc3bjgbjmm7jjgY3lh7rjgZcKd3JpdGUuY3N2KHJlc3VsdCwgInJlc3VsdC5jc3YiKQpgYGAKICAKICDjg4fjg7zjgr/jga7liY3lh6bnkIbjga/jgZPjgZPjgb7jgafjgafjgZnvvI7ntLDjgYvjgYTpg6jliIbjga9S44Gn44KE44KJ44Gq44GP44Gm44KCT0vjgafjgZnvvI7jgZ/jgaDvvIzjgrDjg6vjg7zjg5Tjg7PjgrDjgajpoIbkvY3jga7oqIjnrpfjga9S44Gn44Gu5Yem55CG44GM5Zyn5YCS55qE44Gr5qW944Gn44GZ77yOCiAgCiAgCiMg77yS77yO44OH44O844K/44Gu5Y+v6KaW5YyW77yI5Lit57Sa6ICF5ZCR44GR77yJICAKCiMjIO+8kuKIku+8ke+8juODkuOCueODiOOCsOODqeODoArjgIDjgZPjgZPjgYvjgonjga/vvIzkuIDnq6DjgafkvZzmiJDjgZfjgZ/jg4fjg7zjgr/jgpLlj6/oppbljJbjgZfjgb7jgZnvvI7mlofpg6jnp5HlrabnnIHjgYvjgonnpLrjgZXjgozjgZ/lj4LogIPkvovjgafjga/jgZjjgofjgYbjgZTjgrDjg6njg5XjgYzkvb/nlKjjgZXjgozjgabjgYTjgb7jgZfjgZ/jgYzvvIzpgKPntprlgKTjga7liIbluIPjgpLnorroqo3jgZnjgovloLTlkIjvvIzpgJrluLjjga/jg5Ljgrnjg4jjgrDjg6njg6DjgpLkvb/nlKjjgZfjgb7jgZnvvI4gIArjgIDjgZPjgozjgpLkvZzmiJDjgZnjgovjgavjga/kuIDnq6DjgafliY3lh6bnkIbjgZfjgZ/jg4fjg7zjgr/jgZnjgonlv4XopoHjgYLjgorjgb7jgZvjgpPvvI7ln7rjg4fjg7zjgr/jgafjgYLjgotkYXTlpInmlbDjgpLkvb/nlKjjgZfjgabmm7jjgYTjgabjgb/jgb7jgZnvvI4K44CACgpgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9Cgoj5YWo5L2T44Gu5YiG5biDCmRhdCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gR1BBKSkrCiAgZ2VvbV9oaXN0b2dyYW0oKSsKICB0aGVtZV9ncmF5IChiYXNlX2ZhbWlseSA9ICJIaXJhS2FrdVByby1XMyIpIAoKI+WtpumDqOOBlOOBqOOBruWIhuW4gwpkYXQgJT4lIAogIGdncGxvdChhZXMoeCA9IEdQQSwgZmlsbCA9IHNjaG9vbCkpKwogIGdlb21faGlzdG9ncmFtKCkrCiAgZmFjZXRfZ3JpZCggfiBzY2hvb2wpKwogIHRoZW1lX2dyYXkgKGJhc2VfZmFtaWx5ID0gIkhpcmFLYWt1UHJvLVczIikgCgoj5a2m6YOo44O75a2m56eR44GU44Go44Gu5YiG5biDCmRhdCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gR1BBLCBmaWxsID0gc2Nob29sKSkrCiAgZ2VvbV9oaXN0b2dyYW0oKSsKICBmYWNldF93cmFwKH5kZXBhcnRtZW50LCBucm93ID0gNSwgbmNvbCA9IDUpKwogIHRoZW1lX2dyYXkgKGJhc2VfZmFtaWx5ID0gIkhpcmFLYWt1UHJvLVczIikgCmBgYAoK44CA44GT44GT44GrMS8057ea44KS5byV44GE44Gm44KE44KM44Gw77yM5YiG5biD44Go5aKD55WM57ea44Gu5Y+v6KaW5YyW44GvT0vjgavjgarjgorjgb7jgZnvvI4KCmBgYHtyLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KCmBgYAoKIyMg77yS4oiS77yS77yO5pWj5biD5Zuz44CACuOAgOOBl+OBi+OBl++8jOmrmOetieaVmeiCsuOBruS/ruWtpuaUr+aPtOaWsOWItuW6puOBq+OBr++8jEdQQeOBruS4i+S9jTEvNOOBruitpuWRiuimgeS7tuOBruS7luOBq++8jOaomea6luWNmOS9jeaVsOOBru+8leWJsuS7peS4i+OBp+aJk+WIh+OCiu+8jO+8luWJsuS7peS4i+OBp+itpuWRiuOBqOOBhOOBhuimgeS7tuOCguOBguOCiuOBvuOBme+8juOBvuOBn++8jOWcqOWtpueUn+aOoeeUqOOBq+OBr0dQQeOBruS4iuS9jTEvMuOBqOOBhOOBhuimgeS7tuOCguOBguOCi+OBruOBp++8jOOBk+OCjOOCieOBruWfuua6luWApOOCkuW/temgreOBq++8jEdQQeOBqOS/ruW+l+WNmOS9jeaVsOOBruS6jOWkieaVsOOCkueUqOOBhOOBpu+8jOaVo+W4g+Wbs+OCkuabuOOBhOOBpuOBv+OBvuOBme+8jiAgCuOAgAoKCiMjIyDvvJLiiJLvvJLiiJLvvJHvvI7vvJHlubTmrKHjga5HUEHjgajlj5blvpfljZjkvY3mlbDjga7liIbluIPjgajln7rmupbngrnvvIjmlaPluIPlm7PvvIkgCmBgYHtyLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KIyMx5bm05qyhCmRhdF8yICU+JSAKICBmaWx0ZXIoZ3JhZGU9PTEpICU+JSAKICBnZ3Bsb3QoYWVzKEdQQSwgY3JlZGl0KSkrCiAgZ2VvbV9wb2ludChzaXplID0gMSkrCiAgZ2VvbV92bGluZShkYXRhID0gR1BBX3NlcCAlPiUgZmlsdGVyKGdyYWRlPT0xICYgR1BBX2VjPT0iKDEp5LiK5L2NMS8yIiksCiAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHhpbnRlcmNlcHQgPSBHUEFfdXBwZXIpLCBsaW5ldHlwZT0idHdvZGFzaCIsIGNvbG9yPSJncmVlbiIpKwogIGdlb21fdmxpbmUoZGF0YSA9IEdQQV9zZXAgJT4lIGZpbHRlcihncmFkZT09MSAmIEdQQV9lYz09IigyKeS4i+S9jTEvNCIpLAogICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4aW50ZXJjZXB0ID0gR1BBX3VuZGVyKSwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibHVlIikrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gKCgxMjQvNCkqMSkqMC42LCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3IgPSAiYmx1ZSIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9ICgoMTI0LzQpKjEpKjAuNSwgbGluZXR5cGU9InNvbGlkIiwgY29sb3IgPSAicmVkIikrCiAgZmFjZXRfd3JhcCh+c2Nob29sLG5yb3cgPSA1LCBuY29sID0gNCkrCiAgZ2d0aXRsZSgiMjAxOOW5tOW6puOAgDHlubTmrKEiKSt4bGFiKCLlubTluqblhoVHUEEiKSt5bGFiKCLkv67lvpfljZjkvY3mlbAiKSsKICBsYWJzKGNhcHRpb24gPSAi6LWk5a6f57ea77ya5pSv5o+05omT44Gh5YiH44KK77yM6Z2S54K557ea77ya6K2m5ZGK77yM57eR44OA44OD44K344Ol77yaR1BBMS8yIikrCiAgdGhlbWVfZ3JheSAoYmFzZV9mYW1pbHkgPSAiSGlyYUtha3VQcm8tVzMiKSAKYGBgCgoKIyMjIO+8kuKIku+8kuKIku+8ku+8ju+8kuW5tOasoeOBrkdQQeOBqOWPluW+l+WNmOS9jeaVsOOBruWIhuW4g+OBqOWfuua6lueCue+8iOaVo+W4g+Wbs++8iSAgCmBgYHtyLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KIyMy5bm05qyhCmRhdF8yICU+JSAgCiAgZmlsdGVyKGdyYWRlPT0yKSAlPiUgCiAgZ2dwbG90KGFlcyhHUEEsIGNyZWRpdCkpKwogIGdlb21fcG9pbnQoc2l6ZSA9IDEpKwogIGdlb21fdmxpbmUoZGF0YSA9IEdQQV9zZXAgJT4lIGZpbHRlcihncmFkZT09MiAmIEdQQV9lYz09IigxKeS4iuS9jTEvMiIpLAogICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4aW50ZXJjZXB0ID0gR1BBX3VwcGVyKSwgbGluZXR5cGU9InR3b2Rhc2giLCBjb2xvcj0iZ3JlZW4iKSsKICBnZW9tX3ZsaW5lKGRhdGEgPSBHUEFfc2VwICU+JSBmaWx0ZXIoZ3JhZGU9PTIgJiBHUEFfZWM9PSIoMinkuIvkvY0xLzQiKSwKICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeGludGVyY2VwdCA9IEdQQV91bmRlciksIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvcj0iYmx1ZSIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9ICgoMTI0LzQpKjIpKjAuNiwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yID0gImJsdWUiKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAoKDEyNC80KSoyKSowLjUsIGxpbmV0eXBlPSJzb2xpZCIsIGNvbG9yID0gInJlZCIpKwogIGZhY2V0X3dyYXAofnNjaG9vbCxucm93ID0gNSwgbmNvbCA9IDQpKwogIGdndGl0bGUoIjIwMTjlubTluqbjgIAy5bm05qyhIikreGxhYigi5bm05bqm5YaFR1BBIikreWxhYigi5L+u5b6X5Y2Y5L2N5pWwIikrCiAgbGFicyhjYXB0aW9uID0gIui1pOWun+e3mu+8muaUr+aPtOaJk+OBoeWIh+OCiu+8jOmdkueCuee3mu+8muitpuWRiu+8jOe3keODgOODg+OCt+ODpe+8mkdQQTEvMiIpICsKICB0aGVtZV9ncmF5IChiYXNlX2ZhbWlseSA9ICJIaXJhS2FrdVByby1XMyIpIApgYGAKCgojIyMg77yS4oiS77yS4oiS77yT77yO77yT5bm05qyh44GuR1BB44Go5Y+W5b6X5Y2Y5L2N5pWw44Gu5YiG5biD44Go5Z+65rqW54K577yI5pWj5biD5Zuz77yJICAKYGBge3IsIGVycm9yPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFfQojIzPlubTmrKEKZGF0XzIgJT4lICAKICBmaWx0ZXIoZ3JhZGU9PTMpICU+JSAKICBnZ3Bsb3QoYWVzKEdQQSwgY3JlZGl0KSkrCiAgZ2VvbV9wb2ludChzaXplID0gMSkrCiAgZ2VvbV92bGluZShkYXRhID0gR1BBX3NlcCAlPiUgZmlsdGVyKGdyYWRlPT0zICYgR1BBX2VjPT0iKDEp5LiK5L2NMS8yIiksCiAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHhpbnRlcmNlcHQgPSBHUEFfdXBwZXIpLCBsaW5ldHlwZT0idHdvZGFzaCIsIGNvbG9yPSJncmVlbiIpKwogIGdlb21fdmxpbmUoZGF0YSA9IEdQQV9zZXAgJT4lIGZpbHRlcihncmFkZT09MyAmIEdQQV9lYz09IigyKeS4i+S9jTEvNCIpLAogICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4aW50ZXJjZXB0ID0gR1BBX3VuZGVyKSwgbGluZXR5cGU9ImRhc2hlZCIsIGNvbG9yPSJibHVlIikrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gKCgxMjQvNCkqMykqMC42LCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3IgPSAiYmx1ZSIpKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9ICgoMTI0LzQpKjMpKjAuNSwgbGluZXR5cGU9InNvbGlkIiwgY29sb3IgPSAicmVkIikrCiAgZmFjZXRfd3JhcCh+c2Nob29sLG5yb3cgPSA1LCBuY29sID0gNCkrCiAgZ2d0aXRsZSgiMjAxOOW5tOW6puOAgDPlubTmrKEiKSt4bGFiKCLlubTluqblhoVHUEEiKSt5bGFiKCLkv67lvpfljZjkvY3mlbAiKSsKICBsYWJzKGNhcHRpb24gPSAi6LWk5a6f57ea77ya5pSv5o+05omT44Gh5YiH44KK77yM6Z2S54K557ea77ya6K2m5ZGK77yM57eR44OA44OD44K344Ol77yaR1BBMS8yIikgKwogIHRoZW1lX2dyYXkgKGJhc2VfZmFtaWx5ID0gIkhpcmFLYWt1UHJvLVczIikgCmBgYAoKCiMjIyDvvJLiiJLvvJLiiJLvvJTvvI7vvJTlubTmrKHjga5HUEHjgajlj5blvpfljZjkvY3mlbDjga7liIbluIPjgajln7rmupbngrnvvIjmlaPluIPlm7PvvIkgIApgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9CiMjNOW5tOasoQpkYXRfMiAlPiUgIAogIGZpbHRlcihncmFkZT09NCkgJT4lIAogIGdncGxvdChhZXMoR1BBLCBjcmVkaXQpKSsKICBnZW9tX3BvaW50KHNpemUgPSAxKSsKICBnZW9tX3ZsaW5lKGRhdGEgPSBHUEFfc2VwICU+JSBmaWx0ZXIoZ3JhZGU9PTQgJiBHUEFfZWM9PSIoMSnkuIrkvY0xLzIiKSwKICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeGludGVyY2VwdCA9IEdQQV91cHBlciksIGxpbmV0eXBlPSJ0d29kYXNoIiwgY29sb3I9ImdyZWVuIikrCiAgZ2VvbV92bGluZShkYXRhID0gR1BBX3NlcCAlPiUgZmlsdGVyKGdyYWRlPT00ICYgR1BBX2VjPT0iKDIp5LiL5L2NMS80IiksCiAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHhpbnRlcmNlcHQgPSBHUEFfdW5kZXIpLCBsaW5ldHlwZT0iZGFzaGVkIiwgY29sb3I9ImJsdWUiKSsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAoKDEyNC80KSo0KSowLjYsIGxpbmV0eXBlPSJkYXNoZWQiLCBjb2xvciA9ICJibHVlIikrCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gKCgxMjQvNCkqNCkqMC41LCBsaW5ldHlwZT0ic29saWQiLCBjb2xvciA9ICJyZWQiKSsKICBmYWNldF93cmFwKH5zY2hvb2wsbnJvdyA9IDUsIG5jb2wgPSA0KSsKICBnZ3RpdGxlKCIyMDE45bm05bqm44CANOW5tOasoSIpK3hsYWIoIuW5tOW6puWGhUdQQSIpK3lsYWIoIuS/ruW+l+WNmOS9jeaVsCIpKwogIGxhYnMoY2FwdGlvbiA9ICLotaTlrp/nt5rvvJrmlK/mj7TmiZPjgaHliIfjgorvvIzpnZLngrnnt5rvvJrorablkYrvvIznt5Hjg4Djg4Pjgrfjg6XvvJpHUEExLzIiKSArCiAgdGhlbWVfZ3JheSAoYmFzZV9mYW1pbHkgPSAiSGlyYUtha3VQcm8tVzMiKSAKYGBgCiAgCuOAgOOBk+OCjOOBp++8jOWtpumDqO+8jOWtpuW5tOOBlOOBqOOBruWPr+imluWMluOBjOOBp+OBjeOBvuOBl+OBn++8jiAgCuOAgFLoqIDoqp7jgafjg4fjg7zjgr/lh6bnkIbjgpLjgZnjgovjgajvvIzjgZPjga7jgojjgYbjgavln7rjg4fjg7zjgr/jgYvjgonliY3lh6bnkIbvvIzntbHoqIjlh6bnkIbvvIzlj6/oppbljJbvvIzjg6zjg53jg7zjg4bjgqPjg7PjgrDjgb7jgafvvIzjgZnjgbnjgaZSc3R1ZGlv5LiK44Gn6KGM44GG5LqL44GM44Gn44GN44G+44GZ77yOICAK44CA5Yqg44GI44Gm77yM44GT44Gu44KI44GG44Gq44OH44O844K/5Yem55CG44Gv44Or44O844OB44Oz44Ov44O844Kv44Go44GX44Gm5q+O5bm06KGM44GG5b+F6KaB44GM44GC44KK44G+44GZ44GM77yMUnNjcmlwdOOBqOOBl+OBpuS/neWtmOOBl+OBpuOBiuOBj+OBqO+8jGlucHV044GZ44KL44OH44O844K/44KS5aSJ44GI44KL44Gg44GR44Gn5ZCM44GY5Yem55CG44KS6KGM44GG44GT44Go44GM44Gn44GN44G+44GZ77yORXhjZWzjgaflh6bnkIbjgpLooYzjgaPjgZ/loLTlkIjvvIzmr47lubTjgrDjg6vjg7zjg5fmlbDDl+WtpuW5tOOBruWHpueQhuOBjOW/heimgeOBqOOBquOCiu+8jOalreWLmemHj+OBjOWil+OBiOOCi+OBoOOBkeOBp+OBquOBj++8jOODkuODpeODvOODnuODs+OCqOODqeODvOOBruWOn+WboOOBq+OCguOBquOCiuOBvuOBme+8jiAgCuOAgFLjgpLkvb/jgaPjgabmpa3li5njga7lirnnjofljJbjgpLlm7PjgorvvIzjg4fjg7zjgr/lh6bnkIbjga7lho3nlJ/mgKfjgpLpq5jjgoHjgovjgZPjgajjga/vvIzlpKflrabkuovli5nntYTnuZTjgavjgajjgaPjgabmnInnm4rjgafjgYLjgovjgajogIPjgYjjgonjgozjgb7jgZnvvI4K44CACgojIO+8k++8jueWkeS8vOODh+ODvOOCv+OBrueUn+aIkO+8iOS4iue0muiAheWQkeOBke+8iSAgCgrjgIDku6XkuIvjga/vvIzkuIroqJjvvJHvvI7vvJLvvI7jgafkvb/nlKjjgZfjgZ/nlpHkvLzjg4fjg7zjgr/jga7kvZzmiJDjgrnjgq/jg6rjg5fjg4gKCgoKCmBgYHtyLCBlcnJvcj1GQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nPSBGQUxTRX0KCmBgYApgYGB7ciwgZXJyb3I9RkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz0gRkFMU0V9CgpgYGAKYGBge3IsIGVycm9yPUZBTFNFLCBtZXNzYWdlID0gRkFMU0UsIHdhcm5pbmc9IEZBTFNFfQoj44Op44Kk44OW44Op44Oq44Gu6Kqt44G/6L6844G/CmxpYnJhcnkodGlkeXZlcnNlKSAjdGlkeXZlcnNl44OR44OD44Kx44O844K444Gu6Kqt6L68CmxpYnJhcnkoa25pdHIpICNrbml0cuODkeODg+OCseODvOOCuOOBruiqrei+vApsaWJyYXJ5KE1BU1MpCSNNQVNT44OR44OD44Kx44O844K444Gu6Kqt6L68CgoKCiMjI+aTrOS8vOODh+ODvOOCv+OBruS9nOaIkAojR1BB44Gu5bmz5Z2H5YCk44Go5qiZ5rqW5YGP5beu77yIR1BB55aR5Ly844OH44O844K/44Gu44OR44Op44Oh44K/77yJCmdwYSA8LSBjKDIuNSwxKQoj5LqM5aSJ5pWw6ZaT44Gu55u46Zai5L+C5pWw77yIR1BB44Go5L+u5b6X5Y2Y5L2N44Gu55u46Zai5L+C5pWw44KSMC4444Gr6Kit5a6a44GX44Gm77yM55aR5Ly844OH44O844K/44KS55m655Sf44GV44Gb44KL77yJCnIgPC0gYygwLjgpCgoj77yR772e77yU5bm05qyh44Gu5qiZ5rqW5L+u5b6X5Y2Y5L2N5pWw44Go44Gd44Gu5qiZ5rqW5YGP5beu77yMQ0FQ44KSMeW5tDQw5Y2Y5L2N44Gr44Gd44KM44Ge44KM6Kit5a6aCmYgPC0gYygzMSwxMCw0MCkKcyA8LSBjKDYyLDIwLDgwKQpqIDwtIGMoOTMsMzAsMTIwKQpnIDwtIGMoMTI0LDMwLDE2MCkKCiNHUEHjgajkv67lvpfljZjkvY3jga7nlpHkvLzjg4fjg7zjgr/jgpLlrablubTjgZTjgajjgavkvZzmiJAKIyPvvJHlubTmrKEKIyDlubPlnYflgKTjg5njgq/jgr8KTXUgPC0gYyhncGFbMV0sIGZbMV0pCQojIOWIhuaVo+WFseWIhuaVo+ihjOWIlwpTaSA8LSBtYXRyaXgoYyhncGFbMl1eMiwKICAgICAgICAgICAgICAgcipncGFbMl0qZlsyXSwKICAgICAgICAgICAgICAgcipncGFbMl0qZlsyXSwKICAgICAgICAgICAgICAgZlsyXV4yKSwgbmNvbD0yKQkKCiMg55aR5Ly844OH44O844K/44KSMeS4h+OCteODs+ODl+ODq+eUn+aIkO+8iOOCrOOCpuOCueWIhuW4g+OBp++8iQpkYXQgPC0gbXZybm9ybSgxMDAwMCwgTXUsIFNpKQkKCiNHUEHnr4Tlm7LjgahDQVDnr4Tlm7Ljgafjg5XjgqPjg6vjgr/jgpLjgYvjgZHjgabvvIwzMDAw5Lq65YiG44Gu44OH44O844K/44KS5L+d5a2YCmRhdF8xIDwtIGRhdGEuZnJhbWUoR1BBPWRhdFssMV0sIGNyZWRpdD1kYXRbLDJdKSAlPiUgCiAgZmlsdGVyKEdQQTw9NCAmIEdQQSA+PTAgJiBjcmVkaXQgPD0gZlszXSAmIGNyZWRpdCA+PTApICU+JSAKICBzYW1wbGVfbihzaXplID0gMzAwMCkJCgojI++8kuW5tOasoQojIOW5s+Wdh+WApOODmeOCr+OCvwpNdSA8LSBjKGdwYVsxXSwgc1sxXSkJCiMg5YiG5pWj5YWx5YiG5pWj6KGM5YiXClNpIDwtIG1hdHJpeChjKGdwYVsyXV4yLAogICAgICAgICAgICAgICByKmdwYVsyXSpzWzJdLAogICAgICAgICAgICAgICByKmdwYVsyXSpzWzJdLAogICAgICAgICAgICAgICBzWzJdXjIpLCBuY29sPTIpCQojIOeWkeS8vOODh+ODvOOCv+OCkjHkuIfjgrXjg7Pjg5fjg6vnlJ/miJDvvIjjgqzjgqbjgrnliIbluIPjgafvvIkKZGF0IDwtIG12cm5vcm0oMTAwMDAsIE11LCBTaSkJCiNHUEHnr4Tlm7LjgahDQVDnr4Tlm7Ljgafjg5XjgqPjg6vjgr/jgpLjgYvjgZHjgabvvIwzMDAw5Lq65YiG44Gu44OH44O844K/44KS5L+d5a2YCmRhdF8yIDwtIGRhdGEuZnJhbWUoR1BBPWRhdFssMV0sIGNyZWRpdD1kYXRbLDJdKSAlPiUgCiAgZmlsdGVyKEdQQTw9NCAmIEdQQSA+PTAgJiBjcmVkaXQgPD0gc1szXSAmIGNyZWRpdCA+PTApICU+JSAKICBzYW1wbGVfbihzaXplID0gMzAwMCkJCgojI++8k+W5tOasoQojIOW5s+Wdh+WApOODmeOCr+OCvwpNdSA8LSBjKGdwYVsxXSwgalsxXSkJCiMg5YiG5pWj5YWx5YiG5pWj6KGM5YiXClNpIDwtIG1hdHJpeChjKGdwYVsyXV4yLAogICAgICAgICAgICAgICByKmdwYVsyXSpqWzJdLAogICAgICAgICAgICAgICByKmdwYVsyXSpqWzJdLAogICAgICAgICAgICAgICBqWzJdXjIpLCBuY29sPTIpCQoKIyDnlpHkvLzjg4fjg7zjgr/jgpIx5LiH44K144Oz44OX44Or55Sf5oiQ77yI44Ks44Km44K55YiG5biD44Gn77yJCmRhdCA8LSBtdnJub3JtKDEwMDAwLCBNdSwgU2kpCiNHUEHnr4Tlm7LjgahDQVDnr4Tlm7Ljgafjg5XjgqPjg6vjgr/jgpLjgYvjgZHjgabvvIwzMDAw5Lq65YiG44Gu44OH44O844K/44KS5L+d5a2YCmRhdF8zIDwtIGRhdGEuZnJhbWUoR1BBPWRhdFssMV0sIGNyZWRpdD1kYXRbLDJdKSAlPiUgCiAgZmlsdGVyKEdQQTw9NCAmIEdQQSA+PTAgJiBjcmVkaXQgPD0galszXSAmIGNyZWRpdCA+PTApICU+JSAKICBzYW1wbGVfbihzaXplID0gMzAwMCkJCgojI++8lOW5tOasoQojIOW5s+Wdh+WApOODmeOCr+OCvwpNdSA8LSBjKGdwYVsxXSwgZ1sxXSkJCiMg5YiG5pWj5YWx5YiG5pWj6KGM5YiXClNpIDwtIG1hdHJpeChjKGdwYVsyXV4yLAogICAgICAgICAgICAgICByKmdwYVsyXSpnWzJdLAogICAgICAgICAgICAgICByKmdwYVsyXSpnWzJdLAogICAgICAgICAgICAgICBnWzJdXjIpLCBuY29sPTIpCQojIOeWkeS8vOODh+ODvOOCv+OCkjHkuIfjgrXjg7Pjg5fjg6vnlJ/miJDvvIjjgqzjgqbjgrnliIbluIPjgafvvIkKZGF0IDwtIG12cm5vcm0oMTAwMDAsIE11LCBTaSkJCiNHUEHnr4Tlm7LjgahDQVDnr4Tlm7Ljgafjg5XjgqPjg6vjgr/jgpLjgYvjgZHjgabvvIwzMDAw5Lq65YiG44Gu44OH44O844K/44KS5L+d5a2YCmRhdF80IDwtIGRhdGEuZnJhbWUoR1BBPWRhdFssMV0sIGNyZWRpdD1kYXRbLDJdKSAlPiUgCiAgZmlsdGVyKEdQQTw9NCAmIEdQQSA+PTAgJiBjcmVkaXQgPD0gZ1szXSAmIGNyZWRpdCA+PTApICU+JSAKICBzYW1wbGVfbihzaXplID0gMzAwMCkJCgojZHBseXLjga7plqLmlbDjgpLpgqrprZTjgZnjgovjgZPjgajjgYzjgYLjgovjga7jgafvvIxNQVNT44OR44OD44Kx44O844K444KS54Sh5Yq544Gr44GX44Gm44GK44GPCmRldGFjaCgicGFja2FnZTpNQVNTIiwgdW5sb2FkPVRSVUUpCgojI+ODh+ODvOOCv+OBrueiuuiqjQojMeW5tOasoQpkYXRfMSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gR1BBLCB5ID0gY3JlZGl0KSkrCiAgZ2VvbV9wb2ludCgpCiMy5bm05qyhCmRhdF8yICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBHUEEsIHkgPSBjcmVkaXQpKSsKICBnZW9tX3BvaW50KCkKIzPlubTmrKEKZGF0XzMgJT4lIAogIGdncGxvdChhZXMoeCA9IEdQQSwgeSA9IGNyZWRpdCkpKwogIGdlb21fcG9pbnQoKQojNOW5tOasoQpkYXRfNCAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gR1BBLCB5ID0gY3JlZGl0KSkrCiAgZ2VvbV9wb2ludCgpCgoKIyPnlJ/miJDjgZXjgozjgZ/nlpHkvLzjg4fjg7zjgr/jgavlrablubTliJfjgpLov73liqDjgZfvvIzjg4fjg7zjgr/jgpLntZDlkIgKcmJpbmQoCiAgZGF0XzEgJT4lIG11dGF0ZShncmFkZSA9IDEpLAogIGRhdF8yICU+JSBtdXRhdGUoZ3JhZGUgPSAyKSwKICBkYXRfMyAlPiUgbXV0YXRlKGdyYWRlID0gMyksCiAgZGF0XzQgJT4lIG11dGF0ZShncmFkZSA9IDQpCikgLT4gZGF0CgojI+WtpumDqOWQjeOBruaWh+Wtl+WIl+OCkuS9nOaIkAojN+OBpOOBruWtpumDqOOBqOOBneOCjOOBnuOCjOOBruWtpumDqOWumuWToeOBjOWQiOioiDEuMuS4h+S6uuOBq+OBquOCi+OCiOOBhuOBq+S9nOaIkApzY2hvb2wgPC0gcmVwKGMoIuS6uuaWh+WtpumDqCIsICLmg4XloLHlrabpg6giLCAi5bel5a2m6YOoIiwKICAgICAgICAgICAgICAgICLnpL7kvJrnp5Hlrabpg6giLCLovrLlrabpg6giLCLms5Xlrabpg6giLCLkurrplpPnp5Hlrabpg6giKSwgCiAgICAgICAgICAgICAgdGltZXMgPSBjKDIwMDAsNzUwLDEyNTAsCiAgICAgICAgICAgICAgICAgICAgICAgIDMwMDAsMTAwMCwzNTAwLDUwMCkpICU+JSAKICBhcy50aWJibGUoKSAlPiUgcmVuYW1lKHNjaG9vbCA9IHZhbHVlKSAj5YiX5ZCN44KSc2Nob29s44GrCgojI+WtpuenkeWQjeOBruaWh+Wtl+WIl+OCkuS9nOaIkAoj77yX44Gk44Gu5a2m6YOo44Gu5LiL44Gr5a2m56eR5ZCN44KS5L2c5oiQCmRlcGFydG1lbnQgPC0gcmVwKGMoIuWTsuWtpuenkSIsICLoqIDoqp7lrabnp5EiLCAi5q205Y+y5a2m56eRIiwgIuWcsOeQhuWtpuenkSIsIuiKuOihk+WtpuenkSIsCiAgICAgICAgICAgICAgICAgICAgIuS6uumWk+aDheWgseWtpuenkSIsIuW/nOeUqOaDheWgseWtpuenkSIsCiAgICAgICAgICAgICAgICAgICAgIuapn+S8muW3peWtpuenkSIsIuW7uuevieWtpuenkSIsIuWcn+acqOW3peWtpuenkSIsCiAgICAgICAgICAgICAgICAgICAgIue1jOa4iOWtpuenkSIsIue1jOWWtuWtpuenkSIsIuWVhuWtpuenkSIsIuW/nOeUqOODleOCoeOCpOODiuODs+OCueWtpuenkSIsCiAgICAgICAgICAgICAgICAgICAgIuajruael+WtpuenkSIsIuawtOeUo+WtpuenkSIsIueSsOWig+S/neWFqOWtpuenkSIsCiAgICAgICAgICAgICAgICAgICAgIuazleW+i+WtpuenkSIsIuaUv+ayu+WtpuenkSIsIuWbvemam+azleWtpuenkSIsIuaWsOmgmOWfn+azleWtpuenkSIsCiAgICAgICAgICAgICAgICAgICAgIuW/g+eQhuWtpuenkSIsIuekvuS8muWtpuenkSIpLCAKICAgICAgICAgICAgICAgICAgdGltZXMgPSBjKDMwMCw1MDAsNTAwLDUwMCwyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDAsMzUwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAwLDUwMCwyNTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAsODAwLDgwMCw2MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDAsMzAwLDQwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAsODAwLDEwMDAsNzAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwLDM1MCkpICU+JSAKICBhcy50aWJibGUoKSAlPiUgcmVuYW1lKGRlcGFydG1lbnQgPSB2YWx1ZSkgI+WIl+WQjeOCkmRlcGFydG1lbnTjgasKCiMj5a2m6YOo5ZCN44Go5a2m56eR5ZCN44Gu44OH44O844K/44KS57WQ5ZCI44GX44Gm77yM44Op44Oz44OA44Og44Gr5Lim44G544GL44GI44KLCnNjaG9vbCA8LSBjYmluZChzY2hvb2wsIGRlcGFydG1lbnQpICU+JSAKICBtdXRhdGUobm8gPSBybm9ybSgxMjAwMCwxMCw1KSkgJT4lIAogIGFycmFuZ2Uobm8pICU+JSBzZWxlY3QoLW5vKQoKIyNHUEHmg4XloLHjg7vkv67lvpfljZjkvY3jga7nlpHkvLzjg4fjg7zjgr/jgajvvIzlrabpg6jjg7vlrabnp5Hjg4fjg7zjgr/jgpLntZDlkIgKZGF0IDwtIGNiaW5kKGRhdCwgc2Nob29sKQoKIyPjg4Djg5/jg7zjga7lrabnsY3nlarlj7fjgpLov73liqAKZGF0ICU+JSAKICBtdXRhdGUoc0lEID0gc3RyX2Moc3RyX3N1YihzY2hvb2wsMSwxKSwKICAgICAgICAgICAgICAgICAgICAgc3RyX3N1YihkZXBhcnRtZW50LDEsMSksCiAgICAgICAgICAgICAgICAgICAgIGdyYWRlLAogICAgICAgICAgICAgICAgICAgICAiLSIsCiAgICAgICAgICAgICAgICAgICAgIHJvd19udW1iZXIoKSkpIC0+IGRhdAoKIyPlrabpg6jvvIzlrablubTjgZTjgajjga7ntbHoqIjph4/jgpLnorroqo0KZGF0ICU+JSAKICBzZWxlY3QoLXNJRCkgJT4lIAogIGdyb3VwX2J5KHNjaG9vbCwgZ3JhZGUsZGVwYXJ0bWVudCkgJT4lIAogIHN1bW1hcmlzZV9hbGwoZnVucyhtZWFuLHNkKSkgJT4lIGRhdGF0YWJsZShmaWx0ZXIgPSAgInRvcCIsIAogICAgICAgICAgZXh0ZW5zaW9ucyA9ICdTY3JvbGxlcicsIG9wdGlvbnMgPSBsaXN0KAogIGRlZmVyUmVuZGVyID0gVFJVRSwKICBkb20gPSAiZnJ0aVMiLAogIHNjcm9sbFkgPSAyMDAsCiAgc2Nyb2xsQ29sbGFwc2UgPSBUUlVFCikpCmBgYAoK44CA6KOc5Yqp6LOH5paZ44Gv5Lul5LiK44Gn57WC5LqG44Gn44GZ77yOICAK44CA44GT44GT44Gr6KiY6LyJ44GX44Gf44OX44Ot44Kw44Op44Og562J44Gv77yS5qyh5Yip55So44GX44Gm44GE44Gf44Gg44GE44GmT0vjgafjgZnvvI7jgZ/jgaDjgZfvvIzlrp/pmpvjga7lpKflrabmpa3li5njgavkvb/nlKjjgZnjgovpmpvjgavjga/vvIzoh6rlt7Hosqzku7vjgafjgYrpoZjjgYTjgZfjgb7jgZnvvI7jg5fjg63jgrDjg6njg6DjgpLkvb/nlKjjgZfjgZ/jgZPjgajjgavjgojjgovkuI3liKnnm4rnrYnjga/osqzku7vjgpLosqDjgYTjgYvjga3jgb7jgZnjga7jgafkuojjgoHjgZTkuobmib/jgY/jgaDjgZXjgYTvvI4gIArjgIAK44CA44G+44Gf77yM5LiN5YKZ562J44KC44GC44KN44GG44GL44Go5oCd44GE44G+44GZ44Gu44Gn77yM44GU6LOq5ZWP562J44Gv6KW/5bGxKGsubmlzODBbYXRdZ21haWwuY29tKeOBvuOBp+OBiumhmOOBhOOBl+OBvuOBme+8jiAgCgo=