10.2 DML Inference in the Partially Linear Regression Model

Revisiting the Price Elasticity for Toy Cars

  • おもちゃの車の価格弾力性を推定する例
  • 価格弾力性の推定について以下の部分線形モデル (Partially Linear Model, PLM) を考える

\[\begin{equation} Y = \alpha D + g(W) + \varepsilon \end{equation}\]

  • 各変数は以下の通り
    • \(Y\): 販売ランクの逆数の対数 (log-reciprocal-sales-rank)
    • \(D\): 価格の対数
    • \(W\): 製品属性のベクトル

Double Machine Learning (DML) を用いた \(\alpha\) の推定

  • 高次元な製品属性を使用する
    • \(W\): 各製品属性とブランド・サブカテゴリーとの交差項などを含む2083次元の属性ベクトルをとする
  • 使用する機械学習アルゴリズム
    • Decision Tree (決定木)
    • Gradient Boosted Trees (勾配ブースティング決定木, 1000 trees)
    • Random Forest (ランダムフォレスト, 2000 trees)
    • Neural Network (ニューラルネットワーク: 200 layers, 20 neurons)

Table 10.3: 推定結果

Model \(R^2_D\) \(R^2_Y\) Estimate Std. Err. 95% CI
Tree 0.40 0.19 -0.109 0.018 [-0.143, -0.074]
Boost 0.41 0.17 -0.102 0.019 [-0.139, -0.064]
Forest 0.49 0.26 -0.134 0.019 [-0.171, -0.096]
NNet 0.47 0.21 -0.132 0.020 [-0.171, -0.093]

参考: Table4.3

Model \(R^2_D\) \(R^2_Y\) Estimate Std. Err. 95% CI
OLS (\(p = 242\)) - - 0.005 0.016 [-0.026, 0.036]
OLS (\(p = 2068\)) - - -0.003 0.021 [-0.045, 0.039]
OLS (\(p = 2072\)) - - -0.033 0.022 [-0.076, 0.010]
Double Lasso 0.09 0.32 -0.064 0.018 [-0.099, -0.029]
Double Selection - - -0.074 0.019 [-0.111, -0.037]
Desparsified Lasso - - -0.062 0.017 [-0.096, -0.028]
  • 機械学習は全モデルで価格弾力性の推定値が負かつ信頼区間がゼロを含まず、理論的予測と一致
  • 信頼区間の比較: Double Lasso の結果よりさらに負の推定値に
  • 決定係数 \(R^2\) の比較: Lassoにと比べ、非線形の機械学習モデルがよりも高い \(R^2\) を達成
    • 特に、decisin tree や Random Forest が最も高い \(R^2\) を達成

\(\rightarrow\) 非線形モデルが共変量をより適切にコントロールできることが示唆

高次変換の使用: 価格弾力性の非線形性を推定

  • 価格弾力性の非線形性を推定するためエルミート多項式 (Hermite polynomial) を導入
    • 直交する多項式を使用することで、推定を安定させることができる(多重共線性の問題が起こりづらくなる)らしい \[\begin{equation} Y = \sum_{j=1}^r \alpha_j T_j(D) + g(W) + \varepsilon \end{equation}\]

<!-- rnb-plot-begin -->

<img src=\data:image/png;base64

  • Figure 10.5: \(r = 1, 2, 3, 4\) の場合を比較
    • 弾力性は非線形 \(\rightarrow\) 低価格帯で非弾力的、高価格帯ではより弾力的になる
    • あるいは、低価格帯における confounding factor をうまくコントロールできていない

10.3 DML Inference in the Interactive Regression Model

DML Inference on APEs and ATEs

次の interactive regression model (IRM) と propensity score の2つの回帰モデルの組を考える

\[\begin{align} Y & = g_0(D, X) + \varepsilon, \quad \mathbb{E}[\varepsilon | X, D] = 0, \tag{10.3.1} \\ D & = m_0(X) + \tilde{D}, \quad \mathbb{E}[\tilde{D} | X] = 0. \tag{10.3.2} \end{align}\]

  • 観測されている変数の組 \(W=(Y,D,X)\)
    • \(Y\) は興味のあるアウトカム
    • \(D\in\{0,1\}\) は二値の処置変数 (binary treatment variable)
    • \(X\) は共変量 (controls/confounding factors)
  • \((10.2.1)\)式の部分線形モデル (PLM) の一般化になっている
    • \((10.3.1)\)式より、\(D\)\(X\) は加法分離的 (additive separable) でなく、共変量 \(X\) によって処置効果 (treatment effect) が非線形に異なる場合を表している
    • \((10.3.2)\)式より、\(D\)\(X\) は独立ではなく、\(D\)\(X\) によって決まることを明示的に表す (confounded)
  • 未知の関数 \(g_0\)\(m_0\) を推定するために、機械学習アルゴリズムを使用する

興味のあるパラメタ (parameter of interest): 平均予測効果 (APE)

\[\begin{equation} \theta_0 = \mathbb{E}[g_0(1, X) - g_0(0, X)] \tag{10.3.3} \end{equation}\]

  • \(D \perp Y(d) \mid X\) (無視可能性 ignorability / 条件付き独立性 ignorability) が成立している場合、APE は平均処置効果 (ATE) と一致する

Neyman 直交性を満たす効率的な推定量

  • \(g_0\)\(m_0\) の推定に関するわずかな推定誤差が、興味のあるパラメタ \(\theta_0\)についてのモーメント条件に影響を与えないような推定量 \(\varphi_0(W)\) を考えると、

\[\begin{equation} \theta_0 = \mathbb{E}[\varphi_0(W)], \tag{10.3.4} \end{equation}\]

  • 推定式 \(\varphi_0(W)\)は、非線形回帰と傾向スコア重み付けを組み合わせたものである

\[\begin{equation} \varphi_0(W) = \varphi_0(Y,D,X) = g_0(1, X) - g_0(0, X) + (Y - g_0(D, X))H_0, \end{equation}\]

  • 重み\(H_0\) は、傾向スコアの逆数によって重み付けされた Horvitz-Thompson weight である \[\begin{equation} H_0 = \frac{1(D = 1)}{m_0(X)} - \frac{1(D = 0)}{1 - m_0(X)}. \end{equation}\]

  • 補足: “doubly robust” な定式化でもある

    • \(g_0\) または \(m_0\) のいずれかが正確に定式化できていれば、\(\theta\) を正確に推定できる

Remark 10.3.1: Regression Adjustment or Propensity ScoreReweighting? Use both

  • 回帰による推定 (Regression adjustment)

\[\begin{equation} \theta_0=\mathrm{E}\left[g_0(1, X)-g_0(0, X)\right], \end{equation}\]

  • 傾向スコア重み付け (Propensity Score Reweighting)

\[\begin{equation} \theta_0=\mathrm{E}\left[Y H_0\right] . \end{equation}\]

  • 上記2つの手法は、 Neyman Orthogonality を満たさない

推定アルゴリズム: DML for APEs/ATEs

  1. Cross-fitting

    • データを、ほぼ同じサイズになるよう、ランダムに \(\{I_k\}_{k=1}^K\) の fold へと \(K\) 分割する
    • フォルド \(k\) を除いたデータで \(g_0\)\(m_0\) の推定値 \(m_{[k]}\)\(g_{[k]}\) を得る
    • 各 fold \(i \in I_k\) について、下記を計算する

    \[\begin{equation} \hat{\varphi}(W_i) = \hat{g}_{[k]}(1, X_i) - \hat{g}_{[k]}(0, X_i) + (Y_i - \hat{g}_{[k]}(D_i, X_i))\hat{H}_i, \end{equation}\] ここで: \[\begin{equation} \hat{H}_i = \frac{1(D_i = 1)}{\hat{m}_{[k]}(X_i)} - \frac{1(D_i = 0)}{1 - \hat{m}_{[k]}(X_i)}. \end{equation}\]

  2. 推定量から、\(\theta\) の推定値を得る \[\begin{equation} \hat{\theta} = \frac{1}{n} \sum_{i=1}^n \hat{\varphi}(W_i). \end{equation}\]

  3. 標準誤差の計算

    • 分散の推定量 \[\begin{equation} \hat{V} = \frac{1}{n} \sum_{i=1}^n (\hat{\varphi}(W_i) - \hat{\theta})^2. \end{equation}\]
    • 標準誤差 \[\begin{equation} \text{Std. Error} = \sqrt{\frac{\hat{V}}{n}}. \end{equation}\]

Remark 10.3.2: Trimming

  • 傾向スコア \(m_{[k]}\)が 0 または 1 に近い場合、\((|\hat{H}_i|)\) が極端に大きくなる
    • これは、overlap 条件が満たされていない可能性を示唆している
  • 傾向スコアの極端な値を取り除く (trimming) ことで対処
    • (\(\varepsilon = 0.01\)) し、\(\bar{H} = 100\) とすることが多い
    • 理論的・実践的にどのような trimming の値が適切か、明らかにはなっておらず、研究の発展の余地がある領域

Theorem 10.3.1: Adaptive Inference on ATE with DML

  • 以下の条件を満たすと仮定する

    • Overlap 条件 (\(\varepsilon < m_0(X) < 1 - \varepsilon\)) を満たす
    • 機械学習による \(g_0, m_0\) の推定が十分に正確である。つまり、下記を満たす \[\begin{equation} \left\|\hat{g}_{[k]}-g_0\right\|_{L^2}+\left\|\hat{m}_{[k]}-m_0\right\|_{L^2}+\sqrt{n}\left\|_{\delta[k]}-g_0\right\|_{L^2}\left\|\hat{m}_{[k]}-m_0\right\|_{L^2} \approx 0, \end{equation}\]
  • 局外母数 (nuisance parameter) の推定誤差は、処置効果 \(\hat{\theta}\) の推定に影響を与えない \[\begin{equation} \sqrt{n}\left(\hat{\theta}-\theta_0\right) \approx \sqrt{n} \mathbb{E}_n\left[\varphi_0(W)-\theta_0\right] . \end{equation}\]

  • 推定量は \(\sqrt{n}\)一致性を満たし、次の分布に収束する \[\begin{equation} \sqrt{n}(\hat{\theta} - \theta_0) \approx \mathcal{N}(0, V), \end{equation}\] ここで、 \[\begin{equation} V = \mathbb{E}[(\varphi_0(W) - \theta_0)^2]. \end{equation}\]

  • \(g_0\)\(m_0\) の推定にはトレードオフがある可能性があると書いてあったが、なぜ?


DML Inference for GATEs and ATETs

GATEs (Group Average Treatment Effects)

  • 特定のグループにおける平均処置効果 (GATE) を推定することもできる \[\begin{equation} \theta_0 = \mathbb{E}[g_0(1, X) - g_0(0, X) \mid G = 1] \end{equation}\]

  • 例: ワクチンが与える年齢階層別の影響を知りたい

    • \(G = 1\) を 13歳以上19歳以下 (\(13 \leq \text{Age} \leq 19\)) の若者
    • \(G = 1\)\(65 \leq \text{Age}\) の高齢者
  • 次の推定量で推定が可能 \[\begin{equation} \theta_0=\mathrm{E}\left[\varphi_0(X) \mid G=1\right]=\mathrm{E}\left[\varphi_0(X) G\right] / \mathrm{P}(G=1) . \end{equation}\]

ATET (Average Treatment Effect on the Treated)

\[\begin{equation} \theta_0 = \mathbb{E}[g_0(1, X) - g_0(0, X) \mid D = 1] \end{equation}\]


Remark 10.3.3: Misspecification of PLM as inference on an overlap-weighted APE

  • PLM の仮定が成り立たない場合に、PLM の推定量 \(\beta\) は何を表すか?
  • IRM であるとき、\(\tilde{Y}\)\(\tilde{D}\) に関する BLP (best linear predictor) がどうなるかを見るため、まず以下の式を考える \[\begin{equation} g_0(D, X) = g_0(0, X) + D(g_0(1, X) - g_0(0, X)) \end{equation}\]
    • IRMは、\(Y\) の非線形な予測部分と、\(D\) の係数部分に分けられる
    • \(g_0(0,X)\) は、PLM における \(\ell(X)\) と同じ役割を果たす
  • \(\tilde{Y}\) は、以下のように書ける

\[\begin{equation} \tilde{Y}=\tilde{D}\left(g_0(1, X)-g_0(0, X)\right)+\epsilon . \end{equation}\]

  • Theorem 10.2.1 の (10.2.3) 式より、\(\beta\) の定義は

\[\begin{equation} \beta:=\{b: E[(\tilde{Y}-b \tilde{D}) \tilde{D}]=0\}=\left(\mathrm{E}\left[\tilde{D}^2\right]\right)^{-1} \mathrm{E}[\tilde{D} \tilde{Y}], \end{equation}\]

  • \(\mathrm{E}\left[\tilde{D}^2 \mid X\right]=m_0(X)\left(1-m_0(X)\right)\) であることを利用し、\(\beta\) を次のような \(m_0(X)\)\(g_0(X)\) の式に書き換える

\[\begin{align} &\beta = \frac{\mathrm{E}[\tilde{D} \tilde{Y}]}{\mathrm{E}\left[\tilde{D}^2\right]} \\ \Rightarrow &\beta = \frac{\mathrm{E}[\tilde{D} \left\{\tilde{D}\left(g_0(1, X)-g_0(0, X)\right)+\epsilon\right\}]}{\mathrm{E}\left[m_0(X)\left(1-m_0(X)\right)\right]} \quad \because \text{$\tilde{Y}$ を代入} \\ \Rightarrow &\beta = \frac{\mathrm{E}[\tilde{D}^2\left(g_0(1, X)-g_0(0, X)\right)]}{\mathrm{E}\left[m_0(X)\left(1-m_0(X)\right)\right]} + \frac{\mathrm{E}[\tilde{D} \epsilon]}{\mathrm{E}\left[m_0(X)\left(1-m_0(X)\right)\right]} \\ \therefore ~ &\beta = \frac{\mathbb{E}[m_0(X)(1 - m_0(X))(g_0(1, X) - g_0(0, X))]}{\mathbb{E}[m_0(X)(1 - m_0(X))]} \end{align}\]

  • この重みは、\(m_0(X) \approx 1/2\) 付近に大きな重みを、\(m_0(X) \approx 0\) または \(m_0(X) \approx 1\) に小さな重みを与える
    • 傾向スコアのような、解釈のしやすい重みになっていない
    • 傾向スコア: 処置群については対照群と近いものに大きな重みを、対照群については処置群と近いものに大きな重みを与える

<補足: \(\mathrm{E}\left[\tilde{D}^2 \mid X\right]=m_0(X)\left(1-m_0(X)\right)\) の導出>

  • (10.3.2)式より、残差 \(\tilde{D}\) は以下のように表される \[\begin{align} &D = m_0(X) + \tilde{D}, \quad \mathbb{E}[\tilde{D} | X] = 0 \\ \tag{10.3.2} \Rightarrow & \tilde{D} = D - m_0(X) \end{align}\]

  • \(\mathbb{E}[\tilde{D}^2 \mid X]\)\[\begin{align} &\mathbb{E}[\tilde{D}^2 \mid X] = \mathbb{E}[(D - m_0(X))^2 \mid X] \\ \Rightarrow &\mathbb{E}[\tilde{D}^2 \mid X] = \mathbb{E}[D^2 \mid X] - 2m_0(X)\mathbb{E}[D \mid X] + m_0(X)^2 \end{align}\]

  • \(D \in \{0, 1\}\) であり、\(D^2 = D\) であることと \(\mathbb{E}[D \mid X] = m_0(X)\) を利用すると、 \[\begin{align} &\mathbb{E}[\tilde{D}^2 \mid X] = \mathbb{E}[D \mid X] - 2m_0(X)m_0(X) + m_0(X)^2 \\ \Rightarrow &\mathbb{E}[\tilde{D}^2 \mid X] = m_0(X) - 2m_0(X)^2 + m_0(X)^2 \\ \Rightarrow &\mathbb{E}[\tilde{D}^2 \mid X] = m_0(X) - m_0(X)^2 \\ \because ~ &\mathbb{E}[\tilde{D}^2 \mid X] = m_0(X)(1 - m_0(X)). \end{align}\]


Remark 10.3.3: 連続な処置の場合

  • 連続的な処置 \(D \in [0, 1]\) の場合も、\(g_0(D, X)\) をベースライン + \(D\) による効果として分解して記述できる \[\begin{equation} g_0(D, X) = g_0(0, X) + \int_0^D t \cdot g_0'(t, X) dt \end{equation}\]

  • すると、\(\beta\) を weighted average derivative として書ける \[\begin{equation} \beta = \frac{\mathbb{E}[w(D, X) g_0'(D, X)]}{\mathbb{E}[w(D, X)]} \end{equation}\] ここで、重み \(w(D, X)\) は次のように定義される \[\begin{equation} w(D, X) = \frac{\mathbb{E}[\tilde{D} \mid D > d, X]}{f(D \mid X)} \end{equation}\]

  • binary にせよ continuous にせよ、解釈が難しいものになっている


The Effect of 401(k) Eligibility on Net Financial Assets

  • Poterba et al. (1994, 1995) の、企業型確定拠出年金制度401(k)への加入資格 が個人の金融資産に与える影響を、本節で説明してきたDMLを用いて再分析する

  • 推定における課題

    • 「401(k)のプランを提供している会社で働く」という処置は、ランダム割当ではない(選択バイアスの問題)
  • 解決策

    • 401(k) が始まった当初、労働者は401(k)が提供されているかどうかより、収入など別の側面に基づいて職業を選択している可能性が高いというアイディアを用いる
    • 条件付き独立性の仮定: 収入や他の職業選択の要因を調整した後は、401(k)の加入資格は外生的である
  • 条件付き独立性と関数型に関する議論

    • Poterba et al. や他の研究は、事前に定義された制約の厳しい関数型を仮定しているが、正確に共変量を調整できているか?という疑問がある
    • 一方で、より柔軟なモデルを使うと、検出力が低下する
    • 本節では、両方を比べてみる

変数の設定とDAG

  • 変数の定義
    • \(Y\): 個人の金融資産 (net financial assets)
    • \(D\): 401(k)加入資格
    • \(X\): 年齢、性別、収入、家族構成、教育年数、婚姻状況、共働きかどうか、年金加入状況、持ち家かどうか、IRA加入状況(iDeCo的な?)、など
    • \(F\): 観測されない企業の属性
    • \(M\): 従業員の401(k)支出額に応じて、従業員が支出する額 (employer match amount) であり、mediator になっている
    • \(U\): 観測されない交絡因子
  • DAGのOverview
    • Figure 10.6: 共変量 \(X\) を調整すれば因果推定が可能な構造
      • \(X\) が valid adjustment set である
    • Figure 10.7: Mediator \(M\) がある場合
      • 総効果は識別可能な場合がある
      • ただし、\(M\)\(F\) に依存すると、\(X\) だけの調整では因果推定が不十分
    • Figure 10.8: 観測されない交絡因子 \(U\)\(Y\) に直接影響を与えると、因果推定は困難

DAG用コード

  • この部分の Replication は小林のGitHubに上がっているので、各々の環境で実行可能
    • ターミナル / コマンドプロンプトで、git clone を実行すれば良い
  • renv による仮想環境を使うことで、パッケージのバージョン管理を行っている
    • renv::restore() を行うことで、このノートブックで使用しているパッケージをインストール可能
    • renv パッケージをダウンロードしていない人は、最初に install.packages("renv") を実行する必要がある
  • パッケージの読み込みには pacman::p_load() がおすすめ
    • 未インストールのパッケージを自動でインストールしてくれる

<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuIyBpbnN0YWxsLnBhY2thZ2VzKFwicmVudlwiKVxuIyByZW52OjpyZXN0b3JlKClcbiMgcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoXCJtbHItb3JnL21scjNleHRyYWxlYXJuZXJzXCIsIGZvcmNlID0gVFJVRSkgIyBuZWVkZWQgdG8gcnVuIGJvb3N0aW5nXG5cbnBhY21hbjo6cF9sb2FkKFxuICBkYWdpdHR5LFxuICBnZ2RhZyxcbiAgeHRhYmxlLFxuICBoZG0sXG4gIHNhbmR3aWNoLFxuICBnZ3Bsb3QyLFxuICByYW5kb21Gb3Jlc3QsXG4gIGRhdGEudGFibGUsXG4gIGdsbW5ldCxcbiAgcnBhcnQsXG4gIGdibSxcbiAgRG91YmxlTUwsIFxuICBtbHIzbGVhcm5lcnMsIFxuICBtbHIzLCBcbiAgZGF0YS50YWJsZSwgXG4gIHJhbmRvbUZvcmVzdCwgXG4gIHJhbmdlcixcbiAgbWxyM2V4dHJhbGVhcm5lcnMsXG4gIG1ib29zdFxuKVxuYGBgIn0= -->

```r
# install.packages(\renv\)
# renv::restore()
# remotes::install_github(\mlr-org/mlr3extralearners\, force = TRUE) # needed to run boosting

pacman::p_load(
  dagitty,
  ggdag,
  xtable,
  hdm,
  sandwich,
  ggplot2,
  randomForest,
  data.table,
  glmnet,
  rpart,
  gbm,
  DoubleML, 
  mlr3learners, 
  mlr3, 
  data.table, 
  randomForest, 
  ranger,
  mlr3extralearners,
  mboost
)
```

<!-- rnb-source-end -->
```r
# install.packages(\renv\)
# renv::restore()
# remotes::install_github(\mlr-org/mlr3extralearners\, force = TRUE) # needed to run boosting

pacman::p_load(
  dagitty,
  ggdag,
  xtable,
  hdm,
  sandwich,
  ggplot2,
  randomForest,
  data.table,
  glmnet,
  rpart,
  gbm,
  DoubleML, 
  mlr3learners, 
  mlr3, 
  data.table, 
  randomForest, 
  ranger,
  mlr3extralearners,
  mboost
)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



---

#### **Figure 10.6: $X$ を調整すれば因果推定が可能な構造**



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlc1bGNtRjBaU0JoSUVSQlIzTWdZVzVrSUhCc2IzUWdkR2hsYlZ4dVhHNUhNU0E4TFNCa1lXZHBkSFI1S0Nka1lXZDdYRzVaSUZ0dmRYUmpiMjFsTEhCdmN6MWNJalFzSURCY0lsMWNia1FnVzJWNGNHOXpkWEpsTEhCdmN6MWNJakFzSURCY0lsMWNibGdnVzJOdmJtWnZkVzVrWlhJc0lIQnZjejFjSWpJc0xURmNJbDFjYmtZZ1czVnZZbk5sY25abFpDd2djRzl6UFZ3aU1Dd2dMVEZjSWwxY2JrUWdMVDRnV1Z4dVdDQXRQaUJFWEc1R0lDMCtJRmhjYmtZZ0xUNGdSRnh1V0NBdFBpQlpmU2NwWEc1Y2JrY3hYMlJoWnlBOExTQm5aMlJoWnloSE1Ta2dLeUIwYUdWdFpWOWtZV2NvS1Z4dVhHNUhNVjlrWVdja2JHRjVaWEp6VzFzelhWMGtiV0Z3Y0dsdVp5QThMU0JjYmlBZ1lXVnpLR052Ykc5MWNpQTlJR01vWENKUFluTmxjblpsWkZ3aUxDQmNJbFZ1YjJKelpYSjJaV1JjSWlsYllYTXViblZ0WlhKcFl5aHVZVzFsSUQwOUlGd2lSbHdpS1NBcklERmRLVnh1UnpGZlpHRm5JQ3NnYzJOaGJHVmZZMjlzYjNKZmJXRnVkV0ZzS0haaGJIVmxjeUE5SUdNb1hDSmliR0ZqYTF3aUxDQmNJbUpzZFdWY0lpa3BJQ3RjYmlBZ2RHaGxiV1VvYkdWblpXNWtMbkJ2YzJsMGFXOXVMbWx1YzJsa1pTQTlJR01vTUM0NExDQXdMamdwS1Z4dVlHQmdJbjA9IC0tPlxuXG5gYGByXG4jIGdlbmVyYXRlIGEgREFHcyBhbmQgcGxvdCB0aGVtXG5cbkcxIDwtIGRhZ2l0dHkoJ2RhZ3tcblkgW291dGNvbWUscG9zPVxcNFxuIn0= -->
# generate a DAGs and plot them

G1 <- dagitty('dag{
Y [outcome,pos=\4
```r
# generate a DAGs and plot them

G1 <- dagitty('dag{
Y [outcome,pos=\4

<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= -->

<img src=\data:image/png;base64


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYWRqdXN0bWVudFNldHMoRzEsIFwiRFwiLCBcIllcIiwgZWZmZWN0ID0gXCJ0b3RhbFwiKVxuYGBgIn0= -->

```r
adjustmentSets(G1, \D\, \Y\, effect = \total\)
```

<!-- rnb-source-end -->
```r
adjustmentSets(G1, \D\, \Y\, effect = \total\)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoieyBYIH1cbiJ9 -->

{ X }




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVJeUJuWlc1bGNtRjBaU0JoSUdOdmRYQnNaU0J2WmlCRVFVZHpJR0Z1WkNCd2JHOTBJSFJvWlcxY2JseHVSeklnUEMwZ1pHRm5hWFIwZVNnblpHRm5lMXh1V1NCYmIzVjBZMjl0WlN4d2IzTTlYQ0kwTENBd1hDSmRYRzVFSUZ0bGVIQnZjM1Z5WlN4d2IzTTlYQ0l3TENBd1hDSmRYRzVZSUZ0amIyNW1iM1Z1WkdWeUxDQndiM005WENJeUxDMHhYQ0pkWEc1R0lGdDFiMkp6WlhKMlpXUXNJSEJ2Y3oxY0lqQXNJQzB4WENKZFhHNUVJQzArSUZsY2JsZ2dMVDRnUkZ4dVdDQXRQaUJHWEc1R0lDMCtJRVJjYmxnZ0xUNGdXWDBuS1Z4dVhHNWNia2N5WDJSaFp5QThMU0JuWjJSaFp5aEhNaWtnS3lCMGFHVnRaVjlrWVdjb0tWeHVYRzVITWw5a1lXY2tiR0Y1WlhKelcxc3pYVjBrYldGd2NHbHVaeUE4TFNCY2JpQWdZV1Z6S0dOdmJHOTFjaUE5SUdNb1hDSlBZbk5sY25abFpGd2lMQ0JjSWxWdWIySnpaWEoyWldSY0lpbGJZWE11Ym5WdFpYSnBZeWh1WVcxbElEMDlJRndpUmx3aUtTQXJJREZkS1Z4dVJ6SmZaR0ZuSUNzZ2MyTmhiR1ZmWTI5c2IzSmZiV0Z1ZFdGc0tIWmhiSFZsY3lBOUlHTW9YQ0ppYkdGamExd2lMQ0JjSW1Kc2RXVmNJaWtwSUN0Y2JpQWdkR2hsYldVb2JHVm5aVzVrTG5CdmMybDBhVzl1TG1sdWMybGtaU0E5SUdNb01DNDRMQ0F3TGpncEtWeHVZR0JnSW4wPSAtLT5cblxuYGBgclxuIyBnZW5lcmF0ZSBhIGNvdXBsZSBvZiBEQUdzIGFuZCBwbG90IHRoZW1cblxuRzIgPC0gZGFnaXR0eSgnZGFne1xuWSBbb3V0Y29tZSxwb3M9XFw0XG4ifQ== -->
# generate a couple of DAGs and plot them

G2 <- dagitty('dag{
Y [outcome,pos=\4
```r
# generate a couple of DAGs and plot them

G2 <- dagitty('dag{
Y [outcome,pos=\4

<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= -->

<img src=\data:image/png;base64


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYWRqdXN0bWVudFNldHMoRzIsIFwiRFwiLCBcIllcIiwgZWZmZWN0ID0gXCJ0b3RhbFwiKVxuYGBgIn0= -->

```r
adjustmentSets(G2, \D\, \Y\, effect = \total\)
```

<!-- rnb-source-end -->
```r
adjustmentSets(G2, \D\, \Y\, effect = \total\)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoieyBYIH1cbiJ9 -->

{ X }




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSek1nUEMwZ1pHRm5hWFIwZVNnblpHRm5lMXh1V1NCYmIzVjBZMjl0WlN4d2IzTTlYQ0kwTENBd1hDSmRYRzVFSUZ0bGVIQnZjM1Z5WlN4d2IzTTlYQ0l3TENBd1hDSmRYRzVZSUZ0amIyNW1iM1Z1WkdWeUxDQndiM005WENJeUxDMHhYQ0pkWEc1R0lGdDFibTlpYzJWeWRtVmtMQ0J3YjNNOVhDSXdMQ0F0TVZ3aVhWeHVWU0JiZFc1dlluTmxjblpsWkN3Z2NHOXpQVndpTWl3Z0xUSmNJbDFjYmtRZ0xUNGdXVnh1V0NBdFBpQkVYRzVHSUMwK0lFUmNibFVnTFQ0Z1JseHVWU0F0UGlCWVhHNVZJQzArSUVSY2JsZ2dMVDRnV1gwbktWeHVYRzVITTE5a1lXY2dQQzBnWjJka1lXY29Sek1wSUNzZ2RHaGxiV1ZmWkdGbktDbGNibHh1UnpOZlpHRm5KR3hoZVdWeWMxdGJNMTFkSkcxaGNIQnBibWNnUEMwZ1hHNGdJR0ZsY3loamIyeHZkWElnUFNCaktGd2lUMkp6WlhKMlpXUmNJaXdnWENKVmJtOWljMlZ5ZG1Wa1hDSXBXMkZ6TG01MWJXVnlhV01vYm1GdFpTQWxhVzRsSUdNb1hDSkdYQ0lzWENKVlhDSXBLU0FySURGZEtWeHVSek5mWkdGbklDc2djMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENKaWJHRmphMXdpTENCY0ltSnNkV1ZjSWlrcElDdGNiaUFnZEdobGJXVW9iR1ZuWlc1a0xuQnZjMmwwYVc5dUxtbHVjMmxrWlNBOUlHTW9NQzQ0TENBd0xqZ3BLVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbkczIDwtIGRhZ2l0dHkoJ2RhZ3tcblkgW291dGNvbWUscG9zPVxcNFxuIn0= -->
G3 <- dagitty('dag{
Y [outcome,pos=\4
```r
G3 <- dagitty('dag{
Y [outcome,pos=\4

<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= -->

<img src=\data:image/png;base64


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5hZGp1c3RtZW50U2V0cyhHMywgXCJEXCIsIFwiWVwiLCBlZmZlY3QgPSBcInRvdGFsXCIpXG5gYGAifQ== -->

```r

adjustmentSets(G3, \D\, \Y\, effect = \total\)
```

<!-- rnb-source-end -->
```r

adjustmentSets(G3, \D\, \Y\, effect = \total\)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoieyBYIH1cbiJ9 -->

{ X }




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


- **$F$ が直接アウトカム $Y$ に影響を与える場合、識別はできない**


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSelFnUEMwZ1pHRm5hWFIwZVNnblpHRm5lMXh1V1NCYmIzVjBZMjl0WlN4d2IzTTlYQ0kwTENBd1hDSmRYRzVFSUZ0bGVIQnZjM1Z5WlN4d2IzTTlYQ0l3TENBd1hDSmRYRzVZSUZ0amIyNW1iM1Z1WkdWeUxDQndiM005WENJeUxDMHhYQ0pkWEc1R0lGdDFibTlpYzJWeWRtVmtMQ0J3YjNNOVhDSXdMQ0F0TVZ3aVhWeHVWU0JiZFc1dlluTmxjblpsWkN3Z2NHOXpQVndpTWl3Z0xUSmNJbDFjYmtRZ0xUNGdXVnh1V0NBdFBpQkVYRzVHSUMwK0lFUmNibFVnTFQ0Z1JseHVWU0F0UGlCWVhHNVZJQzArSUVSY2JrWWdMVDRnV1Z4dVdDQXRQaUJaZlNjcFhHNWNibHh1UnpSZlpHRm5JRHd0SUdkblpHRm5LRWMwS1NBcklIUm9aVzFsWDJSaFp5Z3BYRzVjYmtjMFgyUmhaeVJzWVhsbGNuTmJXek5kWFNSdFlYQndhVzVuSUR3dElGeHVJQ0JoWlhNb1kyOXNiM1Z5SUQwZ1l5aGNJazlpYzJWeWRtVmtYQ0lzSUZ3aVZXNXZZbk5sY25abFpGd2lLVnRoY3k1dWRXMWxjbWxqS0c1aGJXVWdKV2x1SlNCaktGd2lSbHdpTEZ3aVZWd2lLU2tnS3lBeFhTbGNia2MwWDJSaFp5QXJJSE5qWVd4bFgyTnZiRzl5WDIxaGJuVmhiQ2gyWVd4MVpYTWdQU0JqS0Z3aVlteGhZMnRjSWl3Z1hDSmliSFZsWENJcEtTQXJYRzRnSUhSb1pXMWxLR3hsWjJWdVpDNXdiM05wZEdsdmJpNXBibk5wWkdVZ1BTQmpLREF1T0N3Z01DNDRLU2xjYm1CZ1lDSjkgLS0+XG5cbmBgYHJcbkc0IDwtIGRhZ2l0dHkoJ2RhZ3tcblkgW291dGNvbWUscG9zPVxcNFxuIn0= -->
G4 <- dagitty('dag{
Y [outcome,pos=\4
```r
G4 <- dagitty('dag{
Y [outcome,pos=\4

<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= -->

<img src=\data:image/png;base64


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5hZGp1c3RtZW50U2V0cyhHNCwgXCJEXCIsIFwiWVwiLCBlZmZlY3QgPSBcInRvdGFsXCIpXG5gYGAifQ== -->

```r

adjustmentSets(G4, \D\, \Y\, effect = \total\)
```

<!-- rnb-source-end -->
```r

adjustmentSets(G4, \D\, \Y\, effect = \total\)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


---

#### **Figure 10.7: mediator  $M$ がある場合**


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSelVnUEMwZ1pHRm5hWFIwZVNnblpHRm5lMXh1V1NCYmIzVjBZMjl0WlN4d2IzTTlYQ0kwTENBd1hDSmRYRzVFSUZ0bGVIQnZjM1Z5WlN4d2IzTTlYQ0l3TENBd1hDSmRYRzVZSUZ0amIyNW1iM1Z1WkdWeUxDQndiM005WENJeUxDMHlYQ0pkWEc1R0lGdDFibTlpYzJWeWRtVmtMQ0J3YjNNOVhDSXdMQ0F0TWx3aVhWeHVWU0JiZFc1dlluTmxjblpsWkN3Z2NHOXpQVndpTWl3Z0xUTmNJbDFjYmswZ1czVnViMkp6WlhKMlpXUXNJSEJ2Y3oxY0lqTXNJQzB1TVZ3aVhWeHVSQ0F0UGlCWlhHNVlJQzArSUVSY2JrWWdMVDRnUkZ4dVZTQXRQaUJHWEc1VklDMCtJRmhjYmxVZ0xUNGdSRnh1UkNBdFBpQk5YRzVOSUMwK0lGbGNibGdnTFQ0Z1RWeHVXQ0F0UGlCWmZTY3BYRzVjYmtjMVgyUmhaeUE4TFNCbloyUmhaeWhITlNrZ0t5QjBhR1Z0WlY5a1lXY29LVnh1WEc1SE5WOWtZV2NrYkdGNVpYSnpXMXN6WFYwa2JXRndjR2x1WnlBOExTQmNiaUFnWVdWektHTnZiRzkxY2lBOUlHTW9YQ0pQWW5ObGNuWmxaRndpTENCY0lsVnViMkp6WlhKMlpXUmNJaWxiWVhNdWJuVnRaWEpwWXlodVlXMWxJQ1ZwYmlVZ1l5aGNJa1pjSWl4Y0lsVmNJaXdnWENKTlhDSXBLU0FySURGZEtWeHVSelZmWkdGbklDc2djMk5oYkdWZlkyOXNiM0pmYldGdWRXRnNLSFpoYkhWbGN5QTlJR01vWENKaWJHRmphMXdpTENCY0ltSnNkV1ZjSWlrcElDdGNiaUFnZEdobGJXVW9iR1ZuWlc1a0xuQnZjMmwwYVc5dUxtbHVjMmxrWlNBOUlHTW9NQzQ0TENBd0xqZ3BLVnh1WUdCZ0luMD0gLS0+XG5cbmBgYHJcbkc1IDwtIGRhZ2l0dHkoJ2RhZ3tcblkgW291dGNvbWUscG9zPVxcNFxuIn0= -->
G5 <- dagitty('dag{
Y [outcome,pos=\4
```r
G5 <- dagitty('dag{
Y [outcome,pos=\4

<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= -->

<img src=\data:image/png;base64


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5wcmludChhZGp1c3RtZW50U2V0cyhHNSwgXCJEXCIsIFwiWVwiLCBlZmZlY3QgPSBcInRvdGFsXCIpKVxuYGBgIn0= -->

```r

print(adjustmentSets(G5, \D\, \Y\, effect = \total\))
```

<!-- rnb-source-end -->
```r

print(adjustmentSets(G5, \D\, \Y\, effect = \total\))

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-output-begin eyJkYXRhIjoieyBYIH1cbiJ9 -->

{ X }




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


- **$F$ が直接 Mediator $M$ に影響を与える場合、識別はできない**



<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSellnUEMwZ1pHRm5hWFIwZVNnblpHRm5lMXh1V1NCYmIzVjBZMjl0WlN4d2IzTTlYQ0kwTENBd1hDSmRYRzVFSUZ0bGVIQnZjM1Z5WlN4d2IzTTlYQ0l3TENBd1hDSmRYRzVZSUZ0amIyNW1iM1Z1WkdWeUxDQndiM005WENJeUxDMHlYQ0pkWEc1R0lGdDFibTlpYzJWeWRtVmtMQ0J3YjNNOVhDSXdMQ0F0TWx3aVhWeHVWU0JiZFc1dlluTmxjblpsWkN3Z2NHOXpQVndpTWl3Z0xUTmNJbDFjYmswZ1czVnViMkp6WlhKMlpXUXNJSEJ2Y3oxY0lqTXNJQzB1TVZ3aVhWeHVSQ0F0UGlCWlhHNVlJQzArSUVSY2JrWWdMVDRnUkZ4dVZTQXRQaUJHWEc1VklDMCtJRmhjYmtRZ0xUNGdUVnh1UmlBdFBpQk5YRzVWSUMwK0lFUmNiazBnTFQ0Z1dWeHVXQ0F0UGlCTlhHNVlJQzArSUZsOUp5bGNibHh1UnpaZlpHRm5JRHd0SUdkblpHRm5LRWMyS1NBcklIUm9aVzFsWDJSaFp5Z3BYRzVjYmtjMlgyUmhaeVJzWVhsbGNuTmJXek5kWFNSdFlYQndhVzVuSUR3dElGeHVJQ0JoWlhNb1kyOXNiM1Z5SUQwZ1l5aGNJazlpYzJWeWRtVmtYQ0lzSUZ3aVZXNXZZbk5sY25abFpGd2lLVnRoY3k1dWRXMWxjbWxqS0c1aGJXVWdKV2x1SlNCaktGd2lSbHdpTEZ3aVZWd2lMQ0JjSWsxY0lpa3BJQ3NnTVYwcFhHNUhObDlrWVdjZ0t5QnpZMkZzWlY5amIyeHZjbDl0WVc1MVlXd29kbUZzZFdWeklEMGdZeWhjSW1Kc1lXTnJYQ0lzSUZ3aVlteDFaVndpS1NrZ0sxeHVJQ0IwYUdWdFpTaHNaV2RsYm1RdWNHOXphWFJwYjI0dWFXNXphV1JsSUQwZ1l5Z3dMamdzSURBdU9Da3BYRzVnWUdBaWZRPT0gLS0+XG5cbmBgYHJcbkc2IDwtIGRhZ2l0dHkoJ2RhZ3tcblkgW291dGNvbWUscG9zPVxcNFxuIn0= -->
G6 <- dagitty('dag{
Y [outcome,pos=\4
```r
G6 <- dagitty('dag{
Y [outcome,pos=\4

<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= -->

<img src=\data:image/png;base64


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5wcmludChhZGp1c3RtZW50U2V0cyhHNiwgXCJEXCIsIFwiWVwiKSwgZWZmZWN0ID0gXCJ0b3RhbFwiKVxuYGBgIn0= -->

```r

print(adjustmentSets(G6, \D\, \Y\), effect = \total\)
```

<!-- rnb-source-end -->
```r

print(adjustmentSets(G6, \D\, \Y\), effect = \total\)

<!-- rnb-source-end -->


<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


**観測されない交絡因子$U$が直接アウトカム$Y$に影響を与える場合、識別はできない**


<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-output-begin eyJkYXRhIjoiXG48IS0tIHJuYi1zb3VyY2UtYmVnaW4gZXlKa1lYUmhJam9pWUdCZ2NseHVSemM4TFNCa1lXZHBkSFI1S0Nka1lXZDdYRzVaSUZ0dmRYUmpiMjFsTEhCdmN6MWNJalFzSURCY0lsMWNia1FnVzJWNGNHOXpkWEpsTEhCdmN6MWNJakFzSURCY0lsMWNibGdnVzJOdmJtWnZkVzVrWlhJc0lIQnZjejFjSWpJc0xUSmNJbDFjYmtZZ1czVnViMkp6WlhKMlpXUXNJSEJ2Y3oxY0lqQXNJQzB5WENKZFhHNVZJRnQxYm05aWMyVnlkbVZrTENCd2IzTTlYQ0l5TENBdE0xd2lYVnh1VFNCYmRXNXZZbk5sY25abFpDd2djRzl6UFZ3aU15d2dMUzR4WENKZFhHNUVJQzArSUZsY2JsZ2dMVDRnUkZ4dVJpQXRQaUJFWEc1VklDMCtJRVpjYmxVZ0xUNGdXRnh1UkNBdFBpQk5YRzVWSUMwK0lFUmNiazBnTFQ0Z1dWeHVXQ0F0UGlCTlhHNVlJQzArSUZsY2JsVWdMVDRnV1gwbktWeHVYRzVITjE5a1lXY2dQQzBnWjJka1lXY29SemNwSUNzZ2RHaGxiV1ZmWkdGbktDbGNibHh1UnpkZlpHRm5KR3hoZVdWeWMxdGJNMTFkSkcxaGNIQnBibWNnUEMwZ1hHNGdJR0ZsY3loamIyeHZkWElnUFNCaktGd2lUMkp6WlhKMlpXUmNJaXdnWENKVmJtOWljMlZ5ZG1Wa1hDSXBXMkZ6TG01MWJXVnlhV01vYm1GdFpTQWxhVzRsSUdNb1hDSkdYQ0lzWENKVlhDSXNJRndpVFZ3aUtTa2dLeUF4WFNsY2JrYzNYMlJoWnlBcklITmpZV3hsWDJOdmJHOXlYMjFoYm5WaGJDaDJZV3gxWlhNZ1BTQmpLRndpWW14aFkydGNJaXdnWENKaWJIVmxYQ0lwS1NBclhHNGdJSFJvWlcxbEtHeGxaMlZ1WkM1d2IzTnBkR2x2Ymk1cGJuTnBaR1VnUFNCaktEQXVPQ3dnTUM0NEtTbGNibUJnWUNKOSAtLT5cblxuYGBgclxuRzc8LSBkYWdpdHR5KCdkYWd7XG5ZIFtvdXRjb21lLHBvcz1cXDRcbiJ9 -->
G7<- dagitty('dag{
Y [outcome,pos=\4
```r
G7<- dagitty('dag{
Y [outcome,pos=\4

<!-- rnb-plot-begin eyJoZWlnaHQiOjQzMi42MzI5LCJ3aWR0aCI6NzAwLCJzaXplX2JlaGF2aW9yIjowLCJjb25kaXRpb25zIjpbXX0= -->

<img src=\data:image/png;base64


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5wcmludChhZGp1c3RtZW50U2V0cyhHNywgXCJEXCIsIFwiWVwiKSwgZWZmZWN0ID0gXCJ0b3RhbFwiKVxuYGBgIn0= -->

```r

print(adjustmentSets(G7, \D\, \Y\), effect = \total\)
```

<!-- rnb-source-end -->
```r

print(adjustmentSets(G7, \D\, \Y\), effect = \total\)

```

LS0tCnRpdGxlOiAiQ2F1c2FsIE1MIEJvb2sgQ2gxMC4yLTEwLjMiCmF1dGhvcjogIlJ5dWtpIEtvYmF5YXNoaSIKZGF0ZTogIjIwMjQvMTEvMjUiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCiMjIDEwLjIgRE1MIEluZmVyZW5jZSBpbiB0aGUgUGFydGlhbGx5IExpbmVhciBSZWdyZXNzaW9uIE1vZGVsCiMjIyBSZXZpc2l0aW5nIHRoZSBQcmljZSBFbGFzdGljaXR5IGZvciBUb3kgQ2FycwoKLSDjgYrjgoLjgaHjgoPjga7ou4rjga7kvqHmoLzlvL7lipvmgKfjgpLmjqjlrprjgZnjgovkvosKLSDkvqHmoLzlvL7lipvmgKfjga7mjqjlrprjgavjgaTjgYTjgabku6XkuIvjga7pg6jliIbnt5rlvaLjg6Ljg4fjg6sgKFBhcnRpYWxseSBMaW5lYXIgTW9kZWwsIFBMTSkg44KS6ICD44GI44KLCgpcYmVnaW57ZXF1YXRpb259CiAgWSA9IFxhbHBoYSBEICsgZyhXKSArIFx2YXJlcHNpbG9uClxlbmR7ZXF1YXRpb259ICAKCi0g5ZCE5aSJ5pWw44Gv5Lul5LiL44Gu6YCa44KKCiAgLSAkWSQ6IOiyqeWjsuODqeODs+OCr+OBrumAhuaVsOOBruWvvuaVsCAobG9nLXJlY2lwcm9jYWwtc2FsZXMtcmFuaykKICAtICREJDog5L6h5qC844Gu5a++5pWwCiAgLSAkVyQ6IOijveWTgeWxnuaAp+OBruODmeOCr+ODiOODqyAgCgojIyMjICoqRG91YmxlIE1hY2hpbmUgTGVhcm5pbmcgKERNTCkg44KS55So44GE44GfICRcYWxwaGEkIOOBruaOqOWumioqCi0g6auY5qyh5YWD44Gq6KO95ZOB5bGe5oCn44KS5L2/55So44GZ44KLCiAgIC0gJFckOiDlkIToo73lk4HlsZ7mgKfjgajjg5bjg6njg7Pjg4njg7vjgrXjg5bjgqvjg4bjgrTjg6rjg7zjgajjga7kuqTlt67poIXjgarjganjgpLlkKvjgoAyMDgz5qyh5YWD44Gu5bGe5oCn44OZ44Kv44OI44Or44KS44Go44GZ44KLCi0g5L2/55So44GZ44KL5qmf5qKw5a2m57+S44Ki44Or44K044Oq44K644OgCiAgIC0gRGVjaXNpb24gVHJlZSAo5rG65a6a5pyoKQogICAtIEdyYWRpZW50IEJvb3N0ZWQgVHJlZXMgKOWLvumFjeODluODvOOCueODhuOCo+ODs+OCsOaxuuWumuacqCwgMTAwMCB0cmVlcykKICAgLSBSYW5kb20gRm9yZXN0ICjjg6njg7Pjg4Djg6Djg5Xjgqnjg6zjgrnjg4gsIDIwMDAgdHJlZXMpCiAgIC0gTmV1cmFsIE5ldHdvcmsgKOODi+ODpeODvOODqeODq+ODjeODg+ODiOODr+ODvOOCrzogMjAwIGxheWVycywgMjAgbmV1cm9ucykKCgojIyMjIFRhYmxlIDEwLjM6IOaOqOWumue1kOaenAoKfCBNb2RlbCAgICAgICAgICAgICAgICAgfCAkUl4yX0QkIHwgJFJeMl9ZJCB8IEVzdGltYXRlICB8IFN0ZC4gRXJyLiB8IDk1JSBDSSAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfAp8IFRyZWUgICAgICAgICAgICAgICAgICB8IDAuNDAgICAgICAgIHwgMC4xOSAgICAgICAgfCAtMC4xMDkgICAgfCAwLjAxOCAgICAgfCBbLTAuMTQzLCAtMC4wNzRdICB8CnwgQm9vc3QgICAgICAgICAgICAgICAgIHwgMC40MSAgICAgICAgfCAwLjE3ICAgICAgICB8IC0wLjEwMiAgICB8IDAuMDE5ICAgICB8IFstMC4xMzksIC0wLjA2NF0gIHwKfCBGb3Jlc3QgICAgICAgICAgICAgICAgfCAwLjQ5ICAgICAgICB8IDAuMjYgICAgICAgIHwgLTAuMTM0ICAgIHwgMC4wMTkgICAgIHwgWy0wLjE3MSwgLTAuMDk2XSAgfAp8IE5OZXQgICAgICAgICAgICAgICAgICB8IDAuNDcgICAgICAgIHwgMC4yMSAgICAgICAgfCAtMC4xMzIgICAgfCAwLjAyMCAgICAgfCBbLTAuMTcxLCAtMC4wOTNdICB8CgoqKuWPguiAgzogVGFibGU0LjMqKgoKfCBNb2RlbCAgICAgICAgICAgICAgICAgfCAkUl4yX0QkIHwgJFJeMl9ZJCB8IEVzdGltYXRlICB8IFN0ZC4gRXJyLiB8IDk1JSBDSSAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfAp8IE9MUyAoJHAgPSAyNDIkKSAgICB8IC0gICAgICAgICAgIHwgLSAgICAgICAgICAgfCAwLjAwNSAgICAgfCAwLjAxNiAgICAgfCBbLTAuMDI2LCAwLjAzNl0gICB8CnwgT0xTICgkcCA9IDIwNjgkKSAgIHwgLSAgICAgICAgICAgfCAtICAgICAgICAgICB8IC0wLjAwMyAgICB8IDAuMDIxICAgICB8IFstMC4wNDUsIDAuMDM5XSAgIHwKfCBPTFMgKCRwID0gMjA3MiQpICAgfCAtICAgICAgICAgICB8IC0gICAgICAgICAgIHwgLTAuMDMzICAgIHwgMC4wMjIgICAgIHwgWy0wLjA3NiwgMC4wMTBdICAgfAp8IERvdWJsZSBMYXNzbyAgICAgICAgICB8IDAuMDkgICAgICAgIHwgMC4zMiAgICAgICAgfCAtMC4wNjQgICAgfCAwLjAxOCAgICAgfCBbLTAuMDk5LCAtMC4wMjldICB8CnwgRG91YmxlIFNlbGVjdGlvbiAgICAgIHwgLSAgICAgICAgICAgfCAtICAgICAgICAgICB8IC0wLjA3NCAgICB8IDAuMDE5ICAgICB8IFstMC4xMTEsIC0wLjAzN10gIHwKfCBEZXNwYXJzaWZpZWQgTGFzc28gICAgfCAtICAgICAgICAgICB8IC0gICAgICAgICAgIHwgLTAuMDYyICAgIHwgMC4wMTcgICAgIHwgWy0wLjA5NiwgLTAuMDI4XSAgfAoKCi0g5qmf5qKw5a2m57+S44Gv5YWo44Oi44OH44Or44Gn5L6h5qC85by+5Yqb5oCn44Gu5o6o5a6a5YCk44GM6LKg44GL44Gk5L+h6aC85Yy66ZaT44GM44K844Ot44KS5ZCr44G+44Ga44CB55CG6KuW55qE5LqI5ris44Go5LiA6Ie0Ci0g5L+h6aC85Yy66ZaT44Gu5q+U6LyDOiBEb3VibGUgTGFzc28g44Gu57WQ5p6c44KI44KK44GV44KJ44Gr6LKg44Gu5o6o5a6a5YCk44GrCi0g5rG65a6a5L+C5pWwICRSXjIkIOOBruavlOi8gzogTGFzc2/jgavjgajmr5TjgbnjgIHpnZ7nt5rlvaLjga7mqZ/morDlrabnv5Ljg6Ljg4fjg6vjgYzjgojjgorjgoLpq5jjgYQgJFJeMiQg44KS6YGU5oiQCiAgLSDnibnjgavjgIFkZWNpc2luIHRyZWUg44KEIFJhbmRvbSBGb3Jlc3Qg44GM5pyA44KC6auY44GEICRSXjIkIOOCkumBlOaIkAoKJFxyaWdodGFycm93JCDpnZ7nt5rlvaLjg6Ljg4fjg6vjgYzlhbHlpInph4/jgpLjgojjgorpganliIfjgavjgrPjg7Pjg4jjg63jg7zjg6vjgafjgY3jgovjgZPjgajjgYznpLrllIYKCiMjIyMgKirpq5jmrKHlpInmj5vjga7kvb/nlKg6IOS+oeagvOW8vuWKm+aAp+OBrumdnue3muW9ouaAp+OCkuaOqOWumioqCgotIOS+oeagvOW8vuWKm+aAp+OBrumdnue3muW9ouaAp+OCkuaOqOWumuOBmeOCi+OBn+OCgeOCqOODq+ODn+ODvOODiOWkmumgheW8jyAoSGVybWl0ZSBwb2x5bm9taWFsKSDjgpLlsI7lhaUKICAtIOebtOS6pOOBmeOCi+WkmumgheW8j+OCkuS9v+eUqOOBmeOCi+OBk+OBqOOBp+OAgeaOqOWumuOCkuWuieWumuOBleOBm+OCi+OBk+OBqOOBjOOBp+OBjeOCi++8iOWkmumHjeWFsee3muaAp+OBruWVj+mhjOOBjOi1t+OBk+OCiuOBpeOCieOBj+OBquOCi++8ieOCieOBl+OBhAogICAgXGJlZ2lue2VxdWF0aW9ufQogICAgWSA9IFxzdW1fe2o9MX1eciBcYWxwaGFfaiBUX2ooRCkgKyBnKFcpICsgXHZhcmVwc2lsb24KICAgIFxlbmR7ZXF1YXRpb259CgoKYGBge3IsIGVjaG89RkFMU0UsIG91dC53aWR0aD0iNzAlIiwgIGZpZy5hbGlnbiA9ICdjZW50ZXInfQprbml0cjo6aW5jbHVkZV9ncmFwaGljcygiZmlndXJlL2ZpZzEwLjUucG5nIikKYGBgCgoKLSBGaWd1cmUgMTAuNTogJHIgPSAxLCAyLCAzLCA0JCDjga7loLTlkIjjgpLmr5TovIMKICAtIOW8vuWKm+aAp+OBr+mdnue3muW9oiAkXHJpZ2h0YXJyb3ckIOS9juS+oeagvOW4r+OBp+mdnuW8vuWKm+eahOOAgemrmOS+oeagvOW4r+OBp+OBr+OCiOOCiuW8vuWKm+eahOOBq+OBquOCiwogIC0g44GC44KL44GE44Gv44CB5L2O5L6h5qC85biv44Gr44GK44GR44KLIGNvbmZvdW5kaW5nIGZhY3RvciDjgpLjgYbjgb7jgY/jgrPjg7Pjg4jjg63jg7zjg6vjgafjgY3jgabjgYTjgarjgYQKCi0tLQoKIyMgMTAuMyBETUwgSW5mZXJlbmNlIGluIHRoZSBJbnRlcmFjdGl2ZSBSZWdyZXNzaW9uIE1vZGVsCiMjIyBETUwgSW5mZXJlbmNlIG9uIEFQRXMgYW5kIEFURXMKCuasoeOBriBpbnRlcmFjdGl2ZSByZWdyZXNzaW9uIG1vZGVsIChJUk0pIOOBqCBwcm9wZW5zaXR5IHNjb3JlIOOBrjLjgaTjga7lm57luLDjg6Ljg4fjg6vjga7ntYTjgpLogIPjgYjjgosKClxiZWdpbnthbGlnbn0KICBZICYgPSBnXzAoRCwgWCkgKyBcdmFyZXBzaWxvbiwgXHF1YWQgXG1hdGhiYntFfVtcdmFyZXBzaWxvbiB8IFgsIERdID0gMCwgXHRhZ3sxMC4zLjF9ICBcXCAKICBEICYgPSBtXzAoWCkgKyBcdGlsZGV7RH0sIFxxdWFkIFxtYXRoYmJ7RX1bXHRpbGRle0R9IHwgWF0gPSAwLiBcdGFnezEwLjMuMn0KXGVuZHthbGlnbn0KCi0g6Kaz5ris44GV44KM44Gm44GE44KL5aSJ5pWw44Gu57WEICRXPShZLEQsWCkkCiAgLSAkWSQg44Gv6IiI5ZGz44Gu44GC44KL44Ki44Km44OI44Kr44OgCiAgLSAkRFxpblx7MCwxXH0kIOOBr+S6jOWApOOBruWHpue9ruWkieaVsCAoYmluYXJ5IHRyZWF0bWVudCB2YXJpYWJsZSkKICAtICRYJCDjga/lhbHlpInph48gKGNvbnRyb2xzL2NvbmZvdW5kaW5nIGZhY3RvcnMpCi0gJCgxMC4yLjEpJOW8j+OBrumDqOWIhue3muW9ouODouODh+ODqyAoUExNKSDjga7kuIDoiKzljJbjgavjgarjgaPjgabjgYTjgosKICAtICQoMTAuMy4xKSTlvI/jgojjgorjgIEkRCQg44GoICRYJCDjga/liqDms5XliIbpm6LnmoQgKGFkZGl0aXZlIHNlcGFyYWJsZSkg44Gn44Gq44GP44CB5YWx5aSJ6YePIFwoWFwpIOOBq+OCiOOBo+OBpuWHpue9ruWKueaenCAodHJlYXRtZW50IGVmZmVjdCkg44GM6Z2e57ea5b2i44Gr55Ww44Gq44KL5aC05ZCI44KS6KGo44GX44Gm44GE44KLCiAgLSAkKDEwLjMuMikk5byP44KI44KK44CBJEQkIOOBqCAkWCQg44Gv54us56uL44Gn44Gv44Gq44GP44CBJEQkIOOBryAkWCQg44Gr44KI44Gj44Gm5rG644G+44KL44GT44Go44KS5piO56S655qE44Gr6KGo44GZIChjb25mb3VuZGVkKQotIOacquefpeOBrumWouaVsCAkZ18wJCDjgaggJG1fMCQg44KS5o6o5a6a44GZ44KL44Gf44KB44Gr44CB5qmf5qKw5a2m57+S44Ki44Or44K044Oq44K644Og44KS5L2/55So44GZ44KLCgoqKuiIiOWRs+OBruOBguOCi+ODkeODqeODoeOCvyAocGFyYW1ldGVyIG9mIGludGVyZXN0KTog5bmz5Z2H5LqI5ris5Yq55p6cIChBUEUpKioKClxiZWdpbntlcXVhdGlvbn0KICAgXHRoZXRhXzAgPSBcbWF0aGJie0V9W2dfMCgxLCBYKSAtIGdfMCgwLCBYKV0gXHRhZ3sxMC4zLjN9ClxlbmR7ZXF1YXRpb259CiAgICAgCi0gJEQgXHBlcnAgWShkKSBcbWlkIFgkICjnhKHoppblj6/og73mgKcgaWdub3JhYmlsaXR5IC8g5p2h5Lu25LuY44GN54us56uL5oCnIGlnbm9yYWJpbGl0eSkg44GM5oiQ56uL44GX44Gm44GE44KL5aC05ZCI44CBQVBFIOOBr+W5s+Wdh+WHpue9ruWKueaenCAoQVRFKSDjgajkuIDoh7TjgZnjgosKCi0tLQoKIyMjIyAqKk5leW1hbiDnm7TkuqTmgKfjgpLmuoDjgZ/jgZnlirnnjofnmoTjgarmjqjlrprph48qKgoKLSAkZ18wJCDjgaggJG1fMCQg44Gu5o6o5a6a44Gr6Zai44GZ44KL44KP44Ga44GL44Gq5o6o5a6a6Kqk5beu44GM44CB6IiI5ZGz44Gu44GC44KL44OR44Op44Oh44K/ICRcdGhldGFfMCTjgavjgaTjgYTjgabjga7jg6Ljg7zjg6Hjg7Pjg4jmnaHku7bjgavlvbHpn7/jgpLkuI7jgYjjgarjgYTjgojjgYbjgarmjqjlrprph48gJFx2YXJwaGlfMChXKSQg44KS6ICD44GI44KL44Go44CBCgpcYmVnaW57ZXF1YXRpb259CiAgIFx0aGV0YV8wID0gXG1hdGhiYntFfVtcdmFycGhpXzAoVyldLCBcdGFnezEwLjMuNH0KXGVuZHtlcXVhdGlvbn0KCi0g5o6o5a6a5byPICRcdmFycGhpXzAoVykk44Gv44CB6Z2e57ea5b2i5Zue5biw44Go5YK+5ZCR44K544Kz44Ki6YeN44G/5LuY44GR44KS57WE44G/5ZCI44KP44Gb44Gf44KC44Gu44Gn44GC44KLCgpcYmVnaW57ZXF1YXRpb259CiAgXHZhcnBoaV8wKFcpID0gXHZhcnBoaV8wKFksRCxYKSA9IGdfMCgxLCBYKSAtIGdfMCgwLCBYKSArIChZIC0gZ18wKEQsIFgpKUhfMCwKXGVuZHtlcXVhdGlvbn0KCi0g6YeN44G/JEhfMCQg44Gv44CB5YK+5ZCR44K544Kz44Ki44Gu6YCG5pWw44Gr44KI44Gj44Gm6YeN44G/5LuY44GR44GV44KM44GfIEhvcnZpdHotVGhvbXBzb24gd2VpZ2h0IOOBp+OBguOCiwpcYmVnaW57ZXF1YXRpb259ICAKICBIXzAgPSBcZnJhY3sxKEQgPSAxKX17bV8wKFgpfSAtIFxmcmFjezEoRCA9IDApfXsxIC0gbV8wKFgpfS4KXGVuZHtlcXVhdGlvbn0KCi0g6KOc6LazOiAiZG91Ymx5IHJvYnVzdCIg44Gq5a6a5byP5YyW44Gn44KC44GC44KLCiAgLSAkZ18wJCDjgb7jgZ/jga8gJG1fMCQg44Gu44GE44Ga44KM44GL44GM5q2j56K644Gr5a6a5byP5YyW44Gn44GN44Gm44GE44KM44Gw44CBJFx0aGV0YSQg44KS5q2j56K644Gr5o6o5a6a44Gn44GN44KLCgotLS0KCiMjIyMgKipSZW1hcmsgMTAuMy4xOiBSZWdyZXNzaW9uIEFkanVzdG1lbnQgb3IgUHJvcGVuc2l0eSBTY29yZVJld2VpZ2h0aW5nPyBVc2UgYm90aCoqCgotIOWbnuW4sOOBq+OCiOOCi+aOqOWumiAoUmVncmVzc2lvbiBhZGp1c3RtZW50KQoKXGJlZ2lue2VxdWF0aW9ufQogIFx0aGV0YV8wPVxtYXRocm17RX1cbGVmdFtnXzAoMSwgWCktZ18wKDAsIFgpXHJpZ2h0XSwKXGVuZHtlcXVhdGlvbn0KCi0g5YK+5ZCR44K544Kz44Ki6YeN44G/5LuY44GRIChQcm9wZW5zaXR5IFNjb3JlIFJld2VpZ2h0aW5nKQoKXGJlZ2lue2VxdWF0aW9ufQogIFx0aGV0YV8wPVxtYXRocm17RX1cbGVmdFtZIEhfMFxyaWdodF0gLgpcZW5ke2VxdWF0aW9ufQoKLSDkuIroqJgy44Gk44Gu5omL5rOV44Gv44CBIE5leW1hbiBPcnRob2dvbmFsaXR5IOOCkua6gOOBn+OBleOBquOBhAoKLS0tCgojIyMjICoq5o6o5a6a44Ki44Or44K044Oq44K644OgOiBETUwgZm9yIEFQRXMvQVRFcyoqCgoxLiBDcm9zcy1maXR0aW5nCiAgICAtIOODh+ODvOOCv+OCkuOAgeOBu+OBvOWQjOOBmOOCteOCpOOCuuOBq+OBquOCi+OCiOOBhuOAgeODqeODs+ODgOODoOOBqyAkXHtJX2tcfV97az0xfV5LJCDjga4gZm9sZCDjgbjjgaggJEskIOWIhuWJsuOBmeOCiwogICAgLSDjg5Xjgqnjg6vjg4kgXChrXCkg44KS6Zmk44GE44Gf44OH44O844K/44GnIFwoZ18wXCkg44GoIFwobV8wXCkg44Gu5o6o5a6a5YCkICRtX3tba119JCDjgaggJGdfe1trXX0kIOOCkuW+l+OCiwogICAgLSDlkIQgZm9sZCBcKGkgXGluIElfa1wpIOOBq+OBpOOBhOOBpuOAgeS4i+iomOOCkuioiOeul+OBmeOCiwoKICAgICBcYmVnaW57ZXF1YXRpb259CiAgICAgXGhhdHtcdmFycGhpfShXX2kpID0gXGhhdHtnfV97W2tdfSgxLCBYX2kpIC0gXGhhdHtnfV97W2tdfSgwLCBYX2kpICsgKFlfaSAtIFxoYXR7Z31fe1trXX0oRF9pLCBYX2kpKVxoYXR7SH1faSwKICAgICBcZW5ke2VxdWF0aW9ufQogICAgIOOBk+OBk+OBpzoKICAgICBcYmVnaW57ZXF1YXRpb259CiAgICAgXGhhdHtIfV9pID0gXGZyYWN7MShEX2kgPSAxKX17XGhhdHttfV97W2tdfShYX2kpfSAtIFxmcmFjezEoRF9pID0gMCl9ezEgLSBcaGF0e219X3tba119KFhfaSl9LiAKICAgICBcZW5ke2VxdWF0aW9ufQoKMy4g5o6o5a6a6YeP44GL44KJ44CBJFx0aGV0YSQg44Gu5o6o5a6a5YCk44KS5b6X44KLCiAgIFxiZWdpbntlcXVhdGlvbn0KICAgIFxoYXR7XHRoZXRhfSA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ebiBcaGF0e1x2YXJwaGl9KFdfaSkuCiAgIFxlbmR7ZXF1YXRpb259Cgo0LiDmqJnmupboqqTlt67jga7oqIjnrpcKICAgLSDliIbmlaPjga7mjqjlrprph48KICAgICBcYmVnaW57ZXF1YXRpb259CiAgICAgICAgXGhhdHtWfSA9IFxmcmFjezF9e259IFxzdW1fe2k9MX1ebiAoXGhhdHtcdmFycGhpfShXX2kpIC0gXGhhdHtcdGhldGF9KV4yLgogICAgIFxlbmR7ZXF1YXRpb259CiAgIC0g5qiZ5rqW6Kqk5beuCiAgICAgXGJlZ2lue2VxdWF0aW9ufQogICAgICAgIFx0ZXh0e1N0ZC4gRXJyb3J9ID0gXHNxcnR7XGZyYWN7XGhhdHtWfX17bn19LiAKICAgICBcZW5ke2VxdWF0aW9ufQoKLS0tCgojIyMjICoqUmVtYXJrIDEwLjMuMjogVHJpbW1pbmcqKgoKLSDlgr7lkJHjgrnjgrPjgqIgJG1fe1trXX0k44GMIDAg44G+44Gf44GvIDEg44Gr6L+R44GE5aC05ZCI44CBJCh8XGhhdHtIfV9pfCkkIOOBjOalteerr+OBq+Wkp+OBjeOBj+OBquOCiwogIC0g44GT44KM44Gv44CBb3ZlcmxhcCDmnaHku7bjgYzmuoDjgZ/jgZXjgozjgabjgYTjgarjgYTlj6/og73mgKfjgpLnpLrllIbjgZfjgabjgYTjgosKLSDlgr7lkJHjgrnjgrPjgqLjga7mpbXnq6/jgarlgKTjgpLlj5bjgorpmaTjgY8gKHRyaW1taW5nKSDjgZPjgajjgaflr77lh6YKICAtIChcKFx2YXJlcHNpbG9uID0gMC4wMVwpKSDjgZfjgIFcKFxiYXJ7SH0gPSAxMDBcKSDjgajjgZnjgovjgZPjgajjgYzlpJrjgYQKICAtIOeQhuirlueahOODu+Wun+i3teeahOOBq+OBqeOBruOCiOOBhuOBqiB0cmltbWluZyDjga7lgKTjgYzpganliIfjgYvjgIHmmI7jgonjgYvjgavjga/jgarjgaPjgabjgYrjgonjgZrjgIHnoJTnqbbjga7nmbrlsZXjga7kvZnlnLDjgYzjgYLjgovpoJjln58KCi0tLQoKIyMjIyAqKlRoZW9yZW0gMTAuMy4xOiBBZGFwdGl2ZSBJbmZlcmVuY2Ugb24gQVRFIHdpdGggRE1MKioKLSDku6XkuIvjga7mnaHku7bjgpLmuoDjgZ/jgZnjgajku67lrprjgZnjgosKICAtIE92ZXJsYXAg5p2h5Lu2IChcKFx2YXJlcHNpbG9uIDwgbV8wKFgpIDwgMSAtIFx2YXJlcHNpbG9uXCkpIOOCkua6gOOBn+OBmQogIC0g5qmf5qKw5a2m57+S44Gr44KI44KLIFwoZ18wLCBtXzBcKSDjga7mjqjlrprjgYzljYHliIbjgavmraPnorrjgafjgYLjgovjgILjgaTjgb7jgorjgIHkuIvoqJjjgpLmuoDjgZ/jgZkKICBcYmVnaW57ZXF1YXRpb259CiAgICBcbGVmdFx8XGhhdHtnfV97W2tdfS1nXzBccmlnaHRcfF97TF4yfStcbGVmdFx8XGhhdHttfV97W2tdfS1tXzBccmlnaHRcfF97TF4yfStcc3FydHtufVxsZWZ0XHxfe1xkZWx0YVtrXX0tZ18wXHJpZ2h0XHxfe0xeMn1cbGVmdFx8XGhhdHttfV97W2tdfS1tXzBccmlnaHRcfF97TF4yfSBcYXBwcm94IDAsCiAgXGVuZHtlcXVhdGlvbn0KICAKLSDlsYDlpJbmr43mlbAgKG51aXNhbmNlIHBhcmFtZXRlcikg44Gu5o6o5a6a6Kqk5beu44Gv44CB5Yem572u5Yq55p6cIFwoXGhhdHtcdGhldGF9XCkg44Gu5o6o5a6a44Gr5b2x6Z+/44KS5LiO44GI44Gq44GECiAgXGJlZ2lue2VxdWF0aW9ufQogICAgXHNxcnR7bn1cbGVmdChcaGF0e1x0aGV0YX0tXHRoZXRhXzBccmlnaHQpIFxhcHByb3ggXHNxcnR7bn0gXG1hdGhiYntFfV9uXGxlZnRbXHZhcnBoaV8wKFcpLVx0aGV0YV8wXHJpZ2h0XSAuCiAgXGVuZHtlcXVhdGlvbn0KICAKLSDmjqjlrprph4/jga8gJFxzcXJ0e259JOS4gOiHtOaAp+OCkua6gOOBn+OBl+OAgeasoeOBruWIhuW4g+OBq+WPjuadn+OBmeOCiwogICAgXGJlZ2lue2VxdWF0aW9ufQogICAgICBcc3FydHtufShcaGF0e1x0aGV0YX0gLSBcdGhldGFfMCkgXGFwcHJveCBcbWF0aGNhbHtOfSgwLCBWKSwgCiAgICBcZW5ke2VxdWF0aW9ufQogICAg44GT44GT44Gn44CBCiAgICBcYmVnaW57ZXF1YXRpb259CiAgICBWID0gXG1hdGhiYntFfVsoXHZhcnBoaV8wKFcpIC0gXHRoZXRhXzApXjJdLiAKICAgIFxlbmR7ZXF1YXRpb259CiAgICAKLSAkZ18wJCDjgaggJG1fMCQg44Gu5o6o5a6a44Gr44Gv44OI44Os44O844OJ44Kq44OV44GM44GC44KL5Y+v6IO95oCn44GM44GC44KL44Go5pu444GE44Gm44GC44Gj44Gf44GM44CB44Gq44Gc77yfCgotLS0KCiMjIyBETUwgSW5mZXJlbmNlIGZvciBHQVRFcyBhbmQgQVRFVHMKCiMjIyMgKipHQVRFcyAoR3JvdXAgQXZlcmFnZSBUcmVhdG1lbnQgRWZmZWN0cykqKgoKLSDnibnlrprjga7jgrDjg6vjg7zjg5fjgavjgYrjgZHjgovlubPlnYflh6bnva7lirnmnpwgKEdBVEUpIOOCkuaOqOWumuOBmeOCi+OBk+OBqOOCguOBp+OBjeOCiwpcYmVnaW57ZXF1YXRpb259CiAgXHRoZXRhXzAgPSBcbWF0aGJie0V9W2dfMCgxLCBYKSAtIGdfMCgwLCBYKSBcbWlkIEcgPSAxXQpcZW5ke2VxdWF0aW9ufQoKLSDkvos6IOODr+OCr+ODgeODs+OBjOS4juOBiOOCi+W5tOm9oumajuWxpOWIpeOBruW9semfv+OCkuefpeOCiuOBn+OBhAogIC0gJEcgPSAxJCDjgpIgMTPmrbPku6XkuIoxOeats+S7peS4iyAoJDEzIFxsZXEgXHRleHR7QWdlfSBcbGVxIDE5JCkg44Gu6Iul6ICFCiAgLSAkRyA9IDEkIOOCkiAkNjUgXGxlcSBcdGV4dHtBZ2V9JCAg44Gu6auY6b2i6ICFCgotIOasoeOBruaOqOWumumHj+OBp+aOqOWumuOBjOWPr+iDvQpcYmVnaW57ZXF1YXRpb259CiAgXHRoZXRhXzA9XG1hdGhybXtFfVxsZWZ0W1x2YXJwaGlfMChYKSBcbWlkIEc9MVxyaWdodF09XG1hdGhybXtFfVxsZWZ0W1x2YXJwaGlfMChYKSBHXHJpZ2h0XSAvIFxtYXRocm17UH0oRz0xKSAuClxlbmR7ZXF1YXRpb259CgoKIyMjIyAqKkFURVQgKEF2ZXJhZ2UgVHJlYXRtZW50IEVmZmVjdCBvbiB0aGUgVHJlYXRlZCkqKgoKXGJlZ2lue2VxdWF0aW9ufQogIFx0aGV0YV8wID0gXG1hdGhiYntFfVtnXzAoMSwgWCkgLSBnXzAoMCwgWCkgXG1pZCBEID0gMV0KXGVuZHtlcXVhdGlvbn0KCi0tLQoKIyMjIyAqKlJlbWFyayAxMC4zLjM6IE1pc3NwZWNpZmljYXRpb24gb2YgUExNIGFzIGluZmVyZW5jZSBvbiBhbiBvdmVybGFwLXdlaWdodGVkIEFQRSoqCgotIFBMTSDjga7ku67lrprjgYzmiJDjgornq4vjgZ/jgarjgYTloLTlkIjjgavjgIFQTE0g44Gu5o6o5a6a6YePICRcYmV0YSQg44Gv5L2V44KS6KGo44GZ44GL77yfCi0gSVJNIOOBp+OBguOCi+OBqOOBjeOAgSRcdGlsZGV7WX0kIOOBriAkXHRpbGRle0R9JCDjgavplqLjgZnjgosgQkxQIChiZXN0IGxpbmVhciBwcmVkaWN0b3IpIOOBjOOBqeOBhuOBquOCi+OBi+OCkuimi+OCi+OBn+OCgeOAgeOBvuOBmuS7peS4i+OBruW8j+OCkuiAg+OBiOOCiwpcYmVnaW57ZXF1YXRpb259CiAgZ18wKEQsIFgpID0gZ18wKDAsIFgpICsgRChnXzAoMSwgWCkgLSBnXzAoMCwgWCkpClxlbmR7ZXF1YXRpb259CiAgLSBJUk3jga/jgIEkWSQg44Gu6Z2e57ea5b2i44Gq5LqI5ris6YOo5YiG44Go44CBJEQkIOOBruS/guaVsOmDqOWIhuOBq+WIhuOBkeOCieOCjOOCiwogIC0gJGdfMCgwLFgpJCDjga/jgIFQTE0g44Gr44GK44GR44KLICRcZWxsKFgpJCDjgajlkIzjgZjlvbnlibLjgpLmnpzjgZ/jgZkKCi0gJFx0aWxkZXtZfSQg44Gv44CB5Lul5LiL44Gu44KI44GG44Gr5pu444GR44KLCgpcYmVnaW57ZXF1YXRpb259CiAgXHRpbGRle1l9PVx0aWxkZXtEfVxsZWZ0KGdfMCgxLCBYKS1nXzAoMCwgWClccmlnaHQpK1xlcHNpbG9uIC4KXGVuZHtlcXVhdGlvbn0KCi0gVGhlb3JlbSAxMC4yLjEg44GuICgxMC4yLjMpIOW8j+OCiOOCiuOAgSRcYmV0YSQg44Gu5a6a576p44GvCgpcYmVnaW57ZXF1YXRpb259CiAgXGJldGE6PVx7YjogRVsoXHRpbGRle1l9LWIgXHRpbGRle0R9KSBcdGlsZGV7RH1dPTBcfT1cbGVmdChcbWF0aHJte0V9XGxlZnRbXHRpbGRle0R9XjJccmlnaHRdXHJpZ2h0KV57LTF9ICAgICBcbWF0aHJte0V9W1x0aWxkZXtEfSBcdGlsZGV7WX1dLApcZW5ke2VxdWF0aW9ufQoKLSAkXG1hdGhybXtFfVxsZWZ0W1x0aWxkZXtEfV4yIFxtaWQgWFxyaWdodF09bV8wKFgpXGxlZnQoMS1tXzAoWClccmlnaHQpJCDjgafjgYLjgovjgZPjgajjgpLliKnnlKjjgZfjgIEkXGJldGEkIOOCkuasoeOBruOCiOOBhuOBqiAkbV8wKFgpJCDjgaggJGdfMChYKSQg44Gu5byP44Gr5pu444GN5o+b44GI44KLCgpcYmVnaW57YWxpZ259CiAgJlxiZXRhID0gXGZyYWN7XG1hdGhybXtFfVtcdGlsZGV7RH0gXHRpbGRle1l9XX17XG1hdGhybXtFfVxsZWZ0W1x0aWxkZXtEfV4yXHJpZ2h0XX0gXFwKICBcUmlnaHRhcnJvdyAmXGJldGEgPSBcZnJhY3tcbWF0aHJte0V9W1x0aWxkZXtEfSBcbGVmdFx7XHRpbGRle0R9XGxlZnQoZ18wKDEsIFgpLWdfMCgwLCBYKVxyaWdodCkrXGVwc2lsb25ccmlnaHRcfV19e1xtYXRocm17RX1cbGVmdFttXzAoWClcbGVmdCgxLW1fMChYKVxyaWdodClccmlnaHRdfSBccXVhZCBcYmVjYXVzZSBcdGV4dHskXHRpbGRle1l9JCDjgpLku6PlhaV9IFxcCiAgXFJpZ2h0YXJyb3cgJlxiZXRhID0gXGZyYWN7XG1hdGhybXtFfVtcdGlsZGV7RH1eMlxsZWZ0KGdfMCgxLCBYKS1nXzAoMCwgWClccmlnaHQpXX17XG1hdGhybXtFfVxsZWZ0W21fMChYKVxsZWZ0KDEtbV8wKFgpXHJpZ2h0KVxyaWdodF19ICsgXGZyYWN7XG1hdGhybXtFfVtcdGlsZGV7RH0gXGVwc2lsb25dfXtcbWF0aHJte0V9XGxlZnRbbV8wKFgpXGxlZnQoMS1tXzAoWClccmlnaHQpXHJpZ2h0XX0gXFwKCiAgXHRoZXJlZm9yZSB+ICZcYmV0YSA9IFxmcmFje1xtYXRoYmJ7RX1bbV8wKFgpKDEgLSBtXzAoWCkpKGdfMCgxLCBYKSAtIGdfMCgwLCBYKSldfXtcbWF0aGJie0V9W21fMChYKSgxIC0gbV8wKFgpKV19ClxlbmR7YWxpZ259CgotIOOBk+OBrumHjeOBv+OBr+OAgSRtXzAoWCkgXGFwcHJveCAxLzIkIOS7mOi/keOBq+Wkp+OBjeOBqumHjeOBv+OCkuOAgSRtXzAoWCkgXGFwcHJveCAwJCDjgb7jgZ/jga8gJG1fMChYKSBcYXBwcm94IDEkIOOBq+Wwj+OBleOBqumHjeOBv+OCkuS4juOBiOOCiwogIC0g5YK+5ZCR44K544Kz44Ki44Gu44KI44GG44Gq44CB6Kej6YeI44Gu44GX44KE44GZ44GE6YeN44G/44Gr44Gq44Gj44Gm44GE44Gq44GECiAgLSDlgr7lkJHjgrnjgrPjgqI6IOWHpue9rue+pOOBq+OBpOOBhOOBpuOBr+WvvueFp+e+pOOBqOi/keOBhOOCguOBruOBq+Wkp+OBjeOBqumHjeOBv+OCkuOAgeWvvueFp+e+pOOBq+OBpOOBhOOBpuOBr+WHpue9rue+pOOBqOi/keOBhOOCguOBruOBq+Wkp+OBjeOBqumHjeOBv+OCkuS4juOBiOOCiwoKLS0tCgoqKu+8nOijnOi2szogJFxtYXRocm17RX1cbGVmdFtcdGlsZGV7RH1eMiBcbWlkIFhccmlnaHRdPW1fMChYKVxsZWZ0KDEtbV8wKFgpXHJpZ2h0KSQg44Gu5bCO5Ye677yeKioKCi0gKDEwLjMuMinlvI/jgojjgorjgIHmrovlt64gJFx0aWxkZXtEfSQg44Gv5Lul5LiL44Gu44KI44GG44Gr6KGo44GV44KM44KLClxiZWdpbnthbGlnbn0KICAmRCA9IG1fMChYKSArIFx0aWxkZXtEfSwgXHF1YWQgXG1hdGhiYntFfVtcdGlsZGV7RH0gfCBYXSA9IDAgXFwgXHRhZ3sxMC4zLjJ9IAogIFxSaWdodGFycm93ICYgXHRpbGRle0R9ID0gRCAtIG1fMChYKQpcZW5ke2FsaWdufQoKLSAkXG1hdGhiYntFfVtcdGlsZGV7RH1eMiBcbWlkIFhdJCDjga8KXGJlZ2lue2FsaWdufQogICZcbWF0aGJie0V9W1x0aWxkZXtEfV4yIFxtaWQgWF0gPSBcbWF0aGJie0V9WyhEIC0gbV8wKFgpKV4yIFxtaWQgWF0gXFwKICBcUmlnaHRhcnJvdyAmXG1hdGhiYntFfVtcdGlsZGV7RH1eMiBcbWlkIFhdID0gXG1hdGhiYntFfVtEXjIgXG1pZCBYXSAtIDJtXzAoWClcbWF0aGJie0V9W0QgXG1pZCBYXSArIG1fMChYKV4yClxlbmR7YWxpZ259CgotIFwoRCBcaW4gXHswLCAxXH1cKSDjgafjgYLjgorjgIFcKEReMiA9IERcKSDjgafjgYLjgovjgZPjgajjgaggXChcbWF0aGJie0V9W0QgXG1pZCBYXSA9IG1fMChYKVwpIOOCkuWIqeeUqOOBmeOCi+OBqOOAgQpcYmVnaW57YWxpZ259CiAgJlxtYXRoYmJ7RX1bXHRpbGRle0R9XjIgXG1pZCBYXSA9IFxtYXRoYmJ7RX1bRCBcbWlkIFhdIC0gMm1fMChYKW1fMChYKSArIG1fMChYKV4yIFxcCiAgXFJpZ2h0YXJyb3cgJlxtYXRoYmJ7RX1bXHRpbGRle0R9XjIgXG1pZCBYXSA9IG1fMChYKSAtIDJtXzAoWCleMiArIG1fMChYKV4yIFxcCiAgXFJpZ2h0YXJyb3cgJlxtYXRoYmJ7RX1bXHRpbGRle0R9XjIgXG1pZCBYXSA9IG1fMChYKSAtIG1fMChYKV4yIFxcCiAgXGJlY2F1c2UgfiAmXG1hdGhiYntFfVtcdGlsZGV7RH1eMiBcbWlkIFhdID0gbV8wKFgpKDEgLSBtXzAoWCkpLgpcZW5ke2FsaWdufQoKLS0tCgojIyMjICoqUmVtYXJrIDEwLjMuMzog6YCj57aa44Gq5Yem572u44Gu5aC05ZCIKioKCi0g6YCj57aa55qE44Gq5Yem572uICREIFxpbiBbMCwgMV0kIOOBruWgtOWQiOOCguOAgSRnXzAoRCwgWCkkIOOCkuODmeODvOOCueODqeOCpOODsyArICREJCDjgavjgojjgovlirnmnpzjgajjgZfjgabliIbop6PjgZfjgaboqJjov7DjgafjgY3jgosKXGJlZ2lue2VxdWF0aW9ufQogIGdfMChELCBYKSA9IGdfMCgwLCBYKSArIFxpbnRfMF5EIHQgXGNkb3QgZ18wJyh0LCBYKSBkdApcZW5ke2VxdWF0aW9ufQotIOOBmeOCi+OBqOOAgSRcYmV0YSQg44KSIHdlaWdodGVkIGF2ZXJhZ2UgZGVyaXZhdGl2ZSDjgajjgZfjgabmm7jjgZHjgosKXGJlZ2lue2VxdWF0aW9ufQogIFxiZXRhID0gXGZyYWN7XG1hdGhiYntFfVt3KEQsIFgpIGdfMCcoRCwgWCldfXtcbWF0aGJie0V9W3coRCwgWCldfQpcZW5ke2VxdWF0aW9ufQrjgZPjgZPjgafjgIHph43jgb8gJHcoRCwgWCkkIOOBr+asoeOBruOCiOOBhuOBq+Wumue+qeOBleOCjOOCiwpcYmVnaW57ZXF1YXRpb259CiAgdyhELCBYKSA9IFxmcmFje1xtYXRoYmJ7RX1bXHRpbGRle0R9IFxtaWQgRCA+IGQsIFhdfXtmKEQgXG1pZCBYKX0KXGVuZHtlcXVhdGlvbn0KCi0gYmluYXJ5IOOBq+OBm+OCiCBjb250aW51b3VzIOOBq+OBm+OCiOOAgeino+mHiOOBjOmbo+OBl+OBhOOCguOBruOBq+OBquOBo+OBpuOBhOOCiwoKLS0tCgojIyMgVGhlIEVmZmVjdCBvZiA0MDEoaykgRWxpZ2liaWxpdHkgb24gTmV0IEZpbmFuY2lhbCBBc3NldHMKCi0gUG90ZXJiYSBldCBhbC4gKDE5OTQsIDE5OTUpIOOBruOAgeS8gealreWei+eiuuWumuaLoOWHuuW5tOmHkeWItuW6pjQwMShrKeOBuOOBruWKoOWFpeizh+agvCDjgYzlgIvkurrjga7ph5Hono3os4fnlKPjgavkuI7jgYjjgovlvbHpn7/jgpLjgIHmnKznr4DjgafoqqzmmI7jgZfjgabjgY3jgZ9ETUzjgpLnlKjjgYTjgablho3liIbmnpDjgZnjgosKCi0gKirmjqjlrprjgavjgYrjgZHjgovoqrLpoYwqKgogIC0g44CMNDAxKGsp44Gu44OX44Op44Oz44KS5o+Q5L6b44GX44Gm44GE44KL5Lya56S+44Gn5YON44GP44CN44Go44GE44GG5Yem572u44Gv44CB44Op44Oz44OA44Og5Ymy5b2T44Gn44Gv44Gq44GE77yI6YG45oqe44OQ44Kk44Ki44K544Gu5ZWP6aGM77yJCi0gKirop6PmsbrnrZYqKgogIC0gNDAxKGspIOOBjOWni+OBvuOBo+OBn+W9k+WIneOAgeWKtOWDjeiAheOBrzQwMShrKeOBjOaPkOS+m+OBleOCjOOBpuOBhOOCi+OBi+OBqeOBhuOBi+OCiOOCiuOAgeWPjuWFpeOBquOBqeWIpeOBruWBtOmdouOBq+WfuuOBpeOBhOOBpuiBt+alreOCkumBuOaKnuOBl+OBpuOBhOOCi+WPr+iDveaAp+OBjOmrmOOBhOOBqOOBhOOBhuOCouOCpOODh+OCo+OCouOCkueUqOOBhOOCiwogIC0gKirmnaHku7bku5jjgY3ni6znq4vmgKfjga7ku67lrpoqKjog5Y+O5YWl44KE5LuW44Gu6IG35qWt6YG45oqe44Gu6KaB5Zug44KS6Kq/5pW044GX44Gf5b6M44Gv44CBNDAxKGsp44Gu5Yqg5YWl6LOH5qC844Gv5aSW55Sf55qE44Gn44GC44KLCi0gKirmnaHku7bku5jjgY3ni6znq4vmgKfjgajplqLmlbDlnovjgavplqLjgZnjgovorbDoq5YqKgogIC0gUG90ZXJiYSBldCBhbC4g44KE5LuW44Gu56CU56m244Gv44CB5LqL5YmN44Gr5a6a576p44GV44KM44Gf5Yi257SE44Gu5Y6z44GX44GE6Zai5pWw5Z6L44KS5Luu5a6a44GX44Gm44GE44KL44GM44CB5q2j56K644Gr5YWx5aSJ6YeP44KS6Kq/5pW044Gn44GN44Gm44GE44KL44GL77yf44Go44GE44GG55aR5ZWP44GM44GC44KLCiAgLSDkuIDmlrnjgafjgIHjgojjgormn5Tou5/jgarjg6Ljg4fjg6vjgpLkvb/jgYbjgajjgIHmpJzlh7rlipvjgYzkvY7kuIvjgZnjgosKICAtIOacrOevgOOBp+OBr+OAgeS4oeaWueOCkuavlOOBueOBpuOBv+OCiwoKLS0tCgojIyMgKirlpInmlbDjga7oqK3lrprjgahEQUcqKgoKLSAgKirlpInmlbDjga7lrprnvqkqKgogICAtICRZJDog5YCL5Lq644Gu6YeR6J6N6LOH55SjIChuZXQgZmluYW5jaWFsIGFzc2V0cykKICAgLSAkRCQ6IDQwMShrKeWKoOWFpeizh+agvAogICAtICRYJDog5bm06b2i44CB5oCn5Yil44CB5Y+O5YWl44CB5a625peP5qeL5oiQ44CB5pWZ6IKy5bm05pWw44CB5ama5ae754q25rOB44CB5YWx5YON44GN44GL44Gp44GG44GL44CB5bm06YeR5Yqg5YWl54q25rOB44CB5oyB44Gh5a6244GL44Gp44GG44GL44CBSVJB5Yqg5YWl54q25rOB77yIaURlQ2/nmoTjgarvvJ/vvInjgIHjgarjgakKICAgLSAkRiQ6IOims+a4rOOBleOCjOOBquOBhOS8gealreOBruWxnuaApwogICAtICRNJDog5b6T5qWt5ZOh44GuNDAxKGsp5pSv5Ye66aGN44Gr5b+c44GY44Gm44CB5b6T5qWt5ZOh44GM5pSv5Ye644GZ44KL6aGNIChlbXBsb3llciBtYXRjaCBhbW91bnQpIOOBp+OBguOCiuOAgW1lZGlhdG9yIOOBq+OBquOBo+OBpuOBhOOCiwogICAtICRVJDog6Kaz5ris44GV44KM44Gq44GE5Lqk57Wh5Zug5a2QCi0gKipEQUfjga5PdmVydmlldyoqCiAgIC0gRmlndXJlIDEwLjY6IOWFseWkiemHjyAkWCQg44KS6Kq/5pW044GZ44KM44Gw5Zug5p6c5o6o5a6a44GM5Y+v6IO944Gq5qeL6YCgCiAgICAgIC0gJFgkIOOBjCB2YWxpZCBhZGp1c3RtZW50IHNldCDjgafjgYLjgosKICAgLSBGaWd1cmUgMTAuNzogTWVkaWF0b3IgJE0kIOOBjOOBguOCi+WgtOWQiAogICAgICAtIOe3j+WKueaenOOBr+itmOWIpeWPr+iDveOBquWgtOWQiOOBjOOBguOCiwogICAgICAtIOOBn+OBoOOBl+OAgSRNJCDjgYwgJEYkIOOBq+S+neWtmOOBmeOCi+OBqOOAgSRYJCDjgaDjgZHjga7oqr/mlbTjgafjga/lm6DmnpzmjqjlrprjgYzkuI3ljYHliIYKICAgLSBGaWd1cmUgMTAuODog6Kaz5ris44GV44KM44Gq44GE5Lqk57Wh5Zug5a2QICRVJCDjgYwgJFkkIOOBq+ebtOaOpeW9semfv+OCkuS4juOBiOOCi+OBqOOAgeWboOaenOaOqOWumuOBr+WbsOmbowoKLS0tCgojIyMgKipEQUfnlKjjgrPjg7zjg4kqKgoKLSDjgZPjga7pg6jliIbjga4gUmVwbGljYXRpb24g44GvW+Wwj+ael+OBrkdpdEh1Yl0oaHR0cHM6Ly9naXRodWIuY29tL1J5dWtpdXMvQ2F1c2FsTUxfQ2gxMCnjgavkuIrjgYzjgaPjgabjgYTjgovjga7jgafjgIHlkITjgIXjga7nkrDlooPjgaflrp/ooYzlj6/og70KICAtIOOCv+ODvOODn+ODiuODqyAvIOOCs+ODnuODs+ODieODl+ODreODs+ODl+ODiOOBp+OAgWBnaXQgY2xvbmVgIOOCkuWun+ihjOOBmeOCjOOBsOiJr+OBhAotIGByZW52YCDjgavjgojjgovku67mg7PnkrDlooPjgpLkvb/jgYbjgZPjgajjgafjgIHjg5Hjg4PjgrHjg7zjgrjjga7jg5Djg7zjgrjjg6fjg7PnrqHnkIbjgpLooYzjgaPjgabjgYTjgosKICAtIGByZW52OjpyZXN0b3JlKClgIOOCkuihjOOBhuOBk+OBqOOBp+OAgeOBk+OBruODjuODvOODiOODluODg+OCr+OBp+S9v+eUqOOBl+OBpuOBhOOCi+ODkeODg+OCseODvOOCuOOCkuOCpOODs+OCueODiOODvOODq+WPr+iDvQogIC0gYHJlbnZgIOODkeODg+OCseODvOOCuOOCkuODgOOCpuODs+ODreODvOODieOBl+OBpuOBhOOBquOBhOS6uuOBr+OAgeacgOWIneOBqyBgaW5zdGFsbC5wYWNrYWdlcygicmVudiIpYCDjgpLlrp/ooYzjgZnjgovlv4XopoHjgYzjgYLjgosKLSDjg5Hjg4PjgrHjg7zjgrjjga7oqq3jgb/ovrzjgb/jgavjga8gYHBhY21hbjo6cF9sb2FkKClgIOOBjOOBiuOBmeOBmeOCgQogIC0g5pyq44Kk44Oz44K544OI44O844Or44Gu44OR44OD44Kx44O844K444KS6Ieq5YuV44Gn44Kk44Oz44K544OI44O844Or44GX44Gm44GP44KM44KLCgoKYGBge3J9CiMgaW5zdGFsbC5wYWNrYWdlcygicmVudiIpCiMgcmVudjo6cmVzdG9yZSgpCiMgcmVtb3Rlczo6aW5zdGFsbF9naXRodWIoIm1sci1vcmcvbWxyM2V4dHJhbGVhcm5lcnMiLCBmb3JjZSA9IFRSVUUpICMgbmVlZGVkIHRvIHJ1biBib29zdGluZwoKcGFjbWFuOjpwX2xvYWQoCiAgZGFnaXR0eSwKICBnZ2RhZywKICB4dGFibGUsCiAgaGRtLAogIHNhbmR3aWNoLAogIGdncGxvdDIsCiAgcmFuZG9tRm9yZXN0LAogIGRhdGEudGFibGUsCiAgZ2xtbmV0LAogIHJwYXJ0LAogIGdibSwKICBEb3VibGVNTCwgCiAgbWxyM2xlYXJuZXJzLCAKICBtbHIzLCAKICBkYXRhLnRhYmxlLCAKICByYW5kb21Gb3Jlc3QsIAogIHJhbmdlciwKICBtbHIzZXh0cmFsZWFybmVycywKICBtYm9vc3QKKQpgYGAKCgotLS0KCiMjIyMgKipGaWd1cmUgMTAuNjogJFgkIOOCkuiqv+aVtOOBmeOCjOOBsOWboOaenOaOqOWumuOBjOWPr+iDveOBquani+mAoCoqCgoKYGBge3J9CiMgZ2VuZXJhdGUgYSBEQUdzIGFuZCBwbG90IHRoZW0KCkcxIDwtIGRhZ2l0dHkoJ2RhZ3sKWSBbb3V0Y29tZSxwb3M9IjQsIDAiXQpEIFtleHBvc3VyZSxwb3M9IjAsIDAiXQpYIFtjb25mb3VuZGVyLCBwb3M9IjIsLTEiXQpGIFt1b2JzZXJ2ZWQsIHBvcz0iMCwgLTEiXQpEIC0+IFkKWCAtPiBECkYgLT4gWApGIC0+IEQKWCAtPiBZfScpCgpHMV9kYWcgPC0gZ2dkYWcoRzEpICsgdGhlbWVfZGFnKCkKCkcxX2RhZyRsYXllcnNbWzNdXSRtYXBwaW5nIDwtIAogIGFlcyhjb2xvdXIgPSBjKCJPYnNlcnZlZCIsICJVbm9ic2VydmVkIilbYXMubnVtZXJpYyhuYW1lID09ICJGIikgKyAxXSkKRzFfZGFnICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImJsdWUiKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbi5pbnNpZGUgPSBjKDAuOCwgMC44KSkKYGBgCgoKYGBge3J9CmFkanVzdG1lbnRTZXRzKEcxLCAiRCIsICJZIiwgZWZmZWN0ID0gInRvdGFsIikKYGBgCgpgYGB7cn0KIyBnZW5lcmF0ZSBhIGNvdXBsZSBvZiBEQUdzIGFuZCBwbG90IHRoZW0KCkcyIDwtIGRhZ2l0dHkoJ2RhZ3sKWSBbb3V0Y29tZSxwb3M9IjQsIDAiXQpEIFtleHBvc3VyZSxwb3M9IjAsIDAiXQpYIFtjb25mb3VuZGVyLCBwb3M9IjIsLTEiXQpGIFt1b2JzZXJ2ZWQsIHBvcz0iMCwgLTEiXQpEIC0+IFkKWCAtPiBEClggLT4gRgpGIC0+IEQKWCAtPiBZfScpCgoKRzJfZGFnIDwtIGdnZGFnKEcyKSArIHRoZW1lX2RhZygpCgpHMl9kYWckbGF5ZXJzW1szXV0kbWFwcGluZyA8LSAKICBhZXMoY29sb3VyID0gYygiT2JzZXJ2ZWQiLCAiVW5vYnNlcnZlZCIpW2FzLm51bWVyaWMobmFtZSA9PSAiRiIpICsgMV0pCkcyX2RhZyArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIsICJibHVlIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24uaW5zaWRlID0gYygwLjgsIDAuOCkpCmBgYAoKYGBge3J9CmFkanVzdG1lbnRTZXRzKEcyLCAiRCIsICJZIiwgZWZmZWN0ID0gInRvdGFsIikKYGBgCgpgYGB7cn0KRzMgPC0gZGFnaXR0eSgnZGFnewpZIFtvdXRjb21lLHBvcz0iNCwgMCJdCkQgW2V4cG9zdXJlLHBvcz0iMCwgMCJdClggW2NvbmZvdW5kZXIsIHBvcz0iMiwtMSJdCkYgW3Vub2JzZXJ2ZWQsIHBvcz0iMCwgLTEiXQpVIFt1bm9ic2VydmVkLCBwb3M9IjIsIC0yIl0KRCAtPiBZClggLT4gRApGIC0+IEQKVSAtPiBGClUgLT4gWApVIC0+IEQKWCAtPiBZfScpCgpHM19kYWcgPC0gZ2dkYWcoRzMpICsgdGhlbWVfZGFnKCkKCkczX2RhZyRsYXllcnNbWzNdXSRtYXBwaW5nIDwtIAogIGFlcyhjb2xvdXIgPSBjKCJPYnNlcnZlZCIsICJVbm9ic2VydmVkIilbYXMubnVtZXJpYyhuYW1lICVpbiUgYygiRiIsIlUiKSkgKyAxXSkKRzNfZGFnICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoImJsYWNrIiwgImJsdWUiKSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbi5pbnNpZGUgPSBjKDAuOCwgMC44KSkKCmFkanVzdG1lbnRTZXRzKEczLCAiRCIsICJZIiwgZWZmZWN0ID0gInRvdGFsIikKCmBgYAoKLSAqKiRGJCDjgYznm7TmjqXjgqLjgqbjg4jjgqvjg6AgJFkkIOOBq+W9semfv+OCkuS4juOBiOOCi+WgtOWQiOOAgeitmOWIpeOBr+OBp+OBjeOBquOBhCoqCgpgYGB7cn0KRzQgPC0gZGFnaXR0eSgnZGFnewpZIFtvdXRjb21lLHBvcz0iNCwgMCJdCkQgW2V4cG9zdXJlLHBvcz0iMCwgMCJdClggW2NvbmZvdW5kZXIsIHBvcz0iMiwtMSJdCkYgW3Vub2JzZXJ2ZWQsIHBvcz0iMCwgLTEiXQpVIFt1bm9ic2VydmVkLCBwb3M9IjIsIC0yIl0KRCAtPiBZClggLT4gRApGIC0+IEQKVSAtPiBGClUgLT4gWApVIC0+IEQKRiAtPiBZClggLT4gWX0nKQoKCkc0X2RhZyA8LSBnZ2RhZyhHNCkgKyB0aGVtZV9kYWcoKQoKRzRfZGFnJGxheWVyc1tbM11dJG1hcHBpbmcgPC0gCiAgYWVzKGNvbG91ciA9IGMoIk9ic2VydmVkIiwgIlVub2JzZXJ2ZWQiKVthcy5udW1lcmljKG5hbWUgJWluJSBjKCJGIiwiVSIpKSArIDFdKQpHNF9kYWcgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiYmx1ZSIpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uLmluc2lkZSA9IGMoMC44LCAwLjgpKQoKYWRqdXN0bWVudFNldHMoRzQsICJEIiwgIlkiLCBlZmZlY3QgPSAidG90YWwiKQpgYGAKCi0tLQoKIyMjIyAqKkZpZ3VyZSAxMC43OiBtZWRpYXRvciAgJE0kIOOBjOOBguOCi+WgtOWQiCoqCgpgYGB7cn0KRzUgPC0gZGFnaXR0eSgnZGFnewpZIFtvdXRjb21lLHBvcz0iNCwgMCJdCkQgW2V4cG9zdXJlLHBvcz0iMCwgMCJdClggW2NvbmZvdW5kZXIsIHBvcz0iMiwtMiJdCkYgW3Vub2JzZXJ2ZWQsIHBvcz0iMCwgLTIiXQpVIFt1bm9ic2VydmVkLCBwb3M9IjIsIC0zIl0KTSBbdW5vYnNlcnZlZCwgcG9zPSIzLCAtLjEiXQpEIC0+IFkKWCAtPiBECkYgLT4gRApVIC0+IEYKVSAtPiBYClUgLT4gRApEIC0+IE0KTSAtPiBZClggLT4gTQpYIC0+IFl9JykKCkc1X2RhZyA8LSBnZ2RhZyhHNSkgKyB0aGVtZV9kYWcoKQoKRzVfZGFnJGxheWVyc1tbM11dJG1hcHBpbmcgPC0gCiAgYWVzKGNvbG91ciA9IGMoIk9ic2VydmVkIiwgIlVub2JzZXJ2ZWQiKVthcy5udW1lcmljKG5hbWUgJWluJSBjKCJGIiwiVSIsICJNIikpICsgMV0pCkc1X2RhZyArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIsICJibHVlIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24uaW5zaWRlID0gYygwLjgsIDAuOCkpCgpwcmludChhZGp1c3RtZW50U2V0cyhHNSwgIkQiLCAiWSIsIGVmZmVjdCA9ICJ0b3RhbCIpKQoKYGBgCgotICoqJEYkIOOBjOebtOaOpSBNZWRpYXRvciAkTSQg44Gr5b2x6Z+/44KS5LiO44GI44KL5aC05ZCI44CB6K2Y5Yil44Gv44Gn44GN44Gq44GEKioKCgpgYGB7cn0KRzYgPC0gZGFnaXR0eSgnZGFnewpZIFtvdXRjb21lLHBvcz0iNCwgMCJdCkQgW2V4cG9zdXJlLHBvcz0iMCwgMCJdClggW2NvbmZvdW5kZXIsIHBvcz0iMiwtMiJdCkYgW3Vub2JzZXJ2ZWQsIHBvcz0iMCwgLTIiXQpVIFt1bm9ic2VydmVkLCBwb3M9IjIsIC0zIl0KTSBbdW5vYnNlcnZlZCwgcG9zPSIzLCAtLjEiXQpEIC0+IFkKWCAtPiBECkYgLT4gRApVIC0+IEYKVSAtPiBYCkQgLT4gTQpGIC0+IE0KVSAtPiBECk0gLT4gWQpYIC0+IE0KWCAtPiBZfScpCgpHNl9kYWcgPC0gZ2dkYWcoRzYpICsgdGhlbWVfZGFnKCkKCkc2X2RhZyRsYXllcnNbWzNdXSRtYXBwaW5nIDwtIAogIGFlcyhjb2xvdXIgPSBjKCJPYnNlcnZlZCIsICJVbm9ic2VydmVkIilbYXMubnVtZXJpYyhuYW1lICVpbiUgYygiRiIsIlUiLCAiTSIpKSArIDFdKQpHNl9kYWcgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYygiYmxhY2siLCAiYmx1ZSIpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uLmluc2lkZSA9IGMoMC44LCAwLjgpKQoKcHJpbnQoYWRqdXN0bWVudFNldHMoRzYsICJEIiwgIlkiKSwgZWZmZWN0ID0gInRvdGFsIikKYGBgCgoqKuims+a4rOOBleOCjOOBquOBhOS6pOe1oeWboOWtkCRVJOOBjOebtOaOpeOCouOCpuODiOOCq+ODoCRZJOOBq+W9semfv+OCkuS4juOBiOOCi+WgtOWQiOOAgeitmOWIpeOBr+OBp+OBjeOBquOBhCoqCgpgYGB7cn0KRzc8LSBkYWdpdHR5KCdkYWd7ClkgW291dGNvbWUscG9zPSI0LCAwIl0KRCBbZXhwb3N1cmUscG9zPSIwLCAwIl0KWCBbY29uZm91bmRlciwgcG9zPSIyLC0yIl0KRiBbdW5vYnNlcnZlZCwgcG9zPSIwLCAtMiJdClUgW3Vub2JzZXJ2ZWQsIHBvcz0iMiwgLTMiXQpNIFt1bm9ic2VydmVkLCBwb3M9IjMsIC0uMSJdCkQgLT4gWQpYIC0+IEQKRiAtPiBEClUgLT4gRgpVIC0+IFgKRCAtPiBNClUgLT4gRApNIC0+IFkKWCAtPiBNClggLT4gWQpVIC0+IFl9JykKCkc3X2RhZyA8LSBnZ2RhZyhHNykgKyB0aGVtZV9kYWcoKQoKRzdfZGFnJGxheWVyc1tbM11dJG1hcHBpbmcgPC0gCiAgYWVzKGNvbG91ciA9IGMoIk9ic2VydmVkIiwgIlVub2JzZXJ2ZWQiKVthcy5udW1lcmljKG5hbWUgJWluJSBjKCJGIiwiVSIsICJNIikpICsgMV0pCkc3X2RhZyArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIsICJibHVlIikpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24uaW5zaWRlID0gYygwLjgsIDAuOCkpCgpwcmludChhZGp1c3RtZW50U2V0cyhHNywgIkQiLCAiWSIpLCBlZmZlY3QgPSAidG90YWwiKQpgYGAKCg==